Snow Stalker v1
700
ID:
104
Family ID:
Author:
drol
Rarity:
uncommon
Element:
ice
Attack Type:
Magic
Attack Range:
850
Attack CD:
1.3
Damage:
541-620
Mana:
12
Mana regen:
1
Status:
Approved

Description:

These giant creatures wander the dry tundras of the world.
Specials:
+4% mana regen/lvl
Ice Claw
Ravages a target creep in 850 range, causing it to suffer 200 spell damage per second and be slowed by 30%. Effect lasts 5 seconds.

Level Bonus:
+8 spell damage per second
+0.2 second duration

AC_TYPE_OFFENSIVE_UNIT
 10, 850 range, 2s cooldown
Frenzy
Each time Ice Claw is cast, attackspeed is increased by 0.5% permanently. This has a maximum of 125% attack speed increase.
Download

Toggle Triggers

Autocast

caster_art: AUTOCAST_cooldown: 2 AUTOCAST_numBuffsBeforeIdle: 1 AUTOCAST_isExtended: false AUTOCAST_autocastType: AC_TYPE_OFFENSIVE_UNIT AUTOCAST_manacost: 10 AUTOCAST_range: 850 AUTOCAST_buffType: drol_tundraStalker AUTOCAST_targetSelf: false AUTOCAST_targetType: TARGET_TYPE_CREEPS target_art: AUTOCAST_autoRange: 850
private function onAutocast takes Tower tower returns nothing
    if tower.userReal < 1.25 then
        set tower.userReal = tower.userReal + 0.005
        call tower.modifyProperty(MOD_ATTACKSPEED, 0.005)
    endif
    
    call SFXAtUnit("Abilities\\Spells\\Other\\FrostBolt\\FrostBoltMissile.mdl", Event.getTarget().getUnit())
    call SetUnitVertexColor( Event.getTarget().getUnit(), 100, 100, 255, 255 )
    set drol_tundraStalker.applyCustomTimed(tower, Event.getTarget(), 2, 5. + 0.2 * tower.getLevel()).userReal = 200. + 8. * tower.getLevel()
endfunction

Header

    globals
        //@import
        BuffType drol_tundraStalker
        //@import
        MultiboardValues drol_tundraStalkerValues
    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 Tower Creation

function onCreate takes Tower tower returns nothing
    local Tower preceding = Event.getPrecedingTower()  

    if preceding.getFamily() == tower.getFamily() then  
        set tower.userReal = preceding.userReal  
        call tower.modifyProperty(MOD_ATTACKSPEED, preceding.userReal )  
    else  
        set tower.userReal = 0.
    endif
endfunction

On Tower Details

goldcost: 0
function onTowerDetails takes Tower tower returns MultiboardValues
    call drol_tundraStalkerValues.setValue(0, I2S(R2I(tower.userReal * 100)) + "%")
    return drol_tundraStalkerValues
endfunction
Little Phoenix v1
700
ID:
147
Family ID:
Author:
Der_kleine_Tomy
Rarity:
rare
Element:
fire
Attack Type:
Elemental
Attack Range:
850
Attack CD:
2.5
Damage:
832-832
Status:
Approved

Description:

A little 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 100 elemental damage per armor point the creep is missing in 200 range around its target. Additionally the target regains only 70% of its armor. Creeps further away recieve less damage. This ability can be cast to make Phoenixfire expire immediately.

Level Bonus:
-1% armor regain

AC_TYPE_NOAC_IMMEDIATE
 0, 0.0 range, 1.0s cooldown
Phoenixfire
The Little Phoenix attacks up to 2 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.5 for 5 seconds. This buff is stackable.

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

Toggle Triggers

Autocast

