From ac09e1854b7952c1b3ac43bfc6176abe864a41e6 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 14 Nov 2023 01:51:32 +0100 Subject: [PATCH 1/7] Typo: Tricollet --- packs/faune-flore-mineraux.db | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packs/faune-flore-mineraux.db b/packs/faune-flore-mineraux.db index f75c5f4c..b42eb60e 100644 --- a/packs/faune-flore-mineraux.db +++ b/packs/faune-flore-mineraux.db @@ -12,7 +12,7 @@ {"name":"Lièvre","type":"faune","img":"systems/foundryvtt-reve-de-dragon/icons/faune/lapin.webp","system":{"description":"

Lièvre. Plaine, 4 kg, 8 sust.

","descriptionmj":"","encombrement":2,"quantite":1,"qualite":0,"cout":0,"milieu":"Plaines","environnement":[{"milieu":"Plaines","rarete":"Frequente","frequence":18}],"sust":8,"exotisme":0,"categorie":"","actor":{"id":"","pack":"","name":""}},"effects":[],"flags":{"core":{"sourceId":"Item.LU5eutNQqwm52oOG"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1670580597921,"modifiedTime":1673657676879,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"5rGi4IeFyxQwyOOq","folder":null,"sort":0,"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3}} {"name":"Salsimir ventru","type":"plante","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.66Rzf8phcEQRIShv"}},"img":"systems/foundryvtt-reve-de-dragon/icons/botanique/Salsimir%20ventru.webp","effects":[],"_id":"66Rzf8phcEQRIShv","system":{"description":"

À points jaunes ou à points rouges, le salsimir ventru se distingue par un pied large et renflé.

\n

Rare.

","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":4,"cout":0,"milieu":"Lieux sombres et humides","environnement":[{"milieu":"Forêts","rarete":"Rare","frequence":9},{"milieu":"Sous-sols","rarete":"Rarissime","frequence":3}],"sust":1,"exotisme":0,"niveau":4,"base":0,"categorie":"Cuisine","rarete":"Rare"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1669734708517,"modifiedTime":1673792106248,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}} {"name":"Sautille","type":"faune","img":"systems/foundryvtt-reve-de-dragon/icons/faune/oiseau.webp","system":{"description":"

Sautille. Rivage, 1 kg, 2 sust. Petit échassier voisin de la grue qui, au lieu de marcher tranquillement, passe son temps àsautiller sur ses longues pattes.

","descriptionmj":"","encombrement":0.5,"quantite":1,"qualite":0,"cout":0,"milieu":"Rivage","environnement":[{"milieu":"Cours d'eau","rarete":"Frequente","frequence":18}],"sust":2,"exotisme":0,"categorie":"","actor":{"id":"","pack":"","name":""}},"effects":[],"flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.6bvChVkjsy5tsa4d"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1670580597921,"modifiedTime":1673657676885,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"6bvChVkjsy5tsa4d","folder":null,"sort":0,"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3}} -{"name":"Tricolet","type":"plante","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.6gb2cjdPXI44ym8D"}},"img":"systems/foundryvtt-reve-de-dragon/icons/botanique/Tricollet.webp","effects":[],"_id":"6gb2cjdPXI44ym8D","system":{"description":"

Champignon à pied blanc, triple volve, et large chapeau vert à points bleus.

\n

Rare.

","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":4,"cout":0,"milieu":"Lieux sombres et humides","environnement":[{"milieu":"Forêts","rarete":"Rare","frequence":6},{"milieu":"Sous-sols","rarete":"Rarissime","frequence":3}],"sust":1,"exotisme":0,"niveau":4,"base":0,"categorie":"Cuisine","rarete":"Rare"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1669734708518,"modifiedTime":1673792147727,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}} +{"name":"Tricollet","type":"plante","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.6gb2cjdPXI44ym8D"}},"img":"systems/foundryvtt-reve-de-dragon/icons/botanique/Tricollet.webp","effects":[],"_id":"6gb2cjdPXI44ym8D","system":{"description":"

Champignon à pied blanc, triple volve, et large chapeau vert à points bleus.

\n

Rare.

","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":4,"cout":0,"milieu":"Lieux sombres et humides","environnement":[{"milieu":"Forêts","rarete":"Rare","frequence":6},{"milieu":"Sous-sols","rarete":"Rarissime","frequence":3}],"sust":1,"exotisme":0,"niveau":4,"base":0,"categorie":"Cuisine","rarete":"Rare"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1669734708518,"modifiedTime":1673792147727,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}} {"name":"Lapin","type":"faune","img":"systems/foundryvtt-reve-de-dragon/icons/faune/lapin.webp","system":{"description":"

Lapin. Forêt, plaine, 2 kg, 5 sust.

","descriptionmj":"","encombrement":1,"quantite":1,"qualite":0,"cout":0,"milieu":"Forets, Plaines","environnement":[{"milieu":"Forêts","rarete":"Commune","frequence":54},{"milieu":"Plaines","rarete":"Commune","frequence":54}],"sust":5,"exotisme":0,"categorie":"","actor":{"id":"","pack":"","name":""}},"effects":[],"flags":{"core":{"sourceId":"Item.LU5eutNQqwm52oOG"}},"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1670580597921,"modifiedTime":1673657676879,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"},"_id":"6pDi7Pew5FZ3Ca1I","folder":null,"sort":0,"ownership":{"default":0,"jtRmvSuwkwMmIMf0":3}} {"name":"Salsimir à points verts","type":"plante","flags":{"core":{"sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.7IV2V4ZotDEP2sLs"}},"img":"systems/foundryvtt-reve-de-dragon/icons/botanique/Salsimir%20%C3%A0%20points%20verts.webp","effects":[],"_id":"7IV2V4ZotDEP2sLs","system":{"description":"

Champignon semblable aux autres variétés de salsimir, hormis la couleur de ses points.

Pour l'empoisonnement, voir: @UUID[Compendium.foundryvtt-reve-de-dragon.maladies-et-poisons.Rx2nQjwaCa5s38Tm]{Salsimir à points verts}

Rare.

","descriptionmj":"","encombrement":0.1,"quantite":1,"qualite":0,"cout":0,"milieu":"Lieux sombres et humides","environnement":[{"milieu":"Forêts","rarete":"Rare","frequence":9},{"milieu":"Sous-sols","rarete":"Rarissime","frequence":3}],"sust":0,"exotisme":0,"niveau":null,"base":0,"categorie":"Poison","rarete":"Rare"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1669734708518,"modifiedTime":1673792134571,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}} {"name":"Tanemiel doré","type":"herbe","flags":{"core":{"sheetClass":"foundryvtt-reve-de-dragon.RdDItemSheet","sourceId":"Compendium.foundryvtt-reve-de-dragon.faune-flore-mineraux.7RgTRB47YPH74BwF"}},"img":"systems/foundryvtt-reve-de-dragon/icons/botanique/Tanemiel%20dor%C3%A9.webp","effects":[],"_id":"7RgTRB47YPH74BwF","system":{"description":"

Herbe de soin.

\n

Variété de tanemiel aux feuilles luisantes de couleur ambrée.

\n

Rarissime.

\n

 

\n

Voir Les herbes de soin, p100.

","descriptionmj":"","encombrement":0,"quantite":1,"qualite":0,"cout":2,"milieu":"Forêts chaudes et humides","environnement":[{"milieu":"Forêts","rarete":"Rarissime","frequence":2}],"sust":0,"exotisme":0,"niveau":10,"base":0,"categorie":"Soin","rarete":"Rarissime"},"ownership":{"default":0,"rYShh2P1DNavdoBD":3},"folder":null,"sort":0,"_stats":{"systemId":"foundryvtt-reve-de-dragon","systemVersion":"10.6.0","coreVersion":"10.291","createdTime":1669734708518,"modifiedTime":1673657676886,"lastModifiedBy":"Hp9ImM4o9YRTSdfu"}} From 30d41861fa41d840676ff32fdc881352917045f9 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Wed, 15 Nov 2023 22:03:57 +0100 Subject: [PATCH 2/7] Support hot reload for templates and css --- system.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/system.json b/system.json index 59c30ff1..fa90a028 100644 --- a/system.json +++ b/system.json @@ -40,6 +40,19 @@ "flags": {} } ], + "flags": { + "hotReload": { + "extensions": [ + "css", + "hbs", + "html" + ], + "paths": [ + "styles/", + "templates/" + ] + } + }, "url": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/", "license": "LICENSE.txt", "esmodules": [ From c7e00749c960b24e0add1941ebefa79614f5618b Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Wed, 15 Nov 2023 22:11:44 +0100 Subject: [PATCH 3/7] Fix: deplacement aleatoire MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le déplacement aléatoire ne prenait pas compte de la différence entre colonnes paires/impaires --- module/rdd-tmr-dialog.js | 67 +++++++--------- module/tmr-utility.js | 77 +++++++++---------- ...dir-bottom-left.svg => dir-bottomleft.svg} | 0 ...r-bottom-right.svg => dir-bottomright.svg} | 0 .../ui/{dir-top-left.svg => dir-topleft.svg} | 0 .../{dir-top-right.svg => dir-topright.svg} | 0 templates/dialog-tmr.html | 13 ++-- 7 files changed, 69 insertions(+), 88 deletions(-) rename styles/img/ui/{dir-bottom-left.svg => dir-bottomleft.svg} (100%) rename styles/img/ui/{dir-bottom-right.svg => dir-bottomright.svg} (100%) rename styles/img/ui/{dir-top-left.svg => dir-topleft.svg} (100%) rename styles/img/ui/{dir-top-right.svg => dir-topright.svg} (100%) diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index 4bec890c..cda22f09 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -19,7 +19,6 @@ import { RdDTimestamp } from "./time/rdd-timestamp.js"; import { TYPES } from "./item.js"; /* -------------------------------------------- */ - export class RdDTMRDialog extends Dialog { static async create(actor, tmrData) { @@ -188,36 +187,23 @@ export class RdDTMRDialog extends Dialog { } forceDemiRevePositionView() { - this.notifierResonanceSigneDraconique(this._getActorCoord()); + this.notifierResonanceSigneDraconique(this._getCoordActor()); this._trackToken(this.demiReve); } - _getActorCoord() { + _getCoordActor() { return this.actor.system.reve.tmrpos.coord; } /* -------------------------------------------- */ - async moveFromKey(move) { + async deplacementTMR(move) { if (this.subdialog) { return this.forceTMRContinueAction(); } - let oddq = TMRUtility.coordTMRToOddq(this._getActorCoord()); - - if (move == 'top') oddq.row -= 1; - if (move == 'bottom') oddq.row += 1; - if (move.includes('left')) oddq.col -= 1; - if (move.includes('right')) oddq.col += 1; - if (oddq.col % 2 == 1) { - if (move == 'top-left') oddq.row -= 1; - if (move == 'top-right') oddq.row -= 1; - } else { - if (move == 'bottom-left') oddq.row += 1; - if (move == 'bottom-right') oddq.row += 1; - } - - let targetCoord = TMRUtility.oddqToCoordTMR(oddq); - await this._deplacerDemiReve(targetCoord, 'normal'); + const coordOrig = this._getCoordActor(); + const coordTarget = TMRUtility.deplacement(coordOrig, move); + await this._deplacerDemiReve(coordTarget, 'normal'); this.checkQuitterTMR(); } @@ -238,36 +224,36 @@ 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())); + HtmlUtility.showControlWhen(this.html.find(".lire-signe-draconique"), this.actor.isResonanceSigneDraconique(this._getCoordActor())); 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())); - this.html.find('.lire-signe-draconique').click(event => this.actor.rollLireSigneDraconique(this._getActorCoord())); - this.html.find('#dir-top').click(event=> this.moveFromKey("top")); - this.html.find('#dir-top-left').click(event=> this.moveFromKey("top-left")); - this.html.find('#dir-top-right').click(event=> this.moveFromKey("top-right")); - this.html.find('#dir-bottom-left').click(event=> this.moveFromKey("bottom-left")); - this.html.find('#dir-bottom-right').click(event=> this.moveFromKey("bottom-right")); - this.html.find('#dir-bottom').click(event=> this.moveFromKey("bottom")); + this.html.find('.lancer-sort').click(event => this.actor.rollUnSort(this._getCoordActor())); + this.html.find('.lire-signe-draconique').click(event => this.actor.rollLireSigneDraconique(this._getCoordActor())); + + 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 - let reveCout = ((this.tmrdata.isRapide && !EffetsDraconiques.isDeplacementAccelere(this.actor)) ? -2 : -1) - this.actor.countMonteeLaborieuse(); - await this.actor.reveActuelIncDec(reveCout); + await this.actor.reveActuelIncDec(this.calculCoutMonteeTMR()); this.cumulFatigue += this.fatigueParCase; + // Le reste... this.updateValuesDisplay(); - let tmr = TMRUtility.getTMR(this._getActorCoord()); + let tmr = TMRUtility.getTMR(this._getCoordActor()); await this.manageRencontre(tmr); } + calculCoutMonteeTMR() { + return ((this.tmrdata.isRapide && !EffetsDraconiques.isDeplacementAccelere(this.actor)) ? -2 : -1) - this.actor.countMonteeLaborieuse(); + } + /* -------------------------------------------- */ async updateValuesDisplay() { if (!this.rendered) { return; } - const coord = this._getActorCoord(); + const coord = this._getCoordActor(); HtmlUtility.showControlWhen(this.html.find(".lire-signe-draconique"), this.actor.isResonanceSigneDraconique(coord)); @@ -425,7 +411,7 @@ export class RdDTMRDialog extends Dialog { nbRounds: 1, canClose: false, selectedCarac: { label: "reve-actuel" }, - tmr: TMRUtility.getTMR(this._getActorCoord()) + tmr: TMRUtility.getTMR(this._getCoordActor()) } await this._tentativeMaitrise(rencontreData); @@ -608,19 +594,18 @@ export class RdDTMRDialog extends Dialog { if (rencontre) { return game.system.rdd.rencontresTMR.calculRencontre(rencontre, tmr); } - let locTMR = (this.isDemiReveCache() + const coordTMR = (this.isDemiReveCache() ? TMRUtility.getTMRType(tmr.coord) + " ??" : tmr.label + " (" + tmr.coord + ")"); - const fakeDialogRencontre = { bringToTop: () => { } }; - this.setTMRPendingAction(fakeDialogRencontre) - let myRoll = await RdDDice.rollTotal("1dt", { showDice: SHOW_DICE }); + this.setTMRPendingAction({ bringToTop: () => { } }) + const myRoll = await RdDDice.rollTotal("1dt", { showDice: SHOW_DICE }); this.restoreTMRAfterAction() if (myRoll == 7) { - this._tellToUser(myRoll + ": Rencontre en " + locTMR); + this._tellToUser(myRoll + ": Rencontre en " + coordTMR); return await game.system.rdd.rencontresTMR.getRencontreAleatoire(tmr, this.actor.isMauvaiseRencontre()) } else { - this._tellToUser(myRoll + ": Pas de rencontre en " + locTMR); + this._tellToUser(myRoll + ": Pas de rencontre en " + coordTMR); return undefined; } } @@ -935,7 +920,7 @@ export class RdDTMRDialog extends Dialog { return this.forceTMRContinueAction() } let clickOddq = TMRUtility.computeEventOddq(event); - let currentOddq = TMRUtility.coordTMRToOddq(this._getActorCoord()); + let currentOddq = TMRUtility.coordTMRToOddq(this._getCoordActor()); let targetCoord = TMRUtility.oddqToCoordTMR(clickOddq); let currentCoord = TMRUtility.oddqToCoordTMR(currentOddq); diff --git a/module/tmr-utility.js b/module/tmr-utility.js index 32522a11..4414b43c 100644 --- a/module/tmr-utility.js +++ b/module/tmr-utility.js @@ -228,14 +228,15 @@ export const TMRType = { } /* -------------------------------------------- */ -const tmrRandomMovePatten = - [{ name: 'top', col: 0, row: -1 }, - { name: 'topright', col: 1, row: -1 }, - { name: 'botright', col: 1, row: 1 }, - { name: 'bot', col: 0, row: 1 }, - { name: 'botleft', col: -1, row: 1 }, - { name: 'topleft', col: -1, row: -1 } - ] +const TMR_MOVE = { + "top": { even: { row: -1, col: 0 }, odd: { row: -1, col: 0 }, }, + "topleft": { even: { row: -1, col: -1 }, odd: { row: 0, col: -1 }, }, + "topright": { even: { row: -1, col: 1 }, odd: { row: 0, col: 1 }, }, + "bottomleft": { even: { row: 0, col: -1 }, odd: { row: 1, col: -1 }, }, + "bottomright": { even: { row: 0, col: 1 }, odd: { row: 1, col: 1 }, }, + "bottom": { even: { row: 1, col: 0 }, odd: { row: 1, col: 0 }, }, +} + /* -------------------------------------------- */ export class TMRUtility { @@ -313,16 +314,32 @@ export class TMRUtility { } /* -------------------------------------------- */ - static async getDirectionPattern() { - return await RdDDice.rollOneOf(tmrRandomMovePatten); + static deplacement(coordOrig, moveName) { + const tmrMove = TMR_MOVE[moveName]; + if (! tmrMove) { + ui.notifications.error(`Le déplacement dans les TMR '${moveName}' est inconnu`) + return coordOrig + } + const fromOddq = TMRUtility.coordTMRToOddq(coordOrig); + const move = TMRUtility.getOddqMove(tmrMove, fromOddq); + const toOddq = TMRUtility.addOddq(fromOddq, move); + return TMRUtility.oddqToCoordTMR(toOddq); + } + + static getOddqMove(tmrMove, oddq) { + return oddq.col % 2 == 1 ? tmrMove.odd : tmrMove.even; + } + + static async getDirectionPattern(oddq) { + const tmrMove = await RdDDice.rollOneOf(Object.values(TMR_MOVE)); + return TMRUtility.getOddqMove(tmrMove, oddq); } /* -------------------------------------------- */ static async deplaceTMRAleatoire(actor, coord) { - const currentOddq = TMRUtility.coordTMRToOddq(coord); - const direction = await TMRUtility.getDirectionPattern(); - currentOddq.col = currentOddq.col + direction.col; - currentOddq.row = currentOddq.row + direction.row; + const oddq = TMRUtility.coordTMRToOddq(coord); + const direction = await TMRUtility.getDirectionPattern(oddq); + const currentOddq = TMRUtility.addOddq(oddq, direction) if (this.isOddqInTMR(currentOddq)) { // Sortie de carte ! Ré-insertion aléatoire return TMRUtility.getTMR(TMRUtility.oddqToCoordTMR(currentOddq)); } else { @@ -432,12 +449,8 @@ export class TMRUtility { row >= 0 && (row + col % 2 <= 14) ); - // if (x >= 0 && x < 13 && y >= 0 && y < 14) return true; - // if (x >= 0 && x < 13 && x % 2 == 0 && y == 14) return true; - // return false; } - /* -------------------------------------------- */ static distanceCoordTMR(coord1, coord2) { let oddq1 = this.coordTMRToOddq(coord1); @@ -450,13 +463,13 @@ export class TMRUtility { const axial1 = TMRUtility.oddqToAxial(oddq1); const axial2 = TMRUtility.oddqToAxial(oddq2); return TMRUtility.distanceAxial(axial1, axial2); + } - // const dx = oddq2.col - oddq1.col; - // const dy = oddq2.row - oddq1.row; - // const abs_dx = Math.abs(dx); - // const abs_dy = Math.abs(dy); - // const distance = Math.sign(dx) == Math.sign(dy) ? Math.max(abs_dx, abs_dy) : (abs_dx + abs_dy); - // return distance; + static addOddq(move, oddq) { + return { + row: oddq.row + move.row, + col: oddq.col + move.col + } } static oddqToAxial(pos) { @@ -480,20 +493,4 @@ export class TMRUtility { }; } - // function axial_to_cube(hex): - // var q = hex.q - // var r = hex.r - // var s = -q - r - // return Cube(q, r, s) - // } - - - // /* -------------------------------------------- */ - // static computeRealPictureCoordinates(coordOddq) { - // let decallagePairImpair = (coordOddq.col % 2 == 0) ? tmrConstants.col1_y : tmrConstants.col2_y; - // return { - // x: tmrConstants.gridx + (coordOddq.col * tmrConstants.cellw), - // y: tmrConstants.gridy + (coordOddq.row * tmrConstants.cellh) + decallagePairImpair - // } - // } } \ No newline at end of file diff --git a/styles/img/ui/dir-bottom-left.svg b/styles/img/ui/dir-bottomleft.svg similarity index 100% rename from styles/img/ui/dir-bottom-left.svg rename to styles/img/ui/dir-bottomleft.svg diff --git a/styles/img/ui/dir-bottom-right.svg b/styles/img/ui/dir-bottomright.svg similarity index 100% rename from styles/img/ui/dir-bottom-right.svg rename to styles/img/ui/dir-bottomright.svg diff --git a/styles/img/ui/dir-top-left.svg b/styles/img/ui/dir-topleft.svg similarity index 100% rename from styles/img/ui/dir-top-left.svg rename to styles/img/ui/dir-topleft.svg diff --git a/styles/img/ui/dir-top-right.svg b/styles/img/ui/dir-topright.svg similarity index 100% rename from styles/img/ui/dir-top-right.svg rename to styles/img/ui/dir-topright.svg diff --git a/templates/dialog-tmr.html b/templates/dialog-tmr.html index 6ca5ed09..f5c736dd 100644 --- a/templates/dialog-tmr.html +++ b/templates/dialog-tmr.html @@ -1,5 +1,4 @@
-
@@ -14,14 +13,14 @@ {{/if}}
- - - + + +
- - - + + +
Lire un signe draconique From da3091dc4bbb830e9712e8546f109b2f511508c2 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Wed, 15 Nov 2023 22:19:33 +0100 Subject: [PATCH 4/7] =?UTF-8?q?Fix:=20urgence=20draconique,=20compl=C3=A9m?= =?UTF-8?q?ent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/tmr/urgence-draconique.js | 1 + 1 file changed, 1 insertion(+) diff --git a/module/tmr/urgence-draconique.js b/module/tmr/urgence-draconique.js index fda4fa19..2d0b187b 100644 --- a/module/tmr/urgence-draconique.js +++ b/module/tmr/urgence-draconique.js @@ -5,6 +5,7 @@ import { RdDRollTables } from "../rdd-rolltables.js"; import { TMRUtility } from "../tmr-utility.js"; import { tmrConstants, tmrColors, tmrTokenZIndex } from "../tmr-constants.js"; import { Draconique } from "./draconique.js"; +import { TYPES } from "../item.js"; export class UrgenceDraconique extends Draconique { From bfd3b0d74af569f9d78bfaef973e0fc134916d6d Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Wed, 15 Nov 2023 22:14:00 +0100 Subject: [PATCH 5/7] =?UTF-8?q?R=C3=A9duction=20de=20l'espace=20des=20TMR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- icons/tmr/attache.svg | 1 + icons/tmr/conquete.svg | 1 + icons/tmr/debordement.svg | 1 + icons/tmr/demi-reve.svg | 124 +++++++++++++++++++ icons/tmr/desorientation.svg | 55 +++++++++ icons/tmr/fermeture.svg | 190 ++++++++++++++++++++++++++++ icons/tmr/gift.webp | Bin 44924 -> 0 bytes icons/tmr/maitrisee.svg | 1 + icons/tmr/pelerin.webp | Bin 25718 -> 0 bytes icons/tmr/pelerinage.svg | 1 + icons/tmr/periple.svg | 1 + icons/tmr/present.svg | 1 + icons/tmr/rencontre.svg | 1 + icons/tmr/reserve.svg | 1 + icons/tmr/scroll.webp | Bin 46078 -> 0 bytes icons/tmr/sort-reserve.svg | 132 ++++++++++++++++++++ icons/tmr/treasure-chest.webp | Bin 17436 -> 0 bytes icons/tmr/trounoir.svg | 126 +++++++++++++++++++ icons/tmr/urgence.svg | 1 + icons/tmr/wave.webp | Bin 13618 -> 0 bytes module/actor.js | 3 +- module/rdd-main.js | 2 + module/rdd-tmr-dialog.js | 204 +++++++++++++++++++------------ module/tmr-constants.js | 91 ++++++++++---- module/tmr-utility.js | 66 ++++------ module/tmr/animation.js | 107 ++++++++++++++++ module/tmr/augmentation-seuil.js | 4 - module/tmr/carte-tmr.js | 12 +- module/tmr/conquete.js | 28 ++--- module/tmr/debordement.js | 22 ++-- module/tmr/demi-reve.js | 10 +- module/tmr/desorientation.js | 29 ++--- module/tmr/draconique.js | 32 ++--- module/tmr/effets-draconiques.js | 7 +- module/tmr/fermeture-cites.js | 25 ++-- module/tmr/pelerinage.js | 37 +++--- module/tmr/periple.js | 28 ++--- module/tmr/pixi-tmr.js | 165 ++++++++++++++----------- module/tmr/pont-impraticable.js | 17 +-- module/tmr/present-cites.js | 17 +-- module/tmr/quete-eaux.js | 18 ++- module/tmr/rencontre.js | 15 +-- module/tmr/reserve-extensible.js | 16 ++- module/tmr/sort-reserve.js | 12 +- module/tmr/terre-attache.js | 17 ++- module/tmr/trou-noir.js | 17 +-- module/tmr/urgence-draconique.js | 23 ++-- styles/simple.css | 36 +++++- templates/dialog-tmr.html | 54 +++++--- 49 files changed, 1288 insertions(+), 463 deletions(-) create mode 100644 icons/tmr/attache.svg create mode 100644 icons/tmr/conquete.svg create mode 100644 icons/tmr/debordement.svg create mode 100644 icons/tmr/demi-reve.svg create mode 100644 icons/tmr/desorientation.svg create mode 100644 icons/tmr/fermeture.svg delete mode 100644 icons/tmr/gift.webp create mode 100644 icons/tmr/maitrisee.svg delete mode 100644 icons/tmr/pelerin.webp create mode 100644 icons/tmr/pelerinage.svg create mode 100644 icons/tmr/periple.svg create mode 100644 icons/tmr/present.svg create mode 100644 icons/tmr/rencontre.svg create mode 100644 icons/tmr/reserve.svg delete mode 100644 icons/tmr/scroll.webp create mode 100644 icons/tmr/sort-reserve.svg delete mode 100644 icons/tmr/treasure-chest.webp create mode 100644 icons/tmr/trounoir.svg create mode 100644 icons/tmr/urgence.svg delete mode 100644 icons/tmr/wave.webp create mode 100644 module/tmr/animation.js diff --git a/icons/tmr/attache.svg b/icons/tmr/attache.svg new file mode 100644 index 00000000..40dbd506 --- /dev/null +++ b/icons/tmr/attache.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/tmr/conquete.svg b/icons/tmr/conquete.svg new file mode 100644 index 00000000..f5065afa --- /dev/null +++ b/icons/tmr/conquete.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/tmr/debordement.svg b/icons/tmr/debordement.svg new file mode 100644 index 00000000..d544562c --- /dev/null +++ b/icons/tmr/debordement.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/tmr/demi-reve.svg b/icons/tmr/demi-reve.svg new file mode 100644 index 00000000..7b6ab0eb --- /dev/null +++ b/icons/tmr/demi-reve.svg @@ -0,0 +1,124 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/tmr/desorientation.svg b/icons/tmr/desorientation.svg new file mode 100644 index 00000000..7e4c3fb9 --- /dev/null +++ b/icons/tmr/desorientation.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/icons/tmr/fermeture.svg b/icons/tmr/fermeture.svg new file mode 100644 index 00000000..e3d70c97 --- /dev/null +++ b/icons/tmr/fermeture.svg @@ -0,0 +1,190 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/tmr/gift.webp b/icons/tmr/gift.webp deleted file mode 100644 index 7173e6e5b18bc73ec01d9f9d0578276a3308b88a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44924 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 oZikyI#1v=Pd*JC#-jyE%yFPxs \ No newline at end of file diff --git a/icons/tmr/pelerin.webp b/icons/tmr/pelerin.webp deleted file mode 100644 index 687e7429c8717fed764094bf807a5057e28d0a37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25718 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 P8h8Kyox=Yg+VB4X{eZ-C diff --git a/icons/tmr/pelerinage.svg b/icons/tmr/pelerinage.svg new file mode 100644 index 00000000..371af982 --- /dev/null +++ b/icons/tmr/pelerinage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/tmr/periple.svg b/icons/tmr/periple.svg new file mode 100644 index 00000000..7b287467 --- /dev/null +++ b/icons/tmr/periple.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/tmr/present.svg b/icons/tmr/present.svg new file mode 100644 index 00000000..6589cfd7 --- /dev/null +++ b/icons/tmr/present.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/tmr/rencontre.svg b/icons/tmr/rencontre.svg new file mode 100644 index 00000000..fcf0c57e --- /dev/null +++ b/icons/tmr/rencontre.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/tmr/reserve.svg b/icons/tmr/reserve.svg new file mode 100644 index 00000000..6cefe4c0 --- /dev/null +++ b/icons/tmr/reserve.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/tmr/scroll.webp b/icons/tmr/scroll.webp deleted file mode 100644 index 43fd2f1fcb1b8842a8109819bd69d7c24b369d5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46078 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 + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/tmr/treasure-chest.webp b/icons/tmr/treasure-chest.webp deleted file mode 100644 index ff4675ab59cf16bd2c21c0e954f6f227d1fa39e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17436 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 + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/tmr/urgence.svg b/icons/tmr/urgence.svg new file mode 100644 index 00000000..cb683bfd --- /dev/null +++ b/icons/tmr/urgence.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/tmr/wave.webp b/icons/tmr/wave.webp deleted file mode 100644 index 09c6a8b07e15c66533b1dd385f0e58297526f630..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13618 zcmcJVnK|=1*Ew2B^73y4(a`keq&4(3gjMMOoAWaE3=ltUH#xB=S$PV* zTON`eM=s81Tz`1~WkE58S&p0T_ISeAUETKQjW-wtPxWcrlHD;K57wz@xD7$}ut9zm zX$ztF-zkkGNFa1OrBETD5D@Y6Lee)?#ab^ZOEfIgq2apEJ}N%P)Uikp*}2D(>HOF? z8DeRv)5P3?bsyUKM26m>jv0W~xeq1_s|&~LdGiMSB=?)L99F-YV);9KFhS4iO?X;~8L;S4a`{9^Nd36|+7U5Xi#cpMaSNtAnZL zyUS^sy33!1LibxdlWSMcdj3wE{JHufFD3Q0PzGCy*hBhJ-Zkt?h(^(0qJ*m?!esc^ zp855SrL4+FUkCHZu&`D1yC-knyC;8IJ}b|8Jr+|vcr>fkOu43@Rc}o);+1@KiUz+G zcAca4cM`ETIzVZut<0xS;Qkl5-LA4gxlO#JLhfRMgbd1gpu^J2^syKp+9X@GWblO)Ir664Pm6jQ7#&(!espEFG7@fU`}8Ule3xhk17-F zCPKfM#dqM0(7N99z4n=>R(HG3KV)>^l(Z|&7jqYm(1oo9m*eGLnCnBHl5Ogcopy}f zpJ=-~*AToZ-oFy*73$+e8S_w%Hs80r>8T6iToP#kpmYFaDS`$3eoJy+%-ygcEe^RW zeos0kLaD1>STf6g`8L$anuZN%ctnRzWhb&YzYu8XPsSPqJE~C_mkgF*GF(=XqqfQO z6)UrX*hAX4ST>)240=Us!2<*?B@k3AtdmGO-*cA;s7Uy@9-F&$_`Ueb<-gFHD*>TK z|2{r*HS0x@CYo7btM#iZtZ%U>SCwzoRxBXX8I+0cuXv2eAm;M>`)7Fp<4U*dil41b z+h{JaTJ!=?TeMP3y*u37(xLL_G-^Ocofl5rR6mSt8(N3z6l_B`<2S_G|^jYWhLs!`57?Q_VucVExeUCw=Vvvrd2Eg zu*0_{v$T#C`lhN~1g<<{Y`B}q9pp7={N&>5-;tfR@S`+VBC9%dxp>y(b3m2OcmfHV zy*Hje(4a2!HjAtWasgd#{;je7) z(m4K;4aSD6Fbitix&^=dpjDT1JUFjp29;CJ9@`a(x8S<+eB%LBg15p@*OJ#et1X%_RoI1PyYJ&1&W7JP%hrSplPBf>2p z=r9wv&BRivf%OC_k7BkVL!dgLuj%|i{HjIX2jLx`2wB!uvD<+8Cv<3N_U$>>M!zua zc9;Mf&wHbo)WdKlG{hd?ru(XOB@P;-7;McoF@y20p)cjl<8Gj{1tA(>FYrSzBZT0W zPb?jEi3iFcj59FyRdNrdp-^Ri2IM8EP%BWb&V*H!*XX{T)>8%(UqqVRI0k2?ZZ|f@ z3YMY4X$>Rovt{TGCmV1E4{@oN47cmV|9s^%K{80Wl9q0#J&j~is*Jw>o&mCSR#!0C zWvv6~E$k{4@r*yEAVU-%E)`T+g;34C1;eWwpR8eHuky!4zXBl5t!O*2Q;aRxI^k9) zSVODSqJ58vH%$FhW}-iK0ais!+c%|MQIW!wOlBH$?<|Jq1BzsaTOP6YE2VI0d(7;r z{Kz`@n8lD@Fnm@G5h1bx(A5lm;Sqr;7*6&S$%*~a-$%ujU;%mG>-wQ@KcM=u2sbc) zwY+*E7oarAnmGwGEzYVIIRFNjbF`8tSeDCLL+a^VMms`<>?@a2c5GqzI0f7UF4iLu z4;b=yYs;%uds3x(u4(5P67@P=3{v|a-JNsHssG(!3x4`k=MqBHh<7FQX16h=@_r-vR%c zupV~%Vv1FWCLt5t-M?>QNa;Kh^@LV=rNZVXN49?6SDZCMY5}N9*=dh4KLgpwd7uwr z>WnmkZ!(+Kw_1IaMgBS9R(V)Y7aN;lU(E!)7pU6sJwen^LV9UOZ8tea^wF)!d@Dos zrF^;uGa3)d``Voc*L7-5m%oyrn(il5L*U9-!;ei$anmf}Y0WJR@FAn4GhMRps#@k< z>}X@`?J265nW`h^bEKzGmsUTu&nYD-w!?6joV1>cC!<4Tohkoush9Ke!HAk^X(vu4 zv$S`cF(>+DZnF;X6xYB-B|eDo=y%{7QQ*QD?tj_O-bp>C0aszsB~quG?(dr{x@o`l z3ezHKLXa=qmVaGcerMp%gRlg34cPKU#cQsB*FC`qodbaBA~c$kws_~Y5bIWt-N%Qn zt3za)I0=-m(XKt2tgQS+Y?P{%ZxcdT0HAro-^u-(;31Br2?eW5rAqd5=5r3XF#O(R z6-X9T>0a#uhi` z(!~@QU>3z~GRnIMy$jjNh^w;$GV-fkSxcmw=rTLPT+RJwzNlHo?A=@SNoXmCU&1{U zl4z}ufZR)#6*mu4nb3$i)~wPi*!TveH9o6g@?Rnnt*l6VP~?vcRTnu-$Qx4EK9P_f zs9=m=Jdea|2buAEvEQ4pyNK`!y_g6zVM2Dh$M~NVslC`uNumIu1bCZx&@1XaNPimf zuMQgEWDgdK8|{AjiPgJR7I8Snq;B=qbcD1{f+Ky5o9T+0yiU-%n7Dgx`}(^Ct^AA#!mS<^;#L+uV_7w1)M+x8PcUZBs-+Ir@+ihW z%YMi=Cg=4-x~0^A5J4b`RV$z0_AE7maq`)zu6SI zbfxj@7gnj8WwkF_*fh?taUCTAn)D$W6gEraWx(<-IO?M|b@Yme&jRjuyMIDB?1p2;}fBp$O>W2?5Yy-I$y_Sh-i^LGdVnn2eEJO>X$G%;k;pM!E)W~JE~ox zd#Cu{K1(NIal-qFh?H0Zd@mj^Cj)zeuKKWDl)CZNKNq%b|$iMw@~V{HrmQNsUwdB=S!Fe zzu2y)GBKa%Z?kYj=YZf{0P%ht>Y_~i_jtd8rRL&K3Z8Bzu7m~D2y!TB?%;=0sl0#L zRu>sT<0eTn(WAtp@cncE5H)sS5l$WNcMia!WjWaeq>}1)dFx_oEmBpbD&qNLb@t!e z3Arzxd}`}$OHK^km)!o_cgu3#s0rkm7J(s-_z=Gsa2J@&aGwo~r~;_;5$hzxrovR; z_zb>{?&xEbm1C5>vVtrzdVsiiL;Kj(smP|F_JW`Bl(@(gd@p}E(018>kI;jkIMcj4 z9ST5(#G^W$gyo;Lz8D<7zYIAPMvTjJgV2ajgkuB=s;^gE$@iK0(VZ>IxlLm7sB^W38Pl+xJtAnFrUGo0?r`4tsPtKF}(wznCi1D zi_OW1?C83gEiUryOua696hV0t;k_nHMa@n4LtaIz59BSJ-yge4W1#FqcsB`znAf8*J_IPizxx`5>AiUGFV#>xW@mGds>Y1op~`E>h`UWjl_>U=&hU< zv5X(z(f;UzZK%IH4_A8+QNe)xY?{thjf9E`EwY$dO+z*hpk z$(7WtrC@Jh_E>rDak~F5<r&_HLj0?92cQNF7jy=gJlT0%(a!Q3VC#6Vg(N4nlIj6XXWr{ybBymSeeP7S7cBvCR6(xg4<+ zLre^l9dUy{&&5Z2GxELHci~ivWWluV^@up8WSU zW&nl9(SN_kpR3LRuWkbnUWnYQ#57;}K!?UNCt;yVIwDV~BI7oSg@XD;&D zZ|2RYap&-<+~uQ>R23;C)Fo|otM`Gb4Mk79eq4BcG7=A-3vILvB>GZhF{EEF5t4bR zA`kzr4?PUN(@7X*!S#B@Wkf5?obGkSR!wZe|pJ9VusORuJ-L8rB#h$>pqYK_f6ZlPuod(+k4>`uj9IbGj^fR3sZZEa1 z|Dw>l(OjxM1VWx^;l;$>V)4Oe-%N!)i|h|Arp!CQ7_*esCr|lSrM#6gw|fcR3#vk* zzpe}kxeuqI9Jh~afgt^e2q!*l_)^i26~*+$Z&ZHpv`OuxpcfCW?`qnQ6Bg}qF;~Yp z+aHoWcj$tiVZvQsBM=Py1s{|Cto!H#K#3$4pY9c=6+>auVz1=R`0SVj{b_ween6NT z+%>2P$*%cGl*saWv`Xt#B1=p8A6GZcT5*Vb=Nxh3fm3uI%zAWfnkQ2AGq`~$)d3Lht>wwH zeRH=_ht)sbr*~mIEzjsd|7*m-dZ&GxG-6Tw#U#?fwg}N)7#e@Jw=9+-zV0}Ki$KzJ zO~`i*9B^$puRy0XIz`I&-J3sR8Rx&nM>QC{L3A1>;??cD4-LbbQ%1L>a8d1!zsxj@ ztr=9Yaz|JmQwG7bQe?*TW$%0e@pEcb;9T|$@o1zhk;+i zgV>kq89!}5I1XIloZh6~3`-TZiSU(hzZ8nIPUA%robyO{q*%X;v@e!;P)&OoFjXv< z{aCWZy&!!;5#XiCy}~IXQEtsc2PDU@B6Ob=TkQ-eWl>7w%=Lnr(Z9p(s2VYwWMFQg zcX#Kn4y)T(h;!D=_jrU@9&RQ8+Be}nwo;>I(mm|h0q)7)@BL1uw9(7-j)UU3za{so z9p$@^ptHkm6R+|IL#<4PC5FtOf2@1`mqQWJq%am@<#@Wogqt~5Q1k8$vPY1s@zrm zIU&XnDRw4ds`urHh7_R*Klt6*VdE`-QL!Zmm|F`=L;jY*M1S96IH#9Y`+ zmIbtscm7Tos|p|9TJ#+{aP9j?rki9V6-adl+-`O6eok>Hh+o#4{I2g6c$z_*mVE0|9+kkNtkpvt6y)q1KLDQwx<9q@a`x+tXYdu4}mf-hEpjkrssqQiKmq052~kgYt%&+itHULTrlsJFUzLd_P#yz zSGG(`U)$h$Uj!k0CwbzMC_Oeu&j4rUMCwcp<90%o$dcAP2Y;7DmQE|F=JGnhMGPsK+30|cEw!#Wk>B~1B?W*SFFUnajgGmL>xPCi&26Jgx7PG8&=`|Q>v%GI7Vpgx)NtR zNz#46OEOHsbjI(HFEXA{*_gUc5r;f9iezNc|Of z3+?X0b9~KFsbkn9qa}hfBE@bx-j_>{c1v`U~jlXZKspMy)h^Ub^kT={R2)xwJ2p69qIZ9Z=j&m;Ghw~GKu>m6*j?fTCcJ4A2+ z_{|o26jpmhAaMIsKG{24?ubtL^l_yduiU5z@N`DG5R>CIv2+q_yLr5_0Dq}JC5Gn3 z1Q*hH@;%QHrv1P;cmF=-OPU;&*bHrt!c?SdaQJu`&vHdqR~gUOym;>B`nuI)hsoY4 zXu-e6fhXL_GBI!Ye+)9m@At=Yp|G(4nXo8T%hp0`GW5Ux+hK0JJs+0Dietjjg`Qm2 zXf<@v3W$Y{DZ};;P4eS}11SCAnB@ra{;;sIHv>|A8T;|j@AFhFn;~1|3zc`&*Ez83 zf9^YbYuu!5-`${ale8436M{f_AuLz!%# zu$6_A)0Nrv;QP()rxl=s0x9BL|7)i!Z|0&bI+nSozxQ;T$!2}stOxE_kH!VTmOw=& zR;{MoxXRf1cVQ2i-+Kt6+Wmrd-xTy*1RJZq)^J*Gw(*&HYin}gAFMZw>sXWb zM&oLrZmt5q=R|KmaWhT3Gh^B*ke(KY50W(w3b)K6uJm;AMg5%TPrawWHuj7P^_3Grv&c`OxoW1#7&m`%TaT5$yMUi9BDBQE+Av$(3)eINZe(+I(AV%Brem-A1n)^ zrGvmtycyz!64!40iH4|2|K3fZ1nS!$Duj^l3JA+%g!o)Z;F}xnV0veE!wqS0V1K3!8gC)5dOSP0( zA#czPY8rQ1nnkei!}7&uVEY(5m<8-C(tY#|Bl0>%m~X#dkJ=BuKO;`*IAWh~q-*4m zN%mAtZLp?v-V0sMU$1DiGRi72%Mta(GP^gi_>@7_)EoMG<(&F|4c zw~ec9qR0|A^KDro;WuK!;rn*V8TkYWEldl~Hr~jxKMDB>8oZ%CmN*3Wa`4%Gm+k@4 z^BEWIzIKK}PaR(MwnY_M@)O;&OIqqP9hrD)hm;E%`Zkf~y%vMo|8gA>TS~fH>X;wv78;;c$_skPlM$`Yw3~;zshkx1FD)(!N_>knRu{vU%X5x zczqz)qJM7wD6@yp{TXTw%^mEfFW2!BU|%ggt+fe#kVEo2`AlzX)U#E8n=>1*t^7Qd z!Ah?JinRnPJFT^=L*0vsV$+Ge`m-6*{&tTs9Bu6|buL+-AO$*yE+CCmqdt$v1MT`x z+rf{mtd|cN)ez`IH2pcen&|`|y!64Q4Z%+^KEog46o#w!f1-LT$or~`s9rJkFS~K8 zuvdSN3<;J3C3onW=M6ym{}2H0%P#B{r%xIzf-Hz}6TdEO|Ajl%C%mzE{;a>PqAIS( zm6Y<`{S!MFln|_`KuPEYiKVhj95)GRla;~ct zkzs*dmi)+9HsBS@bGea>SY4DD8to5fK4E#bc41IwWVAH_qWe5_d@K4Z_e47y)w}hK zZ?3(kzt1qxYB2w3kEPe20kdCV=r4bKK;Sr6xG|;gQPk|T)xk^)^SC#Y!XT;}ySAx> zE4E@Rj%v`puNAWA1oM$#na=U}v0Io_I=f~8al<(`IpGZRUIA&}Ra&>DO0?Box*B}l zTD3^tt266vCCeHJ}y6L0Ft1`+4y(T>sw%ZwUhTU3TC$zq_qV8@jZEavEC6nqiZNGqrVq zC0hM!ZvhrW8uZ0vU4@)92v;CoYA~`*%gVj;W0JYU%ecmEOlDw(D=Y zbvS;h=d;XtT)rM zK4${l;3;?-=b0mO)6LCBeA$*LX1oZF}&(bpdNfBOA0A}h+JO)L5RS3;K-b9C4TB&{jr>qwngTo7Ck{{>w6%eLR{<)Hk?{efB> z;gqt;u+ztW_C|A=sX%@vw{qR)He6N^yMcWFmLq93+K;`gAm?&CVM9|86>Ehs;f==P zQD9>(cBw*V)`xPWPvz%l`KtV(Int?o6c0N^0M433KgVj;Rq$M$qv8i9XPc>iJT&Ye z>gOO+5ZFq4gY0A3%3H=N{lkBWm9h_&ep-(Hxz$bx#+i0C6HQNcksnZy)`Zq%LfOGw0oW*IonW$53&BtapI~pWwXu(ckzg5cCa~ zO3BXgld!SabY_PpUj$ojHTNl?9VlgivDweQ;=iRDY8QJ$a9@&7T|f23oRZT(61(}@ zCNxKE{UbZ=j>5wYM9QOXs&#{Sc+0uy^AfeyG2aV&AbU`AB8`&Kjk&7yBiNCjO;QA? z-g!&n1LD)p+=M7{&{l4dAb;al|GH5^J%Qn%ImJ` z)DJ}j8^BU1Bw_Po@6~yPPBg;D{zXZ#k(mT!jgZ7RB~mj+@o403+jI35mqYu2x8#P< z8LR63?a@)8#FcESel z|LqF?xVw})pP`+#%$kjW!@v}Omnm`!mJC}n6;QC^k2~KO9iOLkHmIhe+g2_W+H9xc zeCi9;+D=fdlnR(poy$xV#XHlyK5OH*(%P{RFtq$H?~W=~n(kn@?pxLK3X&D@&B-gs z_&hBvCaFq%IP%3Si00Mb%+-T?fsenAe{WK#bk2VZ$E`?kT(wehCf|B_NCdZC|p zU+XjloOy&LJ&~b=4*#<`&F>GzqEpg-W2%`h6pOb13nj0 z@B3?3brol%V^8jGJq_!%`q07cdgSM23#C?_s>|t}dR+nr@o;XwR$d=Q7|kNBIeS5T z5&e>S8h*!}NC2Qh9nKghth=4%KUpm?J7qWY>qQ5R-({#r9b)wHGfn`j-G53(e||1G zuKC*~iML`pGKitimi}^|N&dshp3Juoh1J=bZdfP_c0h|cqefdk(<38U;d`Igq({>u zTNVY=ExJ_Wfz8Y17@Knh=#%NN1wHY)j9q; z8FUNS$u#vO(&Ua&v9md^4%6gqk;{63A(J0D!*N(iUl}Fnrtp!CGpqw1WJvq&m*-@xB13&`&je=hyQQ^%?x2 zyq%HtNpV>xiW%+~13Ih@Epn!H8chTQsfsxox`etzgfCf$g6U4NRP7a4w5{B8LGWk4 zB(!Bt4&S%XbcK*Mh8Uda^H^Z~_YfIrT~o4;Cl&7%q%4Jy@im_Z zj14$El=k_FbMz^sa08~=mJ9VPSAEg;Tnu#>PYlhb7^kL%{ECSz96b&U6|ZZqW2H!9?{BFFxtgPSDmK~sGLxA5P>A7cJJ&k=2?&CFR3_fX#R z+^m)Axe9F%)Pi5O;L?E%W&C0o#DNLPIH+(6S#`Jx{?9XWE{2y^ZuTxesbl?x4iJBD$B&H&7`E_Nr~+DzUf2Z#?3SVVG}r=>3FQ)VK+Mb-?-6# z>xyxD$61kefnn`r#X{b_#ATt0%ahHo*b+9wU>BRITNv6x0e4KgEsHU&+@;Z!C11Jo?pb{KMInB97uLQWfMs)prk1`k%p}>Yxp-x-*GTfGUvjqA36?WUWAH#(yLctf_R`%9 z*}fH&nBjTQmSZ18jlgV9AFf3{+A_Rkv9kd0caPcn3PPUn;G)!sH1TZd8p=D-hCkpU z*JD)ea)kMjmom60FZfA`F&E>o7aTcM|MNw_H+10A`P%vIuR}qmDiexH#PFN?zlNXF zQf4}d;q1~7kNN%+Sf2}<-Uf81m?in%v)boeGunnxA&zIv==YTN!RZh`ymk-vWZo9SKOJS^8b`&CIx zOGZJr>wnP#pTjW8GzGpZE$j*DkJ9dWt~kX~{OyoZ)rfsIWcsRNz{#aM)ZZ1xq% z*PiCvkFwlytA<*R4MVc3mZ4 z8@Q312?ZMsI?-Q$N2^%xNu8${lHxEv`69>~g9h@IIx+XC=W~4f=ZBTupVVn2XmT`T z*wPL!GyGS#h{bS>65d>}!XQkJS<+C*>gKQX%q$7;;6>;kO9!`H4puSta2}$ICkO4f z%rXZmmNEQ;s#enui_;ryI1XOuc||?gG;#cM&ioax$N28~zvsR`*Xa{)+1;`V(tNHT3vz z)#8qVfbrdHP5SU)W}!@>U(^-<$i}uDlP?I~bOBwvKwGq}qaF3@iJPP~x`J7ga<9z$ zvwy1Bi&z<>=xMLCq)3_T;2nWQcL0hpKvYT5#rhw`8E%C*uK6^j*^uU}=%|u(%elPTpZo!Y;sYC2} z-uBYPvhoDfW_}%~1x^Is<>DQ5pN%kPkWut;f+YnB{GAy8zEioz7SIurD#psF|&=DDVFoI=fz; z>%RZ{D5htZTEb~-+&bgW7X<&x^4d1_?UL17J@~$u{>*AMIZTcX7Q4=y^nf)z7i7-` z5h}g!GIUrt(+uyEWVN`>uD@1$D1^+wBupni#!bZTyJobGVAZJx?C=Q5{I0ODMg=As zPlo--Q+=VlufBIQywN1E$8|iwGh&4Lv;3F9-9e*r;Pb{0G4(iFjYimcJqQijKwmar zyBPS)56*|qi>Uf87s1C!ZfOF?g z&0G`ff4TCPHwgFd8y@#R2?IgD8o&OK_jf5uwcS+lKcl@HJHfS=v8%Mjj;RKVqP~y= zU8aRr{EmTtkZLq{wjAaMG^N*32~2fEIl2QKj3U!GB}dncCk8uHR6pO`v~AR4%C)!o zC4g{}sur_Lt->N8EbCju#62Ed;Zi27c!|JdH~WArQat0c=kf|Cs97 z&XB$>WMgZg!(WWbgnRQGpZbu+qsiov)ErTix5?cgRg1AmVS`;&`;|$xS77FNo`@$< zfu65ku&cXa zLv8j;h^_7t4`hn(bC6~DeXe9`H9!#Qf;gzA`0ydmRjtO(SDn%)c=R@COd>@_o=Y(F zPEB9Q4z@rCb^bKguQw49@&v+=(yW&kX$Mc19H- zP-WSF=R<6NreMIoPZddqmh=k>YKPmHt~77;xohHEYqISbAjrU`!LFzEFQf-&e}@L&IEaNQBTB*F)qJc{pUEPSwi z_s~qcICpx=N~cSj_i`E8C3H*ppjnI(`47X0F^t=ZHEpr@AE@aLxhjRdh(Fya)(abz z9CuM&lMG3NJL3PzqgOUnD6o7jT%Fw|kUZ8DMQ#0g*=Qh|=hXEk2dUDs&}7Fc4_D2Q zCrsR$8U>lSPR_mz2$!ud3TjCbm&SbSdE^6kNIfGs+QqB^4vHF1UR23}9e%(Xu9o8- zv?lnJoOElu8Y-;$Ax7}4b@g>yREk4`&-9Sq$U!Omzp5Cc=TfaFm%2NBmK81pDQquE z9loBI;SZvJEzw7r3#ck0NubMK|6*B6DSyf3je^)B4;QY?b^*%2XC7y7`wF(BEh+`Z zJ6vZ5_0US^^z)+Mtlkb^B$)1LUt!5Lj?0d1xVZ+1-69wi3fL=koa@kSmTOPwqiIBc zYh7^Hp$p%LpK*q6N(U=x(~ua1dcCTkR^^kKn0q&!(P>o;2`BlQ2IXj=B)-jBaQuC= z$aVnQHT|HKJ}{T=vccp*gRpktdmD4X`np&!S_kgU=qpJ`rg;3&{o3?*DsEndzMs3z zA&2Gb_m{humxXtIN<1#(e*c`8Md;Q-dgkl`Nrz6gF^);b%dRuDhiqx92G~+Y^}^<@ zW6p%#P~$0*Uweew=$=2KB>Gd#f97;9da-6z-wBaJ4O10u_xqD2=erE?_GO)N{9ZJc zO=(SS4-Khf*{wzO0o~8J*&o$#jUV5UB5C|_e@c&#sf_Nt$p)&Jr?i%Kf2oDJ(|GRw zyR5P#@sP+ulT6%ca5KXbkm{#=c|&3fR1R6~pFF782%4VXobn=!QhGs-C(#8JR(Bp5 z^=`6Uerv3K2MJld+6GgK+3A&yDy*vxxExPAi(Sd3I=2Yr33KiQ=5VLKM}oD;p{Oi+ghe3raE``@wd)HE_QY$vcWJxeh4@2+3%p-CHikTwyui_77m!dy+smA89H z{3kn9v^V(2#nLXYullwP=sGQu;Da5$bHAuZror4!i-HoYw@+szG?QIpJm&qp-f{k$ zBsT{fYyV5djhh?aF9QBq7Ov9%Ce7)ghxm&?Zaq2&>YoQF-WlGTm(0>PMIWtdYIAk3 zNSqHne$z_L9##?m!INrKZ7#S84Glt?7*kEi3P_QL7uiwVDS|J2o+D}~ApGh%=9#|* z)KAMZ$PH((6O=`jaXeiw*E(dWUiWG5){`bZZ3}|avukFP>i;{sFlF>^_W#KFj8qxK zJ3pQTt&n56p#plp`{h9Py}K%f^3Z;OT0WI*ymxVPH*BUN%%a2Ck)1f^7!$|m~13p9{2QL1ys-C+xJx>JcUFiYZ z@cqF2c`CfCs#T-W`(uyVrxH9FeXcws3zekc_1dFfqtH<-9+`E)|GIbQ;Pb^UZC zyaNvwjj=u$kO&Yd5ee*G3tg!sg@aU(*N+@OaYywwOIXC@$4nnT9^|baS5$fW^Jy@O xvGk#V7z{vqK@t#ZEqHE0dxy(#RG}}~)$h|*>)ZK~hwb3|>*e653Vw97{{dU>O$Y!0 diff --git a/module/actor.js b/module/actor.js index 53556495..25c55eb7 100644 --- a/module/actor.js +++ b/module/actor.js @@ -2476,7 +2476,8 @@ export class RdDActor extends RdDBaseActorSang { } this.tmrApp = await RdDTMRDialog.create(this, tmrFormData); - this.tmrApp.render(true); + await this.tmrApp.render(true); + await this.tmrApp.onDeplacement() } /* -------------------------------------------- */ diff --git a/module/rdd-main.js b/module/rdd-main.js index 0d4d0175..6996872a 100644 --- a/module/rdd-main.js +++ b/module/rdd-main.js @@ -63,6 +63,7 @@ import { AppAstrologie } from "./sommeil/app-astrologie.js"; import { RdDItemArmure } from "./item/armure.js"; import { AutoAdjustDarkness as AutoAdjustDarkness } from "./time/auto-adjust-darkness.js"; import { RdDCreature } from "./actor/creature.js"; +import { RdDTMRDialog } from "./rdd-tmr-dialog.js"; /** * RdD system @@ -201,6 +202,7 @@ export class SystemReveDeDragon { RdDCompendiumOrganiser.init(); EffetsDraconiques.init() TMRUtility.init(); + await RdDTMRDialog.init() RdDHotbar.initDropbar(); RdDPossession.init(); TMRRencontres.init(); diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index cda22f09..773dc6c9 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -1,4 +1,4 @@ -import { SHOW_DICE } from "./constants.js"; +import { SHOW_DICE, SYSTEM_RDD } from "./constants.js"; import { RollDataAjustements } from "./rolldata-ajustements.js"; import { RdDUtility } from "./rdd-utility.js"; import { TMRUtility } from "./tmr-utility.js"; @@ -18,17 +18,40 @@ import { RdDRencontre } from "./item/rencontre.js"; import { RdDTimestamp } from "./time/rdd-timestamp.js"; import { TYPES } from "./item.js"; +const TMR_DISPLAY_SIZE = { + code: 'tmr-display-size', + range: { + min: 32, + max: 128, + step: 8, + }, + def: 64, + clamp: (size, inc = 0) => Math.max(TMR_DISPLAY_SIZE.range.min, Math.min(size + (inc * TMR_DISPLAY_SIZE.range.step), TMR_DISPLAY_SIZE.range.max)), + get: () => TMR_DISPLAY_SIZE.clamp(game.settings.get(SYSTEM_RDD, TMR_DISPLAY_SIZE.code) ?? TMR_DISPLAY_SIZE.def), + set: (size) => game.settings.set(SYSTEM_RDD, TMR_DISPLAY_SIZE.code, TMR_DISPLAY_SIZE.clamp(size)), +}; + /* -------------------------------------------- */ export class RdDTMRDialog extends Dialog { + static async init() { + game.settings.register(SYSTEM_RDD, TMR_DISPLAY_SIZE.code, { + name: 'Taille des cases des TMR', + hint: "Taille en pixel des cases des TMR (réglable directement dans la fenêtre des TMR)", + scope: "client", + config: true, + default: TMR_DISPLAY_SIZE.def, + type: Number, + range: TMR_DISPLAY_SIZE.range + }) + await PixiTMR.init() + } static async create(actor, tmrData) { let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-tmr.html', tmrData); - if (tmrData.mode != 'visu') { - // Notification au MJ + if (tmrData.mode != 'visu' && !game.user.isGM) { ChatMessage.create({ content: actor.name + " est monté dans les TMR en mode : " + tmrData.mode, whisper: ChatMessage.getWhisperRecipients("GM") }); } - return new RdDTMRDialog(html, actor, tmrData); } @@ -37,21 +60,16 @@ export class RdDTMRDialog extends Dialog { const dialogConf = { title: "Terres Médianes de Rêve", content: html, - buttons: { - closeButton: { - label: "Fermer", callback: html => this.close() - } - }, - default: "closeButton" + buttons: {} } - const dialogOptions = { classes: ["tmrdialog"], - width: 920, maxheight: 1024, height: 'fit-content', + width: 'fit-content', + height: 'fit-content', + 'max-height': 1024, 'z-index': 40 } super(dialogConf, dialogOptions); - this.tmrdata = duplicate(tmrData); this.actor = actor; this.actor.tmrApp = this; // reference this app in the actor structure @@ -62,25 +80,97 @@ export class RdDTMRDialog extends Dialog { this.loadCasesSpeciales(); this.allTokens = []; this.rencontreState = 'aucune'; - this.pixiTMR = new PixiTMR(this); - this.subdialog = undefined - - this.callbacksOnAnimate = []; + this.displaySize = undefined if (!this.viewOnly) { this._tellToGM(this.actor.name + " monte dans les terres médianes (" + tmrData.mode + ")"); } + this.callbacksOnAnimate = []; + this.resizePixiTMR( + TMR_DISPLAY_SIZE.clamp(game.settings.get(SYSTEM_RDD, TMR_DISPLAY_SIZE.code) ?? TMR_DISPLAY_SIZE.def) + ) + } - // load the texture we need - this.pixiTMR.load((loader, resources) => this.createPixiSprites()); + resizePixiTMR(displaySize) { + if (displaySize != this.displaySize) { + if (!this.pixiTMR) { + this.pixiTMR = new PixiTMR(this, displaySize); + } + this.displaySize = displaySize + this.pixiTMR.resizeTMR(displaySize); + this._removeTokens() + this.allTokens = [] + this.createPixiSprites() + this.pixiTMR.loadAnimations(); + } + } + + /* -------------------------------------------- */ + async activateListeners(html) { + super.activateListeners(html); + this.html = html; + + // this.activateTMRSize() + this.addTMRMap() + this.html.find('div.tmr-size a.tmr-size-zoom-minus*').click(event => { + this.$changeTMRSize(-1) + }); + this.html.find('div.tmr-size a.tmr-size-zoom-plus*').click(event => { + this.$changeTMRSize(1) + }); + + + if (this.viewOnly) { + this.html.find('.lancer-sort').remove(); + this.html.find('.lire-signe-draconique').remove(); + return; + } + + HtmlUtility.showControlWhen(this.html.find(".appliquerFatigue"), ReglesOptionnelles.isUsing("appliquer-fatigue")); + HtmlUtility.showControlWhen(this.html.find(".lire-signe-draconique"), this.actor.isResonanceSigneDraconique(this._getCoordActor())); + + this.html.find('form.tmr-dialog *').click(event => this.subdialog?.bringToTop()); + + // Roll Sort + this.html.find('.lancer-sort').click(event => this.actor.rollUnSort(this._getCoordActor())); + this.html.find('.lire-signe-draconique').click(event => this.actor.rollLireSigneDraconique(this._getCoordActor())); + + 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 + await this.actor.reveActuelIncDec(this.calculCoutMonteeTMR()); + this.cumulFatigue += this.fatigueParCase; + + // Le reste... + this.updateValuesDisplay(); + } + + async onDeplacement() { + await this.manageRencontre(TMRUtility.getTMR(this._getCoordActor())); + } + + addTMRMap() { + const tmrCell = document.getElementsByClassName("tmr-map")[0]; + tmrCell.childNodes.forEach(node => tmrCell.removeChild(node)) + tmrCell.append(this.pixiTMR.view); + } + + $changeTMRSize(inc) { + let displaySize = TMR_DISPLAY_SIZE.clamp(this.displaySize, inc) + if (displaySize != this.displaySize) { + game.settings.set(SYSTEM_RDD, TMR_DISPLAY_SIZE.code, TMR_DISPLAY_SIZE.clamp(displaySize)) + this.resizePixiTMR(displaySize) + this.render() + } } async forceTMRDisplay() { - this.bringToTop(); - if (this.subdialog) { + this.bringToTop() + if (this.subdialog?.bringToTop) { this.subdialog.bringToTop(); } } + async restoreTMRAfterAction() { this.subdialog = undefined await this.maximize(); @@ -89,15 +179,15 @@ export class RdDTMRDialog extends Dialog { forceTMRContinueAction() { ui.notifications.warn('Vous devez finir votre action avant de continuer dans les TMR'); - this.subdialog.bringToTop(); + if (this.subdialog?.bringToTop) { + this.subdialog.bringToTop(); + } return; } setTMRPendingAction(dialog) { this.subdialog = dialog - if (dialog instanceof Application) { - dialog.bringToTop(); - } + this.forceTMRDisplay() } isDemiReveCache() { @@ -129,8 +219,8 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ createPixiSprites() { this.pixiTMR.setup() - this.updateTokens(); - this.forceDemiRevePositionView(); + this.updateTokens() + this.forceDemiRevePositionView() } /* -------------------------------------------- */ @@ -207,43 +297,6 @@ export class RdDTMRDialog extends Dialog { this.checkQuitterTMR(); } - /* -------------------------------------------- */ - async activateListeners(html) { - super.activateListeners(html); - this.html = html; - - document.getElementsByClassName("tmr-row") - .item(0) - .insertCell(0) - .append(this.pixiTMR.view); - - if (this.viewOnly) { - this.html.find('.lancer-sort').remove(); - this.html.find('.lire-signe-draconique').remove(); - return; - } - - HtmlUtility.showControlWhen(this.html.find(".appliquerFatigue"), ReglesOptionnelles.isUsing("appliquer-fatigue")); - HtmlUtility.showControlWhen(this.html.find(".lire-signe-draconique"), this.actor.isResonanceSigneDraconique(this._getCoordActor())); - - this.html.find('tr.tmr-row *').click(event => this.subdialog?.bringToTop()); - - // Roll Sort - this.html.find('.lancer-sort').click(event => this.actor.rollUnSort(this._getCoordActor())); - this.html.find('.lire-signe-draconique').click(event => this.actor.rollLireSigneDraconique(this._getCoordActor())); - - 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 - await this.actor.reveActuelIncDec(this.calculCoutMonteeTMR()); - this.cumulFatigue += this.fatigueParCase; - - // Le reste... - this.updateValuesDisplay(); - let tmr = TMRUtility.getTMR(this._getCoordActor()); - await this.manageRencontre(tmr); - } - calculCoutMonteeTMR() { return ((this.tmrdata.isRapide && !EffetsDraconiques.isDeplacementAccelere(this.actor)) ? -2 : -1) - this.actor.countMonteeLaborieuse(); } @@ -281,11 +334,13 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ async close() { + if (this.subdialog) { return this.forceTMRContinueAction() } - + this.descenteTMR = true; + this.pixiTMR.close() if (this.actor.tmrApp) { this.actor.tmrApp = undefined; // Cleanup reference if (!this.viewOnly) { @@ -919,19 +974,18 @@ export class RdDTMRDialog extends Dialog { if (this.subdialog) { return this.forceTMRContinueAction() } - let clickOddq = TMRUtility.computeEventOddq(event); - let currentOddq = TMRUtility.coordTMRToOddq(this._getCoordActor()); - - let targetCoord = TMRUtility.oddqToCoordTMR(clickOddq); - let currentCoord = TMRUtility.oddqToCoordTMR(currentOddq); + const currentCoord = this._getCoordActor() + const currentOddq = TMRUtility.coordTMRToOddq(currentCoord) + const targetOddq = this.pixiTMR.computeEventOddq(event) + const targetCoord = TMRUtility.oddqToCoordTMR(targetOddq) // Validation de la case de destination (gestion du cas des rencontres qui peuvent téléporter) - let deplacementType = this._calculDeplacement(targetCoord, currentCoord, currentOddq, clickOddq); + const typeDeplacement = this._calculDeplacement(targetCoord, currentCoord, currentOddq, targetOddq); if (this.isDemiReveCache()) { if (this.isTerreAttache(targetCoord) || this.isConnaissanceFleuve(currentCoord, targetCoord) - || deplacementType == 'changeur') { + || typeDeplacement == 'changeur') { // déplacement possible await this.actor.setTMRVisible(true); this.demiReve = this._tokenDemiReve(); @@ -946,11 +1000,11 @@ export class RdDTMRDialog extends Dialog { } } - switch (deplacementType) { + switch (typeDeplacement) { case 'normal': case 'changeur': case 'passeur': - await this._deplacerDemiReve(targetCoord, deplacementType); + await this._deplacerDemiReve(targetCoord, typeDeplacement); break; case 'messager': await this._messagerDemiReve(targetCoord); @@ -1070,7 +1124,7 @@ export class RdDTMRDialog extends Dialog { } /* -------------------------------------------- */ - _removeTokens(filter) { + _removeTokens(filter = it => true) { this.allTokens.filter(filter).forEach(token => this.pixiTMR.removeToken(token)) } diff --git a/module/tmr-constants.js b/module/tmr-constants.js index b5a448d3..f0691c19 100644 --- a/module/tmr-constants.js +++ b/module/tmr-constants.js @@ -1,27 +1,64 @@ -/* -------------------------------------------- */ -export const tmrConstants = { - col1_y: 30, - col2_y: 55, - cellw: 55, - cellh: 55, - gridx: 28, - gridy: 28, - // tailles - third: 18, - half: 27.5, - twoThird: 36, - full: 55, - // decallages - center: { x: 0, y: 0 }, - top: { x: 0, y: -11.5 }, - topLeft: { x: -11.5, y: -11.5 }, - left: { x: -11.5, y: 0 }, - bottomLeft: { x: -11.5, y: 11.5 }, - bottom: { x: 0, y: 11.5 }, - bottomRight: { x: 11.5, y: 11.5 }, - right: { x: 11.5, y: 0 }, - topRight: { x: 11.5, y: -11.5 }, +export class TMRConstants { + constructor({ size = 64 }) { + // tailles + this.size = size + this.half = this.size / 2 + this.quarter = this.size / 4 + this.third = this.size / 3 + this.twoThird = this.size * 2 / 3 + this.full = this.size + // positions + this.col1_y = this.half + this.col2_y = this.size + this.cellw = this.size + this.cellh = this.size + this.gridx = this.half + this.gridy = this.half + // decallages + this.center = { x: 0, y: 0 } + this.top = { x: 0, y: -this.quarter } + this.topLeft = { x: -this.quarter, y: -this.quarter } + this.left = { x: -this.quarter, y: 0 } + this.bottomLeft = { x: -this.quarter, y: this.quarter } + this.bottom = { x: 0, y: this.quarter } + this.bottomRight = { x: this.quarter, y: this.quarter } + this.right = { x: this.quarter, y: 0 } + this.topRight = { x: this.quarter, y: -this.quarter } + this.marginx = 1 + this.marginy = 1 + } + + decallage(x, y) { + return { + x: x * this.third, + y: y * this.third + } + } + + 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, + y: event.nativeEvent.clientY - canvasRect.top + } + } + + computeEventOddq(event) { + var { x, y } = this.computeEventPosition(event); + return this.computeOddq(x, y); + } + + + computeOddq(x, y) { + const col = Math.floor(x / this.cellw) + const decallageColonne = col % 2 == 0 ? this.col1_y : this.col2_y + const row = Math.floor((y - decallageColonne) / this.cellh) + return { col, row, x, y } + } } // couleurs @@ -35,13 +72,15 @@ export const tmrColors = { rencontre: 0xFF0000, casehumide: 0x1050F0, } + export const tmrTokenZIndex = { - sort: 40, - tetes: 20, casehumide: 10, - conquete: 30, + tetes: 20, + sort: 30, + conquete: 40, rencontre: 50, trounoir: 60, demireve: 70, tooltip: 100, } + diff --git a/module/tmr-utility.js b/module/tmr-utility.js index 4414b43c..c7aa21d7 100644 --- a/module/tmr-utility.js +++ b/module/tmr-utility.js @@ -1,7 +1,6 @@ import { Misc } from "./misc.js"; import { Grammar } from "./grammar.js"; import { RdDDice } from "./rdd-dice.js"; -import { tmrConstants } from "./tmr-constants.js"; /* -------------------------------------------- */ const TMRMapping = { @@ -237,8 +236,19 @@ const TMR_MOVE = { "bottom": { even: { row: 1, col: 0 }, odd: { row: 1, col: 0 }, }, } - -/* -------------------------------------------- */ +/* -------------------------------------------- + * Pour comprendre les conversions entre coordonnées + * - "TMR" A1, ... M15 + * - oddq: {col, row} + * - axial: { q, r ) + * + * Un site intéressant: https://www.redblobgames.com/grids/hexagons/#distances + * + * Pour être concis, le code TMR lettre(colonne)-ligne correspond à une grille hexagonale en coordonnées "odd-q" + * (lettre => col, ligne => row). + * + * Pour les calculs de distance, les coordonnées axiales sont beaucoup plus pratiques. + */ export class TMRUtility { static init() { for (let coord in TMRMapping) { @@ -340,7 +350,7 @@ export class TMRUtility { const oddq = TMRUtility.coordTMRToOddq(coord); const direction = await TMRUtility.getDirectionPattern(oddq); const currentOddq = TMRUtility.addOddq(oddq, direction) - if (this.isOddqInTMR(currentOddq)) { // Sortie de carte ! Ré-insertion aléatoire + if (TMRUtility.isOddqInTMR(currentOddq)) { // Sortie de carte ! Ré-insertion aléatoire return TMRUtility.getTMR(TMRUtility.oddqToCoordTMR(currentOddq)); } else { return await actor.reinsertionAleatoire('Sortie de carte'); @@ -377,15 +387,15 @@ export class TMRUtility { * */ static getTMRPortee(coord, portee) { - let centerOddq = this.coordTMRToOddq(coord); + let centerOddq = TMRUtility.coordTMRToOddq(coord); let caseList = []; for (let dcol = -portee; dcol <= portee; dcol++) { // rows for (let drow = -portee; drow <= portee; drow++) { // columns const currentOddq = { col: centerOddq.col + dcol, row: centerOddq.row + drow }; - if (this.isOddqInTMR(currentOddq)) { - let dist = this.distanceOddq(centerOddq, currentOddq); + if (TMRUtility.isOddqInTMR(currentOddq)) { + let dist = TMRUtility.distanceOddq(centerOddq, currentOddq); if (dist <= portee) { - caseList.push(this.oddqToCoordTMR(currentOddq)); // Inside the area + caseList.push(TMRUtility.oddqToCoordTMR(currentOddq)); // Inside the area } } } @@ -393,40 +403,6 @@ export class TMRUtility { return caseList; } - // /* -------------------------------------------- */ - 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, - y: event.nativeEvent.clientY - canvasRect.top - }; - } - - /* -------------------------------------------- */ - 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] - const decallageColonne = col % 2 == 0 ? tmrConstants.col1_y : tmrConstants.col2_y; - const row = Math.floor((y - decallageColonne) / tmrConstants.cellh); // [From 0 -> 14] - return { col, row }; - } - - static computeEventCoord(event) { - const oddq = TMRUtility.computeEventOddq(event); - return TMRUtility.oddqToCoordTMR(oddq); - } - - /* -------------------------------------------- */ - // https://www.redblobgames.com/grids/hexagons/#distances - // TMR Letter-row correspond to "odd-q" grid (letter => col, numeric => row ) - /* -------------------------------------------- */ static coordTMRToOddq(coordTMR) { let col = coordTMR.charCodeAt(0) - 65; @@ -453,9 +429,9 @@ export class TMRUtility { /* -------------------------------------------- */ static distanceCoordTMR(coord1, coord2) { - let oddq1 = this.coordTMRToOddq(coord1); - let oddq2 = this.coordTMRToOddq(coord2); - return this.distanceOddq(oddq1, oddq2); + let oddq1 = TMRUtility.coordTMRToOddq(coord1); + let oddq2 = TMRUtility.coordTMRToOddq(coord2); + return TMRUtility.distanceOddq(oddq1, oddq2); } /* -------------------------------------------- */ diff --git a/module/tmr/animation.js b/module/tmr/animation.js new file mode 100644 index 00000000..9b8312e9 --- /dev/null +++ b/module/tmr/animation.js @@ -0,0 +1,107 @@ +// pixiTMR.animate(pixiApp => pixiApp.ticker.add((delta) => { +// if (!sprite.waveAnimation) { +// sprite.waveAnimation = { +// originx: sprite.x, +// movex: 0, +// step: 0.03 +// } +// } +// else { +// if (Math.abs(sprite.waveAnimation.movex) > 2) { +// sprite.waveAnimation.step = -sprite.waveAnimation.step +// } +// sprite.waveAnimation.movex += sprite.waveAnimation.step; +// } +// sprite.x = sprite.waveAnimation.originx + sprite.waveAnimation.movex +// })); + +// return pixiTMR.square(this.code(), +// { +// zIndex: tmrTokenZIndex.trounoir, +// tint: tmrColors.trounoir, +// alpha: 1, +// taille: () => pixiTMR.sizes.full, +// decallage: { +// x: -pixiTMR.sizes.half, +// y: -pixiTMR.sizes.half +// } +// }) + +export class TMRAnimations { + + static withAnimation(sprite, pixiTMR, ...animations) { + if (animations.length > 0) { + animations.forEach(animation => + pixiTMR.animate(pixiApp => pixiApp.ticker.add(delta => animation(sprite, delta))) + ) + } + return sprite + } + + static rotation(options = { frequence: () => 1, angle: () => 1 }) { + return (sprite, delta) => { + if (!sprite.tmrConfig) { + sprite.tmrConfig = { nextTick: 0 } + } + sprite.tmrConfig.nextTick -= delta + if (sprite.tmrConfig.nextTick <= 0) { + sprite.tmrConfig.nextTick = options.frequence(delta) + sprite.angle += options.angle(delta) + } + } + } + + static changeZoom(range = { min: 0.8, max: 1.2, step: 0.005 }) { + return (sprite, delta) => { + if (!sprite.tmrConfig) { + sprite.tmrConfig = TMRAnimations.startRange(range) + } + sprite.tmrConfig.current += (sprite.tmrConfig.step * delta) + if (sprite.tmrConfig.current < sprite.tmrConfig.min) { + sprite.tmrConfig.step = Math.abs(sprite.tmrConfig.step) + } + else if (sprite.tmrConfig.current > sprite.tmrConfig.max) { + sprite.tmrConfig.step = -Math.abs(sprite.tmrConfig.step) + + } + const taille = sprite.tmrConfig.current * sprite.taille() + sprite.width = taille + sprite.height = taille + } + } + + static verticalAxis(options = { step: 1 }) { + return (sprite, delta) => { + if (!sprite.tmrConfig) { + sprite.tmrConfig = this.startRange({ + min: -Math.PI / 2, + max: Math.PI / 2, + step: options.step * Math.PI / 180, + }) + } + sprite.tmrConfig.current += (sprite.tmrConfig.step * delta) + sprite.width = Math.cos(sprite.tmrConfig.current) * sprite.taille() + } + } + + static startRange(range) { + range.current = TMRAnimations.randomInSegment(range) + const min = range.min + if (min > range.max) { + range.min = range.max + range.max = min + } + return range + } + + static outOfRange(range) { + return range.current < range.min || range.current > range.max + } + + static randomInSegment(range) { + const min = range.min + const max = range.max + const step = range.step + return min + (Math.floor(Math.random() / step) * step) * (max - min) + } +} diff --git a/module/tmr/augmentation-seuil.js b/module/tmr/augmentation-seuil.js index bf2c487f..3b715d46 100644 --- a/module/tmr/augmentation-seuil.js +++ b/module/tmr/augmentation-seuil.js @@ -4,10 +4,6 @@ import { Misc } from "../misc.js"; export class AugmentationSeuil extends Draconique { - constructor() { - super(); - } - type() { return 'tete' } match(item) { return Draconique.isTeteDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('augmentation du seuil de reve'); } manualMessage() { return false } diff --git a/module/tmr/carte-tmr.js b/module/tmr/carte-tmr.js index dfdec720..b73822b2 100644 --- a/module/tmr/carte-tmr.js +++ b/module/tmr/carte-tmr.js @@ -20,10 +20,10 @@ export class CarteTmr extends Draconique { const img = PixiTMR.getImgFromCode(this.code()) const sprite = new PIXI.Sprite(PIXI.utils.TextureCache[img]); // Setup the position of the TMR - sprite.x = 0; - sprite.y = 0; - sprite.width = 722; - sprite.height = 860; + sprite.x = pixiTMR.pixiApp.screen.x; + sprite.y = pixiTMR.pixiApp.screen.y; + sprite.width = pixiTMR.pixiApp.screen.width; + sprite.height = pixiTMR.pixiApp.screen.height; // Rotate around the center sprite.anchor.set(0); sprite.buttonMode = true; @@ -31,9 +31,5 @@ export class CarteTmr extends Draconique { return sprite; } - computeTooltip(coordTMR) { - const tmr = TMRUtility.getTMR(coordTMR) - return tmr? TMRUtility.getTMRLabel(coordTMR) : ''; - } } diff --git a/module/tmr/conquete.js b/module/tmr/conquete.js index 43d53763..16ae3c1a 100644 --- a/module/tmr/conquete.js +++ b/module/tmr/conquete.js @@ -1,40 +1,38 @@ import { Grammar } from "../grammar.js"; import { RdDDice } from "../rdd-dice.js"; import { TMRUtility } from "../tmr-utility.js"; -import { tmrConstants, tmrColors, tmrTokenZIndex } from "../tmr-constants.js"; - +import { tmrTokenZIndex } from "../tmr-constants.js"; import { Draconique } from "./draconique.js"; +import { TMRAnimations } from "./animation.js"; export class Conquete extends Draconique { - constructor() { - super(); - } - type() { return 'queue' } match(item) { return Draconique.isQueueDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('conquete'); } manualMessage() { return false } async onActorCreateOwned(actor, item) { await this._creerConquete(actor, item); } code() { return 'conquete' } - tooltip(linkData) { return `${this.tmrLabel(linkData)}: doit être conquis` } - img() { return 'icons/svg/combat.svg' } + tooltip(linkData) { return `Doit être conquis` } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/conquete.svg' } createSprite(pixiTMR) { - return pixiTMR.sprite(this.code(), - { + return TMRAnimations.withAnimation( + pixiTMR.sprite(this.code(), { zIndex: tmrTokenZIndex.conquete, - color: tmrColors.queues, - taille: tmrConstants.full, - decallage: { x: 2, y: 0 } - }); + decallage: pixiTMR.sizes.decallage(0, 0), + taille: () => pixiTMR.sizes.half, + }), + pixiTMR, + TMRAnimations.changeZoom() + ) } async _creerConquete(actor, queue) { let existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord); let possibles = TMRUtility.filterTMR(tmr => !TMRUtility.isCaseHumide(tmr) && !existants.includes(tmr.coord)); let conquete = await RdDDice.rollOneOf(possibles); - await this.createCaseTmr(actor, 'Conquête: ' + conquete.label, conquete, queue.id); + await this.createCaseTmr(actor, 'Conquête', conquete, queue.id); } async onActorDeleteCaseTmr(actor, casetmr) { diff --git a/module/tmr/debordement.js b/module/tmr/debordement.js index 5c452ac2..0cbdfd61 100644 --- a/module/tmr/debordement.js +++ b/module/tmr/debordement.js @@ -1,34 +1,30 @@ import { Grammar } from "../grammar.js"; import { TMRUtility } from "../tmr-utility.js"; -import { tmrConstants, tmrTokenZIndex } from "../tmr-constants.js"; +import { tmrTokenZIndex } from "../tmr-constants.js"; import { Draconique } from "./draconique.js"; export class Debordement extends Draconique { - constructor() { - super(); - } - type() { return 'souffle' } match(item) { return Draconique.isSouffleDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('debordement'); } manualMessage() { return false } async onActorCreateOwned(actor, souffle) { const existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord); const tmr = await TMRUtility.getTMRAleatoire(it => !(TMRUtility.isCaseHumide(it) || existants.includes(it.coord))); - await this.createCaseTmr(actor, 'Debordement: ' + tmr.label, tmr, souffle.id); + await this.createCaseTmr(actor, 'Debordement', tmr, souffle.id); } code() { return 'debordement' } - tooltip(linkData) { return `Débordement en ${this.tmrLabel(linkData)}` } - img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/wave.webp' } + tooltip(linkData) { return `Débordement` } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/debordement.svg' } createSprite(pixiTMR) { - return pixiTMR.sprite(this.code(), { + const sprite = pixiTMR.sprite(this.code(), { zIndex: tmrTokenZIndex.casehumide, - alpha: 0.6, - taille: tmrConstants.full, - decallage: tmrConstants.center - }); + decallage: pixiTMR.sizes.decallage(0, 2/3), + taille: () => pixiTMR.sizes.half, + }) + return sprite; } } diff --git a/module/tmr/demi-reve.js b/module/tmr/demi-reve.js index 0fa0e8f5..b0a10393 100644 --- a/module/tmr/demi-reve.js +++ b/module/tmr/demi-reve.js @@ -1,12 +1,8 @@ -import { tmrConstants, tmrColors, tmrTokenZIndex } from "../tmr-constants.js"; +import { tmrColors, tmrTokenZIndex } from "../tmr-constants.js"; import { Draconique } from "./draconique.js"; export class DemiReve extends Draconique { - constructor() { - super(); - } - type() { return '' } match(item) { return false; } manualMessage() { return false } @@ -18,9 +14,9 @@ export class DemiReve extends Draconique { createSprite(pixiTMR) { const sprite = pixiTMR.sprite(this.code(), { - color: tmrColors.demireve, + tint: tmrColors.demireve, zIndex: tmrTokenZIndex.demireve, - taille: (tmrConstants.full * 0.7) + taille: () => pixiTMR.sizes.twoThird }); pixiTMR.animate(pixiApp => pixiApp.ticker.add((delta) => sprite.rotation -= 0.01 * delta)); return sprite; diff --git a/module/tmr/desorientation.js b/module/tmr/desorientation.js index 927578fd..5de7aa74 100644 --- a/module/tmr/desorientation.js +++ b/module/tmr/desorientation.js @@ -1,14 +1,12 @@ import { Grammar } from "../grammar.js"; import { Misc } from "../misc.js"; import { RdDDice } from "../rdd-dice.js"; -import { TMRUtility, TMRType} from "../tmr-utility.js"; -import { tmrConstants, tmrColors, tmrTokenZIndex } from "../tmr-constants.js"; +import { TMRUtility, TMRType } from "../tmr-utility.js"; +import { tmrTokenZIndex } from "../tmr-constants.js"; import { Draconique } from "./draconique.js"; +import { TMRAnimations } from "./animation.js"; export class Desorientation extends Draconique { - constructor() { - super(); - } type() { return 'souffle' } match(item) { return Draconique.isSouffleDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('desorientation'); } @@ -28,24 +26,27 @@ export class Desorientation extends Draconique { code() { return 'desorientation' } tooltip(linkData) { return `Désorientation, cette case n'existe plus !` } - img() { return 'icons/svg/explosion.svg' } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/desorientation.svg' } createSprite(pixiTMR) { - return pixiTMR.sprite(this.code(), - { + return TMRAnimations.withAnimation( + pixiTMR.sprite(this.code(), { zIndex: tmrTokenZIndex.trounoir, - color: tmrColors.trounoir, - alpha: 1, - taille: tmrConstants.full, - decallage: { x: 2, y: 2 }, - }); + taille: () => pixiTMR.sizes.full, + }), + pixiTMR, + TMRAnimations.rotation({ + frequence: delta => 2^(2 + Math.random() * 12) * 70, + angle: delta => (Math.floor(Math.random() * 2) - 1) * 30 + }) + ) } async _creerCasesTmr(actor, type, souffle) { const existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord); let tmrs = TMRUtility.filterTMR(it => it.type == type && !existants.includes(it.coord)); for (let tmr of tmrs) { - await this.createCaseTmr(actor, 'Désorientation: ' + tmr.label, tmr, souffle.id); + await this.createCaseTmr(actor, 'Désorientation', tmr, souffle.id); } } diff --git a/module/tmr/draconique.js b/module/tmr/draconique.js index 7095321a..88f75f17 100644 --- a/module/tmr/draconique.js +++ b/module/tmr/draconique.js @@ -9,14 +9,15 @@ const registeredEffects = [ * Définition des informations d'une "draconique" (queue, ombre, tête, souffle) qui influence les TMR */ export class Draconique { + static init() { + } + static isCaseTMR(item) { return item.type == TYPES.casetmr; } static isQueueDragon(item) { return item.isQueueDragon(); } static isSouffleDragon(item) { return item.type == TYPES.souffle; } static isTeteDragon(item) { return item.type == TYPES.tete; } static isQueueSouffle(item) { return Draconique.isQueueDragon(item) || Draconique.isSouffleDragon(item); } - tmrLabel(linkData) { return TMRUtility.getTMRLabel(linkData.system.coord); } - static register(draconique) { registeredEffects[draconique.code()] = draconique; if (draconique.img()) { @@ -33,6 +34,8 @@ export class Draconique { return registeredEffects[code]; } + tmrLabel(linkData) { return TMRUtility.getTMRLabel(linkData.system.coord); } + /** * @param item un Item quelconque * @returns true si l'item correspond @@ -96,32 +99,13 @@ export class Draconique { return token; } - /** - * methode en charge de recalculer le tooltip lorsque la souris bouge - * @param {*} event evenement contenant les coordonnées - * @param {*} sprite sprite pour laquelle calculer le tooltip - */ - computeTooltip(event, sprite) { - if (sprite.isOver) { - const oddq = TMRUtility.computeEventOddq(event); - const coord = TMRUtility.oddqToCoordTMR(oddq); - const tmr = TMRUtility.getTMR(coord) - if (tmr){ - const label = TMRUtility.getTMRLabel(coord); - const text = this.tooltip(this.linkData); - return text ? `${coord}: ${label}\n${text}` : `${coord}: ${label}` - } - } - return ''; - } - /** * factory d'élément graphique PIXI correpsondant à l'objet draconique * @param {*} pixiTMR instance de PixiTMR qui gère les tooltips, les méthodes de création de sprite standard, les clicks. */ createSprite(pixiTMR) { if (this.img()) { - return pixiTMR.sprite(this.code()); + return pixiTMR.sprite(this.code()) } else { return pixiTMR.circle() @@ -143,7 +127,9 @@ export class Draconique { async createCaseTmr(actor, label, tmr, sourceId = undefined) { const casetmrData = { - name: label, type: 'casetmr', img: this.img(), + name: label, + type: 'casetmr', + img: this.img(), system: { coord: tmr.coord, specific: this.code(), sourceid: sourceId } }; await actor.createEmbeddedDocuments('Item', [casetmrData]); diff --git a/module/tmr/effets-draconiques.js b/module/tmr/effets-draconiques.js index 3bc8cfc6..42e45b2f 100644 --- a/module/tmr/effets-draconiques.js +++ b/module/tmr/effets-draconiques.js @@ -20,9 +20,9 @@ import { Grammar } from "../grammar.js"; import { AugmentationSeuil } from "./augmentation-seuil.js"; import { TYPES } from "../item.js"; - export class EffetsDraconiques { static carteTmr = new CarteTmr(); + static demiReve = new DemiReve(); static rencontre = new Rencontre(); static sortReserve = new SortReserve(); @@ -39,10 +39,13 @@ export class EffetsDraconiques { static pelerinage = new Pelerinage(); static periple = new Periple(); static urgenceDraconique = new UrgenceDraconique(); + static augmentationSeuil = new AugmentationSeuil(); static init() { + Draconique.init(); Draconique.register(EffetsDraconiques.carteTmr); + // icône TMR Draconique.register(EffetsDraconiques.demiReve); Draconique.register(EffetsDraconiques.rencontre); Draconique.register(EffetsDraconiques.sortReserve); @@ -59,6 +62,7 @@ export class EffetsDraconiques { Draconique.register(EffetsDraconiques.pelerinage); Draconique.register(EffetsDraconiques.periple); Draconique.register(EffetsDraconiques.urgenceDraconique); + // effets sans icône TMR Draconique.register(EffetsDraconiques.augmentationSeuil) } @@ -184,5 +188,4 @@ export class EffetsDraconiques { return EffetsDraconiques.soufflesDragon(actor, 'péage').length > 0; } - } \ No newline at end of file diff --git a/module/tmr/fermeture-cites.js b/module/tmr/fermeture-cites.js index 48cd4e6a..69793bee 100644 --- a/module/tmr/fermeture-cites.js +++ b/module/tmr/fermeture-cites.js @@ -1,39 +1,32 @@ import { Grammar } from "../grammar.js"; import { TMRUtility } from "../tmr-utility.js"; -import { tmrConstants, tmrColors, tmrTokenZIndex } from "../tmr-constants.js"; +import { tmrTokenZIndex } from "../tmr-constants.js"; import { Draconique } from "./draconique.js"; export class FermetureCites extends Draconique { - constructor() { - super(); - } - type() { return 'souffle' } match(item) { return Draconique.isSouffleDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('fermeture des cites'); } manualMessage() { return false } async onActorCreateOwned(actor, souffle) { await this._fermerLesCites(actor, souffle); } code() { return 'fermeture' } - tooltip(linkData) { return `La ${this.tmrLabel(linkData)} est fermée` } - img() { return 'icons/svg/door-closed.svg' } + tooltip(linkData) { return `Cité fermée` } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/fermeture.svg' } createSprite(pixiTMR) { - return pixiTMR.sprite(this.code(), - { - zIndex: tmrTokenZIndex.conquete, - color: tmrColors.souffle, - alpha: 0.9, - taille: tmrConstants.full, - decallage: { x: 2, y: 0 } - }); + return pixiTMR.sprite(this.code(), { + zIndex: tmrTokenZIndex.conquete, + decallage: pixiTMR.sizes.decallage(0, 0), + taille: () => pixiTMR.sizes.full + }) } async _fermerLesCites(actor, souffle) { let existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord); let ouvertes = TMRUtility.filterTMR(it => it.type == 'cite' && !existants.includes(it.coord)); for (let tmr of ouvertes) { - await this.createCaseTmr(actor, 'Fermeture: ' + tmr.label, tmr, souffle.id); + await this.createCaseTmr(actor, 'Fermeture', tmr, souffle.id); } } } diff --git a/module/tmr/pelerinage.js b/module/tmr/pelerinage.js index e7b8dc30..298978b4 100644 --- a/module/tmr/pelerinage.js +++ b/module/tmr/pelerinage.js @@ -1,37 +1,36 @@ import { Grammar } from "../grammar.js"; import { TMRUtility } from "../tmr-utility.js"; -import { tmrConstants, tmrTokenZIndex } from "../tmr-constants.js"; +import { tmrTokenZIndex } from "../tmr-constants.js"; import { Draconique } from "./draconique.js"; +import { TMRAnimations } from "./animation.js"; export class Pelerinage extends Draconique { - constructor() { - super(); - } - type() { return 'queue' } match(item) { return Draconique.isQueueDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('pelerinage'); } manualMessage() { return false } - async onActorCreateOwned(actor, queue) { + async onActorCreateOwned(actor, queue) { let tmr = await TMRUtility.getTMRAleatoire(); - await this.createCaseTmr(actor, 'Pèlerinage: ' + tmr.label, tmr, queue.id); + await this.createCaseTmr(actor, 'Pèlerinage', tmr, queue.id); } - - + code() { return 'pelerinage' } - tooltip(linkData) { return `Votre pèlerinage en ${this.tmrLabel(linkData)}` } - img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/pelerin.webp' } - + tooltip(linkData) { return `Lieu de pèlerinage` } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/pelerinage.svg' } + createSprite(pixiTMR) { - return pixiTMR.sprite(this.code(), { - zIndex: tmrTokenZIndex.conquete, - alpha: 1, - taille: tmrConstants.full, - decallage: tmrConstants.center - }); + return TMRAnimations.withAnimation( + pixiTMR.sprite(this.code(), { + zIndex: tmrTokenZIndex.conquete, + decallage: pixiTMR.sizes.decallage(0, 0), + taille: () => pixiTMR.sizes.half, + }), + pixiTMR, + TMRAnimations.changeZoom() + ) } - + async onActorDeleteCaseTmr(actor, casetmr) { await actor.deleteEmbeddedDocuments('Item', [casetmr.system.sourceid]); } diff --git a/module/tmr/periple.js b/module/tmr/periple.js index 326e16e4..7ab316e0 100644 --- a/module/tmr/periple.js +++ b/module/tmr/periple.js @@ -1,15 +1,12 @@ import { Grammar } from "../grammar.js"; import { RdDDice } from "../rdd-dice.js"; import { TMRUtility } from "../tmr-utility.js"; -import { tmrConstants, tmrTokenZIndex } from "../tmr-constants.js"; +import { tmrTokenZIndex } from "../tmr-constants.js"; import { Draconique } from "./draconique.js"; +import { TMRAnimations } from "./animation.js"; export class Periple extends Draconique { - constructor() { - super(); - } - type() { return 'souffle' } match(item) { return Draconique.isSouffleDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('periple'); } manualMessage() { return false } @@ -18,22 +15,25 @@ export class Periple extends Draconique { let terrain = (await RdDDice.rollTotal("1d2")) == 1 ? 'sanctuaire' : 'necropole'; let tmrs = TMRUtility.getListTMR(terrain); for (let tmr of tmrs) { - await this.createCaseTmr(actor, 'Périple: ' + tmr.label, tmr, souffle.id); + await this.createCaseTmr(actor, 'Périple', tmr, souffle.id); } } code() { return 'periple' } - tooltip(linkData) { return `Votre Périple passe par ${this.tmrLabel(linkData)}` } - img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/pelerin.webp' } + tooltip(linkData) { return `Etape de périple` } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/periple.svg' } createSprite(pixiTMR) { - return pixiTMR.sprite(this.code(), { - zIndex: tmrTokenZIndex.conquete, - alpha: 1, - taille: tmrConstants.full, - decallage: tmrConstants.center - }); + return TMRAnimations.withAnimation( + pixiTMR.sprite(this.code(), { + zIndex: tmrTokenZIndex.conquete, + decallage: pixiTMR.sizes.decallage(0, 0), + taille: () => pixiTMR.sizes.half + }), + pixiTMR, + TMRAnimations.changeZoom() + ) } getDifficulte(tmr) { switch (tmr.type) { diff --git a/module/tmr/pixi-tmr.js b/module/tmr/pixi-tmr.js index 1f5f3cd0..2d078bc8 100644 --- a/module/tmr/pixi-tmr.js +++ b/module/tmr/pixi-tmr.js @@ -1,35 +1,61 @@ +import { SYSTEM_RDD } from "../constants.js"; import { Misc } from "../misc.js"; -import { RdDTMRDialog } from "../rdd-tmr-dialog.js"; -import { tmrConstants, tmrTokenZIndex } from "../tmr-constants.js"; +import { TMRConstants, tmrTokenZIndex } from "../tmr-constants.js"; import { TMRUtility } from "../tmr-utility.js"; import { EffetsDraconiques } from "./effets-draconiques.js"; -export const tooltipStyle = new PIXI.TextStyle({ - fontFamily: 'CaslonAntique', - fontSize: 18, - fill: '#FFFFFF', - stroke: '#000000', - strokeThickness: 3 -}); - - export class PixiTMR { - static textures = [] - constructor(tmrDialog) { + static getImgFromCode(code) { + return PixiTMR.textures[code] + } + + static register(name, img) { + PixiTMR.textures[name] = img; + } + static async init() { + await Promise.all( + Object.values(PixiTMR.textures) + .filter(img => img != undefined) + .map(async img => PIXI.Sprite.from(await PIXI.Assets.load(img))) + ) + } + + constructor(tmrDialog, displaySize) { this.tmrDialog = tmrDialog; - this.callbacksOnAnimate = []; - - this.pixiApp = new PIXI.Application({ width: 720, height: 860 }); + this.sizes = new TMRConstants({ size: displaySize }) + this.pixiApp = new PIXI.Application(PixiTMR.computeTMRSize(this.sizes)); this.pixiApp.eventMode = 'static'; this.pixiApp.stage.sortableChildren = true; - this.tooltip = new PIXI.Text('', tooltipStyle); + + this.tooltipStyle = new PIXI.TextStyle({ + fontFamily: 'CaslonAntique', + fontSize: 16, + fill: '#FFFFFF', + stroke: '#000000', + strokeThickness: 4 + }); + + this.tooltip = new PIXI.Text('', this.tooltipStyle); this.tooltip.zIndex = 1000 this.pixiApp.stage.addChild(this.tooltip); + } + close() { + this.pixiApp.ticker.stop(); + } + static computeTMRSize(sizeConstants) { + return { width: sizeConstants.cellw * 13 + sizeConstants.marginx, height: sizeConstants.cellh / 2 + sizeConstants.cellh * 15 + sizeConstants.marginy } + } + + resizeTMR(displaySize) { + this.sizes = new TMRConstants({ size: displaySize }) + const appSize = PixiTMR.computeTMRSize(this.sizes) + this.pixiApp.renderer.resize(appSize.width, appSize.height) + this.tooltipStyle.fontSize = Math.max(this.sizes.size / 4, 16) } get view() { @@ -48,24 +74,11 @@ export class PixiTMR { .on('pointerout', event => this.onHideTooltip(event)); } - async load(onLoad = (loader, resources) => { }) { - // WIP - Deprecated since v7 : let loader = new PIXI.Loader(); - for (const [name, img] of Object.entries(PixiTMR.textures)) { - const texture = await PIXI.Assets.load(img); - let image = PIXI.Sprite.from(texture); - } - onLoad(); + async loadAnimations() { for (let onAnimate of this.callbacksOnAnimate) { onAnimate(); } - } - - static getImgFromCode(code) { - return PixiTMR.textures[code] - } - - static register(name, img) { - PixiTMR.textures[name] = img; + this.pixiApp.ticker.start(); } animate(animation = pixiApp => { }) { @@ -90,33 +103,48 @@ export class PixiTMR { sprite(code, options = {}) { let img = PixiTMR.getImgFromCode(code) - const texture = PIXI.utils.TextureCache[img]; + const texture = PIXI.utils.TextureCache[img] if (!texture) { console.error("Texture manquante", code, PIXI.utils.TextureCache) return; } let sprite = new PIXI.Sprite(texture); - sprite.width = options.taille ?? tmrConstants.half; - sprite.height = options.taille ?? tmrConstants.half; - sprite.anchor.set(0.5); - if (options.color) { - sprite.tint = options.color; + sprite.taille = options.taille ?? (() => this.sizes.half) + + sprite.width = sprite.taille() + sprite.height = sprite.taille() + sprite.anchor.set(0.5) + if (options.tint) { + sprite.tint = options.tint } - sprite.zIndex = options.zIndex ?? tmrTokenZIndex.casehumide + 1; - sprite.alpha = options.alpha ?? 0.75; - sprite.decallage = options.decallage ?? tmrConstants.center; - this.pixiApp.stage.addChild(sprite); - return sprite; + sprite.zIndex = options.zIndex ?? tmrTokenZIndex.casehumide + 1 + sprite.alpha = options.alpha ?? 1 + sprite.decallage = options.decallage ?? this.sizes.center + this.pixiApp.stage.addChild(sprite) + return sprite } circle(code, options = {}) { + let sprite = new PIXI.Graphics() + sprite.taille = options.taille ?? (() => this.sizes.half) + sprite.decallage = options.decallage ?? this.sizes.topLeft + sprite.beginFill(options.tint, options.opacity) + sprite.drawCircle(0, 0, sprite.taille()) + sprite.endFill() + this.pixiApp.stage.addChild(sprite) + return sprite + } + + square(code, options = {}) { let sprite = new PIXI.Graphics(); - sprite.beginFill(options.color, options.opacity); - sprite.drawCircle(0, 0, (options.taille ?? 12) / 2); - sprite.endFill(); - sprite.decallage = options.decallage ?? tmrConstants.topLeft; - this.pixiApp.stage.addChild(sprite); - return sprite; + sprite.taille = options.taille ?? (() => this.sizes.half) + sprite.decallage = options.decallage ?? this.sizes.topLeft + sprite.beginFill(options.tint, options.opacity) + const size = sprite.taille(); + sprite.drawRect(0, 0, size, size) + sprite.endFill() + this.pixiApp.stage.addChild(sprite) + return sprite } onClickBackground(event) { @@ -131,7 +159,7 @@ export class PixiTMR { this.tooltip.text = this.computeTooltip(event); } } - + onShowTooltip(event) { if (!this.carteTMR.isOver) { this.setTooltipPosition(event); @@ -149,25 +177,27 @@ export class PixiTMR { } computeTooltip(event) { - const oddq = TMRUtility.computeEventOddq(event); + const oddq = this.sizes.computeEventOddq(event); const coordTMR = TMRUtility.oddqToCoordTMR(oddq); const tmr = TMRUtility.getTMR(coordTMR) if (tmr) { - const labelTMR = TMRUtility.getTMRLabel(coordTMR); + const tmrTooltip = `${coordTMR}: ${TMRUtility.getTMRLabel(coordTMR)}`; const tokenTooltips = this.tmrDialog.allTokens .filter(token => token.coordTMR() == coordTMR) .map(token => token.tooltip); - const tmrTooltip = `${coordTMR}: ${labelTMR}`; return [tmrTooltip, ...tokenTooltips].reduce(Misc.joining('\n')) } } - setTooltipPosition(event) { - var { x, y } = TMRUtility.computeEventPosition(event); - const oddq = TMRUtility.computeOddq(x, y); + computeEventOddq(event) { + return this.sizes.computeEventOddq(event) + } - this.tooltip.x = x + (oddq.col > 8 ? -3 * tmrConstants.full : tmrConstants.half); - this.tooltip.y = y + (oddq.row > 10 ? -tmrConstants.half : tmrConstants.half); + setTooltipPosition(event) { + const oddq = this.sizes.computeEventOddq(event); + + this.tooltip.x = oddq.x + (oddq.col > 7 ? -3 * this.sizes.full : this.sizes.quarter); + this.tooltip.y = oddq.y + (oddq.row > 10 ? -this.sizes.size : 0); } positionToken(token) { @@ -175,11 +205,11 @@ export class PixiTMR { const sprite = token.sprite; const oddq = TMRUtility.coordTMRToOddq(token.coordTMR()); - const decallagePairImpair = (oddq.col % 2 == 0) ? tmrConstants.col1_y : tmrConstants.col2_y; - const dx = (sprite.decallage == undefined) ? 0 : sprite.decallage.x; - const dy = (sprite.decallage == undefined) ? 0 : sprite.decallage.y; - sprite.x = tmrConstants.gridx + (oddq.col * tmrConstants.cellw) + dx; - sprite.y = tmrConstants.gridy + (oddq.row * tmrConstants.cellh) + dy + decallagePairImpair; + const decallagePairImpair = (oddq.col % 2 == 0) ? this.sizes.col1_y : this.sizes.col2_y; + const dx = sprite.decallage?.x ?? 0 + const dy = sprite.decallage?.y ?? 0 + sprite.x = this.sizes.gridx + (oddq.col * this.sizes.cellw) + dx; + sprite.y = this.sizes.gridy + (oddq.row * this.sizes.cellh) + dy + decallagePairImpair; } } @@ -190,10 +220,9 @@ export class PixiTMR { } getCaseRectangle(oddq) { - let decallagePairImpair = (oddq.col % 2 == 0) ? tmrConstants.col1_y : tmrConstants.col2_y; - let x = tmrConstants.gridx + (oddq.col * tmrConstants.cellw) - (tmrConstants.cellw / 2); - let y = tmrConstants.gridy + (oddq.row * tmrConstants.cellh) - (tmrConstants.cellh / 2) + decallagePairImpair; - return { x: x, y: y, w: tmrConstants.cellw, h: tmrConstants.cellh }; + const decallagePairImpair = (oddq.col % 2 == 0) ? this.sizes.col1_y : this.sizes.col2_y; + const x = this.sizes.gridx + (oddq.col * this.sizes.cellw) - (this.sizes.cellw / 2); + const y = this.sizes.gridy + (oddq.row * this.sizes.cellh) - (this.sizes.cellh / 2) + decallagePairImpair; + return { x, y, w: this.sizes.cellw, h: this.sizes.cellh }; } - } \ No newline at end of file diff --git a/module/tmr/pont-impraticable.js b/module/tmr/pont-impraticable.js index 7728cee1..98d14871 100644 --- a/module/tmr/pont-impraticable.js +++ b/module/tmr/pont-impraticable.js @@ -1,35 +1,30 @@ import { Grammar } from "../grammar.js"; import { TMRUtility } from "../tmr-utility.js"; -import { tmrConstants, tmrTokenZIndex } from "../tmr-constants.js"; +import { tmrTokenZIndex } from "../tmr-constants.js"; import { Draconique } from "./draconique.js"; export class PontImpraticable extends Draconique { - constructor() { - super(); - } - type() { return 'souffle' } match(item) { return Draconique.isSouffleDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('impraticabilite des ponts'); } async onActorCreateOwned(actor, souffle) { const ponts = TMRUtility.getListTMR('pont'); for (let tmr of ponts) { - await this.createCaseTmr(actor, 'Pont impraticable: ' + tmr.label, tmr, souffle.id); + await this.createCaseTmr(actor, 'Pont impraticable', tmr, souffle.id); } } code() { return 'pont-impraticable' } - tooltip(linkData) { return `${this.tmrLabel(linkData)} impraticable` } - img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/wave.webp' } + tooltip(linkData) { return `Pont impraticable` } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/debordement.svg' } createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { zIndex: tmrTokenZIndex.casehumide, - alpha: 0.6, - taille: tmrConstants.full, - decallage: tmrConstants.center + decallage: pixiTMR.sizes.decallage(0, 2/3), + taille: () => pixiTMR.sizes.half, }); } diff --git a/module/tmr/present-cites.js b/module/tmr/present-cites.js index d6bfb4d6..c3eade99 100644 --- a/module/tmr/present-cites.js +++ b/module/tmr/present-cites.js @@ -1,31 +1,26 @@ import { ChatUtility } from "../chat-utility.js"; import { Grammar } from "../grammar.js"; import { TMRUtility } from "../tmr-utility.js"; -import { tmrConstants, tmrTokenZIndex } from "../tmr-constants.js"; +import { tmrTokenZIndex } from "../tmr-constants.js"; import { Draconique } from "./draconique.js"; export class PresentCites extends Draconique { - constructor() { - super(); - } - type() { return 'tete' } match(item) { return Draconique.isTeteDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('present des cites'); } manualMessage() { return false } async onActorCreateOwned(actor, tete) { await this._ajouterPresents(actor, tete); } code() { return 'present-cites' } - tooltip(linkData) { return `La ${this.tmrLabel(linkData)} a un présent` } - img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/gift.webp' } + tooltip(linkData) { return `La cité a un présent` } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/present.svg' } createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { zIndex: tmrTokenZIndex.tetes, - alpha: 0.9, - taille: tmrConstants.third, - decallage: tmrConstants.topRight + decallage: pixiTMR.sizes.decallage(-1, -1), + taille: () => pixiTMR.sizes.third }); } @@ -40,7 +35,7 @@ export class PresentCites extends Draconique { else { let cites = TMRUtility.filterTMR(it => it.type == 'cite'); for (let tmr of cites) { - await this.createCaseTmr(actor, 'Présent: ' + tmr.label, tmr, tete.id); + await this.createCaseTmr(actor, 'Présent', tmr, tete.id); } } } diff --git a/module/tmr/quete-eaux.js b/module/tmr/quete-eaux.js index ae5b979b..fc8f6252 100644 --- a/module/tmr/quete-eaux.js +++ b/module/tmr/quete-eaux.js @@ -1,28 +1,26 @@ import { Grammar } from "../grammar.js"; -import { tmrConstants, tmrColors, tmrTokenZIndex } from "../tmr-constants.js"; +import { tmrTokenZIndex } from "../tmr-constants.js"; +import { TMRUtility } from "../tmr-utility.js"; import { Draconique } from "./draconique.js"; export class QueteEaux extends Draconique { - constructor() { - super(); - } type() { return 'tete' } match(item) { return Draconique.isTeteDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes("quete des eaux"); } - manualMessage() { return "Vous devrez re-configurer votre Quête des Eaux une fois un lac ou marais vaincu" } + manualMessage() { return "Vous devrez re-configurer votre Nouvelle Quête des Eaux une fois un lac ou marais vaincu" } async onActorCreateOwned(actor, tete) { - await this.createCaseTmr(actor, "Quête des eaux à déterminer", { coord: 'A0' }, tete.id); + await this.createCaseTmr(actor, "Nouvelle Quête des Eaux", { coord: 'A0' }, tete.id); } code() { return 'maitrisee' } - tooltip(linkData) { return `Quête des eaux, le ${this.tmrLabel(linkData)} est maîtrisé` } - img() { return 'icons/svg/bridge.svg' } + tooltip(linkData) { return `Quête des eaux, ${TMRUtility.getTMRType(linkData.system.coord)} maîtrisé` } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/maitrisee.svg' } createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { zIndex: tmrTokenZIndex.casehumide + 1, - color: tmrColors.tetes, - decallage: tmrConstants.topRight + decallage: pixiTMR.sizes.decallage(0, -2 / 3), + taille: () => pixiTMR.sizes.half }); } } diff --git a/module/tmr/rencontre.js b/module/tmr/rencontre.js index 7d38e017..d8d2d47e 100644 --- a/module/tmr/rencontre.js +++ b/module/tmr/rencontre.js @@ -1,12 +1,8 @@ -import { tmrConstants, tmrColors, tmrTokenZIndex } from "../tmr-constants.js"; +import { tmrTokenZIndex } from "../tmr-constants.js"; import { Draconique } from "./draconique.js"; export class Rencontre extends Draconique { - constructor() { - super(); - } - type() { return '' } match(item) { return false; } manualMessage() { return false } @@ -14,14 +10,13 @@ export class Rencontre extends Draconique { code() { return 'rencontre' } tooltip(rencontre) { return `${rencontre.name} de force ${rencontre.system.force}` } - img() { return 'systems/foundryvtt-reve-de-dragon/icons/heures/hd06.webp' } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/rencontre.svg' } createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { zIndex: tmrTokenZIndex.rencontre, - color: tmrColors.rencontre, - taille: tmrConstants.full, - decallage: { x: 2, y: 2 } - }); + decallage: pixiTMR.sizes.decallage(0, 0), + taille: () => pixiTMR.sizes.twoThird, + }) } } diff --git a/module/tmr/reserve-extensible.js b/module/tmr/reserve-extensible.js index ce0d8dab..9da18dbb 100644 --- a/module/tmr/reserve-extensible.js +++ b/module/tmr/reserve-extensible.js @@ -1,16 +1,13 @@ import { Grammar } from "../grammar.js"; import { TMRUtility } from "../tmr-utility.js"; -import { tmrConstants, tmrTokenZIndex } from "../tmr-constants.js"; +import { tmrTokenZIndex } from "../tmr-constants.js"; import { Draconique } from "./draconique.js"; export class ReserveExtensible extends Draconique { - constructor() { - super(); - } type() { return 'tete' } match(item) { return Draconique.isTeteDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes("reserve extensible"); } - manualMessage() { return "Vous pouvez re-configurer votre Réserve extensible" } + manualMessage() { return "Vous pouvez re-configurer votre Nouvelle Réserve extensible" } async onActorCreateOwned(actor, tete) { const existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord); const selectedTMR = await TMRUtility.getTMRAleatoire(tmr => !(tmr.type == 'fleuve' || existants.includes(tmr.coord))); @@ -18,14 +15,15 @@ export class ReserveExtensible extends Draconique { } code() { return 'reserve_extensible' } - tooltip(linkData) { return `Réserve extensible en ${this.tmrLabel(linkData)} !` } - img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/treasure-chest.webp' } + tooltip(linkData) { return `Réserve extensible` } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/reserve.svg' } createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { zIndex: tmrTokenZIndex.tetes, - alpha: 0.7, - decallage: tmrConstants.left + decallage: pixiTMR.sizes.decallage(-1, 1), + taille: () => pixiTMR.sizes.third + }); } diff --git a/module/tmr/sort-reserve.js b/module/tmr/sort-reserve.js index 767e32df..7f4bec3e 100644 --- a/module/tmr/sort-reserve.js +++ b/module/tmr/sort-reserve.js @@ -1,12 +1,8 @@ -import { tmrConstants, tmrTokenZIndex } from "../tmr-constants.js"; +import { tmrTokenZIndex } from "../tmr-constants.js"; import { Draconique } from "./draconique.js"; export class SortReserve extends Draconique { - constructor() { - super(); - } - type() { return '' } match(item) { return false; } manualMessage() { return false } @@ -14,13 +10,13 @@ export class SortReserve extends Draconique { code() { return 'sortreserve' } tooltip(sort) { return `${sort.name}, r${sort.system.ptreve}` } - img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/scroll.webp' } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/sort-reserve.svg' } createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { zIndex: tmrTokenZIndex.sort, - alpha: 0.5, - decallage: tmrConstants.right + decallage: pixiTMR.sizes.decallage(-1, 0), + taille: () => pixiTMR.sizes.third, }); } } diff --git a/module/tmr/terre-attache.js b/module/tmr/terre-attache.js index 6ef5cf38..39b54eae 100644 --- a/module/tmr/terre-attache.js +++ b/module/tmr/terre-attache.js @@ -1,29 +1,26 @@ import { Grammar } from "../grammar.js"; -import { tmrConstants, tmrColors, tmrTokenZIndex } from "../tmr-constants.js"; +import { tmrTokenZIndex } from "../tmr-constants.js"; import { Draconique } from "./draconique.js"; export class TerreAttache extends Draconique { - constructor() { - super(); - } type() { return 'tete' } match(item) { return Draconique.isTeteDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes("terre d'attache"); } - manualMessage() { return "Vous pouvez re-configurer votre Terre d'Attache" } + manualMessage() { return "Vous pouvez re-configurer votre Nouvelle Terre d'attache" } async onActorCreateOwned(actor, tete) { - await this.createCaseTmr(actor, "Terre d'attache à déterminer", { coord: 'A0' }, tete.id); + await this.createCaseTmr(actor, "Nouvelle Terre d'attache", { coord: 'A0' }, tete.id); } code() { return 'attache' } - tooltip(linkData) { return `Terre d'attache en ${this.tmrLabel(linkData)} !` } - img() { return 'icons/svg/anchor.svg' } + tooltip(linkData) { return `Terre d'attache` } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/attache.svg' } createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { zIndex: tmrTokenZIndex.tetes, - color: tmrColors.tetes, - decallage: tmrConstants.topLeft + decallage: pixiTMR.sizes.decallage(-1, -1), + taille: () => pixiTMR.sizes.third }); } diff --git a/module/tmr/trou-noir.js b/module/tmr/trou-noir.js index 23b995aa..557bf33c 100644 --- a/module/tmr/trou-noir.js +++ b/module/tmr/trou-noir.js @@ -1,12 +1,9 @@ import { Grammar } from "../grammar.js"; import { TMRUtility } from "../tmr-utility.js"; -import { tmrConstants, tmrColors, tmrTokenZIndex } from "../tmr-constants.js"; +import { tmrTokenZIndex } from "../tmr-constants.js"; import { Draconique } from "./draconique.js"; export class TrouNoir extends Draconique { - constructor() { - super(); - } type() { return 'souffle' } match(item) { return Draconique.isSouffleDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('trou noir'); } @@ -15,21 +12,19 @@ export class TrouNoir extends Draconique { async onActorCreateOwned(actor, souffle) { const existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord); const selectedTMR = await TMRUtility.getTMRAleatoire(tmr => !(TMRUtility.isCaseHumide(tmr) || existants.includes(tmr.coord))); - await this.createCaseTmr(actor, 'Trou noir: ' + selectedTMR.label, selectedTMR, souffle.id); + await this.createCaseTmr(actor, 'Trou noir', selectedTMR, souffle.id); } code() { return 'trounoir' } - tooltip(linkData) { return `Trou noir en ${this.tmrLabel(linkData)} !` } - img() { return 'icons/svg/explosion.svg' } + tooltip(linkData) { return `Trou noir` } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/trounoir.svg' } createSprite(pixiTMR) { return pixiTMR.sprite(this.code(), { zIndex: tmrTokenZIndex.trounoir, - color: tmrColors.trounoir, - alpha: 1, taille: - tmrConstants.full, - decallage: { x: 2, y: 2 }, + decallage: pixiTMR.sizes.decallage(0, 0), + taille: () => pixiTMR.sizes.full, }); } diff --git a/module/tmr/urgence-draconique.js b/module/tmr/urgence-draconique.js index 2d0b187b..03a6f94b 100644 --- a/module/tmr/urgence-draconique.js +++ b/module/tmr/urgence-draconique.js @@ -3,9 +3,10 @@ import { Grammar } from "../grammar.js"; import { Misc } from "../misc.js"; import { RdDRollTables } from "../rdd-rolltables.js"; import { TMRUtility } from "../tmr-utility.js"; -import { tmrConstants, tmrColors, tmrTokenZIndex } from "../tmr-constants.js"; +import { tmrTokenZIndex } from "../tmr-constants.js"; import { Draconique } from "./draconique.js"; import { TYPES } from "../item.js"; +import { TMRAnimations } from "./animation.js"; export class UrgenceDraconique extends Draconique { @@ -28,7 +29,7 @@ export class UrgenceDraconique extends Draconique { const demiReve = actor.getDemiReve(); coordSortsReserve.sort(Misc.ascending(t => TMRUtility.distanceCoordTMR(t, demiReve))); const tmr = TMRUtility.getTMR(coordSortsReserve[0]); - await this.createCaseTmr(actor, 'Urgence draconique: ' + tmr.label, tmr, queue.id); + await this.createCaseTmr(actor, 'Urgence draconique', tmr, queue.id); } } @@ -37,16 +38,18 @@ export class UrgenceDraconique extends Draconique { } code() { return 'urgence' } - tooltip(linkData) { return `Urgence draconique!` } - img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/pelerin.webp' } + tooltip(linkData) { return `Urgence draconique` } + img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/urgence.svg' } createSprite(pixiTMR) { - return pixiTMR.sprite(this.code(), - { + return TMRAnimations.withAnimation( + pixiTMR.sprite(this.code(), { zIndex: tmrTokenZIndex.conquete, - color: tmrColors.queues, - taille: tmrConstants.full, - decallage: { x: 2, y: 0 } - }); + decallage: pixiTMR.sizes.decallage(0, 0), + taille: () => pixiTMR.sizes.half, + }), + pixiTMR, + TMRAnimations.changeZoom() + ) } } diff --git a/styles/simple.css b/styles/simple.css index 36e4b77f..a5f8122d 100644 --- a/styles/simple.css +++ b/styles/simple.css @@ -171,9 +171,6 @@ i:is(.fas, .far) { width: fit-content; } -.tmr-dialog table { - border: none; -} .system-foundryvtt-reve-de-dragon .sheet-header div.tmr-buttons { padding: 0; margin: 0; @@ -264,6 +261,39 @@ nav.sheet-tabs .item:after { border-right: 1px dashed rgba(52, 52, 52, 0.25); } +/* =================== Fenêtre TMR ============ */ +div.tmrdialog { + width: fit-content !important; + height: fit-content !important; + max-height: 1024px; +} +div.tmrdialog .window-content { + margin: 0; + padding: 0; + width: fit-content; + max-width: fit-content; + max-height: fit-content; +} +div.tmrdialog div.tmr-map { + width: fit-content; + height: fit-content; + max-height: 1024px; +} +div.tmrdialog div.tmr-actions{ + width: 12rem; + max-height: fit-content; +} +div.tmrdialog div.tmr-map { + width: min-content; + padding: 0; + font-size: 0; +} +div.tmrdialog div.tmr-actions { + vertical-align: top; + flex-basis: inherit; + flex: 'flex-shrink'; +} + /* =================== Autres ============ */ .tabs .item.active, diff --git a/templates/dialog-tmr.html b/templates/dialog-tmr.html index f5c736dd..3b89000d 100644 --- a/templates/dialog-tmr.html +++ b/templates/dialog-tmr.html @@ -1,47 +1,60 @@ - - - - - -
+ +
+
+
+
+
+ © Scriptarium, 2023. +
Usage personnel et privé. +
+ {{#if (eq mode "visu")}} -
+

Visualisation!

{{else}} {{#if (and isGM hasPlayerOwner)}} -
+

Le gardien gére les TMR du joueur, le joueur ne peut pas monter dans les TMR!

{{/if}} -
+
-
+
+ 0 +
+
-
+ -
+
-
+
-
+
0
-
- 0 -
-
+
0
-
+
0
@@ -49,8 +62,9 @@ {{{fatigue.html}}}
{{/if}} -
+
+
+
+ From c1a5bd6eb3e92c794c2becf78c2bcf23f8ba5c66 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Mon, 20 Nov 2023 00:37:43 +0100 Subject: [PATCH 6/7] =?UTF-8?q?Fix:=20jets=20d'encaissement=20forc=C3=A9s?= =?UTF-8?q?=20par=20le=20Gardien?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Les jets d'encaissement forcés par le gardien ne peuvent plus donner le deuxième d10 négatif si le MJ force un résultat inférieur à 11 --- module/rdd-dice.js | 51 +++++++++++++--------------------------------- 1 file changed, 14 insertions(+), 37 deletions(-) diff --git a/module/rdd-dice.js b/module/rdd-dice.js index 7dd9fa22..e9f9dcc2 100644 --- a/module/rdd-dice.js +++ b/module/rdd-dice.js @@ -164,7 +164,7 @@ export class RdDDice { if (options.showDice == HIDE_DICE || !game.modules.get("dice-so-nice")?.active || !game.dice3d) { return; } - + let { whisper, blind } = RdDDice._getWhisperBlind(options); if (options.forceDiceResult?.total) { let terms = await RdDDice._getForcedTerms(options); @@ -197,48 +197,25 @@ export class RdDDice { function terms1d100(total) { const unites = total % 10; const dizaines = Math.floor(total / 10); - return [{ - resultLabel: dizaines * 10, - d100Result: total, - result: dizaines, - type: "d100", - vectors: [], - options: {} - }, - { - resultLabel: unites, - d100Result: total, - result: unites, - type: "d10", - vectors: [], - options: {} - }]; + return [ + { type: "d100", result: dizaines, resultLabel: dizaines * 10, vectors: [], options: {}, d100Result: total }, + { type: "d10", result: unites, resultLabel: unites, vectors: [], options: {}, d100Result: total } + ]; } async function terms2d10(total) { - if (total>20 || total<2) { return undefined } - let first = await RdDDice.d10(); - let second = Math.min(total-first, 10); - first = Math.max(first, total-second); - return [{ - resultLabel:first, - result: first, - type: "d10", - vectors: [], - options: {} - }, - { - resultLabel: second, - result: second, - type: "d10", - vectors: [], - options: {} - }]; + if (total > 20 || total < 2) { return undefined } + const first = await RdDDice.fakeD10(Math.min(10, total - 1)); + const second = total - first; + return [ + { type: "d10", result: first, resultLabel: first, vectors: [], options: {} }, + { type: "d10", result: second, resultLabel: second, vectors: [], options: {} } + ]; } } - static async d10() { - let roll = new Roll('1d10'); + static async fakeD10(faces) { + let roll = new Roll(`1d${faces}`); await roll.evaluate({ async: true }); return roll.total; } From 4e897203416086cacb6e882b77e46d13d5cfe348 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Mon, 20 Nov 2023 00:39:46 +0100 Subject: [PATCH 7/7] Version 11.2.0 --- changelog.md | 17 ++++++++++++++++- system.json | 4 ++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/changelog.md b/changelog.md index 115544fb..9558701f 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,18 @@ -# v11.0 +# v11.2 +## v11.2.0 - Les Terres médianes d'Akarlikarlikar +- Les TMRs sont redimensionables +- Nouveaux graphismes plus lisibles dans les TMRs +- Nouveau code couleur des icônes dans les TMR: + - noir: case innaccessible + - rouge: empêche l'usage du haut-rêve + - vert: bonus de tête de dragon permanent + - bleu: la case doit être vaincue + - blanc: effet temporaire (sort en réserve, présent des cités) +- Fix: les déplacements aléatoires prennent bien compte des colonnes paires/impaires +- Fix: Le Tricollet prend deux "L" +- Fix: Les jets d'encaissement forcés par le gardien à un résultat inférieur à 11 ne peuvent plus donner un deuxième d10 négatif + +# v11.1 ## v11.1.6 - Les dissections de Werther de Zloth - Fix: on peut de nouveau donner des compétences aux créatures - Fix: le délai de guérison d'une blessure rétrogradée est correctement appliqué @@ -53,6 +67,7 @@ - certaines macros ne marchaient pas pour les créatures/entités/véhicules/commerces - en cas de charge, les particulières sont toujours en force (p125) +# v11.0 ## v11.0.28 - les fractures de Khrachtchoum - La gravité de la blessure est affichée dans le résumé de l'encaissement - Lors du changement d'acteur pendant le round diff --git a/system.json b/system.json index fa90a028..3930ad0a 100644 --- a/system.json +++ b/system.json @@ -1,8 +1,8 @@ { "id": "foundryvtt-reve-de-dragon", "title": "Rêve de Dragon", - "version": "11.1.6", - "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-11.1.6.zip", + "version": "v11.2.0", + "download": "https://www.uberwald.me/gitea/public/foundryvtt-reve-de-dragon/archive/foundryvtt-reve-de-dragon-v11.2.0.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": {