Shard of Souls v1
750
ID:
220
Family ID:
Author:
Der_kleine_Tomy
Rarity:
rare
Element:
darkness
Mana:
75
Mana regen:
4
Status:
Approved

Description:

This mystical crystal shard can link souls together.
Specials:
+2% buff duration/lvl
Soul Link
Links 3 enemies' souls together for 2.5 seconds. If a linked unit takes damage all other linked units will take 12.5% of this damage. This tower does not benefit from damage increasing items or oils.

Level Bonus:
+0.3% damage
+1 target at level 15 and 25

AC_TYPE_ALWAYS_BUFF
 50, 1000.0 range, 5.0s cooldown
Soul Consumption
Whenever a unit under the effect of Soul Link dies, the Shard of Souls consumes its soul granting 1 experience to the tower.
Download

Toggle Triggers

Autocast

caster_art: AUTOCAST_cooldown: 5.0 AUTOCAST_numBuffsBeforeIdle: 1 AUTOCAST_isExtended: false AUTOCAST_autocastType: AC_TYPE_ALWAYS_BUFF AUTOCAST_manacost: 50 AUTOCAST_range: 1000.0 AUTOCAST_buffType: tomy_SoulLink AUTOCAST_targetSelf: false AUTOCAST_targetType: TARGET_TYPE_CREEPS target_art: AUTOCAST_autoRange: 1000.0
private function onAutocast takes Tower tower returns nothing
    local Unit target = Event.getTarget()
    local integer level = tower.getLevel()
    local integer counter = 1
    local integer maxTargets = 3
    local Iterate iterator
    local Unit next
    local lightning array effects
    
    if level == 25 then
        set maxTargets = maxTargets + 2
    elseif level >= 15 then
        set maxTargets = maxTargets + 1
    endif
    
    set effects[0] = AddLightningEx("DRAL", false, tower.getX(), tower.getY(), tower.getZ(), target.getX(), target.getY(), target.getZ())
    if target.getBuffOfType(tomy_SoulLink) == 0 then
        call tomy_SoulLink.apply(tower, target, level)
    endif
    
    loop
        exitwhen counter == maxTargets
        set iterator = Iterate.overUnitsInRangeOfUnit(tower, TARGET_CREEPS, target, 600.0 )
        loop
            set next = iterator.next()
            exitwhen next == 0 or next.getBuffOfType(tomy_SoulLink) == 0
        endloop
        
        exitwhen next == 0
        
        if next != 0 then
            call iterator.destroy()
        endif
        
        call tomy_SoulLink.apply(tower, next, level)
        set effects[counter] = AddLightningEx("DRAL", false, GetUnitX(next.getUnit()), GetUnitY(next.getUnit()), GetUnitFlyHeight(next.getUnit()), GetUnitX(target.getUnit()), GetUnitY(target.getUnit()), GetUnitFlyHeight(target.getUnit()))
        set target = next
        set counter = counter + 1
    endloop
    
    call TriggerSleepAction(0.20)
    loop
        set counter = counter - 1
        exitwhen counter == -1
        call DestroyLightning(effects[counter])
        set effects[counter] = null // Not sure if this is needed
    endloop
    
endfunction

