fix(skills): eliminate idle hydra turret inward crossfire self-targeting (Ref #399)
- Remove targetX and targetY from stationary turret projectile definition in castSkill (act-scene.ts) - Remove idle fallback to projectile.targetX/Y in tickProjectiles (skills.ts) so turrets only fire when an alive target is found within range - Add negative unit test in Dimension 3 verifying 0 projectiles are spawned over 50 ticks with empty targets array
This commit is contained in:
parent
ebaa1b4df2
commit
39c25dfe6f
|
|
@ -2713,11 +2713,6 @@ export function tickProjectiles(
|
|||
}
|
||||
}
|
||||
|
||||
if (targetX === undefined && projectile.targetX !== undefined && projectile.targetY !== undefined) {
|
||||
targetX = projectile.targetX
|
||||
targetY = projectile.targetY
|
||||
}
|
||||
|
||||
if (targetX !== undefined && targetY !== undefined) {
|
||||
const dx = targetX - x
|
||||
const dy = targetY - y
|
||||
|
|
|
|||
|
|
@ -1350,8 +1350,6 @@ export function castSkill(
|
|||
isTurret: true,
|
||||
fireCadenceTicks: 25,
|
||||
headIndex: i,
|
||||
targetX,
|
||||
targetY,
|
||||
spawnMissileType: 'hydra',
|
||||
pierce: false,
|
||||
})
|
||||
|
|
|
|||
|
|
@ -249,6 +249,38 @@ describe('[Skill #062] Hydra — 7-Dimensional 1.13c Verification Suite (Issue #
|
|||
// Target was enemyA
|
||||
expect(spawned[0]!.vy).toBeCloseTo(16, 0.1)
|
||||
})
|
||||
|
||||
it('spawns exactly 0 projectiles over 50 ticks when targets array is empty (idle turret parity)', () => {
|
||||
const turret: Projectile = {
|
||||
skillId: '62',
|
||||
x: 100,
|
||||
y: 100,
|
||||
vx: 0,
|
||||
vy: 0,
|
||||
damage: 35,
|
||||
ttl: 250,
|
||||
fromPlayer: true,
|
||||
missileType: 'hydra_turret',
|
||||
isTurret: true,
|
||||
fireCadenceTicks: 25,
|
||||
spawnMissileType: 'hydra',
|
||||
targetX: 100,
|
||||
targetY: 100,
|
||||
}
|
||||
|
||||
let current: readonly Projectile[] = [turret]
|
||||
const spawnedBolts: Projectile[] = []
|
||||
|
||||
for (let tick = 1; tick <= 50; tick++) {
|
||||
const res = tickProjectiles(current, [], { overlap: () => 0 })
|
||||
if (res.spawnedProjectiles && res.spawnedProjectiles.length > 0) {
|
||||
spawnedBolts.push(...res.spawnedProjectiles)
|
||||
}
|
||||
current = res.alive.filter(p => p.isTurret)
|
||||
}
|
||||
|
||||
expect(spawnedBolts.length).toBe(0)
|
||||
})
|
||||
})
|
||||
|
||||
// =========================================================================
|
||||
|
|
|
|||
Loading…
Reference in New Issue