- es pot canviar d'habitacio amb el editor obert
- nous comandos per a navegar per les habitacions (left, right, up i down)
This commit is contained in:
@@ -201,9 +201,9 @@ categories:
|
|||||||
- keyword: ROOM
|
- keyword: ROOM
|
||||||
handler: cmd_room
|
handler: cmd_room
|
||||||
description: "Change to room number (GAME only)"
|
description: "Change to room number (GAME only)"
|
||||||
usage: "ROOM <1-60>|NEXT|PREV"
|
usage: "ROOM <1-60>|NEXT|PREV|LEFT|RIGHT|UP|DOWN"
|
||||||
completions:
|
completions:
|
||||||
ROOM: [NEXT, PREV]
|
ROOM: [NEXT, PREV, LEFT, RIGHT, UP, DOWN]
|
||||||
|
|
||||||
- keyword: SCENE
|
- keyword: SCENE
|
||||||
handler: cmd_scene
|
handler: cmd_scene
|
||||||
|
|||||||
@@ -28,5 +28,6 @@ namespace GameControl {
|
|||||||
inline std::function<void()> exit_editor;
|
inline std::function<void()> exit_editor;
|
||||||
inline std::function<std::string()> revert_editor;
|
inline std::function<std::string()> revert_editor;
|
||||||
inline std::function<void()> reload_current_room; // Recarga la habitación actual desde disco
|
inline std::function<void()> reload_current_room; // Recarga la habitación actual desde disco
|
||||||
|
inline std::function<std::string(const std::string&)> get_adjacent_room; // Obtiene la room adyacente (UP/DOWN/LEFT/RIGHT)
|
||||||
} // namespace GameControl
|
} // namespace GameControl
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -133,6 +133,13 @@ Game::Game(Mode mode)
|
|||||||
GameControl::revert_editor = []() -> std::string {
|
GameControl::revert_editor = []() -> std::string {
|
||||||
return MapEditor::get()->revert();
|
return MapEditor::get()->revert();
|
||||||
};
|
};
|
||||||
|
GameControl::get_adjacent_room = [this](const std::string& direction) -> std::string {
|
||||||
|
if (direction == "UP") { return room_->getRoom(Room::Border::TOP); }
|
||||||
|
if (direction == "DOWN") { return room_->getRoom(Room::Border::BOTTOM); }
|
||||||
|
if (direction == "LEFT") { return room_->getRoom(Room::Border::LEFT); }
|
||||||
|
if (direction == "RIGHT") { return room_->getRoom(Room::Border::RIGHT); }
|
||||||
|
return "0";
|
||||||
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SceneManager::current = (mode_ == Mode::GAME) ? SceneManager::Scene::GAME : SceneManager::Scene::DEMO;
|
SceneManager::current = (mode_ == Mode::GAME) ? SceneManager::Scene::GAME : SceneManager::Scene::DEMO;
|
||||||
@@ -158,6 +165,7 @@ Game::~Game() {
|
|||||||
GameControl::exit_editor = nullptr;
|
GameControl::exit_editor = nullptr;
|
||||||
GameControl::revert_editor = nullptr;
|
GameControl::revert_editor = nullptr;
|
||||||
GameControl::reload_current_room = nullptr;
|
GameControl::reload_current_room = nullptr;
|
||||||
|
GameControl::get_adjacent_room = nullptr;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
#include "core/system/debug.hpp" // Para Debug
|
#include "core/system/debug.hpp" // Para Debug
|
||||||
|
#include "game/editor/map_editor.hpp" // Para MapEditor
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// ── Helpers ──────────────────────────────────────────────────────────────────
|
// ── Helpers ──────────────────────────────────────────────────────────────────
|
||||||
@@ -560,9 +561,48 @@ static auto cmd_debug(const std::vector<std::string>& args) -> std::string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ROOM <num>|NEXT|PREV
|
// ROOM <num>|NEXT|PREV
|
||||||
|
// Helper: cambia de room teniendo en cuenta el editor (exit → change → re-enter)
|
||||||
|
static auto changeRoomWithEditor(const std::string& room_file) -> std::string {
|
||||||
|
if (!GameControl::change_room) { return "Game not initialized"; }
|
||||||
|
|
||||||
|
const bool EDITOR_WAS_ACTIVE = MapEditor::get() && MapEditor::get()->isActive();
|
||||||
|
|
||||||
|
// Si el editor está activo, salir primero (guarda y recarga la room actual)
|
||||||
|
if (EDITOR_WAS_ACTIVE && GameControl::exit_editor) {
|
||||||
|
GameControl::exit_editor();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cambiar de habitación
|
||||||
|
if (!GameControl::change_room(room_file)) {
|
||||||
|
// Si falla, re-entrar al editor en la room original
|
||||||
|
if (EDITOR_WAS_ACTIVE && GameControl::enter_editor) {
|
||||||
|
GameControl::enter_editor();
|
||||||
|
}
|
||||||
|
return std::string("Room not found: ") + room_file;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Si el editor estaba activo, re-entrar en la nueva room
|
||||||
|
if (EDITOR_WAS_ACTIVE && GameControl::enter_editor) {
|
||||||
|
GameControl::enter_editor();
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::string("Room: ") + room_file;
|
||||||
|
}
|
||||||
|
|
||||||
static auto cmd_room(const std::vector<std::string>& args) -> std::string {
|
static auto cmd_room(const std::vector<std::string>& args) -> std::string {
|
||||||
if (SceneManager::current != SceneManager::Scene::GAME) { return "Only available in GAME scene"; }
|
if (SceneManager::current != SceneManager::Scene::GAME) { return "Only available in GAME scene"; }
|
||||||
if (args.empty()) { return "usage: room <1-60>|next|prev"; }
|
if (args.empty()) { return "usage: room <1-60>|next|prev|left|right|up|down"; }
|
||||||
|
|
||||||
|
// Direcciones: LEFT, RIGHT, UP, DOWN
|
||||||
|
if (args[0] == "LEFT" || args[0] == "RIGHT" || args[0] == "UP" || args[0] == "DOWN") {
|
||||||
|
if (!GameControl::get_adjacent_room) { return "Game not initialized"; }
|
||||||
|
const std::string ADJACENT = GameControl::get_adjacent_room(args[0]);
|
||||||
|
if (ADJACENT == "0" || ADJACENT.empty()) {
|
||||||
|
return "No room " + toLower(args[0]);
|
||||||
|
}
|
||||||
|
return changeRoomWithEditor(ADJACENT);
|
||||||
|
}
|
||||||
|
|
||||||
int num = 0;
|
int num = 0;
|
||||||
if (args[0] == "NEXT" || args[0] == "PREV") {
|
if (args[0] == "NEXT" || args[0] == "PREV") {
|
||||||
if (!GameControl::get_current_room) { return "Game not initialized"; }
|
if (!GameControl::get_current_room) { return "Game not initialized"; }
|
||||||
@@ -574,15 +614,12 @@ static auto cmd_room(const std::vector<std::string>& args) -> std::string {
|
|||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
num = std::stoi(args[0]);
|
num = std::stoi(args[0]);
|
||||||
} catch (...) { return "usage: room <1-60>|next|prev"; }
|
} catch (...) { return "usage: room <1-60>|next|prev|left|right|up|down"; }
|
||||||
}
|
}
|
||||||
if (num < 1 || num > 60) { return "Room must be between 1 and 60"; }
|
if (num < 1 || num > 60) { return "Room must be between 1 and 60"; }
|
||||||
char buf[16];
|
char buf[16];
|
||||||
std::snprintf(buf, sizeof(buf), "%02d.yaml", num);
|
std::snprintf(buf, sizeof(buf), "%02d.yaml", num);
|
||||||
if (GameControl::change_room && GameControl::change_room(buf)) {
|
return changeRoomWithEditor(buf);
|
||||||
return std::string("Room: ") + buf;
|
|
||||||
}
|
|
||||||
return std::string("Room not found: ") + buf;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ITEMS <0-200>
|
// ITEMS <0-200>
|
||||||
@@ -632,7 +669,19 @@ static auto cmd_scene(const std::vector<std::string>& args) -> std::string {
|
|||||||
|
|
||||||
// EDIT [ON|OFF|REVERT]
|
// EDIT [ON|OFF|REVERT]
|
||||||
static auto cmd_edit(const std::vector<std::string>& args) -> std::string {
|
static auto cmd_edit(const std::vector<std::string>& args) -> std::string {
|
||||||
if (args.empty() || args[0] == "ON") {
|
if (args.empty()) {
|
||||||
|
// Toggle: si está activo → off, si no → on
|
||||||
|
if (MapEditor::get() && MapEditor::get()->isActive()) {
|
||||||
|
if (GameControl::exit_editor) { GameControl::exit_editor(); }
|
||||||
|
return "Editor OFF";
|
||||||
|
}
|
||||||
|
if (GameControl::enter_editor) {
|
||||||
|
GameControl::enter_editor();
|
||||||
|
return "Editor ON";
|
||||||
|
}
|
||||||
|
return "Not in game";
|
||||||
|
}
|
||||||
|
if (args[0] == "ON") {
|
||||||
if (GameControl::enter_editor) {
|
if (GameControl::enter_editor) {
|
||||||
GameControl::enter_editor();
|
GameControl::enter_editor();
|
||||||
return "Editor ON";
|
return "Editor ON";
|
||||||
|
|||||||
Reference in New Issue
Block a user