Soul Vault v1
2800
ID:
453
Family ID:
Author:
SirCoqaLot.
Rarity:
unique
Element:
darkness
Attack Type:
Decay
Attack Range:
775
Attack CD:
3
Damage:
6155-9155
Status:
Approved

Description:

Advanced tower that has a chance to reduce target's armor and make it suffer from immense pain. The Vault's presence frightens nearby units that they loose their defense strategies and attacked units will suffer more spell damage.
Acid Skull
This tower has a 25% chance to throw an Acid Skull onto the target, dealing 1800 damage to the main target and 1440 damage to targets in 225 range and reducing their armor by 5 over 4.5 seconds. 

Level Bonus:
 +5% damage
 +0.4% chance
Soulsteal
This tower has a 12.5% chance to lock its target's soul. A unit without a soul will recieve 50% more spell damage. 

Level Bonus:
 +0.1% chance
 +2% more spell damage taken
Vault's Presence - Aura
Unit's in 775 range have their armor reduced by 25%. 

Level Bonus:
 +0.2% armor reduction
Download

Toggle Triggers

Header

    globals

        BuffType sir_armor_aura
        BuffType sir_soul_devour
        BuffType sir_acid_skull
        Cast AcidSkull
        
    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 armor = Modifier.create()
        local Modifier devour = Modifier.create()
        local Modifier acid = Modifier.create()

        set sir_armor_aura = BuffType.createAuraEffectType(false)  // Aura
        call armor.addModification(MOD_ARMOR_PERC,0.0,-0.001)
        call sir_armor_aura.setBuffModifier(armor)    
        call sir_armor_aura.setStackingGroup("armor_reduction_aura")
        call sir_armor_aura.setBuffIcon('@@1@@')
        
        set sir_acid_skull = BuffType.create(0,0,false)  // Acid Skull
        call acid.addModification(MOD_ARMOR,0.0,-1)
        call sir_acid_skull.setBuffModifier(acid)   
        call sir_acid_skull.setStackingGroup("acid_skull")
        
        set sir_soul_devour = BuffType.create(1000,0,false)   // Devour
        call devour.addModification(MOD_SPELL_DAMAGE_RECEIVED,0.0,0.001)
        call sir_soul_devour.setBuffModifier(devour)
        call sir_soul_devour.setBuffIcon('@@2@@')
        
        set AcidSkull = Cast.create('@@0@@',"acidbomb",10.0)
        endfunction

On Attack

ONATTACK_chance: 0.25 ONATTACK_chanceLevelAdd: 0.004
function onAttack takes Tower tower returns nothing
      local integer lvl = tower.getLevel()
      local Creep target = Event.getTarget()
      local Unit u
      local Iterate iterator = Iterate.overUnitsInRangeOfUnit(tower,TARGET_TYPE_CREEPS,target,225) 
    loop  
      set u = iterator.next() 
      exitwhen u == 0 
      call sir_acid_skull.applyCustomTimed(tower,u,5,4.5)
    endloop 
    
    call sir_acid_skull.applyCustomTimed(tower,target,5,4.5)
    call AcidSkull.targetCastFromCaster(tower,target,1.0+lvl*0.05,tower.calcSpellCritNoBonus())
endfunction

On Damage

ONDAMAGE_chance: 0.125 ONDAMAGE_chanceLevelAdd: 0.001
function onDamage takes Tower tower returns nothing
      local integer lvl = tower.getLevel()
      local integer devour = R2I((0.5 + lvl * 0.02)*1000)
    call sir_soul_devour.apply(tower,Event.getTarget(),devour)
endfunction

Tower Aura

AURA_auraEffect: sir_armor_aura AURA_power: 250 AURA_level: 250 AURA_auraRange: 775 AURA_targetType: TARGET_TYPE_CREEPS AURA_levelAdd: 2 AURA_powerAdd: 2 AURA_targetSelf: false
Electrified Storm Lantern v1
2800
ID:
553
Family ID:
Author:
Boekie
Rarity:
uncommon
Element:
storm
Attack Type:
Energy
Attack Range:
1000
Attack CD:
1.3
Damage:
1525-1525
Status:
Approved

Description:

This tower is able to release a burst attack.
Burst Lightning
Has a 20% chance on attack to fire 5 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 = 5
    local integer twrLevel = tower.getLevel()
    if twrLevel == 25 then
        set numShots = 7 
    elseif twrLevel >= 15 then
        set numShots = 6
    endif
    
    call newAttack(tower,numShots,creep)
    
endfunction
Gold Machine v1
2800
ID:
557
Family ID:
Author:
Boekie
Rarity:
rare
Element:
iron
Attack Type:
Physical
Attack Range:
1200
Attack CD:
2.5
Damage:
4867-4867
Mana:
30
Mana regen:
2
Status:
Approved