AUTOCAST_cooldown: 1.0 AUTOCAST_autoRange: 0.0 AUTOCAST_manacost: 0 AUTOCAST_range: 0.0 AUTOCAST_targetType: 0 AUTOCAST_numBuffsBeforeIdle: 0 caster_art: target_art: AUTOCAST_autocastType: AC_TYPE_NOAC_IMMEDIATE AUTOCAST_buffType: 0 AUTOCAST_isExtended: false AUTOCAST_targetSelf: true
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
        //@export
        ProjectileType tomy_PhoenixPT
        //@export
        BuffType tomy_PhoenixFireBuff
        boolean purged = false
    endglobals
    
    function tomy_PhoenixAttackHit takes Projectile p, Unit target returns nothing
        local Tower tower = p.getCaster()
        local Buff b = target.getBuffOfType(tomy_PhoenixFireBuff)
        local integer familyMember = tower.userInt
        local integer level = tower.getLevel()
        local real armorLoss
        
        if familyMember == 1 then
            set armorLoss = 0.50 + 0.01 * level
        elseif familyMember == 2 then
            set armorLoss = 0.60 + 0.015 * level
        elseif familyMember == 3 then
            set armorLoss = 0.70 + 0.020 * level
        endif
        
        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
        call tower.doAttackDamage(target,tower.getCurrentAttackDamageWithBonus(),tower.calcAttackMulticrit(0,0,0))
        
    endfunction
    
    function tomy_PhoenixFireBuffPurged takes Buff b returns nothing
        set purged = true
    endfunction
    
    function tomy_PhoenixFireBuffExpired takes Buff b returns nothing
        local integer power = b.getPower()
        local Unit target = b.getBuffedUnit()
        local Tower tower = b.getCaster()
        local integer level = tower.getLevel()
        local integer familyMember = tower.userInt
        local real damagePerPower // 100 power = -1.00 armor
        local real armorRegainFactor
        local real damageMultiplier = tower.getCurrentAttackDamageWithBonus() / tower.getBaseDamage()
        
        if familyMember == 1 then
            set damagePerPower = 1.0
            set armorRegainFactor = 0.70 - 0.01 * level
        elseif familyMember == 2 then
            set damagePerPower = 2.6
            set armorRegainFactor = 0.60 - 0.015 * level
        elseif familyMember == 3 then
            set damagePerPower = 4.4
            set armorRegainFactor = 0.50 - 0.020 * level
        endif
        
        if not purged then
            set damagePerPower = damagePerPower * damageMultiplier
            call tower.doAttackDamageAoEUnit(target, 200.0 , power * damagePerPower, tower.calcAttackMulticrit(0,0,0),0.5)
            call SFXAtUnit("Abilities\\Spells\\Other\\Incinerate\\FireLordDeathExplode.mdl", target.getUnit())
        endif
        call target.modifyProperty(MOD_ARMOR, -power / 100.0 * (1 - armorRegainFactor))
        set purged = false
    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()
         call m.addModification(MOD_ARMOR,0,-0.01)
         set tomy_PhoenixPT = ProjectileType.createInterpolate("Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missile.mdl",800)
         call tomy_PhoenixPT.setEventOnInterpolationFinished(ProjectileTargetEvent.tomy_PhoenixAttackHit)
         set tomy_PhoenixFireBuff = BuffType.create(5.0,0,false)
         call tomy_PhoenixFireBuff.setBuffIcon('@@0@@')
         call tomy_PhoenixFireBuff.setBuffModifier(m)
         call tomy_PhoenixFireBuff.addEventOnCleanup(EventHandler.tomy_PhoenixFireBuffExpired)
         call tomy_PhoenixFireBuff.setEventOnPurge(EventHandler.tomy_PhoenixFireBuffPurged)
    endfunction

On Attack

ONATTACK_chance: 1.0 ONATTACK_chanceLevelAdd: 0.0
function onAttack takes Tower tower returns nothing
    local integer attacks = 1
    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.50 + 0.01 * 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 = 1 // 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
Burning Torch v1
700
ID:
228
Family ID:
Author:
Boekie
Rarity:
common
Element:
fire
Attack Type:
Elemental
Attack Range:
900
Attack CD:
0.9
Damage:
484-484
Mana:
35
Mana regen:
2
Status:
Approved

Description:

This tower uses magical flames to strike multiple targets.
Fire Blast
Releases a blast of fire that strikes all targets in 200 AoE around the main target for 600 damage. 

Level Bonus:
+30 damage.

AC_TYPE_OFFENSIVE_UNIT
 20, 900 range, 1s cooldown
Download

Toggle Triggers

Autocast

