//---------------------------------------------------------------------------- // // PROC P_PlayerUseArtifact // //---------------------------------------------------------------------------- public static void P_PlayerUseArtifact(DoomDef.player_t player, DoomDef.artitype_t arti) { int i; for (i = 0; i < player.inventorySlotNum; i++) { if (player.inventory[i].type == (int)arti) { // Found match - try to use if (P_UseArtifact(player, arti)) { // Artifact was used - remove it from inventory P_PlayerRemoveArtifact(player, i); if (player == g_game.players[g_game.consoleplayer]) { i_ibm.S_StartSound(null, (int)sounds.sfxenum_t.sfx_artiuse); sb_bar.ArtifactFlash = 4; } } else { // Unable to use artifact, advance pointer P_PlayerNextArtifact(player); } break; } } }
//---------------------------------------------------------------------------- // // FUNC P_UseArtifact // // Returns true if artifact was used. // //---------------------------------------------------------------------------- public static bool P_UseArtifact(DoomDef.player_t player, DoomDef.artitype_t arti) { #if DOS mobj_t *mo; uint 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; S_StartSound(player.mo, sfx_wpnup); } } 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); } #endif return(true); }