feat(collision): primer impacte fereix, segon mata; mort diferida via timer (Fase 3)
- Defaults::Physics::Debris::ENEMY_VELOCITY_INHERITANCE (placeholder 1.0). - Enemy::herir(shooter_id) emmagatzema last_hit_by_ per a atribució posterior. - collision_system: helper anònim explodeNow(ctx, enemy, shooter_id) que llegeix velocity/dades ABANS de destruir() (corregeix bug latent: el codi anterior llegia getVelocityVector() després de destruir, que zera velocity → l'explosió mai heretava inèrcia). - detectBulletEnemy: primer impacte aplica impulse + herir(); segon impacte sobre enemy ferit dispara explodeNow immediata. - processWoundedDeaths: explota enemics amb wound timer expirat aquest frame. - detectAll: processWoundedDeaths abans de detectBulletEnemy (les expiracions maten primer; les bales del mateix frame ja no toquen el cos destruït). Puntos s'atribueixen a la mort real, no a l'impacte inicial. Build neta i smoke test xvfb OK. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -26,9 +26,9 @@
|
||||
|
||||
namespace Systems::Collision {
|
||||
|
||||
// Todo lo que las detecciones necesitan leer/modificar. Vive en GameScene;
|
||||
// se le pasa por referencia (no copia, no ownership).
|
||||
struct Context {
|
||||
// Todo lo que las detecciones necesitan leer/modificar. Vive en GameScene;
|
||||
// se le pasa por referencia (no copia, no ownership).
|
||||
struct Context {
|
||||
std::array<Ship, 2>& ships;
|
||||
std::array<Enemy, Defaults::Entities::MAX_ORNIS>& enemies;
|
||||
std::array<Bullet, static_cast<std::size_t>(Defaults::Entities::MAX_BALES) * 2>& bullets;
|
||||
@@ -40,24 +40,26 @@ struct Context {
|
||||
const GameConfig::MatchConfig& match_config;
|
||||
// Trigger de muerte del jugador (GameScene::tocado).
|
||||
std::function<void(uint8_t /*player_id*/)> on_player_hit;
|
||||
};
|
||||
};
|
||||
|
||||
// Detecta colisiones bullet → enemy. Si hit:
|
||||
// - destruye el enemy (radius=0 en physics body)
|
||||
// - crea debris + floating score
|
||||
// - desactiva la bullet
|
||||
// - suma puntos al shooter
|
||||
void detectBulletEnemy(Context& ctx);
|
||||
// Detecta colisiones bullet → enemy. Si hit:
|
||||
// - Primer impacto: aplica impulse, marca al enemy como "herido", desactiva bullet.
|
||||
// - Segundo impacto (enemy ya herido): explosión inmediata + puntos al shooter.
|
||||
void detectBulletEnemy(Context& ctx);
|
||||
|
||||
// Detecta colisiones ship → enemy. Si hit, llama on_player_hit(player_id).
|
||||
void detectShipEnemy(Context& ctx);
|
||||
// Procesa enemigos cuyo wound timer ha expirado este frame: explosión + puntos
|
||||
// al `last_hit_by_` del enemy (si está set).
|
||||
void processWoundedDeaths(Context& ctx);
|
||||
|
||||
// Detecta colisiones bullet → player (friendly fire / self-hit).
|
||||
// Self-hit: el shooter pierde 1 vida. Teammate-hit: la víctima pierde 1, el
|
||||
// atacante gana 1. En ambos casos, llama on_player_hit y desactiva bullet.
|
||||
void detectBulletPlayer(Context& ctx);
|
||||
// Detecta colisiones ship → enemy. Si hit, llama on_player_hit(player_id).
|
||||
void detectShipEnemy(Context& ctx);
|
||||
|
||||
// Las tres en orden lógico del frame.
|
||||
void detectAll(Context& ctx);
|
||||
// Detecta colisiones bullet → player (friendly fire / self-hit).
|
||||
// Self-hit: el shooter pierde 1 vida. Teammate-hit: la víctima pierde 1, el
|
||||
// atacante gana 1. En ambos casos, llama on_player_hit y desactiva bullet.
|
||||
void detectBulletPlayer(Context& ctx);
|
||||
|
||||
// Las tres en orden lógico del frame.
|
||||
void detectAll(Context& ctx);
|
||||
|
||||
} // namespace Systems::Collision
|
||||
|
||||
Reference in New Issue
Block a user