Superior Ice Defender v1
2500
ID:
506
Family ID:
Author:
Natac
Rarity:
common
Element:
ice
Attack Type:
Elemental
Attack Range:
900
Attack CD:
1.4
Damage:
3363-3613
Status:
Approved

Description:

Common elementar defender.
Download
Superior Astral Defender v1
2500
ID:
509
Family ID:
Author:
Natac
Rarity:
common
Element:
astral
Attack Type:
Energy
Attack Range:
850
Attack CD:
1.2
Damage:
2788-3213
Status:
Approved

Description:

Common elementar defender.
Download
Superior Iron Defender v1
2500
ID:
517
Family ID:
Author:
Natac
Rarity:
common
Element:
iron
Attack Type:
Physical
Attack Range:
800
Attack CD:
1
Damage:
2500-2500
Status:
Approved

Description:

Common elementar defender.
Download
Divine Priest v1
2500
ID:
600
Family ID:
Author:
Boekie
Rarity:
uncommon
Element:
astral
Attack Type:
Elemental
Attack Range:
1000
Attack CD:
2
Damage:
2179-2179
Status:
Approved

Description:

This holy priest is able to smite creeps. It's very weak at the start but becomes a lot stronger when it gains experience.
Specials:
+3% attackspeed/lvl
Smite
When this tower damages a creep it has 5% chance to smite it, dealing 380 spelldamage.

Level Bonus:
+2% chance
+684 spelldamage
-1.8 permanent armor reduction (-0.6 on bosses) at level 25
Download

Toggle Triggers

On Damage

ONDAMAGE_chance: 0.05 ONDAMAGE_chanceLevelAdd: 0.02
function onDamage takes Tower tower returns nothing
local Unit creep = Event.getTarget() 
local integer level = tower.getLevel()

call tower.doSpellDamage(creep,380.0+(level*684.0),tower.calcSpellCritNoBonus()) 
call SFXOnUnit("Abilities\\Spells\\Human\\HolyBolt\\HolyBoltSpecialArt.mdl",creep.getUnit(),"origin") 
if level == 25 then

    if creep.getSize() < SIZE_BOSS then  
        call creep.modifyProperty(MOD_ARMOR,  -1.8) 
    else  
        call creep.modifyProperty(MOD_ARMOR,  -0.6) 
    endif 
    
endif
endfunction
Steel Trap v1
2500
ID:
626
Family ID:
Author:
Boekie
Rarity:
uncommon
Element:
iron
Attack Type:
Physical
Attack Range:
950
Attack CD:
1.3
Damage:
1409-1409
Status:
Approved

Description:

This trap is used to capture beasts but it works on other stuff too.
Activate Trap
Every 11 seconds this tower traps 5 creeps in 950 range, dealing 2000 spelldamage and stunning them for 1.5 seconds.

Level Bonus:
+100 spelldamage 
-0.2 seconds cooldown
Download

Toggle Triggers

Header

    globals
    endglobals
    
    //@import
    function trap takes Tower tower, real cooldown, real baseDamage, real damageAdd, real stunDuration, integer maxTargets 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

Periodic

PERIODIC_period: 2
function periodic takes Tower tower returns nothing
    call trap(tower, 11, 2000, 100, 1.5, 5)
endfunction
Plagued Crypt v1
2500
ID:
645
Family ID:
Author:
cedi
Rarity:
unique
Element:
darkness
Attack Type:
Decay
Attack Range:
1150
Attack CD:
3
Damage:
3899-3916
Status:
Approved

Description:

The Plague Bringer is a siege engine mounted ontop of corrupted crypts using the corpses of the fallen as ammunition.
Specials:
Attacks GROUND only
Splash attack:
   25 AoE: 100% damage
   50 AoE: 40% damage
   150 AoE: 25% damage
