2006-03-20 17:12:09 +00:00
|
|
|
/*
|
2014-06-01 17:55:23 +00:00
|
|
|
* Portions of this file are copyright Rebirth contributors and licensed as
|
|
|
|
* described in COPYING.txt.
|
|
|
|
* Portions of this file are copyright Parallax Software and licensed
|
|
|
|
* according to the Parallax license below.
|
|
|
|
* See COPYING.txt for license details.
|
|
|
|
|
2006-03-20 17:12:09 +00:00
|
|
|
THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
|
|
|
|
SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
|
|
|
|
END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
|
|
|
|
ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
|
|
|
|
IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
|
|
|
|
SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
|
|
|
|
FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
|
|
|
|
CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
|
|
|
|
AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
|
|
|
|
COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
*
|
|
|
|
* Header for wall.c
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2014-12-22 04:35:48 +00:00
|
|
|
#pragma once
|
2006-03-20 17:12:09 +00:00
|
|
|
#include "segment.h"
|
2013-12-26 04:18:28 +00:00
|
|
|
|
2012-11-11 22:12:51 +00:00
|
|
|
#ifdef __cplusplus
|
2015-10-09 02:46:10 +00:00
|
|
|
#include "fwd-wall.h"
|
2018-08-29 01:47:42 +00:00
|
|
|
#include "fwd-object.h"
|
2014-06-21 23:55:24 +00:00
|
|
|
#include "pack.h"
|
2014-09-06 22:26:11 +00:00
|
|
|
|
2015-12-22 04:18:50 +00:00
|
|
|
namespace dcx {
|
|
|
|
|
2015-11-26 02:56:55 +00:00
|
|
|
#if defined(DXX_BUILD_DESCENT_I) || defined(DXX_BUILD_DESCENT_II)
|
2014-09-06 22:26:11 +00:00
|
|
|
struct WALL_IS_DOORWAY_mask_t
|
|
|
|
{
|
|
|
|
unsigned value;
|
|
|
|
template <unsigned F>
|
|
|
|
constexpr WALL_IS_DOORWAY_mask_t(WALL_IS_DOORWAY_FLAG<F>) :
|
|
|
|
value(F)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
struct WALL_IS_DOORWAY_result_t
|
|
|
|
{
|
|
|
|
unsigned value;
|
|
|
|
template <unsigned F>
|
|
|
|
constexpr WALL_IS_DOORWAY_result_t(WALL_IS_DOORWAY_sresult_t<F>) :
|
|
|
|
value(F)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
template <unsigned F>
|
|
|
|
unsigned operator&(WALL_IS_DOORWAY_FLAG<F>) const
|
|
|
|
{
|
|
|
|
return value & F;
|
|
|
|
}
|
|
|
|
template <unsigned F>
|
|
|
|
WALL_IS_DOORWAY_result_t operator|=(WALL_IS_DOORWAY_FLAG<F>)
|
|
|
|
{
|
|
|
|
value |= F;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
template <unsigned F>
|
|
|
|
bool operator==(WALL_IS_DOORWAY_sresult_t<F>) const
|
|
|
|
{
|
|
|
|
return value == F;
|
|
|
|
}
|
|
|
|
bool operator&(WALL_IS_DOORWAY_mask_t m) const
|
|
|
|
{
|
|
|
|
return value & m.value;
|
|
|
|
}
|
|
|
|
bool operator==(WALL_IS_DOORWAY_result_t) const = delete;
|
|
|
|
template <typename T>
|
|
|
|
bool operator!=(const T &t) const
|
|
|
|
{
|
|
|
|
return !(*this == t);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2014-06-21 23:55:24 +00:00
|
|
|
struct stuckobj : public prohibit_void_ptr<stuckobj>
|
2013-12-22 22:03:07 +00:00
|
|
|
{
|
2018-08-04 17:52:57 +00:00
|
|
|
objnum_t objnum = object_none;
|
|
|
|
wallnum_t wallnum = wall_none;
|
2013-12-22 22:03:07 +00:00
|
|
|
};
|
2018-08-29 01:47:42 +00:00
|
|
|
#endif
|
2006-03-20 17:12:09 +00:00
|
|
|
|
|
|
|
//Start old wall structures
|
|
|
|
|
2015-04-26 20:15:50 +00:00
|
|
|
struct v16_wall : public prohibit_void_ptr<v16_wall>
|
2013-12-22 22:03:07 +00:00
|
|
|
{
|
2006-03-20 17:12:09 +00:00
|
|
|
sbyte type; // What kind of special wall.
|
|
|
|
sbyte flags; // Flags for the wall.
|
2015-04-26 20:15:50 +00:00
|
|
|
uint8_t trigger; // Which trigger is associated with the wall.
|
2006-03-20 17:12:09 +00:00
|
|
|
fix hps; // "Hit points" of the wall.
|
|
|
|
sbyte clip_num; // Which animation associated with the wall.
|
|
|
|
sbyte keys;
|
2014-04-27 03:09:11 +00:00
|
|
|
};
|
2006-03-20 17:12:09 +00:00
|
|
|
|
2014-06-21 23:55:24 +00:00
|
|
|
struct v19_wall : public prohibit_void_ptr<v19_wall>
|
2013-12-22 22:03:07 +00:00
|
|
|
{
|
2013-12-29 04:28:07 +00:00
|
|
|
segnum_t segnum;
|
2006-03-20 17:12:09 +00:00
|
|
|
sbyte type; // What kind of special wall.
|
|
|
|
sbyte flags; // Flags for the wall.
|
2015-04-26 20:15:50 +00:00
|
|
|
int sidenum; // Seg & side for this wall
|
2006-03-20 17:12:09 +00:00
|
|
|
fix hps; // "Hit points" of the wall.
|
2015-04-26 20:15:50 +00:00
|
|
|
uint8_t trigger; // Which trigger is associated with the wall.
|
2006-03-20 17:12:09 +00:00
|
|
|
sbyte clip_num; // Which animation associated with the wall.
|
|
|
|
sbyte keys;
|
|
|
|
int linked_wall; // number of linked wall
|
2014-04-27 03:09:11 +00:00
|
|
|
};
|
2006-03-20 17:12:09 +00:00
|
|
|
|
2018-08-29 01:47:42 +00:00
|
|
|
#ifdef dsx
|
2018-08-04 17:52:57 +00:00
|
|
|
class d_level_unique_stuck_object_state
|
|
|
|
{
|
|
|
|
protected:
|
|
|
|
unsigned Num_stuck_objects = 0;
|
|
|
|
array<stuckobj, 32> Stuck_objects;
|
|
|
|
public:
|
|
|
|
void init_stuck_objects();
|
|
|
|
};
|
2018-08-29 01:47:42 +00:00
|
|
|
#endif
|
2018-08-04 17:52:57 +00:00
|
|
|
|
2015-12-22 04:18:50 +00:00
|
|
|
}
|
|
|
|
|
2006-03-20 17:12:09 +00:00
|
|
|
//End old wall structures
|
|
|
|
|
2016-01-09 16:38:15 +00:00
|
|
|
#ifdef dsx
|
2015-12-22 04:18:50 +00:00
|
|
|
namespace dsx {
|
|
|
|
|
2018-08-04 17:52:57 +00:00
|
|
|
/* No shared state is possible for this structure, but include the
|
|
|
|
* `unique` qualifier to document its status.
|
|
|
|
*/
|
|
|
|
class d_level_unique_stuck_object_state : public ::dcx::d_level_unique_stuck_object_state
|
|
|
|
{
|
|
|
|
public:
|
2018-09-19 02:13:29 +00:00
|
|
|
void add_stuck_object(fvcwallptr &, vmobjptridx_t objp, const shared_segment &segp, unsigned sidenum);
|
2018-08-04 17:52:57 +00:00
|
|
|
void remove_stuck_object(vcobjidx_t);
|
|
|
|
void kill_stuck_objects(fvmobjptr &, vcwallidx_t wallnum);
|
|
|
|
};
|
|
|
|
|
|
|
|
extern d_level_unique_stuck_object_state LevelUniqueStuckObjectState;
|
|
|
|
|
2014-06-21 23:55:24 +00:00
|
|
|
struct wall : public prohibit_void_ptr<wall>
|
2013-12-22 22:03:07 +00:00
|
|
|
{
|
2013-12-29 04:28:07 +00:00
|
|
|
segnum_t segnum;
|
2016-12-24 22:44:08 +00:00
|
|
|
uint8_t sidenum; // Seg & side for this wall
|
2015-01-12 00:26:02 +00:00
|
|
|
uint8_t type; // What kind of special wall.
|
2006-03-20 17:12:09 +00:00
|
|
|
fix hps; // "Hit points" of the wall.
|
2018-08-12 21:08:07 +00:00
|
|
|
uint16_t explode_time_elapsed;
|
2016-02-06 22:12:54 +00:00
|
|
|
wallnum_t linked_wall; // number of linked wall
|
2006-03-20 17:12:09 +00:00
|
|
|
ubyte flags; // Flags for the wall.
|
|
|
|
ubyte state; // Opening, closing, etc.
|
2015-04-26 20:15:50 +00:00
|
|
|
uint8_t trigger; // Which trigger is associated with the wall.
|
2006-03-20 17:12:09 +00:00
|
|
|
sbyte clip_num; // Which animation associated with the wall.
|
|
|
|
ubyte keys; // which keys are required
|
2015-01-12 00:26:02 +00:00
|
|
|
#if defined(DXX_BUILD_DESCENT_II)
|
2006-03-20 17:12:09 +00:00
|
|
|
sbyte controlling_trigger;// which trigger causes something to happen here. Not like "trigger" above, which is the trigger on this wall.
|
|
|
|
// Note: This gets stuffed at load time in gamemine.c. Don't try to use it in the editor. You will be sorry!
|
|
|
|
sbyte cloak_value; // if this wall is cloaked, the fade value
|
2013-03-03 01:03:33 +00:00
|
|
|
#endif
|
2014-04-27 03:09:11 +00:00
|
|
|
};
|
2015-12-22 04:18:50 +00:00
|
|
|
|
|
|
|
}
|
2006-03-20 17:12:09 +00:00
|
|
|
|
2015-12-22 04:18:50 +00:00
|
|
|
namespace dcx {
|
|
|
|
|
2014-06-21 23:55:24 +00:00
|
|
|
struct active_door : public prohibit_void_ptr<active_door>
|
2013-12-22 22:03:07 +00:00
|
|
|
{
|
2016-02-12 04:02:28 +00:00
|
|
|
unsigned n_parts; // for linked walls
|
2016-02-06 22:12:54 +00:00
|
|
|
array<wallnum_t, 2> front_wallnum; // front wall numbers for this door
|
|
|
|
array<wallnum_t, 2> back_wallnum; // back wall numbers for this door
|
2006-03-20 17:12:09 +00:00
|
|
|
fix time; // how long been opening, closing, waiting
|
2014-04-27 02:39:44 +00:00
|
|
|
};
|
2006-03-20 17:12:09 +00:00
|
|
|
|
2017-06-10 03:31:03 +00:00
|
|
|
DXX_VALPTRIDX_DEFINE_GLOBAL_FACTORIES(active_door, actdoor, ActiveDoors);
|
2016-12-10 17:51:08 +00:00
|
|
|
|
2015-12-22 04:18:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
namespace dsx {
|
2013-03-03 01:03:33 +00:00
|
|
|
#if defined(DXX_BUILD_DESCENT_II)
|
2014-06-21 23:55:24 +00:00
|
|
|
struct cloaking_wall : public prohibit_void_ptr<cloaking_wall>
|
2013-12-22 22:03:07 +00:00
|
|
|
{
|
2016-02-06 22:12:54 +00:00
|
|
|
wallnum_t front_wallnum; // front wall numbers for this door
|
|
|
|
wallnum_t back_wallnum; // back wall numbers for this door
|
2014-01-12 23:00:43 +00:00
|
|
|
array<fix, 4> front_ls; // front wall saved light values
|
|
|
|
array<fix, 4> back_ls; // back wall saved light values
|
2006-03-20 17:12:09 +00:00
|
|
|
fix time; // how long been cloaking or decloaking
|
2014-01-12 23:00:43 +00:00
|
|
|
};
|
2017-06-10 03:31:03 +00:00
|
|
|
DXX_VALPTRIDX_DEFINE_GLOBAL_FACTORIES(cloaking_wall, clwall, CloakingWalls);
|
2013-03-03 01:03:33 +00:00
|
|
|
#endif
|
2006-03-20 17:12:09 +00:00
|
|
|
|
2017-06-10 03:31:03 +00:00
|
|
|
DXX_VALPTRIDX_DEFINE_GLOBAL_FACTORIES(wall, wall, Walls);
|
2016-02-12 04:02:28 +00:00
|
|
|
|
2014-06-21 23:55:24 +00:00
|
|
|
struct wclip : public prohibit_void_ptr<wclip>
|
|
|
|
{
|
2006-03-20 17:12:09 +00:00
|
|
|
fix play_time;
|
2017-06-17 23:05:16 +00:00
|
|
|
uint16_t num_frames;
|
2014-02-02 05:30:48 +00:00
|
|
|
union {
|
|
|
|
array<int16_t, MAX_CLIP_FRAMES> frames;
|
|
|
|
array<int16_t, MAX_CLIP_FRAMES_D1> d1_frames;
|
|
|
|
};
|
2006-03-20 17:12:09 +00:00
|
|
|
short open_sound;
|
|
|
|
short close_sound;
|
|
|
|
short flags;
|
2014-02-02 05:08:33 +00:00
|
|
|
array<char, 13> filename;
|
2014-02-02 05:30:48 +00:00
|
|
|
};
|
2006-03-20 17:12:09 +00:00
|
|
|
|
2017-10-14 17:10:30 +00:00
|
|
|
constexpr std::integral_constant<uint16_t, 0xffff> wclip_frames_none{};
|
2017-06-17 23:05:16 +00:00
|
|
|
|
2018-06-24 05:06:15 +00:00
|
|
|
static inline WALL_IS_DOORWAY_result_t WALL_IS_DOORWAY(const GameBitmaps_array &GameBitmaps, const Textures_array &Textures, fvcwallptr &vcwallptr, const shared_segment &sseg, const unique_segment &useg, const uint_fast32_t side)
|
2013-12-12 00:21:54 +00:00
|
|
|
{
|
2018-06-24 05:06:15 +00:00
|
|
|
/* For now, useg is useless. It will become useful when
|
|
|
|
* shared_segment::sides splits into shared_side and unique_side.
|
|
|
|
*/
|
|
|
|
(void)useg;
|
|
|
|
const auto child = sseg.children[side];
|
2015-01-12 00:26:03 +00:00
|
|
|
if (unlikely(child == segment_none))
|
2013-12-12 00:21:54 +00:00
|
|
|
return WID_WALL;
|
2015-01-12 00:26:03 +00:00
|
|
|
if (unlikely(child == segment_exit))
|
2013-12-12 00:21:54 +00:00
|
|
|
return WID_EXTERNAL;
|
2018-06-24 05:06:15 +00:00
|
|
|
auto &sside = sseg.sides[side];
|
|
|
|
if (likely(sside.wall_num == wall_none))
|
2013-12-12 00:21:54 +00:00
|
|
|
return WID_NO_WALL;
|
2018-06-24 05:06:15 +00:00
|
|
|
return wall_is_doorway(GameBitmaps, Textures, vcwallptr, sside, sside);
|
2013-12-12 00:21:54 +00:00
|
|
|
}
|
2015-12-22 04:18:50 +00:00
|
|
|
}
|
2006-03-20 17:12:09 +00:00
|
|
|
#endif
|
2015-07-25 23:10:45 +00:00
|
|
|
#endif
|