Compare commits

...

50 Commits

Author SHA1 Message Date
dffaa29fd1 Fix termes dans les fenetres de creation 2024-02-29 21:22:42 +01:00
c49e2a850b Fix termes dans les fenetres de creation 2024-02-29 20:59:06 +01:00
a5a9cc334e Fix termes dans les fenetres de creation 2024-02-29 20:45:25 +01:00
43e49a0eb8 New common CounterClass 2024-02-08 12:46:49 +01:00
5ab551da9e Rework usage log 2024-02-05 18:08:35 +01:00
2a9e98f8c7 Ajout tirage de la force des rencontres avec /tmrr, ajout de bouton pour appliquer complètement les blessures 2024-01-30 23:18:21 +01:00
669982ec4a Ajout tirage de la force des rencontres avec /tmrr, ajout de bouton pour appliquer complètement les blessures 2024-01-28 20:43:23 +01:00
34183cd1a7 Ajout tirage de la force des rencontres avec /tmrr, ajout de bouton pour appliquer complètement les blessures 2024-01-28 20:41:00 +01:00
f7eae3ac1e Fix version+changelog 2024-01-02 18:51:22 +01:00
623044c936 Sync fiche 2024-01-02 18:43:42 +01:00
94caf4040b Affichage souffle 2023-12-30 14:20:05 +01:00
d577e2d2ec Merge pull request '11.2.13 - Les cent pas d'Akarlikarlikar' (#694) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
Reviewed-on: #694
2023-12-26 23:44:30 +01:00
050cd80dae Version 11.2.13 2023-12-26 19:07:36 +01:00
3f098cab31 Commande /voyage
Ajout de la commande /voyage pour gérer la fatigue en voyage
2023-12-26 19:06:13 +01:00
4274bce7d5 minor cleanup 2023-12-26 19:06:13 +01:00
25d68d265e Image acteur dans les message de tours 2023-12-26 19:06:13 +01:00
c1c192f710 Merge pull request '11.2.12 - Le somnifère d'Akarlikarlikar' (#693) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
Reviewed-on: #693
2023-12-24 12:42:15 +01:00
7f64cd03f9 Version 11.2.12 2023-12-22 23:55:21 +01:00
3ac9f487d0 Fix: perte de rêve potions enchantées
La perte de rêve des potions enchantées bloquait le processus de
récupération de château dormant
2023-12-22 20:12:58 +01:00
fa67c3d9c1 Merge pull request 'Version 11.2.11' (#692) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
Reviewed-on: #692
2023-12-22 09:30:48 +01:00
5b443f9ac0 Version 11.2.11 2023-12-22 02:25:30 +01:00
b0098574a0 Fix: refoulement
Le refoulement ne fonctionnait plus. Merci à javascript+VSCode
pour l'incapacité de fournir de l'analyse de code statique...
2023-12-22 02:21:22 +01:00
5729f7e926 Bordure des images de profils
Remplacement de la bordure noire inesthétique avec des images de
profil sous forme de badge ronds, en utilisant juste une variation
de couleur de fond.
2023-12-22 02:21:22 +01:00
0b66c945b8 Mise à jour couleur images compcreature
Passage du blanc à la couleur habituelle
2023-12-22 02:21:22 +01:00
f0fc44e00f Merge pull request '11.2.10 - Les expériences d'Akarlikarlikar' (#691) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
Reviewed-on: #691
2023-12-11 09:34:21 +01:00
6b7c2ad2f9 Version 11.2.10 2023-12-10 22:26:52 +01:00
0ac5d317ce Icônes des boutons cuisiner/manger 2023-12-10 22:19:51 +01:00
f8a90fc3c3 Fontawsome solid
traduction de fas => fa-solid
2023-12-10 22:19:51 +01:00
6dd647b787 Expérience des caractéristiques dérivées
Une fenêtre de répartition est ouverte quand plusieurs
caractéristiques peuvent recevoir l'expérience. Sinon,
l'expérience est attribuée automatiquement.

L'expérience n'est plus ajoutée en Force si supérieure à Taille+4
2023-12-10 22:19:51 +01:00
1c55491ac7 Ajustements des tooltips TMR 2023-12-10 22:19:50 +01:00
2b08678518 Merge pull request 'Version 11.2.9 - La barbe d'Akarlikarlikar' (#690) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
Reviewed-on: #690
2023-12-09 16:23:41 +01:00
355f2e4088 Version 11.2.9 2023-12-09 15:33:33 +01:00
e0862105f9 Icône d'état empoignade 2023-12-09 15:33:33 +01:00
3ab48511a0 Sort en réserve en fleuve
Les sorts en réserve en fleuve sont indiqués sur toutes les cases fleuve
2023-12-09 15:33:33 +01:00
05cd02b694 Fix: deprecation effects flags.core.statusId
Remplacement de la logique basée sur les flags par le set de "statuses"
2023-12-09 15:33:33 +01:00
56a5d06f16 Fix erreur console ouverture TMR
quand TMR pas affichées, bringToTop ne marche pas
2023-12-09 15:33:32 +01:00
f34db764cb Permettre les jets de chance sans astrologie
Quand on fait un jet de chance pour la journée, permettre de
ne pas utiliser l'ajustement astrologique
2023-12-09 15:33:32 +01:00
7267cd4096 Amélioration de tooltips
- style en phase avec le système
- icones attaque/d6/soins pour le HUD
- tooltip plus détaillé pour le HUD
- icône et bouton pour déterminer les chiffres astraux (astrologie)
- tooltips pour les boutons archétype
- suppression de log sur chaque point de coeur
2023-12-09 15:33:32 +01:00
e4bd2d2f27 Merge pull request 'v11' (#689) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
Reviewed-on: #689
2023-12-08 13:24:05 +01:00
eb09714579 Version 11.2.8 2023-12-08 04:03:53 +01:00
62cc3fc96b Correction de l'ajustement de luminosité
On passe de la nuit début vaisseau au jour fin vaisseau
2023-12-08 04:00:17 +01:00
5e140546ea Les tooltips de compétences et l'expérience
Limitation du tooltip sur les compétences qui masquait les
informations d'expérience
2023-12-08 03:07:27 +01:00
ab9a21f402 Utilisation de get plutôt que find par id 2023-12-08 02:38:57 +01:00
8e41250f64 Affichage de cœur dans les ajustements 2023-12-08 02:38:23 +01:00
095eed9da3 Fix: éliminer le risque de jets qui plante
Bloquait les rencontres en TMR.

Quand un rollData ne contient pas les sous-noeuds pouvant être
utilisés par les ajustements possibles, le jet de dés était perdu.

Le calcul d'ajustements ajoute maintenant les noeuds use/ajustements
s'ils ne sont pas fournis, pour éviter le risque.
2023-12-08 02:37:47 +01:00
55c98d1dce Merge pull request '11.2.7' (#688) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
Reviewed-on: #688
2023-12-04 09:29:35 +01:00
b5dc14687e Version 11.2.7 2023-12-04 02:35:47 +01:00
1208eb8ae1 Amélioration des tooltips
- title/alt remplacés par des data-tooltip
- description de ce que font les boutons
- description des items survolés
2023-12-04 02:32:26 +01:00
a46acb7952 Merge pull request 'Action de visualisation avec droits limités' (#687) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
Reviewed-on: #687
2023-12-03 20:05:31 +01:00
a68057900d Action de visualisation avec droits limités 2023-12-02 14:40:39 +01:00
195 changed files with 1457 additions and 720 deletions

View File

@ -1,4 +1,54 @@
# 11.2 # 11.2
## 11.2.16 - La Tri d'Akarlikarlikar
- Tri alphabétique des items dans la fenêtre de création
- Mise à jour comptage de monde
## 11.2.15 - La Table d'Akarlikarlikar
- Tirage automatique de la foce d'une rencontre (via la commande /tmrr)
- Ajout de boutons pour ajouter des blessures "complètes" (ie avec perte d'endurance/vie)
## 11.2.14 - Les petits pas d'Akarlikarlikar
- Correction sur la gestion de la surprise
- Ordre des messages sur les cases humides
## 11.2.13 - Les cent pas d'Akarlikarlikar
- Ajout de la commande /voyage pour gérer la fatigue de marche des voyageurs
## 11.2.12 - Le somnifère d'Akarlikarlikar
- Fix: les potions enchantées n'empêchent plus de finir correctement Château Dormant
## 11.2.11 - Le miroir d'Akarlikarlikar
- Changement des images de compétence de créatures morsure/pinces pour être dans le thème
- Suppression de la bordure autour des portraits d'acteurs, remplacés par un légèr éclaircissement du fond
- Fix: le refoulement ajoute correctement un souffle et revient à 0 en cas d'échec
## 11.2.10 - Les expériences d'Akarlikarlikar
- En cas d'expérience des caractéristiques dérivées,
- si plusieurs caractéristiques pourraient recevoir l'expérience, une fenêtre demande au joueur
- si une seule caractéristique peut recevoir de l'expérience, c'est attribué automatiquement
- Si la force est au maximum pour la taille personnage, on ne peut plus gagner d'expérience
## 11.2.9 - La barbe d'Akarlikarlikar
- Amélioration des textes de tooltips
- Les tooltips sont plus dans le thème de couleur du système Rêve de Dragon
- Ajouts d'icones pour les attaque/initiative/soins dans les raccourcis sur les tokens (HUD)
- Ajout d'une icône et transformation en bouton du lien pour accéder à l'astrologie et aux chiffres astraux
- Suppression de message de log inutile sur chaque point de coeur
- On peut désactiver l'ajustement astrologique sur les jets de chance (pour des jts de chances non liés à une heure)- Fix: suppression de quelques cas d'erreur lors de l'ouverture des TMR
- Fix: suppression du warning de depréciation effects flags.core.statusId
- Les sorts en réserve en fleuve sont indiqués sur toutes les cases fleuve
- Changement de l'icône d'état d'empoignade pour suivre les couleurs des autres icônes d'état
## 11.2.8 - L'éclairage d'Akarlikarlikar
- l'ajustement de la lumière jour/nuit s'étale sur moins de temps (vaisseau et Lyre)
- les nouveaux tooltips ne masquent plus l'information d'expérience
- les jets de dés pour maîtriser les rencontres fonctionnent de nouveau
## 11.2.7 - Les explications d'Akarlikarlikar
- Ajout de tooltips sur la plupart des boutons, liens clickables, objets, tâches, ...
- Fix: on peut de nouveau regarder l'inventaire avec les droits limités/observateur
## 11.2.6 - Les réveils difficiles d'Akarlikarlikar ## 11.2.6 - Les réveils difficiles d'Akarlikarlikar
- Les changements de points de Cœur sont temporaires jusqu'à fin Château Dormant - Les changements de points de Cœur sont temporaires jusqu'à fin Château Dormant
- Fix: tous les petits fixes (feuille qui s'ouvre plus, compagnons animaux, potions qui bloquent Château Dormant, ...) - Fix: tous les petits fixes (feuille qui s'ouvre plus, compagnons animaux, potions qui bloquent Château Dormant, ...)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 11 KiB

BIN
icons/empoignade.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
viewBox="0 0 512 512"
style="height: 256px; width: 256px;"
version="1.1"
id="svg24"
sodipodi:docname="sort-reserve-humide3.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
<metadata
id="metadata30">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs28" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2794"
inkscape:window-height="1756"
id="namedview26"
showgrid="false"
inkscape:zoom="2.8786993"
inkscape:cx="323.66586"
inkscape:cy="227.70764"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg24" />
<g
id="g881"
transform="translate(2.1482304,2.80716)">
<path
d="m 243.94189,104.37921 -82.23331,178.13543 82.23331,27.44784 z"
class=""
fill="#f4e3d7"
fill-opacity="1"
id="path2"
style="stroke-width:1.10232" />
<path
d="m 263.7837,104.37921 v 205.58327 l 82.23331,-27.44784 z"
class=""
fill="#f4e3d7"
fill-opacity="1"
id="path4"
style="stroke-width:1.10232" />
<path
d="M 168.21228,221.005 18.274279,239.7445 141.75653,278.32581 Z"
class=""
fill="#f4e3d7"
fill-opacity="1"
id="path6"
style="stroke-width:1.10232" />
<path
d="M 339.51331,221.005 365.96906,278.32581 489.5395,239.7445 Z"
class=""
fill="#f4e3d7"
fill-opacity="1"
id="path8"
style="stroke-width:1.10232" />
<path
d="M -0.24475089,254.73609 114.97007,398.80973 230.27308,326.7178 Z"
class=""
fill="#f4e3d7"
fill-opacity="1"
id="path10"
style="stroke-width:1.10232" />
<path
d="M 507.94829,254.73609 277.45251,326.7178 392.75552,398.80973 Z"
class=""
fill="#f4e3d7"
fill-opacity="1"
id="path12"
style="stroke-width:1.10232" />
<path
d="M 253.8628,335.42615 147.37837,402.00647 H 360.34722 Z"
class=""
fill="#f4e3d7"
fill-opacity="1"
id="path14"
style="stroke-width:1.10232" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -1,55 +1,56 @@
{ {
"TYPES": { "TYPES": {
"Actor": { "Actor": {
"Personnage": "Personnage", "personnage": "Personnage",
"Creature": "Créature", "creature": "Créature",
"Entite": "Entité de cauchemar", "entite": "Entité de cauchemar",
"Commerce": "Commerce", "commerce": "Commerce",
"Vehicule": "Véhicule" "vehicule": "Véhicule"
}, },
"Item": { "Item": {
"Arme": "Arme", "arme": "Arme",
"Armure": "Armure", "armure": "Armure",
"Blessure": "Blessure", "blessure": "Blessure",
"Casetmr": "TMR spéciale", "casetmr": "Case TMR spéciale",
"Chant": "Chant", "chant": "Chant",
"Competence": "Compétence", "competence": "Compétence",
"Competencecreature": "Compétence de créature", "competencecreature": "Compétence de créature",
"Conteneur": "Conteneur", "conteneur": "Conteneur",
"Danse": "Danse", "danse": "Danse",
"Extraitpoetique": "Extrait poetique", "empoignade": "Empoignade",
"Faune": "Faune", "extraitpoetique": "Extrait poetique",
"Gemme": "Gemme", "faune": "Faune",
"Herbe": "Herbe", "gemme": "Gemme",
"Ingredient": "Ingrédient", "herbe": "Herbe",
"Jeu": "Jeu", "ingredient": "Ingrédient",
"Livre": "Livre", "jeu": "Jeu",
"Maladie": "Maladie", "livre": "Livre",
"Meditation": "Méditation", "maladie": "Maladie",
"Monnaie": "Monnaie", "meditation": "Méditation",
"Munition": "Munition", "monnaie": "Monnaie",
"Musique": "Musique", "munition": "Munition",
"Nombreastral": "Nombre astral", "musique": "Musique",
"Nourritureboisson": "Nourriture & boisson", "nombreastral": "Nombre astral",
"Objet": "Objet", "nourritureboisson": "Nourriture & boisson",
"Oeuvre": "Oeuvre", "objet": "Objet",
"Ombre": "Ombre de Thanatos", "oeuvre": "Oeuvre",
"Plante": "Plante", "ombre": "Ombre de Thanatos",
"Poison": "Poison", "plante": "Plante",
"Possession": "Possession", "poison": "Poison",
"Potion": "Potion", "possession": "Possession",
"Queue": "Queue de Dragon", "potion": "Potion",
"Recettealchimique": "Recette alchimique", "queue": "Queue de Dragon",
"Recettecuisine": "Recette de cuisine", "recettealchimique": "Recette alchimique",
"Rencontre": "Rencontre TMR", "recettecuisine": "Recette de cuisine",
"Service": "Service", "rencontre": "Rencontre TMR",
"Signedraconique": "Signe draconique", "service": "Service",
"Sort": "Sort", "signedraconique": "Signe draconique",
"Sortreserve": "Sort en réserve", "sort": "Sort",
"Souffle": "Souffle de Dragon", "sortreserve": "Sort en réserve",
"Tache": "Tâche", "souffle": "Souffle de Dragon",
"Tarot": "Carte de tarot", "tache": "Tâche",
"Tete": "te de Dragon" "tarot": "Carte de tarot",
"tete": "Tête de Dragon"
} }
}, },
"EFFECT": { "EFFECT": {

View File

@ -120,6 +120,18 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
HtmlUtility.showControlWhen(this.html.find(".appliquerFatigue"), ReglesOptionnelles.isUsing("appliquer-fatigue")); HtmlUtility.showControlWhen(this.html.find(".appliquerFatigue"), ReglesOptionnelles.isUsing("appliquer-fatigue"));
this.html.find('.subacteur-open').click(async event => {
const subActorId = RdDSheetUtility.getEventItemData(event, 'subactor-id');
this.openSubActeur(subActorId);
})
this.html.find('.show-hide-competences').click(async event => {
this.options.showCompNiveauBase = !this.options.showCompNiveauBase;
this.render(true);
});
this.html.find('.visu-tmr').click(async event => this.actor.displayTMR("visu"))
// Everything below here is only needed if the sheet is editable // Everything below here is only needed if the sheet is editable
if (!this.options.editable) return; if (!this.options.editable) return;
@ -137,25 +149,11 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
const subActorId = RdDSheetUtility.getEventItemData(event, 'subactor-id') const subActorId = RdDSheetUtility.getEventItemData(event, 'subactor-id')
RdDCoeur.startSubActeurTendreMoment(this.actor.id, subActorId) RdDCoeur.startSubActeurTendreMoment(this.actor.id, subActorId)
}) })
this.html.find('.subacteur-open').click(async event => {
const subActorId = RdDSheetUtility.getEventItemData(event, 'subactor-id');
this.openSubActeur(subActorId);
})
this.html.find('.subacteur-delete').click(async event => { this.html.find('.subacteur-delete').click(async event => {
const li = RdDSheetUtility.getEventElement(event); const li = RdDSheetUtility.getEventElement(event);
const subActorId = li.data("subactor-id"); const subActorId = li.data("subactor-id");
this.deleteSubActeur(subActorId, li); this.deleteSubActeur(subActorId, li);
}) })
this.html.find('.experiencelog-delete').click(async event => {
const li = this.html.find(event.currentTarget)?.parents(".experiencelog");
const key = Number(li.data("key") ?? -1);
await this.actor.deleteExperienceLog(key, 1);
});
this.html.find('.experiencelog-delete-previous').click(async event => {
const li = this.html.find(event.currentTarget)?.parents(".experiencelog");
const key = Number(li.data("key") ?? -1);
await this.actor.deleteExperienceLog(0, key + 1);
});
this.html.find("input.derivee-value[name='system.compteurs.stress.value']").change(async event => { this.html.find("input.derivee-value[name='system.compteurs.stress.value']").change(async event => {
this.actor.updateCompteurValue("stress", parseInt(event.target.value)); this.actor.updateCompteurValue("stress", parseInt(event.target.value));
}); });
@ -204,7 +202,18 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
this.html.find('.recettecuisine-label a').click(async event => this.actor.rollRecetteCuisine(RdDSheetUtility.getItemId(event))) this.html.find('.recettecuisine-label a').click(async event => this.actor.rollRecetteCuisine(RdDSheetUtility.getItemId(event)))
if (game.user.isGM) { if (game.user.isGM) {
// Boutons spéciaux MJs // experience log
this.html.find('.experiencelog-delete').click(async event => {
const li = this.html.find(event.currentTarget)?.parents(".experiencelog");
const key = Number(li.data("key") ?? -1);
await this.actor.deleteExperienceLog(key, 1);
});
this.html.find('.experiencelog-delete-previous').click(async event => {
const li = this.html.find(event.currentTarget)?.parents(".experiencelog");
const key = Number(li.data("key") ?? -1);
await this.actor.deleteExperienceLog(0, key + 1);
});
// Boutons spéciaux MJs
this.html.find('.forcer-tmr-aleatoire').click(async event => this.actor.reinsertionAleatoire("Action MJ")) this.html.find('.forcer-tmr-aleatoire').click(async event => this.actor.reinsertionAleatoire("Action MJ"))
this.html.find('.afficher-tmr').click(async event => this.actor.changeTMRVisible()) this.html.find('.afficher-tmr').click(async event => this.actor.changeTMRVisible())
} }
@ -226,7 +235,6 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
}); });
// Display TMR // Display TMR
this.html.find('.visu-tmr').click(async event => this.actor.displayTMR("visu"))
this.html.find('.monte-tmr').click(async event => this.actor.displayTMR("normal")) this.html.find('.monte-tmr').click(async event => this.actor.displayTMR("normal"))
this.html.find('.monte-tmr-rapide').click(async event => this.actor.displayTMR("rapide")) this.html.find('.monte-tmr-rapide').click(async event => this.actor.displayTMR("rapide"))
@ -264,12 +272,6 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
this.html.find('.nouvelle-incarnation').click(async event => this.actor.nouvelleIncarnation()) this.html.find('.nouvelle-incarnation').click(async event => this.actor.nouvelleIncarnation())
} }
this.html.find('.show-hide-competences').click(async event => {
this.options.showCompNiveauBase = !this.options.showCompNiveauBase;
this.render(true);
});
// On pts de reve change // On pts de reve change
this.html.find('.pointsreve-value').change(async event => this.actor.update({ "system.reve.reve.value": event.currentTarget.value })) this.html.find('.pointsreve-value').change(async event => this.actor.update({ "system.reve.reve.value": event.currentTarget.value }))
this.html.find('.seuil-reve-value').change(async event => this.actor.setPointsDeSeuil(event.currentTarget.value)) this.html.find('.seuil-reve-value').change(async event => this.actor.setPointsDeSeuil(event.currentTarget.value))

View File

@ -35,6 +35,7 @@ import { ExperienceLog, XP_TOPIC } from "./actor/experience-log.js";
import { TYPES } from "./item.js"; import { TYPES } from "./item.js";
import { RdDBaseActorSang } from "./actor/base-actor-sang.js"; import { RdDBaseActorSang } from "./actor/base-actor-sang.js";
import { RdDCoeur } from "./coeur/rdd-coeur.js"; import { RdDCoeur } from "./coeur/rdd-coeur.js";
import { DialogChoixXpCarac } from "./dialog-choix-xp-carac.js";
export const MAINS_DIRECTRICES = ['Droitier', 'Gaucher', 'Ambidextre'] export const MAINS_DIRECTRICES = ['Droitier', 'Gaucher', 'Ambidextre']
@ -56,21 +57,20 @@ export class RdDActor extends RdDBaseActorSang {
/* -------------------------------------------- */ /* -------------------------------------------- */
$computeCaracDerivee() { $computeCaracDerivee() {
this.system.carac.force.value = Math.min(this.system.carac.force.value, parseInt(this.system.carac.taille.value) + 4); this.system.carac.force.value = Math.min(this.system.carac.force.value, parseInt(this.system.carac.taille.value) + 4);
this.system.carac.derobee.value = Math.floor(parseInt(((21 - this.system.carac.taille.value)) + parseInt(this.system.carac.agilite.value)) / 2);
let bonusDomKey = Math.floor((parseInt(this.system.carac.force.value) + parseInt(this.system.carac.taille.value)) / 2);
let tailleData = RdDCarac.getCaracDerivee(bonusDomKey);
this.system.attributs.plusdom.value = tailleData.plusdom;
this.system.attributs.sconst.value = RdDCarac.calculSConst(this.system.carac.constitution.value);
this.system.attributs.sust.value = RdDCarac.getCaracDerivee(this.system.carac.taille.value).sust;
this.system.attributs.encombrement.value = (parseInt(this.system.carac.force.value) + parseInt(this.system.carac.taille.value)) / 2;
this.system.carac.melee.value = Math.floor((parseInt(this.system.carac.force.value) + parseInt(this.system.carac.agilite.value)) / 2); this.system.carac.melee.value = Math.floor((parseInt(this.system.carac.force.value) + parseInt(this.system.carac.agilite.value)) / 2);
this.system.carac.tir.value = Math.floor((parseInt(this.system.carac.vue.value) + parseInt(this.system.carac.dexterite.value)) / 2); this.system.carac.tir.value = Math.floor((parseInt(this.system.carac.vue.value) + parseInt(this.system.carac.dexterite.value)) / 2);
this.system.carac.lancer.value = Math.floor((parseInt(this.system.carac.tir.value) + parseInt(this.system.carac.force.value)) / 2); this.system.carac.lancer.value = Math.floor((parseInt(this.system.carac.tir.value) + parseInt(this.system.carac.force.value)) / 2);
this.system.carac.derobee.value = Math.floor(parseInt(((21 - this.system.carac.taille.value)) + parseInt(this.system.carac.agilite.value)) / 2);
let bonusDomKey = Math.floor((parseInt(this.system.carac.force.value) + parseInt(this.system.carac.taille.value)) / 2);
let tailleData = RdDCarac.getCaracDerivee(bonusDomKey);
this.system.attributs.plusdom.value = tailleData.plusdom;
this.system.attributs.encombrement.value = (parseInt(this.system.carac.force.value) + parseInt(this.system.carac.taille.value)) / 2;
this.system.attributs.sconst.value = RdDCarac.calculSConst(this.system.carac.constitution.value);
this.system.attributs.sust.value = RdDCarac.getCaracDerivee(this.system.carac.taille.value).sust;
this.system.sante.vie.max = Math.ceil((parseInt(this.system.carac.taille.value) + parseInt(this.system.carac.constitution.value)) / 2); this.system.sante.vie.max = Math.ceil((parseInt(this.system.carac.taille.value) + parseInt(this.system.carac.constitution.value)) / 2);
this.system.sante.vie.value = Math.min(this.system.sante.vie.value, this.system.sante.vie.max) this.system.sante.vie.value = Math.min(this.system.sante.vie.value, this.system.sante.vie.max)
@ -152,23 +152,26 @@ export class RdDActor extends RdDBaseActorSang {
/* -------------------------------------------- */ /* -------------------------------------------- */
async $perteRevePotionsEnchantees() { async $perteRevePotionsEnchantees() {
let potions = this.itemTypes[TYPES.potion] let potions = this.itemTypes[TYPES.potion]
.filter(it => it.system.categorie.toLowerCase().includes('enchant') && !potion.system.prpermanent) .filter(it => Grammar.includesLowerCaseNoAccent(it.system.categorie, 'enchanté') && !it.system.prpermanent)
const potionUpdates = await Promise.all(potions.map(async potion => { const potionUpdates = await Promise.all(potions.map(async it => {
console.log(potion) const nouveauReve = Math.max(it.system.pr - 1, 0)
let nouveauReve = (potion.system.pr > 0) ? potion.system.pr - 1 : 0;
const message = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-potionenchantee-chateaudormant.html`, {
pr: nouveauReve,
alias: this.name,
potionName: potion.name,
potionImg: potion.img
})
ChatMessage.create({ ChatMessage.create({
whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name),
content: message content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-potionenchantee-chateaudormant.html`, {
}); pr: nouveauReve,
return { _id: potion._id, 'system.pr': nouveauReve }; alias: this.name,
potionName: it.name,
potionImg: it.img
})
})
return {
_id: it._id,
'system.pr': nouveauReve,
'system.quantite': nouveauReve > 0 ? it.system.quantite : 0
}
})) }))
await this.updateEmbeddedDocuments('Item', potionUpdates); await this.updateEmbeddedDocuments('Item', potionUpdates);
} }
@ -399,7 +402,7 @@ export class RdDActor extends RdDBaseActorSang {
content: 'Remise à neuf de ' + this.name content: 'Remise à neuf de ' + this.name
}); });
await this.supprimerBlessures(it => true); await this.supprimerBlessures(it => true);
await this.removeEffects(e => e.flags.core.statusId !== STATUSES.StatusDemiReve); await this.removeEffects(e => e.id != STATUSES.StatusDemiReve);
const updates = { const updates = {
'system.sante.endurance.value': this.system.sante.endurance.max, 'system.sante.endurance.value': this.system.sante.endurance.max,
'system.sante.vie.value': this.system.sante.vie.max, 'system.sante.vie.value': this.system.sante.vie.max,
@ -659,7 +662,7 @@ export class RdDActor extends RdDBaseActorSang {
this.setPointsDeChance(to); this.setPointsDeChance(to);
} }
} }
let selectedCarac = RdDBaseActor._findCaracByName(this.system.carac, caracName); let selectedCarac = this.findCaracByName(caracName);
const from = selectedCarac.value const from = selectedCarac.value
await this.update({ [`system.carac.${caracName}.value`]: to }); await this.update({ [`system.carac.${caracName}.value`]: to });
await ExperienceLog.add(this, XP_TOPIC.CARAC, from, to, caracName); await ExperienceLog.add(this, XP_TOPIC.CARAC, from, to, caracName);
@ -670,7 +673,7 @@ export class RdDActor extends RdDBaseActorSang {
if (caracName == 'Taille') { if (caracName == 'Taille') {
return; return;
} }
let selectedCarac = RdDBaseActor._findCaracByName(this.system.carac, caracName); let selectedCarac = this.findCaracByName(caracName);
if (!selectedCarac.derivee) { if (!selectedCarac.derivee) {
const from = Number(selectedCarac.xp); const from = Number(selectedCarac.xp);
await this.update({ [`system.carac.${caracName}.xp`]: to }); await this.update({ [`system.carac.${caracName}.xp`]: to });
@ -684,7 +687,7 @@ export class RdDActor extends RdDBaseActorSang {
if (caracName == 'Taille') { if (caracName == 'Taille') {
return; return;
} }
let carac = RdDBaseActor._findCaracByName(this.system.carac, caracName); let carac = this.findCaracByName(caracName);
if (carac) { if (carac) {
carac = duplicate(carac); carac = duplicate(carac);
const fromXp = Number(carac.xp); const fromXp = Number(carac.xp);
@ -896,7 +899,7 @@ export class RdDActor extends RdDBaseActorSang {
/* -------------------------------------------- */ /* -------------------------------------------- */
async ajouterRefoulement(value = 1, refouler) { async ajouterRefoulement(value = 1, refouler) {
const refoulement = this.system.reve.refoulement.value + value; let refoulement = this.system.reve.refoulement.value + value;
const roll = new Roll("1d20"); const roll = new Roll("1d20");
await roll.evaluate({ async: true }); await roll.evaluate({ async: true });
await roll.toMessage({ flavor: `${this.name} refoule ${refouler} pour ${value} points de refoulement (total: ${refoulement})` }); await roll.toMessage({ flavor: `${this.name} refoule ${refouler} pour ${value} points de refoulement (total: ${refoulement})` });
@ -1166,8 +1169,8 @@ export class RdDActor extends RdDBaseActorSang {
title: "Nourriture brute", title: "Nourriture brute",
content: `Que faire de votre ${item.name}`, content: `Que faire de votre ${item.name}`,
buttons: { buttons: {
'cuisiner': { icon: '<i class="fas fa-check"></i>', label: 'Cuisiner', callback: async () => await this.preparerNourriture(item) }, 'cuisiner': { icon: '<i class="fa-solid fa-utensils"></i>', label: 'Cuisiner', callback: async () => await this.preparerNourriture(item) },
'manger': { icon: '<i class="fas fa-check"></i>', label: 'Manger cru', callback: async () => await this.mangerNourriture(item, onActionItem) } 'manger': { icon: '<i class="fa-solid fa-drumstick-bite"></i>', label: 'Manger cru', callback: async () => await this.mangerNourriture(item, onActionItem) }
} }
}); });
return utilisation.render(true); return utilisation.render(true);
@ -1472,8 +1475,14 @@ export class RdDActor extends RdDBaseActorSang {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
isCaracMax(code) {
if (code == 'force' && parseInt(this.system.carac.force.value) >= parseInt(this.system.carac.taille.value) + 4) {
return true;
}
return false
}
async checkCaracXP(caracName, display = true) { async checkCaracXP(caracName, display = true) {
let carac = RdDBaseActor._findCaracByName(this.system.carac, caracName); let carac = this.findCaracByName(caracName);
if (carac && carac.xp > 0) { if (carac && carac.xp > 0) {
const niveauSuivant = Number(carac.value) + 1; const niveauSuivant = Number(carac.value) + 1;
let xpNeeded = RdDCarac.getCaracNextXp(niveauSuivant); let xpNeeded = RdDCarac.getCaracNextXp(niveauSuivant);
@ -1534,8 +1543,11 @@ export class RdDActor extends RdDBaseActorSang {
async appliquerAjoutExperience(rollData, hideChatMessage = 'show') { async appliquerAjoutExperience(rollData, hideChatMessage = 'show') {
hideChatMessage = hideChatMessage == 'hide' || (Misc.isRollModeHiddenToPlayer() && !game.user.isGM) hideChatMessage = hideChatMessage == 'hide' || (Misc.isRollModeHiddenToPlayer() && !game.user.isGM)
let xpData = await this._appliquerExperience(rollData.rolled, rollData.selectedCarac.label, rollData.competence, rollData.jetResistance); let xpData = await this._appliquerExperience(rollData.rolled, rollData.selectedCarac.label, rollData.competence, rollData.jetResistance);
if (xpData) { if (xpData.length) {
const content = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-gain-xp.html`, xpData); const content = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-gain-xp.html`, {
actor: this,
xpData
});
if (hideChatMessage) { if (hideChatMessage) {
ChatUtility.blindMessageToGM({ content: content }); ChatUtility.blindMessageToGM({ content: content });
} }
@ -1698,7 +1710,7 @@ export class RdDActor extends RdDBaseActorSang {
if (rollData.competence.name.includes('Thanatos')) { // Si Thanatos if (rollData.competence.name.includes('Thanatos')) { // Si Thanatos
await this.update({ "system.reve.reve.thanatosused": true }); await this.update({ "system.reve.reve.thanatosused": true });
} }
let reveActuel = this.system.reve.reve.value; let reveActuel = parseInt(this.system.reve.reve.value)
if (rolled.isSuccess) { // Réussite du sort ! if (rolled.isSuccess) { // Réussite du sort !
if (rolled.isPart) { if (rolled.isPart) {
rollData.depenseReve = Math.max(Math.floor(rollData.depenseReve / 2), 1); rollData.depenseReve = Math.max(Math.floor(rollData.depenseReve / 2), 1);
@ -1804,7 +1816,10 @@ export class RdDActor extends RdDBaseActorSang {
} }
blessuresASoigner() { blessuresASoigner() {
return this.filterItems(it => it.system.gravite > 0 && it.system.gravite <= 6 && !(it.system.premierssoins.done && it.system.soinscomplets.done), 'blessure') return (this.itemTypes[TYPES.blessure])
.filter(it => it.system.gravite > 0 && it.system.gravite <= 6)
.filter(it => !(it.system.premierssoins.done && it.system.soinscomplets.done))
.sort(Misc.descending(b => (b.system.premierssoins.done ? "A" : "B") + b.system.gravite))
} }
async getTacheBlessure(blesse, blessure) { async getTacheBlessure(blesse, blessure) {
@ -2262,9 +2277,7 @@ export class RdDActor extends RdDBaseActorSang {
}); });
return undefined; return undefined;
} }
if (caracName == 'Vie') caracName = 'constitution';
if (caracName == 'derobee') caracName = 'agilite';
if (caracName == 'reve-actuel') caracName = 'reve';
let xp = Math.abs(rolled.finalLevel); let xp = Math.abs(rolled.finalLevel);
// impair: arrondi inférieur en carac // impair: arrondi inférieur en carac
let xpCarac = competence ? Math.floor(xp / 2) : Math.max(Math.floor(xp / 2), 1); let xpCarac = competence ? Math.floor(xp / 2) : Math.max(Math.floor(xp / 2), 1);
@ -2277,11 +2290,10 @@ export class RdDActor extends RdDBaseActorSang {
// max 1 xp sur jets de résistance // max 1 xp sur jets de résistance
xpCarac = Math.min(1, xpCarac); xpCarac = Math.min(1, xpCarac);
} }
let xpData = { alias: this.name, caracName, xpCarac, competence, xpCompetence }; return [
...(await this._xpCompetence({ competence, xpCompetence })),
await this._xpCompetence(xpData); ...(await this._xpCarac({ caracName, xpCarac }))
await this._xpCarac(xpData); ];
return xpData;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -2289,31 +2301,67 @@ export class RdDActor extends RdDBaseActorSang {
if (xpData.competence) { if (xpData.competence) {
const from = Number(xpData.competence.system.xp); const from = Number(xpData.competence.system.xp);
const to = from + xpData.xpCompetence; const to = from + xpData.xpCompetence;
let update = { _id: xpData.competence._id, 'system.xp': to }; await this.updateEmbeddedDocuments('Item', [{ _id: xpData.competence._id, 'system.xp': to }]);
await this.updateEmbeddedDocuments('Item', [update]);
xpData.checkComp = await this.checkCompetenceXP(xpData.competence.name, undefined, false); xpData.checkComp = await this.checkCompetenceXP(xpData.competence.name, undefined, false);
await ExperienceLog.add(this, XP_TOPIC.XP, from, to, xpData.competence.name); await ExperienceLog.add(this, XP_TOPIC.XP, from, to, xpData.competence.name);
return [xpData]
} }
return []
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async _xpCarac(xpData) { async _xpCarac(xpData) {
if (xpData.xpCarac > 0) { if (xpData.xpCarac > 0) {
let carac = duplicate(this.system.carac); const carac = duplicate(this.system.carac)
let selectedCarac = RdDBaseActor._findCaracByName(carac, xpData.caracName); const code = RdDBaseActor._findCaracNode(carac, xpData.caracName)
if (!selectedCarac.derivee) { const selectedCarac = carac[code]
const from = Number(selectedCarac.xp); if (this.isCaracMax(code)) {
const to = from + xpData.xpCarac; ui.notifications.info(`Pas d'expérience: la caractéristique '${selectedCarac.label}' est déjà au maximum pour ${this.name}`)
selectedCarac.xp = to; return []
await this.update({ "system.carac": carac }); }
xpData.checkCarac = await this.checkCaracXP(selectedCarac.label, false); if (selectedCarac && !selectedCarac.derivee) {
await ExperienceLog.add(this, XP_TOPIC.XPCARAC, from, to, xpData.caracName); const from = Number(selectedCarac.xp)
const to = from + xpData.xpCarac
selectedCarac.xp = to
await this.update({ "system.carac": carac })
xpData.checkCarac = await this.checkCaracXP(selectedCarac.label, false)
await ExperienceLog.add(this, XP_TOPIC.XPCARAC, from, to, xpData.caracName)
return [xpData]
} else { } else {
xpData.caracRepartitionManuelle = true; return await this._xpCaracDerivee(xpData)
} }
} }
return []
} }
async _xpCaracDerivee(xpData) {
const caracs = RdDActor._getComposantsCaracDerivee(xpData.caracName)
.map(c => mergeObject(this.system.carac[c], { isMax: this.isCaracMax(c) }))
switch (caracs.filter(it => !it.isMax).length) {
case 0:
xpData.caracRepartitionManuelle = true;
return [xpData]
case 1:
xpData.caracName = caracs.find(it => !it.isMax).label
return this._xpCarac(xpData)
default:
await DialogChoixXpCarac.choix(this, xpData, caracs)
return []
}
}
static _getComposantsCaracDerivee(caracName) {
switch (Grammar.toLowerCaseNoAccent(caracName)) {
case 'vie': return ['constitution']
case 'tir': return ['vue', 'dexterite']
case 'lancer': return ['force', 'dexterite', 'vue']
case 'melee': return ['force', 'agilite']
case 'derobee': return ['agilite']
}
return []
}
/* -------------------------------------------- */ /* -------------------------------------------- */
async resetNombresAstraux() { async resetNombresAstraux() {
const deletions = this.itemTypes['nombreastral'].map(it => it._id); const deletions = this.itemTypes['nombreastral'].map(it => it._id);
@ -2415,7 +2463,7 @@ export class RdDActor extends RdDBaseActorSang {
draconic: this.getDraconicList(), draconic: this.getDraconicList(),
sort: this.itemTypes['sort'], sort: this.itemTypes['sort'],
signes: this.itemTypes['signedraconique'], signes: this.itemTypes['signedraconique'],
caracReve: this.system.carac.reve.value, caracReve: parseInt(this.system.carac.reve.value),
pointsReve: this.getReveActuel(), pointsReve: this.getReveActuel(),
isRapide: isRapide, isRapide: isRapide,
isGM: game.user.isGM, isGM: game.user.isGM,
@ -2506,7 +2554,7 @@ export class RdDActor extends RdDBaseActorSang {
/* -------------------------------------------- */ /* -------------------------------------------- */
verifierForceMin(item) { verifierForceMin(item) {
if (item.type == 'arme' && item.system.force > this.system.carac.force.value) { if (item.type == 'arme' && item.system.force > parseInt(this.system.carac.force.value)) {
ChatMessage.create({ ChatMessage.create({
content: `<strong>${this.name} s'est équipé(e) de l'arme ${item.name}, mais n'a pas une force suffisante pour l'utiliser normalement </strong> content: `<strong>${this.name} s'est équipé(e) de l'arme ${item.name}, mais n'a pas une force suffisante pour l'utiliser normalement </strong>
(${item.system.force} nécessaire pour une Force de ${this.system.carac.force.value})` (${item.system.force} nécessaire pour une Force de ${this.system.carac.force.value})`
@ -2920,9 +2968,7 @@ export class RdDActor extends RdDBaseActorSang {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
isEffectAllowed(statusId) { isEffectAllowed(effectId) { return true }
return true
}
/* -------------------------------------------- */ /* -------------------------------------------- */
async onPreUpdateItem(item, change, options, id) { async onPreUpdateItem(item, change, options, id) {

View File

@ -180,32 +180,32 @@ export class RdDBaseActorReve extends RdDBaseActor {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
isEffectAllowed(statusId) { return true } isEffectAllowed(effectId) { return true }
getEffects(filter = e => true) { getEffects(filter = e => true) {
return this.getEmbeddedCollection("ActiveEffect").filter(filter); return this.getEmbeddedCollection("ActiveEffect").filter(filter);
} }
getEffect(statusId) { getEffect(effectId) {
return this.getEmbeddedCollection("ActiveEffect").find(it => it.flags?.core?.statusId == statusId); return this.getEmbeddedCollection("ActiveEffect").find(it => it.statuses?.has(effectId));
} }
async setEffect(statusId, status) { async setEffect(effectId, status) {
if (this.isEffectAllowed(statusId)) { if (this.isEffectAllowed(effectId)) {
const effect = this.getEffect(statusId); const effect = this.getEffect(effectId);
if (!status && effect) { if (!status && effect) {
await this.deleteEmbeddedDocuments('ActiveEffect', [effect.id]); await this.deleteEmbeddedDocuments('ActiveEffect', [effect.id]);
} }
if (status && !effect) { if (status && !effect) {
await this.createEmbeddedDocuments("ActiveEffect", [StatusEffects.status(statusId)]); await this.createEmbeddedDocuments("ActiveEffect", [StatusEffects.prepareActiveEffect(effectId)]);
} }
} }
} }
async removeEffect(statusId) { async removeEffect(id) {
const effect = this.getEffect(statusId); const effect = this.getEmbeddedCollection("ActiveEffect").find(it => it.id == id);
if (effect) { if (effect) {
await this.deleteEmbeddedDocuments('ActiveEffect', [effect.id]); await this.deleteEmbeddedDocuments('ActiveEffect', [id]);
} }
} }

View File

@ -21,6 +21,11 @@ export class RdDBaseActorSangSheet extends RdDBaseActorReveSheet {
this.html.find('.creer-blessure-grave').click(async event => RdDItemBlessure.createBlessure(this.actor, 4)); this.html.find('.creer-blessure-grave').click(async event => RdDItemBlessure.createBlessure(this.actor, 4));
this.html.find('.creer-blessure-critique').click(async event => RdDItemBlessure.createBlessure(this.actor, 6)); this.html.find('.creer-blessure-critique').click(async event => RdDItemBlessure.createBlessure(this.actor, 6));
this.html.find('.subir-blessure-contusion').click(async event => RdDItemBlessure.applyFullBlessure(this.actor, 2));
this.html.find('.subir-blessure-legere').click(async event => RdDItemBlessure.applyFullBlessure(this.actor, 2));
this.html.find('.subir-blessure-grave').click(async event => RdDItemBlessure.applyFullBlessure(this.actor, 4));
this.html.find('.subir-blessure-critique').click(async event => RdDItemBlessure.applyFullBlessure(this.actor, 6));
this.html.find('.jet-vie').click(async event => this.actor.jetDeVie()) this.html.find('.jet-vie').click(async event => this.actor.jetDeVie())
this.html.find('.jet-endurance').click(async event => await this.jetEndurance()) this.html.find('.jet-endurance').click(async event => await this.jetEndurance())

View File

@ -189,7 +189,7 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
this.setEffect(STATUSES.StatusComma, true); this.setEffect(STATUSES.StatusComma, true);
encaissement.mort = true; encaissement.mort = true;
ChatMessage.create({ ChatMessage.create({
content: `<img class="chat-icon" src="icons/svg/skull.svg" alt="charge" /> content: `<img class="chat-icon" src="icons/svg/skull.svg" data-tooltip="charge" />
<strong>${this.name} vient de succomber à une seconde blessure critique ! Que les Dragons gardent son Archétype en paix !</strong>` <strong>${this.name} vient de succomber à une seconde blessure critique ! Que les Dragons gardent son Archétype en paix !</strong>`
}); });
} }

View File

@ -131,20 +131,14 @@ export class RdDBaseActorSheet extends ActorSheet {
super.activateListeners(html); super.activateListeners(html);
this.html = html; this.html = html;
if (!this.options.editable) return;
this.html.find('.item-action').click(async event => {
const item = RdDSheetUtility.getItem(event, this.actor);
item?.actionPrincipale(this.actor, async () => this.render())
});
this.html.find('.conteneur-name a').click(async event => { this.html.find('.conteneur-name a').click(async event => {
RdDUtility.toggleAfficheContenu(this.getItemId(event)); RdDUtility.toggleAfficheContenu(this.getItemId(event));
this.render(true); this.render(true);
}); });
this.html.find('.actor-montrer').click(async event => this.actor.postActorToChat());
this.html.find('.item-edit').click(async event => this.getItem(event)?.sheet.render(true)) this.html.find('.item-edit').click(async event => this.getItem(event)?.sheet.render(true))
this.html.find('.item-montrer').click(async event => this.getItem(event)?.postItemToChat()); this.html.find('.item-montrer').click(async event => this.getItem(event)?.postItemToChat());
this.html.find('.actor-montrer').click(async event => this.actor.postActorToChat());
this.html.find('.recherche') this.html.find('.recherche')
.each((index, field) => { .each((index, field) => {
this._rechercheSelectArea(field); this._rechercheSelectArea(field);
@ -152,9 +146,16 @@ export class RdDBaseActorSheet extends ActorSheet {
.keyup(async event => this._rechercherKeyup(event)) .keyup(async event => this._rechercherKeyup(event))
.change(async event => this._rechercherKeyup(event)); .change(async event => this._rechercherKeyup(event));
this.html.find('.recherche').prop("disabled", false); this.html.find('.recherche').prop("disabled", false);
// Everything below here is only needed if the sheet is editable // Everything below here is only needed if the sheet is editable
if (!this.options.editable) return; if (!this.options.editable) return;
this.html.find('.item-action').click(async event => {
const item = RdDSheetUtility.getItem(event, this.actor);
item?.actionPrincipale(this.actor, async () => this.render())
});
this.html.find('.item-split').click(async event => { this.html.find('.item-split').click(async event => {
const item = this.getItem(event); const item = this.getItem(event);
RdDSheetUtility.splitItem(item, this.actor); RdDSheetUtility.splitItem(item, this.actor);

View File

@ -11,16 +11,14 @@ import { SystemCompendiums } from "../settings/system-compendiums.js";
import { APP_ASTROLOGIE_REFRESH } from "../sommeil/app-astrologie.js"; import { APP_ASTROLOGIE_REFRESH } from "../sommeil/app-astrologie.js";
export class RdDBaseActor extends Actor { export class RdDBaseActor extends Actor {
/* -------------------------------------------- */
static _findCaracByName(carac, name) {
name = Grammar.toLowerCaseNoAccent(name);
switch (name) {
case 'reve-actuel': case 'reve actuel':
return carac.reve;
case 'chance-actuelle': case 'chance actuelle':
return carac.chance;
}
static _findCaracNode(carac, name) {
return Object.entries(carac)
.filter(it => Grammar.equalsInsensitive(it[1].label, name))
.map(it => it[0])
.find(it => it);
}
static $findCaracByName(carac, name) {
const caracList = Object.entries(carac); const caracList = Object.entries(carac);
let entry = Misc.findFirstLike(name, caracList, { mapper: it => it[0], description: 'caractéristique' }); let entry = Misc.findFirstLike(name, caracList, { mapper: it => it[0], description: 'caractéristique' });
if (!entry || entry.length == 0) { if (!entry || entry.length == 0) {
@ -135,6 +133,21 @@ export class RdDBaseActor extends Actor {
super(docData, context); super(docData, context);
} }
findCaracByName(name) {
name = Grammar.toLowerCaseNoAccent(name)
switch (name) {
case 'reve-actuel': case 'reve actuel':
return this.system.carac.reve
case 'chance-actuelle': case 'chance actuelle':
return this.system.carac.chance
case 'vie':
return this.system.sante.vie
}
const carac = this.system.carac;
return RdDBaseActor.$findCaracByName(carac, name);
}
getCaracByName(name) { getCaracByName(name) {
switch (Grammar.toLowerCaseNoAccent(name)) { switch (Grammar.toLowerCaseNoAccent(name)) {
case 'reve-actuel': case 'reve actuel': case 'reve-actuel': case 'reve actuel':
@ -142,7 +155,7 @@ export class RdDBaseActor extends Actor {
case 'chance-actuelle': case 'chance-actuelle': case 'chance-actuelle': case 'chance-actuelle':
return this.getCaracChanceActuelle(); return this.getCaracChanceActuelle();
} }
return RdDBaseActor._findCaracByName(this.system.carac, name); return this.findCaracByName(name);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -187,7 +200,7 @@ export class RdDBaseActor extends Actor {
} }
listeSuivants(filter = suivant => true) { return [] } listeSuivants(filter = suivant => true) { return [] }
listeSuivants(filter = suivant =>true) { return [] } listeSuivants(filter = suivant => true) { return [] }
listItems(type = undefined) { return (type ? this.itemTypes[type] : this.items); } listItems(type = undefined) { return (type ? this.itemTypes[type] : this.items); }
filterItems(filter, type = undefined) { return (type ? this.itemTypes[type] : this.items)?.filter(filter) ?? []; } filterItems(filter, type = undefined) { return (type ? this.itemTypes[type] : this.items)?.filter(filter) ?? []; }
findItemLike(idOrName, type) { findItemLike(idOrName, type) {

View File

@ -33,8 +33,8 @@ export class RdDCreature extends RdDBaseActorSang {
} }
} }
isEffectAllowed(statusId) { isEffectAllowed(effectId) {
return [STATUSES.StatusComma].includes(statusId); return [STATUSES.StatusComma].includes(effectId);
} }
isEntiteAccordee(attacker) { isEntiteAccordee(attacker) {

View File

@ -70,8 +70,8 @@ export class RdDEntite extends RdDBaseActorReve {
await RdDEncaisser.encaisser(this) await RdDEncaisser.encaisser(this)
} }
isEffectAllowed(statusId) { isEffectAllowed(effectId) {
return [STATUSES.StatusComma].includes(statusId); return [STATUSES.StatusComma].includes(effectId);
} }
async onAppliquerJetEncaissement(encaissement, attacker) { async onAppliquerJetEncaissement(encaissement, attacker) {

View File

@ -0,0 +1,84 @@
export class DialogChoixXpCarac extends Dialog {
static async choix(actor, xpData, caracs) {
caracs = caracs.map(it => mergeObject({ ajout: 0 }, it))
xpData = mergeObject({ reste: xpData.xpCarac }, xpData)
const dialogData = {
title: `Choisissez la répartition d'expérience`,
content: await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-choix-xp-carac.hbs", {
actor,
caracDerivee: actor.findCaracByName(xpData.caracName),
xpData,
caracs
}),
}
const dialogOptions = {
classes: ["rdd-dialog-select"],
width: 400,
height: 'fit-content',
'z-index': 99999
}
new DialogChoixXpCarac(dialogData, dialogOptions, actor, xpData, caracs).render(true)
}
constructor(dialogData, dialogOptions, actor, xpData, caracs) {
dialogData = mergeObject(dialogData, {
default: 'appliquer',
buttons: {
'appliquer': { icon:'<i class="fa-solid fa-check"></i>', label: "Ajouter la répartition", callback: it => this.appliquerSelection() }
}
})
super(dialogData, dialogOptions)
this.actor = actor
this.xpData = xpData
this.caracs = caracs
}
activateListeners(html) {
//TODO
super.activateListeners(html)
this.html = html
this.html.find("li.xpCarac-option .xpCarac-moins").click(event =>
this.ajouterXp(event, -1)
)
this.html.find("li.xpCarac-option .xpCarac-plus").click(event =>
this.ajouterXp(event, 1)
)
}
async ajouterXp(event, delta) {
const liCarac = this.html.find(event.currentTarget)?.parents("li.xpCarac-option")
const label = liCarac?.data("carac-label")
const carac = this.caracs.find(c => c.label == label)
if (carac.ajout + delta < 0) {
ui.notifications.warn(`Impossible de diminuer les points à répartir en ${carac.label} en dessous de 0`)
return
}
if (this.xpData.reste - delta < 0) {
ui.notifications.warn(`Il ne reste plus de points à répartir en ${carac.label}`)
return
}
carac.ajout += delta
this.xpData.reste -= delta
liCarac.find("input.xpCarac-view-ajout").val(carac.ajout)
this.html.find("input.xpCarac-reste").val(this.xpData.reste)
}
async appliquerSelection() {
if (this.xpData.reste > 0) {
ui.notifications.warn(`Il vous reste ${this.xpData.reste} points à répartir`)
return
}
this.caracs.filter(c => c.ajout > 0).forEach(c => {
const xpData = { caracName: c.label, xpCarac: c.ajout }
this.actor._xpCarac(xpData)
})
await super.close()
}
async close() { }
_getHeaderButtons() { return [] }
}

View File

@ -1,6 +1,7 @@
import { RdDItem } from "../item.js"; import { RdDItem } from "../item.js";
import { Misc } from "../misc.js"; import { Misc } from "../misc.js";
import { RdDTimestamp } from "../time/rdd-timestamp.js"; import { RdDTimestamp } from "../time/rdd-timestamp.js";
import { ChatUtility } from "../chat-utility.js";
const BASE_TACHE_SOIN_BLESSURE = { const BASE_TACHE_SOIN_BLESSURE = {
type: "tache", type: "tache",
@ -14,10 +15,10 @@ const TACHES_SOIN_BLESSURE = {
} }
const definitionsBlessures = [ const definitionsBlessures = [
{ type: "contusion", gravite: 0, label: 'Contusion/éraflure', max: 100, icon: "systems/foundryvtt-reve-de-dragon/icons/sante/eraflure.webp" }, { type: "contusion", gravite: 0, endurance: "1d4", vie: 0, label: 'Contusion/éraflure', max: 100, icon: "systems/foundryvtt-reve-de-dragon/icons/sante/eraflure.webp" },
{ type: "legere", gravite: 2, label: 'Légère', max: 5, icon: "systems/foundryvtt-reve-de-dragon/icons/sante/blessure.webp" }, { type: "legere", gravite: 2, endurance: "1d6", vie: 0, label: 'Légère', max: 5, icon: "systems/foundryvtt-reve-de-dragon/icons/sante/blessure.webp" },
{ type: "grave", gravite: 4, label: 'Grave', max: 2, icon: "systems/foundryvtt-reve-de-dragon/icons/sante/blessure.webp" }, { type: "grave", gravite: 4, endurance: "2d6", vie: -2, label: 'Grave', max: 2, icon: "systems/foundryvtt-reve-de-dragon/icons/sante/blessure.webp" },
{ type: "critique", gravite: 6, label: 'Critique', max: 1, icon: "systems/foundryvtt-reve-de-dragon/icons/sante/blessure.webp" }, { type: "critique", gravite: 6, endurance: "-100", vie: -4, label: 'Critique', max: 1, icon: "systems/foundryvtt-reve-de-dragon/icons/sante/blessure.webp" },
{ type: "mort", gravite: 8, label: 'Mort', max: 1, icon: "systems/foundryvtt-reve-de-dragon/icons/sante/mort.webp" } { type: "mort", gravite: 8, label: 'Mort', max: 1, icon: "systems/foundryvtt-reve-de-dragon/icons/sante/mort.webp" }
] ]
@ -40,6 +41,32 @@ export class RdDItemBlessure extends RdDItem {
} }
return mergeObject(duplicate(BASE_TACHE_SOIN_BLESSURE), tache) return mergeObject(duplicate(BASE_TACHE_SOIN_BLESSURE), tache)
} }
static async applyFullBlessure(actor, gravite) {
const definition = RdDItemBlessure.getDefinition(gravite)
let lostEndurance = 0
let lostVie = 0
if (definition.endurance) {
lostEndurance = new Roll(definition.endurance).roll({async: false}).total;
actor.santeIncDec("endurance", -Number(lostEndurance));
}
if (definition.vie) {
lostVie = definition.vie
actor.santeIncDec("vie", definition.vie)
}
await this.createBlessure(actor, gravite)
ChatMessage.create({
content: `Blessure ${definition.label} appliquée à ${actor.name}`+
`<br>Perte d'endurance : ${lostEndurance}`+
`<br>Perte de Vie : ${lostVie}`,
whisper: ChatUtility.getWhisperRecipientsAndGMs(actor.name)
});
}
static async createBlessure(actor, gravite, localisation = '', attacker) { static async createBlessure(actor, gravite, localisation = '', attacker) {
const definition = RdDItemBlessure.getDefinition(gravite) const definition = RdDItemBlessure.getDefinition(gravite)
const blessure = { const blessure = {

View File

@ -22,6 +22,10 @@ export class Misc {
const isPositiveNumber = value != NaN && value > 0; const isPositiveNumber = value != NaN && value > 0;
return isPositiveNumber ? "+" + number : number return isPositiveNumber ? "+" + number : number
} }
static modulo(n, m) {
return ((n % m) + m) % m;
}
static sum() { static sum() {
return (a, b) => Number(a) + Number(b); return (a, b) => Number(a) + Number(b);

View File

@ -19,10 +19,6 @@ export class RdDBonus {
} }
static isAjustementAstrologique(rollData) {
return RdDCarac.isChance(rollData.selectedCarac) ||
rollData.selectedSort?.system.isrituel;
}
/* -------------------------------------------- */ /* -------------------------------------------- */
static isDefenseAttaqueFinesse(rollData) { static isDefenseAttaqueFinesse(rollData) {
if (rollData.isEmpoignade && rollData.rolled?.isPart) { if (rollData.isEmpoignade && rollData.rolled?.isPart) {

View File

@ -328,8 +328,8 @@ export class RdDCombatManager extends Combat {
} }
} }
options = [ options = [
{ name: "Incrémenter initiative", condition: true, icon: '<i class="fas fa-plus"></i>', callback: target => { RdDCombatManager.incDecInit(target.data('combatant-id'), +0.01); } }, { name: "Incrémenter initiative", condition: true, icon: '<i class="fa-solid fa-plus"></i>', callback: target => { RdDCombatManager.incDecInit(target.data('combatant-id'), +0.01); } },
{ name: "Décrémenter initiative", condition: true, icon: '<i class="fas fa-minus"></i>', callback: target => { RdDCombatManager.incDecInit(target.data('combatant-id'), -0.01); } } { name: "Décrémenter initiative", condition: true, icon: '<i class="fa-solid fa-minus"></i>', callback: target => { RdDCombatManager.incDecInit(target.data('combatant-id'), -0.01); } }
].concat(options); ].concat(options);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -515,7 +515,7 @@ export class RdDCombat {
static _callJetDeVie(event) { static _callJetDeVie(event) {
let actorId = event.currentTarget.attributes['data-actorId'].value; let actorId = event.currentTarget.attributes['data-actorId'].value;
let tokenId = event.currentTarget.attributes['data-tokenId'].value; let tokenId = event.currentTarget.attributes['data-tokenId'].value;
let token = canvas.tokens.placeables.find(t => t.id == tokenId) let token = canvas.tokens.get(tokenId)
const actor = token?.actor ?? game.actors.get(actorId); const actor = token?.actor ?? game.actors.get(actorId);
if (actor?.isOwner) { if (actor?.isOwner) {
actor.jetDeVie(); actor.jetDeVie();
@ -1307,6 +1307,7 @@ export class RdDCombat {
blessuresStatus: actor.computeResumeBlessure(), blessuresStatus: actor.computeResumeBlessure(),
SConst: actor.getSConst(), SConst: actor.getSConst(),
actorId: actor.id, actorId: actor.id,
actor: actor,
tokenId: tokenId, tokenId: tokenId,
isGrave: actor.countBlessures(it => it.isGrave()) > 0, isGrave: actor.countBlessures(it => it.isGrave()) > 0,
isCritique: actor.countBlessures(it => it.isCritique()) > 0 isCritique: actor.countBlessures(it => it.isCritique()) > 0

View File

@ -16,6 +16,7 @@ import { RdDRollTables } from "./rdd-rolltables.js";
import { RdDUtility } from "./rdd-utility.js"; import { RdDUtility } from "./rdd-utility.js";
import { FenetreRechercheTirage } from "./tirage/fenetre-recherche-tirage.js"; import { FenetreRechercheTirage } from "./tirage/fenetre-recherche-tirage.js";
import { TMRUtility } from "./tmr-utility.js"; import { TMRUtility } from "./tmr-utility.js";
import { DialogFatigueVoyage } from "./voyage/dialog-fatigue-voyage.js";
const rddRollNumeric = /^(\d+)\s*([\+\-]?\d+)?\s*(s)?/; const rddRollNumeric = /^(\d+)\s*([\+\-]?\d+)?\s*(s)?/;
@ -76,6 +77,7 @@ export class RdDCommands {
this.registerCommand({ path: ["/tirer", "desir"], func: (content, msg, params) => RdDRollTables.getDesirLancinant('chat'), descr: "Tire un Désir Lancinant" }); this.registerCommand({ path: ["/tirer", "desir"], func: (content, msg, params) => RdDRollTables.getDesirLancinant('chat'), descr: "Tire un Désir Lancinant" });
this.registerCommand({ path: ["/tirer", "rencontre"], func: (content, msg, params) => this.getRencontreTMR(params), descr: `Détermine une rencontre dans les TMR (synonyme de "/tmrr")` }); this.registerCommand({ path: ["/tirer", "rencontre"], func: (content, msg, params) => this.getRencontreTMR(params), descr: `Détermine une rencontre dans les TMR (synonyme de "/tmrr")` });
this.registerCommand({ path: ["/tirage"], func: (content, msg, params) => this.tirage(), descr: "Ouvre la fenêtre de recherche et tirage" }); this.registerCommand({ path: ["/tirage"], func: (content, msg, params) => this.tirage(), descr: "Ouvre la fenêtre de recherche et tirage" });
this.registerCommand({ path: ["/voyage"], func: (content, msg, params) => this.voyage(msg, params), descr: "Gérer le voyage" });
this.registerCommand({ path: ["/sommeil"], func: (content, msg, params) => this.sommeil(msg, params), descr: "Prépare le passage de journée pour chateau dormant" }); this.registerCommand({ path: ["/sommeil"], func: (content, msg, params) => this.sommeil(msg, params), descr: "Prépare le passage de journée pour chateau dormant" });
this.registerCommand({ path: ["/meteo"], func: (content, msg, params) => this.getMeteo(msg, params), descr: "Propose une météo marine" }); this.registerCommand({ path: ["/meteo"], func: (content, msg, params) => this.getMeteo(msg, params), descr: "Propose une météo marine" });
@ -298,7 +300,7 @@ export class RdDCommands {
async getRencontreTMR(params) { async getRencontreTMR(params) {
if (params.length == 1 || params.length == 2) { if (params.length == 1 || params.length == 2) {
return game.system.rdd.rencontresTMR.rollRencontre(params[0], params[1]) return game.system.rdd.rencontresTMR.rollRencontre(params[0], params[1])
} }
return false; return false;
} }
@ -485,10 +487,13 @@ export class RdDCommands {
} }
async tirage() { async tirage() {
FenetreRechercheTirage.create(); FenetreRechercheTirage.create()
}
async voyage() {
DialogFatigueVoyage.create()
} }
async sommeil() { async sommeil() {
DialogChateauDormant.create(); DialogChateauDormant.create()
} }
} }

View File

@ -266,16 +266,16 @@ export class SystemReveDeDragon {
/* -------------------------------------------- */ /* -------------------------------------------- */
/* Foundry VTT Initialization */ /* Foundry VTT Initialization */
/* -------------------------------------------- */ /* -------------------------------------------- */
// CSS patch for v9
if (game.version) {
let sidebar = document.getElementById("sidebar");
sidebar.style.width = "min-content";
}
game.system.rdd.calendrier = new RdDCalendrier(); game.system.rdd.calendrier = new RdDCalendrier();
if (Misc.isUniqueConnectedGM()) { if (Misc.isUniqueConnectedGM()) {
new Migrations().migrate(); new Migrations().migrate();
this.messageDeBienvenue(); this.messageDeBienvenue();
this.registerUsageCount(SYSTEM_RDD); import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter=>{
console.log("ClassCounter loaded", moduleCounter)
moduleCounter.ClassCounter.registerUsageCount()
}).catch(err=>
console.log("No stats available, giving up.")
)
} }
StatusEffects.onReady(); StatusEffects.onReady();
@ -306,30 +306,6 @@ export class SystemReveDeDragon {
` }); ` });
} }
} }
/* -------------------------------------------- */
// Register world usage statistics
async registerUsageCount(registerKey) {
if (game.user.isGM) {
game.settings.register("world", "world-key", {
name: "Unique world key",
scope: "world",
config: false,
default: "NONE",
type: String
});
let worldKey = game.settings.get("world", "world-key")
if (worldKey == undefined || worldKey == "") {
worldKey = randomID(32)
game.settings.set("world", "world-key", worldKey)
}
let regURL = `https://www.uberwald.me/fvtt_appcount/count.php?name="${registerKey}"&worldKey="${worldKey}"&version="${game.release.generation}.${game.release.build}"&system="${game.system.id}"&systemversion="${game.system.version}"`
$.ajax(regURL)
/* -------------------------------------------- */
}
}
} }
SystemReveDeDragon.start(); SystemReveDeDragon.start();

View File

@ -44,6 +44,7 @@ export class RdDRoll extends Dialog {
diffLibre: rollData.competence?.system.default_diffLibre ?? 0, diffLibre: rollData.competence?.system.default_diffLibre ?? 0,
perteMoralEchec: false, /* Pour l'affichage dans le chat */ perteMoralEchec: false, /* Pour l'affichage dans le chat */
use: { use: {
astrologique: true,
moral: false, /* Est-ce que le joueur demande d'utiliser le moral ? Utile si le joueur change plusieurs fois de carac associée. */ moral: false, /* Est-ce que le joueur demande d'utiliser le moral ? Utile si le joueur change plusieurs fois de carac associée. */
libre: true, libre: true,
coeur: undefined, coeur: undefined,
@ -214,6 +215,10 @@ export class RdDRoll extends Dialog {
this.rollData[attribute] = event.currentTarget.checked; this.rollData[attribute] = event.currentTarget.checked;
this.updateRollResult(html); this.updateRollResult(html);
}); });
this.html.find('input.use-astrologique').change((event) => {
this.rollData.use.astrologique = event.currentTarget.checked;
this.updateRollResult(html);
});
this.html.find('input.use-encTotal').change((event) => { this.html.find('input.use-encTotal').change((event) => {
this.rollData.use.encTotal = event.currentTarget.checked; this.rollData.use.encTotal = event.currentTarget.checked;
this.updateRollResult(html); this.updateRollResult(html);
@ -314,6 +319,7 @@ export class RdDRoll extends Dialog {
HtmlUtility.showControlWhen(this.html.find(".use-encTotal"), rollData.ajustements.encTotal.visible && RdDCarac.isAgiliteOuDerobee(rollData.selectedCarac)); HtmlUtility.showControlWhen(this.html.find(".use-encTotal"), rollData.ajustements.encTotal.visible && RdDCarac.isAgiliteOuDerobee(rollData.selectedCarac));
HtmlUtility.showControlWhen(this.html.find(".use-surenc"), rollData.ajustements.surenc.visible && RdDCarac.isActionPhysique(rollData.selectedCarac)); HtmlUtility.showControlWhen(this.html.find(".use-surenc"), rollData.ajustements.surenc.visible && RdDCarac.isActionPhysique(rollData.selectedCarac));
HtmlUtility.showControlWhen(this.html.find(".use-astrologique"), rollData.ajustements.astrologique.visible);
HtmlUtility.showControlWhen(this.html.find(".utilisation-moral"), rollData.use.appelAuMoral); HtmlUtility.showControlWhen(this.html.find(".utilisation-moral"), rollData.use.appelAuMoral);
HtmlUtility.showControlWhen(this.html.find(".divAppelAuMoral"), rollData.use.appelAuMoral); HtmlUtility.showControlWhen(this.html.find(".divAppelAuMoral"), rollData.use.appelAuMoral);
HtmlUtility.showControlWhen(this.html.find(".utilisation-coeur"), rollData.ajustements.coeur.visible); HtmlUtility.showControlWhen(this.html.find(".utilisation-coeur"), rollData.ajustements.coeur.visible);

View File

@ -17,6 +17,7 @@ import { STATUSES } from "./settings/status-effects.js";
import { RdDRencontre } from "./item/rencontre.js"; import { RdDRencontre } from "./item/rencontre.js";
import { RdDTimestamp } from "./time/rdd-timestamp.js"; import { RdDTimestamp } from "./time/rdd-timestamp.js";
import { TYPES } from "./item.js"; import { TYPES } from "./item.js";
import { Misc } from "./misc.js";
const TMR_DISPLAY_SIZE = { const TMR_DISPLAY_SIZE = {
code: 'tmr-display-size', code: 'tmr-display-size',
@ -141,7 +142,7 @@ export class RdDTMRDialog extends Dialog {
// Le reste... // Le reste...
this.updateValuesDisplay(); this.updateValuesDisplay();
} }
async onDeplacement() { async onDeplacement() {
await this.manageRencontre(TMRUtility.getTMR(this._getCoordActor())); await this.manageRencontre(TMRUtility.getTMR(this._getCoordActor()));
} }
@ -162,9 +163,11 @@ export class RdDTMRDialog extends Dialog {
} }
async forceTMRDisplay() { async forceTMRDisplay() {
this.bringToTop() if (this.rendered) {
if (this.subdialog?.bringToTop) { this.bringToTop()
this.subdialog.bringToTop(); if (this.subdialog?.bringToTop) {
this.subdialog.bringToTop();
}
} }
} }
@ -247,26 +250,21 @@ export class RdDTMRDialog extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
_getTokensCasesTmr() { _getTokensCasesTmr() {
return this.casesSpeciales.map(c => this._tokenCaseSpeciale(c)).filter(token => token); return Misc.concat(this.casesSpeciales.map(caseSpeciale =>
} Draconique.get(caseSpeciale.system.specific)?.token(this.pixiTMR, caseSpeciale, () => caseSpeciale.system.coord)
_getTokensRencontres() { ))
return this.rencontresExistantes.map(it => this._tokenRencontre(it));
}
_getTokensSortsReserve() {
return this.actor.itemTypes[TYPES.sortreserve].map(it => this._tokenSortEnReserve(it));
} }
/* -------------------------------------------- */ _getTokensRencontres() {
_tokenRencontre(rencontre) { return Misc.concat(this.rencontresExistantes.map(rencontre =>
return EffetsDraconiques.rencontre.token(this.pixiTMR, rencontre, () => rencontre.system.coord); EffetsDraconiques.rencontre.tokens(this.pixiTMR, rencontre, () => rencontre.system.coord)
))
} }
_tokenCaseSpeciale(casetmr) {
const caseData = casetmr; _getTokensSortsReserve() {
const draconique = Draconique.get(caseData.system.specific); const sortsReserve = this.actor.itemTypes[TYPES.sortreserve];
return draconique?.token(this.pixiTMR, caseData, () => caseData.system.coord); return Misc.concat(sortsReserve.map(sortReserve =>
} EffetsDraconiques.sortReserve.tokens(this.pixiTMR, sortReserve, () => sortReserve.system.coord)))
_tokenSortEnReserve(sortReserve) {
return EffetsDraconiques.sortReserve.token(this.pixiTMR, sortReserve, () => sortReserve.system.coord);
} }
_tokenDemiReve() { _tokenDemiReve() {
@ -342,7 +340,7 @@ export class RdDTMRDialog extends Dialog {
this._tellToGM(this.actor.name + " a quitté les terres médianes"); this._tellToGM(this.actor.name + " a quitté les terres médianes");
} }
await this.actor.santeIncDec((ReglesOptionnelles.isUsing("appliquer-fatigue") ? "fatigue" : "endurance"), await this.actor.santeIncDec((ReglesOptionnelles.isUsing("appliquer-fatigue") ? "fatigue" : "endurance"),
this.cumulFatigue) this.cumulFatigue)
} }
await super.close(); await super.close();
this.pixiTMR.close() this.pixiTMR.close()
@ -581,7 +579,7 @@ export class RdDTMRDialog extends Dialog {
} }
this.descenteTMR = false; this.descenteTMR = false;
this.currentRencontre = undefined; this.currentRencontre = undefined;
if (this._presentCite(tmr)) { if (await this._presentCite(tmr)) {
return; return;
} }
this.currentRencontre = await this._jetDeRencontre(tmr); this.currentRencontre = await this._jetDeRencontre(tmr);
@ -592,7 +590,7 @@ export class RdDTMRDialog extends Dialog {
} }
else { else {
const dialog = new RdDTMRRencontreDialog(this.actor, this.currentRencontre, tmr); const dialog = new RdDTMRRencontreDialog(this.actor, this.currentRencontre, tmr);
dialog.render(true); await dialog.render(true);
this.setTMRPendingAction(dialog); this.setTMRPendingAction(dialog);
} }
} }
@ -602,11 +600,11 @@ export class RdDTMRDialog extends Dialog {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
_presentCite(tmr) { async _presentCite(tmr) {
const presentCite = this.casesSpeciales.find(c => EffetsDraconiques.presentCites.isCase(c, tmr.coord)); const presentCite = this.casesSpeciales.find(c => EffetsDraconiques.presentCites.isCase(c, tmr.coord));
if (presentCite) { if (presentCite) {
const caseData = presentCite; const caseData = presentCite;
const dialog = EffetsDraconiques.presentCites.choisirUnPresent(caseData, present => { const dialog = await EffetsDraconiques.presentCites.choisirUnPresent(caseData, present => {
this._utiliserPresentCite(presentCite, present, tmr) this._utiliserPresentCite(presentCite, present, tmr)
this.restoreTMRAfterAction(); this.restoreTMRAfterAction();
}); });
@ -702,7 +700,6 @@ export class RdDTMRDialog extends Dialog {
} }
async _resultatMaitriseCaseHumide(rollData) { async _resultatMaitriseCaseHumide(rollData) {
await this.souffleSiEchecTotal(rollData);
if (rollData.rolled.isSuccess && rollData.double) { if (rollData.rolled.isSuccess && rollData.double) {
rollData.previous = { rolled: rollData.rolled, ajustements: rollData.ajustements }; rollData.previous = { rolled: rollData.rolled, ajustements: rollData.ajustements };
rollData.double = undefined; rollData.double = undefined;
@ -717,6 +714,7 @@ export class RdDTMRDialog extends Dialog {
if (rollData.rolled.isEchec) { if (rollData.rolled.isEchec) {
await this.close(); await this.close();
} }
await this.souffleSiEchecTotal(rollData);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -1126,6 +1124,9 @@ export class RdDTMRDialog extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
_trackToken(token) { _trackToken(token) {
if (!token) {
return
}
if (this.demiReve === token && this.isDemiReveCache()) { if (this.demiReve === token && this.isDemiReveCache()) {
return; return;
} }

View File

@ -90,7 +90,6 @@ export class RdDTokenHud {
if (target?.actor) { if (target?.actor) {
const hudSoins = { blessures: target.actor.blessuresASoigner() ?? [] }; const hudSoins = { blessures: target.actor.blessuresASoigner() ?? [] };
if (hudSoins.blessures.length > 0) { if (hudSoins.blessures.length > 0) {
// soins
const controlIconTarget = html.find('.control-icon[data-action=combat]'); const controlIconTarget = html.find('.control-icon[data-action=combat]');
await RdDTokenHud._configureSubMenu(controlIconTarget, await RdDTokenHud._configureSubMenu(controlIconTarget,
'systems/foundryvtt-reve-de-dragon/templates/hud-actor-soins.hbs', 'systems/foundryvtt-reve-de-dragon/templates/hud-actor-soins.hbs',

View File

@ -63,12 +63,6 @@ const cumulFatigueMatrix = _cumulSegmentsFatigue(fatigueMatrix);
const fatigueMalus = [0, 0, 0, -1, -1, -1, -2, -3, -4, -5, -6, -7]; // Provides the malus for each segment of fatigue const fatigueMalus = [0, 0, 0, -1, -1, -1, -2, -3, -4, -5, -6, -7]; // Provides the malus for each segment of fatigue
const fatigueLineSize = [3, 6, 7, 8, 9, 10, 11, 12]; const fatigueLineSize = [3, 6, 7, 8, 9, 10, 11, 12];
const fatigueLineMalus = [0, -1, -2, -3, -4, -5, -6, -7]; const fatigueLineMalus = [0, -1, -2, -3, -4, -5, -6, -7];
const fatigueMarche = {
"aise": { "4": 1, "6": 2, "8": 3, "10": 4, "12": 6 },
"malaise": { "4": 2, "6": 3, "8": 4, "10": 6 },
"difficile": { "4": 3, "6": 4, "8": 6 },
"tresdifficile": { "4": 4, "6": 6 }
}
/* -------------------------------------------- */ /* -------------------------------------------- */
const nomEthylisme = ["Emeché", "Gris", "Pinté", "Pas frais", "Ivre", "Bu", "Complètement fait", "Ivre mort"]; const nomEthylisme = ["Emeché", "Gris", "Pinté", "Pas frais", "Ivre", "Bu", "Complètement fait", "Ivre mort"];
@ -208,6 +202,8 @@ export class RdDUtility {
'systems/foundryvtt-reve-de-dragon/templates/coeur/afficher-coeur.hbs', 'systems/foundryvtt-reve-de-dragon/templates/coeur/afficher-coeur.hbs',
'systems/foundryvtt-reve-de-dragon/templates/tirage/liste-resultats-recherche.hbs', 'systems/foundryvtt-reve-de-dragon/templates/tirage/liste-resultats-recherche.hbs',
'systems/foundryvtt-reve-de-dragon/templates/time/horloge.hbs', 'systems/foundryvtt-reve-de-dragon/templates/time/horloge.hbs',
'systems/foundryvtt-reve-de-dragon/templates/voyage/fatigue-actor.hbs',
'systems/foundryvtt-reve-de-dragon/templates/voyage/option-vitesse-fatigue.hbs',
'systems/foundryvtt-reve-de-dragon/templates/common/timestamp.hbs', 'systems/foundryvtt-reve-de-dragon/templates/common/timestamp.hbs',
'systems/foundryvtt-reve-de-dragon/templates/common/periodicite.hbs', 'systems/foundryvtt-reve-de-dragon/templates/common/periodicite.hbs',
'systems/foundryvtt-reve-de-dragon/templates/common/enum-duree.hbs', 'systems/foundryvtt-reve-de-dragon/templates/common/enum-duree.hbs',
@ -215,15 +211,16 @@ export class RdDUtility {
'systems/foundryvtt-reve-de-dragon/templates/partial-description-overflow.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-description-overflow.html',
'systems/foundryvtt-reve-de-dragon/templates/partial-description-sort.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-description-sort.html',
'systems/foundryvtt-reve-de-dragon/templates/partial-roll-ajustements.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-ajustements.html',
'systems/foundryvtt-reve-de-dragon/templates/partial-roll-astrologique.hbs',
'systems/foundryvtt-reve-de-dragon/templates/partial-roll-coeur.hbs',
'systems/foundryvtt-reve-de-dragon/templates/partial-roll-competences.html',
'systems/foundryvtt-reve-de-dragon/templates/partial-roll-diffLibre.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-diffLibre.html',
'systems/foundryvtt-reve-de-dragon/templates/partial-roll-diffFixe.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-diffFixe.html',
'systems/foundryvtt-reve-de-dragon/templates/partial-roll-diffCondition.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-diffCondition.html',
'systems/foundryvtt-reve-de-dragon/templates/partial-roll-surenc.html',
'systems/foundryvtt-reve-de-dragon/templates/partial-roll-enctotal.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-enctotal.html',
'systems/foundryvtt-reve-de-dragon/templates/partial-roll-moral.html',
'systems/foundryvtt-reve-de-dragon/templates/partial-roll-coeur.hbs',
'systems/foundryvtt-reve-de-dragon/templates/partial-roll-forcer.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-forcer.html',
'systems/foundryvtt-reve-de-dragon/templates/partial-roll-competences.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-roll-moral.html',
'systems/foundryvtt-reve-de-dragon/templates/partial-roll-surenc.html',
'systems/foundryvtt-reve-de-dragon/templates/partial-select-carac.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-select-carac.html',
'systems/foundryvtt-reve-de-dragon/templates/partial-item-hautrevant.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-item-hautrevant.html',
'systems/foundryvtt-reve-de-dragon/templates/partial-item-frequence.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-item-frequence.html',
@ -287,6 +284,7 @@ export class RdDUtility {
Handlebars.registerHelper('timestamp-formulesDuree', () => RdDTimestamp.formulesDuree()); Handlebars.registerHelper('timestamp-formulesDuree', () => RdDTimestamp.formulesDuree());
Handlebars.registerHelper('timestamp-formulesPeriode', () => RdDTimestamp.formulesPeriode()); Handlebars.registerHelper('timestamp-formulesPeriode', () => RdDTimestamp.formulesPeriode());
Handlebars.registerHelper('array-includes', (array, value) => array.includes(value));
Handlebars.registerHelper('min', (...args) => Math.min(...args.slice(0, -1))); Handlebars.registerHelper('min', (...args) => Math.min(...args.slice(0, -1)));
Handlebars.registerHelper('regle-optionnelle', (option) => ReglesOptionnelles.isUsing(option)); Handlebars.registerHelper('regle-optionnelle', (option) => ReglesOptionnelles.isUsing(option));
Handlebars.registerHelper('trier', list => list.sort((a, b) => a.name.localeCompare(b.name))); Handlebars.registerHelper('trier', list => list.sort((a, b) => a.name.localeCompare(b.name)));

View File

@ -64,19 +64,30 @@ export const referenceAjustements = {
}, },
encTotal: { encTotal: {
isVisible: (rollData, actor) => RdDCarac.isAgiliteOuDerobee(rollData.selectedCarac) && RdDItemCompetence.isMalusEncombrementTotal(rollData.competence), isVisible: (rollData, actor) => RdDCarac.isAgiliteOuDerobee(rollData.selectedCarac) && RdDItemCompetence.isMalusEncombrementTotal(rollData.competence),
isUsed: (rollData, actor) => !rollData.oeuvre && RdDCarac.isAgiliteOuDerobee(rollData.selectedCarac) && RdDItemCompetence.isMalusEncombrementTotal(rollData.competence) && rollData.use.encTotal, isUsed: (rollData, actor) => !rollData.oeuvre && RdDCarac.isAgiliteOuDerobee(rollData.selectedCarac) && RdDItemCompetence.isMalusEncombrementTotal(rollData.competence) && rollData.use?.encTotal,
getLabel: (rollData, actor) => 'Encombrement total', getLabel: (rollData, actor) => 'Encombrement total',
getValue: (rollData, actor) => -actor.getEncTotal() getValue: (rollData, actor) => -actor.getEncTotal()
}, },
surenc: { surenc: {
isVisible: (rollData, actor) => RdDCarac.isActionPhysique(rollData.selectedCarac) && actor.isSurenc(), isVisible: (rollData, actor) => RdDCarac.isActionPhysique(rollData.selectedCarac) && actor.isSurenc(),
isUsed: (rollData, actor) => rollData.use?.surenc && RdDCarac.isActionPhysique(rollData.selectedCarac), isUsed: (rollData, actor) => rollData.use.surenc && RdDCarac.isActionPhysique(rollData.selectedCarac),
getLabel: (rollData, actor) => 'Sur-encombrement', getLabel: (rollData, actor) => 'Sur-encombrement',
getValue: (rollData, actor) => actor.computeMalusSurEncombrement() getValue: (rollData, actor) => actor.computeMalusSurEncombrement()
}, },
rituel: {
isUsed: (rollData, actor) => actor.isPersonnage() && ReglesOptionnelles.isUsing("astrologie") && rollData.selectedSort?.system.isrituel,
getLabel: (rollData, actor) => 'Astrologique',
getValue: (rollData, actor) => actor.ajustementAstrologique()
},
astrologique: {
isVisible: (rollData, actor) => actor.isPersonnage() && ReglesOptionnelles.isUsing("astrologie") && RdDCarac.isChance(rollData.selectedCarac),
isUsed: (rollData, actor) => RdDCarac.isChance(rollData.selectedCarac) && rollData.use.astrologique,
getLabel: (rollData, actor) => 'Astrologique',
getValue: (rollData, actor) => actor.ajustementAstrologique()
},
moral: { moral: {
isVisible: (rollData, actor) => actor.isPersonnage() && RdDCarac.isActionPhysique(rollData.selectedCarac) && rollData.use?.moral, isVisible: (rollData, actor) => actor.isPersonnage() && RdDCarac.isActionPhysique(rollData.selectedCarac) && rollData.use?.moral,
isUsed: (rollData, actor) => rollData.use?.moral, isUsed: (rollData, actor) => rollData.use.moral,
getLabel: (rollData, actor) => 'Appel au moral', getLabel: (rollData, actor) => 'Appel au moral',
getValue: (rollData, actor) => 1 getValue: (rollData, actor) => 1
}, },
@ -91,11 +102,6 @@ export const referenceAjustements = {
getLabel: (rollData, actor) => 'Moral', getLabel: (rollData, actor) => 'Moral',
getValue: (rollData, actor) => actor.getMoralTotal() getValue: (rollData, actor) => actor.getMoralTotal()
}, },
astrologique: {
isUsed: (rollData, actor) => ReglesOptionnelles.isUsing("astrologie") && RdDBonus.isAjustementAstrologique(rollData),
getLabel: (rollData, actor) => 'Astrologique',
getValue: (rollData, actor) => actor.ajustementAstrologique()
},
facteurSign: { facteurSign: {
isUsed: (rollData, actor) => rollData.diviseurSignificative > 1, isUsed: (rollData, actor) => rollData.diviseurSignificative > 1,
getLabel: (rollData, actor) => Misc.getFractionHtml(rollData.diviseurSignificative), getLabel: (rollData, actor) => Misc.getFractionHtml(rollData.diviseurSignificative),
@ -141,7 +147,7 @@ export const referenceAjustements = {
getLabel: (rollData, actor) => "Force de l'alcool: ", getLabel: (rollData, actor) => "Force de l'alcool: ",
getValue: (rollData, actor) => rollData.forceAlcool, getValue: (rollData, actor) => rollData.forceAlcool,
}, },
ethylisme:{ ethylisme: {
isVisible: (rollData, actor) => rollData.ethylisme != undefined, isVisible: (rollData, actor) => rollData.ethylisme != undefined,
isUsed: (rollData, actor) => rollData.ethylisme != undefined, isUsed: (rollData, actor) => rollData.ethylisme != undefined,
getLabel: (rollData, actor) => "Ethylisme - " + RdDUtility.getNomEthylisme(rollData.ethylisme), getLabel: (rollData, actor) => "Ethylisme - " + RdDUtility.getNomEthylisme(rollData.ethylisme),
@ -159,7 +165,9 @@ export class RollDataAjustements {
/* -------------------------------------------- */ /* -------------------------------------------- */
static calcul(rollData, actor) { static calcul(rollData, actor) {
rollData.ajustements = {}; // s'assurer de la correction des infos rollData
mergeObject(rollData, { ajustements: {}, use: {} }, { overwrite: false })
for (var key in referenceAjustements) { for (var key in referenceAjustements) {
const reference = referenceAjustements[key]; const reference = referenceAjustements[key];
rollData.ajustements[key] = { rollData.ajustements[key] = {
@ -191,4 +199,5 @@ export class RollDataAjustements {
RdDCarac.isChance(selectedCarac) || RdDCarac.isChance(selectedCarac) ||
(RdDCarac.isReve(selectedCarac) && !rollData.competence); (RdDCarac.isReve(selectedCarac) && !rollData.competence);
} }
} }

View File

@ -1,13 +1,13 @@
import { SYSTEM_RDD } from "../constants.js"; import { SYSTEM_RDD } from "../constants.js";
export const STATUSES = { export const STATUSES = {
StatusStunned : 'stun', StatusStunned: 'stun',
StatusBleeding: 'bleeding', StatusBleeding: 'bleeding',
StatusProne: 'prone', StatusProne: 'prone',
StatusGrappling: 'grappling', StatusGrappling: 'grappling',
StatusGrappled: 'grappled', StatusGrappled: 'grappled',
StatusRestrained: 'restrain', StatusRestrained: 'restrain',
StatusUnconscious: 'unconscious', StatusUnconscious: 'unconscious',
StatusBlind: 'blind', StatusBlind: 'blind',
StatusComma: 'comma', StatusComma: 'comma',
StatusDead: 'dead', StatusDead: 'dead',
@ -18,8 +18,8 @@ const rddStatusEffects = [
{ rdd: true, id: STATUSES.StatusStunned, label: 'EFFECT.StatusStunned', icon: 'icons/svg/stoned.svg', "duration.rounds": 1 }, { rdd: true, id: STATUSES.StatusStunned, label: 'EFFECT.StatusStunned', icon: 'icons/svg/stoned.svg', "duration.rounds": 1 },
{ rdd: true, id: STATUSES.StatusBleeding, label: 'EFFECT.StatusBleeding', icon: 'icons/svg/blood.svg' }, { rdd: true, id: STATUSES.StatusBleeding, label: 'EFFECT.StatusBleeding', icon: 'icons/svg/blood.svg' },
{ rdd: true, id: STATUSES.StatusProne, label: 'EFFECT.StatusProne', icon: 'icons/svg/falling.svg' }, { rdd: true, id: STATUSES.StatusProne, label: 'EFFECT.StatusProne', icon: 'icons/svg/falling.svg' },
{ rdd: true, id: STATUSES.StatusGrappling, tint: '#33cc33', label: 'EFFECT.StatusGrappling', icon: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp' }, { rdd: true, id: STATUSES.StatusGrappling, tint: '#33cc33', label: 'EFFECT.StatusGrappling', icon: 'systems/foundryvtt-reve-de-dragon/icons/empoignade.svg' },
{ rdd: true, id: STATUSES.StatusGrappled, tint: '#ff9900', label: 'EFFECT.StatusGrappled', icon: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp' }, { rdd: true, id: STATUSES.StatusGrappled, tint: '#ff9900', label: 'EFFECT.StatusGrappled', icon: 'systems/foundryvtt-reve-de-dragon/icons/empoignade.svg' },
{ rdd: true, id: STATUSES.StatusRestrained, label: 'EFFECT.StatusRestrained', icon: 'icons/svg/net.svg' }, { rdd: true, id: STATUSES.StatusRestrained, label: 'EFFECT.StatusRestrained', icon: 'icons/svg/net.svg' },
{ rdd: true, id: STATUSES.StatusUnconscious, label: 'EFFECT.StatusUnconscious', icon: 'icons/svg/unconscious.svg' }, { rdd: true, id: STATUSES.StatusUnconscious, label: 'EFFECT.StatusUnconscious', icon: 'icons/svg/unconscious.svg' },
{ rdd: true, id: STATUSES.StatusBlind, label: 'EFFECT.StatusBlind', icon: 'icons/svg/blind.svg' }, { rdd: true, id: STATUSES.StatusBlind, label: 'EFFECT.StatusBlind', icon: 'icons/svg/blind.svg' },
@ -29,13 +29,16 @@ const rddStatusEffects = [
]; ];
const demiReveStatusEffect = rddStatusEffects.find(it => it.id == STATUSES.StatusDemiReve); const demiReveStatusEffect = rddStatusEffects.find(it => it.id == STATUSES.StatusDemiReve);
const statusDemiSurprise = [STATUSES.StatusStunned, STATUSES.StatusProne, STATUSES.StatusRestrained]; const statusDemiSurprise = new Set([STATUSES.StatusStunned, STATUSES.StatusProne, STATUSES.StatusRestrained])
const statusSurpriseTotale = [STATUSES.StatusUnconscious, STATUSES.StatusBlind, STATUSES.StatusComma]; const statusSurpriseTotale = new Set([STATUSES.StatusUnconscious, STATUSES.StatusBlind, STATUSES.StatusComma])
export class StatusEffects extends FormApplication { export class StatusEffects extends FormApplication {
static onReady() { static onReady() {
const rddStatusIds = rddStatusEffects.map(it => it.id); const rddEffectIds = rddStatusEffects.map(it => it.id);
rddStatusEffects.forEach(it => it.flags = { core: { statusId: it.id } }); rddStatusEffects.forEach(it => {
it.statuses = new Set()
it.statuses.add(it.id)
})
const defaultStatusEffectIds = CONFIG.statusEffects.map(it => it.id); const defaultStatusEffectIds = CONFIG.statusEffects.map(it => it.id);
game.settings.register(SYSTEM_RDD, "use-status-effects", { game.settings.register(SYSTEM_RDD, "use-status-effects", {
name: "use-status-effects", name: "use-status-effects",
@ -54,37 +57,47 @@ export class StatusEffects extends FormApplication {
restricted: true restricted: true
}); });
CONFIG.RDD.allEffects = rddStatusEffects.concat(CONFIG.statusEffects.filter(it => !rddStatusIds.includes(it.id))); CONFIG.RDD.allEffects = rddStatusEffects.concat(CONFIG.statusEffects.filter(it => !rddEffectIds.includes(it.id)));
StatusEffects._setUseStatusEffects(StatusEffects._getUseStatusEffects()); StatusEffects._setUseStatusEffects(StatusEffects._getUseStatusEffects());
console.log('statusEffects', CONFIG.statusEffects); console.log('statusEffects', CONFIG.statusEffects);
} }
static valeurSurprise(effect, isCombat) { static valeurSurprise(effect, isCombat) {
// const id = StatusEffects.statusId(effect); if (statusSurpriseTotale.intersects(effect.statuses)) {
if (statusSurpriseTotale.includes(effect.flags?.core?.statusId)) {
return 2; return 2;
} }
return statusDemiSurprise.includes(effect.flags?.core?.statusId) || (isCombat && effect.flags?.core?.statusId == STATUSES.StatusDemiReve) ? 1 : 0; if (statusDemiSurprise.intersects(effect.statuses)) {
return 1
}
if (isCombat && effect.statuses.find(e => e == STATUSES.StatusDemiReve)) {
return 1
}
return 0
} }
static _getUseStatusEffects() { static _getUseStatusEffects() {
return game.settings.get(SYSTEM_RDD, "use-status-effects")?.split(',') ?? []; return game.settings.get(SYSTEM_RDD, "use-status-effects")?.split(',') ?? [];
} }
static _setUseStatusEffects(statusIds) { static _setUseStatusEffects(effectIds) {
if (game.user.isGM) { if (game.user.isGM) {
game.settings.set(SYSTEM_RDD, "use-status-effects", statusIds.join()); game.settings.set(SYSTEM_RDD, "use-status-effects", effectIds.join());
} }
for (let effect of CONFIG.RDD.allEffects) { for (let effect of CONFIG.RDD.allEffects) {
effect.active = effect.rdd || statusIds.includes(effect.flags?.core?.statusId); effect.active = effect.rdd || effectIds.includes(effect.id);
} }
CONFIG.statusEffects = CONFIG.RDD.allEffects.filter(it => it.active); CONFIG.statusEffects = CONFIG.RDD.allEffects.filter(it => it.active);
} }
static status(statusId) { static prepareActiveEffect(effectId) {
return rddStatusEffects.find(it => it.flags?.core?.statusId == statusId); let status = rddStatusEffects.find(it => it.id == effectId)
if (status) {
status = duplicate(status)
status.statuses = [effectId]
}
return status;
} }
static demiReve() { static demiReve() {

View File

@ -116,10 +116,10 @@ export class AppAstrologie extends Application {
super.activateListeners(html); super.activateListeners(html);
this.html = html; this.html = html;
this.html.find('select[name="signe-astral"]').change(event => { this.html.find('select[name="signe-astral"]').change(event => {
this.selectNombreAstral(this.html.find('select[name="signe-astral"]').val()); this.selectNombreAstral(event.currentTarget.value);
}) })
this.html.find('select[name="signe-naissance"]').change(event => { this.html.find('select[name="signe-naissance"]').change(event => {
this.selectHeureNaissance(this.html.find('select[name="signe-naissance"]').val()); this.selectHeureNaissance(event.currentTarget.value);
}) })
this.html.find('td.nombre-astral').click(event => { this.html.find('td.nombre-astral').click(event => {
this.selectNombreAstral(Number.parseInt(event.currentTarget.attributes['data-nombre-astral'].value) - 1); this.selectNombreAstral(Number.parseInt(event.currentTarget.attributes['data-nombre-astral'].value) - 1);

View File

@ -21,7 +21,7 @@ export class DialogRepos extends Dialog {
} }
constructor(html, actor) { constructor(html, actor) {
let options = { classes: ["DialogCreateSigneDraconiqueActorsActors"], width: 400, height: 'fit-content', 'z-index': 99999 }; let options = { classes: ["dialog-repos"], width: 400, height: 'fit-content', 'z-index': 99999 };
let conf = { let conf = {
title: "Se reposer", title: "Se reposer",
content: html, content: html,

View File

@ -2,7 +2,6 @@ import { SHOW_DICE, SYSTEM_RDD } from "../constants.js";
import { Grammar } from "../grammar.js"; import { Grammar } from "../grammar.js";
import { Misc } from "../misc.js"; import { Misc } from "../misc.js";
import { RdDDice } from "../rdd-dice.js"; import { RdDDice } from "../rdd-dice.js";
import { AutoAdjustDarkness } from "./auto-adjust-darkness.js";
export const WORLD_TIMESTAMP_SETTING = "calendrier"; export const WORLD_TIMESTAMP_SETTING = "calendrier";
@ -16,14 +15,14 @@ export const RDD_MINUTES_PAR_JOUR = 1440; //RDD_HEURES_PAR_JOUR * RDD_MINUTES_PA
const ROUNDS_PAR_MINUTE = 10; const ROUNDS_PAR_MINUTE = 10;
const DEFINITION_HEURES = [ const DEFINITION_HEURES = [
{ key: "vaisseau", label: "Vaisseau", lettreFont: 'v', saison: "Printemps" , darkness: 0.7}, { key: "vaisseau", label: "Vaisseau", lettreFont: 'v', saison: "Printemps", darkness: 0.9 },
{ key: "sirene", label: "Sirène", lettreFont: 'i', saison: "Printemps" , darkness: 0.4}, { key: "sirene", label: "Sirène", lettreFont: 'i', saison: "Printemps", darkness: 0.1 },
{ key: "faucon", label: "Faucon", lettreFont: 'f', saison: "Printemps" , darkness: 0}, { key: "faucon", label: "Faucon", lettreFont: 'f', saison: "Printemps", darkness: 0 },
{ key: "couronne", label: "Couronne", lettreFont: '', saison: "Eté" , darkness: 0}, { key: "couronne", label: "Couronne", lettreFont: '', saison: "Eté", darkness: 0 },
{ key: "dragon", label: "Dragon", lettreFont: 'd', saison: "Eté", darkness: 0 }, { key: "dragon", label: "Dragon", lettreFont: 'd', saison: "Eté", darkness: 0 },
{ key: "epees", label: "Epées", lettreFont: 'e', saison: "Eté", darkness: 0}, { key: "epees", label: "Epées", lettreFont: 'e', saison: "Eté", darkness: 0 },
{ key: "lyre", label: "Lyre", lettreFont: 'l', saison: "Automne", darkness: 0.4 }, { key: "lyre", label: "Lyre", lettreFont: 'l', saison: "Automne", darkness: 0.1 },
{ key: "serpent", label: "Serpent", lettreFont: 's', saison: "Automne", darkness: 0.7 }, { key: "serpent", label: "Serpent", lettreFont: 's', saison: "Automne", darkness: 0.9 },
{ key: "poissonacrobate", label: "Poisson Acrobate", lettreFont: 'p', saison: "Automne", darkness: 1 }, { key: "poissonacrobate", label: "Poisson Acrobate", lettreFont: 'p', saison: "Automne", darkness: 1 },
{ key: "araignee", label: "Araignée", lettreFont: 'a', saison: "Hiver", darkness: 1 }, { key: "araignee", label: "Araignée", lettreFont: 'a', saison: "Hiver", darkness: 1 },
{ key: "roseau", label: "Roseau", lettreFont: 'r', saison: "Hiver", darkness: 1 }, { key: "roseau", label: "Roseau", lettreFont: 'r', saison: "Hiver", darkness: 1 },
@ -98,10 +97,10 @@ export class RdDTimestamp {
*/ */
static definition(signe) { static definition(signe) {
if (signe == undefined) { if (signe == undefined) {
signe = 0; signe = 0
} }
if (Number.isInteger(signe)) { if (Number.isInteger(signe)) {
return DEFINITION_HEURES[signe % RDD_HEURES_PAR_JOUR]; return DEFINITION_HEURES[Misc.modulo(signe, RDD_HEURES_PAR_JOUR)]
} }
let definition = DEFINITION_HEURES.find(it => it.key == signe); let definition = DEFINITION_HEURES.find(it => it.key == signe);
if (!definition) { if (!definition) {
@ -115,14 +114,11 @@ export class RdDTimestamp {
} }
static imgSigne(signe) { static imgSigne(signe) {
return signe == undefined ? '' : `<img class="img-signe-heure" src="${signe.webp}" alt="${signe.label}" title="${signe.label}"/>` return signe == undefined ? '' : `<img class="img-signe-heure" src="${signe.webp}" data-tooltip="${signe.label}"/>`
} }
static ajustementAstrologiqueHeure(hn, nbAstral, heure) { static ajustementAstrologiqueHeure(hn, nbAstral, heure) {
let ecart = (hn + nbAstral - heure) % RDD_HEURES_PAR_JOUR; let ecart = Misc.modulo(hn + nbAstral - heure, RDD_HEURES_PAR_JOUR);
if (ecart < 0) {
ecart = (ecart + RDD_HEURES_PAR_JOUR) % RDD_HEURES_PAR_JOUR;
}
switch (ecart) { switch (ecart) {
case 0: return 4; case 0: return 4;
case 4: case 8: return 2; case 4: case 8: return 2;
@ -158,11 +154,13 @@ export class RdDTimestamp {
} }
static defHeure(heure) { static defHeure(heure) {
return DEFINITION_HEURES.find(it => (it.heure) == heure % RDD_HEURES_PAR_JOUR); heure = Misc.modulo(heure, RDD_HEURES_PAR_JOUR);
return DEFINITION_HEURES.find(it => it.heure == heure)
} }
static findHeure(heure) { static findHeure(heure) {
heure = Grammar.toLowerCaseNoAccentNoSpace(heure); heure = Grammar.toLowerCaseNoAccentNoSpace(heure);
let parHeureOuLabel = DEFINITION_HEURES.filter(it => (it.heure) == parseInt(heure) % RDD_HEURES_PAR_JOUR || Grammar.toLowerCaseNoAccentNoSpace(it.label) == heure); let parHeureOuLabel = DEFINITION_HEURES.filter(it => Grammar.toLowerCaseNoAccentNoSpace(it.label) == heure || it.heure == Misc.modulo(parseInt(heure), RDD_HEURES_PAR_JOUR));
if (parHeureOuLabel.length == 1) { if (parHeureOuLabel.length == 1) {
return parHeureOuLabel[0]; return parHeureOuLabel[0];
} }
@ -232,19 +230,19 @@ export class RdDTimestamp {
} }
get annee() { return Math.floor(this.indexDate / RDD_JOURS_PAR_AN) } get annee() { return Math.floor(this.indexDate / RDD_JOURS_PAR_AN) }
get mois() { return Math.floor((this.indexDate % RDD_JOURS_PAR_AN) / RDD_JOURS_PAR_MOIS) } get mois() { return Math.floor(Misc.modulo(this.indexDate, RDD_JOURS_PAR_AN) / RDD_JOURS_PAR_MOIS) }
get jour() { return (this.indexDate % RDD_JOURS_PAR_AN) % RDD_JOURS_PAR_MOIS } get jour() { return Misc.modulo(Misc.modulo(this.indexDate, RDD_JOURS_PAR_AN), RDD_JOURS_PAR_MOIS) }
get heure() { return Math.floor(this.indexMinute / RDD_MINUTES_PAR_HEURES) } get heure() { return Math.floor(this.indexMinute / RDD_MINUTES_PAR_HEURES) }
get minute() { return this.indexMinute % RDD_MINUTES_PAR_HEURES } get minute() { return Misc.modulo(this.indexMinute, RDD_MINUTES_PAR_HEURES) }
get round() { return ROUNDS_PAR_MINUTE * (this.indexMinute - Math.floor(this.indexMinute)) } get round() { return ROUNDS_PAR_MINUTE * (this.indexMinute - Math.floor(this.indexMinute)) }
get angleHeure() { return this.indexMinute / RDD_MINUTES_PAR_JOUR * 360 - 45 } get angleHeure() { return this.indexMinute / RDD_MINUTES_PAR_JOUR * 360 - 45 }
get angleMinute() { return this.indexMinute / RDD_MINUTES_PAR_HEURES * 360 + 45 } get angleMinute() { return this.indexMinute / RDD_MINUTES_PAR_HEURES * 360 + 45 }
get darkness() { get darkness() {
const darknessDebut = RdDTimestamp.definition(this.heure).darkness *100 const darknessDebut = 100 * RdDTimestamp.definition(this.heure).darkness
const darknessFin = RdDTimestamp.definition(this.heure + 1).darkness *100 const darknessFin = 100 * RdDTimestamp.definition(this.heure + 1).darkness
const darknessMinute = Math.round((darknessFin - darknessDebut) * this.minute / RDD_MINUTES_PAR_HEURES); const darknessMinute = Math.round((darknessFin - darknessDebut) * this.minute / RDD_MINUTES_PAR_HEURES);
return (darknessDebut + darknessMinute)/100 return (darknessDebut + darknessMinute) / 100
} }
/** /**
@ -297,7 +295,7 @@ export class RdDTimestamp {
const heure = this.heure + heures; const heure = this.heure + heures;
return new RdDTimestamp({ return new RdDTimestamp({
indexDate: this.indexDate + Math.floor(heure / RDD_HEURES_PAR_JOUR), indexDate: this.indexDate + Math.floor(heure / RDD_HEURES_PAR_JOUR),
indexMinute: this.indexMinute + (heure % RDD_HEURES_PAR_JOUR) * RDD_MINUTES_PAR_HEURES indexMinute: this.indexMinute + Misc.modulo(heure, RDD_HEURES_PAR_JOUR) * RDD_MINUTES_PAR_HEURES
}) })
} }
@ -347,7 +345,7 @@ export class RdDTimestamp {
return { return {
jours: jours, jours: jours,
heures: Math.floor(minutes / RDD_MINUTES_PAR_HEURES), heures: Math.floor(minutes / RDD_MINUTES_PAR_HEURES),
minutes: minutes % RDD_MINUTES_PAR_HEURES minutes: Misc.modulo(minutes, RDD_MINUTES_PAR_HEURES)
} }
} }
} }

View File

@ -39,6 +39,8 @@ export class TMRRencontres {
const frequence = it => it.system.frequence[codeTerrain]; const frequence = it => it.system.frequence[codeTerrain];
const row = await this.table.getRandom(frequence, filtreMauvaise, forcedRoll); const row = await this.table.getRandom(frequence, filtreMauvaise, forcedRoll);
if (row) { if (row) {
console.log("DORM", row);
//row.document.system.computedForce = new Roll(row.document.system.formula).roll({async: false}).total;
await CompendiumTableHelpers.tableRowToChatMessage(row); await CompendiumTableHelpers.tableRowToChatMessage(row);
} }

View File

@ -18,8 +18,8 @@ export class Draconique {
static isTeteDragon(item) { return item.type == TYPES.tete; } static isTeteDragon(item) { return item.type == TYPES.tete; }
static isQueueSouffle(item) { return Draconique.isQueueDragon(item) || Draconique.isSouffleDragon(item); } static isQueueSouffle(item) { return Draconique.isQueueDragon(item) || Draconique.isSouffleDragon(item); }
static register(draconique) { static register(draconique, code = undefined) {
registeredEffects[draconique.code()] = draconique; registeredEffects[code ?? draconique.code()] = draconique;
if (draconique.img()) { if (draconique.img()) {
PixiTMR.register(draconique.code(), draconique.img()) PixiTMR.register(draconique.code(), draconique.img())
} }
@ -90,6 +90,15 @@ export class Draconique {
*/ */
token(pixiTMR, linkData, coordTMR, type = undefined) { token(pixiTMR, linkData, coordTMR, type = undefined) {
const tooltip = this.tooltip(linkData); const tooltip = this.tooltip(linkData);
return this._createToken(pixiTMR, linkData, coordTMR, type, tooltip);
}
tokens(pixiTMR, linkData, coordTMR, type = undefined) {
const tooltip = this.tooltip(linkData);
return [this._createToken(pixiTMR, linkData, coordTMR, type, tooltip)];
}
_createToken(pixiTMR, linkData, coordTMR, type, tooltip) {
const token = { const token = {
sprite: this.createSprite(pixiTMR), sprite: this.createSprite(pixiTMR),
coordTMR: coordTMR, coordTMR: coordTMR,

View File

@ -6,7 +6,7 @@ import { ReserveExtensible } from "./reserve-extensible.js";
import { DemiReve } from "./demi-reve.js"; import { DemiReve } from "./demi-reve.js";
import { TrouNoir } from "./trou-noir.js"; import { TrouNoir } from "./trou-noir.js";
import { Rencontre } from "./rencontre.js"; import { Rencontre } from "./rencontre.js";
import { SortReserve } from "./sort-reserve.js"; import { SortReserve, SortReserveHumide } from "./sort-reserve.js";
import { CarteTmr } from "./carte-tmr.js"; import { CarteTmr } from "./carte-tmr.js";
import { PontImpraticable } from "./pont-impraticable.js"; import { PontImpraticable } from "./pont-impraticable.js";
import { Draconique } from "./draconique.js"; import { Draconique } from "./draconique.js";
@ -26,6 +26,7 @@ export class EffetsDraconiques {
static demiReve = new DemiReve(); static demiReve = new DemiReve();
static rencontre = new Rencontre(); static rencontre = new Rencontre();
static sortReserve = new SortReserve(); static sortReserve = new SortReserve();
static sortReserveHumide = new SortReserveHumide();
static debordement = new Debordement(); static debordement = new Debordement();
static presentCites = new PresentCites(); static presentCites = new PresentCites();
static fermetureCites = new FermetureCites(); static fermetureCites = new FermetureCites();
@ -49,6 +50,7 @@ export class EffetsDraconiques {
Draconique.register(EffetsDraconiques.demiReve); Draconique.register(EffetsDraconiques.demiReve);
Draconique.register(EffetsDraconiques.rencontre); Draconique.register(EffetsDraconiques.rencontre);
Draconique.register(EffetsDraconiques.sortReserve); Draconique.register(EffetsDraconiques.sortReserve);
Draconique.register(EffetsDraconiques.sortReserveHumide);
Draconique.register(EffetsDraconiques.debordement); Draconique.register(EffetsDraconiques.debordement);
Draconique.register(EffetsDraconiques.fermetureCites); Draconique.register(EffetsDraconiques.fermetureCites);
Draconique.register(EffetsDraconiques.queteEaux); Draconique.register(EffetsDraconiques.queteEaux);

View File

@ -58,7 +58,7 @@ export class PixiTMR {
this.sizes = new TMRConstants({ size: displaySize }) this.sizes = new TMRConstants({ size: displaySize })
const appSize = PixiTMR.computeTMRSize(this.sizes) const appSize = PixiTMR.computeTMRSize(this.sizes)
this.pixiApp.renderer.resize(appSize.width, appSize.height) this.pixiApp.renderer.resize(appSize.width, appSize.height)
this.tooltipStyle.fontSize = Math.max(this.sizes.size / 4, 16) this.tooltipStyle.fontSize = Math.max(this.sizes.size / 3, 16)
} }
get view() { get view() {
@ -199,7 +199,7 @@ export class PixiTMR {
setTooltipPosition(event) { setTooltipPosition(event) {
const oddq = this.sizes.computeEventOddq(event); const oddq = this.sizes.computeEventOddq(event);
this.tooltip.x = oddq.x + (oddq.col > 7 ? -3 * this.sizes.full : this.sizes.quarter); this.tooltip.x = oddq.x + (oddq.col > 7 ? -2.5 * this.sizes.full : this.sizes.quarter);
this.tooltip.y = oddq.y + (oddq.row > 10 ? -this.sizes.size : 0); this.tooltip.y = oddq.y + (oddq.row > 10 ? -this.sizes.size : 0);
} }

View File

@ -49,7 +49,7 @@ export class PresentCites extends Draconique {
content: `La ${this.tmrLabel(casetmr)} vous offre un présent, faites votre choix`, content: `La ${this.tmrLabel(casetmr)} vous offre un présent, faites votre choix`,
buttons: buttons buttons: buttons
}); });
dialog.render(true); await dialog.render(true);
return dialog return dialog
} }

View File

@ -1,5 +1,7 @@
import { tmrTokenZIndex } from "../tmr-constants.js"; import { tmrTokenZIndex } from "../tmr-constants.js";
import { TMRUtility } from "../tmr-utility.js";
import { Draconique } from "./draconique.js"; import { Draconique } from "./draconique.js";
import { EffetsDraconiques } from "./effets-draconiques.js";
export class SortReserve extends Draconique { export class SortReserve extends Draconique {
@ -19,4 +21,19 @@ export class SortReserve extends Draconique {
taille: () => pixiTMR.sizes.third, taille: () => pixiTMR.sizes.third,
}); });
} }
tokens(pixiTMR, linkData, coordTMR, type = undefined) {
if (TMRUtility.getTMR(coordTMR()).type == 'fleuve') {
const tooltip = this.tooltip(linkData)
const fleuves = TMRUtility.getListTMR('fleuve')
return fleuves.map(f => EffetsDraconiques.sortReserveHumide._createToken(pixiTMR, linkData, () => f.coord, type?? this.code(), tooltip))
}
return super.tokens(pixiTMR, linkData, coordTMR, type)
}
}
export class SortReserveHumide extends SortReserve {
code() { return 'sortreservehumide' }
tooltip(sort) { return `${sort.name} en fleuve, r${sort.system.ptreve}` }
img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/sort-reserve-humide.svg' }
} }

View File

@ -0,0 +1,182 @@
import { TYPES } from "../item.js"
import { RdDItemCompetence } from "../item-competence.js"
import { ChatUtility } from "../chat-utility.js"
const CODES_COMPETENCES_VOYAGE = ['Extérieur', 'Forêt', 'Montagne', 'Marais', 'Glace', 'Equitation']
const TABLEAU_FATIGUE_MARCHE = [
{
code: "aise", label: "Aisé", description: "Route ou chemin",
survies: ['Extérieur', 'Equitation'],
vitesses: [{ vitesse: 4, fatigue: 1 }, { vitesse: 6, fatigue: 2 }, { vitesse: 8, fatigue: 3 }, { vitesse: 10, fatigue: 4 }, { vitesse: 12, fatigue: 6 }],
},
{
code: "malaise", label: "Malaisé", description: "Hors piste (herbes et buissons)",
survies: ['Extérieur', 'Equitation'],
vitesses: [{ vitesse: 4, fatigue: 2 }, { vitesse: 6, fatigue: 3 }, { vitesse: 8, fatigue: 4 }, { vitesse: 10, fatigue: 6 }],
},
{
code: "difficile", label: "Difficile", description: "Hors piste (collines, forêt)",
survies: ['Extérieur', 'Forêt', 'Glace', 'Equitation'],
vitesses: [{ vitesse: 4, fatigue: 3 }, { vitesse: 6, fatigue: 4 }, { vitesse: 8, fatigue: 6 }],
},
{
code: "tresdifficile", label: "Très difficile", description: "Hors piste (montagne, jungle, marais)",
survies: ['Forêt', 'Montagne', 'Marais', 'Glace'],
vitesses: [{ vitesse: 4, fatigue: 4 }, { vitesse: 6, fatigue: 6 }],
},
]
export class DialogFatigueVoyage extends Dialog {
static dialog = undefined
static async create() {
if (!game.user.isGM) {
return
}
if (!DialogFatigueVoyage.dialog) {
const playerActors = game.actors.filter(actor => actor.hasPlayerOwner && actor.isPersonnage())
.map(actor => DialogFatigueVoyage.prepareActor(actor))
const parameters = {
tableauFatigueMarche: TABLEAU_FATIGUE_MARCHE,
playerActors: playerActors,
nombreHeures: 1,
}
DialogFatigueVoyage.setModeDeplacement(parameters, undefined, undefined)
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/voyage/dialog-fatigue-voyage.hbs", parameters);
DialogFatigueVoyage.dialog = new DialogFatigueVoyage(html, parameters);
}
DialogFatigueVoyage.dialog.render(true);
}
static setModeDeplacement(parameters, code, vitesse) {
const ligneFatigueMarche = TABLEAU_FATIGUE_MARCHE.find(it => it.code == code) ?? TABLEAU_FATIGUE_MARCHE[0]
const rythme = ligneFatigueMarche.vitesses.find(it => it.vitesse == vitesse) ?? ligneFatigueMarche.vitesses[0]
parameters.typeTerrain = ligneFatigueMarche
parameters.vitesseDeplacement = rythme.vitesse
parameters.fatigueHoraire = rythme.fatigue
}
static prepareActor(actor) {
const competencesVoyage = {}
CODES_COMPETENCES_VOYAGE.forEach(codeSurvie =>
competencesVoyage[codeSurvie] = RdDItemCompetence.findCompetence(actor.itemTypes[TYPES.competence], codeSurvie, { onMessage: () => { } })
)
return {
actor: actor,
selected: true,
ajustementFatigue: 0,
competencesVoyage: competencesVoyage
}
}
constructor(html, parameters) {
const options = {
classes: ["dialog-fatigue-voyage"],
width: 600,
height: 'fit-content',
'max-height': 900,
'z-index': 99999
}
const conf = {
title: "Fatigue de voyage",
content: html,
buttons: {}
}
super(conf, options);
this.parameters = parameters
this.controls = {}
}
activateListeners(html) {
if (this.html == undefined) {
html.find('select[name="code-terrain"]').trigger("focus")
}
this.html = html;
super.activateListeners(html);
this.html.find('select[name="code-terrain"]').change(event => this.changeParameters())
this.html.find('select[name="vitesse-deplacement"]').change(event => this.changeParameters())
this.html.find('input[name="nombre-heures"]').change(event => this.changeParameters())
this.html.find('button[name="appliquer-fatigue"]').click(event => this.appliquerFatigue())
}
changeParameters() {
this.changeTerrain(this.html.find('select[name="code-terrain"]').val())
this.changeVitesse(this.html.find('select[name="vitesse-deplacement"]').val())
this.changeNombreHeures(this.html.find('input[name="nombre-heures"]').val())
this.setFatigue()
}
async changeTerrain(codeTerrain) {
if (this.parameters.typeTerrain.code != codeTerrain) {
const selectVitesseDeplacement = this.html.find('select[name="vitesse-deplacement"]')
const vitesse = selectVitesseDeplacement.val()
selectVitesseDeplacement.empty()
DialogFatigueVoyage.setModeDeplacement(this.parameters, codeTerrain, vitesse)
this.parameters.typeTerrain.vitesses.forEach(async rythme => {
selectVitesseDeplacement.append(await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/voyage/option-vitesse-fatigue.hbs', rythme))
})
selectVitesseDeplacement.val(this.parameters.vitesseDeplacement).change()
}
}
async changeVitesse(vitesse) {
if (this.parameters.vitesseDeplacement != vitesse) {
DialogFatigueVoyage.setModeDeplacement(this.parameters, this.parameters.typeTerrain.code, vitesse)
}
}
async changeNombreHeures(nombreHeures) {
this.parameters.nombreHeures = parseInt(nombreHeures)
}
async setFatigue() {
this.html.find('input[name="base-fatigue"]').val(this.parameters.nombreHeures * this.parameters.fatigueHoraire)
}
async appliquerFatigue() {
const fatigueBase = parseInt(this.html.find('input[name="base-fatigue"]').val() ?? 0)
const actors = jQuery.map(
this.html.find('div.fatigue-actors-list li.list-item'),
it => this.$extractActor(this.html.find(it))
)
actors.filter(it => it.selected)
.forEach(async it => {
const perteFatigue = fatigueBase + it.ajustement
ChatMessage.create({
whisper: ChatUtility.getWhisperRecipientsAndGMs(it.actor.name),
content: await renderTemplate(
'systems/foundryvtt-reve-de-dragon/templates/voyage/chat-fatigue_voyage.hbs', mergeObject(it,
{
parameters: this.parameters,
fatigueBase: fatigueBase,
perteFatigue: perteFatigue,
isVoyage: fatigueBase == this.parameters.nombreHeures * this.parameters.fatigueHoraire
})
),
})
await it.actor.santeIncDec("fatigue", perteFatigue)
})
}
$extractActor(actorRow) {
const actor = game.actors.get(actorRow.data('actor-id'))
if (!actor) {
ui.notifications.warn(`Acteur ${it.actorId} introuvable`)
}
return {
actor: actor,
ajustement: parseInt(actorRow.find('input[name="ajustement-fatigue"]').val() ?? 0),
selected: actor && actorRow.find('input[name="selectionner-acteur"]').is(':checked')
}
}
async close() {
DialogFatigueVoyage.dialog = undefined
await super.close()
}
}

View File

@ -93,6 +93,7 @@
--background-control-selected: linear-gradient(to bottom, hsla(0, 100%, 25%, 0.5) 5%, hsla(0, 100%, 12%, 0.5) 100%); --background-control-selected: linear-gradient(to bottom, hsla(0, 100%, 25%, 0.5) 5%, hsla(0, 100%, 12%, 0.5) 100%);
--background-tooltip: hsla(60, 12%, 85%, 0.95); --background-tooltip: hsla(60, 12%, 85%, 0.95);
--background-error:hsla(16, 100%, 50%, 0.8); --background-error:hsla(16, 100%, 50%, 0.8);
--color-profile-border: hsla(0, 0%, 80%, 0.05);
} }
/*@import url("https://fonts.googleapis.com/css2?family=Martel:wght@400;800&family=Roboto:wght@300;400;500&display=swap");*/ /*@import url("https://fonts.googleapis.com/css2?family=Martel:wght@400;800&family=Roboto:wght@300;400;500&display=swap");*/
@ -195,11 +196,10 @@ i:is(.fas, .far, .fa-solid, .fa-regular, .fa-sharp ) {
flex: 0 0 110px; flex: 0 0 110px;
height: 110px; height: 110px;
width: 110px; width: 110px;
margin-right: 0.5rem; padding: 0.2rem;
object-fit: scale-down;
object-position: 50% 0;
margin: 0.1rem;
object-fit: contain; object-fit: contain;
background-color: var(--color-profile-border);
border: 1px solid var(--color-profile-border);
} }
.system-foundryvtt-reve-de-dragon .rdd-item-sheet-tarot img.profile-img { .system-foundryvtt-reve-de-dragon .rdd-item-sheet-tarot img.profile-img {
@ -440,7 +440,13 @@ table {border: 1px solid #7a7971;}
.flex-grow-2 { .flex-grow-2 {
flex-grow: 2; flex-grow: 2;
} }
.voyage-liste-survies {
max-width: 12rem;
}
/* Styles limited to foundryvtt-reve-de-dragon sheets */ /* Styles limited to foundryvtt-reve-de-dragon sheets */
.texte-dans-liste {
text-align: left;
}
.equipement-nom { .equipement-nom {
flex-grow : 4; flex-grow : 4;
margin: 0; margin: 0;
@ -788,6 +794,10 @@ input:is(.blessure-premiers_soins, .blessure-soins_complets) {
.rdd-roll-dialog div.dialog-content input { .rdd-roll-dialog div.dialog-content input {
font-size: 1rem; font-size: 1rem;
} }
.rdd-roll-dialog div.dialog-content input[type="checkbox"]{
width: 1rem;
vertical-align: sub;
}
.rdd-roll-part { .rdd-roll-part {
align-items: center; align-items: center;
border-radius: 6px; padding: 3px; border-radius: 6px; padding: 3px;
@ -959,12 +969,6 @@ section.sheet-body {
padding: 0.25rem 0.5rem; padding: 0.25rem 0.5rem;
} }
.sheet header.sheet-header :is(.profile-img, .profile-img-token) {
object-fit: scale-down;
object-position: 50% 0;
margin: 0.5rem 0 0.5rem 0.5rem;
padding: 0;
}
.sheet header.sheet-header h1 { .sheet header.sheet-header h1 {
flex: 3; flex: 3;
} }
@ -1170,7 +1174,7 @@ ul.chat-list li:nth-child(odd) {
border-radius: 0.25rem; border-radius: 0.25rem;
padding: 0.1rem; padding: 0.1rem;
flex: 1 1 1.5rem; flex: 1 1 1.5rem;
display: flex !important; display: flex;
align-items: center !important; align-items: center !important;
} }
@ -1363,43 +1367,37 @@ table.table-nombres-astraux tr:hover {
justify-content: flex-start; justify-content: flex-start;
flex-direction: column; flex-direction: column;
position: absolute; position: absolute;
top: 2.75rem; top: 4.6rem;
right: 4rem; right: 3.5rem;
} }
.token-hud-ext.soins { .token-hud-ext.soins {
justify-content: flex-start;
flex-direction: column; flex-direction: column;
position: absolute; position: absolute;
top: 13.2rem; top: 14.7rem;
left: -5rem; left: -6rem;
max-width: 8.5rem max-width: 8rem;
line-height: 1rem;
} }
.token-hud-ext.right { .token-hud-ext.right {
justify-content: flex-start;
flex-direction: column; flex-direction: column;
position: absolute; position: absolute;
top: 2.75rem; top: 4.6rem;
left: 4rem; left: 3.5rem;
} }
.control-icon.token-hud-icon { div.control-icon.token-hud-icon {
width: fit-content; width: 9rem;
height: fit-content; height: fit-content;
border-radius: 0.3rem;
min-width: 6rem; min-width: 6rem;
flex-basis: auto; flex-basis: auto;
padding: 0; padding: 0;
line-height: 1rem; line-height: 0.95rem;
margin: 0.2rem; margin: 0.2rem;
} }
.control-icon.token-hud-icon.right {
margin-left: 8px;
}
.rdd-hud-menu label { .rdd-hud-menu label {
font-size: 0.8rem; font-size: 0.8rem;
} }
#token-hud .status-effects.active{
z-index: 2;
}
/* ======================================== */ /* ======================================== */
.item-checkbox { .item-checkbox {
height: 25px; height: 25px;
@ -1941,6 +1939,14 @@ div.calendar-timestamp-edit select.calendar-signe-heure {
padding: 3px; padding: 3px;
} }
aside#tooltip{
background: var(--background-tooltip);
color: var(--color-text-dark-primary);
font-size: 1rem;
border-radius: 0.2rem;
padding: 0.4rem;
}
.tooltip :is(.ttt-xp,.ttt-levelup) { .tooltip :is(.ttt-xp,.ttt-levelup) {
width: 250px; width: 250px;
background: var(--background-tooltip) !important; background: var(--background-tooltip) !important;

View File

@ -1,8 +1,8 @@
{ {
"id": "foundryvtt-reve-de-dragon", "id": "foundryvtt-reve-de-dragon",
"title": "Rêve de Dragon", "title": "Rêve de Dragon",
"version": "11.2.6", "version": "11.2.16",
"download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-11.2.6.zip", "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-11.2.16.zip",
"manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/v11/system.json", "manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/v11/system.json",
"changelog": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/branch/v11/changelog.md", "changelog": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/branch/v11/changelog.md",
"compatibility": { "compatibility": {

View File

@ -525,15 +525,11 @@
}, },
"Item": { "Item": {
"types": [ "types": [
"competence", "competencecreature", "arme", "armure", "blessure", "casetmr", "chant", "competence", "competencecreature", "conteneur", "danse",
"recettealchimique", "musique", "chant", "danse", "jeu", "recettecuisine", "oeuvre", "empoignade", "extraitpoetique", "faune", "gemme", "herbe", "ingredient", "jeu", "livre", "maladie", "meditation",
"objet", "arme", "armure", "conteneur", "herbe", "plante", "ingredient", "faune", "livre", "potion", "munition", "monnaie", "munition", "musique", "nombreastral", "nourritureboisson", "objet", "oeuvre", "ombre", "plante", "possession",
"monnaie", "nourritureboisson", "gemme", "poison", "potion", "queue", "recettealchimique", "recettecuisine", "rencontre",
"service", "service" ,"signedraconique", "sort", "sortreserve", "souffle", "tarot", "tache", "tete" ],
"meditation", "rencontre", "queue", "ombre", "souffle", "tete", "casetmr", "signedraconique", "sort", "sortreserve",
"nombreastral", "tache", "blessure", "maladie", "poison", "possession",
"tarot", "extraitpoetique", "empoignade"
],
"templates": { "templates": {
"description": { "description": {
"description": "", "description": "",

View File

@ -4,14 +4,14 @@
<header class="sheet-header"> <header class="sheet-header">
<div class="header-fields"> <div class="header-fields">
<div class="flexrow"> <div class="flexrow">
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" /> <img class="profile-img" src="{{img}}" data-edit="img" data-tooltip="{{name}}" />
<div class="flexcol"> <div class="flexcol">
<div class="flexrow"> <div class="flexrow">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1> <h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1>
<div class="header-buttons"> <div class="header-buttons">
<span class="encaisser-direct"><a title="Encaisser des dommages"><img class="button-img" src="icons/svg/bones.svg" alt="Encaisser des dommages"/></a></span> <span class="encaisser-direct"><a><img class="button-img" src="icons/svg/bones.svg" data-tooltip="Encaisser des dommages"/></a></span>
{{#if @root.options.isGM}} {{#if @root.options.isGM}}
<span class="remise-a-neuf"><a title="Remise à neuf"><img class="button-img" src="icons/svg/regen.svg" alt="Remise à neuf"/></a></span> <span class="remise-a-neuf"><a><img class="button-img" src="icons/svg/regen.svg" data-tooltip="Remise à neuf"/></a></span>
{{/if}} {{/if}}
</div> </div>
</div> </div>

View File

@ -4,14 +4,14 @@
<header class="sheet-header"> <header class="sheet-header">
<div class="header-fields"> <div class="header-fields">
<div class="flexrow"> <div class="flexrow">
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" /> <img class="profile-img" src="{{img}}" data-edit="img" data-tooltip="{{name}}" />
<div class="flexcol"> <div class="flexcol">
<div class="flexrow"> <div class="flexrow">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1> <h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1>
<div class="header-buttons"> <div class="header-buttons">
<span class="encaisser-direct"><a title="Encaisser des dommages"><img class="button-img" src="icons/svg/bones.svg" alt="Encaisser des dommages"/></a></span> <span class="encaisser-direct"><a><img class="button-img" src="icons/svg/bones.svg" data-tooltip="Encaisser des dommages"/></a></span>
{{#if @root.options.isGM}} {{#if @root.options.isGM}}
<span class="remise-a-neuf"><a title="Remise à neuf"><img class="button-img" src="icons/svg/regen.svg" alt="Remise à neuf"/></a></span> <span class="remise-a-neuf"><a><img class="button-img" src="icons/svg/regen.svg" data-tooltip="Remise à neuf"/></a></span>
{{/if}} {{/if}}
</div> </div>
</div> </div>

View File

@ -10,7 +10,7 @@
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/header-buttons.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/actor/header-buttons.html"}}
</div> </div>
<div class="flexrow"> <div class="flexrow">
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" /> <img class="profile-img" src="{{img}}" data-edit="img" data-tooltip="{{name}}" />
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/header-compteurs.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/actor/header-compteurs.html"}}
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/header-etat.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/actor/header-etat.html"}}
{{>"systems/foundryvtt-reve-de-dragon/templates/actor/header-hautreve.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/actor/header-hautreve.html"}}
@ -22,14 +22,14 @@
{{!-- Sheet Tab Navigation --}} {{!-- Sheet Tab Navigation --}}
<nav class="sheet-tabs tabs" data-group="primary"> <nav class="sheet-tabs tabs" data-group="primary">
{{#if options.isObserver}} {{#if options.isObserver}}
<a class="item" data-tab="carac">Carac.</a> <a class="item" data-tab="carac" data-tooltip="Caractéristiques">Carac.</a>
<a class="item" data-tab="competences">Compétences</a> <a class="item" data-tab="competences" data-tooltip="Caractéristiques">Compétences</a>
<a class="item" data-tab="combat">Combat</a> <a class="item" data-tab="combat" data-tooltip="Combat et santé">Combat</a>
<a class="item" data-tab="connaissances">Savoirs&Taches</a> <a class="item" data-tab="connaissances" data-tooltip="Savoirs et tâches">Savoirs&Taches</a>
<a class="item" data-tab="hautreve">Haut-Rêve</a> <a class="item" data-tab="hautreve" data-tooltip="Haut-rêve">Haut-Rêve</a>
{{/if}} {{/if}}
<a class="item" data-tab="items">Équipement</a> <a class="item" data-tab="items" data-tooltip="Liste d'équipement">Équipement</a>
<a class="item" data-tab="description">Description</a> <a class="item" data-tab="description" data-tooltip="Description et compagnons">Description</a>
</nav> </nav>
{{!-- Sheet Body --}} {{!-- Sheet Body --}}
@ -70,9 +70,13 @@
{{#if options.vueDetaillee}} {{#if options.vueDetaillee}}
&nbsp;&nbsp; &nbsp;&nbsp;
{{#if @root.options.vueArchetype}} {{#if @root.options.vueArchetype}}
<a class="competence-archetype toggle-archetype chat-card-button-pushed"><i class="fa-solid fa-up-right-from-square"></i>Incarnation</a> <a class="competence-archetype toggle-archetype chat-card-button-pushed" data-tooltip="Retour à la vue détaillée des compétences">
<i class="fa-solid fa-up-right-from-square"></i>Incarnation
</a>
{{else}} {{else}}
<a class="competence-archetype toggle-archetype chat-card-button"><i class="fa-solid fa-people-line"></i>Archétype</a> <a class="competence-archetype toggle-archetype chat-card-button" data-tooltip="Gestion de l'archétype et de la réincarnation">
<i class="fa-solid fa-people-line"></i>Archétype
</a>
{{/if}} {{/if}}
{{/if}} {{/if}}
</span> </span>

View File

@ -4,7 +4,7 @@
<header class="sheet-header"> <header class="sheet-header">
<div class="header-fields"> <div class="header-fields">
<div class="flexrow"> <div class="flexrow">
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" /> <img class="profile-img" src="{{img}}" data-edit="img" data-tooltip="{{name}}" />
<div class="flexcol"> <div class="flexcol">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1> <h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1>
<div class="flexrow"> <div class="flexrow">
@ -12,19 +12,19 @@
<ul> <ul>
<li data-attribute="resistance" class="flexrow"> <li data-attribute="resistance" class="flexrow">
<span class="carac-label">Résistance</span> <span class="carac-label">Résistance</span>
<a class="resistance-moins"><i class="fas fa-minus-square"></i></a> <a class="resistance-moins"><i class="fa-solid fa-square-minus"></i></a>
<input type="text" name="system.etat.resistance.value" value="{{system.etat.resistance.value}}" data-dtype="Number" /> <input type="text" name="system.etat.resistance.value" value="{{system.etat.resistance.value}}" data-dtype="Number" />
/ /
<input type="text" name="system.etat.resistance.max" value="{{system.etat.resistance.max}}" data-dtype="Number" {{#unless @root.options.vueDetaillee}}disabled{{/unless}} /> <input type="text" name="system.etat.resistance.max" value="{{system.etat.resistance.max}}" data-dtype="Number" {{#unless @root.options.vueDetaillee}}disabled{{/unless}} />
<a class="resistance-plus"><i class="fas fa-plus-square"></i></a> <a class="resistance-plus"><i class="fa-solid fa-square-plus"></i></a>
</li> </li>
<li data-attribute="structure" class="flexrow"> <li data-attribute="structure" class="flexrow">
<span class="carac-label">Structure</span> <span class="carac-label">Structure</span>
<a class="structure-moins"><i class="fas fa-minus-square"></i></a> <a class="structure-moins"><i class="fa-solid fa-square-minus"></i></a>
<input type="text" name="system.etat.structure.value" value="{{system.etat.structure.value}}" data-dtype="Number" /> <input type="text" name="system.etat.structure.value" value="{{system.etat.structure.value}}" data-dtype="Number" />
/ /
<input type="text" name="system.etat.structure.max" value="{{system.etat.structure.max}}" data-dtype="Number" {{#unless @root.options.vueDetaillee}}disabled{{/unless}} /> <input type="text" name="system.etat.structure.max" value="{{system.etat.structure.max}}" data-dtype="Number" {{#unless @root.options.vueDetaillee}}disabled{{/unless}} />
<a class="structure-plus"><i class="fas fa-plus-square"></i></a> <a class="structure-plus"><i class="fa-solid fa-square-plus"></i></a>
</li> </li>
</ul> </ul>
</div> </div>

View File

@ -4,8 +4,8 @@
{{#each (trier recettesAlchimiques) as |recette id|}} {{#each (trier recettesAlchimiques) as |recette id|}}
<li class="item flexrow list-item" data-item-id="{{recette._id}}"><span class="competence-title recette-label item-edit"><a>{{recette.name}}</a></span> <li class="item flexrow list-item" data-item-id="{{recette._id}}"><span class="competence-title recette-label item-edit"><a>{{recette.name}}</a></span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> <a class="item-edit" data-tooltip="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}

View File

@ -2,7 +2,8 @@
<ul class="item-list"> <ul class="item-list">
{{#if @root.options.isGM}} {{#if @root.options.isGM}}
<li> <li>
<a class="nouvelle-incarnation chat-card-button"><i class="fa-solid fa-person-circle-plus"></i> Nouvelle incarnation</a> <a class="nouvelle-incarnation chat-card-button" data-tooltip="Création d'une nouvelle incarnation de l'archétype">
<i class="fa-solid fa-person-circle-plus"></i> Nouvelle incarnation</a>
</li> </li>
{{/if}} {{/if}}
<li><hr></li> <li><hr></li>

View File

@ -1,2 +1,7 @@
<h3>Astrologie</h3> <h3>Astrologie</h3>
<span class="astrologie-label"><a name="jet-astrologie">Astrologie : Nombres Astraux</a></span> <span class="astrologie-label chat-card-button">
<a name="jet-astrologie">
<i class="fa-solid fa-moon-over-sun"></i>
Astrologie: Nombres Astraux
</a>
</span>

View File

@ -1,7 +1,7 @@
<li class="item item-blessure flexrow list-item blessure-active-{{lowercase system.label}}" data-item-id="{{id}}"> <li class="item item-blessure flexrow list-item blessure-active-{{lowercase system.label}}" data-item-id="{{id}}"
data-tooltip="Blessure {{system.label}}">
<span class="blessure-control"> <span class="blessure-control">
<img class="sheet-competence-img" src="{{img}}" /> <img class="sheet-competence-img" src="{{img}}" />
<i class="fas fa-skull-crossbones"></i>
{{system.label}} {{system.label}}
</span> </span>
{{#if (gt system.gravite 6)}} {{#if (gt system.gravite 6)}}
@ -34,8 +34,8 @@
{{#if system.localisation}}<span>{{system.localisation}}</span>{{/if}} {{#if system.localisation}}<span>{{system.localisation}}</span>{{/if}}
</span> </span>
<span class="item-controls"> <span class="item-controls">
<a class="item-edit" title="Editer"><i class="fas fa-edit"></i></a> <a class="item-edit" data-tooltip="Editer"><i class="fas fa-edit"></i></a>
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
<a class="item-montrer" title="Montrer"><i class="fas fa-comment"></i></a> <a class="item-montrer" data-tooltip="Montrer"><i class="fas fa-comment"></i></a>
</span> </span>
</li> </li>

View File

@ -1,8 +1,14 @@
<h4>blessures</h4> <h4>Blessures</h4>
<div> <div>
<a class="chat-card-button creer-blessure-legere"><i class="fas fa-plus-circle"></i> légère</a> <a class="chat-card-button creer-blessure-legere" data-tooltip="Ajouter une légère"><i class="fas fa-plus-circle"></i> légère</a>
<a class="chat-card-button creer-blessure-grave"><i class="fas fa-plus-circle"></i> grave</a> <a class="chat-card-button creer-blessure-grave" data-tooltip="Ajouter une grave"><i class="fas fa-plus-circle"></i> grave</a>
<a class="chat-card-button creer-blessure-critique"><i class="fas fa-plus-circle"></i> critique</a> <a class="chat-card-button creer-blessure-critique" data-tooltip="Ajouter une critique"><i class="fas fa-plus-circle"></i> critique</a>
</div>
<div>
<a class="chat-card-button subir-blessure-contusion" data-tooltip="Subir une contusion (avec perte d'Endurance)"><i class="fas fa-swords"></i> contusion</a>
<a class="chat-card-button subir-blessure-legere" data-tooltip="Subir une légère (avec perte d'Endurance)"><i class="fas fa-swords"></i> légère</a>
<a class="chat-card-button subir-blessure-grave" data-tooltip="Subir une grave (avec perte d'Endurance/Vie)"><i class="fas fa-swords"></i> grave</a>
<a class="chat-card-button subir-blessure-critique" data-tooltip="Subir une critique (avec perte d'Endurance/Vie)"><i class="fas fa-swords"></i> critique</a>
</div> </div>
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">

View File

@ -7,7 +7,7 @@
<br> <br>
<li class="caracteristique flexrow list-item"> <li class="caracteristique flexrow list-item">
<label class="flexrow derivee-label">{{system.compteurs.stress.label}} <label class="flexrow derivee-label">{{system.compteurs.stress.label}}
<a class="stress-test" title="Transformer le stress"><i class="fa-regular fa-moon"></i></a> <a class="stress-test" data-tooltip="Transformer le stress"><i class="fa-regular fa-moon"></i></a>
</label> </label>
<input class="derivee-value" type="number" name="system.compteurs.stress.value" value="{{system.compteurs.stress.value}}" data-dtype="number"/> <input class="derivee-value" type="number" name="system.compteurs.stress.value" value="{{system.compteurs.stress.value}}" data-dtype="number"/>
</li> </li>
@ -15,9 +15,9 @@
<label class="derivee-label">{{system.compteurs.moral.label}} <label class="derivee-label">{{system.compteurs.moral.label}}
<span> <span>
<a class="flex-shrink moral-malheureux" title="Jet de moral situation malheureuse"><i class="fa-regular fa-face-frown"></i></a> <a class="flex-shrink moral-malheureux" data-tooltip="Jet de moral situation malheureuse"><i class="fa-regular fa-face-frown"></i></a>
<a class="flex-shrink moral-neutre" title="Jet de moral situation neutre"><i class="fa-regular fa-face-meh"></i></a> <a class="flex-shrink moral-neutre" data-tooltip="Jet de moral situation neutre"><i class="fa-regular fa-face-meh"></i></a>
<a class="flex-shrink moral-heureux" title="Jet de moral situation heureuse"><i class="fa-regular fa-face-smile"></i></a> <a class="flex-shrink moral-heureux" data-tooltip="Jet de moral situation heureuse"><i class="fa-regular fa-face-smile"></i></a>
</span> </span>
</label> </label>
<input class="derivee-value" type="number" name="system.compteurs.moral.value" value="{{system.compteurs.moral.value}}" data-dtype="number"/> <input class="derivee-value" type="number" name="system.compteurs.moral.value" value="{{system.compteurs.moral.value}}" data-dtype="number"/>
@ -29,7 +29,7 @@
<input class="derivee-value" type="number" name="system.compteurs.dissolution.value" value="{{system.compteurs.dissolution.value}}" data-dtype="number"/> <input class="derivee-value" type="number" name="system.compteurs.dissolution.value" value="{{system.compteurs.dissolution.value}}" data-dtype="number"/>
</li> </li>
<li class="caracteristique flexrow list-item"> <li class="caracteristique flexrow list-item">
<label class="derivee-label chance-actuelle"><a>Chance actuelle</a></label> <label class="derivee-label chance-actuelle" data-tooltip="Jet de chance actuelle"><a>Chance actuelle</a></label>
<input class="derivee-value" type="number" name="system.compteurs.chance.value" value="{{system.compteurs.chance.value}}" data-dtype="number"/> <input class="derivee-value" type="number" name="system.compteurs.chance.value" value="{{system.compteurs.chance.value}}" data-dtype="number"/>
</li> </li>
<li class="caracteristique flexrow list-item"> <li class="caracteristique flexrow list-item">
@ -52,7 +52,7 @@
<label class="derivee-label" for="system.compteurs.eau.value">bu</label> <label class="derivee-label" for="system.compteurs.eau.value">bu</label>
<input class="derivee-value" type="number" name="system.compteurs.eau.value" value="{{system.compteurs.eau.value}}" data-dtype="number"/> <input class="derivee-value" type="number" name="system.compteurs.eau.value" value="{{system.compteurs.eau.value}}" data-dtype="number"/>
</li> </li>
<li class="caracteristique flexrow list-item"> <li class="caracteristique flexrow list-item" data-tooltip="Niveau d'éthylisme">
<label class="derivee-label" for="system.compteurs.ethylisme.value">{{system.compteurs.ethylisme.label}}</label> <label class="derivee-label" for="system.compteurs.ethylisme.value">{{system.compteurs.ethylisme.label}}</label>
<select class="derivee-value" name="system.compteurs.ethylisme.value" data-dtype="Number"> <select class="derivee-value" name="system.compteurs.ethylisme.value" data-dtype="Number">
{{#select system.compteurs.ethylisme.value}} {{#select system.compteurs.ethylisme.value}}

View File

@ -17,7 +17,7 @@
Vous pouvez dépenser {{carac.xpNext}} points d'Experience pour augmenter de 1 votre caractéristique {{carac.label}} Vous pouvez dépenser {{carac.xpNext}} points d'Experience pour augmenter de 1 votre caractéristique {{carac.label}}
</span> </span>
<a name={{key}}>{{carac.label}}</a> <a name={{key}}>{{carac.label}}</a>
<a class="carac-xp-augmenter" name="augmenter.{{key}}" title="Augmenter"> <a class="carac-xp-augmenter" name="augmenter.{{key}}" data-tooltip="Augmenter la caractéristique avec l'expérience">
<i class="fas fa-arrow-alt-circle-up"></i> <i class="fas fa-arrow-alt-circle-up"></i>
</a> </a>
</span> </span>

View File

@ -1,21 +1,20 @@
<h4>Soins</h4> <h4>Soins</h4>
<div> <div>
<a class="chat-card-button creer-tache-blessure-legere"><i class="fas fa-first-aid"></i> légère</a> <a class="chat-card-button creer-tache-blessure-legere" data-tooltip="Soigner une blessure légère"><i class="fas fa-first-aid"></i> légère</a>
<a class="chat-card-button creer-tache-blessure-grave"><i class="fas fa-first-aid"></i> grave</a> <a class="chat-card-button creer-tache-blessure-grave" data-tooltip="Soigner une blessure grave"><i class="fas fa-first-aid"></i> grave</a>
<a class="chat-card-button creer-tache-blessure-critique"><i class="fas fa-first-aid"></i> critique</a> <a class="chat-card-button creer-tache-blessure-critique" data-tooltip="Soigner une blessure critique"><i class="fas fa-first-aid"></i> critique</a>
</div> </div>
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
{{#each taches as |tache id|}} {{#each taches as |tache id|}}
{{#if (eq tache.system.competence 'Chirurgie')}} {{#if (eq tache.system.competence 'Chirurgie')}}
<li class="item flexrow list-item" data-item-id="{{tache._id}}"> <li class="item flexrow list-item" data-item-id="{{tache._id}}"
<img class="sheet-competence-img" src="{{tache.img}}" /> data-tooltip="Premiers soins: {{tache.name}} ({{tache.system.points_de_tache_courant}}/{{tache.system.points_de_tache}})">
<img class="sheet-competence-img" src="{{tache.img}}"/>
<span class="competence-title tache-label"><a>{{tache.name}} <span class="competence-title tache-label"><a>{{tache.name}}
({{tache.system.points_de_tache_courant}}{{#if ({{tache.system.points_de_tache_courant}}/{{tache.system.points_de_tache}})</a></span>
(or @root.options.isGM (not tache.system.cacher_points_de_tache))
}}/{{tache.system.points_de_tache}}{{/if}})</a></span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> <a class="item-edit" data-tooltip="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/if}} {{/if}}

View File

@ -10,11 +10,12 @@
<li class="item flexrow list-item" <li class="item flexrow list-item"
data-item-id="{{arme._id}}" data-item-id="{{arme._id}}"
data-arme-name="{{arme.name}}" data-arme-name="{{arme.name}}"
data-competence-name="{{arme.system.competence}}" > data-competence-name="{{arme.system.competence}}"
data-tooltip="{{arme.name}}: niveau {{plusMoins arme.system.niveau}}">
<span class="arme-label"> <span class="arme-label">
<a> <a>
{{#if arme.img}} {{#if arme.img}}
<img class="sheet-competence-img" src="{{arme.img}}"/> <img class="sheet-competence-img" src="{{arme.img}}" data-tooltip="{{arme.name}}"/>
{{/if}} {{/if}}
<span>{{arme.name}}</span> <span>{{arme.name}}</span>
</a> </a>
@ -24,14 +25,15 @@
<span class="competence-value">{{plusMoins arme.system.niveau}}</span> <span class="competence-value">{{plusMoins arme.system.niveau}}</span>
<span class="competence-value">{{plusMoins arme.system.dommagesReels}}</span> <span class="competence-value">{{plusMoins arme.system.dommagesReels}}</span>
<span class="competence-value"></span> <span class="competence-value"></span>
<span class="initiative-value arme-initiative"><a>{{arme.system.initiative}}</a></span> <span class="initiative-value arme-initiative"><a data-tooltip="{{arme.name}}: initiative {{plusMoins arme.system.initiative}}">{{arme.system.initiative}}</a></span>
</li> </li>
{{/each}} {{/each}}
{{#each esquives as |esq key|}} {{#each esquives as |esq key|}}
<li class="item flexrow list-item" data-item-id="{{esq._id}}"> <li class="item flexrow list-item" data-item-id="{{esq._id}}"
data-tooltip="{{esq.name}}: niveau {{plusMoins esq.system.niveau}}">
<span class="competence-label"> <span class="competence-label">
<a class="competence-label" name="{{esq.name}}"> <a class="competence-label" name="{{esq.name}}">
<img class="sheet-competence-img" src="{{esq.img}}"/> <img class="sheet-competence-img" src="{{esq.img}}" />
<span>{{esq.name}}</span> <span>{{esq.name}}</span>
</a> </a>
</span> </span>
@ -50,7 +52,8 @@
</li> </li>
{{#each empoignades as |emp key|}} {{#each empoignades as |emp key|}}
<li class="item flexrow list-item" <li class="item flexrow list-item"
data-item-id="{{emp._id}}" data-arme-name="{{emp.name}}"> data-item-id="{{emp._id}}" data-arme-name="{{emp.name}}"
data-tooltip="{{emp.name}}: niveau {{plusMoins emp.system.niveau}}">
<span class="empoignade-label"> <span class="empoignade-label">
<a> <a>
{{#if emp.img}} {{#if emp.img}}
@ -61,8 +64,8 @@
</span> </span>
<span class="competence-value">{{emp.system.pointsemp}}</span> <span class="competence-value">{{emp.system.pointsemp}}</span>
<div class="item-controls"> <div class="item-controls">
<a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> <a class="item-edit" data-tooltip="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}

View File

@ -6,11 +6,11 @@
<div class="flexrow"> <div class="flexrow">
{{#if token}} {{#if token}}
{{#if options.isOwner}} {{#if options.isOwner}}
<img class="profile-img dimmed" src="{{img}}" data-edit="img" title="{{name}}" /> <img class="profile-img dimmed" src="{{img}}" data-edit="img"/>
{{/if}} {{/if}}
<img class="profile-img-token" src="{{token.img}}" title="{{name}}" /> <img class="profile-img-token" src="{{token.img}}"/>
{{else}} {{else}}
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" /> <img class="profile-img" src="{{img}}" data-edit="img"/>
{{/if}} {{/if}}
<div class="flexcol"> <div class="flexcol">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1> <h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1>
@ -68,10 +68,10 @@
<input {{@root.disabled}} type="number" name="services[{{key}}].system.qualite" value="{{service.system.qualite}}" data-dtype="Number" min="-10" max="10"/> <input {{@root.disabled}} type="number" name="services[{{key}}].system.qualite" value="{{service.system.qualite}}" data-dtype="Number" min="-10" max="10"/>
<input {{@root.disabled}} type="number" class="input-prix" name="services[{{key}}].system.cout" value="{{numberFormat service.system.cout decimals=2 sign=false}}" data-dtype="Number" min="0" /> <input {{@root.disabled}} type="number" class="input-prix" name="services[{{key}}].system.cout" value="{{numberFormat service.system.cout decimals=2 sign=false}}" data-dtype="Number" min="0" />
<div class="item-controls"> <div class="item-controls">
<a class="service-acheter" title="Acheter"><i class="fa-sharp fa-solid fa-coins"></i></a> <a class="service-acheter" data-tooltip="Acheter"><i class="fa-sharp fa-solid fa-coins"></i></a>
{{#unless @root.disabled}} {{#unless @root.disabled}}
<a class="service-vendre" title="Proposer"><i class="fas fa-comments-dollar"></i></a> <a class="service-vendre" data-tooltip="Proposer"><i class="fas fa-comments-dollar"></i></a>
<a class="service-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="service-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
{{/unless}} {{/unless}}
</div> </div>
</li> </li>

View File

@ -9,7 +9,7 @@
{{else}}far fa-plus-square {{else}}far fa-plus-square
{{/if~}}"></i> {{/if~}}"></i>
{{/if}} {{/if}}
<img class="sheet-competence-img" src="{{item.img}}" title="{{item.name}}"/> <img class="sheet-competence-img" src="{{item.img}}" data-tooltip="{{item.name}}"/>
<span>{{item.name}}</span> <span>{{item.name}}</span>
</a> </a>
</span> </span>
@ -17,13 +17,13 @@
<span class="equipement-detail-buttons flexrow"> <span class="equipement-detail-buttons flexrow">
{{#unless (or (eq item.type 'service') (and (eq item.type 'conteneur') (not vide)))}} {{#unless (or (eq item.type 'service') (and (eq item.type 'conteneur') (not vide)))}}
{{#if options.isOwner}} {{#if options.isOwner}}
<a class="item-quantite-moins"><i class="fas fa-minus-square"></i></a> <a class="item-quantite-moins"><i class="fa-solid fa-square-minus"></i></a>
{{/if}} {{/if}}
<input {{#unless options.isOwner}}disabled{{/unless}} type="number" data-dtype="Number" <input {{#unless options.isOwner}}disabled{{/unless}} type="number" data-dtype="Number"
class="item-quantite number-x3" name="items[{{item._id}}].system.quantite" class="item-quantite number-x3" name="items[{{item._id}}].system.quantite"
value="{{item.system.quantite}}" /> value="{{item.system.quantite}}" />
{{#if options.isOwner}} {{#if options.isOwner}}
<a class="item-quantite-plus"><i class="fas fa-plus-square"></i></a> <a class="item-quantite-plus"><i class="fa-solid fa-square-plus"></i></a>
{{/if}} {{/if}}
{{/unless}} {{/unless}}
</span> </span>
@ -41,19 +41,19 @@
</span> </span>
<span class="equipement-actions item-controls"> <span class="equipement-actions item-controls">
{{#if options.isOwner}} {{#if options.isOwner}}
<a class="item-edit" title="Editer"><i class="fas fa-edit"></i></a> <a class="item-edit" data-tooltip="Editer"><i class="fas fa-edit"></i></a>
{{#unless (and (eq item.type 'conteneur') (not vide))}} {{#unless (and (eq item.type 'conteneur') (not vide))}}
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
{{#if (or item.parent.system.illimite (ne item.system.quantite 0))}} {{#if (or item.parent.system.illimite (ne item.system.quantite 0))}}
<a class="item-vendre" title="Vendre"><i class="fas fa-comments-dollar"></i></a> <a class="item-vendre" data-tooltip="Vendre"><i class="fas fa-comments-dollar"></i></a>
{{/if}} {{/if}}
{{/unless}} {{/unless}}
{{/if}} {{/if}}
{{#unless (and (eq item.type 'conteneur') (not vide))}} {{#unless (and (eq item.type 'conteneur') (not vide))}}
{{#if (or item.parent.system.illimite (gt item.system.quantite 0))}} {{#if (or item.parent.system.illimite (gt item.system.quantite 0))}}
<a class="item-acheter" title="Acheter"><i class="fa-regular fa-coins"></i></a> <a class="item-acheter" data-tooltip="Acheter"><i class="fa-regular fa-coins"></i></a>
{{/if}} {{/if}}
<a class="item-montrer" title="Montrer"><i class="fas fa-comment"></i></a> <a class="item-montrer" data-tooltip="Montrer"><i class="fas fa-comment"></i></a>
{{/unless}} {{/unless}}
</span> </span>
</li> </li>

View File

@ -1,7 +1,7 @@
<h4>Boutique</h4> <h4>Boutique</h4>
<span class="item-name"> <span class="item-name">
{{#if options.isGM}} {{#if options.isGM}}
<a class="chat-card-button creer-un-objet">Nouvel objet</a> <a class="chat-card-button creer-un-objet" data-tooltip="Créer un nouvel objet dans la boutique">Nouvel objet</a>
<a class="chat-card-button nettoyer-conteneurs">Tout vider</a> <a class="chat-card-button nettoyer-conteneurs">Tout vider</a>
{{/if}} {{/if}}
<span class="embed-inline"> <span class="embed-inline">

View File

@ -2,7 +2,7 @@
{{#each (trier competences) as |comp key|}} {{#each (trier competences) as |comp key|}}
<li class="item flexrow list-item" data-item-id="{{comp._id}}"> <li class="item flexrow list-item" data-item-id="{{comp._id}}">
<a class="competence-label"> <a class="competence-label">
<img class="sheet-competence-img" src="{{comp.img}}" /> <img class="sheet-competence-img" src="{{comp.img}}" data-tooltip="{{comp.name}}"/>
<span>{{comp.name}}</span> <span>{{comp.name}}</span>
</a> </a>
@ -23,8 +23,8 @@
/> />
{{#if @root.options.vueDetaillee}} {{#if @root.options.vueDetaillee}}
<div class="item-controls"> <div class="item-controls">
<a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> <a class="item-edit" data-tooltip="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
{{/if}} {{/if}}
</li> </li>

View File

@ -3,11 +3,11 @@
<ol class="item-list alterne-list"> <ol class="item-list alterne-list">
{{#each possessions as |possession key|}} {{#each possessions as |possession key|}}
<li class="item flexrow list-item" data-item-id="{{possession._id}}"> <li class="item flexrow list-item" data-item-id="{{possession._id}}">
<img class="sheet-competence-img" src="{{possession.img}}" /> <img class="sheet-competence-img" src="{{possession.img}}" data-tooltip="{{possession.name}}"/>
<span class="competence-label">{{possession.name}}</span> <span class="competence-label">{{possession.name}}</span>
<div class="item-controls"> <div class="item-controls">
<a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> <a class="item-edit" data-tooltip="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}

View File

@ -1,13 +1,13 @@
{{#unless system.isHidden}} {{#unless system.isHidden}}
<li class="item flexrow list-item {{#if system.isLevelUp}}xp-level-up tooltip{{/if}}" data-item-id="{{_id}}"> <li class="item flexrow list-item {{#if system.isLevelUp}}xp-level-up tooltip{{/if}}" data-item-id="{{_id}}">
<a class="competence-label" name="{{name}}"> <a class="competence-label" name="{{name}}" data-tooltip="Niveau {{plusMoins system.niveau}} en {{name}}">
<img class="sheet-competence-img" src="{{img}}"/> <img class="sheet-competence-img" src="{{img}}"/>
<span>{{name}}</span> <span>{{name}}</span>
</a> </a>
{{#if system.isLevelUp}} {{#if system.isLevelUp}}
<span class="tooltiptext ttt-levelup">Vous pouvez dépenser {{system.xpNext}} points d'Experience pour augmenter de 1 votre compétence {{name}}</span> <span class="tooltiptext ttt-levelup">Vous pouvez dépenser {{system.xpNext}} points d'Experience pour augmenter de 1 votre compétence {{name}}</span>
<a class="competence-xp-augmenter" compname="{{name}}" title="Augmenter"> <a class="competence-xp-augmenter" compname="{{name}}">
<i class="fas fa-arrow-alt-circle-up"></i> <i class="fas fa-arrow-alt-circle-up"></i>
</a> </a>
{{/if}} {{/if}}
@ -35,18 +35,18 @@
<div class="item-controls"> <div class="item-controls">
{{#if system.stressXpMax}} {{#if system.stressXpMax}}
<a class="competence-stress-augmenter" compname="{{name}}" <a class="competence-stress-augmenter" compname="{{name}}"
title="Dépenser {{system.stressXpMax}} points de stress {{#if system.isStressLevelUp}} pour augmenter d'un niveau {{/if}}"> data-tooltip="Dépenser {{system.stressXpMax}} points de stress {{#if system.isStressLevelUp}} pour augmenter d'un niveau {{/if}}">
<i class="fas fa-arrow-alt-circle-up allouer-stress{{#if system.isStressLevelUp}}-level-up{{/if}}"></i> <i class="fas fa-arrow-alt-circle-up allouer-stress{{#if system.isStressLevelUp}}-level-up{{/if}}"></i>
</a> </a>
{{else}} {{else}}
<i class="far fa-circle"></i> <i class="far fa-circle"></i>
{{/if}} {{/if}}
<input class="competence-archetype niveau-archetype" type="text" compname="{{name}}" name="comp-archetype-{{name}}" <input class="competence-archetype niveau-archetype" type="text" compname="{{name}}" name="comp-archetype-{{name}}"
value="{{plusMoins system.niveau_archetype}}" data-dtype="number" value="{{plusMoins system.niveau_archetype}}" data-dtype="number" data-tooltip="Niveau d'archétype {{plusMoins system.niveau_archetype}}"
{{#if (not @root.options.vueArchetype)}}disabled{{/if}} /> {{#if (not @root.options.vueArchetype)}}disabled{{/if}} />
<a class="item-edit" title="Modifier"><i class="fas fa-edit"></i></a> <a class="item-edit" data-tooltip="Modifier"><i class="fas fa-edit"></i></a>
{{#if @root.options.isGM}} {{#if @root.options.isGM}}
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
{{/if}} {{/if}}
</div> </div>
{{/if}} {{/if}}

View File

@ -1,13 +1,14 @@
<li class="item flexrow" data-attribute={{key}} data-item-id="{{queue._id}}"> <li class="item flexrow" data-attribute={{key}} data-item-id="{{queue._id}}"
<img class="sheet-competence-img" src="{{queue.img}}" /> data-tooltip="{{#if (eq queue.type 'ombre')}}Ombre de thanatos{{else}}Queue{{/if}}: {{queue.name}}"/>
<img class="sheet-competence-img" src="{{queue.img}}">
<span class="item-edit flex-grow"> <span class="item-edit flex-grow">
{{#if (eq queue.type 'ombre')}} {{#if (eq queue.type 'ombre')}}
<img class="sheet-competence-img" src="systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp" /> <img class="sheet-competence-img" src="systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp"/>
{{/if}} {{/if}}
<a>{{queue.name}}</a> <a>{{queue.name}}</a>
</span> </span>
<div class="item-controls"> <div class="item-controls">
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
{{#if queue.system.refoulement}} {{#if queue.system.refoulement}}
<a class="item-action">Refouler</a> <a class="item-action">Refouler</a>
{{/if}} {{/if}}

View File

@ -2,11 +2,11 @@
<h3>Souffles</h3> <h3>Souffles</h3>
<ul class="item-list"> <ul class="item-list">
{{#each souffles as |souffle key|}} {{#each souffles as |souffle key|}}
<li class="item flexrow" data-attribute={{key}} data-item-id="{{souffle._id}}"> <li class="item flexrow" data-attribute={{key}} data-item-id="{{souffle._id}}" data-tooltip="Souffle: {{souffle.name}}">
<img class="sheet-competence-img" src="{{souffle.img}}" /> <img class="sheet-competence-img" src="{{souffle.img}}"/>
<span class="item-edit flex-grow"><a>{{souffle.name}}</a></span> <span class="item-edit flex-grow"><a>{{souffle.name}}</a></span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}

View File

@ -2,11 +2,11 @@
<h3>Tetes</h3> <h3>Tetes</h3>
<ul class="item-list"> <ul class="item-list">
{{#each tetes as |tete key|}} {{#each tetes as |tete key|}}
<li class="item flexrow" data-attribute={{key}} data-item-id="{{tete._id}}"> <li class="item flexrow" data-attribute={{key}} data-item-id="{{tete._id}}" data-tooltip="Tête: {{tete.name}}">
<img class="sheet-competence-img" src="{{tete.img}}" /> <img class="sheet-competence-img" src="{{tete.img}}"/>
<span class="item-edit flex-grow"><a>{{tete.name}}</a></span> <span class="item-edit flex-grow"><a>{{tete.name}}</a></span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}

View File

@ -1,10 +1,11 @@
{{#if options.isGM}} {{#if options.isGM}}
<li class="item flexrow"> <li class="item flexrow">
<span> <span>
<a class="chat-card-button forcer-tmr-aleatoire">Ré-insertion aléatoire</a> <a class="chat-card-button forcer-tmr-aleatoire" data-tooltip="Ré-insérer aléatoirement le demi-rêve, et masquer la position au joueur">Ré-insertion aléatoire</a>
</span> </span>
<span> <span>
<a class="chat-card-button afficher-tmr">{{#if hautreve.cacheTMR}}Montrer les TMR{{else}}Cacher les TMR{{/if}}</a> <a class="chat-card-button afficher-tmr"
data-tooltip="{{#if hautreve.cacheTMR}}Montrer la position du demi-rêve au joueur{{else}}Cacher la position du demi-rêve au joueur{{/if}}">{{#if hautreve.cacheTMR}}Montrer les TMR{{else}}Cacher les TMR{{/if}}</a>
</span> </span>
</li> </li>
{{/if}} {{/if}}

View File

@ -1,19 +1,19 @@
<div class="header-buttons"> <div class="header-buttons">
<span class="chance-appel"> <span class="chance-appel">
<a title="Appel à la chance"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/appel-chance.svg" alt="Appel à la chance"/></a> <a><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/appel-chance.svg" data-tooltip="Appel à la chance"/></a>
</span> </span>
<span class="encaisser-direct"> <span class="encaisser-direct">
<a title="Encaisser des dommages"><img class="button-img" src="icons/svg/bones.svg" alt="Encaisser des dommages"/></a> <a><img class="button-img" src="icons/svg/bones.svg" data-tooltip="Encaisser des dommages"/></a>
</span> </span>
<span class="ethylisme-test"> <span class="ethylisme-test">
<a title="Jet d'Ethylisme"><img class="button-img" src="icons/svg/tankard.svg" alt="Boire"/></a> <a><img class="button-img" src="icons/svg/tankard.svg" data-tooltip="Boire"/></a>
</span> </span>
<span class="repos"> <span class="repos">
<a title="Repos"><img class="button-img" src="icons/svg/sleep.svg" alt="Se reposer"/></a> <a><img class="button-img" src="icons/svg/sleep.svg" data-tooltip="Se reposer"/></a>
</span> </span>
{{#if @root.options.isGM}} {{#if @root.options.isGM}}
<span class="remise-a-neuf"> <span class="remise-a-neuf">
<a title="Remise à neuf"><img class="button-img" src="icons/svg/regen.svg" alt="Remise à neuf"/></a> <a><img class="button-img" src="icons/svg/regen.svg" data-tooltip="Remise à neuf"/></a>
</span> </span>
{{/if}} {{/if}}
</div> </div>

View File

@ -2,24 +2,24 @@
<ul> <ul>
<li data-attribute="vie"> <li data-attribute="vie">
<label class="compteur"> <label class="compteur">
<a class="jet-vie" name="system.sante.vie.label">Vie</a> <a class="jet-vie" name="system.sante.vie.label" data-tooltip="Faire un jet de vie">Vie</a>
<a class="vie-moins"><i class="fas fa-minus-square"></i></a> <a class="vie-moins"><i class="fa-solid fa-square-minus"></i></a>
<input class="resource-content" type="text" name="system.sante.vie.value" value="{{system.sante.vie.value}}" data-dtype="Number" /> <input class="resource-content" type="text" name="system.sante.vie.value" value="{{system.sante.vie.value}}" data-dtype="Number" />
/ {{#if @root.options.vueDetaillee}} / {{#if @root.options.vueDetaillee}}
<input class="resource-content" type="text" name="system.sante.vie.max" value="{{system.sante.vie.max}}" data-dtype="Number"/> <input class="resource-content" type="text" name="system.sante.vie.max" value="{{system.sante.vie.max}}" data-dtype="Number"/>
{{else}}{{system.sante.vie.max}}{{/if}} {{else}}{{system.sante.vie.max}}{{/if}}
<a class="vie-plus"><i class="fas fa-plus-square"></i></a> <a class="vie-plus"><i class="fa-solid fa-square-plus"></i></a>
</label> </label>
</li> </li>
<li data-attribute="endurance"> <li data-attribute="endurance">
<label class="compteur"> <label class="compteur">
<a class="jet-endurance" name="system.sante.endurance.label">Endurance</a> <a class="jet-endurance" name="system.sante.endurance.label" data-tooltip="Faire un jet d'endurance pour ne pas être sonné">Endurance</a>
<a class="endurance-moins"><i class="fas fa-minus-square"></i></a> <a class="endurance-moins"><i class="fa-solid fa-square-minus"></i></a>
<input class="resource-content" type="text" name="system.sante.endurance.value" value="{{system.sante.endurance.value}}" data-dtype="Number"/> <input class="resource-content" type="text" name="system.sante.endurance.value" value="{{system.sante.endurance.value}}" data-dtype="Number"/>
/ {{#if @root.options.vueDetaillee}} / {{#if @root.options.vueDetaillee}}
<input class="resource-content" type="text" name="system.sante.endurance.max" value="{{system.sante.endurance.max}}" data-dtype="Number"/> <input class="resource-content" type="text" name="system.sante.endurance.max" value="{{system.sante.endurance.max}}" data-dtype="Number"/>
{{else}}{{system.sante.endurance.max}}{{/if}} {{else}}{{system.sante.endurance.max}}{{/if}}
<a class="endurance-plus"><i class="fas fa-plus-square"></i></a> <a class="endurance-plus"><i class="fa-solid fa-square-plus"></i></a>
</label> </label>
</li> </li>
</ul> </ul>

View File

@ -4,12 +4,12 @@
<li data-attribute="endurance"> <li data-attribute="endurance">
<label class="compteur"> <label class="compteur">
Endurance Endurance
<a class="endurance-moins"><i class="fas fa-minus-square"></i></a> <a class="endurance-moins"><i class="fa-solid fa-square-minus"></i></a>
<input class="resource-content" type="text" name="system.sante.endurance.value" value="{{system.sante.endurance.value}}" data-dtype="Number" /> <input class="resource-content" type="text" name="system.sante.endurance.value" value="{{system.sante.endurance.value}}" data-dtype="Number" />
/ {{#if @root.options.vueDetaillee}} / {{#if @root.options.vueDetaillee}}
<input class="resource-content" type="text" name="system.sante.endurance.max" value="{{system.sante.endurance.max}}" data-dtype="Number"/> <input class="resource-content" type="text" name="system.sante.endurance.max" value="{{system.sante.endurance.max}}" data-dtype="Number"/>
{{else}}{{system.sante.endurance.max}}{{/if}} {{else}}{{system.sante.endurance.max}}{{/if}}
<a class="endurance-plus"><i class="fas fa-plus-square"></i></a> <a class="endurance-plus"><i class="fa-solid fa-square-plus"></i></a>
</label> </label>
</li> </li>
</ul> </ul>

View File

@ -2,39 +2,39 @@
<ul> <ul>
<li> <li>
<label class="compteur"> <label class="compteur">
<a class="jet-vie">Vie</a> <a class="jet-vie" data-tooltip="Faire un jet de vie">Vie</a>
<a class="vie-moins"><i class="fas fa-minus-square"></i></a> <a class="vie-moins"><i class="fa-solid fa-square-minus"></i></a>
<input class="resource-content" type="text" name="system.sante.vie.value" value="{{system.sante.vie.value}}" data-dtype="Number"/> <input class="resource-content" type="text" name="system.sante.vie.value" value="{{system.sante.vie.value}}" data-dtype="Number"/>
<span>/ {{system.sante.vie.max}}</span> <span>/ {{system.sante.vie.max}}</span>
<a class="vie-plus"><i class="fas fa-plus-square"></i></a> <a class="vie-plus"><i class="fa-solid fa-square-plus"></i></a>
</label> </label>
</li> </li>
<li> <li>
<label class="compteur"> <label class="compteur">
<a class="jet-endurance">Endurance</a> <a class="jet-endurance" data-tooltip="Faire un jet d'endurance pour ne pas être sonné">Endurance</a>
<a class="endurance-moins"><i class="fas fa-minus-square"></i></a> <a class="endurance-moins"><i class="fa-solid fa-square-minus"></i></a>
<input class="resource-content" type="text" name="system.sante.endurance.value" value="{{system.sante.endurance.value}}" data-dtype="Number"/> <input class="resource-content" type="text" name="system.sante.endurance.value" value="{{system.sante.endurance.value}}" data-dtype="Number"/>
<span>/ {{system.sante.endurance.max}}</span> <span>/ {{system.sante.endurance.max}}</span>
<a class="endurance-plus"><i class="fas fa-plus-square"></i></a> <a class="endurance-plus"><i class="fa-solid fa-square-plus"></i></a>
</label> </label>
</li> </li>
<li> <li>
<label class="appliquerFatigue compteur tooltip"> <label class="appliquerFatigue compteur tooltip">
<span class="tooltiptext ttt-fatigue">{{{calc.fatigue.html}}}</span> <span class="tooltiptext ttt-fatigue">{{{calc.fatigue.html}}}</span>
Fatigue ({{calc.fatigue.malus}}) Fatigue ({{calc.fatigue.malus}})
<a class="fatigue-moins"><i class="fas fa-minus-square"></i></a> <a class="fatigue-moins"><i class="fa-solid fa-square-minus"></i></a>
<input class="resource-content" type="text" name="system.sante.fatigue.value" value="{{system.sante.fatigue.value}}" data-dtype="Number" /> <input class="resource-content" type="text" name="system.sante.fatigue.value" value="{{system.sante.fatigue.value}}" data-dtype="Number" />
<span>/ {{system.sante.fatigue.max}}</span> <span>/ {{system.sante.fatigue.max}}</span>
<a class="fatigue-plus"><i class="fas fa-plus-square"></i></a> <a class="fatigue-plus"><i class="fa-solid fa-square-plus"></i></a>
</label> </label>
</li> </li>
<li> <li>
<label class="compteur"> <label class="compteur">
<span class="ptreve-actuel"><a>Rêve</a></span> <span class="ptreve-actuel" data-tooltip="Faire un jet de Rêve actuel (ou jet de résistance)"><a>Rêve</a></span>
<a class="ptreve-actuel-moins"><i class="fas fa-minus-square"></i></a> <a class="ptreve-actuel-moins"><i class="fa-solid fa-square-minus"></i></a>
<input class="resource-content" class="pointsreve-value" type="text" name="system.reve.reve.value" value="{{system.reve.reve.value}}" data-dtype="Number" /> <input class="resource-content" class="pointsreve-value" type="text" name="system.reve.reve.value" value="{{system.reve.reve.value}}" data-dtype="Number" />
<span>/ {{system.reve.seuil.value}}</span> <span>/ {{system.reve.seuil.value}}</span>
<a class="ptreve-actuel-plus"><i class="fas fa-plus-square"></i></a> <a class="ptreve-actuel-plus"><i class="fa-solid fa-square-plus"></i></a>
</label> </label>
</li> </li>
</ul> </ul>

View File

@ -1,8 +1,8 @@
<div> <div>
{{#if effects}} {{#if effects}}
{{#each effects as |effect key|}} {{#each effects as |effect key|}}
<span class="active-effect" data-effect="{{effect.flags.core.statusId}}"> <span class="active-effect" data-effect="{{effect.id}}">
<img class="button-effect-img {{#if @root.options.isGM}}delete-active-effect{{/if}}" src="{{effect.icon}}" alt="{{localize effect.name}}" width="24" height="24" /> <img class="button-effect-img {{#if @root.options.isGM}}delete-active-effect{{/if}}" src="{{effect.icon}}" data-tooltip="{{localize effect.name}}" width="24" height="24" />
</span> </span>
{{/each}} {{/each}}
{{#if calc.surprise}}<span>{{calc.surprise}}!</span>{{/if}} {{#if calc.surprise}}<span>{{calc.surprise}}!</span>{{/if}}

View File

@ -1,17 +1,19 @@
{{#if system.attributs.hautrevant.value}} {{#if system.attributs.hautrevant.value}}
<div class="tmr-buttons"> <div class="tmr-buttons">
<span class="monte-tmr"> <span class="monte-tmr">
<a title="Montée dans les Terres M&eacute;dianes !" {{#if hautreve.isDemiReve}}disabled{{/if}}> <a data-tooltip="Montée dans les Terres M&eacute;dianes !" {{#if hautreve.isDemiReve}}disabled{{/if}}>
<img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-normal.svg" alt="Montée dans les Terres M&eacute;dianes !"/> <img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-normal.svg"/>
</a> </a>
</span> </span>
<span class="monte-tmr-rapide"> <span class="monte-tmr-rapide">
<a title="Montée accélérée dans les Terres M&eacute;dianes !" {{#if hautreve.isDemiReve}}disabled{{/if}}> <a data-tooltip="Montée accélérée dans les Terres M&eacute;dianes !" {{#if hautreve.isDemiReve}}disabled{{/if}}>
<img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-rapide.svg" alt="Montée accélérée dans les Terres M&eacute;dianes !"/> <img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-rapide.svg"/>
</a> </a>
</span> </span>
<span class="visu-tmr"> <span class="visu-tmr">
<a title="Regarder les Terres M&eacute;dianes"><img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-view.svg" alt="Regarder les Terres M&eacute;dianes"/></a> <a data-tooltip="Regarder les Terres M&eacute;dianes">
<img class="button-img" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/icon-tmr-view.svg"/>
</a>
</span> </span>
</div> </div>
{{/if}} {{/if}}

View File

@ -2,12 +2,12 @@
<h3>Effets sur les cases des TMR</h3> <h3>Effets sur les cases des TMR</h3>
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
{{#each casestmr as |casetmr key|}} {{#each casestmr as |casetmr key|}}
<li class="item list-item flexrow" data-item-id="{{casetmr.id}}" data-attribute="{{key}}"> <li class="item list-item flexrow" data-item-id="{{casetmr.id}}" data-attribute="{{key}}" data-tooltip="Case TMR: {{casetmr.name}}" >
<img class="sheet-competence-img" src="{{casetmr.img}}" /> <img class="sheet-competence-img" src="{{casetmr.img}}"/>
<span class="item-edit"><a>{{casetmr.name}}</a></span> <span class="item-edit"><a>{{casetmr.name}}</a></span>
<span>{{casetmr.system.coord}} - {{caseTmr-label casetmr.system.coord}}</span> <span>{{casetmr.system.coord}} - {{caseTmr-label casetmr.system.coord}}</span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}

View File

@ -2,12 +2,12 @@
<h3>Méditations</h3> <h3>Méditations</h3>
<ul class="item-list"> <ul class="item-list">
{{#each (trier meditations) as |meditation key|}} {{#each (trier meditations) as |meditation key|}}
<li class="item flexrow" data-item-id="{{meditation._id}}" data-attribute="{{key}}"> <li class="item flexrow" data-item-id="{{meditation._id}}" data-attribute="{{key}}" data-tooltip="Méditation: {{meditation.name}}">
<img class="sheet-competence-img" src="{{meditation.img}}" /> <img class="sheet-competence-img" src="{{meditation.img}}"/>
<span class="meditation-label flex-grow"><a data-item-id="{{meditation._id}}">{{meditation.name}} - {{meditation.system.competence}}</a></span> <span class="meditation-label flex-grow"><a data-item-id="{{meditation._id}}">{{meditation.name}} - {{meditation.system.competence}}</a></span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-edit" title="Editer"><i class="fas fa-edit"></i></a> <a class="item-edit" data-tooltip="Editer"><i class="fas fa-edit"></i></a>
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}

View File

@ -2,8 +2,8 @@
<h3>Rencontres en attente dans les TMR</h3> <h3>Rencontres en attente dans les TMR</h3>
<ul class="item-list"> <ul class="item-list">
{{#each rencontres as |rencontre key|}} {{#each rencontres as |rencontre key|}}
<li class="item flexrow" data-item-id="{{rencontre._id}}" data-attribute="{{key}}"> <li class="item flexrow" data-item-id="{{rencontre._id}}" data-attribute="{{key}}" data-tooltip="Rencontre: {{rencontre.name}}">
<img class="sheet-competence-img" src="{{rencontre.img}}" /> <img class="sheet-competence-img" src="{{rencontre.img}}"/>
<span class="item-edit flex-grow"><a> <span class="item-edit flex-grow"><a>
{{rencontre.name}} r{{rencontre.system.force}} ({{rencontre.system.coord}} - {{caseTmr-label rencontre.system.coord}}) {{rencontre.name}} r{{rencontre.system.force}} ({{rencontre.system.coord}} - {{caseTmr-label rencontre.system.coord}})
</a></span> </a></span>
@ -11,7 +11,7 @@
<span class="flex-shrink">{{upperFirst rencontre.system.heure}}, le {{rencontre.system.date}}</span> <span class="flex-shrink">{{upperFirst rencontre.system.heure}}, le {{rencontre.system.date}}</span>
{{/if}} {{/if}}
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}

View File

@ -2,12 +2,12 @@
<h3>Signes draconiques</h3> <h3>Signes draconiques</h3>
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
{{#each signesdraconiques as |signe key|}} {{#each signesdraconiques as |signe key|}}
<li class="item list-item flexrow" data-item-id="{{signe._id}}" data-attribute="{{key}}"> <li class="item list-item flexrow" data-item-id="{{signe._id}}" data-attribute="{{key}}" data-tooltip="Signe: {{signe.name}}">
<img class="sheet-competence-img" src="{{signe.img}}" /> <img class="sheet-competence-img" src="{{signe.img}}"/>
<span class="item-edit flex-grow"><a>{{signe.name}}</a></span> <span class="item-edit flex-grow"><a>{{signe.name}}</a></span>
<span class="flex-shrink">{{signe.system.difficulte}}</span> <span class="flex-shrink">{{signe.system.difficulte}}</span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}

View File

@ -2,12 +2,13 @@
<h3>Sorts en Réserve</h3> <h3>Sorts en Réserve</h3>
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
{{#each (trier sortsReserve) as |sort key|}} {{#each (trier sortsReserve) as |sort key|}}
<li class="item list-item flexrow" data-item-id="{{sort._id}}" data-attribute="{{key}}"> <li class="item list-item flexrow" data-item-id="{{sort._id}}" data-attribute="{{key}}"
<img class="sheet-competence-img" src="{{sort.img}}" /> data-tooltip="Sort en réserve: {{sort.system.coord}} - {{sort.name}} r{{sort.system.ptreve}}">
<img class="sheet-competence-img" src="{{sort.img}}"/>
<span class="item-edit"><a>{{#if sort.system.echectotal}}Echec total: {{/if}}{{sort.name}} r{{sort.system.ptreve}}</a></span> <span class="item-edit"><a>{{#if sort.system.echectotal}}Echec total: {{/if}}{{sort.name}} r{{sort.system.ptreve}}</a></span>
<span>{{sort.system.coord}} - {{caseTmr-label sort.system.coord}}</span> <span>{{sort.system.coord}} - {{caseTmr-label sort.system.coord}}</span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-delete flex-shrink" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete flex-shrink" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}

View File

@ -2,16 +2,17 @@
<h3>Sorts</h3> <h3>Sorts</h3>
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
{{#each (trier sorts) as |sort key|}} {{#each (trier sorts) as |sort key|}}
<li class="item list-item flexrow" data-item-id="{{sort._id}}" data-attribute="{{key}}"> <li class="item list-item flexrow" data-item-id="{{sort._id}}" data-attribute="{{key}}" data-tooltip="{{#if sort.system.isrituel}}Rituel{{else}}Sort{{/if}}: {{sort.name}}">
<img class="sheet-competence-img" src="{{sort.img}}" /> <img class="sheet-competence-img" src="{{sort.img}}"/>
<span class="item-edit flex-grow-2"> <span class="item-edit flex-grow-2">
<a data-item-id="{{sort._id}}">{{sort.name}} <a data-item-id="{{sort._id}}">{{sort.name}}
- {{#if sort.system.caseTMRspeciale}}{{sort.system.caseTMRspeciale}}{{else}}{{upperFirst sort.system.caseTMR}}{{/if}} - {{#if sort.system.caseTMRspeciale}}{{sort.system.caseTMRspeciale}}{{else}}{{upperFirst sort.system.caseTMR}}{{/if}}
</a> </a>
</span> </span>
<span>{{#if sort.system.isrituel}}Rituel{{/if}}</span>
<span>{{sort.system.draconic}} / {{sort.system.difficulte}}</span> <span>{{sort.system.draconic}} / {{sort.system.difficulte}}</span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}

View File

@ -1,6 +1,6 @@
{{#unless item.system.isHidden}} {{#unless item.system.isHidden}}
{{#if (or options.isObserver (ne item.type 'monnaie'))}} {{#if (or options.isObserver (ne item.type 'monnaie'))}}
<li class="item flexrow list-item" data-item-id="{{item._id}}" draggable="true"> <li class="item flexrow list-item" data-item-id="{{item._id}}" draggable="true" data-tooltip="{{#if (gt item.system.quantite 1)}}{{item.system.quantite}} {{/if}}{{item.name}}">
<span class="equipement-nom {{#if (eq item.type 'conteneur')}}conteneur-name{{/if}} "> <span class="equipement-nom {{#if (eq item.type 'conteneur')}}conteneur-name{{/if}} ">
{{#if (eq item.type 'conteneur')}} {{#if (eq item.type 'conteneur')}}
<a> <a>
@ -8,11 +8,11 @@
{{else if ouvert}}far fa-minus-square {{else if ouvert}}far fa-minus-square
{{else}}far fa-plus-square {{else}}far fa-plus-square
{{/if~}}"></i> {{/if~}}"></i>
<img class="sheet-competence-img" src="{{item.img}}" title="{{item.name}}"/> <img class="sheet-competence-img" src="{{item.img}}"/>
<span>{{item.name}}</span> <span>{{item.name}}</span>
</a> </a>
{{else}} {{else}}
<img class="sheet-competence-img" src="{{item.img}}" title="{{item.name}}"/> <img class="sheet-competence-img" src="{{item.img}}"/>
<span>{{item.name}} <span>{{item.name}}
{{#if (eq item.type 'arme')}} {{#if (eq item.type 'arme')}}
{{>"systems/foundryvtt-reve-de-dragon/templates/item/icon-arme-broken.hbs" item}} {{>"systems/foundryvtt-reve-de-dragon/templates/item/icon-arme-broken.hbs" item}}
@ -22,11 +22,11 @@
</span> </span>
<span class="equipement-detail"> <span class="equipement-detail">
{{#if (gt item.system.quantite 1)}} {{#if (gt item.system.quantite 1)}}
<a class="item-quantite-moins"><i class="fas fa-minus-square"></i></a> <a class="item-quantite-moins" data-tooltip="Diminuer la quantité de {{item.name}}"><i class="fa-solid fa-square-minus"></i></a>
{{/if}} {{/if}}
{{item.system.quantite}} {{item.system.quantite}}
{{#if (gt item.system.quantite 1)}} {{#if (gt item.system.quantite 1)}}
<a class="item-split" title="Séparer"><i class="fas fa-unlink"></i></a> <a class="item-split" data-tooltip="Séparer le groupe de {{item.name}}"><i class="fas fa-unlink"></i></a>
{{/if}} {{/if}}
</span> </span>
<span class="equipement-detail">{{numberFormat item.system.encTotal decimals=2}}</span> <span class="equipement-detail">{{numberFormat item.system.encTotal decimals=2}}</span>
@ -34,17 +34,17 @@
{{#if options.isOwner}} {{#if options.isOwner}}
{{#unless item.estContenu}} {{#unless item.estContenu}}
{{#if item.equipable}} {{#if item.equipable}}
<a class="item-equip" title="Equiper">{{#if item.system.equipe}}<i class="fas fa-hand-rock"></i>{{else}}<i class="far fa-hand-paper"></i>{{/if}}</a> <a class="item-equip" data-tooltip="Equiper">{{#if item.system.equipe}}<i class="fas fa-hand-rock"></i>{{else}}<i class="far fa-hand-paper"></i>{{/if}}</a>
{{/if}} {{/if}}
{{/unless}} {{/unless}}
<a class="item-edit" title="Editer"><i class="fas fa-edit"></i></a> <a class="item-edit" data-tooltip="Editer"><i class="fas fa-edit"></i></a>
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
&nbsp; &nbsp;
{{#if (ne item.system.quantite 0)}} {{#if (ne item.system.quantite 0)}}
<a class="item-vendre" title="Vendre ou donner"><i class="fas fa-comments-dollar"></i></a> <a class="item-vendre" data-tooltip="Vendre ou donner"><i class="fas fa-comments-dollar"></i></a>
{{/if}} {{/if}}
{{/if}} {{/if}}
<a class="item-montrer" title="Montrer"><i class="fas fa-comment"></i></a> <a class="item-montrer" data-tooltip="Montrer"><i class="fas fa-comment"></i></a>
{{#if options.isOwner}} {{#if options.isOwner}}
{{#if item.system.actionPrincipale}} {{#if item.system.actionPrincipale}}
<a class="item-action">{{item.system.actionPrincipale}}</a> <a class="item-action">{{item.system.actionPrincipale}}</a>

View File

@ -3,14 +3,14 @@
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
{{#each monnaies as |piece id|}} {{#each monnaies as |piece id|}}
<li class="item flexrow list-item" data-item-id="{{piece._id}}"> <li class="item flexrow list-item" data-item-id="{{piece._id}}">
<img class="sheet-competence-img" src="{{piece.img}}" title="{{piece.name}}"/> <img class="sheet-competence-img" src="{{piece.img}}" data-tooltip="{{piece.name}}"/>
<span class="equipement-nom">{{piece.name}}</span> <span class="equipement-nom">{{piece.name}}</span>
<span class="equipement-valeur {{#unless (gt piece.system.cout 0)}}field-error{{/unless}}"> <span class="equipement-valeur {{#unless (gt piece.system.cout 0)}}field-error{{/unless}}">
({{piece.system.cout}} Sols) ({{piece.system.cout}} Sols)
</span> </span>
{{#if @root.options.isOwner}} {{#if @root.options.isOwner}}
<span class="equipement-button item-controls"> <span class="equipement-button item-controls">
<a class="item-quantite-moins"><i class="fas fa-minus-square"></i></a> <a class="item-quantite-moins"><i class="fa-solid fa-square-minus"></i></a>
</span> </span>
{{/if}} {{/if}}
<span class="equipement-detail"> <span class="equipement-detail">
@ -18,13 +18,13 @@
</span> </span>
{{#if @root.options.isOwner}} {{#if @root.options.isOwner}}
<span class="equipement-button item-controls"> <span class="equipement-button item-controls">
<a class="item-quantite-plus"><i class="fas fa-plus-square"></i></a> <a class="item-quantite-plus"><i class="fa-solid fa-square-plus"></i></a>
</span> </span>
{{/if}} {{/if}}
<span class="equipement-actions item-controls"> <span class="equipement-actions item-controls">
{{#if @root.options.isOwner}} {{#if @root.options.isOwner}}
<a class="item-edit" title="Editer"><i class="fas fa-edit"></i></a> <a class="item-edit" data-tooltip="Editer"><i class="fas fa-edit"></i></a>
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
{{/if}} {{/if}}
</span> </span>
</li> </li>

View File

@ -1,13 +1,13 @@
<h4>Equipement</h4> <h4>Equipement</h4>
<span class="item-name"> <span class="item-name">
{{#if options.isOwner}} {{#if options.isOwner}}
<a class="chat-card-button creer-un-objet">Nouvel objet</a> <a class="chat-card-button creer-un-objet" data-tooltip="Créer un nouvel objet">Nouvel objet</a>
{{/if}} {{/if}}
{{#if options.isGM}} {{#if options.isGM}}
<a class="chat-card-button nettoyer-conteneurs">Tout vider</a> <a class="chat-card-button nettoyer-conteneurs" data-tooltip="Vider tous les contenants">Tout vider</a>
{{/if}} {{/if}}
<span class="embed-inline"> <span class="embed-inline">
<input class="recherche flex-grow" type="text" value="{{options.recherche.text}}" name="recherche" size="8" data-dtype="String" placeholder=""/> <input class="recherche flex-grow" type="text" value="{{options.recherche.text}}" name="recherche" size="8" data-dtype="String" placeholder="" data-tooltip="Rechercher dans l'équipement"/>
</span> </span>
{{#if calc.surEncombrementMessage}}<b>{{calc.surEncombrementMessage}}</b> &hyphen;{{/if}} {{#if calc.surEncombrementMessage}}<b>{{calc.surEncombrementMessage}}</b> &hyphen;{{/if}}
Encombrement: {{numberFormat calc.encTotal decimals=2}} (max: {{system.attributs.encombrement.value}}) Encombrement: {{numberFormat calc.encTotal decimals=2}} (max: {{system.attributs.encombrement.value}})

View File

@ -2,10 +2,11 @@
<h3>Jeux :</h3> <h3>Jeux :</h3>
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
{{#each jeux as |jeu id|}} {{#each jeux as |jeu id|}}
<li class="item flexrow list-item" data-item-id="{{jeu._id}}"><span class="competence-title jeu-label"><a>{{jeu.name}} (base {{jeu.system.base}})</a></span> <li class="item flexrow list-item" data-item-id="{{jeu._id}}">
<span class="competence-title jeu-label"><a>{{jeu.name}} (base {{jeu.system.base}})</a></span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> <a class="item-edit" data-tooltip="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}

View File

@ -1,11 +1,11 @@
<span class="item-name"><h4>Compagnons animaux</h4></span> <span class="item-name"><h4>Compagnons animaux</h4></span>
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
{{#each subacteurs.montures as |monture id|}} {{#each subacteurs.montures as |monture id|}}
<li class="item flexrow list-item" data-subactor-id="{{monture.id}}"> <li class="item flexrow list-item" data-subactor-id="{{monture.id}}" data-tooltip="{{monture.name}}">
<img class="sheet-competence-img subacteur-open" src="{{monture.img}}" title="{{monture.name}}"/> <img class="sheet-competence-img subacteur-open" src="{{monture.img}}"/>
<span class="subacteur-label subacteur-open"><a>{{monture.name}}</a></span> <span class="subacteur-label subacteur-open"><a>{{monture.name}}</a></span>
<div class="flex-shrink"> <div class="flex-shrink">
<a class="subacteur-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="subacteur-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}

View File

@ -1,8 +1,8 @@
<h4>Suivants/Compagnons/Amoureux</h4> <h4>Suivants/Compagnons/Amoureux</h4>
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
{{#each subacteurs.suivants as |suivant id|}} {{#each subacteurs.suivants as |suivant id|}}
<li class="item flexrow list-item" data-subactor-id="{{suivant.id}}"> <li class="item flexrow list-item" data-subactor-id="{{suivant.id}}" data-tooltip="{{suivant.name}}">
<img class="sheet-competence-img subacteur-open" src="{{suivant.img}}" title="{{suivant.name}}"/> <img class="sheet-competence-img subacteur-open" src="{{suivant.img}}"/>
<span class="competence-title subacteur-label subacteur-open"> <span class="competence-title subacteur-label subacteur-open">
<a>{{suivant.name}}</a> <a>{{suivant.name}}</a>
</span> </span>
@ -18,12 +18,12 @@
</span> </span>
<span class="competence-title subacteur-label"> <span class="competence-title subacteur-label">
{{#if (gte suivant.coeur 1)}} {{#if (gte suivant.coeur 1)}}
<a class="subacteur-tendre-moment chat-card-button">Tendre moment</a> <a class="subacteur-tendre-moment chat-card-button" data-tooltip="Proposer à {{suivant.name}} de passer un tendre moment">Tendre moment</a>
{{/if}} {{/if}}
</span> </span>
{{/if}} {{/if}}
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="subacteur-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="subacteur-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}

View File

@ -12,13 +12,13 @@
{{#each subacteurs.vehicules as |vehicule id|}} {{#each subacteurs.vehicules as |vehicule id|}}
<li class="item flexrow list-item" data-subactor-id="{{vehicule.id}}"> <li class="item flexrow list-item" data-subactor-id="{{vehicule.id}}">
<img class="sheet-competence-img subacteur-open" src="{{vehicule.img}}" title="{{vehicule.name}}"/> <img class="sheet-competence-img subacteur-open" src="{{vehicule.img}}" data-tooltip="{{vehicule.name}}"/>
<span class="subacteur-label subacteur-open"><a>{{vehicule.name}}</a></span> <span class="subacteur-label subacteur-open"><a>{{vehicule.name}}</a></span>
<span>{{vehicule.system.categorie}}</span> <span>{{vehicule.system.categorie}}</span>
<span>{{vehicule.system.etat.resistance.max}}</span> <span>{{vehicule.system.etat.resistance.max}}</span>
<span>{{vehicule.system.etat.structure.max}}</span> <span>{{vehicule.system.etat.structure.max}}</span>
<span> <span>
<a class="subacteur-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="subacteur-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</span> </span>
</li> </li>
{{/each}} {{/each}}

View File

@ -25,8 +25,8 @@
{{/if}} {{/if}}
</span> </span>
<div class="item-controls"> <div class="item-controls">
<a class="item-edit" title="Modifier"><i class="fas fa-edit"></i></a> <a class="item-edit" data-tooltip="Modifier"><i class="fas fa-edit"></i></a>
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}

View File

@ -1,12 +1,12 @@
<li class="item flexrow list-item" data-item-id="{{oeuvre._id}}"> <li class="item flexrow list-item" data-item-id="{{oeuvre._id}}">
<img class="sheet-competence-img" src="{{oeuvre.img}}" /> <img class="sheet-competence-img" src="{{oeuvre.img}}" data-tooltip="{{upperFirst typeOeuvre}}: {{oeuvre.name}}"/>
<span>{{upperFirst typeOeuvre}}</span> <span>{{upperFirst typeOeuvre}}</span>
<span class="competence-title {{classOeuvre}}"> <span class="competence-title {{classOeuvre}}">
<a>{{oeuvre.name}} (niveau {{oeuvre.system.niveau}})</a> <a>{{oeuvre.name}} (niveau {{oeuvre.system.niveau}})</a>
</span> </span>
<div class="item-controls"> <div class="item-controls">
<a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> <a class="item-edit" data-tooltip="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>

View File

@ -13,8 +13,8 @@
</span> </span>
<span class="competence-label">{{possession.system.type}}</span> <span class="competence-label">{{possession.system.type}}</span>
<div class="item-controls"> <div class="item-controls">
<a class="item-edit" title="Modifier"><i class="fas fa-edit"></i></a> <a class="item-edit" data-tooltip="Modifier"><i class="fas fa-edit"></i></a>
<a class="item-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}

View File

@ -2,10 +2,10 @@
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
{{#each resonances as |actor|}} {{#each resonances as |actor|}}
<li class="item flexrow list-item" data-actor-id="{{actor.id}}"> <li class="item flexrow list-item" data-actor-id="{{actor.id}}">
<img class="sheet-competence-img subacteur-open" src="{{actor.img}}" title="{{actor.name}}"/> <img class="sheet-competence-img subacteur-open" src="{{actor.img}}" data-tooltip="{{actor.name}}"/>
<span class="subacteur-label subacteur-open"><a>{{actor.name}}</a></span> <span class="subacteur-label subacteur-open"><a>{{actor.name}}</a></span>
<div class="flex-shrink"> <div class="flex-shrink">
<a class="resonance-delete" title="Supprimer"><i class="fas fa-trash"></i></a> <a class="resonance-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}

View File

@ -2,15 +2,15 @@
<ul class="item-list alterne-list"> <ul class="item-list alterne-list">
{{#each taches as |tache id|}} {{#each taches as |tache id|}}
{{#unless (eq tache.system.competence 'Chirurgie')}} {{#unless (eq tache.system.competence 'Chirurgie')}}
<li class="item flexrow list-item" data-item-id="{{tache._id}}"> <li class="item flexrow list-item" data-item-id="{{tache._id}}" data-tooltip="Tâche: {{tache.name}}" >
<img class="sheet-competence-img" src="{{tache.img}}" /> <img class="sheet-competence-img" src="{{tache.img}}"/>
<span class="competence-title tache-label"><a>{{tache.name}} <span class="competence-title tache-label"><a>{{tache.name}}
({{tache.system.points_de_tache_courant}}{{#if ({{tache.system.points_de_tache_courant}}{{#if
(or @root.options.isGM (not tache.system.cacher_points_de_tache)) (or @root.options.isGM (not tache.system.cacher_points_de_tache))
}}/{{tache.system.points_de_tache}}{{/if}})</a></span> }}/{{tache.system.points_de_tache}}{{/if}})</a></span>
<div class="item-controls flex-shrink"> <div class="item-controls flex-shrink">
<a class="item-edit" title="Edit Item"><i class="fas fa-edit"></i></a> <a class="item-edit" data-tooltip="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-delete" title="Delete Item"><i class="fas fa-trash"></i></a> <a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/unless}} {{/unless}}

View File

@ -13,10 +13,10 @@
<label class="flex-shrink">{{xplog.datereel}}</label> <label class="flex-shrink">{{xplog.datereel}}</label>
{{#if @root.options.isGM}} {{#if @root.options.isGM}}
<span class="flex-shrink"> <span class="flex-shrink">
<a class="experiencelog-delete" title="Supprimer"> <a class="experiencelog-delete" data-tooltip="Supprimer">
<i class="fas fa-trash"></i> <i class="fas fa-trash"></i>
</a> </a>
<a class="experiencelog-delete-previous" title="Supprimer jusqu'ici"> <a class="experiencelog-delete-previous" data-tooltip="Supprimer jusqu'ici">
<i class="fas fa-eraser"></i> <i class="fas fa-eraser"></i>
</a> </a>
</span> </span>

View File

@ -1,4 +1,4 @@
<img class="chat-icon" src="{{item.img}}" alt="{{item.name}}" /> <img class="chat-icon" src="{{item.img}}" data-tooltip="{{item.name}}" />
<h4>{{#if isVente}}Achat{{else}}Don{{/if}}</h4> <h4>{{#if isVente}}Achat{{else}}Don{{/if}}</h4>
<p> <p>
{{#if acheteur}}{{acheteur.name}}{{else}}L'acheteur{{/if}} a {{#if acheteur}}{{acheteur.name}}{{else}}L'acheteur{{/if}} a

View File

@ -1,26 +1,29 @@
<h4>{{alias}} a gagné de l'expérience en {{caracName}}{{#if competence}} / {{competence.name}}{{/if}}!</h4> <img class="chat-icon" src="{{actor.img}}" data-tooltip="{{actor.name}}" />
{{#if (gt xpCarac 0)}} <h4>{{actor.name}} a gagné de l'expérience</h4>
<hr> {{#each xpData as |it|}}
{{xpCarac}} point{{#if (gt xpCarac 1)}}s{{/if}} {{#if (gt it.xpCarac 0)}}
{{#if caracRepartitionManuelle}}à répartir manuellement dans la caractéristique dérivée{{else}}en{{/if}} <hr>
{{caracName}}. {{it.xpCarac}} point{{#if (gt it.xpCarac 1)}}s{{/if}}
{{#if checkCarac}} {{#if it.caracRepartitionManuelle}}à répartir manuellement dans la caractéristique dérivée{{else}}en{{/if}}
L'expérience dans cette caractéristique est de {{checkCarac.xp}}, elle peut progresser! {{it.caracName}}.
<br>Vous devez ouvrir votre fiche de personnage et appliquer (ou pas) l'augmentation manuellement. {{#if it.checkCarac}}
L'expérience dans cette caractéristique est de {{it.checkCarac.xp}}, elle peut progresser!
<br>Vous devez ouvrir votre fiche de personnage et appliquer l'augmentation manuellement.
{{/if}}
{{/if}} {{/if}}
{{/if}} {{#if (gt it.xpCompetence 0)}}
<hr>
{{#if (gt xpCompetence 0)}} {{it.xpCompetence}} point{{#if (gt it.xpCompetence 1)}}s{{/if}} en {{it.competence.name}}.
<hr> {{#if it.checkComp}}
{{xpCompetence}} point{{#if (gt xpCompetence 1)}}s{{/if}} en {{competence.name}}. L'expérience dans cette compétence est de {{it.checkComp.xp}}, elle peut progresser jusqu'à {{it.checkComp.niveau}}!
{{#if checkComp}} Vous devez ouvrir votre fiche de personnage et appliquer l'augmentation manuellement.
L'expérience dans cette compétence est de {{checkComp.xp}}, elle peut progresser jusqu'à {{checkComp.niveau}}! {{#if (gt it.checkComp.niveau it.checkComp.archetype)}}
Vous devez ouvrir votre fiche de personnage et appliquer l'augmentation manuellement. <br>Le niveau d'archétype est de {{it.checkComp.archetype}}.
{{#if (gt checkComp.niveau checkComp.archetype)}}<br>Le niveau d'archétype est de {{checkComp.archetype}}. {{#if it.checkComp.archetypeWarning}}
{{#if checkComp.archetypeWarning}} <br><strong>ATTENTION !!</strong> Si vous appliquez cette augmentation, votre compétence dépassera l'archétype.
<br><strong>ATTENTION !!</strong> Si vous appliquez cette augmentation, votre compétence dépassera l'archétype. Veuillez contrôler que votre archétype est à jour, ou bien ne pas augmenter le niveau de cette compétence.
Veuillez contrôler que votre archétype est à jour, ou bien ne pas augmenter le niveau de cette compétence. {{/if}}
{{/if}} {{/if}}
{{/if}} {{/if}}
{{/if}} {{/if}}
{{/if}} {{/each}}

View File

@ -1 +1,2 @@
<img class="chat-icon" src="{{actor.img}}" data-tooltip="{{actor.name}}" />
<h4>C'est au tour de {{alias}} !</h4> <h4>C'est au tour de {{alias}} !</h4>

View File

@ -1,3 +1,4 @@
<img class="chat-icon" src="{{actor.img}}" data-tooltip="{{actor.name}}" />
<h4>Résumé de santé pour {{alias}}</h4> <h4>Résumé de santé pour {{alias}}</h4>
<div data-combatid="{{combatId}}" data-combatmessage="actor-turn-summary">{{blessuresStatus}}</div> <div data-combatid="{{combatId}}" data-combatmessage="actor-turn-summary">{{blessuresStatus}}</div>
<div>Son état général est de : {{etatGeneral}} {{#if isSonne}} et est <strong>sonné</strong>{{/if}}</div> <div>Son état général est de : {{etatGeneral}} {{#if isSonne}} et est <strong>sonné</strong>{{/if}}</div>

View File

@ -1,4 +1,4 @@
<img class="chat-icon" src="{{rencontre.img}}" alt="{{rencontre.name}}" /> <img class="chat-icon" src="{{rencontre.img}}" data-tooltip="{{rencontre.name}}" />
<h4>{{#if mauvaise}}Mauvaise rencontre{{else}}Rencontre{{/if}} en {{typeTmr-name tmr.type}}</h4> <h4>{{#if mauvaise}}Mauvaise rencontre{{else}}Rencontre{{/if}} en {{typeTmr-name tmr.type}}</h4>
<div>{{row.document.pack}}</div> <div>{{row.document.pack}}</div>
<div>Jet: {{row.roll.formula}} : {{row.roll.total}}{{percentages}}</div> <div>Jet: {{row.roll.formula}} : {{row.roll.total}}{{percentages}}</div>

View File

@ -3,8 +3,13 @@
<div>Jet {{roll.formula}} : {{roll.total}}{{percentages}}</div> <div>Jet {{roll.formula}} : {{roll.total}}{{percentages}}</div>
<hr> <hr>
<div> <div>
<img class="chat-icon" src="{{document.img}}" alt="{{document.name}}" /> <img class="chat-icon" src="{{document.img}}" data-tooltip="{{document.name}}" />
<p>{{linkCompendium document.pack document.id document.name}}</p> <p>{{linkCompendium document.pack document.id document.name}}</p>
{{#if document.system.formule}}
<div class="poesie-extrait">
[[/r {{document.system.formule}}]]
</div>
{{/if}}
{{#if document.system.description}} {{#if document.system.description}}
<div class="poesie-extrait"> <div class="poesie-extrait">
{{{document.system.description}}} {{{document.system.description}}}

View File

@ -1,5 +1,5 @@
<div> <div>
<img class="chat-icon" src="{{img}}" alt="{{typeName}}" /> <img class="chat-icon" src="{{img}}" data-tooltip="{{typeName}}" />
<h4>Table aléatoire: {{typeName}}</h4> <h4>Table aléatoire: {{typeName}}</h4>
{{#with (lookup table 0) as |row|}} {{#with (lookup table 0) as |row|}}
<div> <div>

View File

@ -1,4 +1,4 @@
<img class="chat-icon" src="{{img}}" alt="potion de repos" /> <img class="chat-icon" src="{{img}}" data-tooltip="potion de repos" />
<h4> <h4>
{{alias}} a bu une <strong>{{name}}{{#if system.magique}} enchantée{{/if}}</strong> {{alias}} a bu une <strong>{{name}}{{#if system.magique}} enchantée{{/if}}</strong>
</h4> </h4>

View File

@ -1,4 +1,4 @@
<img class="chat-icon" src="{{img}}" alt="potion de repos" /> <img class="chat-icon" src="{{img}}" data-tooltip="potion de repos" />
<h4> <h4>
{{alias}} a bu une <strong>{{name}}{{#if system.magique}} enchantée de puissance {{system.puissance}}{{/if}}</strong>. {{alias}} a bu une <strong>{{name}}{{#if system.magique}} enchantée de puissance {{system.puissance}}{{/if}}</strong>.
</h4> </h4>

View File

@ -1,4 +1,4 @@
<img class="chat-icon" src="{{img}}" alt="potion de soin" /> <img class="chat-icon" src="{{img}}" data-tooltip="potion de soin" />
<h4> <h4>
{{alias}} a bu une <strong>{{name}}{{#if system.magique}} enchantée de {{system.puissance}} points de guérison{{/if}}</strong> {{alias}} a bu une <strong>{{name}}{{#if system.magique}} enchantée de {{system.puissance}} points de guérison{{/if}}</strong>
</h4> </h4>

View File

@ -1,4 +1,4 @@
<img class="chat-icon" src="{{herbe.img}}" alt="fabrication" /> <img class="chat-icon" src="{{herbe.img}}" data-tooltip="fabrication" />
<h4> <h4>
{{alias}} a fabriqué une potion de {{herbe.system.categorie}} de {{herbe.name}}, avec {{herbe.nbBrins}} brins. {{alias}} a fabriqué une potion de {{herbe.system.categorie}} de {{herbe.name}}, avec {{herbe.nbBrins}} brins.
</h4> </h4>

Some files were not shown because too many files have changed in this diff Show More