#include "x2_inc_switches"
#include "NW_I0_SPELLS"
void BackLash(int iDmg)
{
effect eDamage = EffectDamage(iDmg, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_ENERGY, TRUE);
effect eVFX = EffectVisualEffect(VFX_HIT_AOE_MAGIC);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVFX, GetLocation(OBJECT_SELF));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, OBJECT_SELF);
}
void RandomDamage(int iDmg, object oTarget)
{
int iRnd = Random(9)+3;
int iVFX;
int iDurType = 0;
effect eRndDmg;
string sPoly = "00000607094041";
int iPoly;
int iDmgType = FloatToInt(pow(2.0, IntToFloat(iRnd)));
switch (iDmgType)
{
case 8:
iVFX = 76;
break;
case 16:
iVFX = 44;
break;
case 32:
iVFX = 63;
break;
case 64:
iVFX = 98;
break;
case 128:
iVFX = 74;
break;
case 256:
iVFX = 61;
break;
case 512:
iVFX = 81;
break;
case 1024:
iVFX = 584;
break;
case 2048:
iVFX = 588;
break;
}
int iEffect = Random(7)+1;
switch (iEffect)
{
case 1:
eRndDmg = EffectDamage(iDmg, iDmgType, DAMAGE_POWER_ENERGY, FALSE);
break;
case 2:
{
iVFX = 68;
eRndDmg = EffectHeal(iDmg);
break;
}
case 3:
{
iVFX = 654;
iDurType = 1;
eRndDmg = EffectHaste();
break;
}
case 4:
{
iVFX = 716;
iDurType = 1;
eRndDmg = EffectSlow();
break;
}
case 5:
{
iDurType = 1;
iVFX = 85;
iPoly = StringToInt(GetSubString(sPoly, d6(1)*2, 2));
eRndDmg = EffectPolymorph(iPoly, TRUE, FALSE);
break;
}
case 6:
{
iDurType = 1;
iVFX = 6;
eRndDmg = EffectInvisibility(INVISIBILITY_TYPE_NORMAL);
break;
}
case 7:
{
iDurType = 1;
iVFX = 652;
eRndDmg = EffectSeeInvisible();
break;
}
}// end switch
effect eVFX = EffectVisualEffect(iVFX);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oTarget);
ApplyEffectToObject(iDurType, eRndDmg, oTarget, IntToFloat(iDmg*2));
}
void main()
{
int iSpell = GetSpellId();
object oArea = GetArea(OBJECT_SELF);
int iWildmagic = GetLocalInt(oArea, "X2_L_WILD_MAGIC");
if (iWildmagic != 1) return;
int iRandom = d3(1);
if (iSpell >= 344 && iSpell <= 348)
return;//shadow weave spells
int iSpellLevel = GetSpellLevel(iSpell);
int iDmg = d8(iSpellLevel);
location lLoc = GetSpellTargetLocation();
string sType = Get2DAString("spells", "TargetType", iSpell);
switch (iRandom)
{
case 1:
{ // Caster backlash
SendMessageToPC(OBJECT_SELF, "Wild Magic - Backlash");
BackLash(iDmg);
break;
}
case 2:
{ // Random effect
SetModuleOverrideSpellScriptFinished();
SendMessageToPC(OBJECT_SELF, "Wild Magic - Spell Warped");
object oTarget = GetSpellTargetObject();
if (GetIsObjectValid(oTarget))
lLoc = GetLocation(oTarget);
float fRadius = IntToFloat(iDmg)/3;
if (sType == "0x3E" || sType == "0x3F" || sType == "0x2E" || sType == "0x2F")
{
oTarget = GetFirstObjectInShape(SHAPE_SPHERE, fRadius, lLoc, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
while (GetIsObjectValid(oTarget))
{
if(oTarget != OBJECT_SELF && spellsIsTarget(oTarget,SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF))
{
RandomDamage(iDmg, oTarget);
iDmg = d8(iSpellLevel);
}
oTarget = GetNextObjectInShape(SHAPE_SPHERE, fRadius, lLoc, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE );
}//end while
}// end if
else
RandomDamage(iDmg, oTarget);
break;
}
}// end switch
}