Aller au contenu

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.