# Constantes gameplay de SOULGATE — toutes les valeurs en un seul endroit

# --- Arène ---
ARENA_WIDTH: float = 35.0    # world units, X : -17.5 à +17.5
ARENA_HEIGHT: float = 35.0   # world units, Y : -17.5 à +17.5

# Positions clés (recalees pour la nouvelle taille 35x35)
SOULGATE_X: float = 0.0
SOULGATE_Y: float = -15.0
PLAYER_SPAWN_X: float = 0.0
PLAYER_SPAWN_Y: float = -10.0
ENEMY_MAIN_SPAWN_X: float = 0.0
ENEMY_MAIN_SPAWN_Y: float = 15.0

# --- Game loop ---
TICK_RATE: int = 20          # ticks par seconde
TICK_DURATION: float = 0.05  # secondes par tick (1 / TICK_RATE)

# --- Vagues ---
PREPARATION_DURATION: float = 20.0  # secondes de préparation entre les vagues

# --- Soulgate ---
SOULGATE_MAX_HP: int = 100

# --- Reconnexion ---
RECONNECT_TIMEOUT: int = 30  # secondes avant passage en IA basique

# --- Joueurs ---
# Vitesse de déplacement (world units / seconde)
PLAYER_SPEED: float = 10.0

# HP max par classe
PLAYER_MAX_HP: dict[str, int] = {
    "kael": 150,    # Tank
    "seris": 80,    # Mage DPS (fragile)
    "aldric": 100,  # Support
}

# --- Combat ---
# Cooldown entre deux attaques basiques (secondes)
ATTACK_COOLDOWN: float = 0.5

# Vitesse des projectiles par classe (world units / seconde)
PROJECTILE_SPEED: dict[str, float] = {
    "kael":   8.0,    # lent — portée courte (pseudo-mêlée)
    "seris":  20.0,   # rapide — longue portée
    "aldric": 12.0,   # moyen — portée moyenne
}

# Dégâts de l'attaque basique par classe
PROJECTILE_DAMAGE: dict[str, int] = {
    "kael":   30,
    "seris":  15,
    "aldric": 10,
}

# Durée de vie des projectiles (secondes) — détermine la portée effective
PROJECTILE_TTL: dict[str, float] = {
    "kael":   0.3,    # ~2.4 wu (mêlée)
    "seris":  1.5,    # ~30 wu (longue portée)
    "aldric": 0.8,    # ~9.6 wu
}

# --- Attaque mêlée de Kael (remplace le projectile) ---
KAEL_MELEE_RADIUS: float = 3.0   # portée du slash en world units
KAEL_MELEE_DAMAGE: int   = 40    # dégâts par coup (un peu plus qu'avant car pas de portée)

# --- Compétences actives de Kael ---
KAEL_SLAM_RADIUS: float     = 3.5   # rayon du slam AOE (skill 2 — frappe lourde, cercle complet)
KAEL_SLAM_TICKS: int        = 8     # durée de la zone en ticks (8 × 50ms = 0.4s)
KAEL_SLAM_DMG_PER_TICK: int = 8     # dégâts par tick (8 × 8 = 64 total max)
KAEL_STORM_RADIUS: float    = 5.5   # rayon de la tempête (skill 3 — AOE large autour de Kael)
KAEL_STORM_TICKS: int       = 20    # durée de la zone en ticks (20 × 50ms = 1.0s)
KAEL_STORM_DMG_PER_TICK: int = 5    # dégâts par tick (5 × 20 = 100 total max)
KAEL_SHIELD_DURATION: float = 3.0   # durée du bouclier (skill 1 — invulnérabilité en secondes)

# Rayons des hitboxes (world units)
PROJECTILE_RADIUS: float = 0.4
PLAYER_HITBOX_RADIUS: float = 0.5
ENEMY_HITBOX_RADIUS: float = 0.5

# --- Boss Vexaris (vague 2) ---
VEXARIS_HP: int = 600
VEXARIS_HITBOX_RADIUS: float = 1.2
VEXARIS_SPEED_P1: float = 3.5    # wu/s — phase 1 (>50 % PV)
VEXARIS_SPEED_P2: float = 5.5    # wu/s — phase 2 (≤50 % PV)
VEXARIS_MELEE_DAMAGE: int = 35
VEXARIS_SG_DAMAGE: int = 40
VEXARIS_CHARGE_COOLDOWN: float = 7.0    # s entre deux charges
VEXARIS_CHARGE_SPEED: float = 20.0      # wu/s pendant la charge
VEXARIS_CHARGE_DURATION: float = 0.5    # s de durée de charge
VEXARIS_BURST_COOLDOWN: float = 10.0    # s entre deux bursts (phase 2)
VEXARIS_BURST_COUNT: int = 3            # éclats par burst