caster_art: AUTOCAST_cooldown: 1 AUTOCAST_numBuffsBeforeIdle: 0 AUTOCAST_isExtended: false AUTOCAST_autocastType: AC_TYPE_OFFENSIVE_UNIT AUTOCAST_manacost: 20 AUTOCAST_range: 900 AUTOCAST_buffType: 0 AUTOCAST_targetSelf: false AUTOCAST_targetType: 0 target_art: AUTOCAST_autoRange: 900
private function onAutocast takes Tower tower returns nothing
call SFXAtUnit("Abilities\\Spells\\Other\\Incinerate\\FireLordDeathExplode.mdl",Event.getTarget().getUnit())  
call tower.doSpellDamageAoEUnit(Event.getTarget(), 200, 600 + tower.getLevel() * 60, tower.calcSpellCritNoBonus(), 0.0) 
endfunction
Lightning Rod v1
700
ID:
233
Family ID:
Author:
Boekie
Rarity:
common
Element:
storm
Attack Type:
Energy
Attack Range:
1200
Attack CD:
1.2
Damage:
548-567
Mana:
35
Mana regen:
2
Status:
Approved

Description:

A storm tower that releases a magic lighting bolt.
Release Lightning
This tower releases a lightning bolt that strikes the target for 700 damage. 

Level Bonus:
+35 damage.

AC_TYPE_OFFENSIVE_UNIT
 20, 1200 range, 1s cooldown
Download

Toggle Triggers

Autocast

caster_art: AUTOCAST_cooldown: 1 AUTOCAST_numBuffsBeforeIdle: 0 AUTOCAST_isExtended: false AUTOCAST_autocastType: AC_TYPE_OFFENSIVE_UNIT AUTOCAST_manacost: 20 AUTOCAST_range: 1200 AUTOCAST_buffType: 0 AUTOCAST_targetSelf: false AUTOCAST_targetType: 0 target_art: AUTOCAST_autoRange: 1200
private function onAutocast takes Tower tower returns nothing
local Unit creep = Event.getTarget() 
call tower.doSpellDamage(creep,700.0+(tower.getLevel()*35.0),tower.calcSpellCritNoBonus()) 
call SFXOnUnit("Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl",creep.getUnit(),"origin") 
endfunction
Magnataur Destroyer v1
700
ID:
237
Family ID:
Author:
drol/mOck
Rarity:
uncommon
Element:
ice
Attack Type:
Elemental
Attack Range:
900
Attack CD:
1.7
Damage:
1111-1122
Status:
Approved

Description:

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

Level Bonus:
+3% damage
+0.01 seconds
Download

Toggle Triggers

On Damage

