|
|
|
@ -11,6 +11,7 @@ import { RdDRollTables } from "./rdd-rolltables.js";
|
|
|
|
|
export class RdDCombat {
|
|
|
|
|
|
|
|
|
|
static init() {
|
|
|
|
|
RdDCombatSettings.onInit();
|
|
|
|
|
this.initStorePasseArmes();
|
|
|
|
|
Hooks.on("updateCombat", (combat, data) => { RdDCombat.onUpdateCombat(combat, data) });
|
|
|
|
|
Hooks.on("preDeleteCombat", (combat, options) => { RdDCombat.onPreDeleteCombat(combat, options); });
|
|
|
|
@ -594,7 +595,6 @@ export class RdDCombat {
|
|
|
|
|
dialog.render(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_prepareParade(attackerRoll, armeParade) {
|
|
|
|
|
const compName = armeParade.data.competence;
|
|
|
|
|
const armeAttaque = attackerRoll.arme;
|
|
|
|
@ -606,7 +606,7 @@ export class RdDCombat {
|
|
|
|
|
competence: this.defender.getCompetence(compName),
|
|
|
|
|
arme: armeParade,
|
|
|
|
|
surprise: this.defender.getSurprise(true),
|
|
|
|
|
needParadeSignificative: RdDItemArme.needParadeSignificative(armeAttaque, armeParade),
|
|
|
|
|
needParadeSignificative: RdDCombatSettings.isUsingCategorieParade() && RdDItemArme.needParadeSignificative(armeAttaque, armeParade),
|
|
|
|
|
needResist: RdDItemArme.needArmeResist(armeAttaque, armeParade),
|
|
|
|
|
carac: this.defender.data.data.carac,
|
|
|
|
|
show: {}
|
|
|
|
@ -632,6 +632,9 @@ export class RdDCombat {
|
|
|
|
|
if (RdDBonus.isDefenseAttaqueFinesse(defenderRoll)) {
|
|
|
|
|
facteurSign *= 2;
|
|
|
|
|
}
|
|
|
|
|
if (!RdDCombatSettings.isUsingTripleSignificative()) {
|
|
|
|
|
facteurSign = Math.min(facteurSign, 4);
|
|
|
|
|
}
|
|
|
|
|
return facteurSign;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -741,6 +744,9 @@ export class RdDCombat {
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
|
async computeDeteriorationArme(rollData) {
|
|
|
|
|
if (!RdDCombatSettings.isUsingResistanceArmeParade()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
const attackerRoll = rollData.attackerRoll;
|
|
|
|
|
// Est-ce une parade normale?
|
|
|
|
|
if (rollData.arme && attackerRoll && !rollData.rolled.isPart) {
|
|
|
|
@ -772,7 +778,7 @@ export class RdDCombat {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Si l'arme de parade n'est pas un bouclier, jet de désarmement (p.132)
|
|
|
|
|
if (resistance > 0 && RdDItemArme.getCategorieParade(rollData.arme) != 'boucliers') {
|
|
|
|
|
if (RdDCombatSettings.isUsingDefenseurDesarme() && resistance > 0 && RdDItemArme.getCategorieParade(rollData.arme) != 'boucliers') {
|
|
|
|
|
let desarme = await RdDResolutionTable.rollData({
|
|
|
|
|
caracValue: this.defender.getForce(),
|
|
|
|
|
finalLevel: Misc.toInt(rollData.competence.data.niveau) - dmg,
|
|
|
|
@ -787,7 +793,7 @@ export class RdDCombat {
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
|
async computeRecul(defenderRoll) { // Calcul du recul (p. 132)
|
|
|
|
|
const attackerRoll = defenderRoll.attackerRoll;
|
|
|
|
|
if (this._isAttaqueCauseRecul(attackerRoll)) {
|
|
|
|
|
if (RdDCombatSettings.isUsingRecul() && this._isAttaqueCauseRecul(attackerRoll)) {
|
|
|
|
|
const impact = this._computeImpactRecul(attackerRoll);
|
|
|
|
|
const rollRecul = await RdDResolutionTable.rollData({ caracValue: 10, finalLevel: impact });
|
|
|
|
|
if (rollRecul.rolled.isSuccess) {
|
|
|
|
@ -909,5 +915,92 @@ export class RdDCombat {
|
|
|
|
|
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-summary.html`, data)
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export class RdDCombatSettings extends FormApplication {
|
|
|
|
|
static onInit() {
|
|
|
|
|
game.settings.register("foundryvtt-reve-de-dragon", "rdd-combat-recul", { name: "rdd-combat-recul", scope: "world", config: false, default: true, type: Boolean });
|
|
|
|
|
game.settings.register("foundryvtt-reve-de-dragon", "rdd-combat-resistanceArmeParade", { name: "rdd-combat-resistanceArmeParade", scope: "world", config: false, default: true, type: Boolean });
|
|
|
|
|
game.settings.register("foundryvtt-reve-de-dragon", "rdd-combat-deteriorationArmure", { name: "rdd-combat-deteriorationArmure", scope: "world", config: false, default: true, type: Boolean });
|
|
|
|
|
game.settings.register("foundryvtt-reve-de-dragon", "rdd-combat-defenseurDesarme", { name: "rdd-combat-defenseurDesarme", scope: "world", config: false, default: true, type: Boolean });
|
|
|
|
|
game.settings.register("foundryvtt-reve-de-dragon", "rdd-combat-categorieParade", { name: "rdd-combat-categorieParade", scope: "world", config: false, default: true, type: Boolean });
|
|
|
|
|
game.settings.register("foundryvtt-reve-de-dragon", "rdd-combat-tripleSignificative", { name: "rdd-combat-tripleSignificative", scope: "world", config: false, default: true, type: Boolean });
|
|
|
|
|
|
|
|
|
|
game.settings.registerMenu("foundryvtt-reve-de-dragon", "rdd-combat-options", {
|
|
|
|
|
name: "Choisir les options de combat",
|
|
|
|
|
label: "Choix des options de combat",
|
|
|
|
|
hint: "Ouvre la fenêtre de sélection des options de combats pour désactiver certaines règles",
|
|
|
|
|
icon: "fas fa-bars",
|
|
|
|
|
type: RdDCombatSettings,
|
|
|
|
|
restricted: true
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
constructor(...args) {
|
|
|
|
|
super(...args);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static get defaultOptions() {
|
|
|
|
|
const options = super.defaultOptions;
|
|
|
|
|
mergeObject(options, {
|
|
|
|
|
id: "combat-settings",
|
|
|
|
|
template: "systems/foundryvtt-reve-de-dragon/templates/combat-settings.html",
|
|
|
|
|
height: 600,
|
|
|
|
|
width: 350,
|
|
|
|
|
minimizable: false,
|
|
|
|
|
closeOnSubmit: true,
|
|
|
|
|
title: "Options de combat"
|
|
|
|
|
});
|
|
|
|
|
return options;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getData() {
|
|
|
|
|
let data = super.getData();
|
|
|
|
|
data.recul = RdDCombatSettings.isUsingRecul();
|
|
|
|
|
data.resistanceArmeParade = RdDCombatSettings.isUsingResistanceArmeParade();
|
|
|
|
|
data.deteriorationArmure = RdDCombatSettings.isUsingDeteriorationArmure();
|
|
|
|
|
data.defenseurDesarme = RdDCombatSettings.isUsingDefenseurDesarme();
|
|
|
|
|
data.categorieParade = RdDCombatSettings.isUsingCategorieParade();
|
|
|
|
|
data.tripleSignificative = RdDCombatSettings.isUsingTripleSignificative();
|
|
|
|
|
return data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static isUsingRecul() {
|
|
|
|
|
return game.settings.get("foundryvtt-reve-de-dragon", "rdd-combat-recul");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static isUsingResistanceArmeParade() {
|
|
|
|
|
return game.settings.get("foundryvtt-reve-de-dragon", "rdd-combat-resistanceArmeParade");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static isUsingDeteriorationArmure() {
|
|
|
|
|
return game.settings.get("foundryvtt-reve-de-dragon", "rdd-combat-deteriorationArmure");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static isUsingDefenseurDesarme() {
|
|
|
|
|
return game.settings.get("foundryvtt-reve-de-dragon", "rdd-combat-defenseurDesarme");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static isUsingCategorieParade() {
|
|
|
|
|
return game.settings.get("foundryvtt-reve-de-dragon", "rdd-combat-categorieParade");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static isUsingTripleSignificative() {
|
|
|
|
|
return game.settings.get("foundryvtt-reve-de-dragon", "rdd-combat-tripleSignificative");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
activateListeners(html) {
|
|
|
|
|
html.find(".select-option").click((event) => {
|
|
|
|
|
if (event.currentTarget.attributes.name) {
|
|
|
|
|
let id = event.currentTarget.attributes.name.value;
|
|
|
|
|
let isChecked = event.currentTarget.checked;
|
|
|
|
|
game.settings.set("foundryvtt-reve-de-dragon", id, isChecked);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async _updateObject(event, formData) {
|
|
|
|
|
this.close();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|