# --- Boss Morveth (vague 3) ---
MORVETH_HP: int = 1000
MORVETH_HITBOX_RADIUS: float = 1.5
MORVETH_SPEED_P1: float = 2.5    # wu/s — phase 1 (>75 % PV)
MORVETH_SPEED_P2: float = 4.0    # wu/s — phase 2 (25–75 % PV)
MORVETH_SPEED_P3: float = 6.5    # wu/s — phase 3 enragé (≤25 % PV)
MORVETH_MELEE_DAMAGE: int = 45
MORVETH_SG_DAMAGE: int = 50
MORVETH_CHARGE_COOLDOWN: float = 9.0
MORVETH_CHARGE_SPEED: float = 22.0
MORVETH_CHARGE_DURATION: float = 0.6
MORVETH_BURST_COOLDOWN: float = 12.0    # s entre deux bursts (phase 2+)
MORVETH_BURST_COUNT: int = 4

# Généraux (sub-boss invoqués par Morveth)
GENERAL_HP: int = 150
GENERAL_HITBOX_RADIUS: float = 0.8
GENERAL_SPEED: float = 4.5
GENERAL_MELEE_DAMAGE: int = 25
GENERAL_SG_DAMAGE: int = 15

# Bosses par vague (numéro 1-indexed → type)
WAVE_BOSSES: dict[int, str] = {2: "vexaris", 3: "morveth"}

# --- Ennemis ---
# Stats par type : hp, vitesse (wu/s), dégâts au joueur, dégâts au Soulgate, rayon hitbox
ENEMY_STATS: dict[str, dict] = {
    "fracture": {"hp": 40,  "speed": 4.0, "damage": 10, "sg_damage": 0,  "radius": 0.5},
    "rampant":  {"hp": 20,  "speed": 7.0, "damage": 5,  "sg_damage": 5,  "radius": 0.4},
    "colosse":  {"hp": 200, "speed": 2.0, "damage": 20, "sg_damage": 20, "radius": 1.0},
    "eclat":    {"hp": 10,  "speed": 8.0, "damage": 8,  "sg_damage": 2,  "radius": 0.3},
    # Boss — valeurs doivent correspondre aux constantes VEXARIS_* / MORVETH_* ci-dessus
    "vexaris":  {"hp": 600,  "speed": 3.5, "damage": 35, "sg_damage": 40, "radius": 1.2},
    "morveth":  {"hp": 1000, "speed": 2.5, "damage": 45, "sg_damage": 50, "radius": 1.5},
    "general":  {"hp": 150,  "speed": 4.5, "damage": 25, "sg_damage": 15, "radius": 0.8},
}

# Intervalle minimum entre deux frappes du même ennemi sur la même cible (secondes)
ENEMY_ATTACK_COOLDOWN: float = 1.0

# Rayon de la hitbox du Soulgate (wu) — correspond approximativement au pad visuel
SOULGATE_HITBOX_RADIUS: float = 1.0

# --- Cooldowns des compétences ---
# Cooldowns des compétences par classe (ability_1, ability_2, ability_3) en secondes
ABILITY_COOLDOWNS: dict[str, list[float]] = {
    "kael":   [7.0, 12.0],   # skill 1 = slam, skill 2 = tempête
    "seris":  [6.0, 10.0],   # skill 1 : éventail, skill 2 : vide (ratio ×1.67)
    "aldric": [8.0, 15.0],   # à définir lors de l'implémentation d'Aldric
}

# --- Positions de spawn ---
# Positions de spawn initiales des 3 joueurs (devant le Soulgate, légèrement décalés)
PLAYER_SPAWN_POSITIONS: list[tuple[float, float]] = [
    (0.0, -10.0),   # joueur 1 — centre
    (-2.0, -9.0),   # joueur 2 — gauche
    (2.0, -9.0),    # joueur 3 — droite
]

