Frozen Well v1
1600
ID:
100
Family ID:
Author:
Boekie
Rarity:
unique
Element:
ice
Attack Type:
Energy
Attack Range:
925
Attack CD:
2
Damage:
1261-1261
Status:
Approved

Description:

This frozen well emits an enormous amount of cold.
Specials:
Splash attack:
   150 AoE: 100% damage
   625 AoE: 20% damage
Freezing Mist
When this tower damages a creep it will be slowed by 15% for 10 seconds.

Level Bonus:
+0.4% slow
Flowing Frost - Aura
Increases the buff duration of towers in 500 range by 25%.

Level Bonus:
+0.4% buff duration
Download

Toggle Triggers

Header

    globals
    BuffType boekie_buff_aura 
    BuffType boekie_freezingMist 
    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
    local Modifier m = Modifier.create() 
    local Modifier slow=Modifier.create()
    
    set boekie_buff_aura = BuffType.createAuraEffectType(true) 
    call m.addModification(MOD_BUFF_DURATION,0.25,0.004) // apply custom  
    call boekie_buff_aura.setBuffModifier(m) 
    call boekie_buff_aura.setStackingGroup("boekie_buff_aura") 
    call boekie_buff_aura.setBuffIcon('@@0@@') 
    
     
    call slow.addModification(MOD_MOVESPEED,0,-0.001) 
    set boekie_freezingMist=BuffType.create(0,0,false)  
    call boekie_freezingMist.setBuffIcon('@@1@@')  
    call boekie_freezingMist.setBuffModifier(slow)  
    call boekie_freezingMist.setStackingGroup("boekie_freezingMist") 
    endfunction

On Damage

ONDAMAGE_chance: 1.0 ONDAMAGE_chanceLevelAdd: 0.0
function onDamage takes Tower tower returns nothing
call boekie_freezingMist.applyCustomTimed(tower,Event.getTarget(), 150+(tower.getLevel()*4), 10) 
endfunction

Tower Aura

AURA_auraEffect: boekie_buff_aura AURA_power: 0 AURA_level: 0 AURA_auraRange: 500 AURA_targetType: TARGET_TYPE_TOWERS AURA_levelAdd: 1 AURA_powerAdd: 1 AURA_targetSelf: true
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

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 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
Black Dragon Roost v2
1600
ID:
223
Family ID:
Author:
cedi
Rarity:
unique
Element:
darkness
Attack Type:
Essence
Attack Range:
800
Attack CD:
2
Damage:
1501-1501
Status:
Approved

Description:

It's said that the black dragons are the reaper's mounts.
Fear the Dark
Whenever this tower damages a creep it has a 20% chance to debuff it for 7 seconds. Debuffed creeps take 30% more damage. Each creep in 500 range decreases the effect by 25%, creeps with this buff don't count. The effect on bosses is 50% weaker.

Level Bonus:
+0.4% chance
+0.28 seconds duration
1.2% more damage taken
Download

Toggle Triggers

Header

            globals
        BuffType BT
    endglobals
    
    function startA takes Buff B returns nothing
        local Unit U = B.getBuffedUnit() 
        local unit u = U.getUnit() 
        
        call SetUnitVertexColor( u, 125, 125, 125, 255 )
        set u = null
    endfunction
    
    function clean takes Buff B returns nothing
        local Unit U = B.getBuffedUnit() 
        local unit u = U.getUnit() 
        
        call SetUnitVertexColor( u, 255, 255, 255, 255 )
        set u = null
    endfunction
    
    function dmg takes Buff B returns nothing
        local Tower C = B.getCaster()
        local Unit T = B.getBuffedUnit()
        local real r = C.getLevel() * 0.012 + 0.30
        local Iterate I = Iterate.overUnitsInRangeOfUnit( C, TARGET_CREEPS, T, 500.00 )
        local Unit U
        
        if T.getSize() >= SIZE_BOSS then
            set r = r / 2.00
        endif
        
        loop
            set U = I.next()
            exitwhen U == 0
            if U.getBuffOfType( BT ) != 0 then
                set r = r * 0.75
            endif
        endloop
        
        set Event.damage = Event.damage * ( 1.00 + r )
    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 BT = BuffType.create( 7.0, 0.28, false )
        call BT.setBuffIcon( '@@0@@' )
        call BT.addEventOnCreate( startA )
        call BT.addEventOnCleanup( clean )
        call BT.addEventOnDamage( dmg, 1.00, 0.00 )
    endfunction
        

