- insertion dans .sidebar-tab-core avant .sidebar-tab-scroll
(respecte la hiérarchie DOM attendue par FVTT v14)
- CSS: pointer-events: auto + position: relative + z-index: 1
- fallback insertion en haut de #chat si selecteurs absents
- insertion en haut de #chat (avant sidebar-tab-core) au lieu
d'insérer avant #chat-controls (caché par le scroll en v14)
- remplacement inline styles → classes CSS .hamalron-chat-tools/.hamalron-chat-btn
- CSS externalisé dans chat.less
Les 78 cartes sont rangées dans un dossier 'Tarot' dans le
compendium système. Le script generate-tarot-packs crée le
dossier puis y place chaque carte.
Généré depuis assets/data/tarot.json vers packs-system/hamalron-items/
via tools/generate-tarot-packs.mjs + @foundryvtt/foundryvtt-cli
Le resetDeck() importe depuis le compendium si aucun item monde
n'existe, ou crée les cartes depuis le fichier JSON en dernier recours.
resetDeck() cherche les cartes dans cet ordre :
1. game.items (items monde existants)
2. Compendium système fvtt-hamalron.hamalron-items
3. assets/data/tarot.json (création automatique)
Ajout de assets/data/tarot.json : 78 cartes standard
Remplace le jet de dés par un vrai dialogue d'épreuve Hamalron :
- Sélection d'une carte dans la main du personnage
- Choix de la difficulté (table standard)
- Calcul réussi/échec basé sur la valeur de la carte
- La carte est défaussée et remplacée depuis le deck
Le bouton Sort était peu utile (personnage pas toujours défini).
Remplacé par Épreuve 🎲 qui ouvre le dialogue de jet standard,
accessible depuis le chat pour tous.
Le fichier .less était importé dans le bloc .fvtt-hamalron,
ce qui produisait le sélecteur .fvtt-hamalron .fvtt-hamalron.action-complexe
(ne matchait pas le DOM).
Corrigé : import déplacé hors du bloc, sélecteur .fvtt-hamalron.action-complexe
Barre d'outils ajoutée au-dessus de la zone de saisie du chat :
- Tarot 🃏 : ouvre le gestionnaire de deck (GM only)
- Actions 📋 : ouvre les actions complexes (GM only)
- Sort 🪄 : lance un sort du personnage actif
- Clic 'Sous tension' : tire une carte du deck, compare avec le score
- Clic 'Opposé' : idem avec libellé Opposant
- Résultat affiché dans un nouveau message de chat
Utilise une regex pour détecter les formules invalides avant
d'appeler super.prepareDerivedData(). Fallback sur try-catch
qui vide les rolls en dernier recours.
Les anciens messages d'initiative stockaient des formules comme
'3 de Bâton (3)' qui cassent Roll.parse(). Le override de
prepareDerivedData dans HamalronChatMessage valide chaque formule
via Roll.parse() et remplace par '1d6' si invalide.
- Trailing comma dans fr.json qui cassait le parsing JSON (critique)
- RANG_MAGICIEN utilisait val.name au lieu de val.label
- Bouton tirage MJ accessible aux non-GM (ajout guard game.user.isGM)
- style='flex:1' et style='display:none' externalisés dans roll.less
1. Tirage MJ dans le dialogue de compétence :
- Bouton tirer une carte dans la section difficulté
- Pioche dans le deck, affiche la carte tirée
- Calcule la difficulté sous tension
2. Drag & drop vers barre de raccourcis :
- Acteurs → ouvre la feuille
- Compétences → lance le jet de compétence
- Sorts → ouvre le dialogue de lancement
- Armes → lance le jet d'arme
3. Blessures incapacitantes (règle p.159) :
- Champs blessureIncapacitante / malusBlessure
- Dialogue proposant la blessure quand Épée diminue
- Malus -2 appliqué aux jets de compétence
- Bannière dans la feuille (mode jeu)
- Bouton guérison
- style='width: X%' → style='--pct: X' dans templates et JS
- CSS calc(var(--pct) * 1%) dans les fichiers .less correspondants
- Création de styles/action-complexe.less
- Import action-complexe.less dans fvtt-hamalron.less
- style='width: 100%' → class='tension-select' dans tarot-deck-manager
- Ajout .tension-select dans tarot-deck-manager.less
- Suppression doublon .initiative-roll dans chat.less
- Auto-initialisation du deck s'il est vide ou non initialisé
- Fallback silencieux sur 1d6 si vraiment aucune carte dispo
- _formula changé en '1d1' pour éviter les erreurs de parsing
- Ajout du CSS complet pour le message d'initiative (chat.less)
- Fond dégradé sombre, bordure rouge, badge arrondi
- Avatar, nom, carte, valeur, score d'initiative
- Pied de page stylisé
Les messages d'initiative affichent désormais :
- Avatar et nom du protagoniste
- Badge avec le score d'initiative (éclair)
- Image de la carte de tarot tirée
- Nom et valeur de la carte
- Pied de page avec la mention 'Initiative'
Correction d'une syntax error (extra }) qui cassait le hook
- La formule du roll est remplacée par le nom de la carte de tarot
- Plus d'affichage de '1d6' trompeur dans le chat
- Valeur de la carte utilisée comme score d'initiative
- Dialogue de récupération accessible depuis la feuille personnage
- Coupe/Denier : test difficulté 7 (1x/jour), +1 si réussi
- Épée : +1 manuel (repos/soins) ou test guérison rapide
- Bâton : +1 manuel (appréciation MJ)
- Suivi des dates de dernière récupération par symbole
- Désactive le test si déjà fait aujourd'hui
- Bouton d'accès intégré dans la section résistances (icône lit)
- Réutilise HamalronTirageTarot.prompt pour les tests
- Nouvelle fenêtre Actions complexes (GM-only)
- Création d'actions avec nom, symbole, résistance (nb de succès requis)
- Barre de progression + compteurs succès/échecs
- Boutons Réussite/Échec pour suivre l'avancement
- Notification et message chat quand l'objectif est atteint
- Persistance dans un setting world-scope
- Bouton dans les contrôles de scène (icône tasks)
- Accessible via game.system.api.openActionComplexe()
Conforme aux règles p.157 : actions nécessitant 2-5 victoires
Override Combatant.getInitiativeRoll pour piocher
une carte du paquet de tarot au lieu de lancer 1d6.
- Chaque combatant tire une carte → valeur = initiative
- Les cartes vont à la défausse après usage
- Fallback sur 1d6 si le paquet n'est pas disponible
- globalThis.HamalronTarotDeckManager exposé pour l'override
Foundry v14 utilise style au lieu de type pour ChatMessage
et CONST.CHAT_MESSAGE_TYPES n'existe pas.
Corrigé dans tarot-deck-manager, sortilege-casting, base-actor-sheet
- Modèle sortilege enrichi (type, niveau, portée, durée, conditions, effets)
- Personnage: champ rangMagie (ensorceleur/initié/thaumaturge)
- Constantes: SORTILEGE_MODIFICATEURS (table 3x3), RANG_MAGICIEN
- Dialogue de lancement: tirage MJ, sélection atouts + Coupe, total temps réel
- Calcul difficulté: carte MJ + modificateur selon type × niveau
- Table des échecs magiques (normal/critique selon rang)
- Pioche automatique après succès, défausse après échec
- Template chat avec résultat localisé
Corrections post-review:
- Boucle de défausse sur échec corrigée (itérait toujours sur [0])
- Clé de localisation HAMALRON.Roll.cast -> HAMALRON.Sortilege.cast
- Ajout de la clé manquante noCoupe
- Labels localisés dans le chat (categorieLabel, niveauLabel)