package WaveTower import Tower import Boss import Assets import GroupUtils import ClosureForGroups import DummyDamage import Heightmap public constant FIRST_WAVE_ID = 'h01N' constant AREA_OF_EFFECT = 192. public class WaveTower extends Tower int level = 1 construct(Tower t) super(t) override function onAttack(UnitEntity ud) new WaveMissile(getPos().toVec2().withHeightMap(38), ud.getPos().toVec2(), 22, owner, level, actor) override function onUpgrade() actor.issueImmediateOrderById(OrderId("stop")) level++ function getBlowDamage(int level) returns real//towerlevel return ((75. * level) + 125.) function getDOT(int level) returns real//towerlevel return ((4.5 * level)) function getKB(int level) returns real//towerlevel return (4.85 + (level*level)) class WaveMissile extends Projectile let affected = getGroup() int level unit tower construct(vec3 pos, vec2 target, real speed, player owner, int level, unit tower) super(pos, AREA_OF_EFFECT, owner, pos.angleTo2d(target), Abilities.crushingWaveMissile) setZAngle(angle(0)) this.tower = tower setSpeed(speed) setAcc(0.975) this.level = level override function update() super.update() if(getVel().lengthSquared() < 16) terminate() return let dotDmg = new DummyDamage()..attacker(owner)..amount(getDOT(level))..attackType(ATTACK_TYPE_PIERCE) let splashDmg = new DummyDamage()..attacker(owner)..amount(getBlowDamage(level))..attackType(ATTACK_TYPE_PIERCE) forUnitsInRange(pos.toVec2(), AREA_OF_EFFECT) u -> if u.isAliveTrick() and not u.isType(UNIT_TYPE_FLYING) let data = u.getEntity() if affected.has(u) dotDmg..target(u) ..apply() else if data != null and data instanceof Creep and not data.done let cd = data castTo Creep affected.has(u) splashDmg..target(u) ..apply() let upos = data.getPos() let ang = pos.angleTo2d(upos) let kb = getKB(level) * min(0.35, vel.lengthSquared()/(16.*16.)) if data instanceof Boss let speedPerc = 0.25 + (cd.actor.getMoveSpeed() / 522) * 0.75 data.setVel(vec3(ang.cos() * (kb * speedPerc),ang.sin() * (kb * speedPerc),0)) else data.setVel(vec3(ang.cos() * kb,ang.sin() * kb,0)) addEffect(Abilities.gryphonRiderMissileTarget, u.getPos() ).destr() destroy dotDmg destroy splashDmg ondestroy affected.release()