Compare commits

..

49 Commits

Author SHA1 Message Date
972ae74e2c Merge pull request '11.2.17 - Le cache-oeil d'Akarlikarlikar' (#695) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
Reviewed-on: #695
2024-03-10 08:57:28 +01:00
7969e74c8d Version 11.2.17 2024-03-10 00:53:45 +01:00
84ea3a6ea9 Fix: TMR qui ne s'affichent pas
Après un certain temps (changements de scènes?), les TMR ne
s'affichaient plus correctement.

Tentative de forcer le chargement des textures manquantes lors
de l'ouverture de la fenêtre de TMR.
2024-03-10 00:47:50 +01:00
7ada5577aa Ajout de l'information Ombre de Thanatos
Si Thanatos a été utilisé, la prochaine queue est une ombre
Un indicateur apparait dans l'onglet Haut-Rêve.
2024-03-10 00:24:02 +01:00
b0e28ef937 Fix: labels for / id
- Ajout de "for" sur labels
- suppression d'id inutiles
- corrections de for="xp" incorrects
- simplification css alchimie-title/blessure-title
2024-03-10 00:13:36 +01:00
6414f76d67 Fix: ignorer personnages joueurs non liés
Pour les fenêtres de stress/repos/voyage/astrologie, ignorer
les personnages non liés (par exemple, un guerrier sorde)
2024-03-09 23:12:13 +01:00
dde3011f1d Fix: Checkbox cacher les points de tâche 2024-03-09 19:50:00 +01:00
6dbf322efe Fix: traduction tooltip Ediot/Delete 2024-03-09 19:49:31 +01:00
d34fde2ba4 Fix: titre des feuilles d'objets
Suite à la correction de l'ordre et du nom dans la fenêtre de création,
les titres étaient incorrects (TYPES.Item.Tache par exemple)
2024-03-09 19:48:53 +01:00
bc169d931b Fix: log erreur TMR en mode visu
En mode visualisation, les informations du personnage ne sont
pas affichées
2024-03-09 19:38:53 +01:00
3b269b2baa Simplifications 2024-03-09 19:13:13 +01:00
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
105 changed files with 1267 additions and 548 deletions

View File

@ -1,4 +1,52 @@
# 11.2
## 11.2.17 - Le cache-oeil d'Akarlikarlikar
- Le titre des fenêtre d'objet affiche de nouveau le type traduit
- Les tooltips des boutons edit/delete sont maintenant en Français
- La case à cocher "Cacher les points de tâches" fonctionne de nouveau
- Les personnages non-liés ne sont plus dans les liste de personnages joueurs pour le repos, le stress, la fatigue
- L'utilisation de Thanatos est visible dans l'onglet Haut-Rêve pour indiquer que la prochaine queue est une ombre
- La fenêtre des TMRs ne devrait plus afficher une zone noire au lieu de la carte.
## 11.2.16 - Le 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

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

View File

@ -35,6 +35,7 @@ import { ExperienceLog, XP_TOPIC } from "./actor/experience-log.js";
import { TYPES } from "./item.js";
import { RdDBaseActorSang } from "./actor/base-actor-sang.js";
import { RdDCoeur } from "./coeur/rdd-coeur.js";
import { DialogChoixXpCarac } from "./dialog-choix-xp-carac.js";
export const MAINS_DIRECTRICES = ['Droitier', 'Gaucher', 'Ambidextre']
@ -56,21 +57,20 @@ export class RdDActor extends RdDBaseActorSang {
/* -------------------------------------------- */
$computeCaracDerivee() {
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.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.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.value = Math.min(this.system.sante.vie.value, this.system.sante.vie.max)
@ -95,25 +95,27 @@ export class RdDActor extends RdDBaseActorSang {
return ![TYPES.competencecreature, TYPES.tarot, TYPES.service].includes(item.type)
}
isPersonnageJoueur() {
return this.hasPlayerOwner && this.prototypeToken.actorLink
}
isPersonnage() { return true }
isHautRevant() { return this.system.attributs.hautrevant.value != "" }
/* -------------------------------------------- */
getAgilite() { return Number(this.system.carac.agilite?.value ?? 0) }
getChance() { return Number(this.system.carac.chance?.value ?? 0) }
getAgilite() { return this.system.carac.agilite?.value ?? 0 }
getChance() { return this.system.carac.chance?.value ?? 0 }
getReveActuel() { return Misc.toInt(this.system.reve?.reve?.value ?? this.carac.reve.value) }
getChanceActuel() { return Misc.toInt(this.system.compteurs.chance?.value ?? 10) }
getMoralTotal() { return Number(this.system.compteurs.moral?.value ?? 0) }
getReveActuel() { return this.system.reve?.reve?.value ?? this.carac.reve.value ?? 0 }
getChanceActuel() { return this.system.compteurs.chance?.value ?? 10 }
getMoralTotal() { return this.system.compteurs.moral?.value ?? 0 }
/* -------------------------------------------- */
getEtatGeneral(options = { ethylisme: false }) {
const etatGeneral = Misc.toInt(this.system.compteurs.etat?.value)
if (options.ethylisme) {
// Pour les jets d'Ethylisme, on retire le malus d'éthylisme (p.162)
return etatGeneral - this.malusEthylisme()
}
return etatGeneral
const etatGeneral = this.system.compteurs.etat?.value ?? 0
// Pour les jets d'Ethylisme, on retire le malus d'éthylisme (p.162)
const annuleMalusEthylisme = options.ethylisme ? this.malusEthylisme() : 0
return etatGeneral - annuleMalusEthylisme
}
/* -------------------------------------------- */
@ -152,23 +154,26 @@ export class RdDActor extends RdDBaseActorSang {
/* -------------------------------------------- */
async $perteRevePotionsEnchantees() {
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 => {
console.log(potion)
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
})
const potionUpdates = await Promise.all(potions.map(async it => {
const nouveauReve = Math.max(it.system.pr - 1, 0)
ChatMessage.create({
whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name),
content: message
});
return { _id: potion._id, 'system.pr': nouveauReve };
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-potionenchantee-chateaudormant.html`, {
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);
}
@ -399,7 +404,7 @@ export class RdDActor extends RdDBaseActorSang {
content: 'Remise à neuf de ' + this.name
});
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 = {
'system.sante.endurance.value': this.system.sante.endurance.max,
'system.sante.vie.value': this.system.sante.vie.max,
@ -659,7 +664,7 @@ export class RdDActor extends RdDBaseActorSang {
this.setPointsDeChance(to);
}
}
let selectedCarac = RdDBaseActor._findCaracByName(this.system.carac, caracName);
let selectedCarac = this.findCaracByName(caracName);
const from = selectedCarac.value
await this.update({ [`system.carac.${caracName}.value`]: to });
await ExperienceLog.add(this, XP_TOPIC.CARAC, from, to, caracName);
@ -670,7 +675,7 @@ export class RdDActor extends RdDBaseActorSang {
if (caracName == 'Taille') {
return;
}
let selectedCarac = RdDBaseActor._findCaracByName(this.system.carac, caracName);
let selectedCarac = this.findCaracByName(caracName);
if (!selectedCarac.derivee) {
const from = Number(selectedCarac.xp);
await this.update({ [`system.carac.${caracName}.xp`]: to });
@ -684,7 +689,7 @@ export class RdDActor extends RdDBaseActorSang {
if (caracName == 'Taille') {
return;
}
let carac = RdDBaseActor._findCaracByName(this.system.carac, caracName);
let carac = this.findCaracByName(caracName);
if (carac) {
carac = duplicate(carac);
const fromXp = Number(carac.xp);
@ -896,7 +901,7 @@ export class RdDActor extends RdDBaseActorSang {
/* -------------------------------------------- */
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");
await roll.evaluate({ async: true });
await roll.toMessage({ flavor: `${this.name} refoule ${refouler} pour ${value} points de refoulement (total: ${refoulement})` });
@ -1166,8 +1171,8 @@ export class RdDActor extends RdDBaseActorSang {
title: "Nourriture brute",
content: `Que faire de votre ${item.name}`,
buttons: {
'cuisiner': { icon: '<i class="fas fa-check"></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) }
'cuisiner': { icon: '<i class="fa-solid fa-utensils"></i>', label: 'Cuisiner', callback: async () => await this.preparerNourriture(item) },
'manger': { icon: '<i class="fa-solid fa-drumstick-bite"></i>', label: 'Manger cru', callback: async () => await this.mangerNourriture(item, onActionItem) }
}
});
return utilisation.render(true);
@ -1472,8 +1477,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) {
let carac = RdDBaseActor._findCaracByName(this.system.carac, caracName);
let carac = this.findCaracByName(caracName);
if (carac && carac.xp > 0) {
const niveauSuivant = Number(carac.value) + 1;
let xpNeeded = RdDCarac.getCaracNextXp(niveauSuivant);
@ -1534,8 +1545,11 @@ export class RdDActor extends RdDBaseActorSang {
async appliquerAjoutExperience(rollData, hideChatMessage = 'show') {
hideChatMessage = hideChatMessage == 'hide' || (Misc.isRollModeHiddenToPlayer() && !game.user.isGM)
let xpData = await this._appliquerExperience(rollData.rolled, rollData.selectedCarac.label, rollData.competence, rollData.jetResistance);
if (xpData) {
const content = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-gain-xp.html`, xpData);
if (xpData.length) {
const content = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-gain-xp.html`, {
actor: this,
xpData
});
if (hideChatMessage) {
ChatUtility.blindMessageToGM({ content: content });
}
@ -1698,7 +1712,7 @@ export class RdDActor extends RdDBaseActorSang {
if (rollData.competence.name.includes('Thanatos')) { // Si Thanatos
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.isPart) {
rollData.depenseReve = Math.max(Math.floor(rollData.depenseReve / 2), 1);
@ -1804,7 +1818,10 @@ export class RdDActor extends RdDBaseActorSang {
}
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) {
@ -2262,9 +2279,7 @@ export class RdDActor extends RdDBaseActorSang {
});
return undefined;
}
if (caracName == 'Vie') caracName = 'constitution';
if (caracName == 'derobee') caracName = 'agilite';
if (caracName == 'reve-actuel') caracName = 'reve';
let xp = Math.abs(rolled.finalLevel);
// impair: arrondi inférieur en carac
let xpCarac = competence ? Math.floor(xp / 2) : Math.max(Math.floor(xp / 2), 1);
@ -2277,11 +2292,10 @@ export class RdDActor extends RdDBaseActorSang {
// max 1 xp sur jets de résistance
xpCarac = Math.min(1, xpCarac);
}
let xpData = { alias: this.name, caracName, xpCarac, competence, xpCompetence };
await this._xpCompetence(xpData);
await this._xpCarac(xpData);
return xpData;
return [
...(await this._xpCompetence({ competence, xpCompetence })),
...(await this._xpCarac({ caracName, xpCarac }))
];
}
/* -------------------------------------------- */
@ -2289,31 +2303,67 @@ export class RdDActor extends RdDBaseActorSang {
if (xpData.competence) {
const from = Number(xpData.competence.system.xp);
const to = from + xpData.xpCompetence;
let update = { _id: xpData.competence._id, 'system.xp': to };
await this.updateEmbeddedDocuments('Item', [update]);
await this.updateEmbeddedDocuments('Item', [{ _id: xpData.competence._id, 'system.xp': to }]);
xpData.checkComp = await this.checkCompetenceXP(xpData.competence.name, undefined, false);
await ExperienceLog.add(this, XP_TOPIC.XP, from, to, xpData.competence.name);
return [xpData]
}
return []
}
/* -------------------------------------------- */
async _xpCarac(xpData) {
if (xpData.xpCarac > 0) {
let carac = duplicate(this.system.carac);
let selectedCarac = RdDBaseActor._findCaracByName(carac, xpData.caracName);
if (!selectedCarac.derivee) {
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);
const carac = duplicate(this.system.carac)
const code = RdDBaseActor._findCaracNode(carac, xpData.caracName)
const selectedCarac = carac[code]
if (this.isCaracMax(code)) {
ui.notifications.info(`Pas d'expérience: la caractéristique '${selectedCarac.label}' est déjà au maximum pour ${this.name}`)
return []
}
if (selectedCarac && !selectedCarac.derivee) {
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 {
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() {
const deletions = this.itemTypes['nombreastral'].map(it => it._id);
@ -2415,7 +2465,7 @@ export class RdDActor extends RdDBaseActorSang {
draconic: this.getDraconicList(),
sort: this.itemTypes['sort'],
signes: this.itemTypes['signedraconique'],
caracReve: this.system.carac.reve.value,
caracReve: parseInt(this.system.carac.reve.value),
pointsReve: this.getReveActuel(),
isRapide: isRapide,
isGM: game.user.isGM,
@ -2506,7 +2556,7 @@ export class RdDActor extends RdDBaseActorSang {
/* -------------------------------------------- */
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({
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})`
@ -2920,9 +2970,7 @@ export class RdDActor extends RdDBaseActorSang {
}
/* -------------------------------------------- */
isEffectAllowed(statusId) {
return true
}
isEffectAllowed(effectId) { return true }
/* -------------------------------------------- */
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) {
return this.getEmbeddedCollection("ActiveEffect").filter(filter);
}
getEffect(statusId) {
return this.getEmbeddedCollection("ActiveEffect").find(it => it.flags?.core?.statusId == statusId);
getEffect(effectId) {
return this.getEmbeddedCollection("ActiveEffect").find(it => it.statuses?.has(effectId));
}
async setEffect(statusId, status) {
if (this.isEffectAllowed(statusId)) {
const effect = this.getEffect(statusId);
async setEffect(effectId, status) {
if (this.isEffectAllowed(effectId)) {
const effect = this.getEffect(effectId);
if (!status && effect) {
await this.deleteEmbeddedDocuments('ActiveEffect', [effect.id]);
}
if (status && !effect) {
await this.createEmbeddedDocuments("ActiveEffect", [StatusEffects.status(statusId)]);
await this.createEmbeddedDocuments("ActiveEffect", [StatusEffects.prepareActiveEffect(effectId)]);
}
}
}
async removeEffect(statusId) {
const effect = this.getEffect(statusId);
async removeEffect(id) {
const effect = this.getEmbeddedCollection("ActiveEffect").find(it => it.id == id);
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-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-endurance').click(async event => await this.jetEndurance())

View File

@ -11,16 +11,14 @@ import { SystemCompendiums } from "../settings/system-compendiums.js";
import { APP_ASTROLOGIE_REFRESH } from "../sommeil/app-astrologie.js";
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);
let entry = Misc.findFirstLike(name, caracList, { mapper: it => it[0], description: 'caractéristique' });
if (!entry || entry.length == 0) {
@ -87,6 +85,8 @@ export class RdDBaseActor extends Actor {
return game.actors.get(actorId)
}
isPersonnageJoueur() { return false }
static extractActorMin = (actor) => { return { id: actor?.id, type: actor?.type, name: actor?.name, img: actor?.img }; };
static getParentActor(document) {
@ -135,6 +135,21 @@ export class RdDBaseActor extends Actor {
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) {
switch (Grammar.toLowerCaseNoAccent(name)) {
case 'reve-actuel': case 'reve actuel':
@ -142,7 +157,7 @@ export class RdDBaseActor extends Actor {
case 'chance-actuelle': case 'chance-actuelle':
return this.getCaracChanceActuelle();
}
return RdDBaseActor._findCaracByName(this.system.carac, name);
return this.findCaracByName(name);
}
/* -------------------------------------------- */
@ -187,7 +202,7 @@ export class RdDBaseActor extends Actor {
}
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); }
filterItems(filter, type = undefined) { return (type ? this.itemTypes[type] : this.items)?.filter(filter) ?? []; }
findItemLike(idOrName, type) {

View File

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

View File

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

View File

@ -12,7 +12,7 @@ export const XP_TOPIC = {
export class ExperienceLog {
static async add(actor, topic, from, to, raison, manuel = false) {
if (!actor.hasPlayerOwner || !actor.isPersonnage()) {
if (!actor.isPersonnageJoueur()) {
return
}
if (from == to) {

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 { Misc } from "../misc.js";
import { RdDTimestamp } from "../time/rdd-timestamp.js";
import { ChatUtility } from "../chat-utility.js";
const BASE_TACHE_SOIN_BLESSURE = {
type: "tache",
@ -14,10 +15,10 @@ const TACHES_SOIN_BLESSURE = {
}
const definitionsBlessures = [
{ type: "contusion", gravite: 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: "grave", gravite: 4, 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: "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, endurance: "1d6", vie: 0, label: 'Légère', max: 5, 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, 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" }
]
@ -40,6 +41,32 @@ export class RdDItemBlessure extends RdDItem {
}
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) {
const definition = RdDItemBlessure.getDefinition(gravite)
const blessure = {

View File

@ -46,7 +46,7 @@ export class Misc {
}
static typeName(type, subType) {
return subType ? game.i18n.localize(`TYPES.${type}.${Misc.upperFirst(subType)}`)
return subType ? game.i18n.localize(`TYPES.${type}.${subType}`)
: '';
}

View File

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

View File

@ -328,8 +328,8 @@ export class RdDCombatManager extends Combat {
}
}
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: "Décrémenter initiative", condition: true, icon: '<i class="fas fa-minus"></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="fa-solid fa-minus"></i>', callback: target => { RdDCombatManager.incDecInit(target.data('combatant-id'), -0.01); } }
].concat(options);
}
/* -------------------------------------------- */
@ -1307,6 +1307,7 @@ export class RdDCombat {
blessuresStatus: actor.computeResumeBlessure(),
SConst: actor.getSConst(),
actorId: actor.id,
actor: actor,
tokenId: tokenId,
isGrave: actor.countBlessures(it => it.isGrave()) > 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 { FenetreRechercheTirage } from "./tirage/fenetre-recherche-tirage.js";
import { TMRUtility } from "./tmr-utility.js";
import { DialogFatigueVoyage } from "./voyage/dialog-fatigue-voyage.js";
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", "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: ["/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: ["/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) {
if (params.length == 1 || params.length == 2) {
return game.system.rdd.rencontresTMR.rollRencontre(params[0], params[1])
}
}
return false;
}
@ -461,14 +463,13 @@ export class RdDCommands {
let motif = params.slice(1, params.length - 2);
let name = params[params.length - 1];
const personnages = game.actors.filter(actor => actor.isPersonnageJoueur());
if (name == undefined) {
for (let actor of game.actors) {
// TODO: ne plus stresser les entités de cauchemar!
for (let actor of personnages) {
await actor.distribuerStress('stress', stress, motif);
}
} else {
//console.log(stressValue, nomJoueur);
let actor = Misc.findActor(name, game.actors.filter(it => it.hasPlayerOwner)) ?? Misc.findPlayer(name)?.character
let actor = Misc.findActor(name, personnages) ?? Misc.findPlayer(name)?.character
if (actor) {
await actor.distribuerStress('stress', stress, motif);
}
@ -485,10 +486,13 @@ export class RdDCommands {
}
async tirage() {
FenetreRechercheTirage.create();
FenetreRechercheTirage.create()
}
async voyage() {
DialogFatigueVoyage.create()
}
async sommeil() {
DialogChateauDormant.create();
DialogChateauDormant.create()
}
}

View File

@ -266,16 +266,16 @@ export class SystemReveDeDragon {
/* -------------------------------------------- */
/* 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();
if (Misc.isUniqueConnectedGM()) {
new Migrations().migrate();
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();
@ -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();

View File

@ -44,6 +44,7 @@ export class RdDRoll extends Dialog {
diffLibre: rollData.competence?.system.default_diffLibre ?? 0,
perteMoralEchec: false, /* Pour l'affichage dans le chat */
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. */
libre: true,
coeur: undefined,
@ -214,6 +215,10 @@ export class RdDRoll extends Dialog {
this.rollData[attribute] = event.currentTarget.checked;
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.rollData.use.encTotal = event.currentTarget.checked;
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-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(".divAppelAuMoral"), rollData.use.appelAuMoral);
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 { RdDTimestamp } from "./time/rdd-timestamp.js";
import { TYPES } from "./item.js";
import { Misc } from "./misc.js";
const TMR_DISPLAY_SIZE = {
code: 'tmr-display-size',
@ -43,16 +44,15 @@ export class RdDTMRDialog extends Dialog {
type: Number,
range: TMR_DISPLAY_SIZE.range
})
await PixiTMR.init()
}
static async create(actor, tmrData) {
await PixiTMR.init()
let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-tmr.html', tmrData);
if (tmrData.mode != 'visu' && !game.user.isGM) {
ChatMessage.create({ content: actor.name + " est monté dans les TMR en mode : " + tmrData.mode, whisper: ChatMessage.getWhisperRecipients("GM") });
}
return new RdDTMRDialog(html, actor, tmrData);
return new RdDTMRDialog(html, actor, tmrData)
}
/* -------------------------------------------- */
@ -141,7 +141,7 @@ export class RdDTMRDialog extends Dialog {
// Le reste...
this.updateValuesDisplay();
}
async onDeplacement() {
await this.manageRencontre(TMRUtility.getTMR(this._getCoordActor()));
}
@ -162,9 +162,11 @@ export class RdDTMRDialog extends Dialog {
}
async forceTMRDisplay() {
this.bringToTop()
if (this.subdialog?.bringToTop) {
this.subdialog.bringToTop();
if (this.rendered) {
this.bringToTop()
if (this.subdialog?.bringToTop) {
this.subdialog.bringToTop();
}
}
}
@ -247,26 +249,21 @@ export class RdDTMRDialog extends Dialog {
/* -------------------------------------------- */
_getTokensCasesTmr() {
return this.casesSpeciales.map(c => this._tokenCaseSpeciale(c)).filter(token => token);
}
_getTokensRencontres() {
return this.rencontresExistantes.map(it => this._tokenRencontre(it));
}
_getTokensSortsReserve() {
return this.actor.itemTypes[TYPES.sortreserve].map(it => this._tokenSortEnReserve(it));
return Misc.concat(this.casesSpeciales.map(caseSpeciale =>
Draconique.get(caseSpeciale.system.specific)?.token(this.pixiTMR, caseSpeciale, () => caseSpeciale.system.coord)
))
}
/* -------------------------------------------- */
_tokenRencontre(rencontre) {
return EffetsDraconiques.rencontre.token(this.pixiTMR, rencontre, () => rencontre.system.coord);
_getTokensRencontres() {
return Misc.concat(this.rencontresExistantes.map(rencontre =>
EffetsDraconiques.rencontre.tokens(this.pixiTMR, rencontre, () => rencontre.system.coord)
))
}
_tokenCaseSpeciale(casetmr) {
const caseData = casetmr;
const draconique = Draconique.get(caseData.system.specific);
return draconique?.token(this.pixiTMR, caseData, () => caseData.system.coord);
}
_tokenSortEnReserve(sortReserve) {
return EffetsDraconiques.sortReserve.token(this.pixiTMR, sortReserve, () => sortReserve.system.coord);
_getTokensSortsReserve() {
const sortsReserve = this.actor.itemTypes[TYPES.sortreserve];
return Misc.concat(sortsReserve.map(sortReserve =>
EffetsDraconiques.sortReserve.tokens(this.pixiTMR, sortReserve, () => sortReserve.system.coord)))
}
_tokenDemiReve() {
@ -300,13 +297,12 @@ export class RdDTMRDialog extends Dialog {
/* -------------------------------------------- */
async updateValuesDisplay() {
if (!this.rendered) {
if (this.viewOnly || !this.rendered) {
return;
}
const coord = this._getCoordActor();
HtmlUtility.showControlWhen(this.html.find(".lire-signe-draconique"), this.actor.isResonanceSigneDraconique(coord));
let ptsreve = document.getElementById("tmr-pointsreve-value");
ptsreve.innerHTML = this.actor.system.reve.reve.value;
@ -342,7 +338,7 @@ export class RdDTMRDialog extends Dialog {
this._tellToGM(this.actor.name + " a quitté les terres médianes");
}
await this.actor.santeIncDec((ReglesOptionnelles.isUsing("appliquer-fatigue") ? "fatigue" : "endurance"),
this.cumulFatigue)
this.cumulFatigue)
}
await super.close();
this.pixiTMR.close()
@ -581,7 +577,7 @@ export class RdDTMRDialog extends Dialog {
}
this.descenteTMR = false;
this.currentRencontre = undefined;
if (this._presentCite(tmr)) {
if (await this._presentCite(tmr)) {
return;
}
this.currentRencontre = await this._jetDeRencontre(tmr);
@ -592,7 +588,7 @@ export class RdDTMRDialog extends Dialog {
}
else {
const dialog = new RdDTMRRencontreDialog(this.actor, this.currentRencontre, tmr);
dialog.render(true);
await dialog.render(true);
this.setTMRPendingAction(dialog);
}
}
@ -602,11 +598,11 @@ export class RdDTMRDialog extends Dialog {
}
/* -------------------------------------------- */
_presentCite(tmr) {
async _presentCite(tmr) {
const presentCite = this.casesSpeciales.find(c => EffetsDraconiques.presentCites.isCase(c, tmr.coord));
if (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.restoreTMRAfterAction();
});
@ -702,7 +698,6 @@ export class RdDTMRDialog extends Dialog {
}
async _resultatMaitriseCaseHumide(rollData) {
await this.souffleSiEchecTotal(rollData);
if (rollData.rolled.isSuccess && rollData.double) {
rollData.previous = { rolled: rollData.rolled, ajustements: rollData.ajustements };
rollData.double = undefined;
@ -717,6 +712,7 @@ export class RdDTMRDialog extends Dialog {
if (rollData.rolled.isEchec) {
await this.close();
}
await this.souffleSiEchecTotal(rollData);
}
/* -------------------------------------------- */
@ -1126,6 +1122,9 @@ export class RdDTMRDialog extends Dialog {
/* -------------------------------------------- */
_trackToken(token) {
if (!token) {
return
}
if (this.demiReve === token && this.isDemiReveCache()) {
return;
}

View File

@ -90,7 +90,6 @@ export class RdDTokenHud {
if (target?.actor) {
const hudSoins = { blessures: target.actor.blessuresASoigner() ?? [] };
if (hudSoins.blessures.length > 0) {
// soins
const controlIconTarget = html.find('.control-icon[data-action=combat]');
await RdDTokenHud._configureSubMenu(controlIconTarget,
'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 fatigueLineSize = [3, 6, 7, 8, 9, 10, 11, 12];
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"];
@ -208,6 +202,8 @@ export class RdDUtility {
'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/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/periodicite.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-sort.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-diffFixe.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-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-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-item-hautrevant.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-formulesPeriode', () => RdDTimestamp.formulesPeriode());
Handlebars.registerHelper('array-includes', (array, value) => array.includes(value));
Handlebars.registerHelper('min', (...args) => Math.min(...args.slice(0, -1)));
Handlebars.registerHelper('regle-optionnelle', (option) => ReglesOptionnelles.isUsing(option));
Handlebars.registerHelper('trier', list => list.sort((a, b) => a.name.localeCompare(b.name)));

View File

@ -74,6 +74,17 @@ export const referenceAjustements = {
getLabel: (rollData, actor) => 'Sur-encombrement',
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: {
isVisible: (rollData, actor) => actor.isPersonnage() && RdDCarac.isActionPhysique(rollData.selectedCarac) && rollData.use?.moral,
isUsed: (rollData, actor) => rollData.use.moral,
@ -84,18 +95,13 @@ export const referenceAjustements = {
isVisible: (rollData, actor) => actor.isPersonnage() && RdDCarac.isVolonte(rollData.selectedCarac),
isUsed: (rollData, actor) => rollData.use.coeur != undefined,
getLabel: (rollData, actor) => 'Ajustement de c&oelig;ur',
getValue: (rollData, actor) => -2 * (rollData.use?.coeur?.coeur ?? 0)
getValue: (rollData, actor) => -2 * (rollData.use.coeur?.coeur ?? 0)
},
moralTotal: {
isUsed: (rollData, actor) => RdDCarac.isVolonte(rollData.selectedCarac),
getLabel: (rollData, actor) => 'Moral',
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: {
isUsed: (rollData, actor) => rollData.diviseurSignificative > 1,
getLabel: (rollData, actor) => Misc.getFractionHtml(rollData.diviseurSignificative),
@ -193,4 +199,5 @@ export class RollDataAjustements {
RdDCarac.isChance(selectedCarac) ||
(RdDCarac.isReve(selectedCarac) && !rollData.competence);
}
}

View File

@ -1,13 +1,13 @@
import { SYSTEM_RDD } from "../constants.js";
export const STATUSES = {
StatusStunned : 'stun',
StatusStunned: 'stun',
StatusBleeding: 'bleeding',
StatusProne: 'prone',
StatusGrappling: 'grappling',
StatusGrappled: 'grappled',
StatusRestrained: 'restrain',
StatusUnconscious: 'unconscious',
StatusUnconscious: 'unconscious',
StatusBlind: 'blind',
StatusComma: 'comma',
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.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.StatusGrappling, tint: '#33cc33', label: 'EFFECT.StatusGrappling', 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/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/empoignade.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.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 statusDemiSurprise = [STATUSES.StatusStunned, STATUSES.StatusProne, STATUSES.StatusRestrained];
const statusSurpriseTotale = [STATUSES.StatusUnconscious, STATUSES.StatusBlind, STATUSES.StatusComma];
const statusDemiSurprise = new Set([STATUSES.StatusStunned, STATUSES.StatusProne, STATUSES.StatusRestrained])
const statusSurpriseTotale = new Set([STATUSES.StatusUnconscious, STATUSES.StatusBlind, STATUSES.StatusComma])
export class StatusEffects extends FormApplication {
static onReady() {
const rddStatusIds = rddStatusEffects.map(it => it.id);
rddStatusEffects.forEach(it => it.flags = { core: { statusId: it.id } });
const rddEffectIds = rddStatusEffects.map(it => it.id);
rddStatusEffects.forEach(it => {
it.statuses = new Set()
it.statuses.add(it.id)
})
const defaultStatusEffectIds = CONFIG.statusEffects.map(it => it.id);
game.settings.register(SYSTEM_RDD, "use-status-effects", {
name: "use-status-effects",
@ -54,37 +57,47 @@ export class StatusEffects extends FormApplication {
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());
console.log('statusEffects', CONFIG.statusEffects);
}
static valeurSurprise(effect, isCombat) {
// const id = StatusEffects.statusId(effect);
if (statusSurpriseTotale.includes(effect.flags?.core?.statusId)) {
if (statusSurpriseTotale.intersects(effect.statuses)) {
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() {
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) {
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) {
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);
}
static status(statusId) {
return rddStatusEffects.find(it => it.flags?.core?.statusId == statusId);
static prepareActiveEffect(effectId) {
let status = rddStatusEffects.find(it => it.id == effectId)
if (status) {
status = duplicate(status)
status.statuses = [effectId]
}
return status;
}
static demiReve() {

View File

@ -85,7 +85,7 @@ export class AppAstrologie extends Application {
const nbAstral = calendrier.getNombreAstral()
const heures = RdDTimestamp.heures();
return {
ajustementsActors: game.actors.filter(it => it.isPersonnage() && it.hasPlayerOwner)
ajustementsActors:game.actors.filter(actor => actor.isPersonnageJoueur())
.map(actor => this.getAjustementActor(actor, nbAstral, heures)),
nombresAstraux: calendrier.getNombresAstraux().map(na => this.getDetailNombreAstral(na))
}
@ -116,10 +116,10 @@ export class AppAstrologie extends Application {
super.activateListeners(html);
this.html = html;
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.selectHeureNaissance(this.html.find('select[name="signe-naissance"]').val());
this.selectHeureNaissance(event.currentTarget.value);
})
this.html.find('td.nombre-astral').click(event => {
this.selectNombreAstral(Number.parseInt(event.currentTarget.attributes['data-nombre-astral'].value) - 1);

View File

@ -3,10 +3,8 @@ export class DialogChateauDormant extends Dialog {
static async create() {
const date = game.system.rdd.calendrier.dateCourante();
const actors = game.actors.filter(actor => actor.hasPlayerOwner && actor.isPersonnage());
const dialogData = {
actors: actors,
actors: game.actors.filter(actor => actor.isPersonnageJoueur()),
date: date,
motifStress: `Nuit du ${date}`,
finChateauDormant: game.system.rdd.calendrier.getTimestampFinChateauDormant()

View File

@ -21,7 +21,7 @@ export class DialogRepos extends Dialog {
}
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 = {
title: "Se reposer",
content: html,

View File

@ -6,7 +6,7 @@ export class DialogStress extends Dialog {
motif: "Motif",
stress: 10,
immediat: false,
actors: game.actors.filter(actor => actor.hasPlayerOwner && actor.isPersonnage())
actors: game.actors.filter(actor => actor.isPersonnageJoueur())
.map(actor => ({
id: actor.id,
name: actor.name,

View File

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

View File

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

View File

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

View File

@ -1,4 +1,3 @@
import { SYSTEM_RDD } from "../constants.js";
import { Misc } from "../misc.js";
import { TMRConstants, tmrTokenZIndex } from "../tmr-constants.js";
import { TMRUtility } from "../tmr-utility.js";
@ -14,12 +13,12 @@ export class PixiTMR {
static register(name, img) {
PixiTMR.textures[name] = img;
}
static async init() {
await Promise.all(
Object.values(PixiTMR.textures)
.filter(img => img != undefined)
.map(async img => PIXI.Sprite.from(await PIXI.Assets.load(img)))
)
.filter(img => img != undefined && !PIXI.utils.TextureCache[img])
.map(async img => PIXI.Sprite.from(await PIXI.Assets.load(img))))
}
constructor(tmrDialog, displaySize) {
@ -58,7 +57,7 @@ export class PixiTMR {
this.sizes = new TMRConstants({ size: displaySize })
const appSize = PixiTMR.computeTMRSize(this.sizes)
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() {
@ -106,8 +105,9 @@ export class PixiTMR {
sprite(code, options = {}) {
let img = PixiTMR.getImgFromCode(code)
const texture = PIXI.utils.TextureCache[img]
let texture = PIXI.utils.TextureCache[img]
if (!texture) {
// TODO: charger la texture
console.error("Texture manquante", code, PIXI.utils.TextureCache)
return;
}
@ -199,7 +199,7 @@ export class PixiTMR {
setTooltipPosition(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);
}

View File

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

View File

@ -1,5 +1,7 @@
import { tmrTokenZIndex } from "../tmr-constants.js";
import { TMRUtility } from "../tmr-utility.js";
import { Draconique } from "./draconique.js";
import { EffetsDraconiques } from "./effets-draconiques.js";
export class SortReserve extends Draconique {
@ -19,4 +21,19 @@ export class SortReserve extends Draconique {
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,181 @@
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 parameters = {
tableauFatigueMarche: TABLEAU_FATIGUE_MARCHE,
playerActors: game.actors.filter(actor => actor.isPersonnageJoueur())
.map(actor => DialogFatigueVoyage.prepareActor(actor)),
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-tooltip: hsla(60, 12%, 85%, 0.95);
--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");*/
@ -195,11 +196,10 @@ i:is(.fas, .far, .fa-solid, .fa-regular, .fa-sharp ) {
flex: 0 0 110px;
height: 110px;
width: 110px;
margin-right: 0.5rem;
object-fit: scale-down;
object-position: 50% 0;
margin: 0.1rem;
padding: 0.2rem;
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 {
@ -440,7 +440,13 @@ table {border: 1px solid #7a7971;}
.flex-grow-2 {
flex-grow: 2;
}
.voyage-liste-survies {
max-width: 12rem;
}
/* Styles limited to foundryvtt-reve-de-dragon sheets */
.texte-dans-liste {
text-align: left;
}
.equipement-nom {
flex-grow : 4;
margin: 0;
@ -788,6 +794,10 @@ input:is(.blessure-premiers_soins, .blessure-soins_complets) {
.rdd-roll-dialog div.dialog-content input {
font-size: 1rem;
}
.rdd-roll-dialog div.dialog-content input[type="checkbox"]{
width: 1rem;
vertical-align: sub;
}
.rdd-roll-part {
align-items: center;
border-radius: 6px; padding: 3px;
@ -959,12 +969,6 @@ section.sheet-body {
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 {
flex: 3;
}
@ -1170,7 +1174,7 @@ ul.chat-list li:nth-child(odd) {
border-radius: 0.25rem;
padding: 0.1rem;
flex: 1 1 1.5rem;
display: flex !important;
display: flex;
align-items: center !important;
}
@ -1311,10 +1315,7 @@ div.competence-column div.categorie-competence{
margin-right: 0.2rem;
margin-left: 0.2rem;
}
.blessures-title {
font-weight: bold;
}
.alchimie-title {
.item-label {
font-weight: bold;
}
.pointsreve-value {
@ -1363,43 +1364,37 @@ table.table-nombres-astraux tr:hover {
justify-content: flex-start;
flex-direction: column;
position: absolute;
top: 2.75rem;
right: 4rem;
top: 4.6rem;
right: 3.5rem;
}
.token-hud-ext.soins {
justify-content: flex-start;
flex-direction: column;
position: absolute;
top: 13.2rem;
left: -5rem;
max-width: 8.5rem
top: 14.7rem;
left: -6rem;
max-width: 8rem;
line-height: 1rem;
}
.token-hud-ext.right {
justify-content: flex-start;
flex-direction: column;
position: absolute;
top: 2.75rem;
left: 4rem;
top: 4.6rem;
left: 3.5rem;
}
.control-icon.token-hud-icon {
width: fit-content;
div.control-icon.token-hud-icon {
width: 9rem;
height: fit-content;
border-radius: 0.3rem;
min-width: 6rem;
flex-basis: auto;
padding: 0;
line-height: 1rem;
line-height: 0.95rem;
margin: 0.2rem;
}
.control-icon.token-hud-icon.right {
margin-left: 8px;
}
.rdd-hud-menu label {
font-size: 0.8rem;
}
#token-hud .status-effects.active{
z-index: 2;
}
/* ======================================== */
.item-checkbox {
height: 25px;
@ -1941,6 +1936,14 @@ div.calendar-timestamp-edit select.calendar-signe-heure {
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) {
width: 250px;
background: var(--background-tooltip) !important;

View File

@ -1,8 +1,8 @@
{
"id": "foundryvtt-reve-de-dragon",
"title": "Rêve de Dragon",
"version": "11.2.8",
"download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-11.2.8.zip",
"version": "11.2.17",
"download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-11.2.17.zip",
"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",
"compatibility": {

View File

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

View File

@ -70,9 +70,13 @@
{{#if options.vueDetaillee}}
&nbsp;&nbsp;
{{#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}}
<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}}
</span>

View File

@ -12,19 +12,19 @@
<ul>
<li data-attribute="resistance" class="flexrow">
<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.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 data-attribute="structure" class="flexrow">
<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.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>
</ul>
</div>

View File

@ -4,8 +4,8 @@
{{#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>
<div class="item-controls flex-shrink">
<a class="item-edit" data-tooltip="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
<a class="item-edit" data-tooltip="Modifier"><i class="fas fa-edit"></i></a>
<a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}

View File

@ -2,7 +2,8 @@
<ul class="item-list">
{{#if @root.options.isGM}}
<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>
{{/if}}
<li><hr></li>

View File

@ -1,2 +1,7 @@
<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,8 +1,14 @@
<h4>blessures</h4>
<h4>Blessures</h4>
<div>
<a class="chat-card-button creer-blessure-legere" data-tooltip="Ajouter une blessure légère"><i class="fas fa-plus-circle"></i> légère</a>
<a class="chat-card-button creer-blessure-grave" data-tooltip="Ajouter une blessure grave"><i class="fas fa-plus-circle"></i> grave</a>
<a class="chat-card-button creer-blessure-critique" data-tooltip="Ajouter une blessure critque"><i class="fas fa-plus-circle"></i> critique</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" data-tooltip="Ajouter une grave"><i class="fas fa-plus-circle"></i> grave</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>
<ul class="item-list alterne-list">

View File

@ -13,8 +13,8 @@
<span class="competence-title tache-label"><a>{{tache.name}}
({{tache.system.points_de_tache_courant}}/{{tache.system.points_de_tache}})</a></span>
<div class="item-controls flex-shrink">
<a class="item-edit" data-tooltip="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
<a class="item-edit" data-tooltip="Modifier"><i class="fas fa-edit"></i></a>
<a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/if}}

View File

@ -64,8 +64,8 @@
</span>
<span class="competence-value">{{emp.system.pointsemp}}</span>
<div class="item-controls">
<a class="item-edit" data-tooltip="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
<a class="item-edit" data-tooltip="Modifier"><i class="fas fa-edit"></i></a>
<a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}

View File

@ -17,13 +17,13 @@
<span class="equipement-detail-buttons flexrow">
{{#unless (or (eq item.type 'service') (and (eq item.type 'conteneur') (not vide)))}}
{{#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}}
<input {{#unless options.isOwner}}disabled{{/unless}} type="number" data-dtype="Number"
class="item-quantite number-x3" name="items[{{item._id}}].system.quantite"
value="{{item.system.quantite}}" />
{{#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}}
{{/unless}}
</span>

View File

@ -23,8 +23,8 @@
/>
{{#if @root.options.vueDetaillee}}
<div class="item-controls">
<a class="item-edit" data-tooltip="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
<a class="item-edit" data-tooltip="Modifier"><i class="fas fa-edit"></i></a>
<a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</div>
{{/if}}
</li>

View File

@ -6,8 +6,8 @@
<img class="sheet-competence-img" src="{{possession.img}}" data-tooltip="{{possession.name}}"/>
<span class="competence-label">{{possession.name}}</span>
<div class="item-controls">
<a class="item-edit" data-tooltip="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
<a class="item-edit" data-tooltip="Modifier"><i class="fas fa-edit"></i></a>
<a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}

View File

@ -8,7 +8,7 @@
<a>{{queue.name}}</a>
</span>
<div class="item-controls">
<a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
<a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
{{#if queue.system.refoulement}}
<a class="item-action">Refouler</a>
{{/if}}

View File

@ -6,7 +6,7 @@
<img class="sheet-competence-img" src="{{souffle.img}}"/>
<span class="item-edit flex-grow"><a>{{souffle.name}}</a></span>
<div class="item-controls flex-shrink">
<a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
<a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}

View File

@ -6,7 +6,7 @@
<img class="sheet-competence-img" src="{{tete.img}}"/>
<span class="item-edit flex-grow"><a>{{tete.name}}</a></span>
<div class="item-controls flex-shrink">
<a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
<a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}

View File

@ -3,23 +3,23 @@
<li data-attribute="vie">
<label class="compteur">
<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" />
/ {{#if @root.options.vueDetaillee}}
<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}}
<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>
</li>
<li data-attribute="endurance">
<label class="compteur">
<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"/>
/ {{#if @root.options.vueDetaillee}}
<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}}
<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>
</li>
</ul>

View File

@ -4,12 +4,12 @@
<li data-attribute="endurance">
<label class="compteur">
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" />
/ {{#if @root.options.vueDetaillee}}
<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}}
<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>
</li>
</ul>

View File

@ -3,38 +3,38 @@
<li>
<label class="compteur">
<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"/>
<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>
</li>
<li>
<label class="compteur">
<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"/>
<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>
</li>
<li>
<label class="appliquerFatigue compteur tooltip">
<span class="tooltiptext ttt-fatigue">{{{calc.fatigue.html}}}</span>
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" />
<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>
</li>
<li>
<label class="compteur">
<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" />
<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>
</li>
</ul>

View File

@ -1,7 +1,7 @@
<div>
{{#if effects}}
{{#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}}" data-tooltip="{{localize effect.name}}" width="24" height="24" />
</span>
{{/each}}

View File

@ -22,7 +22,7 @@
</span>
<span class="equipement-detail">
{{#if (gt item.system.quantite 1)}}
<a class="item-quantite-moins" data-tooltip="Diminuer la quantité de {{item.name}}"><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}}
{{item.system.quantite}}
{{#if (gt item.system.quantite 1)}}

View File

@ -10,7 +10,7 @@
</span>
{{#if @root.options.isOwner}}
<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>
{{/if}}
<span class="equipement-detail">
@ -18,7 +18,7 @@
</span>
{{#if @root.options.isOwner}}
<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>
{{/if}}
<span class="equipement-actions item-controls">

View File

@ -5,8 +5,8 @@
<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">
<a class="item-edit" data-tooltip="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
<a class="item-edit" data-tooltip="Modifier"><i class="fas fa-edit"></i></a>
<a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}

View File

@ -1,5 +1,5 @@
{{#if maladiesPoisons.length}}
<h3 class="blessures-title">Maladies & Poisons:</h3>
<h3 class="item-label">Maladies & Poisons:</h3>
<ul class="item-list alterne-list">
<li class="competence-header flexrow">
<span class="competence-title flex-grow competence-label">Nom</span>

View File

@ -12,13 +12,21 @@
<li class="item flexrow" >
<span class="competence-label">Refoulement : </span>
<span>
{{#if options.isGM}}
{{#if options.isGM}}
<input class="competence-value" type="text" name="system.reve.refoulement.value" value="{{system.reve.refoulement.value}}" data-dtype="Number"/>
{{else}}
{{else}}
{{system.reve.refoulement.value}}
{{/if}}
{{/if}}
</span>
</li>
{{#if system.reve.reve.thanatosused}}
<li class="item flexrow" >
<span class="competence-label">La prochaine queue est une Ombre</span>
<span>
<img class="sheet-competence-img" src="systems/foundryvtt-reve-de-dragon/icons/competence_thanatos.webp"/>
</span>
</li>
{{/if}}
</ul>
<hr>
{{> "systems/foundryvtt-reve-de-dragon/templates/actor/dragon-queues.html"}}

View File

@ -5,8 +5,8 @@
<a>{{oeuvre.name}} (niveau {{oeuvre.system.niveau}})</a>
</span>
<div class="item-controls">
<a class="item-edit" data-tooltip="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
<a class="item-edit" data-tooltip="Modifier"><i class="fas fa-edit"></i></a>
<a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</div>
</li>

View File

@ -1,6 +1,6 @@
{{#if possessions.length}}
{{!-- Possession --}}
<h3 class="blessures-title">Possession:</h3>
<h3 class="item-label">Possession:</h3>
<ul class="item-list alterne-list">
<li class="competence-header flexrow">
<span class="competence-title flex-grow competence-label">Nom</span>

View File

@ -9,8 +9,8 @@
(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">
<a class="item-edit" data-tooltip="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-delete" data-tooltip="Delete Item"><i class="fas fa-trash"></i></a>
<a class="item-edit" data-tooltip="Modifier"><i class="fas fa-edit"></i></a>
<a class="item-delete" data-tooltip="Supprimer"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/unless}}

View File

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

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>
<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>

View File

@ -5,6 +5,11 @@
<div>
<img class="chat-icon" src="{{document.img}}" data-tooltip="{{document.name}}" />
<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}}
<div class="poesie-extrait">
{{{document.system.description}}}

View File

@ -1,4 +1,3 @@
{{log 'C&oelig;ur' numero courant prochain}}
<a data-numero-coeur="{{numero}}">
{{#if (and (lte numero courant) (lte numero prochain))}}
<i class="fa-solid fa-heart"></i>

View File

@ -0,0 +1,43 @@
<form class="rdd-dialog-select">
<div>
<img class="chat-icon" src="{{actor.img}}" data-tooltip="{{actor.name}}" />
<label>Répartir l'expérience en {{caracDerivee.label}}</label>
</div>
<hr>
<span>
<label>Points à répartir:</label>
<input class="xpCarac-reste number-x2"
type="number" data-dtype="Number"
min="0" max="10" value="{{xpData.reste}}" disabled />
<label> sur {{xpData.xpCarac}}</label>
</span>
<ul class="flexcol item-list alterne-list">
<li class="competence-header flexrow">
<label class="flex-grow-2">Caractéristique</label>
<label>valeur</label>
<label>xp</label>
<span>ajout</span>
</li>
{{log 'choix-xp' @root}}
{{#each caracs as |carac key|}}
<li class="xpCarac-option item list-item flexrow" data-carac-label="{{carac.label}}">
<label class="flex-grow-2">{{carac.label}}</label>
<label>{{carac.value}}</label>
{{#if carac.isMax}}
<label>max</label>
<span class="flexrow">
</span>
{{else}}
<label>{{carac.xp}}</label>
<span class="flexrow">
<a class="xpCarac-moins"><i class="fa-solid fa-square-minus"></i></a>
<input class="xpCarac-view-ajout" value="{{carac.ajout}}" type="number" max="99" disabled/>
<a class="xpCarac-plus"><i class="fa-solid fa-square-plus"></i></a>
</span>
{{/if}}
</li>
{{/each}}
</ul>
</form>

View File

@ -40,8 +40,8 @@
</div>
<div class="form-group">
<label class="flex-shrink" for="information">Information
<a class="chronologie-preset-show"><i class="fas fa-plus-square"></i></a>
<a class="chronologie-preset-hide"><i class="fas fa-minus-square"></i></a>
<a class="chronologie-preset-show"><i class="fa-solid fa-square-plus"></i></a>
<a class="chronologie-preset-hide"><i class="fa-solid fa-square-minus"></i></a>
</label>
<textarea autocomplete="off" data-tooltip="Information" name="information" autofocus>{{information}}</textarea>
</div>

View File

@ -6,9 +6,10 @@
<div class="flexrow">
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-roll-competences.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-surenc.html"}}
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-roll-enctotal.html"}}
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-roll-coeur.hbs"}}
</div>
<div class="flex-group-left">
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-roll-diffLibre.html"}}

View File

@ -8,9 +8,10 @@
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-select-carac.html"}}
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-roll-competences.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-surenc.html"}}
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-roll-enctotal.html"}}
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-roll-coeur.hbs"}}
</div>
<div class="flex-group-left">
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-roll-diffLibre.html"}}

View File

@ -21,49 +21,48 @@
</div>
{{else}}
{{#if (and isGM hasPlayerOwner)}}
<div class="flex-group-center flex-shrink">
<h4>Le gardien gére les TMR du joueur, le joueur ne peut pas monter dans les TMR!</h4>
</div>
<div class="flex-group-center flex-shrink">
<h4>Le gardien gére les TMR du joueur, le joueur ne peut pas monter dans les TMR!</h4>
</div>
{{/if}}
<div class="flex-group-center flex-shrink">
<img class="small-button-direction tmr-move" data-move="topleft" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/dir-topleft.svg">
<img class="small-button-direction tmr-move" data-move="top" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/dir-top.svg">
<img class="small-button-direction tmr-move" data-move="topright" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/dir-topright.svg">
</div>
<div class="flex-group-center flex-shrink">
<label>Coordonnées : </label><span id="tmr-pos">0</span>
</div>
<div class="flex-group-center flex-shrink">
<img class="small-button-direction tmr-move" data-move="bottomleft" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/dir-bottomleft.svg">
<img class="small-button-direction tmr-move" data-move="bottom" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/dir-bottom.svg">
<img class="small-button-direction tmr-move" data-move="bottomright" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/dir-bottomright.svg">
</div>
<div class="flex-group-center flex-shrink lire-signe-draconique">
<a>Lire un signe draconique</a>
</div>
<div class="flex-group-center flex-shrink lancer-sort">
<a>Lancer un Sort</a>
</div>
<hr>
<div class="flex-group-center flex-shrink">
<label>Carac. Rêve : </label><label>{{caracReve}}</label>
</div>
<div class="flex-group-center flex-shrink">
<label>Rêve actuel : </label><span id="tmr-pointsreve-value">0</span>
</div>
<div class="flex-group-center flex-shrink">
<label>Etat général : </label><span id="tmr-etatgeneral-value">0</span>
</div>
<div class="flex-group-center flex-shrink">
<label>Refoulement : </label><span id="tmr-refoulement-value">0</span>
</div>
<div class="flex-group-center flex-actions-bar appliquerFatigue">
Fatigue
<span id="tmr-fatigue-table">{{{fatigue.html}}}</span>
</div>
<div class="flex-group-center flex-shrink">
<img class="small-button-direction tmr-move" data-move="topleft" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/dir-topleft.svg">
<img class="small-button-direction tmr-move" data-move="top" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/dir-top.svg">
<img class="small-button-direction tmr-move" data-move="topright" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/dir-topright.svg">
</div>
<div class="flex-group-center flex-shrink">
<label>Coordonnées : </label><span id="tmr-pos">0</span>
</div>
<div class="flex-group-center flex-shrink">
<img class="small-button-direction tmr-move" data-move="bottomleft" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/dir-bottomleft.svg">
<img class="small-button-direction tmr-move" data-move="bottom" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/dir-bottom.svg">
<img class="small-button-direction tmr-move" data-move="bottomright" src="systems/foundryvtt-reve-de-dragon/styles/img/ui/dir-bottomright.svg">
</div>
<div class="flex-group-center flex-shrink lire-signe-draconique">
<a>Lire un signe draconique</a>
</div>
<div class="flex-group-center flex-shrink lancer-sort">
<a>Lancer un Sort</a>
</div>
<hr>
<div class="flex-group-center flex-shrink">
<label>Carac. Rêve : </label><label>{{caracReve}}</label>
</div>
<div class="flex-group-center flex-shrink">
<label>Rêve actuel : </label><span id="tmr-pointsreve-value">0</span>
</div>
<div class="flex-group-center flex-shrink">
<label>Etat général : </label><span id="tmr-etatgeneral-value">0</span>
</div>
<div class="flex-group-center flex-shrink">
<label>Refoulement : </label><span id="tmr-refoulement-value">0</span>
</div>
<div class="flex-group-center flex-actions-bar appliquerFatigue">
Fatigue
<span id="tmr-fatigue-table">{{{fatigue.html}}}</span>
</div>
{{/if}}
<div class="flex-group-center flex-grow">
</div>
<div class="flex-group-center flex-grow"></div>
</div>
</div>
</form>

View File

@ -6,8 +6,8 @@
<div class="control-icon token-hud-icon rdd-hud-menu rdd-attaque"
data-combatant-id="{{../combatant.id}}"
data-action-index="{{action.index}}"
data-tooltip="{{action.name}}">
<label>{{action.name}} {{action.system.infoMain}}</label>
data-tooltip="Attaque: {{action.name}}">
<label><i class="fa-solid fa-sword"></i> {{action.name}} {{action.system.infoMain}}</label>
</div>
{{/unless}}
{{/each}}

View File

@ -5,8 +5,8 @@
<div class="control-icon token-hud-icon rdd-hud-menu"
data-combatant-id="{{../combatant.id}}"
data-action-index="{{action.index}}"
data-tooltip="{{action.name}}">
<label>init: {{action.name}} {{action.system.infoMain}}</label>
data-tooltip="Initiative {{action.name}}">
<label><i class="fa-solid fa-dice-d6"></i><span> {{action.name}} {{action.system.infoMain}}</span></label>
</div>
{{/each}}
{{#each commandes as |commande key|}}

View File

@ -4,8 +4,14 @@
{{#each blessures as |blessure|}}
<div class="control-icon token-hud-icon rdd-hud-menu"
data-blessure-id="{{blessure.id}}"
data-tooltip="{{blessure.name}}">
<label>Soigner: {{blessure.name}}</label>
data-tooltip="Jet de {{#if system.premierssoins.done}}Soins complets{{else}}Premiers soins{{/if}} sur blessure {{blessure.name}}">
<label>
{{#if system.premierssoins.done}}
<i class="fa-solid fa-user-nurse"></i> Soins complets blessure {{blessure.name}}
{{else}}
<i class="fa-solid fa-bandage"></i> Premiers soins blessure {{blessure.name}}
{{/if}}
</label>
</div>
{{/each}}
</div>

View File

@ -8,7 +8,7 @@
<div class="tab items flexcol" data-group="primary" data-tab="informations">
<div class="form-group">
<label for="system.competence">Compétence de mêlée</label>
<select name="system.competence" id="competence" data-dtype="String">
<select name="system.competence" data-dtype="String">
{{#select system.competence}}
<option value="">- impossible -</option>
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-competence.html" categorie='melee'}}
@ -26,7 +26,7 @@
</div>
<div class="form-group">
<label for="system.tir">Compétence de tir</label>
<select name="system.tir" id="tir" data-dtype="String">
<select name="system.tir" data-dtype="String">
{{#select system.tir}}
<option value="">- impossible -</option>
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-competence.html" categorie='tir'}}
@ -52,7 +52,7 @@
</div>
<div class="form-group">
<label for="system.categorie_parade">Catégorie parade </label>
<select name="system.categorie_parade" id="categorie_parade" data-dtype="String">
<select name="system.categorie_parade" data-dtype="String">
{{#select system.categorie_parade}}
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-parade.html"}}
{{/select}}
@ -104,7 +104,7 @@
</div>
<div class="form-group">
<label for="system.initpremierround">Classe d'initiative au premier round (mêlée seulement) </label>
<select name="system.initpremierround" id="initpremierround" data-dtype="String">
<select name="system.initpremierround" data-dtype="String">
{{#select system.initpremierround}}
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-initpremierround.html"}}
{{/select}}

View File

@ -7,8 +7,8 @@
<input class="attribute-value" type="text" name="system.coord" value="{{system.coord}}" data-dtype="String"/>
</div>
<div class="form-group">
<label for="niveau">Mode spécifique</label>
<select name="system.specific" id="specific" data-dtype="String">
<label for="system.specific">Mode spécifique</label>
<select name="system.specific" data-dtype="String">
{{#select system.specific}}
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-tmr-effet.html"}}
{{/select}}

View File

@ -3,11 +3,11 @@
{{!-- Sheet Body --}}
<section class="sheet-body">
<div class="form-group">
<label class="alchimie-title" for="xp">Niveau</label>
<label class="item-label" for="system.niveau">Niveau</label>
<input class="attribute-value" type="text" name="system.niveau" value="{{system.niveau}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label>Référence / Auteur</label>
<label for="system.reference">Référence / Auteur</label>
<input class="attribute-value" type="text" name="system.reference" value="{{system.reference}}" data-dtype="String"/>
</div>

View File

@ -38,8 +38,8 @@
{{/if}}
{{#if isparade}}
<div class="form-group">
<label>Catégorie parade</label>
<select name="system.categorie_parade" id="categorie_parade" data-dtype="String">
<label for="system.categorie_parade">Catégorie parade</label>
<select name="system.categorie_parade" data-dtype="String">
{{#select system.categorie_parade}}
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-categorie-parade.html"}}
{{/select}}

View File

@ -9,7 +9,7 @@
<section class="sheet-body">
<div class="tab items flexcol" data-group="primary" data-tab="informations">
<div class="form-group">
<label for="xp">Capacite (points d'Enc.)</label>
<label for="system.capacite">Capacite (points d'Enc.)</label>
<input class="attribute-value" type="text" name="system.capacite" value="{{system.capacite}}" data-dtype="Number"/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/item/partial-inventaire.html"}}

View File

@ -3,7 +3,7 @@
{{!-- Sheet Body --}}
<section class="sheet-body">
<div class="form-group">
<label class="alchimie-title" for="xp">Type</label>
<label class="item-label" for="system.type">Type</label>
<select name="system.type" data-dtype="String">
{{#select system.type}}
<option value="recreative">Récréative</option>
@ -12,19 +12,19 @@
</select>
</div>
<div class="form-group">
<label class="alchimie-title" for="xp">Agilité ?</label>
<label class="item-label" for="system.agilite">Agilité ?</label>
<input class="attribute-value" type="checkbox" name="system.agilite" {{#if system.agilite}}checked{{/if}}/>
</div>
<div class="form-group">
<label class="alchimie-title" for="xp">Apparence ?</label>
<label class="item-label" for="system.apparence">Apparence ?</label>
<input class="attribute-value" type="checkbox" name="system.apparence" {{#if system.apparence}}checked{{/if}}/>
</div>
<div class="form-group">
<label class="alchimie-title" for="xp">Niveau</label>
<label class="item-label" for="system.niveau">Niveau</label>
<input class="attribute-value" type="text" name="system.niveau" value="{{system.niveau}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label>Référence / Auteur</label>
<label for="system.reference">Référence / Auteur</label>
<input class="attribute-value" type="text" name="system.reference" value="{{system.reference}}" data-dtype="String"/>
</div>

View File

@ -3,7 +3,7 @@
{{!-- Sheet Body --}}
<section class="sheet-body">
<div class="form-group">
<label for="xp">Points d'Empoignade </label>
<label for="system.pointsemp">Points d'Empoignade </label>
<input class="attribute-value" type="text" name="system.pointsemp" value="{{system.pointsemp}}" data-dtype="Number"/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}

View File

@ -7,8 +7,8 @@
<section class="sheet-body">
<div class="tab items flexcol" data-group="primary" data-tab="informations">
<div class="form-group">
<label>Type</label>
<select name="system.type" id="type" data-dtype="String">
<label for="system.type">Type</label>
<select name="system.type" data-dtype="String">
{{#select system.type}}
{{{gemmeTypeList}}}
{{/select}}

View File

@ -4,26 +4,26 @@
{{!-- Sheet Body --}}
<section class="sheet-body">
<div class="form-group">
<label class="alchimie-title" for="xp">Type</label>
<label class="item-label" for="system.type">Type</label>
<select name="system.type" data-dtype="String">
{{#select system.type}}
<option value="adressehasard">Adresse/Hasard</option>
<option value="de">Dés</option>
<option value="carte">Cartes</option>
<option value="reflexion">Reflexion</option>
{{/select}}
{{/select}}
</select>
</div>
<div class="form-group">
<label class="alchimie-title" for="xp">Base</label>
<label class="item-label" for="system.base">Base</label>
<input class="attribute-value" type="text" name="system.base" value="{{system.base}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label class="alchimie-title" for="xp">Caractéristique/Compétence</label>
<label class="item-label" for="system.caraccomp">Caractéristique/Compétence</label>
<input class="attribute-value" type="text" name="system.caraccomp" value="{{system.caraccomp}}" data-dtype="String"/>
</div>
<div class="form-group">
<label>Référence / Auteur</label>
<label for="system.reference">Référence / Auteur</label>
<input class="attribute-value" type="text" name="system.reference" value="{{system.reference}}" data-dtype="String"/>
</div>

View File

@ -5,9 +5,9 @@
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1>
{{#if options.isOwned}}
<div class="form-group">
<span for="xp"><a class="creer-tache-livre chat-card-button" data-actor-id="{{actorId}}">Créer une tâche de lecture</a></span>
<span><a class="creer-tache-livre chat-card-button" data-actor-id="{{actorId}}">Créer une tâche de lecture</a></span>
</div>
{{/if}}
{{/if}}
</div>
</header>
<nav class="sheet-tabs tabs" data-group="primary">
@ -18,35 +18,35 @@
<div class="tab items flexcol" data-group="primary" data-tab="informations">
<div class="form-group">
<label for="xp">Auteur</label>
<label for="system.auteur">Auteur</label>
<input class="attribute-value" type="text" name="system.auteur" value="{{system.auteur}}" data-dtype="String"/>
</div>
<div class="form-group">
<label for="xp">Compétence</label>
<select name="system.competence" id="competenceselect" data-dtype="String">
<label for="system.competence">Compétence</label>
<select name="system.competence" data-dtype="String">
{{#select system.competence}}
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-competence.html"}}
{{/select}}
</select>
</div>
<div class="form-group">
<label for="xp">Difficulté</label>
<label for="system.difficulte">Difficulté</label>
<input class="attribute-value" type="number" name="system.difficulte" value="{{system.difficulte}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="xp">Points de tâches</label>
<label for="system.points_de_tache">Points de tâches</label>
<input class="attribute-value" type="number" name="system.points_de_tache" value="{{system.points_de_tache}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="xp">Expérience</label>
<label for="system.xp">Expérience</label>
<input class="attribute-value" type="number" name="system.xp" value="{{system.xp}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="xp">Niveau minimum</label>
<label for="system.niveau_minimum">Niveau minimum</label>
<input class="attribute-value" type="text" name="system.niveau_minimum" value="{{system.niveau_minimum}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="xp">Niveau maximum</label>
<label for="system.niveau_maximum">Niveau maximum</label>
<input class="attribute-value" type="text" name="system.niveau_maximum" value="{{system.niveau_maximum}}" data-dtype="Number"/>
</div>

View File

@ -3,53 +3,53 @@
{{!-- Sheet Body --}}
<section class="sheet-body">
<div class="form-group">
<label for="xp">Compétence</label>
<select name="system.competence" id="competenceselect" data-dtype="String">
<label for="system.competence">Compétence</label>
<select name="system.competence" data-dtype="String">
{{#select system.competence}}
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-competence.html"}}
{{/select}}
</select>
</div>
<div class="form-group">
<label for="xp">Thème</label>
<label for="system.theme">Thème</label>
<input class="attribute-value" type="text" name="system.theme" value="{{system.theme}}" data-dtype="String"/>
</div>
<div class="form-group">
<label for="xp">Support</label>
<label for="system.support">Support</label>
<input class="attribute-value" type="text" name="system.support" value="{{system.support}}" data-dtype="String"/>
</div>
<div class="form-group">
<label for="xp">Heure</label>
<select name="system.heure" id="heure" data-dtype="String">
<label for="system.heure">Heure</label>
<select name="system.heure" data-dtype="String">
{{#select system.heure}}
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-heures.html"}}
{{/select}}
</select>
</div>
<div class="form-group">
<label for="xp">Purification</label>
<label for="system.purification">Purification</label>
<input class="attribute-value" type="text" name="system.purification" value="{{system.purification}}" data-dtype="String"/>
</div>
<div class="form-group">
<label for="xp">Vêture</label>
<label for="system.veture">Vêture</label>
<input class="attribute-value" type="text" name="system.veture" value="{{system.veture}}" data-dtype="String"/>
</div>
<div class="form-group">
<label for="xp">Comportement</label>
<label for="system.comportement">Comportement</label>
<input class="attribute-value" type="text" name="system.comportement" value="{{system.comportement}}" data-dtype="String"/>
</div>
<div class="form-group">
<label for="xp">Case TMR</label>
<select name="system.tmr" id="tmr" data-dtype="String">
<label for="system.tmr">Case TMR</label>
<select name="system.tmr" data-dtype="String">
{{#select system.tmr}}
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-tmr-type.html"}}
{{/select}}
</select>
</div>
<div class="form-group">
<label for="xp">Malus</label>
<label for="system.malus">Malus</label>
{{#if options.isGM}}
<select name="system.malus" id="malus" data-dtype="Number">
<select name="system.malus" data-dtype="Number">
{{#select system.malus}}
<option value="0">0</option>
<option value="-1">-1</option>

View File

@ -3,14 +3,13 @@
{{!-- Sheet Body --}}
<section class="sheet-body">
<div class="form-group">
<label class="alchimie-title" for="xp">Niveau</label>
<label class="item-label" for="system.niveau">Niveau</label>
<input class="attribute-value" type="text" name="system.niveau" value="{{system.niveau}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label>Référence / Auteur</label>
<label for="system.reference">Référence / Auteur</label>
<input class="attribute-value" type="text" name="system.reference" value="{{system.reference}}" data-dtype="String"/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}
</section>
</form>

View File

@ -3,21 +3,20 @@
{{!-- Sheet Body --}}
<section class="sheet-body">
<div class="form-group">
<label for="xp">Nombre</label>
<label for="system.value">Nombre</label>
<input class="attribute-value" type="text" name="system.value" value="{{system.value}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="xp">Nombre valide ? </label>
<label for="system.istrue">Nombre valide ? </label>
<input class="attribute-value" type="checkbox" name="system.istrue" {{#if system.istrue}}checked{{/if}}/>
</div>
<div class="form-group">
<label for="xp">Index du jour concerné</label>
<label for="system.jourindex">Index du jour concerné</label>
<input class="attribute-value" type="text" name="system.jourindex" value="{{system.jourindex}}" data-dtype="Number"/>
</div>
<div class="form-group">
<label for="xp">Label du jour</label>
<label for="system.jourlabel">Label du jour</label>
<input class="attribute-value" type="text" name="system.jourlabel" value="{{system.jourlabel}}" data-dtype="String"/>
</div>
</section>
</form>

View File

@ -9,27 +9,27 @@
{{!-- Sheet Body --}}
<section class="sheet-body">
<div class="form-group">
<label>Caractéristique</label>
<select name="system.default_carac" id="default_carac" data-dtype="String">
<label for="system.default_carac">Caractéristique</label>
<select name="system.default_carac" data-dtype="String">
{{#select system.default_carac}}
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-caracteristiques.html"}}
{{/select}}
</select>
</div>
<div class="form-group">
<label>Compétence</label>
<select name="system.competence" id="competenceselect" data-dtype="String">
<label for="system.competence">Compétence</label>
<select name="system.competence" data-dtype="String">
{{#select system.competence}}
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-competence.html"}}
{{/select}}
</select>
</div>
<div class="form-group">
<label>Référence / Auteur</label>
<label for="system.reference">Référence / Auteur</label>
<input class="attribute-value" type="text" name="system.reference" value="{{system.reference}}" data-dtype="String"/>
</div>
<div class="form-group">
<label>Niveau</label>
<label for="system.niveau">Niveau</label>
<input class="attribute-value" type="text" name="system.niveau" value="{{system.niveau}}" data-dtype="Number"/>
</div>

View File

@ -3,15 +3,15 @@
{{!-- Sheet Body --}}
<section class="sheet-body">
<div class="form-group">
<label for="xp">Type de possession </label>
<label for="system.typepossession">Type de possession</label>
<input class="attribute-value" type="text" name="system.typepossession" value="{{system.typepossession}}" data-dtype="String"/>
</div>
<div class="form-group">
<label for="xp">Possédé ? </label>
<label for="system.istrue">Possédé ?</label>
<input class="attribute-value" type="checkbox" name="system.istrue" {{#if system.istrue}}checked{{/if}}/>
</div>
<div class="form-group">
<label for="xp">Compteur </label>
<label for="system.compteur">Compteur</label>
<input class="attribute-value" type="text" name="system.compteur" value="{{system.compteur}}" data-dtype="Number"/>
</div>
{{>"systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html"}}

View File

@ -5,7 +5,7 @@
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1>
{{#if options.isOwned}}
<div class="form-group">
<span for="xp"><a class="consommer-potion chat-card-button" data-actor-id="{{actorId}}">Consommer cette potion et appliquer ses effets</a></span>
<span><a class="consommer-potion chat-card-button" data-actor-id="{{actorId}}">Consommer cette potion et appliquer ses effets</a></span>
</div>
{{/if}}
</div>
@ -57,7 +57,7 @@
{{#if isRepos}}
<div class="form-group">
<label for="system.reposalchimique">Repos Alchimique ?</label>
<input class="attribute-value" type="checkbox" name="system.reposalchimique" {{#if system.reposalchimique}}checked{{/if}}/>
<input class="attribute-value" type="checkbox" name="system.reposalchimique" {{#if system.reposalchimique}}checked{{/if}}/>
</div>
{{/if}}
{{/if}}
@ -66,19 +66,22 @@
<label for="system.pr">Points de rêve</label>
<input class="attribute-value" type="text" name="system.pr" value="{{system.pr}}" data-dtype="Number" />
</div>
{{#if isSoins}}
<div class="form-group">
<label>Points de guérison</label>
<input class="attribute-value" type="text" name="system.puissance" value="{{system.puissance}}" disabled />
</div>
{{/if}}
{{#if isRepos}}
<div class="form-group">
<label>Points de repos</label>
<input class="attribute-value" type="text" name="system.puissance" value="{{system.puissance}}" disabled />
</div>
{{/if}}
<div class="form-group">
<label for="system.prpermanent">Permanente ? </label>
<input class="attribute-value" type="checkbox" name="system.prpermanent" {{#if system.prpermanent}}checked{{/if}}/>
</div>
{{#if (or isSoins isRepos)}}
<div class="form-group">
<label>Points de
{{#if isSoins}}guérison{{/if}}
{{#if isRepos}}repos{{/if}}
</label>
<label>{{system.puissance}}</label>
</div>
{{/if}}
<div class="form-group">
<label for="enchantement.jour">Date de l'Enchantement : Jour/Mois (date actuelle : {{dateActuelle}})</label>
</div>

View File

@ -3,29 +3,29 @@
{{!-- Sheet Body --}}
<section class="sheet-body">
<div class="form-group">
<label class="alchimie-title" for="xp">But</label>
<label class="item-label" for="system.but">But</label>
<input class="attribute-value" type="text" name="system.but" value="{{system.but}}" data-dtype="String"/>
</div>
<div class="flexcol">
<span><label class="alchimie-title">Manipulation : </label></span>
<span><label class="item-label">Manipulation : </label></span>
<div class="form-group medium-editor">
{{editor manipulation_update target="system.manipulation" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
</div>
</div>
<div class="flexcol">
<span><label class="alchimie-title">Utilisation : </label></span>
<span><label class="item-label">Utilisation : </label></span>
<div class="form-group small-editor">
{{editor utilisation target="system.utilisation" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
</div>
</div>
<div class="flexcol">
<span><label class="alchimie-title">Enchantement : </label></span>
<span><label class="item-label">Enchantement : </label></span>
<div class="form-group small-editor">
{{editor enchantement target="system.enchantement" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
</div>
</div>
<div class="flexcol">
<span><label class="alchimie-title">Sur-effet : </label></span>
<span><label class="item-label">Sur-effet : </label></span>
<div class="form-group small-editor">
{{editor sureffet target="system.sureffet" button=true owner=options.isOwner editable=options.editable engine="prosemirror"}}
</div>

View File

@ -3,8 +3,8 @@
{{!-- Sheet Body --}}
<section class="sheet-body">
<div class="form-group">
<label>Draconic</label>
<select name="system.draconic" id="draconic" data-dtype="String">
<label for="system.draconic">Draconic</label>
<select name="system.draconic" data-dtype="String">
{{#select system.draconic}}
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-draconic.html"}}
{{/select}}
@ -12,7 +12,7 @@
</div>
<div class="form-group">
<label for="system.caseTMR">Case TMR</label>
<select name="system.caseTMR" id="caseTMR" data-dtype="String">
<select name="system.caseTMR" data-dtype="String">
{{#select system.caseTMR}}
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-tmr-type.html"}}
<option value="special">Case spéciale TMR (saisie ci-dessous)</option>
@ -62,7 +62,7 @@
{{#each bonusCaseList as |bcData key|}}
<div class="form-group">
<label for="caseValue">Case/Bonus :</label>
<input class="attribute-value" type="text" name="caseValue" value="{{bcData.case}}" data-dtype="String"/>
<input class="attribute-value" type="text" name="caseValue" value="{{bcData.case}}" data-dtype="String"/>
<input class="attribute-value" type="text" name="bonusValue" value="{{bcData.bonus}}" data-dtype="Number"/>
</div>
{{/each}}

View File

@ -9,8 +9,8 @@
</div>
{{else}}
<div class="form-group">
<label>Draconic</label>
<select name="system.draconic" id="draconic" data-dtype="String">
<label for="system.draconic">Draconic</label>
<select name="system.draconic" data-dtype="String">
{{#select system.draconic}}
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-draconic.html"}}
{{/select}}

View File

@ -36,7 +36,7 @@
{{#if options.isGM}}
<div class="form-group">
<label for="system.cacher_points_de_tache">Cacher les Points de Tâches nécessaires au joueur</label>
<input class="attribute-value" ²type="checkbox" name="system.cacher_points_de_tache" {{checked system.cacher_points_de_tache}}/>
<input class="attribute-value" type="checkbox" name="system.cacher_points_de_tache" {{checked system.cacher_points_de_tache}}/>
</div>
<div class="form-group">
<label for="system.points_de_tache">Points de tâches nécessaires (MJ)</label>

View File

@ -9,12 +9,12 @@
<img class="profile-img" src="{{img}}" data-edit="img" data-tooltip="{{name}}"/>
<div class="flexcol">
<div class="form-group">
<label>Aspect</label>
<label for="system.concept">Aspect</label>
<input class="attribute-value" type="text" name="system.concept" value="{{system.concept}}" data-dtype="String" />
</div>
<div class="form-group">
<label>Sens</label>
<select name="system.aspect" id="aspect" data-dtype="String">
<label for="system.aspect">Sens</label>
<select name="system.aspect" data-dtype="String">
{{#select system.aspect}}
{{>"systems/foundryvtt-reve-de-dragon/templates/enum-aspect-tarot.html"}}
{{/select}}

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