# --- Déplacements spéciaux (touche E) ---
DISPLACEMENT_COOLDOWNS: dict[str, float] = {
    "kael":   9.0,   # augmenté (dash puissant même court)
    "seris":  4.0,
    "aldric": 14.0,
}
KAEL_CHARGE_DISTANCE: float = 2.5        # wu parcourus
KAEL_CHARGE_DAMAGE: int = 20             # dégâts aux ennemis traversés
KAEL_CHARGE_HIT_RADIUS: float = 1.2     # rayon de détection autour du segment
SERIS_INTANGIBLE_DURATION: float = 0.3  # s intangible post-téléport

# --- Compétences actives de Seris ---
SERIS_FAN_COUNT: int        = 3      # nombre de dagues dans l'éventail (skill 1)
SERIS_FAN_SPREAD: float     = 0.35   # demi-angle du cône en radians (~20°)
SERIS_FAN_DAMAGE: int       = 12     # dégâts par dague (3 × 12 = 36 max)
SERIS_VOID_RADIUS: float    = 4.0    # rayon explosion vide (skill 2)
SERIS_VOID_TICKS: int       = 10     # durée en ticks (10 × 50ms = 0.5s)
SERIS_VOID_DMG_PER_TICK: int = 8     # dégâts/tick (8 × 10 = 80 total max)
ALDRIC_FLYING_DURATION: float = 4.0     # s de vol
ALDRIC_FLYING_SPEED_MULT: float = 1.6   # vitesse ×1,6 en vol

# --- Compétences actives d'Aldric ---
ALDRIC_HEAL_RADIUS: float    = 6.0   # rayon du halo de soin (skill 1)
ALDRIC_HEAL_AMOUNT: int      = 25    # PV soignés par utilisation
ALDRIC_PULSE_RADIUS: float   = 5.0   # rayon de la vague d'énergie (skill 2)
ALDRIC_PULSE_TICKS: int      = 8     # durée en ticks (8 × 50ms = 0.4s)
ALDRIC_PULSE_DMG_PER_TICK: int = 8   # dégâts/tick (8 × 8 = 64 total max)

# --- Sorts Divins (touche R) ---
DIVINE_POST_USE_COOLDOWN: float = 60.0   # cooldown entre 2 utilisations (évite spam)
KAEL_DIVINE_DURATION: float = 8.0
KAEL_DIVINE_DAMAGE_MULT: float = 3.0
KAEL_DIVINE_SG_HEAL_PER_KILL: float = 0.01  # 1 % HP max par kill
SERIS_DIVINE_CHANNEL: float = 3.0       # s de canalisation
SERIS_DIVINE_FREEZE: float = 6.0        # s de gel des ennemis
SERIS_DIVINE_DPS: int = 15              # dégâts/s aux ennemis gelés
ALDRIC_DIVINE_CHANNEL: float = 2.0      # s de canalisation
ALDRIC_DIVINE_BUFF_DURATION: float = 10.0
ALDRIC_DIVINE_DAMAGE_MULT: float = 1.3
ALDRIC_DIVINE_SPEED_MULT: float = 1.3
ALDRIC_DIVINE_SG_HEAL: float = 0.10     # 10 % HP max Soulgate

# --- Upgrades ---
# Âmes gagnées par kill selon le type d'ennemi
SOUL_REWARDS: dict[str, int] = {
    "fracture": 10,
    "rampant":   8,
    "colosse":  50,
    "eclat":     5,
    "vexaris": 200,
    "general":  75,
    "morveth": 300,
}

# Catalogue d'upgrades disponibles pendant la phase de préparation
UPGRADE_CATALOG: dict[str, dict] = {
    "damage_up":     {"name": "Frappe +",   "description": "+25% dégâts projectile",       "cost": 30, "max_stacks": 2},
    "cooldown_down": {"name": "Cadence +",  "description": "-20% cooldown d'attaque",       "cost": 25, "max_stacks": 2},
    "hp_up":         {"name": "Vitalité +", "description": "+30 PV max",                    "cost": 35, "max_stacks": 2},
    "speed_up":      {"name": "Vitesse +",  "description": "+15% vitesse de déplacement",   "cost": 20, "max_stacks": 3},
}

# --- Leaderboard / Score ---
SCORE_PER_KILL  = 10    # points par ennemi tué
SCORE_PER_SOUL  = 2     # points par âme collectée
SCORE_VICTORY   = 1000  # bonus de victoire
SCORE_PER_WAVE  = 200   # points par vague complétée
