📄 p_user.c
字号:
//**************************************************************************//**//** p_user.c : Heretic 2 : Raven Software, Corp.//**//** $RCSfile: p_user.c,v $//** $Revision: 1.123 $//** $Date: 96/01/05 14:21:01 $//** $Author: bgokey $//**//**************************************************************************#include "h2def.h"#include "p_local.h"#include "soundst.h"void P_PlayerNextArtifact(player_t *player);// Macros#define MAXBOB 0x100000 // 16 pixels of bob// Databoolean onground;int newtorch; // used in the torch flicker effect.int newtorchdelta;int PStateNormal[NUMCLASSES] = { S_FPLAY, S_CPLAY, S_MPLAY, S_PIGPLAY};int PStateRun[NUMCLASSES] = { S_FPLAY_RUN1, S_CPLAY_RUN1, S_MPLAY_RUN1, S_PIGPLAY_RUN1};int PStateAttack[NUMCLASSES] = { S_FPLAY_ATK1, S_CPLAY_ATK1, S_MPLAY_ATK1, S_PIGPLAY_ATK1};int PStateAttackEnd[NUMCLASSES] = { S_FPLAY_ATK2, S_CPLAY_ATK3, S_MPLAY_ATK2, S_PIGPLAY_ATK1 };int ArmorMax[NUMCLASSES] = { 20, 18, 16, 1 };/*
==================
=
= P_Thrust
=
= moves the given origin along a given angle
=
==================
*/
void P_Thrust(player_t *player, angle_t angle, fixed_t move){ angle >>= ANGLETOFINESHIFT; if(player->powers[pw_flight] && !(player->mo->z <= player->mo->floorz)) { player->mo->momx += FixedMul(move, finecosine[angle]); player->mo->momy += FixedMul(move, finesine[angle]); } else if(P_GetThingFloorType(player->mo) == FLOOR_ICE) // Friction_Low { player->mo->momx += FixedMul(move>>1, finecosine[angle]); player->mo->momy += FixedMul(move>>1, finesine[angle]); } else { player->mo->momx += FixedMul(move, finecosine[angle]); player->mo->momy += FixedMul(move, finesine[angle]); }}/*
==================
=
= P_CalcHeight
=
=
Calculate the walking / running height adjustment===================
*/
void P_CalcHeight (player_t *player)
{ int angle; fixed_t bob;//// regular movement bobbing (needs to be calculated for gun swing even// if not on ground)// OPTIMIZE: tablify angle player->bob = FixedMul (player->mo->momx, player->mo->momx)+ FixedMul (player->mo->momy,player->mo->momy); player->bob >>= 2; if (player->bob>MAXBOB) player->bob = MAXBOB; if(player->mo->flags2&MF2_FLY && !onground) { player->bob = FRACUNIT/2; } if ((player->cheats & CF_NOMOMENTUM)) { player->viewz = player->mo->z + VIEWHEIGHT; if (player->viewz > player->mo->ceilingz-4*FRACUNIT) player->viewz = player->mo->ceilingz-4*FRACUNIT; player->viewz = player->mo->z + player->viewheight; return; } angle = (FINEANGLES/20*leveltime)&FINEMASK; bob = FixedMul ( player->bob/2, finesine[angle]);//// move viewheight// if (player->playerstate == PST_LIVE) { player->viewheight += player->deltaviewheight; if (player->viewheight > VIEWHEIGHT) { player->viewheight = VIEWHEIGHT; player->deltaviewheight = 0; } if (player->viewheight < VIEWHEIGHT/2) { player->viewheight = VIEWHEIGHT/2; if (player->deltaviewheight <= 0) player->deltaviewheight = 1; } if (player->deltaviewheight) { player->deltaviewheight += FRACUNIT/4; if (!player->deltaviewheight) player->deltaviewheight = 1; } } if(player->morphTics) { player->viewz = player->mo->z+player->viewheight-(20*FRACUNIT); } else { player->viewz = player->mo->z+player->viewheight+bob; } if(player->mo->floorclip && player->playerstate != PST_DEAD && player->mo->z <= player->mo->floorz) { player->viewz -= player->mo->floorclip; } if(player->viewz > player->mo->ceilingz-4*FRACUNIT) { player->viewz = player->mo->ceilingz-4*FRACUNIT; } if(player->viewz < player->mo->floorz+4*FRACUNIT) { player->viewz = player->mo->floorz+4*FRACUNIT; }}/*=================== P_MovePlayer==================*/void P_MovePlayer(player_t *player){ int look; int fly; ticcmd_t *cmd; cmd = &player->cmd; player->mo->angle += (cmd->angleturn<<16); onground = (player->mo->z <= player->mo->floorz || (player->mo->flags2&MF2_ONMOBJ)); if(cmd->forwardmove) { if(onground || player->mo->flags2&MF2_FLY) { P_Thrust(player, player->mo->angle, cmd->forwardmove*2048); } else { P_Thrust(player, player->mo->angle, FRACUNIT>>8); } } if(cmd->sidemove) { if(onground || player->mo->flags2&MF2_FLY) { P_Thrust(player, player->mo->angle-ANG90, cmd->sidemove*2048); } else { P_Thrust(player, player->mo->angle, FRACUNIT>>8); } } if(cmd->forwardmove || cmd->sidemove) { if(player->mo->state == &states[PStateNormal[player->class]]) { P_SetMobjState(player->mo, PStateRun[player->class]); } } look = cmd->lookfly&15; if(look > 7) { look -= 16; } if(look) { if(look == TOCENTER) { player->centering = true; } else { player->lookdir += 5*look; if(player->lookdir > 90 || player->lookdir < -110) { player->lookdir -= 5*look; } } } if(player->centering) { if(player->lookdir > 0) { player->lookdir -= 8; } else if(player->lookdir < 0) { player->lookdir += 8; } if(abs(player->lookdir) < 8) { player->lookdir = 0; player->centering = false; } } fly = cmd->lookfly>>4; if(fly > 7) { fly -= 16; } if(fly && player->powers[pw_flight]) { if(fly != TOCENTER) { player->flyheight = fly*2; if(!(player->mo->flags2&MF2_FLY)) { player->mo->flags2 |= MF2_FLY; player->mo->flags |= MF_NOGRAVITY; if(player->mo->momz <= -39*FRACUNIT) { // stop falling scream S_StopSound(player->mo); } } } else { player->mo->flags2 &= ~MF2_FLY; player->mo->flags &= ~MF_NOGRAVITY; } } else if(fly > 0) { P_PlayerUseArtifact(player, arti_fly); } if(player->mo->flags2&MF2_FLY) { player->mo->momz = player->flyheight*FRACUNIT; if(player->flyheight) { player->flyheight /= 2; } }}//==========================================================================//// P_DeathThink////==========================================================================void P_DeathThink(player_t *player){ int dir; angle_t delta; int lookDelta; extern int inv_ptr; extern int curpos; P_MovePsprites(player); onground = (player->mo->z <= player->mo->floorz); if(player->mo->type == MT_BLOODYSKULL || player->mo->type == MT_ICECHUNK) { // Flying bloody skull or flying ice chunk player->viewheight = 6*FRACUNIT; player->deltaviewheight = 0; //player->damagecount = 20; if(onground) { if(player->lookdir < 60) { lookDelta = (60-player->lookdir)/8; if(lookDelta < 1 && (leveltime&1)) { lookDelta = 1; } else if(lookDelta > 6) { lookDelta = 6; } player->lookdir += lookDelta; } } } else if(!(player->mo->flags2&MF2_ICEDAMAGE)) { // Fall to ground (if not frozen) player->deltaviewheight = 0; if(player->viewheight > 6*FRACUNIT) { player->viewheight -= FRACUNIT; } if(player->viewheight < 6*FRACUNIT) { player->viewheight = 6*FRACUNIT; } if(player->lookdir > 0) { player->lookdir -= 6; } else if(player->lookdir < 0) { player->lookdir += 6; } if(abs(player->lookdir) < 6) { player->lookdir = 0; } } P_CalcHeight(player); if(player->attacker && player->attacker != player->mo) { // Watch killer dir = P_FaceMobj(player->mo, player->attacker, &delta); if(delta < ANGLE_1*10) { // Looking at killer, so fade damage and poison counters if(player->damagecount) { player->damagecount--; } if(player->poisoncount) { player->poisoncount--; } } delta = delta/8; if(delta > ANGLE_1*5) { delta = ANGLE_1*5; } if(dir) { // Turn clockwise player->mo->angle += delta; } else { // Turn counter clockwise player->mo->angle -= delta; } } else if(player->damagecount || player->poisoncount) { if(player->damagecount) { player->damagecount--; } else { player->poisoncount--; } } if(player->cmd.buttons&BT_USE) { if(player == &players[consoleplayer]) { I_SetPalette((byte *)W_CacheLumpName("PLAYPAL", PU_CACHE)); inv_ptr = 0; curpos = 0; newtorch = 0; newtorchdelta = 0; } player->playerstate = PST_REBORN; player->mo->special1 = player->class; if(player->mo->special1 > 2) { player->mo->special1 = 0; } // Let the mobj know the player has entered the reborn state. Some // mobjs need to know when it's ok to remove themselves. player->mo->special2 = 666; }}//----------------------------------------------------------------------------//// PROC P_MorphPlayerThink////----------------------------------------------------------------------------void P_MorphPlayerThink(player_t *player){ mobj_t *pmo; if(player->morphTics&15) { return; } pmo = player->mo; if(!(pmo->momx+pmo->momy) && P_Random() < 64) { // Snout sniff P_SetPspriteNF(player, ps_weapon, S_SNOUTATK2); S_StartSound(pmo, SFX_PIG_ACTIVE1); // snort return; } if(P_Random() < 48) { if(P_Random() < 128) { S_StartSound(pmo, SFX_PIG_ACTIVE1); } else { S_StartSound(pmo, SFX_PIG_ACTIVE2); } } }//----------------------------------------------------------------------------//// FUNC P_GetPlayerNum////----------------------------------------------------------------------------int P_GetPlayerNum(player_t *player){ int i; for(i = 0; i < MAXPLAYERS; i++) { if(player == &players[i]) { return(i); } } return(0);}//----------------------------------------------------------------------------//// FUNC P_UndoPlayerMorph////----------------------------------------------------------------------------boolean P_UndoPlayerMorph(player_t *player){ mobj_t *fog; mobj_t *mo; mobj_t *pmo; fixed_t x; fixed_t y; fixed_t z; angle_t angle; int playerNum; weapontype_t weapon; int oldFlags; int oldFlags2; int oldBeast; pmo = player->mo; x = pmo->x; y = pmo->y; z = pmo->z; angle = pmo->angle; weapon = pmo->special1; oldFlags = pmo->flags; oldFlags2 = pmo->flags2; oldBeast = pmo->type; P_SetMobjState(pmo, S_FREETARGMOBJ); playerNum = P_GetPlayerNum(player); switch(PlayerClass[playerNum]) { case PCLASS_FIGHTER: mo = P_SpawnMobj(x, y, z, MT_PLAYER_FIGHTER); break; case PCLASS_CLERIC: mo = P_SpawnMobj(x, y, z, MT_PLAYER_CLERIC); break; case PCLASS_MAGE: mo = P_SpawnMobj(x, y, z, MT_PLAYER_MAGE); break; default: I_Error("P_UndoPlayerMorph: Unknown player class %d\n", player->class); } if(P_TestMobjLocation(mo) == false) { // Didn't fit P_RemoveMobj(mo); mo = P_SpawnMobj(x, y, z, oldBeast); mo->angle = angle; mo->health = player->health; mo->special1 = weapon; mo->player = player; mo->flags = oldFlags; mo->flags2 = oldFlags2; player->mo = mo; player->morphTics = 2*35; return(false); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -