forked from jaildesigner-jailgames/jaildoctors_dilemma
## Cambios principales
### Nuevo componente: RoomLoader
- **room_loader.hpp/cpp**: Nueva clase estática para parseo de archivos
- Responsabilidades extraídas de Room:
- Carga de archivos .room (loadRoomFile)
- Carga de archivos .tmx de tilemap (loadRoomTileFile)
- Parseo de claves y valores (parseKeyValue)
- Asignación de valores a estructuras (setRoom, setEnemy, setItem)
- Carga de bloques [enemy] y [item] (loadEnemyFromFile, loadItemFromFile)
- Log de parámetros desconocidos (logUnknownParameter)
### Modificaciones en Room
- **room.hpp**:
- Eliminados 9 métodos estáticos privados de parseo
- Mantenidos 2 métodos públicos (loadRoomFile, loadRoomTileFile) que ahora delegan a RoomLoader
- Añadido comentario indicando delegación a RoomLoader
- **room.cpp**:
- Eliminadas ~285 líneas de código de parseo de archivos
- Añadido #include "room_loader.hpp"
- Implementaciones de loadRoomFile y loadRoomTileFile ahora son simples delegaciones:
* `return RoomLoader::loadRoomFile(file_path, verbose);`
* `return RoomLoader::loadRoomTileFile(file_path, verbose);`
- Archivo reducido de 554 líneas a 277 líneas (50% de reducción)
### Build system
- **CMakeLists.txt**: Añadido room_loader.cpp a las fuentes del proyecto
## Diseño de RoomLoader
RoomLoader es una clase utility con solo métodos estáticos (no instanciable):
- Constructor/destructor eliminados
- No tiene estado (stateless)
- Todos los métodos son estáticos
- Encapsula toda la lógica de I/O y parseo de archivos de configuración
## Métricas
- **Código eliminado de Room**: ~285 líneas de lógica de parseo
- **Nuevo RoomLoader**: 300 líneas (room_loader.cpp)
- **Reducción en room.cpp**: De 554 a 277 líneas (50% de reducción)
- **Room.hpp**: Simplificado significativamente (9 declaraciones privadas eliminadas)
## Verificación
- ✅ Compilación exitosa sin errores
- ✅ Juego inicia y carga todos los archivos correctamente
- ✅ clang-tidy: 1 warning de complejidad cognitiva (código heredado, no modificado)
- ✅ cppcheck: Sin issues
## Progreso total de refactorización
Después de 4 fases, Room ha sido drásticamente simplificado:
- **Phase 1**: Gestión de entidades → EnemyManager & ItemManager
- **Phase 2**: Sistema de colisiones → CollisionMap (~465 líneas)
- **Phase 3**: Renderizado de tilemap → TilemapRenderer (~95 líneas)
- **Phase 4**: Parseo de archivos → RoomLoader (~285 líneas)
**Total eliminado de Room**: ~845+ líneas
**Reducción tamaño archivo**: De 1097 líneas originales a 277 líneas (75% de reducción)
**Nuevas clases especializadas**: 6 (EnemyManager, ItemManager, CollisionMap, TilemapRenderer, RoomLoader)
## Próximos pasos
- Fase 5: Limpieza final y optimización de Room como coordinador ligero
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
117 lines
4.7 KiB
C++
117 lines
4.7 KiB
C++
#pragma once
|
|
|
|
#include <istream> // Para istream
|
|
#include <string> // Para string
|
|
#include <utility> // Para pair
|
|
#include <vector> // Para vector
|
|
|
|
#include "game/entities/enemy.hpp" // Para Enemy::Data
|
|
#include "game/entities/item.hpp" // Para Item::Data
|
|
#include "game/gameplay/room.hpp" // Para Room::Data
|
|
|
|
/**
|
|
* @brief Cargador de archivos de habitaciones
|
|
*
|
|
* Responsabilidades:
|
|
* - Cargar archivos de room (.room)
|
|
* - Cargar archivos de tilemap (.tmx)
|
|
* - Parsear datos de room, enemy e item
|
|
* - Validar y convertir valores de configuración
|
|
*
|
|
* Esta clase contiene solo métodos estáticos y no debe instanciarse.
|
|
*/
|
|
class RoomLoader {
|
|
public:
|
|
// Constructor eliminado para prevenir instanciación
|
|
RoomLoader() = delete;
|
|
~RoomLoader() = delete;
|
|
RoomLoader(const RoomLoader&) = delete;
|
|
auto operator=(const RoomLoader&) -> RoomLoader& = delete;
|
|
RoomLoader(RoomLoader&&) = delete;
|
|
auto operator=(RoomLoader&&) -> RoomLoader& = delete;
|
|
|
|
/**
|
|
* @brief Carga un archivo de room (.room)
|
|
* @param file_path Ruta al archivo de room
|
|
* @param verbose Si true, muestra información de debug
|
|
* @return Room::Data con todos los datos de la habitación
|
|
*
|
|
* Parsea un archivo .room que contiene:
|
|
* - Variables de configuración (name, colors, borders, etc.)
|
|
* - Bloques [enemy]...[/enemy] con datos de enemigos
|
|
* - Bloques [item]...[/item] con datos de items
|
|
*/
|
|
static auto loadRoomFile(const std::string& file_path, bool verbose = false) -> Room::Data;
|
|
|
|
/**
|
|
* @brief Carga un archivo de tilemap (.tmx)
|
|
* @param file_path Ruta al archivo de tilemap
|
|
* @param verbose Si true, muestra información de debug
|
|
* @return Vector de índices de tiles
|
|
*
|
|
* Parsea un archivo .tmx en formato CSV generado por Tiled
|
|
*/
|
|
static auto loadRoomTileFile(const std::string& file_path, bool verbose = false) -> std::vector<int>;
|
|
|
|
private:
|
|
/**
|
|
* @brief Asigna valores a una estructura Room::Data
|
|
* @param room Estructura a modificar
|
|
* @param key Nombre de la variable
|
|
* @param value Valor a asignar
|
|
* @return true si la variable fue reconocida y asignada, false si no
|
|
*/
|
|
static auto setRoom(Room::Data& room, const std::string& key, const std::string& value) -> bool;
|
|
|
|
/**
|
|
* @brief Asigna valores a una estructura Enemy::Data
|
|
* @param enemy Estructura a modificar
|
|
* @param key Nombre de la variable
|
|
* @param value Valor a asignar
|
|
* @return true si la variable fue reconocida y asignada, false si no
|
|
*/
|
|
static auto setEnemy(Enemy::Data& enemy, const std::string& key, const std::string& value) -> bool;
|
|
|
|
/**
|
|
* @brief Asigna valores a una estructura Item::Data
|
|
* @param item Estructura a modificar
|
|
* @param key Nombre de la variable
|
|
* @param value Valor a asignar
|
|
* @return true si la variable fue reconocida y asignada, false si no
|
|
*/
|
|
static auto setItem(Item::Data& item, const std::string& key, const std::string& value) -> bool;
|
|
|
|
/**
|
|
* @brief Parsea una línea en formato "key=value"
|
|
* @param line Línea a parsear
|
|
* @return Par {key, value}. Si no hay '=', devuelve {"", ""}
|
|
*/
|
|
static auto parseKeyValue(const std::string& line) -> std::pair<std::string, std::string>;
|
|
|
|
/**
|
|
* @brief Registra un parámetro desconocido en la consola
|
|
* @param file_name Nombre del archivo siendo parseado
|
|
* @param key Nombre del parámetro desconocido
|
|
* @param verbose Si true, muestra el mensaje
|
|
*/
|
|
static void logUnknownParameter(const std::string& file_name, const std::string& key, bool verbose);
|
|
|
|
/**
|
|
* @brief Carga un bloque [enemy]...[/enemy] desde un stream
|
|
* @param file Stream del archivo
|
|
* @param file_name Nombre del archivo (para debug)
|
|
* @param verbose Si true, muestra información de debug
|
|
* @return Enemy::Data con los datos del enemigo
|
|
*/
|
|
static auto loadEnemyFromFile(std::istream& file, const std::string& file_name, bool verbose) -> Enemy::Data;
|
|
|
|
/**
|
|
* @brief Carga un bloque [item]...[/item] desde un stream
|
|
* @param file Stream del archivo
|
|
* @param file_name Nombre del archivo (para debug)
|
|
* @param verbose Si true, muestra información de debug
|
|
* @return Item::Data con los datos del item
|
|
*/
|
|
static auto loadItemFromFile(std::istream& file, const std::string& file_name, bool verbose) -> Item::Data;
|
|
};
|