Harby v1
3100
ID:
267
Family ID:
Author:
Glowackos
Rarity:
unique
Element:
darkness
Attack Type:
Decay
Attack Range:
800
Attack CD:
1.4
Damage:
2785-2785
Mana:
450
Mana regen:
7.5
Status:
Approved

Description:

A statue built in honor of the great Obsidian Warrior. Legend often depicts him wearing nothing but a dark shroud, though his true story is shrouded in darkness.
Specials:
x1.45 spell crit damage (+x0.05/lvl)
-55% debuff duration (-1%/lvl)
+10 mana/lvl
Arcane Orb
Infuses Harby's attacks with arcane energy at the cost of 100 mana per attack. Deals [6 x Current Mana] as bonus spelldamage. This ability also passively grants 1 bonus maximum mana for each creep Harby kills.

Level Bonus:
+[0.1 x Current Mana] as bonus spelldamage
Grotesque Awakening
Whenever hit by a spell, the statue comes to life for 5 seconds, enabling it to attack. This ability is affected by buff duration.
Arcane Aura - Aura
Towers in 350 range have a 10% chance to replenish 10% of their total manapool when casting an ability that costs mana. Cannot retrigger on the same tower within 5 seconds. This effect will also proc off Harby's Arcane Orb attacks, without the retrigger restriction.

Level Bonus:
+0.4% chance
+0.2% maximum mana replenished
Download

Toggle Triggers

Header

    globals
        BuffType glow_arcaneAura
        BuffType glow_awaken
        ProjectileType glow_arcaneOrb
    endglobals
    
    function awakenOnCreate takes Buff b returns nothing
        local unit u = b.getBuffedUnit().getUnit()
        call SFXAtUnit("Abilities\\Spells\\Human\\Polymorph\\PolyMorphDoneGround.mdl", u)
        call SFXAtUnit("Objects\\Spawnmodels\\Undead\\UndeadBlood\\ObsidianStatueCrumble2.mdl", u)
        call AddUnitAnimationProperties(u, "stand alternate", true)
        //Set the unit's height cause it looks dodgy after morphing
        call SetUnitFlyHeight(u, 100, 2000)
        call UnitRemoveAbility(u, '@@0@@')
        set u = null
    endfunction
    
    function awakenOnCleanup takes Buff b returns nothing
        local unit u = b.getBuffedUnit().getUnit()
        call SFXAtUnit("Abilities\\Spells\\Human\\Polymorph\\PolyMorphDoneGround.mdl", u)
        call AddUnitAnimationProperties(u, "stand alternate", false)
        call SetUnitFlyHeight(u, 40, 2000)
        call UnitAddAbility(u, '@@0@@')
        set u = null
    endfunction

    function arcane_manaReplenish takes Tower t returns nothing
        call Effect.createColored("Abilities\\Spells\\Undead\\ReplenishHealth\\ReplenishHealthCasterOverhead.mdl", t.getX(), t.getY(), t.getZ()+80, 0.0, 1.0, 100, 100, 255, 255).destroy()
        call t.addManaPerc(0.1 + 0.002 * t.getLevel())
    endfunction
    
    function arcane_onCreate takes Buff b returns nothing
        set b.userInt = 0 //Stores when the buff last procced.
    endfunction
    
    function arcane_onSpellCast takes Buff b returns nothing
        local Tower t = b.getBuffedUnit()
        //125 = 5 * 25 ticks = 5 seconds.
        if (b.userInt + 125 < Game.getGameTime()) and Event.getAutocastType().getManacost() > 0.0 then 
            if t.calcChance(0.1 + 0.004 * t.getLevel()) then
                call arcane_manaReplenish(t)
                set b.userInt = Game.getGameTime()
            endif
        endif
    endfunction
    
    function arcane_orb_hit takes Projectile p, Unit target returns nothing
        call p.doSpellDamage(target, p.userReal)
    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 glow_arcaneAura = BuffType.createAuraEffectType(true)
        call glow_arcaneAura.setBuffIcon('@@1@@')
        call glow_arcaneAura.addEventOnCreate(EventHandler.arcane_onCreate)
        call glow_arcaneAura.addEventOnSpellCast(EventHandler.arcane_onSpellCast)
        
        set glow_awaken = BuffType.create(5, 0, true)
        call glow_awaken.addEventOnCreate(EventHandler.awakenOnCreate)
        call glow_awaken.addEventOnCleanup(EventHandler.awakenOnCleanup)
        call glow_awaken.setBuffIcon('@@2@@')
        
        set glow_arcaneOrb = ProjectileType.create("Abilities\\Weapons\\AvengerMissile\\AvengerMissile.mdl", 10, 1500)
        call glow_arcaneOrb.enableHoming(ProjectileTargetEvent.arcane_orb_hit, 0.0)
    endfunction

On Attack

ONATTACK_chance: 1.0 ONATTACK_chanceLevelAdd: 0.0
function onAttack takes Tower tower returns nothing
    //Since the tower WILL have the mana most of the time (I assume..), may as well compute these values immediately.
    local real dmg = (6 + 0.1 * tower.getLevel()) * GetUnitState(tower.getUnit(), UNIT_STATE_MANA)
    local Creep creep = Event.getTarget()
    local Projectile p
    if tower.getBuffOfType(glow_awaken) != 0 then
        // Throw out the attack projectile (tower's real attack does all the work but we hide its projectile model)
        set p = Projectile.createFromUnitToUnit(glow_arcaneOrb,tower,1.0,tower.calcSpellCritNoBonus(),tower,creep,true,false,false)
        if tower.subtractMana(100, false) == 100 then
            if tower.calcChance(0.1 + 0.004 * tower.getLevel()) then
                call arcane_manaReplenish(tower)
            endif
            call tower.getOwner().getTeam().displayFloatingTextX("+" + I2S(R2I(dmg)), tower, 255, 0, 255, 255, 0.05, 2, 3)
            set p.userReal = dmg
            // Swap out projectile model for arcane-orb-empowered attacks.
            call p.setModel("Abilities\\Weapons\\IllidanMissile\\IllidanMissile.mdl")
        else
            set p.userReal = 0
        endif
    endif
endfunction

On Kill

function onKill takes Tower tower returns nothing
    call tower.modifyProperty(MOD_MANA, 1)
endfunction

On Spell Target

function onSpellTarget takes Tower tower returns nothing
    call glow_awaken.apply(tower, tower, 0)
endfunction

On Tower Creation

function onCreate takes Tower tower returns nothing
    call AddUnitAnimationProperties(tower.getUnit(), "stand alternate", false)
    call tower.modifyProperty(MOD_MANA, tower.getKills())
endfunction

Tower Aura

AURA_powerAdd: 1 AURA_auraEffect: glow_arcaneAura AURA_levelAdd: 1 AURA_power: 0 AURA_targetType: TARGET_TYPE_TOWERS AURA_targetSelf: true AURA_level: 0 AURA_auraRange: 350
Morphling v1
3100
ID:
319
Family ID:
Author:
DaveMatthews
Rarity:
unique
Element:
nature
Attack Type:
Essence
Attack Range:
900
Attack CD:
1.5
Damage:
3910-3910
Status:
Approved

Description:

His adaptive nature makes him very versatile.
Morph: Might
Activates "Morph: Might". As long as this buff is on this tower gains 2% base damage and loses 2% attack speed on every attack, up to a maximum of 50 times. Removes "Morph: Swiftness" and resets its bonus when activated.

AC_TYPE_NOAC_IMMEDIATE
 0, 0 range, 1s cooldown
Morph: Swiftness
Activates "Morph: Swiftness". As long as this buff is on this tower gains 2% attack speed and loses 2% base damage on every attack, up to a maximum of 50 times. Removes "Morph: Might" and resets its bonus when activated.

AC_TYPE_NOAC_IMMEDIATE
 0, 0 range, 1s cooldown
Adapt
Stops the effect of morphs, leaving the current buff on the tower. Using the spell again removes Adapt.

AC_TYPE_NOAC_IMMEDIATE
 0, 0 range, 1s cooldown
