2016-03-01 15:47:10 +00:00
//-----------------------------------------------------------------------------
//
2017-04-17 11:33:19 +00:00
// Copyright 1993-1996 id Software
// Copyright 1994-1996 Raven Software
// Copyright 1998-1998 Chi Hoang, Lee Killough, Jim Flynn, Rand Phares, Ty Halderman
// Copyright 1999-2016 Randy Heit
// Copyright 2002-2016 Christoph Oelckers
2016-03-01 15:47:10 +00:00
//
2017-04-17 11:33:19 +00:00
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
2016-03-01 15:47:10 +00:00
//
2017-04-17 11:33:19 +00:00
// This program is distributed in the hope that it will be useful,
2016-03-01 15:47:10 +00:00
// but WITHOUT ANY WARRANTY; without even the implied warranty of
2017-04-17 11:33:19 +00:00
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see http://www.gnu.org/licenses/
//
//-----------------------------------------------------------------------------
2016-03-01 15:47:10 +00:00
//
// DESCRIPTION: none
// Implements special effects:
// Texture animation, height or lighting changes
// according to adjacent sectors, respective
// utility functions, etc.
//
//-----------------------------------------------------------------------------
# ifndef __P_SPEC__
# define __P_SPEC__
# include "dsectoreffect.h"
# include "doomdata.h"
# include "r_state.h"
class FScanner ;
struct level_info_t ;
2017-03-10 01:22:42 +00:00
struct FDoorAnimation ;
2016-03-01 15:47:10 +00:00
2016-03-28 15:27:55 +00:00
enum class EScroll : int
2016-03-01 15:47:10 +00:00
{
sc_side ,
sc_floor ,
sc_ceiling ,
sc_carry ,
sc_carry_ceiling , // killough 4/11/98: carry objects hanging on ceilings
2016-03-28 15:27:55 +00:00
} ;
2016-03-01 15:47:10 +00:00
2016-03-28 15:27:55 +00:00
enum EScrollPos : int
2016-03-01 15:47:10 +00:00
{
2016-03-28 15:27:55 +00:00
scw_top = 1 ,
scw_mid = 2 ,
scw_bottom = 4 ,
scw_all = 7 ,
} ;
2016-03-01 15:47:10 +00:00
2016-03-28 15:27:55 +00:00
//jff 2/23/98 identify the special classes that can share sectors
2016-03-01 15:47:10 +00:00
2016-03-28 15:27:55 +00:00
typedef enum
{
floor_special ,
ceiling_special ,
lighting_special ,
} special_e ;
2016-03-01 15:47:10 +00:00
// Factor to scale scrolling effect into mobj-carrying properties = 3/32.
// (This is so scrolling floors and objects on them can move at same speed.)
2016-03-19 23:54:18 +00:00
const double CARRYFACTOR = 3 / 32. ;
2016-03-01 15:47:10 +00:00
// Flags for P_SectorDamage
# define DAMAGE_PLAYERS 1
# define DAMAGE_NONPLAYERS 2
# define DAMAGE_IN_AIR 4
# define DAMAGE_SUBCLASSES_PROTECT 8
2017-02-25 18:10:49 +00:00
# define DAMAGE_NO_ARMOR 16
2016-03-01 15:47:10 +00:00
2018-12-27 11:32:35 +00:00
class MapLoader ;
2016-03-01 15:47:10 +00:00
// every tic
2019-01-23 23:02:51 +00:00
void P_UpdateSpecials ( FLevelLocals * ) ;
2016-03-01 15:47:10 +00:00
// when needed
2016-03-27 18:58:01 +00:00
bool P_ActivateLine ( line_t * ld , AActor * mo , int side , int activationType , DVector3 * optpos = NULL ) ;
bool P_TestActivateLine ( line_t * ld , AActor * mo , int side , int activationType , DVector3 * optpos = NULL ) ;
2016-03-01 15:47:10 +00:00
bool P_PredictLine ( line_t * ld , AActor * mo , int side , int activationType ) ;
void P_PlayerInSpecialSector ( player_t * player , sector_t * sector = NULL ) ;
void P_PlayerOnSpecialFlat ( player_t * player , int floorType ) ;
2019-01-23 23:02:51 +00:00
void P_SectorDamage ( FLevelLocals * Level , int tag , int amount , FName type , PClassActor * protectClass , int flags ) ;
void P_SetSectorFriction ( FLevelLocals * level , int tag , int amount , bool alterFlag ) ;
2016-03-24 21:50:03 +00:00
double FrictionToMoveFactor ( double friction ) ;
2019-01-23 23:02:51 +00:00
void P_GiveSecret ( FLevelLocals * Level , AActor * actor , bool printmessage , bool playsound , int sectornum ) ;
2016-03-01 15:47:10 +00:00
//
// getNextSector()
// Return sector_t * of sector next to current.
// NULL if not two-sided line
//
inline sector_t * getNextSector ( line_t * line , const sector_t * sec )
{
if ( ! ( line - > flags & ML_TWOSIDED ) )
return NULL ;
return line - > frontsector = = sec ?
( line - > backsector ! = sec ? line - > backsector : NULL ) :
line - > frontsector ;
}
# include "p_tags.h"
//
// P_SWITCH
//
# define BUTTONTIME TICRATE // 1 second, in ticks.
2017-03-08 14:20:00 +00:00
bool P_ChangeSwitchTexture ( side_t * side , int useAgain , uint8_t special , bool * quest = NULL ) ;
2016-03-27 18:58:01 +00:00
bool P_CheckSwitchRange ( AActor * user , line_t * line , int sideno , const DVector3 * optpos = NULL ) ;
2016-03-01 15:47:10 +00:00
2019-01-31 01:51:07 +00:00
# include "a_plats.h"
# include "a_pillar.h"
2019-01-31 01:38:39 +00:00
# include "a_doors.h"
2019-01-31 01:51:07 +00:00
# include "a_ceiling.h"
# include "a_floor.h"
2016-03-01 15:47:10 +00:00
//
// P_TELEPT
//
enum
{
TELF_DESTFOG = 1 ,
TELF_SOURCEFOG = 2 ,
TELF_KEEPORIENTATION = 4 ,
TELF_KEEPVELOCITY = 8 ,
TELF_KEEPHEIGHT = 16 ,
2016-04-23 19:32:40 +00:00
TELF_ROTATEBOOM = 32 ,
TELF_ROTATEBOOMINVERSE = 64 ,
2016-03-01 15:47:10 +00:00
} ;
2016-03-23 09:42:41 +00:00
//Spawns teleport fog. Pass the actor to pluck TeleFogFromType and TeleFogToType. 'from' determines if this is the fog to spawn at the old position (true) or new (false).
void P_SpawnTeleportFog ( AActor * mobj , const DVector3 & pos , bool beforeTele = true , bool setTarget = false ) ;
2016-04-05 20:27:11 +00:00
bool P_Teleport ( AActor * thing , DVector3 pos , DAngle angle , int flags ) ;
2016-03-01 15:47:10 +00:00
//
// [RH] ACS (see also p_acs.h)
//
# define ACS_BACKSIDE 1
# define ACS_ALWAYS 2
# define ACS_WANTRESULT 4
# define ACS_NET 8
2019-01-27 23:55:21 +00:00
int P_StartScript ( FLevelLocals * Level , AActor * who , line_t * where , int script , const char * map , const int * args , int argcount , int flags ) ;
void P_SuspendScript ( FLevelLocals * Level , int script , const char * map ) ;
void P_TerminateScript ( FLevelLocals * Level , int script , const char * map ) ;
2016-03-01 15:47:10 +00:00
//
// [RH] p_quake.c
//
2019-01-27 20:59:19 +00:00
bool P_StartQuakeXYZ ( FLevelLocals * Level , AActor * activator , int tid , int intensityX , int intensityY , int intensityZ , int duration , int damrad , int tremrad , FSoundID quakesfx , int flags , double waveSpeedX , double waveSpeedY , double waveSpeedZ , int falloff , int highpoint , double rollIntensity , double rollWave ) ;
bool P_StartQuake ( FLevelLocals * Level , AActor * activator , int tid , int intensity , int duration , int damrad , int tremrad , FSoundID quakesfx ) ;
2016-03-01 15:47:10 +00:00
# endif