// enemies.hpp - Configuració per tipus d'enemic (Pentagon/Square/Molinillo), spawn i scoring // © 2026 JailDesigner #pragma once namespace Defaults::Enemies { // Cuerpo físico común (valores por defecto del constructor) namespace Body { constexpr float DEFAULT_MASS = 5.0F; // Más liviano que la nave (10.0) constexpr float RESTITUTION = 1.0F; // Rebote elástico perfecto contra paredes constexpr float LINEAR_DAMPING = 0.0F; // Sin fricción: mantienen velocidad constexpr float ANGULAR_DAMPING = 0.0F; } // namespace Body // Pentagon (esquivador - zigzag evasion) namespace Pentagon { constexpr float SPEED = 35.0F; // px/s (slightly slower) constexpr float MASS = 5.0F; // Masa estándar constexpr float ANGLE_CHANGE_PROB = 0.20F; // 20% per wall hit (frequent zigzag) constexpr float ANGLE_CHANGE_MAX = 1.0F; // Max random angle change (rad) constexpr float ZIGZAG_PROB_PER_SECOND = 0.8F; // Probabilidad de zigzag por segundo constexpr float ROTATION_DELTA_MIN = 0.75F; // Min visual rotation (rad/s) [+50%] constexpr float ROTATION_DELTA_MAX = 3.75F; // Max visual rotation (rad/s) [+50%] constexpr const char* SHAPE_FILE = "enemy_pentagon.shp"; } // namespace Pentagon // Square (perseguidor - tracks player) namespace Square { constexpr float SPEED = 40.0F; // px/s (medium speed) constexpr float MASS = 8.0F; // Más pesado, "tanque" constexpr float TRACKING_STRENGTH = 0.5F; // Interpolation toward player (0.0-1.0) constexpr float TRACKING_INTERVAL = 1.0F; // Seconds between angle updates constexpr float ROTATION_DELTA_MIN = 0.3F; // Slow rotation [+50%] constexpr float ROTATION_DELTA_MAX = 1.5F; // [+50%] constexpr const char* SHAPE_FILE = "enemy_square.shp"; } // namespace Square // Molinillo (agressiu - fast straight lines, proximity spin-up) namespace Pinwheel { constexpr float SPEED = 50.0F; // px/s (fastest) constexpr float MASS = 4.0F; // Más liviano, ágil constexpr float ANGLE_CHANGE_PROB = 0.05F; // 5% per wall hit (rare direction change) constexpr float ANGLE_CHANGE_MAX = 0.3F; // Small angle adjustments constexpr float ROTATION_DELTA_MIN = 3.0F; // Base rotation (rad/s) [+50%] constexpr float ROTATION_DELTA_MAX = 6.0F; // [+50%] constexpr float ROTATION_DELTA_PROXIMITY_MULTIPLIER = 3.0F; // Spin-up multiplier when near ship constexpr float PROXIMITY_DISTANCE = 100.0F; // Distance threshold (px) constexpr const char* SHAPE_FILE = "enemy_pinwheel.shp"; } // namespace Pinwheel // Animation parameters (shared) namespace Animation { // Palpitation constexpr float PULSE_TRIGGER_PROB = 0.01F; // 1% chance per second constexpr float PULSE_DURATION_MIN = 1.0F; // Min duration (seconds) constexpr float PULSE_DURATION_MAX = 3.0F; // Max duration (seconds) constexpr float PULSE_AMPLITUD_MIN = 0.08F; // Min scale variation constexpr float PULSE_AMPLITUD_MAX = 0.20F; // Max scale variation constexpr float PULSE_FREQ_MIN = 1.5F; // Min frequency (Hz) constexpr float PULSE_FREQ_MAX = 3.0F; // Max frequency (Hz) // Rotation acceleration constexpr float ROTATION_ACCEL_TRIGGER_PROB = 0.02F; // 2% chance per second [4x more frequent] constexpr float ROTATION_ACCEL_DURATION_MIN = 3.0F; // Min transition time constexpr float ROTATION_ACCEL_DURATION_MAX = 8.0F; // Max transition time constexpr float ROTATION_ACCEL_MULTIPLIER_MIN = 0.3F; // Min speed multiplier [more dramatic] constexpr float ROTATION_ACCEL_MULTIPLIER_MAX = 4.0F; // Max speed multiplier [more dramatic] } // namespace Animation // Wounded state (entre primer impacto y explosión) namespace Wounded { constexpr float DURATION = 1.0F; // Segundos en estado herido antes de explotar constexpr float BLINK_HZ = 10.0F; // Frecuencia de parpadeo color tipo ↔ dorado } // namespace Wounded // Spawn safety and invulnerability system namespace Spawn { // Safe spawn distance from player. Antic: SHIP_RADIUS(12) * 3 = 36 px. // SHIP_RADIUS ha migrat al YAML del player; aquesta constant es // mantindrà fixa fins al PR de migració dels enemics a YAML, on // passarà a derivar-se en runtime del player_config. constexpr float SAFETY_DISTANCE_MULTIPLIER = 3.0F; constexpr float SAFETY_DISTANCE = 36.0F; constexpr int MAX_SPAWN_ATTEMPTS = 50; // Max attempts to find safe position // Invulnerability system constexpr float INVULNERABILITY_DURATION = 3.0F; // Seconds constexpr float INVULNERABILITY_BRIGHTNESS_START = 0.3F; // Dim constexpr float INVULNERABILITY_BRIGHTNESS_END = 0.7F; // Normal (same as Defaults::Brightness::ENEMIC) constexpr float INVULNERABILITY_SCALE_START = 0.0F; // Invisible constexpr float INVULNERABILITY_SCALE_END = 1.0F; // Full size } // namespace Spawn // Scoring system (puntuación per type de enemy) namespace Scoring { constexpr int PENTAGON_SCORE = 100; // Pentágono (esquivador, 35 px/s) constexpr int SQUARE_SCORE = 150; // Square (perseguidor, 40 px/s) constexpr int PINWHEEL_SCORE = 200; // Molinillo (agressiu, 50 px/s) } // namespace Scoring } // namespace Defaults::Enemies