⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p_local.h

📁 使用Doom引擎开发的著名游戏《毁灭巫师》的源代码。
💻 H
字号:
//**************************************************************************//**//** p_local.h : Heretic 2 : Raven Software, Corp.//**//** $RCSfile: p_local.h,v $//** $Revision: 1.64 $//** $Date: 95/10/13 03:00:16 $//** $Author: cjr $//**//**************************************************************************#ifndef __P_LOCAL__#define __P_LOCAL__#ifndef __R_LOCAL__#include "r_local.h"#endif#define STARTREDPALS    1#define STARTBONUSPALS  9#define STARTPOISONPALS 13#define STARTICEPAL		21#define STARTHOLYPAL	22#define STARTSCOURGEPAL 25#define NUMREDPALS      8#define NUMBONUSPALS    4#define NUMPOISONPALS	8#define TOCENTER -8#define FLOATSPEED (FRACUNIT*4)#define MAXHEALTH 100#define MAXMORPHHEALTH 30#define VIEWHEIGHT (48*FRACUNIT)// mapblocks are used to check movement against lines and things#define MAPBLOCKUNITS   128#define MAPBLOCKSIZE    (MAPBLOCKUNITS*FRACUNIT)#define MAPBLOCKSHIFT   (FRACBITS+7)#define MAPBMASK                (MAPBLOCKSIZE-1)#define MAPBTOFRAC              (MAPBLOCKSHIFT-FRACBITS)// player radius for movement checking#define PLAYERRADIUS 16*FRACUNIT// MAXRADIUS is for precalculated sector block boxes// the spider demon is larger, but we don't have any moving sectors// nearby#define MAXRADIUS 32*FRACUNIT#define GRAVITY FRACUNIT#define MAXMOVE (30*FRACUNIT)#define USERANGE (64*FRACUNIT)#define MELEERANGE (64*FRACUNIT)#define MISSILERANGE (32*64*FRACUNIT)typedef enum{	DI_EAST,	DI_NORTHEAST,	DI_NORTH,	DI_NORTHWEST,	DI_WEST,	DI_SOUTHWEST,	DI_SOUTH,	DI_SOUTHEAST,	DI_NODIR,	NUMDIRS} dirtype_t;#define BASETHRESHOLD 100 // follow a player exlusively for 3 seconds// ***** P_TICK *****extern thinker_t thinkercap; // both the head and tail of the thinker listextern int TimerGame; // tic countdown for deathmatchvoid P_InitThinkers(void);void P_AddThinker(thinker_t *thinker);void P_RemoveThinker(thinker_t *thinker);// ***** P_PSPR *****#define USE_MANA1	1#define USE_MANA2	1void P_SetPsprite(player_t *player, int position, statenum_t stnum);void P_SetPspriteNF(player_t *player, int position, statenum_t stnum);void P_SetupPsprites(player_t *curplayer);void P_MovePsprites(player_t *curplayer);void P_DropWeapon(player_t *player);void P_ActivateMorphWeapon(player_t *player);void P_PostMorphWeapon(player_t *player, weapontype_t weapon);// ***** P_USER *****extern int PStateNormal[NUMCLASSES]; extern int PStateRun[NUMCLASSES];extern int PStateAttack[NUMCLASSES]; extern int PStateAttackEnd[NUMCLASSES];void P_PlayerThink(player_t *player);void P_Thrust(player_t *player, angle_t angle, fixed_t move);void P_PlayerRemoveArtifact(player_t *player, int slot);void P_PlayerUseArtifact(player_t *player, artitype_t arti);boolean P_UseArtifact(player_t *player, artitype_t arti);int P_GetPlayerNum(player_t *player);void P_TeleportOther(mobj_t *victim);void ResetBlasted(mobj_t *mo);// ***** P_MOBJ *****// Any floor type >= FLOOR_LIQUID will floorclip spritesenum{	FLOOR_SOLID,	FLOOR_ICE,	FLOOR_LIQUID,	FLOOR_WATER,	FLOOR_LAVA,	FLOOR_SLUDGE};#define ONFLOORZ MININT#define ONCEILINGZ MAXINT#define FLOATRANDZ (MAXINT-1)#define FROMCEILINGZ128 (MAXINT-2)extern mobjtype_t PuffType;extern mobj_t *MissileMobj;mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type);void P_RemoveMobj(mobj_t *th);boolean P_SetMobjState(mobj_t *mobj, statenum_t state);boolean P_SetMobjStateNF(mobj_t *mobj, statenum_t state);void P_ThrustMobj(mobj_t *mo, angle_t angle, fixed_t move);int P_FaceMobj(mobj_t *source, mobj_t *target, angle_t *delta);boolean P_SeekerMissile(mobj_t *actor, angle_t thresh, angle_t turnMax);void P_MobjThinker(mobj_t *mobj);void P_BlasterMobjThinker(mobj_t *mobj);void P_SpawnPuff(fixed_t x, fixed_t y, fixed_t z);void P_SpawnBlood(fixed_t x, fixed_t y, fixed_t z, int damage);void P_BloodSplatter(fixed_t x, fixed_t y, fixed_t z, mobj_t *originator);void P_BloodSplatter2(fixed_t x, fixed_t y, fixed_t z, mobj_t *originator);void P_RipperBlood(mobj_t *mo);int P_GetThingFloorType(mobj_t *thing);int P_HitFloor(mobj_t *thing);boolean P_CheckMissileSpawn(mobj_t *missile);mobj_t *P_SpawnMissile(mobj_t *source, mobj_t *dest, mobjtype_t type);mobj_t *P_SpawnMissileXYZ(fixed_t x, fixed_t y, fixed_t z,	mobj_t *source, mobj_t *dest, mobjtype_t type);mobj_t *P_SpawnMissileAngle(mobj_t *source, mobjtype_t type,	angle_t angle, fixed_t momz);mobj_t *P_SpawnMissileAngleSpeed(mobj_t *source, mobjtype_t type,	angle_t angle, fixed_t momz, fixed_t speed);mobj_t *P_SpawnPlayerMissile(mobj_t *source, mobjtype_t type);mobj_t *P_SPMAngle(mobj_t *source, mobjtype_t type, angle_t angle);mobj_t *P_SPMAngleXYZ(mobj_t *source, fixed_t x, fixed_t y, 	fixed_t z, mobjtype_t type, angle_t angle);void P_CreateTIDList(void);void P_RemoveMobjFromTIDList(mobj_t *mobj);void P_InsertMobjIntoTIDList(mobj_t *mobj, int tid);mobj_t *P_FindMobjFromTID(int tid, int *searchPosition);mobj_t *P_SpawnKoraxMissile(fixed_t x, fixed_t y, fixed_t z,	mobj_t *source, mobj_t *dest, mobjtype_t type);// ***** P_ENEMY *****void P_NoiseAlert (mobj_t *target, mobj_t *emmiter);int P_Massacre(void);boolean A_RaiseMobj(mobj_t *actor);boolean A_SinkMobj(mobj_t *actor);void A_NoBlocking(mobj_t *actor);boolean P_LookForMonsters(mobj_t *actor);void P_InitCreatureCorpseQueue(boolean corpseScan);void A_DeQueueCorpse(mobj_t *actor);// ***** P_MAPUTL *****typedef struct{	fixed_t x, y, dx, dy;} divline_t;typedef struct{	fixed_t         frac;           // along trace line	boolean         isaline;	union {		mobj_t  *thing;		line_t  *line;	}                       d;} intercept_t;#define MAXINTERCEPTS   128extern  intercept_t             intercepts[MAXINTERCEPTS], *intercept_p;typedef boolean (*traverser_t) (intercept_t *in);fixed_t P_AproxDistance (fixed_t dx, fixed_t dy);int     P_PointOnLineSide (fixed_t x, fixed_t y, line_t *line);int     P_PointOnDivlineSide (fixed_t x, fixed_t y, divline_t *line);void    P_MakeDivline (line_t *li, divline_t *dl);fixed_t P_InterceptVector (divline_t *v2, divline_t *v1);int     P_BoxOnLineSide (fixed_t *tmbox, line_t *ld);extern  fixed_t opentop, openbottom, openrange;extern  fixed_t lowfloor;void    P_LineOpening (line_t *linedef);boolean P_BlockLinesIterator (int x, int y, boolean(*func)(line_t*) );boolean P_BlockThingsIterator (int x, int y, boolean(*func)(mobj_t*) );#define PT_ADDLINES             1#define PT_ADDTHINGS    2#define PT_EARLYOUT             4extern  divline_t       trace;boolean P_PathTraverse (fixed_t x1, fixed_t y1, fixed_t x2, fixed_t y2,	int flags, boolean (*trav) (intercept_t *));void    P_UnsetThingPosition (mobj_t *thing);void    P_SetThingPosition (mobj_t *thing);mobj_t *P_RoughMonsterSearch(mobj_t *mo, int distance);// ***** P_MAP *****extern boolean floatok;                         // if true, move would be ok ifextern fixed_t tmfloorz, tmceilingz;    // within tmfloorz - tmceilingzextern int tmfloorpic;extern mobj_t *BlockingMobj;extern line_t *ceilingline;boolean P_TestMobjLocation(mobj_t *mobj);boolean P_CheckPosition(mobj_t *thing, fixed_t x, fixed_t y);mobj_t *P_CheckOnmobj(mobj_t *thing);void P_FakeZMovement(mobj_t *mo);boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y);boolean P_TeleportMove(mobj_t *thing, fixed_t x, fixed_t y);void P_SlideMove(mobj_t *mo);void P_BounceWall(mobj_t *mo);boolean P_CheckSight(mobj_t *t1, mobj_t *t2);void P_UseLines(player_t *player);boolean P_UsePuzzleItem(player_t *player, int itemType);void PIT_ThrustSpike(mobj_t *actor);boolean P_ChangeSector (sector_t *sector, int crunch);extern mobj_t *PuffSpawned; // true if a puff was spawnedextern  mobj_t          *linetarget;              // who got hit (or NULL)fixed_t P_AimLineAttack (mobj_t *t1, angle_t angle, fixed_t distance);void P_LineAttack (mobj_t *t1, angle_t angle, fixed_t distance, fixed_t slope, int damage);void P_RadiusAttack (mobj_t *spot, mobj_t *source, int damage, int distance,	boolean damageSource);// ***** P_SETUP *****extern byte *rejectmatrix;                              // for fast sight rejectionextern short *blockmaplump;                             // offsets in blockmap are from hereextern short *blockmap;extern int bmapwidth, bmapheight;               // in mapblocksextern fixed_t bmaporgx, bmaporgy;              // origin of block mapextern mobj_t **blocklinks;                             // for thing chains// ***** P_INTER *****extern int clipmana[NUMMANA];void P_SetMessage(player_t *player, char *message, boolean ultmsg);void P_SetYellowMessage(player_t *player, char *message, boolean ultmsg);void P_ClearMessage(player_t *player);void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher);void P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source,	int damage);void P_FallingDamage(player_t *player);void P_PoisonPlayer(player_t *player, mobj_t *poisoner, int poison);void P_PoisonDamage(player_t *player, mobj_t *source, int damage,	boolean playPainSound);boolean P_GiveMana(player_t *player, manatype_t mana, int count);boolean P_GiveArtifact(player_t *player, artitype_t arti, mobj_t *mo);boolean P_GiveArmor(player_t *player, armortype_t armortype, int amount);boolean P_GiveBody(player_t *player, int num);boolean P_GivePower(player_t *player, powertype_t power);boolean P_MorphPlayer(player_t *player);// ***** AM_MAP *****boolean AM_Responder(event_t *ev);void AM_Ticker(void);void AM_Drawer(void);// ***** A_ACTION *****boolean A_LocalQuake(byte *args, mobj_t *victim);void P_SpawnDirt(mobj_t *actor, fixed_t radius);void A_BridgeRemove(mobj_t *actor);// ***** SB_BAR *****extern int SB_state;extern int ArtifactFlash;void SB_PaletteFlash(boolean forceChange);// ===== PO_MAN =====typedef enum{	PODOOR_NONE,	PODOOR_SLIDE,	PODOOR_SWING,} podoortype_t;typedef struct{	thinker_t thinker;	int polyobj;	int speed;	unsigned int dist;	int angle;	fixed_t xSpeed; // for sliding walls	fixed_t ySpeed;} polyevent_t;typedef struct{	thinker_t thinker;	int polyobj;	int speed;	int dist;	int totalDist;	int direction;	fixed_t xSpeed, ySpeed;	int tics;	int waitTics;	podoortype_t type;	boolean close;} polydoor_t;enum{	PO_ANCHOR_TYPE = 3000,	PO_SPAWN_TYPE,	PO_SPAWNCRUSH_TYPE};#define PO_LINE_START 1 // polyobj line start special#define PO_LINE_EXPLICIT 5extern polyobj_t *polyobjs; // list of all poly-objects on the levelextern int po_NumPolyobjs;void T_PolyDoor(polydoor_t *pd);void T_RotatePoly(polyevent_t *pe);boolean EV_RotatePoly(line_t *line, byte *args, int direction, boolean 	overRide);void T_MovePoly(polyevent_t *pe);boolean EV_MovePoly(line_t *line, byte *args, boolean timesEight, boolean	overRide);boolean EV_OpenPolyDoor(line_t *line, byte *args, podoortype_t type);boolean PO_MovePolyobj(int num, int x, int y);boolean PO_RotatePolyobj(int num, angle_t angle);void PO_Init(int lump);boolean PO_Busy(int polyobj);#include "p_spec.h"#endif // __P_LOCAL__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -