From c5509143b18d76589443fde43cc8038fd9a4b691 Mon Sep 17 00:00:00 2001 From: LeRatierBretonnien Date: Wed, 8 Feb 2023 17:51:16 +0100 Subject: [PATCH] Sort, confrontation, update tarots, etc --- images/icons/sortilege.webp | Bin 0 -> 43524 bytes lang/fr.json | 3 +- modules/malefices-actor-sheet.js | 1 + modules/malefices-actor.js | 31 +++- modules/malefices-commands.js | 7 +- modules/malefices-config.js | 9 ++ modules/malefices-item.js | 1 + modules/malefices-main.js | 31 ++++ modules/malefices-roll-dialog.js | 31 +++- modules/malefices-summary-app.js | 129 +++++++++++++++++ modules/malefices-tirage-tarot-dialog.js | 2 +- modules/malefices-utility.js | 145 +++++++++++++++++-- packs/malefices-tarots.db | 44 +++--- styles/simple.css | 10 +- system.json | 4 +- template.json | 18 ++- templates/actors/actor-sheet.hbs | 39 ++++- templates/chat/chat-confrontation-result.hbs | 37 +++++ templates/chat/display-tarot-card.hbs | 3 + templates/dialogs/character-summary.hbs | 86 +++++++++++ templates/dialogs/confrontation-dialog.hbs | 45 ++++++ templates/dialogs/roll-dialog-generic.hbs | 2 +- templates/items/item-sortilege-sheet.hbs | 30 ++++ templates/items/item-tarot-sheet.hbs | 8 + 24 files changed, 657 insertions(+), 59 deletions(-) create mode 100644 images/icons/sortilege.webp create mode 100644 modules/malefices-summary-app.js create mode 100644 templates/chat/chat-confrontation-result.hbs create mode 100644 templates/dialogs/character-summary.hbs create mode 100644 templates/dialogs/confrontation-dialog.hbs create mode 100644 templates/items/item-sortilege-sheet.hbs diff --git a/images/icons/sortilege.webp b/images/icons/sortilege.webp new file mode 100644 index 0000000000000000000000000000000000000000..8eee37881555f5bd8a9775b1619ebebad34304c8 GIT binary patch literal 43524 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 Uu}dL^>9_Kt`VF$gFaQ7m0Ai^Q>Hq)$ literal 0 HcmV?d00001 diff --git a/lang/fr.json b/lang/fr.json index dcff46d..3759df4 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -7,6 +7,7 @@ "TypeEquipement": "Equipement", "TypeTarot": "Tarot", "TypeElementbio": "Element Biographique", - "TypeArchetype": "Archetype" + "TypeArchetype": "Archetype", + "TypeSortilege": "Sortilège" } } \ No newline at end of file diff --git a/modules/malefices-actor-sheet.js b/modules/malefices-actor-sheet.js index 1abf223..2bd7841 100644 --- a/modules/malefices-actor-sheet.js +++ b/modules/malefices-actor-sheet.js @@ -43,6 +43,7 @@ export class MaleficesActorSheet extends ActorSheet { subActors: duplicate(this.actor.getSubActors()), phyMalus: this.actor.getPhysiqueMalus(), elementsbio: this.actor.getElementsBio(), + sorts: this.actor.getSorts(), options: this.options, owner: this.document.isOwner, editScore: this.options.editScore, diff --git a/modules/malefices-actor.js b/modules/malefices-actor.js index 5bfc06f..8a4e269 100644 --- a/modules/malefices-actor.js +++ b/modules/malefices-actor.js @@ -86,6 +86,11 @@ export class MaleficesActor extends Actor { MaleficesUtility.sortArrayObjectsByName(comp) return comp; } + getSorts() { + let comp = this.items.filter(item => item.type == 'sortilege'); + MaleficesUtility.sortArrayObjectsByName(comp) + return comp; + } getArchetype() { let comp = duplicate(this.items.find(item => item.type == 'archetype') || {name: "Pas d'archetype"}) if (comp && comp.system) { @@ -267,7 +272,29 @@ export class MaleficesActor extends Actor { await this.createEmbeddedDocuments('Item', [newItem]); } } - + /* -------------------------------------------- */ + incDecFluide(value) { + let fluide = this.system.fluide + value + this.update( {'system.fluide': fluide} ) + } + incDecDestin(value) { + let destin = this.system.pointdestin + value + this.update( {'system.pointdestin': destin} ) + } + incDecMPMB(value) { + let mpmb = this.system.mpmb + value + this.update( {'system.mpmb': mpmb} ) + } + incDecMPMN(value) { + let mpmn = this.system.mpmn + value + this.update( {'system.mpmn': mpmn} ) + } + /* -------------------------------------------- */ + incDecAttr(attrKey, value) { + let attr = duplicate(this.system.attributs[attrKey]) + attr.value += value + this.update( { [`system.attributs.${attrKey}`]: attr}) + } /* -------------------------------------------- */ async incDecQuantity(objetId, incDec = 0) { let objetQ = this.items.get(objetId) @@ -312,6 +339,8 @@ export class MaleficesActor extends Actor { rollData.elementsbio = this.getElementsBio() rollData.destin = this.system.pointdestin rollData.isReroll = false + rollData.confrontationDegre = 0 + rollData.confrontationModif = 0 console.log("ROLLDATA", rollData) diff --git a/modules/malefices-commands.js b/modules/malefices-commands.js index aa05290..e9235cf 100644 --- a/modules/malefices-commands.js +++ b/modules/malefices-commands.js @@ -3,6 +3,7 @@ import { MaleficesUtility } from "./malefices-utility.js"; import { MaleficesRollDialog } from "./malefices-roll-dialog.js"; import { MaleficesTirageTarotDialog } from "./malefices-tirage-tarot-dialog.js" +import { MaleficesCharacterSummary } from "./malefices-summary-app.js" /* -------------------------------------------- */ export class MaleficesCommands { @@ -11,7 +12,7 @@ export class MaleficesCommands { if (!game.system.malefices.commands) { const commands = new MaleficesCommands(); commands.registerCommand({ path: ["/tirage"], func: (content, msg, params) => MaleficesCommands.createTirage(msg), descr: "Tirage des tarots" }); - //crucibleCommands.registerCommand({ path: ["/pool"], func: (content, msg, params) => crucibleCommands.poolRoll(msg), descr: "Generic Roll Window" }); + commands.registerCommand({ path: ["/resume"], func: (content, msg, params) => MaleficesCharacterSummary.displayPCSummary(), descr: "Affiche la liste des PJs!" }); game.system.malefices.commands = commands; } } @@ -110,14 +111,14 @@ export class MaleficesCommands { let tirageData = { state: 'select-player', nbCard: 0, - maxPlayerCard: 5, + maxPlayerCard: 4, maxSecretCard: 1, cards: [], players: duplicate(game.users), secretCards: [], deck: MaleficesUtility.getTarots() } - for (let i = 0; i < 5; i++) { + for (let i = 0; i < 4; i++) { tirageData.cards.push({ name: "???", img: "systems/fvtt-malefices/images/tarots/background.webp" }) } tirageData.secretCards.push({ name: "???", img: "systems/fvtt-malefices/images/tarots/background.webp" }) diff --git a/modules/malefices-config.js b/modules/malefices-config.js index 1f98bf8..5069318 100644 --- a/modules/malefices-config.js +++ b/modules/malefices-config.js @@ -1,5 +1,14 @@ export const MALEFICES_CONFIG = { + attributs: { + "constitution": "Cons", + "physique": "Phy", + "culturegenerale": "CGén", + "habilite": "Hab", + "perception": "Per", + "spiritualite": "Spi", + "rationnalite": "Rat" + }, tarotType: { "majeur": "Arcane Majeur", diff --git a/modules/malefices-item.js b/modules/malefices-item.js index 5fc4c2d..2973e53 100644 --- a/modules/malefices-item.js +++ b/modules/malefices-item.js @@ -6,6 +6,7 @@ export const defaultItemImg = { elementbio: "systems/fvtt-malefices/images/icons/wisdom.webp", archetype: "systems/fvtt-malefices/images/icons/archetype.webp", tarot: "systems/fvtt-malefices/images/icons/tarot.webp", + sortilege: "systems/fvtt-malefices/images/icons/sortilege.webp", } /** diff --git a/modules/malefices-main.js b/modules/malefices-main.js index a70aeed..416ae16 100644 --- a/modules/malefices-main.js +++ b/modules/malefices-main.js @@ -16,6 +16,7 @@ import { MaleficesUtility } from "./malefices-utility.js"; import { MaleficesCombat } from "./malefices-combat.js"; import { MaleficesItem } from "./malefices-item.js"; import { MaleficesHotbar } from "./malefices-hotbar.js" +import { MaleficesCharacterSummary } from "./malefices-summary-app.js" import { MALEFICES_CONFIG } from "./malefices-config.js" /* -------------------------------------------- */ @@ -79,6 +80,32 @@ function welcomeMessage() { ` }); } +/* -------------------------------------------- */ +// Register world usage statistics +function registerUsageCount( registerKey ) { + if ( game.user.isGM ) { + game.settings.register(registerKey, "world-key", { + name: "Unique world key", + scope: "world", + config: false, + default: "", + type: String + }); + + let worldKey = game.settings.get(registerKey, "world-key") + if ( worldKey == undefined || worldKey == "" ) { + worldKey = randomID(32) + game.settings.set(registerKey, "world-key", worldKey ) + } + // Simple API counter + let regURL = `https://www.uberwald.me/fvtt_appcount/count.php?name="${registerKey}"&worldKey="${worldKey}"&version="${game.release.generation}.${game.release.build}"&system="${game.system.id}"&systemversion="${game.system.version}"` + //$.ajaxSetup({ + //headers: { 'Access-Control-Allow-Origin': '*' } + //}) + $.ajax(regURL) + } +} + /* -------------------------------------------- */ /* Foundry VTT Initialization */ /* -------------------------------------------- */ @@ -99,11 +126,15 @@ Hooks.once("ready", function () { sidebar.style.width = "min-content"; } + registerUsageCount('fvtt-malefices') welcomeMessage(); MaleficesUtility.ready() MaleficesUtility.init() + MaleficesCharacterSummary.ready() + }) + /* -------------------------------------------- */ /* Foundry VTT Initialization */ /* -------------------------------------------- */ diff --git a/modules/malefices-roll-dialog.js b/modules/malefices-roll-dialog.js index 49d38b5..3ee79cb 100644 --- a/modules/malefices-roll-dialog.js +++ b/modules/malefices-roll-dialog.js @@ -5,26 +5,32 @@ export class MaleficesRollDialog extends Dialog { /* -------------------------------------------- */ static async create(actor, rollData) { - let options = { classes: ["MaleficesDialog"], width: 540, height: 'fit-content', 'z-index': 99999 }; - let html = await renderTemplate('systems/fvtt-malefices/templates/dialogs/roll-dialog-generic.hbs', rollData); + let options = { classes: ["MaleficesDialog"], width: 540, height: 'fit-content', 'z-index': 99999 } + let html + if (rollData.attr && rollData.attr.iscard) { + html = await renderTemplate('systems/fvtt-malefices/templates/dialogs/confrontation-dialog.hbs', rollData); + } else { + html = await renderTemplate('systems/fvtt-malefices/templates/dialogs/roll-dialog-generic.hbs', rollData); + } return new MaleficesRollDialog(actor, rollData, html, options); } /* -------------------------------------------- */ constructor(actor, rollData, html, options, close = undefined) { + let isCard = rollData.attr && rollData.attr.iscard let conf = { - title: (rollData.mode == "skill") ? "Skill" : "Attribute", + title: (isCard) ? "Jet" : "Tirage", content: html, buttons: { roll: { icon: '', - label: "Roll !", + label: (isCard) ? "Tirer une carte" : "Lancer le dé", callback: () => { this.roll() } }, cancel: { icon: '', - label: "Cancel", + label: "Annuler", callback: () => { this.close() } } }, @@ -39,7 +45,12 @@ export class MaleficesRollDialog extends Dialog { /* -------------------------------------------- */ roll() { - MaleficesUtility.rollMalefices(this.rollData) + let isCard = this.rollData.attr && this.rollData.attr.iscard + if (isCard) { + MaleficesUtility.tirageConfrontationMalefices(this.rollData) + } else { + MaleficesUtility.rollMalefices(this.rollData) + } } /* -------------------------------------------- */ @@ -70,6 +81,12 @@ export class MaleficesRollDialog extends Dialog { html.find('#bonusMalusPortee').change((event) => { this.rollData.bonusMalusPortee = Number(event.currentTarget.value) }) - + html.find('#confrontationDegre').change((event) => { + this.rollData.confrontationDegre = Number(event.currentTarget.value) + }) + html.find('#confrontationModif').change((event) => { + this.rollData.confrontationModif = Number(event.currentTarget.value) + }) + } } \ No newline at end of file diff --git a/modules/malefices-summary-app.js b/modules/malefices-summary-app.js new file mode 100644 index 0000000..8942372 --- /dev/null +++ b/modules/malefices-summary-app.js @@ -0,0 +1,129 @@ +/* -------------------------------------------- */ +import { MaleficesUtility } from "./malefices-utility.js"; + +/* -------------------------------------------- */ +export class MaleficesCharacterSummary extends Application { + + /* -------------------------------------------- */ + static displayPCSummary(){ + game.system.malefices.charSummary.render(true) + } + /* -------------------------------------------- */ + updatePCSummary(){ + if ( this.rendered) { + this.render(true) + } + } + + /* -------------------------------------------- */ + static createSummaryPos() { + return { top: 200, left: 200 }; + } + + /* -------------------------------------------- */ + static ready() { + if ( !game.user.isGM ) { // Uniquement si GM + return + } + let charSummary = new MaleficesCharacterSummary() + game.system.malefices.charSummary = charSummary + } + + /* -------------------------------------------- */ + constructor() { + super(); + //game.settings.set("world", "character-summary-data", {npcList: [], x:0, y:0}) + this.settings = game.settings.get("world", "character-summary-data") + } + + /* -------------------------------------------- */ + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + template: "systems/fvtt-malefices/templates/dialogs/character-summary.hbs", + popOut: true, + resizable: true, + dragDrop: [{ dragSelector: ".items-list .item", dropSelector: null }], + classes: ["bol", "dialog"], width: 920, height: 'fit-content' + }) + } + + /* -------------------------------------------- */ + getData() { + let formData = super.getData(); + + formData.pcs = game.actors.filter( ac => ac.type == "personnage" && ac.hasPlayerOwner ) + formData.npcs = [] + let newList = [] + let toUpdate = false + for( let actorId of this.settings.npcList ) { + let actor = game.actors.get(actorId) + if (actor) { + formData.npcs.push( actor ) + newList.push(actorId) + } else { + toUpdate = true + } + } + formData.config = game.system.malefices.config + + if ( toUpdate ) { + this.settings.npcList = newList + //console.log("Going to update ...", this.settings) + game.settings.set("world", "character-summary-data", this.settings) + } + + return formData + } + + /* -------------------------------------------- */ + updateNPC() { + game.settings.set("world", "character-summary-data", game.system.malefices.charSummary.settings) + game.system.malefices.charSummary.close() + setTimeout( function() { game.system.malefices.charSummary.render(true)}, 500) + } + + /* -------------------------------------------- */ + async _onDrop(event) { + //console.log("Dragged data are : ", dragData) + let data = event.dataTransfer.getData('text/plain') + let dataItem = JSON.parse( data) + let actor = fromUuidSync(dataItem.uuid) + if (actor) { + game.system.malefices.charSummary.settings.npcList.push( actor.id ) + game.system.malefices.charSummary.updateNPC() + + } else { + ui.notifications.warn( "Pas d'acteur trouvé" ) + } + } + + /* -------------------------------------------- */ + /** @override */ + async activateListeners(html) { + super.activateListeners(html); + + html.find('.actor-open').click((event) => { + const li = $(event.currentTarget).parents(".item") + const actor = game.actors.get(li.data("actor-id")) + actor.sheet.render(true) + }) + + html.find('.summary-roll').click((event) => { + const li = $(event.currentTarget).parents(".item") + const actor = game.actors.get(li.data("actor-id")) + let type = $(event.currentTarget).data("type") + let key = $(event.currentTarget).data("key") + actor.rollAttribut(key) + }) + + html.find('.actor-delete').click(event => { + const li = $(event.currentTarget).parents(".item"); + let actorId = li.data("actor-id") + let newList = game.system.malefices.charSummary.settings.npcList.filter(id => id != actorId) + game.system.malefices.charSummary.settings.npcList = newList + game.system.malefices.charSummary.updateNPC() + }) + + } + +} \ No newline at end of file diff --git a/modules/malefices-tirage-tarot-dialog.js b/modules/malefices-tirage-tarot-dialog.js index 37f8b7b..761af84 100644 --- a/modules/malefices-tirage-tarot-dialog.js +++ b/modules/malefices-tirage-tarot-dialog.js @@ -5,7 +5,7 @@ export class MaleficesTirageTarotDialog extends Dialog { /* -------------------------------------------- */ static async create(actor, tirageData) { - let options = { classes: ["MaleficesDialog"], width: 820, height: 740, 'z-index': 99999 }; + let options = { classes: ["MaleficesDialog"], width: 720, height: 740, 'z-index': 99999 }; let html = await renderTemplate('systems/fvtt-malefices/templates/dialogs/tirage-tarot-dialog.hbs', tirageData); return new MaleficesTirageTarotDialog(actor, tirageData, html, options); diff --git a/modules/malefices-utility.js b/modules/malefices-utility.js index e3ad792..592c2a6 100644 --- a/modules/malefices-utility.js +++ b/modules/malefices-utility.js @@ -43,6 +43,14 @@ export class MaleficesUtility { Handlebars.registerHelper('add', function (a, b) { return parseInt(a) + parseInt(b); }) + + game.settings.register("world", "character-summary-data", { + name: "character-summary-data", + scope: "world", + config: false, + default: { npcList: [], x: 200, y: 200 }, + type: Object + }) } /*-------------------------------------------- */ @@ -63,6 +71,7 @@ export class MaleficesUtility { static async ready() { const tarots = await MaleficesUtility.loadCompendium("fvtt-malefices.malefices-tarots") this.tarots = tarots.map(i => i.toObject()) + } /* -------------------------------------------- */ @@ -262,6 +271,125 @@ export class MaleficesUtility { } } + /* -------------------------------------------- */ + static processSpecialCard(actor, rollData) { + if (rollData.selectedCard.name.toLowerCase().includes("archange")) { + let actorCard = actor.items.find( c => c.type =="tarot" && c.name.toLowerCase().includes("archange")) + if (actorCard) { + MaleficesUtility.createChatMessage(actor.name, "gmroll", { + content: `Conséquence supplémentaire !
L'Archange : ${actor.name} gagne 1 point de Spiritualité.` }) + actor.incDecAttr("spiritualite", 1) + } + } + if (rollData.selectedCard.name.toLowerCase().includes("vicaire")) { + let actorCard = actor.items.find( c => c.type =="tarot" && c.name.toLowerCase().includes("vicaire")) + if (actorCard) { + MaleficesUtility.createChatMessage(actor.name, "blindroll", { + content: `Conséquence supplémentaire !
Le Vicaire : ${actor.name} vient de gagner 1 point en Pratique de la Magie Blanche (MPMB, secret).` }) + actor.incDecMPMB(1) + } + } + if (rollData.selectedCard.name.toLowerCase().includes("chance")) { + let actorCard = actor.items.find( c => c.type =="tarot" && c.name.toLowerCase().includes("chance")) + if (actorCard) { + MaleficesUtility.createChatMessage(actor.name, "gmroll", { + content: `Conséquence supplémentaire !
La Chance : ${actor.name} a gagné 1 point de Destin.` }) + actor.incDecDestin(1) + } + } + if (rollData.selectedCard.name.toLowerCase().includes("mort")) { + let actorCard = actor.items.find( c => c.type =="tarot" && c.name.toLowerCase().includes("mort")) + if (actorCard) { + MaleficesUtility.createChatMessage(actor.name, "gmroll", { + content: `Conséquence supplémentaire !
La Mort : ${actor.name} est pétrifié par la peur.` }) + actor.incDecDestin(1) + } + } + if (rollData.selectedCard.name.toLowerCase().includes("diable")) { + let actorCard = actor.items.find( c => c.type =="tarot" && c.name.toLowerCase().includes("diable")) + if (actorCard) { + MaleficesUtility.createChatMessage(actor.name, "gmroll", { + content: `Conséquence supplémentaire !
Le Diable : ${actor.name} gagne 1 point de Rationnalité.` }) + actor.incDecAttr("rationnalite", 1) + } + } + if (rollData.selectedCard.name.toLowerCase().includes("lune noire")) { + let actorCard = actor.items.find( c => c.type =="tarot" && c.name.toLowerCase().includes("lune noire")) + if (actorCard) { + MaleficesUtility.createChatMessage(actor.name, "blindroll", { + content: `Conséquence supplémentaire !
La Lune Noire : ${actor.name} vient de gagner 1 point de Fluide (secret).` }) + actor.incDecFluide(1) + } + } + if (rollData.selectedCard.name.toLowerCase().includes("grand livre")) { + let actorCard = actor.items.find( c => c.type =="tarot" && c.name.toLowerCase().includes("grand livre")) + if (actorCard) { + MaleficesUtility.createChatMessage(actor.name, "blindroll", { + content: `Conséquence supplémentaire !
La Lune Noire : ${actor.name} vient de gagner 1 point de Fluide (secret).` }) + actor.incDecFluide(1) + } + } + if (rollData.selectedCard.name.toLowerCase().includes("sorcier")) { + let actorCard = actor.items.find( c => c.type =="tarot" && c.name.toLowerCase().includes("sorcier")) + if (actorCard) { + MaleficesUtility.createChatMessage(actor.name, "blindroll", { + content: `Conséquence supplémentaire !
Le Vicaire : ${actor.name} vient de gagner 1 point en Pratique de la Magie Noire (MPMN, secret).` }) + actor.incDecMPMN(1) + } + } + + } + + /* -------------------------------------------- */ + static computeResults(rollData) { + rollData.isSuccess = false + if (rollData.total <= rollData.target) { + rollData.isSuccess = true + } + if (rollData.total == 1) { + rollData.isSuccess = true + rollData.isCritical = true + } + if (rollData.total == 20) { + rollData.isSuccess = false + rollData.isFumble = true + } + if (rollData.total <= Math.floor(rollData.target / 3)) { + rollData.isPart = true + } + } + /* -------------------------------------------- */ + static async tirageConfrontationMalefices(rollData) { + let actor = game.actors.get(rollData.actorId) + + rollData.target = rollData.attr.value - rollData.confrontationDegre + rollData.confrontationModif + + let deck = this.getTarots() + let index = Math.round(Math.random() * (deck.length-1)) + let selectedCard = deck[index] + selectedCard.system.ispositif = (Math.random() > 0.5) + selectedCard.value = (selectedCard.system.ispositif)? selectedCard.system.numericvalueup : selectedCard.system.numericvaluedown + rollData.total = selectedCard.value + rollData.selectedCard = selectedCard + await MaleficesUtility.createChatMessage(actor.name, "gmroll", { + content: await renderTemplate(`systems/fvtt-malefices/templates/chat/display-tarot-card.hbs`, selectedCard) + }) + + this.computeResults(rollData) + + if (rollData.isSuccess) { + rollData.gainAttr = Math.ceil(rollData.confrontationDegre/2) + ((rollData.isCritical ) ? 1 : 0) + actor.incDecAttr(rollData.attr.abbrev, rollData.gainAttr ) + } else { + rollData.gainAttr = rollData.confrontationDegre + actor.incDecAttr(rollData.attr.abbrev, -rollData.gainAttr ) + } + + await MaleficesUtility.createChatMessage(actor.name, "gmroll", { + content: await renderTemplate(`systems/fvtt-malefices/templates/chat/chat-confrontation-result.hbs`, rollData) + }) + this.processSpecialCard(actor, rollData) + } /* -------------------------------------------- */ static async rollMalefices(rollData) { @@ -280,22 +408,9 @@ export class MaleficesUtility { let myRoll = new Roll(diceFormula).roll({ async: false }) await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode")) rollData.roll = myRoll + rollData.total = myRoll.total - rollData.isSuccess = false - if (myRoll.total <= rollData.target) { - rollData.isSuccess = true - } - if (myRoll.total == 1) { - rollData.isSuccess = true - rollData.isCritical = true - } - if (myRoll.total == 20) { - rollData.isSuccess = false - rollData.isFumble = true - } - if (myRoll.total <= Math.floor(rollData.target / 3)) { - rollData.isPart = true - } + this.computeResults(rollData) let msg = await this.createChatWithRollMode(rollData.alias, { content: await renderTemplate(`systems/fvtt-malefices/templates/chat/chat-generic-result.hbs`, rollData) diff --git a/packs/malefices-tarots.db b/packs/malefices-tarots.db index 655d1dd..c8f7edc 100644 --- a/packs/malefices-tarots.db +++ b/packs/malefices-tarots.db @@ -1,22 +1,22 @@ -{"name":"Le Moine","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Moine_600%20dpi.webp","system":{"tarottype":"metier","isdualside":true,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109541,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"1DRKmbzGzbCRCswc"} -{"name":"La Lune Noire","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Lune%20Noire_600%20dpi.webp","system":{"tarottype":"majeur","isdualside":false,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{"core":{"sourceId":"Item.uE5g6H5J0ccBe0ON"}},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109539,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"6jHm4eWelq7eLKwU"} -{"name":"Hippocrate","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Hippocrate_600%20dpi.webp","system":{"tarottype":"metier","isdualside":true,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109538,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"BCQenQMvFjLKkl56"} -{"name":"Eve","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Eve_600%20dpi.webp","system":{"tarottype":"mineur","isdualside":false,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109538,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"IJaK9oxcsamMs4pw"} -{"name":"Le Sorcier","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Sorcier_600%20dpi.webp","system":{"tarottype":"majeur","isdualside":false,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109541,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"IwsZkMHLKGuCGUf7"} -{"name":"La Mort","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_La%20Mort_600%20dpi.webp","system":{"tarottype":"majeur","isdualside":false,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109540,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"MHdmnX0tbbjhPbA0"} -{"name":"L'Artiste","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Artiste_600%20dpi.webp","system":{"tarottype":"metier","isdualside":true,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109539,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"NQBZmrYhEiyNxEo2"} -{"name":"Le Savetier","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Savetier_600%20dpi%20copie.webp","system":{"tarottype":"metier","isdualside":true,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109541,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"SClVaCgZjZoR1WiD"} -{"name":"La Roue de la Fortune","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_La%20roue%20de%20la%20fortune_600%20dpi.webp","system":{"tarottype":"mineur","isdualside":true,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109540,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"WRILaKwS1cjxZGRk"} -{"name":"L'Alchimiste","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Alchimiste_600%20dpi.webp","system":{"tarottype":"mineur","isdualside":true,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109538,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"WlsCeal346QfJweB"} -{"name":"L'Archange","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Archange_600%20dpi.webp","system":{"tarottype":"majeur","isdualside":false,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109539,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"bVvGkOVe3BQeK7HR"} -{"name":"La Chance","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Chance_600%20dpi.webp","system":{"tarottype":"majeur","isdualside":false,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109539,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"ba7fmG0dYpV2jpIv"} -{"name":"Le Vicaire","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Vicaire_600%20dpi.webp","system":{"tarottype":"majeur","isdualside":false,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109541,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"dbc8W1qD0kj5rQ4s"} -{"name":"Le Juge","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Le%20Juge_600%20dpi.webp","system":{"tarottype":"metier","isdualside":true,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109541,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"dkvHSWzgbOqbykUL"} -{"name":"Le Diable","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Diable_600%20dpi.webp","system":{"tarottype":"majeur","isdualside":false,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109540,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"earXcKB3NZ9sM8S7"} -{"name":"Le Centurion","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Centurion_600%20dpi.webp","system":{"tarottype":"metier","isdualside":true,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109540,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"fIHWGqwcubToEjOK"} -{"name":"Le Cabaliste","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Cabaliste_600%20dpi.webp","system":{"tarottype":"mineur","isdualside":true,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109540,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"gS7fULIr9lPCl5Vb"} -{"name":"Adam","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Adam_600%20dpi.webp","system":{"tarottype":"mineur","isdualside":false,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109538,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"ooRr6cSNg73cPyaU"} -{"name":"Le Medium","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Medium_600%20dpi.webp","system":{"tarottype":"mineur","isdualside":true,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109541,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"rOgagyXv5RWxvyBa"} -{"name":"L'Archiviste","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Archiviste_600%20dpi.webp","system":{"tarottype":"metier","isdualside":true,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109539,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"wHc7WwyWPZIqt219"} -{"name":"Le Laboureur","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Laboureur_600%20dpi.webp","system":{"tarottype":"metier","isdualside":true,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109541,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"wLFdvRd9eLiCtc7b"} -{"name":"Le Grand Livre","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Grand%20Livre_600%20dpi.webp","system":{"tarottype":"majeur","isdualside":false,"ispositif":true,"isgm":false,"description":"","isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.17","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675789109541,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"zbGGMEQFdwVdlKAf"} +{"name":"Le Moine","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Moine_600%20dpi.webp","system":{"tarottype":"metier","numericvalueup":9,"numericvaluedown":14,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789474,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"1DRKmbzGzbCRCswc"} +{"name":"La Lune Noire","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Lune%20Noire_600%20dpi.webp","system":{"tarottype":"majeur","numericvalueup":18,"numericvaluedown":5,"isdualside":false,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789473,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"6jHm4eWelq7eLKwU"} +{"name":"Hippocrate","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Hippocrate_600%20dpi.webp","system":{"tarottype":"metier","numericvalueup":16,"numericvaluedown":7,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789472,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"BCQenQMvFjLKkl56"} +{"name":"Eve","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Eve_600%20dpi.webp","system":{"tarottype":"mineur","numericvalueup":3,"numericvaluedown":20,"isdualside":false,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789472,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"IJaK9oxcsamMs4pw"} +{"name":"Le Sorcier","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Sorcier_600%20dpi.webp","system":{"tarottype":"majeur","numericvalueup":22,"numericvaluedown":1,"isdualside":false,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789474,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"IwsZkMHLKGuCGUf7"} +{"name":"La Mort","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_La%20Mort_600%20dpi.webp","system":{"tarottype":"majeur","numericvalueup":13,"numericvaluedown":10,"isdualside":false,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789473,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"MHdmnX0tbbjhPbA0"} +{"name":"L'Artiste","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Artiste_600%20dpi.webp","system":{"tarottype":"metier","numericvalueup":1,"numericvaluedown":22,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789472,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"NQBZmrYhEiyNxEo2"} +{"name":"Le Savetier","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Savetier_600%20dpi%20copie.webp","system":{"tarottype":"metier","numericvalueup":12,"numericvaluedown":11,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789474,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"SClVaCgZjZoR1WiD"} +{"name":"La Roue de la Fortune","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_La%20roue%20de%20la%20fortune_600%20dpi.webp","system":{"tarottype":"mineur","numericvalueup":10,"numericvaluedown":13,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789473,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"WRILaKwS1cjxZGRk"} +{"name":"L'Alchimiste","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Alchimiste_600%20dpi.webp","system":{"tarottype":"mineur","numericvalueup":19,"numericvaluedown":4,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789472,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"WlsCeal346QfJweB"} +{"name":"L'Archange","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Archange_600%20dpi.webp","system":{"tarottype":"majeur","numericvalueup":2,"numericvaluedown":21,"isdualside":false,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789472,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"bVvGkOVe3BQeK7HR"} +{"name":"La Chance","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Chance_600%20dpi.webp","system":{"tarottype":"majeur","numericvalueup":7,"numericvaluedown":16,"isdualside":false,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789473,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"ba7fmG0dYpV2jpIv"} +{"name":"Le Vicaire","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Vicaire_600%20dpi.webp","system":{"tarottype":"majeur","numericvalueup":5,"numericvaluedown":18,"isdualside":false,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789474,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"dbc8W1qD0kj5rQ4s"} +{"name":"Le Juge","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Le%20Juge_600%20dpi.webp","system":{"tarottype":"metier","numericvalueup":8,"numericvaluedown":15,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789473,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"dkvHSWzgbOqbykUL"} +{"name":"Le Diable","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Diable_600%20dpi.webp","system":{"tarottype":"majeur","numericvalueup":15,"numericvaluedown":8,"isdualside":false,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789473,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"earXcKB3NZ9sM8S7"} +{"name":"Le Centurion","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Centurion_600%20dpi.webp","system":{"tarottype":"metier","numericvalueup":11,"numericvaluedown":12,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789473,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"fIHWGqwcubToEjOK"} +{"name":"Le Cabaliste","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Cabaliste_600%20dpi.webp","system":{"tarottype":"mineur","numericvalueup":17,"numericvaluedown":6,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789473,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"gS7fULIr9lPCl5Vb"} +{"name":"Adam","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Adam_600%20dpi.webp","system":{"tarottype":"mineur","numericvalueup":4,"numericvaluedown":19,"isdualside":false,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789472,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"ooRr6cSNg73cPyaU"} +{"name":"Le Medium","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Medium_600%20dpi.webp","system":{"tarottype":"mineur","numericvalueup":6,"numericvaluedown":17,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789474,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"rOgagyXv5RWxvyBa"} +{"name":"L'Archiviste","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Archiviste_600%20dpi.webp","system":{"tarottype":"metier","numericvalueup":14,"numericvaluedown":9,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789472,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"wHc7WwyWPZIqt219"} +{"name":"Le Laboureur","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Laboureur_600%20dpi.webp","system":{"tarottype":"metier","numericvalueup":21,"numericvaluedown":2,"isdualside":true,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789474,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"wLFdvRd9eLiCtc7b"} +{"name":"Le Grand Livre","type":"tarot","img":"systems/fvtt-malefices/images/tarots/Malefice_Tarot_Grand%20Livre_600%20dpi.webp","system":{"tarottype":"majeur","numericvalueup":20,"numericvaluedown":3,"isdualside":false,"ispositif":true,"isgm":false,"description":"","numericvalue":0,"isreversed":false},"effects":[],"flags":{},"_stats":{"systemId":"fvtt-malefices","systemVersion":"10.0.21","coreVersion":"10.291","createdTime":1675369447354,"modifiedTime":1675867789473,"lastModifiedBy":"R9gIh86vXDB4IFn1"},"folder":null,"sort":0,"ownership":{"default":0,"R9gIh86vXDB4IFn1":3},"_id":"zbGGMEQFdwVdlKAf"} diff --git a/styles/simple.css b/styles/simple.css index e1eb25d..e16e01d 100644 --- a/styles/simple.css +++ b/styles/simple.css @@ -1237,6 +1237,11 @@ ul, li { max-width: 10rem; min-width: 10rem; } +.item-name-label-short { + flex-grow:1; + max-width: 4rem; + min-width: 4rem; +} .item-name-label-medium { margin-top: 4px; flex-grow:2; @@ -1309,4 +1314,7 @@ ul, li { .tarot-title { text-align: center; font-weight: bold; -} \ No newline at end of file +} +.character-summary-rollable { + text-decoration: underline; +} diff --git a/system.json b/system.json index 3571ce7..2be7b8c 100644 --- a/system.json +++ b/system.json @@ -64,7 +64,7 @@ ], "title": "Maléfices, le Jeu de Rôle", "url": "https://www.uberwald.me/gitea/public/fvtt-malefices", - "version": "10.0.19", - "download": "https://www.uberwald.me/gitea/public/fvtt-malefices/archive/fvtt-malefices-v10.0.19.zip", + "version": "10.0.23", + "download": "https://www.uberwald.me/gitea/public/fvtt-malefices/archive/fvtt-malefices-v10.0.23.zip", "background": "systems/fvtt-malefices/images/ui/malefice_welcome_page.webp" } \ No newline at end of file diff --git a/template.json b/template.json index 2d36949..b105756 100644 --- a/template.json +++ b/template.json @@ -63,21 +63,23 @@ }, "perception": { "label": "Perception", - "abbrev": "habilite", + "abbrev": "perception", "value": 0, "max": 0 }, "spiritualite": { "label": "Spiritualite", "abbrev": "spiritualite", - "hasmax": true, + "hasmax": false, + "iscard": true, "value": 0, "max": 0 }, "rationnalite": { "label": "Rationnalite", "abbrev": "rationnalite", - "hasmax": true, + "hasmax": false, + "iscard": true, "value": 0, "max": 0 } @@ -101,6 +103,7 @@ "equipement", "archetype", "tarot", + "sortilege", "elementbio" ], "templates": {}, @@ -112,13 +115,20 @@ }, "tarot": { "tarottype": "", + "numericvalueup": 0, + "numericvaluedown": 0, "isdualside": false, "ispositif": true, "isgm": false, "description": "" }, "archetype": { - "lametutelaire": "" + "lametutelaire": "", + "description": "" + }, + "sortilege": { + "seuil": 0, + "description": "" }, "arme": { "armetype": 0, diff --git a/templates/actors/actor-sheet.hbs b/templates/actors/actor-sheet.hbs index 2303f42..acfb01d 100644 --- a/templates/actors/actor-sheet.hbs +++ b/templates/actors/actor-sheet.hbs @@ -53,7 +53,14 @@ {{#each system.attributs as |attr key|}}
  • - {{attr.label}} + + {{attr.label}} + {{#if attr.iscard}} + + {{else}} + + {{/if}} + {{#if attr.hasmax}} @@ -201,6 +208,36 @@ {{/each}} +
      +
    • + +

      +
      + + + +
       
      +
      + +
      + +
    • + {{#each sorts as |sort key|}} +
    • + + {{sort.name}} + + + +
       
      +
      + +
      +
    • + {{/each}} +
    +
    diff --git a/templates/chat/chat-confrontation-result.hbs b/templates/chat/chat-confrontation-result.hbs new file mode 100644 index 0000000..b5b949d --- /dev/null +++ b/templates/chat/chat-confrontation-result.hbs @@ -0,0 +1,37 @@ +
    + {{#if actorImg}} + {{alias}} + {{/if}} +

    {{alias}}

    +
    + +
    + + {{#if img}} +
    + {{name}} +
    + {{/if}} + +
    +
    + +
    +
      +
    • Confrontation de {{attr.label}} : {{attr.value}} +
    • +
    • Degré de la confrontation: {{confrontationDegre}}
    • +
    • Ajustement spécial : {{confrontationModif}}
    • +
    • Seuil final : {{target}}
    • +
    • Valeur de la carte : {{total}}
    • + + {{#if isSuccess}} +
    • Votre {{attr.label}} augmente de {{gainAttr}} points.
    • + {{else}} +
    • Votre {{attr.label}} diminue de {{gainAttr}} points.
    • + {{/if}} + +
    +
    + + diff --git a/templates/chat/display-tarot-card.hbs b/templates/chat/display-tarot-card.hbs index 8fd42f3..b01e5ab 100644 --- a/templates/chat/display-tarot-card.hbs +++ b/templates/chat/display-tarot-card.hbs @@ -5,5 +5,8 @@ {{#if system.isdualside}} {{#if system.ispositif}}Positif{{else}}Négatif{{/if}} {{/if}} + {{#if value}} + Valeur : {{value}} + {{/if}} diff --git a/templates/dialogs/character-summary.hbs b/templates/dialogs/character-summary.hbs new file mode 100644 index 0000000..8dd88c7 --- /dev/null +++ b/templates/dialogs/character-summary.hbs @@ -0,0 +1,86 @@ +
    + +
      + +
    1. +
      Nom
      + {{#each config.attributs as |attr key|}} +
      {{attr}}
      + {{/each}} +
      Destin
      +
      Fluide
      +
      MPMB
      +
      MPMN
      + +
    2. + + {{#each pcs as |pc key|}} +
    3. + + {{#each pc.system.attributs as |attr key|}} + + {{/each}} + + + + + +
    4. + {{/each}} + +
    5. +
      PNJs
      + {{#each config.attributs as |attr key|}} +
      attr
      + {{/each}} +
      Destin
      +
      Fluide
      +
      MPMB
      +
      MPMN
      + +
    6. + + {{#each npcs as |pc key|}} +
    7. + + {{#each pc.system.attributs as |attr key|}} + + {{/each}} + + + + + +
      + +
      +
    8. + {{/each}} + +
    + +
    \ No newline at end of file diff --git a/templates/dialogs/confrontation-dialog.hbs b/templates/dialogs/confrontation-dialog.hbs new file mode 100644 index 0000000..9f24310 --- /dev/null +++ b/templates/dialogs/confrontation-dialog.hbs @@ -0,0 +1,45 @@ +
    +
    + {{#if img}} + + {{/if}} +

    {{title}}

    +
    + +
    + +
    + {{attr.label}} : + + {{attr.value}} + +
    + +
    + Degré de la confrontation : + +
    + +
    + Modificateur de confrontation : + +
    + +
    + +
    \ No newline at end of file diff --git a/templates/dialogs/roll-dialog-generic.hbs b/templates/dialogs/roll-dialog-generic.hbs index 8e18b6c..f735431 100644 --- a/templates/dialogs/roll-dialog-generic.hbs +++ b/templates/dialogs/roll-dialog-generic.hbs @@ -77,7 +77,7 @@
    - Pörtée : + Portée : +
    + + + {{> systems/fvtt-malefices/templates/items/partial-item-nav.hbs}} + + + {{!-- Sheet Body --}} +
    + + {{> systems/fvtt-malefices/templates/items/partial-item-description.hbs}} + +
    + +
    +
      +
    • + + +
    • +
    +
    +
    + +
    + diff --git a/templates/items/item-tarot-sheet.hbs b/templates/items/item-tarot-sheet.hbs index e225e80..9008b1e 100644 --- a/templates/items/item-tarot-sheet.hbs +++ b/templates/items/item-tarot-sheet.hbs @@ -35,6 +35,14 @@
  • {{#if isGM}} +
  • + + +
  • +
  • + + +