Ejemplo n.º 1
0
        //----------------------------------------------------------------------------
        //
        // 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;
                }
            }
        }
Ejemplo n.º 2
0
        //----------------------------------------------------------------------------
        //
        // 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);
        }