55 lines
1.6 KiB
Python
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
|