package FlamethrowerTower import Tower import Projectile import DummyDamage import Heightmap public constant string FX_PATH = "Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missile.mdl"//"Abilities\\Weapons\\LordofFlameMissile\\LordofFlameMissile.mdl" public constant real AOE_RADIUS = 48. public constant int FLAMETHROWER_ID = 'h01C' function getDamage(int level) returns real return 9. + 5.75 * level function getSpeed(int level) returns real return 6.45 + level * 1.55 public class FlamethrowerTower extends Tower int level = 1 construct(Tower t) super(t) override function onAttack(UnitEntity ud) new FlameMissile(pos.toVec2().withHeightMap(58),ud.getPos().toVec2(), getSpeed(level), owner, level) override function onUpgrade() actor.issueImmediateOrderById(OrderId("stop")) level++ function isUnitTargetable(unit u) returns boolean return not IsUnitType(u, UNIT_TYPE_DEAD) and not IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) and not IsUnitType(u, UNIT_TYPE_STRUCTURE) and not IsUnitType(u, UNIT_TYPE_FLYING) class FlameMissile extends Projectile int level group affected construct(vec3 pos, vec2 target, real speed, player owner, int level) super( pos, AOE_RADIUS, owner, (pos.angleTo2d(target).radians + GetRandomReal(-0.025,0.025)).asAngleRadians(), FX_PATH ) setSpeed(speed + GetRandomReal(-0.5, 0.5)) setRanged(712 + GetRandomReal(-5, 5)) setAcc(1.0195 + GetRandomReal(-0.0025, 0.0075)) fx.eff..setScale(0.2) ..setColor(colorA(GetRandomInt(0,255),GetRandomInt(0,255),GetRandomInt(0,255),255)) ..setScale(0.75) this.level = level override function update() let dmg = new DummyDamage()..attacker(owner)..amount(getDamage(level))..attackType(ATTACK_TYPE_SIEGE) GroupEnumUnitsInRange(ENUM_GROUP, pos.x, pos.y, AOE_RADIUS, null) for u from ENUM_GROUP if IsUnitEnemy(u, owner) and isUnitTargetable(u) dmg..target(u) ..apply() destroy dmg super.update()