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:
1 parent
3b05704e97
commit
8da18a6a86
4 files changed
+31
No files matched your search
@@ -65,6 +65,10 @@ void EntityManager::setExpectedPlayerCount(int n) {
|
||||
level_complete_emitted_ = false;
|
||||
}
|
||||
|
||||
void EntityManager::forceOpenDoor() {
|
||||
if (door_ != nullptr) { door_->open(); }
|
||||
}
|
||||
|
||||
auto EntityManager::add(std::unique_ptr<Entity> entity) -> Entity* {
|
||||
if (entity == nullptr) { return nullptr; }
|
||||
entity->setEventBus(&bus_);
|
||||
|
||||
@@ -112,6 +112,13 @@ class EntityManager {
|
||||
[[nodiscard]] auto openedSarcophagusCount() const -> std::size_t { return opened_sarcs_; }
|
||||
[[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:
|
||||
EventBus bus_;
|
||||
std::vector<std::unique_ptr<Entity>> entities_;
|
||||
|
||||
@@ -853,6 +853,14 @@ namespace {
|
||||
}
|
||||
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
|
||||
#endif
|
||||
|
||||
@@ -885,6 +893,15 @@ void GameScene::update(int delta_ms) {
|
||||
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
|
||||
|
||||
GlobalInputs::update(delta_ms);
|
||||
|
||||
Reference in new issue
Block a user