Spare Part Heap v3
165
ID:
460
Family ID:
Author:
geX
Rarity:
common
Element:
iron
Attack Type:
Physical
Attack Range:
1000
Attack CD:
2.5
Damage:
398-458
Status:
Approved

Description:

Basic Tower with an increased chance to find items and some bonus damage against bosses.
Specials:
+10% dmg to bosses (+0.6%/lvl)
+20% item chance (+0.6%/lvl)
-20% item quality (-0.6%/lvl)
Download
Circle of Wind v1
170
ID:
313
Family ID:
Author:
SternBogen / Natac & girlfriend
Rarity:
uncommon
Element:
storm
Attack Type:
Physical
Attack Range:
1100
Attack CD:
1.4
Damage:
184-184
Status:
Approved

Description:

Strong gusts of wind often linger around these ruins.
Specials:
+70% dmg to air (+2%/lvl)
Wind of Death
On attack this tower has a 22% chance to catch a ground, non-boss unit in a cyclone for 0.6 seconds, dealing 68 physical damage to all units in 300 AoE when it falls back down. Falling champions deal 25% more damage. 

Level Bonus:
+7 damage
+0.4% chance to catch
Download

Toggle Triggers

Header

    globals
        //@import
        BuffType sternbogen_broken_wind
    endglobals
    
    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 Creep target = Event.getTarget()
    local real damage = 68 + 7 * tower.getLevel()
    local Buff b
    if (target.getSize() == SIZE_MASS or target.getSize() == SIZE_NORMAL or target.getSize() == SIZE_CHAMPION) then
        if(tower.calcChance(0.22 + (0.004 * tower.getLevel()))) then
            set b = target.getBuffOfType(sternbogen_broken_wind)
            if b != 0 then
                set damage = RMaxBJ(b.userReal3, damage)
            endif
            set b = sternbogen_broken_wind.applyCustomTimed(tower, target, tower.getLevel(), 0.6)
            if b != 0 then
                set b.userReal3 = damage
            endif
        endif
    endif 
endfunction
Pocket Rocket v1
170
ID:
545
Family ID:
Author:
Boekie
Rarity:
common
Element:
iron
Attack Type:
Decay
Attack Range:
700
Attack CD:
1.65
Damage:
249-270
Status:
Approved

Description:

This tower attacks with rockets that deal splash damage and deal extra damage to mass.
Specials:
Splash attack:
   125 AoE: 55% damage
+25% dmg to masses (+2%/lvl)
Download
Tundra Stalker v1
175
ID:
98
Family ID:
Author:
drol
Rarity:
uncommon
Element:
ice
Attack Type:
Magic
Attack Range:
850
Attack CD:
1.3
Damage:
136-155
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 50 spell damage per second and be slowed by 20%. Effect lasts 5 seconds.

Level Bonus:
+2 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 100% 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. 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(), 0, 5. + 0.2 * tower.getLevel()).userReal = 50. + 2. * tower.getLevel()
endfunction

Header

    globals
        //@export
        BuffType drol_tundraStalker
        //@export
        MultiboardValues drol_tundraStalkerValues
    endglobals
    
    //Debuff damage function
    function drol_f_tundraStalker takes Buff b returns nothing
        call b.getCaster().doSpellDamage(b.getBuffedUnit(), b.userReal, b.getCaster().calcSpellCritNoBonus())
    endfunction 
    
    //Color fade function
    function drol_fade_tundraStalker takes Buff b returns nothing
        call SetUnitVertexColor(b.getBuffedUnit().getUnit(), 255, 255, 255, 255)
    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_MOVESPEED, -0.2, -0.05 )
        
        set drol_tundraStalker = BuffType.create( 5., 0.2, false )
        call drol_tundraStalker.setBuffModifier(m)
        
        call drol_tundraStalker.setBuffIcon('@@0@@')
        call drol_tundraStalker.addPeriodicEvent( drol_f_tundraStalker, 1.)
        call drol_tundraStalker.addEventOnCleanup( drol_fade_tundraStalker )
        
        set drol_tundraStalkerValues = MultiboardValues.create(1)
        call drol_tundraStalkerValues.setKey(0, "Speed Bonus")
    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
Medium Fire Sprayer v1
180
ID:
18
Family ID:
Author:
Cyony
Rarity:
common
Element:
fire
Attack Type:
Elemental
Attack Range:
750
Attack CD:
0.5
Damage:
109-109
Status:
Approved

Description:

A medium sized, high rate of fire tower
Specials:
+3% attackspeed/lvl
Spray and Pray
Each attack of this tower has a 33% chance to miss the target.

Level Bonus: 
-0.9% miss chance
Download

Toggle Triggers