Header

    globals
        //@export
        BuffType tomy_SoulLink
        boolean tomy_isSoulLinkDamage
    endglobals
    
    function tomy_SoulLink_OnCreate takes Buff b returns nothing
        local Unit caster = b.getCaster()
        local Buff firstBuff = caster.userInt
        
        set caster.userInt = b // Points to first buff
        set b.userInt = 0
        
        // Link buffs (Double linked list)
        // b.userInt  = previousBuff
        // b.userInt2 = nextBuff
        if firstBuff == 0 then
            set b.userInt2 = 0
        else 
            set firstBuff.userInt = b
            set b.userInt2 = firstBuff
        endif
        
    endfunction
    
    function tomy_SoulLink_OnCleanup takes Buff b returns nothing
        local Buff nextBuff = b.userInt2
        local Buff prevBuff = b.userInt
        local Unit caster = b.getCaster()
        
        // Link the buffs in the linked list correctly (prev <-> next)
        if prevBuff == 0 then
            set caster.userInt = nextBuff
        else
            set prevBuff.userInt2 = nextBuff
        endif
        
        if nextBuff != 0 then
            set nextBuff.userInt = prevBuff
        endif
        
    endfunction
    
    function tomy_SoulLink_OnDamaged takes Buff b returns nothing
        local Tower damageSource = Event.getTarget()
        local Unit caster = b.getCaster()
        local real damage = Event.damage * (caster.userReal + caster.userReal2 * caster.getLevel())
        local Buff currentBuff
        
        // If the damage comes from Soul Link nothing will happen
        if tomy_isSoulLinkDamage then
            return
        endif
        
        set tomy_isSoulLinkDamage = true
        set currentBuff = caster.userInt
        loop
            exitwhen currentBuff == 0
            if currentBuff != b then // Don't deal extra damage to the damaged creep
                if Event.isSpellDamage() then
                    set damage = damage / damageSource.getProp_SpellDmgDealt() // prevent the damage from being increased twice by spell damage
                    call damageSource.doSpellDamage(currentBuff.getBuffedUnit(), damage, 1) 
                else
                    call damageSource.doAttackDamage(currentBuff.getBuffedUnit(), damage, 1) 
                endif
            endif
            set currentBuff = currentBuff.userInt2 // next buff
        endloop
        set tomy_isSoulLinkDamage = false
        
    endfunction
    
    function tomy_SoulLink_OnDeath takes Buff b returns nothing
        call b.getCaster().addExp(1.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 tomy_SoulLink = BuffType.create(2.5, 0, false)
        call tomy_SoulLink.addEventOnCreate(EventHandler.tomy_SoulLink_OnCreate)
        call tomy_SoulLink.addEventOnCleanup(EventHandler.tomy_SoulLink_OnCleanup)
        call tomy_SoulLink.addEventOnDeath(EventHandler.tomy_SoulLink_OnDeath)
        call tomy_SoulLink.addEventOnDamaged(EventHandler.tomy_SoulLink_OnDamaged, 100.0, 0.00)
        call tomy_SoulLink.setBuffIcon('@@0@@')
        
        set tomy_isSoulLinkDamage = false
    endfunction

On Tower Creation

function onCreate takes Tower tower returns nothing
    set tower.userInt = 0 // Linked List (points to the first buff)
    set tower.userReal = 0.125
    set tower.userReal2 = 0.003
endfunction
Militia Outpost v1
750
ID:
418
Family ID:
Author:
ShyGnome
Rarity:
uncommon
Element:
iron
Attack Type:
Physical
Attack Range:
850
Attack CD:
0.7
Damage:
213-213
Status:
Approved

Description:

Militia guardians rain axes at the heads of the enemies. However, they are not very accurate, and afraid of undead and large creeps.
Specials:
-20% dmg to bosses (+0.7%/lvl)
-20% dmg to undead (+0.5%/lvl)
+20% dmg to nature (+0.5%/lvl)
Hail of Axes
Militia guardians throw axes to up to 3 enemies at once, but each attack has 33% chance to miss.  If there are less creeps than attacks, the remaining axes will hit the main target.

Level Bonus:
-1.1% chance to miss
+1 target at levels 15 and 25
Download

Toggle Triggers

Header

   globals
      //@import
      ProjectileType MilitiaAxe
   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 = 2
    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

    if tower.getLevel() >= 25 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(MilitiaAxe,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
    if tower.calcBadChance(0.33-0.011*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

On Tower Creation

function onCreate takes Tower tower returns nothing
    set tower.userInt = 2 // Save the family member (1 = first member)
    set tower.userInt2 = 0 // Used to save the buff (double linked list)
endfunction
Storm Lantern v1
750
ID:
551
Family ID:
Author:
Boekie
Rarity:
uncommon
Element:
storm
Attack Type:
Energy
Attack Range:
1000
Attack CD:
1.3
Damage:
529-529
Status:
Approved

Description:

This tower is able to release a burst attack.
Burst Lightning
Has a 20% chance on attack to fire 3 extra projectiles at random creeps in 300 range around the main target. Each extra projectile deals the same amount of damage as a normal attack. 

Level Bonus:
+1% chance
+1 extra projectile at levels 15 and 25
Download

Toggle Triggers

Header

    globals
    endglobals
        
    //@import
    function newAttack takes Tower tower, integer numShots, Creep creep 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: 0.20 ONATTACK_chanceLevelAdd: 0.01
function onAttack takes Tower tower returns nothing
    local Creep creep = Event.getTarget()
    local integer numShots = 3
    local integer twrLevel = tower.getLevel()
    if twrLevel == 25 then
        set numShots = 5 
    elseif twrLevel >= 15 then
        set numShots = 4
    endif
    
    call newAttack(tower,numShots,creep)
    
endfunction
Cursed Grounds v1
750
ID:
564
Family ID:
Author:
drol
Rarity:
rare
Element:
darkness
Attack Type:
Decay
Attack Range:
775
Attack CD:
1
Damage:
280-324
Status:
Approved

Description:

Ripped open by a savage curse, this rock formation sprays spells on people not careful enough to stay away.
Specials:
Bounce attack:
   4 targets
   -30% damage per bounce
Cursed Attack
This tower has a 25% chance on damage to deal 200 additional spell damage and weaken the target for 4 seconds, reducing its movement speed by 20% and make it suffer 10% more damage from spells.

Level Bonus:
+1% chance
+10 spell damage
+0.1 sec slow duration
Mortal Coil - Aura
Grants 10% bonus damage against human, orc and nature creeps to all towers within 350 range.

Level Bonus:
+0.4% damage
Download

Toggle Triggers

Header

  globals 
    //@export
    BuffType drol_slow
    //@export
    BuffType drol_mortalAura
    
  endglobals
  
//The init function
private function init takes nothing returns nothing

    local Modifier slow = Modifier.create()
    local Modifier m = Modifier.create()
    
    call slow.addModification(MOD_MOVESPEED,0,-0.001)
    call slow.addModification(MOD_SPELL_DAMAGE_RECEIVED, 0, 0.0005)
    set drol_slow = BuffType.create(0,0,false) 
    call drol_slow.setBuffIcon('@@0@@')
    call drol_slow.setBuffModifier(slow) 
    call drol_slow.setStackingGroup("drol_slow1") 
    
    set drol_mortalAura = BuffType.createAuraEffectType(true)  
    call m.addModification(MOD_DMG_TO_HUMANOID,0.1,0.002)
    call m.addModification(MOD_DMG_TO_ORC,0.1,0.002) 
    call m.addModification(MOD_DMG_TO_NATURE,0.1,0.002) 
    call drol_mortalAura.setBuffModifier(m)  
    call drol_mortalAura.setStackingGroup("drol_mortalAura")  
    call drol_mortalAura.setBuffIcon('@@1@@')
    
endfunction

On Damage

ONDAMAGE_chance: .25 ONDAMAGE_chanceLevelAdd: 0.01
function onDamage takes Tower tower returns nothing
    local Unit creep = Event.getTarget()
    local integer lvl = tower.getLevel()
    
    if creep.isImmune() == false then
        call tower.doSpellDamage(creep,200*(1+lvl*0.05),tower.calcSpellCritNoBonus())
        call drol_slow.applyCustomTimed(tower,creep,R2I(0.2*1000),4+lvl*0.1)
        call SFXOnUnit("Abilities\\Spells\\Orc\\FeralSpirit\\feralspirittarget.mdl",creep.getUnit(),"origin")
    endif
    
endfunction

Tower Aura

AURA_powerAdd: 2 AURA_auraEffect: drol_mortalAura AURA_levelAdd: 2 AURA_power: 0 AURA_targetType: TARGET_TYPE_TOWERS AURA_targetSelf: true AURA_level: 0 AURA_auraRange: 350
Lava Geyser v1
750
ID:
573
Family ID:
Author:
drol
Rarity:
uncommon
Element:
fire
Attack Type:
Elemental
Attack Range:
1100
Attack CD:
1.8
Damage:
646-685
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 15% for 8 seconds.

Level Bonus:
+0.6% attack damage
+0.3% 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: 1.0 ONDAMAGE_chanceLevelAdd: 0.0
function onDamage takes Tower tower returns nothing
    set drol_fireDot.apply(tower,Event.getTarget(),tower.getLevel()*3 + 100).userReal = tower.getCurrentAttackDamageWithBonus() * (0.15 + tower.getLevel() * 0.006)
endfunction
Sun Crusader v1
750
ID:
666
Family ID:
Author:
cedi
Rarity:
rare
Element:
astral
Attack Type:
Physical
Attack Range:
750
Attack CD:
0.75
Damage:
176-176
Mana:
100
Mana regen:
0
Status:
Approved

Description:

The perfect soldiers against the undead.
Specials:
Attacks GROUND only
Bounce attack:
   5 targets
   -10% damage per bounce
+50% dmg to undead
+1 mana/lvl
For the God
This tower casts a buff on a friendly tower that increases attackdamage and experience gain by 40%. The buff lasts 8 seconds.

Level Bonus:
+0.1 seconds duration
+1% attack damage and experience gain

AC_TYPE_OFFENSIVE_BUFF
 10, 600 range, 4.00s cooldown
Blessed Weapon
Everytime this tower damages a creep it has a 15% chance to deal 500 spelldamage and gain 2 mana.

Level Bonus:
+50 damage
+0.1 mana regeneration
Download

Toggle Triggers

Autocast

caster_art: AUTOCAST_cooldown: 4.00 AUTOCAST_numBuffsBeforeIdle: 5 AUTOCAST_isExtended: false AUTOCAST_autocastType: AC_TYPE_OFFENSIVE_BUFF AUTOCAST_manacost: 10 AUTOCAST_range: 600 AUTOCAST_buffType: cedi_CrusaderBuff AUTOCAST_targetSelf: true AUTOCAST_targetType: TARGET_TYPE_TOWERS target_art: Abilities\Spells\Human\Resurrect\ResurrectCaster.mdl AUTOCAST_autoRange: 600
private function onAutocast takes Tower tower returns nothing

endfunction

Header

    globals
        BuffType cedi_CrusaderBuff
    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()
        set cedi_CrusaderBuff = BuffType.create( 8.00, 0.1, true )
        call cedi_CrusaderBuff.setBuffIcon( '@@0@@' )
        call m.addModification( MOD_DAMAGE_ADD_PERC, 0.40, 0.01 )
        call m.addModification( MOD_EXP_RECEIVED, 0.40, 0.01 )
        call cedi_CrusaderBuff.setBuffModifier( m )
        call cedi_CrusaderBuff.setStackingGroup( "cedi_Crusader" )
    endfunction

On Damage

ONDAMAGE_chance: 0.15 ONDAMAGE_chanceLevelAdd: 0.0
function onDamage takes Tower tower returns nothing
    call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Spells\\Human\\HolyBolt\\HolyBoltSpecialArt.mdl", Event.getTarget().getUnit(), "origin" ) )
    call tower.doSpellDamage( Event.getTarget(), 500.00 + I2R( tower.getLevel() ) * 50.00, tower.calcSpellCritNoBonus() )
    call SetUnitState( tower.getUnit(), UNIT_STATE_MANA, GetUnitState( tower.getUnit(), UNIT_STATE_MANA ) + 2.00 + ( 0.10 * I2R( tower.getLevel() ) ) )
endfunction
Grown Cactus v1
760
ID:
43
Family ID:
Author:
Lapsus
Rarity:
common
Element:
nature
Attack Type:
Essence
Attack Range:
820
Attack CD:
2.5
Damage:
1422-1422
Status:
Approved

Description:

A troublesome desert plant with a high AoE. Moderately more efficient against mass creeps and humans.
Specials:
Splash attack:
   320 AoE: 50% damage
+21% dmg to masses (+1.3%/lvl)
+21% dmg to humanoids (+1.3%/lvl)
Download