# 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