From f22c4d2ec8f729c7b2fc2cafae8ae00d7c8f9abc Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Thu, 15 Jun 2023 01:58:38 +0200 Subject: [PATCH] Fin d'empoignade MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit En cours de round en atteignant 2 points d'empoignade, on peut uniquement entraîner au sol. En fin de round, si la victime est immobilisée, on peut projeter, ou faire perdre de l'endurance --- module/actor.js | 8 ++ module/rdd-empoignade.js | 82 ++++++++++++------- templates/chat-empoignade-actions.html | 39 --------- templates/chat-empoignade-entrainer-sol.html | 3 +- templates/chat-empoignade-entrainer.html | 16 ++++ templates/chat-empoignade-immobilise.html | 35 ++++++++ .../chat-empoignade-perte-endurance.html | 3 +- templates/chat-empoignade-projeter-sol.html | 3 +- templates/chat-empoignade-resultat.html | 5 +- templates/chat-empoignade-valider.html | 3 +- 10 files changed, 120 insertions(+), 77 deletions(-) delete mode 100644 templates/chat-empoignade-actions.html create mode 100644 templates/chat-empoignade-entrainer.html create mode 100644 templates/chat-empoignade-immobilise.html diff --git a/module/actor.js b/module/actor.js index 8669f918..8c0f2581 100644 --- a/module/actor.js +++ b/module/actor.js @@ -1365,6 +1365,7 @@ export class RdDActor extends RdDBaseActor { await this.$finDeRoundSuppressionEffetsTermines(options); await this.$finDeRoundBlessuresGraves(); await this.$finDeRoundSupprimerObsoletes(); + await this.$finDeRoundEmpoignade(); } async $finDeRoundSuppressionEffetsTermines(options) { @@ -1394,6 +1395,13 @@ export class RdDActor extends RdDBaseActor { await this.deleteEmbeddedDocuments('Item', obsoletes); } + async $finDeRoundEmpoignade(){ + const immobilisations = this.itemTypes[TYPES.empoignade].filter(it => it.system.pointsemp >= 2 && it.system.empoigneurid == this.id); + immobilisations.forEach(emp => RdDEmpoignade.onImmobilisation(this, + game.actors.get(emp.system.empoigneid), + emp + )) + } /* -------------------------------------------- */ async setSonne(sonne = true) { if (this.isEntite()) { diff --git a/module/rdd-empoignade.js b/module/rdd-empoignade.js index e0bdd52d..89f65256 100644 --- a/module/rdd-empoignade.js +++ b/module/rdd-empoignade.js @@ -20,13 +20,13 @@ export class RdDEmpoignade { static registerChatCallbacks(html) { html.on("click", '.defense-empoignade-cac', event => { const chatMessage = ChatUtility.getChatMessage(event); - const rollData = RdDEmpoignade.readRollEmpoignade(chatMessage); + const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage); let defenseMode = event.currentTarget.attributes['data-defense-mode'].value RdDEmpoignade.onDefenseEmpoignade(rollData, defenseMode, "Corps à corps", "melee") }); html.on("click", '.defense-empoignade-esquive', event => { const chatMessage = ChatUtility.getChatMessage(event); - const rollData = RdDEmpoignade.readRollEmpoignade(chatMessage); + const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage); let defenseMode = event.currentTarget.attributes['data-defense-mode'].value RdDEmpoignade.onDefenseEmpoignade(rollData, defenseMode, "Esquive", "derobee") }); @@ -37,19 +37,19 @@ export class RdDEmpoignade { }); html.on("click", '.empoignade-entrainer-sol', event => { const chatMessage = ChatUtility.getChatMessage(event); - const rollData = RdDEmpoignade.readRollEmpoignade(chatMessage); + const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage); RdDEmpoignade.entrainerAuSol(rollData) ChatUtility.removeChatMessageId(chatMessage.id) }); html.on("click", '.empoignade-projeter-sol', event => { const chatMessage = ChatUtility.getChatMessage(event); - const rollData = RdDEmpoignade.readRollEmpoignade(chatMessage); + const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage); RdDEmpoignade.projeterAuSol(rollData) ChatUtility.removeChatMessageId(chatMessage.id) }); html.on("change", '.empoignade-perte-endurance', event => { const chatMessage = ChatUtility.getChatMessage(event); - const rollData = RdDEmpoignade.readRollEmpoignade(chatMessage); + const rollData = RdDEmpoignade.$readRollEmpoignade(chatMessage); if (event.currentTarget.value && event.currentTarget.value != "none") { RdDEmpoignade.perteEndurance(rollData, event.currentTarget.value) ChatUtility.removeChatMessageId(chatMessage.id) @@ -68,20 +68,28 @@ export class RdDEmpoignade { } /* -------------------------------------------- */ - static storeRollEmpoignade(msg, rollData) { - rollData.attacker = { id: rollData.attacker.id } - rollData.defender = { id: rollData.defender.id } + static $storeRollEmpoignade(msg, rollData) { + RdDEmpoignade.$reduceActorToIds(rollData); ChatUtility.setMessageData(msg, "empoignade-roll-data", rollData); } + static $reduceActorToIds(rollData) { + rollData.attacker = { id: rollData.attacker.id }; + rollData.defender = { id: rollData.defender.id }; + } + /* -------------------------------------------- */ - static readRollEmpoignade(msg) { + static $readRollEmpoignade(msg) { const rollData = ChatUtility.getMessageData(msg, 'empoignade-roll-data'); - rollData.attacker = game.actors.get(rollData.attacker.id) - rollData.defender = game.actors.get(rollData.defender.id) + RdDEmpoignade.$replaceIdsWithActors(rollData); return rollData } + static $replaceIdsWithActors(rollData) { + rollData.attacker = game.actors.get(rollData.attacker.id); + rollData.defender = game.actors.get(rollData.defender.id); + } + /* -------------------------------------------- */ static isEmpoignadeEnCours(actor) { return actor.itemTypes[TYPES.empoignade].find(it => it.system.pointsemp > 0) @@ -145,7 +153,6 @@ export class RdDEmpoignade { if (!RdDEmpoignade.isActionAutorisee("empoigner", attacker, defender)) { return } - let empoignade = RdDEmpoignade.getEmpoignade(attacker, defender) const isNouvelle = empoignade == undefined; empoignade = empoignade ?? (await RdDEmpoignade.createEmpoignade(attacker, defender)) @@ -182,8 +189,10 @@ export class RdDEmpoignade { RdDItemCompetenceCreature.setRollDataCreature(rollData) } if (empoignade.system.pointsemp >= 2) { - let msg = await RdDResolutionTable.displayRollData(rollData, attacker, 'chat-empoignade-actions.html'); - RdDEmpoignade.storeRollEmpoignade(msg, rollData); + if (!empoignade.system.ausol) { + let msg = await RdDResolutionTable.displayRollData(rollData, attacker, 'chat-empoignade-entrainer.html'); + RdDEmpoignade.$storeRollEmpoignade(msg, rollData); + } } else { await RdDEmpoignade.$rollAttaqueEmpoignade(attacker, rollData, isNouvelle); } @@ -196,6 +205,20 @@ export class RdDEmpoignade { await this.onAttaqueEmpoignadeValidee(attacker, defender) } + static async onImmobilisation(attacker, defender, empoignade) { + const rollData = { + mode: "immobilise", + empoignade, attacker, defender, + isEmpoignade: true, + competence: attacker.getCompetence("Corps à corps").clone() + } + const msg = await ChatMessage.create({ + whisper: ChatUtility.getWhisperRecipientsAndGMs(attacker.name), + content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-empoignade-immobilise.html`, rollData) + }) + RdDEmpoignade.$storeRollEmpoignade(msg, rollData); + } + /* -------------------------------------------- */ static async $rollAttaqueEmpoignade(attacker, rollData, isNouvelle = false) { const dialog = await RdDRoll.create(attacker, rollData, @@ -226,7 +249,7 @@ export class RdDEmpoignade { rollData.particuliere = "finesse"; } let msg = await RdDResolutionTable.displayRollData(rollData, attacker, 'chat-empoignade-resultat.html'); - RdDEmpoignade.storeRollEmpoignade(msg, rollData); + RdDEmpoignade.$storeRollEmpoignade(msg, rollData); } /* -------------------------------------------- */ @@ -260,8 +283,8 @@ export class RdDEmpoignade { } /* -------------------------------------------- */ - static async $rollDefenseEmpoignade(defender, rollData) { - const dialog = await RdDRoll.create(defender, rollData, + static async $rollDefenseEmpoignade(defender, defenderRoll) { + const dialog = await RdDRoll.create(defender, defenderRoll, { html: 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-defense-empoignade.html' }, { name: 'empoignade', @@ -277,7 +300,7 @@ export class RdDEmpoignade { /* -------------------------------------------- */ static async $onRollContrerLiberer(rollData) { let empoignade = rollData.empoignade - + if (rollData.mode == "contrer-empoigner" && !rollData.rolled.isSuccess) { empoignade.system.pointsemp++ RdDEmpoignade.$updateEtatEmpoignade(empoignade) @@ -286,13 +309,12 @@ export class RdDEmpoignade { empoignade.system.pointsemp-- RdDEmpoignade.$updateEtatEmpoignade(empoignade) } - - if (empoignade.system.pointsemp >= 2) { - let attacker = game.actors.get(empoignade.system.empoigneurid) - let msg = await RdDResolutionTable.displayRollData(rollData, attacker, 'chat-empoignade-actions.html'); - RdDEmpoignade.storeRollEmpoignade(msg, rollData); - } + await RdDResolutionTable.displayRollData(rollData, rollData.defender, 'chat-empoignade-resultat.html') + if (empoignade.system.pointsemp >= 2) { + let msg = await RdDResolutionTable.displayRollData(rollData, rollData.attacker, 'chat-empoignade-entrainer.html'); + RdDEmpoignade.$storeRollEmpoignade(msg, rollData); + } } /* -------------------------------------------- */ @@ -323,7 +345,7 @@ export class RdDEmpoignade { static async entrainerAuSol(rollData) { let attacker = game.actors.get(rollData.attacker.id) let defender = game.actors.get(rollData.defender.id) - if (!RdDEmpoignade.isActionAutorisee("attaquant", attacker, defender)) { + if (!RdDEmpoignade.isActionAutorisee("immobilise", attacker, defender)) { return } let empoignade = this.getEmpoignade(attacker, defender) @@ -335,14 +357,14 @@ export class RdDEmpoignade { await defender.setEffect(STATUSES.StatusProne, true); let msg = await RdDResolutionTable.displayRollData(rollData, attacker, 'chat-empoignade-entrainer-sol.html'); - RdDEmpoignade.storeRollEmpoignade(msg, rollData); + RdDEmpoignade.$storeRollEmpoignade(msg, rollData); } /* -------------------------------------------- */ static async projeterAuSol(rollData) { let attacker = game.actors.get(rollData.attacker.id) let defender = game.actors.get(rollData.defender.id) - if (!RdDEmpoignade.isActionAutorisee("attaquant", attacker, defender)) { + if (!RdDEmpoignade.isActionAutorisee("immobilise", attacker, defender)) { return } let empoignade = this.getEmpoignade(attacker, defender) @@ -351,14 +373,14 @@ export class RdDEmpoignade { await this.$deleteEmpoignade(empoignade) let msg = await RdDResolutionTable.displayRollData(rollData, attacker, 'chat-empoignade-projeter-sol.html'); - RdDEmpoignade.storeRollEmpoignade(msg, rollData); + RdDEmpoignade.$storeRollEmpoignade(msg, rollData); } /* -------------------------------------------- */ static async perteEndurance(rollData, perteMode) { let attacker = game.actors.get(rollData.attacker.id) let defender = game.actors.get(rollData.defender.id) - if (!RdDEmpoignade.isActionAutorisee("attaquant", attacker, defender)) { + if (!RdDEmpoignade.isActionAutorisee("immobilise", attacker, defender)) { return } let empoignade = this.getEmpoignade(attacker, defender) @@ -378,7 +400,7 @@ export class RdDEmpoignade { await defender.santeIncDec("endurance", -(3 * Math.floor(endValue / 4))); } let msg = await RdDResolutionTable.displayRollData(rollData, attacker, 'chat-empoignade-perte-endurance.html'); - RdDEmpoignade.storeRollEmpoignade(msg, rollData); + RdDEmpoignade.$storeRollEmpoignade(msg, rollData); } /* -------------------------------------------- */ diff --git a/templates/chat-empoignade-actions.html b/templates/chat-empoignade-actions.html deleted file mode 100644 index 6d9c30b8..00000000 --- a/templates/chat-empoignade-actions.html +++ /dev/null @@ -1,39 +0,0 @@ - -

- {{attacker.name}} a empoigné {{defender.name}} -

-
-
- - - Au round suivant l'acquisition des 2 points d'Emp, {{attacker.name}} peut faire perdre autant de points d'Endurance qu'il souhaite à {{defender.name}} -
- - - - - {{#if empoignade.system.ausol}} - - {{else}} -
- Dès l'acquisition des 2 points d'Emp, {{attacker.name}} peut entraîner {{defender.name}} au sol. Les deux protagonistes restent empoignés. -
- - Entraîner au sol - -
- A la fin du round ou les 2 points d'Emp sont acquis, {{attacker.name}} peut projeter {{defender.name}} au sol. Les deux protagonistes ne sont plus empoignés. -
- - Projeter au sol - - {{/if}} - - -
diff --git a/templates/chat-empoignade-entrainer-sol.html b/templates/chat-empoignade-entrainer-sol.html index 4af1e47d..47e6988f 100644 --- a/templates/chat-empoignade-entrainer-sol.html +++ b/templates/chat-empoignade-entrainer-sol.html @@ -1,7 +1,8 @@

- {{attacker.name}} a entraîné {{defender.name}} au sol. L'empoignade peut continuer. + {{attacker.name}} a entraîné {{defender.name}} au sol


+ L'empoignade peut continuer.
diff --git a/templates/chat-empoignade-entrainer.html b/templates/chat-empoignade-entrainer.html new file mode 100644 index 00000000..86de5d75 --- /dev/null +++ b/templates/chat-empoignade-entrainer.html @@ -0,0 +1,16 @@ + +

+ {{attacker.name}} a empoigné {{defender.name}} +

+
+
+ + {{attacker.name}} vient d'obtenir 2 points d'Emp, et peut + entraîner {{defender.name}} au sol. Les deux protagonistes + restent empoignés. +
+ + Entraîner au sol + +
+
diff --git a/templates/chat-empoignade-immobilise.html b/templates/chat-empoignade-immobilise.html new file mode 100644 index 00000000..19e87d2f --- /dev/null +++ b/templates/chat-empoignade-immobilise.html @@ -0,0 +1,35 @@ + +

+ {{attacker.name}} a empoigné {{defender.name}} +

+
+
+ +

+ {{attacker.name}} a obtenu 2 points d'Emp à la fin du round précédent, et peut: + +

+

+
+
diff --git a/templates/chat-empoignade-perte-endurance.html b/templates/chat-empoignade-perte-endurance.html index def15ba6..6053e1c0 100644 --- a/templates/chat-empoignade-perte-endurance.html +++ b/templates/chat-empoignade-perte-endurance.html @@ -1,7 +1,8 @@

- {{attacker.name}} a fait perdre de l'endurance à {{defender.name}}, qui reste immobilisé. L'empoignade peut continuer. + {{attacker.name}} a fait perdre de l'endurance à {{defender.name}}


+ {{defender.name}} reste immobilisé. L'empoignade peut continuer.
diff --git a/templates/chat-empoignade-projeter-sol.html b/templates/chat-empoignade-projeter-sol.html index c5a638b4..22e8cb98 100644 --- a/templates/chat-empoignade-projeter-sol.html +++ b/templates/chat-empoignade-projeter-sol.html @@ -1,7 +1,8 @@

- {{attacker.name}} a projeté {{defender.name}} au sol. L'empoignade est terminée et a été supprimée. + {{attacker.name}} a projeté {{defender.name}} au sol


+ L'empoignade est terminée et a été supprimée.
diff --git a/templates/chat-empoignade-resultat.html b/templates/chat-empoignade-resultat.html index 44665917..111c8db7 100644 --- a/templates/chat-empoignade-resultat.html +++ b/templates/chat-empoignade-resultat.html @@ -73,8 +73,7 @@ La tentative de contrer la libération est un échec! {{/if}} {{/if}} - -
Points d'Emp: {{empoignade.system.pointsemp}} - + +
Points d'Emp: {{empoignade.system.pointsemp}} {{/if}} diff --git a/templates/chat-empoignade-valider.html b/templates/chat-empoignade-valider.html index d718c1a6..6be1300f 100644 --- a/templates/chat-empoignade-valider.html +++ b/templates/chat-empoignade-valider.html @@ -4,7 +4,6 @@
-
{{attacker.name}} tente d'empoigner {{defender.name}}, qui est équipé d'une arme de mêlée. {{defender.name}} @@ -16,5 +15,5 @@ data-defenderId='{{defender.id}}'> Poursuivre l'empoignade - +
\ No newline at end of file