Description:

This machine is used to make money.
Golden Influence
This tower adds a buff to a tower in 400 range that lasts 12 seconds. The buff increases bounty gain by 60%. Everytime this spell is cast you gain 7 gold.

Level Bonus:
+0.4 seconds duration 
+0.6% bounty gain

AC_TYPE_OFFENSIVE_BUFF
 20, 400 range, 4s cooldown
Multiply Gold
This tower increases the gold income of the player by 10%.
Download

Toggle Triggers

Autocast

caster_art: AUTOCAST_cooldown: 4 AUTOCAST_numBuffsBeforeIdle: 3 AUTOCAST_isExtended: false AUTOCAST_autocastType: AC_TYPE_OFFENSIVE_BUFF AUTOCAST_manacost: 20 AUTOCAST_range: 400 AUTOCAST_buffType: boekie_goldBuff AUTOCAST_targetSelf: true AUTOCAST_targetType: TARGET_TYPE_TOWERS target_art: Abilities\Spells\Items\ResourceItems\ResourceEffectTarget.mdl AUTOCAST_autoRange: 400
private function onAutocast takes Tower tower returns nothing
local integer level = tower.getLevel()
call boekie_goldBuff.applyCustomTimed(tower,Event.getTarget(),200+(level*6),12+(level*0.4)) 
call tower.getOwner().giveGold( 7,tower.getUnit(), true, true) 
 
endfunction

Header

   globals 
   //@import
   BuffType boekie_goldBuff 
   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
call tower.getOwner().modifyIncomeRate(0.10) 
endfunction

On Tower Destruction

function onDestruct takes Tower tower returns nothing
call tower.getOwner().modifyIncomeRate(-0.10) 
endfunction
Dreadlord v1
2800
ID:
648
Family ID:
Author:
poussix
Rarity:
unique
Element:
darkness
Attack Type:
Decay
Attack Range:
900
Attack CD:
1
Damage:
1086-1086
Mana:
1000
Mana regen:
10
Status:
Approved

Description:

Vampire with strong unholy powers.
Specials:
+5% mana/lvl
+5% mana regen/lvl
Dreadlord ' s Awakening
When activated, Dreadlord empowers himself with darkness for 10 seconds, increasing own attack speed by 50% and mana regeneration by 20 per second.

Level Bonus:
+2% attack speed
+0.8 mana per second

AC_TYPE_OFFENSIVE_IMMEDIATE
 0, 0 range, 80s cooldown
Dreadlord Slash
Dreadlord deals 100% of his max mana in spell damage on attack. Costs 80 mana on each attack.

Level Bonus:
+4% spell damage
Bloodsucker
The Dreadlord is hungry. For every kill he gains 0.5% attack speed and 10 maximum mana. The mana bonus caps at 2000. Both bonuses are permanent.
Download

Toggle Triggers

Autocast

caster_art: AUTOCAST_cooldown: 80 AUTOCAST_numBuffsBeforeIdle: 0 AUTOCAST_isExtended: false AUTOCAST_autocastType: AC_TYPE_OFFENSIVE_IMMEDIATE AUTOCAST_manacost: 0 AUTOCAST_range: 0 AUTOCAST_buffType: 0 AUTOCAST_targetSelf: true AUTOCAST_targetType: 0 target_art: AUTOCAST_autoRange: 900
private function onAutocast takes Tower tower returns nothing
   
   call poussix_Dnight.applyCustomTimed(tower,tower,1,10.0)
   call poussix_cast.immediateCastFromCaster(tower,1,3)
   
endfunction

Header

    globals
       BuffType poussix_Dnight
       Cast poussix_cast
       MultiboardValues Dreadlord_Bonus
    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   poussix_Dnight = BuffType.create(10,0,true)
        call  m.addModification(MOD_ATTACKSPEED, 0.5 , 0.02)
        call  m.addModification(MOD_MANA_REGEN, 20 , 0.8)
        call  poussix_Dnight.setBuffModifier(m)
        call  poussix_Dnight.setBuffIcon('@@2@@')
        call  poussix_Dnight.setStackingGroup("poussix_bloodsucker")
        set poussix_cast = Cast.create('@@0@@',"frenzy",1.0) 
        
        set Dreadlord_Bonus = MultiboardValues.create(2)
        call Dreadlord_Bonus.setKey(0,"Attackspeed Bonus")
        call Dreadlord_Bonus.setKey(1,"Mana Bonus")
    endfunction

On Damage