Evolve
Every time it casts Morphling Strike, this tower permanently gains 0.2% base damage and 0.1% attack speed if "Morph: Might" has at least 25 stacks, or 0.2% attack speed and 0.1% base damage if "Morph: Swiftness" has at least 25 stacks.  Can evolve a maximum of 500 times.
Morphling Strike
Every time this tower damages a unit, it has a 20% chance to launch 3 projectiles to random creeps in 900 range, dealing 2000 spell damage to them. On impact, if "Morph: Might" has at least 25 stacks, the projectiles deal additional spell damage equal to 25% of the tower's damage per second for 5 seconds; if "Morph: Swiftness" has at least 25 stacks, they slow the targets by 20% and increase the damage they receive from nature by 15% for 8 seconds. 

Level Bonus:
+60 damage 
+0.8% damage per second 
+0.4% slow 
+0.2% damage from nature 
+0.6% chance
Download

Toggle Triggers

Autocast

caster_art: AUTOCAST_cooldown: 1 AUTOCAST_numBuffsBeforeIdle: 1 AUTOCAST_isExtended: false AUTOCAST_autocastType: AC_TYPE_NOAC_IMMEDIATE AUTOCAST_manacost: 0 AUTOCAST_range: 0 AUTOCAST_buffType: dave_morph_damage AUTOCAST_targetSelf: true AUTOCAST_targetType: TARGET_TYPE_TOWERS target_art: AUTOCAST_autoRange: 0
private function onAutocast takes Tower tower returns nothing
local Buff b = tower.getBuffOfType(dave_morph_damage)
local integer bufflevel = b.getLevel()

if tower.getBuffOfType(dave_morph_damage)==0 then
   if tower.getBuffOfType(dave_morph_speed)!=0 then
     call tower.getBuffOfType(dave_morph_speed).removeBuff()
   endif
   call dave_morph_damage.apply(tower, tower, bufflevel)
endif
 
endfunction

Autocast

caster_art: AUTOCAST_cooldown: 1 AUTOCAST_numBuffsBeforeIdle: 1 AUTOCAST_isExtended: false AUTOCAST_autocastType: AC_TYPE_NOAC_IMMEDIATE AUTOCAST_manacost: 0 AUTOCAST_range: 0 AUTOCAST_buffType: dave_morph_speed AUTOCAST_targetSelf: true AUTOCAST_targetType: TARGET_TYPE_TOWERS target_art: AUTOCAST_autoRange: 0
private function onAutocast takes Tower tower returns nothing
local Buff b = tower.getBuffOfType(dave_morph_speed)
local integer bufflevel = b.getLevel()

if tower.getBuffOfType(dave_morph_speed)==0 then
   if tower.getBuffOfType(dave_morph_damage)!=0 then
      call tower.getBuffOfType(dave_morph_damage).removeBuff()
   endif
   call dave_morph_speed.apply(tower, tower, bufflevel)
endif
endfunction

Autocast

caster_art: AUTOCAST_cooldown: 1 AUTOCAST_numBuffsBeforeIdle: 1 AUTOCAST_isExtended: false AUTOCAST_autocastType: AC_TYPE_NOAC_IMMEDIATE AUTOCAST_manacost: 0 AUTOCAST_range: 0 AUTOCAST_buffType: dave_morph_adapt AUTOCAST_targetSelf: true AUTOCAST_targetType: TARGET_TYPE_TOWERS target_art: AUTOCAST_autoRange: 0
private function onAutocast takes Tower tower returns nothing
local Buff b = tower.getBuffOfType(dave_morph_adapt)
local integer bufflevel = b.getLevel()

if tower.getBuffOfType(dave_morph_adapt)==0 then
   call dave_morph_adapt.apply(tower, tower, bufflevel)
elseif tower.getBuffOfType(dave_morph_adapt)!=0 then
   call tower.getBuffOfType(dave_morph_adapt).removeBuff()
endif
endfunction

