// physics.hpp - Constants de física del control de la nau i debris d'explosió
// © 2026 JailDesigner

#pragma once

// NOTA: els paràmetres del player (rotation_speed, acceleration,
// max_velocity, death_impact_factor) viuen a data/entities/player/player.yaml.
// Els paràmetres específics de la bala (mass, restitution, damping,
// impact_momentum_factor) viuen a data/entities/bullet/bullet.yaml.
// Aquest fitxer només conté els paràmetres compartits del subsistema de
// debris (explosions visuals).

namespace Defaults::Physics::Debris {

    constexpr float SPEED_BASE = 80.0F;      // Velocidad inicial (px/s)
    constexpr float VARIACIO_SPEED = 40.0F;  // ±variació aleatòria (px/s)
    constexpr float ACCELERACIO = -60.0F;    // Fricció/desacceleració (px/s²)
    constexpr float ROTATION_MIN = 0.1F;     // Rotación mínima (rad/s ~5.7°/s)
    constexpr float ROTATION_MAX = 0.3F;     // Rotación màxima (rad/s ~17.2°/s)
    constexpr float TEMPS_VIDA = 2.0F;       // Vida mínima garantida (s) — després pot morir per velocitat baixa
    constexpr float TEMPS_VIDA_NAU = 3.0F;   // Ship debris min lifetime (matches DEATH_DURATION)
    constexpr float SHRINK_RATE = 1.0F;      // Reducció de mida (1.0 = encoge a 0 al final del min_lifetime)

    // Política de mort: passat el min_lifetime, el fragment mor quan la
    // seva velocity cau per sota d'aquest llindar. Així els fragments
    // ràpids no "popen" en moviment.
    constexpr float MIN_SPEED_TO_DIE = 5.0F;  // px/s — al cuadrat per evitar sqrt en update
    constexpr float MIN_SPEED_TO_DIE_SQ = MIN_SPEED_TO_DIE * MIN_SPEED_TO_DIE;

    // Rebot contra els límits del PLAYAREA (mateix patró que enemics/ship).
    // 0.7 = 70% de l'energia conservada al rebot.
    constexpr float RESTITUTION_BOUNDS = 0.7F;

    // Herència de velocity angular (trayectorias curvas)
    constexpr float INHERITANCE_FACTOR_MIN = 0.7F;  // Mínimo 70% del drotacio heredat
    constexpr float INHERITANCE_FACTOR_MAX = 1.0F;  // Màxim 100% del drotacio heredat
    constexpr float FRICCIO_ANGULAR = 0.5F;         // Desacceleració angular (rad/s²)

    // Velocity heredada de la nau a l'explosió (80% del feel original).
    constexpr float SHIP_VELOCITY_INHERITANCE = 0.8F;

    // Velocity heredada de l'enemic a l'explosió (palanca per a tuneo).
    // 1.0 = inèrcia completa; >1.0 amplifica la deriva; <1.0 la atenua.
    constexpr float ENEMY_VELOCITY_INHERITANCE = 1.0F;

    // Velocitat de la bala traspassada a cada fragment de debris al moment
    // de l'impacte. Separat de la inèrcia del cos (velocitat_objecte): permet
    // que els trossos volin "amb la força de la bala" encara que el cos pesi
    // molt i amb prou feines es mogui. 0.4 a 700 px/s = ~280 px/s extra per
    // fragment, molt visible sense ser excessiu.
    constexpr float BULLET_IMPULSE_FACTOR = 0.4F;

    // Tuneig específic de l'explosió d'enemic (overrides als defaults
    // que es passen com a paràmetres opcionals a explode()).
    constexpr float ENEMY_LIFETIME = 2.5F;       // Vida mínima del debris (s) — els que segueixen movent-se viuen més
    constexpr float ENEMY_FRICTION = -30.0F;     // Fricció més suau perquè s'estenguin més
    constexpr int ENEMY_SEGMENT_MULTIPLIER = 1;  // Sense còpies (5 cares = 5 trossos); >1 produeix grups sincronitzats

    // Angular velocity sin for trajectory inheritance
    // Excess above this threshold is converted to tangential linear velocity
    // Prevents "vortex trap" problem with high-rotation enemies
    constexpr float SPEED_ROT_MAX = 1.5F;  // rad/s (~86°/s)

}  // namespace Defaults::Physics::Debris
