feat(outro): pausa en negre opac entre sales (5a fase de OUTRO)

Nova fase 4 a ROOM_OUTRO: black_hold. Va just després del fade_out;
durant aquesta fase la pantalla queda completament en negre opac i
la FSM espera abans de transitar a INTRO. Permet donar respir entre
el final del rètol Fase/Completada i el rellançament del Piramide/Sala
de la sala següent, sense necessitat d'un estat nou.

Implementacio:
- RoomFsm::Config guanya outro_black_hold_ms (default 0 — backward
  compatible). YAML key room_outro.black_hold_ms al data/scenes/game.yaml
  (default visible 500 ms; lo afines sense recompilar).
- L'array DURS de l'OUTRO passa de 4 a 5 elements; el while-loop
  consumeix la fase exactament igual.
- renderRoomFade detecta fase 4 i dibuixa alpha=255 fix; sense aquesta
  branca, el fade s'apagaria a final de la fase 3 i el món tornaria
  a ser visible durant la pausa.
- renderRoomText no canvia: phases 3 i 4 ja queden fora del rang
  0..2 on dibuixa el rètol.

Backward compat: black_hold_ms=0 fa que el while-loop avance
immediatament la fase i recauen tots els tests existents (T7 i
companys) sense modificacions.
This commit is contained in:
JailDesigner committed 2026-04-26 17:39:02 +02:00
1 parent 7982df922b
commit 98303f7ce8
4 files changed
+25 -5

No files matched your search

+12 -3
View File
@@ -609,9 +609,16 @@ void GameScene::updateRoomTransition(int delta_ms) {
void GameScene::renderRoomFade() {
// Fade negre sobre el món, pintat un cop els actors ja estan al
// canvas i abans del HUD. Dos casos:
// canvas i abans del HUD. Tres casos:
// ROOM_INTRO/fase 0: 255 → 0 (entrada de sala, món emergent)
// ROOM_OUTRO/fase 3: 0 → 255 (sortida de sala, món s'apaga)
// ROOM_OUTRO/fase 4: alpha=255 fix (pausa en negre opac abans del
// rellançament de la pròxima sala)
if (state_ == RoomFsm::State::ROOM_OUTRO && transition_.phase == 4) {
Screen::get().blendRect(0, 0, GameCanvas::WIDTH, GameCanvas::HEIGHT, 0x00000000U, 255);
return;
}
int dur = 0;
float t = 0.0F;
bool fade_in = false;
@@ -644,8 +651,10 @@ void GameScene::renderRoomText() {
// (piràmide damunt, sala davall) que comparteixen
// animació però es dibuixen amb writeDX independents
// per deixar la porta oberta a desacoblar-les.
// ROOM_OUTRO: phases 0..2 → enter / hold / exit; una línia
// ("fase completada").
// ROOM_OUTRO: phases 0..2 → enter / hold / exit; dues línies
// oposades ("fase" / "completada"). Phase 3 és el
// fade-out i 4 la pausa en negre — cap text en cap
// de les dues.
if (!room_text_font_) { return; }
constexpr int KERNING = 0;