#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. // // Abans d'aquesta versió `Map` també pintava el fons i els sarcs amb // primitives; ara el Tilemap s'encarrega del render visual i `Map` només // aporta la geometria lògica i les col·lisions. Quan els sarcòfags passin // a ser actors independents es reintroduirà l'ordenació Z via `getFeetY`. 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; // 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); // 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. [[nodiscard]] static auto collides(const SDL_FRect& base_box) -> bool; };