Clarification des maladresses
This commit is contained in:
@@ -4,6 +4,7 @@
|
|||||||
- Fix
|
- Fix
|
||||||
- La montée en TMR fonctionne
|
- La montée en TMR fonctionne
|
||||||
- ajout d'un status "Force insuffisante"
|
- ajout d'un status "Force insuffisante"
|
||||||
|
- clarification des maladresses à l'attaque (en demi surprise, ou à cause d'un échec total)
|
||||||
- Nouvelle fenêtre de jets de dés
|
- Nouvelle fenêtre de jets de dés
|
||||||
- ajout du statut "Force insuffisante" aux acteurs si la
|
- ajout du statut "Force insuffisante" aux acteurs si la
|
||||||
force est insuffisante pour l'arme
|
force est insuffisante pour l'arme
|
||||||
|
@@ -19,6 +19,7 @@ import RollDialog from "./roll/roll-dialog.mjs";
|
|||||||
import { PART_DEFENSE } from "./roll/roll-part-defense.mjs";
|
import { PART_DEFENSE } from "./roll/roll-part-defense.mjs";
|
||||||
import { PART_ATTAQUE } from "./roll/roll-part-attaque.mjs";
|
import { PART_ATTAQUE } from "./roll/roll-part-attaque.mjs";
|
||||||
import { RollDialogAdapter } from "./roll/roll-dialog-adapter.mjs";
|
import { RollDialogAdapter } from "./roll/roll-dialog-adapter.mjs";
|
||||||
|
import { ROLL_MODE_ATTAQUE, ROLL_MODE_DEFENSE } from "./roll/roll-constants.mjs";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
const premierRoundInit = [
|
const premierRoundInit = [
|
||||||
@@ -559,33 +560,42 @@ export class RdDCombat {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isEchecTotal(rollData) {
|
static isEchecTotal(rollData) {
|
||||||
if (!rollData.attackerRoll && rollData.ajustements.surprise.used) {
|
if (rollData.ids /* roll V2*/) {
|
||||||
return rollData.rolled.isEchec && rollData.rolled.code != 'notSign';
|
// TODO: en cas de demi-surprise à l'attaque, tout échec est un echec total.
|
||||||
|
// TODO: en cas de demi-surprise en défense, pas de changement à la règle de base
|
||||||
|
return rollData.rolled.isETotal
|
||||||
}
|
}
|
||||||
return rollData.rolled.isETotal;
|
if (rollData.mode == ROLL_MODE_ATTAQUE && rollData.surprise == 'demi'){
|
||||||
|
// échec normal à l'attaque en demi surprise
|
||||||
|
return rollData.rolled.isEchec && rollData.rolled.code != 'notSign'
|
||||||
|
}
|
||||||
|
return rollData.rolled.isETotal
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isParticuliere(rollData) {
|
static isParticuliere(rollData) {
|
||||||
if (rollData.ids) {
|
if (rollData.ids /* roll V2*/) {
|
||||||
return rollData.rolled.isPart
|
return rollData.rolled.isPart
|
||||||
}
|
}
|
||||||
if (!rollData.attackerRoll && rollData.ajustements.surprise.used) {
|
if (rollData.attackerRoll || !rollData.ajustements.surprise.used) {
|
||||||
return false;
|
return rollData.rolled.isPart
|
||||||
}
|
}
|
||||||
return rollData.rolled.isPart;
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static isReussite(rollData) {
|
static isReussite(rollData) {
|
||||||
if (rollData.ids) {
|
if (rollData.ids /* roll V2*/) {
|
||||||
return rollData.rolled.is
|
return rollData.rolled.isSuccess
|
||||||
|
}
|
||||||
|
if (!rollData.ajustements.surprise.used) {
|
||||||
|
return rollData.rolled.isSuccess
|
||||||
}
|
}
|
||||||
switch (rollData.ajustements.surprise.used) {
|
switch (rollData.ajustements.surprise.used) {
|
||||||
case 'totale': return false;
|
case 'totale': return false
|
||||||
case 'demi': return rollData.rolled.isSign;
|
case 'demi': return rollData.rolled.isSign
|
||||||
}
|
}
|
||||||
return rollData.rolled.isSuccess;
|
return rollData.rolled.isSuccess
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -692,6 +702,7 @@ export class RdDCombat {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_prepareAttaque(competence, arme) {
|
_prepareAttaque(competence, arme) {
|
||||||
let rollData = {
|
let rollData = {
|
||||||
|
mode: ROLL_MODE_ATTAQUE,
|
||||||
alias: this.attacker?.getAlias(),
|
alias: this.attacker?.getAlias(),
|
||||||
passeArme: foundry.utils.randomID(16),
|
passeArme: foundry.utils.randomID(16),
|
||||||
mortalite: arme?.system.mortalite,
|
mortalite: arme?.system.mortalite,
|
||||||
@@ -889,6 +900,7 @@ export class RdDCombat {
|
|||||||
const choixEchecTotal = await ChatMessage.create({
|
const choixEchecTotal = await ChatMessage.create({
|
||||||
whisper: ChatUtility.getOwners(this.attacker),
|
whisper: ChatUtility.getOwners(this.attacker),
|
||||||
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-etotal.hbs', {
|
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-etotal.hbs', {
|
||||||
|
rolled: attackerRoll.rolled,
|
||||||
attackerId: this.attackerId,
|
attackerId: this.attackerId,
|
||||||
attacker: this.attacker,
|
attacker: this.attacker,
|
||||||
attackerToken: this.attackerToken,
|
attackerToken: this.attackerToken,
|
||||||
@@ -984,8 +996,8 @@ export class RdDCombat {
|
|||||||
this.removeChatMessageActionsPasseArme(rd.passeArme)
|
this.removeChatMessageActionsPasseArme(rd.passeArme)
|
||||||
// defense: esquive / arme de parade / competence de défense
|
// defense: esquive / arme de parade / competence de défense
|
||||||
if (!RdDCombat.isParticuliere(rd))
|
if (!RdDCombat.isParticuliere(rd))
|
||||||
await rd.active.actor.incDecItemUse(rd.current[PART_DEFENSE].defense?.id, )
|
await rd.active.actor.incDecItemUse(rd.current[PART_DEFENSE].defense?.id,)
|
||||||
await this._onDefenseV2(rd)
|
await this._onDefense(rd)
|
||||||
}]
|
}]
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -994,6 +1006,7 @@ export class RdDCombat {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_prepareParade(attackerRoll, armeParade, competenceParade) {
|
_prepareParade(attackerRoll, armeParade, competenceParade) {
|
||||||
let defenderRoll = {
|
let defenderRoll = {
|
||||||
|
mode: ROLL_MODE_DEFENSE,
|
||||||
alias: this.defender?.getAlias(),
|
alias: this.defender?.getAlias(),
|
||||||
passeArme: attackerRoll.passeArme,
|
passeArme: attackerRoll.passeArme,
|
||||||
diffLibre: attackerRoll.diffLibre,
|
diffLibre: attackerRoll.diffLibre,
|
||||||
@@ -1016,17 +1029,63 @@ export class RdDCombat {
|
|||||||
return defenderRoll;
|
return defenderRoll;
|
||||||
}
|
}
|
||||||
|
|
||||||
async _onParade(defenderRoll) {
|
async _onDefense(rollData) {
|
||||||
if (RdDCombat.isReussite(defenderRoll)) {
|
if (RdDCombat.isReussite(rollData)) {
|
||||||
await this._onParadeNormale(defenderRoll)
|
await this._onDefenseNormale(rollData)
|
||||||
if (RdDCombat.isParticuliere(defenderRoll)) {
|
if (RdDCombat.isParticuliere(rollData)) {
|
||||||
await this._onParadeParticuliere(defenderRoll)
|
await this._onDefenseParticuliere(rollData)
|
||||||
}
|
}
|
||||||
return
|
|
||||||
}
|
}
|
||||||
await this._onParadeEchec(defenderRoll)
|
else {
|
||||||
|
await this._onDefenseEchec(rollData)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
async _onDefenseV2(defenderRoll) {
|
|
||||||
|
async _onDefenseParticuliere(rollData) {
|
||||||
|
console.log("RdDCombat._onDefenseParticuliere >>>", rollData);
|
||||||
|
if (/*TODO: parade?*/!rollData.attackerRoll?.isPart) {
|
||||||
|
// TODO: attaquant doit jouer résistance et peut être désarmé p132
|
||||||
|
ChatUtility.createChatWithRollMode(
|
||||||
|
{ content: `(à gérer) L'attaquant doit jouer résistance et peut être désarmé (p132)` },
|
||||||
|
this.defender)
|
||||||
|
}
|
||||||
|
ChatUtility.createChatWithRollMode(
|
||||||
|
{ content: "<strong>Vous pouvez esquiver une deuxième fois!</strong>" },
|
||||||
|
this.defender);
|
||||||
|
}
|
||||||
|
|
||||||
|
async _onDefenseNormale(rollData) {
|
||||||
|
console.log("RdDCombat._onDefenseNormale >>>", rollData);
|
||||||
|
// console.log("RdDCombat._onEsquiveNormal >>>", rollData);
|
||||||
|
// await RdDRollResult.displayRollData(rollData, this.defender, 'chat-resultat-esquive.hbs');
|
||||||
|
// this.removeChatMessageActionsPasseArme(rollData.passeArme);
|
||||||
|
//TODO
|
||||||
|
await this.computeRecul(rollData);
|
||||||
|
await this.computeDeteriorationArme(rollData);
|
||||||
|
await RdDRollResult.displayRollData(rollData, this.defender, 'chat-resultat-parade.hbs');
|
||||||
|
this.removeChatMessageActionsPasseArme(rollData.passeArme);
|
||||||
|
}
|
||||||
|
|
||||||
|
async _onDefenseEchec(rollData) {
|
||||||
|
console.log("RdDCombat._onDefenseEchec >>>", rollData);
|
||||||
|
// console.log("RdDCombat._onEsquiveEchec >>>", rollData);
|
||||||
|
|
||||||
|
// await RdDRollResult.displayRollData(rollData, this.defender, 'chat-resultat-esquive.hbs');
|
||||||
|
|
||||||
|
// this.removeChatMessageActionsPasseArme(rollData.passeArme);
|
||||||
|
// this._sendMessageDefense(rollData.attackerRoll, rollData, { defense: true })
|
||||||
|
|
||||||
|
await RdDRollResult.displayRollData(rollData, this.defender, 'chat-resultat-parade.hbs');
|
||||||
|
|
||||||
|
this.removeChatMessageActionsPasseArme(rollData.passeArme);
|
||||||
|
this._sendMessageDefense(rollData.attackerRoll, rollData, { defense: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
async _onParade(defenderRoll) {
|
||||||
if (RdDCombat.isReussite(defenderRoll)) {
|
if (RdDCombat.isReussite(defenderRoll)) {
|
||||||
await this._onParadeNormale(defenderRoll)
|
await this._onParadeNormale(defenderRoll)
|
||||||
if (RdDCombat.isParticuliere(defenderRoll)) {
|
if (RdDCombat.isParticuliere(defenderRoll)) {
|
||||||
@@ -1096,6 +1155,7 @@ export class RdDCombat {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_prepareEsquive(attackerRoll, competence) {
|
_prepareEsquive(attackerRoll, competence) {
|
||||||
let rollData = {
|
let rollData = {
|
||||||
|
mode: ROLL_MODE_DEFENSE,
|
||||||
alias: this.defender.getAlias(),
|
alias: this.defender.getAlias(),
|
||||||
passeArme: attackerRoll.passeArme,
|
passeArme: attackerRoll.passeArme,
|
||||||
diffLibre: attackerRoll.diffLibre,
|
diffLibre: attackerRoll.diffLibre,
|
||||||
|
@@ -4,8 +4,9 @@ import { PART_COMP } from "./roll-part-comp.mjs";
|
|||||||
import { RdDResolutionTable } from "../rdd-resolution-table.js";
|
import { RdDResolutionTable } from "../rdd-resolution-table.js";
|
||||||
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
|
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
|
||||||
import { PART_OEUVRE } from "./roll-part-oeuvre.mjs";
|
import { PART_OEUVRE } from "./roll-part-oeuvre.mjs";
|
||||||
import { ATTAQUE_TYPE, RdDItemArme } from "../item/arme.js";
|
import { RdDItemArme } from "../item/arme.js";
|
||||||
import { RdDBonus } from "../rdd-bonus.js";
|
import { RdDBonus } from "../rdd-bonus.js";
|
||||||
|
import { ROLL_MODE_ATTAQUE } from "./roll-constants.mjs";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
export class RollDialogAdapter {
|
export class RollDialogAdapter {
|
||||||
@@ -36,7 +37,9 @@ export class RollDialogAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async rollChances(rollData, chances) {
|
async rollChances(rollData, chances) {
|
||||||
const rolled = await RdDResolutionTable.rollChances(chances, rollData.current.sign, rollData.current.resultat)
|
const rolled = await RdDResolutionTable.rollChances(chances,
|
||||||
|
rollData.current.sign,
|
||||||
|
rollData.current.resultat)
|
||||||
rolled.caracValue = rollData.current.carac.value
|
rolled.caracValue = rollData.current.carac.value
|
||||||
rolled.finalLevel = rollData.current.totaldiff
|
rolled.finalLevel = rollData.current.totaldiff
|
||||||
rolled.bonus = rollData.current.bonus ?? 0
|
rolled.bonus = rollData.current.bonus ?? 0
|
||||||
|
@@ -47,6 +47,7 @@ export class RollPartDefense extends RollPartSelect {
|
|||||||
img: esquive.img,
|
img: esquive.img,
|
||||||
// TODO: carac pour créatures
|
// TODO: carac pour créatures
|
||||||
carac: defenseur.isPersonnage() ? CARACS.DEROBEE : esquive.name,
|
carac: defenseur.isPersonnage() ? CARACS.DEROBEE : esquive.name,
|
||||||
|
verb: "esquive",
|
||||||
comp: esquive
|
comp: esquive
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -61,6 +62,7 @@ export class RollPartDefense extends RollPartSelect {
|
|||||||
img: armeDefense.img,
|
img: armeDefense.img,
|
||||||
// TODO: carac pour créatures
|
// TODO: carac pour créatures
|
||||||
carac: defenseur.isPersonnage() ? CARACS.MELEE : comp.name,
|
carac: defenseur.isPersonnage() ? CARACS.MELEE : comp.name,
|
||||||
|
verb: "pare",
|
||||||
comp: comp,
|
comp: comp,
|
||||||
arme: armeDefense,
|
arme: armeDefense,
|
||||||
forceRequise: armeDefense ? RdDItemArme.valeurMain(armeDefense.system.force ?? 0, RdDItemArme.getMainAttaque(comp)) : 0,
|
forceRequise: armeDefense ? RdDItemArme.valeurMain(armeDefense.system.force ?? 0, RdDItemArme.getMainAttaque(comp)) : 0,
|
||||||
|
@@ -1,5 +1,11 @@
|
|||||||
<div data-passearme="{{passeArme}}">
|
<div data-passearme="{{passeArme}}">
|
||||||
<h4 class="rdd-roll-etotal"><strong>Echec total en attaque</strong></h4>
|
<h4 class="rdd-roll-etotal">Maladresse à l'attaque
|
||||||
|
{{#if rolled.isETotal}}
|
||||||
|
(échec total)
|
||||||
|
{{else}}
|
||||||
|
(échec en demi-surprise)
|
||||||
|
{{/if}}
|
||||||
|
</h4>
|
||||||
<br>
|
<br>
|
||||||
{{#if (eq attacker.type 'personnage')}}
|
{{#if (eq attacker.type 'personnage')}}
|
||||||
{{#unless essais.attaqueChance}}
|
{{#unless essais.attaqueChance}}
|
||||||
|
@@ -2,7 +2,6 @@
|
|||||||
<span {{#if ajustements}}class="tooltip-overflow tooltip-dotted" {{/if}}>
|
<span {{#if ajustements}}class="tooltip-overflow tooltip-dotted" {{/if}}>
|
||||||
<span>
|
<span>
|
||||||
<span>{{rolled.caracValue}} à {{plusMoins rolled.finalLevel}}</span>
|
<span>{{rolled.caracValue}} à {{plusMoins rolled.finalLevel}}</span>
|
||||||
{{log rolled}}
|
|
||||||
{{#if (and rolled.factorHtml (gt rolled.factorHtml 1))}}
|
{{#if (and rolled.factorHtml (gt rolled.factorHtml 1))}}
|
||||||
<span class="rdd-diviseur">×{{{rolled.factorHtml}}}</span>
|
<span class="rdd-diviseur">×{{{rolled.factorHtml}}}</span>
|
||||||
<span>= {{rolled.score}}%</span>
|
<span>= {{rolled.score}}%</span>
|
||||||
|
Reference in New Issue
Block a user