Spell Collector v1
1600
|
ID: 115
Family ID:
Author: cedi
Rarity: rare
Element: storm
Attack Type: Energy
Attack Range: 950
Attack CD: 2
Damage: 1080-1080
Status: Approved
|
Magical Barrage
Whenever this tower attacks it has a 20% chance to launch a magical missile. Whenever a tower in 650 range casts a spell, the amount of missiles on attack is increased by 1 for a duration equal to the casting tower's ability's cooldown. The Spell Collector can shoot up to 10 missiles per attack. Each missile deals 2000 spell damage. Each additional missile has 5% higher crit chance and 10% higher crit damage than the previous one. Level Bonus: +0.8% chance +80 spell damage +0.2% spell crit chance +0.4% spell crit damage +1 max missiles every 5 levels |
Download
Toggle Triggers Header globals
//@export
ProjectileType cedi_spellCPT
//@export
BuffType cedi_spellGathering
//@export
BuffType cedi_spellInc
//@export
MultiboardValues cedi_spellCollectorMBValues
endglobals
function hitMissile takes Projectile P, Unit U returns nothing
local Tower C = P.getCaster()
if U != 0 and C != 0 then
call P.getCaster().doSpellDamage( U, (2000.0 + 80 * C.getLevel()) * C.userInt, C.calcSpellCrit( P.userReal, P.userReal2 ) )
endif
endfunction
function incCast takes Buff B returns nothing
local Tower C = B.getCaster()
local integer UID
set B = C.getBuffOfType(cedi_spellInc)
if B != 0 then
set B = cedi_spellInc.apply(C, C, B.getLevel() + 1)
else
set B = cedi_spellInc.apply(C, C, 1)
endif
set UID = B.getUID()
call TriggerSleepAction(Event.getAutocastType().getCooldown())
if B.getUID() == UID then
call B.setLevel(B.getLevel() - 1)
if B.getLevel() == 0 then
call B.removeBuff()
endif
endif
endfunction
function Launch takes nothing returns nothing
local timer t = GetExpiredTimer()
local Tower tower = GetTimerData( t )
local real chance = 0.05 + 0.002 * tower.getLevel()
local real crit = 0.1 + 0.004 * tower.getLevel()
local Projectile P
local Unit T = tower.userInt3
if T == 0 then
call ReleaseTimer( t )
set t = null
return
endif
if tower.userInt2 >= tower.userReal then
call ReleaseTimer( t )
set t = null
return
endif
set P = Projectile.createBezierInterpolationFromUnitToUnit( cedi_spellCPT, tower, 1.0, tower.calcSpellCritNoBonus(), tower, T, GetRandomReal( 0.25, 0.45 ), GetRandomReal( -0.3, 0.3 ), 0.0, true )
set P.userReal = chance * tower.userInt2
set P.userReal2 = crit * tower.userInt2
set P.z = 50.0
set tower.userInt2 = tower.userInt2 + 1
set t = null
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
set cedi_spellCPT = ProjectileType.createInterpolate( "Abilities\\Weapons\\FarseerMissile\\FarseerMissile.mdl", 1200.0 )
call cedi_spellCPT.setEventOnInterpolationFinished( hitMissile )
set cedi_spellGathering = BuffType.createAuraEffectType( true )
call cedi_spellGathering.setBuffIcon( '@@1@@' )
call cedi_spellGathering.addEventOnSpellCast( incCast )
set cedi_spellInc = BuffType.create( 20.0, 0.0, true )
call cedi_spellInc.setBuffIcon( '@@2@@' )
set cedi_spellCollectorMBValues = MultiboardValues.create(1)
call cedi_spellCollectorMBValues.setKey(0, "Spells Harvested")
endfunction
On Attack
ONATTACK_chance: 0.2
ONATTACK_chanceLevelAdd: 0.008
function onAttack takes Tower tower returns nothing
//local real chance = 0.05 + 0.002 * tower.getLevel()
//local real crit = 0.1 + 0.004 * tower.getLevel()
//local integer i = 0
local Buff B = tower.getBuffOfType( cedi_spellInc )
local integer max = 1
//local Projectile P
local Unit T = Event.getTarget()
local real r
local timer t = NewTimer()
if B != 0 then
set max = IMinBJ(B.getLevel() + 1,10+tower.getLevel()/5)
endif
set r = tower.getCurrentAttackspeed() / max
if r > 0.2 then
set r = 0.2
endif
set tower.userReal = max
set tower.userInt2 = 0 //i
set tower.userInt3 = T
call SetTimerData( t, tower )
call TimerStart( t, r, true, function Launch )
//loop
// exitwhen i >= max
// exitwhen T == 0
// set P = Projectile.createFromUnitToUnit( cedi_spellCPT, tower, 1.0, tower.calcSpellCritNoBonus(), tower, T, true, false, false )
// set P.userReal = chance * i
// set P.userReal2 = crit * i
// set P.z = 50.0
// set i = i + 1
// call TriggerSleepAction( 0.1 )
//endloop
endfunction
On Tower Creation function onCreate takes Tower tower returns nothing
set tower.userInt = 1 //first member
endfunction
On Tower Details
goldcost: 0
function onTowerDetails takes Tower tower returns MultiboardValues
local Buff B = tower.getBuffOfType(cedi_spellInc)
local integer lvl = 0
if B != 0 then
set lvl = IMinBJ(B.getLevel() + 1,10+tower.getLevel()/5)
endif
call cedi_spellCollectorMBValues.setValue(0, I2S(lvl))
return cedi_spellCollectorMBValues
endfunction
Tower Aura
AURA_auraEffect: cedi_spellGathering
AURA_power: 0
AURA_level: 0
AURA_auraRange: 650.0
AURA_targetType: TARGET_TYPE_TOWERS
AURA_levelAdd: 1
AURA_powerAdd: 1
AURA_targetSelf: true
|
Spell Harvester v1
3200
|
ID: 116
Family ID:
Author: cedi
Rarity: rare
Element: storm
Attack Type: Energy
Attack Range: 950
Attack CD: 2
Damage: 2161-2161
Status: Approved
|
Description: A field which is able to gather energy from spells.
Magical Barrage
Whenever this tower attacks it has a 20% chance to launch a magical missile. Whenever a tower in 650 range casts a spell, the amount of missiles on attack is increased by 1 for a duration equal to the casting tower's ability's cooldown. The Spell Harvester can shoot up to 20 missiles per attack. Each missile deals 4000 spell damage. Each additional missile has 7.5% higher crit chance and 15% higher crit damage than the previous one. Level Bonus: +0.8% chance +160 spell damage +0.3% spell crit chance +0.6% spell crit damage +2 max missiles every 5 levels |
Download
Toggle Triggers Header globals
//@import
ProjectileType cedi_spellCPT
//@import
BuffType cedi_spellGathering
//@import
BuffType cedi_spellInc
//@import
MultiboardValues cedi_spellCollectorMBValues
endglobals
function Launch takes nothing returns nothing
local timer t = GetExpiredTimer()
local Tower tower = GetTimerData( t )
local real chance = 0.075 + 0.003 * tower.getLevel()
local real crit = 0.15 + 0.006 * tower.getLevel()
local Projectile P
local Unit T = tower.userInt3
if T == 0 then
call ReleaseTimer( t )
set t = null
return
endif
if tower.userInt2 >= tower.userReal then
call ReleaseTimer( t )
set t = null
return
endif
set P = Projectile.createBezierInterpolationFromUnitToUnit( cedi_spellCPT, tower, 1.0, tower.calcSpellCritNoBonus(), tower, T, GetRandomReal( 0.25, 0.45 ), GetRandomReal( -0.3, 0.3 ), 0.0, true )
set P.userReal = chance * tower.userInt2
set P.userReal2 = crit * tower.userInt2
set P.z = 75.0
set tower.userInt2 = tower.userInt2 + 1
set t = null
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
endfunction
On Attack
ONATTACK_chance: 0.2
ONATTACK_chanceLevelAdd: 0.008
function onAttack takes Tower tower returns nothing
//local real chance = 0.075 + 0.003 * tower.getLevel()
//local real crit = 0.15 + 0.006 * tower.getLevel()
//local integer i = 0
local Buff B = tower.getBuffOfType( cedi_spellInc )
local integer max = 1
//local Projectile P
local Unit T = Event.getTarget()
local real r
local timer t = NewTimer()
if B != 0 then
set max = IMinBJ(B.getLevel() + 1,20+tower.getLevel()/5*2)
endif
set r = tower.getCurrentAttackspeed() / max
if r > 0.2 then
set r = 0.2
endif
set tower.userReal = max
set tower.userInt2 = 0 //i
set tower.userInt3 = T
call SetTimerData( t, tower )
call TimerStart( t, r, true, function Launch )
//loop
// exitwhen i >= max
// exitwhen T == 0
// set P = Projectile.createFromUnitToUnit( cedi_spellCPT, tower, 1.0, tower.calcSpellCritNoBonus(), tower, T, true, false, false )
// set P.userReal = chance * i
// set P.userReal2 = crit * i
// set P.z = 50.0
// set i = i + 1
// call TriggerSleepAction( 0.1 )
//endloop
endfunction
On Tower Creation function onCreate takes Tower tower returns nothing
set tower.userInt = 2 //second member
endfunction
On Tower Details
goldcost: 0
function onTowerDetails takes Tower tower returns MultiboardValues
local Buff B = tower.getBuffOfType(cedi_spellInc)
local integer lvl = 0
if B != 0 then
set lvl = IMinBJ(B.getLevel() + 1,20+tower.getLevel()/5*2)
endif
call cedi_spellCollectorMBValues.setValue(0, I2S(lvl))
return cedi_spellCollectorMBValues
endfunction
Tower Aura
AURA_auraEffect: cedi_spellGathering
AURA_power: 0
AURA_level: 0
AURA_auraRange: 650.0
AURA_targetType: TARGET_TYPE_TOWERS
AURA_levelAdd: 2
AURA_powerAdd: 2
AURA_targetSelf: true
|
Description: