diff --git a/flight.rdbg b/flight.rdbg index b273924..2ea14a8 100644 Binary files a/flight.rdbg and b/flight.rdbg differ diff --git a/gamestate.c b/gamestate.c index a253654..a334f4b 100644 --- a/gamestate.c +++ b/gamestate.c @@ -2888,7 +2888,7 @@ void process(struct GameState *gs, double dt) } } - // sun processing for this current entity + // sun processing for this current entity #ifndef NO_SUNS PROFILE_SCOPE("this entity sun processing") { @@ -2897,7 +2897,7 @@ void process(struct GameState *gs, double dt) cpVect pos_rel_sun = (cpvsub(entity_pos(e), (entity_pos(i.sun)))); cpFloat sqdist = cpvlengthsq(pos_rel_sun); - if(i.sun->sun_is_safe) + if (i.sun->sun_is_safe) { bool is_entity_dangerous = false; is_entity_dangerous |= e->is_missile; @@ -3281,24 +3281,36 @@ void process(struct GameState *gs, double dt) for (int i = 0; i < MAX_BOX_TYPES; i++) { cpVect cur_pos = gs->platonic_positions[i]; - if (cpvlength(cur_pos) > 0.0) // zero is uninitialized, the platonic solid doesn't exist (probably) @Robust do better + if (cpvlengthsq(cur_pos) > 0.0) // zero is uninitialized, the platonic solid doesn't exist (probably) @Robust do better { cpVect towards = cpvsub(cur_pos, from_pos); double length_to_cur = cpvlength(towards); detections[i].direction = cpvnormalize(towards); + detections[i].of_type = i; detections[i].intensity = length_to_cur; // so it sorts correctly, changed to intensity correctly after sorting } } qsort(detections, MAX_BOX_TYPES, sizeof(detections[0]), platonic_detection_compare); for (int i = 0; i < SCANNER_MAX_PLATONICS; i++) { - cur_box->detected_platonics[i] = detections[i]; - if (cur_box->detected_platonics[i].intensity > 0.0) + for (int detections_i = 0; detections_i < MAX_BOX_TYPES; detections_i++) { - cur_box->detected_platonics[i].intensity = max(0.1, 1.0 - clamp01(cur_box->detected_platonics[i].intensity / 100.0)); + // so can be viewed in debugger what causes it not to be used + bool use_this_detection = true; + use_this_detection &= detections[detections_i].intensity > 0.0; + use_this_detection &= !detections[detections_i].used_in_scanner_closest_lightning_bolts; + use_this_detection &= !learned_boxes_has_box(cur_box->blueprints_learned, detections[detections_i].of_type); + if (use_this_detection) + { + detections[detections_i].used_in_scanner_closest_lightning_bolts = true; + cur_box->detected_platonics[i] = detections[detections_i]; + cur_box->detected_platonics[i].intensity = max(0.1, 1.0 - clamp01(cur_box->detected_platonics[i].intensity / 100.0)); + } } } + // after the above logic detections has been modified, do not use + circle_query(gs->space, entity_pos(cur_box), SCANNER_MAX_RANGE); cpBody *body_results[512] = {0}; size_t cur_results_len = 0; diff --git a/types.h b/types.h index 3416536..100a121 100644 --- a/types.h +++ b/types.h @@ -257,8 +257,12 @@ typedef struct InputFrame typedef struct PlatonicDetection { + // only these two are serialized cpVect direction; double intensity; + + enum BoxType of_type; + bool used_in_scanner_closest_lightning_bolts; } PlatonicDetection; typedef struct Entity