Use valptridx array type for Walls

This commit is contained in:
Kp 2016-02-06 22:12:54 +00:00
parent 72d2844070
commit bb5d1bb7e5
10 changed files with 33 additions and 24 deletions

View file

@ -68,10 +68,10 @@ const std::size_t MAX_VERTICES = MAX_SEGMENT_VERTICES;
struct uvl; struct uvl;
enum side_type : uint8_t; enum side_type : uint8_t;
template <int16_t I> using wallnum_t = uint16_t;
template <wallnum_t I>
struct wall_magic_constant_t; struct wall_magic_constant_t;
struct wallnum_t;
struct side; struct side;
} }

View file

@ -12,6 +12,7 @@
#include "maths.h" #include "maths.h"
#include "fwd-object.h" #include "fwd-object.h"
#include "fwd-segment.h" #include "fwd-segment.h"
#include "fwd-valptridx.h"
#ifdef dsx #ifdef dsx
namespace dsx { namespace dsx {
@ -151,13 +152,13 @@ const auto WID_CLOAKED_WALL = WALL_IS_DOORWAY_sresult(WID_RENDER_FLAG | W
namespace dcx { namespace dcx {
template <int16_t I> template <wallnum_t I>
struct wall_magic_constant_t 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; const std::size_t MAX_STUCK_OBJECTS = 32;
@ -186,13 +187,13 @@ extern array<cloaking_wall, MAX_CLOAKING_WALLS> CloakingWalls;
extern unsigned Num_cloaking_walls; extern unsigned Num_cloaking_walls;
#endif #endif
extern array<wall, MAX_WALLS> Walls; // Master walls array DXX_VALPTRIDX_DECLARE_GLOBAL_SUBTYPE(wall, wall, Walls, MAX_WALLS);
extern array<active_door, MAX_DOORS> ActiveDoors; // Master doors array extern array<active_door, MAX_DOORS> ActiveDoors; // Master doors array
extern array<wclip, MAX_WALL_ANIMS> WallAnims; extern array<wclip, MAX_WALL_ANIMS> WallAnims;
} }
namespace dcx { 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_open_doors; // Number of open doors
extern unsigned Num_wall_anims; extern unsigned Num_wall_anims;
} }

View file

@ -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 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<wallnum_t> struct wallnum_t : prohibit_void_ptr<wallnum_t>
{ {
typedef int16_t integral_type; typedef int16_t integral_type;
@ -135,6 +136,7 @@ struct wallnum_t : prohibit_void_ptr<wallnum_t>
constexpr operator integral_type() const { return value; } constexpr operator integral_type() const { return value; }
operator integral_type &() { return value; } operator integral_type &() { return value; }
}; };
#endif
struct side struct side
{ {

View file

@ -98,7 +98,7 @@ static int add_wall(const vsegptridx_t seg, short side)
if (IS_CHILD(seg->children[side])) { if (IS_CHILD(seg->children[side])) {
if (seg->sides[side].wall_num == wall_none) { if (seg->sides[side].wall_num == wall_none) {
seg->sides[side].wall_num = Num_walls; seg->sides[side].wall_num = Num_walls;
Num_walls++; Walls.set_count(Num_walls + 1);
} }
const auto &&csegp = seg.absolute_sibling(seg->children[side]); 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) { if (csegp->sides[Connectside].wall_num == wall_none) {
csegp->sides[Connectside].wall_num = Num_walls; csegp->sides[Connectside].wall_num = Num_walls;
Num_walls++; Walls.set_count(Num_walls + 1);
} }
create_removable_wall( seg, side, CurrentTexture ); 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;w<Num_walls-2;w++) for (int w=lower_wallnum;w<Num_walls-2;w++)
Walls[w] = Walls[w+2]; Walls[w] = Walls[w+2];
Num_walls -= 2; Walls.set_count(Num_walls - 2);
range_for (const auto &&segp, highest_valid(vsegptr)) range_for (const auto &&segp, highest_valid(vsegptr))
{ {
@ -938,7 +938,7 @@ int check_walls()
if (wall_count != Num_walls) { if (wall_count != Num_walls) {
if (ui_messagebox(-2, -2, 2, "Num_walls is bogus\nDo you wish to correct it?\n", "Yes", "No") == 1) if (ui_messagebox(-2, -2, 2, "Num_walls is bogus\nDo you wish to correct it?\n", "Yes", "No") == 1)
{ {
Num_walls = wall_count; Walls.set_count(wall_count);
editor_status_fmt("Num_walls set to %d\n", Num_walls); editor_status_fmt("Num_walls set to %d\n", Num_walls);
} }
} }
@ -984,7 +984,7 @@ int delete_all_walls()
range_for (auto &side, segp->sides) range_for (auto &side, segp->sides)
side.wall_num = wall_none; side.wall_num = wall_none;
} }
Num_walls=0; Walls.set_count(0);
Triggers.set_count(0); Triggers.set_count(0);
return 1; 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); copy_old_wall_data_to_new(Segments[old_seg].sides[j].wall_num, Num_walls);
Walls[Num_walls].segnum = new_seg; Walls[Num_walls].segnum = new_seg;
Walls[Num_walls].sidenum = j; Walls[Num_walls].sidenum = j;
Num_walls++; Walls.set_count(Num_walls + 1);
Assert(Num_walls < MAX_WALLS); Assert(Num_walls < MAX_WALLS);
} }
} }

View file

