Move Num_fuelcenters to d_level_unique_fuelcenter_state

This commit is contained in:
Kp 2019-02-02 18:36:39 +00:00
parent 943e0a8b5f
commit 84fa2cde4a
6 changed files with 19 additions and 14 deletions

View file

@ -121,6 +121,7 @@ struct d1_matcen_info : public prohibit_void_ptr<d1_matcen_info>
struct d_level_unique_fuelcenter_state
{
unsigned Num_fuelcenters;
// Original D1 size: 50, Original D2 size: 70
array<FuelCenter, 128> Station;
};
@ -181,7 +182,6 @@ void matcen_info_write(PHYSFS_File *fp, const matcen_info &mi, short version);
namespace dcx {
constexpr std::integral_constant<uint8_t, 0xff> station_none{};
extern unsigned Num_robot_centers;
extern unsigned Num_fuelcenters;
extern const fix EnergyToCreateOneRobot;
}
#endif

View file

@ -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;

View file

@ -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; i<Num_fuelcenters; i++) {
PHYSFSX_printf(my_file, "Fuelcenter %i: Type=%i (%s), segment = %3i\n", i, Station[i].Type, Special_names[Station[i].Type], Station[i].segnum);
if (Segments[Station[i].segnum].special != Station[i].Type)

View file

@ -70,7 +70,6 @@ constexpr fix Fuelcen_max_amount = i2f(100);
constexpr fix EnergyToCreateOneRobot = i2f(1);
unsigned Num_robot_centers;
unsigned Num_fuelcenters;
static int Num_extry_robots = 15;
}
@ -97,7 +96,7 @@ void fuelcen_reset()
auto &Station = LevelUniqueFuelcenterState.Station;
DXX_MAKE_MEM_UNDEFINED(Station.begin(), Station.end());
DXX_MAKE_MEM_UNDEFINED(RobotCenters.begin(), RobotCenters.end());
Num_fuelcenters = 0;
LevelUniqueFuelcenterState.Num_fuelcenters = 0;
range_for (auto &i, Segments)
i.special = SEGMENT_IS_NOTHING;
@ -144,8 +143,9 @@ void fuelcen_create(const vmsegptridx_t segp)
Error( "Invalid station type %d in fuelcen.c\n", station_type );
}
segp->station_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) {

View file

@ -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;

View file

@ -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);