The Fire Lord v1
2750
ID:
554
Family ID:
Author:
Boekie
Rarity:
unique
Element:
fire
Attack Type:
Decay
Attack Range:
900
Attack CD:
2.5
Damage:
4107-4126
Status:
Approved

Description:

This creature is made of pure lava. It has the ability to control fire.
Hellfire
When the Fire Lord attacks there is a 25% chance that it gains a 5 target multishot and 25% bonus attackspeed for 7.5 seconds. Cannot retrigger!

Level Bonus:
+0.2 seconds duration 
+0.4% attackspeed 
+0.2% chance 
+1 target at level 15 and 25
Liquid Fire
When the Fire Lord damages a creep it will be set on fire, dealing 500 spelldamage per second and increasing the damage it takes from fire towers by 10%. The liquid fire lasts 5 seconds.

Level Bonus:
+50 spelldamage per second 
+0.1 seconds duration 
+0.4% bonus damage from fire
Download

Toggle Triggers

Header

   globals    
   BuffType boekie_fireMulti_buff1
   BuffType boekie_fireMulti_buff2
   BuffType boekie_fireMulti_buff3
   
   BuffType boekie_liquidFire_buff

   endglobals    
   
   function boekie_liquidFire takes Buff b returns nothing 
   local Unit target = b.getBuffedUnit()  
   local Tower tower = b.getCaster()  
   
   call tower.doSpellDamage(target,500+b.getLevel()*50,tower.calcSpellCritNoBonus())
   
   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 m = Modifier.create() 
        local Modifier n = Modifier.create() 
        call m.addModification( MOD_ATTACKSPEED, 0.25, 0.004 )        
        call n.addModification( MOD_DMG_FROM_FIRE , 0.10, 0.004 )
        
        set boekie_fireMulti_buff1 = BuffType.create( 7.5, 0.2, true )  
        call boekie_fireMulti_buff1.setBuffIcon( '@@3@@' )           
        call boekie_fireMulti_buff1.setBuffModifier( m ) 
        call boekie_fireMulti_buff1.setStackingGroup("fireMulti")
        call boekie_fireMulti_buff1.addAbility('@@2@@',false)
        
        set boekie_fireMulti_buff2 = BuffType.create( 7.5, 0.2, true )  
        call boekie_fireMulti_buff2.setBuffIcon( '@@3@@' )          
        call boekie_fireMulti_buff2.setBuffModifier( m ) 
        call boekie_fireMulti_buff2.setStackingGroup("fireMulti")
        call boekie_fireMulti_buff2.addAbility('@@1@@',false)
        
        set boekie_fireMulti_buff3 = BuffType.create( 7.5, 0.2, true )  
        call boekie_fireMulti_buff3.setBuffIcon( '@@3@@' )  
        call boekie_fireMulti_buff3.setBuffModifier( m ) 
        call boekie_fireMulti_buff3.setStackingGroup("fireMulti")
        call boekie_fireMulti_buff3.addAbility('@@0@@',false)
    
        set boekie_liquidFire_buff = BuffType.create(5,0.1,false) 
        call boekie_liquidFire_buff.setBuffIcon('@@4@@') 
        call boekie_liquidFire_buff.setBuffModifier( n ) 
        call boekie_liquidFire_buff.setStackingGroup("boekie_liquidFire")

         call boekie_liquidFire_buff.addPeriodicEvent(EventHandler.boekie_liquidFire,1) 
         
    endfunction

On Attack

ONATTACK_chance: 0.25 ONATTACK_chanceLevelAdd: 0.002
function onAttack takes Tower tower returns nothing
    local integer level = tower.getLevel()
    
    if tower.getBuffOfGroup("fireMulti") == 0 then 
        
        if level < 15 then
        
        call boekie_fireMulti_buff1.apply(tower,tower,tower.getLevel())
        
        elseif level <25 then
        
        call boekie_fireMulti_buff2.apply(tower,tower,tower.getLevel())
        
        else
        
        call boekie_fireMulti_buff3.apply(tower,tower,tower.getLevel())
        
        endif
        
    endif
