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

55 lines
1.6 KiB
Python

# buff_system.py : buffs joueurs (immunites, vitesse, sorts divins)
# un buff = {"type": "...", "timer": float, ...} dans player.buffs
import logging
from constants import (
ALDRIC_FLYING_SPEED_MULT,
TICK_DURATION,
)
logger = logging.getLogger(__name__)
def player_has_buff(player, buff_type):
return any(b["type"] == buff_type for b in player.buffs)
def player_is_immune(player):
"""immunise aux degats si invuln/intangible/flying.
invuln = sort divin Kael, intangible = teleport Seris, flying = vol Aldric
"""
return any(b["type"] in {"invulnerable", "intangible", "flying"} for b in player.buffs)
def player_damage_mult(player):
mult = 1.0
for b in player.buffs:
if b["type"] in ("damage_mult", "combat_buff"):
mult *= b.get("damage_mult", 1.0)
return mult
def player_speed_mult(player):
# on prend le max et pas le produit : 2 buffs vitesse en meme temps doivent pas se cumuler a fond
mult = 1.0
for b in player.buffs:
if b["type"] == "flying":
mult = max(mult, ALDRIC_FLYING_SPEED_MULT)
elif b["type"] in ("speed_mult", "combat_buff"):
mult = max(mult, b.get("speed_mult", 1.0))
return mult
def update_buffs(state):
# decremente les timers de tous les buffs, vire les expires
for player in state.players:
kept = []
for buff in player.buffs:
buff["timer"] = max(0.0, buff["timer"] - TICK_DURATION)
if buff["timer"] > 0:
kept.append(buff)
# TODO si on rajoute des effets en fin de buff, c'est ici
player.buffs = kept