Plague
When a creep is damaged by this tower it will become infected with a plague. This plague deals 750 damage per second and lasts 5 seconds. Every 1.5 seconds the plague can spread to a creep in 250 range around the infected creep. If an infected creep is infected again by the plague the duration will refresh and the damage is increased by 375.

Level Bonus:
+30 damage
+0.2 seconds duration
+15 damage per rebuff
Army of the Damned
Every 3 seconds, if there is a corpse within 1150 range this tower will extract its soul, increasing its attack speed and damage by 5% and Plague's rate of spread by 10%. This buff lasts 20 seconds and stacks, but new stacks will not refresh the duration of old ones.

Level Bonus:
+0.4 seconds duration
Download

Toggle Triggers

Header

    globals
        BuffType BT
        BuffType cedi_armyOfDamned
        MultiboardValues MB
    endglobals
    
    function periodicDamage takes Buff B returns nothing
        local Unit T = B.getBuffedUnit()
        local Unit C = B.getCaster()
        local integer level = C.getLevel()
        call C.doSpellDamage( T, (750.00 + level * 30.00) + (( 375.00 + 15.00 * level) * B.userInt ), C.calcSpellCritNoBonus() )
    endfunction
    
    function periodicSpread takes Buff B returns nothing
        local Tower C = B.getCaster()
        local Unit T = B.getBuffedUnit()
        local Unit U
        local integer level = C.getLevel()
        local Iterate I
        //spread
        if B.userInt2 == 1 then
            set I = Iterate.overUnitsInRangeOfUnit( C, TARGET_CREEPS, T, 250.00 )
            loop
                set U = I.nextRandom()
                exitwhen U == 0
                if U != T then
                    call BT.apply(C, U, level)
                    call I.destroy()
                    exitwhen true
                endif
            endloop
        else
            set B.userInt2 = 1
        endif
        
        set B = C.getBuffOfType( cedi_armyOfDamned )
        if B == 0 then
            call Event.getCurrentPeriodicEvent().enableAdvanced(1.5, false )
        else
            //call Event.getCurrentPeriodicEvent().enableAdvanced(1.5 * Pow( 0.9, B.getLevel()), false )  //this decreases time between spreads by 10%
            call Event.getCurrentPeriodicEvent().enableAdvanced(1.5 * Pow( 1.1, -B.getLevel()), false ) //this increases rate of spreading by 10%   (there is a difference)
        endif
    endfunction
    
    function refresh takes Buff B returns nothing
        set B.userInt = B.userInt + 1
    endfunction
        
    function onCreate takes Buff B returns nothing
        set B.userInt = 0      // Damage increase multiplier
        set B.userInt2 = 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
        local Modifier m = Modifier.create()
        set BT = BuffType.create( 5.00, 0.2, false )
        call BT.setBuffIcon( '@@0@@' )
        call BT.addPeriodicEvent( periodicDamage, 1 )
        call BT.addPeriodicEvent( periodicSpread, 0.01 )    //the periodic gets set in the periodic handling event
        call BT.setEventOnRefresh( refresh )
        call BT.setEventOnUpgrade( refresh )
        call BT.addEventOnCreate( onCreate)
        
        call m.addModification( MOD_ATTACKSPEED, 0.0, 0.05 )
        call m.addModification( MOD_DAMAGE_BASE_PERC, 0.0, 0.05 )
        set cedi_armyOfDamned = BuffType.create( -1, 0, true )
        call cedi_armyOfDamned.setBuffIcon( '@@1@@' )
        call cedi_armyOfDamned.setBuffModifier( m )
        
        set MB = MultiboardValues.create( 2 )
        call MB.setKey( 0, "Souls Extracted" )
        call MB.setKey( 1, "Infection Rate" )
    endfunction

On Damage

ONDAMAGE_chance: 1.0 ONDAMAGE_chanceLevelAdd: 0.0
function onDamage takes Tower tower returns nothing
    call BT.apply(tower, Event.getTarget(), tower.getLevel())
