diff --git a/changelog.md b/changelog.md index 0c92edaf..0e12f650 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,7 @@ # v11.0 +## v11.0.25 - la vision du rêve de Khrachtchoum +- Les TMRs restent affichées tant que le Haut-rêvant est en demi-rêve + ## v11.0.24 - les couleurs de Khrachtchoum - nouvelle carte des TMRs diff --git a/module/actor.js b/module/actor.js index 47af3bcc..0b7e73a8 100644 --- a/module/actor.js +++ b/module/actor.js @@ -369,7 +369,7 @@ export class RdDActor extends RdDBaseActor { async _openRollDialog({ name, label, template, rollData, callbackAction }) { const dialog = await RdDRoll.create(this, rollData, - { html: template }, + { html: template, close: html => { this.tmrApp?.restoreTMRAfterAction() } }, { name: name, label: label, @@ -380,6 +380,7 @@ export class RdDActor extends RdDBaseActor { ] }); dialog.render(true); + return dialog } @@ -846,7 +847,7 @@ export class RdDActor extends RdDBaseActor { system: { sortid: sort._id, draconic: (draconic?.name ?? sort.system.draconic), ptreve: ptreve, coord: coord, heurecible: 'Vaisseau' } }], { renderSheet: false }); - this.currentTMR.updateTokens(); + this.tmrApp.updateTokens(); } /* -------------------------------------------- */ @@ -2138,12 +2139,12 @@ export class RdDActor extends RdDBaseActor { ui.notifications.info(`Aucun sort disponible en ${TMRUtility.getTMR(coord).label} !`); return; } - if (this.currentTMR) this.currentTMR.minimize(); // Hide + const draconicList = this.computeDraconicAndSortIndex(sorts); const reve = duplicate(this.system.carac.reve); - await this._openRollDialog({ + const dialog = await this._openRollDialog({ name: 'lancer-un-sort', label: 'Lancer un sort', template: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-sort.html', @@ -2161,6 +2162,7 @@ export class RdDActor extends RdDBaseActor { }, callbackAction: r => this._rollUnSortResult(r) }); + this.tmrApp?.setTMRPendingAction(dialog); } /* -------------------------------------------- */ @@ -2252,9 +2254,9 @@ export class RdDActor extends RdDBaseActor { await this.update({ "system.reve.reve.value": reveActuel }); if (rollData.isSortReserve) { - this.currentTMR.maximize(); // Re-display TMR + this.tmrApp.maximize(); // Re-display TMR } else { - this.currentTMR.close(); // Close TMR ! + this.tmrApp.close(); // Close TMR ! } // Final chat message await RdDResolutionTable.displayRollData(rollData, this, 'chat-resultat-sort.html'); @@ -2723,8 +2725,6 @@ export class RdDActor extends RdDBaseActor { ui.notifications.info(`Aucun signe draconiques en ${coord} !`); return; } - if (this.currentTMR) this.currentTMR.minimize(); // Hide - let draconicList = this.getDraconicList() .map(draconic => { let draconicLecture = duplicate(draconic); @@ -2747,7 +2747,7 @@ export class RdDActor extends RdDBaseActor { const dialog = await RdDRoll.create(this, rollData, { html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-signedraconique.html', - close: html => { this.currentTMR.maximize() } // Re-display TMR + close: html => { this.tmrApp?.restoreTMRAfterAction() } }, { name: 'lire-signe-draconique', @@ -2759,6 +2759,7 @@ export class RdDActor extends RdDBaseActor { } ); dialog.render(true); + this.tmrApp?.setTMRPendingAction(dialog); } /* -------------------------------------------- */ @@ -2777,7 +2778,7 @@ export class RdDActor extends RdDBaseActor { } await this.deleteEmbeddedDocuments("Item", [rollData.signe._id]); await RdDResolutionTable.displayRollData(rollData, this.name, 'chat-resultat-lecture-signedraconique.html'); - this.currentTMR.close(); + this.tmrApp.close(); } /* -------------------------------------------- */ @@ -3012,8 +3013,8 @@ export class RdDActor extends RdDBaseActor { /* -------------------------------------------- */ refreshTMRView() { - if (this.currentTMR) { - this.currentTMR.externalRefresh(); + if (this.tmrApp) { + this.tmrApp.externalRefresh(); } } @@ -3021,6 +3022,7 @@ export class RdDActor extends RdDBaseActor { async displayTMR(mode = "normal") { if (this.tmrApp) { ui.notifications.warn("Vous êtes déja dans les TMR...."); + this.tmrApp.forceTMRDisplay(); return } if (mode != 'visu' && this.getEffect(STATUSES.StatusDemiReve)) { @@ -3066,8 +3068,8 @@ export class RdDActor extends RdDBaseActor { hasPlayerOwner: this.hasPlayerOwner } - this.currentTMR = await RdDTMRDialog.create(this, tmrFormData); - this.currentTMR.render(true); + this.tmrApp = await RdDTMRDialog.create(this, tmrFormData); + this.tmrApp.render(true); } /* -------------------------------------------- */ diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index c0c937d7..b3d0c63f 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -2,7 +2,6 @@ import { SHOW_DICE } from "./constants.js"; import { RollDataAjustements } from "./rolldata-ajustements.js"; import { RdDUtility } from "./rdd-utility.js"; import { TMRUtility } from "./tmr-utility.js"; -import { tmrConstants } from "./tmr-constants.js"; import { RdDResolutionTable } from "./rdd-resolution-table.js"; import { RdDTMRRencontreDialog } from "./rdd-tmr-rencontre-dialog.js"; import { ChatUtility } from "./chat-utility.js"; @@ -39,7 +38,8 @@ export class RdDTMRDialog extends Dialog { title: "Terres Médianes de Rêve", content: html, buttons: { - closeButton: { label: "Fermer", callback: html => this.close(html) } + closeButton: { + label: "Fermer", callback: html => this.close() } }, default: "closeButton" } @@ -63,6 +63,7 @@ export class RdDTMRDialog extends Dialog { this.rencontreState = 'aucune'; this.pixiApp = new PIXI.Application({ width: 720, height: 860 }); this.pixiTMR = new PixiTMR(this, this.pixiApp); + this.subdialog = undefined this.callbacksOnAnimate = []; if (!this.viewOnly) { @@ -73,6 +74,27 @@ export class RdDTMRDialog extends Dialog { this.pixiTMR.load((loader, resources) => this.createPixiSprites()); } + async forceTMRDisplay() { + this.bringToTop(); + if (this.subdialog) { + this.subdialog.bringToTop(); + } + } + async restoreTMRAfterAction() { + this.subdialog = undefined + this.bringToTop(); + } + + forceTMRContinueAction() { + ui.notifications.warn('Vous devez finir votre action avant de continuer dans les TMR'); + this.subdialog.bringToTop(); + return; + } + + setTMRPendingAction(dialog) { + this.subdialog = dialog + } + isDemiReveCache() { return !game.user.isGM && this.actor.isTMRCache(); } @@ -174,6 +196,9 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ async moveFromKey(move) { + if (this.subdialog) { + return this.forceTMRContinueAction(); + } let oddq = TMRUtility.coordTMRToOddq(this._getActorCoord()); if (move == 'top') oddq.row -= 1; @@ -198,7 +223,9 @@ export class RdDTMRDialog extends Dialog { super.activateListeners(html); this.html = html; - document.getElementById("tmrrow1").insertCell(0).append(this.pixiApp.view); + document.getElementsByClassName("tmr-row") + .item(0) + .insertCell(0).append(this.pixiApp.view); if (this.viewOnly) { this.html.find('.lancer-sort').remove(); @@ -209,6 +236,10 @@ export class RdDTMRDialog extends Dialog { HtmlUtility.showControlWhen(this.html.find(".appliquerFatigue"), ReglesOptionnelles.isUsing("appliquer-fatigue")); HtmlUtility.showControlWhen(this.html.find(".lire-signe-draconique"), this.actor.isResonanceSigneDraconique(this._getActorCoord())); + this.html.find('tr.tmr-row *').click((event) => { + this.subdialog?.bringToTop(); + }); + // Roll Sort this.html.find('.lancer-sort').click((event) => { this.actor.rollUnSort(this._getActorCoord()); @@ -230,7 +261,6 @@ export class RdDTMRDialog extends Dialog { this.cumulFatigue += this.fatigueParCase; } await this.actor.reveActuelIncDec(reveCout); - // Le reste... this.updateValuesDisplay(); let tmr = TMRUtility.getTMR(this._getActorCoord()); @@ -270,6 +300,10 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ async close() { + if (this.subdialog) { + return this.forceTMRContinueAction() + } + this.descenteTMR = true; if (this.actor.tmrApp) { this.actor.tmrApp = undefined; // Cleanup reference @@ -292,6 +326,7 @@ export class RdDTMRDialog extends Dialog { switch (action) { case 'derober': await this.derober(); + this.restoreTMRAfterAction(); return; case 'refouler': await this.refouler(); @@ -304,6 +339,7 @@ export class RdDTMRDialog extends Dialog { break; } await this.postRencontre(tmr); + this.restoreTMRAfterAction(); } async derober() { @@ -359,7 +395,6 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ checkQuitterTMR() { - if (this.actor.isDead()) { this._tellToGM("Vous êtes mort : vous quittez les Terres médianes !"); this.close(); @@ -530,8 +565,9 @@ export class RdDTMRDialog extends Dialog { await this.maitriserRencontre(); } else { - let dialog = new RdDTMRRencontreDialog(this, this.currentRencontre, tmr); + const dialog = new RdDTMRRencontreDialog(this.actor, this.currentRencontre, tmr); dialog.render(true); + this.setTMRPendingAction(dialog); } } else { @@ -586,7 +622,10 @@ export class RdDTMRDialog extends Dialog { ? TMRUtility.getTMRType(tmr.coord) + " ??" : tmr.label + " (" + tmr.coord + ")"); + const fakeDialogRencontre = { bringToTop: () => { } }; + this.setTMRPendingAction(fakeDialogRencontre) let myRoll = await RdDDice.rollTotal("1dt", { showDice: SHOW_DICE }); + this.restoreTMRAfterAction() if (myRoll == 7) { this._tellToUser(myRoll + ": Rencontre en " + locTMR); return await game.system.rdd.rencontresTMR.getRencontreAleatoire(tmr, this.actor.isMauvaiseRencontre()) @@ -781,7 +820,7 @@ export class RdDTMRDialog extends Dialog { const dialog = await RdDRoll.create(this.actor, rollData, { html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-maitrise-tmr.html', - close: html => { this.maximize(); } // Re-display TMR + close: html => { this.restoreTMRAfterAction(); } }, { name: rollData.maitrise.verbe, label: rollData.maitrise.action, @@ -861,7 +900,8 @@ export class RdDTMRDialog extends Dialog { nettoyerRencontre() { if (!this.currentRencontre) return; // Sanity check if (this.currentRencontre.graphics) { - for (let drawRect of this.currentRencontre.graphics) { // Suppression des dessins des zones possibles + for (let drawRect of this.currentRencontre.graphics) { + // Suppression des dessins des zones possibles this.pixiApp.stage.removeChild(drawRect); } } @@ -894,8 +934,8 @@ export class RdDTMRDialog extends Dialog { } /* -------------------------------------------- */ - isConnaissanceFleuve(currentTMR, nextTMR) { - return TMRUtility.getTMR(currentTMR).type == 'fleuve' && + isConnaissanceFleuve(tmrApp, nextTMR) { + return TMRUtility.getTMR(tmrApp).type == 'fleuve' && TMRUtility.getTMR(nextTMR).type == 'fleuve' && EffetsDraconiques.isConnaissanceFleuve(this.actor); } @@ -905,6 +945,9 @@ export class RdDTMRDialog extends Dialog { if (this.viewOnly) { return; } + if (this.subdialog) { + return this.forceTMRContinueAction() + } let clickOddq = TMRUtility.computeEventOddq(event); let currentOddq = TMRUtility.coordTMRToOddq(this._getActorCoord()); @@ -971,9 +1014,11 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ async _messagerDemiReve(targetCoord) { /* - TODO: si la case a un sort en réserve, lancer ce sort. + TODO: + Si la case a un sort en réserve, lancer ce sort. Si la case est le demi-rêve, ne pas lancer de sort. - Si un lancement de sort est en cours, trouver un moyen de réafficher cette fenêtre si on essaie de lancer un sort (ou bloquer le lancer de sort) + Si un lancement de sort est en cours, trouver un moyen de réafficher cette fenêtre + si on essaie de lancer un sort (ou bloquer le lancer de sort) */ this.notifierResonanceSigneDraconique(targetCoord); await this.actor.rollUnSort(targetCoord); @@ -990,6 +1035,9 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ async _deplacerDemiReve(targetCoord, deplacementType) { + if (this.subdialog) { + return this.forceTMRContinueAction() + } if (this.currentRencontre != 'normal') { this.nettoyerRencontre(); } @@ -1039,6 +1087,10 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ async positionnerDemiReve(coord) { + if (this.subdialog) { + return this.forceTMRContinueAction() + } + await this.actor.updateCoordTMR(coord); this.forceDemiRevePositionView(); let tmr = TMRUtility.getTMR(coord); diff --git a/module/rdd-tmr-rencontre-dialog.js b/module/rdd-tmr-rencontre-dialog.js index b1a859f2..b5426e93 100644 --- a/module/rdd-tmr-rencontre-dialog.js +++ b/module/rdd-tmr-rencontre-dialog.js @@ -2,7 +2,7 @@ export class RdDTMRRencontreDialog extends Dialog { /* -------------------------------------------- */ - constructor(tmrApp, rencontre, tmr) { + constructor(actor, rencontre, tmr) { const dialogConf = { title: "Rencontre en TMR!", content: "Vous rencontrez un " + rencontre.name + " de force " + rencontre.system.force + "
", @@ -28,23 +28,30 @@ export class RdDTMRRencontreDialog extends Dialog { this.toClose = false; this.tmr = tmr; - this.tmrApp = tmrApp; + this.actor = actor; this.rencontre = rencontre; - this.tmrApp.minimize(); } async onButtonAction(action) { this.toClose = true; - this.tmrApp.onActionRencontre(action, this.tmr, this.rencontre) + this.actor.tmrApp?.onActionRencontre(action, this.tmr, this.rencontre) } /* -------------------------------------------- */ - close() { - if (this.toClose) { - this.tmrApp.maximize(); - return super.close(); + async close() { + if (this.actor.tmrApp){ + if (this.toClose) { + this.actor.tmrApp?.restoreTMRAfterAction(); + return await super.close(); + } + else { + ui.notifications.info("Vous devez résoudre la rencontre."); + this.actor.tmrApp.forceTMRContinueAction(); + } + } + else { + return await super.close(); } - ui.notifications.info("Vous devez résoudre la rencontre."); } } diff --git a/module/tmr-utility.js b/module/tmr-utility.js index 38e36e24..32522a11 100644 --- a/module/tmr-utility.js +++ b/module/tmr-utility.js @@ -378,6 +378,9 @@ export class TMRUtility { // /* -------------------------------------------- */ static computeEventPosition(event) { + if (!event.nativeEvent.target.getBoundingClientRect) { + return { x: 0, y: 0 } + } const canvasRect = event.nativeEvent.target.getBoundingClientRect(); return { x: event.nativeEvent.clientX - canvasRect.left, @@ -389,7 +392,7 @@ export class TMRUtility { static computeEventOddq(event) { var { x, y } = TMRUtility.computeEventPosition(event); return TMRUtility.computeOddq(x, y); - } + } static computeOddq(x, y) { const col = Math.floor(x / tmrConstants.cellw); // [From 0 -> 12] diff --git a/templates/dialog-tmr.html b/templates/dialog-tmr.html index d11e003e..3c170609 100644 --- a/templates/dialog-tmr.html +++ b/templates/dialog-tmr.html @@ -1,6 +1,6 @@
- +
{{#if (eq mode "visu")}}