ONDAMAGE_chance: .12 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+(.03*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
Furbolg v1
700
ID:
240
Family ID:
Author:
geX
Rarity:
uncommon
Element:
nature
Attack Type:
Physical
Attack Range:
900
Attack CD:
2
Damage:
685-1385
Status:
Approved

Description:

A friendly creature as long as you don't make it angry. Unfortunately it gets angry pretty fast.
Specials:
+20% dmg to orcs
Rampage
Has a 14% chance on attack to go into a rampage for 4.0 seconds. While in rampage, it has +150% attackspeed, +25% critical strike chance and +75% critical strike damage. Cannot retrigger while in rampage!

Level Bonus:
+0.08 sec duration
+2% attackspeed
+1 multicrit at lvl 15 and 25
Download

Toggle Triggers

Header

    globals
        //@export
        BuffType gex_rage_buff
        //@export
        BuffType gex_rage_buff15
        //@export
        BuffType gex_rage_buff25
    endglobals
    
    private function init takes nothing returns nothing
        local Modifier m = Modifier.create()
        call m.addModification(MOD_ATTACKSPEED,1.5,0.01)
        call m.addModification(MOD_ATK_CRIT_CHANCE,0.25,0.0)
        call m.addModification(MOD_ATK_CRIT_DAMAGE,0.75,0.0)
        set gex_rage_buff = BuffType.create(0.0,0.0,true) //0.0 time since I will apply it custom timed
        call gex_rage_buff.setBuffModifier(m)
        call gex_rage_buff.setBuffIcon('@@0@@')
        call gex_rage_buff.setStackingGroup("gex_rage")
        
        //level 15
        set m = Modifier.create()
        call m.addModification(MOD_ATTACKSPEED,1.5,0.01)
        call m.addModification(MOD_ATK_CRIT_CHANCE,0.25,0.0)
        call m.addModification(MOD_ATK_CRIT_DAMAGE,0.75,0.0)
        call m.addModification(MOD_MULTICRIT_COUNT,1.0,0.0) //1x multicrit
        set gex_rage_buff15 = BuffType.create(0.0,0.0,true) 
        call gex_rage_buff15.setBuffModifier(m)
        call gex_rage_buff15.setBuffIcon('@@0@@')
        call gex_rage_buff15.setStackingGroup("gex_rage")
        
        //level 25        
        set m = Modifier.create()
        call m.addModification(MOD_ATTACKSPEED,1.5,0.01)
        call m.addModification(MOD_ATK_CRIT_CHANCE,0.25,0.0)
        call m.addModification(MOD_ATK_CRIT_DAMAGE,0.75,0.0)
        call m.addModification(MOD_MULTICRIT_COUNT,2.0,0.0) //2x multicrit
        set gex_rage_buff25 = BuffType.create(0.0,0.0,true)
        call gex_rage_buff25.setBuffModifier(m)
        call gex_rage_buff25.setBuffIcon('@@0@@')
        call gex_rage_buff25.setStackingGroup("gex_rage")
    endfunction

On Attack

ONATTACK_chance: 0.14 ONATTACK_chanceLevelAdd: 0.0
function onAttack takes Tower tower returns nothing
    local integer lvl = tower.getLevel()    
    
    //Do not allow retriggering while the furbolg is raged
    if tower.getBuffOfGroup("gex_rage") == 0 then
        if lvl < 15 then
            call gex_rage_buff.applyCustomTimed(tower,tower,lvl*2,4.0+0.08*lvl)
        elseif lvl < 25 then
            call gex_rage_buff15.applyCustomTimed(tower,tower,lvl*2,4.0+0.08*lvl)
        else
            call gex_rage_buff25.applyCustomTimed(tower,tower,lvl*2,4.0+0.08*lvl)
        endif
    endif
endfunction
Hungry Frost Fire v1
700
ID:
366
Family ID:
Author:
IamanEvilMan
Rarity:
common
Element:
darkness
Attack Type:
Essence
Attack Range:
900
Attack CD:
0.9
Damage:
456-456
Mana:
35
Mana regen:
2
Status:
Approved

Description:

This tower uses mana to summon coldfire from the Frozen Heart of Hell for minor AoE damage and slowing effect. Stolen souls improve this ability with each tower level.
Specials:
-25% dmg to undead (+0.6%/lvl)
Soul Chill
Chills the souls of all creeps in 250 AoE of the target, dealing 550 spelldamage and slowing them by 8% for 4 seconds. 

Level Bonus:
+24 damage 
+0.6% slow 
+0.06 seconds duration

AC_TYPE_OFFENSIVE_UNIT
 20, 900 range, 1s cooldown
Download

Toggle Triggers

Autocast

AUTOCAST_cooldown: 1 AUTOCAST_autoRange: 900 AUTOCAST_manacost: 20 AUTOCAST_range: 900 AUTOCAST_targetType: 0 AUTOCAST_numBuffsBeforeIdle: 2 caster_art: target_art: Abilities\Spells\Undead\RaiseSkeletonWarrior\RaiseSkeleton.mdl AUTOCAST_autocastType: AC_TYPE_OFFENSIVE_UNIT AUTOCAST_buffType: soul_chill AUTOCAST_isExtended: false AUTOCAST_targetSelf: false
private function onAutocast takes Tower tower returns nothing
    local Unit targ = Event.getTarget()
    local Iterate it = Iterate.overUnitsInRangeOfUnit(tower,TARGET_CREEPS,targ,250)
    local Unit next

    local real calculated_slow = 80 + tower.getLevel() * 6
    local real duration = 4.0 + tower.getLevel() * 0.06
    local real spelldmg = 550 + tower.getLevel() * 24 
     
loop

    set next = it.next()
    exitwhen next == 0
    call soul_chill.applyCustomTimed(tower, next, R2I(calculated_slow), duration)
    call tower.doSpellDamage(next, spelldmg, tower.calcSpellCritNoBonus())

endloop

    call SFXAtUnit("Abilities\\Spells\\Undead\\RaiseSkeletonWarrior\\RaiseSkeleton.mdl", targ.getUnit())
endfunction

Header

globals
    //@import        
    BuffType soul_chill
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