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()