On Damage

ONDAMAGE_chance: 0.2 ONDAMAGE_chanceLevelAdd: 0.004
function onDamage takes Tower tower returns nothing
            
call BT.apply( tower, Event.getTarget(), tower.getLevel() )
        
endfunction
Magnataur Spirit Hunter v1
1600
ID:
238
Family ID:
Author:
drol/i_mOck_death
Rarity:
uncommon
Element:
ice
Attack Type:
Elemental
Attack Range:
900
Attack CD:
1.7
Damage:
2501-2512
Status:
Approved

Description:

Roaming on the Frozen Wastes, the Magnataur Spirit Hunter seeks new challenges to beat.
Frozen Spears
Has a 13% chance to deal 50% more damage and stun the target for 0.5 seconds.

Level Bonus:
+4% damage
+0.01 seconds
Download

Toggle Triggers

On Damage

ONDAMAGE_chance: .13 ONDAMAGE_chanceLevelAdd: 0.0
function onDamage takes Tower tower returns nothing
    local Unit creep = Event.getTarget()
    local real level = tower.getLevel()
    if Event.isMainTarget() == true then
        set Event.damage = Event.damage*(1.5+(.04*level))
        call SFXAtUnit("Objects\\Spawnmodels\\Critters\\Albatross\\CritterBloodAlbatross.mdl", creep.getUnit())
        call cb_stun.applyOnlyTimed(tower, creep, 0.5+tower.getLevel()*0.01)
        call tower.getOwner().displaySmallFloatingText(I2S(R2I(Event.damage)),tower,255,150,150,0)
    endif
endfunction
Daemonic Tombstone v1
1600
ID:
333
Family ID:
Author:
geX
Rarity:
common
Element:
darkness
Attack Type:
Decay
Attack Range:
1050
Attack CD:
1.8
Damage:
1585-1935
Status:
Approved

Description:

Basic tower with a small chance on attack to kill lesser targets immediately.
Tomb's Curse
This tower has a 1.6% chance on attack to kill a non boss, non champion target immediately.

Level Bonus:
 +0.24% chance
Download

Toggle Triggers

On Damage

ONDAMAGE_chance: 0.016 ONDAMAGE_chanceLevelAdd: 0.0024
function onDamage takes Tower tower returns nothing
            
local Unit creep = Event.getTarget()
    local integer size = creep.getSize()
    if size < SIZE_CHAMPION then  // removed or size == SIZE_AIR
        call tower.killInstantly(creep)
        call SFXAtUnit("Abilities\\Spells\\Undead\\DeathCoil\\DeathCoilSpecialArt.mdl",creep.getUnit())       
    endif
        
endfunction
Firestorm Generator v1
1600
ID:
422
Family ID:
Author:
Ashbringer
Rarity:
uncommon
Element:
fire
Attack Type:
Magic
Attack Range:
900
Attack CD:
1.3
Damage:
850-850
Status:
Approved

Description:

A device created to unleash fiery explosions.
Firestorm
Attacks have a 20% chance to apply 3 charges of Firestorm to the target. Each second, a charge will be spent, dealing 800 spell damage to enemies in 300 range. If the target already has charges, the charges will accumulate and a charge will be consumed instantly. On death all remaining firestorm charges get consumed at once.

Level Bonus:
+0.6% chance
+35 damage
Download

Toggle Triggers

