SOULGATE/server/constants.py
2026-05-04 03:42:47 +02:00

221 lines
9.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 (2575 % 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