endfunction

On Damage

ONDAMAGE_chance: 1.0 ONDAMAGE_chanceLevelAdd: 0.0
function onDamage takes Tower tower returns nothing
local Unit creep = Event.getTarget()

call boekie_liquidFire_buff.apply(tower,creep,tower.getLevel())
endfunction
Deep Frozen Igloo v1
2800
ID:
79
Family ID:
Author:
Boekie
Rarity:
rare
Element:
ice
Attack Type:
Energy
Attack Range:
1000
Attack CD:
2.5
Damage:
2785-2785
Status:
Approved

Description:

This igloo emits an extreme amount of cold, slowing and stunning creeps around it.
Specials:
-50% dmg to masses
Extreme Cold
Creeps that come within 900 AoE of this tower will be affected by extreme cold, suffering 2800 spelldamage, and becoming slowed by 30% for 4 seconds. When the slow expires they will get stunned for 1.2 seconds.

Level Bonus:
+140 damage 
+0.4% slow
Download

Toggle Triggers

Header

    globals
    //@import  
    BuffType boekie_igloo_buff
    endglobals
    
    //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 Unit Comes In Range

UNITINRANGE_targetType: TARGET_TYPE_CREEPS UNITINRANGE_range: 900
function onUnitInRange takes Tower tower returns nothing
    local Unit creep = Event.getTarget() 
    local integer lvl = tower.getLevel()

    call tower.doSpellDamage(creep,2800.0+(lvl*140.0),tower.calcSpellCritNoBonus()) 
    set boekie_igloo_buff.applyCustomTimed(tower,creep,300+lvl*4,4).userReal = 1.2

    call Effect.createScaled("Abilities\\Spells\\Undead\\FrostArmor\\FrostArmorDamage.mdl", creep.getX(), creep.getY(), 30.0, 0, 1.5).destroy()
endfunction
Mythic Serpent Ward v1
2800
ID:
97
Family ID:
Author:
SirCoqaLot.
Rarity:
uncommon
Element:
astral
Attack Type:
Elemental
Attack Range:
1050
Attack CD:
1.35
Damage:
2727-2727
Mana:
12
Mana regen:
1
Status:
Approved

Description:

Lesser astral tower that buffs a nearby tower, increasing its mana regeneration, maximum mana and spell damage dealt.
Snake Charm
Increases the target's maximum mana by 40%, its mana regeneration by 40% and its spell damage by 20%. The buff lasts 5 seconds. 

Level Bonus:
+2.4% mana regeneration 
+2.4% mana 
+1.2% spell damage 
+5 seconds duration at level 25

AC_TYPE_ALWAYS_BUFF
 10, 200 range, 5s cooldown
Download

Toggle Triggers

Autocast

caster_art: AUTOCAST_cooldown: 5 AUTOCAST_numBuffsBeforeIdle: 1 AUTOCAST_isExtended: false AUTOCAST_autocastType: AC_TYPE_ALWAYS_BUFF AUTOCAST_manacost: 10 AUTOCAST_range: 200 AUTOCAST_buffType: 0 AUTOCAST_targetSelf: false AUTOCAST_targetType: TARGET_TYPE_TOWERS target_art: AUTOCAST_autoRange: 200
private function onAutocast takes Tower tower returns nothing
if tower.getLevel() < 25 then
    call sir_serpent_buff.applyAdvanced(tower,Event.getTarget(),90+tower.getLevel(),400+tower.getLevel()*24,5)
else
    call sir_serpent_buff.applyAdvanced(tower,Event.getTarget(),90+tower.getLevel(),400+tower.getLevel()*24,10)
endif
endfunction

Header

    globals
    //@import
    BuffType sir_serpent_buff
    endglobals
    
    //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
Volcanic Geyser v1
2800
ID:
122
Family ID:
Author:
drol
Rarity:
uncommon
Element:
fire
Attack Type:
Elemental
Attack Range:
1100
Attack CD:
1.8
Damage:
2348-2447
Status:
Approved

