From 8a27cef9a492f6eef2aaead5ba344accc148e777 Mon Sep 17 00:00:00 2001 From: LeRatierBretonnien Date: Fri, 2 Jan 2026 20:30:29 +0100 Subject: [PATCH] Workable system, firt step --- assets/data/competences.json | 572 +++++ assets/data/factions.json | 38 + assets/data/peuples.json | 34 + assets/fonts/EagleLake-Regular.ttf | Bin 0 -> 76596 bytes assets/fonts/Times New Roman.ttf | Bin 0 -> 68372 bytes assets/icons/arme.svg | 1 + assets/icons/armor.webp | Bin 6608 -> 0 bytes assets/icons/armure.svg | 1 + assets/icons/competence.svg | 1 + assets/icons/deal.webp | Bin 7138 -> 0 bytes assets/icons/equipement.svg | 1 + assets/icons/equipment.webp | Bin 6892 -> 0 bytes assets/icons/faction.svg | 1 + assets/icons/langue.svg | 1 + assets/icons/malefica.webp | Bin 13298 -> 0 bytes assets/icons/perk.webp | Bin 6022 -> 0 bytes assets/icons/peuple.svg | 1 + assets/icons/region.svg | 1 + assets/icons/ritual.webp | Bin 12948 -> 0 bytes assets/icons/sortilege.svg | 1 + assets/icons/species-trait.webp | Bin 6892 -> 0 bytes assets/icons/tarot.svg | 1 + assets/icons/tarot.webp | Bin 8172 -> 0 bytes assets/icons/weapon.webp | Bin 4166 -> 0 bytes css/fvtt-hamalron.css | 1964 +++++++++++++---- fvtt-hamalron.mjs | 9 + lang/fr.json | 156 +- macro-import-competences.js | 105 + macro-import-factions.js | 93 + macro-import-peuples.js | 93 + .../applications/sheets/personnage-sheet.mjs | 285 ++- module/applications/tarot-deck-manager.mjs | 354 ++- module/config/system.mjs | 53 +- module/documents/item.mjs | 20 +- module/documents/tirage-tarot.mjs | 400 +++- module/models/competence.mjs | 6 +- module/utils.mjs | 11 +- packs-system/hamalron-items/000004.log | 0 packs-system/hamalron-items/CURRENT | 2 +- packs-system/hamalron-items/LOG | 12 +- packs-system/hamalron-items/LOG.old | 3 + packs-system/hamalron-items/MANIFEST-000002 | Bin 65 -> 0 bytes packs-system/hamalron-items/MANIFEST-000016 | Bin 0 -> 65 bytes styles/chat.less | 745 ++++++- styles/fonts.less | 8 +- styles/fvtt-hamalron.less | 4 +- styles/global.less | 11 +- styles/mixins.less | 4 +- styles/personnage-tarot.less | 311 ++- styles/personnage.less | 406 +++- styles/roll.less | 224 +- styles/tarot-deck-manager.less | 147 +- templates/character-biography.hbs | 154 -- templates/character-equipment.hbs | 127 -- templates/character-main.hbs | 106 - templates/character-maleficas.hbs | 70 - templates/character-status.hbs | 84 - templates/chat-competence.hbs | 154 ++ templates/chat-tarot-draw.hbs | 72 +- templates/chat-tarot-tension.hbs | 51 + templates/competence.hbs | 9 +- templates/personnage-biographie.hbs | 12 + templates/personnage-main.hbs | 214 +- templates/personnage-sortileges.hbs | 195 +- templates/personnage-status.hbs | 227 +- templates/personnage-tarot.hbs | 115 +- templates/roll-dialog.hbs | 111 +- templates/tarot-deck-manager.hbs | 65 +- templates/tarot.hbs | 2 +- 69 files changed, 6081 insertions(+), 1767 deletions(-) create mode 100644 assets/data/competences.json create mode 100644 assets/data/factions.json create mode 100644 assets/data/peuples.json create mode 100644 assets/fonts/EagleLake-Regular.ttf create mode 100644 assets/fonts/Times New Roman.ttf create mode 100644 assets/icons/arme.svg delete mode 100644 assets/icons/armor.webp create mode 100644 assets/icons/armure.svg create mode 100644 assets/icons/competence.svg delete mode 100644 assets/icons/deal.webp create mode 100644 assets/icons/equipement.svg delete mode 100644 assets/icons/equipment.webp create mode 100644 assets/icons/faction.svg create mode 100644 assets/icons/langue.svg delete mode 100644 assets/icons/malefica.webp delete mode 100644 assets/icons/perk.webp create mode 100644 assets/icons/peuple.svg create mode 100644 assets/icons/region.svg delete mode 100644 assets/icons/ritual.webp create mode 100644 assets/icons/sortilege.svg delete mode 100644 assets/icons/species-trait.webp create mode 100644 assets/icons/tarot.svg delete mode 100644 assets/icons/tarot.webp delete mode 100644 assets/icons/weapon.webp create mode 100644 macro-import-competences.js create mode 100644 macro-import-factions.js create mode 100644 macro-import-peuples.js delete mode 100644 packs-system/hamalron-items/000004.log create mode 100644 packs-system/hamalron-items/LOG.old delete mode 100644 packs-system/hamalron-items/MANIFEST-000002 create mode 100644 packs-system/hamalron-items/MANIFEST-000016 delete mode 100644 templates/character-biography.hbs delete mode 100644 templates/character-equipment.hbs delete mode 100644 templates/character-main.hbs delete mode 100644 templates/character-maleficas.hbs delete mode 100644 templates/character-status.hbs create mode 100644 templates/chat-competence.hbs create mode 100644 templates/chat-tarot-tension.hbs diff --git a/assets/data/competences.json b/assets/data/competences.json new file mode 100644 index 0000000..95d7429 --- /dev/null +++ b/assets/data/competences.json @@ -0,0 +1,572 @@ +[ + { + "name": "Affabulation", + "type": "commune", + "description": "Raconter un mensonge pour semer le doute, tromper un interlocuteur et gagner du temps.", + "carteSymbole": "denier" + }, + { + "name": "Charme inquisiteur", + "type": "commune", + "description": "Jouer de son charme physique ou du sentiment amoureux pour convaincre.", + "carteSymbole": "denier" + }, + { + "name": "Diffamation", + "type": "commune", + "description": "Ridiculiser ou propager des rumeurs pour nuire à un adversaire sans arguments tangibles.", + "carteSymbole": "denier" + }, + { + "name": "Fin négociateur", + "type": "commune", + "description": "Convaincre patiemment un interlocuteur ou négocier un prix avec des arguments convaincants.", + "carteSymbole": "denier" + }, + { + "name": "Fraternité de comptoir", + "type": "commune", + "description": "S'entourer d'amis occasionnels pour obtenir des rumeurs, des informations ou des services.", + "carteSymbole": "denier" + }, + { + "name": "Impassibilité / Comédie", + "type": "commune", + "description": "Dissimuler ses sentiments réels ou simuler une émotion pour tromper son entourage.", + "carteSymbole": "denier" + }, + { + "name": "Intimidation / Don d'apaisement", + "type": "commune", + "description": "Jouer sur la peur des autres pour les impressionner ou, inversement, utiliser sa voix pour les calmer.", + "carteSymbole": "denier" + }, + { + "name": "Menaces voilées", + "type": "commune", + "description": "Convaincre un adversaire qu'une vengeance ou une armée invisible le menace pour le faire cesser une action.", + "carteSymbole": "denier" + }, + { + "name": "Mimétisme social", + "type": "commune", + "description": "Savoir se comporter et se vêtir de manière appropriée dans n'importe quel milieu social.", + "carteSymbole": "denier" + }, + { + "name": "Provocation", + "type": "commune", + "description": "Pousser un interlocuteur à bout pour lui faire perdre son sang-froid ou causer un scandale.", + "carteSymbole": "denier" + }, + { + "name": "Adrénaline", + "type": "commune", + "description": "Mobiliser des ressources cachées en cas de stress pour obtenir un bonus temporaire aux actions physiques.", + "carteSymbole": "epee" + }, + { + "name": "Escalade et autres acrobaties", + "type": "commune", + "description": "Capacité à grimper des façades, marcher sur une corde ou effectuer des sauts périlleux.", + "carteSymbole": "epee" + }, + { + "name": "Guérison rapide", + "type": "commune", + "description": "Capacité physique à récupérer plus vite de blessures ou de traumatismes physiques.", + "carteSymbole": "epee" + }, + { + "name": "Passe d’armes spectaculaire", + "type": "commune", + "description": "Utiliser des mouvements d'armes impressionnants pour intimider ou faire hésiter des opposants.", + "carteSymbole": "epee" + }, + { + "name": "Pugilat", + "type": "commune", + "description": "Maîtrise des techniques de combat non létales à mains nues ou avec des objets hétéroclites.", + "carteSymbole": "epee" + }, + { + "name": "Résistance à la fatigue", + "type": "commune", + "description": "Capacité à rester éveillé, marcher longtemps ou supporter des veilles prolongées sans craquer.", + "carteSymbole": "epee" + }, + { + "name": "Résistance à la souffrance", + "type": "commune", + "description": "Supporter la douleur physique intense, comme courir avec une cheville cassée ou subir une torture.", + "carteSymbole": "epee" + }, + { + "name": "Résistance aux poisons et maladies", + "type": "commune", + "description": "Capacité organique à mieux résister aux toxines et à récupérer plus vite d'une pathologie.", + "carteSymbole": "epee" + }, + { + "name": "Stoïcisme", + "type": "commune", + "description": "Paraître en pleine forme et impénétrable malgré les coups, la maladie ou la fatigue.", + "carteSymbole": "epee" + }, + { + "name": "Survie dans la nature", + "type": "commune", + "description": "Trouver de la nourriture, repérer des traces de prédateurs et s'abriter en milieu sauvage.", + "carteSymbole": "epee" + }, + { + "name": "Artisanat (un au choix)", + "type": "commune", + "description": "Maîtrise d'un métier manuel ou artistique (forgeron, peintre, musicien, etc.).", + "carteSymbole": "baton" + }, + { + "name": "Camouflage d’objet", + "type": "commune", + "description": "Dissimuler des objets sur soi ou dans une pièce, ou repérer ceux cachés par autrui.", + "carteSymbole": "baton" + }, + { + "name": "Cartographie / Orientation", + "type": "commune", + "description": "Comprendre et dessiner des cartes, utiliser des instruments de navigation et s'orienter sur terre comme en mer.", + "carteSymbole": "baton" + }, + { + "name": "Don des affaires", + "type": "commune", + "description": "Comptabilité, logistique de caravane et gestion des stocks liés au commerce.", + "carteSymbole": "baton" + }, + { + "name": "Espionnage", + "type": "commune", + "description": "Connaissance des techniques de renseignement (boîte aux lettres morte, filature, écoute clandestine).", + "carteSymbole": "baton" + }, + { + "name": "Falsification", + "type": "commune", + "description": "Imiter une écriture, fabriquer de faux sceaux et modifier des documents officiels.", + "carteSymbole": "baton" + }, + { + "name": "Organisation militaire", + "type": "commune", + "description": "Gérer la cohésion d'une troupe et organiser des hommes, que ce soit une patrouille ou une armée.", + "carteSymbole": "baton" + }, + { + "name": "Quidam lambda", + "type": "commune", + "description": "Se fondre dans la foule urbaine pour passer inaperçu ou prendre quelqu'un en filature.", + "carteSymbole": "baton" + }, + { + "name": "Stratégie", + "type": "commune", + "description": "Établir des plans de bataille, estimer les forces ennemies et mener des campagnes militaires.", + "carteSymbole": "baton" + }, + { + "name": "Symbiose animale", + "type": "commune", + "description": "Créer un rapport de confiance avec les bêtes pour éviter les attaques ou les apprivoiser.", + "carteSymbole": "baton" + }, + { + "name": "Connaissance de l’Inframonde", + "type": "commune", + "description": "Savoir théorique sur la dimension de l'Inframonde, ses portails et ses créatures malveillantes.", + "carteSymbole": "coupe" + }, + { + "name": "Connaissance des Arcanes", + "type": "commune", + "description": "Comprendre le fonctionnement et les limites de la magie, ainsi que l'histoire de la thaumaturgie.", + "carteSymbole": "coupe" + }, + { + "name": "Corruption de bureaucrate", + "type": "commune", + "description": "Identifier les faiblesses des employés de l'administration pour obtenir des faveurs ou des informations.", + "carteSymbole": "coupe" + }, + { + "name": "Enquête / Investigation", + "type": "commune", + "description": "Repérer des détails inhabituels, résoudre des énigmes et comprendre les motivations cachées.", + "carteSymbole": "coupe" + }, + { + "name": "Herboristerie", + "type": "commune", + "description": "Trouver des plantes et confectionner des remèdes de base, des poisons simples ou des hallucinogènes.", + "carteSymbole": "coupe" + }, + { + "name": "Langage des runes", + "type": "commune", + "description": "Lire et déchiffrer les runes chargées de magie sur des parchemins ou des gravures.", + "carteSymbole": "coupe" + }, + { + "name": "Langue (parler, lire et écrire)", + "type": "commune", + "description": "Maîtrise orale et/ou écrite de langues étrangères ou anciennes.", + "carteSymbole": "coupe" + }, + { + "name": "Recherche en bibliothèque", + "type": "commune", + "description": "Méthodologie pour trouver des informations dans les archives et déchiffrer des textes anciens.", + "carteSymbole": "coupe" + }, + { + "name": "Savoir encyclopédique", + "type": "commune", + "description": "Posséder une grande culture générale sur de multiples sujets théoriques et historiques.", + "carteSymbole": "coupe" + }, + { + "name": "Soins basiques", + "type": "commune", + "description": "Donner les premiers secours (lavage, suture, bandages) pour stabiliser un blessé.", + "carteSymbole": "coupe" + }, + { + "name": "Excellent joueur", + "type": "peuple", + "peuple": "Centuplide", + "description": "Instinct du jeu, des paris et du bluff permettant de gagner même quand le hasard est seul facteur.", + "carteSymbole": "denier" + }, + { + "name": "Violence caniculaire", + "type": "peuple", + "peuple": "Centuplide", + "description": "Utiliser sa force et son agilité reptilienne pour porter des coups d'une violence extrême.", + "carteSymbole": "epee" + }, + { + "name": "Itinéraire", + "type": "peuple", + "peuple": "Centuplide", + "description": "Mémoire infaillible des routes et chemins parcourus, empêchant de se perdre en extérieur.", + "carteSymbole": "baton" + }, + { + "name": "Conscience collective", + "type": "peuple", + "peuple": "Centuplide", + "description": "Percevoir l'état de santé, le moral et la position approximative des centuplides à proximité.", + "carteSymbole": "coupe" + }, + { + "name": "Diplomatie éowin", + "type": "peuple", + "peuple": "Éowin", + "description": "Talent naturel pour servir de médiateur et d'intermédiaire dans les accords ou traités de paix.", + "carteSymbole": "denier" + }, + { + "name": "Esquive éowin", + "type": "peuple", + "peuple": "Éowin", + "description": "Agilité exceptionnelle permettant d'éviter les coups plutôt que de les bloquer.", + "carteSymbole": "epee" + }, + { + "name": "Compréhension des mécanismes complexes", + "type": "peuple", + "peuple": "Éowin", + "description": "Don instinctif pour comprendre et réparer des mécanismes d'horlogerie, serrures ou moulins.", + "carteSymbole": "baton" + }, + { + "name": "Perception empathique", + "type": "peuple", + "peuple": "Éowin", + "description": "Ressentir l'atmosphère générale et les sentiments qui animent une foule ou un groupe.", + "carteSymbole": "coupe" + }, + { + "name": "Langage des captifs", + "type": "peuple", + "peuple": "Cendrove", + "description": "Langage corporel sommaire permettant de communiquer des sentiments ou intentions sans parler.", + "carteSymbole": "denier" + }, + { + "name": "Symbiose avec l'Entremonde", + "type": "peuple", + "peuple": "Cendrove", + "description": "Capacité spirituelle à entrer dans un état de fureur apportant des bonus aux actions d'Épée.", + "carteSymbole": "epee" + }, + { + "name": "Cachette de fortune", + "type": "peuple", + "peuple": "Cendrove", + "description": "Savoir utiliser le terrain pour se cacher soi-même ou des objets de manière quasi indétectable.", + "carteSymbole": "baton" + }, + { + "name": "Lecture des astres", + "type": "peuple", + "peuple": "Cendrove", + "description": "Interpréter le mouvement des étoiles pour obtenir des indices sur le futur ou une direction.", + "carteSymbole": "coupe" + }, + { + "name": "Expertise politique", + "type": "faction", + "faction": "Administrum", + "description": "Anticiper les bénéficiaires d'une action politique et déceler les ruses lors de signatures d'accords.", + "carteSymbole": "denier" + }, + { + "name": "Profil bas", + "type": "faction", + "faction": "Administrum", + "description": "Paraître insignifiant ou laisser entendre que sa fonction garantit une rançon pour éviter les coups.", + "carteSymbole": "epee" + }, + { + "name": "Application de la loi impériale", + "type": "faction", + "faction": "Administrum", + "description": "Connaître les lois pour les exécuter ou les contourner légalement avec un argumentaire solide.", + "carteSymbole": "baton" + }, + { + "name": "Connaissance de la technologie hamalronienne", + "type": "faction", + "faction": "Administrum", + "description": "Savoir utiliser ou fabriquer des installations technologiques de l'âge d'or (vapeur, hydraulique).", + "carteSymbole": "coupe" + }, + { + "name": "Vieilles amitiés", + "type": "faction", + "faction": "Bastion", + "description": "Activer des liens familiaux ou nobiliaires transmis sur plusieurs générations pour obtenir de l'aide.", + "carteSymbole": "denier" + }, + { + "name": "Botte secrète", + "type": "faction", + "faction": "Bastion", + "description": "Utiliser une ruse d'escrime spécifique pour surprendre un adversaire et obtenir un bonus.", + "carteSymbole": "epee" + }, + { + "name": "Mobilisation", + "type": "faction", + "faction": "Bastion", + "description": "Capacité à lever une troupe de fidèles dans une région donnée grâce à son influence nobiliaire.", + "carteSymbole": "baton" + }, + { + "name": "Histoire de la noblesse", + "type": "faction", + "faction": "Bastion", + "description": "Connaissance approfondie de l'héraldique, des lignées, des exploits et des secrets des grandes familles.", + "carteSymbole": "coupe" + }, + { + "name": "Serment d’honneur", + "type": "faction", "faction": "Chevaliers de la Rose grise", "description": "Donner sa parole pour gagner en crédibilité, amadouer ou effrayer, au prix de l'obligation de la tenir.", + "carteSymbole": "denier" + }, + { + "name": "Duel", + "type": "faction", + "faction": "Chevaliers de la Rose grise", + "description": "Expertise du combat à la loyale, en un contre un au corps à corps.", + "carteSymbole": "epee" + }, + { + "name": "Entretien de l’armement", + "type": "faction", "faction": "Chevaliers de la Rose grise", "description": "Prendre soin de son matériel de guerre pour bénéficier de bonus lors des futurs combats.", + "carteSymbole": "baton" + }, + { + "name": "Allié potentiel", + "type": "faction", + "faction": "Chevaliers de la Rose grise", + "description": "Instinct permettant de sentir si une personne rencontrée peut devenir un allié fiable.", + "carteSymbole": "coupe" + }, + { + "name": "Toujours à sa place", + "type": "faction", + "faction": "Confrérie des Servants", + "description": "Capacité à se fondre dans le décor et passer inaperçu quel que soit le milieu.", + "carteSymbole": "denier" + }, + { + "name": "Attaque-surprise", + "type": "faction", + "faction": "Confrérie des Servants", + "description": "Usage d'armes cachées, dégainés rapides ou fauchages pour surprendre l'adversaire en combat.", + "carteSymbole": "epee" + }, + { + "name": "Doigts agiles", + "type": "faction", + "faction": "Confrérie des Servants", + "description": "Techniques de crochetage, vol de clés ou de documents en toute discrétion.", + "carteSymbole": "baton" + }, + { + "name": "Conseil politique", + "type": "faction", + "faction": "Confrérie des Servants", + "description": "Connaissance approfondie des forces en présence et du pouvoir des dignitaires pour conseiller les puissants.", + "carteSymbole": "coupe" + }, + { + "name": "Sermon", + "type": "faction", + "faction": "Ecclésiarchie", + "description": "Embraser les foules ou réconforter les âmes par la parole et les gestes religieux.", + "carteSymbole": "denier" + }, + { + "name": "Foi inébranlable", + "type": "faction", + "faction": "Ecclésiarchie", + "description": "Utiliser sa conviction religieuse pour lutter ou résister à la peur dans des situations liées à la foi.", + "carteSymbole": "epee" + }, + { + "name": "Simonie", + "type": "faction", + "faction": "Ecclésiarchie", + "description": "Maîtriser le commerce légal des biens religieux, reliques ou absolutions.", + "carteSymbole": "baton" + }, + { + "name": "Théologie", + "type": "faction", + "faction": "Ecclésiarchie", + "description": "Connaissance des secrets, dogmes et débats religieux pour l'étude ou les procès ecclésiastiques.", + "carteSymbole": "coupe" + }, + { + "name": "Extorsion / Racket", + "type": "faction", + "faction": "Fraternité du Poing de fer", + "description": "Obtenir de l'argent ou des privilèges par l'usage de menaces typiques de la pègre.", + "carteSymbole": "denier" + }, + { + "name": "Assassinat", + "type": "faction", + "faction": "Fraternité du Poing de fer", + "description": "Éliminer furtivement une cible humanoïde surprise avec des armes discrètes.", + "carteSymbole": "epee" + }, + { + "name": "Arnaque", + "type": "faction", + "faction": "Fraternité du Poing de fer", + "description": "Maîtrise de la roublardise, des détournements et des stratagèmes complexes (comme les ruses de siège).", + "carteSymbole": "baton" + }, + { + "name": "Langage des signes", + "type": "faction", + "faction": "Fraternité du Poing de fer", + "description": "Système gestuel et écrit secret permettant aux membres de la pègre de communiquer discrètement.", + "carteSymbole": "coupe" + }, + { + "name": "Fibre commerçante", + "type": "faction", + "faction": "Guildes marchandes", + "description": "Art de susciter la compassion pour conclure un marché avantageux ou vendre des produits inutiles.", + "carteSymbole": "denier" + }, + { + "name": "Instinct de survie", + "type": "faction", + "faction": "Guildes marchandes", + "description": "Utiliser l'environnement (objets, obstacles) pour se protéger d'une attaque au détriment de l'offensive.", + "carteSymbole": "epee" + }, + { + "name": "Réseau marchand", + "type": "faction", + "faction": "Guildes marchandes", + "description": "Savoir mobiliser ses filières pour dénicher des objets rares ou organiser des échanges commerciaux.", + "carteSymbole": "baton" + }, + { + "name": "Évaluation d’un produit", + "type": "faction", "faction": "Guildes marchandes", "description": "Déterminer le prix juste, la rareté et la fonction d'une marchandise.", + "carteSymbole": "coupe" + }, + { + "name": "Menace de sorcier", + "type": "faction", + "faction": "Sororité de la Sinistrose", + "description": "Laisser entendre que l'on dispose de pouvoirs pour effrayer un adversaire et le faire céder.", + "carteSymbole": "denier" + }, + { + "name": "Magie de combat", + "type": "faction", + "faction": "Sororité de la Sinistrose", + "description": "Canaliser l'adrénaline du danger pour amplifier la puissance des arts magiques lors du lancement d'un sort.", + "carteSymbole": "epee" + }, + { + "name": "Alchimie", + "type": "faction", + "faction": "Sororité de la Sinistrose", + "description": "Art de concevoir des potions, onguents et objets magiques à partir de composants naturels.", + "carteSymbole": "baton" + }, + { + "name": "Manipulation des Arcanes", + "type": "faction", + "faction": "Sororité de la Sinistrose", + "description": "Détecter les émanations magiques et identifier le type ou la puissance d'un sortilège environnant.", + "carteSymbole": "coupe" + }, + { + "name": "Fraternité des trois", + "type": "faction", + "faction": "Triumvirat", + "description": "User de son charisme pour convaincre un autre non-humain de changer de camp ou de s'entraider.", + "carteSymbole": "denier" + }, + { + "name": "Art de combat racial", + "type": "faction", + "faction": "Triumvirat", + "description": "Maîtrise d'une technique d'attaque spécifique à sa race (Cendrove, Centuplide ou Éowin).", + "carteSymbole": "epee" + }, + { + "name": "Commerce réservé", + "type": "faction", + "faction": "Triumvirat", + "description": "Accéder à des produits rares ou inaccessibles par les réseaux de solidarité primogènes.", + "carteSymbole": "baton" + }, + { + "name": "Savoir des races anciennes", + "type": "faction", + "faction": "Triumvirat", + "description": "Connaissance de l'histoire et des secrets des peuples primogènes avant l'arrivée des humains.", + "carteSymbole": "coupe" + } +] diff --git a/assets/data/factions.json b/assets/data/factions.json new file mode 100644 index 0000000..9cd8232 --- /dev/null +++ b/assets/data/factions.json @@ -0,0 +1,38 @@ +[ + { + "nom": "Administrum", + "description": "Faction composée de sages, d'érudits et de magisters au service de l'impératrice Minarquas. Prônant l'épistémocratie, ils gèrent l'administration, les impôts et les grands travaux pour assurer la stabilité et le progrès éclairé de l'Empire." + }, + { + "nom": "Le Bastion", + "description": "Organisation clandestine regroupant les familles nobles les plus conservatrices, principalement en Malantise. Ils défendent farouchement leurs privilèges féodaux, s'opposent au Triumvirat et rêvent de restaurer un ordre social ancien basé sur la hiérarchie des races." + }, + { + "nom": "Les Chevaliers de la Rose grise", + "description": "Ordre de guerriers impulsifs et honorables servant le roi du Chenara et l'impératrice. Bien que non exclusivement nobles, ils constituent une troupe d'élite dévouée aux valeurs chevaleresques et au passé glorieux, tout en méprisant les activités marchandes." + }, + { + "nom": "La Confrérie des Servants", + "description": "Guilde secrète et neutre qui forme des espions, des assassins et des conseillers politiques de haut niveau. Infiltrés dans toutes les strates du pouvoir sous couvert de domesticité, ses membres sont liés par une loi du silence absolue sous peine de mort." + }, + { + "nom": "L'Ecclésiarchie", + "description": "Institution religieuse officielle dédiée au culte d'Hamalron le Bâtisseur. Exclusivement masculine, elle exerce une influence morale et politique immense sur toutes les classes sociales, tout en luttant pour sa suprématie spirituelle et contre l'usage des arcanes." + }, + { + "nom": "La Fraternité du Poing de fer", + "description": "Organisation criminelle clandestine contrôlant la pègre des grandes cités. Fondée à l'origine comme une force de résistance contre l'arbitraire des puissants, elle mêle idéalisme et banditisme, regroupant humains et non-humains dans un climat de paranoïa constante." + }, + { + "nom": "Les Guildes marchandes", + "description": "Alliance puissante des corporations commerçantes de l'Empire. Motivées par le seul profit et dépourvues d'idéologie fixe, elles utilisent leur immense richesse pour influencer la politique et s'allient opportunistement avec n'importe quel camp selon leurs intérêts financiers." + }, + { + "nom": "La Sororité de Sinistrose", + "description": "Culte féminin de magiciennes (Sœurs-Zélotes) dévouées à la matriarche Astasia. Détentrices du monopole de la magie, elles utilisent la séduction et le magnétisme pour influencer les puissants dans le but secret de restaurer la Gynarchie oubliée." + }, + { + "nom": "Le Triumvirat", + "description": "Corps politique et armé défendant les intérêts des peuples primogènes (cendroves, centuplides et éowins). Ils luttent pour la justice, l'égalité des droits au sein de l'Empire et s'opposent radicalement à l'esclavage dont leurs races ont longtemps souffert." + } +] \ No newline at end of file diff --git a/assets/data/peuples.json b/assets/data/peuples.json new file mode 100644 index 0000000..15727b2 --- /dev/null +++ b/assets/data/peuples.json @@ -0,0 +1,34 @@ +[ + { + "nom": "Hamalroniens", + "description": "Ensemble des peuples humains disséminés partout dans les Cinq Contrées et au-delà [1]. Bien qu'ils possèdent des traits physiques et des coutumes variant selon leur habitat (teint, taille), ils sont reliés par la religion et un système politique basé sur la féodalité [1, 2]." + }, + { + "nom": "Centuplides", + "description": "Sous-race majoritaire des draconides, ce sont des hommes-lézards puissants et massifs (1m90 à 2m30) dotés d'une queue musclée [3, 4]. Ils sont célèbres pour leur extraordinaire pouvoir de régénération et leur capacité à s'acclimater physiquement à de nouveaux environnements en quelques années [5]." + }, + { + "nom": "Éowins", + "description": "Surnommés le « peuple pacificateur », ce sont de petits êtres asexués (1m à 1m30) créés originellement par les Tharnes [6, 7]. Joyeux et hédonistes, ils sont des médiateurs nés et possèdent un don instinctif pour comprendre et réparer les mécanismes complexes [6, 8]." + }, + { + "nom": "Cendroves", + "description": "Humanoïdes élancés aux longues oreilles pointues, ils sont les plus proches des humains par leur structure sociale [9, 10]. Ils se distinguent par une perception du temps fluctuante et la capacité d'entrer en « symbiose avec l’Entremonde », un état d'hyperactivité coordonnée déclenché par la colère ou le danger [9, 11]." + }, + { + "nom": "Krinals", + "description": "Géants (2m à 2m30) à la peau pâle et au sang bleu vivant dans les steppes glacées du Svenhaagen [12]. Chasseurs et guerriers redoutables, ils méprisent les sciences théoriques, valorisent la puissance personnelle et excellent dans le dressage de créatures massives [13-15]." + }, + { + "nom": "Dvärgs", + "description": "Petits humanoïdes difformes et solitaires vivant dans les montagnes [16, 17]. Ils possèdent des pouvoirs magiques liés à la terre, peuvent se fondre dans la roche et consacrent leur existence à sculpter les montagnes qu'ils perçoivent comme une œuvre d'art [17, 18]." + }, + { + "nom": "Gnomes nomades", + "description": "Petits êtres souterrains (50 à 60 cm) fuyant le contact avec les autres peuples par peur maladive [19]. Ils ne mangent pas mais absorbent les effluves magiques, sont d'habiles terrassiers et possèdent le pouvoir de fusionner avec la pierre [19]." + }, + { + "nom": "Tharnes (Drezaxilons)", + "description": "Ancien peuple d'humanoïdes ailés à la beauté divine et aux connaissances magiques immenses [20]. Autrefois maîtres du monde avant l'arrivée des hommes, ils ont disparu suite à une malédiction de stérilité et une guerre contre les centuplides [6, 21, 22]." + } +] \ No newline at end of file diff --git a/assets/fonts/EagleLake-Regular.ttf b/assets/fonts/EagleLake-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..bd726f4a6dee99e58e791e54054c53ad5d7bea21 GIT binary patch literal 76596 zcmeF4cYGGr*6;T`HN6+opA-_(fsjT?C`o7`bO=QtbdV;^qn@K4JsuTQXA=f3xkdo%np^UUnM_TFo+-&$+W%oBtn zgmB@PL5Q9M`VWpD-E)-?0at|>`CZS!L%Y8|@sl5gF!d5bcaf{@XK(6MDunVbwZ=`D znKvhYWB2!ju}X9W z^W-mi#&-VQ3AEw;>(skX*{^RXqZO3Ds4Z)Ov{RvD$2xbuA?z74KYI?@qgVC^zkHs$ z#B1`RAyIKS%%zox@UBSv(L%{NFf)S&dD5eS&xAb`DgD*o5ld}B;sOTIpQK<>cY z{HHVg^1Eh?@Cy#MWae)kkek0b!!LNmh}e8nQy=N;pQg34_SPJeZ;Fb|x3NkXoSWa( zFJFvUv`ESuoEsXP|Ma3oev24ElT&Fxe08#8hgZ<=*(BRNu zdN?8@Hs3a;@8H}_x)?knR;s)CCr@lvOiHjaP1&kjrO(jU7!nNg4C@W0Mq6Wqaj@|l z<0aEj(=l^L^OrUjn`dpEY@fAVZ+p)!(QcJ}cl%WidWQiH+Z{VQ{^<0u(`siI=P#Xa zy1eI_=K5#XGj7>#hukyWKlkwVc+At!^J}kguNS?xdsTb4^PcW~xK;O7OMRSup7Oct z`xoC@zoCAI{0IBL77!HhY(PO^_rQ+=YlEf)ZMP&?o(xukp9{VmGB9Lw$gR*vLi59d z!`^5;F5D~p%?O)_CnGA_ycg*hIU(|9R8-VM(eBa1qhF5R5`8HqDP~N}^D*zmY>lai zZ5{h~?2g!)xZt<}anHpqk1LG35bqhE65lKSFY%wZHMf1CUAuM#?c23~E+ISNr4DW# z{*Y)+{3&T%(v{?bl+2XRQq8H8Q&*?n>)58_ppK7pe5Yesr{0}*bx!QOwDWtNKkvMz z^Ony0I-l%Z*5%{0xU`OGS!sjP#-vS8TbTAt+AC?x(mqX(OYfMTl|CqaO#1Znh3U_v zzmmQz{nPYS=^N8`ryol{mtK{AyQ`_|p>8?du5=&MeR}tW-Jj{vp~t=+Cwr9jxYpy> z4BHIPjNpvejMR+GjDZ;sWlYOhkn!h?mowhZd?>Rvt2^72tZiABd%E@P+;e5mbv?KB zTF~pyy)a-kWBO0;zp(!^1MCNQ4+tF)KcLfq zo&zcd)C^Du+7J9-;Fkl}4*YrGfq|z6Rt#D==$S#U3|clgU~uH%#KGML|1fy_;6sCp z2UiZhF+>^SIK*ejdqX}SvS!GZA^V1$98xyq+K^v|el_%mq1%UL4jVY^p<&a8Eg1Ia z;jY62hDQ!h9Nukszu_Z>Pa6Kn@IMWIF*hf7*9hswq>r-`;bNjtX5`JEC2V9w5dt47 zeUyTi(sRa`mp5a+NSQo0Z-Qt)W7?EF5i@)4#91PI-hw&v@JX_yl%!DFT1)0pAt5-;v`JMp4!g{4{h(x-ddkh;sts$SL6y`e!FnK zt7t3Qh*s1|5^?lCPeNWfCtTPqylz9m#e* zto>1DTjgncSzn=!fvcXvTg=u*ruAKkqWmJU7+Eq3oD=)S*Wz{YxELq0MSJQ=o#?4| zMtsqr5fingej2ar5U<{M#k=9kABkRVnyy$&_Y!X*%c@zc9AiW29P#9Du6Q-IFcCeq ztRu%Jd*w^?xnG(br@|Pm*V_|a+c(rSYv&A_wgdUyEKi4CpV8`hXj+hZ(ev3CxHXhB za;#(Ka`>&#W&r1#XIPe$cHlt$GWLB%DZhJhRuP#%wq?DpNB43bq^)@}o8B$1x^TsM zRnCW;FKY?es{A45YGd%wdMD_GL7&38?(|FALzGD6Xp9&qo>ZPxR9&)er>((_d>MG4&cZQ2x-cDAPUZ+l__ajL5;K|iAjTMs#XbicE5u(J={RvkOlIct#C)=qMOf&c z;ridO$G?b4+HB1e|0TwY_rxEVpT*)$IQas+dLFJE7e~bbnDM39jkTW?U*RK8h+tAL3&--sr^+0$RIC!;iq&F`_)dH;_KLOQ2eD497e9)h z#0IfZY!V-e&0?$AB7PRz#Wpcj>=Qf14pAU>iO-Zr#9>jT#EEJpUR+h$ifc+cab0OI zYLo;~t8@@IltfXdB#E0!vZz;5#4RON+*Ue@J4z>USLrN%Rl10KN}5oWbj-A?qA1-I zozh*=D?Jp0lA#!tOvNN#R?JG4Vx#m_Y?WS0Z^cgOqu48b6-T9?;-F-UkHp7{laix2 zEBzH0Wq>kJaa9H>ZpvWAT^XWyC_}{|@r&ZA3{$+6;flACtF%%^C_c(a#a9_6J`sOc z{FKp(zw(e0po~!hm9a{YGET85dE_kPl@Miu5~@s8!jwr$8)cd}qC_bVE78gfu|j;V z#3(bBSY?*@qj*9*C7u?K;cwf9NmWdCrsTtx~ zY{rS1f#U{SNlo4IhGUqmd#T|VudaKt;aD%SbSVwT_|T>@M&YXqY&dTcA*?v8GR*^A0VJ9Tkh{&~V;~Bf-4SXPW~rMHZfW2(_kh&BCYISpIyD26Hr-qerpyxmdQPp~MXK6Zkxf@{@?A z7O{Zii5$=6cs`P3*}wr&ya=%IwAMbGYUx3M>Q zVj=yLW6FbbGqkoJ<+JREg>$mqZepNzJRhAn{WEYp=68epu_jbtYur=cCg+O}Dazxm>qsvtoIm z^tcxC8l}aGLCBoK97zq$eW0e>l3}!cpv3!o+mY5E)MI(RJrdgS`~KD*RJsQvm?Ive zFH&<-vr;P)&_=Tq3v>AxpSx?N@-&<1quE1u%|fJxkffbKQ1z)(h+H^c&Cjz~2f z5Rd6oMXK>Bk!*ZI^fC1j5yl8H)wo4GX82Ti8;4OYSBz#&KFm-jKG7c*e=@8`c7_;d z{Ilq8@)7e)>qL&}5i!efN(?X$6Z6bdMUXyS_!y(rTGMvnVRRE7HXFrw^GI>X{Fs<$ zTrN`O-c*JBE~1<9XZ42Zu&^=tsrPIrt0zr|L_6a?^)=&hk*psro;L=Ihx9q>RsAR8 zPsSBuyzw~^N#DkqT*Nr~5~{DFt%>RZ<8gJnu2!V#mi#)^n5Ayfom79enJncB8{<+j z#(0vkJufC2o)b=nVIoCerCv9U6ds0pb(eXjy3aUH^)?i%YYeB=d-`I0?|AW%{OEHOyASR zQ~K@VF%x&YjPEk{L)7c~+rl8{PwG<6m(-n{GpRq*05RD#488a<&)7!e+{<~^=1|V# zZ(w-eI-hb*8==i-t@;Z4NL{VEwP`Npe6|4kZ_^UCm13m%39-O@*jf&|o-A!v+MR>9 zm}fJdwq$?lx7Jts*tF+Z+HW(|3$mVuN5x#tR;9gK;bW>7KIScAft){$Ti74E`$BPI z{?f&A{Y;S{+irpnI%x^XAM`5q^jm0rlALM;+_LgZ{Y9Uyo@nl)@UfYGKj$Rxum_EQ zn*JsK8qqi&_L7H<(D*1h*}zN5%_e>}kGXN|Hj=L`q4BnXyV4dK=b`0XOYXLWX>l`` z8|S@oukl)PyAg04p0B_bz5?HZJDPnz+su2ozg}`*!f;gmSwC9+S=vn#4x{TvpU_}K znop2^p}{vun{M#Px~#Z}gFW?@5SCs!Iy+`DxVuB;m6O5D17YbAVGN%{%@hLuN% z2otSExQHNTMY3j#CKkntIPwc?yiFkIOXSW#GWQx%MMu#|bQWDinn)L2iG>-&pe)go zwPkPCzJ1Ba`ms9fF9whi4I)PyB8HL?4Cijc2r*KO5~IaKFlHOun^tt$s_09LJZGL72vt3k*i>!anvpy~p zm&9dJ&Khhyxq{3#Cu`ZmG%=kFUlYu^E`EwXtEm81EJ2Ee zwMq!@kUB}qwEQj}DsqtZ#~taMS* zSbue8?bV%iSB8?wnkX=m^5$RbnQe!yY>zHMC-nN zlDXT=ya{t>&oXrzKX=l?N#<^|r_7!;>0$dG6Q<3buwdro8I%5C*8?GW6DCZWHQ$sm zAx{?0pi16+b7n)`Os%e6W>YzHrd5n7Q!8)ZvxT&tO{E-qPMAG&W}a2FeXr&+hF;_I z=9+rXpEhISBy;bEMtWO2*xM>u*Sn8>pXM44eOrh!W#>&;Fn^Lmc8ha{Y??J?Tf3iQ zy`IzJx+zDyq|cl+#oWK4#r|50j{T=Dm^CGD?t+;!@)pcD4YJl9)Uxg%tJuNXCHuiG zx;3O_u_0P9!w@;Rq1M3-ZD?w!)|7GR+-b9>I1X*upm}J+j0|rUYZ^XfZr;L4rr}zH zw!2UQylM07N3p2*lh)1MGOhjWKW|3fys6r;Ij^A~c~&LoHMBXQ zS)Sd5CJCmA+Ca>c8Y)fFD%nkHDqx<}F#VIXg7#Bdh?&w<%3(?i<=9VcE@PM~H8jnt zp=k|`OtbcETEp~Dn{Ge7xrW2TEkrpyJZ0{rNwa3;&6+rEf@y{}K!+JE3fRqP>Vs*9 zb?RnWOU-Ig$~4Q``B{1L8Q|R6bEZzxPr^E8H*{#W)*;8)Eho#wJ!)xrb6d)pYi(kl zcFBHTi(b!fS!}*m%rIY$eSvlC3mTeQpfzP&pjpR)mJOO0G|bea&0GTDq+y# zup#U9j_X>TA*SlwR>^yQ%LxPxb08e&1$) zmEX0XP}?pc`@iv{-lV;oa%-w=YC8JOfm)`X23LP``rrPj-e@eUjju+%OuN?@4d)xt zSi-ueJ-HpF{7tov?N*C^-e0uo6B29H8o<_cQgG(FcD7!vp|u*dzWJJ_fqFDrr;-sj z{!qSICygiX+iQ1$kKcES4{8asbzD8c5!X1nb$bc*a`#*E$KWoW4|Np(7Xts6X zw{_7?sd|C!j>wf*lT%xNf<EheO$-I`e|M{`Bf3^CzW$=0z zG#kF9a{q!)@VEH~JzinEpk9;bBpcW+YsaA$x+^C51K^j zi;6XGBz@7p=Z#Jx314vEkFR<{T?eF(Xuy5fh59Yq4)rH_RvXbBwS*(-xqheh#+vF+ z*s&2!$nA#IN0X*Zn%zmi-fVvt7zt0ZSbufmcWR>)_JOS2tUqzA+y0H8mR^%qWy{z+ zeb6i)yPr0Qn}DtPI%k%sZ>VoE8*ixZ^6859 zdzJc``U&`oczFaSYBjJA*~VwYtxD!OUp@3-7N`}J`t3X!)gn1djdR4&eZ55XHnzfs zmSn`ash;JmjLI!yPjk=Z5nQcOzX5DbSA5kU)%WT7H)!T7q0Ehsz1o9Ev`Efc~+=v)%D0-OF!jxvI+WyrjUA#t1Hmb zYOSRj{8t?<)iHlH__XT{-mIzP)&smxA$7G(r0J3ky)4sYUgx*;vy#c@u!1d&cC-3R zQ_0^P+^^;PFRH86UFtHx)_jFCi`BQ)ckrigs~h>Wo8O!0_s_Idz>$o(Yt$bYnV)~;5&xOSAJnsd z?1dUjTc3_Me)>PTSFil%(pBD_{Lg>XP0aJ}tQM{u2Ar3k{vr_Vy~79{U^26j~{5og+z<}>H%S| z?iVJ_%B|}}SLO#>AOg$xms|YEi26VC^RL;g*8S%_xj(DZ;)zQ5H6f0C=3-{)v#RF!xhnf*85{@P>{E!JK4U;9U&?wf;uRH*5^mMdTQ z@5Hnw5!wM7TdN)*zuC}uUU~xSOfqkm$>&PQ*NPg}x7^hsH)~?7wu-H3^w{J+b?8Or z@A6K?CGKDO@)XDw$sueCPkh>OE`gPV3r}&n@QJipk()0}-gy%@pMi}O6ssZva07Edee#q&I)h!%@^&XCCaP|3X6wTfp6 znPM$Z5Bl;%BS#q^w(vgIXt9mw12e<{o&n6_nU2D@FUIn`N8zc|KmQ5jvVp!B>4}La zRPj8;l5d4Xup*Zu5{)W>_dwLg4|Kyvayiu%; zUcOPn3Br+~g=5H!nshw?MR}=d6^YV{=8WJ;z23M)YglRoJYCYXq&ZV>u>qq zn%wNQ*$t*;IR?2oG;A^hX&k*Hb8X$E?KkQ|Xmc-TU(Ua@0J&K$LF&j;+ghV(X%RxR zibkDzVI9`ZSF@2wO@lg~3Cfx=noLEjsnbTF$2ud>N*gvKa~6p%qS(w>O*EsEa3*E`hhk z?N)HRI~Lu8&6nr38CZ5En?G#t3FmsTNzV6SKKimr=J&(4a@ZvQ2f~p-Y+*dj9n7eP zu!ZwfcPL{T#@2?XyTch%E?X2nVFY86{vr^6v7DLtkS&BKvme38kJ&7|W%&sV{5xBi z_>|3y=f0m&cLkd_PiQ|!!b&!UC#YYc+ppOic#`@JbDGcQ#uL@=nSr%zKD?p&BO}_t z+o^$KGg~lEQn%CM4!l*k=B*s@R{J<}kj)XFb(pq}uzB&^^%(Nyvt&I_lZ%;=5^;ty zXYp%pJbkXE4>x!UsS`KF9m?DlyvfhAP(_${H`OG}cs=Zs=d{=(@1oiZJ3OGPaNrrO zhj8Qxt+#OI39T>w%})sst~{R&6>dD4jSwF4xvcP#PiBQT9y6BmaY|d!if6MOgbz<< z6NRtlL;d9QSP{Sz*-Q~A-+C26@;R)qX#O-9e>zA6^AvU{Z+s3@az!XlVMp<1=V<(F zYy9jOevjqbWZ^u8oho>5Rhcg2d#f`P&E!inHj!OMe}1-~BrO7PRcvx3J3 zZ4GSWyWYFNd%gDy!Q(u9-8Z{G;}*mBZPJ{dc7ED%I-8CClQ#M0{bn1t824w4<<3uQ z*rp%Jy9i$+xefMdeapY`y@OD^n0$wz8*dBr*WL<{PuS)2^*OvHEuX9Zl_&a3wCCvZ zsl9wtR=zVUpX-0X=v~;Hge%d`jr~w^r(s0@;jBG!$u&L$he5e;QYNXj%49GFOa;@_ ztIBk)EfZlx`PSU831=U{z76|G?iWW9Q)9R<7YpK9Ww+&gJFX{iEm8eWB(eTVR@aCW z?oD*$a|YKkk=TpYdsDt2QF|a5Oz(zJXQ;ZB-tD1x_4KYlyiB>})cFYcpHlxb&aI@4 zufW%o`G$QyZLFir4`4m`5p1B|Phcb11UA#g4&?6y1z;E0L*0Ym5IBt7Bgj9-@dL$63(3lXTVw7JO|E$O8Rk)bJsx)s0H$wkGzX~ljC~89WHSjaF0mb1;2uO zKvk<1pM@Ke82{6PQ+ zR1Ygbzyg9n2nYpX>JLh55Dp?h8_Gt4SY#!uHal8Cg@4~IqGGl zKNtW8fni`c$OWU-a%Bt{OMk|JJTM+i029F^bq|)d2TR+7rR~Ae3b3?-|0|Yu=l@&U z|AUrhgU>1xebq1UEoI_k^$U1b2G7crJ{-&Qy@ZQ8Q@DW;b%%&n*NZq9+m+JYS-tHF0*4fr0cMaDYn{{Ys5AHf#RZv{Vt zZD2dtjf}nQ_ksN!9{|5_e3bohP)`4<*jIzA>JG(5U9ZHjk7Fe9pe<;pUQybE1keE_ zaxPgt1j`S>@NRB~7zJkXc@}+WhcCZ_FTaB? zzl|@i!h{Z3E-c7el` zt5k2}d+y+S?%;dw;Ct@idv4=<>hL{v_?|j^PaVFe4&PIU@2SJ*+`;GE!ROq;=iI^P z+`;GE!RM6Xb4u|!rTCmud`<~Ir-WQEgt>^qTSv2xp(n8*Q7t5T)eyZd5WT7d-cWSn zZoo%eTfzPd%6Vat}+)oysI7qEqCyj(h{lk@q4U$#NaZas6RdIm{}DS>-UR9A=f1@p|!=p%?EN zdXf8jF^jxwh|GOl+t2X<@C(O>>CX}Rb(GJ?K_R+31&Tm1I7|P|f%Bje9aK@K8e9d~ z6!~zpB1Ak{aJ-@edSC#o7Ria@neDCQ!<`g6U=KV+vf>52fuBg{O~rI_;dCWXq$)wc z0)jyZ2nAuHhte8^g9y+@3?ow>rbLkyM}rvRYaAXv9<&AR)Ju4SOL&7zc!NuLgL1sV zDZIfcyum5F!704KDZD`i-k<_+P=Pn7P`ZlhmBe2AgU=$clE|}WYv6eeJgXNt`45p!1Ee-UIWi-;CT%kuZ82aaJ-fbu8s_@jtoxneFuEs0pEAP z_cHii2H(rzdl`H$gYRYV{Rn(N0^g6o_akI*$H?H0F_X2-WGypU%S_fXleNrL*gy4{ zqshp|fU)?UaUc(j2NS?VFiAa!=RAk!Jcs8zhv&S8=e)+6GLd_r$!IeLKi?5wn#G#1 zH}Cxp$8&tj=OfaGi`k558zb7rh_=!5v-JEdJwHp&&(iY}dS0S*W_{QNq=9tM6FJY} zxyo31)UoQQW8N<@@0EBi-YMZY7PR9$mMl6DZ4%YB4K}ck9v#4EU!YeT@Y@wcs>?*G z>qM#=?4g`URnDrT0(-cOJrrUOB}A)p*h7&R!L^quyBygcA^Q_#e~O&XxVC~ipL6{S z`t>D{_OgMpKY@*46WGl49mw4Y3cxO~n{xZX0dN>ON04`vk_tg3ER4aZC%2)E-9^u zd_KSz_^E4|m9@;u+J9na2biq`%+>*B>j1O0f!W$Xe5oM5RN!68h|t%G(ASC3*NM>A ziO@CJTR9QBoCsY`gvJ|y;UE``rrsDZmX*RdkO#(t31A|agf&bCQ@~U(O)bLSij;?` zI|JR$CNrDFinfgGY!Vi-S%ksTaL@)st3MOZuCNxZC2oZfvxT6X4aUstTAg@U)Bg zC!S&_o?<7SVkdE?m^f2RoGB*G6ccBPnfcAEHEW42MZ}h3tY9-%u$i@IEo;wOVoWjd zB?N2O%=)tyi`dK>w3an!Eo;tN)||DhIcv%ECSeJiv4qW7!e-W-wX8X7S##F1=B#C{ zS<70pmbGRrYt35LnzgJoYgud7vev9+tyzm@{LH$smUUw->&9AQMF_DXgjw9o+OL*4 zQAC_5B2E+$C(4KuWyFax;zSv7q8RV86YsJU@3Ir`vJ>yJlQ?mTIB|+Naf&!`iWpE# z3@9cB6yx_R@cR|`{R;ed5&pZFNFT|HISMT~W~&flZt+^K^*m+`-s@xPbhNIe{>ha+`xqz;bM!I3&R zQU^b7!jGHq<0ky5hadIuqaIFdhZEc3#CAAw8Q*&u-+LL~dl}z*8Q**P0UoRnP86b@ zYP3_0cB;`%HQK2r>yg=IBrJ}?W5(beVnG6*6IoFtQ6gDAinltBr`nCDs>4&&HAO7) zS-ep#S|B&#`e%Gz0Y2wka|T+iMW~ip=wZqnp?q^TdJQdILrd4t(lxYHjh3p>QuTe= zDDPCEu^KdX4UJtxW7p8wH8ge&ja^4$*U{K@G**MgYS35>8e5OX)}yiYXsjBIRim+L zG**qqs?k_A8as{`IgS@Oju$zO7uk)*cH>3r@FI0GOZ}%2Y8qvxgNL!v8I0W-?QKGH zr_fvxnmdAaxJOAG^iwy{n@#j)6Rj4}Y7wm#(P|N`9-&ovCo=>Y8R+N>_FsZ^9RC2; zgCD_e&g};Wz)^460?f%NPCG}MR=vX zSilJ^;5gn%-Z49l6&%M)9p|oDA)ab4ajXcdI6)jMVr<8;j6;m?FylK(94lmu=dq46 zc(a{&vz>Ue0!C1PwHzd_ox);v;MEH7YCDN-JMe5Lh;Q47Z##)^n~85*h{{pKw@X;m zY2w={;#(2kuK?>hPK+zU3!Xra=drR&SlJn@>@*rWhK7#e5%=N|_j1>*5U;owJ|4m| z?!+_h#53;1Gw#GQ?!+_h#53+hqXlTR0F4%)(E?)RDPrU)V&o}e&e{eESFN0`jfTJ+!x%<9%G;&*uZ+Am&6tbH~}A zV1E+Gx7SXAB2WxUICmPH0cRP*IdC3SQKuSQ1=qNC9n^qYa0A`cftwuHgInM>xC8Ej zU%@?~s(bM{Ct%PC7<3#49fv{3VbF0HbR6$1@8}(eMaN;$am5Lr;S5}WD{!N}JMaLW z$nXN*pcS_31AKuW_548q2xQG31S}vJgn&>Grk=#^Ph$5cvHO$Q{dw&EJZw7y+sDu9LNLX z!2~c7Oj5TH|F;nTw-Eog5dSa1{!6g`H0(c3B-u$MDc~uGD_Pr6?iCE<9f@4_pK13E z!=SJAM8+LAlo!en%0j#Wsm2zEt1y+{AO4h`nFLw_5vFga-`~b=feA@mNS*yTm@EuqK zz6aLza4F0yg?XhguN3B0z`P2WR{`@XVBSTTcLnBMfq7S8-W8a41?CmOyds!a1oMhu zT?wqKhILn9TM29{fo*c-Qv=%yU|I<*D}iMtu&fN0mBF$ySXKth_^T=43^+@F&w=yc z8lSI&8c+*vFy=aNljC}D3)}|sec-#`S8xxgWP!ZH4zn)6tTLEY2D8dwRvFAHgH@%l zsuWh0!m1mv>ISU30jqAnsuEaL0;@`3)dg5}0ajgrNgH9(Mwqk_ChdkvyJ6C9n6w)v z?S@IaVbXS(v>hgGhe_LEQUOdVfITI!ryBND!=7r`^V>D`71&b>drDzXDeNhQJ*BXx z0`^qEo(kAg!M(;R?lo4yqKmNTA}qQHi!Q>VE3oJaEV=@VF2bUVu;?PpIRv7rWn!-Pd6EH87?c#$3_jQ*ndUUu>}Yiw#y^u33FF zmKQ^g9Sh>Ho_N+HR_nir^_LT$Dq%o53^)e^N?|}{!#b;$_*4lK3SmMaOpy6oAxtPnE={O5#%`tSX09<*=$8R-J=Y=U~-2Sal9oor6{9U{xio zs)SXQu&NSP)xxS;;!`E@sgn3q+`zCx7*+_w3Sn3w@u`sbR7iX(BtFS}yAXyI!mvUZ zRtUoiVOS*$tAt^dFsu@0orYPbVb*DwbsArRV>ooD{Eb-|q@#!oq zD}rT3u&e}@mB6wRSXKhdN?=(DEGvR#MX;<0mK8Oz>|s373@{Vfv#^E9JbCpaM%5E> zPLmlHll>iqJu>I7g*o*wr;7M-8Rpc%oEtFbCd`q!={1qX=boJJ1N!o9mmJOy;M^d} ze8};~ocp`BI=ZZ_2^yL3EoD}L)!;j@27C|JQg$73e*o*jk6;UO_@)*XUW(t67oPYa7AvpLGlS2Od~%)HF^>zUztX1Jaiu4jfXGsBl# zdyE4DN#_V2WcCRtJ*O=XFtTk`2*1W-5^9F0p z8%kI5?rxwL=neX)xA3R8nB`h#xt3Y3WoBJsuLZUl^e{;6=p@= zKay)udB4AonYqc#R5LS`%uGGAaR)zkli8@pmsy`&_u;s&_SEAR{_GaBatl9Jj~~0m zeWV)vSUo=MCbM)K-&M~{-NJWO;=AgZt@@_b+d5?b0M>&a!SA13-(p6ZpD!Gy?h)iP zuI$PggM0$r@|l8-cAuvnPS(Roxu&gQW@?xj`JCV;Gjo%fxyj7jWM(RvnM!7+9`4m^ zE3ssH?-e1T8&eDuA|H;%AC^f^UAnVs>P1a*^|Yz;B6_qEv2@X_Fjj{ZoJI^!+zaF z9dChf)7+4L9_rc;l*i1DxbBq{xjTp#%0`|keaO!_ZnNQgNo$H?>>kHcZ60Ai2SKu4) zEizVt)!;j@27C|J(&jqa`vI&6KZ4E3--67o;AgN6YzI3yzY`RIU0^qD>_PTkf)a2VoB>swuLf7aH9lVle4mqyuYwp=L8ezh zrdL6xS3#y%L8ezhrdL6xS3#y%fj8Mjtf?Sts~~HuAiiA3mak*W*STY5&mAj!>~t$J zq5?0n2QRV*FS18zr~aa}2MM49NL2UXMRsA!yRhY5*zzuHc^6(}4_;&sUStnmWDoXQ zjlEW5uhrOVHQr+%-eVu$V;{C#jqO%ryVcn4F>Lo3wtI{iag7*pjTli)jHo6?R1+hr zi4oPrh-z&68n%56+rEZv%V(y0@I3qeue{-K6>s$a-=+C~?OmEPTE-E^+gGje3E}J` z*tcQNoi}p*UHC0|M{*~*{!aYYNpk(e_^>ssbble&-;FOTAtuWEvKxqtKM@zV5f@Jo z7xxkuOYw2r@Nt{)aa-|m8;OxScmiZ1MjpV|ZO7Mb#n)}a*KNnwmEi061K)h}ZYXb8 z3{zKbCCJLlgPQ0rLL?eEl|j{Z{^7QwS^8Xsk;c%@10We4A`n9}65dd>)d56M_cPRWC-Xac%Iqtke5zgDgX5OQ4 z(bfZhr<|5ya$f%517Fbgm*88@uL7&VcVG?p9;~Gg>&Tq=hAgbO3M;O1N6dwHCtP@U z!i9GyTzGdP;DKv|9rR@_Zra(4OzWEAELp=@m{7~R6X6Zn>RDKDmS@3kSoT@6 zgR^7@XR*KoSkNW1(@SKhmzuKC7_P;UyT=2b<6#Xqu!b90!wsx~zm3beWS(-SfK<>C zbON0@-vy+BbkLnQiF<$ykO_M7HgOK`2KNU8z#!0atuTzw!$B_KxeFFii$&D(&Vm>3 zEO_zGf*tyAMY&q@y>!D?=1N7&O$ivEbv!r!Bj8}Oa~A19D4?si43{!7=uL= zVG$>>h)R6yRji^2|9TDoT8w{{&oWNpTd(0inSJhRYH!exv0{$2gQae9!-|;A_9lewKX)yZv@A z*^RXGx7}^~s_jDCFqo$u_aV8IAmGLd(WMc=T zo8gS%Bg0g~NJF+E&Co$#r>~<|Hu_Tietm&?zkaKJxqcYuv-N=*=&^g0%j>4^oo1LW zIDBvNu-k7qWA~EbBl>%r{!W&?bMU1X&D%oyqHXj=+q9m1PjA@hhqgIxHGMB-IBrGW zevT$=_YMX5)* z4bV2N1#3I#Rol?5)b2};TN_5T5Dm*sYPoS+gtp~|o*Tz0H7|8<)qcYa$Wg~>n}>;w znUHhQymeq!*q9eNGas40=Nk>dtO4aWqU_idR)YbY3u5!&$$b~zXzR+G`R(|7eWQ6x ze;ivs{+jMIz7z5=oBW&0kMKAC@?qg$P^d&>vMhi ztKssyV|TUhj;ZpyV|?3!?~W-xe51ybm8BQils6d)t196~mc{>m!2Lr9p82`+{n+;S zjOpCrS%BYJ2wr7f#$Tfl@AC%22SCTsOpbUvmU@-KNvn5V1mj!Mh;rHN`*Yu8G?M2a z_YtrJ8B4jp@i*kX4ji=irAQ0Sl175G*0Ld>u(|bDv}x=ig!f zE_(+?dX*WxgoH1c#Z5>!jfCCIKL0d-us?Niw+ z2kga(b&9+CJ#soy;v5!gf}d{4JAf8`77x?o1#o5|ScKfgUNIr*X!rGwEAZ*)_$f||wnB0FlIq_)(?L3(`uTtx8^zJou^E!6^Hgc9x_8s=`vVR{YeE^I|sYgmZ zrK%_)t-YRa=IN2+fb}@B4`%kdpv5%gjYd~wUDP^2tpl`um{A^PlqIxX(lAO-+AgH+ z(@5RQD9sI{JkT)81GMi!`||sbdU`AEGZ>ref~02KJVp!0XrY7_N@$^+7RqU%4C&{Q zegWxwkbH)IA4BpP`hJWNIZ=Wv6-ig=uN?n1bgAdvYzLU{MCR?zTPndErSaXpQGCm9 zG~e2r&N-ei(B3B6+k}-lX;$_c{d$x0Z*l#7H1`4Ef6U+;S5}*mjNOYqYUyn)wXab7 z3cb8Z4{K<kVqx&_n6fE>OFY+LH5)JiNqMFCj(puo6k-NUCJ4 zl}M{(td&Ttgey+Glj)8$$(_;MyInxL3ju%kLSt4T?Of)nwCta0=L+pyK~@>EZX)Xn zvTh>l3S+y#*e*29$Xa??L+#VlE~fTwYL`=6`kC{zah@5eqL)?l@-n@wqLU&E>;7B~MJw(3+>NnjQ+tm3DJ^`8zpg;Sr_}xwD|F3SeOQg; z;A(WTx`j?|U_D3ZPXR5}qZ`;xxwk0)KKDXC08ZHc4O;kx7V2n$xuRdP&)LjFfBG?+ zd0T+a7J?;6S&GMe9d=5uewzN3P+P{Auc^&nduL?bkeE$w(4QHV9)3DC$SKc)Kcm;q<)E1={L_H^$t>RHuPyPQV${ZB2u>_bvshe zHb}jKRCLPq_toV{U5<9G5l-q+M$L0blalJ`-##Q=MoI-zWDazhTGmJ>BZM5`Df&`M z&4ctsdZ4O?zPyWs_mEJGgk24NS&5XD%)nKwQbuw)14rrCX-2ySy?HkDZ5OQ^p>OhD zJMWCs!WLSPezhFww;Abmq}L+-AhoYi`Vyrt;Xm~F8~NR62fo=MbtL_Nd*+I}-PD#D z#Zhd{77rPLy{*CC)-bxC=+{s5YZLv#uMq8C<=fPM!-Kr0#iKQNNFVIb7CT&v9j?I+ z*J6ij@RFVIlAVYW4p@kjQbIq8q)HL}yoJ|#3+eSpucwcv>Emh5retK5na&zYucKe* zHJ!=POh=asu*8MnRYv|6pWj!%rRKMdZD{duFSSlv+rWl?+Xmljm%Tyn?$npjNcN^b z@%-xrwWQd&BuwbVSzwv1sDEp4Ku&9tCYubf0=$ha@sQ`XRmA>s))A<7MpMVgD|BGZNM@f>6m7|dU zPkIGuhu|X0qEkl37C~vSqA4-ZamD!Q06a z8|d#5N=b%EOV}r#VOAS+U6~QA70#TI))j!4*Su7qSZQH@rr#b20T zX)`Ca@mcF%puW}G-@{(zRmq8JO2}2Iv~=lf4)nU<@lW**eg zml|5Cp~e-s?WBH#Jh|RFtCehAxjaM7Ms7J$g8$8mIrT(0-dt&gc6}HH@8Qr^6}g98 z7w=`xE12tQtm87e^5QCQm1?VCKaN8wm91Iob!PiAYa0)A1(vIo%Qhrr0+mZHg{e6)4!$McagH|$SYmgK~wz;;8rghXcKJ~TSqw|ijYgdk+<8!2oylz1t*^8EOWLm~$91<2JNSDf zas;6vAtsYK&DhvoPY*9fVP*@D2v0L4Ck5&lq0Y=Xx}T7y*WHfDdw5>QR&ntOL1ClD zjqDZe*QTvkt3X$CctTX7tGj(@qJyJH``-O?0;77TSQ2wawzj1Ex6TSkkI!h|S~oj6 zwUth9GNz5m$?Q9#lTS>ryNh3#r;CR^w2hs;!O1qfP2V0VZCWXcS8TV)y zDg2ob#cb%jFy6*i@9Y=eDk#7w(P%K6jRu|K7ai(r=WU-f$#i!3q8S4MGW`2~H7+vF zX}RLGW4_5RxRr;atGjEPJFm<<`typX2iWvj^6KLB*Ou7GJ4f#;D-Gj$n?tHK1S<$m zGbR|u8~obD$3;5*>TM2&vnjtrGJjIzn4?y zpF8``{WL3rerK2+?<9ndtm}7IZ)@0!N{`_ z$@I@lm)LJk>*&C?5qj**WHjm(#lb!L}^m;|-8xhkdenh{{Zmz!G zy^}7djJAX;hdOn4bvK$)ySomVzi7##d4pZN-JCrQUa1LTe*O+a|M=#6Z$Fvq>>1)| zy!T3QdfPyqlS8|7Gy&?-*~rjZsmCe<=N66G`S$BByK>Enr^y9T>**vf;$)_q$Keqvy2o#C(l6=+Tw z*NOjUJ9W;aVO@d@rtGJ_m}qo(B5qVxOho4BMBTl|L*Tj5))YHDGg_JA1C2I@1uurB$d4nVAMa~21V+U;2KDdk z6CdtxoKpUjizPI&UFYzWhsO*E$a(AbVWW3+kG7HBlA_)IxLa2eni?DGoVR0w$&%3X zBb{!}-jPN-{j^{1d75mEi;Hvfj>^BbJXPIp8flb&Qz?@BWBmVA%rEoS=w;>9whl>l z!u1B~656NXdgFAhO?Em-AYUC*Md>D={J_%sh^%?9&-3G;_Ov;Ii>ee^7 z)12WQK78!n&3iZQ{aXH0`cnQIm^7u&7w%DEK6giTm^>;c#gZ~=VcLK<=4Yio^yuGp zwy|9Y#wJbf-!{5ywx#o&VIA-y{54* zCe_mrlT3I`sk%0zoQ-;eq5GO5b#dw+ zADcC}UAGyFdWCn3_iLR#X!N+4w&Ncf9O4w$F4{-&aJBf2?&;y3J|fOHAvVmx*RSjJ zMSX+1hD7I0c{s^8$v3=%tGk19u%BzkaZfz+WJ1p3c3z?04wmkdvz&umqhi8yBYsp2 zgU0E|acA7Xit7CgFpCC7r(bn11 z&(+D(tz)EbWPr2L-o@T$NWzGPy#h@(p`BxW4JNa*$;NCK*R@}pjH&$+El!qDm-y6f zA<46bCmHlUfxa1SobBvUsK~k3%aCEd%1THWtsc=N)f8vI*4*5ZlERXm%qYub$Vlwz zgVv+y-~e~mVb85ObFcR8<@Zk9tE>F^9mYR^{~OLt&-ciL zXe~V^nT~6)=3FtSgv5rUWY=IWU_qg}VRu*`cH>ft!_GG$cmc}TW251;&8x$O<4Z-$T zFNPCl9gc3IPjHadsir>5-l=DGHuR1xpfyrjgh!i*KHUrF( zCa!#GM(^;u&&Ty}3L4Zqp-rEMUsygWeVn&%M(4Z zsr>(KI>WpCO%F|%S`?O{m)sNUH%Sj~GJB9ir|I;%?8SeW(AqD+fjFsG^m>DC(~|tQ zDXk19gMkxKAwHctb~xN+Xp&DrVxO4k2~i8)+xf>~;}%%LUB13ov**>ea|2wR%nn*k zoUC3qwl>A{WYyZPmaa=ZF%i^{N$vJ+=b8I{qd^SDPlbs3!C<=__=64;|x-_`-GJ#8~)z5KVui8-&%?*7=~ z5vxC5+;;M+jP8H!K5_lwzQbZ1bOuw0@wxph*=dmzXD$50qbcc+3~k>gYizP_T!^dA zCowi4AUeUj+f(z#_m0x(B8NONAn*L5+z;MaHW(l6jxPKBT5k+CcY1?Pi@Lui%UThs3AJr>w_M@pGU4x>tI&XQU-S|-h zgJQcx`a6aV?Ayg9Vcf)7J%(@2O-f5zWXQ?>>(ftX>bfpiF(rB2piKXaM+U|k>^+0y zgIje-h>x_`dPcd2#09yUb$&si3p2XT&C5v&u(65g)#aDvq?y=&&R}Co=${hcX2dr5 zr?*Flaoj($33}VDiqI zF*Y}WBv#RNZyz-|Vc3#+!~Fx=_}J-mq+&Ud&0CS(weir8-ix}_p zA6@jy%TG=X_4M`X7<_ktt8T_C2bYfWwYQV3nEGq2VUNL&_qH1SU-SHVvEU56Z@o$I zPL%n%9Hlmop)&Bx<3PP(y-!q<|A==!$e-zv+^JK1Kv26*scjv+4E7GKTs!t29QF3{ zp)Y(nJbL_?fxhnE4*Eg$pQ&TUJ{1w?H+snnuZ~&be(cY`` zf`?M|w$8p`J|6LH&?`ePgF3+QlM`CW*&<=TvhsS4ocl%~?Xq%LAPrv$hujeioyg$2>VzhPhy?xBT zU1sE%H>aj}#$>e{`d_oUGMC=>JPgmn${v!HMl=7ciJ6?AMhlc?8qwfc0SJ`FlIJj*g3ukB)G5^>k|=FyxJn865}p4(isa zy-Q4%Z(u9$cBz>$BVW$w^ytI6h8*t^^Pl_clL_sgdHLl(jrR=-4a|-R>}?4TZ}rgQ zOW%CsuXDoMM7Pe3u`}y*48vgO;A9h%?$OHG+0)Tv(i670XTlRZ!zoj1{-RSq{&J4y zU$iN)-UW$hnR;4Xj$AIv6t#7Wls$r_l9OI(;a(}@os?vFF(_}=BXMp2+NbYJv%05G z{9~6Fqf$bg{ugua0Ul?0rVHz<(`Pij_ul)AMl+gGFQeYOWXZBD*_I{uj=OOKV~oL= zW(Xk;#Q{P{0xTs7C(Dv7OGrYpDQpUx8gc7)bV9=lZYfj~%Qj zn)%-6ectD}pLT!F+Toe`h%BCKu;q5IN@u5cRyH3`Cxf96zg55PP&PhV>)@%Jx`tP` z8X{I1UX@$DyV6nVkcv!UYixgQt^#Y;xA%1D^>$zHu8z(V+h#mHs#K;*pPp#TRm60B zrGyvgTCA?wF+Xav2U^tT*LI)LvD^A#9WMCOjf&$H=H!k`Z^cFBl zwX0`a-Xb;y_5GKR_JS4GyK;#aT z3UVgWGrutJ(v!xDbW9+1D%^bo!vSr5mD}d=teKt4`HF`|gN0?3+v$ejOa{sFIXxl+B6XB}dIp@~!m3n$hkiz1(Th$#?{%O@~ZEgWsg8 z(CKTMyGK?h8rReqgq8}ot}^E4+QK3UN2p0On(B9~?o8;cO&k7FeN%o1FI%;2@RA z0b(?c9ASW<{IY;X9rijza*eXe4tcWf;mL@j+Q_p7D-5}F{e>U)uqeLODvOvZdh%^y zz1pmnS84LIhx>wDsYWDGd%F1?0GcdbqIJlp_ld+;ztVI|>e#=Gn$l4>{-D$;t6Cgy zlq>5LiPLrI?j^_h%o!T^35j~l{{66M+$!QE&bpnyhQm;(u z^l_O=X1o8*f89v3aRU48eT9ENO7Pho_nqDeno+y_BxR(&4J_4dARi%B++!&i8#|Im z76N+%WVu$LsR0sU7-M%3kVOhxgtRn^P$(!PZ}j-%UwXdN>9P)Z{GRDbtjt=ck4;aE z1=|mfhjGdva8%?&5{sy2swp5eU%k?E%YZM?yHu-=s{1!oDcy~$l8$JDG&?1y*oQ131ut+p$)F}R~Q#Xd zZWkEX`06iV#3M(4`Qn-BD8UwK>>7?z)>tVv2o)BUh(i>}RvPd1v z&(e+5OHergwtEPBol@EYSwJ{v=-`nGh|h&&k^x{Jkv2Y7|JvT5F|AVAMIX)`>WRi1 zt3HqMUz!=Z`|scT&9=I6y+!Vu>PZYd{QjAm*@$<`7drS-st(7GLHe7+rbfR|C|o}H z^Ox_QOWw($X^wpS^jDYe`t$R%0^%<@u>fSZarrIOd&+pAQtFez@CtzcSt6n=rbOW> z5^5J9IIv!fCxS!~X+wIWL^)EDlBh_&P!qb)zw6!4Z4hR6rJKI+<)?3-vJKt0AsO*yy~${nQ~>d#Zs#=YF%qK@2i$N4N`za zI6)G6y@c!UcVOj?Hiz%91$l@?$?mz_@T0eH z?e%Z^drW+(Fa8$0@|S~82QBd zR~|dPX`s@;5sKMzhtlf?q0lm`K*Z-54GMSrrn67Ye6g_n*-n*G-Z8x}H)_Ki)8j6oIo+k19wO#6U+;xDB=d& z7>!DqtSGXJsM1k-iT<9c#euVl#IQ~8hlnPhftnj!2t{I8mEYcJkFH)bSD|p~#ZZKTf(Vh`ld0afYe%|Uiiva% zg`*q2W4^+hL$Bi`Zfznuj6vD%!gpTefzA+wt1e=MgodUfqTKS(t1|*VM7L1Y!>@k8 zV{?T(+*J#i9OiZPo+sY?r~mQD#&WA($g!k6N{S~D$XiVlN1j@OOJcFGKT1?0R`E53 zTHazDJ@EMrbUDaZz5EK%2=Wb=EG`2fZjzY{Y8*HYRSxE45sm51AQ5NU1$7D>{qJK7 zhL}7tY}NbAC5Nvs;u9~@d3W{8h5snr|30&1$bWvYe36`^V5$l2cgdBN%oLneaO|>D z*qeo1cLLct*xi*(1v!V4sN^SUI=#E&*tRu(X?<%xB9_U_y5VX*Me%v{6HCeFsjOKD zvcyPJrKX}kZ6<<4qf-^Boz(mPUU+rYrd;#cyDoG`8$1$Lx!M}gsrBj_yF}0BbJ$v~ zEYLB#v^BQKD*sxfx+&P)X2Fq?QPtpj58a;3e791j)LA5zO`YvcaZ^^M zkUDv>(ZQjx!mkcYPL7ZCIV6-Ne(>DGm!BH&e~1;gEaSYsWn#TcVePg>R?o~O6)vL$ z_6&;+T8)8n$=T{=iJao;Yga97T{jE}s9fYUiBrwJ0|V_jg&ua@5O*pGs{8Q9vEB}k zB;rV)I(=le3LOU%6#mr7uzD|OGh0|I?k$PgqP87E_^c86@aP5d=Q*Sbpx& zRNdvqem|GONM-Ei>oTX@#p}9I^J?J_g?oO(;|SPH=4E>M9rh)<4JIr~*Tq;?C+u6X zuE+pU*kbUS%&~xLFYPpiuqcs)?L`}`%%aCgaX}rF239d;!@lGl9vX1DeF`=Skv2~t z;YK$vuI*0H@8N7H*ay~c-d3Ts3CsCCMz&33Z1q;J8|$>|R8FPP=5pEf98$wG2Xk&V zpUaa7Yx<{0JCwfln>MZK(`jsmp$Z-wol6d14CP)SMX5}7sW$kar>#Oy)5*c5>cnF3 z;OE~tTz&TbM?d>;>#wa1T9a-c70%4+YkdEBN0pZV%@kEA*;UcB$p6)T z!{k`sUVedo0Z{!?$%eCpEQC-&AOP^-1eZihKt&(QuE@xsSCKr+CE{4D7-8Lj=s~iO zEs(@x=r@@pLeYfNF9<~>RQ6YD(l}cv<8vhCNw28J;_}CrLWiFG!BIH*U?PNuki{}o z5gu%>(PRS-C~33R^3HlT&0}+TmJMf~oNnx>dwc}F6~kmkmrUv5d3yTC<5ucdEEQi^ z&g_9yT5VY7SFWD6n83=nowiJ#8HrJ zp9f3h8?aa~E7X|vT~WD9f{didvvk|zYiiqTpIP%2jK6wxhs~|B1Rw>-w&em^ggUn@ zzsaHj_p4D|=7t(4iuE9we=U6gHZcH3bM)dr{Pg{`7yk0x>e2hY{rfgHL>9x$8M{;?N47`2WK_4{5UmDy$QLxVy?WDMU_a9a^DbuAQ;JVGVqs4E3aTO zB6S^3kr>6|(zW~3aI2nPS9)pve0<>Y(Vo=Qf!pq^H4NUhA!DoVpPrBD(|TtKjBPPD zr5y-5+0N%)f&rvezhn!kmuQmBV|#~BOf;Q2wtXmp%Vd2!?is9_ZcAFlIR2Mf26Ztq zyqf3!8DyAXVkcA?L7{QUn=t88z>7|dzLuO}5W^=(w{p$Nu2nC0jP$k-JBFs_673iB z&FAm`%wT5Uv9q05Klt1QB>1&o_}BgV{ zi`*p(jg3!6bl~-j?k>yN&U?n14@@STx7?Y}BtN#7_TpYn{gS{)`Vx=L;;>x($5%zy zub&T%-MP8f(5L~w%V)9ewP8I^<G8sV;6Y1|43P$nR0_ zFqvcp>@Qmy|?ta3EW&e)1;@Pz2g(Ms$El6ruIWqcfGkMMAHLD zKl{WZxln&yfO?v3@&r{*~)ro=4N`ahXNe^VoaTZ&o-?47%&wlj7 z4SGLc%JW;Z$gBdR! zEGiDh21_X6Kv)}!L1DvIGBZppLcPPGb&;l##WCUxaRt&Jr!YouYLy}hg7ZwgZvP18G%pFWwJef;*VA(>9q z82Aj#Z`Nb(J*^dDb#2Du3MjXI{yV?^kL|g6hu=1E`TpC|s)$D`QQKNG4g;*=hs)1G zs-XllZgHXp%0{M8%zp=!07O(G?jW|@94M(S_>t~ z>iTT7JTWueX<@S^e-`n>?W6s*0+nAZlZJ*G+~vlQN$ggb8r!j7K*Qj5iPNrf^5FnfcNN&XdGeSfs7=sr;u-CO4YWcbTDpUt zvDND;JPm4bWqvTwuzTa`;K02ZiPxqw1}l?Zu2K+cwyA<*O@3r1wyS!_;<~uYVQTtH z@1RVHW0`e#jbg#h|9S$_pR~q0xmKwoc#xRE->N^ndE8)B%WZOvy(8;VDa*Sz-`3W> zbF^Nc$a17Qso3ptSv9oE4c($VQOAaZb>Ck6)Y%cA7=T_N60d8UVNvPPZisJ%sl4TQ<5AHt0U3 z31h6TC0`R3@I(TK#@HQk_KmNpuvCZzm92xlEvod6$+Vp>5}2jNhSqMc#!S5t*?Hvl zGq=~WRL)9Q=E>av{zQ1VFKZ2Wj3aXk)13-#&BWH7+ol@$92U(}7(E?THnB`NwD;Wk zQ?ca1(|5L1qOvhxU}#LcP}>P&zoE@EyVOg(a&o}D72|{()S!rm87+a>1Gy*UuxN8) z=lQ?eGxhdAJm2W3l9?u!_U_vrow}Iu3|QTch3~BDzAaU|dC#5G4TlfjQWIYrjE`I0 zHqG?@yY4+-!=3;3KYVkhWB+U?hS%>J3Xz0B$R#NAzK36U>DiXs-l!Gu03)+>mPqHO z7K=zK;t37o{#ep`?YS!c{)^$oC6{pBMhI@G5BF9}2bj zo3IwtTa2VFhvrB)Xl4*Lf(21n1|BUwBBJ=48Xe6h%|dUsFIl*Q=kdEZv_fmpt2r%b zb%h>2dWz%lc?GNw5?vaT{J(TOgTNlG@t`$P3auXE;y)JG=w`9q9uur8q@G7T zFbLzzk*R=d0JjHr0G)UR5j2NWA(P5(G>G?eW4S7+Dpi>Z*}2x3(9#Vrbg`MsM{j0IdS4>1`Io1Hog2V^$sb4=`5%xtYjkM zMN9z)j#+v{p%g+LzF2Uk+89YI~U?emnY%@XtM zuH&~JNK{;yg4P_Il%=!wzCu~%c-B%Cad0IepV85>zM*C&9~NO3Jq@7TP;{tH??|j} z_qS}lqba_2EU)tSYWFra*dDv;HrnRbDq-C!()p=eDRc#orY-W3RlfCci?H07+{eEu_!wU~y+ zN1J^F2`$c$E+QnNs-&Z%tII8S>LoZtnG_Mc{kAF6%&jd#EE^-EjTHnm(Wl6kF4w%nqY%-r>rH{PDM zRe9C-)$J7$Rc;sx6HzB$>N3mg zx7|ND@zPK1eJv44`30KR9O_#A#BB?CCk7J+a*^01Xxej&v{t~0hdCq8oV77T3k~mlF5SrY*R`RRwx0WA|5X)Qv!S-O6FZtEzm&Pd+W=! z+EmQT5AV2Tf93T33+bx)llMQ`&f>C_B3+Y9j!W1oYuMx*8tkDavS9DIM)}F!mj+Jc={`0w8q*L6q!0Jb-G}jxDdZ4z~Cgw(rT* zY<*-px@NS?*!J+l4>Y&jwzZ2-L4cZ)=qq*N-fef>cd0efz^AREX!oY}jJLswD@1Xf zCM4l|d`?bomUy9J&|uX{op!rKw)W92RpnZTqJAu;!SL|R`PJ4MlR&|fSw$VU?_S;L zFgRQRnLm=yl2TtNrdNo099FP(by{fy%~J!Ojk5Lwqe!vmLq_XhpRUD_j<^^?O$N#W zoMrwNgQ;RsiGhvR&r>$#i83CvLKhVdjb@YgRn(CAKs98)yB~Yt z^u|0ts5i+x9hKHf7cobWVhi|f07wDT_%j_1J67c*8t4IJ$&_NJ(_w;?xtwG4Xt-Q~ zsD65PgXgJD08Zha&dYCIWs}d5T*#0&GF53fSTtBfHD1;sBtK6@$qtTFGm> zAA*Ej|qok1lTCU6mQuTZrEuc=OT@ z?~G^h@{u*(*7G}B?9CgRQ|tX&i@qyNw{1RAADchTR%2yw=D!3}8=F}U1J`ovf39}^k3jHa5Qgc8GyHEUaIAL@8wEmR>MrIkmsrCYRigp zBUN@83ss3Q4Ep|EN=v?@%k8OVwHcxG(yc6)OB42MYy9w_WanV(vtNGZt__N%|JWUA z@JIzJlfx~OXq8P-p_Z?8YQ?W~(A@jiU@-er@^d)LWpL zL&!>fqHYq5Viwb2V1bKz$wU-I+jTt*2Mwi?*!?%?Xwq;^cJ(FHRo0bat=qMQkKgGNjvw`752l+Rr7fp zo3f@_y-iDfNuj=@x4YUIjdmwA6xlGb&LfwI47A=amWo8Kc!S^Glr*aZyt$VOzuym2 za@g|Mm)|BjKn8$gOSz$VOaoTx+ExPkLB%Jer9{Wf@ipCkXG;oz51nsQRuqq6s>a9y zFA95$xunR1(W!KzDX@Oi-ZgDU-RB0B|1ikpNKA(xu^CuTA`W+9ARLpmW>$g9MH})Q%trvN^a*o7?M>kGA zamSV}Ps5(eAJ}t{@o|qoytCdrer|5`@_{zE66c50)EfpsJK}W10%^ce@X*?J^jh3g~TMO7h@{AcNqGO8pvJSO1V-2~8VY zG5Ldi$0j4a$1eAIH}1Zr5)v5UXw}KabvBPtVpIxaQzr+S*EQP7{yVP5vzKApn*zzbM@}~M?eF&`CJ$Zs{D4Rl7(YMRf7gjZA0y#iCTk?>$sTx3hwl{~U_T5o|AHuOg5(h0d=;pyw|_r=p% zig5c!S^|*2pxL2DzZ}OTQVv_P>d3{5r=p=orB;@C;-#;W?Zimi9C9xMp`3fbOySEpecelj3ULE zpHRIZsz4$@uoagZ(8vL4@3?U0aH?{u(E;%mG_T03n%eA!Dz#p#l}ikbs|;2-sfkEE z1MTL9>ZCMr@btN600ExX*=+9Y`?;BVGf9S4-Muc=QTIQN;Iv3BmAb@IsnBlPK4Yzv zsl9Rdz_dKYLBnu=hq-MMlEn8~nGavdBUjOH4c z-2>$5a5@~tm=oMTAuD#X(7RffRt-g+Nt={N?LK^}W#&Mup5$nw9&6a%-9H@ggf(m^ z0k&-G%S|?g#RL~s4D9;m))tc`1S`k!{;a+GD@my361YCuU4dr%GaK$6NpDW%Hg*Rk z`b@~^%C*~9KR42`tIq>U7--KN{lgBGSXjrZSr-9 zBT+vDiz$u=;FK3H9A(vuyTc^mlMINX@!$MJnbDiA`dm|2AXaG{S~ca;B~+4lCYK5d zt!afu7EP5)e-CBmhQZN+TE~TNPQ2bTIXZrP$g5Jf)P=ML)!@?MQ@7Rlx=nU-|LF={ zNb;aGppGtX-M)FlWEWi3x0hdMg~>*y2d#v2kv1@xGC+d(i$7nx-cl;I=-1=ddm-Rt z7o$X0xlk%J#a(slI>H=_&Dd(^%KX`ywA3}$nZR{seVdnUmnzlTs)kO#I;^wwj!lJ3 z38}QYJ}nCM=j^{k;}bl#BT`ur5#_DGwU)^iMh4LV=$SIKJ(qB+{v@&^UrImG)BF$XMX3- zC0}aSp1oE2jL}{Pfe%PQS+G*gq`z#O(K{B6(ip|Hg8)_lBsxX#^v4qU$XvkNO8GMb z%H~BQR4Tu9veTOA5Ay7xl%Zm2e$rW))8^`%ZS2^j-D?l6UB3_)LKs+=4vMV39#gg6 z**`iJHKtTTe?^ToedOfrjk<)9uvB)(td&YxvcA)6sjUo)0}HkFFQQC?D^F`B#w?|)`g9oNU#jx@=`Zm=vMNSRtx)w??0cxZK+!@MYtonMnl%#Y=j4V@r|FMaqNc^g>;{pl+RfF;DCFAFlikOXjKaYhEvq4-fXK&=Ty zqfg$ZtXkK%{^$RAIUJ5Fp!tz6;qYN%R+kxw*E}}FbH*F`rYn>owLaf7=+Q?N^47tA zV`8kqDbo3L%BqG|ht^b15m$VhPd+lb?RWqDN=wU9PbG{RmUEOEE;*LHoy4w zm(Godg}TO!+hDOAe&PQ))p+afdAB|7ET?q!X{W&#fz=e2U!a_19<8Q?n2Q(AAcQ39 z?gi{DT)FgUBm!X)=pKOR;$R)h9#YQi-JgAWr1|*K!*$jcqrI`ZLX`{zHY~35%RGvK zOI;=y-?UWjICxuEX4{rcDX2ZA#w;$QvbK9-W~vYlod_=QBPlApXb1fyDC|1R&{F)hoE%v*6|Hh#=h|>f3Cm6W-zEQ zb1){!9&d@xM7yp$c778AJ7tdm|HozE|3KMsl!KAOAT~N^&X4eaV3!ei1I`c@bWPKQ z*2j>12!ymq>rz32K6Z`mWBh0T@#o*ZeQAc%`RJt!bq}2Td#vfV$5_{RKR`2nSePKb z%_;zwZW)H;$+RG$xEZNA^m`+xSo~W`{#>A;_^Y%;fdqDFfwn;WzsNIAquRS9t2UN22@7W z#0w<}HAmM(yPo{q-J9#cxk}(8p=DQLaB1ppzw=zPx4*MNuSzxb$2`5gy^PFhHm4?E zU6T1i#?%WkukNd`8jOsDvEPw%#0$)9SLREloPW zCn8k_(c}MxQn?E+W&$!X&y~qlh`EkzB7)OwHk$>sI9k6|%T@6>T&m`9Z9|uwFJ+rz z9SI?f_6UUDYme=;F+-peH1QrH_f-qeBsQ3CATkY z%cd%fGC9H5D1~}HPb~DC|22Qv# zECMhYcmZJBtTGw6fMg67_8Zadv*%Ia+~C}(o`pfiC{?{n}U|MQTq zr$bF6(=)+_Q#FEcIukLPBALn{PpmM3#)aTN2* zn^uREIExaDo^^P7S{pJEsZK$1$~97$zYVwyETLH}Gb&(cMb70|vtzZM<9!qx)!jZ! zfm`bcA~A z0^F6}t9(cU-kc}!9BqoP?@uVhtug<>Gk4}%t2N%V*_!sM22OwRg=cXK>bdH^H36MQ z@D}HqrL74L@6YBS^ip|HFI5n_*SPA`81zzgHE5hY&`Z^MtRjARpmE3ALAy!K;_^wh z*%N{WEooG*bcxGVY%VQUDI(n&Q*9dOj;QdQL?@p3p(E_0X@}d4g*RmT?%7=DtnPN>?y8oi%JS4=l92LU zZYztU0%C;XJ6#rx>m3iloC5s4`a^|HBWzf@ttnL3swL}B9p1TxW3>aTh2Can_s%^3j?re9n zuq#R!FIC_`*9CLkWk%9TybSp+WY1xdR#s`X=AuVQB(Je<0A{6f$5$C$M|>a{lt<$euj zN54Le5qaMpZ zw2PB434JeCK`+8=ei-^;(Iir7J{=9EfJI|!pUhDzLSAL@A1sQD72sqVa2b>di&+^I zG0=;NT>lP-UthCsyvOP29iEE&Rt?mPSR7KMc4{qMgG27v)cA-$ux@c)VZ{&k?MF{5ebLo zh_=JqG!_btwfM7R>kGd&I1+0*f?;oXtl5iAhz$JLs=QBc2~V{6U^f?*A0>mtMObSS zS}9a`kh)&qz>o97pe?`lI_xC=l2D;lK`)@i2~07kukX*jh$)69fj|bwwiKCS46wZy zF%Ap;dsTV;t@y9d>zJP^m&zmpg5it7lGhkn_Lo>>fLo^U57$^^3O#6xuWcrJ9+m+2 zlzNlqQ9nes5JS$0@lPy8kxA?Z_hf}_1*Z#V5bY_N=w^(Zo#}#eIKfmx2TIW{UW;~$ zElKbsi}6NGq6kEWoEeyL4#wd*L!QMteC=+N9db1ohih@$R%h%O;c^w*mDX)pbjR%+ z9!;$J#yEDcTrl$dKy0L^&7rPqZLf<8xFUgFZS09U`mXmb^+E5__Q|varXB@mnXw_? z<<;0|D3Q1ql=S5wd(+PrITB_$CG zB`k{?XR`^YI}w4cdv~pA5ugqymC4hYVLF`loI8IamOOCkY>Up0$T#>xV`JJ0&3Bt` zx%K498k&O>pgoUb+u&{_i@*^KHAAEr;Czb00WB()iBTFbOCXZDPkW6VQDpiywT4y= zwHsxCIt6U2HvkhQvHJeGoPVUh-Jo{zDUAhUr~lsj$iHk(2&QEN;c z9r={i8FX5`QlZFDc(eJ~+N?Jb{?xZXUVs3Px&Wu+QQ!fxqsdjYLZlJSBx*3HQ0xfL zTssUOeVI@?+o~fX0ip_eJY__BJAy(-bm!MQ2ql_A&={n+s)zq z^T#NP3KxNPNQG#JTt(U;(EH@_OZ2Z`!gl5(dJonKKpDbmP8yUJ%##zjckoe6z=+0h znHAZgsT<}fi_t&{88G0>1Z-9C5#(>Ud{Ba+`H|lpqc?rw=%l$#!Q*3mVQpu_mp7Pd z%<3(dzrPy|;0_1o!Hn(L^|`{oe{F$kzo!)o668boU>W81$G-LB_h!)mZ$QcuS@i1$ zoz6^4Ls9^}THhr%KYQycb2|~nKr|He^kO|lj02htrDSBAw|@CZClrV{q3Ftt@Ay;y z>pqyF<|~5=f+OGbwFh_idT|)`b!a#WX+u)4Db4!+r0^>ik3)lX$Dn@Y#-Aguz?|== z@*F4>_;V_aGHu%Qa6IegmkXU5Pj7ppp)sqe?V3z3y;5KjTVva-E;%#yFHK}?j6jdM zeR?=ta|>)h*&=+)YsGJof^|qR8lyy8fD9}HWgU)1SSozUBZ;hs`4VqWdy}CltF7sp ztXO&lf7fC+w%NzGTU;{8n{@_ciK=R2bLm_5qHk$~$m**QS)m6jecc;|Ad+}@goP6hLNdxCjgsFKyfIbDg$5J4ig^lCOJMc-oHLm1fDl+Pg<^$E?5k*SGac$Me?{S;PQ6(J zK^$NBH-b3j-lumoN(DDYg9L|a`}{Ls9_A@vo(*grFqZWY9{@`!Fjf?iA0&!kYmwV` zCJh91^xa?`@E)1TtB{*b7Ej#z5e_r0GhZDo+69I}tjK95)hJ{zq<#~t8PTPUGp4}n zI_Yw8cyJvTft$<^*C7IKTPCl?>?fmNH&J=|8Ll!gK$#*}nfj*3H*uE{#+$wiv7vq& z`xE(fxZ}=>b&qEV=>29DD+n^UClaJVNne=^OC+et1M90D)tey%qO~R?KID#@ z1R||niSy0b`TG}j#!#(HCEW1Dp-FSQ7UDE?r=DqI5qp;U3e+Bp7z9p9fU=f=)w3|{ zrP2rixZy0GL~BmN!Xq;uo95NWnRs#FOoLIj&H(b!aq>efz&OwPp%JO1|fS0q02^}J8JEUc`I zd>{Kg{W$7yWmq0y%&k~nRVozN?^yvCGVca8L=NK*E?hrfR)yshO{wm`hd=fSBDW615Tz8xw zLK^3Ac6iz= zEnidnGZvYWM;H@reioa0-`?2@^WfS@li%6X*$_9FDq6p2txq~>5|SqVjub_sD;ok| zlJM8c_1IaBfGg&&DVgfiln+U;;KrSRwZJ=5Ma;-V)y0q*p>^D89h;pGTC)LdVqkqt?lejD zk!l!i2m}hc*1Dh}Qf;Z)Fj6Oz1>==QYfV@$R_mC(fs=AKJyr$}#2|M-LGWKD%4Y)zWI;L;{>y{~z|cnFcXRELjD=nL^o(kt^+3=+lvG4Qev6V?IgV^zyznW<LOSa zaL^#~YvLRW_&gjI-c>(KYjZg*eCl}^o3$EbnA~VF$e7i?N0iYc%(MXf7Q*>V+8kQ< z8FDO0>k(y`uVrF()*I?;N-H3D$I=1af&ml9oBBg)y9S!FfMVNYqDOoq{Vhq8A=c=` zVSW~7cY#(^LbwN;13J5%!&Ry^s^WM42peIn6l0^XkrmSf*Yil(73xs}-64+Y*G0M` zgQDXrU2HeByn7Z)>BO zQX5PfF?`tapO#-I#(>4R9DVW)PP%9!DrpM3t zt(v-gy9L5aozJ1JZ*8+!s)D-0Nw(0LbwNQwqOTnx-wCwoeHL5fUVGNE80!f}OCp(vKw7z7Gi!f*mWj1fgIDOm`h&bDnTagdWhkH&D2bA!H2 zkJcoUd8HaNq-mgu4R%lM@V78DRKOSB#6*s5 zE-_U_f<-2B9C(8LtV^=73TSh_e0yRQEByC3Lo*f&vusTiUz zQIT+c#O!>oa$(I_cO&BI(qHH43K-SE(^bvzbTzH12A-~@2Y9+%*Lk{(nnWxtiwxI0 zfvSsq^(Fy;R-S^6@Gzt0v9cYY7&mHqDac1KFy{O?3`Cj=-W6j1VlqsKTFFcM4I7Ju zSrQYx31SJj`2g{!6-w^!K3$~bF3>svlhPG1ImUoV3cw^W=v=h{?o;4r?o%*1+T_!^ z!g7^CLfcFCDToQseG0ld45;81>lksM`xG?mvgkeqpLQg#+Wsa)EjW`E=oSYwy2U}; za9UNm#eqm(y2Sz4j&5<_hR)+pxWxg9Buf6FB++!)+W#||LOVem@-*O4BVF*mPiiO6&=woKm8J7LrQPglCl0^^W#6DL4Y2MOnz< z(3fBKEcQL(L+Ww3e@A6m9%O}bbmHsv38>|xRBZf)X(p72yOwg5uH3f)`?DkE)^Z%J zhEP*TrEq6(w>()1{S{uf-qh66?ud5Aw1cOg9yYG3L4zeajVuB*qE3(7CcJtt8*cRg zu!}gM_EwrOC@{)m!;Ox7rCnf-TA(CHNPRB9G2vDPnn!#y_pPsB@$P>uj(92sg&)XG zc9Wc?F`0E>S&6czVMUKqmjRO&@5pcyDuvccI49RzD`DoYc;^Y?acAw&)NG)3`%ui& zJTbQc*xB2?g&|+gC3QE9M!i{=)LB1@Ev;Pj`=zTUPbF3lG)A?yhS}Q6xuNEW*4s9J zEZEdzL%kNBnoe7MD(}0h_{ep#ARGKTXBzYru`(jw*7>r1aBmBQq9L(;9Yx>V3W|0F zbxo`g^{>1coD`z<|LEc%^!lr>6JCbLe?zO&lx!cFi58jsRnSr)Vt<6mUsBoJA25%v z-?}hu+qz;quq%z5&$SiF{LkhYGXFK!m_>Yz%0D|nPBw12lX*+Srn7A~zr|c+`$q(v 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/Times New Roman.ttf b/assets/fonts/Times New Roman.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5cdac9ca591a2705844030915ac2b727141fa287 GIT binary patch literal 68372 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 g5+;YJurJei%6@q \ No newline at end of file diff --git a/assets/icons/armor.webp b/assets/icons/armor.webp deleted file mode 100644 index 7fc4dddc4eca53cd8fd0cf4816f503573ad8547c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6608 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 \ No newline at end of file diff --git a/assets/icons/competence.svg b/assets/icons/competence.svg new file mode 100644 index 0000000..7997747 --- /dev/null +++ b/assets/icons/competence.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/deal.webp b/assets/icons/deal.webp deleted file mode 100644 index 2902ab43a5f53bd78da67374767e7eb7c42232c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7138 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 YSV=|>0000@O#mtY000O80000001BbicK`qY diff --git a/assets/icons/equipement.svg b/assets/icons/equipement.svg new file mode 100644 index 0000000..1f9eb0a --- /dev/null +++ b/assets/icons/equipement.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/equipment.webp b/assets/icons/equipment.webp deleted file mode 100644 index 01ba887028f4d5d610d5b1a09fcff42b1fa74f7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6892 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 bMWreLAgwDegZ=jxOGyd9^nV{(f1CdS!wht@ diff --git a/assets/icons/faction.svg b/assets/icons/faction.svg new file mode 100644 index 0000000..5501172 --- /dev/null +++ b/assets/icons/faction.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/langue.svg b/assets/icons/langue.svg new file mode 100644 index 0000000..87949c0 --- /dev/null +++ b/assets/icons/langue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/malefica.webp b/assets/icons/malefica.webp deleted file mode 100644 index fac08dbc69f0d9f8972a4373e5a49f95f402509e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13298 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 diff --git a/assets/icons/perk.webp b/assets/icons/perk.webp deleted file mode 100644 index 99d549dab6e56b828a3ae5052f2bde5f08555719..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6022 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 As{jB1 diff --git a/assets/icons/peuple.svg b/assets/icons/peuple.svg new file mode 100644 index 0000000..341ba7d --- /dev/null +++ b/assets/icons/peuple.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/region.svg b/assets/icons/region.svg new file mode 100644 index 0000000..1069257 --- /dev/null +++ b/assets/icons/region.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/ritual.webp b/assets/icons/ritual.webp deleted file mode 100644 index 2649c666d98997fb0022b83e510bc5923f69ebda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12948 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 \ No newline at end of file diff --git a/assets/icons/species-trait.webp b/assets/icons/species-trait.webp deleted file mode 100644 index 9b2b6bc3a2fb8fd46010cbfc7e63576bb730ed4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6892 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 Vj=T)^>lh3Mu)cQxKD1uT{{g#BThIUi diff --git a/assets/icons/tarot.svg b/assets/icons/tarot.svg new file mode 100644 index 0000000..c6b1734 --- /dev/null +++ b/assets/icons/tarot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/tarot.webp b/assets/icons/tarot.webp deleted file mode 100644 index 4c8078f954987ad11384ab7a223efd70447b6492..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8172 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 Z{{MJ&Q%wZ$cT-0P0Qv3yd=>n*{{t0N@f!dD diff --git a/css/fvtt-hamalron.css b/css/fvtt-hamalron.css index 3913469..5d3e050 100644 --- a/css/fvtt-hamalron.css +++ b/css/fvtt-hamalron.css @@ -1,30 +1,33 @@ @font-face { - font-family: "MinionProRegular"; - src: url("../assets/fonts/Minion Pro Regular.ttf") format("truetype"); + font-family: "TimesNewRoman"; + src: url("../assets/fonts/Times New Roman.ttf") format("truetype"); } @font-face { - font-family: "SupernaturalKnight"; - src: url("../assets/fonts/Supernatural_Knight.ttf") format("truetype"); + font-family: "EagleLake"; + src: url("../assets/fonts/EagleLake-Regular.ttf") format("truetype"); } :root { --font-size-standard: 0.9rem; --font-size-result: 1.4rem; --background-image-base: url("../assets/ui/sheet_background_01.webp"); - --font-primary: "MinionProRegular"; - --font-secondary: "MinionProRegular"; - --font-title: "SupernaturalKnight"; + --font-primary: "TimesNewRoman"; + --font-secondary: "TimesNewRoman"; + --font-title: "EagleLake"; --logo-standard: url("../assets/ui/pentagram_logo.webp"); - --title-color: #c9a876; + --title-color: #dea60b; --background-box: #e0dcdc; --color-success: #0f7a0f; --color-failure: #8b7355; --color-warning: darkorange; --color-critical-success: #1527cc; --color-critical-failure: #8d20e7; + --color-sheet-nav: #120c04; + --input-height: 1.2rem; } body { --color-light-1: rgba(182, 178, 178, 0.6); --color-warm-1: #c9a876; + --input-height: 1.4rem; } #logo { content: var(--logo-standard); @@ -150,8 +153,8 @@ i.fvtt-hamalron { font-size: calc(var(--font-size-standard) * 1); } .fvtt-hamalron .character-content legend { - font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-family: var(--font-title); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -161,10 +164,15 @@ i.fvtt-hamalron { } .fvtt-hamalron .sheet-tabs { background-color: var(--color-light-1); + font-family: var(--font-title); +} +.fvtt-hamalron .sheet-tabs a { + color: var(--color-sheet-nav); + font-size: 0.9rem; } .fvtt-hamalron .character-main { - /*background-color: var(--color-light-1);*/ display: flex; + justify-content: center; } .fvtt-hamalron .character-main .character-pc { display: flex; @@ -172,7 +180,7 @@ i.fvtt-hamalron { flex: 1; } .fvtt-hamalron .character-main .character-pc .character-left { - min-width: 180px; + min-width: 220px; display: flex; flex-direction: column; } @@ -210,11 +218,7 @@ i.fvtt-hamalron { .fvtt-hamalron .character-main .character-pc .character-right { display: flex; flex-direction: column; - gap: 5px; -} -.fvtt-hamalron .character-main .character-pc .character-right .character-definition .character-definition-pronouns input { - min-width: 21.2rem; - max-width: 21.2rem; + gap: 2px; } .fvtt-hamalron .character-main .character-pc .character-right .character-definition .form-group { display: flex; @@ -242,6 +246,28 @@ i.fvtt-hamalron { margin-right: 1rem; margin-bottom: auto; } +.fvtt-hamalron .character-main .character-pc .character-right .character-definition .item-controls { + display: flex; + align-items: center; + gap: 0.5rem; + flex: 1; +} +.fvtt-hamalron .character-main .character-pc .character-right .character-definition .item-controls .item-name { + flex: 1; + min-width: 0; +} +.fvtt-hamalron .character-main .character-pc .character-right .character-definition .item-controls .control { + flex-shrink: 0; + cursor: pointer; + opacity: 0.7; + transition: opacity 0.2s; +} +.fvtt-hamalron .character-main .character-pc .character-right .character-definition .item-controls .control:hover { + opacity: 1; +} +.fvtt-hamalron .character-main .character-pc .character-right .character-definition .item-controls .control i { + font-size: 0.9rem; +} .fvtt-hamalron .character-main .character-pc .character-right .character-name { display: flex; } @@ -254,39 +280,125 @@ i.fvtt-hamalron { min-width: 120px; } .fvtt-hamalron .character-main .character-pc-play { - min-width: 500px; + min-width: 660px; } .fvtt-hamalron .character-main .character-pc-edit { - min-width: 500px; + min-width: 660px; } .fvtt-hamalron .character-main .character-stats { /*background-color: var(--color-light-1);*/ display: flex; flex-direction: column; - gap: 5px; + gap: 2px; flex: 1; } +.fvtt-hamalron .character-main .character-stats .stats-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 0.2rem; +} .fvtt-hamalron .character-main .character-stats .character-stat { display: flex; align-items: center; + justify-content: space-between; + gap: 0.2rem; + padding: 0.1rem 0.2rem; + background: rgba(0, 0, 0, 0.1); + border-radius: 0.25rem; } -.fvtt-hamalron .character-main .character-stats .character-stat .icon-stat { - width: 24px; - height: 24px; - margin-right: 4px; +.fvtt-hamalron .character-main .character-stats .character-stat .stat-label { + flex: 1; + min-width: 0; } -.fvtt-hamalron .character-main .character-stats .character-stat .rollable:hover, -.fvtt-hamalron .character-main .character-stats .character-stat .rollable:focus { +.fvtt-hamalron .character-main .character-stats .character-stat .stat-label.rollable:hover, +.fvtt-hamalron .character-main .character-stats .character-stat .stat-label.rollable:focus { text-shadow: 0 0 8px var(--color-shadow-primary); cursor: pointer; } -.fvtt-hamalron .character-main .character-stats .character-stat .rollable { - min-width: 3.5rem; - max-width: 3.5rem; +.fvtt-hamalron .character-main .character-stats .character-stat .stat-label i { + margin-right: 0.25rem; } -.fvtt-hamalron .character-main .character-stats .character-stat input { - min-width: 2.5rem; - max-width: 2.5rem; +.fvtt-hamalron .character-main .character-stats .character-stat .stat-values { + display: flex; + align-items: center; + gap: 0.25rem; + flex-shrink: 0; +} +.fvtt-hamalron .character-main .character-stats .character-stat .stat-values input { + width: 3rem; + text-align: center; +} +.fvtt-hamalron .character-main .character-stats .character-stat .stat-values .stat-value { + width: 3rem; + text-align: center; + display: inline-block; +} +.fvtt-hamalron .character-main .character-stats .character-stat .stat-values .separator { + font-weight: bold; + color: var(--color-text-dark-secondary); +} +.fvtt-hamalron .character-main .character-resistances { + display: flex; + flex-direction: column; + gap: 2px; + flex: 1; +} +.fvtt-hamalron .character-main .character-resistances .resistances-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 0.2rem; +} +.fvtt-hamalron .character-main .character-resistances .resistance-stat { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.2rem; + padding: 0.1rem 0.2rem; + background: rgba(0, 0, 0, 0.1); + border-radius: 0.25rem; +} +.fvtt-hamalron .character-main .character-resistances .resistance-stat .stat-label { + flex: 1; + min-width: 0; +} +.fvtt-hamalron .character-main .character-resistances .resistance-stat .stat-values { + display: flex; + align-items: center; + gap: 0.2rem; + flex-shrink: 0; +} +.fvtt-hamalron .character-main .character-resistances .resistance-stat .stat-values input { + width: 3rem; + text-align: center; +} +.fvtt-hamalron .character-main .character-resistances .resistance-stat .stat-values .stat-value { + width: 3rem; + text-align: center; + display: inline-block; +} +.fvtt-hamalron .character-main .character-resistances .resistance-stat .stat-values .resistance-control { + cursor: pointer; + opacity: 0.8; + transition: all 0.2s ease; + padding: 0.15rem 0.35rem; + background: rgba(0, 0, 0, 0.1); + border-radius: 3px; + color: var(--color-text-dark-primary); +} +.fvtt-hamalron .character-main .character-resistances .resistance-stat .stat-values .resistance-control:hover { + opacity: 1; + background: rgba(0, 100, 200, 0.2); + transform: scale(1.1); +} +.fvtt-hamalron .character-main .character-resistances .resistance-stat .stat-values .resistance-control:active { + transform: scale(0.95); +} +.fvtt-hamalron .character-main .character-resistances .resistance-stat .stat-values .resistance-control i { + font-size: 0.7rem; +} +.fvtt-hamalron .character-main .character-resistances .resistance-stat .stat-values .separator { + font-weight: bold; + color: var(--color-text-dark-secondary); } .fvtt-hamalron .character-main .character-stats-play { min-width: 120px; @@ -294,16 +406,126 @@ i.fvtt-hamalron { .fvtt-hamalron .character-main .character-stats-edit { min-width: 120px; } -.fvtt-hamalron .tab.character-status .main-div { +.fvtt-hamalron .tab.character-competences .main-div { /*background-color: var(--color-light-1);*/ display: grid; grid-template-columns: 1fr; + gap: 8px; } -.fvtt-hamalron .tab.character-status .main-div legend a { +.fvtt-hamalron .tab.character-competences .main-div legend a { font-size: calc(var(--font-size-standard) * 1.4); padding-left: 5px; } -.fvtt-hamalron .tab.character-status .main-div .mortality { +.fvtt-hamalron .tab.character-competences .main-div .competences-group { + margin-bottom: 12px; + background: rgba(0, 0, 0, 0.03); + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 4px; + padding: 8px; +} +.fvtt-hamalron .tab.character-competences .main-div .competences-group .competences-type-header { + font-weight: bold; + font-size: calc(var(--font-size-standard) * 1.1); + color: var(--color-text-dark-primary); + margin-bottom: 8px; + padding: 4px 8px; + border-left: 3px solid var(--color-border-dark-primary); +} +.fvtt-hamalron .tab.character-competences .main-div .competences { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 6px; +} +.fvtt-hamalron .tab.character-competences .main-div .competences .competence { + display: flex; + align-items: center; + gap: 6px; + padding: 4px 6px; + background: rgba(255, 255, 255, 0.6); + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 3px; + transition: all 0.2s ease; +} +.fvtt-hamalron .tab.character-competences .main-div .competences .competence:hover { + background: rgba(255, 255, 255, 0.9); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +} +.fvtt-hamalron .tab.character-competences .main-div .competences .competence .item-img { + width: 28px; + height: 28px; + border-radius: 3px; + flex-shrink: 0; +} +.fvtt-hamalron .tab.character-competences .main-div .competences .competence .name { + flex: 1; + min-width: 0; + font-weight: 500; +} +.fvtt-hamalron .tab.character-competences .main-div .competences .competence .name a { + color: var(--color-text-dark-primary); + text-decoration: none; + cursor: pointer; +} +.fvtt-hamalron .tab.character-competences .main-div .competences .competence .name a:hover { + color: var(--color-text-hyperlink); + text-decoration: underline; +} +.fvtt-hamalron .tab.character-competences .main-div .competences .competence .carte { + font-size: 0.85rem; + padding: 2px 6px; + background: rgba(0, 0, 0, 0.08); + border-radius: 3px; + white-space: nowrap; +} +.fvtt-hamalron .tab.character-competences .main-div .competences .competence .niveau { + font-size: 0.85rem; + padding: 2px 6px; + background: rgba(0, 100, 200, 0.1); + color: var(--color-text-dark-primary); + border-radius: 3px; + white-space: nowrap; + font-weight: 500; +} +.fvtt-hamalron .tab.character-competences .main-div .competences .competence .controls { + display: flex; + gap: 4px; + font-size: 0.85rem; + flex-shrink: 0; +} +.fvtt-hamalron .tab.character-competences .main-div .competences .competence .controls a { + padding: 2px 4px; + color: var(--color-text-dark-secondary); + cursor: pointer; + transition: color 0.2s ease; +} +.fvtt-hamalron .tab.character-competences .main-div .competences .competence .controls a:hover { + color: var(--color-text-dark-primary); +} +.fvtt-hamalron .tab.character-competences .main-div .add-competence-section { + text-align: center; + padding: 12px; +} +.fvtt-hamalron .tab.character-competences .main-div .add-competence-section .add-competence-button { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 8px 16px; + background: rgba(0, 100, 200, 0.1); + border: 1px solid rgba(0, 100, 200, 0.3); + border-radius: 4px; + color: var(--color-text-dark-primary); + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease; +} +.fvtt-hamalron .tab.character-competences .main-div .add-competence-section .add-competence-button:hover { + background: rgba(0, 100, 200, 0.2); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +} +.fvtt-hamalron .tab.character-competences .main-div .add-competence-section .add-competence-button i { + font-size: 1rem; +} +.fvtt-hamalron .tab.character-competences .main-div .mortality { display: flex; align-items: center; gap: 4px; @@ -311,38 +533,38 @@ i.fvtt-hamalron { min-width: 12rem; max-width: 12rem; } -.fvtt-hamalron .tab.character-status .main-div .mortality label { +.fvtt-hamalron .tab.character-competences .main-div .mortality label { min-width: 5rem; max-width: 5rem; } -.fvtt-hamalron .tab.character-status .main-div .counters { +.fvtt-hamalron .tab.character-competences .main-div .counters { display: flex; direction: column; align-items: center; gap: 4px; margin-left: 4px; } -.fvtt-hamalron .tab.character-status .main-div .counters .characteristics-label { +.fvtt-hamalron .tab.character-competences .main-div .counters .characteristics-label { color: grey; font-size: small; } -.fvtt-hamalron .tab.character-status .main-div .counters label { +.fvtt-hamalron .tab.character-competences .main-div .counters label { min-width: 4rem; max-width: 4rem; } -.fvtt-hamalron .tab.character-status .main-div .counters .spaced-left { +.fvtt-hamalron .tab.character-competences .main-div .counters .spaced-left { margin-left: 0.8rem; } -.fvtt-hamalron .tab.character-status .main-div .counters input { +.fvtt-hamalron .tab.character-competences .main-div .counters input { min-width: 2.5rem; max-width: 2.5rem; } -.fvtt-hamalron .tab.character-status .main-div .ailments { +.fvtt-hamalron .tab.character-competences .main-div .ailments { display: grid; grid-template-columns: repeat(5, 1fr); gap: 4px; } -.fvtt-hamalron .tab.character-status .main-div .ailments .ailment { +.fvtt-hamalron .tab.character-competences .main-div .ailments .ailment { display: flex; align-items: center; gap: 4px; @@ -350,144 +572,58 @@ i.fvtt-hamalron { min-width: 8rem; max-width: 8rem; } -.fvtt-hamalron .tab.character-status .main-div .ailments .ailment label { +.fvtt-hamalron .tab.character-competences .main-div .ailments .ailment label { min-width: 5rem; max-width: 5rem; } -.fvtt-hamalron .tab.character-status .main-div .ailments .ailment .item-img { +.fvtt-hamalron .tab.character-competences .main-div .ailments .ailment .item-img { width: 24px; height: 24px; margin: 4px 0 0 0; } -.fvtt-hamalron .tab.character-status .main-div .perks { - display: grid; - grid-template-columns: repeat(1, 1fr); - gap: 4px; -} -.fvtt-hamalron .tab.character-status .main-div .perks .perk { - display: flex; - align-items: center; - gap: 4px; - margin-left: 4px; - min-width: 20rem; - max-width: 20rem; -} -.fvtt-hamalron .tab.character-status .main-div .perks .perk .rollable:hover, -.fvtt-hamalron .tab.character-status .main-div .perks .perk .rollable:focus { - text-shadow: 0 0 8px var(--color-shadow-primary); - cursor: pointer; -} -.fvtt-hamalron .tab.character-status .main-div .perks .perk .controls { - font-size: 0.7rem; - min-width: 1.8rem; - max-width: 1.8rem; -} -.fvtt-hamalron .tab.character-status .main-div .perks .perk .flavor { - min-width: 24rem; - max-width: 24rem; -} -.fvtt-hamalron .tab.character-status .main-div .perks .perk .role { - min-width: 5rem; - max-width: 5rem; -} -.fvtt-hamalron .tab.character-status .main-div .perks .perk .level { - min-width: 4rem; - max-width: 4rem; -} -.fvtt-hamalron .tab.character-status .main-div .perks .perk .name { - min-width: 10rem; - max-width: 10rem; -} -.fvtt-hamalron .tab.character-status .main-div .perks .perk .item-img { - width: 24px; - height: 24px; - margin: 4px 0 0 0; -} -.fvtt-hamalron .tab.character-maleficas .main-div { +.fvtt-hamalron .tab.character-sortileges .main-div { /*background-color: var(--color-light-1);*/ display: grid; grid-template-columns: 1fr; } -.fvtt-hamalron .tab.character-maleficas .main-div legend a { +.fvtt-hamalron .tab.character-sortileges .main-div legend a { font-size: calc(var(--font-size-standard) * 1.4); padding-left: 5px; } -.fvtt-hamalron .tab.character-maleficas .main-div .maleficas { +.fvtt-hamalron .tab.character-sortileges .main-div .sortileges { display: grid; grid-template-columns: repeat(2, 1fr); gap: 4px; } -.fvtt-hamalron .tab.character-maleficas .main-div .maleficas .malefica { +.fvtt-hamalron .tab.character-sortileges .main-div .sortileges .malefica { display: flex; align-items: center; gap: 4px; min-width: 20rem; max-width: 20rem; } -.fvtt-hamalron .tab.character-maleficas .main-div .maleficas .malefica .controls { +.fvtt-hamalron .tab.character-sortileges .main-div .sortileges .malefica .controls { font-size: 0.7rem; min-width: 1.8rem; max-width: 1.8rem; } -.fvtt-hamalron .tab.character-maleficas .main-div .maleficas .malefica .name { +.fvtt-hamalron .tab.character-sortileges .main-div .sortileges .malefica .name { min-width: 10rem; max-width: 10rem; } -.fvtt-hamalron .tab.character-maleficas .main-div .maleficas .malefica .damage { +.fvtt-hamalron .tab.character-sortileges .main-div .sortileges .malefica .damage { min-width: 3.2rem; max-width: 3.2rem; } -.fvtt-hamalron .tab.character-maleficas .main-div .maleficas .malefica .domain { +.fvtt-hamalron .tab.character-sortileges .main-div .sortileges .malefica .domain { min-width: 4rem; max-width: 4rem; } -.fvtt-hamalron .tab.character-maleficas .main-div .maleficas .malefica .level { +.fvtt-hamalron .tab.character-sortileges .main-div .sortileges .malefica .level { min-width: 2rem; max-width: 2rem; } -.fvtt-hamalron .tab.character-maleficas .main-div .maleficas .malefica .item-img { - width: 24px; - height: 24px; - margin: 4px 0 0 0; -} -.fvtt-hamalron .tab.character-maleficas .main-div .rituals { - display: grid; - grid-template-columns: repeat(1, 1fr); - gap: 4px; -} -.fvtt-hamalron .tab.character-maleficas .main-div .rituals .ritual { - display: flex; - align-items: center; - gap: 4px; - min-width: 14rem; - max-width: 14rem; -} -.fvtt-hamalron .tab.character-maleficas .main-div .rituals .ritual .controls { - font-size: 0.7rem; - min-width: 1.8rem; - max-width: 1.8rem; -} -.fvtt-hamalron .tab.character-maleficas .main-div .rituals .ritual .ingredients { - min-width: 24rem; - max-width: 24rem; -} -.fvtt-hamalron .tab.character-maleficas .main-div .rituals .ritual .name { - min-width: 12rem; - max-width: 12rem; -} -.fvtt-hamalron .tab.character-maleficas .main-div .rituals .ritual .difficulty { - min-width: 2rem; - max-width: 2rem; -} -.fvtt-hamalron .tab.character-maleficas .main-div .rituals .ritual .threshold { - min-width: 2rem; - max-width: 2rem; -} -.fvtt-hamalron .tab.character-maleficas .main-div .rituals .ritual .limit { - min-width: 2rem; - max-width: 2rem; -} -.fvtt-hamalron .tab.character-maleficas .main-div .rituals .ritual .item-img { +.fvtt-hamalron .tab.character-sortileges .main-div .sortileges .malefica .item-img { width: 24px; height: 24px; margin: 4px 0 0 0; @@ -770,63 +906,130 @@ i.fvtt-hamalron { .fvtt-hamalron .tab.character-biography .main-div prose-mirror.active { min-height: 150px; } -.fvtt-hamalron .personnage .tarot-hand-container { - padding: 1rem; +.fvtt-hamalron .character-content .tarot-hand-container { + padding: 0.3rem; height: 100%; display: flex; flex-direction: column; } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-header { +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-header { display: flex; justify-content: space-between; align-items: center; - margin-bottom: 1.5rem; - padding-bottom: 0.75rem; + margin-bottom: 0.2rem; + padding-bottom: 0.2rem; border-bottom: 2px solid var(--color-border-dark); } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-header h2 { +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-header h2 { margin: 0; font-size: 1.5rem; color: var(--color-text-dark-primary); } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-header .tarot-hand-info .card-count { +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-header .tarot-hand-info { display: flex; align-items: center; - gap: 0.5rem; - padding: 0.5rem 1rem; + gap: 1rem; +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-header .tarot-hand-info .card-count { + display: flex; + align-items: center; + gap: 0.3rem; + padding: 0.3rem 0.6rem; background: rgba(102, 126, 234, 0.2); border-radius: 0.25rem; border: 1px solid rgba(102, 126, 234, 0.4); font-weight: bold; + font-size: 0.85rem; color: var(--color-text-light-heading); } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-header .tarot-hand-info .card-count i { +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-header .tarot-hand-info .card-count i { color: #667eea; } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); - gap: 1.5rem; - overflow-y: auto; - padding-right: 0.5rem; +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-header .tarot-hand-info .card-count.over-limit { + background: rgba(234, 102, 102, 0.2); + border-color: rgba(234, 102, 102, 0.4); } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper { +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-header .tarot-hand-info .card-count.over-limit i { + color: #ea6666; +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-header .tarot-hand-info .hand-warning { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + background: rgba(234, 179, 8, 0.2); + border-radius: 0.25rem; + border: 1px solid rgba(234, 179, 8, 0.4); + color: #eab308; + font-weight: bold; + animation: pulse 2s ease-in-out infinite; +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-header .tarot-hand-info .hand-warning i { + color: #eab308; +} +@keyframes pulse { + 0%, + 100% { + opacity: 1; + } + 50% { + opacity: 0.7; + } +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards { + display: flex; + flex-wrap: wrap; + gap: 0.3rem; + overflow-y: auto; + padding: 0.2rem; + justify-content: center; + align-items: flex-start; +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper { perspective: 1000px; cursor: grab; + flex-shrink: 0; + position: relative; } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper:active { +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper:active { cursor: grabbing; } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card { +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper.success-card .tarot-card .tarot-card-inner .tarot-card-front { + border: 3px solid #ffd700; + box-shadow: 0 0 15px rgba(255, 215, 0, 0.6), 0 4px 8px rgba(0, 0, 0, 0.3); +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper.success-card .tarot-card-controls .success-indicator { + display: flex; + align-items: center; + justify-content: center; + width: 20px; + height: 20px; + border-radius: 50%; + background: rgba(255, 215, 0, 0.9); + color: #8b6914; + animation: pulse-gold 2s ease-in-out infinite; +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper.success-card .tarot-card-controls .success-indicator i { + font-size: 0.7rem; +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper.selected .tarot-card { + border: 2px solid #667eea; + box-shadow: 0 0 20px rgba(102, 126, 234, 0.6); +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper.selected .card-actions { + display: flex !important; +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card { position: relative; - width: 100%; - height: 400px; + width: 110px; + height: 190px; transition: transform 0.3s ease; } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card:hover { - transform: translateY(-5px); +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card:hover { + transform: translateY(-10px) scale(1.05); + z-index: 10; } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner { +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner { position: relative; width: 100%; height: 100%; @@ -834,7 +1037,7 @@ i.fvtt-hamalron { box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); overflow: hidden; } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front { +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front { width: 100%; height: 100%; background: linear-gradient(135deg, rgba(20, 20, 30, 0.95) 0%, rgba(40, 40, 50, 0.95) 100%); @@ -842,154 +1045,193 @@ i.fvtt-hamalron { border-radius: 0.5rem; display: flex; flex-direction: column; - padding: 0.75rem; + padding: 0.4rem; } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-header { - display: flex; - justify-content: space-between; - align-items: flex-start; - margin-bottom: 0.75rem; +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-header { + position: absolute; + top: 0.25rem; + right: 0.25rem; + z-index: 2; } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-header .tarot-card-name { - margin: 0; - font-size: 1.1rem; - font-weight: bold; - color: #667eea; - flex: 1; - line-height: 1.3; -} -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-header .tarot-card-controls { +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-header .tarot-card-controls { display: flex; gap: 0.25rem; + opacity: 0; + transition: opacity 0.2s ease; } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-header .tarot-card-controls .card-control { +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-header .tarot-card-controls .card-control { display: flex; align-items: center; justify-content: center; - width: 24px; - height: 24px; - border-radius: 0.25rem; - background: rgba(0, 0, 0, 0.3); - color: var(--color-text-light-heading); + width: 20px; + height: 20px; + border-radius: 50%; + background: rgba(0, 0, 0, 0.7); + color: white; transition: all 0.2s ease; } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-header .tarot-card-controls .card-control:hover { - background: rgba(102, 126, 234, 0.5); - color: white; +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-header .tarot-card-controls .card-control.delete-control:hover { + background: rgba(234, 102, 102, 0.9); } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-header .tarot-card-controls .card-control i { - font-size: 0.75rem; +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-header .tarot-card-controls .card-control.view-control:hover { + background: rgba(102, 126, 234, 0.9); } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-image { +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-header .tarot-card-controls .card-control i { + font-size: 0.7rem; +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front:hover .tarot-card-header .tarot-card-controls { + opacity: 1; +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-image { width: 100%; - height: 150px; - margin-bottom: 0.75rem; - border-radius: 0.25rem; + height: 125px; + border-radius: 0.25rem 0.25rem 0 0; overflow: hidden; - border: 1px solid var(--color-border-dark); background: rgba(0, 0, 0, 0.3); } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-image img { +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-image img { width: 100%; height: 100%; object-fit: cover; } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info { - display: flex; - flex-direction: column; - gap: 0.5rem; - margin-bottom: 0.75rem; +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-name { + padding: 0.5rem; + background: rgba(0, 0, 0, 0.3); + border-bottom: 1px solid var(--color-border-dark); } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .card-info-row { - display: flex; - justify-content: space-between; - align-items: center; - padding: 0.4rem 0.5rem; - background: rgba(0, 0, 0, 0.2); - border-radius: 0.25rem; - font-size: 0.875rem; -} -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .card-info-row .info-label { - display: flex; - align-items: center; - gap: 0.35rem; - color: var(--color-text-dark-secondary); - font-weight: 500; -} -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .card-info-row .info-label i { - font-size: 0.75rem; - opacity: 0.7; -} -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .card-info-row .info-value { - color: var(--color-text-light-heading); +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-name h4 { + margin: 0; + font-size: 0.85rem; font-weight: bold; + color: #667eea; + text-align: center; + line-height: 1.2; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .card-info-row .info-value.symbole-coupe { - color: #3498db; -} -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .card-info-row .info-value.symbole-epee { - color: #d4a574; -} -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .card-info-row .info-value.symbole-denier { - color: #f39c12; -} -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .card-info-row .info-value.symbole-baton { - color: #2ecc71; -} -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-description { - flex: 1; - overflow-y: auto; +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info { padding: 0.5rem; background: rgba(0, 0, 0, 0.2); +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .card-info-compact { + display: flex; + flex-direction: column; + gap: 0.4rem; + font-size: 0.75rem; +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .card-info-compact .card-symbole { + display: flex; + align-items: center; + gap: 0.3rem; + font-weight: bold; + justify-content: center; +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .card-info-compact .card-symbole i { + font-size: 0.6rem; +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .card-info-compact .card-symbole.symbole-coupe { + color: #3498db; +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .card-info-compact .card-symbole.symbole-epee { + color: #d4a574; +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .card-info-compact .card-symbole.symbole-denier { + color: #f39c12; +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .card-info-compact .card-symbole.symbole-baton { + color: #2ecc71; +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .card-info-compact .card-valeur { + text-align: center; + color: #ffffff; + font-weight: bold; + font-size: 1rem; + background: rgba(0, 0, 0, 0.4); + padding: 0.3rem 0.5rem; border-radius: 0.25rem; - border: 1px solid var(--color-border-dark); } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-description .description-text { - font-size: 0.8rem; - line-height: 1.4; - color: var(--color-text-dark-primary); +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .card-actions { + display: none; + margin-top: 0.5rem; } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-description .description-text p { - margin: 0 0 0.5rem 0; +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .card-actions .discard-and-draw-button { + width: 100%; + padding: 0.5rem; + background: rgba(102, 126, 234, 0.3); + border: 1px solid rgba(102, 126, 234, 0.6); + border-radius: 0.25rem; + color: #9ab4ff; + font-size: 0.75rem; + font-weight: bold; + cursor: pointer; + transition: all 0.2s ease; + display: flex; + align-items: center; + justify-content: center; + gap: 0.3rem; } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-description .description-text p:last-child { - margin-bottom: 0; +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .card-actions .discard-and-draw-button i { + font-size: 0.7rem; } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-description::-webkit-scrollbar { - width: 4px; -} -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-description::-webkit-scrollbar-track { - background: rgba(0, 0, 0, 0.2); - border-radius: 2px; -} -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-description::-webkit-scrollbar-thumb { +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .card-actions .discard-and-draw-button:hover { background: rgba(102, 126, 234, 0.5); - border-radius: 2px; + border-color: rgba(102, 126, 234, 0.8); + color: #aac4ff; + transform: translateY(-1px); } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-description::-webkit-scrollbar-thumb:hover { - background: rgba(102, 126, 234, 0.7); +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .card-actions .discard-and-draw-button:active { + transform: translateY(0); } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-empty { +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .discard-button { + margin-top: 0.5rem; + padding: 0.4rem 0.5rem; + background: rgba(234, 102, 102, 0.3); + border: 1px solid rgba(234, 102, 102, 0.6); + border-radius: 0.25rem; + color: #ea6666; + font-size: 0.7rem; + font-weight: bold; + cursor: pointer; + transition: all 0.2s ease; + display: flex; + align-items: center; + justify-content: center; + gap: 0.3rem; +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .discard-button i { + font-size: 0.65rem; +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .discard-button:hover { + background: rgba(234, 102, 102, 0.5); + border-color: rgba(234, 102, 102, 0.8); + color: #ff6666; + transform: translateY(-1px); +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-cards .tarot-card-wrapper .tarot-card .tarot-card-inner .tarot-card-front .tarot-card-info .discard-button:active { + transform: translateY(0); +} +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-empty { flex: 1; display: flex; align-items: center; justify-content: center; } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-empty .empty-state { +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-empty .empty-state { text-align: center; color: var(--color-text-dark-secondary); max-width: 400px; } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-empty .empty-state i { +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-empty .empty-state i { opacity: 0.2; margin-bottom: 1rem; } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-empty .empty-state h3 { +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-empty .empty-state h3 { margin: 0 0 0.5rem 0; font-size: 1.25rem; color: var(--color-text-dark-primary); } -.fvtt-hamalron .personnage .tarot-hand-container .tarot-hand-empty .empty-state p { +.fvtt-hamalron .character-content .tarot-hand-container .tarot-hand-empty .empty-state p { margin: 0; font-style: italic; opacity: 0.8; @@ -1038,8 +1280,8 @@ i.fvtt-hamalron { font-size: calc(var(--font-size-standard) * 1); } .fvtt-hamalron .enemy-content legend { - font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-family: var(--font-title); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -1545,8 +1787,8 @@ i.fvtt-hamalron { font-size: calc(var(--font-size-standard) * 1); } .fvtt-hamalron .weapon-content legend { - font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-family: var(--font-title); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -1639,8 +1881,8 @@ i.fvtt-hamalron { font-size: calc(var(--font-size-standard) * 1); } .fvtt-hamalron .armor-content legend { - font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-family: var(--font-title); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -1729,8 +1971,8 @@ i.fvtt-hamalron { font-size: calc(var(--font-size-standard) * 1); } .fvtt-hamalron .perk-content legend { - font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-family: var(--font-title); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -1823,8 +2065,8 @@ i.fvtt-hamalron { font-size: calc(var(--font-size-standard) * 1); } .fvtt-hamalron .equipment-content legend { - font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-family: var(--font-title); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -1932,8 +2174,8 @@ i.fvtt-hamalron { font-size: calc(var(--font-size-standard) * 1); } .fvtt-hamalron .ritual-content legend { - font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-family: var(--font-title); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -2026,8 +2268,8 @@ i.fvtt-hamalron { font-size: calc(var(--font-size-standard) * 1); } .fvtt-hamalron .tarot-content legend { - font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-family: var(--font-title); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } @@ -2093,188 +2335,6 @@ i.fvtt-hamalron { .fvtt-hamalron .tarot-content label { flex: 10%; } -.fvtt-hamalron .tarot-deck-manager .tarot-deck-manager-content { - padding: 1rem; - display: flex; - flex-direction: column; - gap: 1.5rem; -} -.fvtt-hamalron .tarot-deck-manager .deck-header h2 { - margin: 0 0 1rem 0; - font-size: 1.5rem; - color: var(--color-text-dark-primary); - text-align: center; - border-bottom: 2px solid var(--color-border-dark); - padding-bottom: 0.5rem; -} -.fvtt-hamalron .tarot-deck-manager .deck-header .deck-stats { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 1rem; - margin-top: 1rem; -} -.fvtt-hamalron .tarot-deck-manager .deck-header .deck-stats .stat-item { - display: flex; - flex-direction: column; - align-items: center; - gap: 0.25rem; - padding: 0.75rem; - background: rgba(0, 0, 0, 0.2); - border-radius: 0.25rem; - border: 1px solid var(--color-border-dark); -} -.fvtt-hamalron .tarot-deck-manager .deck-header .deck-stats .stat-item i { - font-size: 1.5rem; - color: var(--color-text-light-heading); - margin-bottom: 0.25rem; -} -.fvtt-hamalron .tarot-deck-manager .deck-header .deck-stats .stat-item .stat-label { - font-size: 0.75rem; - color: var(--color-text-dark-secondary); - text-transform: uppercase; -} -.fvtt-hamalron .tarot-deck-manager .deck-header .deck-stats .stat-item .stat-value { - font-size: 1.25rem; - font-weight: bold; - color: var(--color-text-light-heading); -} -.fvtt-hamalron .tarot-deck-manager .deck-actions { - display: flex; - flex-direction: column; - gap: 1rem; -} -.fvtt-hamalron .tarot-deck-manager .deck-actions .action-button { - display: flex; - align-items: center; - justify-content: center; - gap: 0.5rem; - padding: 0.75rem 1rem; - font-size: 1rem; - font-weight: bold; - border: none; - border-radius: 0.25rem; - cursor: pointer; - transition: all 0.2s ease; -} -.fvtt-hamalron .tarot-deck-manager .deck-actions .action-button i { - font-size: 1.25rem; -} -.fvtt-hamalron .tarot-deck-manager .deck-actions .action-button:disabled { - opacity: 0.5; - cursor: not-allowed; -} -.fvtt-hamalron .tarot-deck-manager .deck-actions .reset-button { - background: var(--color-border-dark); - color: var(--color-text-light-heading); -} -.fvtt-hamalron .tarot-deck-manager .deck-actions .reset-button:hover:not(:disabled) { - background: var(--color-border-dark-tertiary); - transform: translateY(-2px); - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); -} -.fvtt-hamalron .tarot-deck-manager .deck-actions .draw-actions { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 0.5rem; -} -.fvtt-hamalron .tarot-deck-manager .deck-actions .draw-actions .draw-button { - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - color: white; -} -.fvtt-hamalron .tarot-deck-manager .deck-actions .draw-actions .draw-button:hover:not(:disabled) { - background: linear-gradient(135deg, #764ba2 0%, #667eea 100%); - transform: translateY(-2px); - box-shadow: 0 4px 8px rgba(102, 126, 234, 0.4); -} -.fvtt-hamalron .tarot-deck-manager .recent-draws h3 { - margin: 0 0 1rem 0; - font-size: 1.25rem; - color: var(--color-text-dark-primary); - padding-bottom: 0.5rem; - border-bottom: 1px solid var(--color-border-dark); -} -.fvtt-hamalron .tarot-deck-manager .recent-draws .drawn-cards-list { - display: flex; - flex-direction: column; - gap: 0.75rem; - max-height: 300px; - overflow-y: auto; -} -.fvtt-hamalron .tarot-deck-manager .recent-draws .drawn-cards-list .drawn-card { - display: flex; - gap: 1rem; - padding: 0.75rem; - background: rgba(0, 0, 0, 0.2); - border-radius: 0.25rem; - border: 1px solid var(--color-border-dark); - transition: all 0.2s ease; -} -.fvtt-hamalron .tarot-deck-manager .recent-draws .drawn-cards-list .drawn-card:hover { - background: rgba(0, 0, 0, 0.3); - border-color: var(--color-border-dark-tertiary); -} -.fvtt-hamalron .tarot-deck-manager .recent-draws .drawn-cards-list .drawn-card .card-image { - width: 60px; - height: 60px; - object-fit: cover; - border-radius: 0.25rem; - border: 1px solid var(--color-border-dark); -} -.fvtt-hamalron .tarot-deck-manager .recent-draws .drawn-cards-list .drawn-card .card-info { - flex: 1; - display: flex; - flex-direction: column; - justify-content: center; - gap: 0.25rem; -} -.fvtt-hamalron .tarot-deck-manager .recent-draws .drawn-cards-list .drawn-card .card-info .card-name { - margin: 0; - font-size: 1rem; - color: var(--color-text-light-heading); -} -.fvtt-hamalron .tarot-deck-manager .recent-draws .drawn-cards-list .drawn-card .card-info .card-details { - display: flex; - gap: 1rem; - font-size: 0.875rem; -} -.fvtt-hamalron .tarot-deck-manager .recent-draws .drawn-cards-list .drawn-card .card-info .card-details .card-symbole, -.fvtt-hamalron .tarot-deck-manager .recent-draws .drawn-cards-list .drawn-card .card-info .card-details .card-valeur { - color: var(--color-text-dark-secondary); -} -.fvtt-hamalron .tarot-deck-manager .no-draws { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - gap: 1rem; - padding: 3rem 1rem; - color: var(--color-text-dark-secondary); - text-align: center; -} -.fvtt-hamalron .tarot-deck-manager .no-draws i { - opacity: 0.3; -} -.fvtt-hamalron .tarot-deck-manager .no-draws p { - margin: 0; - font-style: italic; -} -.fvtt-hamalron .tarot-deck-manager .deck-empty-warning { - display: flex; - align-items: center; - gap: 0.75rem; - padding: 1rem; - background: rgba(255, 165, 0, 0.1); - border: 1px solid rgba(255, 165, 0, 0.3); - border-radius: 0.25rem; - color: #ffa500; -} -.fvtt-hamalron .tarot-deck-manager .deck-empty-warning i { - font-size: 1.5rem; -} -.fvtt-hamalron .tarot-deck-manager .deck-empty-warning p { - margin: 0; - flex: 1; -} .fvtt-hamalron.ask-roll { display: flex; flex-direction: column; @@ -2283,13 +2343,346 @@ i.fvtt-hamalron { font-family: var(--font-secondary); font-size: calc(var(--font-size-standard) * 1.1); } -.fvtt-hamalron .hamalron-tarot-draw { +.fvtt-hamalron.competence-roll { + background: #e8e8e8; + border: 2px solid #999; + border-radius: 0.5rem; + overflow: hidden; +} +.fvtt-hamalron.competence-roll .competence-roll-header { + background: rgba(255, 255, 255, 0.5); + padding: 0.5rem; + border-bottom: 2px solid #999; +} +.fvtt-hamalron.competence-roll .competence-roll-header .actor-info-compact { + display: flex; + align-items: center; + gap: 0.5rem; +} +.fvtt-hamalron.competence-roll .competence-roll-header .actor-info-compact .actor-avatar { + width: 40px; + height: 40px; + border-radius: 50%; + border: 2px solid #667eea; + object-fit: cover; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); +} +.fvtt-hamalron.competence-roll .competence-roll-header .actor-info-compact .actor-details { + flex: 1; +} +.fvtt-hamalron.competence-roll .competence-roll-header .actor-info-compact .actor-details .competence-name { + margin: 0 0 0.25rem 0; + font-size: 1rem; + color: #667eea; + font-weight: bold; +} +.fvtt-hamalron.competence-roll .competence-roll-header .actor-info-compact .actor-details .competence-meta { + display: flex; + gap: 0.75rem; + font-size: 0.75rem; + color: var(--color-text-dark-secondary); +} +.fvtt-hamalron.competence-roll .competence-roll-header .actor-info-compact .actor-details .competence-meta .meta-item { + display: flex; + align-items: center; + gap: 0.35rem; +} +.fvtt-hamalron.competence-roll .competence-roll-header .actor-info-compact .actor-details .competence-meta .meta-item i { + color: #667eea; + font-size: 0.75rem; +} +.fvtt-hamalron.competence-roll .competence-roll-body { padding: 0.5rem; } -.fvtt-hamalron .hamalron-tarot-draw .tarot-draw-header { +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section { + background: rgba(102, 126, 234, 0.1); + border: 1px solid rgba(102, 126, 234, 0.4); + border-radius: 0.35rem; + padding: 0.4rem; + margin-bottom: 0.5rem; +} +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-label { + display: flex; + align-items: center; + gap: 0.3rem; + font-size: 0.75rem; + font-weight: bold; + color: #4a5fc1; + margin-bottom: 0.35rem; +} +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-label i { + font-size: 0.75rem; +} +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-content { + display: flex; + align-items: center; + gap: 0.4rem; +} +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-content .card-thumbnail { + width: 40px; + height: 40px; + border-radius: 0.25rem; + border: 1px solid rgba(102, 126, 234, 0.5); + object-fit: cover; +} +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-content .card-info { + display: flex; + flex-direction: column; + gap: 0.25rem; +} +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-content .card-info .card-name { + font-weight: bold; + color: var(--color-text-dark-primary); +} +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-content .card-info .card-match { + display: flex; + align-items: center; + gap: 0.3rem; + font-size: 0.75rem; + font-style: italic; +} +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-content .card-info .card-match.match-success { + color: #2ecc71; +} +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-content .card-info .card-match.match-success i { + color: #2ecc71; +} +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-content .card-info .card-match.match-partial { + color: #f39c12; +} +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-content .card-info .card-match.match-partial i { + color: #f39c12; +} +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-content .card-info .card-match.match-atout { + color: #9b59b6; + font-weight: bold; +} +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-content .card-info .card-match.match-atout i { + color: #9b59b6; +} +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-content .card-info .card-match i { + font-size: 0.7rem; +} +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-content .card-info .valet-special-rule, +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-content .card-info .cavalier-special-rule, +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-content .card-info .reine-special-rule, +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-content .card-info .roi-special-rule { + display: flex; + align-items: center; + gap: 0.3rem; + font-size: 0.75rem; + font-weight: bold; + padding: 0.3rem 0.4rem; + border-radius: 0.25rem; + background: rgba(255, 193, 7, 0.15); + border-left: 3px solid #ffc107; + color: #856404; + margin-top: 0.2rem; +} +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-content .card-info .valet-special-rule i, +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-content .card-info .cavalier-special-rule i, +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-content .card-info .reine-special-rule i, +.fvtt-hamalron.competence-roll .competence-roll-body .card-used-section .card-used-content .card-info .roi-special-rule i { + font-size: 0.8rem; + color: #ffc107; +} +.fvtt-hamalron.competence-roll .competence-roll-body .calculation-section { + background: rgba(0, 0, 0, 0.05); + border-radius: 0.35rem; + padding: 0.4rem; + margin-bottom: 0.5rem; +} +.fvtt-hamalron.competence-roll .competence-roll-body .calculation-section .calculation-row { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.2rem 0; + font-size: 0.8rem; +} +.fvtt-hamalron.competence-roll .competence-roll-body .calculation-section .calculation-row .calc-label { + color: var(--color-text-dark-secondary); +} +.fvtt-hamalron.competence-roll .competence-roll-body .calculation-section .calculation-row .calc-value { + font-weight: bold; + font-size: 0.9rem; + color: var(--color-text-dark-primary); +} +.fvtt-hamalron.competence-roll .competence-roll-body .calculation-section .calculation-row .calc-value.calc-bonus { + color: #2ecc71; +} +.fvtt-hamalron.competence-roll .competence-roll-body .calculation-section .calculation-row .calc-value.calc-total { + font-size: 1.1rem; + color: #667eea; +} +.fvtt-hamalron.competence-roll .competence-roll-body .calculation-section .calculation-row.total-row { + padding-top: 0.3rem; +} +.fvtt-hamalron.competence-roll .competence-roll-body .calculation-section .calculation-divider { + height: 1px; + background: var(--color-border-dark); + margin: 0.4rem 0; +} +.fvtt-hamalron.competence-roll .competence-roll-body .difficulty-section .difficulty-info { + display: flex; + align-items: center; + gap: 0.4rem; + padding: 0.4rem; + background: rgba(0, 0, 0, 0.05); + border-radius: 0.35rem; + font-size: 0.8rem; +} +.fvtt-hamalron.competence-roll .competence-roll-body .difficulty-section .difficulty-info i { + color: #f39c12; +} +.fvtt-hamalron.competence-roll .competence-roll-body .difficulty-section .difficulty-info .difficulty-label { + color: var(--color-text-dark-primary); + font-weight: 500; +} +.fvtt-hamalron.competence-roll .competence-roll-body .difficulty-section .difficulty-info .difficulty-target { + margin-left: auto; + color: var(--color-text-dark-secondary); +} +.fvtt-hamalron.competence-roll .competence-roll-body .difficulty-section .difficulty-info .difficulty-target strong { + color: var(--color-text-dark-primary); + font-size: 1rem; +} +.fvtt-hamalron.competence-roll .competence-roll-footer { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.5rem; + font-size: 1.1rem; + font-weight: bold; + border-top: 2px solid #999; +} +.fvtt-hamalron.competence-roll .competence-roll-footer .automatic-success-banner { + display: flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + width: 100%; + padding: 0.5rem; + background: linear-gradient(135deg, #ffd700 0%, #ffed4e 100%); + color: #8b6914; + font-size: 0.95rem; + font-weight: bold; + text-transform: uppercase; + letter-spacing: 0.1em; + border-radius: 0.25rem; + box-shadow: 0 2px 8px rgba(255, 215, 0, 0.4); + animation: pulse-banner 2s ease-in-out infinite; +} +.fvtt-hamalron.competence-roll .competence-roll-footer .automatic-success-banner i { + color: #8b6914; + text-shadow: 0 0 5px rgba(255, 255, 255, 0.5); +} +.fvtt-hamalron.competence-roll .competence-roll-footer.result-success { + background: rgba(46, 204, 113, 0.2); + color: #2ecc71; +} +.fvtt-hamalron.competence-roll .competence-roll-footer.result-success .result-icon i { + color: #2ecc71; +} +.fvtt-hamalron.competence-roll .competence-roll-footer.result-failure { + background: rgba(234, 102, 102, 0.2); + color: #ea6666; +} +.fvtt-hamalron.competence-roll .competence-roll-footer.result-failure .result-icon i { + color: #ea6666; +} +.fvtt-hamalron.competence-roll .competence-roll-footer.gm-only-buttons { + background: rgba(102, 126, 234, 0.1); + padding: 0.75rem; +} +.fvtt-hamalron.competence-roll .competence-roll-footer.gm-only-buttons .special-rules-section { + background: rgba(255, 193, 7, 0.15); + border: 2px solid #ffc107; + border-radius: 0.35rem; + padding: 0.5rem; + margin-bottom: 0.75rem; +} +.fvtt-hamalron.competence-roll .competence-roll-footer.gm-only-buttons .special-rules-section .special-rule-item { + display: flex; + align-items: center; + gap: 0.4rem; + padding: 0.3rem 0; + font-weight: bold; + color: #856404; +} +.fvtt-hamalron.competence-roll .competence-roll-footer.gm-only-buttons .special-rules-section .special-rule-item:not(:last-child) { + border-bottom: 1px solid rgba(255, 193, 7, 0.3); + margin-bottom: 0.3rem; + padding-bottom: 0.4rem; +} +.fvtt-hamalron.competence-roll .competence-roll-footer.gm-only-buttons .special-rules-section .special-rule-item i { + font-size: 0.9rem; + color: #ffc107; +} +.fvtt-hamalron.competence-roll .competence-roll-footer.gm-only-buttons .special-rules-section .special-rule-item strong { + color: #6c5400; +} +.fvtt-hamalron.competence-roll .competence-roll-footer.gm-only-buttons .gm-buttons { + display: flex; + gap: 0.75rem; + width: 100%; +} +.fvtt-hamalron.competence-roll .competence-roll-footer.gm-only-buttons .gm-buttons button { + flex: 1; + padding: 0.5rem 1rem; + border: 2px solid #667eea; + border-radius: 0.35rem; + background: white; + color: #667eea; + font-weight: bold; + font-size: 0.9rem; + cursor: pointer; + transition: all 0.2s; + display: flex; + align-items: center; + justify-content: center; + gap: 0.5rem; +} +.fvtt-hamalron.competence-roll .competence-roll-footer.gm-only-buttons .gm-buttons button i { + font-size: 0.85rem; +} +.fvtt-hamalron.competence-roll .competence-roll-footer.gm-only-buttons .gm-buttons button:hover { + background: #667eea; + color: white; + transform: translateY(-1px); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); +} +.fvtt-hamalron.competence-roll .competence-roll-footer.gm-only-buttons .gm-buttons button.sous-tension-btn { + border-color: #f39c12; + color: #f39c12; +} +.fvtt-hamalron.competence-roll .competence-roll-footer.gm-only-buttons .gm-buttons button.sous-tension-btn:hover { + background: #f39c12; + color: white; +} +.fvtt-hamalron.competence-roll .competence-roll-footer.gm-only-buttons .gm-buttons button.oppose-btn { + border-color: #e74c3c; + color: #e74c3c; +} +.fvtt-hamalron.competence-roll .competence-roll-footer.gm-only-buttons .gm-buttons button.oppose-btn:hover { + background: #e74c3c; + color: white; +} +.fvtt-hamalron.competence-roll .competence-roll-footer .result-icon { + font-size: 1.2rem; +} +.fvtt-hamalron.competence-roll .competence-roll-footer .result-text { + text-transform: uppercase; + letter-spacing: 0.05em; +} +.fvtt-hamalron.hamalron-tarot-draw { + padding: 0.5rem; +} +.fvtt-hamalron.hamalron-tarot-draw .tarot-draw-header { margin-bottom: 1rem; } -.fvtt-hamalron .hamalron-tarot-draw .tarot-draw-header .tarot-draw-title { +.fvtt-hamalron.hamalron-tarot-draw .tarot-draw-header .tarot-draw-title { display: flex; align-items: center; gap: 0.5rem; @@ -2299,17 +2692,17 @@ i.fvtt-hamalron { font-size: 1.25rem; color: var(--color-text-dark-primary); } -.fvtt-hamalron .hamalron-tarot-draw .tarot-draw-header .tarot-draw-title i { +.fvtt-hamalron.hamalron-tarot-draw .tarot-draw-header .tarot-draw-title i { color: #667eea; } -.fvtt-hamalron .hamalron-tarot-draw .tarot-draw-content { +.fvtt-hamalron.hamalron-tarot-draw .tarot-draw-content { display: flex; gap: 1rem; } -.fvtt-hamalron .hamalron-tarot-draw .tarot-draw-content .tarot-card-image { +.fvtt-hamalron.hamalron-tarot-draw .tarot-draw-content .tarot-card-image { flex-shrink: 0; } -.fvtt-hamalron .hamalron-tarot-draw .tarot-draw-content .tarot-card-image img { +.fvtt-hamalron.hamalron-tarot-draw .tarot-draw-content .tarot-card-image img { width: 150px; height: 150px; object-fit: cover; @@ -2317,37 +2710,241 @@ i.fvtt-hamalron { border: 2px solid var(--color-border-dark); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); } -.fvtt-hamalron .hamalron-tarot-draw .tarot-draw-content .tarot-card-details { +.fvtt-hamalron.hamalron-tarot-draw .tarot-draw-content .tarot-card-details { flex: 1; display: flex; flex-direction: column; gap: 0.5rem; } -.fvtt-hamalron .hamalron-tarot-draw .tarot-draw-content .tarot-card-details .tarot-detail-row { +.fvtt-hamalron.hamalron-tarot-draw .tarot-draw-content .tarot-card-details .tarot-detail-row { display: flex; gap: 0.5rem; } -.fvtt-hamalron .hamalron-tarot-draw .tarot-draw-content .tarot-card-details .tarot-detail-row .detail-label { +.fvtt-hamalron.hamalron-tarot-draw .tarot-draw-content .tarot-card-details .tarot-detail-row .detail-label { font-weight: bold; color: var(--color-text-dark-secondary); } -.fvtt-hamalron .hamalron-tarot-draw .tarot-draw-content .tarot-card-details .tarot-detail-row .detail-value { +.fvtt-hamalron.hamalron-tarot-draw .tarot-draw-content .tarot-card-details .tarot-detail-row .detail-value { color: var(--color-text-dark-primary); } -.fvtt-hamalron .hamalron-tarot-draw .tarot-draw-content .tarot-card-details .tarot-description { +.fvtt-hamalron.hamalron-tarot-draw .tarot-draw-content .tarot-card-details .tarot-description { margin-top: 0.5rem; padding-top: 0.5rem; border-top: 1px solid var(--color-border-dark); } -.fvtt-hamalron .hamalron-tarot-draw .tarot-draw-content .tarot-card-details .tarot-description .description-label { +.fvtt-hamalron.hamalron-tarot-draw .tarot-draw-content .tarot-card-details .tarot-description .description-label { font-weight: bold; color: var(--color-text-dark-secondary); margin-bottom: 0.25rem; } -.fvtt-hamalron .hamalron-tarot-draw .tarot-draw-content .tarot-card-details .tarot-description .description-content { +.fvtt-hamalron.hamalron-tarot-draw .tarot-draw-content .tarot-card-details .tarot-description .description-content { color: var(--color-text-dark-primary); font-style: italic; } +.fvtt-hamalron.tarot-draw-chat { + background: #e8e8e8; + border: 2px solid #999; + border-radius: 0.5rem; + overflow: hidden; +} +.fvtt-hamalron.tarot-draw-chat .tarot-draw-header { + background: rgba(255, 255, 255, 0.5); + padding: 0.5rem; + border-bottom: 2px solid #999; +} +.fvtt-hamalron.tarot-draw-chat .tarot-draw-header .draw-info-compact { + display: flex; + align-items: center; + gap: 0.5rem; +} +.fvtt-hamalron.tarot-draw-chat .tarot-draw-header .draw-info-compact .card-thumbnail { + width: 60px; + height: 60px; + border-radius: 0.25rem; + object-fit: cover; + border: 2px solid #999; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); +} +.fvtt-hamalron.tarot-draw-chat .tarot-draw-header .draw-info-compact .card-details { + flex: 1; +} +.fvtt-hamalron.tarot-draw-chat .tarot-draw-header .draw-info-compact .card-details .card-name { + margin: 0 0 0.25rem 0; + font-size: 1rem; + font-weight: bold; + color: #333; +} +.fvtt-hamalron.tarot-draw-chat .tarot-draw-header .draw-info-compact .card-details .card-meta { + display: flex; + gap: 0.75rem; + flex-wrap: wrap; + font-size: 0.75rem; +} +.fvtt-hamalron.tarot-draw-chat .tarot-draw-header .draw-info-compact .card-details .card-meta .meta-item { + display: flex; + align-items: center; + gap: 0.25rem; + color: #666; +} +.fvtt-hamalron.tarot-draw-chat .tarot-draw-header .draw-info-compact .card-details .card-meta .meta-item i { + color: #999; +} +.fvtt-hamalron.tarot-draw-chat .tarot-draw-body { + padding: 0.5rem; +} +.fvtt-hamalron.tarot-draw-chat .tarot-draw-body .description-section .description-label { + display: flex; + align-items: center; + gap: 0.4rem; + font-size: 0.8rem; + font-weight: bold; + color: #666; + margin-bottom: 0.4rem; +} +.fvtt-hamalron.tarot-draw-chat .tarot-draw-body .description-section .description-label i { + color: #999; +} +.fvtt-hamalron.tarot-draw-chat .tarot-draw-body .description-section .description-content { + font-size: 0.85rem; + color: #555; + font-style: italic; + line-height: 1.4; + padding: 0.4rem; + background: rgba(255, 255, 255, 0.3); + border-radius: 0.25rem; + border-left: 3px solid #999; +} +.fvtt-hamalron.tarot-tension-chat { + background: #e8e8e8; + border: 2px solid #999; + border-radius: 0.5rem; + overflow: hidden; +} +.fvtt-hamalron.tarot-tension-chat .tarot-tension-header { + background: rgba(255, 165, 0, 0.2); + padding: 0.5rem; + border-bottom: 2px solid #f39c12; +} +.fvtt-hamalron.tarot-tension-chat .tarot-tension-header .tension-info-compact { + display: flex; + align-items: center; + gap: 0.5rem; +} +.fvtt-hamalron.tarot-tension-chat .tarot-tension-header .tension-info-compact .card-thumbnail { + width: 60px; + height: 60px; + border-radius: 0.25rem; + object-fit: cover; + border: 2px solid #f39c12; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); +} +.fvtt-hamalron.tarot-tension-chat .tarot-tension-header .tension-info-compact .card-details { + flex: 1; +} +.fvtt-hamalron.tarot-tension-chat .tarot-tension-header .tension-info-compact .card-details .card-name { + margin: 0 0 0.25rem 0; + font-size: 1rem; + font-weight: bold; + color: #333; +} +.fvtt-hamalron.tarot-tension-chat .tarot-tension-header .tension-info-compact .card-details .card-meta { + display: flex; + gap: 0.75rem; + flex-wrap: wrap; + font-size: 0.75rem; +} +.fvtt-hamalron.tarot-tension-chat .tarot-tension-header .tension-info-compact .card-details .card-meta .meta-item { + display: flex; + align-items: center; + gap: 0.25rem; + color: #666; +} +.fvtt-hamalron.tarot-tension-chat .tarot-tension-header .tension-info-compact .card-details .card-meta .meta-item i { + color: #f39c12; +} +.fvtt-hamalron.tarot-tension-chat .tarot-tension-body { + padding: 0.5rem; +} +.fvtt-hamalron.tarot-tension-chat .tarot-tension-body .difficulty-section { + margin-bottom: 0.75rem; + padding: 0.5rem; + background: rgba(243, 156, 18, 0.1); + border-left: 3px solid #f39c12; + border-radius: 0.25rem; +} +.fvtt-hamalron.tarot-tension-chat .tarot-tension-body .difficulty-section .difficulty-label { + display: flex; + align-items: center; + gap: 0.4rem; + font-size: 0.75rem; + font-weight: bold; + color: #666; + margin-bottom: 0.25rem; +} +.fvtt-hamalron.tarot-tension-chat .tarot-tension-body .difficulty-section .difficulty-label i { + color: #f39c12; +} +.fvtt-hamalron.tarot-tension-chat .tarot-tension-body .difficulty-section .difficulty-value { + font-size: 0.9rem; + font-weight: bold; + color: #333; +} +.fvtt-hamalron.tarot-tension-chat .tarot-tension-body .calculation-section .calculation-row { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.3rem 0.5rem; + margin-bottom: 0.25rem; + background: rgba(255, 255, 255, 0.3); + border-radius: 0.25rem; +} +.fvtt-hamalron.tarot-tension-chat .tarot-tension-body .calculation-section .calculation-row .calc-label { + font-size: 0.8rem; + color: #666; +} +.fvtt-hamalron.tarot-tension-chat .tarot-tension-body .calculation-section .calculation-row .calc-value { + font-size: 0.85rem; + font-weight: bold; + color: #333; +} +.fvtt-hamalron.tarot-tension-chat .tarot-tension-body .calculation-section .calculation-row .calc-value.positive { + color: #27ae60; +} +.fvtt-hamalron.tarot-tension-chat .tarot-tension-body .calculation-section .calculation-row .calc-value.negative { + color: #e74c3c; +} +.fvtt-hamalron.tarot-tension-chat .tarot-tension-body .calculation-section .calculation-total { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.5rem; + margin-top: 0.5rem; + background: rgba(243, 156, 18, 0.15); + border: 2px solid #f39c12; + border-radius: 0.25rem; +} +.fvtt-hamalron.tarot-tension-chat .tarot-tension-body .calculation-section .calculation-total .total-label { + font-size: 0.85rem; + font-weight: bold; + color: #666; + text-transform: uppercase; + letter-spacing: 0.05em; +} +.fvtt-hamalron.tarot-tension-chat .tarot-tension-body .calculation-section .calculation-total .total-value { + font-size: 1.25rem; + font-weight: bold; + color: #f39c12; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); +} +@keyframes pulse-banner { + 0%, + 100% { + box-shadow: 0 0 10px rgba(255, 215, 0, 0.5); + } + 50% { + box-shadow: 0 0 20px rgba(255, 215, 0, 0.8); + } +} .application.dialog.fvtt-hamalron { color: var(--color-dark-1); background-color: var(--color-light-1); @@ -2365,9 +2962,186 @@ i.fvtt-hamalron { color: var(--color-dark-2); } .fvtt-hamalron-roll-dialog fieldset { - padding: 10px; + padding: 6px; background-color: var(--color-light-1); } +.fvtt-hamalron-roll-dialog .dialog-info { + display: flex; + flex-direction: column; + gap: 0.5rem; + margin-bottom: 0; +} +.fvtt-hamalron-roll-dialog .dialog-info .actor-info { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.25rem 0.5rem; + background-color: rgba(0, 0, 0, 0.05); + border-radius: 0.25rem; +} +.fvtt-hamalron-roll-dialog .dialog-info .actor-info .actor-portrait { + width: 40px; + height: 40px; + border-radius: 50%; + border: 2px solid var(--color-dark-6); + object-fit: cover; +} +.fvtt-hamalron-roll-dialog .dialog-info .actor-info .actor-name { + font-family: var(--font-title); + font-size: calc(var(--font-size-standard) * 0.9); + font-weight: bold; + color: var(--color-dark-1); +} +.fvtt-hamalron-roll-dialog .dialog-info .competence-info { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.25rem 0.5rem; +} +.fvtt-hamalron-roll-dialog .dialog-info .competence-info h3 { + margin: 0; + font-family: var(--font-title); + font-size: calc(var(--font-size-standard) * 1); + color: var(--title-color); + white-space: nowrap; +} +.fvtt-hamalron-roll-dialog .dialog-info .competence-info .competence-details { + display: flex; + gap: 0.5rem; + font-size: calc(var(--font-size-standard) * 0.85); +} +.fvtt-hamalron-roll-dialog .dialog-info .competence-info .competence-details .competence-symbole, +.fvtt-hamalron-roll-dialog .dialog-info .competence-info .competence-details .competence-niveau { + padding: 0.25rem 0.5rem; + background-color: rgba(0, 0, 0, 0.1); + border-radius: 0.25rem; + font-weight: 500; +} +.fvtt-hamalron-roll-dialog .tarot-hand { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(70px, 1fr)); + gap: 0.5rem; + padding: 0.25rem; + min-height: 90px; +} +.fvtt-hamalron-roll-dialog .tarot-hand .tarot-card-select { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.15rem; + padding: 0.25rem; + border: 2px solid transparent; + border-radius: 0.35rem; + background-color: rgba(0, 0, 0, 0.05); + cursor: pointer; + transition: all 0.2s ease; + position: relative; +} +.fvtt-hamalron-roll-dialog .tarot-hand .tarot-card-select:hover { + background-color: rgba(0, 0, 0, 0.1); + border-color: var(--color-dark-5); + transform: translateY(-2px) scale(1.3); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3); + z-index: 10; +} +.fvtt-hamalron-roll-dialog .tarot-hand .tarot-card-select.selected { + background-color: rgba(100, 150, 255, 0.2); + border-color: var(--color-success); + box-shadow: 0 0 10px rgba(100, 150, 255, 0.5); +} +.fvtt-hamalron-roll-dialog .tarot-hand .tarot-card-select.success-card { + border: 3px solid #ffd700; + background: linear-gradient(135deg, rgba(255, 215, 0, 0.1) 0%, rgba(255, 223, 0, 0.2) 100%); + box-shadow: 0 0 15px rgba(255, 215, 0, 0.4); +} +.fvtt-hamalron-roll-dialog .tarot-hand .tarot-card-select.success-card:hover { + border-color: #ffed4e; + box-shadow: 0 6px 20px rgba(255, 215, 0, 0.6); +} +.fvtt-hamalron-roll-dialog .tarot-hand .tarot-card-select.success-card.selected { + border-color: #ffd700; + box-shadow: 0 0 20px rgba(255, 215, 0, 0.8); +} +.fvtt-hamalron-roll-dialog .tarot-hand .tarot-card-select .success-indicator { + position: absolute; + top: 2px; + right: 2px; + color: #ffd700; + font-size: 1rem; + text-shadow: 0 0 5px rgba(255, 215, 0, 0.8); + animation: pulse-gold 2s ease-in-out infinite; +} +.fvtt-hamalron-roll-dialog .tarot-hand .tarot-card-select img { + width: 50px; + height: auto; + border-radius: 0.25rem; + border: 1px solid var(--color-dark-6); +} +.fvtt-hamalron-roll-dialog .tarot-hand .tarot-card-select .card-name { + font-size: calc(var(--font-size-standard) * 0.75); + text-align: center; + line-height: 1.1; + max-width: 70px; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} +.fvtt-hamalron-roll-dialog .tarot-hand .tarot-card-select .card-values { + font-size: calc(var(--font-size-standard) * 0.7); + text-align: center; + color: var(--color-dark-3); + font-weight: bold; + margin-top: 0.1rem; +} +.fvtt-hamalron-roll-dialog .tarot-hand p { + grid-column: 1 / -1; + text-align: center; + color: var(--color-dark-5); + font-style: italic; + margin: 1rem 0; +} +.fvtt-hamalron-roll-dialog .dialog-result .total-display { + display: flex; + justify-content: center; + align-items: center; + gap: 0.1rem; + padding: 0.1rem; + font-family: var(--font-title); + font-size: calc(var(--font-size-standard) * 1.1); + font-weight: bold; +} +.fvtt-hamalron-roll-dialog .dialog-result .total-display #competence-modifier { + color: var(--color-dark-1); +} +.fvtt-hamalron-roll-dialog .dialog-result .total-display #card-value-display { + color: var(--color-success); +} +.fvtt-hamalron-roll-dialog .dialog-result .total-display #total-value { + padding: 0.1rem 0.2rem; + background-color: rgba(0, 0, 0, 0.1); + border-radius: 0.35rem; + color: var(--title-color); + min-width: 2.1rem; + text-align: center; +} +.fvtt-hamalron-roll-dialog .dialog-result .difficulty-info { + text-align: center; + font-size: calc(var(--font-size-standard) * 0.9); + color: var(--color-dark-2); + margin-top: 0.1rem; + padding: 0.1rem 0; +} +.fvtt-hamalron-roll-dialog .dialog-result .difficulty-info #target-score { + font-weight: bold; + color: var(--color-dark-1); +} +.fvtt-hamalron-roll-dialog .difficulty-select { + width: 100%; + text-align: center; + padding: 0.25rem; +} .dialog-modifier { display: flex; justify-content: center; @@ -2549,3 +3323,241 @@ i.fvtt-hamalron { font-size: calc(var(--font-size-standard) * 1.2); text-shadow: 0 0 10px var(--color-shadow-primary); } +@keyframes pulse-gold { + 0%, + 100% { + transform: scale(1); + opacity: 1; + } + 50% { + transform: scale(1.2); + opacity: 0.8; + } +} +.tarot-deck-manager .tarot-deck-manager-content { + padding: 1.5rem; + display: flex; + flex-direction: column; + gap: 1.5rem; + background: linear-gradient(135deg, rgba(102, 126, 234, 0.05) 0%, rgba(118, 75, 162, 0.05) 100%); + min-height: 100%; +} +.tarot-deck-manager .deck-header h2 { + margin: 0 0 0.75rem 0; + font-size: 1.25rem; + color: #667eea; + text-align: center; + border-bottom: 2px solid #667eea; + padding-bottom: 0.5rem; + text-transform: uppercase; + letter-spacing: 0.1em; + text-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); +} +.tarot-deck-manager .deck-header .deck-stats { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 0.5rem; + margin-top: 0.75rem; +} +.tarot-deck-manager .deck-header .deck-stats .stat-item { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.25rem; + padding: 0.5rem; + background: linear-gradient(135deg, rgba(102, 126, 234, 0.15) 0%, rgba(118, 75, 162, 0.15) 100%); + border-radius: 0.5rem; + border: 2px solid rgba(102, 126, 234, 0.3); + transition: all 0.3s ease; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); +} +.tarot-deck-manager .deck-header .deck-stats .stat-item:hover { + transform: translateY(-3px); + box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3); + border-color: rgba(102, 126, 234, 0.5); +} +.tarot-deck-manager .deck-header .deck-stats .stat-item i { + font-size: 1.25rem; + color: #667eea; + margin-bottom: 0.15rem; +} +.tarot-deck-manager .deck-header .deck-stats .stat-item .stat-label { + font-size: 0.7rem; + color: var(--color-text-dark-secondary); + text-transform: uppercase; + letter-spacing: 0.05em; + text-align: center; +} +.tarot-deck-manager .deck-header .deck-stats .stat-item .stat-value { + font-size: 1.25rem; + font-weight: bold; + color: #667eea; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); +} +.tarot-deck-manager .deck-actions { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 0.5rem; +} +.tarot-deck-manager .deck-actions .action-button { + display: flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + padding: 0.6rem 0.75rem; + font-size: 0.85rem; + font-weight: bold; + border: none; + border-radius: 0.5rem; + cursor: pointer; + transition: all 0.3s ease; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + text-transform: uppercase; + letter-spacing: 0.05em; +} +.tarot-deck-manager .deck-actions .action-button i { + font-size: 1.1rem; +} +.tarot-deck-manager .deck-actions .action-button:hover:not(:disabled) { + transform: translateY(-3px); + box-shadow: 0 6px 16px rgba(0, 0, 0, 0.25); +} +.tarot-deck-manager .deck-actions .action-button:active:not(:disabled) { + transform: translateY(-1px); +} +.tarot-deck-manager .deck-actions .action-button:disabled { + opacity: 0.4; + cursor: not-allowed; + filter: grayscale(50%); +} +.tarot-deck-manager .deck-actions .reset-button { + background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); + color: white; +} +.tarot-deck-manager .deck-actions .reset-button:hover:not(:disabled) { + background: linear-gradient(135deg, #c0392b 0%, #e74c3c 100%); +} +.tarot-deck-manager .deck-actions .collect-hands-button { + background: linear-gradient(135deg, #3498db 0%, #2980b9 100%); + color: white; +} +.tarot-deck-manager .deck-actions .collect-hands-button:hover:not(:disabled) { + background: linear-gradient(135deg, #2980b9 0%, #3498db 100%); +} +.tarot-deck-manager .deck-actions .distribute-cards-button { + background: linear-gradient(135deg, #2ecc71 0%, #27ae60 100%); + color: white; +} +.tarot-deck-manager .deck-actions .distribute-cards-button:hover:not(:disabled) { + background: linear-gradient(135deg, #27ae60 0%, #2ecc71 100%); +} +.tarot-deck-manager .deck-actions .shuffle-discard-button { + background: linear-gradient(135deg, #f39c12 0%, #e67e22 100%); + color: white; +} +.tarot-deck-manager .deck-actions .shuffle-discard-button:hover:not(:disabled) { + background: linear-gradient(135deg, #e67e22 0%, #f39c12 100%); +} +.tarot-deck-manager .deck-actions .draw-button { + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; +} +.tarot-deck-manager .deck-actions .draw-button:hover:not(:disabled) { + background: linear-gradient(135deg, #764ba2 0%, #667eea 100%); +} +.tarot-deck-manager .deck-actions .draw-tension-button { + background: linear-gradient(135deg, #f39c12 0%, #d35400 100%); + color: white; +} +.tarot-deck-manager .deck-actions .draw-tension-button:hover:not(:disabled) { + background: linear-gradient(135deg, #d35400 0%, #f39c12 100%); +} +.tarot-deck-manager .recent-draws h3 { + margin: 0 0 1rem 0; + font-size: 1.25rem; + color: var(--color-text-dark-primary); + padding-bottom: 0.5rem; + border-bottom: 1px solid var(--color-border-dark); +} +.tarot-deck-manager .recent-draws .drawn-cards-list { + display: flex; + flex-direction: column; + gap: 0.75rem; + max-height: 300px; + overflow-y: auto; +} +.tarot-deck-manager .recent-draws .drawn-cards-list .drawn-card { + display: flex; + gap: 1rem; + padding: 0.75rem; + background: rgba(0, 0, 0, 0.2); + border-radius: 0.25rem; + border: 1px solid var(--color-border-dark); + transition: all 0.2s ease; +} +.tarot-deck-manager .recent-draws .drawn-cards-list .drawn-card:hover { + background: rgba(0, 0, 0, 0.3); + border-color: var(--color-border-dark-tertiary); +} +.tarot-deck-manager .recent-draws .drawn-cards-list .drawn-card .card-image { + width: 60px; + height: 60px; + object-fit: cover; + border-radius: 0.25rem; + border: 1px solid var(--color-border-dark); +} +.tarot-deck-manager .recent-draws .drawn-cards-list .drawn-card .card-info { + flex: 1; + display: flex; + flex-direction: column; + justify-content: center; + gap: 0.25rem; +} +.tarot-deck-manager .recent-draws .drawn-cards-list .drawn-card .card-info .card-name { + margin: 0; + font-size: 1rem; + color: var(--color-text-light-heading); +} +.tarot-deck-manager .recent-draws .drawn-cards-list .drawn-card .card-info .card-details { + display: flex; + gap: 1rem; + font-size: 0.875rem; +} +.tarot-deck-manager .recent-draws .drawn-cards-list .drawn-card .card-info .card-details .card-symbole, +.tarot-deck-manager .recent-draws .drawn-cards-list .drawn-card .card-info .card-details .card-valeur { + color: var(--color-text-dark-secondary); +} +.tarot-deck-manager .no-draws { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 1rem; + padding: 3rem 1rem; + color: var(--color-text-dark-secondary); + text-align: center; +} +.tarot-deck-manager .no-draws i { + opacity: 0.3; +} +.tarot-deck-manager .no-draws p { + margin: 0; + font-style: italic; +} +.tarot-deck-manager .deck-empty-warning { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 1rem; + background: rgba(255, 165, 0, 0.1); + border: 1px solid rgba(255, 165, 0, 0.3); + border-radius: 0.25rem; + color: #ffa500; +} +.tarot-deck-manager .deck-empty-warning i { + font-size: 1.5rem; +} +.tarot-deck-manager .deck-empty-warning p { + margin: 0; + flex: 1; +} diff --git a/fvtt-hamalron.mjs b/fvtt-hamalron.mjs index 335e378..bf3bf6c 100644 --- a/fvtt-hamalron.mjs +++ b/fvtt-hamalron.mjs @@ -87,6 +87,15 @@ Hooks.once("init", function () { default: "", }) + game.settings.register("fvtt-hamalron", "tarotDeckState", { + name: "Tarot Deck State", + hint: "Stores the current state of the tarot deck and discard pile", + scope: "world", + config: false, + type: Object, + default: { deck: [], discard: [] }, + }) + // Activate socket handler game.socket.on(`system.${SYSTEM.id}`, handleSocketEvent) diff --git a/lang/fr.json b/lang/fr.json index c76de50..1fd6f29 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -1,4 +1,22 @@ { + "TYPES": { + "Actor": { + "personnage": "Personnage", + "PNJ": "PNJ" + }, + "Item": { + "arme": "Arme", + "armure": "Armure", + "competence": "Compétence", + "equipement": "Équipement", + "faction": "Faction", + "langue": "Langue", + "peuple": "Peuple", + "region": "Région", + "sortilege": "Sortilège", + "tarot": "Tarot" + } + }, "HAMALRON": { "Arme": { "FIELDS": { @@ -197,6 +215,12 @@ }, "type": { "label": "Type" + }, + "faction": { + "label": "Faction" + }, + "peuple": { + "label": "Peuple" } } }, @@ -337,7 +361,10 @@ } }, "Delete": "Supprimer", - "Dialog": {}, + "Dialog": { + "discardCardTitle": "Défausser la carte", + "discardCardContent": "Voulez-vous vraiment défausser {cardName} et tirer une nouvelle carte ?" + }, "Edit": "Éditer", "Enemy": { "FIELDS": { @@ -396,18 +423,23 @@ "appearance": "Apparence", "armor": "Armure", "armors": "Armures", + "automaticSuccess": "Réussite Automatique", "backstory": "Histoire", "biodata": "Données biologiques", "biography": "Biographie", "bonds": "Liens", "bonus": "Déclencheur XP droit", "capacity": "Capacité", + "cardBonus": "Bonus de carte", + "cardUsed": "Carte utilisée", "cards": "Cartes", "cargo": "Cargaison", "cartesSucces": "Cartes Succès", "character": "Personnage", "characteristics": "Caractéristiques", "combat": "Combat", + "competence": "Compétence", + "competenceModifier": "Modificateur de compétence", "competences": "Compétences", "creature": "Créature", "current": "Act.", @@ -416,12 +448,14 @@ "damages": "Dégâts", "deals": "Accords", "description": "Description", + "differentSymbol": "Symbole différent", "difficulty": "Difficulté", "dislikes": "N'aime pas", "dragTarotHere": "Glissez-déposez des cartes de tarot ici depuis le répertoire des objets", "equipment": "Équipement", "equipments": "Équipements", "experience": "Expérience", + "faction": "Faction", "failure": "Échec", "fears": "Peurs", "fiendishFailure": "Échec diabolique", @@ -436,8 +470,9 @@ "knowledge": "Connaissance", "languages": "Langues", "likes": "Aime", - "maleficas": "Maléfices", + "sortileges": "Sortilèges", "malus": "Malus", + "matchingSymbol": "Symbole correspondant", "max": "Max", "maximum": "Maximum", "mind": "Esprit", @@ -462,10 +497,17 @@ "newTarot": "Nouveau tarot", "newTrait": "Nouveau trait", "newWeapon": "Nouvelle arme", + "niveau": "Niveau", "noTarotCards": "Aucune carte de tarot", + "mustDiscardCard": "Vous devez éliminer une carte", + "discard": "Défausser", + "discardCard": "Défausser cette carte", + "discardAndDraw": "Défausser et tirer", + "drawCard": "Tirer une carte", "notes": "Notes", "penalty": "Déclencheur XP inversé", "perks": "Avantages", + "peuple": "Peuple", "physical": "Physique", "positiveEffect": "Effet positif", "progression": "Progression", @@ -476,6 +518,7 @@ "rollView": "Vue de jet", "satanicSuccess": "Succès satanique", "scars": "Cicatrices", + "selectTarotCard": "Sélectionnez une carte de tarot", "skill": "Compétence", "skillRoll": "Jet de compétence", "skills": "Compétences", @@ -490,17 +533,24 @@ "stats": "Stats", "status": "Statut", "stealth": "Furtivité", + "sousTension": "Sous tension", + "oppose": "Opposé", "success": "Succès", + "symbole": "Symbole", "talents": "Talents", "targetScore": "Score cible", "tarot": "Tarot", "tarotHand": "Main de tarot", "technology": "Technologie", + "tensionModifier": "Modificateur sous tension", + "titleCompetence": "Jet de compétence", "titleSkill": "Jet de compétence", "titleStat": "Boîte de dialogue de jet de caractéristique", "titleWeapon": "Jet d'arme", "total": "Total", "totalScore": "Score total", + "totalValue": "Valeur totale", + "cardValue": "Valeur de la carte", "traits": "Traits", "trauma": "Traumatisme", "unknown": "Inconnu", @@ -510,49 +560,19 @@ "vices": "Vices", "weapons": "Armes" }, - "Malefica": { - "FIELDS": { - "choiceMaintainDuration": { - "label": "Passif/Durée" - }, - "damage": { - "label": "Dégâts" - }, - "damageType": { - "label": "Type de dégâts" - }, - "description": { - "label": "Description" - }, - "domain": { - "label": "Domaine" - }, - "duration": { - "label": "Durée" - }, - "hasDamage": { - "label": "A des dégâts" - }, - "level": { - "label": "Niveau" - }, - "maintain": { - "label": "Passif" - }, - "range": { - "label": "Portée" - }, - "target": { - "label": "Cible" - }, - "time": { - "label": "Temps" - } - } - }, "Notifications": { "speciesTraitDeleted": "Trait d'espèce précédent supprimé : ", - "tarotDeleted": "Carte de Tarot précédente supprimée : " + "tarotDeleted": "Carte de Tarot précédente supprimée : ", + "tarotHandFull": "Vous avez déjà 8 cartes dans votre main. Vous devez en éliminer une avant d'en ajouter une autre.", + "cardDiscarded": "Carte défaussée : ", + "cardUsed": "Carte utilisée : ", + "newCardDrawn": "Nouvelle carte tirée : ", + "tarotCardAlreadyExists": "Cette carte existe déjà dans votre main : ", + "cannotDrawCard": "Vous avez déjà 7 cartes ou plus dans votre main.", + "deckManagerNotAvailable": "Le gestionnaire de deck n'est pas disponible.", + "deckEmpty": "Le deck est vide. Impossible de tirer une carte.", + "cardDiscardedAndDrawn": "Carte défaussée et nouvelle carte tirée : ", + "cardDiscardedNoNew": "Carte défaussée. Le deck est vide, aucune nouvelle carte n'a pu être tirée." }, "Sortilege": { "FIELDS": { @@ -585,26 +605,9 @@ "Roll": { "cancel": "Annuler", "roll": "Lancer", + "rollCompetence": "Jet de compétence", "skill": "Compétence" }, - "TYPES": { - "Actor": { - "personnage": "Personnage", - "PNJ": "PNJ" - }, - "Item": { - "arme": "Arme", - "armure": "Armure", - "competence": "Compétence", - "equipement": "Équipement", - "faction": "Faction", - "langue": "Langue", - "peuple": "Peuple", - "region": "Région", - "sortilege": "Sortilège", - "tarot": "Tarot" - } - }, "Tarot": { "FIELDS": { "bonus": { @@ -650,26 +653,55 @@ "valet": "Valet", "cavalier": "Cavalier", "reine": "Reine", - "roi": "Roi" + "roi": "Roi", + "lemat": "Le Mat", + "11": "Le Bateleur", + "12": "La Papesse", + "13": "L'Impératrice", + "14": "L'Empereur", + "15": "Le Pape", + "16": "L'Amoureux", + "17": "Le Chariot", + "18": "La Justice", + "19": "L'Ermite", + "20": "La Roue de Fortune", + "21": "La Force", + "22": "Le Pendu" } } }, "TarotDeck": { "CardsDrawn": "Cartes tirées", "CardsInDeck": "Cartes dans le jeu", + "CardsInDiscard": "Cartes dans la défausse", + "CollectHands": "Récupérer les mains", + "CollectHandsConfirm": "Récupérer toutes les mains ?", + "CollectHandsWarning": "Cela récupérera toutes les cartes de tarot de tous les personnages joueurs et les réintégrera dans le deck. Les doublons seront supprimés pour garantir un deck de 78 cartes.", + "HandsCollected": "{collected} cartes récupérées. Deck réinitialisé avec {deckSize} cartes uniques.", + "DistributeCards": "Distribuer 8 cartes", + "DistributeConfirm": "Distribuer les cartes ?", + "DistributeWarning": "Cela distribuera 8 cartes du deck à chaque joueur connecté.", + "CardsDistributed": "{cards} cartes distribuées à {players} joueur(s).", + "NotEnoughCards": "Pas assez de cartes dans le deck (minimum 8 requises).", "DeckEmpty": "Le jeu est vide", "DeckEmptyWarning": "Le jeu est vide. Veuillez réinitialiser le jeu pour continuer.", "DeckReset": "Le jeu a été réinitialisé et mélangé", + "DiscardShuffled": "La défausse a été mélangée dans le jeu", + "DrawCard": "Tirer une carte", "DrawFive": "Tirer 5 cartes", "DrawOne": "Tirer 1 carte", + "DrawTension": "Tirage sous tension", "DrawThree": "Tirer 3 cartes", "GMOnly": "Seul le MJ peut accéder au gestionnaire de jeu de tarot", "NoCardsFound": "Aucune carte de tarot trouvée dans le monde. Veuillez d'abord créer des objets tarot.", + "NoDiscard": "La défausse est vide", "NoDrawsYet": "Aucune carte tirée pour l'instant", "RecentDraws": "Cartes tirées récemment", "ResetConfirm": "Réinitialiser le jeu ?", "ResetDeck": "Réinitialiser le jeu", "ResetWarning": "Cela réinitialisera le jeu et mélangera toutes les cartes. L'historique des cartes tirées sera effacé.", + "SelectDifficulty": "Sélectionner la difficulté", + "ShuffleDiscard": "Mélanger la défausse", "Title": "Gestionnaire de jeu de tarot", "TotalCards": "Total des cartes" }, diff --git a/macro-import-competences.js b/macro-import-competences.js new file mode 100644 index 0000000..35849b2 --- /dev/null +++ b/macro-import-competences.js @@ -0,0 +1,105 @@ +/** + * Macro d'import des compétences depuis competences.json + * Crée un dossier "Compétences" et y importe toutes les compétences + */ + +async function importCompetences() { + // Charger le fichier JSON + const response = await fetch('systems/fvtt-hamalron/assets/data/competences.json'); + const competencesData = await response.json(); + + ui.notifications.info("Début de l'import des compétences..."); + + // Créer ou récupérer le dossier pour les compétences + let competencesFolder = game.folders.find(f => f.name === "Compétences" && f.type === "Item"); + + if (!competencesFolder) { + competencesFolder = await Folder.create({ + name: "Compétences", + type: "Item", + color: "#4169e1", + sorting: "a" + }); + console.log("Dossier 'Compétences' créé"); + } else { + console.log("Dossier 'Compétences' existant trouvé"); + } + + // Compteurs pour le résumé + let importCount = 0; + let updateCount = 0; + let errorCount = 0; + + ui.notifications.info(`Début de l'import de ${competencesData.length} compétences...`); + + // Parcourir toutes les compétences + for (const competenceJson of competencesData) { + try { + // Préparer les données de la compétence selon le modèle + const itemData = { + name: competenceJson.name, + type: 'competence', + system: { + description: competenceJson.description, + type: competenceJson.type, + carteSymbole: competenceJson.carteSymbole, + niveau: 'inexperimente', // Valeur par défaut + } + }; + + // Ajouter les champs optionnels s'ils existent + if (competenceJson.faction) { + itemData.system.faction = competenceJson.faction; + } + + if (competenceJson.peuple) { + itemData.system.peuple = competenceJson.peuple; + } + + // Vérifier si la compétence existe déjà + const existing = game.items.find(i => i.name === competenceJson.name && i.type === 'competence'); + + if (existing) { + // Mettre à jour la compétence existante + await existing.update(itemData); + updateCount++; + console.log(`Compétence mise à jour: ${competenceJson.name}`); + } else { + // Créer une nouvelle compétence dans le dossier + await Item.create({ + ...itemData, + folder: competencesFolder.id + }); + importCount++; + console.log(`✓ Créé: ${competenceJson.name}`); + } + + } catch (error) { + errorCount++; + console.error(`Erreur lors de l'import de ${competenceJson.name}:`, error); + } + } + + // Afficher le résumé + const message = ` +

Import des compétences terminé

+

Compétences créées: ${importCount}

+

Compétences mises à jour: ${updateCount}

+

Erreurs: ${errorCount}

+ `; + + ChatMessage.create({ + user: game.user.id, + content: message + }); + + ui.notifications.info(`Import terminé: ${importCount} créées, ${updateCount} mises à jour, ${errorCount} erreurs.`); + + console.log('=== Résumé de l\'import ==='); + console.log(`Compétences créées: ${importCount}`); + console.log(`Compétences mises à jour: ${updateCount}`); + console.log(`Erreurs: ${errorCount}`); +} + +// Exécuter l'import +importCompetences(); diff --git a/macro-import-factions.js b/macro-import-factions.js new file mode 100644 index 0000000..4048245 --- /dev/null +++ b/macro-import-factions.js @@ -0,0 +1,93 @@ +/** + * Macro d'import des factions depuis factions.json + * Crée un dossier "Factions" et y importe toutes les factions + */ + +async function importFactions() { + // Charger le fichier JSON + const response = await fetch('systems/fvtt-hamalron/assets/data/factions.json'); + const factionsData = await response.json(); + + ui.notifications.info("Début de l'import des factions..."); + + // Créer ou récupérer le dossier pour les factions + let factionsFolder = game.folders.find(f => f.name === "Factions" && f.type === "Item"); + + if (!factionsFolder) { + factionsFolder = await Folder.create({ + name: "Factions", + type: "Item", + color: "#8b0000", + sorting: "a" + }); + console.log("Dossier 'Factions' créé"); + } else { + console.log("Dossier 'Factions' existant trouvé"); + } + + // Compteurs pour le résumé + let importCount = 0; + let updateCount = 0; + let errorCount = 0; + + ui.notifications.info(`Début de l'import de ${factionsData.length} factions...`); + + // Parcourir toutes les factions + for (const factionJson of factionsData) { + try { + // Préparer les données de la faction selon le modèle + const itemData = { + name: factionJson.nom, + type: 'faction', + system: { + description: factionJson.description + } + }; + + // Vérifier si la faction existe déjà + const existing = game.items.find(i => i.name === factionJson.nom && i.type === 'faction'); + + if (existing) { + // Mettre à jour la faction existante + await existing.update(itemData); + updateCount++; + console.log(`Faction mise à jour: ${factionJson.nom}`); + } else { + // Créer une nouvelle faction dans le dossier + await Item.create({ + ...itemData, + folder: factionsFolder.id + }); + importCount++; + console.log(`✓ Créé: ${factionJson.nom}`); + } + + } catch (error) { + errorCount++; + console.error(`Erreur lors de l'import de ${factionJson.nom}:`, error); + } + } + + // Afficher le résumé + const message = ` +

Import des factions terminé

+

Factions créées: ${importCount}

+

Factions mises à jour: ${updateCount}

+

Erreurs: ${errorCount}

+ `; + + ChatMessage.create({ + user: game.user.id, + content: message + }); + + ui.notifications.info(`Import terminé: ${importCount} créées, ${updateCount} mises à jour, ${errorCount} erreurs.`); + + console.log('=== Résumé de l\'import ==='); + console.log(`Factions créées: ${importCount}`); + console.log(`Factions mises à jour: ${updateCount}`); + console.log(`Erreurs: ${errorCount}`); +} + +// Exécuter l'import +importFactions(); diff --git a/macro-import-peuples.js b/macro-import-peuples.js new file mode 100644 index 0000000..bbdf88a --- /dev/null +++ b/macro-import-peuples.js @@ -0,0 +1,93 @@ +/** + * Macro d'import des peuples depuis peuples.json + * Crée un dossier "Peuples" et y importe tous les peuples + */ + +async function importPeuples() { + // Charger le fichier JSON + const response = await fetch('systems/fvtt-hamalron/assets/data/peuples.json'); + const peuplesData = await response.json(); + + ui.notifications.info("Début de l'import des peuples..."); + + // Créer ou récupérer le dossier pour les peuples + let peuplesFolder = game.folders.find(f => f.name === "Peuples" && f.type === "Item"); + + if (!peuplesFolder) { + peuplesFolder = await Folder.create({ + name: "Peuples", + type: "Item", + color: "#228b22", + sorting: "a" + }); + console.log("Dossier 'Peuples' créé"); + } else { + console.log("Dossier 'Peuples' existant trouvé"); + } + + // Compteurs pour le résumé + let importCount = 0; + let updateCount = 0; + let errorCount = 0; + + ui.notifications.info(`Début de l'import de ${peuplesData.length} peuples...`); + + // Parcourir tous les peuples + for (const peupleJson of peuplesData) { + try { + // Préparer les données du peuple selon le modèle + const itemData = { + name: peupleJson.nom, + type: 'peuple', + system: { + description: peupleJson.description + } + }; + + // Vérifier si le peuple existe déjà + const existing = game.items.find(i => i.name === peupleJson.nom && i.type === 'peuple'); + + if (existing) { + // Mettre à jour le peuple existant + await existing.update(itemData); + updateCount++; + console.log(`Peuple mis à jour: ${peupleJson.nom}`); + } else { + // Créer un nouveau peuple dans le dossier + await Item.create({ + ...itemData, + folder: peuplesFolder.id + }); + importCount++; + console.log(`✓ Créé: ${peupleJson.nom}`); + } + + } catch (error) { + errorCount++; + console.error(`Erreur lors de l'import de ${peupleJson.nom}:`, error); + } + } + + // Afficher le résumé + const message = ` +

Import des peuples terminé

+

Peuples créés: ${importCount}

+

Peuples mis à jour: ${updateCount}

+

Erreurs: ${errorCount}

+ `; + + ChatMessage.create({ + user: game.user.id, + content: message + }); + + ui.notifications.info(`Import terminé: ${importCount} créés, ${updateCount} mis à jour, ${errorCount} erreurs.`); + + console.log('=== Résumé de l\'import ==='); + console.log(`Peuples créés: ${importCount}`); + console.log(`Peuples mis à jour: ${updateCount}`); + console.log(`Erreurs: ${errorCount}`); +} + +// Exécuter l'import +importPeuples(); diff --git a/module/applications/sheets/personnage-sheet.mjs b/module/applications/sheets/personnage-sheet.mjs index cf6a292..3ecff00 100644 --- a/module/applications/sheets/personnage-sheet.mjs +++ b/module/applications/sheets/personnage-sheet.mjs @@ -1,4 +1,5 @@ import HamalronActorSheet from "./base-actor-sheet.mjs" +import { SYSTEM } from "../../config/system.mjs" export default class HamalronPersonnageSheet extends HamalronActorSheet { /** @override */ @@ -20,6 +21,12 @@ export default class HamalronPersonnageSheet extends HamalronActorSheet { createRitual: HamalronPersonnageSheet.#onCreateRitual, createPerk: HamalronPersonnageSheet.#onCreatePerk, modifyAmmo: HamalronPersonnageSheet.#onModifyAmmo, + modifyResistance: HamalronPersonnageSheet.#onModifyResistance, + discardCard: HamalronPersonnageSheet.#onDiscardCard, + rollCompetence: HamalronPersonnageSheet.#onRollCompetence, + drawCard: HamalronPersonnageSheet.#onDrawCard, + selectCard: HamalronPersonnageSheet.#onSelectCard, + discardAndDraw: HamalronPersonnageSheet.#onDiscardAndDraw, }, } @@ -31,18 +38,18 @@ export default class HamalronPersonnageSheet extends HamalronActorSheet { tabs: { template: "templates/generic/tab-navigation.hbs", }, - status: { + competences: { template: "systems/fvtt-hamalron/templates/personnage-status.hbs", }, - maleficas: { + tarot: { + template: "systems/fvtt-hamalron/templates/personnage-tarot.hbs", + }, + sortileges: { template: "systems/fvtt-hamalron/templates/personnage-sortileges.hbs", }, equipment: { template: "systems/fvtt-hamalron/templates/personnage-equipement.hbs", }, - tarot: { - template: "systems/fvtt-hamalron/templates/personnage-tarot.hbs", - }, biography: { template: "systems/fvtt-hamalron/templates/personnage-biographie.hbs", }, @@ -50,7 +57,7 @@ export default class HamalronPersonnageSheet extends HamalronActorSheet { /** @override */ tabGroups = { - sheet: "status", + sheet: "competences", } /** @@ -59,10 +66,10 @@ export default class HamalronPersonnageSheet extends HamalronActorSheet { */ #getTabs() { const tabs = { - status: { id: "status", group: "sheet", icon: "fa-solid fa-compass", label: "HAMALRON.Label.status" }, - maleficas: { id: "maleficas", group: "sheet", icon: "fa-solid fa-compass", label: "HAMALRON.Label.maleficas" }, - equipment: { id: "equipment", group: "sheet", icon: "fa-solid fa-shapes", label: "HAMALRON.Label.equipment" }, + competences: { id: "competences", group: "sheet", icon: "fa-solid fa-list-check", label: "HAMALRON.Label.competences" }, tarot: { id: "tarot", group: "sheet", icon: "fa-solid fa-cards", label: "HAMALRON.Label.tarot" }, + sortileges: { id: "sortileges", group: "sheet", icon: "fa-solid fa-wand-magic-sparkles", label: "HAMALRON.Label.sortileges" }, + equipment: { id: "equipment", group: "sheet", icon: "fa-solid fa-shapes", label: "HAMALRON.Label.equipment" }, biography: { id: "biography", group: "sheet", icon: "fa-solid fa-book", label: "HAMALRON.Label.biography" }, } for (const v of Object.values(tabs)) { @@ -78,9 +85,6 @@ export default class HamalronPersonnageSheet extends HamalronActorSheet { context.tabs = this.#getTabs() const doc = this.document - context.trait = doc.itemTypes['species-trait']?.[0] - context.upright = doc.itemTypes.tarot.find(t => t.system.orientation === "Upright") - context.downright = doc.itemTypes.tarot.find(t => t.system.orientation === "Downright") return context } @@ -91,30 +95,36 @@ export default class HamalronPersonnageSheet extends HamalronActorSheet { context.systemFields = this.document.system.schema.fields switch (partId) { case "main": + // Get peuple and faction items (only one of each allowed) + context.peuple = doc.itemTypes.peuple?.[0] || null + context.faction = doc.itemTypes.faction?.[0] || null + context.isEditMode = this.isEditMode + context.isPlayMode = this.isPlayMode break - case "status": - context.tab = context.tabs.status - context.perks = doc.itemTypes.perk || [] - // Sort the perks by system.role and then by the system.level - context.perks.sort((a, b) => { - if (a.system.role === b.system.role) { - return a.system.level.localeCompare(b.system.level) - } - return a.system.role.localeCompare(b.system.role) + case "competences": + context.tab = context.tabs.competences + const allCompetences = doc.itemTypes.competence || [] + // Ajouter les données de niveau enrichies à chaque compétence + allCompetences.forEach(c => { + const niveauData = SYSTEM.NIVEAU_COMPETENCES[c.system.niveau] + c.niveauName = niveauData?.name || c.system.niveau + c.niveauModificateur = niveauData?.modificateur ?? 0 }) + // Grouper les compétences par type et trier par nom dans chaque groupe + context.competencesCommunes = allCompetences.filter(c => c.system.type === 'commune').sort((a, b) => a.name.localeCompare(b.name)) + context.competencesPeuple = allCompetences.filter(c => c.system.type === 'peuple').sort((a, b) => a.name.localeCompare(b.name)) + context.competencesFaction = allCompetences.filter(c => c.system.type === 'faction').sort((a, b) => a.name.localeCompare(b.name)) break; - case "maleficas": - context.tab = context.tabs.maleficas - context.maleficas = doc.itemTypes.malefica || [] - // Sort the maleficas by system.domain and then by the system.level - context.maleficas.sort((a, b) => { + case "sortileges": + context.tab = context.tabs.sortileges + context.sortileges = doc.itemTypes.sortilege || [] + // Sort the sortileges by system.domain and then by the system.level + context.sortileges.sort((a, b) => { if (a.system.domain === b.system.domain) { return a.system.level.localeCompare(b.system.level) } return a.system.domain.localeCompare(b.system.domain) }) - context.rituals = doc.itemTypes.ritual || [] - context.rituals.sort((a, b) => a.name.localeCompare(b.name)) break case "equipment": context.tab = context.tabs.equipment @@ -129,9 +139,23 @@ export default class HamalronPersonnageSheet extends HamalronActorSheet { context.tab = context.tabs.tarot context.tarotCards = doc.itemTypes.tarot || [] context.tarotCards.sort((a, b) => a.name.localeCompare(b.name)) - // Enrich descriptions for each tarot card + context.handLimit = 7 + context.handSize = context.tarotCards.length + context.isOverLimit = context.handSize > context.handLimit + context.canAddCard = context.handSize < 8 + // Marquer les cartes de succès et enrichir les descriptions for (const card of context.tarotCards) { card.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(card.system.description, { async: true }) + // Vérifier si c'est une carte de succès + if (doc.system.cartesSucces && card.system.type !== "atout") { + card.isSuccessCard = Object.keys(doc.system.cartesSucces).some(symbole => { + const successCardData = doc.system.cartesSucces[symbole] + return card.system.symbole === symbole && + card.system.valeur === successCardData.value.toString() + }) + } else { + card.isSuccessCard = false + } } break case "biography": @@ -196,6 +220,190 @@ export default class HamalronPersonnageSheet extends HamalronActorSheet { await item.update({ "system.ammoQuantity": newAmmo }) } + static async #onModifyResistance(event, target) { + const symbole = target.dataset.symbole + const delta = Number.parseInt(target.dataset.delta) + + if (!symbole || isNaN(delta)) { + console.warn(`HamalronPersonnageSheet: Invalid resistance modification parameters`) + return + } + + const resistance = this.document.system.resistances[symbole] + if (!resistance) { + console.warn(`HamalronPersonnageSheet: Resistance ${symbole} not found`) + return + } + + const newValue = Math.max(0, Math.min(resistance.max, resistance.value + delta)) + await this.document.update({ [`system.resistances.${symbole}.value`]: newValue }) + } + + static async #onDiscardCard(event, target) { + const itemId = $(event.target).data("item-id") + const item = this.document.items.get(itemId) + if (!item || item.type !== "tarot") { + console.warn(`HamalronPersonnageSheet: Tarot card with ID ${itemId} not found`) + return + } + + // Supprimer la carte du personnage + await item.delete() + ui.notifications.info(game.i18n.localize("HAMALRON.Notifications.cardDiscarded") + item.name) + } + + static async #onSelectCard(event, target) { + const cardWrapper = $(target).closest(".tarot-card-wrapper") + const wasSelected = cardWrapper.hasClass("selected") + + // Désélectionner toutes les cartes + $(".tarot-card-wrapper").removeClass("selected") + + // Sélectionner la carte cliquée si elle n'était pas déjà sélectionnée + if (!wasSelected) { + cardWrapper.addClass("selected") + } + } + + static async #onDiscardAndDraw(event, target) { + const itemId = $(target).data("item-id") + const item = this.document.items.get(itemId) + if (!item || item.type !== "tarot") { + console.warn(`HamalronPersonnageSheet: Tarot card with ID ${itemId} not found`) + return + } + + // Dialog de confirmation + const confirmed = await foundry.applications.api.DialogV2.confirm({ + window: { + title: game.i18n.localize("HAMALRON.Dialog.discardCardTitle"), + }, + content: `

${game.i18n.format("HAMALRON.Dialog.discardCardContent", { cardName: item.name })}

`, + rejectClose: false, + modal: true, + }) + + if (!confirmed) return + + // Récupérer le deck manager + const module = await import("../tarot-deck-manager.mjs") + const HamalronTarotDeckManager = module.default + + if (!HamalronTarotDeckManager._instance) { + HamalronTarotDeckManager._instance = new HamalronTarotDeckManager() + } + + const deckManager = HamalronTarotDeckManager._instance + + if (!deckManager) { + ui.notifications.warn(game.i18n.localize("HAMALRON.Notifications.deckManagerNotAvailable")) + return + } + + // Ajouter la carte à la défausse + deckManager.addToDiscard({ + id: item.id, + name: item.name, + img: item.img, + symbole: item.system.symbole, + valeur: item.system.valeur, + type: item.system.type, + description: item.system.description, + }) + + // Supprimer la carte du personnage + await item.delete() + + // Tirer une nouvelle carte si le deck n'est pas vide + if (deckManager.deck.length > 0) { + const newCards = deckManager.drawCards(1) + if (newCards.length > 0) { + const newCard = newCards[0] + + // Cas spécial : Le Mat + if (newCard.valeur === "lemat") { + console.log("Le Mat drawn! Executing special rules...") + const { default: HamalronTirageTarot } = await import("../../documents/tirage-tarot.mjs") + await HamalronTirageTarot.handleLeMatEffect(this.document, deckManager) + } else { + const originalItem = game.items.get(newCard.id) + if (originalItem) { + await this.document.createEmbeddedDocuments("Item", [originalItem.toObject()]) + ui.notifications.info(game.i18n.localize("HAMALRON.Notifications.cardDiscardedAndDrawn") + newCard.name) + } + } + } + } else { + ui.notifications.info(game.i18n.localize("HAMALRON.Notifications.cardDiscardedNoNew")) + } + + deckManager.saveDeckState() + deckManager.render() + } + + static async #onDrawCard(event, target) { + const currentTarotCount = this.document.items.filter(i => i.type === "tarot").length + + // Vérifier que le joueur a moins de 7 cartes + if (currentTarotCount >= 7) { + ui.notifications.warn(game.i18n.localize("HAMALRON.Notifications.cannotDrawCard")) + return + } + + // Récupérer le deck manager singleton + const module = await import("../tarot-deck-manager.mjs") + const HamalronTarotDeckManager = module.default + + // Vérifier si l'instance existe, sinon la créer + if (!HamalronTarotDeckManager._instance) { + HamalronTarotDeckManager._instance = new HamalronTarotDeckManager() + } + + const deckManager = HamalronTarotDeckManager._instance + + if (!deckManager) { + ui.notifications.warn(game.i18n.localize("HAMALRON.Notifications.deckManagerNotAvailable")) + return + } + + if (deckManager.deck.length === 0) { + ui.notifications.warn(game.i18n.localize("HAMALRON.Notifications.deckEmpty")) + return + } + + // Tirer une nouvelle carte + const newCards = deckManager.drawCards(1) + if (newCards.length > 0) { + const newCard = newCards[0] + + // Cas spécial : Le Mat + if (newCard.valeur === "lemat") { + console.log("Le Mat drawn! Executing special rules...") + const { default: HamalronTirageTarot } = await import("../../documents/tirage-tarot.mjs") + await HamalronTirageTarot.handleLeMatEffect(this.document, deckManager) + } else { + // Trouver l'item original pour le dupliquer + const originalItem = game.items.get(newCard.id) + if (originalItem) { + await this.document.createEmbeddedDocuments("Item", [originalItem.toObject()]) + ui.notifications.info(game.i18n.localize("HAMALRON.Notifications.newCardDrawn") + newCard.name) + } + } + deckManager.saveDeckState() + deckManager.render() + } + } + + static async #onRollCompetence(event, target) { + const itemId = $(target).data("item-id") + const item = this.document.items.get(itemId) + if (!item || item.type !== "competence") { + console.warn(`HamalronPersonnageSheet: Competence with ID ${itemId} not found`) + return + } + await this.document.system.roll("competence", item) + } + /** * Handles the roll action triggered by user interaction. * @@ -239,12 +447,19 @@ export default class HamalronPersonnageSheet extends HamalronActorSheet { if (data.type === "Item") { const item = await fromUuid(data.uuid) if (item.type === "tarot") { - // Delete the existing tarot item - const existingTarot = this.document.items.find(i => i.type === "tarot" && i.system.orientation === item.system.orientation) - if (existingTarot) { - await existingTarot.delete() - // Display info message - ui.notifications.info(game.i18n.localize("HAMALRON.Notifications.tarotDeleted") + existingTarot.name) + // Check if a card with the same name already exists + const existingCard = this.document.items.find(i => i.type === "tarot" && i.name === item.name) + if (existingCard) { + ui.notifications.warn(game.i18n.localize("HAMALRON.Notifications.tarotCardAlreadyExists") + item.name) + return + } + + const currentTarotCount = this.document.items.filter(i => i.type === "tarot").length + + // Check if we already have 8 cards (hard limit) + if (currentTarotCount >= 8) { + ui.notifications.warn(game.i18n.localize("HAMALRON.Notifications.tarotHandFull")) + return } } if (item.type === "species-trait") { diff --git a/module/applications/tarot-deck-manager.mjs b/module/applications/tarot-deck-manager.mjs index e08173b..d22c846 100644 --- a/module/applications/tarot-deck-manager.mjs +++ b/module/applications/tarot-deck-manager.mjs @@ -4,8 +4,8 @@ export default class HamalronTarotDeckManager extends HandlebarsApplicationMixin constructor(options = {}) { super(options) this.deck = [] - this.drawnCards = [] - this.resetDeck() + this.discard = [] + this.loadDeckState() } /** @override */ @@ -26,6 +26,10 @@ export default class HamalronTarotDeckManager extends HandlebarsApplicationMixin resetDeck: HamalronTarotDeckManager.#onResetDeck, drawCard: HamalronTarotDeckManager.#onDrawCard, drawMultiple: HamalronTarotDeckManager.#onDrawMultiple, + shuffleDiscard: HamalronTarotDeckManager.#onShuffleDiscard, + collectHands: HamalronTarotDeckManager.#onCollectHands, + distributeCards: HamalronTarotDeckManager.#onDistributeCards, + drawTension: HamalronTarotDeckManager.#onDrawTension, }, } @@ -36,12 +40,39 @@ export default class HamalronTarotDeckManager extends HandlebarsApplicationMixin }, } + /** + * Save the current deck state to settings + */ + async saveDeckState() { + const state = { + deck: this.deck, + discard: this.discard, + } + await game.settings.set("fvtt-hamalron", "tarotDeckState", state) + console.log("Deck state saved:", state) + } + + /** + * Load the deck state from settings + */ + loadDeckState() { + const state = game.settings.get("fvtt-hamalron", "tarotDeckState") + if (state && state.deck && state.deck.length > 0) { + this.deck = state.deck + this.discard = state.discard || [] + console.log("Deck state loaded:", state) + } else { + // Si aucun état sauvegardé, initialiser un nouveau deck + this.resetDeck() + } + } + /** * Reset the deck to a full tarot deck */ resetDeck() { this.deck = [] - this.drawnCards = [] + this.discard = [] // Créer toutes les cartes du jeu de tarot const items = game.items.filter(i => i.type === "tarot") @@ -63,6 +94,7 @@ export default class HamalronTarotDeckManager extends HandlebarsApplicationMixin // Mélanger le deck this.shuffleDeck() + this.saveDeckState() this.render() } @@ -90,7 +122,6 @@ export default class HamalronTarotDeckManager extends HandlebarsApplicationMixin const drawn = [] for (let i = 0; i < count && this.deck.length > 0; i++) { const card = this.deck.shift() - this.drawnCards.push(card) drawn.push(card) } @@ -130,10 +161,10 @@ export default class HamalronTarotDeckManager extends HandlebarsApplicationMixin const context = await super._prepareContext(options) context.deckCount = this.deck.length - context.drawnCount = this.drawnCards.length - context.totalCards = this.deck.length + this.drawnCards.length + context.discardCount = this.discard.length + context.totalCards = this.deck.length + this.discard.length context.hasCards = this.deck.length > 0 - context.drawnCards = this.drawnCards.slice(-5).reverse() // Show last 5 drawn cards + context.hasDiscard = this.discard.length > 0 return context } @@ -166,6 +197,9 @@ export default class HamalronTarotDeckManager extends HandlebarsApplicationMixin const cards = this.drawCards(1) if (cards.length > 0) { await this.sendCardsToChat(cards) + // Ajouter les cartes directement à la défausse + cards.forEach(card => this.addToDiscard(card)) + this.saveDeckState() this.render() } } @@ -180,10 +214,316 @@ export default class HamalronTarotDeckManager extends HandlebarsApplicationMixin const cards = this.drawCards(count) if (cards.length > 0) { await this.sendCardsToChat(cards) + // Ajouter les cartes directement à la défausse + cards.forEach(card => this.addToDiscard(card)) + this.saveDeckState() this.render() } } + /** + * Add a card to the discard pile + * @param {Object} card - Card to add to discard + */ + addToDiscard(card) { + // Vérifier que la carte n'est pas déjà dans la défausse + const cardExists = this.discard.some(c => c.id === card.id) + if (!cardExists) { + this.discard.push(card) + this.saveDeckState() + this.render() + } + } + + /** + * Collect all tarot cards from player characters and return them to the deck + * @param {Event} event + * @param {HTMLElement} target + */ + static async #onCollectHands(event, target) { + const confirmed = await foundry.applications.api.DialogV2.confirm({ + window: { title: game.i18n.localize("HAMALRON.TarotDeck.CollectHandsConfirm") }, + content: `

${game.i18n.localize("HAMALRON.TarotDeck.CollectHandsWarning")}

`, + rejectClose: false, + modal: true, + }) + + if (!confirmed) return + + let totalCollected = 0 + + // Récupérer tous les acteurs de type personnage (incluant tous, pas seulement ceux avec propriété joueur) + const playerCharacters = game.actors.filter(a => a.type === "personnage") + + console.log("Found characters:", playerCharacters.length) + + // Collecter toutes les cartes de tarot de tous les personnages + for (const actor of playerCharacters) { + const tarotCards = actor.items.filter(i => i.type === "tarot") + console.log(`Actor ${actor.name} has ${tarotCards.length} tarot cards`) + + if (tarotCards.length > 0) { + // Supprimer les cartes de l'acteur + const cardIds = tarotCards.map(c => c.id) + console.log(`Deleting ${cardIds.length} cards from ${actor.name}`) + await actor.deleteEmbeddedDocuments("Item", cardIds) + console.log(`Deleted cards from ${actor.name}`) + totalCollected += tarotCards.length + } + } + + // Réinitialiser le deck avec toutes les cartes de tarot disponibles + this.deck = [] + this.discard = [] + + const items = game.items.filter(i => i.type === "tarot") + + if (items.length > 0) { + // Créer un Map pour éviter les doublons (utiliser l'ID unique) + const uniqueCards = new Map() + + items.forEach(item => { + const key = `${item.system.symbole}_${item.system.valeur}_${item.system.type}` + if (!uniqueCards.has(key)) { + uniqueCards.set(key, { + id: item.id, + name: item.name, + img: item.img, + symbole: item.system.symbole, + valeur: item.system.valeur, + type: item.system.type, + description: item.system.description, + }) + } + }) + + this.deck = Array.from(uniqueCards.values()) + } + + // Mélanger le deck + this.shuffleDeck() + + this.saveDeckState() + + ui.notifications.info( + game.i18n.format("HAMALRON.TarotDeck.HandsCollected", { + collected: totalCollected, + deckSize: this.deck.length + }) + ) + + this.render() + } + + /** + * Distribute 8 cards to all connected players + * @param {Event} event + * @param {HTMLElement} target + */ + static async #onDistributeCards(event, target) { + if (this.deck.length < 8) { + ui.notifications.warn(game.i18n.localize("HAMALRON.TarotDeck.NotEnoughCards")) + return + } + + const confirmed = await foundry.applications.api.DialogV2.confirm({ + window: { title: game.i18n.localize("HAMALRON.TarotDeck.DistributeConfirm") }, + content: `

${game.i18n.localize("HAMALRON.TarotDeck.DistributeWarning")}

`, + rejectClose: false, + modal: true, + }) + + if (!confirmed) return + + let distributedCount = 0 + let playersCount = 0 + + // Récupérer tous les utilisateurs connectés (sauf le GM) + const connectedPlayers = game.users.filter(u => u.active && !u.isGM) + + for (const user of connectedPlayers) { + // Trouver le personnage du joueur (premier actor de type personnage dont il est propriétaire) + const playerCharacter = game.actors.find(a => + a.type === "personnage" && + a.testUserPermission(user, "OWNER") + ) + + if (playerCharacter) { + // Tirer 8 cartes pour ce personnage + const cardsToDistribute = [] + for (let i = 0; i < 8 && this.deck.length > 0; i++) { + const card = this.deck.shift() + cardsToDistribute.push(card) + } + + // Créer les items sur l'acteur + for (const card of cardsToDistribute) { + const originalItem = game.items.get(card.id) + if (originalItem) { + await playerCharacter.createEmbeddedDocuments("Item", [originalItem.toObject()]) + distributedCount++ + + // Cas spécial : Le Mat + if (card.valeur === "lemat") { + console.log(`Le Mat distributed to ${playerCharacter.name}! Executing special rules...`) + // Import de TirageTarot pour accéder à la fonction helper + const { default: HamalronTirageTarot } = await import("../documents/tirage-tarot.mjs") + await HamalronTirageTarot.handleLeMatEffect(playerCharacter, this) + } + } + } + + playersCount++ + } + } + + this.saveDeckState() + + ui.notifications.info( + game.i18n.format("HAMALRON.TarotDeck.CardsDistributed", { + cards: distributedCount, + players: playersCount + }) + ) + + this.render() + } + + /** + * Shuffle discard pile back into deck + * @param {Event} event + * @param {HTMLElement} target + */ + static async #onShuffleDiscard(event, target) { + if (this.discard.length === 0) { + ui.notifications.warn(game.i18n.localize("HAMALRON.TarotDeck.NoDiscard")) + return + } + + // Ajouter toutes les cartes de la défausse au deck + this.deck.push(...this.discard) + this.discard = [] + + // Mélanger le deck + this.shuffleDeck() + + this.saveDeckState() + + ui.notifications.info(game.i18n.localize("HAMALRON.TarotDeck.DiscardShuffled")) + this.render() + } + + /** + * Handle draw tension action + * @param {Event} event + * @param {HTMLElement} target + */ + static async #onDrawTension(event, target) { + // Import system config + const { DIFFICULTY_CHOICES } = await import('../config/system.mjs') + + // Créer les options de difficulté + const difficulties = Object.entries(DIFFICULTY_CHOICES) + .filter(([key]) => key !== 'soustension_oppose') + .map(([key, value]) => ({ + value: key, + label: value.label + })) + + // Créer le contenu HTML du dialogue + const selectOptions = difficulties.map(d => + `` + ).join('') + + const content = ` +
+ + +
+ ` + + // Afficher le dialogue + const result = await foundry.applications.api.DialogV2.wait({ + window: { title: game.i18n.localize("HAMALRON.TarotDeck.SelectDifficulty") }, + content: content, + buttons: [ + { + action: "draw", + label: game.i18n.localize("HAMALRON.TarotDeck.DrawCard"), + default: true, + callback: (event, button, dialog) => { + const select = button.form.elements["tension-difficulty"] + return select.value + } + }, + { + action: "cancel", + label: game.i18n.localize("Cancel") + } + ], + rejectClose: false, + modal: true + }) + + if (!result) return + + // Tirer une carte + const cards = this.drawCards(1) + if (cards.length === 0) return + + const card = cards[0] + const difficultyKey = result + const difficulty = DIFFICULTY_CHOICES[difficultyKey] + + // Récupérer la valeur numérique de la carte + const { TAROT_VALEURS } = await import('../config/system.mjs') + const cardValue = TAROT_VALEURS[card.valeur]?.value || 0 + const tensionBonus = difficulty.soustension || 0 + const totalScore = cardValue + tensionBonus + + // Afficher dans le chat + await this.sendTensionDrawToChat(card, difficulty, cardValue, tensionBonus, totalScore) + + // Ajouter à la défausse + this.addToDiscard(card) + this.saveDeckState() + this.render() + } + + /** + * Send tension draw to chat + * @param {Object} card - The drawn card + * @param {Object} difficulty - The selected difficulty + * @param {number} cardValue - Card numeric value + * @param {number} tensionBonus - Tension modifier + * @param {number} totalScore - Total score + */ + async sendTensionDrawToChat(card, difficulty, cardValue, tensionBonus, totalScore) { + const speaker = ChatMessage.getSpeaker({ alias: "Maître du Jeu" }) + + const content = await foundry.applications.handlebars.renderTemplate( + "systems/fvtt-hamalron/templates/chat-tarot-tension.hbs", + { + card: card, + symboleLabel: game.i18n.localize(`HAMALRON.Tarot.FIELDS.symbole.${card.symbole}`), + valeurLabel: game.i18n.localize(`HAMALRON.Tarot.FIELDS.valeur.${card.valeur}`), + typeLabel: game.i18n.localize(`HAMALRON.Tarot.FIELDS.type.${card.type}`), + difficulty: difficulty, + cardValue: cardValue, + tensionBonus: tensionBonus, + totalScore: totalScore + } + ) + + await ChatMessage.create({ + speaker: speaker, + content: content, + type: CONST.CHAT_MESSAGE_TYPES.OTHER, + }) + } + /** * Open the Tarot Deck Manager application * @returns {HamalronTarotDeckManager} diff --git a/module/config/system.mjs b/module/config/system.mjs index 4d21e30..6bb6d5c 100644 --- a/module/config/system.mjs +++ b/module/config/system.mjs @@ -23,10 +23,23 @@ export const TAROT_TYPES = { } export const TAROT_VALEURS = { + "11": { id: "11", label: "11", value: 11 }, + "12": { id: "12", label: "12", value: 12 }, + "13": { id: "13", label: "13", value: 13 }, + "14": { id: "14", label: "14", value: 14 }, + "15": { id: "15", label: "15", value: 15 }, + "16": { id: "16", label: "16", value: 16 }, + "17": { id: "17", label: "17", value: 17 }, + "18": { id: "18", label: "18", value: 18 }, + "19": { id: "19", label: "19", value: 19 }, + "20": { id: "20", label: "20", value: 20 }, + "21": { id: "21", label: "21", value: 21 }, + "22": { id: "22", label: "22", value: 22 }, "roi": { id: "roi", label: "Roi", value: 14 }, "reine": { id: "reine", label: "Reine", value: 13 }, "cavalier": { id: "cavalier", label: "Cavalier", value: 12 }, "valet": { id: "valet", label: "Valet", value: 11 }, + "lemat": { id: "lemat", label: "Le Mat", value: 23 }, "10": { id: "10", label: "10", value: 10 }, "9": { id: "9", label: "9", value: 9 }, "8": { id: "8", label: "8", value: 8 }, @@ -40,6 +53,7 @@ export const TAROT_VALEURS = { } export const DIFFICULTY_CHOICES = { + "soustension_oppose": { id: "soustension_oppose", label: "Sous Tension ou Opposé", standard: null, "soustension": null }, "tresfacile": { id: "tresfacile", label: "Très Facile", standard: 3, "soustension": -4 }, "facile": { id: "facile", label: "Facile", standard: 5, "soustension": -2 }, "moyenne": { id: "moyenne", label: "Moyenne", standard: 7, "soustension": 0 }, @@ -54,7 +68,7 @@ export const WEAPON_TYPES = { } export const COMPETENCE_TYPES = { - "generale": { id: "generale", label: "Générale" }, + "commune": { id: "commune", label: "Commune" }, "faction": { id: "faction", label: "Faction" }, "peuple": { id: "peuple", label: "Peuple" }, } @@ -70,6 +84,42 @@ export const SORTILEGE_CATEGORIES = { "ritual": { id: "ritual", label: "Rituel" }, } +export const NIVEAU_COMPETENCES = { + "inexperimente": { + "name": "Inexpérimenté", + "id": "inexperimente", + "abreviation": "I", + "modificateur": 0, + "cout_acquisition_points": 0, + "description": "Niveau de départ par défaut pour toutes les compétences non apprises." + }, + "amateur": { + "name": "Amateur", + "id": "amateur", + "abreviation": "A", + "modificateur": 1, + "cout_acquisition_points": 1, + "description": "Le personnage possède des notions de base dans la compétence." + }, + "competent": { + "name": "Compétent", + "id": "competent", + "abreviation": "C", + "modificateur": 3, + "cout_acquisition_points": 3, + "cout_progression_depuis_amateur": 2, + "description": "Le personnage maîtrise la compétence et résiste mieux aux actions adverses." + }, + "expert": { + "name": "Expert", + "abreviation": "E", + "modificateur": 5, + "cout_acquisition_points": 5, + "cout_progression_depuis_competent": 2, + "description": "Le personnage est un maître absolu dans son domaine." + } +} + /** * Include all constant definitions within the SYSTEM global export * @type {Object} @@ -84,5 +134,6 @@ export const SYSTEM = { COMPETENCE_TYPES: COMPETENCE_TYPES, ENEMY_TYPES: ENEMY_TYPES, SORTILEGE_CATEGORIES: SORTILEGE_CATEGORIES, + NIVEAU_COMPETENCES: NIVEAU_COMPETENCES, ASCII } diff --git a/module/documents/item.mjs b/module/documents/item.mjs index 0f94704..eb644e1 100644 --- a/module/documents/item.mjs +++ b/module/documents/item.mjs @@ -1,14 +1,14 @@ export const defaultItemImg = { - arme: "systems/fvtt-hamalron/assets/icons/arme.webp", - armure: "systems/fvtt-hamalron/assets/icons/armure.webp", - competence: "systems/fvtt-hamalron/assets/icons/competence.webp", - equipement: "systems/fvtt-hamalron/assets/icons/equipement.webp", - faction: "systems/fvtt-hamalron/assets/icons/faction.webp", - langue: "systems/fvtt-hamalron/assets/icons/langue.webp", - peuple: "systems/fvtt-hamalron/assets/icons/peuple.webp", - region: "systems/fvtt-hamalron/assets/icons/region.webp", - sortilege: "systems/fvtt-hamalron/assets/icons/sortilege.webp", - tarot: "systems/fvtt-hamalron/assets/icons/tarot.webp", + arme: "systems/fvtt-hamalron/assets/icons/arme.svg", + armure: "systems/fvtt-hamalron/assets/icons/armure.svg", + competence: "systems/fvtt-hamalron/assets/icons/competence.svg", + equipement: "systems/fvtt-hamalron/assets/icons/equipement.svg", + faction: "systems/fvtt-hamalron/assets/icons/faction.svg", + langue: "systems/fvtt-hamalron/assets/icons/langue.svg", + peuple: "systems/fvtt-hamalron/assets/icons/peuple.svg", + region: "systems/fvtt-hamalron/assets/icons/region.svg", + sortilege: "systems/fvtt-hamalron/assets/icons/sortilege.svg", + tarot: "systems/fvtt-hamalron/assets/icons/tarot.svg", } export default class HamalronItem extends Item { diff --git a/module/documents/tirage-tarot.mjs b/module/documents/tirage-tarot.mjs index ea5cf6c..e419a00 100644 --- a/module/documents/tirage-tarot.mjs +++ b/module/documents/tirage-tarot.mjs @@ -8,6 +8,57 @@ export default class HamalronTirageTarot { */ static CHAT_TEMPLATE = "systems/fvtt-hamalron/templates/chat-message.hbs" + /** + * Handle Le Mat special effect when distributed to a player + * @param {Actor} actor - The actor who received Le Mat + * @param {HamalronTarotDeckManager} deckManager - The deck manager instance + */ + static async handleLeMatEffect(actor, deckManager) { + // 1. Défausser toutes les cartes du joueur + const allTarotCards = actor.items.filter(i => i.type === "tarot") + if (allTarotCards.length > 0) { + const cardIds = allTarotCards.map(c => c.id) + await actor.deleteEmbeddedDocuments("Item", cardIds) + console.log(`Discarded ${cardIds.length} cards from player`) + + // Ajouter toutes les cartes à la défausse + for (const card of allTarotCards) { + deckManager.addToDiscard({ + id: card.id, + name: card.name, + img: card.img, + symbole: card.system.symbole, + valeur: card.system.valeur, + type: card.system.type, + description: card.system.description, + }) + } + } + + // 2. Tirer 7 nouvelles cartes pour le joueur + for (let i = 0; i < 7; i++) { + if (deckManager.deck.length > 0) { + const newCards = deckManager.drawCards(1) + if (newCards.length > 0) { + const newCard = newCards[0] + const originalItem = game.items.get(newCard.id) + if (originalItem) { + await actor.createEmbeddedDocuments("Item", [originalItem.toObject()]) + } + } + } + } + + // 3. Regrouper la défausse et le deck, puis mélanger + deckManager.deck.push(...deckManager.discard) + deckManager.discard = [] + deckManager.shuffleDeck() + + await deckManager.saveDeckState() + deckManager.render() + ui.notifications.info(`Le Mat ! Toutes vos cartes ont été défaussées et vous recevez 7 nouvelles cartes. Le deck a été mélangé.`) + } + static async prompt(options = {}) { let formula = `3D6 + 0D6KH - 0D6KH + ${options?.rollItem?.value}` @@ -15,6 +66,34 @@ export default class HamalronTirageTarot { switch (options.rollType) { case "stat": break + case "competence": + { + // Récupérer les cartes de tarot du personnage + options.tarotCards = actor.items.filter(i => i.type === "tarot") + // Récupérer le modificateur de compétence depuis NIVEAU_COMPETENCES + const niveauData = SYSTEM.NIVEAU_COMPETENCES[options.rollItem.system.niveau] + options.competenceModifier = niveauData ? niveauData.modificateur : 0 + + // Marquer les cartes de succès + if (options.tarotCards && actor.system.cartesSucces) { + options.tarotCards = options.tarotCards.map(card => { + const isSuccessCard = card.system.type !== "atout" && Object.keys(actor.system.cartesSucces).some(symbole => { + const successCardData = actor.system.cartesSucces[symbole] + return card.system.symbole === symbole && + card.system.valeur === successCardData.value.toString() + }) + // Créer un objet simple avec toutes les propriétés nécessaires + return { + id: card.id, + name: card.name, + img: card.img, + system: card.system, + isSuccessCard: isSuccessCard + } + }) + } + } + break case "damage": { let formula = options.rollItem.system.damage @@ -56,6 +135,7 @@ export default class HamalronTirageTarot { let dialogContext = { actorId: options.actorId, actorName: options.actorName, + actorImage: options.actorImage, rollType: options.rollType, rollItem: foundry.utils.duplicate(options.rollItem), // Object only, no class weapon: options?.weapon, @@ -69,23 +149,45 @@ export default class HamalronTirageTarot { difficulty: "0", nbAdvantages: "0", nbDisadvantages: "0", + tarotCards: options.tarotCards || [], + competenceModifier: options.competenceModifier || 0, + difficultyChoices: Object.fromEntries(Object.entries(SYSTEM.DIFFICULTY_CHOICES).map(([key, val]) => [key, val.label])), } const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-hamalron/templates/roll-dialog.hbs", dialogContext) - const title = HamalronRoll.createTitle(options.rollType, options.rollTarget) + const title = HamalronTirageTarot.createTitle(options.rollType, options.rollTarget) const label = game.i18n.localize("HAMALRON.Roll.roll") + const cancelLabel = game.i18n.localize("HAMALRON.Roll.cancel") const rollContext = await foundry.applications.api.DialogV2.wait({ window: { title: title }, classes: ["fvtt-hamalron"], + position: { width: 420 }, content, buttons: [ { + action: "cancel", + label: cancelLabel, + default: false, + }, + { + action: "roll", label: label, + default: true, + disabled: options.rollType === "competence", callback: (event, button, dialog) => { const output = Array.from(button.form.elements).reduce((obj, input) => { if (input.name) obj[input.name] = input.value return obj }, {}) + // Ajouter les données de sélection de carte pour les compétences + if (options.rollType === "competence") { + console.log("DEBUG CALLBACK: options.selectedCardId =", options.selectedCardId, "options.selectedCardValue =", options.selectedCardValue) + output.selectedCardId = options.selectedCardId + output.selectedCardValue = options.selectedCardValue + output.selectedDifficulty = options.selectedDifficulty + output.targetScore = options.targetScore + console.log("DEBUG CALLBACK: output =", output) + } return output }, }, @@ -96,11 +198,11 @@ export default class HamalronTirageTarot { render: (event, dialog) => { $(".roll-stat-advantages").change(event => { options.nbAdvantages = Number(event.target.value) - HamalronRoll.updateFullFormula(options) + HamalronTirageTarot.updateFullFormula(options) }) $(".roll-stat-disadvantages").change(event => { options.nbDisadvantages = Number(event.target.value) - HamalronRoll.updateFullFormula(options) + HamalronTirageTarot.updateFullFormula(options) }) $(".select-combat-option").change(event => { let field = $(event.target).data("field") @@ -110,14 +212,302 @@ export default class HamalronTirageTarot { } else { options.numericModifier -= modifier } - HamalronRoll.updateFullFormula(options) + HamalronTirageTarot.updateFullFormula(options) }) + + // Gestion de la sélection de carte pour les compétences + if (options.rollType === "competence") { + let selectedCardId = null + options.selectedDifficulty = "soustension_oppose" + options.targetScore = null + + // Calculer et afficher les valeurs pour chaque carte + const competenceSymbole = options.rollItem.system.carteSymbole + $(".tarot-card-select").each(function () { + const cardSymbole = $(this).data("card-symbole") + const cardValeur = $(this).data("card-valeur") + const cardType = $(this).data("card-type") + + const valeurData = SYSTEM.TAROT_VALEURS[cardValeur] + const baseValue = valeurData ? valeurData.value : 0 + + let calculatedValue = 0 + if (cardType === "atout") { + calculatedValue = baseValue + } else if (cardSymbole === competenceSymbole) { + calculatedValue = baseValue + } else { + calculatedValue = Math.ceil(baseValue / 2) + } + + $(this).find(".card-values").text(`${baseValue} → ${calculatedValue}`) + }) + + // Gestion du changement de difficulté + $(".difficulty-select").change(function () { + const difficultyKey = $(this).val() + options.selectedDifficulty = difficultyKey + const difficultyData = SYSTEM.DIFFICULTY_CHOICES[difficultyKey] + + if (difficultyData.standard === null) { + // Sous tension ou opposé - pas de score cible + options.targetScore = null + $("#target-score").text("-") + } else { + options.targetScore = difficultyData.standard + $("#target-score").text(options.targetScore) + } + }) + + $(".tarot-card-select").click(function () { + // Désélectionner toutes les cartes + $(".tarot-card-select").removeClass("selected") + // Sélectionner la carte cliquée + $(this).addClass("selected") + + selectedCardId = $(this).data("card-id") + console.log("DEBUG CLICK: selectedCardId =", selectedCardId) + const cardSymbole = $(this).data("card-symbole") + const cardValeur = $(this).data("card-valeur") + const cardType = $(this).data("card-type") + + // Calculer la valeur de la carte + const competenceSymbole = options.rollItem.system.carteSymbole + let cardValue = 0 + + // Récupérer la valeur numérique de la carte depuis TAROT_VALEURS + const valeurData = SYSTEM.TAROT_VALEURS[cardValeur] + const baseValue = valeurData ? valeurData.value : 0 + + if (cardType === "atout") { + // Si c'est un atout, prendre directement la valeur + cardValue = baseValue + } else if (cardSymbole === competenceSymbole) { + // Si le symbole correspond, prendre la valeur complète + cardValue = baseValue + } else { + // Sinon, diviser par 2 arrondi au supérieur + cardValue = Math.ceil(baseValue / 2) + } + + // Stocker la carte sélectionnée et sa valeur calculée + options.selectedCardId = selectedCardId + options.selectedCardValue = cardValue + console.log("DEBUG CLICK END: options.selectedCardId =", options.selectedCardId, "options.selectedCardValue =", options.selectedCardValue) + + // Mettre à jour l'affichage + $("#card-value-display").text(`+ ${cardValue}`) + $("#total-value").text(options.competenceModifier + cardValue) + + // Activer le bouton de lancement + $("button[data-action='roll']").prop("disabled", false) + }) + + // Permettre de désélectionner en cliquant à nouveau + $(".tarot-card-select").dblclick(function () { + $(this).removeClass("selected") + options.selectedCardId = null + options.selectedCardValue = 0 + $("#card-value-display").text("+ 0") + $("#total-value").text(options.competenceModifier) + + // Désactiver le bouton de lancement + $("button[data-action='roll']").prop("disabled", true) + }) + } } }) // If the user cancels the dialog, exit if (rollContext === null) return + // Fusionner les données du dialogue dans options + Object.assign(options, rollContext) + + // Gestion spéciale pour les compétences (pas de dés) + if (options.rollType === "competence") { + const totalValue = options.competenceModifier + (options.selectedCardValue || 0) + + // Récupérer la carte sélectionnée si elle existe + let selectedCard = null + let cardSymboleMatch = false + let isAutomaticSuccess = false + + if (options.selectedCardId) { + selectedCard = actor.items.get(options.selectedCardId) + if (selectedCard) { + cardSymboleMatch = selectedCard.system.symbole === options.rollItem.system.carteSymbole + + // Vérifier si c'est une carte de succès (les atouts ne peuvent jamais être des cartes de succès) + if (actor.system.cartesSucces && selectedCard.system.type !== "atout") { + isAutomaticSuccess = Object.keys(actor.system.cartesSucces).some(symbole => { + const successCardData = actor.system.cartesSucces[symbole] + return selectedCard.system.symbole === symbole && + selectedCard.system.valeur === successCardData.value.toString() + }) + } + } + } + + // Préparer les données pour le chat + const difficultyData = SYSTEM.DIFFICULTY_CHOICES[options.selectedDifficulty || "moyenne"] + const isSousTensionOppose = options.selectedDifficulty === "soustension_oppose" + const isSuccess = isAutomaticSuccess || totalValue > options.targetScore + + // Détecter si la carte est un valet + const isValet = selectedCard?.system.valeur === "valet" + + // Détecter si la carte est un cavalier + const isCavalier = selectedCard?.system.valeur === "cavalier" + + // Détecter si la carte est une reine + const isReine = selectedCard?.system.valeur === "reine" + + // Détecter si la carte est un roi + const isRoi = selectedCard?.system.valeur === "roi" + + // Détecter si la carte est un atout + const isAtout = selectedCard?.system.type === "atout" + + // Si c'est un cavalier et un échec, transformer en égalité + const isEquality = isCavalier && !isSuccess && !isSousTensionOppose + + const chatData = { + cssClass: [SYSTEM.id, "competence-roll"].join(" "), + actingCharImg: options.actorImage, + actingCharName: options.actorName, + actorName: options.actorName, + competence: options.rollItem, + competenceModifier: options.competenceModifier, + selectedCard: selectedCard, + cardBonus: options.selectedCardValue || 0, + cardSymboleMatch: cardSymboleMatch, + totalValue: totalValue, + difficulty: difficultyData.label, + targetScore: options.targetScore, + isSuccess: isSuccess, + isAutomaticSuccess: isAutomaticSuccess, + isSousTensionOppose: isSousTensionOppose, + isValet: isValet, + isCavalier: isCavalier, + isReine: isReine, + isRoi: isRoi, + isAtout: isAtout, + isEquality: isEquality, + } + + // Créer le message de chat + const content = await foundry.applications.handlebars.renderTemplate( + "systems/fvtt-hamalron/templates/chat-competence.hbs", + chatData + ) + + const messageData = { + user: game.user.id, + speaker: ChatMessage.getSpeaker({ actor }), + content: content, + style: CONST.CHAT_MESSAGE_STYLES.OTHER, + } + + // Appliquer le mode de visibilité + ChatMessage.applyRollMode(messageData, rollContext.visibility) + + await ChatMessage.create(messageData) + + // Gérer la carte utilisée + console.log("DEBUG: selectedCard =", selectedCard, "options.selectedCardId =", options.selectedCardId) + if (selectedCard) { + console.log("Managing used card:", selectedCard.name) + // Supprimer la carte de l'acteur + const cardItem = actor.items.get(selectedCard.id) + if (cardItem) { + await actor.deleteEmbeddedDocuments("Item", [selectedCard.id]) + console.log("Card deleted from actor") + } + + // Récupérer le deck manager singleton + const module = await import("../applications/tarot-deck-manager.mjs") + const HamalronTarotDeckManager = module.default + let deckManager = HamalronTarotDeckManager._instance + + // Si le deck manager n'existe pas, le créer + if (!deckManager) { + console.log("Deck manager not initialized, creating new instance...") + deckManager = new HamalronTarotDeckManager() + await deckManager.resetDeck() + } + + console.log("Deck manager instance:", deckManager) + + if (deckManager) { + console.log("Deck manager is available") + // Ajouter la carte à la défausse + deckManager.addToDiscard({ + id: selectedCard.id, + name: selectedCard.name, + img: selectedCard.img, + symbole: selectedCard.system.symbole, + valeur: selectedCard.system.valeur, + type: selectedCard.system.type, + description: selectedCard.system.description, + }) + console.log("Card added to discard") + + // Tirer une nouvelle carte automatiquement + console.log("Attempting to draw new card. Deck length:", deckManager.deck.length) + if (deckManager.deck.length > 0) { + const newCards = deckManager.drawCards(1) + console.log("Cards drawn:", newCards) + if (newCards.length > 0) { + const newCard = newCards[0] + console.log("New card to add:", newCard) + // Trouver l'item tarot dans game.items + let originalItem = game.items.get(newCard.id) + console.log("Original item found by ID:", originalItem) + + // Si pas trouvé dans game.items, chercher dans tous les items disponibles + if (!originalItem) { + console.log("Searching for card in game.items by properties...") + originalItem = game.items.find(i => + i.type === "tarot" && + i.name === newCard.name && + i.system.symbole === newCard.symbole && + i.system.valeur === newCard.valeur + ) + console.log("Original item found by search:", originalItem) + } + + if (originalItem) { + // Cas spécial : Le Mat + if (newCard.valeur === "lemat") { + console.log("Le Mat drawn! Executing special rules...") + await HamalronTirageTarot.handleLeMatEffect(actor, deckManager) + } else { + console.log("Creating embedded document for actor...") + await actor.createEmbeddedDocuments("Item", [originalItem.toObject()]) + console.log("New card added to actor") + ui.notifications.info(`${game.i18n.localize("HAMALRON.Notifications.newCardDrawn")}: ${newCard.name}`) + } + } else { + console.warn("Original item not found for card:", newCard) + } + } else { + console.log("No cards were drawn (empty result)") + } + } else { + console.log("Deck is empty, cannot draw new card") + } + + deckManager.saveDeckState() + deckManager.render() + ui.notifications.info(`${game.i18n.localize("HAMALRON.Notifications.cardUsed")}: ${selectedCard.name}`) + } + } + + return null + } + + // Code existant pour les autres types de jets let rollData = foundry.utils.mergeObject(foundry.utils.duplicate(options), rollContext) rollData.rollMode = rollContext.visibility rollData.targetScore = 8 @@ -203,6 +593,8 @@ export default class HamalronTirageTarot { return `${game.i18n.localize("HAMALRON.Label.titleStat")}` case "weapon": return `${game.i18n.localize("HAMALRON.Label.titleWeapon")}` + case "competence": + return `${game.i18n.localize("HAMALRON.Label.titleCompetence")}` default: return game.i18n.localize("HAMALRON.Label.titleStandard") } diff --git a/module/models/competence.mjs b/module/models/competence.mjs index 2b06030..adb64da 100644 --- a/module/models/competence.mjs +++ b/module/models/competence.mjs @@ -6,9 +6,11 @@ export default class HamalronCompetence extends foundry.abstract.TypeDataModel { const schema = {}; schema.description = new fields.HTMLField({ required: true, textSearch: true }) - schema.type = new fields.StringField({ required: true, initial: "generale", choices: Object.fromEntries(Object.entries(SYSTEM.COMPETENCE_TYPES).map(([key, val]) => [key, val.label])) }); + schema.type = new fields.StringField({ required: true, initial: "commune", choices: Object.fromEntries(Object.entries(SYSTEM.COMPETENCE_TYPES).map(([key, val]) => [key, val.label])) }); schema.carteSymbole = new fields.StringField({ required: true, initial: "coupe", choices: Object.fromEntries(Object.entries(SYSTEM.TAROT_SYMBOLES).map(([key, val]) => [key, val.label])) }); - schema.niveau = new fields.NumberField({ required: true, initial: 0, min: 0, integer: true }); + schema.niveau = new fields.StringField({ required: true, initial: "inexperimente", choices: Object.fromEntries(Object.entries(SYSTEM.NIVEAU_COMPETENCES).map(([key, val]) => [key, val.name])) }); + schema.faction = new fields.StringField({ required: false, initial: "" }); + schema.peuple = new fields.StringField({ required: false, initial: "" }); return schema; } diff --git a/module/utils.mjs b/module/utils.mjs index 1f8902d..add78e9 100644 --- a/module/utils.mjs +++ b/module/utils.mjs @@ -128,6 +128,15 @@ export default class HamalronUtils { Handlebars.registerHelper('add', function (a, b) { return parseInt(a) + parseInt(b); + }) + + Handlebars.registerHelper('tarotValue', function (valeur) { + // Pour les valeurs numériques simples, retourner directement + const numValue = Number.parseInt(valeur); + if (!Number.isNaN(numValue)) return numValue; + // Pour les figures et atouts, récupérer depuis SYSTEM + const valeurData = SYSTEM.TAROT_VALEURS[valeur]; + return valeurData ? valeurData.value : valeur; }); Handlebars.registerHelper('mul', function (a, b) { return parseInt(a) * parseInt(b); @@ -169,7 +178,7 @@ export default class HamalronUtils { return key === "creature" || key === "daemon"; }) Handlebars.registerHelper('getRomanLevel', function (level) { - if (level=== "highpowers") return "High"; + if (level === "highpowers") return "High"; if (level === "mastery") return "Mastery"; level = parseInt(level); if (level === 0) return "0"; diff --git a/packs-system/hamalron-items/000004.log b/packs-system/hamalron-items/000004.log deleted file mode 100644 index e69de29..0000000 diff --git a/packs-system/hamalron-items/CURRENT b/packs-system/hamalron-items/CURRENT index 1a84852..32108be 100644 --- a/packs-system/hamalron-items/CURRENT +++ b/packs-system/hamalron-items/CURRENT @@ -1 +1 @@ -MANIFEST-000002 +MANIFEST-000016 diff --git a/packs-system/hamalron-items/LOG b/packs-system/hamalron-items/LOG index 27bc993..68621cc 100644 --- a/packs-system/hamalron-items/LOG +++ b/packs-system/hamalron-items/LOG @@ -1,5 +1,7 @@ -2025/12/25-21:02:35.693464 7f01589ff6c0 Delete type=3 #1 -2025/12/25-23:05:15.035540 7f01427fc6c0 Level-0 table #5: started -2025/12/25-23:05:15.035618 7f01427fc6c0 Level-0 table #5: 0 bytes OK -2025/12/25-23:05:15.043074 7f01427fc6c0 Delete type=0 #3 -2025/12/25-23:05:15.054249 7f01427fc6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end) +2026/01/02-10:10:10.253712 7f93ebfff6c0 Recovering log #15 +2026/01/02-10:10:10.307712 7f93ebfff6c0 Delete type=0 #15 +2026/01/02-10:10:10.307764 7f93ebfff6c0 Delete type=3 #14 +2026/01/02-20:13:00.317288 7f93e9ffb6c0 Level-0 table #19: started +2026/01/02-20:13:00.317383 7f93e9ffb6c0 Level-0 table #19: 0 bytes OK +2026/01/02-20:13:00.324182 7f93e9ffb6c0 Delete type=0 #17 +2026/01/02-20:13:00.343771 7f93e9ffb6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end) diff --git a/packs-system/hamalron-items/LOG.old b/packs-system/hamalron-items/LOG.old new file mode 100644 index 0000000..9e33e46 --- /dev/null +++ b/packs-system/hamalron-items/LOG.old @@ -0,0 +1,3 @@ +2025/12/28-22:58:25.963740 7f4a83fff6c0 Recovering log #12 +2025/12/28-22:58:25.975413 7f4a83fff6c0 Delete type=3 #10 +2025/12/28-22:58:25.975552 7f4a83fff6c0 Delete type=0 #12 diff --git a/packs-system/hamalron-items/MANIFEST-000002 b/packs-system/hamalron-items/MANIFEST-000002 deleted file mode 100644 index 84678b85f8b7258030a43e0f80a5cb071a7bc014..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65 zcmWIhx#Ncn10$nUPHI_dPD+xVQ)NkNd1i5{bAE0?Vo_pAe$kRS-TOEg7@3$k8JJmE R7&iWIss?dcfLt~f1_1vF6D0ru diff --git a/packs-system/hamalron-items/MANIFEST-000016 b/packs-system/hamalron-items/MANIFEST-000016 new file mode 100644 index 0000000000000000000000000000000000000000..5fc379e43acbb40a58c3cc427ba075d1da9c6b70 GIT binary patch literal 65 zcmWIhx#Ncn10$nUPHI_dPD+xVQ)NkNd1i5{bAE0?Vo_pAevwAlqxT#Pj7)-@49r3- R41$YY-hsG6K&}W20|4#R5?lZP literal 0 HcmV?d00001 diff --git a/styles/chat.less b/styles/chat.less index 24bfa71..e7aca5b 100644 --- a/styles/chat.less +++ b/styles/chat.less @@ -1,87 +1,726 @@ -&.ask-roll { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.1); -} +.fvtt-hamalron { + &.ask-roll { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-family: var(--font-secondary); + font-size: calc(var(--font-size-standard) * 1.1); + } -.hamalron-tarot-draw { - padding: 0.5rem; + &.competence-roll { + background: #e8e8e8; + border: 2px solid #999; + border-radius: 0.5rem; + overflow: hidden; - .tarot-draw-header { - margin-bottom: 1rem; + .competence-roll-header { + background: rgba(255, 255, 255, 0.5); + padding: 0.5rem; + border-bottom: 2px solid #999; - .tarot-draw-title { + .actor-info-compact { + display: flex; + align-items: center; + gap: 0.5rem; + + .actor-avatar { + width: 40px; + height: 40px; + border-radius: 50%; + border: 2px solid #667eea; + object-fit: cover; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); + } + + .actor-details { + flex: 1; + + .competence-name { + margin: 0 0 0.25rem 0; + font-size: 1rem; + color: #667eea; + font-weight: bold; + } + + .competence-meta { + display: flex; + gap: 0.75rem; + font-size: 0.75rem; + color: var(--color-text-dark-secondary); + + .meta-item { + display: flex; + align-items: center; + gap: 0.35rem; + + i { + color: #667eea; + font-size: 0.75rem; + } + } + } + } + } + } + + .competence-roll-body { + padding: 0.5rem; + + .card-used-section { + background: rgba(102, 126, 234, 0.1); + border: 1px solid rgba(102, 126, 234, 0.4); + border-radius: 0.35rem; + padding: 0.4rem; + margin-bottom: 0.5rem; + + .card-used-label { + display: flex; + align-items: center; + gap: 0.3rem; + font-size: 0.75rem; + font-weight: bold; + color: #4a5fc1; + margin-bottom: 0.35rem; + + i { + font-size: 0.75rem; + } + } + + .card-used-content { + display: flex; + align-items: center; + gap: 0.4rem; + + .card-thumbnail { + width: 40px; + height: 40px; + border-radius: 0.25rem; + border: 1px solid rgba(102, 126, 234, 0.5); + object-fit: cover; + } + + .card-info { + display: flex; + flex-direction: column; + gap: 0.25rem; + + .card-name { + font-weight: bold; + color: var(--color-text-dark-primary); + } + + .card-match { + display: flex; + align-items: center; + gap: 0.3rem; + font-size: 0.75rem; + font-style: italic; + + &.match-success { + color: #2ecc71; + i { + color: #2ecc71; + } + } + + &.match-partial { + color: #f39c12; + i { + color: #f39c12; + } + } + + &.match-atout { + color: #9b59b6; + font-weight: bold; + i { + color: #9b59b6; + } + } + + i { + font-size: 0.7rem; + } + } + + // Styles pour les règles spéciales des cartes + .valet-special-rule, + .cavalier-special-rule, + .reine-special-rule, + .roi-special-rule { + display: flex; + align-items: center; + gap: 0.3rem; + font-size: 0.75rem; + font-weight: bold; + padding: 0.3rem 0.4rem; + border-radius: 0.25rem; + background: rgba(255, 193, 7, 0.15); + border-left: 3px solid #ffc107; + color: #856404; + margin-top: 0.2rem; + + i { + font-size: 0.8rem; + color: #ffc107; + } + } + } + } + } + + .calculation-section { + background: rgba(0, 0, 0, 0.05); + border-radius: 0.35rem; + padding: 0.4rem; + margin-bottom: 0.5rem; + + .calculation-row { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.2rem 0; + font-size: 0.8rem; + + .calc-label { + color: var(--color-text-dark-secondary); + } + + .calc-value { + font-weight: bold; + font-size: 0.9rem; + color: var(--color-text-dark-primary); + + &.calc-bonus { + color: #2ecc71; + } + + &.calc-total { + font-size: 1.1rem; + color: #667eea; + } + } + + &.total-row { + padding-top: 0.3rem; + } + } + + .calculation-divider { + height: 1px; + background: var(--color-border-dark); + margin: 0.4rem 0; + } + } + + .difficulty-section { + .difficulty-info { + display: flex; + align-items: center; + gap: 0.4rem; + padding: 0.4rem; + background: rgba(0, 0, 0, 0.05); + border-radius: 0.35rem; + font-size: 0.8rem; + + i { + color: #f39c12; + } + + .difficulty-label { + color: var(--color-text-dark-primary); + font-weight: 500; + } + + .difficulty-target { + margin-left: auto; + color: var(--color-text-dark-secondary); + + strong { + color: var(--color-text-dark-primary); + font-size: 1rem; + } + } + } + } + } + + .competence-roll-footer { display: flex; + flex-direction: column; align-items: center; + justify-content: center; gap: 0.5rem; - margin: 0; - padding-bottom: 0.5rem; - border-bottom: 2px solid var(--color-border-dark); - font-size: 1.25rem; - color: var(--color-text-dark-primary); + padding: 0.5rem; + font-size: 1.1rem; + font-weight: bold; + border-top: 2px solid #999; - i { - color: #667eea; + .automatic-success-banner { + display: flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + width: 100%; + padding: 0.5rem; + background: linear-gradient(135deg, #ffd700 0%, #ffed4e 100%); + color: #8b6914; + font-size: 0.95rem; + font-weight: bold; + text-transform: uppercase; + letter-spacing: 0.1em; + border-radius: 0.25rem; + box-shadow: 0 2px 8px rgba(255, 215, 0, 0.4); + animation: pulse-banner 2s ease-in-out infinite; + + i { + color: #8b6914; + text-shadow: 0 0 5px rgba(255, 255, 255, 0.5); + } + } + + &.result-success { + background: rgba(46, 204, 113, 0.2); + color: #2ecc71; + + .result-icon i { + color: #2ecc71; + } + } + + &.result-failure { + background: rgba(234, 102, 102, 0.2); + color: #ea6666; + + .result-icon i { + color: #ea6666; + } + } + + &.gm-only-buttons { + background: rgba(102, 126, 234, 0.1); + padding: 0.75rem; + + .special-rules-section { + background: rgba(255, 193, 7, 0.15); + border: 2px solid #ffc107; + border-radius: 0.35rem; + padding: 0.5rem; + margin-bottom: 0.75rem; + + .special-rule-item { + display: flex; + align-items: center; + gap: 0.4rem; + padding: 0.3rem 0; + font-weight: bold; + color: #856404; + + &:not(:last-child) { + border-bottom: 1px solid rgba(255, 193, 7, 0.3); + margin-bottom: 0.3rem; + padding-bottom: 0.4rem; + } + + i { + font-size: 0.9rem; + color: #ffc107; + } + + strong { + color: #6c5400; + } + } + } + + .gm-buttons { + display: flex; + gap: 0.75rem; + width: 100%; + + button { + flex: 1; + padding: 0.5rem 1rem; + border: 2px solid #667eea; + border-radius: 0.35rem; + background: white; + color: #667eea; + font-weight: bold; + font-size: 0.9rem; + cursor: pointer; + transition: all 0.2s; + display: flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + + i { + font-size: 0.85rem; + } + + &:hover { + background: #667eea; + color: white; + transform: translateY(-1px); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); + } + + &.sous-tension-btn { + border-color: #f39c12; + color: #f39c12; + + &:hover { + background: #f39c12; + color: white; + } + } + + &.oppose-btn { + border-color: #e74c3c; + color: #e74c3c; + + &:hover { + background: #e74c3c; + color: white; + } + } + } + } + } + + .result-icon { + font-size: 1.2rem; + } + + .result-text { + text-transform: uppercase; + letter-spacing: 0.05em; } } } - .tarot-draw-content { - display: flex; - gap: 1rem; + &.hamalron-tarot-draw { + padding: 0.5rem; - .tarot-card-image { - flex-shrink: 0; + .tarot-draw-header { + margin-bottom: 1rem; - img { - width: 150px; - height: 150px; - object-fit: cover; - border-radius: 0.25rem; - border: 2px solid var(--color-border-dark); - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); + .tarot-draw-title { + display: flex; + align-items: center; + gap: 0.5rem; + margin: 0; + padding-bottom: 0.5rem; + border-bottom: 2px solid var(--color-border-dark); + font-size: 1.25rem; + color: var(--color-text-dark-primary); + + i { + color: #667eea; + } } } - .tarot-card-details { - flex: 1; + .tarot-draw-content { display: flex; - flex-direction: column; - gap: 0.5rem; + gap: 1rem; - .tarot-detail-row { - display: flex; - gap: 0.5rem; + .tarot-card-image { + flex-shrink: 0; - .detail-label { - font-weight: bold; - color: var(--color-text-dark-secondary); - } - - .detail-value { - color: var(--color-text-dark-primary); + img { + width: 150px; + height: 150px; + object-fit: cover; + border-radius: 0.25rem; + border: 2px solid var(--color-border-dark); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); } } - .tarot-description { - margin-top: 0.5rem; - padding-top: 0.5rem; - border-top: 1px solid var(--color-border-dark); + .tarot-card-details { + flex: 1; + display: flex; + flex-direction: column; + gap: 0.5rem; + .tarot-detail-row { + display: flex; + gap: 0.5rem; + + .detail-label { + font-weight: bold; + color: var(--color-text-dark-secondary); + } + + .detail-value { + color: var(--color-text-dark-primary); + } + } + + .tarot-description { + margin-top: 0.5rem; + padding-top: 0.5rem; + border-top: 1px solid var(--color-border-dark); + + .description-label { + font-weight: bold; + color: var(--color-text-dark-secondary); + margin-bottom: 0.25rem; + } + + .description-content { + color: var(--color-text-dark-primary); + font-style: italic; + } + } + } + } + } + + &.tarot-draw-chat { + background: #e8e8e8; + border: 2px solid #999; + border-radius: 0.5rem; + overflow: hidden; + + .tarot-draw-header { + background: rgba(255, 255, 255, 0.5); + padding: 0.5rem; + border-bottom: 2px solid #999; + + .draw-info-compact { + display: flex; + align-items: center; + gap: 0.5rem; + + .card-thumbnail { + width: 60px; + height: 60px; + border-radius: 0.25rem; + object-fit: cover; + border: 2px solid #999; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); + } + + .card-details { + flex: 1; + + .card-name { + margin: 0 0 0.25rem 0; + font-size: 1rem; + font-weight: bold; + color: #333; + } + + .card-meta { + display: flex; + gap: 0.75rem; + flex-wrap: wrap; + font-size: 0.75rem; + + .meta-item { + display: flex; + align-items: center; + gap: 0.25rem; + color: #666; + + i { + color: #999; + } + } + } + } + } + } + + .tarot-draw-body { + padding: 0.5rem; + + .description-section { .description-label { + display: flex; + align-items: center; + gap: 0.4rem; + font-size: 0.8rem; font-weight: bold; - color: var(--color-text-dark-secondary); - margin-bottom: 0.25rem; + color: #666; + margin-bottom: 0.4rem; + + i { + color: #999; + } } .description-content { - color: var(--color-text-dark-primary); + font-size: 0.85rem; + color: #555; font-style: italic; + line-height: 1.4; + padding: 0.4rem; + background: rgba(255, 255, 255, 0.3); + border-radius: 0.25rem; + border-left: 3px solid #999; + } + } + } + } + + &.tarot-tension-chat { + background: #e8e8e8; + border: 2px solid #999; + border-radius: 0.5rem; + overflow: hidden; + + .tarot-tension-header { + background: rgba(255, 165, 0, 0.2); + padding: 0.5rem; + border-bottom: 2px solid #f39c12; + + .tension-info-compact { + display: flex; + align-items: center; + gap: 0.5rem; + + .card-thumbnail { + width: 60px; + height: 60px; + border-radius: 0.25rem; + object-fit: cover; + border: 2px solid #f39c12; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); + } + + .card-details { + flex: 1; + + .card-name { + margin: 0 0 0.25rem 0; + font-size: 1rem; + font-weight: bold; + color: #333; + } + + .card-meta { + display: flex; + gap: 0.75rem; + flex-wrap: wrap; + font-size: 0.75rem; + + .meta-item { + display: flex; + align-items: center; + gap: 0.25rem; + color: #666; + + i { + color: #f39c12; + } + } + } + } + } + } + + .tarot-tension-body { + padding: 0.5rem; + + .difficulty-section { + margin-bottom: 0.75rem; + padding: 0.5rem; + background: rgba(243, 156, 18, 0.1); + border-left: 3px solid #f39c12; + border-radius: 0.25rem; + + .difficulty-label { + display: flex; + align-items: center; + gap: 0.4rem; + font-size: 0.75rem; + font-weight: bold; + color: #666; + margin-bottom: 0.25rem; + + i { + color: #f39c12; + } + } + + .difficulty-value { + font-size: 0.9rem; + font-weight: bold; + color: #333; + } + } + + .calculation-section { + .calculation-row { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.3rem 0.5rem; + margin-bottom: 0.25rem; + background: rgba(255, 255, 255, 0.3); + border-radius: 0.25rem; + + .calc-label { + font-size: 0.8rem; + color: #666; + } + + .calc-value { + font-size: 0.85rem; + font-weight: bold; + color: #333; + + &.positive { + color: #27ae60; + } + + &.negative { + color: #e74c3c; + } + } + } + + .calculation-total { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0.5rem; + margin-top: 0.5rem; + background: rgba(243, 156, 18, 0.15); + border: 2px solid #f39c12; + border-radius: 0.25rem; + + .total-label { + font-size: 0.85rem; + font-weight: bold; + color: #666; + text-transform: uppercase; + letter-spacing: 0.05em; + } + + .total-value { + font-size: 1.25rem; + font-weight: bold; + color: #f39c12; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); + } } } } } } + +@keyframes pulse-banner { + 0%, + 100% { + box-shadow: 0 0 10px rgba(255, 215, 0, 0.5); + } + 50% { + box-shadow: 0 0 20px rgba(255, 215, 0, 0.8); + } +} diff --git a/styles/fonts.less b/styles/fonts.less index bcf315a..a6324bb 100644 --- a/styles/fonts.less +++ b/styles/fonts.less @@ -1,9 +1,9 @@ @font-face { - font-family: "MinionProRegular"; - src: url("../assets/fonts/Minion Pro Regular.ttf") format("truetype"); + font-family: "TimesNewRoman"; + src: url("../assets/fonts/Times New Roman.ttf") format("truetype"); } @font-face { - font-family: "SupernaturalKnight"; - src: url("../assets/fonts/Supernatural_Knight.ttf") format("truetype"); + font-family: "EagleLake"; + src: url("../assets/fonts/EagleLake-Regular.ttf") format("truetype"); } diff --git a/styles/fvtt-hamalron.less b/styles/fvtt-hamalron.less index 37bd11f..c5e911d 100644 --- a/styles/fvtt-hamalron.less +++ b/styles/fvtt-hamalron.less @@ -16,8 +16,8 @@ @import "region.less"; @import "sortilege.less"; @import "tarot.less"; - @import "tarot-deck-manager.less"; - @import "chat.less"; } +@import "chat.less"; @import "roll.less"; +@import "tarot-deck-manager.less"; diff --git a/styles/global.less b/styles/global.less index 0872135..873e342 100644 --- a/styles/global.less +++ b/styles/global.less @@ -2,22 +2,25 @@ --font-size-standard: 0.9rem; --font-size-result: 1.4rem; --background-image-base: url("../assets/ui/sheet_background_01.webp"); - --font-primary: "MinionProRegular"; - --font-secondary: "MinionProRegular"; - --font-title: "SupernaturalKnight"; + --font-primary: "TimesNewRoman"; + --font-secondary: "TimesNewRoman"; + --font-title: "EagleLake"; --logo-standard: url("../assets/ui/pentagram_logo.webp"); - --title-color: #c9a876; + --title-color: #dea60b; --background-box: #e0dcdc; --color-success: rgb(15, 122, 15); --color-failure: #8b7355; --color-warning: darkorange; --color-critical-success: rgb(21, 39, 204); --color-critical-failure: rgb(141, 32, 231); + --color-sheet-nav: #120c04; + --input-height: 1.2rem; } body { --color-light-1: rgba(182, 178, 178, 0.6); --color-warm-1: #c9a876; + --input-height: 1.4rem; } #logo { diff --git a/styles/mixins.less b/styles/mixins.less index 7d625b0..545a19c 100644 --- a/styles/mixins.less +++ b/styles/mixins.less @@ -48,8 +48,8 @@ } legend { - font-family: var(--font-secondary); - font-size: calc(var(--font-size-standard) * 1.2); + font-family: var(--font-title); + font-size: calc(var(--font-size-standard) * 1.1); font-weight: bold; letter-spacing: 1px; } diff --git a/styles/personnage-tarot.less b/styles/personnage-tarot.less index 1cfe704..7362900 100644 --- a/styles/personnage-tarot.less +++ b/styles/personnage-tarot.less @@ -1,6 +1,6 @@ -.personnage { +.character-content { .tarot-hand-container { - padding: 1rem; + padding: 0.3rem; height: 100%; display: flex; flex-direction: column; @@ -9,8 +9,8 @@ display: flex; justify-content: space-between; align-items: center; - margin-bottom: 1.5rem; - padding-bottom: 0.75rem; + margin-bottom: 0.2rem; + padding-bottom: 0.2rem; border-bottom: 2px solid var(--color-border-dark); h2 { @@ -20,47 +20,135 @@ } .tarot-hand-info { + display: flex; + align-items: center; + gap: 1rem; + .card-count { display: flex; align-items: center; - gap: 0.5rem; - padding: 0.5rem 1rem; + gap: 0.3rem; + padding: 0.3rem 0.6rem; background: rgba(102, 126, 234, 0.2); border-radius: 0.25rem; border: 1px solid rgba(102, 126, 234, 0.4); font-weight: bold; + font-size: 0.85rem; color: var(--color-text-light-heading); i { color: #667eea; } + + &.over-limit { + background: rgba(234, 102, 102, 0.2); + border-color: rgba(234, 102, 102, 0.4); + + i { + color: #ea6666; + } + } + } + + .hand-warning { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + background: rgba(234, 179, 8, 0.2); + border-radius: 0.25rem; + border: 1px solid rgba(234, 179, 8, 0.4); + color: #eab308; + font-weight: bold; + animation: pulse 2s ease-in-out infinite; + + i { + color: #eab308; + } + } + + @keyframes pulse { + 0%, + 100% { + opacity: 1; + } + 50% { + opacity: 0.7; + } } } } .tarot-hand-cards { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); - gap: 1.5rem; + display: flex; + flex-wrap: wrap; + gap: 0.3rem; overflow-y: auto; - padding-right: 0.5rem; + padding: 0.2rem; + justify-content: center; + align-items: flex-start; .tarot-card-wrapper { perspective: 1000px; cursor: grab; + flex-shrink: 0; + position: relative; &:active { cursor: grabbing; } + &.success-card { + .tarot-card { + .tarot-card-inner { + .tarot-card-front { + border: 3px solid #ffd700; + box-shadow: + 0 0 15px rgba(255, 215, 0, 0.6), + 0 4px 8px rgba(0, 0, 0, 0.3); + } + } + } + + .tarot-card-controls { + .success-indicator { + display: flex; + align-items: center; + justify-content: center; + width: 20px; + height: 20px; + border-radius: 50%; + background: rgba(255, 215, 0, 0.9); + color: #8b6914; + animation: pulse-gold 2s ease-in-out infinite; + + i { + font-size: 0.7rem; + } + } + } + } + + &.selected { + .tarot-card { + border: 2px solid #667eea; + box-shadow: 0 0 20px rgba(102, 126, 234, 0.6); + } + + .card-actions { + display: flex !important; + } + } + .tarot-card { position: relative; - width: 100%; - height: 400px; + width: 110px; + height: 190px; transition: transform 0.3s ease; &:hover { - transform: translateY(-5px); + transform: translateY(-10px) scale(1.05); + z-index: 10; } .tarot-card-inner { @@ -83,57 +171,55 @@ border-radius: 0.5rem; display: flex; flex-direction: column; - padding: 0.75rem; + padding: 0.4rem; .tarot-card-header { - display: flex; - justify-content: space-between; - align-items: flex-start; - margin-bottom: 0.75rem; - - .tarot-card-name { - margin: 0; - font-size: 1.1rem; - font-weight: bold; - color: #667eea; - flex: 1; - line-height: 1.3; - } + position: absolute; + top: 0.25rem; + right: 0.25rem; + z-index: 2; .tarot-card-controls { display: flex; gap: 0.25rem; + opacity: 0; + transition: opacity 0.2s ease; .card-control { display: flex; align-items: center; justify-content: center; - width: 24px; - height: 24px; - border-radius: 0.25rem; - background: rgba(0, 0, 0, 0.3); - color: var(--color-text-light-heading); + width: 20px; + height: 20px; + border-radius: 50%; + background: rgba(0, 0, 0, 0.7); + color: white; transition: all 0.2s ease; - &:hover { - background: rgba(102, 126, 234, 0.5); - color: white; + &.delete-control:hover { + background: rgba(234, 102, 102, 0.9); + } + + &.view-control:hover { + background: rgba(102, 126, 234, 0.9); } i { - font-size: 0.75rem; + font-size: 0.7rem; } } } } + &:hover .tarot-card-header .tarot-card-controls { + opacity: 1; + } + .tarot-card-image { width: 100%; - height: 150px; - margin-bottom: 0.75rem; - border-radius: 0.25rem; + height: 125px; + border-radius: 0.25rem 0.25rem 0 0; overflow: hidden; - border: 1px solid var(--color-border-dark); background: rgba(0, 0, 0, 0.3); img { @@ -143,37 +229,44 @@ } } + .tarot-card-name { + padding: 0.5rem; + background: rgba(0, 0, 0, 0.3); + border-bottom: 1px solid var(--color-border-dark); + + h4 { + margin: 0; + font-size: 0.85rem; + font-weight: bold; + color: #667eea; + text-align: center; + line-height: 1.2; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + .tarot-card-info { - display: flex; - flex-direction: column; - gap: 0.5rem; - margin-bottom: 0.75rem; + padding: 0.5rem; + background: rgba(0, 0, 0, 0.2); - .card-info-row { + .card-info-compact { display: flex; - justify-content: space-between; - align-items: center; - padding: 0.4rem 0.5rem; - background: rgba(0, 0, 0, 0.2); - border-radius: 0.25rem; - font-size: 0.875rem; + flex-direction: column; + gap: 0.4rem; + font-size: 0.75rem; - .info-label { + .card-symbole { display: flex; align-items: center; - gap: 0.35rem; - color: var(--color-text-dark-secondary); - font-weight: 500; + gap: 0.3rem; + font-weight: bold; + justify-content: center; i { - font-size: 0.75rem; - opacity: 0.7; + font-size: 0.6rem; } - } - - .info-value { - color: var(--color-text-light-heading); - font-weight: bold; &.symbole-coupe { color: #3498db; @@ -191,46 +284,84 @@ color: #2ecc71; } } + + .card-valeur { + text-align: center; + color: #ffffff; + font-weight: bold; + font-size: 1rem; + background: rgba(0, 0, 0, 0.4); + padding: 0.3rem 0.5rem; + border-radius: 0.25rem; + } } - } - .tarot-card-description { - flex: 1; - overflow-y: auto; - padding: 0.5rem; - background: rgba(0, 0, 0, 0.2); - border-radius: 0.25rem; - border: 1px solid var(--color-border-dark); + .card-actions { + display: none; + margin-top: 0.5rem; - .description-text { - font-size: 0.8rem; - line-height: 1.4; - color: var(--color-text-dark-primary); + .discard-and-draw-button { + width: 100%; + padding: 0.5rem; + background: rgba(102, 126, 234, 0.3); + border: 1px solid rgba(102, 126, 234, 0.6); + border-radius: 0.25rem; + color: #9ab4ff; + font-size: 0.75rem; + font-weight: bold; + cursor: pointer; + transition: all 0.2s ease; + display: flex; + align-items: center; + justify-content: center; + gap: 0.3rem; - p { - margin: 0 0 0.5rem 0; + i { + font-size: 0.7rem; + } - &:last-child { - margin-bottom: 0; + &:hover { + background: rgba(102, 126, 234, 0.5); + border-color: rgba(102, 126, 234, 0.8); + color: #aac4ff; + transform: translateY(-1px); + } + + &:active { + transform: translateY(0); } } } - &::-webkit-scrollbar { - width: 4px; - } + .discard-button { + margin-top: 0.5rem; + padding: 0.4rem 0.5rem; + background: rgba(234, 102, 102, 0.3); + border: 1px solid rgba(234, 102, 102, 0.6); + border-radius: 0.25rem; + color: #ea6666; + font-size: 0.7rem; + font-weight: bold; + cursor: pointer; + transition: all 0.2s ease; + display: flex; + align-items: center; + justify-content: center; + gap: 0.3rem; - &::-webkit-scrollbar-track { - background: rgba(0, 0, 0, 0.2); - border-radius: 2px; - } - - &::-webkit-scrollbar-thumb { - background: rgba(102, 126, 234, 0.5); - border-radius: 2px; + i { + font-size: 0.65rem; + } &:hover { - background: rgba(102, 126, 234, 0.7); + background: rgba(234, 102, 102, 0.5); + border-color: rgba(234, 102, 102, 0.8); + color: #ff6666; + transform: translateY(-1px); + } + + &:active { + transform: translateY(0); } } } diff --git a/styles/personnage.less b/styles/personnage.less index e84f5ed..d9ac297 100644 --- a/styles/personnage.less +++ b/styles/personnage.less @@ -6,11 +6,17 @@ .sheet-tabs { background-color: var(--color-light-1); + font-family: var(--font-title); + + a { + color: var(--color-sheet-nav); + font-size: 0.9rem; + } } .character-main { - /*background-color: var(--color-light-1);*/ display: flex; + justify-content: center; .character-pc { display: flex; @@ -18,7 +24,7 @@ flex: 1; .character-left { - min-width: 180px; + min-width: 220px; display: flex; flex-direction: column; @@ -62,15 +68,9 @@ .character-right { display: flex; flex-direction: column; - gap: 5px; + gap: 2px; .character-definition { - .character-definition-pronouns { - input { - min-width: 21.2rem; - max-width: 21.2rem; - } - } .form-group { display: flex; align-items: center; @@ -97,6 +97,32 @@ margin-right: 1rem; margin-bottom: auto; } + .item-controls { + display: flex; + align-items: center; + gap: 0.5rem; + flex: 1; + + .item-name { + flex: 1; + min-width: 0; + } + + .control { + flex-shrink: 0; + cursor: pointer; + opacity: 0.7; + transition: opacity 0.2s; + + &:hover { + opacity: 1; + } + + i { + font-size: 0.9rem; + } + } + } } .character-name { display: flex; @@ -113,40 +139,146 @@ } .character-pc-play { - min-width: 500px; + min-width: 660px; } .character-pc-edit { - min-width: 500px; + min-width: 660px; } .character-stats { /*background-color: var(--color-light-1);*/ display: flex; flex-direction: column; - gap: 5px; + gap: 2px; flex: 1; + .stats-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 0.2rem; + } + .character-stat { display: flex; align-items: center; - .icon-stat { - width: 24px; - height: 24px; - margin-right: 4px; + justify-content: space-between; + gap: 0.2rem; + padding: 0.1rem 0.2rem; + background: rgba(0, 0, 0, 0.1); + border-radius: 0.25rem; + + .stat-label { + flex: 1; + min-width: 0; + + &.rollable:hover, + &.rollable:focus { + text-shadow: 0 0 8px var(--color-shadow-primary); + cursor: pointer; + } + + i { + margin-right: 0.25rem; + } } - .rollable:hover, - .rollable:focus { - text-shadow: 0 0 8px var(--color-shadow-primary); - cursor: pointer; + + .stat-values { + display: flex; + align-items: center; + gap: 0.25rem; + flex-shrink: 0; + + input { + width: 3rem; + text-align: center; + } + + .stat-value { + width: 3rem; + text-align: center; + display: inline-block; + } + + .separator { + font-weight: bold; + color: var(--color-text-dark-secondary); + } } - .rollable { - min-width: 3.5rem; - max-width: 3.5rem; + } + } + + .character-resistances { + display: flex; + flex-direction: column; + gap: 2px; + flex: 1; + + .resistances-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 0.2rem; + } + + .resistance-stat { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.2rem; + padding: 0.1rem 0.2rem; + background: rgba(0, 0, 0, 0.1); + border-radius: 0.25rem; + + .stat-label { + flex: 1; + min-width: 0; } - input { - min-width: 2.5rem; - max-width: 2.5rem; + + .stat-values { + display: flex; + align-items: center; + gap: 0.2rem; + flex-shrink: 0; + + input { + width: 3rem; + text-align: center; + } + + .stat-value { + width: 3rem; + text-align: center; + display: inline-block; + } + + .resistance-control { + cursor: pointer; + opacity: 0.8; + transition: all 0.2s ease; + padding: 0.15rem 0.35rem; + background: rgba(0, 0, 0, 0.1); + border-radius: 3px; + color: var(--color-text-dark-primary); + + &:hover { + opacity: 1; + background: rgba(0, 100, 200, 0.2); + transform: scale(1.1); + } + + &:active { + transform: scale(0.95); + } + + i { + font-size: 0.7rem; + } + } + + .separator { + font-weight: bold; + color: var(--color-text-dark-secondary); + } } } } @@ -160,16 +292,145 @@ } } -.tab.character-status .main-div { +.tab.character-competences .main-div { /*background-color: var(--color-light-1);*/ display: grid; grid-template-columns: 1fr; + gap: 8px; legend { a { font-size: calc(var(--font-size-standard) * 1.4); padding-left: 5px; } } + + .competences-group { + margin-bottom: 12px; + background: rgba(0, 0, 0, 0.03); + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 4px; + padding: 8px; + + .competences-type-header { + font-weight: bold; + font-size: calc(var(--font-size-standard) * 1.1); + color: var(--color-text-dark-primary); + margin-bottom: 8px; + padding: 4px 8px; + border-left: 3px solid var(--color-border-dark-primary); + } + } + + .competences { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 6px; + + .competence { + display: flex; + align-items: center; + gap: 6px; + padding: 4px 6px; + background: rgba(255, 255, 255, 0.6); + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 3px; + transition: all 0.2s ease; + + &:hover { + background: rgba(255, 255, 255, 0.9); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + } + + .item-img { + width: 28px; + height: 28px; + border-radius: 3px; + flex-shrink: 0; + } + + .name { + flex: 1; + min-width: 0; + font-weight: 500; + + a { + color: var(--color-text-dark-primary); + text-decoration: none; + cursor: pointer; + + &:hover { + color: var(--color-text-hyperlink); + text-decoration: underline; + } + } + } + + .carte { + font-size: 0.85rem; + padding: 2px 6px; + background: rgba(0, 0, 0, 0.08); + border-radius: 3px; + white-space: nowrap; + } + + .niveau { + font-size: 0.85rem; + padding: 2px 6px; + background: rgba(0, 100, 200, 0.1); + color: var(--color-text-dark-primary); + border-radius: 3px; + white-space: nowrap; + font-weight: 500; + } + + .controls { + display: flex; + gap: 4px; + font-size: 0.85rem; + flex-shrink: 0; + + a { + padding: 2px 4px; + color: var(--color-text-dark-secondary); + cursor: pointer; + transition: color 0.2s ease; + + &:hover { + color: var(--color-text-dark-primary); + } + } + } + } + } + + .add-competence-section { + text-align: center; + padding: 12px; + + .add-competence-button { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 8px 16px; + background: rgba(0, 100, 200, 0.1); + border: 1px solid rgba(0, 100, 200, 0.3); + border-radius: 4px; + color: var(--color-text-dark-primary); + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease; + + &:hover { + background: rgba(0, 100, 200, 0.2); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + } + + i { + font-size: 1rem; + } + } + } + .mortality { display: flex; align-items: center; @@ -227,53 +488,9 @@ } } } - .perks { - display: grid; - grid-template-columns: repeat(1, 1fr); - gap: 4px; - .perk { - display: flex; - align-items: center; - gap: 4px; - margin-left: 4px; - min-width: 20rem; - max-width: 20rem; - .rollable:hover, - .rollable:focus { - text-shadow: 0 0 8px var(--color-shadow-primary); - cursor: pointer; - } - .controls { - font-size: 0.7rem; - min-width: 1.8rem; - max-width: 1.8rem; - } - .flavor { - min-width: 24rem; - max-width: 24rem; - } - .role { - min-width: 5rem; - max-width: 5rem; - } - .level { - min-width: 4rem; - max-width: 4rem; - } - .name { - min-width: 10rem; - max-width: 10rem; - } - .item-img { - width: 24px; - height: 24px; - margin: 4px 0 0 0; - } - } - } } -.tab.character-maleficas .main-div { +.tab.character-sortileges .main-div { /*background-color: var(--color-light-1);*/ display: grid; grid-template-columns: 1fr; @@ -284,7 +501,7 @@ } } - .maleficas { + .sortileges { display: grid; grid-template-columns: repeat(2, 1fr); gap: 4px; @@ -322,49 +539,6 @@ } } } - - .rituals { - display: grid; - grid-template-columns: repeat(1, 1fr); - gap: 4px; - .ritual { - display: flex; - align-items: center; - gap: 4px; - min-width: 14rem; - max-width: 14rem; - .controls { - font-size: 0.7rem; - min-width: 1.8rem; - max-width: 1.8rem; - } - .ingredients { - min-width: 24rem; - max-width: 24rem; - } - .name { - min-width: 12rem; - max-width: 12rem; - } - .difficulty { - min-width: 2rem; - max-width: 2rem; - } - .threshold { - min-width: 2rem; - max-width: 2rem; - } - .limit { - min-width: 2rem; - max-width: 2rem; - } - .item-img { - width: 24px; - height: 24px; - margin: 4px 0 0 0; - } - } - } } .tab.character-equipment .main-div { diff --git a/styles/roll.less b/styles/roll.less index 64ebeed..3d21bdc 100644 --- a/styles/roll.less +++ b/styles/roll.less @@ -19,9 +19,219 @@ .fvtt-hamalron-roll-dialog { fieldset { - padding: 10px; + padding: 6px; background-color: var(--color-light-1); } + + .dialog-info { + display: flex; + flex-direction: column; + gap: 0.5rem; + margin-bottom: 0; + + .actor-info { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.25rem 0.5rem; + background-color: rgba(0, 0, 0, 0.05); + border-radius: 0.25rem; + + .actor-portrait { + width: 40px; + height: 40px; + border-radius: 50%; + border: 2px solid var(--color-dark-6); + object-fit: cover; + } + + .actor-name { + font-family: var(--font-title); + font-size: calc(var(--font-size-standard) * 0.9); + font-weight: bold; + color: var(--color-dark-1); + } + } + + .competence-info { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.25rem 0.5rem; + + h3 { + margin: 0; + font-family: var(--font-title); + font-size: calc(var(--font-size-standard) * 1); + color: var(--title-color); + white-space: nowrap; + } + + .competence-details { + display: flex; + gap: 0.5rem; + font-size: calc(var(--font-size-standard) * 0.85); + + .competence-symbole, + .competence-niveau { + padding: 0.25rem 0.5rem; + background-color: rgba(0, 0, 0, 0.1); + border-radius: 0.25rem; + font-weight: 500; + } + } + } + } + + .tarot-hand { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(70px, 1fr)); + gap: 0.5rem; + padding: 0.25rem; + min-height: 90px; + + .tarot-card-select { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.15rem; + padding: 0.25rem; + border: 2px solid transparent; + border-radius: 0.35rem; + background-color: rgba(0, 0, 0, 0.05); + cursor: pointer; + transition: all 0.2s ease; + position: relative; + + &:hover { + background-color: rgba(0, 0, 0, 0.1); + border-color: var(--color-dark-5); + transform: translateY(-2px) scale(1.3); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.3); + z-index: 10; + } + + &.selected { + background-color: rgba(100, 150, 255, 0.2); + border-color: var(--color-success); + box-shadow: 0 0 10px rgba(100, 150, 255, 0.5); + } + + &.success-card { + border: 3px solid #ffd700; + background: linear-gradient( + 135deg, + rgba(255, 215, 0, 0.1) 0%, + rgba(255, 223, 0, 0.2) 100% + ); + box-shadow: 0 0 15px rgba(255, 215, 0, 0.4); + + &:hover { + border-color: #ffed4e; + box-shadow: 0 6px 20px rgba(255, 215, 0, 0.6); + } + + &.selected { + border-color: #ffd700; + box-shadow: 0 0 20px rgba(255, 215, 0, 0.8); + } + } + + .success-indicator { + position: absolute; + top: 2px; + right: 2px; + color: #ffd700; + font-size: 1rem; + text-shadow: 0 0 5px rgba(255, 215, 0, 0.8); + animation: pulse-gold 2s ease-in-out infinite; + } + + img { + width: 50px; + height: auto; + border-radius: 0.25rem; + border: 1px solid var(--color-dark-6); + } + + .card-name { + font-size: calc(var(--font-size-standard) * 0.75); + text-align: center; + line-height: 1.1; + max-width: 70px; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + } + + .card-values { + font-size: calc(var(--font-size-standard) * 0.7); + text-align: center; + color: var(--color-dark-3); + font-weight: bold; + margin-top: 0.1rem; + } + } + + p { + grid-column: 1 / -1; + text-align: center; + color: var(--color-dark-5); + font-style: italic; + margin: 1rem 0; + } + } + + .dialog-result { + .total-display { + display: flex; + justify-content: center; + align-items: center; + gap: 0.1rem; + padding: 0.1rem; + font-family: var(--font-title); + font-size: calc(var(--font-size-standard) * 1.1); + font-weight: bold; + + #competence-modifier { + color: var(--color-dark-1); + } + + #card-value-display { + color: var(--color-success); + } + + #total-value { + padding: 0.1rem 0.2rem; + background-color: rgba(0, 0, 0, 0.1); + border-radius: 0.35rem; + color: var(--title-color); + min-width: 2.1rem; + text-align: center; + } + } + + .difficulty-info { + text-align: center; + font-size: calc(var(--font-size-standard) * 0.9); + color: var(--color-dark-2); + margin-top: 0.1rem; + padding: 0.1rem 0; + + #target-score { + font-weight: bold; + color: var(--color-dark-1); + } + } + } + + .difficulty-select { + width: 100%; + text-align: center; + padding: 0.25rem; + } } .dialog-modifier { @@ -216,3 +426,15 @@ text-shadow: 0 0 10px var(--color-shadow-primary); } } + +@keyframes pulse-gold { + 0%, + 100% { + transform: scale(1); + opacity: 1; + } + 50% { + transform: scale(1.2); + opacity: 0.8; + } +} diff --git a/styles/tarot-deck-manager.less b/styles/tarot-deck-manager.less index dfb41a7..1d46153 100644 --- a/styles/tarot-deck-manager.less +++ b/styles/tarot-deck-manager.less @@ -1,111 +1,174 @@ .tarot-deck-manager { .tarot-deck-manager-content { - padding: 1rem; + padding: 1.5rem; display: flex; flex-direction: column; gap: 1.5rem; + background: linear-gradient( + 135deg, + rgba(102, 126, 234, 0.05) 0%, + rgba(118, 75, 162, 0.05) 100% + ); + min-height: 100%; } .deck-header { h2 { - margin: 0 0 1rem 0; - font-size: 1.5rem; - color: var(--color-text-dark-primary); + margin: 0 0 0.75rem 0; + font-size: 1.25rem; + color: #667eea; text-align: center; - border-bottom: 2px solid var(--color-border-dark); + border-bottom: 2px solid #667eea; padding-bottom: 0.5rem; + text-transform: uppercase; + letter-spacing: 0.1em; + text-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } .deck-stats { display: grid; grid-template-columns: repeat(3, 1fr); - gap: 1rem; - margin-top: 1rem; + gap: 0.5rem; + margin-top: 0.75rem; .stat-item { display: flex; flex-direction: column; align-items: center; gap: 0.25rem; - padding: 0.75rem; - background: rgba(0, 0, 0, 0.2); - border-radius: 0.25rem; - border: 1px solid var(--color-border-dark); + padding: 0.5rem; + background: linear-gradient( + 135deg, + rgba(102, 126, 234, 0.15) 0%, + rgba(118, 75, 162, 0.15) 100% + ); + border-radius: 0.5rem; + border: 2px solid rgba(102, 126, 234, 0.3); + transition: all 0.3s ease; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + + &:hover { + transform: translateY(-3px); + box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3); + border-color: rgba(102, 126, 234, 0.5); + } i { - font-size: 1.5rem; - color: var(--color-text-light-heading); - margin-bottom: 0.25rem; + font-size: 1.25rem; + color: #667eea; + margin-bottom: 0.15rem; } .stat-label { - font-size: 0.75rem; + font-size: 0.7rem; color: var(--color-text-dark-secondary); text-transform: uppercase; + letter-spacing: 0.05em; + text-align: center; } .stat-value { font-size: 1.25rem; font-weight: bold; - color: var(--color-text-light-heading); + color: #667eea; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); } } } } .deck-actions { - display: flex; - flex-direction: column; - gap: 1rem; + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 0.5rem; .action-button { display: flex; align-items: center; justify-content: center; gap: 0.5rem; - padding: 0.75rem 1rem; - font-size: 1rem; + padding: 0.6rem 0.75rem; + font-size: 0.85rem; font-weight: bold; border: none; - border-radius: 0.25rem; + border-radius: 0.5rem; cursor: pointer; - transition: all 0.2s ease; + transition: all 0.3s ease; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + text-transform: uppercase; + letter-spacing: 0.05em; i { - font-size: 1.25rem; + font-size: 1.1rem; + } + + &:hover:not(:disabled) { + transform: translateY(-3px); + box-shadow: 0 6px 16px rgba(0, 0, 0, 0.25); + } + + &:active:not(:disabled) { + transform: translateY(-1px); } &:disabled { - opacity: 0.5; + opacity: 0.4; cursor: not-allowed; + filter: grayscale(50%); } } .reset-button { - background: var(--color-border-dark); - color: var(--color-text-light-heading); + background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); + color: white; &:hover:not(:disabled) { - background: var(--color-border-dark-tertiary); - transform: translateY(-2px); - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); + background: linear-gradient(135deg, #c0392b 0%, #e74c3c 100%); } } - .draw-actions { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 0.5rem; + .collect-hands-button { + background: linear-gradient(135deg, #3498db 0%, #2980b9 100%); + color: white; - .draw-button { - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - color: white; + &:hover:not(:disabled) { + background: linear-gradient(135deg, #2980b9 0%, #3498db 100%); + } + } - &:hover:not(:disabled) { - background: linear-gradient(135deg, #764ba2 0%, #667eea 100%); - transform: translateY(-2px); - box-shadow: 0 4px 8px rgba(102, 126, 234, 0.4); - } + .distribute-cards-button { + background: linear-gradient(135deg, #2ecc71 0%, #27ae60 100%); + color: white; + + &:hover:not(:disabled) { + background: linear-gradient(135deg, #27ae60 0%, #2ecc71 100%); + } + } + + .shuffle-discard-button { + background: linear-gradient(135deg, #f39c12 0%, #e67e22 100%); + color: white; + + &:hover:not(:disabled) { + background: linear-gradient(135deg, #e67e22 0%, #f39c12 100%); + } + } + + .draw-button { + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + + &:hover:not(:disabled) { + background: linear-gradient(135deg, #764ba2 0%, #667eea 100%); + } + } + + .draw-tension-button { + background: linear-gradient(135deg, #f39c12 0%, #d35400 100%); + color: white; + + &:hover:not(:disabled) { + background: linear-gradient(135deg, #d35400 0%, #f39c12 100%); } } } diff --git a/templates/character-biography.hbs b/templates/character-biography.hbs deleted file mode 100644 index 3ddab0c..0000000 --- a/templates/character-biography.hbs +++ /dev/null @@ -1,154 +0,0 @@ -
\ No newline at end of file diff --git a/templates/character-equipment.hbs b/templates/character-equipment.hbs deleted file mode 100644 index fc39174..0000000 --- a/templates/character-equipment.hbs +++ /dev/null @@ -1,127 +0,0 @@ -
-
- -
- {{localize "HAMALRON.Label.weapons"}}{{#if isEditMode}} - {{/if}} - -
- {{#each weapons as |item|}} -
- - - -
- {{item.name}} -
- - {{upperFirst item.system.properties}} - {{upperFirst item.system.range}} - - {{#if (eq item.system.weaponType "melee")}} - - - - {{else}} - - - {{item.system.ammoQuantity}} - - - {{upperFirst item.system.ammo}} - {{/if}} - - - - {{item.system.damageFormula}} - -
- - -
-
- {{/each}} -
-
- -
- {{localize "HAMALRON.Label.armors"}}{{#if isEditMode}} - {{/if}} - -
- {{#each armors as |item|}} -
- -
- {{item.name}} -
- {{item.system.bonus}} - {{item.system.resilience}} - {{item.system.reduction}} - -
- - -
-
- {{/each}} -
-
- -
- {{localize "HAMALRON.Label.equipments"}}{{#if isEditMode}} - {{/if}} - -
- {{#each equipments as |item|}} - {{!log 'armor' this}} -
- -
- {{item.name}} -
- {{item.system.quantity}} - -
- - -
-
- {{/each}} -
-
- -
- Limboes and Ammo -
-
- - Limboes -
- -
- - Ammo -
- - {{#each system.ammoArray as |ammo key|}} -
- - {{upperFirst ammo.label}} -
- {{/each}} -
-
- -
-
\ No newline at end of file diff --git a/templates/character-main.hbs b/templates/character-main.hbs deleted file mode 100644 index 42c0f3e..0000000 --- a/templates/character-main.hbs +++ /dev/null @@ -1,106 +0,0 @@ -
- {{!log "character-main" this}} -
- {{localize "HAMALRON.Label.character"}} -
-
-
- -
- -
-
-
- {{formInput fields.name value=source.name rootId=partId disabled=isPlayMode}} - - - -
- -
-
- {{formField systemFields.pronouns value=system.pronouns rootId=partId disabled=isPlayMode}} -
-
-
-
- {{formField systemFields.species value=system.species rootId=partId disabled=isPlayMode}} -
-
-
- - -
- - -
-
-
-
- -
-
-
- - -
- - -
-
-
-
-
- - -
- - -
-
-
-
-
-
- -
-
-
- -
- {{localize "HAMALRON.Label.stats"}} -
- - {{formInput systemFields.stats.fields.flesh.fields.value value=system.stats.flesh.value rootId=partId disabled=isPlayMode type="number" }} -
-
- - {{formInput systemFields.stats.fields.skin.fields.value value=system.stats.skin.value rootId=partId disabled=isPlayMode type="number" }} -
-
- - {{formInput systemFields.stats.fields.heart.fields.value value=system.stats.heart.value rootId=partId disabled=isPlayMode type="number" }} -
-
- - {{formInput systemFields.stats.fields.mind.fields.value value=system.stats.mind.value rootId=partId disabled=isPlayMode type="number" }} -
-
- - {{formInput systemFields.stats.fields.soul.fields.value value=system.stats.soul.value rootId=partId disabled=isPlayMode type="number" }} -
-
- -
\ No newline at end of file diff --git a/templates/character-maleficas.hbs b/templates/character-maleficas.hbs deleted file mode 100644 index 7a63925..0000000 --- a/templates/character-maleficas.hbs +++ /dev/null @@ -1,70 +0,0 @@ -
-
-
- {{localize "HAMALRON.Label.maleficas"}}{{#if isEditMode}} - {{/if}} - -
- {{#each maleficas as |item|}} - {{!log 'weapon' this}} -
- - - - - {{upperFirst item.system.domain}} - {{getRomanLevel item.system.level}} - {{#if item.system.hasDamage}} - - - {{item.system.damage}} - {{else}} - - - {{/if}} - -
- - -
-
- {{/each}} -
-
- -
- {{localize "HAMALRON.Label.rituals"}}{{#if isEditMode}} - {{/if}} - -
- {{#each rituals as |item|}} -
- - - - - {{upperFirst item.system.ingredients}} - {{upperFirst item.system.difficulty}} - {{upperFirst item.system.threshold}} - {{upperFirst item.system.limit}} - -
- - -
-
- {{/each}} -
-
-
-
\ No newline at end of file diff --git a/templates/character-status.hbs b/templates/character-status.hbs deleted file mode 100644 index 43c791f..0000000 --- a/templates/character-status.hbs +++ /dev/null @@ -1,84 +0,0 @@ -
-
- -
- {{localize "HAMALRON.Label.characteristics"}} -
-
-
- {{formInput systemFields.trauma.fields.current value=system.trauma.current}} / - {{formInput systemFields.trauma.fields.max value=system.trauma.max}} - - {{formInput systemFields.darkness.fields.current value=system.darkness.current}} / - {{formInput systemFields.darkness.fields.max value=system.darkness.max}} - {{formInput systemFields.darkness.fields.value value=system.darkness.value}} - {{formInput systemFields.defense.fields.base value=system.defense.base}} - {{formInput systemFields.defense.fields.bonus value=system.defense.bonus }} - {{formInput systemFields.defense.fields.total value=system.defense.total}} - {{formInput systemFields.defense.fields.resistance value=system.defense.resistance}} - {{formInput systemFields.movement.fields.base value=system.movement.base}} - {{formInput systemFields.movement.fields.reduce value=system.defense.reduce }} -
- -
- Curr.Max - Curr.MaxMal.DR - BaseArmorTotalResi. - BaseRedu. - -
-
-
-
- -
- {{localize "HAMALRON.Label.perks"}}{{#if isEditMode}} - {{/if}} - -
- {{#each perks as |item|}} -
- - - - - {{upperFirst item.system.flavorText}} - {{upperFirst item.system.role}} - {{getRomanLevel item.system.level}} - -
- - -
-
- {{/each}} -
-
- -
- {{localize "HAMALRON.Label.ailments"}} -
- - {{#each system.mortality.enabled as |mortality idx|}} - - {{/each}} -
- -
- {{#each system.ailments as |item id|}} -
- -
- {{/each}} -
-
- -
-
\ No newline at end of file diff --git a/templates/chat-competence.hbs b/templates/chat-competence.hbs new file mode 100644 index 0000000..6f39441 --- /dev/null +++ b/templates/chat-competence.hbs @@ -0,0 +1,154 @@ +
+
+
+ +
+

{{competence.name}}

+
+ + + {{upperFirst competence.system.carteSymbole}} + + + + {{upperFirst competence.system.niveau}} ({{competenceModifier}}) + +
+
+
+
+ +
+ {{#if selectedCard}} +
+
+ + {{localize "HAMALRON.Label.cardUsed"}} +
+
+ +
+ {{selectedCard.name}} + {{#if cardBonus}} + + {{#if (eq cardSymboleMatch true)}} + + {{localize "HAMALRON.Label.matchingSymbol"}} + {{else if isAtout}} + + Atout + {{else}} + + {{localize "HAMALRON.Label.differentSymbol"}} + {{/if}} + + {{/if}} + {{#if isValet}} + + + Valet : Compensation en cas d'échec + + {{/if}} + {{#if isCavalier}} + + + Cavalier : Échec transformé en égalité + + {{/if}} + {{#if isReine}} + + + Reine : Effet exceptionnel et désagrément + + {{/if}} + {{#if isRoi}} + + + Roi : Effet exceptionnel + + {{/if}} +
+
+
+ {{/if}} + +
+
+ {{localize "HAMALRON.Label.competenceModifier"}} + {{competenceModifier}} +
+ {{#if cardBonus}} +
+ {{localize "HAMALRON.Label.cardBonus"}} + +{{cardBonus}} +
+ {{/if}} +
+
+ {{localize "HAMALRON.Label.totalValue"}} + {{totalValue}} +
+
+ + {{#unless isSousTensionOppose}} +
+
+ + {{difficulty}} + {{localize "HAMALRON.Label.targetScore"}}: {{targetScore}} +
+
+ {{/unless}} +
+ + {{#if isSousTensionOppose}} + + {{else}} + + {{/if}} +
\ No newline at end of file diff --git a/templates/chat-tarot-draw.hbs b/templates/chat-tarot-draw.hbs index 00aa17d..41a3929 100644 --- a/templates/chat-tarot-draw.hbs +++ b/templates/chat-tarot-draw.hbs @@ -1,46 +1,36 @@ -
+
-

- - {{card.name}} -

-
- -
-
- {{card.name}} -
- -
-
- {{localize - "HAMALRON.Tarot.FIELDS.symbole.label" - }}: - {{symboleLabel}} -
- -
- {{localize - "HAMALRON.Tarot.FIELDS.valeur.label" - }}: - {{valeurLabel}} -
- -
- {{localize - "HAMALRON.Tarot.FIELDS.type.label" - }}: - {{typeLabel}} -
- - {{#if card.description}} -
-
{{localize - "HAMALRON.Tarot.FIELDS.description.label" - }}:
-
{{{card.description}}}
+
+ +
+

{{card.name}}

+
+ + + {{symboleLabel}} + + + + {{valeurLabel}} + + + + {{typeLabel}} +
- {{/if}} +
+ + {{#if card.description}} +
+
+
+ + {{localize "HAMALRON.Tarot.FIELDS.description.label"}} +
+
{{{card.description}}}
+
+
+ {{/if}}
\ No newline at end of file diff --git a/templates/chat-tarot-tension.hbs b/templates/chat-tarot-tension.hbs new file mode 100644 index 0000000..d7c5b86 --- /dev/null +++ b/templates/chat-tarot-tension.hbs @@ -0,0 +1,51 @@ +
+
+
+ +
+

{{card.name}}

+
+ + + {{symboleLabel}} + + + + {{valeurLabel}} + + + + {{typeLabel}} + +
+
+
+
+ +
+
+
+ + {{localize "HAMALRON.Label.difficulty"}} +
+
{{difficulty.label}}
+
+ +
+
+ {{localize "HAMALRON.Label.cardValue"}} + {{cardValue}} +
+
+ {{localize "HAMALRON.Label.tensionModifier"}} + + {{#if (gt tensionBonus 0)}}+{{/if}}{{tensionBonus}} + +
+
+ {{localize "HAMALRON.Label.totalScore"}} + {{totalScore}} +
+
+
+
diff --git a/templates/competence.hbs b/templates/competence.hbs index 9bbd61c..6980fb4 100644 --- a/templates/competence.hbs +++ b/templates/competence.hbs @@ -17,7 +17,14 @@ value=system.carteSymbole localize=true }} - {{formField systemFields.niveau value=system.niveau}} + {{formField systemFields.niveau value=system.niveau localize=true}} + + {{#if (eq system.type "faction")}} + {{formField systemFields.faction value=system.faction localize=true}} + {{/if}} + {{#if (eq system.type "peuple")}} + {{formField systemFields.peuple value=system.peuple localize=true}} + {{/if}}
diff --git a/templates/personnage-biographie.hbs b/templates/personnage-biographie.hbs index da0d2d1..563281c 100644 --- a/templates/personnage-biographie.hbs +++ b/templates/personnage-biographie.hbs @@ -5,6 +5,18 @@ >
+
+ {{localize "HAMALRON.Label.progression"}} +
+ +
+
+
{{localize "HAMALRON.Label.biodata"}}
diff --git a/templates/personnage-main.hbs b/templates/personnage-main.hbs index 54b476a..5a4df32 100644 --- a/templates/personnage-main.hbs +++ b/templates/personnage-main.hbs @@ -1,60 +1,190 @@ -
- {{!log "character-main" this}} +
+ {{log "character-main context" this}} + {{log "isEditMode" isEditMode "isPlayMode" isPlayMode}}
{{localize "HAMALRON.Label.character"}}
- +
- +
+
+
+ +
+ {{#if peuple}} + {{peuple.name}} + {{#if isEditMode}} + + + + + + + {{/if}} + {{else}} + - + {{/if}} +
+
+
+ +
+ {{#if faction}} + {{faction.name}} + {{#if isEditMode}} + + + + + + + {{/if}} + {{else}} + - + {{/if}} +
+
+
+
+
- {{formInput fields.name value=source.name rootId=partId disabled=isPlayMode}} - + +
-
-
- {{#each system.biodata as |bioField key|}} - {{#if (eq key "age")}} - {{formField systemFields.biodata.fields.age value=system.biodata.age rootId=partId disabled=isPlayMode}} - {{/if}} - {{#if (eq key "gender")}} - {{formField systemFields.biodata.fields.gender value=system.biodata.gender rootId=partId disabled=isPlayMode}} - {{/if}} - {{/each}} -
-
+
+ {{localize "HAMALRON.Label.cartesSucces"}} + {{log "cartesSucces data:" system.cartesSucces}} +
+ {{#each system.cartesSucces as |carte symbole|}} + {{log "Processing carte:" symbole carte "isEditMode in loop:" ../isEditMode}} +
+ +
+ {{log "In stat-values, isEditMode:" ../isEditMode}} + {{#if ../isEditMode}} + {{log "Rendering input for carte"}} + + {{else}} + {{log "Rendering span for carte"}} + {{carte.value}} + {{/if}} +
+
+ {{/each}} +
+
-
- {{localize "HAMALRON.Label.cartesSucces"}} - {{#each system.cartesSucces as |carte symbole|}} -
- - {{formInput systemFields.cartesSucces.fields.[symbole].fields.value value=carte.value rootId=partId disabled=isPlayMode type="number" }} - / - {{formInput systemFields.cartesSucces.fields.[symbole].fields.max value=carte.max rootId=partId disabled=isPlayMode type="number" }} -
- {{/each}} -
- -
- {{localize "HAMALRON.Label.resistances"}} -
- {{#each system.resistances as |resistance symbole|}} -
- - {{formInput systemFields.resistances.fields.[symbole].fields.value value=resistance.value rootId=partId disabled=isPlayMode type="number" }} - / - {{formInput systemFields.resistances.fields.[symbole].fields.max value=resistance.max rootId=partId disabled=isPlayMode type="number" }} +
+ {{localize "HAMALRON.Label.resistances"}} +
+ {{#each system.resistances as |resistance symbole|}} +
+ +
+ {{#if ../isEditMode}} + + / + + {{else}} + + + + {{resistance.value}} + / + {{resistance.max}} + + + + {{/if}} +
+
+ {{/each}} +
+
- {{/each}}
-
\ No newline at end of file diff --git a/templates/personnage-sortileges.hbs b/templates/personnage-sortileges.hbs index 7a63925..19cf9dc 100644 --- a/templates/personnage-sortileges.hbs +++ b/templates/personnage-sortileges.hbs @@ -1,70 +1,143 @@ -
+
-
- {{localize "HAMALRON.Label.maleficas"}}{{#if isEditMode}} - {{/if}} - -
- {{#each maleficas as |item|}} - {{!log 'weapon' this}} -
+
+ {{localize "HAMALRON.Label.sortileges"}}{{#if isEditMode}} + {{/if}} + +
+ {{#each sortileges as |item|}} +
- - - - {{upperFirst item.system.domain}} - {{getRomanLevel item.system.level}} - {{#if item.system.hasDamage}} - - - {{item.system.damage}} - {{else}} - - - {{/if}} + + + + {{upperFirst + item.system.domain + }} + {{getRomanLevel + item.system.level + }} + {{#if item.system.hasDamage}} + + + {{item.system.damage}} + {{else}} + - + {{/if}} -
- - -
+
+ + +
+
+ {{/each}}
- {{/each}} -
-
+
-
- {{localize "HAMALRON.Label.rituals"}}{{#if isEditMode}} - {{/if}} - -
- {{#each rituals as |item|}} -
+
+ {{localize "HAMALRON.Label.rituals"}}{{#if isEditMode}} + {{/if}} + +
+ {{#each rituals as |item|}} +
- - - - {{upperFirst item.system.ingredients}} - {{upperFirst item.system.difficulty}} - {{upperFirst item.system.threshold}} - {{upperFirst item.system.limit}} + + + + {{upperFirst + item.system.ingredients + }} + {{upperFirst + item.system.difficulty + }} + {{upperFirst + item.system.threshold + }} + {{upperFirst + item.system.limit + }} -
- - -
+
+ + +
+
+ {{/each}}
- {{/each}} -
-
-
+
+
\ No newline at end of file diff --git a/templates/personnage-status.hbs b/templates/personnage-status.hbs index 149b266..fb8cfec 100644 --- a/templates/personnage-status.hbs +++ b/templates/personnage-status.hbs @@ -1,44 +1,199 @@ -
+
-
- {{localize "HAMALRON.Label.progression"}} -
- {{formField systemFields.progression value=system.progression type="number"}} -
-
+ {{#if competencesCommunes.length}} +
+ Compétences communes +
+ {{#each competencesCommunes as |item|}} +
+ + + {{upperFirst + item.system.carteSymbole + }} + {{item.niveauName}} ({{item.niveauModificateur}}) -
- {{localize "HAMALRON.Label.competences"}}{{#if isEditMode}} - {{/if}} - -
- {{#each perks as |item|}} -
- - - - {{upperFirst item.system.type}} - {{upperFirst item.system.carteSymbole}} - {{item.system.niveau}} - -
- - -
+
+ + + +
+
+ {{/each}}
- {{/each}} -
-
+ + {{/if}} -
-
- + {{#if competencesPeuple.length}} +
+ Compétences de peuple +
+ {{#each competencesPeuple as |item|}} +
+ + + {{upperFirst + item.system.carteSymbole + }} + {{item.niveauName}} ({{item.niveauModificateur}}) + +
+ + + +
+
+ {{/each}} +
+
+ {{/if}} + + {{#if competencesFaction.length}} +
+ Compétences de faction +
+ {{#each competencesFaction as |item|}} +
+ + + {{upperFirst + item.system.carteSymbole + }} + {{item.niveauName}} ({{item.niveauModificateur}}) + +
+ + + +
+
+ {{/each}} +
+
+ {{/if}} + + {{#if isEditMode}} + + {{/if}}
\ No newline at end of file diff --git a/templates/personnage-tarot.hbs b/templates/personnage-tarot.hbs index 4b7ed91..d75605a 100644 --- a/templates/personnage-tarot.hbs +++ b/templates/personnage-tarot.hbs @@ -5,13 +5,27 @@ >
-

{{localize "HAMALRON.Label.tarotHand"}}

- + - {{tarotCards.length}} + {{handSize}} / {{handLimit}} {{localize "HAMALRON.Label.cards"}} + + {{#if isOverLimit}} + + + {{localize "HAMALRON.Label.mustDiscardCard"}} + + {{/if}}
@@ -19,30 +33,30 @@
{{#each tarotCards as |card|}}
-

{{card.name}}

{{#if @root.isEditMode}} - + {{/if}} + {{#if card.isSuccessCard}} + + {{/if}}
@@ -57,57 +74,45 @@ {{card.name}}
-
-
- - - {{localize "HAMALRON.Tarot.FIELDS.symbole.label"}}: - - - {{localize - (concat - "HAMALRON.Tarot.FIELDS.symbole." card.system.symbole - ) - }} - -
- -
- - - {{localize "HAMALRON.Tarot.FIELDS.valeur.label"}}: - - - {{localize - (concat - "HAMALRON.Tarot.FIELDS.valeur." card.system.valeur - ) - }} - -
- -
- - - {{localize "HAMALRON.Tarot.FIELDS.type.label"}}: - - - {{localize - (concat - "HAMALRON.Tarot.FIELDS.type." card.system.type - ) - }} - -
+
+

{{card.name}}

- {{#if card.system.description}} -
-
- {{{card.enrichedDescription}}} +
+
+
+ + {{localize (concat "HAMALRON.Tarot.FIELDS.symbole." card.system.symbole)}} +
+
+ {{tarotValue card.system.valeur}}
- {{/if}} +
+ +
+ {{#if @root.isOverLimit}} + {{#if @root.isEditMode}} + + {{/if}} + {{/if}} +
diff --git a/templates/roll-dialog.hbs b/templates/roll-dialog.hbs index 7cbd583..017d657 100644 --- a/templates/roll-dialog.hbs +++ b/templates/roll-dialog.hbs @@ -1,40 +1,91 @@ -
+
-
+ {{#if (eq rollType "competence")}} +
+ {{localize "HAMALRON.Label.competence"}} - {{#if (eq rollType "stat")}} - {{localize "HAMALRON.Label.stat"}} - {{/if}} +
+
+ {{actorName}} + {{actorName}} +
-
{{localize rollItem.label}} : 3d6+{{rollItem.value}}
+
+

{{rollItem.name}}

+
+ {{localize + "HAMALRON.Label.symbole" + }}: + {{upperFirst rollItem.system.carteSymbole}} + {{localize + "HAMALRON.Label.niveau" + }}: + {{rollItem.system.niveau}} + ({{competenceModifier}}) +
+
+
+
- {{#if weapon}} -
Weapon : {{weapon.name}}
- {{/if}} +
+ {{localize "HAMALRON.Label.selectTarotCard"}} -
+
+ {{#if tarotCards}} + {{#each tarotCards as |card|}} +
+ {{card.name}} + {{card.name}} + {{#if card.isSuccessCard}}{{/if}} + +
+ {{/each}} + {{else}} +

{{localize "HAMALRON.Notifications.noTarotCards"}}

+ {{/if}} +
+
-
- Advantages & Disadvantages +
+ {{localize "HAMALRON.Label.difficulty"}} + +
- - - -
- -
- Difficulty - -
- -
- {{localize "HAMALRON.Label.formula"}} - -
+
+ {{localize "HAMALRON.Label.total"}} +
+ {{competenceModifier}} + + 0 + = + {{competenceModifier}} +
+
+ {{localize "HAMALRON.Label.targetScore"}}: + - +
+
+ {{/if}}
{{localize "HAMALRON.Label.rollView"}} diff --git a/templates/tarot-deck-manager.hbs b/templates/tarot-deck-manager.hbs index 2d955df..2fe837b 100644 --- a/templates/tarot-deck-manager.hbs +++ b/templates/tarot-deck-manager.hbs @@ -8,9 +8,9 @@ {{deckCount}}
- - {{localize "HAMALRON.TarotDeck.CardsDrawn"}}: - {{drawnCount}} + + {{localize "HAMALRON.TarotDeck.CardsInDiscard"}}: + {{discardCount}}
@@ -26,48 +26,31 @@ {{localize "HAMALRON.TarotDeck.ResetDeck"}} -
- + - + - -
-
+ - {{#if drawnCards.length}} -
-

{{localize "HAMALRON.TarotDeck.RecentDraws"}}

-
- {{#each drawnCards}} -
- {{this.name}} -
-

{{this.name}}

-
- {{lookup ../symboleLabel @index}} - {{lookup ../valeurLabel @index}} -
-
-
- {{/each}} -
+ + +
- {{else}} -
- -

{{localize "HAMALRON.TarotDeck.NoDrawsYet"}}

-
- {{/if}} {{#unless hasCards}}
diff --git a/templates/tarot.hbs b/templates/tarot.hbs index d01c457..74d9a5b 100644 --- a/templates/tarot.hbs +++ b/templates/tarot.hbs @@ -14,8 +14,8 @@ {{formField systemFields.type value=system.type localize=true}} {{#unless (eq system.type "atout")}} {{formField systemFields.symbole value=system.symbole localize=true}} - {{formField systemFields.valeur value=system.valeur localize=true}} {{/unless}} + {{formField systemFields.valeur value=system.valeur localize=true}}
-
- -
- {{localize "HAMALRON.Label.experience"}} -
- {{formField systemFields.experience.fields.current value=system.experience.current type="number" rootId=partId - disabled=isPlayMode}} -
-
- {{formField systemFields.experience.fields.total value=system.experience.total type="number" rootId=partId - disabled=isPlayMode}} -
-
- {{formField systemFields.experience.fields.training value=system.experience.training type="number" rootId=partId - disabled=isPlayMode}} -
-
- -
- {{localize "HAMALRON.Label.biodata"}} -
- {{formField systemFields.biodata.fields.aliases value=system.biodata.aliases rootId=partId disabled=isPlayMode}} -
-
-
- {{formField systemFields.biodata.fields.gender value=system.biodata.gender rootId=partId disabled=isPlayMode}} -
-
- {{formField systemFields.biodata.fields.age value=system.biodata.age rootId=partId disabled=isPlayMode}} -
-
- {{formField systemFields.biodata.fields.height value=system.biodata.height rootId=partId disabled=isPlayMode}} -
-
- {{formField systemFields.biodata.fields.weight value=system.biodata.weight rootId=partId disabled=isPlayMode}} -
-
- {{formField systemFields.biodata.fields.eyes value=system.biodata.eyes rootId=partId disabled=isPlayMode}} -
-
- {{formField systemFields.biodata.fields.hair value=system.biodata.hair rootId=partId disabled=isPlayMode}} -
-
- {{formField systemFields.biodata.fields.home value=system.biodata.home rootId=partId disabled=isPlayMode}} -
-
- {{formField systemFields.biodata.fields.birthplace value=system.biodata.birthplace rootId=partId - disabled=isPlayMode}} -
-
- {{formField systemFields.biodata.fields.dod value=system.biodata.dod rootId=partId - disabled=isPlayMode}} -
-
-
- -
- {{localize "HAMALRON.Label.deals"}}{{#if isEditMode}} - {{/if}} - -
- {{#each deals as |item|}} -
- -
- {{item.name}} -
-
- - -
-
- {{/each}} -
-
- - -
- {{localize "HAMALRON.Label.backstory"}} - {{formInput systemFields.backstory enriched=enrichedBackstory value=system.backstory name="system.backstory" toggled=true}} -
- -
-
- {{localize "HAMALRON.Label.appearance"}} - {{formInput systemFields.appearance enriched=enrichedAppearance value=system.appearance name="system.appearance" - toggled=true}} -
-
- {{localize "HAMALRON.Label.scars"}} - {{formInput systemFields.scars enriched=scars value=system.scars name="system.scars" - toggled=true}} -
-
- -
-
- {{localize "HAMALRON.Label.likes"}} - {{formInput systemFields.likes enriched=enrichedLikes value=system.likes name="system.likes" - toggled=true}} -
-
- {{localize "HAMALRON.Label.dislikes"}} - {{formInput systemFields.dislikes enriched=enrichedDislikes value=system.dislikes name="system.dislikes" - toggled=true}} -
-
- -
-
- {{localize "HAMALRON.Label.fears"}} - {{formInput systemFields.fears enriched=enrichedFears value=system.fears name="system.fears" - toggled=true}} -
-
- {{localize "HAMALRON.Label.vices"}} - {{formInput systemFields.vices enriched=enrichedVices value=system.vices name="system.vices" - toggled=true}} -
-
- -
-
- {{localize "HAMALRON.Label.goals"}} - {{formInput systemFields.goals enriched=enrichedGoals value=system.goals name="system.goals" - toggled=true}} -
-
- {{localize "HAMALRON.Label.ambitions"}} - {{formInput systemFields.ambitions enriched=enrichedAmbitions value=system.ambitions name="system.ambitions" - toggled=true}} -
-
- -
-
- {{localize "HAMALRON.Label.values"}} - {{formInput systemFields.values enriched=enrichedValues value=system.values name="system.values" - toggled=true}} -
-
- {{localize "HAMALRON.Label.bonds"}} - {{formInput systemFields.bonds enriched=enrichedBonds value=system.bonds name="system.bonds" - toggled=true}} -
-
- - -
-