From 166f3367fb490479e1469ab5a584dc69f0a0b987 Mon Sep 17 00:00:00 2001 From: LeRatierBretonnien Date: Fri, 21 Jul 2023 21:21:17 +0200 Subject: [PATCH] Fix rolls --- lang/en.json | 15 +++- lang/fr.json | 16 +++- modules/actors/ecryme-actor.js | 4 +- modules/common/ecryme-utility.js | 80 +++++++++++++++---- templates/chat/chat-cephaly-result.hbs | 30 +++++++ templates/chat/chat-confrontation-pending.hbs | 36 ++++++++- 6 files changed, 163 insertions(+), 18 deletions(-) create mode 100644 templates/chat/chat-cephaly-result.hbs diff --git a/lang/en.json b/lang/en.json index 1bb8bcc..eb11e51 100644 --- a/lang/en.json +++ b/lang/en.json @@ -30,6 +30,18 @@ "bonusmalustraits": "Traits Bonus/Malus", "spectranscend": "Self-Transcend : " }, + "rule": { + "cephaly-success-2": "Duration : 1 scene - Impact : Superficial - Bonus : 1 - Elegy : 1", + "cephaly-success-4": "Duration : 1 week - Impact : Light - Bonus : 2 - Elegy : 2", + "cephaly-success-6": "Duration : 1 month - Impact : Serious - Bonus : 3 - Elegy : 3", + "cephaly-success-8": "Duration : 1 year - Impact : Major - Bonus : 4 - Elegy : 4", + "cephaly-success-10": "Duration : Permanent - Impact : Dead - Bonus : 5 - Elegy : 5", + "cephaly-failure-2": "Duration : 1 scene - Impact : Superficial - Malus : 1", + "cephaly-failure-4": "Duration : 1 week - Impact : Light - Malus : 2", + "cephaly-failure-6": "Duration : 1 month - Impact : Serious - Malus : 3", + "cephaly-failure-8": "Duration : 1 year - Impact : Major - Malus : 4", + "cephaly-failure-10": "Duration : Permanent - Impact : Death/Madness - Malus : 5" + }, "warn": { "notenoughdice": "Execution and Preservation must have 2 dices allocated" }, @@ -129,7 +141,8 @@ "entelechy": "Entelechy", "mekany": "Mekany", "psyche": "Psyche", - "scoria": "Scoria" + "scoria": "Scoria", + "cephalydifficulty": "Set Cephaly difficulty" } } } \ No newline at end of file diff --git a/lang/fr.json b/lang/fr.json index a7e7b43..92f84ca 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -30,6 +30,19 @@ "bonusmalustraits": "Bonus/Malus des Traits", "spectranscend": "Dépassement de soi : " }, + "rule": { + "cephaly-success-12": "Durée : 1 scène - Impact : Superficiel - Bonus : 1 - Elegie : 1", + "cephaly-success-34": "Durée : 1 semaine - Impact : Léger - Bonus : 2 - Elegie : 2", + "cephaly-success-56": "Durée : 1 mois - Impact : Grave - Bonus : 3 - Elegie : 3", + "cephaly-success-78": "Durée : 1 année - Impact : Majeur - Bonus : 4 - Elegie : 4", + "cephaly-success-910": "Durée : Permanent - Impact : Mort - Bonus : 5 - Elegie : 5", + "cephaly-failure-2": "Durée : 1 scène - Impact : Superficiel - Malus : 1 - Symptôme non visible et sans gravité - Altération bégigne difficilement repérable", + "cephaly-failure-4": "Durée : 1 semaine - Impact : Léger - Malus : 2 - Symptôme visible non incapacitant - Altération repérable", + "cephaly-failure-6": "Durée : 1 mois - Impact : Grave - Malus : 3 - Symptôme incapacitant - Altération repérable et fâcheuse", + "cephaly-failure-8": "Durée : 1 année - Impact : Majeur - Malus : 4 - Symptôme très incapacitant - Altération dangereuse", + "cephaly-failure-10": "Durée : Permanent - Impact : Mort/Folie - Malus : 5 - Symptôme spectaculaire et repoussant - Altération dangereuse globalement" + + }, "warn": { "notenoughdice": "L'Accomplissement et la Préservation doivent avoir 2 dés chacun" }, @@ -129,7 +142,8 @@ "entelechy": "Entéléchie", "mekany": "Mekanë", "psyche": "Psyché", - "scoria": "Scorie" + "scoria": "Scorie", + "cephalydifficulty": "Difficulté de la Céphalie" } } } \ No newline at end of file diff --git a/modules/actors/ecryme-actor.js b/modules/actors/ecryme-actor.js index 2a16876..c1f384d 100644 --- a/modules/actors/ecryme-actor.js +++ b/modules/actors/ecryme-actor.js @@ -393,11 +393,13 @@ export class EcrymeActor extends Actor { rollData.title = game.i18n.localize("ECRY.ui.cephaly") + " : " + game.i18n.localize(rollData.skill.name) rollData.executionTotal = rollData.skill.value rollData.preservationTotal = rollData.skill.value + rollData.traitsBonus = duplicate(rollData.traits) + rollData.traitsMalus = duplicate(rollData.traits) rollData.applyTranscendence = "execution" let confrontStartDialog = await EcrymeConfrontStartDialog.create(this, rollData) confrontStartDialog.render(true) } - + /* -------------------------------------------- */ async rollWeaponConfront(weaponId) { let weapon = this.items.get(weaponId) diff --git a/modules/common/ecryme-utility.js b/modules/common/ecryme-utility.js index b6c599b..2df1272 100644 --- a/modules/common/ecryme-utility.js +++ b/modules/common/ecryme-utility.js @@ -4,7 +4,32 @@ import { EcrymeCommands } from "../app/ecryme-commands.js"; /* -------------------------------------------- */ const __maxImpacts = { superficial: 4, light: 3, serious: 2, major: 1 } const __nextImpacts = { superficial: "light", light: "serious", serious: "major", major: "major" } -const __effect2Impact= [ "none", "superficial", "superficial", "light", "light", "serious", "serious", "major", "major" ] +const __effect2Impact = ["none", "superficial", "superficial", "light", "light", "serious", "serious", "major", "major"] +const __cephalySuccess = { + 1: "cephaly-success-2", + 2: "cephaly-success-2", + 3: "cephaly-success-4", + 4: "cephaly-success-4", + 5: "cephaly-success-6", + 6: "cephaly-success-6", + 7: "cephaly-success-8", + 8: "cephaly-success-8", + 9: "cephaly-success-9", + 10: "cephaly-success-10" +} +const __cephalyFailure = { + 1: "cephaly-failure-2", + 2: "cephaly-failure-2", + 3: "cephaly-failure-4", + 4: "cephaly-failure-4", + 5: "cephaly-failure-6", + 6: "cephaly-failure-6", + 7: "cephaly-failure-8", + 8: "cephaly-failure-8", + 9: "cephaly-failure-9", + 10: "cephaly-failure-10" +} + /* -------------------------------------------- */ export class EcrymeUtility { @@ -56,6 +81,9 @@ export class EcrymeUtility { accum += block.fn(i); return accum; }) + Handlebars.registerHelper('isGM', function () { + return game.user.isGM + }) game.settings.register("fvtt-ecryme", "ecryme-game-level", { name: game.i18n.localize("ECRY.settings.gamelevel"), @@ -81,7 +109,7 @@ export class EcrymeUtility { let level = game.settings.get("fvtt-ecryme", "ecryme-game-level") return level != "level_e" } - + /*-------------------------------------------- */ static buildSkillConfig() { game.system.ecryme.config.skills = {} @@ -141,10 +169,10 @@ export class EcrymeUtility { // Compute margin confront.marginExecution = this.confrontData1.executionTotal - this.confrontData2.preservationTotal confront.marginPreservation = this.confrontData1.preservationTotal - this.confrontData2.executionTotal - console.log(confront.marginExecution, confront.marginPreservation) + console.log(confront.marginExecution, confront.marginPreservation) // Filter margin let maxMargin // Dummy max - if ( confront.marginExecution > 0) { // Successful hit + if (confront.marginExecution > 0) { // Successful hit // Limit with skill+spec maxMargin = confront.rollData1.skill.value + ((confront.rollData1.spec) ? 2 : 0) confront.marginExecution = Math.min(confront.marginExecution, maxMargin) @@ -153,7 +181,7 @@ export class EcrymeUtility { confront.marginExecution = -Math.min(Math.abs(confront.marginExecution), maxMargin) } - if ( confront.marginPreservation > 0) { // Successful defense + if (confront.marginPreservation > 0) { // Successful defense // Limit with skill+spec maxMargin = confront.rollData1.skill.value + ((confront.rollData1.spec) ? 2 : 0) confront.marginPreservation = Math.min(confront.marginPreservation, maxMargin) @@ -167,8 +195,8 @@ export class EcrymeUtility { if (confront.rollData1.weapon && confront.marginExecution > 0) { confront.effectExecution += confront.rollData1.weapon.system.effect confront.impactExecution = this.getImpactFromEffect(confront.effectExecution) - } - if ( confront.marginExecution < 0) { + } + if (confront.marginExecution < 0) { confront.bonus2 = -confront.marginExecution } confront.effectPreservation = confront.marginPreservation @@ -176,7 +204,7 @@ export class EcrymeUtility { confront.effectPreservation = - (Math.abs(confront.marginPreservation) + confront.rollData2.weapon.system.effect) confront.impactPreservation = this.getImpactFromEffect(Math.abs(confront.effectPreservation)) } - if ( confront.marginPreservation > 0) { + if (confront.marginPreservation > 0) { confront.bonus1 = -confront.marginPreservation } @@ -188,6 +216,27 @@ export class EcrymeUtility { this.lastConfront = confront } + /* -------------------------------------------- */ + static async manageCephalyDifficulty(rollData, difficulty) { + rollData.difficulty = Number(difficulty) + if (rollData.executionTotal > difficulty) { + rollData.marginExecution = rollData.executionTotal - difficulty + rollData.cephalySuccess = "ECRY.rule." + __cephalySuccess[(rollData.marginExecution > 10) ? 10 : rollData.marginExecution] + } else { + rollData.marginExecution = -1 + } + if (rollData.preservationTotal < difficulty) { + rollData.marginPreservation = difficulty - rollData.preservationTotal + rollData.cephalyFailure = "ECRY.rule." + __cephalyFailure[(rollData.marginPreservation > 10) ? 10 : rollData.marginPreservation] + } else { + rollData.marginPreservation = -1 + } + let msg = await this.createChatWithRollMode(rollData.alias, { + content: await renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-cephaly-result.hbs`, rollData) + }) + msg.setFlag("world", "ecryme-rolldata", rollData) + console.log("Cephaly result", rollData) + } /* -------------------------------------------- */ static manageConfrontation(rollData) { @@ -243,21 +292,24 @@ export class EcrymeUtility { let rollData = message.getFlag("world", "ecryme-rolldata") EcrymeUtility.manageConfrontation(rollData) }) + html.on("click", '.button-apply-cephaly-difficulty', event => { + let messageId = EcrymeUtility.findChatMessageId(event.currentTarget) + let message = game.messages.get(messageId) + let rollData = message.getFlag("world", "ecryme-rolldata") + let difficulty = $("#" + rollData.rollId + "-cephaly-difficulty").val() + EcrymeUtility.manageCephalyDifficulty(rollData, difficulty) + }) html.on("click", '.button-apply-impact', event => { let messageId = EcrymeUtility.findChatMessageId(event.currentTarget) let message = game.messages.get(messageId) let actor = game.actors.get($(event.currentTarget).data("actor-id")) actor.modifyImpact($(event.currentTarget).data("impact-type"), $(event.currentTarget).data("impact"), 1) - }) + }) html.on("click", '.button-apply-bonus', event => { let messageId = EcrymeUtility.findChatMessageId(event.currentTarget) let message = game.messages.get(messageId) let actor = game.actors.get($(event.currentTarget).data("actor-id")) - actor.modifyConfrontBonus( $(event.currentTarget).data("bonus") ) - }) - html.on("click", '.draw-tarot-card', event => { - let messageId = EcrymeUtility.findChatMessageId(event.currentTarget) - this.drawDeckCard(messageId) + actor.modifyConfrontBonus($(event.currentTarget).data("bonus")) }) } diff --git a/templates/chat/chat-cephaly-result.hbs b/templates/chat/chat-cephaly-result.hbs new file mode 100644 index 0000000..e4e611d --- /dev/null +++ b/templates/chat/chat-cephaly-result.hbs @@ -0,0 +1,30 @@ +
+ {{#if actorImg}} + {{alias}} + {{/if}} +

{{alias}}

+
+ +
+ +{{#if img}} +
+ {{alias}} +
+{{/if}} + +
+ +
+ + \ No newline at end of file diff --git a/templates/chat/chat-confrontation-pending.hbs b/templates/chat/chat-confrontation-pending.hbs index 5bf8c9f..93aa93a 100644 --- a/templates/chat/chat-confrontation-pending.hbs +++ b/templates/chat/chat-confrontation-pending.hbs @@ -15,13 +15,47 @@
- + {{#if (isGM)}} + {{#if (eq mode "cephaly")}} +
+ {{localize "ECRY.chat.difficulty"}} + +
+ + {{else}} + + {{/if}} + {{/if}}
\ No newline at end of file