221 lines
9.2 KiB
Python
221 lines
9.2 KiB
Python
# 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
|