Use valptridx array type for Walls
This commit is contained in:
parent
72d2844070
commit
bb5d1bb7e5
|
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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>;
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue