2015-01-28 00:00:00 +00:00
|
|
|
/// <reference path="BaseEffect.ts"/>
|
|
|
|
|
2017-09-24 22:23:22 +00:00
|
|
|
module TK.SpaceTac {
|
2018-03-21 23:52:13 +00:00
|
|
|
/**
|
|
|
|
* Mode for damage effect
|
|
|
|
*/
|
|
|
|
export enum DamageEffectMode {
|
|
|
|
// Apply on shield only
|
|
|
|
SHIELD_ONLY,
|
|
|
|
// Apply on shield, then remaining value on hull
|
|
|
|
SHIELD_THEN_HULL,
|
|
|
|
// Apply on shield only if up, otherwise on hull
|
|
|
|
SHIELD_OR_HULL,
|
|
|
|
// Apply on hull only
|
|
|
|
HULL_ONLY
|
|
|
|
}
|
|
|
|
|
2017-02-07 19:15:21 +00:00
|
|
|
/**
|
|
|
|
* Apply damage on a ship.
|
|
|
|
*/
|
2015-01-28 00:00:00 +00:00
|
|
|
export class DamageEffect extends BaseEffect {
|
2018-03-21 23:52:13 +00:00
|
|
|
// Damage amount
|
2018-03-20 23:23:00 +00:00
|
|
|
value: number
|
2015-01-28 00:00:00 +00:00
|
|
|
|
2018-03-21 23:52:13 +00:00
|
|
|
// Damage mode
|
|
|
|
mode: DamageEffectMode
|
|
|
|
|
2018-03-26 15:30:43 +00:00
|
|
|
// Evadable damage (applies evasion)
|
|
|
|
evadable: boolean
|
|
|
|
|
|
|
|
constructor(value: number, mode = DamageEffectMode.SHIELD_OR_HULL, evadable = true) {
|
2015-01-28 00:00:00 +00:00
|
|
|
super("damage");
|
|
|
|
|
2018-03-20 23:23:00 +00:00
|
|
|
this.value = value;
|
2018-03-21 23:52:13 +00:00
|
|
|
this.mode = mode;
|
2018-03-26 15:30:43 +00:00
|
|
|
this.evadable = true;
|
2017-06-12 22:28:54 +00:00
|
|
|
}
|
|
|
|
|
2017-02-27 00:42:12 +00:00
|
|
|
/**
|
|
|
|
* Get the effective damage done to both shield and hull (in this order)
|
|
|
|
*/
|
2018-03-20 23:23:00 +00:00
|
|
|
getEffectiveDamage(ship: Ship): ShipDamageDiff {
|
2018-03-21 23:52:13 +00:00
|
|
|
let shield = ship.getValue("shield");
|
|
|
|
let hull = ship.getValue("hull");
|
|
|
|
let dhull = 0;
|
|
|
|
let dshield = 0;
|
2017-06-12 22:28:54 +00:00
|
|
|
|
2018-03-26 15:30:43 +00:00
|
|
|
// Apply evasion
|
|
|
|
let evaded = this.evadable ? Math.min(this.value, ship.getAttribute("evasion")) : 0;
|
|
|
|
let damage = this.value - evaded;
|
2015-01-28 00:00:00 +00:00
|
|
|
|
2018-03-21 23:52:13 +00:00
|
|
|
// Split in shield/hull damage
|
|
|
|
if (this.mode == DamageEffectMode.HULL_ONLY) {
|
|
|
|
dhull = Math.min(damage, hull);
|
|
|
|
} else if (this.mode == DamageEffectMode.SHIELD_ONLY) {
|
|
|
|
dshield = Math.min(damage, shield);
|
|
|
|
} else if (this.mode == DamageEffectMode.SHIELD_OR_HULL) {
|
|
|
|
if (shield) {
|
|
|
|
dshield = Math.min(damage, shield);
|
|
|
|
} else {
|
|
|
|
dhull = Math.min(damage, hull);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
dshield = Math.min(damage, shield);
|
|
|
|
dhull = Math.min(damage - dshield, hull);
|
|
|
|
}
|
2015-01-28 00:00:00 +00:00
|
|
|
|
2018-03-26 15:30:43 +00:00
|
|
|
return new ShipDamageDiff(ship, dhull, dshield, evaded, this.value);
|
2017-02-27 00:42:12 +00:00
|
|
|
}
|
|
|
|
|
2018-03-20 23:23:00 +00:00
|
|
|
getOnDiffs(ship: Ship, source: Ship | Drone): BaseBattleDiff[] {
|
2017-11-14 00:07:06 +00:00
|
|
|
let result: BaseBattleDiff[] = [];
|
2015-02-03 00:00:00 +00:00
|
|
|
|
2018-03-20 23:23:00 +00:00
|
|
|
let damage = this.getEffectiveDamage(ship);
|
2017-12-08 00:18:15 +00:00
|
|
|
|
|
|
|
if (damage.shield || damage.hull) {
|
|
|
|
result.push(damage);
|
2017-04-24 17:59:16 +00:00
|
|
|
}
|
2017-11-14 00:07:06 +00:00
|
|
|
|
2017-12-08 00:18:15 +00:00
|
|
|
if (damage.shield) {
|
|
|
|
result.push(new ShipValueDiff(ship, "shield", -damage.shield));
|
2017-11-14 00:07:06 +00:00
|
|
|
}
|
|
|
|
|
2017-12-08 00:18:15 +00:00
|
|
|
if (damage.hull) {
|
|
|
|
result.push(new ShipValueDiff(ship, "hull", -damage.hull));
|
2017-04-24 17:59:16 +00:00
|
|
|
}
|
|
|
|
|
2017-11-14 00:07:06 +00:00
|
|
|
return result;
|
2015-01-28 00:00:00 +00:00
|
|
|
}
|
2017-01-17 00:02:38 +00:00
|
|
|
|
|
|
|
getDescription(): string {
|
2018-03-21 23:52:13 +00:00
|
|
|
let mode = "";
|
|
|
|
if (this.mode == DamageEffectMode.HULL_ONLY) {
|
|
|
|
mode = " hull";
|
|
|
|
} else if (this.mode == DamageEffectMode.SHIELD_ONLY) {
|
|
|
|
mode = " shield";
|
|
|
|
} else if (this.mode == DamageEffectMode.SHIELD_THEN_HULL) {
|
|
|
|
mode = " piercing";
|
|
|
|
}
|
|
|
|
|
|
|
|
return `do ${this.value}${mode} damage`;
|
2017-01-17 00:02:38 +00:00
|
|
|
}
|
2015-01-28 00:00:00 +00:00
|
|
|
}
|
|
|
|
}
|