ONDAMAGE_chance: 1.0 ONDAMAGE_chanceLevelAdd: 0.0
function onDamage takes Tower tower returns nothing
    local Unit creep = Event.getTarget()
    local unit c = creep.getUnit()
    local unit towerUnit = tower.getUnit()
    local real totalDamage=(1+0.04*tower.getLevel()) * GetUnitState(towerUnit, UNIT_STATE_MAX_MANA)
    local real Manna = GetUnitState(towerUnit, UNIT_STATE_MANA)
    
    if (Manna >= 80) then

        call tower.doSpellDamage(creep,totalDamage,tower.calcSpellCritNoBonus())
        call SetUnitState(towerUnit , UNIT_STATE_MANA, Manna-80)
        call Effect.createScaled("Abilities\\Spells\\Orc\\Devour\\DevourEffectArt.mdl", GetUnitX(c), GetUnitY(c), 30, 0, 1.5).destroy()
   endif
        
    set towerUnit = null
    set c = null
    
endfunction

On Kill

function onKill takes Tower tower returns nothing
call tower.modifyProperty(MOD_ATTACKSPEED, 0.005)
set tower.userReal2 = tower.userReal2 + 0.005

if tower.userReal <= 2 then 

set tower.userReal = tower.userReal + 0.01
call tower.modifyProperty(MOD_MANA, 10)
endif
endfunction

On Tower Creation

function onCreate takes Tower tower returns nothing
set tower.userReal = 0.0
set tower.userReal2 = 0.0
endfunction

On Tower Details

function onTowerDetails takes Tower tower returns MultiboardValues
    call Dreadlord_Bonus.setValue(0, formatPercent(tower.userReal2, 1))
    call Dreadlord_Bonus.setValue(1, I2S(R2I(tower.userReal*1000)))
    return Dreadlord_Bonus
endfunction
Almighty Elemental Ghost v1
2850
ID:
137
Family ID:
Author:
Der_kleine_Tomy
Rarity:
uncommon
Element:
fire
Attack Type:
Essence
Attack Range:
950
Attack CD:
2
Damage:
4715-4715
Status:
Approved

Description:

A mysterious Ghost, which deals different damage types.
Specials:
+0.9% trigger chances/lvl
Elemental Wrath
The Elemental Ghost has a 25% 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.9% 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
        //@import
        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
    endfunction

On Attack

ONATTACK_chance: 0.25 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() * 9, 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
Infernal Bat v1
2850
ID:
261
Family ID:
Author:
DaveMatthews
Rarity:
rare
Element:
darkness
Attack Type:
Decay
Attack Range:
900
Attack CD:
1.2
Damage:
2701-2701
Mana:
50
Mana regen:
1.5
Status:
Approved

Description:

Like a bat out of hell I'll be gone when the morning comes!
Engulfing Darkness
This tower engulfs itself in darkness, gaining power as if it's night for 5 seconds.

AC_TYPE_OFFENSIVE_BUFF
 45, 0 range, 6s cooldown
Bat Swarm
This tower has a 15% chance on attack to release a swarm of bats, dealing 2700 spell damage at nighttime or 900 spell damage at daytime to all enemies in a cone. The cone grows from a 100 AoE radius at the start to a 300 AoE radius at the end. 

Level Bonus:
+0.2% chance 
+90 damage during night 
+30 damage during day
Creature of the Night
This tower deals 150% damage during nighttime and 50% damage during daytime. 

Level Bonus:
+0.8% damage during night 
+0.4% damage during day
Download

Toggle Triggers

Autocast

caster_art: Abilities\Spells\Undead\AnimateDead\AnimateDeadTarget.mdl AUTOCAST_cooldown: 6 AUTOCAST_numBuffsBeforeIdle: 1 AUTOCAST_isExtended: false AUTOCAST_autocastType: AC_TYPE_OFFENSIVE_BUFF AUTOCAST_manacost: 45 AUTOCAST_range: 0 AUTOCAST_buffType: dave_darkness AUTOCAST_targetSelf: true AUTOCAST_targetType: TARGET_TYPE_TOWERS target_art: AUTOCAST_autoRange: 0
private function onAutocast takes Tower tower returns nothing
call dave_darkness.apply(tower,tower,tower.getLevel())
endfunction

Header

    globals
    //@import
    BuffType dave_darkness
    //@import
    Cast dave_bats
    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: 0.15 ONATTACK_chanceLevelAdd: 0.002
function onAttack takes Tower tower returns nothing
local real time = GetFloatGameState(GAME_STATE_TIME_OF_DAY)
local integer level = tower.getLevel()

if time >= 18.00 or time < 6.00 or tower.getBuffOfType(dave_darkness)!=0 then
   call dave_bats.targetCastFromCaster(tower, Event.getTarget(), 2700+(90*level), tower.calcSpellCritNoBonus())
else
   call dave_bats.targetCastFromCaster(tower, Event.getTarget(), 900+(30*level), tower.calcSpellCritNoBonus())
endif
endfunction

On Damage

