Architecture des buffs¶
La migration 0024_character_buffs crée buff_definitions et character_buffs. PostgreSQL conserve
la définition déclarative, la durée restante et l'instant de reprise. L'API recalcule les durées lors
des transitions resume/pause; aucune durée hors ligne n'est consommée.
La migration 0025_passive_buffs ajoute le booléen passive aux définitions. Le moteur ignore le
décompte, l'expiration et resumed_at pour ces instances. La durée numérique reste conservée pour
permettre de repasser ultérieurement la définition en mode temporaire sans altérer le schéma.
La ressource medusa-buffs synchronise les statuts à la sélection du personnage et toutes les dix
secondes. Elle publie leur état localement vers medusa-hud, dont la NUI transparente rend la pile
en haut à droite. Le client de buffs agrège les
modificateurs continus et planifie les effets périodiques par identifiant d'instance. Les effets sont
déclarés sous la forme {type, value, interval_ms?, options?} et validés contre un catalogue fermé.
La native optionnelle de recharge d'endurance est détectée avant utilisation. Si l'artifact client
ne l'expose pas, seul cet effet est ignoré et une trace unique est écrite ; la boucle continue
d'appliquer les autres effets et d'alimenter le HUD.
Chaque synchronisation sauvegarde un point de contrôle du temps restant. Au démarrage de la ressource, une récupération globale neutralise les marqueurs laissés par un arrêt du serveur : la durée écoulée pendant le redémarrage n'est jamais débitée.
Les routes web utilisent /admin/buffs. Les routes internes /internal/v1/buffs sont protégées par
la clé interne; les mutations admin en jeu revérifient les rôles Discord dans l'API.
Le constructeur de champs du web admin normalise null et undefined vers une définition vide :
le même composant peut ainsi servir sans erreur à la création et à l'édition.
Le POST idempotent /internal/v1/buffs/runtime/recover utilise au chargement un retry explicite,
borné et exponentiel. Les erreurs finales passent par formatApiError, ce qui conserve route, code
et corrélation même à travers l'export Cfx.