📄 p_inter.c
字号:
player->health += num; if(player->health > max) { player->health = max; } player->mo->health = player->health; return(true);}//---------------------------------------------------------------------------//// FUNC P_GiveArmor//// Returns false if the armor is worse than the current armor.////---------------------------------------------------------------------------boolean P_GiveArmor(player_t *player, armortype_t armortype, int amount){ int hits; int totalArmor; extern int ArmorMax[NUMCLASSES]; if(amount == -1) { hits = ArmorIncrement[player->class][armortype]; if(player->armorpoints[armortype] >= hits) { return false; } else { player->armorpoints[armortype] = hits; } } else { hits = amount*5*FRACUNIT; totalArmor = player->armorpoints[ARMOR_ARMOR] +player->armorpoints[ARMOR_SHIELD] +player->armorpoints[ARMOR_HELMET] +player->armorpoints[ARMOR_AMULET] +AutoArmorSave[player->class]; if(totalArmor < ArmorMax[player->class]*5*FRACUNIT) { player->armorpoints[armortype] += hits; } else { return false; } } return true;}//---------------------------------------------------------------------------//// PROC P_GiveKey////---------------------------------------------------------------------------int P_GiveKey(player_t *player, keytype_t key){ if(player->keys&(1<<key)) { return false; } player->bonuscount += BONUSADD; player->keys |= 1<<key; return true;}//---------------------------------------------------------------------------//// FUNC P_GivePower//// Returns true if power accepted.////---------------------------------------------------------------------------boolean P_GivePower(player_t *player, powertype_t power){ if(power == pw_invulnerability) { if(player->powers[power] > BLINKTHRESHOLD) { // Already have it return(false); } player->powers[power] = INVULNTICS; player->mo->flags2 |= MF2_INVULNERABLE; if(player->class == PCLASS_MAGE) { player->mo->flags2 |= MF2_REFLECTIVE; } return(true); } if(power == pw_flight) { if(player->powers[power] > BLINKTHRESHOLD) { // Already have it return(false); } player->powers[power] = FLIGHTTICS; player->mo->flags2 |= MF2_FLY; player->mo->flags |= MF_NOGRAVITY; if(player->mo->z <= player->mo->floorz) { player->flyheight = 10; // thrust the player in the air a bit } return(true); } if(power == pw_infrared) { if(player->powers[power] > BLINKTHRESHOLD) { // Already have it return(false); } player->powers[power] = INFRATICS; return(true); } if(power == pw_speed) { if(player->powers[power] > BLINKTHRESHOLD) { // Already have it return(false); } player->powers[power] = SPEEDTICS; return(true); } if(power == pw_minotaur) { // Doesn't matter if already have power, renew ticker player->powers[power] = MAULATORTICS; return(true); }/* if(power == pw_ironfeet) { player->powers[power] = IRONTICS; return(true); } if(power == pw_strength) { P_GiveBody(player, 100); player->powers[power] = 1; return(true); }*/ if(player->powers[power]) { return(false); // already got it } player->powers[power] = 1; return(true);}//==========================================================================//// TryPickupArtifact////==========================================================================static void TryPickupArtifact(player_t *player, artitype_t artifactType, mobj_t *artifact){ static char *artifactMessages[NUMARTIFACTS] = { NULL, TXT_ARTIINVULNERABILITY, TXT_ARTIHEALTH, TXT_ARTISUPERHEALTH, TXT_ARTIHEALINGRADIUS, TXT_ARTISUMMON, TXT_ARTITORCH, TXT_ARTIEGG, TXT_ARTIFLY, TXT_ARTIBLASTRADIUS, TXT_ARTIPOISONBAG, TXT_ARTITELEPORTOTHER, TXT_ARTISPEED, TXT_ARTIBOOSTMANA, TXT_ARTIBOOSTARMOR, TXT_ARTITELEPORT, TXT_ARTIPUZZSKULL, TXT_ARTIPUZZGEMBIG, TXT_ARTIPUZZGEMRED, TXT_ARTIPUZZGEMGREEN1, TXT_ARTIPUZZGEMGREEN2, TXT_ARTIPUZZGEMBLUE1, TXT_ARTIPUZZGEMBLUE2, TXT_ARTIPUZZBOOK1, TXT_ARTIPUZZBOOK2, TXT_ARTIPUZZSKULL2, TXT_ARTIPUZZFWEAPON, TXT_ARTIPUZZCWEAPON, TXT_ARTIPUZZMWEAPON, TXT_ARTIPUZZGEAR, // All gear pickups use the same text TXT_ARTIPUZZGEAR, TXT_ARTIPUZZGEAR, TXT_ARTIPUZZGEAR }; if(P_GiveArtifact(player, artifactType, artifact)) { if(artifact->special) { P_ExecuteLineSpecial(artifact->special, artifact->args, NULL, 0, NULL); artifact->special = 0; } player->bonuscount += BONUSADD; if(artifactType < arti_firstpuzzitem) { SetDormantArtifact(artifact); S_StartSound(artifact, SFX_PICKUP_ARTIFACT); P_SetMessage(player, artifactMessages[artifactType], false); } else { // Puzzle item S_StartSound(NULL, SFX_PICKUP_ITEM); P_SetMessage(player, artifactMessages[artifactType], true); if(!netgame || deathmatch) { // Remove puzzle items if not cooperative netplay P_RemoveMobj(artifact); } } }}//---------------------------------------------------------------------------//// FUNC P_GiveArtifact//// Returns true if artifact accepted.////---------------------------------------------------------------------------boolean P_GiveArtifact(player_t *player, artitype_t arti, mobj_t *mo){ int i; int j; boolean slidePointer; slidePointer = false; i = 0; while(player->inventory[i].type != arti && i < player->inventorySlotNum) { i++; } if(i == player->inventorySlotNum) { if(arti < arti_firstpuzzitem) { i = 0; while(player->inventory[i].type < arti_firstpuzzitem && i < player->inventorySlotNum) { i++; } if(i != player->inventorySlotNum) { for(j = player->inventorySlotNum; j > i; j--) { player->inventory[j].count = player->inventory[j-1].count; player->inventory[j].type = player->inventory[j-1].type; slidePointer = true; } } } player->inventory[i].count = 1; player->inventory[i].type = arti; player->inventorySlotNum++; } else { if(arti >= arti_firstpuzzitem && netgame && !deathmatch) { // Can't carry more than 1 puzzle item in coop netplay return false; } if(player->inventory[i].count >= 25) { // Player already has 25 of this item return false; } player->inventory[i].count++; } if(!player->artifactCount) { player->readyArtifact = arti; } else if(player == &players[consoleplayer] && slidePointer && i <= inv_ptr) { inv_ptr++; curpos++; if(curpos > 6) { curpos = 6; } } player->artifactCount++; return(true);}//==========================================================================//// SetDormantArtifact//// Removes the MF_SPECIAL flag and initiates the artifact pickup// animation.////==========================================================================static void SetDormantArtifact(mobj_t *arti){ arti->flags &= ~MF_SPECIAL; if(deathmatch && !(arti->flags2 & MF2_DROPPED)) { if(arti->type == MT_ARTIINVULNERABILITY) { P_SetMobjState(arti, S_DORMANTARTI3_1); } else if(arti->type == MT_SUMMONMAULATOR || arti->type == MT_ARTIFLY) { P_SetMobjState(arti, S_DORMANTARTI2_1); } else { P_SetMobjState(arti, S_DORMANTARTI1_1); } } else { // Don't respawn P_SetMobjState(arti, S_DEADARTI1); }}//---------------------------------------------------------------------------//// PROC A_RestoreArtifact////---------------------------------------------------------------------------void A_RestoreArtifact(mobj_t *arti){ arti->flags |= MF_SPECIAL; P_SetMobjState(arti, arti->info->spawnstate); S_StartSound(arti, SFX_RESPAWN);}//---------------------------------------------------------------------------//// PROC A_RestoreSpecialThing1//// Make a special thing visible again.////---------------------------------------------------------------------------void A_RestoreSpecialThing1(mobj_t *thing){ thing->flags2 &= ~MF2_DONTDRAW; S_StartSound(thing, SFX_RESPAWN);}//---------------------------------------------------------------------------//// PROC A_RestoreSpecialThing2////---------------------------------------------------------------------------void A_RestoreSpecialThing2(mobj_t *thing){ thing->flags |= MF_SPECIAL; P_SetMobjState(thing, thing->info->spawnstate);}//---------------------------------------------------------------------------//// PROC P_TouchSpecialThing////---------------------------------------------------------------------------void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher){ player_t *player; fixed_t delta; int sound; boolean respawn; delta = special->z-toucher->z; if(delta > toucher->height || delta < -32*FRACUNIT) { // Out of reach return; } if(toucher->health <= 0) { // Toucher is dead return; } sound = SFX_PICKUP_ITEM; player = toucher->player; respawn = true; switch(special->sprite) { // Items case SPR_PTN1: // Item_HealingPotion if(!P_GiveBody(player, 10)) { return; } P_SetMessage(player, TXT_ITEMHEALTH, false); break; case SPR_ARM1: if(!P_GiveArmor(player, ARMOR_ARMOR, -1)) { return; } P_SetMessage(player, TXT_ARMOR1, false); break; case SPR_ARM2: if(!P_GiveArmor(player, ARMOR_SHIELD, -1)) { return; } P_SetMessage(player, TXT_ARMOR2, false); break; case SPR_ARM3: if(!P_GiveArmor(player, ARMOR_HELMET, -1)) { return; } P_SetMessage(player, TXT_ARMOR3, false); break; case SPR_ARM4: if(!P_GiveArmor(player, ARMOR_AMULET, -1)) { return; } P_SetMessage(player, TXT_ARMOR4, false); break; // Keys case SPR_KEY1: case SPR_KEY2: case SPR_KEY3: case SPR_KEY4: case SPR_KEY5: case SPR_KEY6: case SPR_KEY7: case SPR_KEY8: case SPR_KEY9: case SPR_KEYA: case SPR_KEYB: if(!P_GiveKey(player, special->sprite-SPR_KEY1)) { return; } P_SetMessage(player, TextKeyMessages[special->sprite-SPR_KEY1], true); sound = SFX_PICKUP_KEY; // Check and process the special now in case the key doesn't // get removed for coop netplay if(special->special) { P_ExecuteLineSpecial(special->special, special->args, NULL, 0, toucher); special->special = 0; } if(!netgame) { // Only remove keys in single player game break; } player->bonuscount += BONUSADD; if(player == &players[consoleplayer]) { S_StartSound(NULL, sound); SB_PaletteFlash(false); } return; // Artifacts case SPR_PTN2: TryPickupArtifact(player, arti_health, special); return; case SPR_SOAR: TryPickupArtifact(player, arti_fly, special); return; case SPR_INVU: TryPickupArtifact(player, arti_invulnerability, special); return; case SPR_SUMN: TryPickupArtifact(player, arti_summon, special); return; case SPR_PORK: TryPickupArtifact(player, arti_egg, special); return; case SPR_SPHL: TryPickupArtifact(player, arti_superhealth, special); return; case SPR_HRAD: TryPickupArtifact(player, arti_healingradius, special); return; case SPR_TRCH: TryPickupArtifact(player, arti_torch, special); return; case SPR_ATLP: TryPickupArtifact(player, arti_teleport, special); return; case SPR_TELO: TryPickupArtifact(player, arti_teleportother, special); return; case SPR_PSBG: TryPickupArtifact(player, arti_poisonbag, special); return; case SPR_SPED: TryPickupArtifact(player, arti_speed, special); return; case SPR_BMAN: TryPickupArtifact(player, arti_boostmana, special); return; case SPR_BRAC: TryPickupArtifact(player, arti_boostarmor, special); return; case SPR_BLST: TryPickupArtifact(player, arti_blastradius, special); return; // Puzzle artifacts case SPR_ASKU: TryPickupArtifact(player, arti_puzzskull, special); return; case SPR_ABGM: TryPickupArtifact(player, arti_puzzgembig, special); return; case SPR_AGMR: TryPickupArtifact(player, arti_puzzgemred, special); return; case SPR_AGMG: TryPickupArtifact(player, arti_puzzgemgreen1, special); return; case SPR_AGG2: TryPickupArtifact(player, arti_puzzgemgreen2, special); return; case SPR_AGMB: TryPickupArtifact(player, arti_puzzgemblue1, special); return; case SPR_AGB2: TryPickupArtifact(player, arti_puzzgemblue2, special); return; case SPR_ABK1: TryPickupArtifact(player, arti_puzzbook1, special); return; case SPR_ABK2: TryPickupArtifact(player, arti_puzzbook2, special); return; case SPR_ASK2: TryPickupArtifact(player, arti_puzzskull2, special); return; case SPR_AFWP: TryPickupArtifact(player, arti_puzzfweapon, special); return; case SPR_ACWP:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -