//::///////////////////////////////////////////////
//:: Name ra_bandit_spawn
//::
//:://////////////////////////////////////////////
/*
    Default On Spawn script


    2003-07-28: Georg Zoeller:

    If you set a ninteger on the creature named
    "X2_USERDEFINED_ONSPAWN_EVENTS"
    The creature will fire a pre and a post-spawn
    event on itself, depending on the value of that
    variable
    1 - Fire Userdefined Event 1510 (pre spawn)
    2 - Fire Userdefined Event 1511 (post spawn)
    3 - Fire both events

    2007-12-31: Deva Winblood
    Modified to look for X3_HORSE_OWNER_TAG and if
    it is defined look for an NPC with that tag
    nearby or in the module (checks near first).
    It will make that NPC this horse's master.

*/
//:://////////////////////////////////////////////
//:: Created By: Keith Warner, Georg Zoeller
//:: Created On: June 11/03
//:://////////////////////////////////////////////

const int EVENT_USER_DEFINED_PRESPAWN = 1510;
const int EVENT_USER_DEFINED_POSTSPAWN = 1511;

#include "NW_I0_GENERIC"
#include "ms_name_inc"
#include "x2_inc_switches"
#include "rnd_commoner_inc"
#include "ra_rnd_armor_inc"


void ShrinkEm(object oPC)
{
    SetObjectVisualTransform(oPC, OBJECT_VISUAL_TRANSFORM_SCALE, 0.5f);
}

void GrowEm(object oPC)
{
    SetObjectVisualTransform(oPC, OBJECT_VISUAL_TRANSFORM_SCALE, 1.5f);
}

void main()
{
    string sTag;
    object oNPC;
    // User defined OnSpawn event requested?
    int nSpecEvent = GetLocalInt(OBJECT_SELF,"X2_USERDEFINED_ONSPAWN_EVENTS");


    // Pre Spawn Event requested
    if (nSpecEvent == 1  || nSpecEvent == 3  )
    {
    SignalEvent(OBJECT_SELF,EventUserDefined(EVENT_USER_DEFINED_PRESPAWN ));
    }

    sTag=GetLocalString(OBJECT_SELF,"X3_HORSE_OWNER_TAG");
    if (GetStringLength(sTag)>0)
    { // look for master
        oNPC=GetNearestObjectByTag(sTag);
        if (GetIsObjectValid(oNPC)&&GetObjectType(oNPC)==OBJECT_TYPE_CREATURE)
        { // master found
            AddHenchman(oNPC);
        } // master found
        else
        { // look in module
            oNPC=GetObjectByTag(sTag);
            if (GetIsObjectValid(oNPC)&&GetObjectType(oNPC)==OBJECT_TYPE_CREATURE)
            { // master found
                AddHenchman(oNPC);
            } // master found
            else
            { // master does not exist - remove X3_HORSE_OWNER_TAG
                DeleteLocalString(OBJECT_SELF,"X3_HORSE_OWNER_TAG");
            } // master does not exist - remove X3_HORSE_OWNER_TAG
        } // look in module
    } // look for master


    //:: Sets a random integer on the creature to use with other spell functions

    string sImmune = GetName(OBJECT_SELF)+"_AURA_IMMUNE";
    int nRandomSeed = Random(999);
    SetLocalInt(OBJECT_SELF, sImmune, nRandomSeed);

//:: Creature will quickly & automatically buff itself up with any defensive
//:: spells it has memorized.

    int nAutobuff = GetLocalInt(OBJECT_SELF,"AUTOBUFF");
    if (nAutobuff > 0 )
    {
        SetSpawnInCondition(NW_FLAG_FAST_BUFF_ENEMY);
    }

//:: Creature will flee those that close within 7m if they are not friends,
//:: Rangers or Druids.

    int nHerbivore = GetLocalInt(OBJECT_SELF,"CREATURE_VAR_HERBIVORE");
    if (nHerbivore > 0 )
    {
        SetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL);
        SetBehaviorState(NW_FLAG_BEHAVIOR_HERBIVORE);
    }