On Damage

ONDAMAGE_chance: 1.0 ONDAMAGE_chanceLevelAdd: 0.0
function onDamage takes Tower tower returns nothing
    if tower.calcBadChance(0.33-0.009*tower.getLevel()) then
        set Event.damage = 0
        call tower.getOwner().displayFloatingTextX("Miss",tower,255, 0, 0,255,0.05,0.0,2.0)
    endif
endfunction
Lesser Elemental Ghost v1
180
ID:
134
Family ID:
Author:
Der_kleine_Tomy
Rarity:
uncommon
Element:
fire
Attack Type:
Essence
Attack Range:
950
Attack CD:
2
Damage:
329-329
Status:
Approved

Description:

A mysterious Ghost, which deals different damage types.
Specials:
+0.5% trigger chances/lvl
Elemental Wrath
The Elemental Ghost has a 15% chance to unleash it's wrath on attack, increasing its trigger chance by 15% for 5 seconds. Cannot retrigger during Elemental Wrath.

Level Bonus:
+0.1 seconds duration
+0.5% trigger chance increase
Mimic
The Ghost's attacks are varied, and its damage type will either be good or bad against its target. Trigger chance adjusts the good/bad attacks to be better.
Download

Toggle Triggers

Header

    globals
        //@export
        BuffType tomy_ElementalWrath
    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 modifier = Modifier.create()
        call modifier.addModification(MOD_TRIGGER_CHANCES, 0.00, 0.001)
        set tomy_ElementalWrath = BuffType.create(5.0, 0.00, true)
        call tomy_ElementalWrath.setBuffIcon('@@0@@')
        call tomy_ElementalWrath.setBuffModifier(modifier)
    endfunction

On Attack

ONATTACK_chance: 0.15 ONATTACK_chanceLevelAdd: 0.0
function onAttack takes Tower tower returns nothing
    if tower.getBuffOfType(tomy_ElementalWrath) == 0 then
        call tomy_ElementalWrath.applyCustomTimed(tower, tower, 150 + tower.getLevel() * 5, 5.0 + 0.1 * tower.getLevel())
    endif
endfunction

On Damage

ONDAMAGE_chance: 1.0 ONDAMAGE_chanceLevelAdd: 0.0
function onDamage takes Tower tower returns nothing
 
    local Creep target = Event.getTarget()
    local boolean immune = target.isImmune()
    local boolean sif = target.getArmorType() == ARMOR_SIF
    local boolean zod = target.getArmorType() == ARMOR_ZOD
    local integer level = tower.getLevel()
    local real damageadd
    local real posDamageTypes = 3
  
    if immune then
        set posDamageTypes = 2
    endif
  
    if GetRandomInt(1, 100) > 50 then
        if sif or zod then
            set damageadd = 1.00
        elseif tower.calcChance(1.00/posDamageTypes) then
            set damageadd = 1.80
        elseif not immune and tower.calcChance(1.00/(posDamageTypes - 1)) then
            set damageadd = 1.50
        else
            set damageadd = 1.20
        endif
    else
        if zod then
            set damageadd = 0.90
        elseif sif then
            if not immune or (immune and tower.calcChance(0.50)) then
                set damageadd = 0.40
            else
                set damageadd = 0.00
            endif
        elseif tower.calcChance(1.00/(6.00-posDamageTypes)) then
            set damageadd = 1.00
        elseif tower.calcChance(1.00/(6.00-(posDamageTypes + 1))) then
            set damageadd = 0.90
        elseif not immune or (immune and tower.calcChance(1.00/(6.00-(posDamageTypes + 2)))) then
            set damageadd = 0.60
        else
            set damageadd = 0.00
        endif
    endif
  
    set Event.damage = Event.damage * damageadd
    if damageadd > 1.00 then
        call tower.getOwner().displaySmallFloatingText(formatFloat(damageadd,2), tower, 0, 255, 0, 40)
    elseif damageadd < 1.00 then
        call tower.getOwner().displaySmallFloatingText(formatFloat(damageadd,2), tower, 255, 0, 0, 40)
    else
        call tower.getOwner().displaySmallFloatingText(formatFloat(damageadd,2), tower, 255, 255, 255, 40)
    endif
endfunction
Clever Teacher v1
180
ID:
428
Family ID:
Author:
Deikorim / Limfa
Rarity:
uncommon
Element:
astral
Attack Type:
Elemental
Attack Range:
900
Attack CD:
1.5
Damage:
225-229
Status:
Approved

Description:

Teacher teaches you to attack!
Specials:
+35% exp gain
Knowledge
When the teacher attacks there's a 10% chance a random tower in 600 range will learn from her, gaining 1.3 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,1.3)
    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