@ -810,7 +810,7 @@ static int load_game_data(PHYSFS_File *LoadFile)
gs_num_objects = PHYSFSX_readInt(LoadFile); gs_num_objects = PHYSFSX_readInt(LoadFile);
PHYSFSX_fseek(LoadFile, 8, SEEK_CUR); PHYSFSX_fseek(LoadFile, 8, SEEK_CUR);
Num_walls = PHYSFSX_readInt(LoadFile); Walls.set_count(PHYSFSX_readInt(LoadFile));
PHYSFSX_fseek(LoadFile, 20, SEEK_CUR); PHYSFSX_fseek(LoadFile, 20, SEEK_CUR);
Triggers.set_count(PHYSFSX_readInt(LoadFile)); Triggers.set_count(PHYSFSX_readInt(LoadFile));
@ -1118,24 +1118,25 @@ static int load_game_data(PHYSFS_File *LoadFile)
//fix old wall structs //fix old wall structs
if (game_top_fileinfo_version < 17) { if (game_top_fileinfo_version < 17) {
int wallnum;
range_for (const auto &&segp, highest_valid(vcsegptridx)) range_for (const auto &&segp, highest_valid(vcsegptridx))
{ {
for (int sidenum=0;sidenum<6;sidenum++) 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].segnum = segp;
Walls[wallnum].sidenum = sidenum; Walls[wallnum].sidenum = sidenum;
} }
} }
} }
}
#ifndef NDEBUG #ifndef NDEBUG
{ {
for (int sidenum=0; sidenum<6; sidenum++) { for (int sidenum=0; sidenum<6; sidenum++) {
int wallnum = Segments[Highest_segment_index].sides[sidenum].wall_num; const auto wallnum = Segments[Highest_segment_index].sides[sidenum].wall_num;
if (wallnum != -1) if (wallnum != wall_none)
if ((Walls[wallnum].segnum != Highest_segment_index) || (Walls[wallnum].sidenum != sidenum)) if ((Walls[wallnum].segnum != Highest_segment_index) || (Walls[wallnum].sidenum != sidenum))
Int3(); // Error. Bogus walls in this segment. Int3(); // Error. Bogus walls in this segment.
// Consult Yuan or Mike. // Consult Yuan or Mike.

View file

@ -34,6 +34,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
#include "game.h" #include "game.h"
#include "textures.h" #include "textures.h"
#include "valptridx.tcc" #include "valptridx.tcc"
#include "wall.h"
namespace dcx { namespace dcx {
unsigned Num_segments; unsigned Num_segments;
@ -106,8 +107,10 @@ namespace dsx {
valptridx<object>::array_managed_type Objects; valptridx<object>::array_managed_type Objects;
valptridx<segment>::array_managed_type Segments; valptridx<segment>::array_managed_type Segments;
valptridx<trigger>::array_managed_type Triggers; valptridx<trigger>::array_managed_type Triggers;
valptridx<wall>::array_managed_type Walls;
} }
template class valptridx<object>; template class valptridx<object>;
template class valptridx<segment>; template class valptridx<segment>;
template class valptridx<trigger>; template class valptridx<trigger>;
template class valptridx<wall>;

View file

@ -3055,7 +3055,9 @@ static int newdemo_read_frame_information(int rewrite)
#if defined(DXX_BUILD_DESCENT_II) #if defined(DXX_BUILD_DESCENT_II)
if (nd_playback_v_juststarted) 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) if (rewrite)
nd_write_int (Num_walls); nd_write_int (Num_walls);
range_for (auto &w, partial_range(Walls, Num_walls)) range_for (auto &w, partial_range(Walls, Num_walls))

View file

@ -18,8 +18,10 @@
namespace dcx { namespace dcx {
#if 0
DEFINE_SERIAL_UDT_TO_MESSAGE(wallnum_t, w, (w.value)); DEFINE_SERIAL_UDT_TO_MESSAGE(wallnum_t, w, (w.value));
ASSERT_SERIAL_UDT_MESSAGE_SIZE(wallnum_t, 2); 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)); DEFINE_SERIAL_UDT_TO_MESSAGE(side, s, (s.wall_num, s.tmap_num, s.tmap_num2));
ASSERT_SERIAL_UDT_MESSAGE_SIZE(side, 6); ASSERT_SERIAL_UDT_MESSAGE_SIZE(side, 6);

View file

@ -1532,7 +1532,7 @@ int state_restore_all_sub(const char *filename, const secret_restore secret)
} }
//Restore wall info //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)) range_for (auto &w, partial_range(Walls, Num_walls))
wall_read(fp, w); wall_read(fp, w);

View file

@ -41,13 +41,11 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
#define BOSS_LOCKED_DOOR_SIDE 5 #define BOSS_LOCKED_DOOR_SIDE 5
namespace dcx { namespace dcx {
unsigned Num_walls; // Number of walls
unsigned Num_wall_anims; unsigned Num_wall_anims;
unsigned Num_open_doors; // Number of open doors unsigned Num_open_doors; // Number of open doors
} }
namespace dsx { namespace dsx {
array<wall, MAX_WALLS> Walls; // Master walls array
array<wclip, MAX_WALL_ANIMS> WallAnims; // Wall animations array<wclip, MAX_WALL_ANIMS> WallAnims; // Wall animations
array<active_door, MAX_DOORS> ActiveDoors; array<active_door, MAX_DOORS> 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) // Initializes all the walls (in other words, no special walls)
void wall_init() void wall_init()
{ {
Num_walls = 0; Walls.set_count(0);
range_for (auto &w, Walls) range_for (auto &w, Walls)
{ {
w.segnum = segment_none; w.segnum = segment_none;