2015-01-28 00:00:00 +00:00
|
|
|
/// <reference path="BaseEffect.ts"/>
|
|
|
|
|
2017-09-24 22:23:22 +00:00
|
|
|
module TK.SpaceTac {
|
2017-02-07 19:15:21 +00:00
|
|
|
/**
|
|
|
|
* Apply damage on a ship.
|
|
|
|
*
|
|
|
|
* Damage is applied on shield while there is some, then on the hull.
|
|
|
|
*/
|
2015-01-28 00:00:00 +00:00
|
|
|
export class DamageEffect extends BaseEffect {
|
|
|
|
// Base damage points
|
2017-05-10 20:52:24 +00:00
|
|
|
base: number;
|
2015-01-28 00:00:00 +00:00
|
|
|
|
2017-05-10 20:52:24 +00:00
|
|
|
// Range of randomness (effective damage will be between *value* and *value+range*)
|
|
|
|
span: number;
|
|
|
|
|
|
|
|
constructor(value = 0, span = 0) {
|
2015-01-28 00:00:00 +00:00
|
|
|
super("damage");
|
|
|
|
|
2017-05-10 20:52:24 +00:00
|
|
|
this.base = value;
|
|
|
|
this.span = span;
|
2015-01-28 00:00:00 +00:00
|
|
|
}
|
2015-01-28 00:00:00 +00:00
|
|
|
|
2017-06-12 22:28:54 +00:00
|
|
|
/**
|
|
|
|
* Apply damage modifiers to get the final damage factor
|
|
|
|
*/
|
|
|
|
getFactor(ship: Ship): number {
|
|
|
|
let percent = 0;
|
|
|
|
iforeach(ship.ieffects(), effect => {
|
|
|
|
if (effect instanceof DamageModifierEffect) {
|
|
|
|
percent += effect.factor;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return (clamp(percent, -100, 100) + 100) / 100;
|
|
|
|
}
|
|
|
|
|
2017-02-27 00:42:12 +00:00
|
|
|
/**
|
|
|
|
* Get the effective damage done to both shield and hull (in this order)
|
|
|
|
*/
|
|
|
|
getEffectiveDamage(ship: Ship): [number, number] {
|
2017-05-10 20:52:24 +00:00
|
|
|
var damage = (this.span > 0) ? RandomGenerator.global.randInt(this.base, this.base + this.span) : this.base;
|
2015-02-03 00:00:00 +00:00
|
|
|
var hull: number;
|
|
|
|
var shield: number;
|
2015-01-28 00:00:00 +00:00
|
|
|
|
2017-06-12 22:28:54 +00:00
|
|
|
// Apply modifiers
|
|
|
|
damage = Math.round(damage * this.getFactor(ship));
|
|
|
|
|
2015-01-28 00:00:00 +00:00
|
|
|
// Apply on shields
|
2017-02-07 19:15:21 +00:00
|
|
|
if (damage >= ship.values.shield.get()) {
|
|
|
|
shield = ship.values.shield.get();
|
2015-01-28 00:00:00 +00:00
|
|
|
} else {
|
2015-02-03 00:00:00 +00:00
|
|
|
shield = damage;
|
2015-01-28 00:00:00 +00:00
|
|
|
}
|
2015-02-03 00:00:00 +00:00
|
|
|
damage -= shield;
|
2015-01-28 00:00:00 +00:00
|
|
|
|
|
|
|
// Apply on hull
|
2017-02-07 19:15:21 +00:00
|
|
|
if (damage >= ship.values.hull.get()) {
|
|
|
|
hull = ship.values.hull.get();
|
2015-01-28 00:00:00 +00:00
|
|
|
} else {
|
2015-02-03 00:00:00 +00:00
|
|
|
hull = damage;
|
2015-01-28 00:00:00 +00:00
|
|
|
}
|
|
|
|
|
2017-02-27 00:42:12 +00:00
|
|
|
return [shield, hull];
|
|
|
|
}
|
|
|
|
|
2017-05-28 22:16:50 +00:00
|
|
|
applyOnShip(ship: Ship, source: Ship | Drone): boolean {
|
2017-02-27 00:42:12 +00:00
|
|
|
let [shield, hull] = this.getEffectiveDamage(ship);
|
2017-04-24 17:59:16 +00:00
|
|
|
|
2015-02-03 00:00:00 +00:00
|
|
|
ship.addDamage(hull, shield);
|
|
|
|
|
2017-04-24 17:59:16 +00:00
|
|
|
if (shield > 0) {
|
|
|
|
ship.listEquipment(SlotType.Shield).forEach(equipment => equipment.addWear(Math.ceil(shield * 0.01)));
|
|
|
|
}
|
|
|
|
if (hull > 0) {
|
|
|
|
ship.listEquipment(SlotType.Hull).forEach(equipment => equipment.addWear(Math.ceil(hull * 0.01)));
|
|
|
|
}
|
|
|
|
|
2015-01-28 00:00:00 +00:00
|
|
|
return true;
|
|
|
|
}
|
2017-01-17 00:02:38 +00:00
|
|
|
|
|
|
|
getDescription(): string {
|
2017-05-10 20:52:24 +00:00
|
|
|
if (this.span > 0) {
|
|
|
|
return `do ${this.base}-${this.base + this.span} damage`;
|
|
|
|
} else {
|
|
|
|
return `do ${this.base} damage`;
|
|
|
|
}
|
2017-01-17 00:02:38 +00:00
|
|
|
}
|
2015-01-28 00:00:00 +00:00
|
|
|
}
|
|
|
|
}
|