📄 p_inter.c
字号:
//**************************************************************************//**//** p_inter.c : Heretic 2 : Raven Software, Corp.//**//** $RCSfile: p_inter.c,v $//** $Revision: 1.145 $//** $Date: 96/01/16 10:35:33 $//** $Author: bgokey $//**//**************************************************************************#include "h2def.h"#include "p_local.h"#include "soundst.h"#define BONUSADD 6int ArmorIncrement[NUMCLASSES][NUMARMOR] ={ { 25*FRACUNIT, 20*FRACUNIT, 15*FRACUNIT, 5*FRACUNIT }, { 10*FRACUNIT, 25*FRACUNIT, 5*FRACUNIT, 20*FRACUNIT }, { 5*FRACUNIT, 15*FRACUNIT, 10*FRACUNIT, 25*FRACUNIT }, { 0, 0, 0, 0 }};int AutoArmorSave[NUMCLASSES] = { 15*FRACUNIT, 10*FRACUNIT, 5*FRACUNIT, 0 };char *TextKeyMessages[] = { TXT_KEY_STEEL, TXT_KEY_CAVE, TXT_KEY_AXE, TXT_KEY_FIRE, TXT_KEY_EMERALD, TXT_KEY_DUNGEON, TXT_KEY_SILVER, TXT_KEY_RUSTED, TXT_KEY_HORN, TXT_KEY_SWAMP, TXT_KEY_CASTLE};static void SetDormantArtifact(mobj_t *arti);static void TryPickupArtifact(player_t *player, artitype_t artifactType, mobj_t *artifact);static void TryPickupWeapon(player_t *player, pclass_t weaponClass, weapontype_t weaponType, mobj_t *weapon, char *message);static void TryPickupWeaponPiece(player_t *player, pclass_t matchClass, int pieceValue, mobj_t *pieceMobj);#ifdef __NeXT__extern void strupr(char *s);#endif//--------------------------------------------------------------------------//// PROC P_SetMessage////--------------------------------------------------------------------------void P_SetMessage(player_t *player, char *message, boolean ultmsg){ extern boolean messageson; if((player->ultimateMessage || !messageson) && !ultmsg) { return; } if(strlen(message) > 79) { memcpy(player->message, message, 80); player->message[80] = 0; } else { strcpy(player->message, message); } strupr(player->message); player->messageTics = MESSAGETICS; player->yellowMessage = false; if(ultmsg) { player->ultimateMessage = true; } if(player == &players[consoleplayer]) { BorderTopRefresh = true; }}//==========================================================================//// P_SetYellowMessage////==========================================================================void P_SetYellowMessage(player_t *player, char *message, boolean ultmsg){ extern boolean messageson; if((player->ultimateMessage || !messageson) && !ultmsg) { return; } if(strlen(message) > 79) { memcpy(player->message, message, 80); player->message[80] = 0; } else { strcpy(player->message, message); } player->messageTics = 5*MESSAGETICS; // Bold messages last longer player->yellowMessage = true; if(ultmsg) { player->ultimateMessage = true; } if(player == &players[consoleplayer]) { BorderTopRefresh = true; }}//==========================================================================//// P_ClearMessage////==========================================================================void P_ClearMessage(player_t *player){ player->messageTics = 0; if(player == &players[consoleplayer]) { BorderTopRefresh = true; }}//----------------------------------------------------------------------------//// PROC P_HideSpecialThing////----------------------------------------------------------------------------void P_HideSpecialThing(mobj_t *thing){ thing->flags &= ~MF_SPECIAL; thing->flags2 |= MF2_DONTDRAW; P_SetMobjState(thing, S_HIDESPECIAL1);}//--------------------------------------------------------------------------//// FUNC P_GiveMana//// Returns true if the player accepted the mana, false if it was// refused (player has MAX_MANA).////--------------------------------------------------------------------------boolean P_GiveMana(player_t *player, manatype_t mana, int count){ int prevMana; //weapontype_t changeWeapon; if(mana == MANA_NONE || mana == MANA_BOTH) { return(false); } if(mana < 0 || mana > NUMMANA) { I_Error("P_GiveMana: bad type %i", mana); } if(player->mana[mana] == MAX_MANA) { return(false); } if(gameskill == sk_baby || gameskill == sk_nightmare) { // extra mana in baby mode and nightmare mode count += count>>1; } prevMana = player->mana[mana]; player->mana[mana] += count; if(player->mana[mana] > MAX_MANA) { player->mana[mana] = MAX_MANA; } if(player->class == PCLASS_FIGHTER && player->readyweapon == WP_SECOND && mana == MANA_1 && prevMana <= 0) { P_SetPsprite(player, ps_weapon, S_FAXEREADY_G); } return(true);}//==========================================================================//// TryPickupWeapon////==========================================================================static void TryPickupWeapon(player_t *player, pclass_t weaponClass, weapontype_t weaponType, mobj_t *weapon, char *message){ boolean remove; boolean gaveMana; boolean gaveWeapon; remove = true; if(player->class != weaponClass) { // Wrong class, but try to pick up for mana if(netgame && !deathmatch) { // Can't pick up weapons for other classes in coop netplay return; } if(weaponType == WP_SECOND) { if(!P_GiveMana(player, MANA_1, 25)) { return; } } else { if(!P_GiveMana(player, MANA_2, 25)) { return; } } } else if(netgame && !deathmatch) { // Cooperative net-game if(player->weaponowned[weaponType]) { return; } player->weaponowned[weaponType] = true; if(weaponType == WP_SECOND) { P_GiveMana(player, MANA_1, 25); } else { P_GiveMana(player, MANA_2, 25); } player->pendingweapon = weaponType; remove = false; } else { // Deathmatch or single player game if(weaponType == WP_SECOND) { gaveMana = P_GiveMana(player, MANA_1, 25); } else { gaveMana = P_GiveMana(player, MANA_2, 25); } if(player->weaponowned[weaponType]) { gaveWeapon = false; } else { gaveWeapon = true; player->weaponowned[weaponType] = true; if(weaponType > player->readyweapon) { // Only switch to more powerful weapons player->pendingweapon = weaponType; } } if(!(gaveWeapon || gaveMana)) { // Player didn't need the weapon or any mana return; } } P_SetMessage(player, message, false); if(weapon->special) { P_ExecuteLineSpecial(weapon->special, weapon->args, NULL, 0, player->mo); weapon->special = 0; } if(remove) { if(deathmatch && !(weapon->flags2&MF2_DROPPED)) { P_HideSpecialThing(weapon); } else { P_RemoveMobj(weapon); } } player->bonuscount += BONUSADD; if(player == &players[consoleplayer]) { S_StartSound(NULL, SFX_PICKUP_WEAPON); SB_PaletteFlash(false); }}//--------------------------------------------------------------------------//// FUNC P_GiveWeapon//// Returns true if the weapon or its mana was accepted.////--------------------------------------------------------------------------/*boolean P_GiveWeapon(player_t *player, pclass_t class, weapontype_t weapon){ boolean gaveMana; boolean gaveWeapon; if(player->class != class) { // player cannot use this weapon, take it anyway, and get mana if(netgame && !deathmatch) { // Can't pick up weapons for other classes in coop netplay return false; } if(weapon == WP_SECOND) { return P_GiveMana(player, MANA_1, 25); } else { return P_GiveMana(player, MANA_2, 25); } } if(netgame && !deathmatch) { // Cooperative net-game if(player->weaponowned[weapon]) { return(false); } player->bonuscount += BONUSADD; player->weaponowned[weapon] = true; if(weapon == WP_SECOND) { P_GiveMana(player, MANA_1, 25); } else { P_GiveMana(player, MANA_2, 25); } player->pendingweapon = weapon; if(player == &players[consoleplayer]) { S_StartSound(NULL, SFX_PICKUP_WEAPON); } return(false); } if(weapon == WP_SECOND) { gaveMana = P_GiveMana(player, MANA_1, 25); } else { gaveMana = P_GiveMana(player, MANA_2, 25); } if(player->weaponowned[weapon]) { gaveWeapon = false; } else { gaveWeapon = true; player->weaponowned[weapon] = true; if(weapon > player->readyweapon) { // Only switch to more powerful weapons player->pendingweapon = weapon; } } return(gaveWeapon || gaveMana);}*///===========================================================================//// P_GiveWeaponPiece////===========================================================================/*boolean P_GiveWeaponPiece(player_t *player, pclass_t class, int piece){ P_GiveMana(player, MANA_1, 20); P_GiveMana(player, MANA_2, 20); if(player->class != class) { return true; } else if(player->pieces&piece) { // player already has that weapon piece return true; } player->pieces |= piece; if(player->pieces == 7) { // player has built the fourth weapon! P_GiveWeapon(player, class, WP_FOURTH); S_StartSound(player->mo, SFX_WEAPON_BUILD); } return true;}*///==========================================================================//// TryPickupWeaponPiece////==========================================================================static void TryPickupWeaponPiece(player_t *player, pclass_t matchClass, int pieceValue, mobj_t *pieceMobj){ boolean remove; boolean checkAssembled; boolean gaveWeapon; int gaveMana; static char *fourthWeaponText[] = { TXT_WEAPON_F4, TXT_WEAPON_C4, TXT_WEAPON_M4 }; static char *weaponPieceText[] = { TXT_QUIETUS_PIECE, TXT_WRAITHVERGE_PIECE, TXT_BLOODSCOURGE_PIECE }; static int pieceValueTrans[] = { 0, // 0: never WPIECE1|WPIECE2|WPIECE3, // WPIECE1 (1) WPIECE2|WPIECE3, // WPIECE2 (2) 0, // 3: never WPIECE3 // WPIECE3 (4) }; remove = true; checkAssembled = true; gaveWeapon = false; if(player->class != matchClass) { // Wrong class, but try to pick up for mana if(netgame && !deathmatch) { // Can't pick up wrong-class weapons in coop netplay return; } checkAssembled = false; gaveMana = P_GiveMana(player, MANA_1, 20)+ P_GiveMana(player, MANA_2, 20); if(!gaveMana) { // Didn't need the mana, so don't pick it up return; } } else if(netgame && !deathmatch) { // Cooperative net-game if(player->pieces&pieceValue) { // Already has the piece return; } pieceValue = pieceValueTrans[pieceValue]; P_GiveMana(player, MANA_1, 20); P_GiveMana(player, MANA_2, 20); remove = false; } else { // Deathmatch or single player game gaveMana = P_GiveMana(player, MANA_1, 20)+ P_GiveMana(player, MANA_2, 20); if(player->pieces&pieceValue) { // Already has the piece, check if mana needed if(!gaveMana) { // Didn't need the mana, so don't pick it up return; } checkAssembled = false; } } // Pick up the weapon piece if(pieceMobj->special) { P_ExecuteLineSpecial(pieceMobj->special, pieceMobj->args, NULL, 0, player->mo); pieceMobj->special = 0; } if(remove) { if(deathmatch && !(pieceMobj->flags2&MF2_DROPPED)) { P_HideSpecialThing(pieceMobj); } else { P_RemoveMobj(pieceMobj); } } player->bonuscount += BONUSADD; if(player == &players[consoleplayer]) { SB_PaletteFlash(false); } // Check if fourth weapon assembled if(checkAssembled) { player->pieces |= pieceValue; if(player->pieces == (WPIECE1|WPIECE2|WPIECE3)) { gaveWeapon = true; player->weaponowned[WP_FOURTH] = true; player->pendingweapon = WP_FOURTH; } } if(gaveWeapon) { P_SetMessage(player, fourthWeaponText[matchClass], false); // Play the build-sound full volume for all players S_StartSound(NULL, SFX_WEAPON_BUILD); } else { P_SetMessage(player, weaponPieceText[matchClass], false); if(player == &players[consoleplayer]) { S_StartSound(NULL, SFX_PICKUP_WEAPON); } }}//---------------------------------------------------------------------------//// FUNC P_GiveBody//// Returns false if the body isn't needed at all.////---------------------------------------------------------------------------boolean P_GiveBody(player_t *player, int num){ int max; max = MAXHEALTH; if(player->morphTics) { max = MAXMORPHHEALTH; } if(player->health >= max) { return(false); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -