|
|
|
@ -100,14 +100,14 @@ export class RdDCombatManager extends Combat {
|
|
|
|
|
const carac = combatant.actor.data.data.carac[competence.data.defaut_carac].value;
|
|
|
|
|
const niveau = competence.data.niveau;
|
|
|
|
|
const bonusEcaille = (armeCombat?.data.magique) ? armeCombat.data.ecaille_efficacite : 0;
|
|
|
|
|
rollFormula = RdDCombatManager.formuleInitiative(2, carac, niveau, bonusEcaille);
|
|
|
|
|
rollFormula = RdDCombatManager.formuleInitiative(2, carac, niveau, bonusEcaille);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//console.log("Combatat", c);
|
|
|
|
|
const roll = combatant.getInitiativeRoll(rollFormula);
|
|
|
|
|
if ( !roll.total) {
|
|
|
|
|
roll.evaluate( {async: false});
|
|
|
|
|
if (!roll.total) {
|
|
|
|
|
roll.evaluate({ async: false });
|
|
|
|
|
}
|
|
|
|
|
if (roll.total <= 0) roll.total = 0.00;
|
|
|
|
|
console.log("Compute init for", rollFormula, roll.total, combatant);
|
|
|
|
@ -187,7 +187,7 @@ export class RdDCombatManager extends Combat {
|
|
|
|
|
action.data.dommagesReels = Number(tableauDegats[0]);
|
|
|
|
|
arme2main.data.dommagesReels = Number(tableauDegats[1]);
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
else {
|
|
|
|
|
ui.notifications.info("Les dommages de l'arme à 1/2 mains " + action.name + " ne sont pas corrects (ie sous la forme X/Y)");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -197,24 +197,23 @@ export class RdDCombatManager extends Combat {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static listActionsPossessions(actor) {
|
|
|
|
|
return RdDCombatManager._indexActions(actor.getPossessions().map(p =>
|
|
|
|
|
{
|
|
|
|
|
return {
|
|
|
|
|
name: p.name,
|
|
|
|
|
action: 'conjurer',
|
|
|
|
|
data: {
|
|
|
|
|
competence: p.name,
|
|
|
|
|
possessionid: p.data.data.possessionid,
|
|
|
|
|
}
|
|
|
|
|
return RdDCombatManager._indexActions(actor.getPossessions().map(p => {
|
|
|
|
|
return {
|
|
|
|
|
name: p.name,
|
|
|
|
|
action: 'conjurer',
|
|
|
|
|
data: {
|
|
|
|
|
competence: p.name,
|
|
|
|
|
possessionid: p.data.data.possessionid,
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
|
static listActionsCombat(combatant) {
|
|
|
|
|
const actor = combatant.actor;
|
|
|
|
|
let actions = RdDCombatManager.listActionsPossessions(actor);
|
|
|
|
|
if (actions.length>0) {
|
|
|
|
|
if (actions.length > 0) {
|
|
|
|
|
return actions;
|
|
|
|
|
}
|
|
|
|
|
let items = actor.data.items;
|
|
|
|
@ -329,19 +328,19 @@ export class RdDCombatManager extends Combat {
|
|
|
|
|
} else {
|
|
|
|
|
compData = Misc.data(RdDItemCompetence.findCompetence(combatant.actor.data.items, action.data.competence));
|
|
|
|
|
compNiveau = compData.data.niveau;
|
|
|
|
|
initInfo = action.name + " / " + action.data.competence;
|
|
|
|
|
|
|
|
|
|
if (combatant.actor.data.type == 'creature' || combatant.actor.data.type == 'entite') {
|
|
|
|
|
caracForInit = compData.data.carac_value;
|
|
|
|
|
if (compData.data.categorie == "lancer") {
|
|
|
|
|
initOffset = 7;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
initOffset = 5;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
caracForInit = Misc.data(combatant.actor).data.carac[compData.data.defaut_carac].value;
|
|
|
|
|
initOffset = RdDCombatManager._baseInitOffset(compData.data.categorie, action);
|
|
|
|
|
initInfo = action.name + " / " + action.data.competence;
|
|
|
|
|
|
|
|
|
|
if (combatant.actor.data.type == 'creature' || combatant.actor.data.type == 'entite') {
|
|
|
|
|
caracForInit = compData.data.carac_value;
|
|
|
|
|
if (compData.data.categorie == "lancer") {
|
|
|
|
|
initOffset = 7;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
initOffset = 5;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
caracForInit = Misc.data(combatant.actor).data.carac[compData.data.defaut_carac].value;
|
|
|
|
|
initOffset = RdDCombatManager._baseInitOffset(compData.data.categorie, action);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -372,7 +371,7 @@ export class RdDCombatManager extends Combat {
|
|
|
|
|
static displayInitiativeMenu(html, combatantId) {
|
|
|
|
|
console.log("Combatant ; ", combatantId);
|
|
|
|
|
const combatant = game.combat.combatants.get(combatantId);
|
|
|
|
|
if (! (combatant?.actor) ) {
|
|
|
|
|
if (!(combatant?.actor)) {
|
|
|
|
|
ui.notifications.warn(`Le combatant ${combatant.name ?? combatantId} n'est pas associé à un acteur, impossible de déterminer ses actions de combat!`)
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
@ -457,7 +456,7 @@ export class RdDCombat {
|
|
|
|
|
else {
|
|
|
|
|
const defender = target?.actor;
|
|
|
|
|
const defenderTokenId = target?.data._id;
|
|
|
|
|
if ( defender.type == 'entite' && defender.data.data.definition.typeentite == ENTITE_NONINCARNE) {
|
|
|
|
|
if (defender.type == 'entite' && defender.data.data.definition.typeentite == ENTITE_NONINCARNE) {
|
|
|
|
|
ui.notifications.warn("Vous ne pouvez pas cibler une entité non incarnée !!!!");
|
|
|
|
|
} else {
|
|
|
|
|
return this.create(attacker, defender, defenderTokenId, target)
|
|
|
|
@ -567,7 +566,7 @@ export class RdDCombat {
|
|
|
|
|
async onEvent(button, event) {
|
|
|
|
|
const chatMessage = ChatUtility.getChatMessage(event);
|
|
|
|
|
const defenderRoll = ChatUtility.getMessageData(chatMessage, 'defender-roll');
|
|
|
|
|
const attackerRoll = defenderRoll?.attackerRoll ?? ChatUtility.getMessageData(chatMessage, 'attacker-roll') ;
|
|
|
|
|
const attackerRoll = defenderRoll?.attackerRoll ?? ChatUtility.getMessageData(chatMessage, 'attacker-roll');
|
|
|
|
|
console.log('RdDCombat', attackerRoll, defenderRoll);
|
|
|
|
|
const defenderTokenId = event.currentTarget.attributes['data-defenderTokenId']?.value;
|
|
|
|
|
|
|
|
|
@ -760,7 +759,7 @@ export class RdDCombat {
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
|
async _onAttaqueParticuliere(rollData) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const isMeleeDiffNegative = (rollData.competence.type == 'competencecreature' || rollData.selectedCarac.label == "Mêlée") && rollData.diffLibre < 0;
|
|
|
|
|
// force toujours, sauf empoignade
|
|
|
|
|
// finesse seulement en mélée, pour l'empoignade, ou si la difficulté libre est de -1 minimum
|
|
|
|
@ -778,7 +777,7 @@ export class RdDCombat {
|
|
|
|
|
else if (!isForce && !isFinesse && isRapide) {
|
|
|
|
|
return await this.choixParticuliere(rollData, "rapidite");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const choixParticuliere = await ChatMessage.create({
|
|
|
|
|
alias: this.attacker.name,
|
|
|
|
|
whisper: ChatUtility.getWhisperRecipientsAndGMs(this.attacker.name),
|
|
|
|
@ -817,7 +816,7 @@ export class RdDCombat {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
|
isPossession( attackerRoll) {
|
|
|
|
|
isPossession(attackerRoll) {
|
|
|
|
|
return attackerRoll.selectedCarac.label.toLowerCase() == 'possession';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -962,9 +961,8 @@ export class RdDCombat {
|
|
|
|
|
const arme = this.defender.getArmeParade(armeParadeId);
|
|
|
|
|
console.log("RdDCombat.parade >>>", attackerRoll, armeParadeId, arme);
|
|
|
|
|
const competence = Misc.templateData(arme)?.competence;
|
|
|
|
|
if (competence == undefined)
|
|
|
|
|
{
|
|
|
|
|
console.error("Pas de compétence de parade associée à ", arme) ;
|
|
|
|
|
if (competence == undefined) {
|
|
|
|
|
console.error("Pas de compétence de parade associée à ", arme);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1247,6 +1245,8 @@ export class RdDCombat {
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
|
/* retourne true si on peut continuer, false si on ne peut pas continuer */
|
|
|
|
|
async accorderEntite(when = 'avant-encaissement') {
|
|
|
|
|
console.log("TETETET", game.settings.get(SYSTEM_RDD, "accorder-entite-cauchemar"), this.defender.isEntite([ENTITE_INCARNE]), this.defender.isEntiteAccordee(this.attacker))
|
|
|
|
|
|
|
|
|
|
if (when != game.settings.get(SYSTEM_RDD, "accorder-entite-cauchemar")
|
|
|
|
|
|| this.defender == undefined
|
|
|
|
|
|| !this.defender.isEntite([ENTITE_INCARNE])
|
|
|
|
|