Arcane Storm v1
3400
|
ID: 436
Family ID:
Author: Ashbringer
Rarity: unique
Element: storm
Attack Type: Energy
Attack Range: 1200
Attack CD: 1.5
Damage: 998-998
Mana: 150
Mana regen: 0
Status: Approved
|
Surge
The tower's main attacks have a 1% chance per Attraction stack on the target to send a surge of energy that deals 200% of attack damage to the target and then attempts to jump from enemy to enemy within 750 range of the original target. At each enemy, the chance to jump is calculated based on the next target's Attraction stacks. Can only hit each target once and benefits from Mana Storm's damage bonus. Level Bonus: +0.02% chance per stack +4% attack damage
Arcane Attraction
Attacks apply a stack of Attraction on hit and generate 1 mana per stack on each target. Can only gain mana once per target hit on each attack. When an enemy dies, all stacks of Attraction on it will distribute evenly to nearby targets within 500 range and deal 20% attack damage per stack transferred. Attraction lasts indefinitely. Level Bonus: +10 range +0.4% attack damage per stack
Mana Storm
Attacks hit up to 2 additional enemies within attack range and consume all mana to deal [mana consumed]% increased damage. Mana Storm gains an additional attack for every 75 mana consumed. If at least 100 mana is consumed, the tower's multicrit is increased by 3 for 2 seconds. If there are less creeps than attacks, the remaining attacks will hit the main target. Level Bonus: -1 mana per extra attack |
Download
Toggle Triggers Header globals
BuffType ashbringer_attraction_buff
BuffType ashbringer_manastorm_buff
Cast ashbringer_surge_cast
Cast ashbringer_manastorm_cast
endglobals
function ashbringer_attraction_apply takes Tower tower, Creep target, integer stacks returns integer
local Buff b
local integer i
if stacks<1 then
set stacks = 1
endif
set b = target.getBuffOfType(ashbringer_attraction_buff)
if ( b != 0 ) then
set i = b.getPower() + stacks
call ashbringer_attraction_buff.applyCustomPower(tower, target, 1, i)
else
set i = 1
call ashbringer_attraction_buff.applyCustomPower(tower, target, 1, i)
endif
return i
endfunction
function ashbringer_attraction_ondeath takes Buff b returns nothing
local Tower tower = b.getCaster()
local Creep target = b.getBuffedUnit()
local Iterate i = Iterate.overUnitsInRangeOfUnit(tower, TARGET_TYPE_CREEPS, target, 500 + (tower.getLevel() * 10))
local integer count = i.count()
local Creep next
local integer stacks = b.getPower()
local integer stacks_spare = 0
local integer stacks_each = 0
local integer applied = 0
local real damage_per_stack = tower.getCurrentAttackDamageWithBonus() * (0.2 + (tower.getLevel() * 0.004))
if stacks < count then
set stacks_spare = stacks
else
set stacks_spare = ModuloInteger(stacks, count)
set stacks_each = (stacks - stacks_spare) / count
endif
set next = i.next()
loop
exitwhen next==0
if stacks_spare>0 then
set applied = stacks_each + 1
set stacks_spare = stacks_spare - 1
else
set applied = stacks_each
endif
call ashbringer_attraction_apply(tower, next, applied)
call tower.doAttackDamage(next, applied * damage_per_stack, tower.calcAttackMulticrit(0,0,0))
call Effect.createSimpleOnUnit("Abilities\\Spells\\Human\\Feedback\\ArcaneTowerAttack.mdl", next, "origin").destroy()
set next = i.next()
endloop
endfunction
function ashbringer_surge_start takes Tower tower, Creep target, real mana returns nothing
local Buff b
local Iterate i = Iterate.overUnitsInRangeOfUnit(tower, TARGET_TYPE_CREEPS, target, 750)
local Unit next = i.next()
local real damage = tower.getCurrentAttackDamageWithBonus() * (2.0 + (tower.getLevel() * 0.04)) * (1 + (mana/100))
local real chance_per_stack = 0.01 + (tower.getLevel() * S2R("disintegrate_chance_pl"))
local Unit prev = target
local boolean jump = true
call ashbringer_surge_cast.targetCastFromCaster(tower, target, 0.0, 0.0)
call tower.doAttackDamage(target, damage, tower.calcAttackMulticrit(0,0,0))
loop
exitwhen next==0
if next == target then
else
set b = next.getBuffOfType(ashbringer_attraction_buff)
if b!=0 then
if tower.calcChance(I2R(b.getPower())*chance_per_stack) then
call ashbringer_surge_cast.targetCastFromCaster(prev, next, 0.0, 0.0)
call tower.doAttackDamage(next, damage, tower.calcAttackMulticrit(0,0,0))
set prev = next
endif
endif
endif
set next = i.next()
endloop
endfunction
//Do not remove or rename this function!
//Put your initialization tasks here, this function will be called on map init
private function init takes nothing returns nothing
local Modifier ashbringer_manastorm_modifier = Modifier.create()
set ashbringer_attraction_buff = BuffType.create(-1, 0, false)
call ashbringer_attraction_buff.setBuffIcon('@@3@@')
call ashbringer_attraction_buff.addEventOnDeath(ashbringer_attraction_ondeath)
set ashbringer_manastorm_buff=BuffType.create(2.0, 0.0, true)
call ashbringer_manastorm_modifier.addModification(MOD_MULTICRIT_COUNT, 3, 0)
call ashbringer_manastorm_buff.setBuffIcon('@@2@@')
call ashbringer_manastorm_buff.setBuffModifier(ashbringer_manastorm_modifier)
set ashbringer_surge_cast = Cast.create('@@0@@',"chainlightning",1.0)
call ashbringer_surge_cast.setSourceHeight(90.0)
set ashbringer_manastorm_cast = Cast.create('@@1@@',"chainlightning",1.0)
call ashbringer_manastorm_cast.setSourceHeight(90.0)
endfunction
On Damage
ONDAMAGE_chance: 1.0
ONDAMAGE_chanceLevelAdd: 0.0
function onDamage takes Tower tower returns nothing
local Buff b
local Unit main_target = Event.getTarget()
local real chance_per_stack = 0.01 + (tower.getLevel() * S2R("disintegrate_chance_pl"))
local Unit target
local real mana = GetUnitState(tower.getUnit(), UNIT_STATE_MANA)
local real extra_per = 75 - (tower.getLevel() * 1)
local integer extra_attacks = 2 + R2I((mana - ModuloReal(mana, extra_per)) / extra_per)
local real original_damage = Event.damage
local real damage = original_damage * (1 + (mana/100))
local Iterate i = Iterate.overUnitsInRangeOfCaster(tower, TARGET_TYPE_CREEPS, tower.getRange())
local boolean iterate_destroyed = false
local Effect e
local integer stacks = 0
local integer total_stacks = 0
set Event.damage = damage
call tower.subtractMana(mana, true)
if mana>=100 then
call ashbringer_manastorm_buff.apply(tower, tower, 1)
call Effect.createColored("Doodads\\Cinematic\\Lightningbolt\\Lightningbolt.mdl", tower.getX(), tower.getY(), 0.0, 270.0, 1.3, 255, 90, 255, 255).setLifetime(0.3)
endif
loop
exitwhen extra_attacks == 0
if not iterate_destroyed then
set target = i.nextRandom()
if target == 0 then
set iterate_destroyed = true
set target = main_target
endif
endif
if iterate_destroyed or target != main_target then
set stacks = ashbringer_attraction_apply(tower, target, 1)
if target != main_target then
call ashbringer_manastorm_cast.targetCastFromCaster(tower, target, 0.0, 0.0)
set total_stacks = total_stacks + stacks
endif
call tower.doAttackDamage(target, damage, tower.calcAttackMulticrit(0,0,0))
set extra_attacks = extra_attacks - 1
endif
endloop
if not iterate_destroyed then
call i.destroy()
endif
call ashbringer_manastorm_cast.targetCastFromCaster(tower, main_target, 0.0, 0.0)
set stacks = ashbringer_attraction_apply(tower, main_target, 1)
set total_stacks = total_stacks + stacks
if tower.calcChance(I2R(stacks)*chance_per_stack) then
call ashbringer_surge_start(tower, main_target, mana)
endif
call tower.addMana(total_stacks)
endfunction
On Tower Creation function onCreate takes Tower tower returns nothing
endfunction
|
Description: