Move CloakingWalls to d_level_unique_cloaking_wall_state

This commit is contained in:
Kp 2018-12-30 00:43:58 +00:00
parent 9be3c8e2e8
commit 865bad8607
4 changed files with 22 additions and 10 deletions

View file

@ -190,7 +190,11 @@ struct cloaking_wall : public prohibit_void_ptr<cloaking_wall>
array<fix, 4> back_ls; // back wall saved light values
fix time; // how long been cloaking or decloaking
};
DXX_VALPTRIDX_DEFINE_GLOBAL_FACTORIES(cloaking_wall, clwall, CloakingWalls);
struct d_level_unique_cloaking_wall_state
{
cloaking_wall_array CloakingWalls;
};
#endif
struct d_level_unique_wall_state
@ -200,6 +204,9 @@ struct d_level_unique_wall_state
struct d_level_unique_wall_subsystem_state :
d_level_unique_wall_state
#if defined(DXX_BUILD_DESCENT_II)
, d_level_unique_cloaking_wall_state
#endif
{
};

View file

@ -93,9 +93,6 @@ valptridx<managed_type>::array_managed_type::array_managed_type()
namespace dsx {
d_level_shared_segment_state LevelSharedSegmentState;
#if defined(DXX_BUILD_DESCENT_II)
valptridx<cloaking_wall>::array_managed_type CloakingWalls;
#endif
d_level_unique_object_state LevelUniqueObjectState;
valptridx<object>::array_managed_type Objects;
valptridx<trigger>::array_managed_type Triggers;

View file

@ -1126,12 +1126,15 @@ int state_save_all_sub(const char *filename, const char *desc)
#if defined(DXX_BUILD_DESCENT_II)
//Save cloaking wall info
{
auto &CloakingWalls = LevelUniqueWallSubsystemState.CloakingWalls;
{
const int i = CloakingWalls.get_count();
PHYSFS_write(fp, &i, sizeof(int), 1);
}
range_for (auto &&w, vcclwallptr)
range_for (auto &&w, CloakingWalls.vcptr)
cloaking_wall_write(w, fp);
}
#endif
//Save trigger info
@ -1720,8 +1723,9 @@ int state_restore_all_sub(const d_level_shared_destructible_light_state &LevelSh
#if defined(DXX_BUILD_DESCENT_II)
if (version >= 14) { //Restore cloaking wall info
unsigned num_cloaking_walls = PHYSFSX_readSXE32(fp, swap);
auto &CloakingWalls = LevelUniqueWallSubsystemState.CloakingWalls;
CloakingWalls.set_count(num_cloaking_walls);
range_for (auto &&w, vmclwallptr)
range_for (auto &&w, CloakingWalls.vmptr)
cloaking_wall_read(w, fp);
}
#endif

View file

@ -246,6 +246,7 @@ void wall_init()
}
ActiveDoors.set_count(0);
#if defined(DXX_BUILD_DESCENT_II)
auto &CloakingWalls = LevelUniqueWallSubsystemState.CloakingWalls;
CloakingWalls.set_count(0);
#endif
@ -517,8 +518,9 @@ void start_wall_cloak(const vmsegptridx_t seg, const unsigned side)
Assert(Connectside != side_none);
const auto cwall_num = csegp->shared_segment::sides[Connectside].wall_num;
auto &CloakingWalls = LevelUniqueWallSubsystemState.CloakingWalls;
if (w->state == WALL_DOOR_DECLOAKING) { //decloaking, so reuse door
const auto &&r = make_range(vmclwallptr);
const auto &&r = make_range(CloakingWalls.vmptr);
const auto i = std::find_if(r.begin(), r.end(), find_cloaked_wall_predicate(w));
if (i == r.end())
{
@ -539,7 +541,7 @@ void start_wall_cloak(const vmsegptridx_t seg, const unsigned side)
return;
}
CloakingWalls.set_count(c + 1);
d = vmclwallptr(c);
d = CloakingWalls.vmptr(c);
d->time = 0;
}
else {
@ -591,8 +593,9 @@ void start_wall_decloak(const vmsegptridx_t seg, const unsigned side)
if (w->type == WALL_CLOSED || w->state == WALL_DOOR_DECLOAKING) //already closed or decloaking
return;
auto &CloakingWalls = LevelUniqueWallSubsystemState.CloakingWalls;
if (w->state == WALL_DOOR_CLOAKING) { //cloaking, so reuse door
const auto &&r = make_range(vmclwallptr);
const auto &&r = make_range(CloakingWalls.vmptr);
const auto i = std::find_if(r.begin(), r.end(), find_cloaked_wall_predicate(w));
if (i == r.end())
{
@ -614,7 +617,7 @@ void start_wall_decloak(const vmsegptridx_t seg, const unsigned side)
return;
}
CloakingWalls.set_count(c + 1);
d = vmclwallptr(c);
d = CloakingWalls.vmptr(c);
d->time = 0;
}
else {
@ -1346,6 +1349,7 @@ void wall_frame_process()
#if defined(DXX_BUILD_DESCENT_II)
if (Newdemo_state != ND_STATE_PLAYBACK)
{
auto &CloakingWalls = LevelUniqueWallSubsystemState.CloakingWalls;
const auto &&r = partial_range(CloakingWalls, CloakingWalls.get_count());
auto &Walls = LevelUniqueWallSubsystemState.Walls;
cw_removal_predicate rp{Segments.vmptr, Walls};