63 lines
1.7 KiB
C++
63 lines
1.7 KiB
C++
// enemy_config.hpp - Configuració d'un tipus d'enemic carregada des de YAML
|
|
// © 2026 JailDesigner
|
|
//
|
|
// Una instància per tipus (Pentagon/Square/Pinwheel), carregada un cop al
|
|
// startup per EnemyRegistry i compartida entre totes les instàncies d'aquell
|
|
// tipus. Estructura paral·lela a PlayerConfig.
|
|
|
|
#pragma once
|
|
|
|
#include <SDL3/SDL.h>
|
|
|
|
#include <optional>
|
|
#include <string>
|
|
|
|
#include "external/fkyaml_node.hpp"
|
|
#include "game/entities/enemy.hpp" // EnemyType
|
|
|
|
struct EnemyConfig {
|
|
struct ShapeCfg {
|
|
std::string path;
|
|
};
|
|
|
|
struct PhysicsCfg {
|
|
float mass;
|
|
float speed;
|
|
float rotation_delta_min;
|
|
float rotation_delta_max;
|
|
float collision_radius;
|
|
};
|
|
|
|
// Camps específics de cada AI. Els no aplicables a un tipus queden a 0.0F
|
|
// i no s'usen — el dispatch viu a Enemy::behaviorXxx.
|
|
struct BehaviorCfg {
|
|
// Pentagon
|
|
float zigzag_prob_per_second{0.0F};
|
|
float angle_change_max{0.0F};
|
|
// Square
|
|
float tracking_strength{0.0F};
|
|
float tracking_interval{0.0F};
|
|
// Pinwheel
|
|
float rotation_proximity_multiplier{0.0F};
|
|
float proximity_distance{0.0F};
|
|
};
|
|
|
|
struct ColorsCfg {
|
|
SDL_Color normal;
|
|
SDL_Color wounded;
|
|
};
|
|
|
|
std::string name;
|
|
EnemyType ai_type;
|
|
ShapeCfg shape;
|
|
PhysicsCfg physics;
|
|
BehaviorCfg behavior;
|
|
ColorsCfg colors;
|
|
int score;
|
|
|
|
// Parseja un descriptor d'enemic. expected_ai_type valida que ai_type del
|
|
// YAML coincideix amb el tipus que el caller espera (segons el directori).
|
|
static auto fromYaml(const fkyaml::node& node, EnemyType expected_ai_type)
|
|
-> std::optional<EnemyConfig>;
|
|
};
|