Version 12.0.18 - A la barbe d'Astrobazzarh #719
@ -2,6 +2,7 @@
|
|||||||
## 12.0.16 - Le secret d'Astrobazzarh
|
## 12.0.16 - Le secret d'Astrobazzarh
|
||||||
- Fix: les jets envoyés messages uniquement au MJ ne sont plus envoyés à tous les autres joueurs (et dupliqués)
|
- Fix: les jets envoyés messages uniquement au MJ ne sont plus envoyés à tous les autres joueurs (et dupliqués)
|
||||||
- Les noms affichés dans les automatisations de combat sont maintenant ceux des tokens plutôt que ceux des acteurs
|
- Les noms affichés dans les automatisations de combat sont maintenant ceux des tokens plutôt que ceux des acteurs
|
||||||
|
- Ajout d'une option pour la localisation des blessures
|
||||||
|
|
||||||
## 12.0.15 - Le messager d'Astrobazzarh
|
## 12.0.15 - Le messager d'Astrobazzarh
|
||||||
- Correction des faces de dés personalisés dice-so-nice
|
- Correction des faces de dés personalisés dice-so-nice
|
||||||
|
@ -415,41 +415,40 @@ export class RdDBaseActorReve extends RdDBaseActor {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async encaisser() { await RdDEncaisser.encaisser(this) }
|
async encaisser() { await RdDEncaisser.encaisser(this) }
|
||||||
|
|
||||||
async encaisserDommages(rollData, attacker = undefined, show = undefined) {
|
async encaisserDommages(rollData, attacker = undefined, attackerToken = undefined, show = undefined) {
|
||||||
if (attacker && !await attacker.accorder(this, 'avant-encaissement')) {
|
if (attacker && !await attacker.accorder(this, 'avant-encaissement')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const armure = await this.computeArmure(rollData);
|
const armure = await this.computeArmure(rollData);
|
||||||
if (ReglesOptionnelles.isUsing('validation-encaissement-gr')) {
|
if (ReglesOptionnelles.isUsing('validation-encaissement-gr')) {
|
||||||
await this.encaisserDommagesValidationGR(rollData, armure, attacker?.id, show);
|
await this.encaisserDommagesValidationGR(rollData, armure, attackerToken, show);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const jet = await RdDUtility.jetEncaissement(rollData, armure, { showDice: SHOW_DICE });
|
const jet = await RdDUtility.jetEncaissement(this, rollData, armure, { showDice: SHOW_DICE });
|
||||||
await this.$onEncaissement(jet, show, attacker);
|
await this.$onEncaissement(jet, show, attackerToken)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async encaisserDommagesValidationGR(rollData, armure, attackerId, show) {
|
async encaisserDommagesValidationGR(rollData, armure, attackerToken, show) {
|
||||||
if (!game.user.isGM) {
|
if (!game.user.isGM) {
|
||||||
RdDBaseActor.remoteActorCall({
|
RdDBaseActor.remoteActorCall({
|
||||||
tokenId: this.token?.id,
|
tokenId: this.token?.id,
|
||||||
actorId: this.id,
|
actorId: this.id,
|
||||||
method: 'encaisserDommagesValidationGR',
|
method: 'encaisserDommagesValidationGR',
|
||||||
args: [rollData, armure, attackerId, show]
|
args: [rollData, armure, attackerToken, show]
|
||||||
});
|
})
|
||||||
} else {
|
} else {
|
||||||
const attacker = game.actors.get(attackerId);
|
|
||||||
DialogValidationEncaissement.validerEncaissement(this, rollData, armure,
|
DialogValidationEncaissement.validerEncaissement(this, rollData, armure,
|
||||||
jet => this.$onEncaissement(jet, show, attacker));
|
jet => this.$onEncaissement(jet, show, attackerToken));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async $onEncaissement(jet, show, attacker) {
|
async $onEncaissement(jet, show, attackerToken) {
|
||||||
await this.onAppliquerJetEncaissement(jet, attacker);
|
await this.onAppliquerJetEncaissement(jet, attackerToken);
|
||||||
await this.$afficherEncaissement(jet, show);
|
await this.$afficherEncaissement(jet, show);
|
||||||
}
|
}
|
||||||
|
|
||||||
async onAppliquerJetEncaissement(encaissement, attacker) { }
|
async onAppliquerJetEncaissement(encaissement, attackerToken) { }
|
||||||
|
|
||||||
async $afficherEncaissement(encaissement, show) {
|
async $afficherEncaissement(encaissement, show) {
|
||||||
foundry.utils.mergeObject(encaissement, {
|
foundry.utils.mergeObject(encaissement, {
|
||||||
|
@ -89,9 +89,9 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|
||||||
async onAppliquerJetEncaissement(encaissement, attacker) {
|
async onAppliquerJetEncaissement(encaissement, attackerToken) {
|
||||||
const santeOrig = foundry.utils.duplicate(this.system.sante);
|
const santeOrig = foundry.utils.duplicate(this.system.sante);
|
||||||
const blessure = await this.ajouterBlessure(encaissement, attacker); // Will update the result table
|
const blessure = await this.ajouterBlessure(encaissement, attackerToken); // Will update the result table
|
||||||
const perteVie = await this.santeIncDec("vie", -encaissement.vie);
|
const perteVie = await this.santeIncDec("vie", -encaissement.vie);
|
||||||
const perteEndurance = await this.santeIncDec("endurance", -encaissement.endurance, blessure?.isCritique());
|
const perteEndurance = await this.santeIncDec("endurance", -encaissement.endurance, blessure?.isCritique());
|
||||||
|
|
||||||
@ -169,7 +169,7 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
|
|||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async ajouterBlessure(encaissement, attacker = undefined) {
|
async ajouterBlessure(encaissement, attackerToken = undefined) {
|
||||||
if (encaissement.gravite < 0) return;
|
if (encaissement.gravite < 0) return;
|
||||||
if (encaissement.gravite > 0) {
|
if (encaissement.gravite > 0) {
|
||||||
while (this.countBlessures(it => it.system.gravite == encaissement.gravite) >= RdDItemBlessure.maxBlessures(encaissement.gravite) && encaissement.gravite <= 6) {
|
while (this.countBlessures(it => it.system.gravite == encaissement.gravite) >= RdDItemBlessure.maxBlessures(encaissement.gravite) && encaissement.gravite <= 6) {
|
||||||
@ -181,7 +181,7 @@ export class RdDBaseActorSang extends RdDBaseActorReve {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
const endActuelle = this.getEnduranceActuelle();
|
const endActuelle = this.getEnduranceActuelle();
|
||||||
const blessure = await RdDItemBlessure.createBlessure(this, encaissement.gravite, encaissement.dmg?.loc.label ?? '', attacker);
|
const blessure = await RdDItemBlessure.createBlessure(this, encaissement.gravite, encaissement.dmg?.loc.label ?? '', attackerToken);
|
||||||
if (blessure.isCritique()) {
|
if (blessure.isCritique()) {
|
||||||
encaissement.endurance = endActuelle;
|
encaissement.endurance = endActuelle;
|
||||||
}
|
}
|
||||||
|
@ -74,7 +74,7 @@ export class RdDEntite extends RdDBaseActorReve {
|
|||||||
return [STATUSES.StatusComma].includes(effectId);
|
return [STATUSES.StatusComma].includes(effectId);
|
||||||
}
|
}
|
||||||
|
|
||||||
async onAppliquerJetEncaissement(encaissement, attacker) {
|
async onAppliquerJetEncaissement(encaissement, attackerToken) {
|
||||||
const perteEndurance = await this.santeIncDec("endurance", -encaissement.endurance);
|
const perteEndurance = await this.santeIncDec("endurance", -encaissement.endurance);
|
||||||
foundry.utils.mergeObject(encaissement, {
|
foundry.utils.mergeObject(encaissement, {
|
||||||
resteEndurance: perteEndurance.newValue,
|
resteEndurance: perteEndurance.newValue,
|
||||||
|
@ -8,14 +8,13 @@ import { RdDUtility } from "./rdd-utility.js";
|
|||||||
export class DialogValidationEncaissement extends Dialog {
|
export class DialogValidationEncaissement extends Dialog {
|
||||||
|
|
||||||
static async validerEncaissement(actor, rollData, armure, onEncaisser) {
|
static async validerEncaissement(actor, rollData, armure, onEncaisser) {
|
||||||
let encaissement = await RdDUtility.jetEncaissement(rollData, armure, { showDice: HIDE_DICE });
|
const encaissement = await RdDUtility.jetEncaissement(actor, rollData, armure, { showDice: HIDE_DICE });
|
||||||
const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-validation-encaissement.html', {
|
const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-validation-encaissement.html', {
|
||||||
actor: actor,
|
actor: actor,
|
||||||
rollData: rollData,
|
rollData: rollData,
|
||||||
encaissement: encaissement
|
encaissement: encaissement
|
||||||
});
|
});
|
||||||
const dialog = new DialogValidationEncaissement(html, actor, rollData, armure, encaissement, onEncaisser);
|
new DialogValidationEncaissement(html, actor, rollData, armure, encaissement, onEncaisser).render(true);
|
||||||
dialog.render(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -56,14 +55,14 @@ export class DialogValidationEncaissement extends Dialog {
|
|||||||
this.html = html;
|
this.html = html;
|
||||||
this.html.find('input.encaissement-roll-result').keyup(async event => {
|
this.html.find('input.encaissement-roll-result').keyup(async event => {
|
||||||
this.forceDiceResult.total = event.currentTarget.value;
|
this.forceDiceResult.total = event.currentTarget.value;
|
||||||
this.encaissement = await RdDUtility.jetEncaissement(this.rollData, this.armure, { showDice: HIDE_DICE, forceDiceResult: this.forceDiceResult});
|
this.encaissement = await RdDUtility.jetEncaissement(this.actor, this.rollData, this.armure, { showDice: HIDE_DICE, forceDiceResult: this.forceDiceResult});
|
||||||
this.html.find('label.encaissement-total').text(this.encaissement.total);
|
this.html.find('label.encaissement-total').text(this.encaissement.total);
|
||||||
this.html.find('label.encaissement-blessure').text(this.encaissement.blessures)
|
this.html.find('label.encaissement-blessure').text(this.encaissement.blessures)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async onValider() {
|
async onValider() {
|
||||||
this.encaissement = await RdDUtility.jetEncaissement(this.rollData, this.armure, { showDice: SHOW_DICE, forceDiceResult: this.forceDiceResult});
|
this.encaissement = await RdDUtility.jetEncaissement(this.actor, this.rollData, this.armure, { showDice: SHOW_DICE, forceDiceResult: this.forceDiceResult});
|
||||||
this.onEncaisser(this.encaissement)
|
this.onEncaisser(this.encaissement)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -496,24 +496,24 @@ export class RdDCombat {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static onMsgEncaisser(msg) {
|
static onMsgEncaisser(msg) {
|
||||||
let defender = canvas.tokens.get(msg.defenderTokenId).actor;
|
|
||||||
if (Misc.isOwnerPlayerOrUniqueConnectedGM()) {
|
if (Misc.isOwnerPlayerOrUniqueConnectedGM()) {
|
||||||
let attackerRoll = msg.attackerRoll;
|
let attackerRoll = msg.attackerRoll;
|
||||||
let attacker = msg.attackerId ? game.actors.get(msg.attackerId) : undefined;
|
let attacker = msg.attackerId ? game.actors.get(msg.attackerId) : undefined;
|
||||||
|
let defender = canvas.tokens.get(msg.defenderToken.id).actor;
|
||||||
|
|
||||||
defender.encaisserDommages(attackerRoll, attacker);
|
defender.encaisserDommages(attackerRoll, attacker, msg.attackerToken);
|
||||||
const rddCombat = RdDCombat.rddCombatForAttackerAndDefender(msg.attackerId, msg.attackerTokenId, msg.defenderTokenId);
|
const rddCombat = RdDCombat.rddCombatForAttackerAndDefender(msg.attackerId, msg.attackerToken.id, msg.defenderToken.id);
|
||||||
rddCombat?.removeChatMessageActionsPasseArme(attackerRoll.passeArme);
|
rddCombat?.removeChatMessageActionsPasseArme(attackerRoll.passeArme);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static onMsgDefense(msg) {
|
static onMsgDefense(msg) {
|
||||||
let defenderToken = canvas.tokens.get(msg.defenderTokenId);
|
let defenderToken = canvas.tokens.get(msg.defenderToken.id)
|
||||||
if (defenderToken && Misc.isFirstConnectedGM()) {
|
if (defenderToken && Misc.isFirstConnectedGM()) {
|
||||||
const rddCombat = RdDCombat.rddCombatForAttackerAndDefender(msg.attackerId, msg.attackerTokenId, msg.defenderTokenId);
|
const rddCombat = RdDCombat.rddCombatForAttackerAndDefender(msg.attackerId, msg.attackerToken.id, msg.defenderToken.id)
|
||||||
rddCombat?.removeChatMessageActionsPasseArme(msg.defenderRoll.passeArme);
|
rddCombat?.removeChatMessageActionsPasseArme(msg.defenderRoll.passeArme)
|
||||||
rddCombat?._chatMessageDefense(msg.paramChatDefense, msg.defenderRoll);
|
rddCombat?._chatMessageDefense(msg.paramChatDefense, msg.defenderRoll)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -568,19 +568,21 @@ export class RdDCombat {
|
|||||||
this.defenderId = this.defender.id
|
this.defenderId = this.defender.id
|
||||||
this.attackerTokenId = attackerTokenId
|
this.attackerTokenId = attackerTokenId
|
||||||
this.defenderTokenId = defenderTokenId
|
this.defenderTokenId = defenderTokenId
|
||||||
|
this.attackerToken = RdDCombat.$extractAttackerTokenData(attacker, attackerTokenId)
|
||||||
|
this.defenderToken = RdDCombat.$extractDefenderTokenData(defender, defenderTokenId, target)
|
||||||
}
|
}
|
||||||
|
|
||||||
_extractDefenderTokenData() {
|
static $extractAttackerTokenData(attacker, attackerTokenId) {
|
||||||
if (this.target) {
|
const token = canvas.tokens.get(attackerTokenId);
|
||||||
return Targets.extractTokenData(this.target)
|
return token ? Targets.extractTokenData(token) : Targets.buildActorTokenData(attackerTokenId, attacker)
|
||||||
|
}
|
||||||
|
|
||||||
|
static $extractDefenderTokenData(defender, defenderTokenId, target) {
|
||||||
|
if (target) {
|
||||||
|
return Targets.extractTokenData(target)
|
||||||
}
|
}
|
||||||
const token = canvas.tokens.get(this.defenderTokenId);
|
const token = canvas.tokens.get(defenderTokenId);
|
||||||
return token ? Targets.extractTokenData(token) : Targets.buildActorTokenData(this.defenderTokenId, this.defender)
|
return token ? Targets.extractTokenData(token) : Targets.buildActorTokenData(defenderTokenId, defender)
|
||||||
}
|
|
||||||
|
|
||||||
_extractAttackerTokenData(){
|
|
||||||
const token = canvas.tokens.get(this.attackerTokenId);
|
|
||||||
return token ? Targets.extractTokenData(token) : Targets.buildActorTokenData(this.attackerTokenId, this.attacker)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -590,7 +592,6 @@ export class RdDCombat {
|
|||||||
const defenderRoll = ChatUtility.getMessageData(chatMessage, 'defender-roll');
|
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);
|
console.log('RdDCombat', attackerRoll, defenderRoll);
|
||||||
const defenderTokenId = event.currentTarget.attributes['data-defenderTokenId']?.value;
|
|
||||||
|
|
||||||
const armeParadeId = event.currentTarget.attributes['data-armeid']?.value;
|
const armeParadeId = event.currentTarget.attributes['data-armeid']?.value;
|
||||||
const competence = event.currentTarget.attributes['data-competence']?.value;
|
const competence = event.currentTarget.attributes['data-competence']?.value;
|
||||||
@ -600,7 +601,7 @@ export class RdDCombat {
|
|||||||
case '#particuliere-attaque': return await this.choixParticuliere(attackerRoll, event.currentTarget.attributes['data-mode'].value);
|
case '#particuliere-attaque': return await this.choixParticuliere(attackerRoll, event.currentTarget.attributes['data-mode'].value);
|
||||||
case '#parer-button': return this.parade(attackerRoll, armeParadeId);
|
case '#parer-button': return this.parade(attackerRoll, armeParadeId);
|
||||||
case '#esquiver-button': return this.esquive(attackerRoll, compId, competence);
|
case '#esquiver-button': return this.esquive(attackerRoll, compId, competence);
|
||||||
case '#encaisser-button': return this.encaisser(attackerRoll, defenderRoll, defenderTokenId);
|
case '#encaisser-button': return this.encaisser(attackerRoll, defenderRoll);
|
||||||
case '#echec-total-attaque': return this._onEchecTotal(attackerRoll);
|
case '#echec-total-attaque': return this._onEchecTotal(attackerRoll);
|
||||||
|
|
||||||
case '#appel-chance-attaque': return this.attacker.rollAppelChance(
|
case '#appel-chance-attaque': return this.attacker.rollAppelChance(
|
||||||
@ -717,7 +718,7 @@ export class RdDCombat {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const defenderToken = canvas.tokens.get(this.defenderTokenId);
|
const defenderToken = canvas.tokens.get(this.defenderTokenId)
|
||||||
const dist = this.distance(_token, defenderToken)
|
const dist = this.distance(_token, defenderToken)
|
||||||
const isVisible = this.isVisible(_token, defenderToken)
|
const isVisible = this.isVisible(_token, defenderToken)
|
||||||
const portee = this._ajustementPortee(dist, rollData.arme)
|
const portee = this._ajustementPortee(dist, rollData.arme)
|
||||||
@ -813,16 +814,15 @@ export class RdDCombat {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_prepareAttaque(competence, arme) {
|
_prepareAttaque(competence, arme) {
|
||||||
const sourceToken = this._extractAttackerTokenData();
|
|
||||||
let rollData = {
|
let rollData = {
|
||||||
alias: sourceToken.name,
|
alias: this.attackerToken.name,
|
||||||
passeArme: foundry.utils.randomID(16),
|
passeArme: foundry.utils.randomID(16),
|
||||||
mortalite: arme?.system.mortalite,
|
mortalite: arme?.system.mortalite,
|
||||||
competence: competence,
|
competence: competence,
|
||||||
surprise: this.attacker.getSurprise(true),
|
surprise: this.attacker.getSurprise(true),
|
||||||
surpriseDefenseur: this.defender.getSurprise(true),
|
surpriseDefenseur: this.defender.getSurprise(true),
|
||||||
sourceToken: sourceToken,
|
sourceToken: this.attackerToken,
|
||||||
targetToken: this._extractDefenderTokenData(),
|
targetToken: this.defenderToken,
|
||||||
essais: {}
|
essais: {}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -867,10 +867,10 @@ export class RdDCombat {
|
|||||||
alias: this.attacker.name,
|
alias: this.attacker.name,
|
||||||
whisper: ChatUtility.getOwners(this.attacker),
|
whisper: ChatUtility.getOwners(this.attacker),
|
||||||
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-particuliere.html', {
|
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-particuliere.html', {
|
||||||
alias: this.attacker.name,
|
alias: this.attackerToken.name,
|
||||||
attackerId: this.attackerId,
|
attackerId: this.attackerId,
|
||||||
attackerToken: this._extractAttackerTokenData(),
|
attackerToken: this.attackerToken,
|
||||||
defenderToken: this._extractDefenderTokenData(),
|
defenderToken: this.defenderToken,
|
||||||
isForce: isForce,
|
isForce: isForce,
|
||||||
isFinesse: isFinesse,
|
isFinesse: isFinesse,
|
||||||
isRapide: isRapide,
|
isRapide: isRapide,
|
||||||
@ -920,7 +920,6 @@ export class RdDCombat {
|
|||||||
const esquives = foundry.utils.duplicate(this.defender.getCompetencesEsquive())
|
const esquives = foundry.utils.duplicate(this.defender.getCompetencesEsquive())
|
||||||
esquives.forEach(e => e.system.nbUsage = e?._id ? this.defender.getItemUse(e._id) : 0);
|
esquives.forEach(e => e.system.nbUsage = e?._id ? this.defender.getItemUse(e._id) : 0);
|
||||||
|
|
||||||
|
|
||||||
const paramChatDefense = {
|
const paramChatDefense = {
|
||||||
passeArme: attackerRoll.passeArme,
|
passeArme: attackerRoll.passeArme,
|
||||||
essais: attackerRoll.essais,
|
essais: attackerRoll.essais,
|
||||||
@ -929,8 +928,8 @@ export class RdDCombat {
|
|||||||
attacker: this.attacker,
|
attacker: this.attacker,
|
||||||
attackerId: this.attackerId,
|
attackerId: this.attackerId,
|
||||||
esquives: esquives,
|
esquives: esquives,
|
||||||
attackerToken: this._extractAttackerTokenData(),
|
attackerToken: this.attackerToken,
|
||||||
defenderToken: this._extractDefenderTokenData(),
|
defenderToken: this.defenderToken,
|
||||||
mainsNues: attackerRoll.dmg.mortalite != 'mortel' && corpsACorps,
|
mainsNues: attackerRoll.dmg.mortalite != 'mortel' && corpsACorps,
|
||||||
armes: this._filterArmesParade(this.defender, attackerRoll.competence, attackerRoll.arme),
|
armes: this._filterArmesParade(this.defender, attackerRoll.competence, attackerRoll.arme),
|
||||||
diffLibre: attackerRoll.ajustements?.diffLibre?.value ?? 0,
|
diffLibre: attackerRoll.ajustements?.diffLibre?.value ?? 0,
|
||||||
@ -954,7 +953,7 @@ export class RdDCombat {
|
|||||||
const choixDefense = await ChatMessage.create({
|
const choixDefense = await ChatMessage.create({
|
||||||
// message privé: du défenseur à lui même (et aux GMs)
|
// message privé: du défenseur à lui même (et aux GMs)
|
||||||
speaker: ChatMessage.getSpeaker(this.defender, canvas.tokens.get(this.defenderTokenId)),
|
speaker: ChatMessage.getSpeaker(this.defender, canvas.tokens.get(this.defenderTokenId)),
|
||||||
alias: this.attacker.name,
|
alias: this.attackerToken.name,
|
||||||
whisper: ChatUtility.getOwners(this.defender),
|
whisper: ChatUtility.getOwners(this.defender),
|
||||||
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-defense.html', paramDemandeDefense),
|
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-defense.html', paramDemandeDefense),
|
||||||
});
|
});
|
||||||
@ -968,9 +967,9 @@ export class RdDCombat {
|
|||||||
game.socket.emit(SYSTEM_SOCKET_ID, {
|
game.socket.emit(SYSTEM_SOCKET_ID, {
|
||||||
msg: "msg_defense", data: {
|
msg: "msg_defense", data: {
|
||||||
attackerId: this.attacker?.id,
|
attackerId: this.attacker?.id,
|
||||||
attackerTokenId: this.attackerTokenId,
|
attackerToken: this.attackerToken,
|
||||||
defenderId: this.defender?.id,
|
defenderId: this.defender?.id,
|
||||||
defenderTokenId: this.defenderTokenId,
|
defenderToken: this.defenderToken,
|
||||||
defenderRoll: defenderRoll,
|
defenderRoll: defenderRoll,
|
||||||
paramChatDefense: paramChatDefense,
|
paramChatDefense: paramChatDefense,
|
||||||
rollMode: true
|
rollMode: true
|
||||||
@ -1003,8 +1002,8 @@ export class RdDCombat {
|
|||||||
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-etotal.html', {
|
content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-etotal.html', {
|
||||||
attackerId: this.attackerId,
|
attackerId: this.attackerId,
|
||||||
attacker: this.attacker,
|
attacker: this.attacker,
|
||||||
attackerToken: this._extractAttackerTokenData(),
|
attackerToken: this.attackerToken,
|
||||||
defenderToken: this._extractDefenderTokenData(),
|
defenderToken: this.defenderToken,
|
||||||
essais: attackerRoll.essais
|
essais: attackerRoll.essais
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
@ -1075,13 +1074,12 @@ export class RdDCombat {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_prepareParade(attackerRoll, armeParade, competenceParade) {
|
_prepareParade(attackerRoll, armeParade, competenceParade) {
|
||||||
const defenderToken = this._extractDefenderTokenData()
|
|
||||||
let defenderRoll = {
|
let defenderRoll = {
|
||||||
alias: defenderToken?.name,
|
alias: this.defenderToken?.name,
|
||||||
passeArme: attackerRoll.passeArme,
|
passeArme: attackerRoll.passeArme,
|
||||||
diffLibre: attackerRoll.diffLibre,
|
diffLibre: attackerRoll.diffLibre,
|
||||||
attackerToken: this._extractAttackerTokenData(),
|
attackerToken: this.attackerToken,
|
||||||
defenderToken: defenderToken,
|
defenderToken: this.defenderToken,
|
||||||
attackerRoll: attackerRoll,
|
attackerRoll: attackerRoll,
|
||||||
competence: this.defender.getCompetence(competenceParade),
|
competence: this.defender.getCompetence(competenceParade),
|
||||||
arme: armeParade,
|
arme: armeParade,
|
||||||
@ -1160,13 +1158,12 @@ export class RdDCombat {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_prepareEsquive(attackerRoll, competence) {
|
_prepareEsquive(attackerRoll, competence) {
|
||||||
const defenderToken= this._extractDefenderTokenData()
|
|
||||||
let rollData = {
|
let rollData = {
|
||||||
alias: defenderToken?.name,
|
alias: this.defenderToken?.name,
|
||||||
passeArme: attackerRoll.passeArme,
|
passeArme: attackerRoll.passeArme,
|
||||||
diffLibre: attackerRoll.diffLibre,
|
diffLibre: attackerRoll.diffLibre,
|
||||||
attackerToken: this._extractAttackerTokenData(),
|
attackerToken: this.attackerToken,
|
||||||
defenderToken: defenderToken,
|
defenderToken: this.defenderToken,
|
||||||
attackerRoll: attackerRoll,
|
attackerRoll: attackerRoll,
|
||||||
competence: competence,
|
competence: competence,
|
||||||
surprise: this.defender.getSurprise(true),
|
surprise: this.defender.getSurprise(true),
|
||||||
@ -1308,9 +1305,8 @@ export class RdDCombat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async encaisser(attackerRoll, defenderRoll, defenderTokenId) {
|
async encaisser(attackerRoll, defenderRoll) {
|
||||||
defenderTokenId = defenderTokenId || this.defenderTokenId;
|
console.log("RdDCombat.encaisser >>>", attackerRoll, defenderRoll);
|
||||||
console.log("RdDCombat.encaisser >>>", attackerRoll, defenderTokenId);
|
|
||||||
|
|
||||||
if (defenderRoll?.rolled && RdDCombat.isEchecTotal(defenderRoll)) {
|
if (defenderRoll?.rolled && RdDCombat.isEchecTotal(defenderRoll)) {
|
||||||
this._onEchecTotal(defenderRoll);
|
this._onEchecTotal(defenderRoll);
|
||||||
@ -1318,19 +1314,19 @@ export class RdDCombat {
|
|||||||
|
|
||||||
if (Misc.isOwnerPlayerOrUniqueConnectedGM(this.defender)) {
|
if (Misc.isOwnerPlayerOrUniqueConnectedGM(this.defender)) {
|
||||||
attackerRoll.attackerId = this.attackerId;
|
attackerRoll.attackerId = this.attackerId;
|
||||||
attackerRoll.defenderTokenId = defenderTokenId;
|
attackerRoll.defenderTokenId = this.defenderToken.id;
|
||||||
|
|
||||||
await this.computeRecul(defenderRoll);
|
await this.computeRecul(defenderRoll);
|
||||||
await this.defender.encaisserDommages(attackerRoll, this.attacker, defenderRoll?.show);
|
await this.defender.encaisserDommages(attackerRoll, this.attacker, this.attackerToken, defenderRoll?.show);
|
||||||
}
|
}
|
||||||
else { // envoi à un GM: les joueurs n'ont pas le droit de modifier les personnages qu'ils ne possèdent pas
|
else { // envoi à un GM: les joueurs n'ont pas le droit de modifier les personnages qu'ils ne possèdent pas
|
||||||
game.socket.emit(SYSTEM_SOCKET_ID, {
|
game.socket.emit(SYSTEM_SOCKET_ID, {
|
||||||
msg: "msg_encaisser",
|
msg: "msg_encaisser",
|
||||||
data: {
|
data: {
|
||||||
attackerId: this.attackerId,
|
attackerId: this.attackerId,
|
||||||
attackerTokenId: this.attackerTokenId,
|
attackerRoll: attackerRoll,
|
||||||
defenderTokenId: defenderTokenId,
|
attackerToken: this.attackerToken,
|
||||||
attackerRoll: attackerRoll
|
defenderToken: this.defenderToken
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -1354,12 +1350,12 @@ export class RdDCombat {
|
|||||||
}
|
}
|
||||||
await ChatMessage.create({
|
await ChatMessage.create({
|
||||||
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-acteur.hbs`, formData),
|
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-acteur.hbs`, formData),
|
||||||
alias: actor.name
|
alias: token.name ?? actor.name
|
||||||
})
|
})
|
||||||
await ChatMessage.create({
|
await ChatMessage.create({
|
||||||
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-sante.hbs`, formData),
|
content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-sante.hbs`, formData),
|
||||||
whisper: ChatUtility.getOwners(actor),
|
whisper: ChatUtility.getOwners(actor),
|
||||||
alias: actor.name
|
alias: token.name ?? actor.name
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -72,6 +72,6 @@ export class RdDEncaisser extends Dialog {
|
|||||||
encaisserSpecial: this.encaisserSpecial,
|
encaisserSpecial: this.encaisserSpecial,
|
||||||
mortalite: mortalite
|
mortalite: mortalite
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -563,14 +563,14 @@ export class RdDUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async jetEncaissement(rollData, armure, options = { showDice: HIDE_DICE }) {
|
static async jetEncaissement(actor, rollData, armure, options = { showDice: HIDE_DICE }) {
|
||||||
const diff = Math.abs(rollData.diffLibre);
|
const diff = Math.abs(rollData.diffLibre);
|
||||||
let formula = RdDUtility.formuleEncaissement(diff, options)
|
let formula = RdDUtility.formuleEncaissement(diff, options)
|
||||||
const roll = await RdDDice.roll(formula, options);
|
const roll = await RdDDice.roll(formula, options);
|
||||||
|
|
||||||
RdDUtility.remplaceDeMinParDifficulte(roll, diff, options);
|
RdDUtility.remplaceDeMinParDifficulte(roll, diff, options);
|
||||||
|
|
||||||
return await RdDUtility.prepareEncaissement(rollData, roll, armure);
|
return await RdDUtility.prepareEncaissement(actor, rollData, roll, armure);
|
||||||
}
|
}
|
||||||
|
|
||||||
static remplaceDeMinParDifficulte(roll, diff, options) {
|
static remplaceDeMinParDifficulte(roll, diff, options) {
|
||||||
@ -602,15 +602,20 @@ export class RdDUtility {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async prepareEncaissement(rollData, roll, armure) {
|
static async prepareEncaissement(actor, rollData, roll, armure) {
|
||||||
// La difficulté d'ataque s'ajoute aux dégâts
|
// La difficulté d'ataque s'ajoute aux dégâts
|
||||||
const bonusDegatsDiffLibre = ReglesOptionnelles.isUsing('degat-ajout-malus-libre') ? Math.abs(rollData.diffLibre ?? 0) : 0
|
const bonusDegatsDiffLibre = ReglesOptionnelles.isUsing('degat-ajout-malus-libre') ? Math.abs(rollData.diffLibre ?? 0) : 0
|
||||||
const jetTotal = roll.total + rollData.dmg.total - armure + bonusDegatsDiffLibre
|
const jetTotal = roll.total + rollData.dmg.total - armure + bonusDegatsDiffLibre
|
||||||
const encaissement = RdDUtility._selectEncaissement(jetTotal, rollData.dmg.mortalite);
|
const encaissement = RdDUtility._selectEncaissement(jetTotal, rollData.dmg.mortalite);
|
||||||
const over20 = Math.max(jetTotal - 20, 0);
|
const over20 = Math.max(jetTotal - 20, 0);
|
||||||
encaissement.dmg = rollData.dmg;
|
encaissement.dmg = rollData.dmg
|
||||||
encaissement.dmg.loc = rollData.dmg.loc ?? await RdDUtility.getLocalisation(this.type);
|
if (ReglesOptionnelles.isUsing('localisation-aleatoire')){
|
||||||
encaissement.dmg.loc.label = encaissement.dmg.loc.label ?? 'Corps;';
|
encaissement.dmg.loc = rollData.dmg.loc ?? await RdDUtility.getLocalisation(actor.type)
|
||||||
|
encaissement.dmg.loc.label = encaissement.dmg.loc.label ?? 'Corps;'
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
encaissement.dmg.loc = {label:''}
|
||||||
|
}
|
||||||
encaissement.dmg.bonusDegatsDiffLibre = bonusDegatsDiffLibre
|
encaissement.dmg.bonusDegatsDiffLibre = bonusDegatsDiffLibre
|
||||||
encaissement.roll = roll;
|
encaissement.roll = roll;
|
||||||
encaissement.armure = armure;
|
encaissement.armure = armure;
|
||||||
|
@ -11,6 +11,7 @@ const listeReglesOptionnelles = [
|
|||||||
{ group: 'Récupération', name: 'recuperation-moral', descr: "Le moral revient vers 0 durant Château Dormant"},
|
{ group: 'Récupération', name: 'recuperation-moral', descr: "Le moral revient vers 0 durant Château Dormant"},
|
||||||
|
|
||||||
|
|
||||||
|
{ group: 'Règles de combat', name: 'localisation-aleatoire', descr: "Proposer une localisation aléatoire des blessures" },
|
||||||
{ group: 'Règles de combat', name: 'recul', descr: "Appliquer le recul en cas de particulière en force ou de charge" },
|
{ group: 'Règles de combat', name: 'recul', descr: "Appliquer le recul en cas de particulière en force ou de charge" },
|
||||||
{ group: 'Règles de combat', name: 'resistanceArmeParade', descr: "Faire le jet de résistance des armes lors de parades pouvant les endommager" },
|
{ group: 'Règles de combat', name: 'resistanceArmeParade', descr: "Faire le jet de résistance des armes lors de parades pouvant les endommager" },
|
||||||
{ group: 'Règles de combat', name: 'deteriorationArmure', descr: "Tenir compte de la détérioration des armures" },
|
{ group: 'Règles de combat', name: 'deteriorationArmure', descr: "Tenir compte de la détérioration des armures" },
|
||||||
|
Loading…
Reference in New Issue
Block a user