feat(debug): tecla Keypad 1 per forçar l'obertura de la porta

Hook només Debug que crida EntityManager::forceOpenDoor (nou helper
públic que delega a Door::open). El flux posterior — creuar la porta,
player_exited, level_complete, transició a OUTRO — funciona idèntic
al del joc real, perquè depèn de la Door, no del comptador de
sarcòfags. Útil per saltar la mecànica de pintat/sarcs durant proves
de progressió de sales.

Tecla configurable a data/input/keys.yaml > id: open_door
(per defecte Keypad 1). Mateixos gates que els salts [/]: ignora la
pulsació si la pausa està activa o l'editor obert. En Release la
ENTRADA del YAML segueix carregant-se però no té consumidor.
This commit is contained in:
JailDesigner committed 2026-04-26 17:20:12 +02:00
1 parent 3b05704e97
commit 8da18a6a86
4 files changed
+31

No files matched your search

+3
View File
@@ -53,6 +53,9 @@ keys:
- id: next_room - id: next_room
code: "]" code: "]"
desc: "Salta a la sala següent del levels.yaml (només Debug)" desc: "Salta a la sala següent del levels.yaml (només Debug)"
- id: open_door
code: "Keypad 1"
desc: "Força l'obertura de la porta de la sala (només Debug)"
- id: exit - id: exit
code: "Escape" code: "Escape"
desc: "Eixir (confirmar amb segona pulsació)" desc: "Eixir (confirmar amb segona pulsació)"
+4
View File
@@ -65,6 +65,10 @@ void EntityManager::setExpectedPlayerCount(int n) {
level_complete_emitted_ = false; level_complete_emitted_ = false;
} }
void EntityManager::forceOpenDoor() {
if (door_ != nullptr) { door_->open(); }
}
auto EntityManager::add(std::unique_ptr<Entity> entity) -> Entity* { auto EntityManager::add(std::unique_ptr<Entity> entity) -> Entity* {
if (entity == nullptr) { return nullptr; } if (entity == nullptr) { return nullptr; }
entity->setEventBus(&bus_); entity->setEventBus(&bus_);
+7
View File
@@ -112,6 +112,13 @@ class EntityManager {
[[nodiscard]] auto openedSarcophagusCount() const -> std::size_t { return opened_sarcs_; } [[nodiscard]] auto openedSarcophagusCount() const -> std::size_t { return opened_sarcs_; }
[[nodiscard]] auto exitedPlayerCount() const -> std::size_t { return exited_players_; } [[nodiscard]] auto exitedPlayerCount() const -> std::size_t { return exited_players_; }
// Força l'obertura de la porta sense que els sarcòfags estiguin
// oberts. Pensat com a hook de debug per a la GameScene: el flux
// posterior (creuar la porta → `player_exited` → `level_complete`
// → OUTRO) segueix exactament igual perquè depèn de Door, no de
// sarcs. No-op si la porta ja està oberta o si el nivell no en té.
void forceOpenDoor();
private: private:
EventBus bus_; EventBus bus_;
std::vector<std::unique_ptr<Entity>> entities_; std::vector<std::unique_ptr<Entity>> entities_;
+17
View File
@@ -853,6 +853,14 @@ namespace {
} }
return 0; return 0;
} }
auto detectOpenDoor() -> bool {
const SDL_Scancode SC = KeyConfig::get().scancode("open_door");
if (SC == SDL_SCANCODE_UNKNOWN) { return false; }
return std::ranges::any_of(EventBuffer::events, [SC](const SDL_Event& ev) {
return ev.type == SDL_EVENT_KEY_DOWN && ev.key.scancode == SC;
});
}
} // namespace } // namespace
#endif #endif
@@ -885,6 +893,15 @@ void GameScene::update(int delta_ms) {
enterRoomIntro(); enterRoomIntro();
} }
} }
// Força l'obertura de la porta (Keypad 1). Útil per saltar el
// pintat/sarcs durant proves de progressió. La resta del flux
// (creuar → player_exited → level_complete → OUTRO) es manté.
// Mateixos gates que el salt entre sales.
if (pause_.state == PauseState::IDLE && !editor_.active() && detectOpenDoor()) {
std::cout << "[DEBUG] força obertura de la porta\n";
entity_manager_.forceOpenDoor();
}
#endif #endif
GlobalInputs::update(delta_ms); GlobalInputs::update(delta_ms);