diff --git a/common/main/fuelcen.h b/common/main/fuelcen.h index bda7a56cb..a469517b0 100644 --- a/common/main/fuelcen.h +++ b/common/main/fuelcen.h @@ -121,6 +121,7 @@ struct d1_matcen_info : public prohibit_void_ptr struct d_level_unique_fuelcenter_state { + unsigned Num_fuelcenters; // Original D1 size: 50, Original D2 size: 70 array Station; }; @@ -181,7 +182,6 @@ void matcen_info_write(PHYSFS_File *fp, const matcen_info &mi, short version); namespace dcx { constexpr std::integral_constant station_none{}; extern unsigned Num_robot_centers; -extern unsigned Num_fuelcenters; extern const fix EnergyToCreateOneRobot; } #endif diff --git a/similar/editor/segment.cpp b/similar/editor/segment.cpp index 6caaf0e5c..326fef42d 100644 --- a/similar/editor/segment.cpp +++ b/similar/editor/segment.cpp @@ -464,7 +464,6 @@ static void compress_segments(void) seg = Highest_segment_index; auto &RobotCenters = LevelSharedRobotcenterState.RobotCenters; - auto &Station = LevelUniqueFuelcenterState.Station; auto &Walls = LevelUniqueWallSubsystemState.Walls; auto &vmwallptr = Walls.vmptr; for (hole=0; hole < seg; hole++) @@ -495,7 +494,7 @@ static void compress_segments(void) w->segnum = hole; // Fix fuelcenters, robotcens, and triggers... added 2/1/95 -Yuan - range_for (auto &f, partial_range(Station, Num_fuelcenters)) + range_for (auto &f, partial_range(LevelUniqueFuelcenterState.Station, LevelUniqueFuelcenterState.Num_fuelcenters)) if (f.segnum == seg) f.segnum = hole; diff --git a/similar/main/dumpmine.cpp b/similar/main/dumpmine.cpp index 80e8da9a2..c7893e533 100644 --- a/similar/main/dumpmine.cpp +++ b/similar/main/dumpmine.cpp @@ -431,6 +431,7 @@ static void write_fuelcen_text(PHYSFS_File *my_file) PHYSFSX_printf(my_file, "-----------------------------------------------------------------------------\n"); PHYSFSX_printf(my_file, "Fuel Center stuff: (Note: This means fuel, repair, materialize, control centers!)\n"); + const auto Num_fuelcenters = LevelUniqueFuelcenterState.Num_fuelcenters; for (i=0; istation_idx = Num_fuelcenters; - auto &station = Station.at(Num_fuelcenters++); + const auto next_fuelcenter_idx = LevelUniqueFuelcenterState.Num_fuelcenters++; + segp->station_idx = next_fuelcenter_idx; + auto &station = Station.at(next_fuelcenter_idx); station.Type = station_type; station.Capacity = Fuelcen_max_amount; station.segnum = segp; @@ -164,7 +164,7 @@ static void matcen_create(const vmsegptridx_t segp) Assert(station_type == SEGMENT_IS_ROBOTMAKER); - const auto next_fuelcenter_idx = Num_fuelcenters++; + const auto next_fuelcenter_idx = LevelUniqueFuelcenterState.Num_fuelcenters++; segp->station_idx = next_fuelcenter_idx; auto &station = Station.at(next_fuelcenter_idx); @@ -177,6 +177,7 @@ static void matcen_create(const vmsegptridx_t segp) const auto next_robot_center_idx = Num_robot_centers++; segp->matcen_num = next_robot_center_idx; auto &robotcenter = RobotCenters[next_robot_center_idx]; + robotcenter.fuelcen_num = next_fuelcenter_idx; robotcenter.segnum = segp; robotcenter.fuelcen_num = next_fuelcenter_idx; } @@ -206,7 +207,7 @@ void trigger_matcen(const vmsegptridx_t segnum) FuelCenter *robotcen; Assert(segp->special == SEGMENT_IS_ROBOTMAKER); - Assert(segp->matcen_num < Num_fuelcenters); + assert(segp->matcen_num < LevelUniqueFuelcenterState.Num_fuelcenters); Assert((segp->matcen_num >= 0) && (segp->matcen_num <= Highest_segment_index)); robotcen = &Station[RobotCenters[segp->matcen_num].fuelcen_num]; @@ -251,6 +252,7 @@ void fuelcen_delete(const vmsegptr_t segp) { auto &RobotCenters = LevelSharedRobotcenterState.RobotCenters; auto &Station = LevelUniqueFuelcenterState.Station; + auto Num_fuelcenters = LevelUniqueFuelcenterState.Num_fuelcenters; Restart: ; segp->special = 0; @@ -289,7 +291,7 @@ Restart: ; goto Restart; } } - + LevelUniqueFuelcenterState.Num_fuelcenters = Num_fuelcenters; } #endif @@ -541,7 +543,7 @@ static void robotmaker_proc(const d_vclip_array &Vclip, fvmsegptridx &vmsegptrid void fuelcen_update_all() { auto &Station = LevelUniqueFuelcenterState.Station; - range_for (auto &&e, enumerate(partial_range(Station, Num_fuelcenters))) + range_for (auto &&e, enumerate(partial_range(Station, LevelUniqueFuelcenterState.Num_fuelcenters))) { auto &i = e.value; if (i.Type == SEGMENT_IS_ROBOTMAKER) @@ -629,7 +631,7 @@ fix repaircen_give_shields(const shared_segment &segp, const fix MaxAmountCanTak void disable_matcens(void) { auto &Station = LevelUniqueFuelcenterState.Station; - range_for (auto &s, partial_range(Station, Num_fuelcenters)) + range_for (auto &s, partial_range(Station, LevelUniqueFuelcenterState.Num_fuelcenters)) if (s.Type == SEGMENT_IS_ROBOTMAKER) { s.Enabled = 0; @@ -644,6 +646,7 @@ void init_all_matcens(void) { auto &RobotCenters = LevelSharedRobotcenterState.RobotCenters; auto &Station = LevelUniqueFuelcenterState.Station; + const auto Num_fuelcenters = LevelUniqueFuelcenterState.Num_fuelcenters; const auto &&robot_range = partial_const_range(RobotCenters, Num_robot_centers); for (uint_fast32_t i = 0; i < Num_fuelcenters; i++) if (Station[i].Type == SEGMENT_IS_ROBOTMAKER) { diff --git a/similar/main/multibot.cpp b/similar/main/multibot.cpp index 1ae76c948..0c68840f2 100644 --- a/similar/main/multibot.cpp +++ b/similar/main/multibot.cpp @@ -988,7 +988,7 @@ void multi_do_create_robot(const d_vclip_array &Vclip, const playernum_t pnum, c objnum_t objnum; objnum = GET_INTEL_SHORT(buf + 3); - if (fuelcen_num >= Num_fuelcenters || pnum >= N_players) + if (fuelcen_num >= LevelUniqueFuelcenterState.Num_fuelcenters || pnum >= N_players) { Int3(); // Bogus data return; diff --git a/similar/main/state.cpp b/similar/main/state.cpp index ca13d1037..69b412eca 100644 --- a/similar/main/state.cpp +++ b/similar/main/state.cpp @@ -1179,6 +1179,7 @@ int state_save_all_sub(const char *filename, const char *desc) matcen_info_write(fp, r, 0x7f); #endif control_center_triggers_write(&ControlCenterTriggers, fp); + const auto Num_fuelcenters = LevelUniqueFuelcenterState.Num_fuelcenters; PHYSFS_write(fp, &Num_fuelcenters, sizeof(int), 1); range_for (auto &s, partial_range(Station, Num_fuelcenters)) { @@ -1781,7 +1782,8 @@ int state_restore_all_sub(const d_level_shared_destructible_light_state &LevelSh matcen_info_read(fp, r); #endif control_center_triggers_read(&ControlCenterTriggers, fp); - Num_fuelcenters = PHYSFSX_readSXE32(fp, swap); + const unsigned Num_fuelcenters = PHYSFSX_readSXE32(fp, swap); + LevelUniqueFuelcenterState.Num_fuelcenters = Num_fuelcenters; range_for (auto &s, partial_range(Station, Num_fuelcenters)) { fuelcen_read(fp, s);