function GetBoosters( strSpell ) // 1: Spell name (string) // return: array of structs var elmSpell := FindSpellElem( strSpell ); var arrEnhanced := GetConfigStringArray( elmSpell, "BoostedBy" ); if(len(arrEnhanced) > 0) var strSplit; var arrBoosts := array; var stcBoost := struct; stcBoost.+type1 := ""; stcBoost.+type2 := ""; stcBoost.+mult := cdbl(1); foreach strEntry in arrEnhanced strSplit := SplitWords(strEntry); stcBoost.type1 := strSplit[1]; stcBoost.type2 := strSplit[2]; stcBoost.mult := cdbl(strSplit[3]); arrBoosts.append(stcBoost); //Print("[Boost] Boosted by "+stcBoost); endforeach //print("Boosts: "+arrBoosts); return arrBoosts; endif return 1; endfunction ////////////////////////////////////////////////////// function GetBoosts( mobWho, arrBoosts) // 1: Spell name (string) // return: array of structs var numMult := cdbl(1); var intBase := cdbl(0); foreach stcBoost in arrBoosts case(stcBoost.type1) "skill": intBase := cdbl(GetEffectiveSkill(mobWho, cint(stcBoost.type2))); if(!intBase) break; endif numMult := numMult * (intBase * stcBoost.mult); break; "resistance": intBase := (cdbl(1) - cdbl(Resistance(mobWho, cstr(stcBoost.type2)))) * 100; if(!intBase) break; endif numMult := numMult * (intBase * stcBoost.mult); break; "statmod": intBase := cdbl(GetModifierSum( GetCurrentMods( mobWho, stcBoost.type2, "all" ))); if(!intBase) break; endif numMult := numMult * (intBase * stcBoost.mult); break; "statmod_reason": intBase := cdbl(GetModifierSum( GetCurrentMods( mobWho, "all", stcBoost.type2 ))); if(!intBase) break; endif numMult := numMult * (intBase * stcBoost.mult); break; "cprop": intBase := cdbl(GetObjProperty(mobWho, stcBoost.type2)); if(!intBase) break; endif numMult := numMult * (intBase * stcBoost.mult); break; "vital": if(stcBoost.type2 == "hp") intBase := cdbl(GetHP(mobWho)); elseif(stcBoost.type2 == "stam") intBase := cdbl(GetStamina(mobWho)); elseif(stcBoost.type2 == "mana") intBase := cdbl(GetMana(mobWho)); endif if(!intBase) break; endif numMult := numMult * (intBase * stcBoost.mult); break; endcase intBase := cdbl(0); //Print("<"+mobWho.name+"> [Boost] "+stcboost.type1+ " "+stcboost.type2+": "+numMult+"[Base: "+intBase+"]"); endforeach //print("< Return "+numMult+">"); return numMult; endfunction ------ AUSpell SearingLight { Type damage Name SearingLight Description This spell turns unliving flesh to dust. Prerequisite Heal Thread Fire 2 Thread Magic 2 Range 8 skill Duration instant Radius 0 CastingTime word RechargeTime 5 Option range Option faster GraphicEffect AtTarget gfx_flamestrike Sound AtTarget flame_strike Animation directed_cast Script SpellDamage hp 1 noarmor none BoostedBy resistance life 2 TargetOption mob } AUSpell BaneOfTheWicked { Type damage Name Bane of the Wicked Description Cripples the unholy. Prerequisite Retribution Thread Air 2 Thread Magic 3 Range 8 skill Duration instant Radius 0 CastingTime charm RechargeTime 5 Option range Option farcast Option faster GraphicEffect AtTarget gfx_curse_effect 10 Sound AtTarget sfx_curse_effect Animation directed_cast AffectStat defense -1 none AffectStat attack -1 none AffectStat dex -1 none AffectStat str -1 none AffectStat damage -1 none AffectStat light 1 none TargetOption mob BoostedBy resistance life 2 } ----- SPELLMOD var strReason := "spell:"+strSpell; // get random spell effect multiplier intModRandomize := CInt( RandomDiceRoll( "1d101+50" ) ); intDurRandomize := CInt( RandomDiceRoll( "1d101+50" ) ); var numBoost := GetBoosts( mobTarget, GetBoosters( strSpell )); DebugMessage(mobSource, "Boost multiplier: "+numBoost); intAmount := cdbl(intAmount) * cdbl(numBoost); // base spell values ( base * spell % * random % / 100% / 100% ) intMod := CInt( intBASE_MOD_AMOUNT * CInt( intAmount ) * intModRandomize) / 10000; intDur := CInt( intBASE_MOD_DURATION * intDuration * intDurRandomize ) / 10000; SPELLDAMAGE Debugmessage( mobSource, "Calculating spell damage"); // roll and calculate damage intRoll := CDbl( CalcSpellDamage( intBASE_DAMAGE_CIRCLE, mobSource, mobTarget ) / 10 ); // roll base damage DebugMessage( mobSource, "damage base = " + intRoll ); var numBoost := GetBoosts( mobTarget, GetBoosters( strSpell )); DebugMessage(mobSOurce, "Boost multiplier: "+numBoost); intDamage := cdbl(intDamage) * cdbl(numBoost); intRoll := intRoll * CDbl( intDamage ) / 100.0; // adjust for spell DebugMessage( mobSource, "damage for spell = " + intRoll ); // adjust for user stats and skill var intPotencySkill := SKILLID_EVALINT; intRoll := intRoll * ( CDbl ( GetEffectiveSkill( mobSource, intPotencySkill ) ) + 150.0 ) / 200.0;