Compare commits

..

25 Commits

Author SHA1 Message Date
875e121a09 Merge pull request '13.0.41 -mode de visibilité des jets' (#808) from feature/v13-corrections into v13
All checks were successful
Release Creation / build (release) Successful in 1m0s
Reviewed-on: https, #808
2026-05-29 02:08:11 +02:00
12e0e6397c mode de visibilité des jets 2026-05-29 02:01:30 +02:00
93b74574ad pas de stress/sommeil pour personnage non lié
All checks were successful
Release Creation / build (release) Successful in 1m32s
2026-05-29 01:53:35 +02:00
1765cb2ef9 Mode de visibilité des jets 2026-05-29 01:53:35 +02:00
0cbd7a6deb Merge pull request '13.0.39 - La défense d'Illisys' (#806) from feature/v13-corrections into v13
All checks were successful
Release Creation / build (release) Successful in 1m1s
Reviewed-on: https, #806
2026-05-10 15:06:35 +02:00
aec4364889 Type de jet: Jet de résistance 2026-05-09 23:14:28 +02:00
f17996b1c8 Difficultés attaque/défense sur appel à la chance 2026-05-09 22:41:47 +02:00
14a4b34bbd Correction jets de compétence des invocations 2026-05-09 22:41:02 +02:00
1777eced30 Correction des catégories de parades 2026-05-09 21:42:09 +02:00
9bdda32d54 Merge pull request 'Set version changelog 13.0.38' (#805) from feature/v13-corrections into v13
All checks were successful
Release Creation / build (release) Successful in 2m29s
Reviewed-on: https, #805
2026-05-05 23:55:45 +02:00
3fe53d7ff0 Set version changelog 13.0.38 2026-05-05 23:55:16 +02:00
c839d4633d Merge pull request '## 13.0.37 - L'urgence d'Illisys' (#804) from feature/v13-corrections into v13
Reviewed-on: https, #804
2026-05-05 23:54:19 +02:00
24753bfc29 Appel chance RollDialogV2 2026-05-05 23:51:04 +02:00
e7acb0c4f2 Fix v14 Dés dice-so-nice 2026-05-05 21:51:01 +02:00
7535e5f340 Fix v14: /roll dans le tchat 2026-05-05 21:48:24 +02:00
d2326e5a25 Fix: liste des actions disponibles
- ajout du haut-rêve
- possibilité de ne lister que les armes équipées
2026-05-05 02:12:48 +02:00
e2afc24601 Message en cas d'erreur de migration 2026-05-02 16:46:25 +02:00
f220e3a394 Merge pull request 'Version 13.0.37' (#803) from feature/v13-corrections into v13
All checks were successful
Release Creation / build (release) Successful in 1m28s
Reviewed-on: https, #803
2026-05-02 16:37:40 +02:00
1d9348b701 Version 13.0.37 2026-05-02 16:36:51 +02:00
d96dff988e Merge pull request 'isNewerVersion' (#802) from feature/v13-corrections into v13
Reviewed-on: https, #802
2026-05-02 16:35:21 +02:00
9966a33524 Correction Migration avec Foundry14
Accès à méthode isNewerVersion à travers foundry.utils
2026-05-02 16:32:19 +02:00
7fb0ee1659 await ChatMessage.create
ChatMessage.create est async, il faut donc de préférence
l'appeler avec un await.

Des effets secondaires avaient lieu (ordre de messages, updates
ultérieurs parfois pas pris en compte)
2026-05-02 00:42:45 +02:00
d15d0989a3 Remise à zéro du refoulement après souffle 2026-05-01 23:56:17 +02:00
704c99e418 Correction: modification de coeurs 2026-05-01 23:38:05 +02:00
9ccc068333 Amélioration du moral
Les bon moments sont affichés en tooltips sur le moral

Simplification moralIncDec: Utilisation d'un seul update
2026-05-01 23:20:58 +02:00
95 changed files with 598 additions and 390 deletions

View File

@@ -1,5 +1,39 @@
# 13.0 # 13.0
## 13.0.41 - Le miroir d'Illisys
- les mode de visibilité des jets sont bien pris en compte
## 13.0.40 - Le miroir d'Illisys
- les mode de visibilité des jets sont bien pris en compte
- pas de stress ou de sommeil pour les personnage non liés
## 13.0.39 - La défense d'Illisys
- mise à jour de version foundry-cli
- correction des catégories de parades des compendiums
- des ne pouvaient pas parer (exemple: le bouclier du guerrier sorde)
- les difficultés des jets d'attaque/défense après appel à la chance sont conservées
- L'absence des compétences cuisine/jeu ne bloque plus l'accès à la fenêtre de jets (cas des invocations)
## 13.0.38 - L'urgence d'Illisys
- Corrections v14
- on peut utiliser les commandes foundry dans le tchat (par exemple, /roll 1d6)
- les dés customisés Dice-So-Nice (heure, rencontres, dé draconique) fonctionnent
- Le Haut-rêve est de nouveau proposé dans les options d'initiative
- Nouvelle règle optionnelle: choisir si seules les armes équipées sont proposées en combat
- L'appel à la chance utilise la nouvelle fenêtre de jet de dés
## 13.0.37 - Le bonheur des zyglutes d'Illisys
- Corrections v14
- correction du problème liè à Foundry 14 qui peut empêcher d'utiliser les fenêtres de jets à cause de migrations mal effectuées
- Les bon moments sont affichés en tooltip sur le moral
- Les modifications de coeurs fonctionnent de nouveau
- Le refoulement est remis à zéro après avoir refoulé et reçu un souffle
## 13.0.36 - Les rêveries d'Illisys ## 13.0.36 - Les rêveries d'Illisys
- Corrections v14 - Corrections v14

View File

@@ -216,7 +216,7 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
// Points de reve actuel // Points de reve actuel
this.html.find('.roll-reve-actuel').click(async event => await this.actor.rollReveActuel({ resistance: false })) this.html.find('.roll-reve-actuel').click(async event => await this.actor.rollReveActuel({ resistance: false }))
this.html.find('.button-reve-resistance').click(async event => await this.actor.rollReveActuel({ diff: -8, resistance: true })) this.html.find('.button-reve-resistance').click(async event => await this.actor.rollReveResistance())
this.html.find('.action-empoignade').click(async event => await RdDEmpoignade.onAttaqueEmpoignadeFromItem(RdDSheetUtility.getItem(event, this.actor))) this.html.find('.action-empoignade').click(async event => await RdDEmpoignade.onAttaqueEmpoignadeFromItem(RdDSheetUtility.getItem(event, this.actor)))
this.html.find('.roll-arme').click(async event => { this.html.find('.roll-arme').click(async event => {

View File

@@ -47,11 +47,7 @@ import { RdDRollResult } from "./rdd-roll-result.js";
import { RdDInitiative } from "./initiative.mjs"; import { RdDInitiative } from "./initiative.mjs";
import RollDialog from "./roll/roll-dialog.mjs"; import RollDialog from "./roll/roll-dialog.mjs";
import { OptionsAvancees, ROLL_DIALOG_V2 } from "./settings/options-avancees.js"; import { OptionsAvancees, ROLL_DIALOG_V2 } from "./settings/options-avancees.js";
import { ROLL_TYPE_JEU, ROLL_TYPE_MEDITATION, ROLL_TYPE_SORT } from "./roll/roll-constants.mjs"; import { ROLL_TYPE_COMP, ROLL_TYPE_CUISINE, ROLL_TYPE_JEU, ROLL_TYPE_MEDITATION, ROLL_TYPE_OEUVRE, ROLL_TYPE_SORT, ROLL_TYPE_APPEL_CHANCE, ROLL_TYPE_TACHE } from "./roll/roll-constants.mjs";
import { PART_TACHE } from "./roll/roll-part-tache.mjs";
import { PART_COMP } from "./roll/roll-part-comp.mjs";
import { PART_OEUVRE } from "./roll/roll-part-oeuvre.mjs";
import { PART_CUISINE } from "./roll/roll-part-cuisine.mjs";
import { RdDPossessionV2 } from "./rdd-possession-v2.mjs"; import { RdDPossessionV2 } from "./rdd-possession-v2.mjs";
import { Apprecier, MORAL, SITUATION_MORAL } from "./moral/apprecier.mjs"; import { Apprecier, MORAL, SITUATION_MORAL } from "./moral/apprecier.mjs";
import { Distance } from "./combat/distance.mjs"; import { Distance } from "./combat/distance.mjs";
@@ -140,13 +136,14 @@ export class RdDActor extends RdDBaseActorSang {
.reduce(Misc.sum(), 0); .reduce(Misc.sum(), 0);
} }
listActions({ isAttaque = false, isEquipe = false }) { listActions() {
// Recupération des attaques // Recupération des attaques
const actions = this.listActionsAttaque() const actions = ReglesOptionnelles.isUsing('armes-equipees')
.filter(it => !isEquipe || it.arme.system.equipe) ? this.listActionsAttaque().filter(action => action.equipe)
: this.listActionsAttaque()
if (!isAttaque && this.system.attributs.hautrevant.value) { if (this.system.attributs.hautrevant.value) {
actions.push({ label: "Draconic", action: 'haut-reve', initOnly: true }) actions.push({ label: "Draconic", action: 'haut-reve', initOnly: true, equipe: true })
} }
return actions return actions
} }
@@ -256,7 +253,7 @@ export class RdDActor extends RdDBaseActorSang {
console.log('perte de rêve des enchantements', toUpdate) console.log('perte de rêve des enchantements', toUpdate)
const messageUpdates = await Promise.all( const messageUpdates = await Promise.all(
toUpdate.map(async it => await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-pertereve-enchantement-chateaudormant.hbs`, it))) toUpdate.map(async it => await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-pertereve-enchantement-chateaudormant.hbs`, it)))
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(this), whisper: ChatUtility.getOwners(this),
content: messageUpdates.reduce(Misc.joining('<br>')) content: messageUpdates.reduce(Misc.joining('<br>'))
}) })
@@ -322,8 +319,7 @@ export class RdDActor extends RdDBaseActorSang {
await this.setBonusPotionSoin(0); await this.setBonusPotionSoin(0);
} }
await this.resetInfoSommeil() await this.resetInfoSommeil()
ChatMessage.create(message); await ChatMessage.create(message)
setTimeout(() => this.sheet.render(), 20)
} }
async _recuperationSante(message) { async _recuperationSante(message) {
@@ -364,7 +360,7 @@ export class RdDActor extends RdDBaseActorSang {
const message = { const message = {
whisper: ChatUtility.getOwners(this), whisper: ChatUtility.getOwners(this),
content: "" content: ""
}; }
await this._recuperationSante(message) await this._recuperationSante(message)
await this._recupereMoralChateauDormant(message) await this._recupereMoralChateauDormant(message)
@@ -375,12 +371,12 @@ export class RdDActor extends RdDBaseActorSang {
await this.retourSust(message) await this.retourSust(message)
await this.$perteReveEnchantementsChateauDormants() await this.$perteReveEnchantementsChateauDormants()
await this.$suppressionLancementsSort() await this.$suppressionLancementsSort()
await RdDCoeur.applyCoeurChateauDormant(this, message); await RdDCoeur.applyCoeurChateauDormant(this, message)
if (message.content != "") { if (message.content != "") {
message.content = `A la fin Chateau Dormant, ${message.content}<br>Un nouveau jour se lève`; message.content = `A la fin Chateau Dormant, ${message.content}<br>Un nouveau jour se lève`
ChatMessage.create(message); await ChatMessage.create(message)
} }
await this.resetInfoSommeil(); await this.resetInfoSommeil()
} }
async resetInfoSommeil() { async resetInfoSommeil() {
@@ -536,37 +532,36 @@ export class RdDActor extends RdDBaseActorSang {
} }
if (!options.grisReve) { if (!options.grisReve) {
ChatMessage.create(message); await ChatMessage.create(message)
} }
if (options.chateauDormant) { if (options.chateauDormant) {
await this.$dormirChateauDormant(); await this.$dormirChateauDormant()
} }
setTimeout(() => this.sheet.render(), 20)
} }
async reveilReveDeDragon(message, heures) { async reveilReveDeDragon(message, heures) {
const restant = Math.max(this.system.sommeil?.heures - heures, 0) const restant = Math.max(this.system.sommeil?.heures - heures, 0)
if (restant > 0) { if (restant > 0) {
await this.update({ 'system.sommeil': { heures: restant } }); await this.update({ 'system.sommeil': { heures: restant } })
} }
} }
async $dormirDesHeures(message, heures, options) { async $dormirDesHeures(message, heures, options) {
const dormi = { heures: 0, etat: 'dort', jetsReve: [] }; const dormi = { heures: 0, etat: 'dort', jetsReve: [] };
for (; dormi.heures < heures && dormi.etat == 'dort'; dormi.heures++) { for (; dormi.heures < heures && dormi.etat == 'dort'; dormi.heures++) {
await this.$recupererEthylisme(message); await this.$recupererEthylisme(message)
if (options.grisReve) { if (options.grisReve) {
await this.$recupererFatigue(message); await this.$recupererFatigue(message)
} }
else if (!this.system.sommeil?.insomnie) { else if (!this.system.sommeil?.insomnie) {
await this.$recupererFatigue(message); await this.$recupererFatigue(message)
await this.$jetRecuperationReve(dormi, message); await this.$jetRecuperationReve(dormi, message)
if (dormi.etat == 'dort' && EffetsDraconiques.isDonDoubleReve(this)) { if (dormi.etat == 'dort' && EffetsDraconiques.isDonDoubleReve(this)) {
await this.$jetRecuperationReve(dormi, message); await this.$jetRecuperationReve(dormi, message)
} }
} }
} }
return dormi; return dormi
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -583,7 +578,7 @@ export class RdDActor extends RdDBaseActorSang {
} }
else { else {
if (!ReglesOptionnelles.isUsing("recuperation-reve")) { if (!ReglesOptionnelles.isUsing("recuperation-reve")) {
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(this), whisper: ChatUtility.getOwners(this),
content: `Pas de récupération de rêve (${reve} points ignorés)` content: `Pas de récupération de rêve (${reve} points ignorés)`
}) })
@@ -891,7 +886,7 @@ export class RdDActor extends RdDBaseActorSang {
await competence.update({ 'system.xp': toXp }) await competence.update({ 'system.xp': toXp })
await ExperienceLog.add(this, XP_TOPIC.XP, fromXp, toXp, competence.name, true) await ExperienceLog.add(this, XP_TOPIC.XP, fromXp, toXp, competence.name, true)
if (toXp > fromXp) { if (toXp > fromXp) {
RdDUtility.checkThanatosXP(competence) await RdDUtility.checkThanatosXP(competence)
} }
} }
} }
@@ -907,7 +902,7 @@ export class RdDActor extends RdDBaseActorSang {
await competence.update({ 'system.xp_sort': toXpSort }) await competence.update({ 'system.xp_sort': toXpSort })
await ExperienceLog.add(this, XP_TOPIC.XPSORT, fromXpSort, toXpSort, competence.name, true) await ExperienceLog.add(this, XP_TOPIC.XPSORT, fromXpSort, toXpSort, competence.name, true)
if (toXpSort > fromXpSort) { if (toXpSort > fromXpSort) {
RdDUtility.checkThanatosXP(competence) await RdDUtility.checkThanatosXP(competence)
} }
} }
} }
@@ -954,7 +949,7 @@ export class RdDActor extends RdDBaseActorSang {
/* -------------------------------------------- */ /* -------------------------------------------- */
async distribuerStress(compteur, valeur, motif) { async distribuerStress(compteur, valeur, motif) {
if (game.user.isGM && this.hasPlayerOwner) { if (game.user.isGM && this.isPersonnageJoueur()) {
switch (compteur) { switch (compteur) {
case 'stress': case 'experience': case 'stress': case 'experience':
await this.addCompteurValue(compteur, valeur, motif); await this.addCompteurValue(compteur, valeur, motif);
@@ -972,7 +967,7 @@ export class RdDActor extends RdDBaseActorSang {
/* -------------------------------------------- */ /* -------------------------------------------- */
async actionRefoulement(item) { async actionRefoulement(item) {
const refoulement = item?.system.refoulement ?? 0; const refoulement = item?.system.refoulement ?? 0
if (refoulement > 0) { if (refoulement > 0) {
RdDConfirm.confirmer({ RdDConfirm.confirmer({
settingConfirmer: "confirmation-refouler", settingConfirmer: "confirmation-refouler",
@@ -980,8 +975,8 @@ export class RdDActor extends RdDBaseActorSang {
title: 'Confirmer la refoulement', title: 'Confirmer la refoulement',
buttonLabel: 'Refouler', buttonLabel: 'Refouler',
onAction: async () => { onAction: async () => {
await this.ajouterRefoulement(refoulement, `une queue ${item.name}`); await this.ajouterRefoulement(refoulement, `une queue ${item.name}`)
await item.delete(); await item.delete()
} }
}); });
} }
@@ -989,16 +984,18 @@ export class RdDActor extends RdDBaseActorSang {
/* -------------------------------------------- */ /* -------------------------------------------- */
async ajouterRefoulement(value = 1, refouler) { async ajouterRefoulement(value = 1, refouler) {
let refoulement = this.system.reve.refoulement.value + value const refoulement = this.system.reve.refoulement.value + value
const roll = new Roll("1d20") const roll = new Roll("1d20")
await roll.evaluate() await roll.evaluate()
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})` })
if (roll.total <= refoulement) { if (roll.total <= refoulement) {
refoulement = 0 await this.update({ "system.reve.refoulement.value": 0 })
await this.ajouterSouffle({ chat: true }) await this.ajouterSouffle({ chat: true })
} }
else {
await this.update({ "system.reve.refoulement.value": refoulement }) await this.update({ "system.reve.refoulement.value": refoulement })
return roll; }
return roll
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -1007,7 +1004,7 @@ export class RdDActor extends RdDBaseActorSang {
//souffle.id = undefined; //TBC //souffle.id = undefined; //TBC
await this.createEmbeddedDocuments('Item', [souffle]) await this.createEmbeddedDocuments('Item', [souffle])
if (options.chat) { if (options.chat) {
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(this), whisper: ChatUtility.getOwners(this),
content: this.name + " subit un Souffle de Dragon : " + souffle.name content: this.name + " subit un Souffle de Dragon : " + souffle.name
}) })
@@ -1017,22 +1014,19 @@ export class RdDActor extends RdDBaseActorSang {
/* -------------------------------------------- */ /* -------------------------------------------- */
async ajouterQueue(options = { chat: false }) { async ajouterQueue(options = { chat: false }) {
let queue; const thanatos = this.system.reve.reve.thanatosused;
if (this.system.reve.reve.thanatosused) { const queue = (thanatos ? await RdDRollTables.getOmbre() : await RdDRollTables.getQueue())
queue = await RdDRollTables.getOmbre(); if (thanatos) {
await this.update({ "system.reve.reve.thanatosused": false }) await this.update({ "system.reve.reve.thanatosused": false })
} }
else { await this.createEmbeddedDocuments('Item', [queue])
queue = await RdDRollTables.getQueue();
}
await this.createEmbeddedDocuments('Item', [queue]);
if (options.chat) { if (options.chat) {
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(this), whisper: ChatUtility.getOwners(this),
content: this.name + " subit une Queue de Dragon : " + queue.name content: this.name + " subit une Queue de Dragon : " + queue.name
}) })
} }
return queue; return queue
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -1096,14 +1090,14 @@ export class RdDActor extends RdDBaseActorSang {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async reinsertionAleatoire(raison, accessible = tmr => true) { async reinsertionAleatoire(raison, accessible = tmr => true) {
const innaccessible = this.buildTMRInnaccessible(); const innaccessible = this.buildTMRInnaccessible()
let tmr = await TMRUtility.getTMRAleatoire(tmr => accessible(tmr) && !innaccessible.includes(tmr.coord)); let tmr = await TMRUtility.getTMRAleatoire(tmr => accessible(tmr) && !innaccessible.includes(tmr.coord))
ChatMessage.create({ await ChatMessage.create({
content: `${raison} : ré-insertion aléatoire.`, content: `${raison} : ré-insertion aléatoire.`,
whisper: ChatUtility.getOwners(this) whisper: ChatUtility.getOwners(this)
}); })
await this.forcerPositionTMRInconnue(tmr); await this.forcerPositionTMRInconnue(tmr)
return tmr; return tmr
} }
async forcerPositionTMRInconnue(tmr) { async forcerPositionTMRInconnue(tmr) {
@@ -1167,7 +1161,7 @@ export class RdDActor extends RdDBaseActorSang {
async jetEndurance(resteEndurance = undefined) { async jetEndurance(resteEndurance = undefined) {
const result = super.jetEndurance(resteEndurance); const result = super.jetEndurance(resteEndurance);
if (result.jetEndurance == 1) { if (result.jetEndurance == 1) {
ChatMessage.create({ content: await this._gainXpConstitutionJetEndurance() }); await ChatMessage.create({ content: await this._gainXpConstitutionJetEndurance() })
} }
return result; return result;
} }
@@ -1188,7 +1182,7 @@ export class RdDActor extends RdDBaseActorSang {
} }
const jetMoral = await this._jetDeMoral(situation, bonmoment) const jetMoral = await this._jetDeMoral(situation, bonmoment)
const finMessage = (jetMoral.ajustement == 0 ? "Vous gardez votre moral" : jetMoral.ajustement > 0 ? "Vous gagnez du moral" : "Vous perdez du moral"); const finMessage = (jetMoral.ajustement == 0 ? "Vous gardez votre moral" : jetMoral.ajustement > 0 ? "Vous gagnez du moral" : "Vous perdez du moral");
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(this), whisper: ChatUtility.getOwners(this),
content: `${finMessage} - jet ${jetMoral.succes ? "réussi" : "manqué"} en situation ${SITUATION_MORAL[situation] ?? situation} (${jetMoral.jet}/${jetMoral.difficulte}).` content: `${finMessage} - jet ${jetMoral.succes ? "réussi" : "manqué"} en situation ${SITUATION_MORAL[situation] ?? situation} (${jetMoral.jet}/${jetMoral.difficulte}).`
}) })
@@ -1214,22 +1208,22 @@ export class RdDActor extends RdDBaseActorSang {
/* -------------------------------------------- */ /* -------------------------------------------- */
async moralIncDec(ajustement, bonmoment = "") { async moralIncDec(ajustement, bonmoment = "") {
let moral = parseInt(this.system.compteurs.moral.value) const moral = parseInt(this.system.compteurs.moral.value);
if (ajustement != 0) { if (ajustement != 0) {
if (ajustement > 0 && bonmoment != "" && bonmoment != undefined) {
await this.update({ 'system.compteurs.bonmoments': [...this.system.compteurs.bonmoments, bonmoment] })
}
const moralTheorique = moral + ajustement const moralTheorique = moral + ajustement
if (moralTheorique > 3) { // exaltation const newExaltation = parseInt(this.system.compteurs.exaltation.value) + Math.max(0, moralTheorique - 3)
const exaltation = parseInt(this.system.compteurs.exaltation.value) + moralTheorique - 3 const newDissolution = parseInt(this.system.compteurs.dissolution.value) + Math.max(0, - moralTheorique - 3)
await this.update({ 'system.compteurs.exaltation.value': exaltation }) const newMoral = Math.max(-3, Math.min(moralTheorique, 3))
const moralUpdates = {
'system.compteurs.exaltation.value': newExaltation,
'system.compteurs.dissolution.value': newDissolution,
'system.compteurs.moral.value': newMoral
} }
if (moralTheorique < -3) { // dissolution if (ajustement > 0 && bonmoment != "" && bonmoment != undefined && !this.system.compteurs.bonmoments.includes(bonmoment)) {
const dissolution = parseInt(this.system.compteurs.dissolution.value) - 3 - moralTheorique moralUpdates['system.compteurs.bonmoments'] = [...this.system.compteurs.bonmoments, bonmoment]
await this.update({ 'system.compteurs.dissolution.value': dissolution })
} }
moral = Math.max(-3, Math.min(moralTheorique, 3)); await this.update(moralUpdates)
await this.update({ 'system.compteurs.moral.value': moral }) return newMoral
} }
return moral return moral
} }
@@ -1492,7 +1486,7 @@ export class RdDActor extends RdDBaseActorSang {
exaltation: exaltation exaltation: exaltation
}; };
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(this), whisper: ChatUtility.getOwners(this),
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-transformer-stress.hbs`, stressRollData) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-transformer-stress.hbs`, stressRollData)
}); });
@@ -1559,7 +1553,7 @@ export class RdDActor extends RdDBaseActorSang {
xp: carac.xp xp: carac.xp
} }
if (display) { if (display) {
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(this), whisper: ChatUtility.getOwners(this),
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-carac-xp.hbs`, checkXp) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-carac-xp.hbs`, checkXp)
}); });
@@ -1571,7 +1565,7 @@ export class RdDActor extends RdDBaseActorSang {
/* -------------------------------------------- */ /* -------------------------------------------- */
async checkCompetenceXP(compName, newXP, display = true) { async checkCompetenceXP(compName, newXP, display = true) {
return this.getCompetence(compName)?.checkCompetenceXP( newXP, display) return this.getCompetence(compName)?.checkCompetenceXP(newXP, display)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -1594,7 +1588,7 @@ export class RdDActor extends RdDBaseActorSang {
ChatUtility.blindMessageToGM({ content: content }) ChatUtility.blindMessageToGM({ content: content })
} }
else { else {
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(this), whisper: ChatUtility.getOwners(this),
content: content content: content
}); });
@@ -1698,22 +1692,22 @@ export class RdDActor extends RdDBaseActorSang {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
isMauvaiseRencontre() { // Gestion queue/souffle 'Mauvaise Rencontre en Perpective' async isMauvaiseRencontre() { // Gestion queue/souffle 'Mauvaise Rencontre en Perpective'
let addMsg = ""; let addMsg = ""
let rencSpecial = EffetsDraconiques.mauvaiseRencontre(this); let rencSpecial = EffetsDraconiques.mauvaiseRencontre(this)
if (rencSpecial) { if (rencSpecial) {
if (rencSpecial.type != 'souffle') { if (rencSpecial.type != 'souffle') {
this.deleteEmbeddedDocuments('Item', [rencSpecial.id]); // Suppression dans la liste des queues await this.deleteEmbeddedDocuments('Item', [rencSpecial.id]) // Suppression dans la liste des queues
addMsg = " La queue a été supprimée de votre fiche automatiquement"; addMsg = " La queue a été supprimée de votre fiche automatiquement"
} else { } else {
addMsg = " Vous devez gérer manuellement le décompte de mauvaises rencontres."; addMsg = " Vous devez gérer manuellement le décompte de mauvaises rencontres."
} }
ChatMessage.create({ await ChatMessage.create({
content: "Vous êtes sous le coup d'une Mauvaise Rencontre en Persective." + addMsg, content: "Vous êtes sous le coup d'une Mauvaise Rencontre en Persective." + addMsg,
whisper: ChatUtility.getOwners(this) whisper: ChatUtility.getOwners(this)
}); })
} }
return rencSpecial; return rencSpecial
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -1723,7 +1717,7 @@ export class RdDActor extends RdDBaseActorSang {
ChatMessage.create({ ChatMessage.create({
content: `Vous êtes sous le coup d'Inertie Draconique : vous perdrez ${countInertieDraconique + 1} cases de Fatigue par déplacement au lieu d'une.`, content: `Vous êtes sous le coup d'Inertie Draconique : vous perdrez ${countInertieDraconique + 1} cases de Fatigue par déplacement au lieu d'une.`,
whisper: ChatUtility.getOwners(this) whisper: ChatUtility.getOwners(this)
}); })
} }
return countInertieDraconique + 1; return countInertieDraconique + 1;
} }
@@ -1731,11 +1725,11 @@ export class RdDActor extends RdDBaseActorSang {
/* -------------------------------------------- */ /* -------------------------------------------- */
async checkSoufflePeage(tmr) { async checkSoufflePeage(tmr) {
if ((tmr.type == 'pont' || tmr.type == 'cite') && EffetsDraconiques.isPeage(this)) { if ((tmr.type == 'pont' || tmr.type == 'cite') && EffetsDraconiques.isPeage(this)) {
await this.reveActuelIncDec(-1); await this.reveActuelIncDec(-1)
ChatMessage.create({ await ChatMessage.create({
content: "Vous êtes sous le coup d'un Péage : l'entrée sur cette case vous a coûté 1 Point de Rêve (déduit automatiquement).", content: "Vous êtes sous le coup d'un Péage : l'entrée sur cette case vous a coûté 1 Point de Rêve (déduit automatiquement).",
whisper: ChatUtility.getOwners(this) whisper: ChatUtility.getOwners(this)
}); })
} }
} }
@@ -1761,7 +1755,7 @@ export class RdDActor extends RdDBaseActorSang {
} }
if (reveActuel > rollData.depenseReve) { if (reveActuel > rollData.depenseReve) {
// Incrémenter/gére le bonus de case // Incrémenter/gére le bonus de case
RdDItemSort.incrementBonusCase(this, selectedSort, rollData.tmr.coord) await RdDItemSort.incrementBonusCase(this, selectedSort, rollData.tmr.coord)
if (rollData.isSortReserve) { if (rollData.isSortReserve) {
await this.sortMisEnReserve(selectedSort, rollData.competence, rollData.tmr.coord, Number(selectedSort.system.ptreve_reel)) await this.sortMisEnReserve(selectedSort, rollData.competence, rollData.tmr.coord, Number(selectedSort.system.ptreve_reel))
@@ -1794,7 +1788,7 @@ export class RdDActor extends RdDBaseActorSang {
await RdDRollResult.displayRollData(rollData, this, 'chat-resultat-sort.hbs') await RdDRollResult.displayRollData(rollData, this, 'chat-resultat-sort.hbs')
if (reveActuel == 0) { // 0 points de reve if (reveActuel == 0) { // 0 points de reve
ChatMessage.create({ content: this.name + " est réduit à 0 Points de Rêve, et tombe endormi !" }) await ChatMessage.create({ content: this.name + " est réduit à 0 Points de Rêve, et tombe endormi !" })
} }
if (!rollData.isSortReserve || !rolled.isSuccess) { if (!rollData.isSortReserve || !rolled.isSuccess) {
this.tmrApp?.close() this.tmrApp?.close()
@@ -1879,7 +1873,7 @@ export class RdDActor extends RdDBaseActorSang {
if (OptionsAvancees.isUsing(ROLL_DIALOG_V2)) { if (OptionsAvancees.isUsing(ROLL_DIALOG_V2)) {
const rollData = { const rollData = {
ids: { actorId: this.id }, ids: { actorId: this.id },
type: { allowed: [PART_COMP], current: PART_COMP }, type: { allowed: [ROLL_TYPE_COMP], current: ROLL_TYPE_COMP },
selected: { selected: {
carac: { key: caracName }, carac: { key: caracName },
comp: { key: compName, forced: options.forced }, comp: { key: compName, forced: options.forced },
@@ -1918,7 +1912,7 @@ export class RdDActor extends RdDBaseActorSang {
const rollData = { const rollData = {
ids: { actorId: this.id }, ids: { actorId: this.id },
selected: { tache: { key: tache.id, forced: options.forced } }, selected: { tache: { key: tache.id, forced: options.forced } },
type: { allowed: [PART_TACHE], current: PART_TACHE } type: { allowed: [ROLL_TYPE_TACHE], current: ROLL_TYPE_TACHE }
} }
return await RollDialog.create(rollData, options) return await RollDialog.create(rollData, options)
} }
@@ -2131,18 +2125,22 @@ export class RdDActor extends RdDBaseActorSang {
/* -------------------------------------------- */ /* -------------------------------------------- */
async rollAppelChance(onSuccess = () => { }, onEchec = () => { }) { async rollAppelChance(onSuccess = () => { }, onEchec = () => { }) {
await this.openRollDialog({
name: 'appelChance', return await RollDialog.create(
label: 'Appel à la chance', {
template: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-carac.hbs', ids: { actorId: this.id },
rollData: { selectedCarac: this.getCaracByName('chance-actuelle'), surprise: '' }, type: { allowed: [ROLL_TYPE_APPEL_CHANCE], current: ROLL_TYPE_APPEL_CHANCE },
callbacks: [{ action: r => this.$appelChanceResult(r, onSuccess, onEchec) }] },
}); {
onRollDone: (dialog, roll) => RollDialog.onRollDoneClose(dialog, roll),
callbacks: [
async roll => await this.$onAppelChance(roll, onSuccess, onEchec)
]
})
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async $appelChanceResult(rollData, onSuccess, onEchec) { async $onAppelChance(rollData, onSuccess, onEchec) {
await RdDRollResult.displayRollData(rollData, this, 'chat-resultat-appelchance.hbs')
if (rollData.rolled.isSuccess) { if (rollData.rolled.isSuccess) {
await this.setFlag(SYSTEM_RDD, 'utilisationChance', true); await this.setFlag(SYSTEM_RDD, 'utilisationChance', true);
await this.chanceActuelleIncDec(-1); await this.chanceActuelleIncDec(-1);
@@ -2157,7 +2155,7 @@ export class RdDActor extends RdDBaseActorSang {
async appelDestinee(onSuccess = () => { }, onEchec = () => { }) { async appelDestinee(onSuccess = () => { }, onEchec = () => { }) {
let destinee = this.system.compteurs.destinee?.value ?? 0; let destinee = this.system.compteurs.destinee?.value ?? 0;
if (destinee > 0) { if (destinee > 0) {
ChatMessage.create({ content: `<span class="rdd-roll-part">${this.name} a fait appel à la Destinée !</span>` }); await ChatMessage.create({ content: `<span class="rdd-roll-part">${this.name} a fait appel à la Destinée !</span>` });
await this.update({ 'system.compteurs.destinee.value ': destinee - 1 }) await this.update({ 'system.compteurs.destinee.value ': destinee - 1 })
onSuccess() onSuccess()
} }
@@ -2192,10 +2190,10 @@ export class RdDActor extends RdDBaseActorSang {
} }
if (this.checkDesirLancinant()) { if (this.checkDesirLancinant()) {
// Cas de désir lancinant, pas d'expérience sur particulière // Cas de désir lancinant, pas d'expérience sur particulière
ChatMessage.create({ await ChatMessage.create({
content: `Vous souffrez au moins d'un Désir Lancinant, vous ne pouvez pas gagner d'expérience sur une Particulière tant que le désir n'est pas assouvi`, content: `Vous souffrez au moins d'un Désir Lancinant, vous ne pouvez pas gagner d'expérience sur une Particulière tant que le désir n'est pas assouvi`,
whisper: ChatUtility.getOwners(this) whisper: ChatUtility.getOwners(this)
}); })
return [] return []
} }
@@ -2323,15 +2321,15 @@ export class RdDActor extends RdDBaseActorSang {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
countMonteeLaborieuse() { // Return +1 par queue/ombre/souffle Montée Laborieuse présente async countMonteeLaborieuse() { // Return +1 par queue/ombre/souffle Montée Laborieuse présente
let countMonteeLaborieuse = EffetsDraconiques.countMonteeLaborieuse(this); let countMonteeLaborieuse = EffetsDraconiques.countMonteeLaborieuse(this);
if (countMonteeLaborieuse > 0) { if (countMonteeLaborieuse > 0) {
ChatMessage.create({ await ChatMessage.create({
content: `Vous êtes sous le coup d'une Montée Laborieuse : vos montées en TMR coûtent ${countMonteeLaborieuse} Point de Rêve de plus.`, content: `Vous êtes sous le coup d'une Montée Laborieuse : vos montées en TMR coûtent ${countMonteeLaborieuse} Point de Rêve de plus.`,
whisper: ChatUtility.getOwners(this) whisper: ChatUtility.getOwners(this)
}); });
} }
return countMonteeLaborieuse; return countMonteeLaborieuse
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -2374,9 +2372,9 @@ export class RdDActor extends RdDBaseActorSang {
async _doDisplayTMR(mode) { async _doDisplayTMR(mode) {
let isRapide = mode == "rapide"; let isRapide = mode == "rapide";
if (mode != "visu") { if (mode != "visu") {
let minReveValue = (isRapide && !EffetsDraconiques.isDeplacementAccelere(this) ? 3 : 2) + this.countMonteeLaborieuse(); let minReveValue = (isRapide && !EffetsDraconiques.isDeplacementAccelere(this) ? 3 : 2) + (await this.countMonteeLaborieuse())
if (this.getReveActuel() < minReveValue) { if (this.getReveActuel() < minReveValue) {
ChatMessage.create({ await ChatMessage.create({
content: `Vous n'avez les ${minReveValue} Points de Reve nécessaires pour monter dans les Terres Médianes`, content: `Vous n'avez les ${minReveValue} Points de Reve nécessaires pour monter dans les Terres Médianes`,
whisper: ChatUtility.getOwners(this) whisper: ChatUtility.getOwners(this)
}); });
@@ -2418,15 +2416,16 @@ export class RdDActor extends RdDBaseActorSang {
if (!viewOnly) { if (!viewOnly) {
await this.supprimerSignesDraconiques(it => it.system.ephemere && it.system.duree == '1 round', { render: false }) await this.supprimerSignesDraconiques(it => it.system.ephemere && it.system.duree == '1 round', { render: false })
await this.setEffect(STATUSES.StatusDemiReve, false) await this.setEffect(STATUSES.StatusDemiReve, false)
ChatUtility.tellToUserAndGM(message) await ChatUtility.tellToUserAndGM(message)
} }
} }
} }
async supprimerSignesDraconiques(filter = it => true, options = { render: true }) { async supprimerSignesDraconiques(filter = it => true, options = { render: true }) {
const signes = this.itemTypes[ITEM_TYPES.signedraconique].filter(filter) const ids = this.itemTypes[ITEM_TYPES.signedraconique].filter(filter)
if (signes.length > 0) { .map(it => it.id)
this.deleteEmbeddedDocuments("Item", signes.map(item => item.id), options) if (ids.length > 0) {
await this.deleteEmbeddedDocuments("Item", ids, options)
} }
} }
@@ -2464,9 +2463,9 @@ export class RdDActor extends RdDBaseActorSang {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
verifierForceMin(item) { async verifierForceMin(item) {
if (item.type == 'arme' && item.system.force > parseInt(this.system.carac.force.value)) { if (item.type == 'arme' && item.system.force > parseInt(this.system.carac.force.value)) {
ChatMessage.create({ await 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})`
}); });
@@ -2476,11 +2475,11 @@ export class RdDActor extends RdDBaseActorSang {
/* -------------------------------------------- */ /* -------------------------------------------- */
async equiperObjet(item) { async equiperObjet(item) {
if (item?.isEquipable()) { if (item?.isEquipable()) {
const isEquipe = !item.system.equipe; const newEquipe = !item.system.equipe;
await item.update({ "system.equipe": isEquipe }) await item.update({ "system.equipe": newEquipe })
this.computeEncTotal() this.computeEncTotal()
if (isEquipe) if (newEquipe)
this.verifierForceMin(item) await this.verifierForceMin(item)
} }
} }
@@ -2742,25 +2741,25 @@ export class RdDActor extends RdDBaseActorSang {
/* -------------------------------------------- */ /* -------------------------------------------- */
async consommerPotionSoin(potion) { async consommerPotionSoin(potion) {
potion.alias = this.name; potion.alias = this.name
potion.supprimer = true; potion.supprimer = true
if (potion.system.magique) { if (potion.system.magique) {
// Gestion de la résistance: // Gestion de la résistance:
potion.rolled = await RdDResolutionTable.roll(this.getReveActuel(), -8); potion.rolled = await RdDResolutionTable.roll(this.getReveActuel(), -8)
if (potion.rolled.isEchec) { if (potion.rolled.isEchec) {
await this.reveActuelIncDec(-1); await this.reveActuelIncDec(-1);
potion.guerisonData = await this.buildPotionGuerisonList(potion.system.puissance); potion.guerisonData = await this.buildPotionGuerisonList(potion.system.puissance)
potion.guerisonMinutes = potion.guerisonData.pointsConsommes * 5; potion.guerisonMinutes = potion.guerisonData.pointsConsommes * 5
} }
} }
if (!potion.system.magique || potion.rolled.isSuccess) { if (!potion.system.magique || potion.rolled.isSuccess) {
await this.setBonusPotionSoin(potion.system.herbebonus); await this.setBonusPotionSoin(potion.system.herbebonus)
} }
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(this), whisper: ChatUtility.getOwners(this),
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-soin.hbs`, potion) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-soin.hbs`, potion)
}); })
} }
async setBonusPotionSoin(bonus) { async setBonusPotionSoin(bonus) {
@@ -2794,10 +2793,10 @@ export class RdDActor extends RdDBaseActorSang {
if (!potion.system.magique || potion.rolled.isSuccess) { if (!potion.system.magique || potion.rolled.isSuccess) {
this.bonusRepos = potion.system.herbebonus; this.bonusRepos = potion.system.herbebonus;
} }
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(this), whisper: ChatUtility.getOwners(this),
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-repos.hbs`, potion) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-repos.hbs`, potion)
}); })
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -2819,7 +2818,7 @@ export class RdDActor extends RdDBaseActorSang {
await this.createEmbeddedDocuments('Item', [newPotion]) await this.createEmbeddedDocuments('Item', [newPotion])
await this.diminuerQuantiteObjet(herbeData._id, herbeData.nbBrins) await this.diminuerQuantiteObjet(herbeData._id, herbeData.nbBrins)
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(this), whisper: ChatUtility.getOwners(this),
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-fabriquer-potion-base.hbs`, { content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-fabriquer-potion-base.hbs`, {
alias: this.getAlias(), alias: this.getAlias(),
@@ -2837,19 +2836,19 @@ export class RdDActor extends RdDBaseActorSang {
/* -------------------------------------------- */ /* -------------------------------------------- */
async consommerPotionGenerique(potion) { async consommerPotionGenerique(potion) {
potion.alias = this.name; potion.alias = this.name
if (potion.system.magique) { if (potion.system.magique) {
// Gestion de la résistance: // Gestion de la résistance:
potion.rolled = await RdDResolutionTable.roll(this.getReveActuel(), -8); potion.rolled = await RdDResolutionTable.roll(this.getReveActuel(), -8);
if (potion.rolled.isEchec) { if (potion.rolled.isEchec) {
await this.reveActuelIncDec(-1); await this.reveActuelIncDec(-1)
} }
} }
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(this), whisper: ChatUtility.getOwners(this),
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-generique.hbs`, potion) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-generique.hbs`, potion)
}); })
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -2912,7 +2911,7 @@ export class RdDActor extends RdDBaseActorSang {
let draconique = Draconique.all().find(it => it.match(item)); let draconique = Draconique.all().find(it => it.match(item));
if (draconique) { if (draconique) {
await draconique.onActorCreateOwned(this, item) await draconique.onActorCreateOwned(this, item)
this.notifyGestionTeteSouffleQueue(item, draconique.manualMessage()); await this.notifyGestionTeteSouffleQueue(item, draconique.manualMessage());
} }
await this.setInfoSommeilInsomnie(); await this.setInfoSommeilInsomnie();
} }
@@ -2968,8 +2967,8 @@ export class RdDActor extends RdDBaseActorSang {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
notifyGestionTeteSouffleQueue(item, manualMessage = true) { async notifyGestionTeteSouffleQueue(item, manualMessage = true) {
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(this), whisper: ChatUtility.getOwners(this),
content: `${this.name} a reçu un/une ${item.type}: ${item.name}, qui ${manualMessage ? "n'est pas" : "est"} géré(e) automatiquement. ${manualMessage ? manualMessage : ''}` content: `${this.name} a reçu un/une ${item.type}: ${item.name}, qui ${manualMessage ? "n'est pas" : "est"} géré(e) automatiquement. ${manualMessage ? manualMessage : ''}`
}); });
@@ -3016,7 +3015,7 @@ export class RdDActor extends RdDBaseActorSang {
const rollData = { const rollData = {
ids: { actorId: this.id }, ids: { actorId: this.id },
selected: { oeuvre: { key: oeuvre.id } }, selected: { oeuvre: { key: oeuvre.id } },
type: { allowed: [PART_OEUVRE], current: PART_OEUVRE, }, type: { allowed: [ROLL_TYPE_OEUVRE], current: ROLL_TYPE_OEUVRE, },
} }
return await RollDialog.create(rollData) return await RollDialog.create(rollData)
} }
@@ -3118,7 +3117,7 @@ export class RdDActor extends RdDBaseActorSang {
if (OptionsAvancees.isUsing(ROLL_DIALOG_V2)) { if (OptionsAvancees.isUsing(ROLL_DIALOG_V2)) {
const rollData = { const rollData = {
ids: { actorId: this.id }, ids: { actorId: this.id },
type: { allowed: [PART_CUISINE], current: PART_CUISINE }, type: { allowed: [ROLL_TYPE_CUISINE], current: ROLL_TYPE_CUISINE },
selected: { selected: {
cuisine: { key: recette.id } cuisine: { key: recette.id }
} }
@@ -3168,7 +3167,7 @@ export class RdDActor extends RdDBaseActorSang {
if (item.getUtilisationCuisine() == 'brut' && OptionsAvancees.isUsing(ROLL_DIALOG_V2)) { if (item.getUtilisationCuisine() == 'brut' && OptionsAvancees.isUsing(ROLL_DIALOG_V2)) {
const rollData = { const rollData = {
ids: { actorId: this.id }, ids: { actorId: this.id },
type: { allowed: [PART_CUISINE], current: PART_CUISINE }, type: { allowed: [ROLL_TYPE_CUISINE], current: ROLL_TYPE_CUISINE },
selected: { selected: {
cuisine: { key: item.id } cuisine: { key: item.id }
} }

View File

@@ -26,9 +26,8 @@ import { BASE_CORPS_A_CORPS, BASE_ESQUIVE, CATEGORIES_COMPETENCES_CREATURES } fr
import { RollDataAjustements } from "../rolldata-ajustements-v1.js"; import { RollDataAjustements } from "../rolldata-ajustements-v1.js";
import { MappingCreatureArme } from "../item/mapping-creature-arme.mjs"; import { MappingCreatureArme } from "../item/mapping-creature-arme.mjs";
import RollDialog from "../roll/roll-dialog.mjs"; import RollDialog from "../roll/roll-dialog.mjs";
import { DEFAULT_ROLL_TYPES, DIFF, ROLL_TYPE_ATTAQUE } from "../roll/roll-constants.mjs"; import { DEFAULT_ROLL_TYPES, DIFF, ROLL_TYPE_ATTAQUE, ROLL_TYPE_COMP, ROLL_TYPE_REVE_RESISTANCE } from "../roll/roll-constants.mjs";
import { OptionsAvancees, ROLL_DIALOG_V2 } from "../settings/options-avancees.js"; import { OptionsAvancees, ROLL_DIALOG_V2 } from "../settings/options-avancees.js";
import { PART_COMP } from "../roll/roll-part-comp.mjs";
import { RdDInitiative } from "../initiative.mjs"; import { RdDInitiative } from "../initiative.mjs";
import { RdDItemCompetenceCreature } from "../item-competencecreature.js"; import { RdDItemCompetenceCreature } from "../item-competencecreature.js";
import { RdDPossessionV2 } from "../rdd-possession-v2.mjs"; import { RdDPossessionV2 } from "../rdd-possession-v2.mjs";
@@ -145,7 +144,7 @@ export class RdDBaseActorReve extends RdDBaseActor {
} }
} }
listActions({ isAttaque = false, isEquipe = false }) { listActions() {
return this.itemTypes[ITEM_TYPES.competencecreature] return this.itemTypes[ITEM_TYPES.competencecreature]
.filter(it => it.isAttaque()) .filter(it => it.isAttaque())
.map(it => it.attaqueCreature()) .map(it => it.attaqueCreature())
@@ -156,7 +155,7 @@ export class RdDBaseActorReve extends RdDBaseActor {
async remiseANeuf() { } async remiseANeuf() { }
async ajoutExperience(rollData, hideChatMessage = 'show') { } async ajoutExperience(rollData, hideChatMessage = 'show') { }
computeResumeBlessure() { return []} computeResumeBlessure() { return [] }
countBlessures(filter = it => !it.isContusion()) { return 0 } countBlessures(filter = it => !it.isContusion()) { return 0 }
async santeIncDec(name, inc, isCritique) { } async santeIncDec(name, inc, isCritique) { }
@@ -169,10 +168,11 @@ export class RdDBaseActorReve extends RdDBaseActor {
} }
async finDeRoundSuppressionEffetsTermines(options) { async finDeRoundSuppressionEffetsTermines(options) {
for (let effect of this.getEffects()) { const effects = this.getEffects();
for (let effect of effects) {
if (effect.duration.type !== 'none' && (effect.duration.remaining <= 0 || options.terminer)) { if (effect.duration.type !== 'none' && (effect.duration.remaining <= 0 || options.terminer)) {
await effect.delete(); await effect.delete()
ChatMessage.create({ content: `${this.getAlias()} n'est plus ${Misc.lowerFirst(game.i18n.localize(effect.system.label))} !` }); await ChatMessage.create({ content: `${this.getAlias()} n'est plus ${Misc.lowerFirst(game.i18n.localize(effect.system.label))} !` })
} }
} }
} }
@@ -316,7 +316,7 @@ export class RdDBaseActorReve extends RdDBaseActor {
const competence = this.getCompetence(compName); const competence = this.getCompetence(compName);
const rollData = { const rollData = {
ids: { actorId: this.id }, ids: { actorId: this.id },
type: { allowed: DEFAULT_ROLL_TYPES, current: PART_COMP }, type: { allowed: DEFAULT_ROLL_TYPES, current: ROLL_TYPE_COMP },
selected: { selected: {
carac: { key: caracName }, carac: { key: caracName },
comp: { key: competence.name }, comp: { key: competence.name },
@@ -383,7 +383,7 @@ export class RdDBaseActorReve extends RdDBaseActor {
ids: { actorId: this.id }, ids: { actorId: this.id },
type: { type: {
allowed: DEFAULT_ROLL_TYPES, allowed: DEFAULT_ROLL_TYPES,
current: PART_COMP, current: ROLL_TYPE_COMP,
}, },
selected: { selected: {
diff: { type: DIFF.DEFAUT } diff: { type: DIFF.DEFAUT }
@@ -411,13 +411,33 @@ export class RdDBaseActorReve extends RdDBaseActor {
}) })
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async rollReveResistance(diff = -8) {
return await RollDialog.create(
{
ids: { actorId: this.id },
type: {
allowed: [ROLL_TYPE_REVE_RESISTANCE],
current: ROLL_TYPE_REVE_RESISTANCE,
resistance: true
},
selected: {
carac: { key: CARACS.REVE_ACTUEL, forced: true },
comp: { key: undefined, forced: true },
diff: { type: DIFF.DEFAUT, value: diff }
}
},
{
onRollDone: (dialog, roll) => RollDialog.onRollDoneClose(dialog, roll)
})
}
async rollReveActuel({ diff = 0, resistance = false }) { async rollReveActuel({ diff = 0, resistance = false }) {
if (OptionsAvancees.isUsing(ROLL_DIALOG_V2)) { if (OptionsAvancees.isUsing(ROLL_DIALOG_V2)) {
const rollData = { const rollData = {
ids: { actorId: this.id }, ids: { actorId: this.id },
type: { type: {
allowed: [PART_COMP], allowed: [ROLL_TYPE_REVE_RESISTANCE],
current: PART_COMP, current: ROLL_TYPE_REVE_RESISTANCE,
resistance: resistance resistance: resistance
}, },
selected: { selected: {
@@ -439,8 +459,8 @@ export class RdDBaseActorReve extends RdDBaseActor {
const rollData = { const rollData = {
ids: { actorId: this.id }, ids: { actorId: this.id },
type: { type: {
allowed: options.resistance ? [PART_COMP] : DEFAULT_ROLL_TYPES, allowed: options.resistance ? [ROLL_TYPE_COMP] : DEFAULT_ROLL_TYPES,
current: PART_COMP, current: options.resistance ? ROLL_TYPE_COMP : ROLL_TYPE_COMP,
resistance: options.resistance resistance: options.resistance
}, },
selected: { selected: {
@@ -615,7 +635,7 @@ export class RdDBaseActorReve extends RdDBaseActor {
RdDPossessionV2.rollAttaquePossession(this) RdDPossessionV2.rollAttaquePossession(this)
} }
verifierForceMin(item) { } async verifierForceMin(item) { }
/* -------------------------------------------- */ /* -------------------------------------------- */
async encaisser() { await RdDEncaisser.encaisser(this) } async encaisser() { await RdDEncaisser.encaisser(this) }
@@ -675,10 +695,10 @@ export class RdDBaseActorReve extends RdDBaseActor {
if (!encaissement.hasPlayerOwner && encaissement.endurance != 0) { if (!encaissement.hasPlayerOwner && encaissement.endurance != 0) {
encaissement = foundry.utils.duplicate(encaissement) encaissement = foundry.utils.duplicate(encaissement)
encaissement.isGM = true encaissement.isGM = true
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getGMs(), whisper: ChatUtility.getGMs(),
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-encaissement.hbs', encaissement) content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-encaissement.hbs', encaissement)
}); })
} }
} }

View File

@@ -36,7 +36,7 @@ export class RdDBaseActorSangSheet extends RdDBaseActorReveSheet {
async jetEndurance() { async jetEndurance() {
const endurance = this.actor.getEnduranceActuelle() const endurance = this.actor.getEnduranceActuelle()
const result = await this.actor.jetEndurance(endurance); const result = await this.actor.jetEndurance(endurance);
ChatMessage.create({ await ChatMessage.create({
content: `Jet d'Endurance : ${result.jetEndurance} / ${endurance} content: `Jet d'Endurance : ${result.jetEndurance} / ${endurance}
<br>${this.actor.name} a ${result.sonne ? 'échoué' : 'réussi'} son Jet d'Endurance ${result.sonne ? 'et devient Sonné' : ''}`, <br>${this.actor.name} a ${result.sonne ? 'échoué' : 'réussi'} son Jet d'Endurance ${result.sonne ? 'et devient Sonné' : ''}`,
whisper: ChatUtility.getOwners(this.actor) whisper: ChatUtility.getOwners(this.actor)

View File

@@ -351,11 +351,10 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
/* -------------------------------------------- */ /* -------------------------------------------- */
async jetDeVie() { async jetDeVie() {
if (this.isDead()) { if (this.isDead()) {
ChatMessage.create({ return await ChatMessage.create({
content: `Jet de Vie: ${this.getAlias()} est déjà mort, ce n'est pas la peine d'en rajouter !!!!!`, content: `Jet de Vie: ${this.getAlias()} est déjà mort, ce n'est pas la peine d'en rajouter !!!!!`,
whisper: ChatUtility.getOwners(this) whisper: ChatUtility.getOwners(this)
}) })
return
} }
const jetDeVie = await RdDDice.roll("1d20"); const jetDeVie = await RdDDice.roll("1d20");
const sConst = this.getSConst(); const sConst = this.getSConst();
@@ -380,7 +379,7 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
else if (prochainJet > 0) { else if (prochainJet > 0) {
msgText += `<br>Prochain jet de vie dans ${prochainJet} ${isCritique ? 'round' : 'minute'}${prochainJet > 1 ? 's' : ''} ${isCritique ? '(état critique)' : '(état grave)'}` msgText += `<br>Prochain jet de vie dans ${prochainJet} ${isCritique ? 'round' : 'minute'}${prochainJet > 1 ? 's' : ''} ${isCritique ? '(état critique)' : '(état grave)'}`
} }
ChatMessage.create({ return await ChatMessage.create({
content: msgText, content: msgText,
whisper: ChatUtility.getOwners(this) whisper: ChatUtility.getOwners(this)
}) })

View File

@@ -450,7 +450,7 @@ export class RdDBaseActor extends Actor {
msg = "Vous n'avez pas assez d'argent pour payer cette somme !"; msg = "Vous n'avez pas assez d'argent pour payer cette somme !";
} }
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(this), whisper: ChatUtility.getOwners(this),
content: msg content: msg
}) })
@@ -494,7 +494,7 @@ export class RdDBaseActor extends Actor {
await Monnaie.optimiserFortune(this, sols + this.getFortune()); await Monnaie.optimiserFortune(this, sols + this.getFortune());
RdDAudio.PlayContextAudio("argent"); // Petit son RdDAudio.PlayContextAudio("argent"); // Petit son
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(this), whisper: ChatUtility.getOwners(this),
content: `Vous avez reçu <strong>${sols} Sols</strong> ${fromActor ? " de " + fromActor.name : ''}, qui ont été ajoutés à votre argent.` content: `Vous avez reçu <strong>${sols} Sols</strong> ${fromActor ? " de " + fromActor.name : ''}, qui ont été ajoutés à votre argent.`
}) })
@@ -548,7 +548,7 @@ export class RdDBaseActor extends Actor {
} }
const chatAchatItem = foundry.utils.duplicate(achat.vente); const chatAchatItem = foundry.utils.duplicate(achat.vente);
chatAchatItem.quantiteTotal = quantite; chatAchatItem.quantiteTotal = quantite;
ChatMessage.create({ await ChatMessage.create({
user: achat.userId, user: achat.userId,
speaker: { alias: (acheteur ?? vendeur).getAlias() }, speaker: { alias: (acheteur ?? vendeur).getAlias() },
whisper: ChatUtility.getOwners(this), whisper: ChatUtility.getOwners(this),
@@ -893,7 +893,7 @@ export class RdDBaseActor extends Actor {
system: { description: this.system.description } system: { description: this.system.description }
} }
renderTemplate('systems/foundryvtt-reve-de-dragon/templates/post-actor.hbs', chatData) renderTemplate('systems/foundryvtt-reve-de-dragon/templates/post-actor.hbs', chatData)
.then(html => ChatMessage.create(RdDUtility.chatDataSetup(html, modeOverride))); .then(async html => await ChatMessage.create(RdDUtility.chatDataSetup(html, modeOverride)));
} }
actionImpossible(action) { actionImpossible(action) {
@@ -914,11 +914,7 @@ export class RdDBaseActor extends Actor {
isActorCombat() { return false } isActorCombat() { return false }
getCaracInit(competence) { return 0 } getCaracInit(competence) { return 0 }
listAttaques() { listActions() { return [] }
return this.listActions({ isAttaque: true, isEquipe: false })
}
listActions({ isAttaque = false, isEquipe = false }) { return [] }
listActionsPossessions() { listActionsPossessions() {
return this.itemTypes[ITEM_TYPES.possession] return this.itemTypes[ITEM_TYPES.possession]

View File

@@ -16,7 +16,7 @@ export class RdDTextEditor {
$(html).on("click", '.roll-text', async event => await RdDTextEditor.rollText(event)) $(html).on("click", '.roll-text', async event => await RdDTextEditor.rollText(event))
} }
static async enrichHTML(text, object, options = {showlink:true}) { static async enrichHTML(text, object, options = { showlink: true }) {
const context = { const context = {
text, text,
object, object,
@@ -70,9 +70,7 @@ export class RdDTextEditor {
options: { showLink: false } options: { showLink: false }
}, },
param) param)
ChatMessage.create({ await ChatMessage.create({ content: text })
content: text
})
} }
} }
} }

View File

@@ -116,20 +116,20 @@ export class ChatUtility {
return messageData return messageData
} }
static tellToUser(message) { static async tellToUser(message) {
ChatMessage.create({ content: message, user: game.user.id, whisper: [game.user.id] }); await ChatMessage.create({ content: message, user: game.user.id, whisper: [game.user.id] });
} }
static tellToGM(message) { static async tellToGM(message) {
ChatMessage.create({ await ChatMessage.create({
user: game.user.id, user: game.user.id,
content: message, content: message,
whisper: ChatUtility.getGMs() whisper: ChatUtility.getGMs()
}); })
} }
static tellToUserAndGM(message) { static async tellToUserAndGM(message) {
ChatMessage.create({ await ChatMessage.create({
user: game.user.id, user: game.user.id,
content: message, content: message,
whisper: ChatUtility.getUserAndGMs() whisper: ChatUtility.getUserAndGMs()

View File

@@ -71,28 +71,32 @@ export class RdDCoeur {
} }
static async applyCoeurChateauDormant(actor, message) { static async applyCoeurChateauDormant(actor, message) {
const newSuivants = foundry.utils.duplicate(actor.system.subacteurs.suivants)
let count = 0 let count = 0
newSuivants.forEach(async link => { let ajustMoral = 0
const newSuivants = actor.system.subacteurs.suivants.filter(link => game.actors.get(link.id) != undefined)
.map(link => {
const suivant = game.actors.get(link.id) const suivant = game.actors.get(link.id)
const prochainCoeur = link.prochainCoeur ?? 0; const prochainCoeur = link.prochainCoeur ?? 0
const coeurCourant = link.coeur ?? 0; const coeurCourant = link.coeur ?? 0
const diff = prochainCoeur - coeurCourant const diff = prochainCoeur - coeurCourant
if (diff < 0) { if (diff < 0) {
await actor.moralIncDec(-4); ajustMoral -= 4
link.coeur = Math.max(0, coeurCourant - 1) link.coeur = Math.max(0, coeurCourant - 1)
link.prochainCoeur = link.coeur link.prochainCoeur = link.coeur
message.content += `<br>Votre c&oelig;ur brisé pour ${suivant.name} vous fait perdre 4 points de moral, il vous reste ${link.coeur} points de C&oelig;ur.` message.content += `<br>Votre c&oelig;ur brisé pour ${suivant.name} vous fait perdre 4 points de moral, il vous reste ${link.coeur} points de C&oelig;ur.`
count++ count++
} }
else if (diff > 0) { if (diff > 0) {
link.coeur = Math.min(prochainCoeur, 4) link.coeur = Math.min(prochainCoeur, 4)
message.content += `<br>Votre c&oelig;ur bat fort, vous avez maintenant ${link.coeur} points de C&oelig;ur pour ${suivant.name}.` message.content += `<br>Votre c&oelig;ur bat fort, vous avez maintenant ${link.coeur} points de C&oelig;ur pour ${suivant.name}.`
link.prochainCoeur = link.coeur link.prochainCoeur = link.coeur
count++ count++
} }
return foundry.utils.duplicate(link)
})
if (ajustMoral != 0) {
await actor.moralIncDec(ajustMoral, 'Coeur')
} }
)
if (count > 0) { if (count > 0) {
await actor.update({ 'system.subacteurs.suivants': newSuivants }); await actor.update({ 'system.subacteurs.suivants': newSuivants });
} }

View File

@@ -7,7 +7,7 @@ import { TMRUtility } from "./tmr-utility.js";
export class DialogCreateSigneDraconique extends Dialog { export class DialogCreateSigneDraconique extends Dialog {
static async createSigneForActors() { static async createSigneForActors() {
const signe = await RdDItemSigneDraconique.randomSigneDraconique({ephemere: true}); const signe = await RdDItemSigneDraconique.randomSigneDraconique({ ephemere: true });
let dialogData = { let dialogData = {
signe: signe, signe: signe,
tmrs: TMRUtility.buildSelectionTypesTMR(signe.system.typesTMR), tmrs: TMRUtility.buildSelectionTypesTMR(signe.system.typesTMR),
@@ -38,23 +38,23 @@ export class DialogCreateSigneDraconique extends Dialog {
} }
async _onCreerSigneActeurs() { async _onCreerSigneActeurs() {
await this.html.find("[name='signe.system.ephemere']").change(); await this.html.find("[name='signe.system.ephemere']").change()
await this.html.find(".signe-xp-sort").change(); await this.html.find(".signe-xp-sort").change()
this.validerSigne(); this.validerSigne()
this.dialogData.actors.filter(it => it.selected) await Promise.all(this.dialogData.actors.filter(it => it.selected)
.map(it => game.actors.get(it.id)) .map(it => game.actors.get(it.id))
.forEach(actor => this._createSigneForActor(actor, this.dialogData.signe)); .map(async actor => await this._createSigneForActor(actor, this.dialogData.signe)))
} }
async _createSigneForActor(actor, signe) { async _createSigneForActor(actor, signe) {
actor.createEmbeddedDocuments("Item", [signe]); await actor.createEmbeddedDocuments("Item", [signe]);
ChatMessage.create({ await ChatMessage.createChatMessage.create({
whisper: ChatUtility.getOwners(actor), whisper: ChatUtility.getOwners(actor),
content: await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/chat-signe-draconique-actor.hbs", { content: await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/chat-signe-draconique-actor.hbs", {
signe: signe, signe: signe,
alias: actor.getAlias() alias: actor.getAlias()
}) })
}); })
} }
validerSigne() { validerSigne() {
@@ -81,7 +81,7 @@ export class DialogCreateSigneDraconique extends Dialog {
} }
async setSigneAleatoire() { async setSigneAleatoire() {
const newSigne = await RdDItemSigneDraconique.randomSigneDraconique({ephemere: true}); const newSigne = await RdDItemSigneDraconique.randomSigneDraconique({ ephemere: true });
this.html.find("[name='signe.name']").val(newSigne.name); this.html.find("[name='signe.name']").val(newSigne.name);
this.html.find("[name='signe.system.valeur.norm']").val(newSigne.system.valeur.norm); this.html.find("[name='signe.system.valeur.norm']").val(newSigne.system.valeur.norm);
@@ -92,7 +92,7 @@ export class DialogCreateSigneDraconique extends Dialog {
this.html.find("[name='signe.system.ephemere']").prop("checked", newSigne.system.ephemere); this.html.find("[name='signe.system.ephemere']").prop("checked", newSigne.system.ephemere);
this.dialogData.tmrs = TMRUtility.buildSelectionTypesTMR(newSigne.system.typesTMR); this.dialogData.tmrs = TMRUtility.buildSelectionTypesTMR(newSigne.system.typesTMR);
this.dialogData.tmrs.forEach(t => { this.dialogData.tmrs.forEach(t => {
this.html.find(`[data-tmr-name='${t.name}']`).prop( "checked", t.selected); this.html.find(`[data-tmr-name='${t.name}']`).prop("checked", t.selected);
}) })
this.setEphemere(newSigne.system.ephemere); this.setEphemere(newSigne.system.ephemere);
} }
@@ -113,7 +113,7 @@ export class DialogCreateSigneDraconique extends Dialog {
onSelectTmr(event) { onSelectTmr(event) {
const tmrName = this.html.find(event.currentTarget)?.data("tmr-name"); const tmrName = this.html.find(event.currentTarget)?.data("tmr-name");
const onTmr = this.dialogData.tmrs.find(it => it.name == tmrName); const onTmr = this.dialogData.tmrs.find(it => it.name == tmrName);
if (onTmr){ if (onTmr) {
onTmr.selected = event.currentTarget.checked; onTmr.selected = event.currentTarget.checked;
} }
} }

View File

@@ -91,7 +91,7 @@ export class RdDItemCompetence extends RdDItem {
archetypeWarning: newNiv > this.system.niveau_archetype archetypeWarning: newNiv > this.system.niveau_archetype
} }
if (display) { if (display) {
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(this.actor), whisper: ChatUtility.getOwners(this.actor),
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-competence-xp.hbs`, xpData) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-competence-xp.hbs`, xpData)
}) })

View File

@@ -153,10 +153,10 @@ export class RdDItemSort extends RdDItem {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static incrementBonusCase(actor, sort, coord) { static async incrementBonusCase(actor, sort, coord) {
let bonuscase = RdDItemSort.calculBonuscase(sort, coord) let bonuscase = RdDItemSort.calculBonuscase(sort, coord)
actor.updateEmbeddedDocuments('Item', [{ _id: sort._id, 'system.bonuscase': bonuscase }]); await actor.updateEmbeddedDocuments('Item', [{ _id: sort._id, 'system.bonuscase': bonuscase }]);
} }

View File

@@ -627,14 +627,14 @@ export class RdDItem extends Item {
system: { description: this.system.description }, system: { description: this.system.description },
properties: this.getProprietes(), properties: this.getProprietes(),
} }
renderTemplate(this.getChatItemTemplate(), chatData).then(html => { renderTemplate(this.getChatItemTemplate(), chatData).then(async html => {
let chatOptions = RdDUtility.chatDataSetup(html, modeOverride); let chatOptions = RdDUtility.chatDataSetup(html, modeOverride);
ChatMessage.create(chatOptions) await ChatMessage.create(chatOptions)
}); })
} }
getChatItemTemplate() { getChatItemTemplate() {
return 'systems/foundryvtt-reve-de-dragon/templates/post-item.hbs'; return 'systems/foundryvtt-reve-de-dragon/templates/post-item.hbs'
} }
static propertyIfDefined(name, val, condition = true) { static propertyIfDefined(name, val, condition = true) {

View File

@@ -6,7 +6,7 @@ import { RdDInitiative } from "../initiative.mjs";
import { MappingCreatureArme } from "./mapping-creature-arme.mjs"; import { MappingCreatureArme } from "./mapping-creature-arme.mjs";
import { Misc } from "../misc.js"; import { Misc } from "../misc.js";
const nomCategorieParade = { const categorie_parade = {
"sans-armes": "Sans arme", "sans-armes": "Sans arme",
"armes-naturelles": "Armes naturelles", "armes-naturelles": "Armes naturelles",
"hast": "Armes d'hast", "hast": "Armes d'hast",
@@ -18,6 +18,7 @@ const nomCategorieParade = {
"epees-lourdes": "Epées lourdes", "epees-lourdes": "Epées lourdes",
"haches": "Haches", "haches": "Haches",
"lances": "Lances", "lances": "Lances",
"masses": "Masses",
} }
export const ATTAQUE_TYPE = { export const ATTAQUE_TYPE = {
UNE_MAIN: '(1 main)', UNE_MAIN: '(1 main)',
@@ -122,7 +123,7 @@ export class RdDItemArme extends RdDItem {
/* -------------------------------------------- */ /* -------------------------------------------- */
static getNomCategorieParade(arme) { static getNomCategorieParade(arme) {
const categorie = arme?.system ? RdDItemArme.getCategorieParade(arme) : arme; const categorie = arme?.system ? RdDItemArme.getCategorieParade(arme) : arme;
return nomCategorieParade[categorie]; return categorie_parade[categorie];
} }
/* -------------------------------------------- */ /* -------------------------------------------- */

View File

@@ -21,7 +21,7 @@ export class RdDItemArmure extends RdDItem {
if (deterioration >= 10) { if (deterioration >= 10) {
deterioration -= 10; deterioration -= 10;
protection = this.calculProtectionDeterioree(); protection = this.calculProtectionDeterioree();
ChatMessage.create({ content: `Votre armure ${this.name} s'est détériorée, elle protège maintenant de ${protection}` }); await ChatMessage.create({ content: `Votre armure ${this.name} s'est détériorée, elle protège maintenant de ${protection}` });
} }
await this.update({ await this.update({
'system.deterioration': deterioration, 'system.deterioration': deterioration,

View File

@@ -54,7 +54,7 @@ export class RdDItemBlessure extends RdDItem {
} }
await this.createBlessure(actor, gravite) await this.createBlessure(actor, gravite)
ChatMessage.create({ await ChatMessage.create({
//TODO: hbs //TODO: hbs
content: `Blessure ${definition.label} appliquée à ${actor.name}<br>Perte d'endurance : ${lostEndurance} (${definition.endurance})<br>Perte de Vie : ${definition.vie}`, content: `Blessure ${definition.label} appliquée à ${actor.name}<br>Perte d'endurance : ${lostEndurance} (${definition.endurance})<br>Perte de Vie : ${definition.vie}`,
whisper: ChatUtility.getOwners(actor) whisper: ChatUtility.getOwners(actor)

View File

@@ -22,7 +22,7 @@ export class RdDItemMaladie extends RdDItem {
const souffrance = mal.system.identifie const souffrance = mal.system.identifie
? `de ${mal.name}` ? `de ${mal.name}`
: `d'un mal inconnu` : `d'un mal inconnu`
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(mal.actor), whisper: ChatUtility.getOwners(mal.actor),
content: `${mal.actor.name} souffre ${souffrance} (${Misc.typeName('Item', mal.type)}): vérifiez que les effets ne se sont pas aggravés !` content: `${mal.actor.name} souffre ${souffrance} (${Misc.typeName('Item', mal.type)}): vérifiez que les effets ne se sont pas aggravés !`
}) })

View File

@@ -354,7 +354,7 @@ class _10_4_6_ServicesEnCommerces extends Migration {
} }
async transformInventaireCommerce(service) { async transformInventaireCommerce(service) {
const serviceItems = (service.system.items ?? []); const serviceItems = (service.system.items ?? []);
const commerceItems = await Promise.all(serviceItems.map(async (it) => { return await this.transformToItemBoutique(it); })); const commerceItems = await Promise.all(serviceItems.map((it) => this.transformToItemBoutique(it)))
return commerceItems.concat(Monnaie.monnaiesStandard()); return commerceItems.concat(Monnaie.monnaiesStandard());
} }
@@ -434,7 +434,7 @@ class _10_7_0_MigrationBlessures extends Migration {
'system.blessures.graves.liste': [], 'system.blessures.graves.liste': [],
'system.blessures.critiques.liste': [] 'system.blessures.critiques.liste': []
}) })
})); }))
} }
creerBlessure(gravite, graviteTexte, blessure, timestamp) { creerBlessure(gravite, graviteTexte, blessure, timestamp) {
const dateBlessure = timestamp.addJours(-blessure.jours); const dateBlessure = timestamp.addJours(-blessure.jours);
@@ -786,6 +786,6 @@ export class Migrations {
} }
compareVersions(a, b) { compareVersions(a, b) {
return isNewerVersion(a.version, b.version) ? 1 : isNewerVersion(b.version, a.version) ? -1 : 0; return foundry.utils.isNewerVersion(a.version, b.version) ? 1 : foundry.utils.isNewerVersion(b.version, a.version) ? -1 : 0;
} }
} }

View File

@@ -4,9 +4,8 @@ import { SANS_COMPETENCE } from "../item/base-items.js"
import { Misc } from "../misc.js" import { Misc } from "../misc.js"
import { CARACS } from "../rdd-carac.js" import { CARACS } from "../rdd-carac.js"
import { RdDUtility } from "../rdd-utility.js" import { RdDUtility } from "../rdd-utility.js"
import { DIFF } from "../roll/roll-constants.mjs" import { DIFF, ROLL_TYPE_COMP } from "../roll/roll-constants.mjs"
import RollDialog from "../roll/roll-dialog.mjs" import RollDialog from "../roll/roll-dialog.mjs"
import { PART_COMP } from "../roll/roll-part-comp.mjs"
export const MORAL = { export const MORAL = {
MALHEUREUX: "malheureux", MALHEUREUX: "malheureux",
@@ -134,7 +133,7 @@ export class Apprecier {
const competence = (this.appreciation.jetComp && this.appreciation.competence) ? this.appreciation.competence : "" const competence = (this.appreciation.jetComp && this.appreciation.competence) ? this.appreciation.competence : ""
const rollData = { const rollData = {
ids: { actorId: this.actor.id }, ids: { actorId: this.actor.id },
type: { allowed: [PART_COMP], current: PART_COMP, appreciation: true }, type: { allowed: [ROLL_TYPE_COMP], current: ROLL_TYPE_COMP, appreciation: true },
selected: { selected: {
carac: { key: this.appreciation.carac, forced: true }, carac: { key: this.appreciation.carac, forced: true },
comp: { key: competence, forced: true }, comp: { key: competence, forced: true },
@@ -168,7 +167,7 @@ export class Apprecier {
async rollMoral(moral = undefined) { async rollMoral(moral = undefined) {
if (this.raisons.length > 0) { if (this.raisons.length > 0) {
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(this.actor), whisper: ChatUtility.getOwners(this.actor),
content: 'Pas de jet de moral:' + Misc.concat(this.raisons.map(r => `<br> - ${r}`)) content: 'Pas de jet de moral:' + Misc.concat(this.raisons.map(r => `<br> - ${r}`))
}) })
@@ -176,7 +175,6 @@ export class Apprecier {
} }
moral = moral ?? this.appreciation.moral moral = moral ?? this.appreciation.moral
// TODO: jet de moral
await this.actor.jetDeMoral(moral, this.appreciation.bonmoment) await this.actor.jetDeMoral(moral, this.appreciation.bonmoment)
} }
} }

View File

@@ -170,7 +170,7 @@ export class RdDCombatManager extends Combat {
} }
static getFirstInitRollFormula(actor) { static getFirstInitRollFormula(actor) {
const actions = actor.listActions({ isEquipe: true }) const actions = actor.listActions()
if (actions.length > 0) { if (actions.length > 0) {
const action = actions[0] const action = actions[0]
const init = RdDCombatManager.getInitData(actor, action) const init = RdDCombatManager.getInitData(actor, action)
@@ -199,8 +199,8 @@ export class RdDCombatManager extends Combat {
<div> <div>
Etant donné son ${action.name}, son initative pour ce premier round est désormais de ${initData.init}. Etant donné son ${action.name}, son initative pour ce premier round est désormais de ${initData.init}.
</div>` </div>`
ChatMessage.create({ content: msg }); ChatMessage.create({ content: msg })
game.combat.setInitiative(combatant._id, initData.init); game.combat.setInitiative(combatant._id, initData.init)
} }
} }
} }
@@ -307,7 +307,7 @@ export class RdDCombatManager extends Combat {
const possessions = actor.listActionsPossessions() const possessions = actor.listActionsPossessions()
const actions = possessions.length > 0 const actions = possessions.length > 0
? possessions ? possessions
: actor.listActions({ isEquipe: true }) : actor.listActions()
return Misc.indexed(actions) return Misc.indexed(actions)
} }
@@ -610,7 +610,7 @@ export class RdDCombat {
async proposerAjustementTirLancer(rollData) { async proposerAjustementTirLancer(rollData) {
if (['tir', 'lancer'].includes(rollData.competence.system.categorie)) { if (['tir', 'lancer'].includes(rollData.competence.system.categorie)) {
if (this.defender.isEntiteBlurette()) { if (this.defender.isEntiteBlurette()) {
ChatMessage.create({ await ChatMessage.create({
content: `<strong>La cible est une blurette, l'arme à distance sera perdue dans le blurêve`, content: `<strong>La cible est une blurette, l'arme à distance sera perdue dans le blurêve`,
whisper: ChatUtility.getGMs() whisper: ChatUtility.getGMs()
}) })
@@ -625,7 +625,7 @@ export class RdDCombat {
}, },
Distance.ajustements(_token, defenderToken, { arme: rollData.arme, main: rollData.competence.system.categorie }) Distance.ajustements(_token, defenderToken, { arme: rollData.arme, main: rollData.competence.system.categorie })
) )
ChatMessage.create({ await ChatMessage.create({
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-info-distance.hbs', info), content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-info-distance.hbs', info),
whisper: ChatUtility.getGMs() whisper: ChatUtility.getGMs()
}) })
@@ -644,7 +644,7 @@ export class RdDCombat {
opponentId: this.defender.id, opponentId: this.defender.id,
opponentTokenId: this.defenderTokenId, opponentTokenId: this.defenderTokenId,
}, },
type: { allowed: ['attaque'], current: 'attaque' }, type: { allowed: [ROLL_TYPE_ATTAQUE], current: ROLL_TYPE_ATTAQUE },
selected: {}, selected: {},
passeArme: foundry.utils.randomID(16), passeArme: foundry.utils.randomID(16),
} }
@@ -756,7 +756,7 @@ export class RdDCombat {
let rollData = this._prepareAttaque(competence, arme) let rollData = this._prepareAttaque(competence, arme)
console.log("RdDCombat.attaque >>>", rollData) console.log("RdDCombat.attaque >>>", rollData)
if (arme) { if (arme) {
this.attacker.verifierForceMin(arme); await this.attacker.verifierForceMin(arme);
} }
await this.proposerAjustementTirLancer(rollData) await this.proposerAjustementTirLancer(rollData)

View File

@@ -218,9 +218,6 @@ export class RdDCommands {
/* -------------------------------------------- */ /* -------------------------------------------- */
/* Manage chat commands */ /* Manage chat commands */
processChatCommand(commandLine, content = '', msg = {}) { processChatCommand(commandLine, content = '', msg = {}) {
// Setup new message's visibility
ChatUtility.applyRollMode(msg)
msg.type = 0;
if (!this.commandsTable) { if (!this.commandsTable) {
this._registerCommands() this._registerCommands()
@@ -228,6 +225,9 @@ export class RdDCommands {
let command = commandLine[0].toLowerCase(); let command = commandLine[0].toLowerCase();
if (this._isCommandHandled(command)) { if (this._isCommandHandled(command)) {
// Setup new message's visibility
ChatUtility.applyRollMode(msg)
msg.type = 0;
let params = commandLine.slice(1); let params = commandLine.slice(1);
this._processCommand(this.commandsTable, command, params, content, msg) this._processCommand(this.commandsTable, command, params, content, msg)
return true return true
@@ -367,7 +367,7 @@ export class RdDCommands {
const carac = params[0]; const carac = params[0];
const competence = length > 1 ? '/' + Misc.join(params.slice(1, length), ' ') : '' const competence = length > 1 ? '/' + Misc.join(params.slice(1, length), ' ') : ''
ChatMessage.create({ content: `@roll[${carac}${competence}/${diff}]` }) await ChatMessage.create({ content: `@roll[${carac}${competence}/${diff}]` })
} }
} }

View File

@@ -18,7 +18,7 @@ export class DeTMR extends foundry.dice.terms.Die {
static diceSoNiceData(system) { static diceSoNiceData(system) {
return { return {
type: "dt", type: "d8",
font: "HeuresDraconiques", font: "HeuresDraconiques",
fontScale: 0.8, fontScale: 0.8,
labels: ['1', '2', '3', '4', '5', '6', 'd', '0'], labels: ['1', '2', '3', '4', '5', '6', 'd', '0'],
@@ -56,7 +56,7 @@ export class DeDraconique extends foundry.dice.terms.Die {
static diceSoNiceData(system) { static diceSoNiceData(system) {
return { return {
type: "dr", type: "d8",
font: "HeuresDraconiques", font: "HeuresDraconiques",
fontScale: 0.8, fontScale: 0.8,
labels: ['1', '2', '3', '4', '5', '6', 'd', '0'], labels: ['1', '2', '3', '4', '5', '6', 'd', '0'],
@@ -96,7 +96,7 @@ export class DeHeure extends foundry.dice.terms.Die {
static diceSoNiceData(system) { static diceSoNiceData(system) {
return { return {
type: "dh", type: "d12",
font: "HeuresDraconiques", font: "HeuresDraconiques",
fontScale: 1.2, fontScale: 1.2,
labels: ['v', 'i', 'f', 'o', 'd', 'e', 'l', 's', 'p', 'a', 'r', 'c'], labels: ['v', 'i', 'f', 'o', 'd', 'e', 'l', 's', 'p', 'a', 'r', 'c'],

View File

@@ -377,7 +377,17 @@ export class SystemReveDeDragon {
/* -------------------------------------------- */ /* -------------------------------------------- */
game.system.rdd.calendrier = new RdDCalendrier() game.system.rdd.calendrier = new RdDCalendrier()
if (Misc.isFirstConnectedGM()) { if (Misc.isFirstConnectedGM()) {
try {
new Migrations().migrate() new Migrations().migrate()
}
catch (erreur) {
const message = `<p>Erreur lors de la migration du système Rêve de Dragon: ${erreur}</p><p>Plus de détails sont sans doute disponibles dans la console de Foundry/du navigateur.</p><p>Merci de nous signaler cetter erreur qu'on puisse ous aider et réparer le problème.</p>`
ui.notifications.error(message)
await ChatMessage.create({
user: game.user.id,
content: message
})
}
this.messageDeBienvenue() this.messageDeBienvenue()
import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter => { import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter => {
console.log("ClassCounter loaded", moduleCounter) console.log("ClassCounter loaded", moduleCounter)
@@ -399,7 +409,7 @@ export class SystemReveDeDragon {
if (!game.user.isGM && game.user.character == undefined) { if (!game.user.isGM && game.user.character == undefined) {
ui.notifications.info("Attention ! Vous n'êtes connecté à aucun personnage !") ui.notifications.info("Attention ! Vous n'êtes connecté à aucun personnage !")
ChatMessage.create({ ChatMessage.create({
content: "<b>ATTENTION</b> Le joueur " + game.user.name + " n'est connecté à aucun personnage !", content: `<b>ATTENTION</b> Le joueur ${game.user.name} n'est connecté à aucun personnage !`,
user: game.user.id user: game.user.id
}) })
} }

View File

@@ -117,7 +117,7 @@ export class RdDMeteo {
meteo.nuage.description = RdDMeteo.nuage(meteo.nuage.force); meteo.nuage.description = RdDMeteo.nuage(meteo.nuage.force);
meteo.pluie.description = RdDMeteo.pluie(meteo.pluie.force); meteo.pluie.description = RdDMeteo.pluie(meteo.pluie.force);
ChatMessage.create({ await ChatMessage.create({
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-meteo.hbs', meteo), content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-meteo.hbs', meteo),
whisper: ChatUtility.getGMs() whisper: ChatUtility.getGMs()
}); });

View File

@@ -49,7 +49,7 @@ export class RdDTMRDialog extends Dialog {
await PixiTMR.init() await PixiTMR.init()
let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-tmr.hbs', tmrData); let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-tmr.hbs', tmrData);
if (tmrData.mode != 'visu' && !game.user.isGM) { if (tmrData.mode != 'visu' && !game.user.isGM) {
ChatMessage.create({ content: actor.name + " est monté dans les TMR en mode : " + tmrData.mode, whisper: ChatUtility.getGMs() }); await ChatMessage.create({ content: actor.name + " est monté dans les TMR en mode : " + tmrData.mode, whisper: ChatUtility.getGMs() });
} }
return new RdDTMRDialog(html, actor, tmrData) return new RdDTMRDialog(html, actor, tmrData)
} }
@@ -138,7 +138,7 @@ export class RdDTMRDialog extends Dialog {
this.html.find('img.tmr-move').click(event => this.deplacementTMR(this.html.find(event.currentTarget)?.data('move'))); this.html.find('img.tmr-move').click(event => this.deplacementTMR(this.html.find(event.currentTarget)?.data('move')));
// Gestion du cout de montée en points de rêve // Gestion du cout de montée en points de rêve
await this.actor.reveActuelIncDec(this.calculCoutMonteeTMR()); await this.actor.reveActuelIncDec(await this.calculCoutMonteeTMR());
this.cumulFatigue += this.fatigueParCase; this.cumulFatigue += this.fatigueParCase;
// Le reste... // Le reste...
@@ -305,8 +305,8 @@ export class RdDTMRDialog extends Dialog {
await this.$checkQuitterTMR(); await this.$checkQuitterTMR();
} }
calculCoutMonteeTMR() { async calculCoutMonteeTMR() {
return ((this.tmrdata.isRapide && !EffetsDraconiques.isDeplacementAccelere(this.actor)) ? -2 : -1) - this.actor.countMonteeLaborieuse(); return ((this.tmrdata.isRapide && !EffetsDraconiques.isDeplacementAccelere(this.actor)) ? -2 : -1) - (await this.actor.countMonteeLaborieuse())
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -501,7 +501,7 @@ export class RdDTMRDialog extends Dialog {
rencData.poesie = { extrait: result.poesie, reference: result.reference }; rencData.poesie = { extrait: result.poesie, reference: result.reference };
rencData.message = this.$formatMessageRencontre(rencData, result.message); rencData.message = this.$formatMessageRencontre(rencData, result.message);
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(this.actor), whisper: ChatUtility.getOwners(this.actor),
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-rencontre-tmr.hbs`, rencData) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-rencontre-tmr.hbs`, rencData)
}); });
@@ -653,7 +653,7 @@ export class RdDTMRDialog extends Dialog {
this.restoreTMRAfterAction() this.restoreTMRAfterAction()
if (myRoll == 7) { if (myRoll == 7) {
ChatUtility.tellToUser(myRoll + ": Rencontre en " + coordTMR); ChatUtility.tellToUser(myRoll + ": Rencontre en " + coordTMR);
return await game.system.rdd.rencontresTMR.getRencontreAleatoire(tmr, this.actor.isMauvaiseRencontre()) return await game.system.rdd.rencontresTMR.getRencontreAleatoire(tmr, await this.actor.isMauvaiseRencontre())
} else { } else {
ChatUtility.tellToUser(myRoll + ": Pas de rencontre en " + coordTMR); ChatUtility.tellToUser(myRoll + ": Pas de rencontre en " + coordTMR);
return undefined; return undefined;
@@ -708,7 +708,7 @@ export class RdDTMRDialog extends Dialog {
return; return;
} }
rollData.poesie = await Poetique.getExtrait(); rollData.poesie = await Poetique.getExtrait();
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(this.actor), whisper: ChatUtility.getOwners(this.actor),
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-maitrise-tmr.hbs`, rollData) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-maitrise-tmr.hbs`, rollData)
}); });
@@ -728,16 +728,16 @@ export class RdDTMRDialog extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
isCaseHumide(tmr) { isCaseHumide(tmr) {
if (!(TMRUtility.isCaseHumide(tmr) || this.isCaseHumideAdditionelle(tmr))) { if (!(TMRUtility.isCaseHumide(tmr) || this.isCaseHumideAdditionelle(tmr))) {
return false; return false
} }
if (this.isCaseMaitrisee(tmr.coord)) { if (this.isCaseMaitrisee(tmr.coord)) {
ChatMessage.create({ ChatMessage.create({
content: tmr.label + ": cette case humide est déja maitrisée grâce à votre Tête <strong>Quête des Eaux</strong>", content: tmr.label + ": cette case humide est déja maitrisée grâce à votre Tête <strong>Quête des Eaux</strong>",
whisper: ChatUtility.getOwners(this.actor) whisper: ChatUtility.getOwners(this.actor)
}); })
return false; return false
} }
return true; return true
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -747,16 +747,16 @@ export class RdDTMRDialog extends Dialog {
content: tmr.label + ": Vous êtes sous le coup d'une Impraticabilité des Ponts : ce pont doit être maîtrisé comme une case humide.", content: tmr.label + ": Vous êtes sous le coup d'une Impraticabilité des Ponts : ce pont doit être maîtrisé comme une case humide.",
whisper: ChatUtility.getOwners(this.actor) whisper: ChatUtility.getOwners(this.actor)
}); });
return true; return true
} }
if (this.isCaseInondee(tmr.coord)) { if (this.isCaseInondee(tmr.coord)) {
ChatMessage.create({ ChatMessage.create({
content: tmr.label + ": cette case est inondée, elle doit être maîtrisée comme une case humide.", content: tmr.label + ": cette case est inondée, elle doit être maîtrisée comme une case humide.",
whisper: ChatUtility.getOwners(this.actor) whisper: ChatUtility.getOwners(this.actor)
}); });
return true; return true
} }
return false; return false
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@@ -825,7 +825,7 @@ export class RdDTMRDialog extends Dialog {
rollData.souffle = await this.actor.ajouterSouffle({ chat: false }) rollData.souffle = await this.actor.ajouterSouffle({ chat: false })
} }
rollData.poesie = await Poetique.getExtrait() rollData.poesie = await Poetique.getExtrait()
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(this.actor), whisper: ChatUtility.getOwners(this.actor),
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-maitrise-tmr.hbs`, rollData) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-maitrise-tmr.hbs`, rollData)
}) })
@@ -876,7 +876,7 @@ export class RdDTMRDialog extends Dialog {
const reserveSecurite = EffetsDraconiques.isReserveEnSecurite(this.actor); const reserveSecurite = EffetsDraconiques.isReserveEnSecurite(this.actor);
const reserveExtensible = this.isReserveExtensible(coord); const reserveExtensible = this.isReserveExtensible(coord);
if (!EffetsDraconiques.isUrgenceDraconique(this.actor) && (reserveSecurite || reserveExtensible)) { if (!EffetsDraconiques.isUrgenceDraconique(this.actor) && (reserveSecurite || reserveExtensible)) {
ChatMessage.create({ await ChatMessage.create({
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-demande-declencher-sort.hbs`, { content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-demande-declencher-sort.hbs`, {
actor: this.actor, actor: this.actor,
sorts: sorts, sorts: sorts,
@@ -892,13 +892,13 @@ export class RdDTMRDialog extends Dialog {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
lancerSortEnReserve(coord, sortId) { async lancerSortEnReserve(coord, sortId) {
const sort = this.getSortsReserve(coord) const sort = this.getSortsReserve(coord)
.find(it => it.id == sortId); .find(it => it.id == sortId);
if (sort) { if (sort) {
this.processSortReserve(sort); await this.processSortReserve(sort);
} else { } else {
ChatMessage.create({ await ChatMessage.create({
content: "Une erreur est survenue : impossible de récupérer le sort en réserve demandé.", content: "Une erreur est survenue : impossible de récupérer le sort en réserve demandé.",
whisper: ChatUtility.getOwners(this.actor) whisper: ChatUtility.getOwners(this.actor)
}); });

View File

@@ -49,7 +49,7 @@ export class RdDTokenHud {
static async addExtensionHudCombatV2(html, combatant, actor, token) { static async addExtensionHudCombatV2(html, combatant, actor, token) {
const isPossession = actor.listActionsPossessions().length > 0; const isPossession = actor.listActionsPossessions().length > 0;
const actionsCombat = isPossession ? [] : actor.listAttaques() const actionsCombat = isPossession ? [] : actor.listActions()
const ajustements = combatant?.initiative ? const ajustements = combatant?.initiative ?
[ [
{ label: 'Initiative +1', action: 'delta', value: 1 }, { label: 'Initiative +1', action: 'delta', value: 1 },

View File

@@ -132,9 +132,9 @@ export class RdDUtility {
'systems/foundryvtt-reve-de-dragon/templates/actor/carac-derivee.hbs', 'systems/foundryvtt-reve-de-dragon/templates/actor/carac-derivee.hbs',
'systems/foundryvtt-reve-de-dragon/templates/actor/carac-creature.hbs', 'systems/foundryvtt-reve-de-dragon/templates/actor/carac-creature.hbs',
'systems/foundryvtt-reve-de-dragon/templates/actor/carac-entitee.hbs', 'systems/foundryvtt-reve-de-dragon/templates/actor/carac-entitee.hbs',
'systems/foundryvtt-reve-de-dragon/templates/actor/carac-total.hbs',
'systems/foundryvtt-reve-de-dragon/templates/actor/comp-creature.hbs', 'systems/foundryvtt-reve-de-dragon/templates/actor/comp-creature.hbs',
'systems/foundryvtt-reve-de-dragon/templates/actor/comp-possession.hbs', 'systems/foundryvtt-reve-de-dragon/templates/actor/comp-possession.hbs',
'systems/foundryvtt-reve-de-dragon/templates/actor/carac-total.hbs',
'systems/foundryvtt-reve-de-dragon/templates/actor/competence.hbs', 'systems/foundryvtt-reve-de-dragon/templates/actor/competence.hbs',
'systems/foundryvtt-reve-de-dragon/templates/actor/competence-categorie.hbs', 'systems/foundryvtt-reve-de-dragon/templates/actor/competence-categorie.hbs',
'systems/foundryvtt-reve-de-dragon/templates/actor/xp-competences.hbs', 'systems/foundryvtt-reve-de-dragon/templates/actor/xp-competences.hbs',
@@ -173,6 +173,7 @@ export class RdDUtility {
'systems/foundryvtt-reve-de-dragon/templates/actor/liens-vehicules.hbs', 'systems/foundryvtt-reve-de-dragon/templates/actor/liens-vehicules.hbs',
'systems/foundryvtt-reve-de-dragon/templates/actor/commerce-inventaire.hbs', 'systems/foundryvtt-reve-de-dragon/templates/actor/commerce-inventaire.hbs',
'systems/foundryvtt-reve-de-dragon/templates/actor/commerce-inventaire-item.hbs', 'systems/foundryvtt-reve-de-dragon/templates/actor/commerce-inventaire-item.hbs',
'systems/foundryvtt-reve-de-dragon/templates/actor/tooltip-bonmoments.hbs',
//Items //Items
'systems/foundryvtt-reve-de-dragon/templates/scripts/autocomplete-script.hbs', 'systems/foundryvtt-reve-de-dragon/templates/scripts/autocomplete-script.hbs',
'systems/foundryvtt-reve-de-dragon/templates/scripts/autocomplete.hbs', 'systems/foundryvtt-reve-de-dragon/templates/scripts/autocomplete.hbs',
@@ -300,6 +301,7 @@ export class RdDUtility {
Handlebars.registerHelper('grammar-un', str => Grammar.articleIndetermine(str)); Handlebars.registerHelper('grammar-un', str => Grammar.articleIndetermine(str));
Handlebars.registerHelper('grammar-accord', (genre, ...args) => Grammar.accord(genre, args)); Handlebars.registerHelper('grammar-accord', (genre, ...args) => Grammar.accord(genre, args));
Handlebars.registerHelper('json-stringify', object => JSON.stringify(object)) Handlebars.registerHelper('json-stringify', object => JSON.stringify(object))
Handlebars.registerHelper('escapeHtml', object => foundry.utils.escapeHTML(object))
// math // math
Handlebars.registerHelper('math-sum', (...values) => values.slice(0, -1).reduce(Misc.sum(), 0)) Handlebars.registerHelper('math-sum', (...values) => values.slice(0, -1).reduce(Misc.sum(), 0))
@@ -750,12 +752,12 @@ export class RdDUtility {
actor.tmrApp.positionnerDemiReve(coord); actor.tmrApp.positionnerDemiReve(coord);
}); });
// Gestion spécifique des sorts en réserve multiples (ie têtes) // Gestion spécifique des sorts en réserve multiples (ie têtes)
$(html).on("click", '.declencher-sort-reserve', event => { $(html).on("click", '.declencher-sort-reserve', async event => {
let coord = event.currentTarget.attributes['data-tmr-coord'].value; let coord = event.currentTarget.attributes['data-tmr-coord'].value;
let sortId = event.currentTarget.attributes['data-sort-id'].value; let sortId = event.currentTarget.attributes['data-sort-id'].value;
let actorId = event.currentTarget.attributes['data-actor-id'].value; let actorId = event.currentTarget.attributes['data-actor-id'].value;
let actor = game.actors.get(actorId); let actor = game.actors.get(actorId);
actor.tmrApp.lancerSortEnReserve(coord, sortId); await actor.tmrApp.lancerSortEnReserve(coord, sortId);
// TODO: supprimer le message? // TODO: supprimer le message?
}); });
@@ -844,12 +846,12 @@ export class RdDUtility {
return game.user.character; return game.user.character;
} }
if (msgPlayer != undefined) { if (msgPlayer != undefined) {
msgPlayer += "<br>vous pouvez sélectionner un seul token lié à un personnage"; msgPlayer += "<br>vous pouvez sélectionner un seul token lié à un personnage"
msgPlayer += "<br>vous devez être connecté comme joueur avec un personnage sélectionné"; msgPlayer += "<br>vous devez être connecté comme joueur avec un personnage sélectionné";
ui.notifications.warn(msgPlayer); ui.notifications.warn(msgPlayer);
ChatMessage.create({ content: msgPlayer, whisper: [game.user] }); ChatMessage.create({ content: msgPlayer, whisper: [game.user] })
} }
return undefined; return undefined
} }
static doWithSelectedActor(onSelected = () => { }, filter = actor => true) { static doWithSelectedActor(onSelected = () => { }, filter = actor => true) {
@@ -942,9 +944,9 @@ export class RdDUtility {
content: `<p>Etes vous certain de vouloir supprimer: ${item.name}?</p>`, content: `<p>Etes vous certain de vouloir supprimer: ${item.name}?</p>`,
title: `Supprimer ${item.name}`, title: `Supprimer ${item.name}`,
buttonLabel: "Supprimer", buttonLabel: "Supprimer",
onAction: () => { onAction: async () => {
console.log('Delete : ', itemId); console.log('Delete : ', itemId);
actor.deleteEmbeddedDocuments('Item', [itemId], { renderSheet: false }); await actor.deleteEmbeddedDocuments('Item', [itemId], { renderSheet: false });
} }
}; };
if (item.isConteneurNonVide()) { if (item.isConteneurNonVide()) {
@@ -955,9 +957,9 @@ export class RdDUtility {
'deleteall': { 'deleteall': {
icon: '<i class="fas fa-check"></i>', icon: '<i class="fas fa-check"></i>',
label: "Supprimer conteneur et contenu", label: "Supprimer conteneur et contenu",
callback: () => { callback: async () => {
console.log("Delete : ", itemId); console.log("Delete : ", itemId);
actor.deleteAllConteneur(itemId, { renderSheet: false }); await actor.deleteAllConteneur(itemId, { renderSheet: false });
} }
} }
}); });
@@ -995,10 +997,10 @@ export class RdDUtility {
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
static checkThanatosXP(item) { static async checkThanatosXP(item) {
if (item.isCompetencePersonnage() && item.name.includes('Thanatos')) { if (item.isCompetencePersonnage() && item.name.includes('Thanatos')) {
let message = "Vous avez mis des points d'Expérience en Thanatos !<br>Vous devez réduire manuellement d'un même montant d'XP une autre compétence Draconique."; let message = "Vous avez mis des points d'Expérience en Thanatos !<br>Vous devez réduire manuellement d'un même montant d'XP une autre compétence Draconique.";
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getUserAndGMs(), whisper: ChatUtility.getUserAndGMs(),
content: message content: message
}); });

View File

@@ -47,8 +47,10 @@ export default class ChatRollResult {
{ {
content: await this.buildRollHtml(roll) content: await this.buildRollHtml(roll)
}, },
roll.active.actor, {
roll.current?.rollmode?.key actor: roll.active.actor,
rollMode: roll.current?.rollmode?.key
}
)) ))
await this.saveChatMessageRoll(chatMessage, roll, impacts) await this.saveChatMessageRoll(chatMessage, roll, impacts)
@@ -200,6 +202,7 @@ export default class ChatRollResult {
const chatMessage = ChatUtility.getChatMessage(event) const chatMessage = ChatUtility.getChatMessage(event)
const savedRoll = this.loadChatMessageRoll(chatMessage) const savedRoll = this.loadChatMessageRoll(chatMessage)
const actor = this.getActiveActor(savedRoll) const actor = this.getActiveActor(savedRoll)
Misc.doIfOwner(actor, it => it.rollAppelChance( Misc.doIfOwner(actor, it => it.rollAppelChance(
() => this.onAppelChanceSuccess(savedRoll, chatMessage), () => this.onAppelChanceSuccess(savedRoll, chatMessage),
() => this.onAppelChanceEchec(savedRoll, chatMessage)) () => this.onAppelChanceEchec(savedRoll, chatMessage))
@@ -208,6 +211,7 @@ export default class ChatRollResult {
async onAppelChanceSuccess(roll, chatMessage) { async onAppelChanceSuccess(roll, chatMessage) {
roll.type.retry = true roll.type.retry = true
roll.type.appelChance = true
await this.updateChatMessage(chatMessage, roll) await this.updateChatMessage(chatMessage, roll)
const callbacks = [ChatUtility.remover(chatMessage)] const callbacks = [ChatUtility.remover(chatMessage)]

View File

@@ -9,6 +9,8 @@ export const ROLL_TYPE_MEDITATION = 'meditation'
export const ROLL_TYPE_OEUVRE = 'oeuvre' export const ROLL_TYPE_OEUVRE = 'oeuvre'
export const ROLL_TYPE_SORT = 'sort' export const ROLL_TYPE_SORT = 'sort'
export const ROLL_TYPE_TACHE = 'tache' export const ROLL_TYPE_TACHE = 'tache'
export const ROLL_TYPE_APPEL_CHANCE = 'appel-chance'
export const ROLL_TYPE_REVE_RESISTANCE = 'reve-resistance'
export const ATTAQUE_ROLL_TYPES = [ROLL_TYPE_ATTAQUE] export const ATTAQUE_ROLL_TYPES = [ROLL_TYPE_ATTAQUE]
export const COMBAT_ROLL_TYPES = [ROLL_TYPE_ATTAQUE, ROLL_TYPE_DEFENSE] export const COMBAT_ROLL_TYPES = [ROLL_TYPE_ATTAQUE, ROLL_TYPE_DEFENSE]

View File

@@ -50,6 +50,8 @@ import { RollPartResistance } from "./roll-part-resistance.mjs";
import { RollTypePossession } from "./roll-type-possession.mjs"; import { RollTypePossession } from "./roll-type-possession.mjs";
import { RollPartPossession } from "./roll-part-possession.mjs"; import { RollPartPossession } from "./roll-part-possession.mjs";
import { RollPartApprecier } from "./roll-part-apprecier.mjs"; import { RollPartApprecier } from "./roll-part-apprecier.mjs";
import { RollTypeAppelChance } from "./roll-type-appel-chance.mjs";
import { RollTypeReveResistance } from "./roll-type-resistance.mjs";
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api
@@ -65,7 +67,8 @@ export const ALL_ROLL_TYPES = [
new RollTypeCuisine(), new RollTypeCuisine(),
new RollTypeOeuvre(), new RollTypeOeuvre(),
new RollTypeJeu(), new RollTypeJeu(),
// new RollTypeResistance ?? new RollTypeAppelChance(),
new RollTypeReveResistance(),
// new RollTypeFixedCarac ?? // new RollTypeFixedCarac ??
] ]
@@ -290,7 +293,6 @@ export default class RollDialog extends HandlebarsApplicationMixin(ApplicationV2
return rollData.type?.allowed return rollData.type?.allowed
? ROLL_PARTS.filter(p => RollDialog.$isIntersecting(rollData.type.allowed, p.rollTypes)) ? ROLL_PARTS.filter(p => RollDialog.$isIntersecting(rollData.type.allowed, p.rollTypes))
: ROLL_PARTS : ROLL_PARTS
} }
/** pre-configure les paramètres des différentes parties de la fenêtre (par exemple, prépare les listes de caractéristiques/compétences */ /** pre-configure les paramètres des différentes parties de la fenêtre (par exemple, prépare les listes de caractéristiques/compétences */

View File

@@ -35,7 +35,8 @@ export class RollPartAttaque extends RollPartSelect {
loadRefs(rollData) { loadRefs(rollData) {
const refs = this.getRefs(rollData) const refs = this.getRefs(rollData)
const attaques = rollData.active.actor.listAttaques() const attaques = rollData.active.actor.listActions()
.filter(it => !it.initOnly)
.sort(Misc.descending(it => it.comp?.system.niveau ?? -8)) .sort(Misc.descending(it => it.comp?.system.niveau ?? -8))
refs.all = attaques.map(it => RollPartAttaque.$extractAttaque(it, rollData)) refs.all = attaques.map(it => RollPartAttaque.$extractAttaque(it, rollData))
this.filterAttaquesInitiative(rollData) this.filterAttaquesInitiative(rollData)
@@ -186,7 +187,9 @@ export class RollPartAttaque extends RollPartSelect {
part.setDiff(rollData, { type: DIFF.DEFAUT }) part.setDiff(rollData, { type: DIFF.DEFAUT })
} }
else { else {
if (!rollData.type.appelChance){
part.setDiff(rollData, { type: DIFF.ATTAQUE, diff: current.initialDiff }) part.setDiff(rollData, { type: DIFF.ATTAQUE, diff: current.initialDiff })
}
current.initialDiff = undefined current.initialDiff = undefined
} }
break break

View File

@@ -27,7 +27,7 @@ export class RollPartComp extends RollPartSelect {
const selected = this.getSelected(rollData) const selected = this.getSelected(rollData)
const all = this.$getActorComps(rollData) const all = this.$getActorComps(rollData)
const selectedComp = selected.key const selectedComp = selected.key
if (selected.forced && selectedComp) { if (selected.forced && selectedComp!= undefined ) {
refs.all = all.filter(comp => Grammar.equalsInsensitive(comp.label, selectedComp)) refs.all = all.filter(comp => Grammar.equalsInsensitive(comp.label, selectedComp))
if (refs.all.length == 0) { if (refs.all.length == 0) {
if (selected.key && selected.key.length > 0) { if (selected.key && selected.key.length > 0) {
@@ -47,9 +47,12 @@ export class RollPartComp extends RollPartSelect {
const current = this.getCurrent(rollData) const current = this.getCurrent(rollData)
const selectedCarac = RollPart.getSelectedPart(rollData, PART_CARAC) const selectedCarac = RollPart.getSelectedPart(rollData, PART_CARAC)
const selectedDiff = RollPart.getSelectedPart(rollData, PART_DIFF) const selectedDiff = RollPart.getSelectedPart(rollData, PART_DIFF)
if (!rollData.type.appelChance){
this.rollPartCarac.selectByKey(rollData, selectedCarac?.key ?? current.comp.system.defaut_carac) this.rollPartCarac.selectByKey(rollData, selectedCarac?.key ?? current.comp.system.defaut_carac)
this.rollPartDiff.setDiff(rollData, selectedDiff?.value ?? current.comp.system.default_diffLibre) this.rollPartDiff.setDiff(rollData, selectedDiff?.value ?? current.comp.system.default_diffLibre)
} }
}
} }
choices(refs) { return refs.comps } choices(refs) { return refs.comps }

View File

@@ -10,6 +10,11 @@ export class RollPartConditions extends RollPart {
settingMin() { return RollPart.settingKey(this, 'min') } settingMin() { return RollPart.settingKey(this, 'min') }
settingMax() { return RollPart.settingKey(this, 'max') } settingMax() { return RollPart.settingKey(this, 'max') }
visible(rollData) {
const current = this.getCurrent(rollData)
return !current.hide
}
onReady(rollParts) { onReady(rollParts) {
game.settings.register(SYSTEM_RDD, this.settingMin(), game.settings.register(SYSTEM_RDD, this.settingMin(),
{ {
@@ -36,6 +41,7 @@ export class RollPartConditions extends RollPart {
restore(rollData) { restore(rollData) {
const current = this.getCurrent(rollData) const current = this.getCurrent(rollData)
current.value = this.getSaved(rollData)?.value ?? current.value ?? 0 current.value = this.getSaved(rollData)?.value ?? current.value ?? 0
current.hide = this.getSaved(rollData)?.hide
} }

View File

@@ -131,7 +131,11 @@ export class RollPartDefense extends RollPartSelect {
switch (part.code) { switch (part.code) {
case PART_CARAC: return part.filterCaracs(rollData, refs.defenses.length > 0 ? [current.carac] : ['impossible']) case PART_CARAC: return part.filterCaracs(rollData, refs.defenses.length > 0 ? [current.carac] : ['impossible'])
case PART_COMP: return part.filterComps(rollData, refs.defenses.length > 0 ? [current.comp?.name] : ['impossible']) case PART_COMP: return part.filterComps(rollData, refs.defenses.length > 0 ? [current.comp?.name] : ['impossible'])
case PART_DIFF: return part.setDiff(rollData, this.getDiffDefense(rollData)) case PART_DIFF:
if (!rollData.type.appelChance) {
return part.setDiff(rollData, this.getDiffDefense(rollData))
}
return
case PART_SIGN: return part.setArme(rollData, this.getArmeDisparate(rollData), current.forceRequise) case PART_SIGN: return part.setArme(rollData, this.getArmeDisparate(rollData), current.forceRequise)
} }
} }

View File

@@ -37,7 +37,7 @@ export class RollPartDiff extends RollPart {
} }
const current = this.getCurrent(rollData) const current = this.getCurrent(rollData)
/* TODO: affiner les cas où afficher ou non. devrait s'afficher pour les jets basiques (même si pas d'opposant sélectionné)*/ /* TODO: affiner les cas où afficher ou non. devrait s'afficher pour les jets basiques (même si pas d'opposant sélectionné)*/
return Object.values(DIFF).includes(current.type) return (DIFF.AUCUN !=current.type) && Object.values(DIFF).includes(current.type)
} }
prepareContext(rollData) { prepareContext(rollData) {

View File

@@ -0,0 +1,31 @@
import { CARACS } from "../rdd-carac.js"
import { DIFF, ROLL_TYPE_APPEL_CHANCE } from "./roll-constants.mjs"
import { RollType } from "./roll-type.mjs"
export class RollTypeAppelChance extends RollType {
get code() { return ROLL_TYPE_APPEL_CHANCE }
get name() { return `fait appel à la chance` }
get icon() { return `systems/foundryvtt-reve-de-dragon/assets/ui/chance.svg` }
get chatResultTemplate() { return `systems/foundryvtt-reve-de-dragon/templates/roll/result/chat-appel-chance.hbs` }
title(rollData) {
return this.name
}
setRollDataType(rollData) {
foundry.utils.mergeObject(rollData, {
selected: {
carac: { key: CARACS.CHANCE_ACTUELLE, forced: true },
diff: { value: 0, type: '' },
comp: { key: '', forced: true },
conditions: { hide: true }
}
})
super.setRollDataType(rollData)
}
onSelect(rollData) {
this.setDiffType(rollData, DIFF.AUCUN)
}
}

View File

@@ -9,7 +9,8 @@ export class RollTypeCuisine extends RollType {
get code() { return ROLL_TYPE_CUISINE } get code() { return ROLL_TYPE_CUISINE }
get name() { return `Cuisiner un plat` } get name() { return `Cuisiner un plat` }
visible(rollData) { return rollData.active.actor.isPersonnage() } visible(rollData) { return rollData.active.actor.isPersonnage()
&& rollData.active.actor.getCompetence('Cuisine') != undefined }
title(rollData) { title(rollData) {
const current = rollData.current[PART_CUISINE] const current = rollData.current[PART_CUISINE]
return current.recette ? `prépare une recette: ${current.label}` : `prépare: ${current.label}` return current.recette ? `prépare une recette: ${current.label}` : `prépare: ${current.label}`

View File

@@ -8,7 +8,10 @@ export class RollTypeJeu extends RollType {
get code() { return ROLL_TYPE_JEU } get code() { return ROLL_TYPE_JEU }
get name() { return `Jouer` } get name() { return `Jouer` }
visible(rollData) { return rollData.active.actor.isPersonnage() } visible(rollData) {
return rollData.active.actor.isPersonnage()
&& rollData.active.actor.getCompetence('Jeu') != undefined
}
title(rollData) { title(rollData) {
if (rollData.opponent) { if (rollData.opponent) {
return `joue contre` return `joue contre`

View File

@@ -0,0 +1,31 @@
import { CARACS } from "../rdd-carac.js"
import { DIFF, ROLL_TYPE_REVE_RESISTANCE } from "./roll-constants.mjs"
import { RollType } from "./roll-type.mjs"
export class RollTypeReveResistance extends RollType {
get code() { return ROLL_TYPE_REVE_RESISTANCE }
get name() { return `fait un jet de résistance` }
get icon() { return `systems/foundryvtt-reve-de-dragon/assets/ui/resistance.svg` }
get chatResultTemplate() { return `systems/foundryvtt-reve-de-dragon/templates/roll/result/chat-reve-resistance.hbs` }
title(rollData) {
return this.name
}
setRollDataType(rollData) {
foundry.utils.mergeObject(rollData, {
selected: {
carac: { key: CARACS.REVE_ACTUEL, forced: true },
diff: { value: -8, type: '' },
comp: { key: '', forced: true },
conditions: { hide: true }
}
})
super.setRollDataType(rollData)
}
onSelect(rollData) {
this.setDiffType(rollData, DIFF.DEFAUT)
}
}

View File

@@ -14,7 +14,7 @@ export class RollType {
return { code: this.code, name: this.name, icon: this.icon, section: 'type', template: this.template, selected: this.isSelected(rollData) } return { code: this.code, name: this.name, icon: this.icon, section: 'type', template: this.template, selected: this.isSelected(rollData) }
} }
prepare(rollData){} prepare(rollData) {}
isAllowed(rollData) { return rollData.type.allowed == undefined || rollData.type.allowed.includes(this.code) } isAllowed(rollData) { return rollData.type.allowed == undefined || rollData.type.allowed.includes(this.code) }
visible(rollData) { return true } visible(rollData) { return true }
title(rollData) { return this.code } title(rollData) { return this.code }

View File

@@ -10,7 +10,7 @@ const listeReglesOptionnelles = [
{ group: 'Récupération', name: 'recuperation-reve', descr: "Récupérer le rêve pendant la nuit (les jets sont toujours faits pour les Rêves de Dragons)"}, { group: 'Récupération', name: 'recuperation-reve', descr: "Récupérer le rêve pendant la nuit (les jets sont toujours faits pour les Rêves de Dragons)"},
{ group: 'Récupération', name: 'recuperation-moral', descr: "Le moral revient vers 0 durant Château Dormant"}, { group: 'Récupération', name: 'recuperation-moral', descr: "Le moral revient vers 0 durant Château Dormant"},
{ group: 'Règles de combat', name: 'armes-equipees', descr: "Proposer uniquement les armes équipées au combat", default: false},
{ group: 'Règles de combat', name: 'localisation-aleatoire', descr: "Proposer une localisation aléatoire des blessures" }, { group: 'Règles de combat', name: 'localisation-aleatoire', descr: "Proposer une localisation aléatoire des blessures" },
{ group: 'Règles de combat', name: 'recul', descr: "Appliquer le recul en cas de particulière en force ou de charge" }, { group: 'Règles de combat', name: 'recul', descr: "Appliquer le recul en cas de particulière en force ou de charge" },
{ group: 'Règles de combat', name: 'acrobatie-pour-recul', descr: "L'acrobatie aide à ne pas chuter en cas de recul" , default: false }, { group: 'Règles de combat', name: 'acrobatie-pour-recul', descr: "L'acrobatie aide à ne pas chuter en cas de recul" , default: false },

View File

@@ -8,7 +8,7 @@ export class DialogRepos extends Dialog {
if (!actor.isPersonnage()) { if (!actor.isPersonnage()) {
return return
} }
if (!ReglesOptionnelles.isUsing("chateau-dormant-gardien") || !actor.hasPlayerOwner) { if (!ReglesOptionnelles.isUsing("chateau-dormant-gardien") || !actor.isPersonnageJoueur()) {
foundry.utils.mergeObject(actor.system.sommeil, { foundry.utils.mergeObject(actor.system.sommeil, {
"nouveaujour": true, "nouveaujour": true,
"insomnie": EffetsDraconiques.isSujetInsomnie(actor), "insomnie": EffetsDraconiques.isSujetInsomnie(actor),

View File

@@ -280,7 +280,7 @@ export class RdDCalendrier extends Application {
/* -------------------------------------------- */ /* -------------------------------------------- */
async setNewTimestamp(newTimestamp) { async setNewTimestamp(newTimestamp) {
const oldTimestamp = this.timestamp; const oldTimestamp = this.timestamp;
await Promise.all(game.actors.map(async actor => await actor.onTimeChanging(oldTimestamp, newTimestamp))); await Promise.all(game.actors.map(actor => actor.onTimeChanging(oldTimestamp, newTimestamp)))
RdDTimestamp.setWorldTime(newTimestamp); RdDTimestamp.setWorldTime(newTimestamp);
if (oldTimestamp.indexDate + 1 == newTimestamp.indexDate && ReglesOptionnelles.isUsing("chateau-dormant-gardien")) { if (oldTimestamp.indexDate + 1 == newTimestamp.indexDate && ReglesOptionnelles.isUsing("chateau-dormant-gardien")) {
await DialogChateauDormant.create(); await DialogChateauDormant.create();

View File

@@ -103,7 +103,7 @@ export class EffetsRencontre {
tete: context.rolled.isPart, tete: context.rolled.isPart,
poesie: await Poetique.getExtrait() poesie: await Poetique.getExtrait()
}) })
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(context.actor), whisper: ChatUtility.getOwners(context.actor),
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-reve-de-dragon.hbs`, context) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-reve-de-dragon.hbs`, context)
}); });
@@ -118,7 +118,7 @@ export class EffetsRencontre {
context.queues.push(await context.actor.ajouterQueue()); context.queues.push(await context.actor.ajouterQueue());
} }
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(context.actor), whisper: ChatUtility.getOwners(context.actor),
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-reve-de-dragon.hbs`, context) content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-reve-de-dragon.hbs`, context)
}); });

View File

@@ -27,13 +27,13 @@ export class PresentCites extends Draconique {
async _ajouterPresents(actor, tete) { async _ajouterPresents(actor, tete) {
let existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord); let existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord);
if (existants.length > 0) { if (existants.length > 0) {
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(actor), whisper: ChatUtility.getOwners(actor),
content: "Vous avez encore des présents dans des cités, vous devrez tirer une autre tête pour remplacer celle ci!" content: "Vous avez encore des présents dans des cités, vous devrez tirer une autre tête pour remplacer celle ci!"
}) })
} }
else { else {
let cites = TMRUtility.filterTMR(it => it.type == 'cite'); let cites = TMRUtility.filterTMR(it => it.type == 'cite')
for (let tmr of cites) { for (let tmr of cites) {
await this.createCaseTmr(actor, 'Présent', tmr, tete.id); await this.createCaseTmr(actor, 'Présent', tmr, tete.id);
} }
@@ -43,7 +43,7 @@ export class PresentCites extends Draconique {
async choisirUnPresent(casetmr, onChoixPresent) { async choisirUnPresent(casetmr, onChoixPresent) {
const presents = await game.system.rdd.rencontresTMR.getPresentsCite() const presents = await game.system.rdd.rencontresTMR.getPresentsCite()
const buttons = {}; const buttons = {};
presents.forEach(r => buttons['present'+r.id] = { icon: '<i class="fas fa-check"></i>', label: r.name, callback: async () => onChoixPresent(r) }); presents.forEach(r => buttons['present' + r.id] = { icon: '<i class="fas fa-check"></i>', label: r.name, callback: async () => onChoixPresent(r) });
let dialog = new Dialog({ let dialog = new Dialog({
title: "Présent des cités", title: "Présent des cités",
content: `La ${this.tmrLabel(casetmr)} vous offre un présent, faites votre choix`, content: `La ${this.tmrLabel(casetmr)} vous offre un présent, faites votre choix`,

View File

@@ -18,7 +18,7 @@ export class UrgenceDraconique extends Draconique {
if (coordSortsReserve.length == 0) { if (coordSortsReserve.length == 0) {
// La queue se transforme en idée fixe // La queue se transforme en idée fixe
const ideeFixe = await RdDRollTables.getIdeeFixe(); const ideeFixe = await RdDRollTables.getIdeeFixe();
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(actor), whisper: ChatUtility.getOwners(actor),
content: `En l'absence de sorts en réserve, l'urgence draconique de ${actor.name} se transforme en ${ideeFixe.name}` content: `En l'absence de sorts en réserve, l'urgence draconique de ${actor.name} se transforme en ${ideeFixe.name}`
}); });

View File

@@ -174,7 +174,7 @@ export class DialogFatigueVoyage extends Dialog {
.filter(it => it.selected) .filter(it => it.selected)
.forEach(async it => { .forEach(async it => {
const perteFatigue = fatigueBase + it.ajustement const perteFatigue = fatigueBase + it.ajustement
ChatMessage.create({ await ChatMessage.create({
whisper: ChatUtility.getOwners(it.actor), whisper: ChatUtility.getOwners(it.actor),
content: await renderTemplate( content: await renderTemplate(
'systems/foundryvtt-reve-de-dragon/templates/voyage/chat-fatigue_voyage.hbs', 'systems/foundryvtt-reve-de-dragon/templates/voyage/chat-fatigue_voyage.hbs',

View File

@@ -14,7 +14,7 @@
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "^9.8.0", "@eslint/js": "^9.8.0",
"@foundryvtt/foundryvtt-cli": "^1.0.3", "@foundryvtt/foundryvtt-cli": "^3.0.3",
"commander": "^11.1.0", "commander": "^11.1.0",
"eslint": "^9.9.0", "eslint": "^9.9.0",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",

View File

@@ -2347,7 +2347,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: dagues
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2395,7 +2395,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 7 resistance: 7
categorie_parade: '' categorie_parade: masses
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2443,7 +2443,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: masses
dommages: 2 dommages: 2
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2611,7 +2611,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 6 resistance: 6
categorie_parade: '' categorie_parade: haches
dommages: 2 dommages: 2
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2418,7 +2418,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 5 resistance: 5
categorie_parade: '' categorie_parade: lances
dommages: 2 dommages: 2
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2466,7 +2466,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 15 resistance: 15
categorie_parade: '' categorie_parade: boucliers
dommages: 0 dommages: 0
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2378,7 +2378,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 15 resistance: 15
categorie_parade: '' categorie_parade: boucliers
dommages: 0 dommages: 0
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2527,7 +2527,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 14 resistance: 14
categorie_parade: '' categorie_parade: epees-lourdes
dommages: 4/5 dommages: 4/5
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2347,7 +2347,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: dagues
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2735,7 +2735,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 6 resistance: 6
categorie_parade: '' categorie_parade: haches
dommages: 2 dommages: 2
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2378,7 +2378,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 15 resistance: 15
categorie_parade: '' categorie_parade: boucliers
dommages: 0 dommages: 0
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2665,7 +2665,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 10 resistance: 10
categorie_parade: '' categorie_parade: masses
dommages: 3/4 dommages: 3/4
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2354,7 +2354,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 15 resistance: 15
categorie_parade: '' categorie_parade: epees-lourdes
dommages: 3/4 dommages: 3/4
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2402,7 +2402,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: dagues
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2548,7 +2548,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 13 resistance: 13
categorie_parade: '' categorie_parade: boucliers
dommages: 0 dommages: 0
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2354,7 +2354,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 15 resistance: 15
categorie_parade: '' categorie_parade: epees-lourdes
dommages: 3/4 dommages: 3/4
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2402,7 +2402,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: dagues
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2480,7 +2480,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 15 resistance: 15
categorie_parade: '' categorie_parade: boucliers
dommages: 0 dommages: 0
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2390,7 +2390,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 15 resistance: 15
categorie_parade: '' categorie_parade: epees-lourdes
dommages: 3/4 dommages: 3/4
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2438,7 +2438,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: dagues
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2516,7 +2516,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 13 resistance: 13
categorie_parade: '' categorie_parade: boucliers
dommages: 0 dommages: 0
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2564,7 +2564,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 5 resistance: 5
categorie_parade: '' categorie_parade: lances
dommages: 2 dommages: 2
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2390,7 +2390,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 15 resistance: 15
categorie_parade: '' categorie_parade: epees-lourdes
dommages: 3/4 dommages: 3/4
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2438,7 +2438,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: dagues
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2516,7 +2516,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 15 resistance: 15
categorie_parade: '' categorie_parade: boucliers
dommages: 0 dommages: 0
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2653,7 +2653,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: dagues
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2706,7 +2706,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 1 resistance: 1
categorie_parade: '' categorie_parade: dagues
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2653,7 +2653,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: dagues
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2706,7 +2706,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 1 resistance: 1
categorie_parade: '' categorie_parade: dagues
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2711,7 +2711,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: dagues
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2345,7 +2345,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: dagues
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2346,7 +2346,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: dagues
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2313,7 +2313,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: dagues
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2346,7 +2346,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: dagues
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2424,7 +2424,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: masses
dommages: 2 dommages: 2
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2346,7 +2346,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: dagues
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2424,7 +2424,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: masses
dommages: 2 dommages: 2
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -22,7 +22,7 @@ system:
rarete: Frequente rarete: Frequente
frequence: 18 frequence: 18
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: batons
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -27,7 +27,7 @@ system:
rarete: Frequente rarete: Frequente
frequence: 18 frequence: 18
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: dagues
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -22,7 +22,7 @@ system:
rarete: Frequente rarete: Frequente
frequence: 18 frequence: 18
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: batons
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -22,7 +22,7 @@ system:
rarete: Frequente rarete: Frequente
frequence: 18 frequence: 18
resistance: 7 resistance: 7
categorie_parade: '' categorie_parade: masses
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -22,7 +22,7 @@ system:
rarete: Frequente rarete: Frequente
frequence: 18 frequence: 18
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: masses
dommages: 2 dommages: 2
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -22,7 +22,7 @@ system:
rarete: Frequente rarete: Frequente
frequence: 18 frequence: 18
resistance: 10 resistance: 10
categorie_parade: '' categorie_parade: masses
dommages: 3/4 dommages: 3/4
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -22,7 +22,7 @@ system:
rarete: Frequente rarete: Frequente
frequence: 18 frequence: 18
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: masses
dommages: 2 dommages: 2
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2417,7 +2417,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 5 resistance: 5
categorie_parade: '' categorie_parade: lances
dommages: 2 dommages: 2
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2466,7 +2466,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 13 resistance: 13
categorie_parade: '' categorie_parade: boucliers
dommages: 0 dommages: 0
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2569,7 +2569,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 5 resistance: 5
categorie_parade: '' categorie_parade: lances
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2382,7 +2382,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 12 resistance: 12
categorie_parade: '' categorie_parade: epees-longues
dommages: 3 dommages: 3
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2441,7 +2441,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 15 resistance: 15
categorie_parade: '' categorie_parade: epees-lourdes
dommages: 3/4 dommages: 3/4
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2380,7 +2380,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: haches
dommages: 3/4 dommages: 3/4
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2429,7 +2429,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 10 resistance: 10
categorie_parade: '' categorie_parade: masses
dommages: 3/4 dommages: 3/4
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2380,7 +2380,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 10 resistance: 10
categorie_parade: '' categorie_parade: masses
dommages: 3/4 dommages: 3/4
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2380,7 +2380,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 10 resistance: 10
categorie_parade: '' categorie_parade: masses
dommages: 3/4 dommages: 3/4
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2434,7 +2434,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 5 resistance: 5
categorie_parade: '' categorie_parade: lances
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2420,7 +2420,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 12 resistance: 12
categorie_parade: '' categorie_parade: epees-courtes
dommages: 2 dommages: 2
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2380,7 +2380,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 10 resistance: 10
categorie_parade: '' categorie_parade: masses
dommages: 3/3 dommages: 3/3
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2464,7 +2464,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 15 resistance: 15
categorie_parade: '' categorie_parade: boucliers
dommages: 0 dommages: 0
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2380,7 +2380,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 5 resistance: 5
categorie_parade: '' categorie_parade: lances
dommages: 2 dommages: 2
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2429,7 +2429,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 15 resistance: 15
categorie_parade: '' categorie_parade: boucliers
dommages: 0 dommages: 0
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2380,7 +2380,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 15 resistance: 15
categorie_parade: '' categorie_parade: boucliers
dommages: 0 dommages: 0
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2434,7 +2434,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 5 resistance: 5
categorie_parade: '' categorie_parade: lances
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2483,7 +2483,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 15 resistance: 15
categorie_parade: '' categorie_parade: boucliers
dommages: 0 dommages: 0
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2532,7 +2532,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 5 resistance: 5
categorie_parade: '' categorie_parade: lances
dommages: 2 dommages: 2
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2380,7 +2380,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 5 resistance: 5
categorie_parade: '' categorie_parade: lances
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2429,7 +2429,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 13 resistance: 13
categorie_parade: '' categorie_parade: boucliers
dommages: 0 dommages: 0
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -2380,7 +2380,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 5 resistance: 5
categorie_parade: '' categorie_parade: lances
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -2478,7 +2478,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 13 resistance: 13
categorie_parade: '' categorie_parade: boucliers
dommages: 0 dommages: 0
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -311,7 +311,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 15 resistance: 15
categorie_parade: '' categorie_parade: epees-lourdes
dommages: 3/4 dommages: 3/4
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -359,7 +359,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 15 resistance: 15
categorie_parade: '' categorie_parade: boucliers
dommages: 0 dommages: 0
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0
@@ -407,7 +407,7 @@ items:
milieu: '' milieu: ''
environnement: [] environnement: []
resistance: 8 resistance: 8
categorie_parade: '' categorie_parade: dagues
dommages: 1 dommages: 1
mortalite: mortel mortalite: mortel
penetration: 0 penetration: 0

View File

@@ -1,9 +1,9 @@
{ {
"id": "foundryvtt-reve-de-dragon", "id": "foundryvtt-reve-de-dragon",
"title": "Rêve de Dragon", "title": "Rêve de Dragon",
"version": "13.0.21", "version": "13.0.36",
"download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/releases/download/13.0.0/rddsystem.zip", "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/releases/download/13.0.36/rddsystem.zip",
"manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/releases/download/13.0.0/system.json", "manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/releases/download/13.0.36/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": {
"minimum": "13", "minimum": "13",

View File

@@ -21,7 +21,7 @@
</li> </li>
<br> <br>
<li class="caracteristique flexrow list-item"> <li class="caracteristique flexrow list-item">
<label>{{system.compteurs.moral.label}} <label data-tooltip-html="{{> "systems/foundryvtt-reve-de-dragon/templates/actor/tooltip-bonmoments.hbs"}}">{{system.compteurs.moral.label}}
<span> <span>
<a class="flex-shrink moral-malheureux" data-tooltip="Jet de moral situation malheureuse"><i class="fa-regular fa-face-frown"></i></a> <a class="flex-shrink moral-malheureux" data-tooltip="Jet de moral situation malheureuse"><i class="fa-regular fa-face-frown"></i></a>
<a class="flex-shrink moral-neutre" data-tooltip="Jet de moral situation neutre"><i class="fa-regular fa-face-meh"></i></a> <a class="flex-shrink moral-neutre" data-tooltip="Jet de moral situation neutre"><i class="fa-regular fa-face-meh"></i></a>

View File

@@ -0,0 +1,10 @@
<div class=&quot;toolclip themed theme-dark&quot;>
<p><b>Bon moments du jour</b></p>
{{#if system.compteurs.bonmoments}}
{{#each system.compteurs.bonmoments as |bonmoment|}}
<p>{{bonmoment}}</p>
{{/each}}
{{else}}
<p>Rien de notable</p>
{{/if}}
</div>

View File

@@ -1,4 +1,3 @@
{{log this}}
<form class="{{cssClass}}" autocomplete="off"> <form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header"> <header class="sheet-header">
<img class="profile-img" src="{{img}}" data-edit="img" data-tooltip="{{name}}"/> <img class="profile-img" src="{{img}}" data-edit="img" data-tooltip="{{name}}"/>

View File

@@ -0,0 +1,21 @@
<div class="roll-chat">
<div class="chat-img">
<img src="{{active.img}}" data-tooltip="{{active.name}}" />
<img src="{{current.comp.comp.img}}" data-tooltip="{{current.comp.label}}" />
</div>
<div class="chat-header">
{{active.name}} fait appel à la chance
</div>
<div class="chat-resume">
{{> 'partial-infojet'}}
</div>
<div class="chat-details">
{{#if rolled.isSuccess}}
<p>Un point de chance a été dépensé, le jet peut être retenté</p>
{{else}}
<p>Pas de dépense de chance</p>
{{/if}}
</div>
</div>

View File

@@ -0,0 +1,24 @@
<div class="roll-chat">
<div class="chat-img">
<img src="{{active.img}}" data-tooltip="{{active.name}}" />
<img src="{{current.comp.comp.img}}" data-tooltip="{{current.comp.label}}" />
</div>
<div class="chat-header">
{{active.name}} fait un jet de résistance
</div>
<div class="chat-resume">
{{> 'partial-infojet'}}
</div>
<div class="chat-details">
<img class="chat-icon" src="systems/foundryvtt-reve-de-dragon/assets/ui/resistance.svg" />
<span class="rdd-roll-{{rolled.code}} strong-text">
{{#if rolled.isSuccess}}
Jet de résistance réussi
{{else}}
Jet de résistance manqué
{{/if}}
</span>
</div>
</div>

View File

@@ -1,4 +1,8 @@
{{#if (gt result.qualite 0)}} {{#if (eq result.appreciation.moral '')}}
<span>L'&oelig;uvre n'est pas prévue pour gagner du moral</span>
{{else if (lte result.qualite 0)}}
<span>Qualité de {{result.qualite}}, pas d'appréciation</span>
{{else}}
<a class='chat-card-button apprecier' data-tooltip="Aprécier"> <a class='chat-card-button apprecier' data-tooltip="Aprécier">
<i class="fa-solid fa-face-smile-beam"></i>&nbsp; Apprécier <i class="fa-solid fa-face-smile-beam"></i>&nbsp; Apprécier
</a> </a>

View File

@@ -26,7 +26,6 @@
{{/if}} {{/if}}
<div> <div>
<span>{{rolled.roll}} : </span><span class="rdd-roll-{{rolled.code}} strong-text">{{rolled.quality}}</span> <span>{{rolled.roll}} : </span><span class="rdd-roll-{{rolled.code}} strong-text">{{rolled.quality}}</span>
{{log 'rolled' rolled}}
{{#if (regle-optionnelle 'afficher-colonnes-reussite')}} {{#if (regle-optionnelle 'afficher-colonnes-reussite')}}
<span class="rdd-niveau-requis">(Réussite colonne {{plusMoins rolled.niveauNecessaire}} / avec ajustement {{plusMoins rolled.ajustementNecessaire}}) </span> <span class="rdd-niveau-requis">(Réussite colonne {{plusMoins rolled.niveauNecessaire}} / avec ajustement {{plusMoins rolled.ajustementNecessaire}}) </span>
{{/if}} {{/if}}