From d1ec67e48576d7bfeec45086285c2bd11c239278 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sun, 12 May 2024 19:37:58 +0200 Subject: [PATCH 1/7] Correction Tooltips foundry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Suite à changement des Tooltips RdD, adaptation des tooltips standard foundry --- styles/simple.css | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/styles/simple.css b/styles/simple.css index f89358d3..931fb9de 100644 --- a/styles/simple.css +++ b/styles/simple.css @@ -92,6 +92,8 @@ --background-custom-button-hover: linear-gradient(to bottom, rgb(128, 0, 0) 5%, rgb(62, 1, 1) 100%); --background-control-selected: linear-gradient(to bottom, hsla(0, 100%, 25%, 0.5) 5%, hsla(0, 100%, 12%, 0.5) 100%); --background-tooltip: hsla(60, 12%, 85%, 0.95); + --color-tooltip:hsla(282, 47%, 33%, 0.9); + --color-tooltip-faint:hsla(282, 47%, 66%, 0.5); --background-error:hsla(16, 100%, 50%, 0.8); --color-profile-border: hsla(0, 0%, 80%, 0.05); } @@ -1943,7 +1945,7 @@ div.calendar-timestamp-edit select.calendar-signe-heure { padding: 3px; } -aside#tooltip{ +aside#tooltip { background: var(--background-tooltip); color: var(--color-text-dark-primary); font-size: 1rem; @@ -1951,6 +1953,15 @@ aside#tooltip{ padding: 0.4rem; } +aside#tooltip span.reference { + color: var(--color-tooltip); + border: 1px solid var(--color-tooltip-faint); +} + +aside#tooltip .toolclip p.faint { + color: var(--color-tooltip-faint); +} + .tooltip :is(.ttt-xp,.ttt-levelup) { width: 250px; background: var(--background-tooltip) !important; From fedf8f3b2920bd9bc3c079282ac2192867f1c26d Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sun, 12 May 2024 21:37:12 +0200 Subject: [PATCH 2/7] =?UTF-8?q?Fix:=20accorder=20entit=C3=A9s=20x2=20si=20?= =?UTF-8?q?validation=20GR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Les entités pouvaient être accordées 2 fois en cas de validation par le GR --- module/actor/base-actor-reve.js | 37 ++++++++++++++++----------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/module/actor/base-actor-reve.js b/module/actor/base-actor-reve.js index ad26f6bf..cd9640c3 100644 --- a/module/actor/base-actor-reve.js +++ b/module/actor/base-actor-reve.js @@ -421,36 +421,35 @@ export class RdDBaseActorReve extends RdDBaseActor { /* -------------------------------------------- */ async encaisser() { await RdDEncaisser.encaisser(this) } - async encaisserDommagesRemote(rollData, attackerId, show) { - const attacker = game.actors.get(attackerId); - await this.encaisserDommages(rollData, attacker, show) - } async encaisserDommages(rollData, attacker = undefined, show = undefined) { if (attacker && !await attacker.accorder(this, 'avant-encaissement')) { return; } - const attackerId = attacker?.id; - if (ReglesOptionnelles.isUsing('validation-encaissement-gr') && !game.user.isGM) { - RdDBaseActor.remoteActorCall({ - tokenId: this.token?.id, - actorId: this.id, - method: 'encaisserDommagesRemote', - args: [rollData, attackerId, show] - }); - return; - } - const armure = await this.computeArmure(rollData); - if (ReglesOptionnelles.isUsing('validation-encaissement-gr')) { - DialogValidationEncaissement.validerEncaissement(this, rollData, armure, - jet => this.$onEncaissement(jet, show, attacker)); - } + if (ReglesOptionnelles.isUsing('validation-encaissement-gr')){ + await this.encaisserDommagesValidationGR(rollData, armure, attacker?.id, show); + } else { const jet = await RdDUtility.jetEncaissement(rollData, armure, { showDice: SHOW_DICE }); await this.$onEncaissement(jet, show, attacker); } } + async encaisserDommagesValidationGR(rollData, armure, attackerId, show) { + if (!game.user.isGM) { + RdDBaseActor.remoteActorCall({ + tokenId: this.token?.id, + actorId: this.id, + method: 'encaisserDommagesValidationGR', + args: [rollData, armure, attackerId, show] + }); + } else { + const attacker = game.actors.get(attackerId); + DialogValidationEncaissement.validerEncaissement(this, rollData, armure, + jet => this.$onEncaissement(jet, show, attacker)); + } + } + async $onEncaissement(jet, show, attacker) { await this.onAppliquerJetEncaissement(jet, attacker); await this.$afficherEncaissement(jet, show); From 611b57c149ba41c44a2b0228d676030a128559a4 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sun, 12 May 2024 21:58:48 +0200 Subject: [PATCH 3/7] Adaptation des encaissement alternatifs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Les encaissement alternatifs fonctionnent avec la validation d'encaissement par le MJ. - l'ajout de la difficulté d'attaque au dégâts est indiqué dans les bonus de dégâts - pour les minimums sur les dés d'encaissement, si le MJ remplace le jet, les minimums sont alors ignorés. --- module/rdd-utility.js | 71 ++++++++++--------- templates/dialog-validation-encaissement.html | 31 ++++---- 2 files changed, 55 insertions(+), 47 deletions(-) diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 81bee8bd..374c4cfb 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -549,49 +549,54 @@ export class RdDUtility { /* -------------------------------------------- */ static async jetEncaissement(rollData, armure, options = { showDice: HIDE_DICE }) { - let formula = "2d10"; + const diff = Math.abs(rollData.diffLibre); + let formula = RdDUtility.formuleEncaissement(diff, options) + const roll = await RdDDice.roll(formula, options); - // Chaque dé fait au minmum la difficulté libre - if (ReglesOptionnelles.isUsing('degat-minimum-malus-libre')) { - if (rollData.diffLibre < 0) { - let valeurMin = Math.abs(rollData.diffLibre); - formula += "min" + valeurMin; - } - } - // Chaque dé fait au minmum la difficulté libre - if (ReglesOptionnelles.isUsing('degat-ajout-malus-libre')) { - if (rollData.diffLibre < 0) { - let valeurMin = Math.abs(rollData.diffLibre); - formula += "+" + valeurMin; - } - } - - let roll = await RdDDice.roll(formula, options); - - // 1 dé fait au minmum la difficulté libre - if (ReglesOptionnelles.isUsing('degat-minimum-malus-libre-simple')) { - if (rollData.diffLibre < 0) { - let valeurMin = Math.abs(rollData.diffLibre); - if (roll.terms[0].results[0].result < valeurMin) { - roll.terms[0].results[0].result = valeurMin; - } else if (roll.terms[0].results[1].result < valeurMin) { - roll.terms[0].results[1].result = valeurMin; - } - roll._total = roll.terms[0].results[0].result + roll.terms[0].results[1].result; - } - } + RdDUtility.remplaceDeMinParDifficulte(roll, diff, options); return await RdDUtility.prepareEncaissement(rollData, roll, armure); } + static remplaceDeMinParDifficulte(roll, diff, options) { + if (!ReglesOptionnelles.isUsing('degat-minimum-malus-libre-simple')) { + return + } + // 1 dé fait au minmum la difficulté libre + const total = options.forceDiceResult?.total; + if (total) { + const reste = Math.max(total - diff, 1) + roll.terms[0].number = reste + diff + } + else { + if (roll.terms[0].results[0].result < diff) { + roll.terms[0].results[0].result = diff; + } else if (roll.terms[0].results[1].result < diff) { + roll.terms[0].results[1].result = diff; + } + roll._total = roll.terms[0].results[0].result + roll.terms[0].results[1].result; + } + } + + static formuleEncaissement(diff, options) { + // Chaque dé fait au minimum la difficulté libre + if (ReglesOptionnelles.isUsing('degat-minimum-malus-libre')) { + return `2d10min${diff}` + } + return '2d10' + } + /* -------------------------------------------- */ static async prepareEncaissement(rollData, roll, armure) { - const jetTotal = roll.total + rollData.dmg.total - armure; - let encaissement = RdDUtility._selectEncaissement(jetTotal, rollData.dmg.mortalite); - let over20 = Math.max(jetTotal - 20, 0); + // La difficulté d'ataque s'ajoute aux dégâts + const bonusDegatsDiffLibre = ReglesOptionnelles.isUsing('degat-ajout-malus-libre') ? Math.abs(rollData.diffLibre ?? 0) : 0 + const jetTotal = roll.total + rollData.dmg.total - armure + bonusDegatsDiffLibre + const encaissement = RdDUtility._selectEncaissement(jetTotal, rollData.dmg.mortalite); + const over20 = Math.max(jetTotal - 20, 0); encaissement.dmg = rollData.dmg; encaissement.dmg.loc = rollData.dmg.loc ?? await RdDUtility.getLocalisation(this.type); encaissement.dmg.loc.label = encaissement.dmg.loc.label ?? 'Corps;'; + encaissement.dmg.bonusDegatsDiffLibre = bonusDegatsDiffLibre encaissement.roll = roll; encaissement.armure = armure; encaissement.penetration = rollData.arme?.system.penetration ?? 0; diff --git a/templates/dialog-validation-encaissement.html b/templates/dialog-validation-encaissement.html index ca665620..c8076f84 100644 --- a/templates/dialog-validation-encaissement.html +++ b/templates/dialog-validation-encaissement.html @@ -15,33 +15,36 @@
Armure: {{encaissement.armure}}
- {{#if rollData.dmg.penetration}} -
Pénétration: -{{rollData.dmg.penetration}}
+ {{#if encaissement.dmg.penetration}} +
Pénétration: -{{encaissement.dmg.penetration}}
{{/if}}
{{#if encaissement.dmg.total}} -
+dom encaissement: {{plusMoins rollData.dmg.total}}
+
+dom encaissement: {{plusMoins encaissement.dmg.total}}
{{/if}} - {{#if rollData.dmg.dmgArme}} -
+dom arme: {{plusMoins rollData.dmg.dmgArme}}
+ {{#if encaissement.dmg.dmgArme}} +
+dom arme: {{plusMoins encaissement.dmg.dmgArme}}
{{/if}} - {{#if rollData.dmg.dmgActor}} -
+dom attaquant: {{plusMoins rollData.dmg.dmgActor}}
+ {{#if encaissement.dmg.dmgActor}} +
+dom attaquant: {{plusMoins encaissement.dmg.dmgActor}}
{{/if}} - {{#if rollData.dmg.dmgParticuliere}} -
+dom particulière: {{plusMoins rollData.dmg.dmgParticuliere}}
+ {{#if encaissement.dmg.dmgParticuliere}} +
+dom particulière: {{plusMoins encaissement.dmg.dmgParticuliere}}
{{/if}} - {{#if rollData.dmg.dmgTactique}} -
+dom tactique: {{plusMoins rollData.dmg.dmgTactique}}
+ {{#if encaissement.dmg.dmgTactique}} +
+dom tactique: {{plusMoins encaissement.dmg.dmgTactique}}
{{/if}} - {{#if rollData.dmg.dmgSurprise}} -
+dom surprise: {{plusMoins rollData.dmg.dmgSurprise}}
+ {{#if encaissement.dmg.dmgSurprise}} +
+dom surprise: {{plusMoins encaissement.dmg.dmgSurprise}}
+ {{/if}} + {{#if encaissement.dmg.bonusDegatsDiffLibre}} +
+dom attaque: {{plusMoins encaissement.dmg.bonusDegatsDiffLibre}}
{{/if}}
  • - +
  • From 19dd3b540cbced1d21dbba46cb8fbcec6786b070 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sun, 12 May 2024 22:40:06 +0200 Subject: [PATCH 4/7] Astrologie: garder toutes les lectures d'un acteur --- module/actor.js | 11 ++-- module/actor/base-actor.js | 7 --- module/migrations.js | 21 ++++++- module/rdd-utility.js | 11 +--- module/sommeil/app-astrologie.js | 16 +++-- module/time/rdd-calendrier.js | 79 ++++++++++-------------- templates/sommeil/astrologie-gardien.hbs | 4 +- 7 files changed, 74 insertions(+), 75 deletions(-) diff --git a/module/actor.js b/module/actor.js index f3d2e33d..2be25dcc 100644 --- a/module/actor.js +++ b/module/actor.js @@ -2365,26 +2365,25 @@ export class RdDActor extends RdDBaseActorSang { /* -------------------------------------------- */ - async resetNombresAstraux() { + async deleteNombresAstraux() { const deletions = this.itemTypes['nombreastral'].map(it => it._id); await this.deleteEmbeddedDocuments("Item", deletions); } /* -------------------------------------------- */ - async ajouteNombreAstral(callData) { - const indexDate = Number.parseInt(callData.date); + async ajouteNombreAstral(date, nbAstral, isValid) { + const indexDate = Number.parseInt(date); // Ajout du nombre astral const item = { name: "Nombre Astral", type: "nombreastral", system: { - value: callData.nbAstral, - istrue: callData.isvalid, + value: nbAstral, + istrue: isValid, jourindex: indexDate, jourlabel: RdDTimestamp.formatIndexDate(indexDate) } }; await this.createEmbeddedDocuments("Item", [item]); - game.system.rdd.calendrier.notifyChangeNombresAstraux(); } async supprimerAnciensNombresAstraux() { diff --git a/module/actor/base-actor.js b/module/actor/base-actor.js index 3a148f18..b0a46de0 100644 --- a/module/actor/base-actor.js +++ b/module/actor/base-actor.js @@ -42,13 +42,6 @@ export class RdDBaseActor extends Actor { switch (sockmsg.msg) { case "msg_remote_actor_call": return RdDBaseActor.onRemoteActorCall(sockmsg.data, sockmsg.userId); - case "msg_reset_nombre_astral": - game.user.character.resetNombresAstraux(); - game.system.rdd.calendrier.notifyChangeNombresAstraux(); - return; - case "msg_refresh_nombre_astral": - Hooks.callAll(APP_ASTROLOGIE_REFRESH); - return; } } diff --git a/module/migrations.js b/module/migrations.js index 887ba354..ddd36ec8 100644 --- a/module/migrations.js +++ b/module/migrations.js @@ -5,6 +5,7 @@ import { Monnaie } from "./item-monnaie.js"; import { RdDItem, TYPES } from "./item.js"; import { RdDTimestamp } from "./time/rdd-timestamp.js"; import { RdDRaretes } from "./item/raretes.js"; +import { RdDCalendrier } from "./time/rdd-calendrier.js"; class Migration { get code() { return "sample"; } @@ -514,6 +515,20 @@ class _10_7_19_PossessionsEntiteVictime extends Migration { } } +class _11_2_20_MigrationAstrologie extends Migration { + get code() { return "migration-astrologie" } + get version() { return "11.2.20" } + + async migrate() { + const nombresAstraux = game.system.rdd.calendrier.getNombresAstraux() + nombresAstraux.forEach(na => { + na.lectures = na.valeursFausses + na.valeursFausses = undefined + }) + await game.system.rdd.calendrier.setNombresAstraux(nombresAstraux) + } +} + export class Migrations { static getMigrations() { return [ @@ -532,6 +547,7 @@ export class Migrations { new _10_7_0_MigrationBlessures(), new _10_7_19_CategorieCompetenceCreature(), new _10_7_19_PossessionsEntiteVictime(), + new _11_2_20_MigrationAstrologie(), ]; } @@ -546,7 +562,10 @@ export class Migrations { } migrate() { - const currentVersion = game.settings.get(SYSTEM_RDD, "systemMigrationVersion"); + let currentVersion = game.settings.get(SYSTEM_RDD, "systemMigrationVersion") + if (currentVersion.startsWith("v")) { + currentVersion = currentVersion.substring(1) + } if (isNewerVersion(game.system.version, currentVersion)) { // if (true) { /* comment previous and uncomment here to test before upgrade */ const migrations = Migrations.getMigrations().filter(m => isNewerVersion(m.version, currentVersion)); diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 374c4cfb..884be00c 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -18,6 +18,7 @@ import { RdDRaretes } from "./item/raretes.js"; import { RdDEmpoignade } from "./rdd-empoignade.js"; import { ExperienceLog } from "./actor/experience-log.js"; import { RdDCoeur } from "./coeur/rdd-coeur.js"; +import { APP_ASTROLOGIE_REFRESH } from "./sommeil/app-astrologie.js"; /* -------------------------------------------- */ // This table starts at 0 -> niveau -10 @@ -625,21 +626,15 @@ export class RdDUtility { return perte.total; } - /* -------------------------------------------- */ - static async responseNombreAstral(callData) { - let actor = game.actors.get(callData.id); - actor.ajouteNombreAstral(callData); - } - /* -------------------------------------------- */ static onSocketMessage(sockmsg) { switch (sockmsg.msg) { case "msg_gm_chat_message": return ChatUtility.handleGMChatMessage(sockmsg.data); + case "msg_app_astrologie_refresh": + return Hooks.callAll(APP_ASTROLOGIE_REFRESH); case "msg_request_nombre_astral": return game.system.rdd.calendrier.requestNombreAstral(sockmsg.data); - case "msg_response_nombre_astral": - return RdDUtility.responseNombreAstral(sockmsg.data); case "msg_tmr_move": let actor = game.actors.get(sockmsg.data.actorId); if (actor.isOwner || game.user.isGM) { diff --git a/module/sommeil/app-astrologie.js b/module/sommeil/app-astrologie.js index b407dad3..eca4accb 100644 --- a/module/sommeil/app-astrologie.js +++ b/module/sommeil/app-astrologie.js @@ -31,7 +31,6 @@ export class AppAstrologie extends Application { constructor(actor, options = {}) { super(options); this.actor = actor; - this.hookReference = Hooks.on(APP_ASTROLOGIE_REFRESH, () => this.refreshAstrologie()); } getData(options) { @@ -85,9 +84,10 @@ export class AppAstrologie extends Application { const nbAstral = calendrier.getNombreAstral() const heures = RdDTimestamp.heures(); return { - ajustementsActors:game.actors.filter(actor => actor.isPersonnageJoueur()) + ajustementsActors: game.actors.filter(actor => actor.isPersonnageJoueur()) .map(actor => this.getAjustementActor(actor, nbAstral, heures)), - nombresAstraux: calendrier.getNombresAstraux().map(na => this.getDetailNombreAstral(na)) + nombresAstraux: game.system.rdd.calendrier.getNombresAstraux() + .map(na => this.getDetailNombreAstral(na)) } } return {} @@ -107,12 +107,15 @@ export class AppAstrologie extends Application { const detail = foundry.utils.duplicate(nombreAstral); const timestamp = new RdDTimestamp({ indexDate: nombreAstral.index }); detail.date = { mois: timestamp.mois, jour: timestamp.jour + 1 }; - detail.valeursFausses.forEach(fausse => fausse.actorName = game.actors.get(fausse.actorId).name ?? "Inconnu"); + detail.lectures.forEach(lecture => lecture.actorName = game.actors.get(lecture.actorId).name ?? "Inconnu"); return detail; } /* -------------------------------------------- */ activateListeners(html) { + if (!this.hookReference){ + this.hookReference = Hooks.on(APP_ASTROLOGIE_REFRESH, () => this.refreshAstrologie()); + } super.activateListeners(html); this.html = html; this.html.find('select[name="signe-astral"]').change(event => { @@ -145,8 +148,7 @@ export class AppAstrologie extends Application { /* -------------------------------------------- */ async onRebuild() { - game.system.rdd.calendrier.resetNombresAstraux(); - + await game.system.rdd.calendrier.resetNombresAstraux(); await game.system.rdd.calendrier.rebuildNombresAstraux(); } @@ -195,6 +197,8 @@ export class AppAstrologie extends Application { } refreshAstrologie() { + this.count = (this.count ?? 0)+1 + console.log(`Refreshing ${this.count}`); this.render(true) } diff --git a/module/time/rdd-calendrier.js b/module/time/rdd-calendrier.js index b96f640b..0ff8022c 100644 --- a/module/time/rdd-calendrier.js +++ b/module/time/rdd-calendrier.js @@ -51,7 +51,6 @@ export class RdDCalendrier extends Application { this.timestamp = RdDTimestamp.getWorldTime(); if (Misc.isUniqueConnectedGM()) { // Uniquement si GM RdDTimestamp.setWorldTime(this.timestamp); - this.nombresAstraux = this.getNombresAstraux(); this.rebuildNombresAstraux(); // Ensure always up-to-date } Hooks.on('updateSetting', async (setting, update, options, id) => this.onUpdateSetting(setting, update, options, id)); @@ -108,7 +107,10 @@ export class RdDCalendrier extends Application { this.timestamp = RdDTimestamp.getWorldTime(); this.positionAiguilles() this.render(false); - Hooks.callAll(APP_ASTROLOGIE_REFRESH); + Hooks.callAll(APP_ASTROLOGIE_REFRESH) + } + if (setting.key == SYSTEM_RDD + '.' + "liste-nombre-astral") { + Hooks.callAll(APP_ASTROLOGIE_REFRESH) } } @@ -167,7 +169,11 @@ export class RdDCalendrier extends Application { /* -------------------------------------------- */ getNombresAstraux() { - return game.settings.get(SYSTEM_RDD, "liste-nombre-astral") ?? []; + return game.settings.get(SYSTEM_RDD, "liste-nombre-astral") ?? [] + } + + async setNombresAstraux(nombresAstraux) { + await game.settings.set(SYSTEM_RDD, "liste-nombre-astral", nombresAstraux) } /* -------------------------------------------- */ @@ -225,20 +231,15 @@ export class RdDCalendrier extends Application { const nombreAstral = await RdDDice.rollTotal("1dh", { showDice: HIDE_DICE, rollMode: "selfroll" }); return { nombreAstral: nombreAstral, - valeursFausses: [], + lectures: [], index: indexDate } } /* -------------------------------------------- */ - resetNombresAstraux() { - this.nombresAstraux = []; - game.settings.set(SYSTEM_RDD, "liste-nombre-astral", []); - - game.socket.emit(SYSTEM_SOCKET_ID, { - msg: "msg_reset_nombre_astral", - data: {} - }); + async resetNombresAstraux() { + await Promise.all(game.actors.filter(it => it.type == "personnage").map(async it => await it.deleteNombresAstraux())) + await this.setNombresAstraux([]) } /** @@ -251,39 +252,30 @@ export class RdDCalendrier extends Application { if (indexDate == undefined) { indexDate = this.timestamp.indexDate; } - this.nombresAstraux = this.getNombresAstraux(); - let astralData = this.nombresAstraux.find((nombreAstral, i) => nombreAstral.index == indexDate); + const nombresAstraux = this.getNombresAstraux() + let astralData = nombresAstraux.find(it => it.index == indexDate); return astralData?.nombreAstral ?? 0; } /* -------------------------------------------- */ async rebuildNombresAstraux() { if (Misc.isUniqueConnectedGM()) { - let newList = []; + const nombresAstraux = this.getNombresAstraux() + let newNombresAstraux = []; for (let i = 0; i < MAX_NOMBRE_ASTRAL; i++) { let dayIndex = this.timestamp.indexDate + i; - let na = this.nombresAstraux.find(n => n.index == dayIndex); + let na = nombresAstraux.find(it => it.index == dayIndex); if (na) { - newList[i] = na; + newNombresAstraux[i] = na; } else { - newList[i] = await this.ajouterNombreAstral(dayIndex); + newNombresAstraux[i] = await this.ajouterNombreAstral(dayIndex); } } - this.nombresAstraux = newList; - game.settings.set(SYSTEM_RDD, "liste-nombre-astral", newList); game.actors.filter(it => it.isPersonnage()).forEach(actor => actor.supprimerAnciensNombresAstraux()); - this.notifyChangeNombresAstraux(); + await this.setNombresAstraux(newNombresAstraux); } } - notifyChangeNombresAstraux() { - Hooks.callAll(APP_ASTROLOGIE_REFRESH); - game.socket.emit(SYSTEM_SOCKET_ID, { - msg: "msg_refresh_nombre_astral", - data: {} - }); - } - /* -------------------------------------------- */ async setNewTimestamp(newTimestamp) { const oldTimestamp = this.timestamp; @@ -373,25 +365,22 @@ export class RdDCalendrier extends Application { request.nbAstral = await RdDDice.rollTotal("1dhr" + request.nbAstral, { rollMode: "selfroll", showDice: HIDE_DICE }); - // Mise à jour des nombres astraux du joueur - this.addNbAstralIncorect(request.id, request.date, request.nbAstral); - } - - if (Misc.getActiveUser(request.userId)?.isGM) { - RdDUtility.responseNombreAstral(request); - } else { - game.socket.emit(SYSTEM_SOCKET_ID, { - msg: "msg_response_nombre_astral", - data: request - }); } + // Mise à jour des nombres astraux du joueur + await this.addNbAstralJoueur(actor, request.date, request.nbAstral, request.isValid) + Hooks.callAll(APP_ASTROLOGIE_REFRESH) + game.socket.emit(SYSTEM_SOCKET_ID, { msg: "msg_app_astrologie_refresh", data: {} }) } } - - addNbAstralIncorect(actorId, date, nbAstral) { - const astralData = this.nombresAstraux.find((nombreAstral, i) => nombreAstral.index == date); - astralData.valeursFausses.push({ actorId: actorId, nombreAstral: nbAstral }); - game.settings.set(SYSTEM_RDD, "liste-nombre-astral", this.nombresAstraux); + + async addNbAstralJoueur(actor, date, nbAstral, isValid) { + const nombresAstraux = this.getNombresAstraux() + const astralData = nombresAstraux.find(it => it.index == date) + if (astralData) { + astralData.lectures.push({ actorId: actor.id, nombreAstral: nbAstral }); + await this.setNombresAstraux(nombresAstraux); + await actor.ajouteNombreAstral(date, nbAstral, isValid); + } } /* -------------------------------------------- */ diff --git a/templates/sommeil/astrologie-gardien.hbs b/templates/sommeil/astrologie-gardien.hbs index 208581e0..592b29b5 100644 --- a/templates/sommeil/astrologie-gardien.hbs +++ b/templates/sommeil/astrologie-gardien.hbs @@ -15,8 +15,8 @@
      {{nba.nombreAstral}} - {{#each nba.valeursFausses as |fausse|}} -
    1. {{fausse.actorName}} - {{fausse.nombreAstral}}
    2. + {{#each nba.lectures as |lecture|}} +
    3. {{lecture.actorName}} - {{lecture.nombreAstral}}
    4. {{/each}}
    From 042f5d0f6922bcf9a3a14fdf44a15f8ef68195c3 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sun, 12 May 2024 22:40:37 +0200 Subject: [PATCH 5/7] Cleanup Promise.all pour multi async --- module/actor.js | 2 +- module/migrations.js | 33 ++++++++++++++++----------------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/module/actor.js b/module/actor.js index 2be25dcc..c3d1ae9a 100644 --- a/module/actor.js +++ b/module/actor.js @@ -347,7 +347,7 @@ export class RdDActor extends RdDBaseActorSang { const timestamp = game.system.rdd.calendrier.getTimestamp() const blessures = this.filterItems(it => it.system.gravite > 0, TYPES.blessure).sort(Misc.ascending(it => it.system.gravite)) - await Promise.all(blessures.map(b => b.recuperationBlessure({ + await Promise.all(blessures.map(async b => b.recuperationBlessure({ actor: this, timestamp, message, diff --git a/module/migrations.js b/module/migrations.js index ddd36ec8..dbfeea25 100644 --- a/module/migrations.js +++ b/module/migrations.js @@ -71,17 +71,17 @@ class _10_0_16_MigrationSortsReserve extends Migration { get version() { return "10.0.16"; } async migrate() { - await game.actors - .filter((actor) => actor.type == "personnage") - .filter((actor) => actor.system.reve?.reserve?.list?.length ?? 0 > 0) - .forEach(async (actor) => { - const sortsReserve = actor.system.reve.reserve.list.map(this.conversionSortReserve); - console.log(`${LOG_HEAD} Migration des sorts en réserve de ${actor.name}`, sortsReserve); - await actor.createEmbeddedDocuments("Item", sortsReserve, { - renderSheet: false, - }); - await actor.update({ 'system.reve.reserve': undefined }) - }); + const actors = game.actors.filter((actor) => actor.type == "personnage" && (actor.system.reve?.reserve?.list?.length ?? 0 > 0)) + Promise.all(actors.map(async it => await this.convertirSortsReserveActeur(it))) + } + + async convertirSortsReserveActeur(actor) { + const sortsReserve = actor.system.reve.reserve.list.map(this.conversionSortReserve); + console.log(`${LOG_HEAD} Migration des sorts en réserve de ${actor.name}`, sortsReserve); + await actor.createEmbeddedDocuments("Item", sortsReserve, { + renderSheet: false, + }); + await actor.update({ 'system.reve.reserve': undefined }); } conversionSortReserve(it) { @@ -508,7 +508,8 @@ class _10_7_19_PossessionsEntiteVictime extends Migration { } migratePossession(it) { - return { _id: it.id, + return { + _id: it.id, 'system.entite.actorid': it.system.possesseurid, 'system.victime.actorid': it.system.possedeid } @@ -573,7 +574,7 @@ export class Migrations { migrations.sort((a, b) => this.compareVersions(a, b)); migrations.forEach(async (m) => { ui.notifications.info( - `Executing migration ${m.code}: version ${currentVersion} is lower than ${m.version}` + `${LOG_HEAD} Executing migration ${m.code}: version ${currentVersion} is lower than ${m.version}` ); await m.migrate(); }); @@ -581,9 +582,7 @@ export class Migrations { `Migrations done, version will change to ${game.system.version}` ); } else { - console.log( - LOG_HEAD + - `No migration needeed, version will change to ${game.system.version}` + console.log(`${LOG_HEAD} No migration needeed, version will change to ${game.system.version}` ); } @@ -593,7 +592,7 @@ export class Migrations { game.system.version ); } else { - console.log(LOG_HEAD + `No system version changed`); + console.log(`${LOG_HEAD} No system version changed`); } } From 65525cfd793656fc0c0742440d3f8b0a2fc6ac5a Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Mon, 13 May 2024 01:49:42 +0200 Subject: [PATCH 6/7] =?UTF-8?q?Correction=20r=C3=A9cup=C3=A9ration=20seuil?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La récupération de seuil sur Rêve de Dragon était empéchée par la gestion d'expérience quand aucune expérience n'était gagnée. Le même problème pouvait arriver pour d'autres raisons. --- module/actor.js | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/module/actor.js b/module/actor.js index c3d1ae9a..19d4c101 100644 --- a/module/actor.js +++ b/module/actor.js @@ -429,7 +429,7 @@ export class RdDActor extends RdDBaseActorSang { let jetsReve = []; let dormi = await this.dormirDesHeures(jetsReve, message, heures, options); if (jetsReve.length > 0) { - message.content += `Vous récupérez ${jetsReve.map(it => it < 0 ? '(dragon)' : it).reduce(Misc.joining("+"))} Points de rêve. `; + message.content += `Vous récupérez ${jetsReve.map(it => it < 0 ? '0 (réveil)' : it).reduce(Misc.joining("+"))} Points de rêve. `; } if (dormi.etat == 'eveil') { await this.reveilReveDeDragon(message, dormi.heures); @@ -450,7 +450,6 @@ export class RdDActor extends RdDBaseActorSang { } async reveilReveDeDragon(message, heures) { - message.content += 'Vous êtes réveillé par un Rêve de Dragon.'; const restant = Math.max(this.system.sommeil?.heures - heures, 0) if (restant > 0) { await this.update({ 'system.sommeil': { heures: restant } }); @@ -1333,7 +1332,7 @@ export class RdDActor extends RdDBaseActorSang { } await RdDResolutionTable.rollData(ethylismeData.jetVie); - this._appliquerExperienceRollData(ethylismeData.jetVie); + this._gererExperience(ethylismeData.jetVie); RollDataAjustements.calcul(ethylismeData.jetVie, this); if (ethylismeData.jetVie.rolled.isSuccess) { ethylisme.nb_doses++; @@ -1365,7 +1364,7 @@ export class RdDActor extends RdDBaseActorSang { finalLevel: Number(ethylisme.value) + Number(this.system.compteurs.moral.value) } await RdDResolutionTable.rollData(ethylismeData.jetVolonte); - this._appliquerExperienceRollData(ethylismeData.jetVolonte); + this._gererExperience(ethylismeData.jetVolonte); RollDataAjustements.calcul(ethylismeData.jetVolonte, this); } } @@ -1549,7 +1548,7 @@ export class RdDActor extends RdDBaseActorSang { const content = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-gain-xp.html`, { actor: this, xpData - }); + }) if (hideChatMessage) { ChatUtility.blindMessageToGM({ content: content }); } @@ -1779,13 +1778,13 @@ export class RdDActor extends RdDBaseActorSang { }; RollDataAjustements.calcul(rollData, this); await RdDResolutionTable.rollData(rollData); - this._appliquerExperienceRollData(rollData); + this._gererExperience(rollData); await RdDResolutionTable.displayRollData(rollData, this) return rollData.rolled; } /* -------------------------------------------- */ - _appliquerExperienceRollData(rollData) { + _gererExperience(rollData) { const callback = this.createCallbackExperience(); if (callback.condition(rollData)) { callback.action(rollData); @@ -2269,7 +2268,7 @@ export class RdDActor extends RdDBaseActorSang { async _appliquerExperience(rolled, caracName, competence, jetResistance) { // Pas d'XP if (!rolled.isPart || rolled.finalLevel >= 0) { - return undefined; + return [] } if (this.checkDesirLancinant()) { // Cas de désir lancinant, pas d'expérience sur particulière @@ -2277,7 +2276,7 @@ export class RdDActor extends RdDBaseActorSang { 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: ChatMessage.getWhisperRecipients(this.name) }); - return undefined; + return [] } let xp = Math.abs(rolled.finalLevel); From 5c59f76c1716433341935e39270ced692fc4c8f0 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Mon, 13 May 2024 01:13:14 +0200 Subject: [PATCH 7/7] Version 11.2.20 --- changelog.md | 10 ++++++++++ system.json | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/changelog.md b/changelog.md index 85c3e8bd..1b2a0447 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,14 @@ # 11.2 +## 11.2.20 - Le soulagement d'Akarlikarlikar + +- L'option 'ajout de la difficulté d'attaque à l'encaissement est affichée comme un modificateur d'encaissement +- Les options d'encaissement alternative fonctionnent avec la validation du gardien +- La fenêtre d'astrologie du gardien affiche toutes les heures lues par un personnage +- Si aucune expérience n'est gagnée, les autres effets à appliquer (comme la récupération de seuil après avoir vaincu un rêve de Dragon) s'appliquent normalement +- Les tooltips de Foundry sont maintenant lisibles +- On n'accorde plus les entités de cauchemar deux fois quand le gardien valide les encaissements +- Les messages de récupération de rêve en cas de Rêve de Dragon sont clarifiés + ## 11.2.19 - Les hémorroïdes d'Akarlikarlikar - La validation des jets d'encaissement par le Gardien fonctionne de nouveau diff --git a/system.json b/system.json index 3fb22fed..1e7866c7 100644 --- a/system.json +++ b/system.json @@ -1,8 +1,8 @@ { "id": "foundryvtt-reve-de-dragon", "title": "Rêve de Dragon", - "version": "11.2.19", - "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-11.2.19.zip", + "version": "11.2.20", + "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-11.2.20.zip", "manifest": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/v11/system.json", "changelog": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/raw/branch/v11/changelog.md", "compatibility": {