fix(editor): preferDisk en Debug + reload de sala al entrar i sortir

This commit is contained in:
JailDesigner committed 2026-05-02 12:20:16 +02:00
1 parent 2a78c78e77
commit d13313503c
4 files changed
+106 -15

No files matched your search

+43 -8
View File
@@ -607,6 +607,30 @@ void GameScene::enterRoomIntro() {
}
}
#ifdef _DEBUG
void GameScene::respawnPlayersInstant() {
// Variant sense cinemàtica de l'spawn de l'INTRO: per a l'editor
// volem que la sala torni a un estat jugable d'immediat (sense
// música de sala, sense caiguda aèria). Reusem `computeSpawn` i el
// mateix patró de `triggerPlayerSpawn` però cridem `respawn(x, y)`
// (teleport instantani) en lloc de `spawnFromAir(x, y)`.
const auto SPAWN = computeSpawn();
const bool BOTH_ACTIVE = (players_starts_active_[0] && players_starts_active_[1]);
const float SINGLE_X = SPAWN.p1_x + static_cast<float>(Map::tile_size);
for (std::size_t i = 0; i < players_.size(); ++i) {
if (!players_starts_active_[i]) { continue; }
float x = SINGLE_X;
if (BOTH_ACTIVE) { x = (i == 0) ? SPAWN.p1_x : SPAWN.p2_x; }
players_[i]->setSpawnPoint(x, SPAWN.y);
players_[i]->respawn(x, SPAWN.y);
}
state_ = RoomFsm::State::PLAYING;
intro_completed_ = true;
transition_ = {};
std::cout << "[ROOM] post-editor: spawn instantani, estat -> PLAYING\n";
}
#endif
void GameScene::triggerPlayerSpawn(std::size_t slot_index) {
if (slot_index >= players_.size()) { return; }
if (!players_starts_active_[slot_index]) { return; }
@@ -1141,17 +1165,28 @@ void GameScene::update(int delta_ms) {
#ifdef _DEBUG
// Toggle de l'editor: només si no hi ha cap transició de pausa ni
// pausa consolidada. L'editor mateix no consumeix la tecla — la
// llegim ací per decidir la coexistència. Quan se surt del editor,
// recarreguem les entitats des del YAML perquè el manager torne a
// estar sincronitzat amb el que el writer acaba de desar (cada
// sessió d'edició parteix del fitxer, no de l'estat runtime previ).
// llegim ací per decidir la coexistència. Tant a l'entrada com a la
// sortida fem `loadRoom` complet per partir sempre del YAML del
// disc: les entitats tornen a la posició inicial (momies, sarcs),
// el paint layer es buida i els jugadors es desactiven. Així
// l'editor sempre veu l'estat-base de la sala (no el d'una partida
// a meitat) i el joc, en sortir, arrenca fresc amb les edicions ja
// persistides al YAML.
if (pause_.state == PauseState::IDLE && detectEditorToggle()) {
const bool WAS_ACTIVE = editor_.active();
editor_.toggle(tilemap_, entity_manager_);
if (WAS_ACTIVE) {
entity_manager_.reload(Levels::LevelManager::get().currentPath());
const int ACTIVE_COUNT = std::ranges::count(players_starts_active_, true);
entity_manager_.setExpectedPlayerCount(ACTIVE_COUNT);
const bool NOW_ACTIVE = editor_.active();
if (!WAS_ACTIVE && NOW_ACTIVE) {
// Acabem d'entrar: carreguem fresh des del disc. Els
// jugadors es queden DISABLED (l'editor no els pinta de
// totes maneres) i es reactivaran amb el spawn instantani
// a la sortida.
loadRoom(Levels::LevelManager::get().currentPath());
} else if (WAS_ACTIVE && !NOW_ACTIVE) {
// Acabem de sortir: el writer ja ha persistit el YAML.
// Carreguem fresh i fem spawn instantani sense cinemàtica.
loadRoom(Levels::LevelManager::get().currentPath());
respawnPlayersInstant();
}
}