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;
enum side_type : uint8_t;
template <int16_t I>
using wallnum_t = uint16_t;
template <wallnum_t I>
struct wall_magic_constant_t;
struct wallnum_t;
struct side;
}

View file

@ -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 <int16_t I>
template <wallnum_t I>
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<cloaking_wall, MAX_CLOAKING_WALLS> CloakingWalls;
extern unsigned Num_cloaking_walls;
#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<wclip, MAX_WALL_ANIMS> 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;
}

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
};
#if 0
struct wallnum_t : prohibit_void_ptr<wallnum_t>
{
typedef int16_t integral_type;
@ -135,6 +136,7 @@ struct wallnum_t : prohibit_void_ptr<wallnum_t>
constexpr operator integral_type() const { return value; }
operator integral_type &() { return value; }
};
#endif
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 (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;w<Num_walls-2;w++)
Walls[w] = Walls[w+2];
Num_walls -= 2;
Walls.set_count(Num_walls - 2);
range_for (const auto &&segp, highest_valid(vsegptr))
{
@ -938,7 +938,7 @@ int check_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)
{
Num_walls = wall_count;
Walls.set_count(wall_count);
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)
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);
}
}

View file

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

View file

@ -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<object>::array_managed_type Objects;
valptridx<segment>::array_managed_type Segments;
valptridx<trigger>::array_managed_type Triggers;
valptridx<wall>::array_managed_type Walls;
}
template class valptridx<object>;
template class valptridx<segment>;
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 (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))

View file

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

View file

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

View file

@ -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<wall, MAX_WALLS> Walls; // Master walls array
array<wclip, MAX_WALL_ANIMS> WallAnims; // Wall animations
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)
void wall_init()
{
Num_walls = 0;
Walls.set_count(0);
range_for (auto &w, Walls)
{
w.segnum = segment_none;