//:: Creature will only attack those that close within 5m and are not friends,
//:: Rangers or Druids.

    int nOmnivore = GetLocalInt(OBJECT_SELF,"CREATURE_VAR_OMNIVORE");
    if (nOmnivore > 0 )
    {
        SetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL);
        SetBehaviorState(NW_FLAG_BEHAVIOR_OMNIVORE);
    }

    int nOLM = GetLocalInt(OBJECT_SELF,"OLM");
    if (nOLM > 0)
    {
        DelayCommand(0.0f, ShrinkEm(OBJECT_SELF));

        effect eSlow = EffectMovementSpeedDecrease(50);
        eSlow = SupernaturalEffect(eSlow);
        eSlow = ExtraordinaryEffect(eSlow);
        DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eSlow,OBJECT_SELF));
    }

    int nHuge = GetLocalInt(OBJECT_SELF,"HUGE");
    if (nHuge > 0)
    {
        DelayCommand(0.0f, GrowEm(OBJECT_SELF));

    }

   int nNoStun = GetLocalInt(OBJECT_SELF,"NOSTUN");
    if (nNoStun > 0)
    {
        effect eNoStun = EffectImmunity(IMMUNITY_TYPE_STUN);
        eNoStun = SupernaturalEffect(eNoStun);
        eNoStun = ExtraordinaryEffect(eNoStun);
        DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eNoStun,OBJECT_SELF));
    }
    int nNatInvis = GetLocalInt(OBJECT_SELF,"NATURAL_INVIS");
    if (nNatInvis > 0)
    {
        effect eNatInvis = EffectInvisibility(4);
        eNatInvis = SupernaturalEffect(eNatInvis);
        eNatInvis = ExtraordinaryEffect(eNatInvis);
        DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eNatInvis,OBJECT_SELF));
    }

    int nNoSleep = GetLocalInt(OBJECT_SELF,"NOSLEEP");
    if (nNoSleep > 0)
    {
        effect eNoSleep = EffectImmunity(IMMUNITY_TYPE_SLEEP);
        eNoSleep = SupernaturalEffect(eNoSleep);
        eNoSleep = ExtraordinaryEffect(eNoSleep);
        DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eNoSleep,OBJECT_SELF));
    }

    int nNoDaze = GetLocalInt(OBJECT_SELF,"NODAZE");
    if (nNoDaze > 0)
    {
        effect eNoDaze = EffectImmunity(IMMUNITY_TYPE_DAZED);
        eNoDaze = SupernaturalEffect(eNoDaze);
        eNoDaze = ExtraordinaryEffect(eNoDaze);
        DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eNoDaze,OBJECT_SELF));
    }

    int nNoBlind = GetLocalInt(OBJECT_SELF,"NOBLIND");
    if (nNoBlind > 0)
    {
        effect eNoBlind = EffectImmunity(IMMUNITY_TYPE_BLINDNESS);
        eNoBlind = SupernaturalEffect(eNoBlind);
        eNoBlind = ExtraordinaryEffect(eNoBlind);
        DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eNoBlind,OBJECT_SELF));
    }

    int nNoDeaf = GetLocalInt(OBJECT_SELF,"NODEAF");
    if (nNoDeaf > 0)
    {
        effect eNoDeaf = EffectImmunity(IMMUNITY_TYPE_DEAFNESS);
        eNoDeaf = SupernaturalEffect(eNoDeaf);
        eNoDeaf = ExtraordinaryEffect(eNoDeaf);
        DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eNoDeaf,OBJECT_SELF));
    }

    int nDeaf = GetLocalInt(OBJECT_SELF,"IS_DEAF");
    if (nDeaf > 0)
    {
        effect eDeaf = EffectDeaf();
        eDeaf = SupernaturalEffect(eDeaf);
        eDeaf = ExtraordinaryEffect(eDeaf);
        DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eDeaf,OBJECT_SELF));
    }

    /*  Fix for the new golems to reduce their number of attacks */

    int nNumber = GetLocalInt(OBJECT_SELF,CREATURE_VAR_NUMBER_OF_ATTACKS);
    if (nNumber >0 )
    {
        SetBaseAttackBonus(nNumber);
    }

     int nVFX = GetLocalInt(OBJECT_SELF,"SpawnVFX");
    if(nVFX)
        {
            ApplyEffectToObject(DURATION_TYPE_PERMANENT,SupernaturalEffect(EffectVisualEffect(nVFX)),OBJECT_SELF);
        }

    int nRegen = GetLocalInt(OBJECT_SELF,"FAST_HEALING");
    if(nRegen)
        {
            effect eRegen = EffectRegenerate(nRegen, 6.0f);
            eRegen = SupernaturalEffect(eRegen);
            eRegen = ExtraordinaryEffect(eRegen);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eRegen, OBJECT_SELF));
        }

    int nShadowy = GetLocalInt(OBJECT_SELF,"SHADOWY");
    if (nShadowy)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_PROT_SHADOW_ARMOR);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }

    int nStony = GetLocalInt(OBJECT_SELF,"STONY");
    if (nStony)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_PROT_STONESKIN);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }
    int nFirey = GetLocalInt(OBJECT_SELF,"FIREY");
    if (nFirey)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_INFERNO_NO_SOUND);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }
    int nWoody = GetLocalInt(OBJECT_SELF,"WOODY");
    if (nWoody)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_PROT_BARKSKIN);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }

    int nConcealed20 = GetLocalInt(OBJECT_SELF,"CONCEALED20");
    if (nConcealed20)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_BLUR );
            effect eConceal = EffectConcealment(20, 0);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }

    int nConcealed50 = GetLocalInt(OBJECT_SELF,"CONCEALED50");
    if (nConcealed50)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_BLUR );
            effect eConceal = EffectConcealment(50, 0);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }

        int nIcy = GetLocalInt(OBJECT_SELF,"ICY");
    if (nIcy)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_ICESKIN);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }

    int nSR = GetLocalInt(OBJECT_SELF,"SPELL_RESISTANCE");
    if ( nSR )
    {
        effect eSR = EffectSpellResistanceIncrease(nSR);
        eSR = SupernaturalEffect(eSR);
        eSR = ExtraordinaryEffect(eSR);
        ApplyEffectToObject(DURATION_TYPE_PERMANENT,eSR,OBJECT_SELF);
    }

    int nAttackBonus = GetLocalInt(OBJECT_SELF,"ATTACK_BONUS");
    if ( nAttackBonus )
    {
        effect eAttack = EffectAttackIncrease(nAttackBonus);
        eAttack = SupernaturalEffect(eAttack);
        eAttack = ExtraordinaryEffect(eAttack);
        ApplyEffectToObject(DURATION_TYPE_PERMANENT,eAttack,OBJECT_SELF);
    }

    int nAcidShield = GetLocalInt(OBJECT_SELF,"ACID_SHIELD");
    if ( nAcidShield )
    {
        effect eShield = EffectDamageShield(0,DAMAGE_BONUS_1d8,DAMAGE_TYPE_ACID);
        eShield = SupernaturalEffect(eShield);
        eShield = ExtraordinaryEffect(eShield);
        ApplyEffectToObject(DURATION_TYPE_PERMANENT,eShield,OBJECT_SELF);
    }

    int nSerratedEdge = GetLocalInt(OBJECT_SELF,"SERRATED_EDGE");
    if ( nSerratedEdge )
    {
        effect eShield = EffectDamageShield(0,DAMAGE_BONUS_1d6,DAMAGE_TYPE_SLASHING);
        eShield = SupernaturalEffect(eShield);
        eShield = ExtraordinaryEffect(eShield);
        ApplyEffectToObject(DURATION_TYPE_PERMANENT,eShield,OBJECT_SELF);
    }

    int nSpikedArmor = GetLocalInt(OBJECT_SELF,"SPIKED_ARMOR");
    if ( nSpikedArmor )
    {
        effect eShield = EffectDamageShield(0,DAMAGE_BONUS_1d4,DAMAGE_TYPE_PIERCING);
        eShield = SupernaturalEffect(eShield);
        eShield = ExtraordinaryEffect(eShield);
        ApplyEffectToObject(DURATION_TYPE_PERMANENT,eShield,OBJECT_SELF);
    }

    int nGlow = GetLocalInt (OBJECT_SELF,"GLOW_COLOR");
    if (nGlow == 1)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_GLOW_BLUE);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }
    else if (nGlow == 2)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_GLOW_BROWN);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }
    else if (nGlow == 3)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_GLOW_GREEN);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }
    else if (nGlow == 4)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_GLOW_GREY);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }
    else if (nGlow == 5)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_GLOW_LIGHT_BLUE);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }
    else if (nGlow == 6)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_GLOW_LIGHT_BROWN);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }
    else if (nGlow == 7)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_GLOW_LIGHT_GREEN);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }
    else if (nGlow == 8)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_GLOW_LIGHT_ORANGE);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }
    else if (nGlow == 9)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_GLOW_LIGHT_PURPLE);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }
    else if (nGlow == 10)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_GLOW_LIGHT_RED);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }
    else if (nGlow == 11)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_GLOW_LIGHT_YELLOW);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }
    else if (nGlow == 12)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_GLOW_ORANGE);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }
    else if (nGlow == 13)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_GLOW_PURPLE);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }
    else if (nGlow == 14)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_GLOW_RED);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }
    else if (nGlow == 15)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_GLOW_WHITE);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }
    else if (nGlow == 16)
        {
            effect eVis = EffectVisualEffect(VFX_DUR_GLOW_YELLOW);
            eVis = SupernaturalEffect(eVis);
            eVis = ExtraordinaryEffect(eVis);
            DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT,eVis,OBJECT_SELF));
        }

// Check for randomizations.

    // RndBanditArmor(OBJECT_SELF);

    ms_Nomenclature(OBJECT_SELF);

    int nKeepskin = GetLocalInt(OBJECT_SELF,"RA_KEEPSKIN");
        if (nKeepskin != 1)
            {
                rnd_skin(OBJECT_SELF);
            }

    rnd_skin(OBJECT_SELF);

    int nKeephead = GetLocalInt(OBJECT_SELF,"RA_KEEPHEAD");
        if (nKeephead != 1)
            {
                rnd_head(OBJECT_SELF);
            }

    int nKeeptats = GetLocalInt(OBJECT_SELF,"RA_KEEPTATS");
        if (nKeeptats != 1)
            {
                rnd_tattoo(OBJECT_SELF);
            }

    // Execute PRC OnSpawn script.
	ExecuteScript("prc_npc_spawn", OBJECT_SELF);
    // Execute default OnSpawn script.
    ExecuteScript("nw_c2_default9", OBJECT_SELF);


    //Post Spawn event requeste
    if (nSpecEvent == 2 || nSpecEvent == 3)
    {
    SignalEvent(OBJECT_SELF,EventUserDefined(EVENT_USER_DEFINED_POSTSPAWN));
    }

}