endfunction

On Tower Details

function onTowerDetails takes Tower tower returns MultiboardValues
    call MB.setValue( 0, I2S( tower.getBuffOfType( cedi_armyOfDamned ).getLevel() ) )
    call MB.setValue( 1, formatFloat( 1.5 * Pow( 1.1, -tower.getBuffOfType( cedi_armyOfDamned ).getLevel() ), 2 ) )
    return MB
endfunction

Periodic

PERIODIC_period: 3.0
function periodic takes Tower tower returns nothing
   local Iterate I = Iterate.overCorpsesInRange( tower, tower.getX(), tower.getY(), 1150.00 )
   local unit u = I.nextCorpse()
   local Buff B = tower.getBuffOfType(cedi_armyOfDamned)
   local integer UID
   if u != null then
      call I.destroy()
      call DestroyEffect( AddSpecialEffect("Abilities\\Spells\\Undead\\RaiseSkeletonWarrior\\RaiseSkeleton.mdl", GetUnitX(u), GetUnitY(u)))
      call RemoveUnit(u)
      set u = null
       
      if B != 0 then
         set B = cedi_armyOfDamned.apply(tower, tower, B.getLevel() + 1)
      else
         set B = cedi_armyOfDamned.apply(tower, tower, 1)      
      endif
       
      set UID = B.getUID()

      call TriggerSleepAction((20 + 0.4 * tower.getLevel()) * tower.getProp_BuffDuration())

      if B.getUID() == UID then
         call B.setLevel(B.getLevel()-1)
         if B.getLevel() == 0 then
            call B.removeBuff()
         endif
      endif
   endif
endfunction
Lich King v1
2500
ID:
649
Family ID:
Author:
Natac
Rarity:
unique
Element:
ice
Attack Type:
Elemental
Attack Range:
800
Attack CD:
1.4
Damage:
2197-2296
Status:
Approved

Description:

The frozen king of all ice and snow.
Icy Curse
Curses creeps it damages for 5 seconds, increasing their debuff duration by 30%.

Level Bonus:
+0.8% debuff duration
King's Authority - Aura
The Lich King rules over every creep in 900 range. Every creep leaving this range will be punished with 500 spelldamage for every second it was under this aura's effect.
If a creep dies in this area of authority, the spelldamage that didn't get dealt is stored. The next creep to then leave the Lich King's area will be punished with [stored damage x 0.5] spelldamage.

Level Bonus:
+20 damage per second
+[stored damage x 0.04] spelldamage
Download

Toggle Triggers