Header

    globals
        BuffType ashbringer_firestorm_buff
    endglobals
    
    function ashbringer_firestorm_damage takes Tower tower, Unit creep returns nothing
        call tower.doSpellDamageAoEUnit(creep, 300, 800 + (35 * tower.getLevel()), tower.calcSpellCritNoBonus(), 0.0) 
        call Effect.createScaled("Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl", creep.getX(), creep.getY(), 0, 0, 0.4).destroy()
    endfunction
    
    function ashbringer_firestorm_periodic takes Buff b returns nothing
        local Tower tower = b.getCaster()
        local Unit target = b.getBuffedUnit()
        set b.userInt = b.userInt - 1
        if b.userInt <= 0 then
            call b.removeBuff() //need to do it in this order, because the damage can kill the buff carrier, and removing buff after the carrier is dead causes double free
        endif
        call ashbringer_firestorm_damage(tower, target)
    endfunction 
    
    function ashbringer_firestorm_setint takes Buff b returns nothing        
        set b.userInt = b.getPower()
    endfunction
    
    
    function firestorm takes Buff b returns nothing 
        local Tower tower = b.getCaster() 
        local Creep creep = b.getBuffedUnit() 
        call Effect.createScaled("Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl", creep.getX(), creep.getY(), 0, 0, 1.0).destroy()
        call tower.doSpellDamageAoEUnit(creep, 300, b.getPower()* (800 + (35 * tower.getLevel())), tower.calcSpellCritNoBonus(), 0.0) 
    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 ashbringer_firestorm_buff = BuffType.create(1000,0,false) 
        call ashbringer_firestorm_buff.setBuffIcon('@@0@@')  
        call ashbringer_firestorm_buff.addEventOnCreate(EventHandler.ashbringer_firestorm_setint)
        call ashbringer_firestorm_buff.addPeriodicEvent(EventHandler.ashbringer_firestorm_periodic,1)
        call ashbringer_firestorm_buff.addEventOnDeath(EventHandler.firestorm)
    endfunction

On Attack

ONATTACK_chance: 0.2 ONATTACK_chanceLevelAdd: 0.006
function onAttack takes Tower tower returns nothing
    local Unit creep = Event.getTarget()
    local Buff b
    local integer i
    set b = creep.getBuffOfType(ashbringer_firestorm_buff)
    if ( b != 0 ) then
        call ashbringer_firestorm_damage(tower, creep)
        set i = b.getPower() + 2
        call b.setPower(i)
        set b.userInt = i
    else
        set i = 3
        call ashbringer_firestorm_buff.applyCustomPower(tower, creep, i, i)
    endif
endfunction
Doctorated Teacher v1
1600
ID:
431
Family ID:
Author:
Deikorim / limfa
Rarity:
uncommon
Element:
astral
Attack Type:
Elemental
Attack Range:
900
Attack CD:
1.5
Damage:
2016-2020
Status:
Approved

Description:

Teacher teaches you to attack!
Specials:
+70% exp gain
Knowledge
When the teacher attacks there's a 10% chance a random tower in 600 range will learn from her, gaining 2 experience. 

Level Bonus:
+0.6% chance
Download

Toggle Triggers

Header

    globals
        //@import
        ProjectileType knowledge_green
        //@import
        ProjectileType knowledge_blue
        //@import
        ProjectileType knowledge_red
        //@import
        MultiboardValues limfa_teacherboard
    endglobals
    //@import
    function teacher_attack takes Tower t, real xp returns nothing
    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: 1.0 ONATTACK_chanceLevelAdd: 0.0
function onAttack takes Tower tower returns nothing
    call teacher_attack(tower,2)
    call SetUnitAnimationByIndex(tower.getUnit(), 3)
endfunction

On Tower Creation

function onCreate takes Tower tower returns nothing
    local Tower preceding = Event.getPrecedingTower()
    if (preceding.getFamily() == tower.getFamily()) then
        set tower.userReal2 = preceding.userReal2
    else
        set tower.userReal2 = 0
    endif
endfunction

On Tower Details

goldcost: 0
function onTowerDetails takes Tower tower returns MultiboardValues
    call limfa_teacherboard.setValue(0, formatFloat(tower.userReal2,1))
    return limfa_teacherboard
endfunction