📄 p_inter.c
字号:
TryPickupArtifact(player, arti_puzzcweapon, special); return; case SPR_AMWP: TryPickupArtifact(player, arti_puzzmweapon, special); return; case SPR_AGER: TryPickupArtifact(player, arti_puzzgear1, special); return; case SPR_AGR2: TryPickupArtifact(player, arti_puzzgear2, special); return; case SPR_AGR3: TryPickupArtifact(player, arti_puzzgear3, special); return; case SPR_AGR4: TryPickupArtifact(player, arti_puzzgear4, special); return; // Mana case SPR_MAN1: if(!P_GiveMana(player, MANA_1, 15)) { return; } P_SetMessage(player, TXT_MANA_1, false); break; case SPR_MAN2: if(!P_GiveMana(player, MANA_2, 15)) { return; } P_SetMessage(player, TXT_MANA_2, false); break; case SPR_MAN3: // Double Mana Dodecahedron if(!P_GiveMana(player, MANA_1, 20)) { if(!P_GiveMana(player, MANA_2, 20)) { return; } } else { P_GiveMana(player, MANA_2, 20); } P_SetMessage(player, TXT_MANA_BOTH, false); break; // 2nd and 3rd Mage Weapons case SPR_WMCS: // Frost Shards TryPickupWeapon(player, PCLASS_MAGE, WP_SECOND, special, TXT_WEAPON_M2); return; case SPR_WMLG: // Arc of Death TryPickupWeapon(player, PCLASS_MAGE, WP_THIRD, special, TXT_WEAPON_M3); return; // 2nd and 3rd Fighter Weapons case SPR_WFAX: // Timon's Axe TryPickupWeapon(player, PCLASS_FIGHTER, WP_SECOND, special, TXT_WEAPON_F2); return; case SPR_WFHM: // Hammer of Retribution TryPickupWeapon(player, PCLASS_FIGHTER, WP_THIRD, special, TXT_WEAPON_F3); return; // 2nd and 3rd Cleric Weapons case SPR_WCSS: // Serpent Staff TryPickupWeapon(player, PCLASS_CLERIC, WP_SECOND, special, TXT_WEAPON_C2); return; case SPR_WCFM: // Firestorm TryPickupWeapon(player, PCLASS_CLERIC, WP_THIRD, special, TXT_WEAPON_C3); return; // Fourth Weapon Pieces case SPR_WFR1: TryPickupWeaponPiece(player, PCLASS_FIGHTER, WPIECE1, special); return; case SPR_WFR2: TryPickupWeaponPiece(player, PCLASS_FIGHTER, WPIECE2, special); return; case SPR_WFR3: TryPickupWeaponPiece(player, PCLASS_FIGHTER, WPIECE3, special); return; case SPR_WCH1: TryPickupWeaponPiece(player, PCLASS_CLERIC, WPIECE1, special); return; case SPR_WCH2: TryPickupWeaponPiece(player, PCLASS_CLERIC, WPIECE2, special); return; case SPR_WCH3: TryPickupWeaponPiece(player, PCLASS_CLERIC, WPIECE3, special); return; case SPR_WMS1: TryPickupWeaponPiece(player, PCLASS_MAGE, WPIECE1, special); return; case SPR_WMS2: TryPickupWeaponPiece(player, PCLASS_MAGE, WPIECE2, special); return; case SPR_WMS3: TryPickupWeaponPiece(player, PCLASS_MAGE, WPIECE3, special); return; default: I_Error("P_SpecialThing: Unknown gettable thing"); } if(special->special) { P_ExecuteLineSpecial(special->special, special->args, NULL, 0, toucher); special->special = 0; } if(deathmatch && respawn && !(special->flags2&MF2_DROPPED)) { P_HideSpecialThing(special); } else { P_RemoveMobj(special); } player->bonuscount += BONUSADD; if(player == &players[consoleplayer]) { S_StartSound(NULL, sound); SB_PaletteFlash(false); }}// Search thinker list for minotaurmobj_t *ActiveMinotaur(player_t *master){ mobj_t *mo; player_t *plr; thinker_t *think; unsigned int *starttime; for(think = thinkercap.next; think != &thinkercap; think = think->next) { if(think->function != P_MobjThinker) continue; mo = (mobj_t *)think; if(mo->type != MT_MINOTAUR) continue; if(mo->health <= 0) continue; if(!(mo->flags&MF_COUNTKILL)) continue; // for morphed minotaurs if(mo->flags&MF_CORPSE) continue; starttime = (unsigned int *)mo->args; if ((leveltime - *starttime) >= MAULATORTICS) continue; plr = ((mobj_t *)mo->special1)->player; if(plr == master) return(mo); } return(NULL);}//---------------------------------------------------------------------------//// PROC P_KillMobj////---------------------------------------------------------------------------void P_KillMobj(mobj_t *source, mobj_t *target){ int dummy; mobj_t *master; target->flags &= ~(MF_SHOOTABLE|MF_FLOAT|MF_SKULLFLY|MF_NOGRAVITY); target->flags |= MF_CORPSE|MF_DROPOFF; target->flags2 &= ~MF2_PASSMOBJ; target->height >>= 2; if((target->flags&MF_COUNTKILL || target->type == MT_ZBELL) && target->special) { // Initiate monster death actions if(target->type == MT_SORCBOSS) { dummy = 0; P_StartACS(target->special, 0, (byte *)&dummy, target, NULL, 0); } else { P_ExecuteLineSpecial(target->special, target->args, NULL, 0, target); } } if(source && source->player) { // Check for frag changes if(target->player) { if(target == source) { // Self-frag target->player->frags[target->player-players]--; if(cmdfrag && netgame && source->player == &players[consoleplayer]) { // Send out a frag count packet NET_SendFrags(source->player); } } else { source->player->frags[target->player-players]++; if(cmdfrag && netgame && source->player == &players[consoleplayer]) { // Send out a frag count packet NET_SendFrags(source->player); } } } } if(target->player) { // Player death if(!source) { // Self-frag target->player->frags[target->player-players]--; if(cmdfrag && netgame && target->player == &players[consoleplayer]) { // Send out a frag count packet NET_SendFrags(target->player); } } target->flags &= ~MF_SOLID; target->flags2 &= ~MF2_FLY; target->player->powers[pw_flight] = 0; target->player->playerstate = PST_DEAD; P_DropWeapon(target->player); if(target->flags2&MF2_FIREDAMAGE) { // Player flame death switch(target->player->class) { case PCLASS_FIGHTER: S_StartSound(target, SFX_PLAYER_FIGHTER_BURN_DEATH); P_SetMobjState(target, S_PLAY_F_FDTH1); return; case PCLASS_CLERIC: S_StartSound(target, SFX_PLAYER_CLERIC_BURN_DEATH); P_SetMobjState(target, S_PLAY_C_FDTH1); return; case PCLASS_MAGE: S_StartSound(target, SFX_PLAYER_MAGE_BURN_DEATH); P_SetMobjState(target, S_PLAY_M_FDTH1); return; default: break; } } if(target->flags2&MF2_ICEDAMAGE) { // Player ice death target->flags &= ~(7<<MF_TRANSSHIFT); //no translation target->flags |= MF_ICECORPSE; switch(target->player->class) { case PCLASS_FIGHTER: P_SetMobjState(target, S_FPLAY_ICE); return; case PCLASS_CLERIC: P_SetMobjState(target, S_CPLAY_ICE); return; case PCLASS_MAGE: P_SetMobjState(target, S_MPLAY_ICE); return; case PCLASS_PIG: P_SetMobjState(target, S_PIG_ICE); return; default: break; } } } if(target->flags2&MF2_FIREDAMAGE) { if(target->type == MT_FIGHTER_BOSS || target->type == MT_CLERIC_BOSS || target->type == MT_MAGE_BOSS) { switch(target->type) { case MT_FIGHTER_BOSS: S_StartSound(target, SFX_PLAYER_FIGHTER_BURN_DEATH); P_SetMobjState(target, S_PLAY_F_FDTH1); return; case MT_CLERIC_BOSS: S_StartSound(target, SFX_PLAYER_CLERIC_BURN_DEATH); P_SetMobjState(target, S_PLAY_C_FDTH1); return; case MT_MAGE_BOSS: S_StartSound(target, SFX_PLAYER_MAGE_BURN_DEATH); P_SetMobjState(target, S_PLAY_M_FDTH1); return; default: break; } } else if(target->type == MT_TREEDESTRUCTIBLE) { P_SetMobjState(target, S_ZTREEDES_X1); target->height = 24*FRACUNIT; S_StartSound(target, SFX_TREE_EXPLODE); return; } } if(target->flags2&MF2_ICEDAMAGE) { target->flags |= MF_ICECORPSE; switch(target->type) { case MT_BISHOP: P_SetMobjState(target, S_BISHOP_ICE); return; case MT_CENTAUR: case MT_CENTAURLEADER: P_SetMobjState(target, S_CENTAUR_ICE); return; case MT_DEMON: case MT_DEMON2: P_SetMobjState(target, S_DEMON_ICE); return; case MT_SERPENT: case MT_SERPENTLEADER: P_SetMobjState(target, S_SERPENT_ICE); return; case MT_WRAITH: case MT_WRAITHB: P_SetMobjState(target, S_WRAITH_ICE); return; case MT_ETTIN: P_SetMobjState(target, S_ETTIN_ICE1); return; case MT_FIREDEMON: P_SetMobjState(target, S_FIRED_ICE1); return; case MT_FIGHTER_BOSS: P_SetMobjState(target, S_FIGHTER_ICE); return; case MT_CLERIC_BOSS: P_SetMobjState(target, S_CLERIC_ICE); return; case MT_MAGE_BOSS: P_SetMobjState(target, S_MAGE_ICE); return; case MT_PIG: P_SetMobjState(target, S_PIG_ICE); return; default: target->flags &= ~MF_ICECORPSE; break; } } if(target->type == MT_MINOTAUR) { master = (mobj_t *)target->special1; if(master->health > 0) { if (!ActiveMinotaur(master->player)) { master->player->powers[pw_minotaur] = 0; } } } else if(target->type == MT_TREEDESTRUCTIBLE) { target->height = 24*FRACUNIT; } if(target->health < -(target->info->spawnhealth>>1) && target->info->xdeathstate) { // Extreme death P_SetMobjState(target, target->info->xdeathstate); } else { // Normal death if ((target->type==MT_FIREDEMON) && (target->z <= target->floorz + 2*FRACUNIT) && (target->info->xdeathstate)) { // This is to fix the imps' staying in fall state P_SetMobjState(target, target->info->xdeathstate); } else { P_SetMobjState(target, target->info->deathstate); } } target->tics -= P_Random()&3;// I_StartSound(&actor->r, actor->info->deathsound);}//---------------------------------------------------------------------------//// FUNC P_MinotaurSlam////---------------------------------------------------------------------------void P_MinotaurSlam(mobj_t *source, mobj_t *target){ angle_t angle; fixed_t thrust; angle = R_PointToAngle2(source->x, source->y, target->x, target->y); angle >>= ANGLETOFINESHIFT; thrust = 16*FRACUNIT+(P_Random()<<10); target->momx += FixedMul(thrust, finecosine[angle]); target->momy += FixedMul(thrust, finesine[angle]); P_DamageMobj(target, NULL, source, HITDICE(4)); if(target->player) { target->reactiontime = 14+(P_Random()&7); } source->args[0] = 0; // Stop charging}//---------------------------------------------------------------------------//// FUNC P_MorphPlayer//// Returns true if the player gets turned into a pig////---------------------------------------------------------------------------boolean P_MorphPlayer(player_t *player){ mobj_t *pmo; mobj_t *fog; mobj_t *beastMo; fixed_t x; fixed_t y; fixed_t z; angle_t angle; int oldFlags2; if(player->powers[pw_invulnerability]) { // Immune when invulnerable return(false); } if(player->morphTics) { // Player is already a beast return false; } pmo = player->mo; x = pmo->x; y = pmo->y; z = pmo->z; angle = pmo->angle; oldFlags2 = pmo->flags2; P_SetMobjState(pmo, S_FREETARGMOBJ); fog = P_SpawnMobj(x, y, z+TELEFOGHEIGHT, MT_TFOG); S_StartSound(fog, SFX_TELEPORT); beastMo = P_SpawnMobj(x, y, z, MT_PIGPLAYER); beastMo->special1 = player->readyweapon; beastMo->angle = angle; beastMo->player = player; player->health = beastMo->health = MAXMORPHHEALTH; player->mo = beastMo; memset(&player->armorpoints[0], 0, NUMARMOR*sizeof(int)); player->class = PCLASS_PIG; if(oldFlags2&MF2_FLY) { beastMo->flags2 |= MF2_FLY; } player->morphTics = MORPHTICS; P_ActivateMorphWeapon(player); return(true);}//---------------------------------------------------------------------------//// FUNC P_MorphMonster////---------------------------------------------------------------------------boolean P_MorphMonster(mobj_t *actor){ mobj_t *master, *monster, *fog; mobjtype_t moType; fixed_t x; fixed_t y; fixed_t z; mobj_t oldMonster; if(actor->player) return(false); if(!(actor->flags&MF_COUNTKILL)) return false; if(actor->flags2&MF2_BOSS) return false; moType = actor->type; switch(moType) { case MT_PIG: return(false); case MT_FIGHTER_BOSS: case MT_CLERIC_BOSS: case MT_MAGE_BOSS: return(false); default: break; } oldMonster = *actor; x = oldMonster.x; y = oldMonster.y; z = oldMonster.z; P_RemoveMobjFromTIDList(actor); P_SetMobjState(actor, S_FREETARGMOBJ); fog = P_SpawnMobj(x, y, z+TELEFOGHEIGHT, MT_TFOG); S_StartSound(fog, SFX_TELEPORT); monster = P_SpawnMobj(x, y, z, MT_PIG); monster->special2 = moType; monster->special1 = MORPHTICS+P_Random(); monster->flags |= (oldMonster.flags&MF_SHADOW); monster->target = oldMonster.target; monster->angle = oldMonster.angle; monster->tid = oldMonster.tid; monster->special = oldMonster.special; P_InsertMobjIntoTIDList(monster, oldMonster.tid); memcpy(monster->args, oldMonster.args, 5); // check for turning off minotaur power for active icon if (moType==MT_MINOTAUR) { master = (mobj_t *)oldMonster.special1; if(master->health > 0) { if (!ActiveMinotaur(master->player)) { master->player->powers[pw_minotaur] = 0; } } } return(true);}//---------------------------------------------------------------------------//// PROC P_AutoUseHealth////---------------------------------------------------------------------------void P_AutoUseHealth(player_t *player, int saveHealth){ int i; int count; int normalCount; int normalSlot=0; int superCount; int superSlot=0; normalCount = superCount = 0; for(i = 0; i < player->inventorySlotNum; i++) { if(player->inventory[i].type == arti_health) { normalSlot = i; normalCount = player->inventory[i].count; } else if(player->inventory[i].type == arti_superhealth)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -