Fase 4: Refactorización de Room - Extracción del sistema de parseo de archivos

## 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>
This commit is contained in:
2025-11-13 09:26:03 +01:00
parent 5365d62abc
commit e97c951d0d
5 changed files with 423 additions and 291 deletions

View File

@@ -88,6 +88,8 @@ class Room {
auto checkRightSlopes(SDL_FPoint& p) -> bool; // Comprueba las colisiones
void setPaused(bool value); // Pone el mapa en modo pausa
[[nodiscard]] auto getConveyorBeltDirection() const -> int { return conveyor_belt_direction_; } // Obten la direccion de las superficies automaticas
// Métodos de carga de archivos (delegados a RoomLoader)
static auto loadRoomFile(const std::string& file_path, bool verbose = false) -> Data; // Carga las variables desde un fichero de mapa
static auto loadRoomTileFile(const std::string& file_path, bool verbose = false) -> std::vector<int>; // Carga las variables y texturas desde un fichero de mapa de tiles
@@ -126,11 +128,4 @@ class Room {
// --- Funciones ---
void initializeRoom(const Data& room); // Inicializa los valores
void openTheJail(); // Abre la jail para poder entrar
static auto setRoom(Data& room, const std::string& key, const std::string& value) -> bool; // Asigna variables a una estructura RoomData
static auto setEnemy(Enemy::Data& enemy, const std::string& key, const std::string& value) -> bool; // Asigna variables a una estructura EnemyData
static auto setItem(Item::Data& item, const std::string& key, const std::string& value) -> bool; // Asigna variables a una estructura ItemData
static auto parseKeyValue(const std::string& line) -> std::pair<std::string, std::string>;
static void logUnknownParameter(const std::string& file_name, const std::string& key, bool verbose);
static auto loadEnemyFromFile(std::istream& file, const std::string& file_name, bool verbose) -> Enemy::Data;
static auto loadItemFromFile(std::istream& file, const std::string& file_name, bool verbose) -> Item::Data;
};