From 875b051090c77e34edce057692a45f987469a22b Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 27 Feb 2021 22:24:40 +0100 Subject: [PATCH 01/11] fix typos --- templates/casetmr-specific-list.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/casetmr-specific-list.html b/templates/casetmr-specific-list.html index ccedfd1f..48be5d5b 100644 --- a/templates/casetmr-specific-list.html +++ b/templates/casetmr-specific-list.html @@ -5,8 +5,8 @@ - - + + From 0d77b10473b7efa24bbe9d0c60c3fe225b5ff928 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 27 Feb 2021 22:25:15 +0100 Subject: [PATCH 02/11] =?UTF-8?q?Ajout=20extraits=20po=C3=A8mes=20des=20re?= =?UTF-8?q?ncontres?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/poetique.js | 202 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 190 insertions(+), 12 deletions(-) diff --git a/module/poetique.js b/module/poetique.js index 58127bf8..e448d6e7 100644 --- a/module/poetique.js +++ b/module/poetique.js @@ -4,25 +4,25 @@ const poesieHautReve = [ { reference: 'Le Ratier Bretonien', extrait: `Le courant du Fleuve -
Te domine et te Porte -
Avant que tu te moeuves -
Combat le, ou il t'emporte` +
Te domine et te Porte +
Avant que tu te moeuves +
Combat le, ou il t'emporte` }, { reference: 'Incompatibilité, Charles Beaudelaire', extrait: `Et lorsque par hasard une nuée errante -
Assombrit dans son vol le lac silencieux, -
On croirait voir la robe ou l'ombre transparente -
D'un esprit qui voyage et passe dans les cieux.` +
Assombrit dans son vol le lac silencieux, +
On croirait voir la robe ou l'ombre transparente +
D'un esprit qui voyage et passe dans les cieux.` }, { reference: 'Au fleuve de Loire, Joachim du Bellay', extrait: `Ô de qui la vive course -
Prend sa bienheureuse source, -
D’une argentine fontaine, -
Qui d’une fuite lointaine, -
Te rends au sein fluctueux -
De l’Océan monstrueux` +
Prend sa bienheureuse source, +
D’une argentine fontaine, +
Qui d’une fuite lointaine, +
Te rends au sein fluctueux +
De l’Océan monstrueux` }, { reference: 'Denis Gerfaud', @@ -61,10 +61,188 @@ const poesieHautReve = [ Nul ne sait qui est le créateur des Dragons, ni qui est leur maître. Mais l'on peut supposer qui est le maître du Rêve des Dragons, c'est Oniros»` }, + { + reference: "La chevelure, Charles Baudelaire", + extrait: `J'irai là-bas où l'arbre et l'homme, pleins de sève, +
Se pâment longuement sous l'ardeur des climats ; +
Fortes tresses, soyez la houle qui m'enlève !` + }, + { + reference: "Rêve de Dragon, Denis Gerfaud", + extrait: `En réalité, tous les éléments du rêve des Dragons expriment + le Draconic : chaque pierre, chaque fleur, chaque goutte d'eau, + chaque nuage est porteur d'un message dans la langue des Dragons` + }, + { + reference: "Femmes damnées (2), Charles Baudelaire", + extrait: `Comme je descendais des Fleuves impassibles, +
Je ne me sentis plus guidé par les haleurs : +
Des Peaux-Rouges criards les avaient pris pour cibles, +
Les ayant cloués nus aux poteaux de couleurs.` + }, + { + reference: "Le bateau ivre, Arthur Rimbaud", + extrait: `Loin des peuples vivants, errantes, condamnées, +
A travers les déserts courez comme les loups ; +
Faites votre destin, âmes désordonnées, +
Et fuyez l'infini que vous portez en vous !` + }, + { + reference: "L'Ennemi, Charles Baudelaire", + extrait: `Et qui sait si les fleurs nouvelles que je rêve +
Trouveront dans ce sol lavé comme une grève +
Le mystique aliment qui ferait leur vigueur ?` + }, + { + reference: "Une charogne, Charles Baudelaire", + extrait: `Et le ciel regardait la carcasse superbe +
Comme une fleur s'épanouir. +
La puanteur était si forte, que sur l'herbe +
Vous crûtes vous évanouir.` + }, + { + reference: "Conseil, Victor Hugo", + extrait: `Rois ! la bure est souvent jalouse du velours. +
Le peuple a froid l'hiver, le peuple a faim toujours. +
Rendez-lui son sort plus facile. +
Le peuple souvent porte un bien rude collier. +
Ouvrez l'école aux fils, aux pères l'atelier, +
À tous vos bras, auguste asile !` + }, + { + reference: "El Desdichado, Gérard de Nerval", + extrait: `Suis-je Amour ou Phébus ?... Lusignan ou Biron ? +
Mon front est rouge encor du baiser de la Reine ; +
J'ai rêvé dans la Grotte où nage la sirène...` + }, + { + reference: "Caligula - IIIème chant, Gérard de Nerval", + extrait: `Allez, que le caprice emporte +
Chaque âme selon son désir, +
Et que, close après vous, la porte +
Ne se rouvre plus qu'au plaisir.` + }, + { + reference: "Rêve de Dragon, Denis Gerfaud", + extrait: `Les sages ont encore coutume de dire : +
« Mais comment les Dragons peuvent-ils + être influencés par une créature qui, tout + bien considéré, n'existe pas vraiment pour eux, + qui n'est que le fantasme de leur activité nocturne ? »` + }, + { + reference: "Rêve de Dragon, Denis Gerfaud", + extrait: `La légende affirme que ce sont les Gnomes qui furent + les premiers haut-rêvants. En observant les pierres précieuses, + les gemmes qui sont les larmes de joie des Dragons, ils parvinrent à + en comprendre la langue. Et l'ayant comprise, ils purent s'en servir + pour influencer le cours du rêve`, + }, + { + reference: "Quand le rêve se brise, Cypora Sebagh", + extrait: `Quand le rêve se brise, +
Dans la plainte du jour, +
Ma mémoire devient grise +
Et sombre, tour à tour, +
Dans le puits du silence +
Et de la solitude ; +
Elle reprend son errance +
Parmi la multitude.` + } + , + { + reference: "Une charogne, Charles Baudelaire", + extrait: `Les formes s'effaçaient et n'étaient plus qu'un rêve, +
Une ébauche lente à venir +
Sur la toile oubliée, et que l'artiste achève +
Seulement par le souvenir.` + }, + { + reference: "La chevelure, Charles Baudelaire", + extrait: `Longtemps ! toujours ! ma main dans ta crinière lourde +
Sèmera le rubis, la perle et le saphir, +
Afin qu'à mon désir tu ne sois jamais sourde ! +
N'es-tu pas l'oasis où je rêve, et la gourde +
Où je hume à longs traits le vin du souvenir` + }, + { + reference: "Un Fou et un Sage, Jean de La Fontaine", + extrait: `Certain Fou poursuivait à coups de pierre un Sage. +
Le Sage se retourne et lui dit : Mon ami, +
C'est fort bien fait à toi ; reçois cet écu-ci : +
Tu fatigues assez pour gagner davantage.` + }, + { + reference: "Guitare, Victor Hugo", + extrait: `Je la voyais passer de ma demeure, +
Et c'était tout. +
Mais à présent je m'ennuie à toute heure, +
Plein de dégoût, +
Rêveur oisif, l'âme dans la campagne, +
La dague au clou ... – +
Le vent qui vient à travers la montagne +
M'a rendu fou !` + }, + { + reference: "Rêve de Dragon, Denis Gerfaud", + extrait: `Le Premier Âge fut appelé l'Âge des Dragons. Ce fut le commencement + des temps, le commencement des rêves. Durant cette période plus mythique + que réellement historique, les Dragons aimaient à se rêver eux-mêmes.` + }, + { + reference: "Les Djinns, Victor Hugo", + extrait: `C'est l'essaim des Djinns qui passe, +
Et tourbillonne en sifflant ! +
Les ifs, que leur vol fracasse, +
Craquent comme un pin brûlant.`}, + { + reference: "Rêve de Dragon, Denis Gerfaud", + extrait: `Car le Second Âge fut bel et bien celui des Magiciens. Durant cette période, les + Gnomes s'enfoncèrent profondément sous les montagnes et la magie passa aux + mains des Humains qui en usèrent et abusèrent, se croyant devenus les maîtres du monde` + }, + { + reference: "Lily, Pierre Perret", + extrait: `Elle aurait pas cru sans le voir +
Que la couleur du désespoir +
Là-bas aussi ce fût le noir.` + }, + + { + reference: "Qu'est-ce de votre vie ? une bouteille molle, Jean-Baptiste Chassignet", + extrait: `Qu'est-ce de votre vie ? un tourbillon rouant +
De fumière à flot gris, parmi l'air se jouant, +
Qui passe plus soudain que foudre meurtrière.` + }, + { + reference: "Les Djinns, poème Victor Hugo", + extrait: `Cris de l'enfer! voix qui hurle et qui pleure ! +
L'horrible essaim, poussé par l'aquilon, +
Sans doute, ô ciel ! s'abat sur ma demeure. +
Le mur fléchit sous le noir bataillon. +
La maison crie et chancelle penchée, +
Et l'on dirait que, du sol arrachée, +
Ainsi qu'il chasse une feuille séchée, +
Le vent la roule avec leur tourbillon !` + }, + { + reference: "Rêve de Dragon, Denis Gerfaud", + extrait: `Le monde est Rêve de Dragons, mais nous ne savons +
ni leur apparence ni qui sont les dragons. +
En dépit de l'iconographie qui les clame +
immenses créatures ailées crachant des flammes` + }, + { + reference: "El Desdichado, Gérard de Nerval", + extrait: `Je suis le Ténébreux, – le Veuf, – l'Inconsolé, +
Le Prince d'Aquitaine à la Tour abolie : +
Ma seule Etoile est morte, – et mon luth constellé +
Porte le Soleil noir de la Mélancolie.` + }, ] export class Poetique { - static getExtrait(){ + static getExtrait() { return Misc.rollOneOf(poesieHautReve); } From d2fcb365144f0f3271a5c4cd36a1317de6880b95 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sat, 27 Feb 2021 22:26:14 +0100 Subject: [PATCH 03/11] =?UTF-8?q?Ajout=20de=20m=C3=A9thode=20getTMRDescr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit retourne le nom de la case précédé de l'article --- module/tmr-utility.js | 19 +++++++++++-------- module/tmr/draconique.js | 1 + 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/module/tmr-utility.js b/module/tmr-utility.js index aa0358ef..222d85c8 100644 --- a/module/tmr-utility.js +++ b/module/tmr-utility.js @@ -1,5 +1,6 @@ import { TMRRencontres } from "./tmr-rencontres.js"; import { Misc } from "./misc.js"; +import { Grammar } from "./grammar.js"; /* -------------------------------------------- */ const TMRMapping = { @@ -210,24 +211,21 @@ const TMRMapping = { export const TMRType = { cite: { name: "cité", genre: "f" }, - sanctuaire: { name: "sanctuaire" }, - plaines: { name: "plaines", genre: "p" }, + sanctuaire: { name: "sanctuaire" , genre: 'm'}, + plaines: { name: "plaines", genre: "fp" }, pont: { name: "pont", genre: "m" }, - collines: { name: "collines", genre: "p" }, + collines: { name: "collines", genre: "fp" }, foret: { name: "forêt", genre: "f" }, - monts: { name: "monts", genre: "p" }, + monts: { name: "monts", genre: "mp" }, desert: { name: "désert", genre: "m" }, fleuve: { name: "fleuve", genre: "m" }, lac: { name: "lac", genre: "m" }, - marais: { name: "marais", genre: "m" }, + marais: { name: "marais", genre: "mp" }, gouffre: { name: "gouffre", genre: "m" }, necropole: { name: "nécropole", genre: "f" }, desolation: { name: "désolation", genre: "f" } } -/* -------------------------------------------- */ -const caseSpecificModes = ["attache", "trounoir", "debordement", "reserve_extensible", "maitrisee"]; - /* -------------------------------------------- */ const tmrRandomMovePatten = [{ name: 'top', x: 0, y: -1 }, @@ -335,6 +333,11 @@ export class TMRUtility { return TMRMapping[coord]?.label ?? (coord+": case inconnue"); } + static getTMRDescr(coord) { + const tmr = TMRMapping[coord]; + return Grammar.articleDetermine(tmr.genre)+' '+tmr.label; + } + static isCaseHumide(tmr) { return tmr.type == 'fleuve' || tmr.type == 'lac' || tmr.type == 'marais'; } diff --git a/module/tmr/draconique.js b/module/tmr/draconique.js index 9af391ec..4349c0ae 100644 --- a/module/tmr/draconique.js +++ b/module/tmr/draconique.js @@ -16,6 +16,7 @@ export class Draconique static isQueueSouffle(it) { return Draconique.isQueueDragon(it) || Draconique.isSouffleDragon(it); } tmrLabel(linkData) { return TMRUtility.getTMRLabel(linkData.data.coord); } + tmrDescr(linkData) { return TMRUtility.getTMRDescr(linkData.data.coord); } static register(draconique) { registeredEffects[draconique.code()] = draconique; From d179661a222b682e14da8d3b98d865fd79a5bc93 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sun, 28 Feb 2021 01:26:32 +0100 Subject: [PATCH 04/11] =?UTF-8?q?#166=20Supprimer=20seulement=20le=20sort?= =?UTF-8?q?=20d=C3=A9clench=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/actor.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/module/actor.js b/module/actor.js index 5ee13feb..dec691aa 100644 --- a/module/actor.js +++ b/module/actor.js @@ -313,15 +313,13 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async deleteSortReserve(sortReserve) { let reserve = duplicate(this.data.data.reve.reserve); - let len = reserve.list.length; - let i = 0; - let newTable = []; - for (i = 0; i < len; i++) { - if (reserve.list[i].coord != sortReserve.coord && reserve.list[i].sort.name != sortReserve.sort.name) - newTable.push(reserve.list[i]); - } - if (newTable.length != len) { - reserve.list = newTable; + let tmr = TMRUtility.getTMR(sortReserve.coord); + let index = reserve.list.findIndex(tmr.type == 'fleuve' + ? sort => (TMRUtility.getTMR(sort.coord).type == 'fleuve' && sort.sort.name == sortReserve.sort.name) + : sort => (sort.coord == sortReserve.coord && sort.sort.name == sortReserve.sort.name) + ); + if (index >=0 ) { + reserve.list.splice(index,1); await this.update({ "data.reve.reserve": reserve }); } } From dc66e10f75fa23d6eeaf1ba03b25bf94c0950178 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sun, 28 Feb 2021 01:38:40 +0100 Subject: [PATCH 05/11] fix Grammar --- module/grammar.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/module/grammar.js b/module/grammar.js index e75bdc77..7a35cebc 100644 --- a/module/grammar.js +++ b/module/grammar.js @@ -26,7 +26,7 @@ export class Grammar { /* -------------------------------------------- */ static articleDetermine(genre) { - switch (toLowerCaseNoAccent(genre)) { + switch (Grammar.toLowerCaseNoAccent(genre)) { case 'f': case 'feminin': return 'la'; case 'p': case 'mp': case 'fp': case 'pluriel': return 'les'; default: @@ -35,8 +35,8 @@ export class Grammar { } /* -------------------------------------------- */ - static articleIndétermine(genre) { - switch (toLowerCaseNoAccent(genre)) { + static articleIndetermine(genre) { + switch (Grammar.toLowerCaseNoAccent(genre)) { case 'f': case 'feminin': return 'une'; case 'p': case 'fp': case 'mp': case 'pluriel': return 'des'; case 'n': case 'neutre': return 'du' @@ -58,7 +58,7 @@ export class Grammar { * @param {...any} mots */ static accord(genre, ...mots) { - switch (toLowerCaseNoAccent(genre)) { + switch (Grammar.toLowerCaseNoAccent(genre)) { default: case 'n': case 'neutre': case 'm': case 'masculin': return mots[0]; From fc3aaeb207eb60c658d82f123777ec95dcdeec02 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sun, 28 Feb 2021 01:40:32 +0100 Subject: [PATCH 06/11] =?UTF-8?q?Ajout=20commande=20id=C3=A9e=20fixe/d?= =?UTF-8?q?=C3=A9sir=20lancinant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/rdd-commands.js | 2 ++ module/rdd-rolltables.js | 12 ++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/module/rdd-commands.js b/module/rdd-commands.js index b085c758..a10392ff 100644 --- a/module/rdd-commands.js +++ b/module/rdd-commands.js @@ -23,6 +23,8 @@ export class RdDCommands { rddCommands.registerCommand({ path: ["/aide"], func: (content, msg, params) => rddCommands.help(msg), descr: "Affiche l'aide pour toutes les commandes" }); rddCommands.registerCommand({ path: ["/help"], func: (content, msg, params) => rddCommands.help(msg), descr: "Affiche l'aide pour toutes les commandes" }); rddCommands.registerCommand({ path: ["/table", "queues"], func: (content, msg, params) => RdDRollTables.getQueue(true), descr: "Tire une Queue de Dragon" }); + rddCommands.registerCommand({ path: ["/table", "ideefixe"], func: (content, msg, params) => RdDRollTables.getIdeeFixe(true), descr: "Tire une Idée fixe" }); + rddCommands.registerCommand({ path: ["/table", "desir"], func: (content, msg, params) => RdDRollTables.getDesirLancinant(true), descr: "Tire un Désir Lancinant" }); rddCommands.registerCommand({ path: ["/table", "ombre"], func: (content, msg, params) => RdDRollTables.getOmbre(true), descr: "Tire une Ombre de Dragon" }); rddCommands.registerCommand({ path: ["/table", "tetehr"], func: (content, msg, params) => RdDRollTables.getTeteHR(true), descr: "Tire une Tête de Dragon pour Hauts Revants" }); rddCommands.registerCommand({ path: ["/table", "tete"], func: (content, msg, params) => RdDRollTables.getTete(true), descr: "Tire une Tête de Dragon" }); diff --git a/module/rdd-rolltables.js b/module/rdd-rolltables.js index 957c130a..74d06152 100644 --- a/module/rdd-rolltables.js +++ b/module/rdd-rolltables.js @@ -48,14 +48,22 @@ export class RdDRollTables { static async getQueue(toChat = false) { let queue = await RdDRollTables.drawItemFromRollTable("Queues de dragon", toChat); if (queue.name.toLowerCase().includes('lancinant') ) { - queue = await RdDRollTables.drawItemFromRollTable("Désirs lancinants", toChat); + return await RdDRollTables.getDesirLancinant(toChat); } if (queue.name.toLowerCase().includes('fixe') ) { - queue = await RdDRollTables.drawItemFromRollTable("Idées fixes", toChat); + return await RdDRollTables.getIdeeFixe(toChat); } return queue; } + static async getDesirLancinant(toChat = false) { + return await RdDRollTables.drawItemFromRollTable("Désirs lancinants", toChat); + } + + static async getIdeeFixe(toChat = false) { + return await RdDRollTables.drawItemFromRollTable("Idées fixes", toChat); + } + /* -------------------------------------------- */ static async getTeteHR(toChat = false) { return await RdDRollTables.drawItemFromRollTable("Têtes de Dragon pour haut-rêvants", toChat); From 002822d55973d4f9d38f2d011321129d0159cc2c Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sun, 28 Feb 2021 01:50:15 +0100 Subject: [PATCH 07/11] =?UTF-8?q?Refactor:=20extrait=20m=C3=A9thodes=20com?= =?UTF-8?q?munes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - suppression de casetmr lors de visite/conquete - suppression de toutes les cases TMRs liées - notification lors de suppression d'une casetmr pour enlever la queue --- module/actor.js | 10 ++++++++++ module/rdd-tmr-dialog.js | 20 ++++++++++--------- module/tmr/conquete.js | 7 ------- module/tmr/desorientation.js | 10 ---------- module/tmr/draconique.js | 36 +++++++++++++++++++++++++---------- module/tmr/fermeture-cites.js | 7 ------- module/tmr/pelerinage.js | 9 --------- 7 files changed, 47 insertions(+), 52 deletions(-) diff --git a/module/actor.js b/module/actor.js index dec691aa..5bd0daf4 100644 --- a/module/actor.js +++ b/module/actor.js @@ -3197,6 +3197,9 @@ export class RdDActor extends Actor { case 'souffle': await this.onDeleteOwnedDraconique(item, options, id); break; + case 'casetmr': + await this.onDeleteOwnedCaseTmr(item, options, id); + break; } } @@ -3218,6 +3221,13 @@ export class RdDActor extends Actor { } } + async onDeleteOwnedCaseTmr(item, options, id) { + let draconique = Draconique.all().find(it => it.isCase(item)); + if (draconique) { + draconique.onActorDeleteCaseTmr(this, item) + } + } + notifyGestionTeteSouffleQueue(item, manualMessage=true){ ChatMessage.create({ whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index a3bcff7e..ecbc3caf 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -558,8 +558,10 @@ export class RdDTMRDialog extends Dialog { await this._conquerir(tmr, { difficulte: -9, action: 'Conquérir la cité', - onConqueteReussie: r => EffetsDraconiques.fermetureCites.onConquete(r.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)), - onConqueteEchec: r => this.close(), + onConqueteReussie: r => EffetsDraconiques.fermetureCites.onVisiteSupprimer(r.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)), + onConqueteEchec: r => { + this.close() + }, canClose: false }); } @@ -576,8 +578,8 @@ export class RdDTMRDialog extends Dialog { await this._conquerir(tmr, { difficulte: -7, action: 'Conquérir', - onConqueteReussie: r => EffetsDraconiques.conquete.onConquete(r.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)), - onConqueteEchec: r => { }, + onConqueteReussie: r => EffetsDraconiques.conquete.onVisiteSupprimer(r.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)), + onConqueteEchec: r => this.close(), canClose: false }); } @@ -639,8 +641,8 @@ export class RdDTMRDialog extends Dialog { dialog.render(true); } - async validerPelerinage(tmr) { - await EffetsDraconiques.pelerinage.onFinPelerinage(this.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)); + async validerVisite(tmr) { + await EffetsDraconiques.pelerinage.onVisiteSupprimer(this.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)); } @@ -836,17 +838,17 @@ export class RdDTMRDialog extends Dialog { await this.manageCaseHumide(tmr); await this.conquerirCiteFermee(tmr); await this.conquerirTMR(tmr); - await this.validerPelerinage(tmr); + await this.validerVisite(tmr); await this.declencheSortEnReserve(tmr.coord); await this.actor.checkSoufflePeage(tmr); } } - + /* -------------------------------------------- */ async forceDemiRevePositionView() { this._updateDemiReve(); } - + /* -------------------------------------------- */ async forceDemiRevePosition(coord) { await this.actor.updateCoordTMR(coord); diff --git a/module/tmr/conquete.js b/module/tmr/conquete.js index 92d665c4..550c6427 100644 --- a/module/tmr/conquete.js +++ b/module/tmr/conquete.js @@ -35,11 +35,4 @@ export class Conquete extends Draconique { await this.createCaseTmr(actor, 'Conquête: ' + conquete.label, conquete, queue._id); } - async onConquete(actor, tmr, onRemoveToken) { - let existants = actor.data.items.filter(it => this.isCase(it, tmr.coord)); - for (let casetmr of existants) { - await actor.deleteOwnedItem(casetmr.data.sourceid); - onRemoveToken(tmr, casetmr); - } - } } diff --git a/module/tmr/desorientation.js b/module/tmr/desorientation.js index f2dad665..1dcec96a 100644 --- a/module/tmr/desorientation.js +++ b/module/tmr/desorientation.js @@ -24,10 +24,6 @@ export class Desorientation extends Draconique { return Object.keys(TMRType).filter(it => !dejaDesorientes.includes(it)); } - async onActorDeleteOwned(actor, souffle) { - await this._supprimerCasesTmr(actor, souffle); - } - code() { return 'desorientation' } tooltip(linkData) { return `Désorientation, cette case n'existe plus !` } img() { return 'icons/svg/explosion.svg' } @@ -51,11 +47,5 @@ export class Desorientation extends Draconique { } } - async _supprimerCasesTmr(actor, souffle) { - let caseTmrs = actor.data.items.filter(it => it.data.sourceId == souffle._id); - for (let casetmr of caseTmrs) { - await actor.deleteOwnedItem(casetmr._id); - } - } } diff --git a/module/tmr/draconique.js b/module/tmr/draconique.js index 4349c0ae..8c3ea81a 100644 --- a/module/tmr/draconique.js +++ b/module/tmr/draconique.js @@ -7,8 +7,7 @@ const registeredEffects = [ /** * Définition des informations d'une "draconique" (queue, ombre, tête, souffle) qui influence les TMR */ -export class Draconique -{ +export class Draconique { static isCaseTMR(element) { return element.type == 'casetmr'; } static isQueueDragon(element) { return element.type == 'queue' || element.type == 'ombre'; } static isSouffleDragon(element) { return element.type == 'souffle'; } @@ -29,6 +28,7 @@ export class Draconique static all() { return Object.values(registeredEffects); } + static get(code) { return registeredEffects[code]; } @@ -57,10 +57,11 @@ export class Draconique } async onActorDeleteOwned(actor, item) { - let caseTmrs = actor.data.items.filter(it => this.isCase(it) && it.data.sourceid == item._id); - for (let casetmr of caseTmrs) { - await actor.deleteOwnedItem(casetmr._id); - } + this.deleteCasesTmr(actor, item); + return false; + } + + async onActorDeleteCaseTmr(actor, casetmr) { return false; } /** @@ -73,7 +74,7 @@ export class Draconique * @returns un tooltip à afficher au dessus du token */ tooltip(linkData) { return undefined } - + /** * @param {*} img l'url du fichier image à utiliser pour le token. Si indéfini (et si createSprite n'est pas surchargé), * un disque est utilisé. @@ -103,7 +104,7 @@ export class Draconique if (this.img()) { return pixiTMR.sprite(this.code()); } - else{ + else { return pixiTMR.circle() } } @@ -121,11 +122,26 @@ export class Draconique return list.find(c => this.isCase(c, coord)); } - async createCaseTmr(actor, label, tmr, sourceId=undefined) { + async createCaseTmr(actor, label, tmr, sourceId = undefined) { await actor.createOwnedItem({ name: label, type: 'casetmr', img: this.img(), _id: randomID(16), - data: { coord: tmr.coord, specific: this.code(), sourceid:sourceId } + data: { coord: tmr.coord, specific: this.code(), sourceid: sourceId } }); } + async deleteCasesTmr(actor, draconique) { + let caseTmrs = actor.data.items.filter(it => this.isCase(it) && it.data.sourceid == draconique._id); + for (let casetmr of caseTmrs) { + await actor.deleteOwnedItem(casetmr._id); + } + } + + async onVisiteSupprimer(actor, tmr, onRemoveToken) { + let existants = actor.data.items.filter(it => this.isCase(it, tmr.coord)); + for (let casetmr of existants) { + await actor.deleteOwnedItem(casetmr._id); + onRemoveToken(tmr, casetmr); + } + } + } \ No newline at end of file diff --git a/module/tmr/fermeture-cites.js b/module/tmr/fermeture-cites.js index 6a8602d3..8d695ae6 100644 --- a/module/tmr/fermeture-cites.js +++ b/module/tmr/fermeture-cites.js @@ -35,11 +35,4 @@ export class FermetureCites extends Draconique { await this.createCaseTmr(actor, 'Fermeture: ' + tmr.label, tmr, souffle._id); } } - - async onConquete(actor, tmr, onRemoveToken) { - const citeFermee = actor.data.items.find(it => this.isCase(it, tmr.coord)); - await actor.deleteOwnedItem(citeFermee._id); - onRemoveToken(tmr, citeFermee); - } - } diff --git a/module/tmr/pelerinage.js b/module/tmr/pelerinage.js index 76cc2fe9..d9ba19c5 100644 --- a/module/tmr/pelerinage.js +++ b/module/tmr/pelerinage.js @@ -30,13 +30,4 @@ export class Pelerinage extends Draconique { decallage: tmrConstants.right }); } - - async onFinPelerinage(actor, tmr, onRemoveToken) { - const pelerinages = actor.data.items.filter(it => this.isCase(it, tmr.coord)); - for (let p of pelerinages){ - await actor.deleteOwnedItem(p.data.sourceid); - onRemoveToken(tmr, p); - } - } - } From 9878946109baddea5adbf5b75acf84ead275b409 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sun, 28 Feb 2021 01:50:46 +0100 Subject: [PATCH 08/11] =?UTF-8?q?Extrait=20m=C3=A9thode=20Actor.getDemiRev?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/actor.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/module/actor.js b/module/actor.js index 5bd0daf4..1031637b 100644 --- a/module/actor.js +++ b/module/actor.js @@ -310,6 +310,9 @@ export class RdDActor extends Actor { } return duplicate(list[0]); } + getDemiReve() { + return this.data.data.reve.tmrpos.coord; + } /* -------------------------------------------- */ async deleteSortReserve(sortReserve) { let reserve = duplicate(this.data.data.reve.reserve); @@ -1187,7 +1190,7 @@ export class RdDActor extends Actor { //console.log("List", rencontres, len); let newTable = []; for (i = 0; i < len; i++) { - if (rencontres.list[i].coord != this.data.data.reve.tmrpos.coord) + if (rencontres.list[i].coord != this.getDemiReve()) newTable.push(rencontres.list[i]); } if (newTable.length != len) { @@ -1204,7 +1207,7 @@ export class RdDActor extends Actor { let i = 0; let already = false; for (i = 0; i < len; i++) { - if (rencontres.list[i].coord == this.data.data.reve.tmrpos.coord) + if (rencontres.list[i].coord == this.getDemiReve()) already = true; } if (!already) { @@ -1226,9 +1229,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async updateCoordTMR(coord) { - let tmrPos = duplicate(this.data.data.reve.tmrpos); - tmrPos.coord = coord; - await this.update({ "data.reve.tmrpos": tmrPos }); + await this.update({ "data.reve.tmrpos.coord": coord }); } /* -------------------------------------------- */ From e37b5758d31ab367f3a46b5661b6ef674cc4ac5e Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sun, 28 Feb 2021 01:52:58 +0100 Subject: [PATCH 09/11] Suppression de queues TMR finies --- module/tmr/conquete.js | 4 ++++ module/tmr/draconique.js | 1 - module/tmr/pelerinage.js | 5 +++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/module/tmr/conquete.js b/module/tmr/conquete.js index 550c6427..ba7dffeb 100644 --- a/module/tmr/conquete.js +++ b/module/tmr/conquete.js @@ -35,4 +35,8 @@ export class Conquete extends Draconique { await this.createCaseTmr(actor, 'Conquête: ' + conquete.label, conquete, queue._id); } + async onActorDeleteCaseTmr(actor, casetmr) { + await actor.deleteOwnedItem(casetmr.data.sourceid); + } + } diff --git a/module/tmr/draconique.js b/module/tmr/draconique.js index 8c3ea81a..4bf8a34d 100644 --- a/module/tmr/draconique.js +++ b/module/tmr/draconique.js @@ -143,5 +143,4 @@ export class Draconique { onRemoveToken(tmr, casetmr); } } - } \ No newline at end of file diff --git a/module/tmr/pelerinage.js b/module/tmr/pelerinage.js index d9ba19c5..ec9e4010 100644 --- a/module/tmr/pelerinage.js +++ b/module/tmr/pelerinage.js @@ -30,4 +30,9 @@ export class Pelerinage extends Draconique { decallage: tmrConstants.right }); } + + async onActorDeleteCaseTmr(actor, casetmr) { + await actor.deleteOwnedItem(casetmr.data.sourceid); + } + } From 2fed3947cece8e6e8077baa1dc4b3f37bd7d5ebb Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sun, 28 Feb 2021 01:54:19 +0100 Subject: [PATCH 10/11] Ajout de souffle dans certains cas MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - conquete de cité échouée --- module/rdd-tmr-dialog.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index ecbc3caf..4f876aa2 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -498,9 +498,7 @@ export class RdDTMRDialog extends Dialog { } async _resultatMaitriseCaseHumide(rollData) { - if (rollData.rolled.isETotal) { - rollData.souffle = await this.actor.ajouterSouffle({ chat: false }); - } + await this.souffleSiEchecTotal(rollData); this.toclose = rollData.rolled.isEchec; if (rollData.rolled.isSuccess && rollData.double) { rollData.previous = { rolled: rollData.rolled, ajustements: rollData.ajustements }; @@ -518,6 +516,12 @@ export class RdDTMRDialog extends Dialog { } } + async souffleSiEchecTotal(rollData) { + if (rollData.rolled.isETotal) { + rollData.souffle = await this.actor.ajouterSouffle({ chat: false }); + } + } + /* -------------------------------------------- */ isCaseHumide(tmr) { if (!(TMRUtility.isCaseHumide(tmr) || this.isCaseHumideAdditionelle(tmr))) { @@ -560,6 +564,7 @@ export class RdDTMRDialog extends Dialog { action: 'Conquérir la cité', onConqueteReussie: r => EffetsDraconiques.fermetureCites.onVisiteSupprimer(r.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)), onConqueteEchec: r => { + this.souffleSiEchecTotal(rollData); this.close() }, canClose: false From c1a8a24ee75aae062d558f6c01aca24dde83e56d Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sun, 28 Feb 2021 01:56:17 +0100 Subject: [PATCH 11/11] =?UTF-8?q?Ajout=20P=C3=A9riple=20&=20urgence=20drac?= =?UTF-8?q?onique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/actor.js | 20 ---------- module/rdd-tmr-dialog.js | 37 ++++++++++++++----- module/tmr-utility.js | 31 ++++++++++++---- module/tmr/effets-draconiques.js | 25 +++++++++++-- module/tmr/periple.js | 44 ++++++++++++++++++++++ module/tmr/urgence-draconique.js | 55 ++++++++++++++++++++++++++++ templates/casetmr-specific-list.html | 21 ++++++----- 7 files changed, 181 insertions(+), 52 deletions(-) create mode 100644 module/tmr/periple.js create mode 100644 module/tmr/urgence-draconique.js diff --git a/module/actor.js b/module/actor.js index 1031637b..31385304 100644 --- a/module/actor.js +++ b/module/actor.js @@ -1157,26 +1157,6 @@ export class RdDActor extends Actor { return tmrInnaccessibles.map(it => it.data.coord); } - /* -------------------------------------------- */ - displayTMRQueueSouffleInformation() { - let messages = []; - for (let item of this.data.items) { - if (EffetsDraconiques.isUrgenceDraconique(item)) { - messages.push("Vous souffrez d'une Urgence Draconique : " + item.data.description); - } - if (EffetsDraconiques.isPeriple(item)) { - messages.push("Vous souffrez du Souffle Périple. Vous devez gérer manuellement le détail du Périple.
" + item.data.description); - } - } - - if (messages.length > 0) { - ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), - content: "RAPPEL !
" + messages.join('
') - }); - } - } - /* -------------------------------------------- */ getTMRRencontres() { return this.data.data.reve.rencontre; diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index 4f876aa2..cbc1aafe 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -108,6 +108,11 @@ export class RdDTMRDialog extends Dialog { this._createTokens(); } + removeToken(tmr, casetmr) { + this._removeTokens(t => t.coordTMR() == tmr.coord && t.caseSpeciale?._id == casetmr._id); + this.updateTokens() + } + /* -------------------------------------------- */ _getTokensCasesTmr() { return this.casesSpeciales.map(c => this._tokenCaseSpeciale(c)).filter(token => token); @@ -142,7 +147,7 @@ export class RdDTMRDialog extends Dialog { async activateListeners(html) { super.activateListeners(html); - document.getElementById("tmrrow1").insertCell(1).append(this.pixiApp.view); + document.getElementById("tmrrow1").insertCell(0).append(this.pixiApp.view); if (this.viewOnly) { html.find('#lancer-sort').remove(); @@ -168,7 +173,6 @@ export class RdDTMRDialog extends Dialog { let tmr = TMRUtility.getTMR(this.actor.data.data.reve.tmrpos.coord); await this.manageRencontre(tmr, () => { this.postRencontre(tmr); - this.actor.displayTMRQueueSouffleInformation(); }); } @@ -571,10 +575,20 @@ export class RdDTMRDialog extends Dialog { }); } } - - removeToken(tmr, casetmr) { - this._removeTokens(t => t.coordTMR() == tmr.coord && t.caseSpeciale?._id == casetmr._id); - this.updateTokens() + /* -------------------------------------------- */ + async purifierPeriple(tmr) { + if (EffetsDraconiques.periple.find(this.casesSpeciales, tmr.coord)) { + await this._conquerir(tmr, { + difficulte: EffetsDraconiques.periple.getDifficulte(tmr), + action: 'Purifier ' + TMRUtility.getTMRDescr(tmr.coord), + onConqueteReussie: r => EffetsDraconiques.periple.onVisiteSupprimer(r.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)), + onConqueteEchec: r => { + this.souffleSiEchecTotal(rollData); + this.close() + }, + canClose: false + }); + } } /* -------------------------------------------- */ @@ -648,6 +662,7 @@ export class RdDTMRDialog extends Dialog { async validerVisite(tmr) { await EffetsDraconiques.pelerinage.onVisiteSupprimer(this.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)); + await EffetsDraconiques.urgenceDraconique.onVisiteSupprimer(this.actor, tmr, (casetmr) => this.removeToken(tmr, casetmr)); } @@ -656,11 +671,12 @@ export class RdDTMRDialog extends Dialog { let sortReserveList = TMRUtility.getSortReserveList(this.sortsReserves, coord); if (sortReserveList.length > 0) { - if (EffetsDraconiques.isSortImpossible(this.actor)) { + if (EffetsDraconiques.isSortReserveImpossible(this.actor)) { ui.notifications.error("Une queue ou un souffle vous empèche de déclencher de sort!"); return; } - if (EffetsDraconiques.isReserveEnSecurite(this.actor) || this.isReserveExtensible(coord)) { + if (!EffetsDraconiques.isUrgenceDraconique(this.actor) && + (EffetsDraconiques.isReserveEnSecurite(this.actor) || this.isReserveExtensible(coord))) { let msg = "Vous êtes sur une case avec un Sort en Réserve. Grâce à votre Tête Reserve en Sécurité ou Réserve Exensible, vous pouvez contrôler le déclenchement. Cliquez si vous souhaitez le déclencher :
    "; for (let sortReserve of sortReserveList) { msg += "
  • " + sortReserve.sort.name + "
  • "; @@ -670,9 +686,9 @@ export class RdDTMRDialog extends Dialog { content: msg, whisper: ChatMessage.getWhisperRecipients(game.user.name) }); - } else { - await this.processSortReserve(sortReserveList[0]); + return; } + await this.processSortReserve(sortReserveList[0]); } } @@ -842,6 +858,7 @@ export class RdDTMRDialog extends Dialog { if (!(this.viewOnly || this.currentRencontre)) { await this.manageCaseHumide(tmr); await this.conquerirCiteFermee(tmr); + await this.purifierPeriple(tmr); await this.conquerirTMR(tmr); await this.validerVisite(tmr); await this.declencheSortEnReserve(tmr.coord); diff --git a/module/tmr-utility.js b/module/tmr-utility.js index 222d85c8..cd2d3387 100644 --- a/module/tmr-utility.js +++ b/module/tmr-utility.js @@ -211,7 +211,7 @@ const TMRMapping = { export const TMRType = { cite: { name: "cité", genre: "f" }, - sanctuaire: { name: "sanctuaire" , genre: 'm'}, + sanctuaire: { name: "sanctuaire", genre: 'm' }, plaines: { name: "plaines", genre: "fp" }, pont: { name: "pont", genre: "m" }, collines: { name: "collines", genre: "fp" }, @@ -330,12 +330,12 @@ export class TMRUtility { } static getTMRLabel(coord) { - return TMRMapping[coord]?.label ?? (coord+": case inconnue"); + return TMRMapping[coord]?.label ?? (coord + ": case inconnue"); } static getTMRDescr(coord) { const tmr = TMRMapping[coord]; - return Grammar.articleDetermine(tmr.genre)+' '+tmr.label; + return Grammar.articleDetermine(tmr.genre) + ' ' + tmr.label; } static isCaseHumide(tmr) { @@ -387,7 +387,7 @@ export class TMRUtility { currentPos.x = currentPos.x + direction.x; currentPos.y = currentPos.y + direction.y; if (this._checkTMRCoord(currentPos.x, currentPos.y)) { // Sortie de carte ! Ré-insertion aléatoire - coord = TMRUtility.getTMR(TMRUtility.convertToTMRCoord(currentPos)); + coord = TMRUtility.getTMR(TMRUtility.convertToTMRCoord(currentPos)); } else { coord = await actor.reinsertionAleatoire('Sortie de carte'); } @@ -438,7 +438,7 @@ export class TMRUtility { return reserveList.filter(it => TMRUtility.getTMR(it.coord).type == 'fleuve'); } // Reserve sur un case "normale" - return reserveList.filter(it => it.coord == coord); + return reserveList.filter(it => it.coord == coord); } /* -------------------------------------------- */ @@ -453,9 +453,8 @@ export class TMRUtility { for (let dy = -portee; dy <= portee; dy++) { // Loop thru lines const currentPos = { x: centerPos.x + dx, y: centerPos.y + dy }; if (this._checkTMRCoord(currentPos.x, currentPos.y)) { // Coordinate is valie - let posPicNow = this.computeRealPictureCoordinates(currentPos, tmrConstants); - let dist = Math.sqrt(Math.pow(posPicNow.x - posPic.x, 2) + Math.pow(posPicNow.y - posPic.y, 2)) / tmrConstants.cellw; - if (dist < portee + 0.5) { + let dist = this.distancePosTMR(centerPos, currentPos); + if (dist <= portee) { caseList.push(this.convertToTMRCoord(currentPos)); // Inside the area } } @@ -463,5 +462,21 @@ export class TMRUtility { } return caseList; } + + static distanceTMR(coord1, coord2) { + let pos1 = this.convertToCellPos(coord1); + let pos2 = this.convertToCellPos(coord2); + return this.distancePosTMR(pos1, pos2); + } + + static distancePosTMR(pos1, pos2) { + const dx = pos2.x - pos1.x; + const dy = pos2.y - pos1.y; + 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; + } + } diff --git a/module/tmr/effets-draconiques.js b/module/tmr/effets-draconiques.js index ab8bdc3d..6eefe7f3 100644 --- a/module/tmr/effets-draconiques.js +++ b/module/tmr/effets-draconiques.js @@ -14,6 +14,8 @@ import { PresentCites } from "./present-cites.js"; import { Desorientation } from "./desorientation.js"; import { Conquete } from "./conquete.js"; import { Pelerinage } from "./pelerinage.js"; +import { Periple } from "./periple.js"; +import { UrgenceDraconique } from "./urgence-draconique.js"; export class EffetsDraconiques { @@ -32,6 +34,8 @@ export class EffetsDraconiques { static desorientation = new Desorientation(); static conquete = new Conquete(); static pelerinage = new Pelerinage(); + static periple = new Periple(); + static urgenceDraconique = new UrgenceDraconique(); static init() { Draconique.register(EffetsDraconiques.carteTmr); @@ -49,6 +53,8 @@ export class EffetsDraconiques { Draconique.register(EffetsDraconiques.desorientation); Draconique.register(EffetsDraconiques.conquete); Draconique.register(EffetsDraconiques.pelerinage); + Draconique.register(EffetsDraconiques.periple); + Draconique.register(EffetsDraconiques.urgenceDraconique); } /* -------------------------------------------- */ @@ -112,8 +118,7 @@ export class EffetsDraconiques { } static isPeriple(element) { - // TODO - return EffetsDraconiques.isMatching(element, it => Draconique.isSouffleDragon(it) && ir.name.toLowerCase() == 'périple'); + return EffetsDraconiques.isMatching(element, it => EffetsDraconiques.periple.match(it)); } static isDesorientation(element) { @@ -122,7 +127,19 @@ export class EffetsDraconiques { /* -------------------------------------------- */ static isSortImpossible(element) { - return EffetsDraconiques.isMatching(element, it => EffetsDraconiques.conquete.match(it) || EffetsDraconiques.pelerinage.match(it)); + return EffetsDraconiques.isMatching(element, it => + EffetsDraconiques.conquete.match(it) || + EffetsDraconiques.periple.match(it) || + EffetsDraconiques.urgenceDraconique.match(it) || + EffetsDraconiques.pelerinage.match(it) + ); + } + static isSortReserveImpossible(element) { + return EffetsDraconiques.isMatching(element, it => + EffetsDraconiques.conquete.match(it) || + EffetsDraconiques.periple.match(it) || + EffetsDraconiques.pelerinage.match(it) + ); } static isConquete(element) { @@ -138,7 +155,7 @@ export class EffetsDraconiques { } static isUrgenceDraconique(element) { - return EffetsDraconiques.isMatching(element, it => Draconique.isQueueDragon(it) && it.name.toLowerCase() == 'urgence draconique'); + return EffetsDraconiques.isMatching(element, it => EffetsDraconiques.urgenceDraconique.match(it)); } /* -------------------------------------------- */ diff --git a/module/tmr/periple.js b/module/tmr/periple.js new file mode 100644 index 00000000..feba1a2b --- /dev/null +++ b/module/tmr/periple.js @@ -0,0 +1,44 @@ +import { Grammar } from "../grammar.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; +import { Draconique } from "./draconique.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 } + + async onActorCreateOwned(actor, souffle) { + let terrain = new Roll("1d2").evaluate().total == 1 ? 'sanctuaire' : 'necropole'; + let tmrs = TMRUtility.getListTMR(terrain); + for (let tmr of tmrs) { + await this.createCaseTmr(actor, 'Périple: ' + tmr.label, tmr, souffle._id); + } + } + + + code() { return 'periple' } + tooltip(linkData) { return `Votre Périple passe par ${this.tmrDescr(linkData)}` } + img() { return 'icons/svg/acid.svg' } + + createSprite(pixiTMR) { + return pixiTMR.sprite(this.code(), { + zIndex: tmrTokenZIndex.conquete, + alpha: 1, + color: tmrColors.souffle, + taille: tmrConstants.twoThird, + decallage: tmrConstants.right + }); + } + getDifficulte(tmr) { + switch (tmr.type) { + case 'sanctuaire': return -3; + case 'necropole': return -5; + } + return 0; + } +} \ No newline at end of file diff --git a/module/tmr/urgence-draconique.js b/module/tmr/urgence-draconique.js new file mode 100644 index 00000000..8af5c992 --- /dev/null +++ b/module/tmr/urgence-draconique.js @@ -0,0 +1,55 @@ +import { ChatUtility } from "../chat-utility.js"; +import { Grammar } from "../grammar.js"; +import { Misc } from "../misc.js"; +import { RdDRollTables } from "../rdd-rolltables.js"; +import { tmrColors, tmrConstants, tmrTokenZIndex, TMRUtility } from "../tmr-utility.js"; +import { Draconique } from "./draconique.js"; + +export class UrgenceDraconique extends Draconique { + + constructor() { + super(); + } + + type() { return 'queue' } + match(item) { return Draconique.isQueueDragon(item) && Grammar.toLowerCaseNoAccent(item.name).includes('urgence draconique'); } + manualMessage() { return false } + async onActorCreateOwned(actor, queue) { + let coordSortsReserve = (actor.data.data.reve.reserve?.list.map(it => it.coord)) ?? []; + if (coordSortsReserve.length == 0) { + // La queue se transforme en idée fixe + let ideeFixe = await RdDRollTables.getIdeeFixe(); + ChatMessage.create({ + whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + content: `En l'absence de sorts en réserve, l'urgence draconique de ${actor.name} se transforme en ${queue.name}` + }); + await actor.createOwnedItem(ideeFixe); + await actor.deleteOwnedItem(queue._id); + return; + } + else { + let demiReve = actor.getDemiReve(); + coordSortsReserve.sort((a, b) => TMRUtility.distanceTMR(a, demiReve) - TMRUtility.distanceTMR(b, demiReve)); + let tmr = TMRUtility.getTMR(coordSortsReserve[0]); + await this.createCaseTmr(actor, 'Urgence draconique: ' + tmr.label, tmr, queue._id); + } + } + + async onActorDeleteCaseTmr(actor, casetmr) { + await actor.deleteOwnedItem(casetmr.data.sourceid); + } + + code() { return 'urgence' } + tooltip(linkData) { return `Urgence draconique!` } + img() { return 'icons/svg/hazard.svg' } + + createSprite(pixiTMR) { + return pixiTMR.sprite(this.code(), + { + zIndex: tmrTokenZIndex.conquete, + color: tmrColors.queues, + taille: tmrConstants.full, + decallage: { x: 2, y: 0 } + }); + } +} diff --git a/templates/casetmr-specific-list.html b/templates/casetmr-specific-list.html index 48be5d5b..136f1f6d 100644 --- a/templates/casetmr-specific-list.html +++ b/templates/casetmr-specific-list.html @@ -1,12 +1,13 @@ + + + + + + + + + + - - - - - - - - - - +