editar propietats del enemic

This commit is contained in:
2026-04-02 12:45:29 +02:00
parent 3a5b16346b
commit 273d9304dc
8 changed files with 280 additions and 82 deletions

View File

@@ -30,7 +30,11 @@ class MapEditor {
void update(float delta_time);
void render();
void handleEvent(const SDL_Event& event);
auto revert() -> std::string; // Revierte todos los cambios al estado original
auto revert() -> std::string;
// Comandos SET para modificar el enemigo seleccionado (llamados desde console_commands)
auto setEnemyProperty(const std::string& property, const std::string& value) -> std::string;
[[nodiscard]] auto hasSelectedEnemy() const -> bool;
private:
static MapEditor* instance_; // [SINGLETON] Objeto privado
@@ -38,49 +42,47 @@ class MapEditor {
MapEditor(); // Constructor
~MapEditor(); // Destructor
// Tipos para drag & drop
enum class DragTarget { NONE,
PLAYER,
ENEMY_INITIAL,
ENEMY_BOUND1,
ENEMY_BOUND2,
ITEM };
// Tipos para drag & drop y selección
enum class DragTarget { NONE, PLAYER, ENEMY_INITIAL, ENEMY_BOUND1, ENEMY_BOUND2, ITEM };
struct DragState {
DragTarget target{DragTarget::NONE};
int index{-1}; // Índice del enemigo o item en room_data_
float offset_x{0.0F}; // Offset entre el cursor y el origen de la entidad al inicio del drag
int index{-1};
float offset_x{0.0F};
float offset_y{0.0F};
float snap_x{0.0F}; // Posición snapped actual (para preview)
float snap_x{0.0F};
float snap_y{0.0F};
bool moved{false}; // true si el ratón se movió durante el drag
};
// Métodos internos
void updateMousePosition(); // Convierte coordenadas de ventana a coordenadas de juego y tile
void renderEnemyBoundaries(); // Dibuja marcadores de boundaries y líneas de ruta
void renderBoundaryMarker(float x, float y, Uint8 color); // Dibuja un marcador de boundary en una posición
void renderSelectionHighlight(); // Dibuja highlight del elemento seleccionado/arrastrado
void handleMouseDown(float game_x, float game_y); // Procesa click del ratón (hit test + inicio de drag)
void handleMouseUp(); // Procesa soltar el ratón (commit del drag + autosave)
void updateDrag(); // Actualiza la posición snapped durante el drag
void autosave(); // Guarda los cambios puntuales al YAML
static auto snapToGrid(float value) -> float; // Alinea un valor a la cuadrícula de 8x8
static auto pointInRect(float px, float py, const SDL_FRect& rect) -> bool; // Hit test punto en rectángulo
void updateMousePosition();
void renderEnemyBoundaries();
void renderBoundaryMarker(float x, float y, Uint8 color);
void renderSelectionHighlight();
void handleMouseDown(float game_x, float game_y);
void handleMouseUp();
void updateDrag();
void autosave();
void updateStatusBarInfo();
static auto snapToGrid(float value) -> float;
static auto pointInRect(float px, float py, const SDL_FRect& rect) -> bool;
// Estado del editor
bool active_{false};
DragState drag_;
int selected_enemy_{-1}; // Índice del enemigo seleccionado (-1 = ninguno)
// Datos de la habitación
Room::Data room_data_; // Copia mutable (para boundaries y edición)
std::string room_path_; // Nombre del fichero (ej: "06.yaml")
std::string file_path_; // Ruta completa del fichero en disco
Room::Data room_data_;
std::string room_path_;
std::string file_path_;
// YAML: nodo vivo (se edita parcialmente) y backup para revert
fkyaml::node yaml_; // Nodo YAML actual (editado parcialmente)
fkyaml::node yaml_backup_; // Backup del YAML original al entrar
// YAML: nodo original (para campos que no se editan: name_ca, etc.)
fkyaml::node yaml_;
fkyaml::node yaml_backup_;
// Referencias a objetos vivos (para rendering)
// Referencias a objetos vivos
std::shared_ptr<Room> room_;
std::shared_ptr<Player> player_;
std::shared_ptr<Scoreboard::Data> scoreboard_data_;
@@ -88,13 +90,13 @@ class MapEditor {
// Barra de estado del editor
std::unique_ptr<EditorStatusBar> statusbar_;
// Estado del ratón en coordenadas de juego
// Estado del ratón
float mouse_game_x_{0.0F};
float mouse_game_y_{0.0F};
int mouse_tile_x_{0};
int mouse_tile_y_{0};
// Estado previo de invencibilidad (para restaurar al salir)
// Estado previo de invencibilidad
Options::Cheat::State invincible_before_editor_{Options::Cheat::State::DISABLED};
};