fix(col·lisions): les bales d'enemic deixen de comptar com a foc amic (out-of-bounds a lives_per_player) i maten d'un toc

This commit is contained in:
2026-05-28 13:13:36 +02:00
parent c1956e0028
commit 92f76d091d
+10 -15
View File
@@ -145,6 +145,12 @@ namespace Systems::Collision {
continue;
}
const uint8_t BULLET_OWNER = bullet.getOwnerId();
// Les bales d'enemic NO són friendly fire: les gestiona
// detectEnemyBulletShip. Sense aquest filtre, owner >= ENEMY_OWNER_BASE
// entraria ací i faria un out-of-bounds a lives_per_player[owner].
if (BULLET_OWNER >= Defaults::Entities::ENEMY_OWNER_BASE) {
continue;
}
for (uint8_t player_id = 0; player_id < 2; player_id++) {
// Una bala mai no impacta al seu propi shooter: les bales d'aquest joc no
@@ -208,22 +214,11 @@ namespace Systems::Collision {
}
// *** BALA D'ENEMIC → SHIP ***
// Regla "cos XOR trossos": l'impuls de la bala s'aplica al cos
// només si el ship sobreviu (fereix). Si el ship mor, el bullet
// va directament als trossos (via tocado) i el cos no rep impuls
// — els trossos ja porten la força de la bala, qualsevol impuls
// afegit al cos seria double-count.
// Mata d'un sol toc (decisió de disseny). El bullet va als trossos
// via tocado; el cos no rep impuls (seria double-count amb la
// velocitat que ja hereten els trossos).
const Vec2 BULLET_VEL = bullet.getBody().velocity;
if (ctx.ships[player_id].isHurt()) {
// Segon impacte durant HURT → mort.
ctx.on_player_hit(player_id, BULLET_VEL);
} else {
// Fereix: el cos sobreviu, rep l'impuls. No hi ha debris encara.
const Vec2 IMPULSE = BULLET_VEL *
(bullet.getBody().mass * bullet.getConfig().physics.impact_momentum_factor);
ctx.ships[player_id].getBody().applyImpulse(IMPULSE);
ctx.ships[player_id].hurt();
}
ctx.on_player_hit(player_id, BULLET_VEL);
breakBullet(ctx.debris_manager, bullet);
break; // una bala impacta una vegada per frame
}