Combat séparé par actions

la classe RdDCombat a pour vocation de gérer les interactions entre
attaques, défenses, ...

Séparation de:
- attaque
- parades
- esquive
- encaisser

gestion des résultats de dés par actions

- _onAttaqueParticuliere
- _onAttaqueNormale
- _onAttaqueEchec
- _onAttaqueEchecTotal
- _onParadeParticuliere
- _onParadeNormale
- _onParadeEchec
- _onParadeEchecTotal
- _onEsquiveParticuliere
- _onEsquiveNormale
- _onEsquiveEchec
- _onEsquiveEchecTotal

Séparation de demiSurprise et de needSignificative

les callbacks des boutons dans le chat sont enregistrés cette classe

Par ailleurs:

- Fix mortel/non-mortel (coche puis décoche restait non-mortel)
- création de classes pour les armes, les compétences
- fix du recul (ne pouvait pas marcher)
This commit is contained in:
2020-12-12 21:58:44 +01:00
parent 59a54b8a90
commit 2bcc1a7ba3
9 changed files with 925 additions and 203 deletions

View File

@ -3,7 +3,8 @@
import { TMRUtility } from "./tmr-utility.js";
import { RdDRollTables } from "./rdd-rolltables.js";
import { ChatUtility } from "./chat-utility.js";
import { Misc } from "./misc.js";
import { RdDItemCompetence } from "./item-competence.js";
import { RdDCombat } from "./rdd-combat.js";
/* -------------------------------------------- */
const level_category = {
@ -634,36 +635,7 @@ export class RdDUtility {
compName = compName.toLowerCase();
return compList.find(item => item.name.toLowerCase() == compName && (item.type =="competence" || item.type == "competencecreature"))
}
/* -------------------------------------------- */
static getArmeCategory( arme )
{
if ( arme.data.competence == undefined) return 'competencecreature';
let compname = arme.data.competence.toLowerCase();
if ( compname.match("hache") ) return "hache";
if ( compname.match("hast") ) return "hast";
if ( compname.match("lance") ) return "lance";
if ( compname.match("bouclier") ) return "bouclier";
if ( compname.match("masse") ) return "masse";
if ( compname.match("fléau") ) return "fleau";
if ( compname.match("epée") ) {
let armename = arme.name.toLowerCase();
if (armename == "dague" || armename.match("gnome") )
return "epee_courte";
}
return "epee_longue";
}
/* -------------------------------------------- */
static isArmeMelee( compName)
{
let comp = compName.toLowerCase();
if (comp.match("epée") || comp.match("épée") || comp.match("hache") || comp.match("fleau") || comp.match("mass") || comp.match("lance") || comp.match("hast") || comp == "dague" || comp=="bouclier")
return true;
return false;
}
/* -------------------------------------------- */
static buildDefenseChatCard( attacker, target, rollData )
{
@ -671,9 +643,9 @@ export class RdDUtility {
let myTarget = target.actor;
let defenseMsg = { title: "Défense en combat",
content: "<strong>"+myTarget.name+"</strong> doit se défendre : <br><span class='chat-card-button-area'>" +
"<a class='chat-card-button' id='encaisser-button' data-attackerid='"+attacker.data._id + "' data-defendertokenid='" + target.data._id + "'>Encaisser !</a></span>",
"<a class='chat-card-button' id='encaisser-button' data-attackerId='"+attacker.data._id + "' data-defenderTokenId='" + target.data._id + "'>Encaisser !</a></span>",
whisper: ChatMessage.getWhisperRecipients( myTarget.name ),
attackerid: attacker.data._id,
attackerId: attacker.data._id,
defenderTokenId: target.data._id,
rollMode: true
};
@ -681,22 +653,22 @@ export class RdDUtility {
if ( rollData.competence.data.categorie == 'melee' || rollData.competence.data.categorie == 'competencecreature') { // Melee attack or creature
let defenderArmes = [];
for (const arme of myTarget.data.items) {
if (arme.type == "arme" && this.isArmeMelee(arme.data.competence)) {
if (arme.type == "arme" && RdDItemCompetence.isCompetenceMelee(arme.data.competence)) {
defenderArmes.push( arme );
defenseMsg.content += "<br><a class='chat-card-button' id='parer-button' data-attackerid='"+attacker.data._id + "' data-defendertokenid='" + target.data._id + "' data-armeid='"+arme._id+"'>Parer avec " + arme.name + "</a></span>";
defenseMsg.content += "<br><a class='chat-card-button' id='parer-button' data-attackerId='"+attacker.data._id + "' data-defenderTokenId='" + target.data._id + "' data-armeid='"+arme._id+"'>Parer avec " + arme.name + "</a></span>";
}
if (arme.type == "competencecreature" && arme.data.isparade) {
defenderArmes.push( arme );
defenseMsg.content += "<br><a class='chat-card-button' id='parer-button' data-attackerid='"+attacker.data._id + "' data-defendertokenid='" + target.data._id + "' data-armeid='"+arme._id+"'>Parer avec " + arme.name + "</a></span>";
defenseMsg.content += "<br><a class='chat-card-button' id='parer-button' data-attackerId='"+attacker.data._id + "' data-defenderTokenId='" + target.data._id + "' data-armeid='"+arme._id+"'>Parer avec " + arme.name + "</a></span>";
}
}
defenseMsg.content += "<br><a class='chat-card-button' id='esquiver-button' data-attackerid='"+attacker.data._id + "' data-defendertokenid='" + target.data._id + "'>Esquiver</a></span>";
defenseMsg.content += "<br><a class='chat-card-button' id='esquiver-button' data-attackerId='"+attacker.data._id + "' data-defenderTokenId='" + target.data._id + "'>Esquiver</a></span>";
}
if ( rollData.competence.data.categorie == "tir" ) {
for (const arme of myTarget.data.items) { // Bouclier for parry
if ( arme.type == "arme" && arme.name.toLowerCase.match("bouclier") ) {
defenderArmes.push( arme );
defenseMsg.content += "<br><a class='chat-card-button' id='parer-button' data-attackerid='"+attacker.data._id + "' data-defendertokenid='" + target.data._id + "' data-armeid='"+arme._id+"'>Parer avec " + arme.name + "</a></span>";
defenseMsg.content += "<br><a class='chat-card-button' id='parer-button' data-attackerId='"+attacker.data._id + "' data-defenderTokenId='" + target.data._id + "' data-armeid='"+arme._id+"'>Parer avec " + arme.name + "</a></span>";
}
}
}
@ -704,10 +676,10 @@ export class RdDUtility {
for (const arme of myTarget.data.items) { // Bouclier for parry Dodge/Esquive
if ( arme.type == "arme" && arme.name.toLowerCase.match("bouclier") ) {
defenderArmes.push( arme );
defenseMsg.content += "<br><a class='chat-card-button' id='parer-button' data-attackerid='"+attacker.data._id + "' data-defendertokenid='" + target.data._id + "' data-armeid='"+arme._id+"'>Parer avec " + arme.name + "</a></span>";
defenseMsg.content += "<br><a class='chat-card-button' id='parer-button' data-attackerId='"+attacker.data._id + "' data-defenderTokenId='" + target.data._id + "' data-armeid='"+arme._id+"'>Parer avec " + arme.name + "</a></span>";
}
}
defenseMsg.content += "<br><a class='chat-card-button' id='esquiver-button' data-attackerid='"+attacker.data._id + "' data-defendertokenid='" + target.data._id + "'>Esquiver</a></span>";
defenseMsg.content += "<br><a class='chat-card-button' id='esquiver-button' data-attackerId='"+attacker.data._id + "' data-defenderTokenId='" + target.data._id + "'>Esquiver</a></span>";
}
defenseMsg.toSocket = true; // True per default for all players
@ -754,7 +726,7 @@ export class RdDUtility {
}
if ((game.user.isGM && !defenderToken.actor.hasPlayerOwner) || (defenderToken.actor.hasPlayerOwner && (game.user.character.id == defenderToken.actor.data._id))) {
console.log("User is pushing message...", game.user.name);
game.system.rdd.rollDataHandler[data.attackerid] = duplicate(data.rollData);
game.system.rdd.rollDataHandler[data.attackerId] = duplicate(data.rollData);
data.whisper = [game.user];
data.blind = true;
data.rollMode = "blindroll";
@ -865,7 +837,7 @@ export class RdDUtility {
/* -------------------------------------------- */
static _handleMsgEncaisser(data) {
if (game.user.isGM) { // Seul le GM effectue l'encaissement sur la fiche
let rollData = game.system.rdd.rollDataHandler[data.attackerid]; // Retrieve the rolldata from the store
let rollData = game.system.rdd.rollDataHandler[data.attackerId]; // Retrieve the rolldata from the store
let defenderToken = canvas.tokens.get(data.defenderTokenId);
defenderToken.actor.encaisserDommages(rollData);
}
@ -874,59 +846,64 @@ export class RdDUtility {
/* -------------------------------------------- */
static async chatListeners( html )
{
RdDCombat.registerChatCallbacks(html);
html.on("click", '#encaisser-button', event => {
event.preventDefault();
let attackerid = event.currentTarget.attributes['data-attackerid'].value;
let defenderTokenId = event.currentTarget.attributes['data-defendertokenid'].value;
if (RdDCombat.isActive()) return;
let attackerId = event.currentTarget.attributes['data-attackerId'].value;
let defenderTokenId = event.currentTarget.attributes['data-defenderTokenId'].value;
if ( game.user.isGM ) { // Current user is the GM -> direct access
let rollData = game.system.rdd.rollDataHandler[attackerid];
rollData.attackerid = attackerid;
let rollData = game.system.rdd.rollDataHandler[attackerId];
rollData.attackerId = attackerId;
rollData.defenderTokenId = defenderTokenId;
let defenderToken = canvas.tokens.get( defenderTokenId );
defenderToken.actor.encaisserDommages( rollData, game.actors.get(attackerid));
defenderToken.actor.encaisserDommages( rollData, game.actors.get(attackerId));
} else { // Emit message for GM
game.socket.emit("system.foundryvtt-reve-de-dragon", {
msg: "msg_encaisser",
data: { attackerid: attackerid, defenderTokenId: defenderTokenId }
data: { attackerId: attackerId, defenderTokenId: defenderTokenId }
} );
}
});
html.on("click", '#parer-button', event => {
event.preventDefault();
let attackerid = event.currentTarget.attributes['data-attackerid'].value;
if (RdDCombat.isActive()) return;
let attackerId = event.currentTarget.attributes['data-attackerId'].value;
let defenderToken = canvas.tokens.get(event.currentTarget.attributes['data-defenderTokenId'].value );
let armeId = event.currentTarget.attributes['data-armeid'].value;
let rollData = game.system.rdd.rollDataHandler[attackerid];
defenderToken.actor.parerAttaque( rollData, armeId, game.actors.get(attackerid));
let rollData = game.system.rdd.rollDataHandler[attackerId];
defenderToken.actor.parerAttaque( rollData, armeId, game.actors.get(attackerId));
});
html.on("click", '#esquiver-button', event => {
event.preventDefault();
let attackerid = event.currentTarget.attributes['data-attackerid'].value;
if (RdDCombat.isActive()) return;
let attackerId = event.currentTarget.attributes['data-attackerId'].value;
let defenderToken = canvas.tokens.get(event.currentTarget.attributes['data-defenderTokenId'].value );
let rollData = game.system.rdd.rollDataHandler[attackerid];
let rollData = game.system.rdd.rollDataHandler[attackerId];
//console.log("Esquive !", rollData, defenderActor);
defenderToken.actor.esquiverAttaque( rollData, game.actors.get(attackerid));
defenderToken.actor.esquiverAttaque( rollData, game.actors.get(attackerId));
});
html.on("click", '#particuliere-attaque', event => {
event.preventDefault();
let attackerid = event.currentTarget.attributes['data-attackerid'].value;
let attackerActor = game.actors.get(event.currentTarget.attributes['data-attackerid'].value );
let rollData = game.system.rdd.rollDataHandler[attackerid];
rollData.particuliereAttaque = game.actors.get(event.currentTarget.attributes['data-mode'].value );
if (RdDCombat.isActive()) return;
let attackerId = event.currentTarget.attributes['data-attackerId'].value;
let attackerActor = game.actors.get(event.currentTarget.attributes['data-attackerId'].value );
let rollData = game.system.rdd.rollDataHandler[attackerId];
rollData.particuliereAttaque = event.currentTarget.attributes['data-mode'].value;
//console.log("Particulère !", rollData);
attackerActor.continueRoll( rollData );
});
html.on("click", '.tmr-passeur-coord a', event => {
let coord = event.currentTarget.attributes['data-tmr-coord'].value;
let actorId = event.currentTarget.attributes['data-actor-id'].value;
let actor = game.actors.get( actorId );
actor.tmrApp.forceDemiRevePosition(coord);
});
}
/* -------------------------------------------- */
@ -942,7 +919,7 @@ export class RdDUtility {
/* -------------------------------------------- */
/* Manage chat commands */
static processChatCommand( commands, content, msg ) {
static processChatCommand( commands, content, msg ) {
// Setup new message's visibility
let rollMode = game.settings.get("core", "rollMode");
if (["gmroll", "blindroll"].includes(rollMode)) msg["whisper"] = ChatMessage.getWhisperRecipients("GM");