From da124e0f42e0ce76955bb2ecf3d77330cdd2fe19 Mon Sep 17 00:00:00 2001 From: Amir Arad Date: Mon, 29 Apr 2024 03:58:15 +0300 Subject: [PATCH] fix armor measurement logic, damage and test (#1733) * fix armor measurement logic, damage and test --- modules/core/src/ship/armor.ts | 4 +++- modules/core/src/ship/damage-manager.ts | 3 +-- modules/core/test/ship-manager.spec.ts | 8 ++++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/core/src/ship/armor.ts b/modules/core/src/ship/armor.ts index d011b814..38dc7396 100644 --- a/modules/core/src/ship/armor.ts +++ b/modules/core/src/ship/armor.ts @@ -48,7 +48,9 @@ export class Armor extends Schema { } public numberOfPlatesInRange(localAngleHitRange: RTuple2): number { - return Math.ceil(toPositiveDegreesDelta(localAngleHitRange[1] - localAngleHitRange[0]) / this.degreesPerPlate); + const firstPlateHitOffset = toPositiveDegreesDelta(localAngleHitRange[0]) % this.degreesPerPlate; + const hitRangeSize = toPositiveDegreesDelta(localAngleHitRange[1] - localAngleHitRange[0]); + return Math.ceil((firstPlateHitOffset + hitRangeSize) / this.degreesPerPlate); } public *platesInRange(localAngleHitRange: RTuple2): IterableIterator<[number, ArmorPlate]> { diff --git a/modules/core/src/ship/damage-manager.ts b/modules/core/src/ship/damage-manager.ts index ca89a557..7d27070c 100644 --- a/modules/core/src/ship/damage-manager.ts +++ b/modules/core/src/ship/damage-manager.ts @@ -25,7 +25,6 @@ import { Reactor } from './reactor'; import { ShipState } from './ship-state'; import { Thruster } from './thruster'; import { Warp } from './warp'; -import { gaussianRandom } from '..'; export class DamageManager { constructor( @@ -201,7 +200,7 @@ export class DamageManager { private applyDamageToArmor(damageFactor: number, localAnglesHitRange: RTuple2) { for (const [_, plate] of this.state.armor.platesInRange(localAnglesHitRange)) { if (plate.health > 0) { - const newHealth = plate.health - damageFactor * gaussianRandom(20, 4); + const newHealth = plate.health - damageFactor; plate.health = Math.max(newHealth, 0); } } diff --git a/modules/core/test/ship-manager.spec.ts b/modules/core/test/ship-manager.spec.ts index 76b0893e..966a97c9 100644 --- a/modules/core/test/ship-manager.spec.ts +++ b/modules/core/test/ship-manager.spec.ts @@ -42,6 +42,7 @@ describe.each([ShipManagerPc, ShipManagerNpc])('%p', (shipManagerCtor) => { spaceMgr, die, ); + shipMgr.state.armor.design.healRate = 0; die.expectedRoll = 1; spaceMgr.insert(shipObj); shipMgr.setSmartPilotManeuveringMode(SmartPilotMode.DIRECT); @@ -65,19 +66,18 @@ describe.each([ShipManagerPc, ShipManagerNpc])('%p', (shipManagerCtor) => { shipMgr.update(id); spaceMgr.update(id); } - const expectedHitPlatesRange = padArch( [explosionAngleToShip, explosionAngleToShip], sizeOfPlate + EPSILON, ); //@ts-ignore : access private property - const brokenOutsideExplosion = shipMgr.damageManager.getNumberOfBrokenPlatesInRange([EPSILON, 360]); - expect(brokenOutsideExplosion).to.equal(2); + const brokenTotal = shipMgr.damageManager.getNumberOfBrokenPlatesInRange([EPSILON, 360]); + expect(brokenTotal).to.oneOf([2, 3]); const brokenInsideExplosion = //@ts-ignore : access private property shipMgr.damageManager.getNumberOfBrokenPlatesInRange(expectedHitPlatesRange); - expect(brokenInsideExplosion).to.equal(2); + expect(brokenInsideExplosion).to.equal(brokenTotal); expect(shipMgr.state.chainGun!.broken).to.be.false; expect(shipMgr.state.chainGun!.angleOffset).to.equal(0); expect(shipMgr.state.chainGun!.rateOfFireFactor).to.equal(1);