#pragma once #include #include // Mapa d'una piràmide: sala rectangular amb marcador superior, muros pels // quatre costats i graella de sarcòfags envoltada per un passadís a cada // cantó. La geometria (graella, pitch, amplada de murs) es carrega des del // bloc `geometry:` del YAML de la piràmide — així cada sala pot tenir la // seua forma sense recompilar. // // Z-order: el render es divideix en fons (marcador + muros + sòl) i files // de sarcòfags. El caller (GameScene) alternarà jugadors ordenats per la Y // dels peus amb cada fila per a aconseguir la perspectiva falsa. class Map { public: // Geometria de la graella (carregada de pyramid.yaml > geometry). // Membres estàtics no-constexpr: el nom segueix snake_case per tidy; // callers (Player, GameScene) els consulten com `Map::playfield_x`. inline static int grid_cols = 0; inline static int grid_rows = 0; inline static int sarc_w = 0; inline static int sarc_h = 0; inline static int pitch_x = 0; inline static int pitch_y = 0; // Cromat de la sala: marcador (HUD), mur posterior (dalt) i murs // laterals. El mur frontal es deriva del passadís exterior inferior. inline static int hud_h = 0; inline static int back_wall_h = 0; inline static int side_wall_w = 0; // Derivats de la geometria base: el pas entre sarcòfags ha de cabre // exactament el jugador, i el mateix passadís s'usa a l'exterior. inline static int corridor_w = 0; inline static int corridor_h = 0; inline static int outer_corridor = 0; inline static int board_w = 0; inline static int board_h = 0; inline static int origin_x = 0; inline static int origin_y = 0; inline static int playfield_x = 0; inline static int playfield_y = 0; inline static int playfield_w = 0; inline static int playfield_h = 0; // Índexs a la paleta UI (data/palettes/sega-cube.pal). Centralitzats ací // per a poder ajustar l'estètica sense buscar magic numbers pel codi. static constexpr Uint8 HUD_BG = 0; static constexpr Uint8 WALL = 80; static constexpr Uint8 FLOOR = 40; static constexpr Uint8 SARC = 160; // Carrega el bloc `geometry:` del YAML i recalcula tots els derivats. // Ha de cridar-se abans d'instanciar `Player` o consultar `collides()`: // GameScene ho fa al ctor. static void loadFrom(const std::string& yaml_path); // Fons estàtic: marcador, muros (back/side/front) i sòl interior. No // pinta cap sarcòfag; això queda per a renderSarcsRow() perquè el caller // puga interleaveing amb els jugadors. static void renderBackground(); // Pinta la fila `row` de sarcòfags. El caller decideix quan cridar-la // respecte als jugadors segons la seua Y. static void renderSarcsRow(int row); // Y de la cara inferior dels sarcòfags de la fila `row` (la "baseline" // per a ordenar en Z): un jugador amb els peus per sobre d'aquest valor // queda darrere; per sota, queda davant. [[nodiscard]] static auto getSarcRowBottomY(int row) -> int; // Rectangle ocupat pel sarcòfag a la posició (col, row) de la graella. [[nodiscard]] static auto getSarcRect(int col, int row) -> SDL_FRect; // Mapa de colisions (separat del mapa de dibuix): retorna true si el // rectangle `base_box` (la base del jugador, per exemple) s'encavalca // amb cap sarcòfag. Així Player mai camine sobre un sarcòfag, // independentment de com els pinte renderSarcsRow. [[nodiscard]] static auto collides(const SDL_FRect& base_box) -> bool; };