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) {
|
if (targetX !== undefined && targetY !== undefined) {
|
||||||
const dx = targetX - x
|
const dx = targetX - x
|
||||||
const dy = targetY - y
|
const dy = targetY - y
|
||||||
|
|
|
||||||
|
|
@ -1350,8 +1350,6 @@ export function castSkill(
|
||||||
isTurret: true,
|
isTurret: true,
|
||||||
fireCadenceTicks: 25,
|
fireCadenceTicks: 25,
|
||||||
headIndex: i,
|
headIndex: i,
|
||||||
targetX,
|
|
||||||
targetY,
|
|
||||||
spawnMissileType: 'hydra',
|
spawnMissileType: 'hydra',
|
||||||
pierce: false,
|
pierce: false,
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -249,6 +249,38 @@ describe('[Skill #062] Hydra — 7-Dimensional 1.13c Verification Suite (Issue #
|
||||||
// Target was enemyA
|
// Target was enemyA
|
||||||
expect(spawned[0]!.vy).toBeCloseTo(16, 0.1)
|
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