Description:

A sleeping geyser that only sprouts fire now and then.
Specials:
Splash attack:
   175 AoE: 30% damage
+20% dmg to normals (+0.4%/lvl)
Ignite
The geyser has a 30% chance on damaging a creep to ignite the target, dealing 15% of the tower's attack damage as spell damage per second and reducing the target's health regeneration by 25% for 8 seconds.

Level Bonus:
+0.6% attack damage
+0.5% health regeneration reduction
Download

Toggle Triggers

Header

    globals
        //@import
        BuffType drol_fireDot
    endglobals
    
    private function init takes nothing returns nothing
    endfunction

On Damage

ONDAMAGE_chance: 0.30 ONDAMAGE_chanceLevelAdd: 0.0
function onDamage takes Tower tower returns nothing
    set drol_fireDot.apply(tower,Event.getTarget(),tower.getLevel()*5 + 200).userReal = tower.getCurrentAttackDamageWithBonus() * (0.15 + tower.getLevel() * 0.006)
endfunction
Storm Focus v1
2800
ID:
130
Family ID:
Author:
SirCoqalot.
Rarity:
unique
Element:
storm
Attack Type:
Energy
Attack Range:
1600
Attack CD:
3
Damage:
9222-14222
Mana:
20
Mana regen:
1.5
Status:
Approved

Description:

Advanced storm tower that emphasizes the use of anti air towers.
Specials:
Attacks AIR only
+10% dmg to air
Freezing Gust
Casts a buff on a tower in 800 range, doubling the effect of 'Gust' and increasing that tower's damage against air units by 10% for 5 seconds. 

Level Bonus:
+0.05 seconds duration
+0.8% damage against air

AC_TYPE_ALWAYS_BUFF
 15, 800 range, 0s cooldown
Gust - Aura
Towers in 800 range around the Storm Focus gain additional attackdamage equal to 50% of the bonus damage against air they have. 

Level Bonus:
+0.8% of bonus damage against air as additional attackdamage
Download

Toggle Triggers

Autocast

caster_art: Abilities\Spells\Human\Polymorph\PolyMorphDoneGround.mdl AUTOCAST_cooldown: 0 AUTOCAST_numBuffsBeforeIdle: 0 AUTOCAST_isExtended: true AUTOCAST_autocastType: AC_TYPE_ALWAYS_BUFF AUTOCAST_manacost: 15 AUTOCAST_range: 800 AUTOCAST_buffType: sir_focus_buff AUTOCAST_targetSelf: false AUTOCAST_targetType: TARGET_TYPE_TOWERS target_art: AUTOCAST_autoRange: 800
private function onAutocast takes Tower tower returns nothing

endfunction

Header

    globals
        BuffType sir_focus_aura
        BuffType sir_focus_buff
    endglobals
    
    function auraOnCreate takes Buff b returns nothing
        set b.userReal = 0 //Will store tower's bonus damage 
    endfunction
    
    function auraPeriodic takes Buff b returns nothing    
        local Tower tower = b.getCaster()
        local Tower buffee = b.getBuffedUnit()
        local real multiplier = 0.5 + 0.008 * tower.getLevel()
        local real bonusDamage = 1.0
        if buffee.getBuffOfType(sir_focus_buff) != 0 then
            set bonusDamage = 2.0
        endif
        //Calculate and set new damage bonus
        set bonusDamage = bonusDamage * (buffee.getDamageToSize(SIZE_AIR) - 1) * multiplier
        call buffee.modifyProperty(MOD_DAMAGE_ADD_PERC, bonusDamage - b.userReal)
        set b.userReal = bonusDamage
    endfunction
    
    function auraOnCleanup takes Buff b returns nothing
        call b.getBuffedUnit().modifyProperty(MOD_DAMAGE_ADD_PERC, -b.userReal)
    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 m = Modifier.create()
    set sir_focus_aura = BuffType.createAuraEffectType(false)
    set sir_focus_buff = BuffType.create(5,0.05,true)
    call m.addModification(MOD_DMG_TO_AIR,0.1,0.008)
    call sir_focus_aura.setBuffIcon('@@0@@')
    call sir_focus_aura.addEventOnCreate(auraOnCreate)
    call sir_focus_aura.addPeriodicEvent(auraPeriodic, 1.0)
    call sir_focus_aura.addEventOnCleanup(auraOnCleanup)
    call sir_focus_buff.setBuffIcon('@@1@@')
    call sir_focus_buff.setBuffModifier(m)
    endfunction

