From 38059232cb762e8ef4115d0b1ec40af4afcaeca0 Mon Sep 17 00:00:00 2001 From: LeRatierBretonnien Date: Thu, 28 Dec 2023 18:40:46 +0100 Subject: [PATCH] Automatisations de combats, WIP --- modules/hawkmoon-actor-sheet.js | 4 +- modules/hawkmoon-actor.js | 52 +++++++++++++++++++++--- modules/hawkmoon-roll-dialog.js | 3 ++ modules/hawkmoon-utility.js | 64 ++++++++++++++++++++---------- styles/simple.css | 6 +++ system.json | 6 +-- template.json | 3 +- templates/actor-sheet.html | 4 +- templates/chat-degats-result.html | 3 +- templates/chat-generic-result.html | 8 +++- templates/creature-sheet.html | 43 ++++++++++++-------- templates/roll-dialog-generic.html | 12 ++++++ 12 files changed, 158 insertions(+), 50 deletions(-) diff --git a/modules/hawkmoon-actor-sheet.js b/modules/hawkmoon-actor-sheet.js index 3266670..13404df 100644 --- a/modules/hawkmoon-actor-sheet.js +++ b/modules/hawkmoon-actor-sheet.js @@ -49,9 +49,11 @@ export class HawkmoonActorSheet extends ActorSheet { combat: this.actor.getCombatValues(), equipements: duplicate(this.actor.getEquipments()), artefacts: duplicate(this.actor.getArtefacts()), - monnaies: duplicate(this.actor.getMonnaies()), richesse: this.actor.computeRichesse(), + coupDevastateur: this.actor.items.find(it => it.type =="talent" && it.name.toLowerCase() == "coup devastateur" && !it.system.used), valeurEquipement: this.actor.computeValeurEquipement(), + nbCombativite: this.actor.system.sante.nbcombativite, + combativiteList: HawkmoonUtility.getCombativiteList(this.actor.system.sante.nbcombativite), initiative: this.actor.getFlag("world", "last-initiative") || -1, description: await TextEditor.enrichHTML(this.object.system.biodata.description, {async: true}), habitat: await TextEditor.enrichHTML(this.object.system.biodata.habitat, {async: true}), diff --git a/modules/hawkmoon-actor.js b/modules/hawkmoon-actor.js index 8e21671..1153e5b 100644 --- a/modules/hawkmoon-actor.js +++ b/modules/hawkmoon-actor.js @@ -118,7 +118,7 @@ export class HawkmoonActor extends Actor { } getArtefacts() { return this.getItemSorted(["artefact"]) - } + } getArmors() { return this.getItemSorted(["protection"]) } @@ -382,10 +382,33 @@ export class HawkmoonActor extends Actor { return 0; } + /* -------------------------------------------- */ + changeEtatCombativite(value) { + let sante = duplicate(this.system.sante) + sante.etat += Number(value) + sante.etat = Math.max(sante.etat, 0) + sante.etat = Math.min(sante.etat, 5) + this.update({ 'system.sante': sante }) + if (sante.etat == this.system.sante.nbcombativite) { + ChatMessage.create({ content: `${this.name} est vaincu !` }) + } + // Gestion des états affaibli et très affaibli + if (sante.etat == this.system.sante.nbcombativite-2 || sante.etat == this.system.sante.nbcombativite-1) { + if (sante.etat == this.system.sante.nbcombativite-2 && this.items.find(item => item.type == "talent" && item.name.toLowerCase() == "encaissement")) { + ChatMessage.create({ content: `${this.name} ne subit pas les 2 adversités rouge grâce à Encaissement. Pensez à les ajouter à la fin de la scène !` }) + } else if (sante.etat == this.system.sante.nbcombativite-1 && this.items.find(item => item.type == "talent" && item.name.toLowerCase().includes("vaillant"))) { + ChatMessage.create({ content: `${this.name} ne subit pas les 2 adversités rouge grâce à Vaillant. Pensez à les ajouter à la fin de la scène !` }) + } else { + ChatMessage.create({ content: `${this.name} subit 2 adversités rouge !` }) + this.incDecAdversite("rouge", 2) + } + } + } + /* -------------------------------------------- */ async equipGear(equipmentId) { let item = this.items.find(item => item.id == equipmentId); - if (item && item.system.data) { + if (item?.system?.data) { let update = { _id: item.id, "system.equipped": !item.system.equipped }; await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity } @@ -434,7 +457,7 @@ export class HawkmoonActor extends Actor { if (objetQ) { let newQ = objetQ.system.quantite + incDec newQ = Math.max(newQ, 0) - const updated = await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'system.quantite': newQ }]); // pdates one EmbeddedEntity + await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'system.quantite': newQ }]); // pdates one EmbeddedEntity } } @@ -538,6 +561,8 @@ export class HawkmoonActor extends Actor { rollData.nbBA = this.system.bonneaventure.actuelle rollData.nbAdversites = this.getTotalAdversite() rollData.talents = [] + rollData.attrKey2 = "none" + rollData.coupDevastateur = this.items.find(it => it.type =="talent" && it.name.toLowerCase() == "coup dévastateur" && !it.system.used) if (attrKey) { rollData.attrKey = attrKey @@ -597,31 +622,42 @@ export class HawkmoonActor extends Actor { if (arme.type == "arme") { arme = this.prepareArme(arme) } - console.log("DEGATS", arme) + console.log("DEGATS", arme, targetVigueur, rollDataInput) let roll let bonus = 0 + let bonus2 = 0 + + if (rollDataInput?.applyCoupDevastateur) { + bonus2 = Math.floor(this.system.attributs.pui.value / 2) + let talent = this.items.find(item => item.type == "talent" && item.name.toLowerCase() == "coup dévastateur") + this.updateEmbeddedDocuments('Item', [{ _id: talent.id, 'system.used': true }]) + } + if (rollDataInput?.isHeroique) { if (rollDataInput?.attaqueCharge) { bonus = 5 } - roll = new Roll("2d10rr10+" + arme.system.totalDegats + "+" + bonus).roll({ async: false }) + roll = new Roll("2d10rr10+" + arme.system.totalDegats + "+" + bonus + "+" + bonus2).roll({ async: false }) } else { if (rollDataInput?.attaqueCharge) { bonus = 3 } - roll = new Roll("1d10+" + arme.system.totalDegats + "+" + bonus).roll({ async: false }) + roll = new Roll("1d10+" + arme.system.totalDegats + "+" + bonus + "+" + bonus2).roll({ async: false }) } await HawkmoonUtility.showDiceSoNice(roll, game.settings.get("core", "rollMode")); let nbEtatPerdus = 0 if (targetVigueur) { nbEtatPerdus = Math.floor(roll.total / targetVigueur) } + console.log(roll) let rollData = { arme: arme, finalResult: roll.total, + formula: roll.formula, alias: this.name, actorImg: this.img, actorId: this.id, + defenderTokenId: rollDataInput?.defenderTokenId, actionImg: arme.img, targetVigueur: targetVigueur, nbEtatPerdus: nbEtatPerdus @@ -630,5 +666,9 @@ export class HawkmoonActor extends Actor { content: await renderTemplate(`systems/fvtt-hawkmoon-cyd/templates/chat-degats-result.html`, rollData) }) + if (rollDataInput?.defenderTokenId && nbEtatPerdus) { + HawkmoonUtility.applyCombativite(rollDataInput, nbEtatPerdus) + } + } } diff --git a/modules/hawkmoon-roll-dialog.js b/modules/hawkmoon-roll-dialog.js index f6e0ba5..1b6d4d9 100644 --- a/modules/hawkmoon-roll-dialog.js +++ b/modules/hawkmoon-roll-dialog.js @@ -66,6 +66,9 @@ export class HawkmoonRollDialog extends Dialog { html.find('#attrKey').change(async (event) => { this.rollData.attrKey = String(event.currentTarget.value) }) + html.find('#attrKey2').change(async (event) => { + this.rollData.attrKey2 = String(event.currentTarget.value) + }) html.find('#select-maitrise').change(async (event) => { this.rollData.maitriseId = String(event.currentTarget.value) }) diff --git a/modules/hawkmoon-utility.js b/modules/hawkmoon-utility.js index d78115b..e6f345d 100644 --- a/modules/hawkmoon-utility.js +++ b/modules/hawkmoon-utility.js @@ -153,6 +153,15 @@ export class HawkmoonUtility { let actor = this.getActorFromRollData(rollData) actor.rollArmeDegats(rollData.arme._id, rollData.targetVigueur, rollData) }) + html.on("click", '.roll-chat-degat-devastateur', async event => { + let messageId = HawkmoonUtility.findChatMessageId(event.currentTarget) + let message = game.messages.get(messageId) + let rollData = message.getFlag("world", "hawkmoon-roll") + let actor = this.getActorFromRollData(rollData) + rollData.applyCoupDevastateur = true + actor.rollArmeDegats(rollData.arme._id, rollData.targetVigueur, rollData) + }) + } /* -------------------------------------------- */ @@ -250,27 +259,12 @@ export class HawkmoonUtility { let newRollData = mergeObject(oldRollData, rollData); this.rollDataStore[id] = newRollData; } - /* -------------------------------------------- */ - static saveRollData(rollData) { - game.socket.emit("system.fvtt-hawkmoon-cyd", { - name: "msg_update_roll", data: rollData - }); // Notify all other clients of the roll - this.updateRollData(rollData); - } - - /* -------------------------------------------- */ - static getRollData(id) { - return this.rollDataStore[id]; - } /* -------------------------------------------- */ static onSocketMesssage(msg) { - //console.log("SOCKET MESSAGE", msg.name, game.user.character.id, msg.data.defenderId); - if (msg.name == "msg_update_defense_state") { - this.updateDefenseState(msg.data.defenderId, msg.data.rollId); - } - if (msg.name == "msg_update_roll") { - this.updateRollData(msg.data); + if (msg.name == "msg_apply_combativite") { + let defender = game.canvas.tokens.get(rollData.defenderTokenId).actor + defender.changeEtatCombativite(msg.data.value) } } @@ -352,7 +346,15 @@ export class HawkmoonUtility { } } - + /* -------------------------------------------- */ + static applyCombativite(rollData, value) { + if (game.user.isGM) { + let defender = game.canvas.tokens.get(rollData.defenderTokenId).actor + defender.changeEtatCombativite(value) + } else { + game.socket.emit("system.fvtt-hawkmoon-cyd", { msg: "msg_apply_combativite", data: { defenderTokenId: rollData.defenderTokenId, value } }); + } + } /* -------------------------------------------- */ static async rollHawkmoon(rollData) { @@ -364,6 +366,9 @@ export class HawkmoonUtility { rollData.actionImg = "systems/fvtt-hawkmoon-cyd/assets/icons/" + actor.system.attributs[rollData.attrKey].labelnorm + ".webp" rollData.attr = duplicate(actor.system.attributs[rollData.attrKey]) } + if (rollData.attrKey2 != "none") { + rollData.attr2 = duplicate(actor.system.attributs[rollData.attrKey2]) + } if (rollData.maitriseId != "none") { rollData.selectedMaitrise = rollData.maitrises.find(p => p.id == rollData.maitriseId) @@ -377,7 +382,7 @@ export class HawkmoonUtility { rollData.predilections = duplicate(rollData.competence.system.predilections || []) let compmod = (rollData.competence.system.niveau == 0) ? -3 : 0 rollData.diceFormula += `+${rollData.attr.value}+${rollData.competence.system.niveau}+${rollData.modificateur}+${compmod}` - + if (rollData.selectedTalents && rollData.selectedTalents.length > 0) { for (let id of rollData.selectedTalents) { let talent = rollData.talents.find(t => t._id == id) @@ -396,9 +401,12 @@ export class HawkmoonUtility { } } rollData.diceFormula += `+${rollData.bonusMalusContext}` + } else if (rollData.attr2) { + rollData.diceFormula += `+${rollData.attr.value}+${rollData.attr2.value}+${rollData.modificateur}+${rollData.bonusMalusContext}` } else { rollData.diceFormula += `+${rollData.attr.value}*${rollData.multiplier}+${rollData.modificateur}+${rollData.bonusMalusContext}` } + // Bonus arme naturelle en défense if (rollData.bonusArmeNaturelle) { rollData.diceFormula += `+${rollData.bonusArmeNaturelle}` @@ -453,8 +461,24 @@ export class HawkmoonUtility { content: await renderTemplate(`systems/fvtt-hawkmoon-cyd/templates/chat-generic-result.html`, rollData) }, rollData) + if (rollData.arme && rollData.isSuccess && rollData.defenderTokenId) { + this.applyCombativite(rollData, 1) + } + } + /* -------------------------------------------- */ + static getCombativiteList(nbActivite) { + let list = [ { value: 0, label: "Combatif"}] + for (let i = 1; i < nbActivite-2; i++) { + list.push({ value: i, label:"Eprouvé " + i} ) + } + list[nbActivite-2] = { value: nbActivite-2, label:"Affaibli"} + list[nbActivite-1] = { value: nbActivite-1, label:"Très Affaibli"} + list[nbActivite] = { value: nbActivite, label:"Vaincu"} + return list + + } /* -------------------------------------------- */ static async bonusRollHawkmoon(rollData) { rollData.bonusFormula = rollData.addedBonus diff --git a/styles/simple.css b/styles/simple.css index 383bd64..5a425e0 100644 --- a/styles/simple.css +++ b/styles/simple.css @@ -1374,6 +1374,12 @@ ul, li { max-width: 8rem; min-width: 8rem; } +.item-field-label-long1 { + padding-top: 6px; + flex-grow:1; + max-width: 12rem; + min-width: 12rem; +} .item-field-label-long2 { padding-top: 6px; flex-grow:1; diff --git a/system.json b/system.json index 2fb0cb9..4b36abf 100644 --- a/system.json +++ b/system.json @@ -1,7 +1,7 @@ { "id": "fvtt-hawkmoon-cyd", "description": "Hawkmoon RPG for FoundryVTT (CYD system - French)", - "version": "11.0.9", + "version": "11.1.0", "authors": [ { "name": "Uberwald/LeRatierBretonnien", @@ -35,7 +35,7 @@ "gridUnits": "m", "license": "LICENSE.txt", "manifest": "https://www.uberwald.me/gitea/public/fvtt-hawkmoon-cyd/raw/branch/master/system.json", - "download": "https://www.uberwald.me/gitea/public/fvtt-hawkmoon-cyd/archive/fvtt-hawkmoon-cyd-11.0.9.zip", + "download": "https://www.uberwald.me/gitea/public/fvtt-hawkmoon-cyd/archive/fvtt-hawkmoon-cyd-11.1.0.zip", "languages": [ { "lang": "fr", @@ -188,7 +188,7 @@ "url": "https://www.uberwald.me/gitea/public/fvtt-hawkmoon-cyd", "background": "systems/fvtt-hawkmoon-cyd/assets/ui/fond_hawkmoon.webp", "compatibility": { - "minimum": "11", + "minimum": "10", "verified": "11" } } \ No newline at end of file diff --git a/template.json b/template.json index a45c631..55fbf44 100644 --- a/template.json +++ b/template.json @@ -70,7 +70,8 @@ "sante": { "vigueur": 0, "etat": 0, - "vigueurmodifier": 0 + "vigueurmodifier": 0, + "nbcombativite": 5 }, "adversite": { "bleue": 0, diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index 6e7a50f..4b104ca 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -38,7 +38,9 @@ diff --git a/templates/chat-degats-result.html b/templates/chat-degats-result.html index 131bf71..c9d146f 100644 --- a/templates/chat-degats-result.html +++ b/templates/chat-degats-result.html @@ -19,10 +19,11 @@
diff --git a/templates/chat-generic-result.html b/templates/chat-generic-result.html index 1d47258..8884a78 100644 --- a/templates/chat-generic-result.html +++ b/templates/chat-generic-result.html @@ -19,6 +19,9 @@

Santé

+
@@ -135,21 +146,21 @@ {{#if (ne skill.system.attribut1 "none")}} - + {{/if}} {{#if (ne skill.system.attribut2 "none")}} - + {{/if}} {{#if (ne skill.system.attribut3 "none")}} - + {{/if}}
 
@@ -187,7 +198,7 @@ {{talent.name}} {{talent.system.resumebonus}} - +
 
@@ -269,10 +280,10 @@ {{#if arme.system.isdefense}} - {{else}} - {{/if}} diff --git a/templates/roll-dialog-generic.html b/templates/roll-dialog-generic.html index 46212a7..2ce58f1 100644 --- a/templates/roll-dialog-generic.html +++ b/templates/roll-dialog-generic.html @@ -49,6 +49,18 @@
{{/if}} + {{else}} +
+ Second Attribut + +
{{/if}} {{#if (count talents)}}