#pragma once #ifdef _DEBUG class Tilemap; // Mode editor modal del GameScene. Només disponible en Debug — en Release // aquesta classe no existeix (el .cpp es compila a un object buit i cap // codi del joc final en fa referència). // // L'editor NO gestiona la tecla de toggle pròpia (`editor_toggle`): això // ho fa GameScene per poder decidir la coexistència amb la pausa F11 // (mútuament excloents). L'editor s'encarrega de: // - Estat propi (actiu/no actiu, brush, picker obert). // - Input del ratolí i tecles internes (`T`, `ESC`). // - Render del border blau + brush preview + picker. // - Persistència del tilemap al YAML del repo en sortir. // // GameScene, quan `active()` és true, salta el tick de jugadors/entitats // i no els pinta; el tilemap sí es pinta perquè és el que s'està editant. class Editor { public: // Entra al mode editor: notifica i marca `active=true`. La congelació // d'entitats / jugador la gestiona GameScene consultant `active()`. void enter(); // Surt del mode editor: persisteix el tilemap al YAML (writer surgical) // i notifica. Si la persistència falla, emet la notificació d'error. void exit(Tilemap& tilemap); // Helper: enter() si no actiu, exit() si actiu. Útil des de GameScene // quan detecta la tecla de toggle. void toggle(Tilemap& tilemap); [[nodiscard]] auto active() const -> bool { return active_; } // Processa input propi (brush, picker). No-op si no actiu. void update(int delta_ms, Tilemap& tilemap); // Pinta el border blau i, més endavant, brush preview + picker. // No-op si no actiu. void render(const Tilemap& tilemap) const; private: // Les branques d'update / render segons el mode (picker obert o // pintura al mapa) queden separades per claredat; no formen part // de l'API pública perquè només té sentit cridar-les des d'`update`. void updateMap(Tilemap& tilemap, int canvas_x, int canvas_y); void updatePicker(const Tilemap& tilemap, int canvas_x, int canvas_y); void renderPicker(const Tilemap& tilemap) const; bool active_{false}; // Estat de l'edició (brush + cursor + picker). Es poblen al pas // següent; els declarem ara perquè `update()` pugui mutar-los i les // signatures queden estables entre hitos. int brush_{-1}; // Índex de tile al tileset; -1 = sense brush. int cursor_col_{-1}; // Cel·la del mapa sota el cursor (-1 = fora). int cursor_row_{-1}; bool picker_open_{false}; int picker_scroll_{0}; // Fila superior visible del picker (linealitzat). int picker_hover_{-1}; // Índex del tile sota el cursor dins del picker. }; #endif // _DEBUG