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 @@ - -image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 @@ + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 }); } }