diff --git a/source/game/entities/player.cpp b/source/game/entities/player.cpp index d92f07a..59ff6da 100644 --- a/source/game/entities/player.cpp +++ b/source/game/entities/player.cpp @@ -1075,6 +1075,13 @@ void Player::enterDying() { death_animation_complete_ = false; respawn_remaining_ms_ = 0.0F; setCurrentAnimation("death_spinning"); + + // So del cop letal: reaprofitem `hurt.wav` (ja precarregat per + // `readHurtBlock`). El bloc `death:` no té camp de so propi — + // semànticament l'impacte mortal és la versió forta de `hurt`. + if (!hurt_config.sound_key.empty() && Audio::get() != nullptr) { + Audio::get()->playSound(hurt_config.sound_key, Audio::Group::GAME); + } } void Player::applyDyingMovement(float delta_time) { @@ -1101,11 +1108,12 @@ void Player::respawnFromDying() { --lives_remaining_; death_animation_complete_ = false; respawn_remaining_ms_ = 0.0F; - // `respawn` reseteja l'estat (GROUNDED, facing SOUTH, animació - // `stand_south`) i mou el sprite a les coords del spawn que el - // GameScene ha assignat. No fem `spawnFromAir` per disseny: el - // respawn post-mort és sec, sense cinemàtica de caiguda. - respawn(spawn_x_, spawn_y_); + // Cinemàtica idèntica a la d'INTRO de sala: el jugador cau des de + // dalt fins al passadís d'spawn (`spawnFromAir` reseteja primer i + // després posa AIRBORNE amb l'altura derivada de la geometria). + // Així el respawn post-mort comparteix tota la sensació visual i + // física del primer spawn — incloent el LANDING_STUN final. + spawnFromAir(spawn_x_, spawn_y_); } void Player::applyHurtMovement(float delta_time) { @@ -1160,6 +1168,13 @@ void Player::render() { // vector. if (isOutOfPlay()) { return; } + // Limbo post-mort: durant `respawn_delay_ms` entre la fi de + // `death_spinning` i el `spawnFromAir`, el jugador queda invisible. + // Així el cicle complet és: animació rodant → desapareix → ressuscita + // caient des de dalt. Sense aquest gat, el sprite quedaria pintat al + // darrer frame de la roda mentre passa el delay. + if (state_ == State::DYING && death_animation_complete_) { return; } + // Mentre el jugador està enlaire, el sprite es desplaça visualment // cap amunt `jump_z_` píxels. Modifiquem `pos_.y` (la posició entera // de render) abans de cridar el render base, i la restaurem després