Header

    globals
    BuffType dave_morph_damage
    BuffType dave_morph_speed
    BuffType dave_morph_slow
    BuffType dave_morph_adapt
    BuffType dave_morph_dot
    ProjectileType dave_morph_strike_damage
    ProjectileType dave_morph_strike_speed 
    MultiboardValues dave_absorb_MultiboardValue
    endglobals
    
    function morphSpeedHit takes Projectile p, Unit creep returns nothing
    local Tower tower = p.getCaster()
    local integer level= tower.getLevel()
    
    call tower.doSpellDamage(creep,2000+(60*level), tower.calcSpellCritNoBonus())
    call dave_morph_slow.apply(tower, creep, level)
    endfunction
    
    function morphDamageHit takes Projectile p, Unit creep returns nothing
    local Tower tower = p.getCaster()
    local integer level= tower.getLevel()
    
    call tower.doSpellDamage(creep,2000+(60*level), tower.calcSpellCritNoBonus())
    call dave_morph_dot.apply(tower, creep, level)
    endfunction
    
    function dot takes Buff b returns nothing
    local Tower tower = b.getCaster()
    local integer level= tower.getLevel()
    call tower.doSpellDamage(b.getBuffedUnit(), tower.getCurrentAttackDamageWithBonus()*(0.25+0.008*level),tower.calcSpellCritNoBonus())
    endfunction    

    private function init takes nothing returns nothing
    local Modifier m = Modifier.create()
    local Modifier n = Modifier.create()
    local Modifier o = Modifier.create()
    
    set dave_morph_damage = BuffType.create(-1,0,true)
    call dave_morph_damage.setBuffModifier(m)
    call m.addModification(MOD_DAMAGE_BASE_PERC,0.0,0.02)
    call m.addModification(MOD_ATTACKSPEED,0.0,-0.02)
    call dave_morph_damage.setBuffIcon( '@@1@@' )
    
    set dave_morph_speed = BuffType.create(-1,0,true)
    call dave_morph_speed.setBuffModifier(n)
    call n.addModification(MOD_DAMAGE_BASE_PERC,0.0,-0.02)
    call n.addModification(MOD_ATTACKSPEED,0.0,0.02)
    call dave_morph_speed.setBuffIcon( '@@0@@' )
    
    set dave_morph_adapt = BuffType.create(-1,0,true)
    call dave_morph_adapt.setBuffIcon( '@@2@@' )
    
    set dave_morph_dot = BuffType.create(5,0,false)
    call dave_morph_dot.setBuffIcon( '@@4@@' )
    call dave_morph_dot.addPeriodicEvent(EventHandler.dot,1)
    
    set dave_morph_slow = BuffType.create(8,0.1,false)
    call dave_morph_slow.setBuffModifier(o)
    call o.addModification(MOD_MOVESPEED,-0.2,-0.004)
    call o.addModification(MOD_DMG_FROM_NATURE,0.15,0.002)
    call dave_morph_slow.setBuffIcon( '@@3@@' )
    
    set dave_morph_strike_damage = ProjectileType.create("Abilities\\Weapons\\SpiritOfVengeanceMissile\\SpiritOfVengeanceMissile.mdl",4,800)
    call dave_morph_strike_damage.enableHoming(ProjectileTargetEvent.morphDamageHit,0)
    
    set dave_morph_strike_speed = ProjectileType.create("Abilities\\Weapons\\ChimaeraAcidMissile\\ChimaeraAcidMissile.mdl",4,800)
    call dave_morph_strike_speed.enableHoming(ProjectileTargetEvent.morphSpeedHit,0)
    
    set dave_absorb_MultiboardValue = MultiboardValues.create(2)
    call dave_absorb_MultiboardValue.setKey(0,"Evolve")
    call dave_absorb_MultiboardValue.setKey(1,"Morph level")
    endfunction

On Attack

ONATTACK_chance: 1.0 ONATTACK_chanceLevelAdd: 0.0
function onAttack takes Tower tower returns nothing
local Buff bd = tower.getBuffOfType(dave_morph_damage)
local Buff bs = tower.getBuffOfType(dave_morph_speed)

if tower.getBuffOfType(dave_morph_adapt)==0 then
   if bd!=0 and bd.getLevel()<50 then
       call dave_morph_damage.apply(tower, tower, bd.getLevel()+1)
   elseif bs!=0 and bs.getLevel()<50 then
       call dave_morph_speed.apply(tower, tower, bs.getLevel()+1)
   endif
endif
endfunction

On Damage

ONDAMAGE_chance: 0.2 ONDAMAGE_chanceLevelAdd: 0.006
function onDamage takes Tower tower returns nothing
local integer level = tower.getLevel()
local Iterate i
local Projectile p
local integer count = 0
local Unit next
local Buff bd = tower.getBuffOfType(dave_morph_damage)
local Buff bs = tower.getBuffOfType(dave_morph_speed)
local ProjectileType pt = 0
local real scale = 1.0

