From 99ed077da8f5b859ba732795b9526c22bdd00caf Mon Sep 17 00:00:00 2001
From: Vincent Vandemeulebrouck
Date: Fri, 12 Feb 2021 12:50:17 +0100
Subject: [PATCH] =?UTF-8?q?Gestion=20des=20pr=C3=A9sents=20des=20cit=C3=A9?=
=?UTF-8?q?s?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
+ fix bug sur conquête cité (pour supprimer la casetmr)
+ svg couleur plus lisibles
---
icons/svg/gift.svg | 118 ----------
icons/tmr/gift.svg | 130 +++++++++++
icons/tmr/scroll.svg | 58 +++++
icons/tmr/treasure-chest.svg | 62 ++++++
icons/{svg => tmr}/wave.svg | 0
module/rdd-resolution-table.js | 10 +-
module/rdd-tmr-dialog.js | 66 ++++--
module/rdd-utility.js | 368 +++++++++++++++----------------
module/tmr-rencontres.js | 22 +-
module/tmr-utility.js | 2 +-
module/tmr/debordement.js | 4 +-
module/tmr/demi-reve.js | 2 +-
module/tmr/fermeture-cites.js | 2 +-
module/tmr/pixi-tmr.js | 4 +-
module/tmr/pont-impraticable.js | 2 +-
module/tmr/present-cites.js | 23 +-
module/tmr/reserve-extensible.js | 4 +-
module/tmr/sort-reserve.js | 6 +-
18 files changed, 527 insertions(+), 356 deletions(-)
delete mode 100644 icons/svg/gift.svg
create mode 100644 icons/tmr/gift.svg
create mode 100644 icons/tmr/scroll.svg
create mode 100644 icons/tmr/treasure-chest.svg
rename icons/{svg => tmr}/wave.svg (100%)
diff --git a/icons/svg/gift.svg b/icons/svg/gift.svg
deleted file mode 100644
index d62ef934..00000000
--- a/icons/svg/gift.svg
+++ /dev/null
@@ -1,118 +0,0 @@
-
-
diff --git a/icons/tmr/gift.svg b/icons/tmr/gift.svg
new file mode 100644
index 00000000..6a06c684
--- /dev/null
+++ b/icons/tmr/gift.svg
@@ -0,0 +1,130 @@
+
+
diff --git a/icons/tmr/scroll.svg b/icons/tmr/scroll.svg
new file mode 100644
index 00000000..8d3b19cf
--- /dev/null
+++ b/icons/tmr/scroll.svg
@@ -0,0 +1,58 @@
+
+
+
diff --git a/icons/tmr/treasure-chest.svg b/icons/tmr/treasure-chest.svg
new file mode 100644
index 00000000..9b6838c2
--- /dev/null
+++ b/icons/tmr/treasure-chest.svg
@@ -0,0 +1,62 @@
+
+
+
diff --git a/icons/svg/wave.svg b/icons/tmr/wave.svg
similarity index 100%
rename from icons/svg/wave.svg
rename to icons/tmr/wave.svg
diff --git a/module/rdd-resolution-table.js b/module/rdd-resolution-table.js
index 8c05bcee..e020deaf 100644
--- a/module/rdd-resolution-table.js
+++ b/module/rdd-resolution-table.js
@@ -138,18 +138,24 @@ export class RdDResolutionTable {
mergeObject(chances, this._computeCell(null, newScore), { overwrite: true });
}
}
+
static significativeRequise(chances) {
chances.roll = Math.floor(chances.score / 2);
mergeObject(chances, reussites.find(x => x.code == 'sign'), { overwrite: true });
}
+ static succesRequis(chances) {
+ chances.roll = chances.score;
+ mergeObject(chances, reussites.find(x => x.code == 'norm'), { overwrite: true });
+ }
+
/* -------------------------------------------- */
static async rollChances(chances) {
let myRoll = new Roll("1d100").roll();
myRoll.showDice = chances.showDice;
await RdDDice.show(myRoll);
chances.roll = myRoll.total;
- mergeObject(chances, this._computeReussite(chances, chances.roll), { overwrite: true });
+ mergeObject(chances, this.computeReussite(chances, chances.roll), { overwrite: true });
return chances;
}
@@ -210,7 +216,7 @@ export class RdDResolutionTable {
}
/* -------------------------------------------- */
- static _computeReussite(chances, roll) {
+ static computeReussite(chances, roll) {
return reussites.find(x => x.condition(chances, roll));
}
diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js
index 823e8679..af838ce3 100644
--- a/module/rdd-tmr-dialog.js
+++ b/module/rdd-tmr-dialog.js
@@ -123,9 +123,9 @@ export class RdDTMRDialog extends Dialog {
_tokenRencontre(rencontre) {
return EffetsDraconiques.rencontre.token(this.pixiTMR, rencontre, () => rencontre.coord);
}
- _tokenCaseSpeciale(caseSpeciale) {
- const draconique = Draconique.get(caseSpeciale.data.specific);
- return draconique?.token(this.pixiTMR, caseSpeciale, () => caseSpeciale.data.coord);
+ _tokenCaseSpeciale(casetmr) {
+ const draconique = Draconique.get(casetmr.data.specific);
+ return draconique?.token(this.pixiTMR, casetmr, () => casetmr.data.coord);
}
_tokenSortEnReserve(sortEnReserve) {
return EffetsDraconiques.sortReserve.token(this.pixiTMR, sortEnReserve.sort, () => sortEnReserve.coord);
@@ -313,7 +313,7 @@ export class RdDTMRDialog extends Dialog {
}
/* -------------------------------------------- */
- async _tentativeMaitrise(rencontreData) {
+ async _tentativeMaitrise(rencontreData, presentCite) {
console.log("-> matriser", rencontreData);
rencontreData.reve = this.actor.getReveActuel();
@@ -321,7 +321,10 @@ export class RdDTMRDialog extends Dialog {
RollDataAjustements.calcul(rencontreData, this.actor);
- rencontreData.rolled = await RdDResolutionTable.roll(rencontreData.reve, RollDataAjustements.sum(rencontreData.ajustements));
+ rencontreData.rolled = presentCite
+ ? this._rollPresentCite(rencontreData)
+ : await RdDResolutionTable.roll(rencontreData.reve, RollDataAjustements.sum(rencontreData.ajustements));
+
let postProcess = await TMRRencontres.gererRencontre(this, rencontreData);
ChatMessage.create({
@@ -351,6 +354,13 @@ export class RdDTMRDialog extends Dialog {
}
}
+ _rollPresentCite(rencontreData) {
+ let rolled = RdDResolutionTable.computeChances(rencontreData.reve, 0);
+ mergeObject(rolled, { caracValue: rencontreData.reve, finalLevel: 0, roll: rolled.score });
+ RdDResolutionTable.succesRequis(rolled);
+ return rolled;
+ }
+
/* -------------------------------------------- */
_deleteTmrMessages(actor, nbRounds = -1) {
setTimeout(() => {
@@ -381,6 +391,9 @@ export class RdDTMRDialog extends Dialog {
return;
}
this.currentRencontre = undefined;
+ if (this._presentCite(tmr, postRencontre)) {
+ return;
+ }
let rencontre = await this._jetDeRencontre(tmr);
if (rencontre) { // Manages it
@@ -396,19 +409,39 @@ export class RdDTMRDialog extends Dialog {
}
}
+ _presentCite(tmr, postRencontre) {
+ const presentCite = this.casesSpeciales.find(c => EffetsDraconiques.presentCites.isCase(c, tmr.coord));
+ if (presentCite) {
+ this.minimize();
+ EffetsDraconiques.presentCites.choisirUnPresent(presentCite, (type => this._utiliserPresentCite(presentCite, type, tmr, postRencontre)));
+ }
+ return presentCite;
+ }
+
+ async _utiliserPresentCite(presentCite, typeRencontre, tmr, postRencontre) {
+ const rencontre = TMRRencontres.getRencontre(typeRencontre);
+ let rencontreData = {
+ actor: this.actor,
+ alias: this.actor.name,
+ reveDepart: this.actor.getReveActuel(),
+ competence: this.actor.getBestDraconic(),
+ rencontre: rencontre,
+ tmr: tmr
+ };
+ await TMRRencontres.evaluerForceRencontre(rencontre);
+ await EffetsDraconiques.presentCites.ouvrirLePresent(this.actor, presentCite);
+ this.removeToken(tmr, presentCite);
+ await this._tentativeMaitrise(rencontreData, presentCite);
+ this.maximize();
+ postRencontre();
+ }
+
/* -------------------------------------------- */
async _jetDeRencontre(tmr) {
let rencontre = this.rencontresExistantes.find(prev => prev.coord == tmr.coord);
if (rencontre) {
return rencontre;
}
- if (this.casesSpeciales.find(c => EffetsDraconiques.isPresentCite(c, tmr.coord))) {
-
- // TODO: dialog pour remplacer la rencontre par un présent
-
- }
-
-
let myRoll = new Roll("1d7").evaluate().total;
if (TMRUtility.isForceRencontre() || myRoll == 7) {
return await this.rencontreTMRRoll(tmr, this.actor.isRencontreSpeciale());
@@ -416,7 +449,6 @@ export class RdDTMRDialog extends Dialog {
this._tellToUser(myRoll + ": Pas de rencontre en " + tmr.label + " (" + tmr.coord + ")");
}
-
/* -------------------------------------------- */
async rencontreTMRRoll(tmr, isMauvaise = false) {
let rencontre = TMRUtility.utiliseForceRencontre() ??
@@ -450,8 +482,8 @@ export class RdDTMRDialog extends Dialog {
forceCarac: { 'reve-actuel': { label: "Rêve Actuel", value: this.actor.getReveActuel() } },
maitrise: { verbe: 'maîtriser', action: 'Maîtriser le fleuve' }
}
- rollData.double = EffetsDraconiques.isDoubleResistanceFleuve(this.actor) ? true: undefined,
- rollData.competence.data.defaut_carac = 'reve-actuel';
+ rollData.double = EffetsDraconiques.isDoubleResistanceFleuve(this.actor) ? true : undefined,
+ rollData.competence.data.defaut_carac = 'reve-actuel';
await this._rollMaitriseCaseHumide(rollData);
}
}
@@ -541,7 +573,7 @@ export class RdDTMRDialog extends Dialog {
difficulte: -7,
action: 'Conquérir',
onConqueteReussie: r => EffetsDraconiques.conquete.onConquete(r.actor, tmr.coord, (casetmr) => this.removeToken(tmr, casetmr)),
- onConqueteEchec: r => {},
+ onConqueteEchec: r => { },
canClose: false
});
}
@@ -605,7 +637,7 @@ export class RdDTMRDialog extends Dialog {
/* -------------------------------------------- */
async declencheSortEnReserve(coord) {
-
+
let sortReserveList = TMRUtility.getSortReserveList(this.sortsReserves, coord);
if (sortReserveList.length > 0) {
if (EffetsDraconiques.isConquete(this.actor)) {
diff --git a/module/rdd-utility.js b/module/rdd-utility.js
index 01b8fc3c..14069a3c 100644
--- a/module/rdd-utility.js
+++ b/module/rdd-utility.js
@@ -31,60 +31,60 @@ const ajustementsEncaissement = [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, +1,
const tableCaracDerivee = {
// xp: coût pour passer du niveau inférieur à ce niveau
- 1: { xp: 3, poids: "moins de 1kg", plusdom:-5, sconst: 0.5, sust: 0.1 },
- 2: { xp: 3, poids: "1-5", plusdom:-4, sconst: 0.5, sust: 0.3 },
- 3: { xp: 4, poids: "6-10", plusdom:-3, sconst: 1, sust: 0.5 , beaute:'hideux'},
- 4: { xp: 4, poids: "11-20", plusdom:-3, sconst: 1, sust: 1 , beaute:'repoussant'},
- 5: { xp: 5, poids: "21-30", plusdom:-2, sconst: 1, sust: 1 , beaute:'franchement très laid'},
- 6: { xp: 5, poids: "31-40", plusdom:-1, sconst: 2, sust: 2 , beaute:'laid'},
- 7: { xp: 6, poids: "41-50", plusdom:-1, sconst: 2, sust: 2 , beaute:'très désavantagé'},
- 8: { xp: 6, poids: "51-60", plusdom:0, sconst: 2, sust: 2 , beaute:'désavantagé'},
- 9: { xp: 7, poids: "61-65", plusdom:0, sconst: 3, sust: 2 , beaute:'pas terrible'},
- 10: { xp: 7, poids: "66-70", plusdom:0, sconst: 3, sust: 3 , beaute:'commun'},
- 11: { xp: 8, poids: "71-75", plusdom:0, sconst: 3, sust: 3 , beaute:'pas mal'},
- 12: { xp: 8, poids: "76-80", plusdom:+1, sconst: 4, sust: 3 , beaute:'avantagé'},
- 13: { xp: 9, poids: "81-90", plusdom:+1, sconst: 4, sust: 3 , beaute:'mignon'},
- 14: { xp: 9, poids: "91-100", plusdom:+2, sconst: 4, sust: 4 , beaute:'beau'},
- 15: { xp: 10, poids: "101-110", plusdom:+2, sconst: 5, sust: 4 , beaute:'très beau'},
- 16: { xp: 20, poids: "111-120", plusdom:+3, sconst: 5, sust: 4 , beaute:'éblouissant'},
- 17: { xp: 30, poids: "121-131", plusdom:+3, sconst: 5, sust: 5 },
- 18: { xp: 40, poids: "131-141", plusdom:+4, sconst: 6, sust: 5 },
- 19: { xp: 50, poids: "141-150", plusdom:+4, sconst: 6, sust: 5 },
- 20: { xp: 60, poids: "151-160", plusdom:+4, sconst: 6, sust: 6 },
- 21: { xp: 70, poids: "161-180", plusdom:+5, sconst: 7, sust: 6 },
- 22: { xp: 80, poids: "181-200", plusdom:+5, sconst: 7, sust: 7 },
- 23: { xp: 90, poids: "201-300", plusdom:+6, sconst: 7, sust: 8 },
- 24: { xp: 100, poids: "301-400", plusdom:+6, sconst: 8, sust: 9 },
- 25: { xp: 110, poids: "401-500", plusdom:+7, sconst: 8, sust: 10 },
- 26: { xp: 120, poids: "501-600", plusdom:+7, sconst: 8, sust: 11 },
- 27: { xp: 130, poids: "601-700", plusdom:+8, sconst: 9, sust: 12 },
- 28: { xp: 140, poids: "701-800", plusdom:+8, sconst: 9, sust: 13 },
- 29: { xp: 150, poids: "801-900", plusdom:+9, sconst: 9, sust: 14 },
- 30: { xp: 160, poids: "901-1000", plusdom:+9, sconst: 10, sust: 15 },
- 31: { xp: 170, poids: "1001-1500", plusdom:+10, sconst: 10, sust: 16 },
- 32: { xp: 180, poids: "1501-2000", plusdom:+11, sconst: 10, sust: 17 }
+ 1: { xp: 3, poids: "moins de 1kg", plusdom: -5, sconst: 0.5, sust: 0.1 },
+ 2: { xp: 3, poids: "1-5", plusdom: -4, sconst: 0.5, sust: 0.3 },
+ 3: { xp: 4, poids: "6-10", plusdom: -3, sconst: 1, sust: 0.5, beaute: 'hideux' },
+ 4: { xp: 4, poids: "11-20", plusdom: -3, sconst: 1, sust: 1, beaute: 'repoussant' },
+ 5: { xp: 5, poids: "21-30", plusdom: -2, sconst: 1, sust: 1, beaute: 'franchement très laid' },
+ 6: { xp: 5, poids: "31-40", plusdom: -1, sconst: 2, sust: 2, beaute: 'laid' },
+ 7: { xp: 6, poids: "41-50", plusdom: -1, sconst: 2, sust: 2, beaute: 'très désavantagé' },
+ 8: { xp: 6, poids: "51-60", plusdom: 0, sconst: 2, sust: 2, beaute: 'désavantagé' },
+ 9: { xp: 7, poids: "61-65", plusdom: 0, sconst: 3, sust: 2, beaute: 'pas terrible' },
+ 10: { xp: 7, poids: "66-70", plusdom: 0, sconst: 3, sust: 3, beaute: 'commun' },
+ 11: { xp: 8, poids: "71-75", plusdom: 0, sconst: 3, sust: 3, beaute: 'pas mal' },
+ 12: { xp: 8, poids: "76-80", plusdom: +1, sconst: 4, sust: 3, beaute: 'avantagé' },
+ 13: { xp: 9, poids: "81-90", plusdom: +1, sconst: 4, sust: 3, beaute: 'mignon' },
+ 14: { xp: 9, poids: "91-100", plusdom: +2, sconst: 4, sust: 4, beaute: 'beau' },
+ 15: { xp: 10, poids: "101-110", plusdom: +2, sconst: 5, sust: 4, beaute: 'très beau' },
+ 16: { xp: 20, poids: "111-120", plusdom: +3, sconst: 5, sust: 4, beaute: 'éblouissant' },
+ 17: { xp: 30, poids: "121-131", plusdom: +3, sconst: 5, sust: 5 },
+ 18: { xp: 40, poids: "131-141", plusdom: +4, sconst: 6, sust: 5 },
+ 19: { xp: 50, poids: "141-150", plusdom: +4, sconst: 6, sust: 5 },
+ 20: { xp: 60, poids: "151-160", plusdom: +4, sconst: 6, sust: 6 },
+ 21: { xp: 70, poids: "161-180", plusdom: +5, sconst: 7, sust: 6 },
+ 22: { xp: 80, poids: "181-200", plusdom: +5, sconst: 7, sust: 7 },
+ 23: { xp: 90, poids: "201-300", plusdom: +6, sconst: 7, sust: 8 },
+ 24: { xp: 100, poids: "301-400", plusdom: +6, sconst: 8, sust: 9 },
+ 25: { xp: 110, poids: "401-500", plusdom: +7, sconst: 8, sust: 10 },
+ 26: { xp: 120, poids: "501-600", plusdom: +7, sconst: 8, sust: 11 },
+ 27: { xp: 130, poids: "601-700", plusdom: +8, sconst: 9, sust: 12 },
+ 28: { xp: 140, poids: "701-800", plusdom: +8, sconst: 9, sust: 13 },
+ 29: { xp: 150, poids: "801-900", plusdom: +9, sconst: 9, sust: 14 },
+ 30: { xp: 160, poids: "901-1000", plusdom: +9, sconst: 10, sust: 15 },
+ 31: { xp: 170, poids: "1001-1500", plusdom: +10, sconst: 10, sust: 16 },
+ 32: { xp: 180, poids: "1501-2000", plusdom: +11, sconst: 10, sust: 17 }
}
- /* -------------------------------------------- */
- const premierRoundInit = [
- { pattern: 'hast', init: 3.90},
- { pattern: 'lance', init: 3.85},
- { pattern: 'baton', init: 3.80},
- { pattern: 'doubledragonne', init: 3.75},
- { pattern: 'esparlongue', init: 3.70},
- { pattern: 'epeedragonne', init: 3.65},
- { pattern: 'epeebatarde', init: 3.60},
- { pattern: 'epeecyane', init: 3.55},
- { pattern: 'epeesorde', init: 3.50},
- { pattern: 'grandehache', init: 3.45},
- { pattern: 'bataille', init: 3.40},
- { pattern: 'epeegnome', init: 3.35},
- { pattern: 'masse', init: 3.30},
- { pattern: 'gourdin', init: 3.25},
- { pattern: 'fléau', init: 3.20},
- { pattern: 'dague', init: 3.15},
- { pattern: 'autre', init: 3.10},
- ];
+/* -------------------------------------------- */
+const premierRoundInit = [
+ { pattern: 'hast', init: 3.90 },
+ { pattern: 'lance', init: 3.85 },
+ { pattern: 'baton', init: 3.80 },
+ { pattern: 'doubledragonne', init: 3.75 },
+ { pattern: 'esparlongue', init: 3.70 },
+ { pattern: 'epeedragonne', init: 3.65 },
+ { pattern: 'epeebatarde', init: 3.60 },
+ { pattern: 'epeecyane', init: 3.55 },
+ { pattern: 'epeesorde', init: 3.50 },
+ { pattern: 'grandehache', init: 3.45 },
+ { pattern: 'bataille', init: 3.40 },
+ { pattern: 'epeegnome', init: 3.35 },
+ { pattern: 'masse', init: 3.30 },
+ { pattern: 'gourdin', init: 3.25 },
+ { pattern: 'fléau', init: 3.20 },
+ { pattern: 'dague', init: 3.15 },
+ { pattern: 'autre', init: 3.10 },
+];
/* -------------------------------------------- */
function _buildAllSegmentsFatigue(max) {
@@ -235,7 +235,7 @@ export class RdDUtility {
'systems/foundryvtt-reve-de-dragon/templates/hud-actor-attaque.html',
// messages tchat
'systems/foundryvtt-reve-de-dragon/templates/chat-infojet.html',
- 'systems/foundryvtt-reve-de-dragon/templates/chat-info-appel-au-moral.html',
+ 'systems/foundryvtt-reve-de-dragon/templates/chat-info-appel-au-moral.html',
'systems/foundryvtt-reve-de-dragon/templates/chat-demande-defense.html',
'systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-particuliere.html',
'systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-etotal.html',
@@ -254,10 +254,10 @@ export class RdDUtility {
'systems/foundryvtt-reve-de-dragon/templates/chat-actor-carac-xp.html'
];
- Handlebars.registerHelper('upperFirst', str=> Misc.upperFirst(str ?? 'Null'));
- Handlebars.registerHelper('upper', str => str?.toUpperCase() ?? 'NULL' );
- Handlebars.registerHelper('le', str => Grammar.articleDetermine(str) );
- Handlebars.registerHelper('un', str => Grammar.articleIndetermine(str) );
+ Handlebars.registerHelper('upperFirst', str => Misc.upperFirst(str ?? 'Null'));
+ Handlebars.registerHelper('upper', str => str?.toUpperCase() ?? 'NULL');
+ Handlebars.registerHelper('le', str => Grammar.articleDetermine(str));
+ Handlebars.registerHelper('un', str => Grammar.articleIndetermine(str));
return loadTemplates(templatePaths);
}
@@ -287,7 +287,7 @@ export class RdDUtility {
}
/* -------------------------------------------- */
static getAfficheContenu(conteneurId) {
- if ( conteneurId )
+ if (conteneurId)
return this.afficheContenu[conteneurId];
return undefined;
}
@@ -327,8 +327,8 @@ export class RdDUtility {
console.log(dragData, actorSheet.actor._id);
let dropID = $(event.target).parents(".item").attr("data-item-id"); // Only relevant if container drop
let objetId = dragData.id || dragData.data._id;
- if ( dragData.type == 'Item') {
- if ( dropID ) { // Dropped over an item !!!
+ if (dragData.type == 'Item') {
+ if (dropID) { // Dropped over an item !!!
if (actorSheet.objetVersConteneur[objetId] != dropID && objetId != dropID) {
if (actorSheet.actor.validateConteneur(objetId, dropID) && actorSheet.actor.testConteneurCapacite(objetId, dropID)) {
await actorSheet.actor.enleverDeConteneur(objetId, actorSheet.objetVersConteneur[objetId]);
@@ -336,14 +336,14 @@ export class RdDUtility {
}
}
}
- if (dragData.actorId && dragData.actorId != actorSheet.actor._id ) { // Un acteur est à l'origine de l'item -> deplacement
+ if (dragData.actorId && dragData.actorId != actorSheet.actor._id) { // Un acteur est à l'origine de l'item -> deplacement
console.log("Moving objects");
- actorSheet.actor.moveItemsBetweenActors( objetId, dragData.actorId);
+ actorSheet.actor.moveItemsBetweenActors(objetId, dragData.actorId);
return false;
}
actorSheet.actor.computeEncombrementTotalEtMalusArmure();
- } else if ( dragData.type == "Actor" ) {
- actorSheet.actor.addSubacteur( objetId );
+ } else if (dragData.type == "Actor") {
+ actorSheet.actor.addSubacteur(objetId);
}
return true;
}
@@ -434,7 +434,7 @@ export class RdDUtility {
}
static getCaracXp(targetValue) {
- return tableCaracDerivee[targetValue]?.xp ?? 200 ;
+ return tableCaracDerivee[targetValue]?.xp ?? 200;
}
/* -------------------------------------------- */
@@ -487,13 +487,13 @@ export class RdDUtility {
data.carac.derobee.value = Math.floor(parseInt(((21 - data.carac.taille.value)) + parseInt(data.carac.agilite.value)) / 2);
let bonusDomKey = Math.floor((parseInt(data.carac.force.value) + parseInt(data.carac.taille.value)) / 2);
- bonusDomKey = Math.min( Math.max(bonusDomKey, 0), 32); // Clamp de securite
+ bonusDomKey = Math.min(Math.max(bonusDomKey, 0), 32); // Clamp de securite
let tailleData = tableCaracDerivee[bonusDomKey];
data.attributs.plusdom.value = tailleData.plusdom;
- data.attributs.sconst.value = RdDUtility.calculSConst(data.carac.constitution.value);
- data.attributs.sust.value = tableCaracDerivee[Number(data.carac.taille.value)].sust;
+ data.attributs.sconst.value = RdDUtility.calculSConst(data.carac.constitution.value);
+ data.attributs.sust.value = tableCaracDerivee[Number(data.carac.taille.value)].sust;
data.attributs.encombrement.value = (parseInt(data.carac.force.value) + parseInt(data.carac.taille.value)) / 2;
data.carac.melee.value = Math.floor((parseInt(data.carac.force.value) + parseInt(data.carac.agilite.value)) / 2);
@@ -579,10 +579,10 @@ export class RdDUtility {
}
/* -------------------------------------------- */
- static getLocalisation( type = 'personnage' ) {
+ static getLocalisation(type = 'personnage') {
let result = new Roll("1d20").roll().total;
let txt = ""
- if ( type == 'personnage') {
+ if (type == 'personnage') {
if (result <= 3) txt = "Jambe, genou, pied, jarret";
else if (result <= 7) txt = "Hanche, cuisse, fesse";
else if (result <= 9) txt = "Ventre, reins";
@@ -594,7 +594,7 @@ export class RdDUtility {
} else {
if (result <= 7) txt = "Jambes/Pattes";
else if (result <= 18) txt = "Corps";
- else if (result <= 20) txt = "Tête";
+ else if (result <= 20) txt = "Tête";
}
return { result: result, label: txt };
@@ -680,36 +680,36 @@ export class RdDUtility {
return game.system.rdd.calendrier.requestNombreAstral(sockmsg.data);
case "msg_response_nombre_astral":
return RdDUtility.responseNombreAstral(sockmsg.data);
- case "msg_tmr_move":
- if ( game.user.isGM ) {
- let actor = game.actors.get( sockmsg.data.actorId);
- actor.refreshTMRView( sockmsg.data.tmrPos );
- }
+ case "msg_tmr_move":
+ if (game.user.isGM) {
+ let actor = game.actors.get(sockmsg.data.actorId);
+ actor.refreshTMRView(sockmsg.data.tmrPos);
+ }
}
}
/* -------------------------------------------- */
static processPremierRoundInit() {
// Check if we have the whole init !
- if ( game.user.isGM) {
+ if (game.user.isGM) {
let initDone = true;
- for( let combatant of game.combat.data.combatants) {
- if ( !combatant.initiative ) initDone = false;
+ for (let combatant of game.combat.data.combatants) {
+ if (!combatant.initiative) initDone = false;
}
if (initDone && game.combat.current.round == 1) { // Premier round !
- for( let combatant of game.combat.data.combatants) {
+ for (let combatant of game.combat.data.combatants) {
let arme = combatant.initiativeData.arme;
//console.log("Parsed !!!", combatant, initDone, game.combat.current, arme);
- if ( arme && arme.type == "arme" ) {
+ if (arme && arme.type == "arme") {
for (let initData of premierRoundInit) {
- if ( arme.data.initpremierround.toLowerCase().includes(initData.pattern) ) {
+ if (arme.data.initpremierround.toLowerCase().includes(initData.pattern)) {
let msg = `L'initiative de ${combatant.actor.name} a été modifiée !
Etant donné son ${arme.name}, son initative pour ce premier round est désormais de ${initData.init}.
`
- ChatMessage.create( { content: msg } );
- game.combat.setInitiative(combatant._id, initData.init);
+ ChatMessage.create({ content: msg });
+ game.combat.setInitiative(combatant._id, initData.init);
}
}
}
@@ -717,18 +717,18 @@ export class RdDUtility {
}
}
}
-
+
/* -------------------------------------------- */
static rollInitiativeCompetence(combatantId, arme) {
const combatant = game.combat.getCombatant(combatantId);
const actor = combatant.actor;
-
- let initOffset = 0;
+
+ let initOffset = 0;
let caracForInit = 0;
- let compNiveau = 0;
- if ( actor.getSurprise() == "totale") {
+ let compNiveau = 0;
+ if (actor.getSurprise() == "totale") {
initOffset = -1; // To force 0
- } else if ( actor.getSurprise() == "demi") {
+ } else if (actor.getSurprise() == "demi") {
initOffset = 0;
} else if (arme.name == "Autre action") {
initOffset = 2;
@@ -738,10 +738,10 @@ export class RdDUtility {
initOffset = 3; // Melée = 3.XX
let competence = RdDItemCompetence.findCompetence(combatant.actor.data.items, arme.data.competence);
compNiveau = competence.data.niveau;
-
+
if (actor.data.type == 'creature' || actor.data.type == 'entite') {
caracForInit = competence.data.carac_value;
- if ( competence.data.categorie == "lancer") {
+ if (competence.data.categorie == "lancer") {
initOffset = 5;
}
} else {
@@ -759,7 +759,7 @@ export class RdDUtility {
}
let malus = actor.getEtatGeneral(); // Prise en compte état général
// Cas des créatures et entités vs personnages
- let rollFormula = initOffset + "+ ( (" + RdDUtility.calculInitiative(compNiveau, caracForInit) + " + " + malus + ") /100)";
+ let rollFormula = initOffset + "+ ( (" + RdDUtility.calculInitiative(compNiveau, caracForInit) + " + " + malus + ") /100)";
// Garder la trace de l'arme/compétence utilisée pour l'iniative
combatant.initiativeData = { arme: arme } // pour reclasser l'init au round 0
game.combat.rollInitiative(combatantId, rollFormula);
@@ -812,41 +812,41 @@ export class RdDUtility {
}
/* -------------------------------------------- */
- static incDecInit(combatantId, incDecValue ) {
+ static incDecInit(combatantId, incDecValue) {
const combatant = game.combat.getCombatant(combatantId);
let initValue = combatant.initiative + incDecValue;
- game.combat.setInitiative( combatantId, initValue );
+ game.combat.setInitiative(combatantId, initValue);
}
/* -------------------------------------------- */
static pushInitiativeOptions(html, options) {
- for (let i =0; i {
+ option.condition = true;
+ option.icon = '';
+ option.callback = target => {
RdDUtility.displayInitiativeMenu(html, target.data('combatant-id'));
}
}
}
- options.push( {
+ options.push({
name: "Incrémenter initiative",
- condition: true,
- icon: '',
- callback: target => {
+ condition: true,
+ icon: '',
+ callback: target => {
RdDUtility.incDecInit(target.data('combatant-id'), +0.01);
}
- } );
- options.push( {
+ });
+ options.push({
name: "Décrémenter initiative",
- condition: true,
- icon: '',
- callback: target => {
+ condition: true,
+ icon: '',
+ callback: target => {
RdDUtility.incDecInit(target.data('combatant-id'), -0.01);
}
- } );
+ });
}
/* -------------------------------------------- */
@@ -938,96 +938,96 @@ export class RdDUtility {
chatData["whisper"] = ChatMessage.getWhisperRecipients(forceWhisper);
}
- return chatData;
+ return chatData;
}
- /* -------------------------------------------- */
- static confirmerSuppressionSubacteur(actorSheet, li ) {
- let actorId = li.data("actor-id");
- let actor = game.actors.get( actorId );
- let msgTxt = "Etes vous certain de vouloir supprimer le lien vers ce véhicule/monture/suivant : " + actor.data.name +" ?
";
- let buttons = {
+ /* -------------------------------------------- */
+ static confirmerSuppressionSubacteur(actorSheet, li) {
+ let actorId = li.data("actor-id");
+ let actor = game.actors.get(actorId);
+ let msgTxt = "Etes vous certain de vouloir supprimer le lien vers ce véhicule/monture/suivant : " + actor.data.name + " ?
";
+ let d = new Dialog({
+ title: "Confirmer la suppression du lien",
+ content: msgTxt,
+ buttons: {
delete: {
- icon: '',
- label: "Supprimer le lien",
- callback: () => {
- console.log("Delete : ", actorId);
- actorSheet.actor.removeSubacteur( actorId );
- li.slideUp(200, () => actorSheet.render(false));
- }
- },
- cancel: {
- icon: '',
- label: "Annuler"
- }
- }
- let d = new Dialog({
- title: "Confirmer la suppression du lien",
- content: msgTxt,
- buttons: buttons,
- default: "cancel"
- });
- d.render(true);
- }
-
+ icon: '',
+ label: "Supprimer le lien",
+ callback: () => {
+ console.log("Delete : ", actorId);
+ actorSheet.actor.removeSubacteur(actorId);
+ li.slideUp(200, () => actorSheet.render(false));
+ }
+ },
+ cancel: {
+ icon: '',
+ label: "Annuler"
+ }
+ },
+ default: "cancel"
+ });
+ d.render(true);
+ }
+
/* -------------------------------------------- */
static async confirmerSuppression(actorSheet, li) {
- let itemId = li.data("item-id");
- let objet = actorSheet.actor.items.find( item => item._id == itemId );
- let msgTxt = "Etes vous certain de vouloir supprimer cet objet ?";
- let buttons = { delete: {
- icon: '',
- label: "Supprimer l'objet",
- callback: () => {
- console.log("Delete : ", itemId);
- actorSheet.actor.deleteOwnedItem( itemId );
- li.slideUp(200, () => actorSheet.render(false));
- }
- },
- cancel: {
- icon: '',
- label: "Annuler"
- }
- }
- if ( objet.data.type == 'conteneur' && objet.data.data.contenu.length > 0) {
- msgTxt += "
Cet objet est aussi un conteneur avec du contenu : choisissez l'option de suppression";
- buttons['deleteall'] = {
- icon: '',
- label: "Supprimer le conteneur et tout son contenu",
- callback: () => {
- console.log("Delete : ", itemId);
- actorSheet.actor.deleteAllConteneur( itemId );
- li.slideUp(200, () => actorSheet.render(false));
- }
- }
+ let itemId = li.data("item-id");
+ let objet = actorSheet.actor.items.find(item => item._id == itemId);
+ let msgTxt = "
Etes vous certain de vouloir supprimer cet objet ?";
+ let buttons = {
+ delete: {
+ icon: '',
+ label: "Supprimer l'objet",
+ callback: () => {
+ console.log("Delete : ", itemId);
+ actorSheet.actor.deleteOwnedItem(itemId);
+ li.slideUp(200, () => actorSheet.render(false));
+ }
+ },
+ cancel: {
+ icon: '',
+ label: "Annuler"
}
- msgTxt += "
";
- let d = new Dialog({
- title: "Confirmer la suppression",
- content: msgTxt,
- buttons: buttons,
- default: "cancel"
- });
- d.render(true);
+ }
+ if (objet.data.type == 'conteneur' && objet.data.data.contenu.length > 0) {
+ msgTxt += "
Cet objet est aussi un conteneur avec du contenu : choisissez l'option de suppression";
+ buttons['deleteall'] = {
+ icon: '',
+ label: "Supprimer le conteneur et tout son contenu",
+ callback: () => {
+ console.log("Delete : ", itemId);
+ actorSheet.actor.deleteAllConteneur(itemId);
+ li.slideUp(200, () => actorSheet.render(false));
+ }
+ }
+ }
+ msgTxt += "
";
+ let d = new Dialog({
+ title: "Confirmer la suppression",
+ content: msgTxt,
+ buttons: buttons,
+ default: "cancel"
+ });
+ d.render(true);
}
-
+
/* -------------------------------------------- */
- static afficherHeuresChanceMalchance( heureNaissance ) {
+ static afficherHeuresChanceMalchance(heureNaissance) {
if (heureNaissance) {
let ajustement = game.system.rdd.calendrier.getAjustementAstrologique(heureNaissance);
- ChatMessage.create( {
- content: `A l'heure ${game.system.rdd.calendrier.getCurrentHeure()}, le modificateur de Chance/Malchance pour l'heure de naissance ${heureNaissance} est de : ${ajustement}.`,
+ ChatMessage.create({
+ content: `A l'heure ${game.system.rdd.calendrier.getCurrentHeure()}, le modificateur de Chance/Malchance pour l'heure de naissance ${heureNaissance} est de : ${ajustement}.`,
whisper: ChatMessage.getWhisperRecipients("MJ")
- } );
+ });
}
- else{
+ else {
ui.notifications.warn("Pas d'heure de naissance selectionnée")
}
}
-
+
/*-------------------------------------------- */
static checkThanatosXP(compName) {
- if ( compName.includes('Thanatos') ) {
+ if (compName.includes('Thanatos')) {
let message = "Vous avez mis des points d'Expérience dans la Voie de Thanatos !
Vous devez réduire manuellement d'un même montant d'XP une autre compétence Draconique.";
ChatMessage.create({
whisper: ChatMessage.getWhisperRecipients(game.user.name),
@@ -1037,7 +1037,7 @@ export class RdDUtility {
}
/*-------------------------------------------- */
- static async onRenderChatMessage( app, html, msg ) {
+ static async onRenderChatMessage(app, html, msg) {
// TODO
//console.log(app, html, msg);
}
diff --git a/module/tmr-rencontres.js b/module/tmr-rencontres.js
index e22489c8..01fc81a7 100644
--- a/module/tmr-rencontres.js
+++ b/module/tmr-rencontres.js
@@ -272,11 +272,12 @@ const rencontresStandard = [
{ code: "rdd", name: "Rêve de Dragon", type: "rdd", genre: "m", force: "1ddr + 7", refoulement: 2, quitterTMR: true }
];
-const presentsCite = [
+const rencontresPresentCite = [
{ code: "messager2d6", name: "Messager des Rêves", type: "messager", genre: "m", force: "2d6", ignorer: true },
{ code: "passeur2d6", name: "Passeur des Rêves", type: "passeur", genre: "m", force: "2d6", ignorer: true },
{ code: "fleur2d6", name: "Fleur des Rêves", type: "fleur", genre: "f", force: "2d6", ignorer: true }
]
+const rencontresAll = [].concat(rencontresStandard).concat(mauvaisesRencontres).concat(rencontresPresentCite);
const tableRencontres = {
cite: [{ code: 'messager', range: [1, 25] }, { code: 'passeur', range: [26, 50] }, { code: 'fleur', range: [51, 65] }, { code: 'mangeur', range: [66, 70] }, { code: 'changeur', range: [71, 80] }, { code: 'briseur', range: [81, 85] }, { code: 'reflet', range: [86, 90] }, { code: 'tbblanc', range: [91, 94] }, { code: 'tbnoir', range: [95, 97] }, { code: 'rdd', range: [98, 100] }],
@@ -339,22 +340,17 @@ export class TMRRencontres {
static getRencontre(index) {
let rencontre;
if (isNaN(index)) {
- rencontre = rencontresStandard.find(r => r.type == index)
- if (!rencontre) {
- rencontre = mauvaisesRencontres.find(r => r.type == index)
- }
+ rencontre = rencontresAll.find(r => r.type == index) ?? rencontresAll.find(r => r.code == index)
}
- else {
- if (0 <= index && index < rencontresStandard.length) {
- rencontre = rencontresStandard[index];
- }
- else if (rencontresStandard.length <= index && index < rencontresStandard.length + mauvaisesRencontres.length) {
- rencontre = mauvaisesRencontres[index - rencontresStandard.length];
- }
+ else if (0 <= index && index < rencontresAll.length) {
+ rencontre = rencontresAll[index];
}
if (rencontre) {
return duplicate(rencontre);
}
+ else {
+ ui.notifications.info(`Pas de rencontre pour ${index}, seulement ${rencontresAll.length} rencontres sont connues.
Vous pouvez aussi essayer par type (ie: mangeur, fleur, fleur2d6, ...)`)
+ }
return undefined;
}
@@ -375,7 +371,7 @@ export class TMRRencontres {
/* -------------------------------------------- */
static async getMauvaiseRencontre(index = undefined) {
const rencontre = duplicate(
- (index && index>=0 && index < mauvaisesRencontres.length)
+ (index && index >= 0 && index < mauvaisesRencontres.length)
? mauvaisesRencontres[index]
: Misc.rollOneOf(mauvaisesRencontres));
await TMRRencontres.evaluerForceRencontre(rencontre);
diff --git a/module/tmr-utility.js b/module/tmr-utility.js
index 0da70a62..9cc13785 100644
--- a/module/tmr-utility.js
+++ b/module/tmr-utility.js
@@ -339,7 +339,7 @@ export class TMRUtility {
this.prochaineRencontre.force = force;
}
else {
- await TMRRencontres.evaluerForceRencontre(this.prochaineRencontre)
+ await TMRRencontres.evaluerForceRencontre(this.prochaineRencontre);
}
console.log("La prochaine rencontre sera:", this.prochaineRencontre.name, " force:", this.prochaineRencontre.force);
}
diff --git a/module/tmr/debordement.js b/module/tmr/debordement.js
index 432f4b7f..0ed9cec7 100644
--- a/module/tmr/debordement.js
+++ b/module/tmr/debordement.js
@@ -14,12 +14,12 @@ export class Debordement extends Draconique {
code() { return 'debordement' }
tooltip(linkData) { return `Débordement en ${this.tmrLabel(linkData)}` }
- img() { return 'systems/foundryvtt-reve-de-dragon/icons/svg/wave.svg' }
+ img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/wave.svg' }
_createSprite(pixiTMR) {
return pixiTMR.sprite(this.code(),
{
- color: tmrColors.casehumide, alpha: 0.5, taille: tmrConstants.twoThird, decallage: tmrConstants.bottom
+ color: tmrColors.casehumide, taille: tmrConstants.twoThird, decallage: tmrConstants.bottom
});
}
diff --git a/module/tmr/demi-reve.js b/module/tmr/demi-reve.js
index e84c7d88..06174dca 100644
--- a/module/tmr/demi-reve.js
+++ b/module/tmr/demi-reve.js
@@ -13,7 +13,7 @@ export class DemiReve extends Draconique {
async onActorCreateOwned(actor, item) { }
code() { return 'demi-reve' }
- tooltip(linkData) { return `Demi-rêve` }
+ tooltip(actor) { return `Demi-rêve ${actor.name}` }
img() { return 'icons/svg/sun.svg' }
_createSprite(pixiTMR) {
diff --git a/module/tmr/fermeture-cites.js b/module/tmr/fermeture-cites.js
index 29c0ef92..84516a85 100644
--- a/module/tmr/fermeture-cites.js
+++ b/module/tmr/fermeture-cites.js
@@ -33,7 +33,7 @@ export class FermetureCites extends Draconique {
async onConquete(actor, coord) {
const citeFermee = actor.data.items.find(it => this.isCase(it, coord));
- await this.actor.deleteOwnedItem(citeFermee._id);
+ await actor.deleteOwnedItem(citeFermee._id);
}
}
diff --git a/module/tmr/pixi-tmr.js b/module/tmr/pixi-tmr.js
index 40cdbe67..acc4abea 100644
--- a/module/tmr/pixi-tmr.js
+++ b/module/tmr/pixi-tmr.js
@@ -76,7 +76,9 @@ export class PixiTMR {
sprite.width = options.taille ?? tmrConstants.half;
sprite.height = options.taille ?? tmrConstants.half;
sprite.anchor.set(0.5);
- sprite.tint = options.color ?? 0x000000;
+ if (options.color) {
+ sprite.tint = options.color;
+ }
sprite.alpha = options.alpha ?? 0.75;
sprite.decallage = options.decallage ?? tmrConstants.center;
this.pixiApp.stage.addChild(sprite);
diff --git a/module/tmr/pont-impraticable.js b/module/tmr/pont-impraticable.js
index 1bd6ea94..04487df1 100644
--- a/module/tmr/pont-impraticable.js
+++ b/module/tmr/pont-impraticable.js
@@ -15,7 +15,7 @@ export class PontImpraticable extends Draconique {
code() { return 'pont-impraticable' }
tooltip(linkData) { return `${this.tmrLabel(linkData)} impraticable` }
- img() { return 'systems/foundryvtt-reve-de-dragon/icons/svg/wave.svg' }
+ img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/wave.svg' }
_createSprite(pixiTMR) {
return pixiTMR.sprite(this.code(),
diff --git a/module/tmr/present-cites.js b/module/tmr/present-cites.js
index 84d13ba7..dfba8842 100644
--- a/module/tmr/present-cites.js
+++ b/module/tmr/present-cites.js
@@ -15,12 +15,12 @@ export class PresentCites extends Draconique {
code() { return 'present-cites' }
tooltip(linkData) { return `La ${this.tmrLabel(linkData)} a un présent` }
- img() { return 'systems/foundryvtt-reve-de-dragon/icons/svg/gift.svg' }
+ img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/gift.svg' }
_createSprite(pixiTMR) {
return pixiTMR.sprite(this.code(),
{
- color: tmrColors.tetes, alpha: 0.7, taille: tmrConstants.third, decallage: tmrConstants.topRight
+ color: 0xFEFEFE, alpha: 0.8, taille: tmrConstants.third, decallage: tmrConstants.topRight
});
}
@@ -39,19 +39,22 @@ export class PresentCites extends Draconique {
}
}
}
- async choisirUnPresent(casetmr) {
+
+ async choisirUnPresent(casetmr, onChoixPresent) {
let d = new Dialog({
title: "Présent des cités",
- content: `La ${casetmr.data.coord} vous offre un présent`,
+ content: `La ${this.tmrLabel(casetmr)} vous offre un présent, faite votre choix`,
buttons: {
- fleur: {
- icon: '',
- label: "Fleur des rêves 2d6",
- callback: () => this.creerObjet()
- }
- }
+ messager: { icon: '', label: "Un Messager des rêves", callback: () => onChoixPresent('messager2d6') },
+ passeur: { icon: '', label: "Un Passeur des rêves", callback: () => onChoixPresent('passeur2d6') },
+ fleur: { icon: '', label: "Une Fleur des rêves", callback: () => onChoixPresent('fleur2d6') },
+ },
+ default: "fleur"
});
d.render(true);
}
+ async ouvrirLePresent(actor, casetmr) {
+ await actor.deleteOwnedItem(casetmr._id);
+ }
}
diff --git a/module/tmr/reserve-extensible.js b/module/tmr/reserve-extensible.js
index 47df6181..3aac024d 100644
--- a/module/tmr/reserve-extensible.js
+++ b/module/tmr/reserve-extensible.js
@@ -13,10 +13,10 @@ export class ReserveExtensible extends Draconique {
code() { return 'reserve_extensible' }
tooltip(linkData) { return `Réserve extensible en ${this.tmrLabel(linkData)} !` }
- img() { return 'icons/svg/chest.svg' }
+ img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/treasure-chest.svg' }
_createSprite(pixiTMR) {
- return pixiTMR.sprite(this.code(), { color: tmrColors.tetes, decallage: tmrConstants.left});
+ return pixiTMR.sprite(this.code(), { alpha: 0.9, decallage: tmrConstants.left});
}
async _creerCaseTmr(actor) {
diff --git a/module/tmr/sort-reserve.js b/module/tmr/sort-reserve.js
index 4b1ee48b..b974e852 100644
--- a/module/tmr/sort-reserve.js
+++ b/module/tmr/sort-reserve.js
@@ -13,10 +13,10 @@ export class SortReserve extends Draconique {
async onActorCreateOwned(actor, item) { }
code() { return 'sort' }
- tooltip(linkData) { return `${linkData.name}, r${linkData.data.ptreve_reel}` }
- img() { return 'icons/svg/book.svg' }
+ tooltip(sort) { return `${sort.name}, r${sort.data.ptreve_reel}` }
+ img() { return 'systems/foundryvtt-reve-de-dragon/icons/tmr/scroll.svg' }
_createSprite(pixiTMR) {
- return pixiTMR.sprite(this.code(), { color: tmrColors.sort, decallage: tmrConstants.right });
+ return pixiTMR.sprite(this.code(), { alpha: 0.5, decallage: tmrConstants.right });
}
}