2014-03-15 16:59:03 +00:00
|
|
|
// SONIC ROBO BLAST 2
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Copyright (C) 1993-1996 by id Software, Inc.
|
|
|
|
// Copyright (C) 1998-2000 by DooM Legacy Team.
|
2020-02-19 22:08:45 +00:00
|
|
|
// Copyright (C) 1999-2020 by Sonic Team Junior.
|
2014-03-15 16:59:03 +00:00
|
|
|
//
|
|
|
|
// This program is free software distributed under the
|
|
|
|
// terms of the GNU General Public License, version 2.
|
|
|
|
// See the 'LICENSE' file for more details.
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
/// \file p_spec.h
|
|
|
|
/// \brief Implements special effects:
|
|
|
|
/// Texture animation, height or lighting changes
|
|
|
|
/// according to adjacent sectors, respective
|
|
|
|
/// utility functions, etc.
|
|
|
|
|
|
|
|
#ifndef __P_SPEC__
|
|
|
|
#define __P_SPEC__
|
|
|
|
|
2017-04-26 17:16:01 +00:00
|
|
|
extern mobj_t *skyboxmo[2]; // current skybox mobjs: 0 = viewpoint, 1 = centerpoint
|
|
|
|
extern mobj_t *skyboxviewpnts[16]; // array of MT_SKYBOX viewpoint mobjs
|
|
|
|
extern mobj_t *skyboxcenterpnts[16]; // array of MT_SKYBOX centerpoint mobjs
|
2014-03-15 16:59:03 +00:00
|
|
|
|
2020-04-18 16:02:43 +00:00
|
|
|
//FOF flags
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
TMFV_NOPLANES = 1,
|
|
|
|
TMFV_NOSIDES = 1<<1,
|
|
|
|
TMFV_TOGGLEINSIDES = 1<<2,
|
|
|
|
} textmapfofvisibility_t;
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
TMFT_INTANGIBLETOP = 1,
|
|
|
|
TMFT_INTANGIBLEBOTTOM = 1<<1,
|
|
|
|
TMFT_DONTBLOCKPLAYER = 1<<2,
|
|
|
|
TMFT_VISIBLEFROMINSIDE = (TMFT_INTANGIBLETOP|TMFT_INTANGIBLEBOTTOM|TMFT_DONTBLOCKPLAYER),
|
|
|
|
TMFT_DONTBLOCKOTHERS = 1<<3,
|
|
|
|
} textmapfoftangibility_t;
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
TMFA_TRANSLUCENT = 1,
|
|
|
|
TMFA_NOSHADE = 1<<1,
|
|
|
|
} textmapfofappearance_t;
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
2020-06-12 07:00:06 +00:00
|
|
|
TMFW_NOSIDES = 1,
|
|
|
|
TMFW_DOUBLESHADOW = 1<<1,
|
|
|
|
TMFW_COLORMAPONLY = 1<<2,
|
|
|
|
TMFW_NORIPPLE = 1<<3,
|
|
|
|
TMFW_GOOWATER = 1<<4,
|
|
|
|
TMFW_SPLAT = 1<<5,
|
2020-04-18 16:02:43 +00:00
|
|
|
} textmapfofwater_t;
|
|
|
|
|
2020-04-27 08:29:29 +00:00
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
TMFB_REVERSE = 1,
|
|
|
|
TMFB_SPINDASH = 1<<1,
|
|
|
|
TMFB_DYNAMIC = 1<<2,
|
|
|
|
} textmapfofbobbing_t;
|
|
|
|
|
2020-04-18 16:02:43 +00:00
|
|
|
typedef enum
|
|
|
|
{
|
2020-06-12 07:28:41 +00:00
|
|
|
TMFC_NOSHADE = 1,
|
|
|
|
TMFC_NORETURN = 1<<1,
|
|
|
|
TMFC_AIRBOB = 1<<2,
|
|
|
|
TMFC_FLOATBOB = 1<<3,
|
|
|
|
TMFC_SPLAT = 1<<4,
|
2020-04-18 16:02:43 +00:00
|
|
|
} textmapfofcrumbling_t;
|
|
|
|
|
2020-04-27 09:52:31 +00:00
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
TMFR_REVERSE = 1,
|
|
|
|
TMFR_SPINDASH = 1<<1,
|
|
|
|
} textmapfofrising_t;
|
|
|
|
|
2020-04-18 16:02:43 +00:00
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
TMFM_BRICK = 1,
|
|
|
|
TMFM_INVISIBLE = 1<<1,
|
|
|
|
} textmapfofmario_t;
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
TMFB_TOUCH,
|
|
|
|
TMFB_SPIN,
|
|
|
|
TMFB_REGULAR,
|
|
|
|
TMFB_STRONG,
|
|
|
|
} textmapfofbusttype_t;
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
TMFB_PUSHABLES = 1,
|
|
|
|
TMFB_EXECUTOR = 1<<1,
|
|
|
|
TMFB_ONLYBOTTOM = 1<<2,
|
|
|
|
} textmapfofbustflags_t;
|
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
// GETSECSPECIAL (specialval, section)
|
|
|
|
//
|
|
|
|
// Pulls out the special # from a particular section.
|
|
|
|
//
|
|
|
|
#define GETSECSPECIAL(i,j) ((i >> ((j-1)*4))&15)
|
|
|
|
|
2020-01-01 15:01:07 +00:00
|
|
|
// This must be updated whenever we up the max flat size - quicker to assume rather than figuring out the sqrt of the specific flat's filesize.
|
|
|
|
#define MAXFLATSIZE (2048<<FRACBITS)
|
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
// at game start
|
|
|
|
void P_InitPicAnims(void);
|
|
|
|
|
|
|
|
// at map load (sectors)
|
|
|
|
void P_SetupLevelFlatAnims(void);
|
|
|
|
|
|
|
|
// at map load
|
2017-04-24 19:33:39 +00:00
|
|
|
void P_InitSpecials(void);
|
2019-12-28 11:48:32 +00:00
|
|
|
void P_SpawnSpecials(boolean fromnetsave);
|
2014-03-15 16:59:03 +00:00
|
|
|
|
|
|
|
// every tic
|
|
|
|
void P_UpdateSpecials(void);
|
|
|
|
sector_t *P_PlayerTouchingSectorSpecial(player_t *player, INT32 section, INT32 number);
|
|
|
|
void P_PlayerInSpecialSector(player_t *player);
|
|
|
|
void P_ProcessSpecialSector(player_t *player, sector_t *sector, sector_t *roversector);
|
|
|
|
|
|
|
|
fixed_t P_FindLowestFloorSurrounding(sector_t *sec);
|
|
|
|
fixed_t P_FindHighestFloorSurrounding(sector_t *sec);
|
|
|
|
|
|
|
|
fixed_t P_FindNextHighestFloor(sector_t *sec, fixed_t currentheight);
|
|
|
|
fixed_t P_FindNextLowestFloor(sector_t *sec, fixed_t currentheight);
|
|
|
|
|
|
|
|
fixed_t P_FindLowestCeilingSurrounding(sector_t *sec);
|
|
|
|
fixed_t P_FindHighestCeilingSurrounding(sector_t *sec);
|
|
|
|
|
|
|
|
INT32 P_FindSectorFromTag(INT16 tag, INT32 start);
|
|
|
|
INT32 P_FindSpecialLineFromTag(INT16 special, INT16 tag, INT32 start);
|
|
|
|
|
|
|
|
INT32 P_FindMinSurroundingLight(sector_t *sector, INT32 max);
|
|
|
|
|
|
|
|
void P_SetupSignExit(player_t *player);
|
2014-05-26 02:41:05 +00:00
|
|
|
boolean P_IsFlagAtBase(mobjtype_t flag);
|
2014-03-15 16:59:03 +00:00
|
|
|
|
|
|
|
void P_SwitchWeather(INT32 weathernum);
|
|
|
|
|
2014-08-04 03:49:33 +00:00
|
|
|
boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller);
|
2014-03-15 16:59:03 +00:00
|
|
|
void P_LinedefExecute(INT16 tag, mobj_t *actor, sector_t *caller);
|
|
|
|
void P_ChangeSectorTag(UINT32 sector, INT16 newtag);
|
2018-03-31 14:11:27 +00:00
|
|
|
void P_RunNightserizeExecutors(mobj_t *actor);
|
|
|
|
void P_RunDeNightserizeExecutors(mobj_t *actor);
|
|
|
|
void P_RunNightsLapExecutors(mobj_t *actor);
|
2018-08-14 16:00:37 +00:00
|
|
|
void P_RunNightsCapsuleTouchExecutors(mobj_t *actor, boolean entering, boolean enoughspheres);
|
2014-03-15 16:59:03 +00:00
|
|
|
|
2020-04-24 21:29:41 +00:00
|
|
|
UINT16 P_GetFFloorID(ffloor_t *fflr);
|
2016-07-10 16:58:54 +00:00
|
|
|
ffloor_t *P_GetFFloorByID(sector_t *sec, UINT16 id);
|
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
//
|
|
|
|
// P_LIGHTS
|
|
|
|
//
|
|
|
|
/** Fire flicker action structure.
|
|
|
|
*/
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker; ///< The thinker in use for the effect.
|
|
|
|
sector_t *sector; ///< The sector where action is taking place.
|
|
|
|
INT32 count;
|
|
|
|
INT32 resetcount;
|
|
|
|
INT32 maxlight; ///< The brightest light level to use.
|
|
|
|
INT32 minlight; ///< The darkest light level to use.
|
|
|
|
} fireflicker_t;
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker;
|
|
|
|
sector_t *sector;
|
|
|
|
INT32 maxlight;
|
|
|
|
INT32 minlight;
|
|
|
|
} lightflash_t;
|
|
|
|
|
|
|
|
/** Laser block thinker.
|
|
|
|
*/
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker; ///< Thinker structure for laser.
|
2020-05-02 08:03:16 +00:00
|
|
|
INT16 tag;
|
2014-03-15 16:59:03 +00:00
|
|
|
line_t *sourceline;
|
2020-04-27 11:09:57 +00:00
|
|
|
UINT8 nobosses;
|
2014-03-15 16:59:03 +00:00
|
|
|
} laserthink_t;
|
|
|
|
|
|
|
|
/** Strobe light action structure..
|
|
|
|
*/
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker; ///< The thinker in use for the effect.
|
|
|
|
sector_t *sector; ///< The sector where the action is taking place.
|
|
|
|
INT32 count;
|
|
|
|
INT32 minlight; ///< The minimum light level to use.
|
|
|
|
INT32 maxlight; ///< The maximum light level to use.
|
|
|
|
INT32 darktime; ///< How INT32 to use minlight.
|
|
|
|
INT32 brighttime; ///< How INT32 to use maxlight.
|
|
|
|
} strobe_t;
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker;
|
|
|
|
sector_t *sector;
|
|
|
|
INT32 minlight;
|
|
|
|
INT32 maxlight;
|
|
|
|
INT32 direction;
|
|
|
|
INT32 speed;
|
|
|
|
} glow_t;
|
|
|
|
|
|
|
|
/** Thinker struct for fading lights.
|
|
|
|
*/
|
|
|
|
typedef struct
|
|
|
|
{
|
2018-09-15 10:21:25 +00:00
|
|
|
thinker_t thinker; ///< Thinker in use for the effect.
|
|
|
|
sector_t *sector; ///< Sector where action is taking place.
|
|
|
|
INT16 sourcelevel; ///< Light level we're fading from.
|
|
|
|
INT16 destlevel; ///< Light level we're fading to.
|
|
|
|
|
|
|
|
fixed_t fixedcurlevel; ///< Fixed point for current light level.
|
|
|
|
fixed_t fixedpertic; ///< Fixed point for increment per tic.
|
|
|
|
// The reason for those two above to be fixed point is to deal with decimal values that would otherwise get trimmed away.
|
|
|
|
INT32 timer; ///< Internal timer.
|
2014-03-15 16:59:03 +00:00
|
|
|
} lightlevel_t;
|
|
|
|
|
|
|
|
#define GLOWSPEED 8
|
|
|
|
#define STROBEBRIGHT 5
|
|
|
|
#define FASTDARK 15
|
|
|
|
#define SLOWDARK 35
|
|
|
|
|
2018-09-09 03:44:29 +00:00
|
|
|
void P_RemoveLighting(sector_t *sector);
|
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
void T_FireFlicker(fireflicker_t *flick);
|
|
|
|
fireflicker_t *P_SpawnAdjustableFireFlicker(sector_t *minsector, sector_t *maxsector, INT32 length);
|
|
|
|
void T_LightningFlash(lightflash_t *flash);
|
|
|
|
void T_StrobeFlash(strobe_t *flash);
|
|
|
|
|
|
|
|
void P_SpawnLightningFlash(sector_t *sector);
|
|
|
|
strobe_t * P_SpawnAdjustableStrobeFlash(sector_t *minsector, sector_t *maxsector, INT32 darktime, INT32 brighttime, boolean inSync);
|
|
|
|
|
|
|
|
void T_Glow(glow_t *g);
|
|
|
|
glow_t *P_SpawnAdjustableGlowingLight(sector_t *minsector, sector_t *maxsector, INT32 length);
|
|
|
|
|
2018-09-09 17:43:00 +00:00
|
|
|
void P_FadeLightBySector(sector_t *sector, INT32 destvalue, INT32 speed, boolean ticbased);
|
2018-09-18 10:27:30 +00:00
|
|
|
void P_FadeLight(INT16 tag, INT32 destvalue, INT32 speed, boolean ticbased, boolean force);
|
2014-03-15 16:59:03 +00:00
|
|
|
void T_LightFade(lightlevel_t *ll);
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
floor_special,
|
|
|
|
ceiling_special,
|
|
|
|
lighting_special,
|
|
|
|
} special_e;
|
|
|
|
|
|
|
|
//
|
|
|
|
// P_CEILNG
|
|
|
|
//
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
raiseToHighest,
|
|
|
|
lowerToLowest,
|
|
|
|
raiseToLowest,
|
|
|
|
lowerToLowestFast,
|
|
|
|
|
|
|
|
instantRaise, // instant-move for ceilings
|
|
|
|
|
|
|
|
lowerAndCrush,
|
|
|
|
crushAndRaise,
|
|
|
|
fastCrushAndRaise,
|
|
|
|
crushCeilOnce,
|
|
|
|
crushBothOnce,
|
|
|
|
|
|
|
|
moveCeilingByFrontSector,
|
|
|
|
instantMoveCeilingByFrontSector,
|
|
|
|
|
|
|
|
moveCeilingByFrontTexture,
|
|
|
|
|
|
|
|
bounceCeiling,
|
|
|
|
bounceCeilingCrush,
|
|
|
|
} ceiling_e;
|
|
|
|
|
|
|
|
/** Ceiling movement structure.
|
|
|
|
*/
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker; ///< Thinker for the type of movement.
|
|
|
|
ceiling_e type; ///< Type of movement.
|
|
|
|
sector_t *sector; ///< Sector where the action is taking place.
|
|
|
|
fixed_t bottomheight; ///< The lowest height to move to.
|
|
|
|
fixed_t topheight; ///< The highest height to move to.
|
|
|
|
fixed_t speed; ///< Ceiling speed.
|
|
|
|
fixed_t oldspeed;
|
|
|
|
fixed_t delay;
|
|
|
|
fixed_t delaytimer;
|
|
|
|
UINT8 crush; ///< Whether to crush things or not.
|
|
|
|
|
|
|
|
INT32 texture; ///< The number of a flat to use when done.
|
|
|
|
INT32 direction; ///< 1 = up, 0 = waiting, -1 = down.
|
|
|
|
|
|
|
|
// ID
|
|
|
|
INT32 tag;
|
|
|
|
INT32 olddirection;
|
|
|
|
fixed_t origspeed; ///< The original, "real" speed.
|
|
|
|
INT32 sourceline; ///< Index of the source linedef
|
|
|
|
} ceiling_t;
|
|
|
|
|
|
|
|
#define CEILSPEED (FRACUNIT)
|
|
|
|
|
|
|
|
INT32 EV_DoCeiling(line_t *line, ceiling_e type);
|
|
|
|
|
|
|
|
INT32 EV_DoCrush(line_t *line, ceiling_e type);
|
|
|
|
void T_CrushCeiling(ceiling_t *ceiling);
|
|
|
|
|
|
|
|
void T_MoveCeiling(ceiling_t *ceiling);
|
|
|
|
|
|
|
|
//
|
|
|
|
// P_FLOOR
|
|
|
|
//
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
// lower floor to lowest surrounding floor
|
|
|
|
lowerFloorToLowest,
|
|
|
|
|
|
|
|
// raise floor to next highest surrounding floor
|
|
|
|
raiseFloorToNearestFast,
|
|
|
|
|
|
|
|
// move the floor down instantly
|
|
|
|
instantLower,
|
|
|
|
|
|
|
|
moveFloorByFrontSector,
|
|
|
|
instantMoveFloorByFrontSector,
|
|
|
|
|
|
|
|
moveFloorByFrontTexture,
|
|
|
|
|
|
|
|
bounceFloor,
|
|
|
|
bounceFloorCrush,
|
|
|
|
|
|
|
|
crushFloorOnce,
|
|
|
|
} floor_e;
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
elevateUp,
|
|
|
|
elevateDown,
|
|
|
|
elevateCurrent,
|
|
|
|
elevateContinuous,
|
|
|
|
elevateBounce,
|
|
|
|
elevateHighest,
|
|
|
|
bridgeFall,
|
|
|
|
} elevator_e;
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker;
|
|
|
|
floor_e type;
|
|
|
|
UINT8 crush;
|
|
|
|
sector_t *sector;
|
|
|
|
INT32 direction;
|
|
|
|
INT32 texture;
|
|
|
|
fixed_t floordestheight;
|
|
|
|
fixed_t speed;
|
|
|
|
fixed_t origspeed;
|
|
|
|
fixed_t delay;
|
|
|
|
fixed_t delaytimer;
|
|
|
|
} floormove_t;
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker;
|
|
|
|
elevator_e type;
|
|
|
|
sector_t *sector;
|
|
|
|
sector_t *actionsector; // The sector the rover action is taking place in.
|
|
|
|
INT32 direction;
|
|
|
|
fixed_t floordestheight;
|
|
|
|
fixed_t ceilingdestheight;
|
|
|
|
fixed_t speed;
|
|
|
|
fixed_t origspeed;
|
|
|
|
fixed_t low;
|
|
|
|
fixed_t high;
|
|
|
|
fixed_t distance;
|
|
|
|
fixed_t delay;
|
|
|
|
fixed_t delaytimer;
|
|
|
|
fixed_t floorwasheight; // Height the floor WAS at
|
|
|
|
fixed_t ceilingwasheight; // Height the ceiling WAS at
|
|
|
|
line_t *sourceline;
|
|
|
|
} elevator_t;
|
|
|
|
|
2020-04-26 14:51:14 +00:00
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
CF_RETURN = 1, // Return after crumbling
|
|
|
|
CF_FLOATBOB = 1<<1, // Float on water
|
|
|
|
CF_REVERSE = 1<<2, // Reverse gravity
|
|
|
|
} crumbleflag_t;
|
|
|
|
|
2020-04-26 09:55:10 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker;
|
2020-04-26 14:51:14 +00:00
|
|
|
line_t *sourceline;
|
2020-04-26 09:55:10 +00:00
|
|
|
sector_t *sector;
|
|
|
|
sector_t *actionsector; // The sector the rover action is taking place in.
|
2020-04-26 14:51:14 +00:00
|
|
|
player_t *player; // Player who initiated the thinker (used for airbob)
|
2020-04-26 09:55:10 +00:00
|
|
|
INT32 direction;
|
2020-04-26 14:51:14 +00:00
|
|
|
INT32 origalpha;
|
|
|
|
INT32 timer;
|
2020-04-26 09:55:10 +00:00
|
|
|
fixed_t speed;
|
|
|
|
fixed_t floorwasheight; // Height the floor WAS at
|
|
|
|
fixed_t ceilingwasheight; // Height the ceiling WAS at
|
2020-04-26 14:51:14 +00:00
|
|
|
UINT8 flags;
|
2020-04-26 09:55:10 +00:00
|
|
|
} crumble_t;
|
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker;
|
|
|
|
line_t *sourceline; // Source line of the thinker
|
2020-04-18 07:21:04 +00:00
|
|
|
} noenemies_t;
|
|
|
|
|
2020-04-17 23:42:13 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker;
|
|
|
|
sector_t *sector;
|
|
|
|
fixed_t speed;
|
|
|
|
INT32 direction;
|
|
|
|
fixed_t floorstartheight;
|
|
|
|
fixed_t ceilingstartheight;
|
|
|
|
fixed_t destheight;
|
|
|
|
} continuousfall_t;
|
|
|
|
|
2020-04-18 08:45:21 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker;
|
|
|
|
line_t *sourceline;
|
|
|
|
sector_t *sector;
|
|
|
|
fixed_t speed;
|
|
|
|
fixed_t distance;
|
|
|
|
fixed_t floorwasheight;
|
|
|
|
fixed_t ceilingwasheight;
|
|
|
|
boolean low;
|
|
|
|
} bouncecheese_t;
|
|
|
|
|
2020-04-18 00:05:23 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker;
|
|
|
|
sector_t *sector;
|
|
|
|
fixed_t speed;
|
|
|
|
INT32 direction;
|
|
|
|
fixed_t floorstartheight;
|
|
|
|
fixed_t ceilingstartheight;
|
|
|
|
INT16 tag;
|
|
|
|
} mariothink_t;
|
|
|
|
|
2020-04-18 09:05:58 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker;
|
|
|
|
line_t *sourceline;
|
|
|
|
sector_t *sector;
|
|
|
|
} mariocheck_t;
|
2014-03-15 16:59:03 +00:00
|
|
|
|
2020-04-25 07:20:53 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker;
|
|
|
|
line_t *sourceline;
|
|
|
|
sector_t *sector;
|
|
|
|
fixed_t crushspeed;
|
|
|
|
fixed_t retractspeed;
|
|
|
|
INT32 direction;
|
|
|
|
fixed_t floorstartheight;
|
|
|
|
fixed_t ceilingstartheight;
|
|
|
|
INT32 delay;
|
|
|
|
INT16 tag;
|
|
|
|
UINT16 sound;
|
|
|
|
} thwomp_t;
|
|
|
|
|
2020-04-17 22:26:49 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker;
|
|
|
|
line_t *sourceline;
|
|
|
|
sector_t *sector;
|
|
|
|
INT16 tag;
|
|
|
|
} floatthink_t;
|
|
|
|
|
2020-04-17 12:00:48 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker;
|
|
|
|
line_t *sourceline; // Source line of the thinker
|
|
|
|
boolean playersInArea[MAXPLAYERS];
|
|
|
|
boolean playersOnArea[MAXPLAYERS];
|
|
|
|
boolean triggerOnExit;
|
|
|
|
} eachtime_t;
|
|
|
|
|
2020-04-26 08:33:13 +00:00
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
RF_REVERSE = 1, //Lower when stood on
|
|
|
|
RF_SPINDASH = 1<<1, //Require spindash to move
|
|
|
|
RF_DYNAMIC = 1<<2, //Dynamically sinking platform
|
|
|
|
} raiseflag_t;
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker;
|
2020-04-27 10:54:08 +00:00
|
|
|
INT16 tag;
|
2020-04-26 08:33:13 +00:00
|
|
|
sector_t *sector;
|
|
|
|
fixed_t ceilingbottom;
|
|
|
|
fixed_t ceilingtop;
|
|
|
|
fixed_t basespeed;
|
|
|
|
fixed_t extraspeed; //For dynamically sinking platform
|
|
|
|
UINT8 shaketimer; //For dynamically sinking platform
|
|
|
|
UINT8 flags;
|
|
|
|
} raise_t;
|
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
#define ELEVATORSPEED (FRACUNIT*4)
|
|
|
|
#define FLOORSPEED (FRACUNIT)
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
ok,
|
|
|
|
crushed,
|
|
|
|
pastdest
|
|
|
|
} result_e;
|
|
|
|
|
|
|
|
result_e T_MovePlane(sector_t *sector, fixed_t speed, fixed_t dest, boolean crush,
|
2020-04-17 23:08:01 +00:00
|
|
|
boolean ceiling, INT32 direction);
|
2020-04-18 08:52:58 +00:00
|
|
|
void EV_DoFloor(line_t *line, floor_e floortype);
|
|
|
|
void EV_DoElevator(line_t *line, elevator_e elevtype, boolean customspeed);
|
2014-03-15 16:59:03 +00:00
|
|
|
void EV_CrumbleChain(sector_t *sec, ffloor_t *rover);
|
2020-04-18 08:52:58 +00:00
|
|
|
void EV_BounceSector(sector_t *sector, fixed_t momz, line_t *sourceline);
|
2014-03-15 16:59:03 +00:00
|
|
|
|
|
|
|
// Some other special 3dfloor types
|
|
|
|
INT32 EV_StartCrumble(sector_t *sector, ffloor_t *rover,
|
|
|
|
boolean floating, player_t *player, fixed_t origalpha, boolean crumblereturn);
|
|
|
|
|
2020-04-17 23:42:13 +00:00
|
|
|
void EV_DoContinuousFall(sector_t *sec, sector_t *backsector, fixed_t spd, boolean backwards);
|
2014-03-15 16:59:03 +00:00
|
|
|
|
2020-04-18 00:05:23 +00:00
|
|
|
void EV_MarioBlock(ffloor_t *rover, sector_t *sector, mobj_t *puncher);
|
2014-03-15 16:59:03 +00:00
|
|
|
|
|
|
|
void T_MoveFloor(floormove_t *movefloor);
|
|
|
|
|
|
|
|
void T_MoveElevator(elevator_t *elevator);
|
2020-04-17 23:42:13 +00:00
|
|
|
void T_ContinuousFalling(continuousfall_t *faller);
|
2020-04-18 08:45:21 +00:00
|
|
|
void T_BounceCheese(bouncecheese_t *bouncer);
|
2020-04-26 09:55:10 +00:00
|
|
|
void T_StartCrumble(crumble_t *crumble);
|
2020-04-18 00:05:23 +00:00
|
|
|
void T_MarioBlock(mariothink_t *block);
|
2020-04-17 22:26:49 +00:00
|
|
|
void T_FloatSector(floatthink_t *floater);
|
2020-04-18 09:05:58 +00:00
|
|
|
void T_MarioBlockChecker(mariocheck_t *block);
|
2020-04-25 07:20:53 +00:00
|
|
|
void T_ThwompSector(thwomp_t *thwomp);
|
2020-04-18 07:21:04 +00:00
|
|
|
void T_NoEnemiesSector(noenemies_t *nobaddies);
|
2020-04-17 12:00:48 +00:00
|
|
|
void T_EachTimeThinker(eachtime_t *eachtime);
|
2014-03-15 16:59:03 +00:00
|
|
|
void T_CameraScanner(elevator_t *elevator);
|
2020-04-26 08:33:13 +00:00
|
|
|
void T_RaiseSector(raise_t *raise);
|
2014-03-15 16:59:03 +00:00
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker; // Thinker for linedef executor delay
|
|
|
|
line_t *line; // Pointer to line that is waiting.
|
|
|
|
mobj_t *caller; // Pointer to calling mobj
|
2014-11-12 00:55:07 +00:00
|
|
|
sector_t *sector; // Pointer to triggering sector
|
2014-03-15 16:59:03 +00:00
|
|
|
INT32 timer; // Delay timer
|
|
|
|
} executor_t;
|
|
|
|
|
|
|
|
void T_ExecutorDelay(executor_t *e);
|
|
|
|
|
|
|
|
/** Generalized scroller.
|
|
|
|
*/
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker; ///< Thinker structure for scrolling.
|
|
|
|
fixed_t dx, dy; ///< (dx,dy) scroll speeds.
|
|
|
|
INT32 affectee; ///< Number of affected sidedef or sector.
|
|
|
|
INT32 control; ///< Control sector (-1 if none) used to control scrolling.
|
|
|
|
fixed_t last_height; ///< Last known height of control sector.
|
|
|
|
fixed_t vdx, vdy; ///< Accumulated velocity if accelerative.
|
|
|
|
INT32 accel; ///< Whether it's accelerative.
|
|
|
|
INT32 exclusive; ///< If a conveyor, same property as in pusher_t
|
|
|
|
/** Types of generalized scrollers.
|
|
|
|
*/
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
sc_side, ///< Scroll wall texture on a sidedef.
|
|
|
|
sc_floor, ///< Scroll floor.
|
|
|
|
sc_ceiling, ///< Scroll ceiling.
|
|
|
|
sc_carry, ///< Carry objects on floor.
|
|
|
|
sc_carry_ceiling,///< Carry objects on ceiling (for 3Dfloor conveyors).
|
|
|
|
} type;
|
|
|
|
} scroll_t;
|
|
|
|
|
|
|
|
void T_Scroll(scroll_t *s);
|
|
|
|
void T_LaserFlash(laserthink_t *flash);
|
|
|
|
|
|
|
|
/** Friction for ice/sludge effects.
|
|
|
|
*/
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker; ///< Thinker structure for friction.
|
|
|
|
INT32 friction; ///< Friction value, 0xe800 = normal.
|
2016-08-09 23:05:46 +00:00
|
|
|
INT32 movefactor; ///< Inertia factor when adding to momentum, FRACUNIT = normal.
|
2014-03-15 16:59:03 +00:00
|
|
|
INT32 affectee; ///< Number of affected sector.
|
|
|
|
INT32 referrer; ///< If roverfriction == true, then this will contain the sector # of the control sector where the effect was applied.
|
|
|
|
UINT8 roverfriction; ///< flag for whether friction originated from a FOF or not
|
|
|
|
} friction_t;
|
|
|
|
|
|
|
|
// Friction defines.
|
|
|
|
#define ORIG_FRICTION (0xE8 << (FRACBITS-8)) ///< Original value.
|
|
|
|
#define ORIG_FRICTION_FACTOR (8 << (FRACBITS-8)) ///< Original value.
|
|
|
|
|
|
|
|
void T_Friction(friction_t *f);
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
p_push, ///< Point pusher or puller.
|
|
|
|
p_wind, ///< Wind.
|
|
|
|
p_current, ///< Current.
|
|
|
|
p_upcurrent, ///< Upwards current.
|
|
|
|
p_downcurrent, ///< Downwards current.
|
|
|
|
p_upwind, ///< Upwards wind.
|
|
|
|
p_downwind ///< Downwards wind.
|
|
|
|
} pushertype_e;
|
|
|
|
|
|
|
|
// Model for pushers for push/pull effects
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker; ///< Thinker structure for push/pull effect.
|
|
|
|
/** Types of push/pull effects.
|
|
|
|
*/
|
|
|
|
pushertype_e type; ///< Type of push/pull effect.
|
|
|
|
mobj_t *source; ///< Point source if point pusher/puller.
|
|
|
|
INT32 x_mag; ///< X strength.
|
|
|
|
INT32 y_mag; ///< Y strength.
|
|
|
|
INT32 magnitude; ///< Vector strength for point pusher/puller.
|
|
|
|
INT32 radius; ///< Effective radius for point pusher/puller.
|
|
|
|
INT32 x, y, z; ///< Point source if point pusher/puller.
|
|
|
|
INT32 affectee; ///< Number of affected sector.
|
|
|
|
UINT8 roverpusher; ///< flag for whether pusher originated from a FOF or not
|
|
|
|
INT32 referrer; ///< If roverpusher == true, then this will contain the sector # of the control sector where the effect was applied.
|
|
|
|
INT32 exclusive; /// < Once this affect has been applied to a mobj, no other pushers may affect it.
|
|
|
|
INT32 slider; /// < Should the player go into an uncontrollable slide?
|
|
|
|
} pusher_t;
|
|
|
|
|
|
|
|
// Model for disappearing/reappearing FOFs
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker; ///< Thinker structure for effect.
|
|
|
|
tic_t appeartime; ///< Tics to be appeared for
|
|
|
|
tic_t disappeartime;///< Tics to be disappeared for
|
|
|
|
tic_t offset; ///< Time to wait until thinker starts
|
|
|
|
tic_t timer; ///< Timer between states
|
|
|
|
INT32 affectee; ///< Number of affected line
|
|
|
|
INT32 sourceline; ///< Number of source line
|
|
|
|
INT32 exists; ///< Exists toggle
|
|
|
|
} disappear_t;
|
|
|
|
|
|
|
|
void T_Disappear(disappear_t *d);
|
|
|
|
|
2018-03-30 19:27:37 +00:00
|
|
|
// Model for fading FOFs
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker; ///< Thinker structure for effect.
|
2018-08-17 06:28:52 +00:00
|
|
|
ffloor_t *rover; ///< Target ffloor
|
2018-09-12 20:57:35 +00:00
|
|
|
extracolormap_t *dest_exc; ///< Colormap to fade to
|
2018-09-10 03:52:36 +00:00
|
|
|
UINT32 sectornum; ///< Number of ffloor target sector
|
|
|
|
UINT32 ffloornum; ///< Number of ffloor of target sector
|
2018-08-17 20:27:32 +00:00
|
|
|
INT32 alpha; ///< Internal alpha counter
|
2018-09-11 14:28:24 +00:00
|
|
|
INT16 sourcevalue; ///< Transparency value to fade from
|
2018-04-07 11:09:04 +00:00
|
|
|
INT16 destvalue; ///< Transparency value to fade to
|
2018-09-09 21:19:49 +00:00
|
|
|
INT16 destlightlevel; ///< Light level to fade to
|
2018-04-07 11:09:04 +00:00
|
|
|
INT16 speed; ///< Speed to fade by
|
2018-09-10 00:45:12 +00:00
|
|
|
boolean ticbased; ///< Tic-based logic toggle
|
|
|
|
INT32 timer; ///< Timer for tic-based logic
|
2018-08-17 19:13:05 +00:00
|
|
|
boolean doexists; ///< Handle FF_EXISTS
|
|
|
|
boolean dotranslucent; ///< Handle FF_TRANSLUCENT
|
2018-09-09 00:41:45 +00:00
|
|
|
boolean dolighting; ///< Handle shadows and light blocks
|
2018-09-12 20:57:35 +00:00
|
|
|
boolean docolormap; ///< Handle colormaps
|
2018-09-09 21:19:49 +00:00
|
|
|
boolean docollision; ///< Handle interactive flags
|
2018-08-17 19:13:05 +00:00
|
|
|
boolean doghostfade; ///< No interactive flags during fading
|
|
|
|
boolean exactalpha; ///< Use exact alpha values (opengl)
|
2018-03-30 19:27:37 +00:00
|
|
|
} fade_t;
|
|
|
|
|
|
|
|
void T_Fade(fade_t *d);
|
|
|
|
|
2018-09-12 13:06:38 +00:00
|
|
|
// Model for fading colormaps
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker; ///< Thinker structure for effect.
|
|
|
|
sector_t *sector; ///< Sector where action is taking place.
|
|
|
|
extracolormap_t *source_exc;
|
|
|
|
extracolormap_t *dest_exc;
|
2018-09-13 14:38:15 +00:00
|
|
|
boolean ticbased; ///< Tic-based timing
|
|
|
|
INT32 duration; ///< Total duration for tic-based logic (OR: speed increment)
|
|
|
|
INT32 timer; ///< Timer for tic-based logic (OR: internal speed counter)
|
2018-09-12 13:06:38 +00:00
|
|
|
} fadecolormap_t;
|
|
|
|
|
|
|
|
void T_FadeColormap(fadecolormap_t *d);
|
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
// Prototype functions for pushers
|
|
|
|
void T_Pusher(pusher_t *p);
|
|
|
|
mobj_t *P_GetPushThing(UINT32 s);
|
|
|
|
|
2016-12-13 22:42:47 +00:00
|
|
|
// Plane displacement
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
thinker_t thinker; ///< Thinker structure for plane displacement effect.
|
|
|
|
INT32 affectee; ///< Number of affected sector.
|
|
|
|
INT32 control; ///< Control sector used to control plane positions.
|
|
|
|
fixed_t last_height; ///< Last known height of control sector.
|
|
|
|
fixed_t speed; ///< Plane movement speed.
|
2017-04-11 21:33:04 +00:00
|
|
|
UINT8 reverse; ///< Move in reverse direction to control sector?
|
2016-12-13 22:42:47 +00:00
|
|
|
/** Types of plane displacement effects.
|
|
|
|
*/
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
pd_floor, ///< Displace floor.
|
|
|
|
pd_ceiling, ///< Displace ceiling.
|
|
|
|
pd_both, ///< Displace both floor AND ceiling.
|
|
|
|
} type;
|
|
|
|
} planedisplace_t;
|
|
|
|
|
|
|
|
void T_PlaneDisplace(planedisplace_t *pd);
|
|
|
|
|
2014-03-15 16:59:03 +00:00
|
|
|
void P_CalcHeight(player_t *player);
|
|
|
|
|
|
|
|
sector_t *P_ThingOnSpecial3DFloor(mobj_t *mo);
|
|
|
|
|
|
|
|
#endif
|