feat(game): spawn inicial de ROOM_INTRO sense immunitat

This commit is contained in:
JailDesigner committed 2026-05-11 07:53:56 +02:00
1 parent 2cbf1bb6e0
commit b7811180ba
3 files changed
+19 -8

No files matched your search

+7 -4
View File
@@ -1589,10 +1589,13 @@ void Player::respawn(float x, float y) {
setPosX(x); setPosX(x);
setPosY(y); setPosY(y);
// Immunitat post-spawn: armem la finestra de gràcia amb la durada del // Immunitat post-spawn: armem la finestra de gràcia amb la durada del
// YAML. Cobreix l'aparició inicial (`spawnFromAir` → `respawn`) i el // YAML. Cobreix el join mid-partida (`joinPlayer` → `spawnFromAir` →
// respawn post-mort (`respawnFromDying` → `respawn`). Si el bloc // `respawn`) i el respawn post-mort (`respawnFromDying` → `respawn`).
// `immunity:` manca al YAML, `duration_ms` és 0 i `setImmunity` és // L'spawn inicial de ROOM_INTRO també hi passa, però `triggerPlayerSpawn`
// no-op — comportament idèntic al d'abans. // crida `setImmunity(0)` immediatament després per cancel·lar-la (els
// enemics ja estan apareixent i el jugador no ha de tindre gràcia).
// Si el bloc `immunity:` manca al YAML, `duration_ms` és 0 i el timer
// queda a 0 — sense gràcia, comportament idèntic al d'abans.
setImmunity(immunity_config.duration_ms); setImmunity(immunity_config.duration_ms);
} }
+4 -4
View File
@@ -331,11 +331,11 @@ class Player : public AnimatedSprite {
// sortida lògica del món. Idempotent: una segona crida reescriu el // sortida lògica del món. Idempotent: una segona crida reescriu el
// timer (no acumula). Visualment, el render alterna la paleta del // timer (no acumula). Visualment, el render alterna la paleta del
// sprite amb una paleta plana cada `immunity_config.blink_period_ms` // sprite amb una paleta plana cada `immunity_config.blink_period_ms`
// ms. Si `duration_ms <= 0` és no-op (manera de cancel·lar // ms. `setImmunity(0)` cancel·la la immunitat activa (sobreescriu el
// explícitament la immunitat seria `setImmunity(0)` — equivalent al // timer a 0) — equivalent al comportament natural quan el timer
// comportament natural quan el timer s'esgota). // s'esgota. Valors negatius es clampejen a 0.
void setImmunity(float duration_ms) { void setImmunity(float duration_ms) {
if (duration_ms > 0.0F) { immunity_remaining_ms_ = duration_ms; } immunity_remaining_ms_ = duration_ms > 0.0F ? duration_ms : 0.0F;
} }
// Cert mentre el jugador té immunitat activa. Comprovat per // Cert mentre el jugador té immunitat activa. Comprovat per
+8
View File
@@ -701,6 +701,14 @@ void GameScene::triggerPlayerSpawn(std::size_t slot_index) {
// pot canviar de geometria de porta entre cicles. // pot canviar de geometria de porta entre cicles.
players_[slot_index]->setSpawnPoint(x, SPAWN.y); players_[slot_index]->setSpawnPoint(x, SPAWN.y);
players_[slot_index]->spawnFromAir(x, SPAWN.y); players_[slot_index]->spawnFromAir(x, SPAWN.y);
// Spawn inicial sense gràcia: l'aparició coincideix amb el moment
// en què comencen a aparèixer els enemics, i la finestra d'immunitat
// que arma `respawn` deixaria al jugador immune just quan ja hauria
// de poder ser tocat. Cancel·lem el timer recent armat. Els altres
// camins (`joinPlayer` mid-partida i `respawnFromDying`) sí que
// mantenen la immunitat: són situacions on el jugador apareix enmig
// de l'acció ja en curs i necessita la finestra de gràcia.
players_[slot_index]->setImmunity(0.0F);
// Arma el reverb del primer LAND com a part de la cinemàtica // Arma el reverb del primer LAND com a part de la cinemàtica
// d'INTRO. Una sola vegada per spawn aeri: el respawn post-mort // d'INTRO. Una sola vegada per spawn aeri: el respawn post-mort
// (que no passa per ací) cau al camí sec. Si el preset està buit // (que no passa per ací) cau al camí sec. Si el preset està buit