66 lines
2.6 KiB
C++
66 lines
2.6 KiB
C++
#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
|