Tower Aura

AURA_auraEffect: sir_focus_aura AURA_power: 0 AURA_level: 0 AURA_auraRange: 800 AURA_targetType: TARGET_TYPE_TOWERS AURA_levelAdd: 1 AURA_powerAdd: 1 AURA_targetSelf: true
Eredar Warlock v1
2800
ID:
132
Family ID:
Author:
SirCoqaLot.
Rarity:
unique
Element:
darkness
Attack Type:
Essence
Attack Range:
890
Attack CD:
3
Damage:
1753-1752
Status:
Approved

Description:

Daemonic entity that will stun allied towers and temporarily steal their damage for itself and will threaten nearby units by occasionally releasing shadowboltwaves.
Siphon Essence
Casts a buff on a nearby tower, if that tower tries to attack in the next 5 seconds it will be stunned for 2.5 seconds and this tower will deal [stunned tower's DPS x 3] as essence damage to the target of the buffed tower. 

Level Bonus:
-0.02 seconds stun duration

AC_TYPE_ALWAYS_BUFF
 0, 400 range, 2.5s cooldown
Shadowbolt Wave
Every autocast of this tower has a 20% chance to release 10 shadowbolts. Every shadowbolt flies towards a random target in 1000 range and deals 1050 spell damage. This Spell has a 40% chance to trigger if the last autocast released a shadowboltwave.

Level Bonus:
+21 spell damage
Download

Toggle Triggers

Autocast

AUTOCAST_cooldown: 2.5 AUTOCAST_autoRange: 400 AUTOCAST_manacost: 0 AUTOCAST_range: 400 AUTOCAST_targetType: TARGET_TYPE_TOWERS AUTOCAST_numBuffsBeforeIdle: 1 caster_art: target_art: AUTOCAST_autocastType: AC_TYPE_ALWAYS_BUFF AUTOCAST_buffType: 0 AUTOCAST_isExtended: true AUTOCAST_targetSelf: false
private function onAutocast takes Tower tower returns nothing
    local Tower target = Event.getTarget()
    call sir_eredar_buff.apply(tower,target,1)
    call rollForShadowWave(tower)
endfunction

Header

    globals
    //@export
    ProjectileType sir_eredar_attackProj
    //@export
    ProjectileType sir_eredar_waveProj
    //@export
    BuffType sir_eredar_buff
    endglobals
   
    //@export
    function rollForShadowWave takes Tower t returns nothing
        local Projectile p
        local integer counter = 0
        local integer projCount
        local real angle
        local real x
        local real y
        local real z
        local Iterate it
       
        if (t.userInt == 0 and t.calcChance(0.20)) or (t.userInt == 1 and t.calcChance(0.40)) then   
            set t.userInt = 1
            // Check whether there's anything to shoot at before creating any projectiles.
            set it = Iterate.overUnitsInRangeOfCaster(t, TARGET_CREEPS, 1000)
            if it.count() == 0 then
                return
            endif
            call it.destroy()
            
            set projCount = t.userInt2
            set angle = 0
            set x = t.getX()
            set y = t.getY()
            set z = t.getZ()
            
            loop
                exitwhen projCount == 0
                set p = Projectile.createFromUnitToPoint(sir_eredar_waveProj, t, 1, 1, t, x+300*Cos(angle), y+300*Sin(angle), z, false, false)
                set angle = angle + 36 * bj_DEGTORAD
                set projCount = projCount - 1
            endloop
        else
            set t.userInt = 0
        endif
    endfunction
   
    public function sir_eredar_launch takes Projectile p returns nothing
        local Tower t = p.getCaster()
        local Iterate it
        
        if t != 0 then
            set it = Iterate.overUnitsInRangeOfCaster(t, TARGET_CREEPS, 1000)
            if it.count() != 0 then
                set p.explode = false // projectile will only explode if there are no targets around.
                call Projectile.createFromPointToUnit(sir_eredar_attackProj, t, 1, 1, p.x, p.y, p.z, it.nextRandom(), true, false, false)
                if it.count() != 0 then
                    call it.destroy()
                endif
            endif
        endif
    endfunction
   
    public function sir_eredar_hit takes Projectile p, Unit creep returns nothing
        local Tower tower = p.getCaster()
        call tower.doSpellDamage(creep, tower.userReal * (1+tower.getLevel()*0.02), tower.calcSpellCritNoBonus())
    endfunction
   
    public function sir_towerstun takes Buff b returns nothing       
        local Tower eredar = b.getCaster()
        local Tower attacker = b.getBuffedUnit()
        local Unit target = Event.getTarget()
        local real dmg = attacker.getCurrentAttackDamageWithBonus()/attacker.getCurrentAttackspeed() * 3
        call cb_stun.applyOnlyTimed(eredar,attacker,2.5-eredar.getLevel()*0.02)
        call eredar.doAttackDamage(target,dmg,eredar.calcSpellCritNoBonus())
        call Effect.createSimple("Abilities\\Spells\\Undead\\Impale\\ImpaleHitTarget.mdl",attacker.getX(),attacker.getY()).destroy()
        call eredar.getOwner().displayFloatingTextX(I2S(R2I(dmg)), target, 255, 0, 150, 255, 0.05, 0.0, 2.0)
        call Effect.createSimple("Abilities\\Spells\\Undead\\Impale\\ImpaleHitTarget.mdl",target.getX(),target.getY()).destroy()
    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 sir_eredar_buff = BuffType.create(5,0,true) 
        call sir_eredar_buff.setBuffIcon('@@0@@')       
        set sir_eredar_waveProj = ProjectileType.createRanged("Abilities\\Spells\\Other\\BlackArrow\\BlackArrowMissile.mdl", 300, 600)
        call sir_eredar_waveProj.setEventOnExpiration(ProjectileEvent.sir_eredar_launch)
        set sir_eredar_attackProj = ProjectileType.create("Abilities\\Spells\\Other\\BlackArrow\\BlackArrowMissile.mdl", 4, 1000)
        call sir_eredar_attackProj.enableHoming(ProjectileTargetEvent.sir_eredar_hit,0)       
        call sir_eredar_buff.addEventOnAttack(sir_towerstun,1,0)
   endfunction

On Tower Creation

function onCreate takes Tower tower returns nothing
    set tower.userInt = 0 // stores whether last autocast triggered shadowbolts
    set tower.userInt2 = 10 // stores num shadowbolts to release
    set tower.userReal = 1050 // stores base shadowbolt damage
endfunction
Mighty Phoenix v1
2800
ID:
149
Family ID:
Author:
Der_kleine_Tomy
Rarity:
rare
Element:
fire
Attack Type:
Elemental
Attack Range:
850
Attack CD:
2.5
Damage:
1659-1659
Status:
Approved

Description:

A mighty phoenix which can burn more than 1 target with its attacks.
Specials:
+20% dmg to nature (+1%/lvl)
Eruption
When Phoenixfire expires, it erupts and deals 440 elemental damage per armor point the creep is missing in 200 range around its target. Additionally the target regains only 50% of its armor. Creeps further away recieve less damage. This ability can be cast to make Phoenixfire expire immediately.

Level Bonus:
-2% armor regain

AC_TYPE_NOAC_IMMEDIATE
 0, 0.0 range, 1s cooldown
Phoenixfire
The Mighty Phoenix attacks up to 4 targets at once. If there are less creeps than attacks, the remaining attacks will hit the main target. The armor of attacked creeps melts, reducing it by 0.7 for 5 seconds. This buff is stackable.

Level Bonus:
+0.02 armor reduction
+1 target at level 15
Download

Toggle Triggers

Autocast

caster_art: AUTOCAST_cooldown: 1 AUTOCAST_numBuffsBeforeIdle: 0 AUTOCAST_isExtended: false AUTOCAST_autocastType: AC_TYPE_NOAC_IMMEDIATE AUTOCAST_manacost: 0 AUTOCAST_range: 0.0 AUTOCAST_buffType: 0 AUTOCAST_targetSelf: true AUTOCAST_targetType: 0 target_art: AUTOCAST_autoRange: 0.0
private function onAutocast takes Tower tower returns nothing
    local Buff b
    local Iterate it = Iterate.overUnitsInRangeOfCaster(tower, TARGET_TYPE_CREEPS, 3000.0)
    local Unit u
    loop
        set u = it.next()
        exitwhen u == 0
        set b = u.getBuffOfType(tomy_PhoenixFireBuff)
        if b != 0 then
            call b.removeBuff()
        endif
    endloop
endfunction

Header

    globals
        //@import
        ProjectileType tomy_PhoenixPT
        //@import
        BuffType tomy_PhoenixFireBuff
    endglobals
    
    //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: 1.0 ONATTACK_chanceLevelAdd: 0.0
function onAttack takes Tower tower returns nothing
    local integer attacks = 3
    local boolean add = false
    local Unit maintarget = Event.getTarget()
    local Unit target
    local Iterate it = Iterate.overUnitsInRangeOfUnit(tower,TARGET_TYPE_CREEPS,maintarget,450)
    local real sidearc = 0.20
    local boolean itDestroyed = false
 
    if tower.getLevel() >= 15 then
        set attacks = attacks + 1
    endif
 
    loop
        exitwhen attacks == 0 // Exit when all attacks are fired
        
        // If the Iterate is not destroyed, get the next target
        if not itDestroyed then
            set target = it.next()
        
            // If there are no more targets
            if target == 0 then
                set itDestroyed = true // Iterate is destroyed (auto destroy)
                set target = maintarget // target is the maintarget now
            endif
        endif
  
        // If there are no more units, shoot at the maintarget (itDestroyed). If there are units then don't shoot at the maintarget
        if itDestroyed or target != maintarget then
            call Projectile.createBezierInterpolationFromUnitToUnit(tomy_PhoenixPT,tower,0,0,tower,target,0,sidearc,0,true).setScale(0.40)
            set attacks = attacks - 1
            set sidearc = -sidearc
            if add then
                set sidearc = sidearc + 0.20
            endif
            set add = not add
        endif

    endloop
 
    // If the Iterate is not destroyed yet, destroy it
    if not itDestroyed then
        call it.destroy()
    endif  
endfunction

On Damage

ONDAMAGE_chance: 1.0 ONDAMAGE_chanceLevelAdd: 0.0
function onDamage takes Tower tower returns nothing
    local Unit target = Event.getTarget()
    local Buff b = target.getBuffOfType(tomy_PhoenixFireBuff)
    local integer level = tower.getLevel()
    local real armorLoss = 0.70 + 0.02 * level
        
    if b != 0 then
        call tomy_PhoenixFireBuff.apply(tower, target, b.getPower() + R2I(armorLoss * 100.0))
    else
        call tomy_PhoenixFireBuff.apply(tower, target, R2I(armorLoss * 100.0))
    endif
 
endfunction

On Tower Creation

function onCreate takes Tower tower returns nothing
    set tower.userInt = 3 // Save the family member (1 = first member)
    set tower.userInt2 = 0 // Used to save the buff (double linked list)
    call AddUnitAnimationProperties(tower.getUnit(), "stand alternate", false)
endfunction