#pragma once #include #include // Para shared_ptr #include // Para string #include // Para vector #include "game/defaults.hpp" // Para Defaults::Game::Room #include "game/entities/door.hpp" // Para Door::Data #include "game/entities/enemy.hpp" // Para EnemyData #include "game/entities/item.hpp" // Para ItemData #include "game/entities/key.hpp" // Para Key::Data #include "game/entities/moving_platform.hpp" // Para MovingPlatform::Data #include "game/gameplay/collision_map.hpp" // Para CollisionMap::AdjacentData #include "game/gameplay/scoreboard.hpp" // Para Scoreboard::Data #include "utils/defines.hpp" // Para Tile::SIZE, Map::WIDTH, Map::HEIGHT class Surface; class EnemyManager; class ItemManager; class PlatformManager; class KeyManager; class DoorManager; class TileCollider; class TilemapRenderer; class Room { public: // -- Enumeraciones y estructuras --- enum class Border : int { TOP = 0, RIGHT = 1, BOTTOM = 2, LEFT = 3, NONE = 4 }; struct Data { std::string number; Uint8 bg_color{0}; Uint8 item_color1{Defaults::Game::Room::ITEM_COLOR1}; Uint8 item_color2{Defaults::Game::Room::ITEM_COLOR2}; std::string upper_room; std::string lower_room; std::string left_room; std::string right_room; std::string tile_set_file; int conveyor_belt_direction{0}; std::vector tile_map; std::vector collision_tile_map; std::vector enemies; std::vector items; std::vector platforms; std::vector keys; std::vector doors; }; // Constructor y destructor Room(const std::string& room_path, std::shared_ptr data); ~Room(); // NOLINT(modernize-use-equals-default, performance-trivially-destructible) // --- Funciones --- [[nodiscard]] auto getNumber() const -> const std::string& { return number_; } [[nodiscard]] auto getBGColor() const -> Uint8 { return bg_color_; } void renderMap(); void renderEnemies(); void renderPlatforms(); void renderItems(); void renderKeys(); void renderDoors(); #ifdef _DEBUG void redrawMap(); void updateEditorMode(float delta_time); void resetEnemyPositions(const std::vector& enemy_data); auto getEnemyManager() -> EnemyManager* { return enemy_manager_.get(); } auto getItemManager() -> ItemManager* { return item_manager_.get(); } auto getPlatformManager() -> PlatformManager* { return platform_manager_.get(); } auto getKeyManager() -> KeyManager* { return key_manager_.get(); } auto getDoorManager() -> DoorManager* { return door_manager_.get(); } void setItemColors(Uint8 color1, Uint8 color2); void setTile(int index, int tile_value); void setCollisionTile(int index, int value); void setConnection(Border border, const std::string& room_name); void setTileSet(const std::string& tile_set_file); void setConveyorBeltDirection(int direction); [[nodiscard]] auto getTileSetFile() const -> const std::string& { return tile_set_file_; } [[nodiscard]] auto getTileSetWidth() const -> int { return tile_set_width_; } #endif void update(float delta_time); auto getRoom(Border border) -> std::string; auto enemyCollision(SDL_FRect& rect) -> bool; auto itemCollision(SDL_FRect& rect) -> bool; auto keyCollision(SDL_FRect& rect) -> bool; void tryUnlockDoors(const SDL_FRect& player_rect); auto checkPlayerOnPlatform(const SDL_FRect& player_collider, float player_vy) -> MovingPlatform*; void setPaused(bool value); [[nodiscard]] auto getConveyorBeltDirection() const -> int { return conveyor_belt_direction_; } [[nodiscard]] auto getTileCollider() const -> const TileCollider&; [[nodiscard]] auto getCollisionTileMap() const -> const std::vector&; void updateCollisionBorders(const CollisionMap::AdjacentData& adjacent); // Método de carga de archivos YAML (delegado a RoomLoader) static auto loadYAML(const std::string& file_path, bool verbose = false) -> Data; private: static constexpr int TILE_SIZE = ::Tile::SIZE; static constexpr int MAP_WIDTH = ::Map::WIDTH; static constexpr int MAP_HEIGHT = ::Map::HEIGHT; std::unique_ptr enemy_manager_; std::unique_ptr item_manager_; std::unique_ptr platform_manager_; std::unique_ptr key_manager_; std::unique_ptr door_manager_; std::unique_ptr collision_map_; std::unique_ptr tilemap_renderer_; std::shared_ptr surface_; std::shared_ptr data_; std::string number_; Uint8 bg_color_{0}; Uint8 item_color1_{Defaults::Game::Room::ITEM_COLOR1}; Uint8 item_color2_{Defaults::Game::Room::ITEM_COLOR2}; std::string upper_room_; std::string lower_room_; std::string left_room_; std::string right_room_; std::string tile_set_file_; std::vector tile_map_; int conveyor_belt_direction_{0}; bool is_paused_{false}; int tile_set_width_{0}; void initializeRoom(const Data& room); };