Header

    globals
        BuffType         natac_icyCurse_BuffType
        BuffType         natac_kingsPresent_Aura
        MultiboardValues natac_storedDamage_MuliboardValue
    endglobals
    
    function initAuraBuff takes Buff b returns nothing
        set b.userInt  = Game.getGameTime() // The time at which the buff was applied
        set b.userInt2 = b.getLevel()  // The max dps of this buff*
        set b.userInt3 = b.getCaster() // The king, ruling over this unit*
        set b.userReal = 0.0 // Stored damage, if the creep leaves the range of an enraged king*
        //*) only needed if you have 2 kings in a row and no CleanUp event is fired, cause the units 
        //   directly enter the aura of the 2nd king.
    endfunction
    
    function enterNewArea takes Buff b returns nothing
        local integer newDps      = b.getLevel()
        local Tower   oldKing     = b.userInt3 // The king who has ruled over this unit until now.
        // The damage the unit would have suffered from the old king, if it werent entering a new area now.
        local real    oldWrathDmg = oldKing.userReal*(0.5+oldKing.getLevel()*0.04)
        
        set oldKing.userReal = 0.0      // Reset stored damage of the old king
        set b.userReal3 = b.getCaster() // Set to the new king, ruling over this unit now
        
        // Store the max dps, if the dps of the new area is higher 
        if(newDps > b.userInt2) then 
            set b.userInt2 = newDps
        endif
        
        // Attach wrath dmg of the old king, to deal the dmg later
        if(oldWrathDmg > 0.0) then 
            set b.userReal = b.userReal + oldWrathDmg
        endif
    endfunction
    
    function doDamage takes Buff b returns nothing
        local Unit    target = b.getBuffedUnit()
        local Unit    caster = b.getCaster()
        
        // (1) Calculate time gone since the buff was applied
        // (2) multiply by 0.04 to get seconds 
        // (3) finally multiply with max dmg per second to get overall damage
        local real damage = (Game.getGameTime()-b.userInt)*0.04*b.userInt2
        
        // (4) Add the stored damage, other kings would have done to this unit
        set damage = damage + b.userReal
        
        if(GetUnitState(target.getUnit(), UNIT_STATE_LIFE) > 0 ) then   
            // Creep is alive: Add all stored damage to the normal dealt damage
            if(caster.userReal > 0) then
                call  caster.getTeam().displayFloatingText("Feel the Wrath!", caster, 15,15,200)
                // Add stored damage
                set   damage = damage + (caster.userReal*(0.5+caster.getLevel()*0.04)) 
                set   caster.userReal = 0.0 // Reset stored damage
            endif
            call  SFXAtUnit("Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl", target.getUnit())  
            call  caster.doSpellDamage(b.getBuffedUnit(), damage, caster.calcSpellCritNoBonus())
            call  caster.getTeam().displayFloatingText(I2S(R2I(damage)), target,15,15,200) //Show at TARGET
        else
            // Creep is dead: Store damage for the next alive creep
            set   caster.userReal = caster.userReal + damage
            call  caster.getTeam().displayFloatingText("+"+I2S(R2I(damage)), caster,15,15,200) //Show at CASTER
        endif
    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 icyCurseMod  = Modifier.create()
        call  icyCurseMod.addModification(MOD_DEBUFF_DURATION, 0.30, 0.008)
        set   natac_icyCurse_BuffType = BuffType.create(5, 0.0, false)
        call  natac_icyCurse_BuffType.setBuffModifier(icyCurseMod)
        call  natac_icyCurse_BuffType.setBuffIcon('@@0@@')
    
        set   natac_kingsPresent_Aura = BuffType.createAuraEffectType(false)
        call  natac_kingsPresent_Aura.addEventOnCreate (EventHandler.initAuraBuff)
        call  natac_kingsPresent_Aura.setEventOnRefresh(EventHandler.enterNewArea)
        call  natac_kingsPresent_Aura.addEventOnCleanup(EventHandler.doDamage)
        call  natac_kingsPresent_Aura.setBuffIcon('@@1@@')
        
        set  natac_storedDamage_MuliboardValue = MultiboardValues.create(1)
        call natac_storedDamage_MuliboardValue.setKey(0, "Stored Damage")
    endfunction

On Damage

ONDAMAGE_chance: 1.0 ONDAMAGE_chanceLevelAdd: 0.0
function onDamage takes Tower tower returns nothing
    call natac_icyCurse_BuffType.apply(tower, Event.getTarget(), tower.getLevel())
endfunction

On Tower Creation

function onCreate takes Tower tower returns nothing
    set tower.userReal = 0 // Damage stored for creeps dying under the auras effect.
endfunction

On Tower Details

function onTowerDetails takes Tower tower returns MultiboardValues
    call   natac_storedDamage_MuliboardValue.setValue(0, formatFloat(tower.userReal,0))
    return natac_storedDamage_MuliboardValue
endfunction

Tower Aura

AURA_auraEffect: natac_kingsPresent_Aura AURA_power: 500 AURA_level: 500 AURA_auraRange: 900 AURA_targetType: TARGET_TYPE_CREEPS AURA_levelAdd: 20 AURA_powerAdd: 20 AURA_targetSelf: false