if bd != 0 and bd.getLevel()>=25 then
  set pt = dave_morph_strike_damage
  set scale = 1.6
  if tower.userInt < 500 then
     call tower.modifyProperty(MOD_DAMAGE_BASE_PERC, 0.002)
     call tower.modifyProperty(MOD_ATTACKSPEED, 0.001)
     set tower.userInt = tower.userInt + 1
  endif
elseif bs != 0 and bs.getLevel()>=25 then
  set pt = dave_morph_strike_speed
  if tower.userInt < 500 then
     call tower.modifyProperty(MOD_ATTACKSPEED, 0.002)
     call tower.modifyProperty(MOD_DAMAGE_BASE_PERC, 0.001)
     set tower.userInt = tower.userInt + 1
  endif
endif

if pt != 0 then
  set i = Iterate.overUnitsInRangeOfCaster(tower,TARGET_CREEPS,900)
  loop
    set next=i.next()
    set count=count+1
    exitwhen next==0 or count==4
    set p = Projectile.createFromUnitToUnit(pt,tower,1,1, tower, next, true, false, false)
    call p.setScale(scale)
  endloop
  if next != 0 then
    call i.destroy()
  endif
endif
endfunction

On Tower Creation

function onCreate takes Tower tower returns nothing
set tower.userInt = 0
endfunction

On Tower Details

goldcost: 0
function onTowerDetails takes Tower tower returns MultiboardValues
local Buff d = tower.getBuffOfType(dave_morph_damage)
local integer bufflevelD = 0
local Buff s = tower.getBuffOfType(dave_morph_speed)
local integer bufflevelS = 0

if d != 0 then
   set bufflevelD = d.getLevel()
   call dave_absorb_MultiboardValue.setValue(1,I2S(bufflevelD))
endif

if s != 0 then
   set bufflevelS = s.getLevel()
   call dave_absorb_MultiboardValue.setValue(1,I2S(bufflevelS))
endif

call dave_absorb_MultiboardValue.setValue(0,I2S(tower.userInt))
return dave_absorb_MultiboardValue
endfunction
Tidewater Stream v1
3150
ID:
112
Family ID:
Author:
cedi
Rarity:
unique
Element:
ice
Attack Type:
Elemental
Attack Range:
820
Attack CD:
1.8
Damage:
3388-3388
Status:
Approved

Description:

Some people think the purling noise of a river is calming.
Spring Tide
Whenever this tower attacks it has a 15% chance to launch a wave. The wave travels 1200 units and has a 200 AoE. It deals 2200 spell damage to each creep it hits. Every 0.4 seconds the wave has a 35% chance to drag a stone with it. The stone travels 500 units, deals 2200 spell damage on collision and stuns for 0.65 seconds.

Level Bonus:
+88 spell damage
+0.6% chance to launch a wave
Splash
Whenever this tower deals damage through attacks it has a 20% chance to deal 4000 spell damage in 175 AoE around the attacked unit. Also increases the spell damage the hit units take by 12.5% for 6 seconds.

Level Bonus:
+160 spell damage
+0.5% more spell damage taken
Calming Noises - Aura
Increases the spell crit chance of towers in 250 range by 10%.

Level Bonus:
+0.4% spell crit chance
Download

Toggle Triggers

