📄 p_user.c
字号:
#endif cmd->forwardmove = 0xc800/512; cmd->sidemove = 0; player->mo->flags &= ~MF_JUSTATTACKED; } if (player->playerstate == PST_REBORN)#ifdef PARANOIA I_Error("player %d is in PST_REBORN\n");#else // it is not "normal" but far to be critical return;#endif if (player->playerstate == PST_DEAD) { //Fab:25-04-98: show the dm rankings while dead, only in deathmatch if (player==&players[displayplayer]) playerdeadview = true; P_DeathThink (player); //added:26-02-98:camera may still move when guy is dead if (camera.chase) P_MoveChaseCamera (&players[displayplayer]); return; } else if (player==&players[displayplayer]) playerdeadview = false; if( player->chickenTics ) P_ChickenPlayerThink(player); // check water content, set stuff in mobj P_MobjCheckWater (player->mo); // Move around. // Reactiontime is used to prevent movement // for a bit after a teleport. if (player->mo->reactiontime) player->mo->reactiontime--; else P_MovePlayer (player); //added:22-02-98: bob view only if looking by the marine's eyes#ifndef CLIENTPREDICTION2 if (!camera.chase) P_CalcHeight (player);#endif //added:26-02-98: calculate the camera movement if (camera.chase && player==&players[displayplayer]) P_MoveChaseCamera (&players[displayplayer]); // check special sectors : damage & secrets P_PlayerInSpecialSector (player); // // water splashes // if (demoversion>=125 && player->specialsector >= 887 && player->specialsector <= 888) { if ((player->mo->momx > (2*FRACUNIT) || player->mo->momx < (-2*FRACUNIT) || player->mo->momy > (2*FRACUNIT) || player->mo->momy < (-2*FRACUNIT) || player->mo->momz > (2*FRACUNIT)) && // jump out of water !(gametic % (32 * NEWTICRATERATIO)) ) { // // make sur we disturb the surface of water (we touch it) // if (player->specialsector==887) //FLAT TEXTURE 'FWATER' waterz = player->mo->subsector->sector->floorheight + (FRACUNIT/4); else //faB's current water hack using negative sector tags waterz = - (player->mo->subsector->sector->tag << FRACBITS); // half in the water if(player->mo->eflags & MF_TOUCHWATER) { if (player->mo->z <= player->mo->floorz) // onground { fixed_t whater_height=waterz-player->mo->subsector->sector->floorheight; if( whater_height<(player->mo->height>>2 )) S_StartSound (player->mo, sfx_splash); else S_StartSound (player->mo, sfx_floush); } else S_StartSound (player->mo, sfx_floush); } } } // Check for weapon change.//#ifndef CLIENTPREDICTION2 if (cmd->buttons & BT_CHANGE)//#endif { // The actual changing of the weapon is done // when the weapon psprite can do it // (read: not in the middle of an attack). newweapon = (cmd->buttons&BT_WEAPONMASK)>>BT_WEAPONSHIFT; if(demoversion<128) { if (newweapon == wp_fist && player->weaponowned[wp_chainsaw] && !(player->readyweapon == wp_chainsaw && player->powers[pw_strength])) { newweapon = wp_chainsaw; } if ( (gamemode == commercial) && newweapon == wp_shotgun && player->weaponowned[wp_supershotgun] && player->readyweapon != wp_supershotgun) { newweapon = wp_supershotgun; } } else { if(cmd->buttons&BT_EXTRAWEAPON) switch(newweapon) { case wp_shotgun : if( gamemode == commercial && player->weaponowned[wp_supershotgun]) newweapon = wp_supershotgun; break; case wp_fist : if( player->weaponowned[wp_chainsaw]) newweapon = wp_chainsaw; break; default: break; } } if (player->weaponowned[newweapon] && newweapon != player->readyweapon) { // Do not go to plasma or BFG in shareware, // even if cheated. if ((newweapon != wp_plasma && newweapon != wp_bfg) || (gamemode != shareware) ) { player->pendingweapon = newweapon; } } } // check for use if (cmd->buttons & BT_USE) { if (!player->usedown) { P_UseLines (player); player->usedown = true; } } else player->usedown = false; // Chicken counter if(player->chickenTics) { // Chicken attack counter if(player->chickenPeck) player->chickenPeck -= 3; // Attempt to undo the chicken if(!--player->chickenTics) P_UndoPlayerChicken(player); } // cycle psprites P_MovePsprites (player); // Counters, time dependend power ups. // Strength counts up to diminish fade. if (player->powers[pw_strength]) player->powers[pw_strength]++; if (player->powers[pw_invulnerability]) player->powers[pw_invulnerability]--; // the MF_SHADOW activates the tr_transhi translucency while it is set // (it doesnt use a preset value through FF_TRANSMASK) if (player->powers[pw_invisibility]) if (! --player->powers[pw_invisibility] ) player->mo->flags &= ~MF_SHADOW; if (player->powers[pw_infrared]) player->powers[pw_infrared]--; if (player->powers[pw_ironfeet]) player->powers[pw_ironfeet]--; if (player->powers[pw_flight]) { if(!--player->powers[pw_flight]) {/* HERETODO if(player->mo->z != player->mo->floorz) player->centering = true;*/ player->mo->flags2 &= ~MF2_FLY; player->mo->flags &= ~MF_NOGRAVITY; // BorderTopRefresh = true; //make sure the sprite's cleared out } } if(player->powers[pw_weaponlevel2]) { if(!--player->powers[pw_weaponlevel2]) { player->weaponinfo = wpnlev1info; // end of weaponlevel2 power if((player->readyweapon == wp_phoenixrod) && (player->psprites[ps_weapon].state != &states[S_PHOENIXREADY]) && (player->psprites[ps_weapon].state != &states[S_PHOENIXUP])) { P_SetPsprite(player, ps_weapon, S_PHOENIXREADY); player->ammo[am_phoenixrod] -= USE_PHRD_AMMO_2; player->refire = 0; } else if((player->readyweapon == wp_gauntlets) || (player->readyweapon == wp_staff)) { player->pendingweapon = player->readyweapon; } //BorderTopRefresh = true; } } if (player->damagecount) player->damagecount--; if (player->bonuscount) player->bonuscount--; // Handling colormaps. if (player->powers[pw_invulnerability]) { if (player->powers[pw_invulnerability] > BLINKTHRESHOLD || (player->powers[pw_invulnerability]&8) ) player->fixedcolormap = INVERSECOLORMAP; else player->fixedcolormap = 0; } else if (player->powers[pw_infrared]) { if (player->powers[pw_infrared] > BLINKTHRESHOLD || (player->powers[pw_infrared]&8) ) { // almost full bright player->fixedcolormap = 1; } else player->fixedcolormap = 0; } else player->fixedcolormap = 0;}//----------------------------------------------------------------------------//// PROC P_PlayerNextArtifact////----------------------------------------------------------------------------void P_PlayerNextArtifact(player_t *player){ player->inv_ptr--; if(player->inv_ptr < 6) { player->st_curpos--; if(player->st_curpos < 0) player->st_curpos = 0; } if(player->inv_ptr < 0) { player->inv_ptr = player->inventorySlotNum-1; if(player->inv_ptr < 6) player->st_curpos = player->inv_ptr; else player->st_curpos = 6; }}//----------------------------------------------------------------------------//// PROC P_PlayerRemoveArtifact////----------------------------------------------------------------------------static void P_PlayerRemoveArtifact(player_t *player, int slot){ int i; if(!(--player->inventory[slot].count)) { // Used last of a type - compact the artifact list player->inventory[slot].type = arti_none; for(i = slot+1; i < player->inventorySlotNum; i++) player->inventory[i-1] = player->inventory[i]; player->inventorySlotNum--; // Set position markers and get next readyArtifact player->inv_ptr--; if(player->inv_ptr < 6) { player->st_curpos--; if( player->st_curpos < 0 ) player->st_curpos = 0; } if( player->inv_ptr >= player->inventorySlotNum) player->inv_ptr = player->inventorySlotNum-1; if( player->inv_ptr < 0) player->inv_ptr = 0; }}//----------------------------------------------------------------------------//// PROC P_PlayerUseArtifact////----------------------------------------------------------------------------extern int ArtifactFlash;void P_PlayerUseArtifact(player_t *player, artitype_t arti){ int i; for(i = 0; i < player->inventorySlotNum; i++) { if(player->inventory[i].type == arti) { // Found match - try to use if(P_UseArtifact(player, arti)) { // Artifact was used - remove it from inventory P_PlayerRemoveArtifact(player, i); if(player == &players[consoleplayer] || player == &players[secondarydisplayplayer] ) { S_StartSound(NULL, sfx_artiuse); ArtifactFlash = 4; } } else { // Unable to use artifact, advance pointer P_PlayerNextArtifact(player); } break; } }}//----------------------------------------------------------------------------//// PROC P_ArtiTele////----------------------------------------------------------------------------void P_ArtiTele(player_t *player){ int i; fixed_t destX; fixed_t destY; angle_t destAngle; if(cv_deathmatch.value) { i = P_Random()%numdmstarts; destX = deathmatchstarts[i]->x<<FRACBITS; destY = deathmatchstarts[i]->y<<FRACBITS; destAngle = ANG45*(deathmatchstarts[i]->angle/45); } else { destX = playerstarts[0]->x<<FRACBITS; destY = playerstarts[0]->y<<FRACBITS; destAngle = ANG45*(playerstarts[0]->angle/45); } P_Teleport(player->mo, destX, destY, destAngle); S_StartSound(NULL, sfx_wpnup); // Full volume laugh}//----------------------------------------------------------------------------//// FUNC P_UseArtifact//// Returns true if artifact was used.////----------------------------------------------------------------------------boolean P_UseArtifact(player_t *player, artitype_t arti){ mobj_t *mo; angle_t angle; switch(arti) { case arti_invulnerability: if(!P_GivePower(player, pw_invulnerability)) { return(false); } break; case arti_invisibility: if(!P_GivePower(player, pw_invisibility)) { return(false); } break; case arti_health: if(!P_GiveBody(player, 25)) { return(false); } break; case arti_superhealth: if(!P_GiveBody(player, 100)) { return(false); } break; case arti_tomeofpower: if(player->chickenTics) { // Attempt to undo chicken if(P_UndoPlayerChicken(player) == false) { // Failed P_DamageMobj(player->mo, NULL, NULL, 10000); } else { // Succeeded player->chickenTics = 0;#ifdef XPEREMNTAL_HW3S S_StartScreamSound(player->mo, sfx_wpnup);#else S_StartSound(player->mo, sfx_wpnup);#endif } } else { if(!P_GivePower(player, pw_weaponlevel2)) { return(false); } if(player->readyweapon == wp_staff) { P_SetPsprite(player, ps_weapon, S_STAFFREADY2_1); } else if(player->readyweapon == wp_gauntlets) { P_SetPsprite(player, ps_weapon, S_GAUNTLETREADY2_1); } } break; case arti_torch: if(!P_GivePower(player, pw_infrared)) { return(false); } break; case arti_firebomb: angle = player->mo->angle>>ANGLETOFINESHIFT; mo = P_SpawnMobj(player->mo->x+24*finecosine[angle], player->mo->y+24*finesine[angle], player->mo->z - 15*FRACUNIT* ((player->mo->flags2&MF2_FEETARECLIPPED) != 0), MT_FIREBOMB); mo->target = player->mo; break; case arti_egg: mo = player->mo; P_SpawnPlayerMissile(mo, MT_EGGFX); P_SPMAngle(mo, MT_EGGFX, mo->angle-(ANG45/6)); P_SPMAngle(mo, MT_EGGFX, mo->angle+(ANG45/6)); P_SPMAngle(mo, MT_EGGFX, mo->angle-(ANG45/3)); P_SPMAngle(mo, MT_EGGFX, mo->angle+(ANG45/3)); break; case arti_fly: if(!P_GivePower(player, pw_flight)) { return(false); } break; case arti_teleport: P_ArtiTele(player); break; default: return(false); } return(true);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -