Compare commits

..

19 Commits

Author SHA1 Message Date
d577e2d2ec Merge pull request '11.2.13 - Les cent pas d'Akarlikarlikar' (#694) from VincentVk/foundryvtt-reve-de-dragon:v11 into v11
Reviewed-on: public/foundryvtt-reve-de-dragon#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: public/foundryvtt-reve-de-dragon#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: public/foundryvtt-reve-de-dragon#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: public/foundryvtt-reve-de-dragon#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
32 changed files with 628 additions and 145 deletions

View File

@@ -1,4 +1,21 @@
# 11.2 # 11.2
## 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 ## 11.2.9 - La barbe d'Akarlikarlikar
- Amélioration des textes de tooltips - Amélioration des textes de tooltips
- Les tooltips sont plus dans le thème de couleur du système Rêve de Dragon - Les tooltips sont plus dans le thème de couleur du système Rêve de Dragon

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

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 256px; width: 256px;"><g class="" transform="translate(0,3)" style=""><path d="M243.512 23.29c-27.105 18.337-53.533 32.92-82.274 45.337-2.843 17.364-3.948 34.497-4.05 51.584 28.913 15.41 56.096 32.85 83.33 49.634l7.045 4.344-3.432 7.482c-12.12 26.572-24.33 47.087-46.245 70.3l-5.184 5.512-6.46-3.904c-32.974-19.974-74.472-38.724-113.373-53.95l6.826-17.374c36.79 14.4 75.11 32.32 108.153 51.504 15.396-17.198 25.326-33.354 34.713-52.89-43.44-26.91-86.13-53.51-134.69-70.632-23.012 20.357-37.705 45.243-51.942 70.74 8.324 25.495 6.596 53.376-6.596 77.46 48.58-.593 97.994 2.23 150.666 10.26l5.658.837 1.787 5.44c8.85 26.46 11.79 54.41 8.325 83.588l-.987 8.432-8.466-.187c-40.508-.864-80.175-2.138-118.17.234 1.634 15.94-2.31 30.972-7.724 45.025 13.427 28.54 27.38 55.8 48.29 79.39 41.27-19.05 73.564-31.288 115.93-42.85-3.407-13.72-6.918-26.36-11.097-33.62-5.122-8.9-10.207-13.057-17.85-15.256-15.284-4.4-44.533 2.293-92.894 19.454l-6.243-17.594c48.907-17.354 79.702-26.894 104.283-19.82 9.133 2.628 16.884 8.004 23.066 15.46 14.487-7.627 28.415-16.79 42.053-26.996 12.34-45.92 37.29-81.42 66.626-112.107-7.226-13.52-13.208-27.204-20.563-40.613l-3.394-6.168 5-4.965c23.275-23.13 47.34-40.157 71.87-52.487l8.395 16.716c-20.952 10.53-41.503 25.913-61.795 45.152 12.41 23.91 22.263 45.5 39.457 64.826 37.488-27.124 74.943-51.39 116.84-74.938-13.96-30.473-31.345-58.357-56.286-79.462-32.2 13.38-62.527 17.39-92.61 12.29-14.223 13.25-30.094 22.23-48.756 23.337-29.017 1.722-60.74-15.74-99.174-57.672l6.858-6.295.017-.028.006.006 6.88-6.314c36.702 40.043 63.74 52.87 84.32 51.65 18.514-1.1 35.03-14.95 51.684-35.406-28.827-31.81-64.174-59.94-97.822-84.465zM39.324 277.884c-6.06.022-12.104.098-18.142.223 1.673 26.288 5.512 51.288 14.052 73.732 45.88-5.82 93.308-4.96 141.15-3.87 1.518-21.27-.253-41.69-6.058-61.212-45.528-6.565-88.59-9.03-131.002-8.873z" fill="#ffffff" fill-opacity="1" transform="translate(51.2, 51.2) scale(0.8, 0.8) rotate(0, 256, 256) skewX(0) skewY(0)"></path></g></svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

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

View File

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

View File

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

@@ -328,8 +328,8 @@ export class RdDCombatManager extends Combat {
} }
} }
options = [ options = [
{ name: "Incrémenter initiative", condition: true, icon: '<i class="fas fa-plus"></i>', callback: target => { RdDCombatManager.incDecInit(target.data('combatant-id'), +0.01); } }, { name: "Incrémenter initiative", condition: true, icon: '<i class="fa-solid fa-plus"></i>', callback: target => { RdDCombatManager.incDecInit(target.data('combatant-id'), +0.01); } },
{ name: "Décrémenter initiative", condition: true, icon: '<i class="fas fa-minus"></i>', callback: target => { RdDCombatManager.incDecInit(target.data('combatant-id'), -0.01); } } { name: "Décrémenter initiative", condition: true, icon: '<i class="fa-solid fa-minus"></i>', callback: target => { RdDCombatManager.incDecInit(target.data('combatant-id'), -0.01); } }
].concat(options); ].concat(options);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -1307,6 +1307,7 @@ export class RdDCombat {
blessuresStatus: actor.computeResumeBlessure(), blessuresStatus: actor.computeResumeBlessure(),
SConst: actor.getSConst(), SConst: actor.getSConst(),
actorId: actor.id, actorId: actor.id,
actor: actor,
tokenId: tokenId, tokenId: tokenId,
isGrave: actor.countBlessures(it => it.isGrave()) > 0, isGrave: actor.countBlessures(it => it.isGrave()) > 0,
isCritique: actor.countBlessures(it => it.isCritique()) > 0 isCritique: actor.countBlessures(it => it.isCritique()) > 0

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -93,6 +93,7 @@
--background-control-selected: linear-gradient(to bottom, hsla(0, 100%, 25%, 0.5) 5%, hsla(0, 100%, 12%, 0.5) 100%); --background-control-selected: linear-gradient(to bottom, hsla(0, 100%, 25%, 0.5) 5%, hsla(0, 100%, 12%, 0.5) 100%);
--background-tooltip: hsla(60, 12%, 85%, 0.95); --background-tooltip: hsla(60, 12%, 85%, 0.95);
--background-error:hsla(16, 100%, 50%, 0.8); --background-error:hsla(16, 100%, 50%, 0.8);
--color-profile-border: hsla(0, 0%, 80%, 0.05);
} }
/*@import url("https://fonts.googleapis.com/css2?family=Martel:wght@400;800&family=Roboto:wght@300;400;500&display=swap");*/ /*@import url("https://fonts.googleapis.com/css2?family=Martel:wght@400;800&family=Roboto:wght@300;400;500&display=swap");*/
@@ -195,11 +196,10 @@ i:is(.fas, .far, .fa-solid, .fa-regular, .fa-sharp ) {
flex: 0 0 110px; flex: 0 0 110px;
height: 110px; height: 110px;
width: 110px; width: 110px;
margin-right: 0.5rem; padding: 0.2rem;
object-fit: scale-down;
object-position: 50% 0;
margin: 0.1rem;
object-fit: contain; object-fit: contain;
background-color: var(--color-profile-border);
border: 1px solid var(--color-profile-border);
} }
.system-foundryvtt-reve-de-dragon .rdd-item-sheet-tarot img.profile-img { .system-foundryvtt-reve-de-dragon .rdd-item-sheet-tarot img.profile-img {
@@ -440,7 +440,13 @@ table {border: 1px solid #7a7971;}
.flex-grow-2 { .flex-grow-2 {
flex-grow: 2; flex-grow: 2;
} }
.voyage-liste-survies {
max-width: 12rem;
}
/* Styles limited to foundryvtt-reve-de-dragon sheets */ /* Styles limited to foundryvtt-reve-de-dragon sheets */
.texte-dans-liste {
text-align: left;
}
.equipement-nom { .equipement-nom {
flex-grow : 4; flex-grow : 4;
margin: 0; margin: 0;
@@ -963,12 +969,6 @@ section.sheet-body {
padding: 0.25rem 0.5rem; padding: 0.25rem 0.5rem;
} }
.sheet header.sheet-header :is(.profile-img, .profile-img-token) {
object-fit: scale-down;
object-position: 50% 0;
margin: 0.5rem 0 0.5rem 0.5rem;
padding: 0;
}
.sheet header.sheet-header h1 { .sheet header.sheet-header h1 {
flex: 3; flex: 3;
} }
@@ -1174,7 +1174,7 @@ ul.chat-list li:nth-child(odd) {
border-radius: 0.25rem; border-radius: 0.25rem;
padding: 0.1rem; padding: 0.1rem;
flex: 1 1 1.5rem; flex: 1 1 1.5rem;
display: flex !important; display: flex;
align-items: center !important; align-items: center !important;
} }

View File

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

View File

@@ -12,19 +12,19 @@
<ul> <ul>
<li data-attribute="resistance" class="flexrow"> <li data-attribute="resistance" class="flexrow">
<span class="carac-label">Résistance</span> <span class="carac-label">Résistance</span>
<a class="resistance-moins"><i class="fas fa-minus-square"></i></a> <a class="resistance-moins"><i class="fa-solid fa-square-minus"></i></a>
<input type="text" name="system.etat.resistance.value" value="{{system.etat.resistance.value}}" data-dtype="Number" /> <input type="text" name="system.etat.resistance.value" value="{{system.etat.resistance.value}}" data-dtype="Number" />
/ /
<input type="text" name="system.etat.resistance.max" value="{{system.etat.resistance.max}}" data-dtype="Number" {{#unless @root.options.vueDetaillee}}disabled{{/unless}} /> <input type="text" name="system.etat.resistance.max" value="{{system.etat.resistance.max}}" data-dtype="Number" {{#unless @root.options.vueDetaillee}}disabled{{/unless}} />
<a class="resistance-plus"><i class="fas fa-plus-square"></i></a> <a class="resistance-plus"><i class="fa-solid fa-square-plus"></i></a>
</li> </li>
<li data-attribute="structure" class="flexrow"> <li data-attribute="structure" class="flexrow">
<span class="carac-label">Structure</span> <span class="carac-label">Structure</span>
<a class="structure-moins"><i class="fas fa-minus-square"></i></a> <a class="structure-moins"><i class="fa-solid fa-square-minus"></i></a>
<input type="text" name="system.etat.structure.value" value="{{system.etat.structure.value}}" data-dtype="Number" /> <input type="text" name="system.etat.structure.value" value="{{system.etat.structure.value}}" data-dtype="Number" />
/ /
<input type="text" name="system.etat.structure.max" value="{{system.etat.structure.max}}" data-dtype="Number" {{#unless @root.options.vueDetaillee}}disabled{{/unless}} /> <input type="text" name="system.etat.structure.max" value="{{system.etat.structure.max}}" data-dtype="Number" {{#unless @root.options.vueDetaillee}}disabled{{/unless}} />
<a class="structure-plus"><i class="fas fa-plus-square"></i></a> <a class="structure-plus"><i class="fa-solid fa-square-plus"></i></a>
</li> </li>
</ul> </ul>
</div> </div>

View File

@@ -17,13 +17,13 @@
<span class="equipement-detail-buttons flexrow"> <span class="equipement-detail-buttons flexrow">
{{#unless (or (eq item.type 'service') (and (eq item.type 'conteneur') (not vide)))}} {{#unless (or (eq item.type 'service') (and (eq item.type 'conteneur') (not vide)))}}
{{#if options.isOwner}} {{#if options.isOwner}}
<a class="item-quantite-moins"><i class="fas fa-minus-square"></i></a> <a class="item-quantite-moins"><i class="fa-solid fa-square-minus"></i></a>
{{/if}} {{/if}}
<input {{#unless options.isOwner}}disabled{{/unless}} type="number" data-dtype="Number" <input {{#unless options.isOwner}}disabled{{/unless}} type="number" data-dtype="Number"
class="item-quantite number-x3" name="items[{{item._id}}].system.quantite" class="item-quantite number-x3" name="items[{{item._id}}].system.quantite"
value="{{item.system.quantite}}" /> value="{{item.system.quantite}}" />
{{#if options.isOwner}} {{#if options.isOwner}}
<a class="item-quantite-plus"><i class="fas fa-plus-square"></i></a> <a class="item-quantite-plus"><i class="fa-solid fa-square-plus"></i></a>
{{/if}} {{/if}}
{{/unless}} {{/unless}}
</span> </span>

View File

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

View File

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

View File

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

View File

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

View File

@@ -10,7 +10,7 @@
</span> </span>
{{#if @root.options.isOwner}} {{#if @root.options.isOwner}}
<span class="equipement-button item-controls"> <span class="equipement-button item-controls">
<a class="item-quantite-moins"><i class="fas fa-minus-square"></i></a> <a class="item-quantite-moins"><i class="fa-solid fa-square-minus"></i></a>
</span> </span>
{{/if}} {{/if}}
<span class="equipement-detail"> <span class="equipement-detail">
@@ -18,7 +18,7 @@
</span> </span>
{{#if @root.options.isOwner}} {{#if @root.options.isOwner}}
<span class="equipement-button item-controls"> <span class="equipement-button item-controls">
<a class="item-quantite-plus"><i class="fas fa-plus-square"></i></a> <a class="item-quantite-plus"><i class="fa-solid fa-square-plus"></i></a>
</span> </span>
{{/if}} {{/if}}
<span class="equipement-actions item-controls"> <span class="equipement-actions item-controls">

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,10 @@
<img class="chat-icon" src="{{actor.img}}" data-tooltip="{{actor.name}}" />
<p>{{actor.name}} s'est fatigué de {{perteFatigue}}
{{#if (and isVoyage (gt parameters.nombreHeures 0))}}
après {{parameters.nombreHeures}} heure{{#if (gt parameters.nombreHeures 1)}}s{{/if}}
de voyage {{lowerFirst parameters.typeTerrain.label}}
à {{parameters.vitesseDeplacement}} km/h<sup>dr</sup> (Fatigue par heure: {{parameters.fatigueHoraire}})
</p>
<p>{{parameters.typeTerrain.description}}
{{/if}}
</p>

View File

@@ -0,0 +1,58 @@
<form class="dialog-fatigue-voyage">
<div class="flexcol">
<div class="flexrow">
<label for="code-terrain" class="flex-shrink">Type de terrain</label>
<div>
<select type="text" name="code-terrain" value="{{typeTerrain.code}}" data-dtype="String">
{{#select typeTerrain.code}}
{{#each tableauFatigueMarche as |ligne|}}
<option value="{{ligne.code}}">{{ligne.label}} - {{ligne.description}}</option>
{{/each}}
{{/select}}
</select>
</div>
</div>
<div class="flexrow">
<label for="vitesse-deplacement" class="flex-shrink">Vitesse de marche</label>
<div>
<select type="text" name="vitesse-deplacement" value="{{vitesseDeplacement}}" data-dtype="String">
{{#select vitesseDeplacement}}
{{#each typeTerrain.vitesses as |rythme|}}
{{> 'systems/foundryvtt-reve-de-dragon/templates/voyage/option-vitesse-fatigue.hbs' vitesse=rythme.vitesse fatigue=rythme.fatigue}}
{{/each}}
{{/select}}
</select>
</div>
</div>
<div class="flexrow">
<label for="nombre-heures" class="flex-shrink">Nombre d'heures</label>
<div>
<input type="number" name="nombre-heures" class="number-x2 nombre-heures" data-dtype="Number" value="{{nombreHeures}}" min="1" max="8"/> heures
</div>
</div>
<div class="flexrow">
<label for="base-fatigue" class="flex-shrink">Fatigue à appliquer</label>
<div>
<input type="number" name="base-fatigue" class="number-x2 base-fatigue" data-dtype="Number" value="{{nombreHeures}}" min="1" max="60"/>
</div>
</div>
<div><hr></div>
<div class="flexrow fatigue-actors-list">
<ul class="item-list alterne-list scrollable-list">
<li class="competence-header flexrow">
<span class="flex-grow-2">Personnage</span>
<span class="flex-grow-2">Survies</span>
<span class="flex-grow-1" data-tooltip="Ajustements à appliquer pour les personnages se reposant (par exemple, à cheval)">Ajustements</span>
</li>
{{#each playerActors as |selected|}}
{{>'systems/foundryvtt-reve-de-dragon/templates/voyage/fatigue-actor.hbs' voyageur=selected survies=@root.typeTerrain.survies}}
{{/each}}
</ul>
</div>
<hr>
<div class="flexrow">
<span class="flex-shrink"></span>
<button name="appliquer-fatigue">Appliquer la fatigue</button>
</div>
</div>
</form>

View File

@@ -0,0 +1,23 @@
<li class="item flexrow list-item texte-dans-liste" data-actor-id="{{voyageur.actor.id}}">
<span class="flex-grow-2 flexrow">
<input type="checkbox" name="selectionner-acteur" {{#if voyageur.selected}}checked{{/if}}/>
<label>
<img class="chat-icon" src="{{voyageur.actor.img}}" data-tooltip="{{voyageur.actor.name}}" />
<span>{{voyageur.actor.name}}</span>
</label>
</span>
<span class="flex-grow-2">
<div class="flexcol ">
<label class="voyage-liste-survies">
{{#each voyageur.competencesVoyage as |comp key|}}
{{#if (array-includes ../survies key)}}
{{key}} {{comp.system.niveau}},
{{/if}}
{{/each}}
</label>
</div>
</span>
<span class="flex-grow-1">
<input type="number" name="ajustement-fatigue" class="number-x2 ajustement-fatigue" data-dtype="Number" value="{{voyageur.ajustementFatigue}}" min="-6" max="6"/>
</span>
</li>

View File

@@ -0,0 +1 @@
<option value="{{vitesse}}">{{vitesse}} km/h<sup>dr</sup> (Fatigue: {{fatigue}})</option>