Header

    globals
        BuffType cedi_brookcalm
        BuffType cedi_brooksplash
        
        ProjectileType water
        ProjectileType stone
    endglobals
    
    function hitwater takes Projectile P, Unit U returns nothing
        call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Spells\\Other\\CrushingWave\\CrushingWaveDamage.mdl", U.getUnit(), "chest" ) )
        call P.getCaster().doSpellDamage( U, 2200.0 + P.getCaster().getLevel() * 88.0, P.getCaster().calcSpellCritNoBonus() )
    endfunction
    
    function periodicwater takes Projectile P returns nothing
        local Tower C = P.getCaster()
        local real r = P.direction + GetRandomReal( -30, 30 )
        if C.calcChance( 0.35 ) then
            set P = Projectile.create( stone, C, 1.0, C.calcSpellCritNoBonus(), P.x + GetRandomReal( -30.0, 30.0 ), P.y + GetRandomReal( -30.0, 30.0 ), 0.00, r )
            call DestroyEffect( AddSpecialEffect( "Objects\\Spawnmodels\\Undead\\ImpaleTargetDust\\ImpaleTargetDust.mdl", P.x, P.y ) )
        endif
    endfunction
    
    function hitstone takes Projectile P, Unit U returns nothing
        call P.getCaster().doSpellDamage( U, 2200.0 + P.getCaster().getLevel() * 88.0, P.getCaster().calcSpellCritNoBonus() )
        call cb_stun.applyOnlyTimed( P.getCaster(), U, 0.65 )
    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_SPELL_CRIT_CHANCE, 0.1, 0.004 )
        
        set cedi_brookcalm = BuffType.createAuraEffectType( true )
        call cedi_brookcalm.setBuffIcon( '@@0@@' )
        call cedi_brookcalm.setBuffModifier( m )
        
        set m = Modifier.create()
        call m.addModification( MOD_SPELL_DAMAGE_RECEIVED, 0.125, 0.005 )
        
        set cedi_brooksplash = BuffType.create( 6.0, 0, false )
        call cedi_brooksplash.setBuffIcon( '@@1@@' )
        call cedi_brooksplash.setBuffModifier( m )
        
        set water = ProjectileType.createRanged( "Doodads\\Terrain\\CliffDoodad\\Waterfall\\Waterfall.mdl", 1200.0, 700.0 )
        call water.enableCollision( hitwater, 200.0, TARGET_TYPE_CREEPS, false )
        call water.enablePeriodic( periodicwater, 0.4 )
        call water.disableExplodeOnExpiration()
        
        set stone = ProjectileType.createRanged( "Abilities\\Weapons\\RockBoltMissile\\RockBoltMissile.mdl", 500.0, 800.0 )
        call stone.enableCollision( hitstone, 64.0, TARGET_TYPE_CREEPS, true )
    endfunction

On Attack

ONATTACK_chance: 0.15 ONATTACK_chanceLevelAdd: 0.006
function onAttack takes Tower tower returns nothing
    local unit t = Event.getTarget().getUnit()
    local real r = bj_RADTODEG * Atan2(GetUnitY( t ) - GetUnitY(tower.getUnit()), GetUnitX( t ) - GetUnitX(tower.getUnit()))
    local Projectile P = Projectile.createFromUnit( water, tower, tower, r, 1.0, tower.calcSpellCritNoBonus() )
    call P.setScale( 0.8 )
    set t = null
endfunction

On Damage

ONDAMAGE_chance: 0.2 ONDAMAGE_chanceLevelAdd: 0.004
function onDamage takes Tower tower returns nothing
    local Iterate I = Iterate.overUnitsInRangeOfUnit( tower, TARGET_TYPE_CREEPS, Event.getTarget(), 175.0 )
    local Unit U = Event.getTarget()
    local unit u = U.getUnit()
    local Effect E = Effect.createScaled( "Objects\\Spawnmodels\\Naga\\NagaDeath\\NagaDeath.mdl", GetUnitX( u ), GetUnitY( u ), GetUnitFlyHeight( u ), 0.00, 0.6 )
    local integer lvl = tower.getLevel()
    call E.setLifetime( 3.0 )
    call tower.doSpellDamageAoEUnit( U, 175.0, 4000.0 + lvl * 160.0, tower.calcSpellCritNoBonus(), 0.0 )
    
    loop
        set U = I.next()
        exitwhen U == 0
        call cedi_brooksplash.apply( tower, U, lvl )
    endloop
    
    set u = null
endfunction

Tower Aura

AURA_auraEffect: cedi_brookcalm AURA_power: 1 AURA_level: 1 AURA_auraRange: 250 AURA_targetType: TARGET_TYPE_TOWERS AURA_levelAdd: 1 AURA_powerAdd: 1 AURA_targetSelf: true
Ancient Solar Emitter v1
3200
ID:
72
Family ID:
Author:
geX
Rarity:
rare
Element:
astral
Attack Type:
Elemental
Attack Range:
1100
Attack CD:
1.4
Damage:
2153-2153
Status:
Approved

Description:

Fills the air with pure sunlight weakening all enemies in its vicinity.
Specials:
Splash attack:
   50 AoE: 100% damage
   350 AoE: 40% damage
