//:://////////////////////////////////////////////
//:: FileName: "ss_ep_maspenguin"
/*   Purpose: Mass Penguin - turns all creatures in the target area into
        penguins!
*/
//:://////////////////////////////////////////////
//:: Created By: Boneshank
//:: Last Updated On: March 12, 2004
//:://////////////////////////////////////////////
#include "prc_alterations"
#include "pnp_shft_poly"
#include "inc_epicspells"
#include "prc_compan_inc"

void main()
{
    DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
    SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_TRANSMUTATION);

    if (!X2PreSpellCastCode())
    {
        DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
        return;
    }
    if (GetCanCastSpell(OBJECT_SELF, SPELL_EPIC_MASSPEN))
    {
        float fDelay;
        int nDuration = 20;

        effect eExplode = EffectVisualEffect(VFX_FNF_MYSTICAL_EXPLOSION);
        effect eDuration = EffectVisualEffect(VFX_DUR_PIXIEDUST);
        effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH);
        effect ePolymorph = EffectPolymorph(POLYMORPH_TYPE_PENGUIN, TRUE);
        effect eLink = EffectLinkEffects(eDuration, ePolymorph);
        location lTarget = PRCGetSpellTargetLocation();
        ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eExplode, lTarget);
        ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eDuration,
            lTarget, 10.0);
        object oTarget = GetFirstObjectInShape(SHAPE_SPHERE,
            RADIUS_SIZE_LARGE, lTarget);
        // Cycle through the targets within the spell shape
        //      until an invalid object is captured.
        while (GetIsObjectValid(oTarget))
        {
            if (oTarget != OBJECT_SELF)
            {
                //Fire cast spell at event for the specified target
                SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF,
                    PRCGetSpellId()));
                fDelay = PRCGetRandomDelay(1.5, 2.5);
                if(!PRCDoResistSpell(OBJECT_SELF, oTarget, GetTotalCastingLevel(OBJECT_SELF)+SPGetPenetr(OBJECT_SELF), fDelay) && PRCGetIsAliveCreature(oTarget))
                {
                    if(PRCGetCreatureSize(oTarget) == CREATURE_SIZE_TINY ||
                        PRCGetCreatureSize(oTarget) == CREATURE_SIZE_SMALL ||
                        PRCGetCreatureSize(oTarget) == CREATURE_SIZE_MEDIUM)
                    {

                        // Targets all get a Fortitude saving throw
                        if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, GetEpicSpellSaveDC(OBJECT_SELF, oTarget),
                            SAVING_THROW_TYPE_SPELL, OBJECT_SELF, fDelay))
                        {
                            //this command will make shore that polymorph plays nice with the shifter
                            ShifterCheck(oTarget);
                            //companion has multi-sized penguins :)
                            if(GetPRCSwitch(MARKER_PRC_COMPANION))
                            {
                                int nRandom = d100();
                                if(nRandom < 25)
                                    ePolymorph = EffectPolymorph(POLYMORPH_TYPE_PENGUIN, TRUE);
                                else if(nRandom < 40)
                                    ePolymorph = EffectPolymorph(PRC_COMP_POLYMORPH_TYPE_PENGUIN_150, TRUE);
                                else if(nRandom < 55)
                                    ePolymorph = EffectPolymorph(PRC_COMP_POLYMORPH_TYPE_PENGUIN_200, TRUE);
                                else if(nRandom < 70)
                                    ePolymorph = EffectPolymorph(PRC_COMP_POLYMORPH_TYPE_PENGUIN_300, TRUE);
                                else if(nRandom < 85)
                                    ePolymorph = EffectPolymorph(PRC_COMP_POLYMORPH_TYPE_PENGUIN_400, TRUE);
                                else
                                    ePolymorph = EffectPolymorph(PRC_COMP_POLYMORPH_TYPE_PENGUIN_500, TRUE);    
                                eLink = EffectLinkEffects(eDuration, ePolymorph);
                            }
                            
                            // Apply effects to the currently selected target.
                            DelayCommand(fDelay, SPApplyEffectToObject
                                (DURATION_TYPE_TEMPORARY, eLink, oTarget,
                                HoursToSeconds(nDuration), TRUE, -1, GetTotalCastingLevel(OBJECT_SELF)));
                            DelayCommand(fDelay, SPApplyEffectToObject
                                (DURATION_TYPE_INSTANT, eVis, oTarget));
                        }
                    }
                 }
            }
           //Select the next target within the spell shape.
           oTarget = GetNextObjectInShape(SHAPE_SPHERE,
                RADIUS_SIZE_LARGE, lTarget);
        }
    }
    DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
}