diff --git a/common/main/fwd-segment.h b/common/main/fwd-segment.h index 1347b6cf9..351944f18 100644 --- a/common/main/fwd-segment.h +++ b/common/main/fwd-segment.h @@ -68,10 +68,10 @@ const std::size_t MAX_VERTICES = MAX_SEGMENT_VERTICES; struct uvl; enum side_type : uint8_t; -template +using wallnum_t = uint16_t; +template struct wall_magic_constant_t; -struct wallnum_t; struct side; } diff --git a/common/main/fwd-wall.h b/common/main/fwd-wall.h index bb8acb9d5..2873e223e 100644 --- a/common/main/fwd-wall.h +++ b/common/main/fwd-wall.h @@ -12,6 +12,7 @@ #include "maths.h" #include "fwd-object.h" #include "fwd-segment.h" +#include "fwd-valptridx.h" #ifdef dsx namespace dsx { @@ -151,13 +152,13 @@ const auto WID_CLOAKED_WALL = WALL_IS_DOORWAY_sresult(WID_RENDER_FLAG | W namespace dcx { -template +template struct wall_magic_constant_t { - constexpr operator int16_t() const { return I; } + constexpr operator wallnum_t() const { return I; } }; -const wall_magic_constant_t<-1> wall_none{}; +const wall_magic_constant_t<0xffff> wall_none{}; const std::size_t MAX_STUCK_OBJECTS = 32; @@ -186,13 +187,13 @@ extern array CloakingWalls; extern unsigned Num_cloaking_walls; #endif -extern array Walls; // Master walls array +DXX_VALPTRIDX_DECLARE_GLOBAL_SUBTYPE(wall, wall, Walls, MAX_WALLS); extern array ActiveDoors; // Master doors array extern array WallAnims; } namespace dcx { -extern unsigned Num_walls; // Number of walls +#define Num_walls Walls.get_count() extern unsigned Num_open_doors; // Number of open doors extern unsigned Num_wall_anims; } diff --git a/common/main/segment.h b/common/main/segment.h index a66e52faf..9b3eed05b 100644 --- a/common/main/segment.h +++ b/common/main/segment.h @@ -71,6 +71,7 @@ enum side_type : uint8_t SIDE_IS_TRI_13 = 3, // render side as two triangles, triangulated along edge from 1 to 3 }; +#if 0 struct wallnum_t : prohibit_void_ptr { typedef int16_t integral_type; @@ -135,6 +136,7 @@ struct wallnum_t : prohibit_void_ptr constexpr operator integral_type() const { return value; } operator integral_type &() { return value; } }; +#endif struct side { diff --git a/similar/editor/medwall.cpp b/similar/editor/medwall.cpp index 7ba15fd92..64bc5f1ac 100644 --- a/similar/editor/medwall.cpp +++ b/similar/editor/medwall.cpp @@ -98,7 +98,7 @@ static int add_wall(const vsegptridx_t seg, short side) if (IS_CHILD(seg->children[side])) { if (seg->sides[side].wall_num == wall_none) { seg->sides[side].wall_num = Num_walls; - Num_walls++; + Walls.set_count(Num_walls + 1); } const auto &&csegp = seg.absolute_sibling(seg->children[side]); @@ -106,7 +106,7 @@ static int add_wall(const vsegptridx_t seg, short side) if (csegp->sides[Connectside].wall_num == wall_none) { csegp->sides[Connectside].wall_num = Num_walls; - Num_walls++; + Walls.set_count(Num_walls + 1); } create_removable_wall( seg, side, CurrentTexture ); @@ -657,7 +657,7 @@ int wall_remove_side(const vsegptridx_t seg, short side) for (int w=lower_wallnum;wsides) side.wall_num = wall_none; } - Num_walls=0; + Walls.set_count(0); Triggers.set_count(0); return 1; @@ -1042,7 +1042,7 @@ void copy_group_walls(int old_group, int new_group) copy_old_wall_data_to_new(Segments[old_seg].sides[j].wall_num, Num_walls); Walls[Num_walls].segnum = new_seg; Walls[Num_walls].sidenum = j; - Num_walls++; + Walls.set_count(Num_walls + 1); Assert(Num_walls < MAX_WALLS); } } diff --git a/similar/main/gamesave.cpp b/similar/main/gamesave.cpp index 619b9338f..19738e482 100644 --- a/similar/main/gamesave.cpp +++ b/similar/main/gamesave.cpp @@ -810,7 +810,7 @@ static int load_game_data(PHYSFS_File *LoadFile) gs_num_objects = PHYSFSX_readInt(LoadFile); PHYSFSX_fseek(LoadFile, 8, SEEK_CUR); - Num_walls = PHYSFSX_readInt(LoadFile); + Walls.set_count(PHYSFSX_readInt(LoadFile)); PHYSFSX_fseek(LoadFile, 20, SEEK_CUR); Triggers.set_count(PHYSFSX_readInt(LoadFile)); @@ -1118,24 +1118,25 @@ static int load_game_data(PHYSFS_File *LoadFile) //fix old wall structs if (game_top_fileinfo_version < 17) { - int wallnum; - range_for (const auto &&segp, highest_valid(vcsegptridx)) { for (int sidenum=0;sidenum<6;sidenum++) - if ((wallnum = segp->sides[sidenum].wall_num) != -1) + { + const auto wallnum = segp->sides[sidenum].wall_num; + if (wallnum != wall_none) { Walls[wallnum].segnum = segp; Walls[wallnum].sidenum = sidenum; } + } } } #ifndef NDEBUG { for (int sidenum=0; sidenum<6; sidenum++) { - int wallnum = Segments[Highest_segment_index].sides[sidenum].wall_num; - if (wallnum != -1) + const auto wallnum = Segments[Highest_segment_index].sides[sidenum].wall_num; + if (wallnum != wall_none) if ((Walls[wallnum].segnum != Highest_segment_index) || (Walls[wallnum].sidenum != sidenum)) Int3(); // Error. Bogus walls in this segment. // Consult Yuan or Mike. diff --git a/similar/main/mglobal.cpp b/similar/main/mglobal.cpp index 6eac3567e..c0e9a819e 100644 --- a/similar/main/mglobal.cpp +++ b/similar/main/mglobal.cpp @@ -34,6 +34,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #include "game.h" #include "textures.h" #include "valptridx.tcc" +#include "wall.h" namespace dcx { unsigned Num_segments; @@ -106,8 +107,10 @@ namespace dsx { valptridx::array_managed_type Objects; valptridx::array_managed_type Segments; valptridx::array_managed_type Triggers; +valptridx::array_managed_type Walls; } template class valptridx; template class valptridx; template class valptridx; +template class valptridx; diff --git a/similar/main/newdemo.cpp b/similar/main/newdemo.cpp index 1b4abc566..bf3e816b3 100644 --- a/similar/main/newdemo.cpp +++ b/similar/main/newdemo.cpp @@ -3055,7 +3055,9 @@ static int newdemo_read_frame_information(int rewrite) #if defined(DXX_BUILD_DESCENT_II) if (nd_playback_v_juststarted) { - nd_read_int (&Num_walls); + unsigned num_walls; + nd_read_int (&num_walls); + Walls.set_count(num_walls); if (rewrite) nd_write_int (Num_walls); range_for (auto &w, partial_range(Walls, Num_walls)) diff --git a/similar/main/segment.cpp b/similar/main/segment.cpp index 41c3521bd..7710ae588 100644 --- a/similar/main/segment.cpp +++ b/similar/main/segment.cpp @@ -18,8 +18,10 @@ namespace dcx { +#if 0 DEFINE_SERIAL_UDT_TO_MESSAGE(wallnum_t, w, (w.value)); ASSERT_SERIAL_UDT_MESSAGE_SIZE(wallnum_t, 2); +#endif DEFINE_SERIAL_UDT_TO_MESSAGE(side, s, (s.wall_num, s.tmap_num, s.tmap_num2)); ASSERT_SERIAL_UDT_MESSAGE_SIZE(side, 6); diff --git a/similar/main/state.cpp b/similar/main/state.cpp index a6b124238..63d5a0f62 100644 --- a/similar/main/state.cpp +++ b/similar/main/state.cpp @@ -1532,7 +1532,7 @@ int state_restore_all_sub(const char *filename, const secret_restore secret) } //Restore wall info - Num_walls = PHYSFSX_readSXE32(fp, swap); + Walls.set_count(PHYSFSX_readSXE32(fp, swap)); range_for (auto &w, partial_range(Walls, Num_walls)) wall_read(fp, w); diff --git a/similar/main/wall.cpp b/similar/main/wall.cpp index 935ea7749..04447a692 100644 --- a/similar/main/wall.cpp +++ b/similar/main/wall.cpp @@ -41,13 +41,11 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #define BOSS_LOCKED_DOOR_SIDE 5 namespace dcx { -unsigned Num_walls; // Number of walls unsigned Num_wall_anims; unsigned Num_open_doors; // Number of open doors } namespace dsx { -array Walls; // Master walls array array WallAnims; // Wall animations array ActiveDoors; } @@ -138,7 +136,7 @@ WALL_IS_DOORWAY_result_t wall_is_doorway(const side &side) // Initializes all the walls (in other words, no special walls) void wall_init() { - Num_walls = 0; + Walls.set_count(0); range_for (auto &w, Walls) { w.segnum = segment_none;