Sunshine - Aura
Reduces the armor of enemies in 1100 range by 15 and increases the vulnerability to damage from Astral, Fire, Iron, and Nature towers by 15%. 

Level Bonus:
+0.5 armor reduction
+0.5% vulnerability
Download

Toggle Triggers

Header

    globals
        //@import
        BuffType gexSunAura
    endglobals
    
    private function init takes nothing returns nothing
    endfunction

Tower Aura

AURA_auraEffect: gexSunAura AURA_power: 150 AURA_level: 150 AURA_auraRange: 1100 AURA_targetType: TARGET_TYPE_CREEPS AURA_levelAdd: 5 AURA_powerAdd: 5 AURA_targetSelf: false
Spell Harvester v1
3200
ID:
116
Family ID:
Author:
cedi
Rarity:
rare
Element:
storm
Attack Type:
Energy
Attack Range:
950
Attack CD:
2
Damage:
2161-2161
Status:
Approved

Description:

A field which is able to gather energy from spells.
Magical Barrage
Whenever this tower attacks it has a 20% chance to launch a magical missile. Whenever a tower in 650 range casts a spell, the amount of missiles on attack is increased by 1 for a duration equal to the casting tower's ability's cooldown. The Spell Harvester can shoot up to 20 missiles per attack. Each missile deals 4000 spell damage. Each additional missile has 7.5% higher crit chance and 15% higher crit damage than the previous one.

Level Bonus:
+0.8% chance
+160 spell damage
+0.3% spell crit chance
+0.6% spell crit damage
+2 max missiles every 5 levels
Download

Toggle Triggers

Header

    globals
        //@import
        ProjectileType cedi_spellCPT
        //@import
        BuffType cedi_spellGathering
        //@import
        BuffType cedi_spellInc
        //@import
        MultiboardValues cedi_spellCollectorMBValues
    endglobals
    
    function Launch takes nothing returns nothing
        local timer t = GetExpiredTimer()
        local Tower tower = GetTimerData( t )
        local real chance = 0.075 + 0.003 * tower.getLevel()
        local real crit = 0.15 + 0.006 * tower.getLevel()
        local Projectile P
        local Unit T = tower.userInt3
        
        if T == 0 then
            call ReleaseTimer( t )
            set t = null
            return
        endif
        
        if tower.userInt2 >= tower.userReal then
            call ReleaseTimer( t )
            set t = null
            return
        endif
        
        set P = Projectile.createBezierInterpolationFromUnitToUnit( cedi_spellCPT, tower, 1.0, tower.calcSpellCritNoBonus(), tower, T, GetRandomReal( 0.25, 0.45 ), GetRandomReal( -0.3, 0.3 ), 0.0, true )
        set P.userReal = chance * tower.userInt2
        set P.userReal2 = crit * tower.userInt2
        set P.z = 75.0
        
        set tower.userInt2 = tower.userInt2 + 1
        
        set t = null
    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.2 ONATTACK_chanceLevelAdd: 0.008
function onAttack takes Tower tower returns nothing
    //local real chance = 0.075 + 0.003 * tower.getLevel()
    //local real crit = 0.15 + 0.006 * tower.getLevel()
    //local integer i = 0
    local Buff B = tower.getBuffOfType( cedi_spellInc )
    local integer max = 1
    //local Projectile P
    local Unit T = Event.getTarget()
    local real r
    local timer t = NewTimer()
    
    if B != 0 then
        set max = IMinBJ(B.getLevel() + 1,20+tower.getLevel()/5*2)
    endif
    
    set r = tower.getCurrentAttackspeed() / max
    
    if r > 0.2 then
        set r = 0.2
    endif
    
    set tower.userReal = max
    set tower.userInt2 = 0 //i
    set tower.userInt3 = T 
    
    call SetTimerData( t, tower )
    call TimerStart( t, r, true, function Launch )
    
    //loop
    //    exitwhen i >= max
    //    exitwhen T == 0
    //    set P = Projectile.createFromUnitToUnit( cedi_spellCPT, tower, 1.0, tower.calcSpellCritNoBonus(), tower, T, true, false, false )
    //    set P.userReal = chance * i
    //    set P.userReal2 = crit * i
    //    set P.z = 50.0
    //    set i = i + 1
    //    call TriggerSleepAction( 0.1 )
    //endloop