ONDAMAGE_chance: 1.0 ONDAMAGE_chanceLevelAdd: 0.0
function onDamage takes Tower tower returns nothing
local real time = GetFloatGameState(GAME_STATE_TIME_OF_DAY)
local integer level = tower.getLevel()

if time >= 18.00 or time < 6.00 or tower.getBuffOfType(dave_darkness)!=0 then
   set Event.damage = Event.damage*(1.5+0.008*level)
else
   set Event.damage = Event.damage*(0.5+0.004*level)
endif
endfunction

On Tower Creation

function onCreate takes Tower tower returns nothing
call AddUnitAnimationProperties(tower.getUnit(), "stand alternate", false)
endfunction
Gnoll Storm Caster v1
2850
ID:
327
Family ID:
Author:
cedi
Rarity:
rare
Element:
storm
Attack Type:
Energy
Attack Range:
1200
Attack CD:
0.75
Damage:
334-334
Mana:
20
Mana regen:
1
Status:
Approved

Description:

Gnollssss!
Thunder Shock
Deals [4350 + (1305 x amount of player towers)] spell damage to a target creep. This ability has a 25% chance to recast itself when cast. Maximum of 1 extra cast.

Level Bonus:
+174 base spelldamage
+52.2 spelldamage per player tower
+1 extra cast at levels 15 and 25

AC_TYPE_OFFENSIVE_UNIT
 12, 1200.00 range, 3.0s cooldown
Download

Toggle Triggers

Autocast

AUTOCAST_cooldown: 3.0 AUTOCAST_autoRange: 1200.00 AUTOCAST_manacost: 12 AUTOCAST_range: 1200.00 AUTOCAST_targetType: TARGET_TYPE_CREEPS AUTOCAST_numBuffsBeforeIdle: 1 caster_art: Abilities\Spells\Orc\Purge\PurgeBuffTarget.mdl target_art: Abilities\Spells\Other\Monsoon\MonsoonBoltTarget.mdl AUTOCAST_autocastType: AC_TYPE_OFFENSIVE_UNIT AUTOCAST_buffType: 0 AUTOCAST_isExtended: false AUTOCAST_targetSelf: true
private function onAutocast takes Tower tower returns nothing
    local Unit U = Event.getTarget()
    local integer lvl = tower.getLevel()
    local integer i = tower.userInt
    local Iterate I
    local boolean b
    call tower.doSpellDamage( U, 4350.00 + 174.00 * lvl + ( 1305.00 + 52.2 * lvl ) * tower.getOwner().getNumTowers(), tower.calcSpellCritNoBonus() )
    if tower.calcChance( 0.25 ) then
        call tower.getOwner().displaySmallFloatingText( "MULTICAST!", tower, 0, 255, 0, 0.00 )
        loop
            exitwhen i <= 0
            set I = Iterate.overUnitsInRangeOfCaster( tower, TARGET_CREEPS, 1200.00 )
            set b = true
            loop
                if i <= 0 then
                    //enough hits
                    call I.destroy()
                    exitwhen true
                endif
                set U = I.next()
                if U == 0 and b then
                    //no units near
                    return
                endif
                set b = false
                exitwhen U == 0
                call SFXAtUnit( "Abilities\\Spells\\Other\\Monsoon\\MonsoonBoltTarget.mdl", U.getUnit() )
                call tower.doSpellDamage( U, 4350.00 + 174.00 * lvl + ( 1305.00 + 52.2 * lvl ) * tower.getOwner().getNumTowers(), tower.calcSpellCritNoBonus() )
                set i = i - 1
            endloop
        endloop
    endif
endfunction

Header

    globals
        MultiboardValues MBV
    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
        set MBV = MultiboardValues.create( 1 )
        call MBV.setKey( 0, "Thunder Shock Dmg" )
    endfunction

On Level Up

function onLevelUp takes Tower tower returns nothing
    local integer lvl = tower.getLevel()
    if lvl < 15 then
        set tower.userInt = 1
    elseif lvl >= 15 and lvl < 25 then
        set tower.userInt = 2
    elseif lvl == 25 then
        set tower.userInt = 3
    endif
endfunction

On Tower Creation

function onCreate takes Tower tower returns nothing
    local integer lvl = tower.getLevel()
    if lvl < 15 then
        set tower.userInt = 1
    elseif lvl >= 15 and lvl < 25 then
        set tower.userInt = 2
    elseif lvl == 25 then
        set tower.userInt = 3
    endif
endfunction

On Tower Details

function onTowerDetails takes Tower tower returns MultiboardValues
    local real r = 4350.00 + 174.00 * tower.getLevel() + ( 1305.00 + 52.2 * tower.getLevel() ) * tower.getOwner().getNumTowers()
    call MBV.setValue( 0, R2S( r ) )
    return MBV
endfunction