endfunction

On Tower Creation

function onCreate takes Tower tower returns nothing
    set tower.userInt = 2 //second member
endfunction

On Tower Details

goldcost: 0
function onTowerDetails takes Tower tower returns MultiboardValues
    local Buff B = tower.getBuffOfType(cedi_spellInc)
    local integer lvl = 0
    if B != 0 then
        set lvl = IMinBJ(B.getLevel() + 1,20+tower.getLevel()/5*2)
    endif
    call cedi_spellCollectorMBValues.setValue(0, I2S(lvl))
    return cedi_spellCollectorMBValues
endfunction

Tower Aura

AURA_auraEffect: cedi_spellGathering AURA_power: 0 AURA_level: 0 AURA_auraRange: 650.0 AURA_targetType: TARGET_TYPE_TOWERS AURA_levelAdd: 2 AURA_powerAdd: 2 AURA_targetSelf: true
Ancient Lunar Emitter v1
3200
ID:
297
Family ID:
Author:
geX
Rarity:
rare
Element:
darkness
Attack Type:
Elemental
Attack Range:
1100
Attack CD:
1.4
Damage:
2153-2153
Status:
Approved

Description:

Shines moonlight on the enemies in its vicinity weakening their resistances.
Specials:
Splash attack:
   50 AoE: 100% damage
   350 AoE: 40% damage
Moonlight - Aura
Reduces the spell resistance of enemies in 1100 range by 22.5% and increases the vulnerability to damage from Astral, Darkness, Ice, and Storm towers by 15%. 

Level Bonus:
+0.75% spell resistance reduction
+0.5% vulnerability
Download

Toggle Triggers

Header

    globals
        //@import
        BuffType gexMoonAura
    endglobals
    
    private function init takes nothing returns nothing
    endfunction

Tower Aura

AURA_auraEffect: gexMoonAura AURA_power: 150 AURA_level: 150 AURA_auraRange: 1100 AURA_targetType: TARGET_TYPE_CREEPS AURA_levelAdd: 5 AURA_powerAdd: 5 AURA_targetSelf: false
Mana-Overwhelmed Drake v1
3200
ID:
371
Family ID:
Author:
SirCoqaLot.
Rarity:
rare
Element:
astral
Attack Type:
Elemental
Attack Range:
950
Attack CD:
3
Damage:
2855-2955
Mana:
1600
Mana regen:
80
Status:
Approved

Description:

Playful Faerie-Dragon that uses mana to its advantage.
Specials:
+6.4 mana regen/lvl
Unstable Energies
This tower has a 28% chance on damage to release a powerful energy blast, dealing [current mana x 12.5] Elemental damage to the target, but consuming 75% of its own current mana. 

Level Bonus:
+0.48% chance 
-1% current mana consumed
Mana Distortion Field - Aura
Towers in 200 range burn 5 mana on attack, costing the drake 35 mana. The mana burned and spent is attackspeed and range adjusted and the tower deals 125 spelldamage per mana point burned.

Level Bonus:
+10 spelldamage per mana point burned
Download

Toggle Triggers

Header

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

ONDAMAGE_chance: 0.28 ONDAMAGE_chanceLevelAdd: 0.0048
function onDamage takes Tower tower returns nothing
            
local unit towerunit = tower.getUnit()
    
    call tower.doAttackDamage(Event.getTarget(),12.5 * GetUnitState(towerunit,UNIT_STATE_MANA),tower.calcAttackMulticrit(0,0,0)) //deal the damage
    call tower.subtractManaPerc(0.75-0.01*tower.getLevel(),true)//drain the mana
    call SFXAtUnit("Abilities\\Spells\\Items\\AIma\\AImaTarget.mdl",Event.getTarget().getUnit())// add some fancy effect
    set towerunit = null
        
endfunction

On Tower Creation

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

Tower Aura

AURA_powerAdd: 10 AURA_auraEffect: sir_drake_aura AURA_levelAdd: 0 AURA_power: 125 AURA_targetType: TARGET_TYPE_TOWERS AURA_targetSelf: false AURA_level: 500 AURA_auraRange: 200