Version 12.0.18 - A la barbe d'Astrobazzarh #719
@ -1,6 +1,7 @@
|
|||||||
# 12.0
|
# 12.0
|
||||||
## 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
|
||||||
|
|
||||||
## 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
|
||||||
|
@ -220,18 +220,18 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
|
|||||||
// Points de reve actuel
|
// Points de reve actuel
|
||||||
this.html.find('.roll-reve-actuel').click(async event => this.actor.rollCarac('reve-actuel', true))
|
this.html.find('.roll-reve-actuel').click(async event => this.actor.rollCarac('reve-actuel', true))
|
||||||
this.html.find('.empoignade-label a').click(async event => RdDEmpoignade.onAttaqueEmpoignadeFromItem(RdDSheetUtility.getItem(event, this.actor)))
|
this.html.find('.empoignade-label a').click(async event => RdDEmpoignade.onAttaqueEmpoignadeFromItem(RdDSheetUtility.getItem(event, this.actor)))
|
||||||
this.html.find('.roll-arme').click(async event => this.actor.rollArme(foundry.utils.duplicate(this._getEventArmeCombat(event))))
|
|
||||||
|
this.html.find('.roll-arme').click(async event => this.actor.rollArme(foundry.utils.duplicate(this._getEventArmeCombat(event)), 'competence'))
|
||||||
|
|
||||||
// Initiative pour l'arme
|
// Initiative pour l'arme
|
||||||
this.html.find('.arme-initiative a').click(async event => {
|
this.html.find('.arme-initiative a').click(async event => {
|
||||||
let combatant = game.combat.combatants.find(c => c.actor.id == this.actor.id);
|
let combatant = game.combat.combatants.find(c => c.actor.id == this.actor.id)
|
||||||
if (combatant) {
|
if (combatant) {
|
||||||
let action = this._getEventArmeCombat(event);
|
RdDCombatManager.rollInitiativeAction(combatant._id, this._getEventArmeCombat(event));
|
||||||
RdDCombatManager.rollInitiativeAction(combatant._id, action);
|
|
||||||
} else {
|
} else {
|
||||||
ui.notifications.info("Impossible de lancer l'initiative sans être dans un combat.");
|
ui.notifications.info("Impossible de lancer l'initiative sans être dans un combat.");
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
// Display TMR
|
// Display TMR
|
||||||
|
|
||||||
this.html.find('.button-tmr').click(async event => this.actor.displayTMR("normal"))
|
this.html.find('.button-tmr').click(async event => this.actor.displayTMR("normal"))
|
||||||
|
@ -327,14 +327,15 @@ export class RdDBaseActorReve extends RdDBaseActor {
|
|||||||
const competence = this.getCompetence(idOrName);
|
const competence = this.getCompetence(idOrName);
|
||||||
let rollData = { carac: this.system.carac, competence: competence, arme: options.arme }
|
let rollData = { carac: this.system.carac, competence: competence, arme: options.arme }
|
||||||
if (competence.type == ITEM_TYPES.competencecreature) {
|
if (competence.type == ITEM_TYPES.competencecreature) {
|
||||||
|
const token = RdDUtility.getSelectedToken(this)
|
||||||
const arme = RdDItemCompetenceCreature.armeCreature(competence)
|
const arme = RdDItemCompetenceCreature.armeCreature(competence)
|
||||||
if (arme && options.tryTarget && Targets.hasTargets()) {
|
if (arme && options.tryTarget && Targets.hasTargets()) {
|
||||||
Targets.selectOneToken(target => {
|
Targets.selectOneTargetToken(target => {
|
||||||
if (arme.action == "possession") {
|
if (arme.action == "possession") {
|
||||||
RdDPossession.onAttaquePossession(target, this, competence)
|
RdDPossession.onAttaquePossession(target, this, competence)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
RdDCombat.rddCombatTarget(target, this).attaque(competence, arme)
|
RdDCombat.rddCombatTarget(target, this, token).attaque(competence, arme)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
@ -364,7 +365,8 @@ export class RdDBaseActorReve extends RdDBaseActor {
|
|||||||
* @param {*} categorieArme catégorie d'attaque à utiliser: competence (== melee), lancer, tir; naturelle, possession
|
* @param {*} categorieArme catégorie d'attaque à utiliser: competence (== melee), lancer, tir; naturelle, possession
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
rollArme(arme, categorieArme = "competence") {
|
rollArme(arme, categorieArme, token) {
|
||||||
|
token = token ?? RdDUtility.getSelectedToken(this)
|
||||||
const compToUse = this.$getCompetenceArme(arme, categorieArme)
|
const compToUse = this.$getCompetenceArme(arme, categorieArme)
|
||||||
if (!RdDItemArme.isArmeUtilisable(arme)) {
|
if (!RdDItemArme.isArmeUtilisable(arme)) {
|
||||||
ui.notifications.warn(`Arme inutilisable: ${arme.name} a une résistance de 0 ou moins`)
|
ui.notifications.warn(`Arme inutilisable: ${arme.name} a une résistance de 0 ou moins`)
|
||||||
@ -385,7 +387,7 @@ export class RdDBaseActorReve extends RdDBaseActor {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
Targets.selectOneToken(target => {
|
Targets.selectOneTargetToken(target => {
|
||||||
if (Targets.isTargetEntite(target)) {
|
if (Targets.isTargetEntite(target)) {
|
||||||
ui.notifications.warn(`Vous ne pouvez pas attaquer une entité non incarnée avec votre ${arme.name}!!!!`);
|
ui.notifications.warn(`Vous ne pouvez pas attaquer une entité non incarnée avec votre ${arme.name}!!!!`);
|
||||||
return
|
return
|
||||||
@ -395,7 +397,7 @@ export class RdDBaseActorReve extends RdDBaseActor {
|
|||||||
if (competence.isCompetencePossession()) {
|
if (competence.isCompetencePossession()) {
|
||||||
return RdDPossession.onAttaquePossession(target, this, competence);
|
return RdDPossession.onAttaquePossession(target, this, competence);
|
||||||
}
|
}
|
||||||
RdDCombat.rddCombatTarget(target, this).attaque(competence, arme);
|
RdDCombat.rddCombatTarget(target, this, token).attaque(competence, arme);
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -457,7 +457,7 @@ export class RdDCombat {
|
|||||||
if (Misc.isFirstConnectedGM()) {
|
if (Misc.isFirstConnectedGM()) {
|
||||||
let turn = combat.turns.find(t => t.token?.id == combat.current.tokenId);
|
let turn = combat.turns.find(t => t.token?.id == combat.current.tokenId);
|
||||||
if (turn?.actor) {
|
if (turn?.actor) {
|
||||||
RdDCombat.displayActorCombatStatus(combat, turn.actor, turn.token.id);
|
RdDCombat.displayActorCombatStatus(combat, turn.actor, turn.token);
|
||||||
// TODO Playaudio for player??
|
// TODO Playaudio for player??
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -469,30 +469,29 @@ export class RdDCombat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static rddCombatTarget(target, attacker) {
|
static rddCombatTarget(target, attacker, attackerToken) {
|
||||||
const defender = target?.actor;
|
return new RdDCombat(attacker, attackerToken?.id, target?.actor, target?.id, target)
|
||||||
const defenderTokenId = target?.id;
|
|
||||||
return new RdDCombat(attacker, defender, defenderTokenId, target)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static rddCombatForAttackerAndDefender(attackerId, defenderTokenId) {
|
static rddCombatForAttackerAndDefender(attackerId, attackerTokenId, defenderTokenId) {
|
||||||
const attacker = game.actors.get(attackerId);
|
const attacker = game.actors.get(attackerId)
|
||||||
let defender = defenderTokenId ? canvas.tokens.get(defenderTokenId)?.actor : undefined;
|
const defenderToken = defenderTokenId ? canvas.tokens.get(defenderTokenId) : undefined
|
||||||
|
let defender = defenderToken?.actor;
|
||||||
let target = undefined
|
let target = undefined
|
||||||
if (!defenderTokenId || !defender) {
|
if (!defenderTokenId || !defender) {
|
||||||
console.warn(`RdDCombat.rddCombatForAttackerAndDefender: appel avec defenderTokenId ${defenderTokenId} incorrect, ou pas de defender correspondant`);
|
console.warn(`RdDCombat.rddCombatForAttackerAndDefender: appel avec defenderTokenId ${defenderTokenId} incorrect, ou pas de defender correspondant`);
|
||||||
target = Targets.getTarget()
|
target = Targets.getTarget()
|
||||||
if (!target) {
|
if (!target) {
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
defenderTokenId = target.id;
|
defenderTokenId = target.id;
|
||||||
defender = target.actor;
|
defender = target.actor;
|
||||||
if (!defenderTokenId || !defender) {
|
if (!defenderTokenId || !defender) {
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new RdDCombat(attacker, defender, defenderTokenId, target)
|
return new RdDCombat(attacker, attackerTokenId, defender, defenderTokenId, target)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -503,7 +502,7 @@ export class RdDCombat {
|
|||||||
let attacker = msg.attackerId ? game.actors.get(msg.attackerId) : undefined;
|
let attacker = msg.attackerId ? game.actors.get(msg.attackerId) : undefined;
|
||||||
|
|
||||||
defender.encaisserDommages(attackerRoll, attacker);
|
defender.encaisserDommages(attackerRoll, attacker);
|
||||||
const rddCombat = RdDCombat.rddCombatForAttackerAndDefender(msg.attackerId, msg.defenderTokenId);
|
const rddCombat = RdDCombat.rddCombatForAttackerAndDefender(msg.attackerId, msg.attackerTokenId, msg.defenderTokenId);
|
||||||
rddCombat?.removeChatMessageActionsPasseArme(attackerRoll.passeArme);
|
rddCombat?.removeChatMessageActionsPasseArme(attackerRoll.passeArme);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -512,7 +511,7 @@ export class RdDCombat {
|
|||||||
static onMsgDefense(msg) {
|
static onMsgDefense(msg) {
|
||||||
let defenderToken = canvas.tokens.get(msg.defenderTokenId);
|
let defenderToken = canvas.tokens.get(msg.defenderTokenId);
|
||||||
if (defenderToken && Misc.isFirstConnectedGM()) {
|
if (defenderToken && Misc.isFirstConnectedGM()) {
|
||||||
const rddCombat = RdDCombat.rddCombatForAttackerAndDefender(msg.attackerId, msg.defenderTokenId);
|
const rddCombat = RdDCombat.rddCombatForAttackerAndDefender(msg.attackerId, msg.attackerTokenId, msg.defenderTokenId);
|
||||||
rddCombat?.removeChatMessageActionsPasseArme(msg.defenderRoll.passeArme);
|
rddCombat?.removeChatMessageActionsPasseArme(msg.defenderRoll.passeArme);
|
||||||
rddCombat?._chatMessageDefense(msg.paramChatDefense, msg.defenderRoll);
|
rddCombat?._chatMessageDefense(msg.paramChatDefense, msg.defenderRoll);
|
||||||
}
|
}
|
||||||
@ -545,6 +544,7 @@ export class RdDCombat {
|
|||||||
html.on("click", button, event => {
|
html.on("click", button, event => {
|
||||||
const rddCombat = RdDCombat.rddCombatForAttackerAndDefender(
|
const rddCombat = RdDCombat.rddCombatForAttackerAndDefender(
|
||||||
event.currentTarget.attributes['data-attackerId']?.value,
|
event.currentTarget.attributes['data-attackerId']?.value,
|
||||||
|
event.currentTarget.attributes['data-attackerTokenId']?.value,
|
||||||
event.currentTarget.attributes['data-defenderTokenId']?.value);
|
event.currentTarget.attributes['data-defenderTokenId']?.value);
|
||||||
if (rddCombat) {
|
if (rddCombat) {
|
||||||
rddCombat.onEvent(button, event);
|
rddCombat.onEvent(button, event);
|
||||||
@ -560,15 +560,30 @@ export class RdDCombat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
constructor(attacker, defender, defenderTokenId, target) {
|
constructor(attacker, attackerTokenId, defender, defenderTokenId, target) {
|
||||||
this.attacker = attacker
|
this.attacker = attacker
|
||||||
this.defender = defender
|
this.defender = defender
|
||||||
this.target = target
|
this.target = target
|
||||||
this.attackerId = this.attacker.id
|
this.attackerId = this.attacker.id
|
||||||
this.defenderId = this.defender.id
|
this.defenderId = this.defender.id
|
||||||
|
this.attackerTokenId = attackerTokenId
|
||||||
this.defenderTokenId = defenderTokenId
|
this.defenderTokenId = defenderTokenId
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_extractDefenderTokenData() {
|
||||||
|
if (this.target) {
|
||||||
|
return Targets.extractTokenData(this.target)
|
||||||
|
}
|
||||||
|
const token = canvas.tokens.get(this.defenderTokenId);
|
||||||
|
return token ? Targets.extractTokenData(token) : Targets.buildActorTokenData(this.defenderTokenId, this.defender)
|
||||||
|
}
|
||||||
|
|
||||||
|
_extractAttackerTokenData(){
|
||||||
|
const token = canvas.tokens.get(this.attackerTokenId);
|
||||||
|
return token ? Targets.extractTokenData(token) : Targets.buildActorTokenData(this.attackerTokenId, this.attacker)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async onEvent(button, event) {
|
async onEvent(button, event) {
|
||||||
const chatMessage = ChatUtility.getChatMessage(event);
|
const chatMessage = ChatUtility.getChatMessage(event);
|
||||||
@ -769,7 +784,7 @@ export class RdDCombat {
|
|||||||
}
|
}
|
||||||
RdDEmpoignade.checkEmpoignadeEnCours(this.attacker)
|
RdDEmpoignade.checkEmpoignadeEnCours(this.attacker)
|
||||||
|
|
||||||
let rollData = this._prepareAttaque(competence, arme);
|
let rollData = this._prepareAttaque(competence, arme)
|
||||||
console.log("RdDCombat.attaque >>>", rollData);
|
console.log("RdDCombat.attaque >>>", rollData);
|
||||||
if (arme) {
|
if (arme) {
|
||||||
this.attacker.verifierForceMin(arme);
|
this.attacker.verifierForceMin(arme);
|
||||||
@ -795,15 +810,19 @@ export class RdDCombat {
|
|||||||
dialog.render(true);
|
dialog.render(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_prepareAttaque(competence, arme) {
|
_prepareAttaque(competence, arme) {
|
||||||
|
const sourceToken = this._extractAttackerTokenData();
|
||||||
let rollData = {
|
let rollData = {
|
||||||
|
alias: sourceToken.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),
|
||||||
targetToken: Targets.extractTokenData(this.target),
|
sourceToken: sourceToken,
|
||||||
|
targetToken: this._extractDefenderTokenData(),
|
||||||
essais: {}
|
essais: {}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -850,7 +869,8 @@ export class RdDCombat {
|
|||||||
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.attacker.name,
|
||||||
attackerId: this.attackerId,
|
attackerId: this.attackerId,
|
||||||
defenderTokenId: this.defenderTokenId,
|
attackerToken: this._extractAttackerTokenData(),
|
||||||
|
defenderToken: this._extractDefenderTokenData(),
|
||||||
isForce: isForce,
|
isForce: isForce,
|
||||||
isFinesse: isFinesse,
|
isFinesse: isFinesse,
|
||||||
isRapide: isRapide,
|
isRapide: isRapide,
|
||||||
@ -900,6 +920,7 @@ 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,
|
||||||
@ -908,7 +929,8 @@ export class RdDCombat {
|
|||||||
attacker: this.attacker,
|
attacker: this.attacker,
|
||||||
attackerId: this.attackerId,
|
attackerId: this.attackerId,
|
||||||
esquives: esquives,
|
esquives: esquives,
|
||||||
defenderTokenId: this.defenderTokenId,
|
attackerToken: this._extractAttackerTokenData(),
|
||||||
|
defenderToken: this._extractDefenderTokenData(),
|
||||||
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,
|
||||||
@ -946,6 +968,7 @@ 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,
|
||||||
defenderId: this.defender?.id,
|
defenderId: this.defender?.id,
|
||||||
defenderTokenId: this.defenderTokenId,
|
defenderTokenId: this.defenderTokenId,
|
||||||
defenderRoll: defenderRoll,
|
defenderRoll: defenderRoll,
|
||||||
@ -980,7 +1003,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,
|
||||||
defenderTokenId: this.defenderTokenId,
|
attackerToken: this._extractAttackerTokenData(),
|
||||||
|
defenderToken: this._extractDefenderTokenData(),
|
||||||
essais: attackerRoll.essais
|
essais: attackerRoll.essais
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
@ -1051,9 +1075,13 @@ export class RdDCombat {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_prepareParade(attackerRoll, armeParade, competenceParade) {
|
_prepareParade(attackerRoll, armeParade, competenceParade) {
|
||||||
|
const defenderToken = this._extractDefenderTokenData()
|
||||||
let defenderRoll = {
|
let defenderRoll = {
|
||||||
|
alias: defenderToken?.name,
|
||||||
passeArme: attackerRoll.passeArme,
|
passeArme: attackerRoll.passeArme,
|
||||||
diffLibre: attackerRoll.diffLibre,
|
diffLibre: attackerRoll.diffLibre,
|
||||||
|
attackerToken: this._extractAttackerTokenData(),
|
||||||
|
defenderToken: defenderToken,
|
||||||
attackerRoll: attackerRoll,
|
attackerRoll: attackerRoll,
|
||||||
competence: this.defender.getCompetence(competenceParade),
|
competence: this.defender.getCompetence(competenceParade),
|
||||||
arme: armeParade,
|
arme: armeParade,
|
||||||
@ -1132,9 +1160,13 @@ export class RdDCombat {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_prepareEsquive(attackerRoll, competence) {
|
_prepareEsquive(attackerRoll, competence) {
|
||||||
|
const defenderToken= this._extractDefenderTokenData()
|
||||||
let rollData = {
|
let rollData = {
|
||||||
|
alias: defenderToken?.name,
|
||||||
passeArme: attackerRoll.passeArme,
|
passeArme: attackerRoll.passeArme,
|
||||||
diffLibre: attackerRoll.diffLibre,
|
diffLibre: attackerRoll.diffLibre,
|
||||||
|
attackerToken: this._extractAttackerTokenData(),
|
||||||
|
defenderToken: defenderToken,
|
||||||
attackerRoll: attackerRoll,
|
attackerRoll: attackerRoll,
|
||||||
competence: competence,
|
competence: competence,
|
||||||
surprise: this.defender.getSurprise(true),
|
surprise: this.defender.getSurprise(true),
|
||||||
@ -1296,6 +1328,7 @@ export class RdDCombat {
|
|||||||
msg: "msg_encaisser",
|
msg: "msg_encaisser",
|
||||||
data: {
|
data: {
|
||||||
attackerId: this.attackerId,
|
attackerId: this.attackerId,
|
||||||
|
attackerTokenId: this.attackerTokenId,
|
||||||
defenderTokenId: defenderTokenId,
|
defenderTokenId: defenderTokenId,
|
||||||
attackerRoll: attackerRoll
|
attackerRoll: attackerRoll
|
||||||
}
|
}
|
||||||
@ -1305,17 +1338,17 @@ export class RdDCombat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async displayActorCombatStatus(combat, actor, tokenId) {
|
static async displayActorCombatStatus(combat, actor, token) {
|
||||||
let formData = {
|
let formData = {
|
||||||
combatId: combat._id,
|
combatId: combat._id,
|
||||||
alias: actor.name,
|
alias: token.name ?? actor.name,
|
||||||
etatGeneral: actor.getEtatGeneral(),
|
etatGeneral: actor.getEtatGeneral(),
|
||||||
isSonne: actor.getSonne(),
|
isSonne: actor.getSonne(),
|
||||||
blessuresStatus: actor.computeResumeBlessure(),
|
blessuresStatus: actor.computeResumeBlessure(),
|
||||||
SConst: actor.getSConst(),
|
SConst: actor.getSConst(),
|
||||||
actorId: actor.id,
|
actorId: actor.id,
|
||||||
actor: actor,
|
actor: actor,
|
||||||
tokenId: tokenId,
|
tokenId: token.id,
|
||||||
isGrave: actor.countBlessures(it => it.isGrave()) > 0,
|
isGrave: actor.countBlessures(it => it.isGrave()) > 0,
|
||||||
isCritique: actor.countBlessures(it => it.isCritique()) > 0
|
isCritique: actor.countBlessures(it => it.isCritique()) > 0
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ export class RdDTokenHud {
|
|||||||
// initiative
|
// initiative
|
||||||
await RdDTokenHud.addExtensionHudInit(html, combatant, actions);
|
await RdDTokenHud.addExtensionHudInit(html, combatant, actions);
|
||||||
// combat
|
// combat
|
||||||
await RdDTokenHud.addExtensionHudCombat(html, combatant, actions);
|
await RdDTokenHud.addExtensionHudCombat(html, combatant, token, actions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -68,8 +68,8 @@ export class RdDTokenHud {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
static async addExtensionHudCombat(html, combatant, actions) {
|
static async addExtensionHudCombat(html, combatant, token, actions) {
|
||||||
const hudData = { combatant, actions, commandes: [] };
|
const hudData = { combatant, token, actions, commandes: [] };
|
||||||
const controlIconTarget = html.find('.control-icon[data-action=target]');
|
const controlIconTarget = html.find('.control-icon[data-action=target]');
|
||||||
await RdDTokenHud._configureSubMenu(controlIconTarget, 'systems/foundryvtt-reve-de-dragon/templates/hud-actor-attaque.html', hudData,
|
await RdDTokenHud._configureSubMenu(controlIconTarget, 'systems/foundryvtt-reve-de-dragon/templates/hud-actor-attaque.html', hudData,
|
||||||
(event) => {
|
(event) => {
|
||||||
@ -80,7 +80,7 @@ export class RdDTokenHud {
|
|||||||
combatant.actor.conjurerPossession(possession);
|
combatant.actor.conjurerPossession(possession);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
combatant.actor.rollArme(action);
|
combatant.actor.rollArme(action, 'competence', token)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -741,6 +741,15 @@ export class RdDUtility {
|
|||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static getSelectedToken(actor) {
|
||||||
|
if (canvas.tokens.controlled.length > 0) {
|
||||||
|
const tokens = canvas.tokens.controlled
|
||||||
|
.filter(it => it.actor.id == actor.id)
|
||||||
|
return tokens[0]
|
||||||
|
}
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
|
||||||
static getSelectedActor(msgPlayer = undefined) {
|
static getSelectedActor(msgPlayer = undefined) {
|
||||||
if (canvas.tokens.controlled.length == 1) {
|
if (canvas.tokens.controlled.length == 1) {
|
||||||
let token = canvas.tokens.controlled[0];
|
let token = canvas.tokens.controlled[0];
|
||||||
|
@ -13,18 +13,21 @@ export class Targets {
|
|||||||
static extractTokenData(target) {
|
static extractTokenData(target) {
|
||||||
return { id: target?.id, name: target?.document.name, img: target?.document.texture.src ?? target?.actor.img ?? 'icons/svg/mystery-man.svg' };
|
return { id: target?.id, name: target?.document.name, img: target?.document.texture.src ?? target?.actor.img ?? 'icons/svg/mystery-man.svg' };
|
||||||
}
|
}
|
||||||
|
static buildActorTokenData(tokenId, actor) {
|
||||||
|
return { id: tokenId, name: actor.name, img: actor.img ?? 'icons/svg/mystery-man.svg' };
|
||||||
|
}
|
||||||
static isTargetEntite(target) {
|
static isTargetEntite(target) {
|
||||||
return target?.actor.type == 'entite' && target?.actor.system.definition.typeentite == ENTITE_NONINCARNE;
|
return target?.actor.type == 'entite' && target?.actor.system.definition.typeentite == ENTITE_NONINCARNE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static async selectOneToken(onSelectTarget = target => { }) {
|
static async selectOneTargetToken(onSelectTarget = target => { }) {
|
||||||
const targets = Targets.listTargets();
|
const targets = Targets.listTargets()
|
||||||
switch (targets.length) {
|
switch (targets.length) {
|
||||||
case 0: return;
|
case 0:
|
||||||
|
return
|
||||||
case 1:
|
case 1:
|
||||||
onSelectTarget(targets[0]);
|
onSelectTarget(targets[0])
|
||||||
return;
|
return
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
const selectData = {
|
const selectData = {
|
||||||
@ -32,7 +35,7 @@ export class Targets {
|
|||||||
label: "Choisir une seule des cibles",
|
label: "Choisir une seule des cibles",
|
||||||
list: targets.map(it => Targets.extractTokenData(it))
|
list: targets.map(it => Targets.extractTokenData(it))
|
||||||
};
|
};
|
||||||
DialogSelect.select(selectData, onSelectTarget);
|
DialogSelect.select(selectData, onSelectTarget)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,20 +3,22 @@
|
|||||||
<br>
|
<br>
|
||||||
{{#if (eq attacker.type 'personnage')}}
|
{{#if (eq attacker.type 'personnage')}}
|
||||||
{{#unless essais.attaqueChance}}
|
{{#unless essais.attaqueChance}}
|
||||||
<a class='chat-card-button' id='appel-chance-attaque' data-attackerId='{{attackerId}}'
|
<a class='chat-card-button' id='appel-chance-attaque'
|
||||||
data-defenderTokenId='{{defenderTokenId}}'>Faire appel à la chance</a>
|
data-attackerId='{{attackerId}}' data-defenderTokenId='{{defenderToken.id}}' data-attackerTokenId='{{attackerToken.id}}'>
|
||||||
|
Faire appel à la chance</a>
|
||||||
</a>
|
</a>
|
||||||
<br>
|
<br>
|
||||||
{{/unless}}
|
{{/unless}}
|
||||||
{{#if (gt attacker.system.compteurs.destinee.value 0)}}
|
{{#if (gt attacker.system.compteurs.destinee.value 0)}}
|
||||||
<a class='chat-card-button' id='appel-destinee-attaque' data-attackerId='{{attackerId}}'
|
<a class='chat-card-button' id='appel-destinee-attaque'
|
||||||
data-defenderTokenId='{{defenderTokenId}}'>Utiliser la destinée</a>
|
data-attackerId='{{attackerId}}' data-defenderTokenId='{{defenderToken.id}}' data-attackerTokenId='{{attackerToken.id}}'>
|
||||||
|
Utiliser la destinée</a>
|
||||||
</a>
|
</a>
|
||||||
<br>
|
<br>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<a class='chat-card-button' id='echec-total-attaque' data-attackerId='{{attackerId}}'
|
<a class='chat-card-button' id='echec-total-attaque'
|
||||||
data-defenderTokenId='{{defenderTokenId}}'>
|
data-attackerId='{{attackerId}}' data-defenderTokenId='{{defenderToken.id}}' data-attackerTokenId='{{attackerToken.id}}'>
|
||||||
Tirer la maladresse !
|
Tirer la maladresse !
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
@ -1,17 +1,17 @@
|
|||||||
<div data-passearme="{{passeArme}}">
|
<div data-passearme="{{passeArme}}">
|
||||||
{{#if (eq surprise 'totale')}}
|
{{#if (eq surprise 'totale')}}
|
||||||
<span><strong>{{defender.name}}</strong> est totalement surpris</span>
|
<span><strong>{{defenderToken.name}}</strong> est totalement surpris</span>
|
||||||
{{else if essais.defense}}
|
{{else if essais.defense}}
|
||||||
<span><strong>{{defender.name}}</strong> doit :</span>
|
<span><strong>{{defenderToken.name}}</strong> doit :</span>
|
||||||
{{else}}
|
{{else}}
|
||||||
<span><strong>{{defender.name}}</strong> doit se défendre
|
<span><strong>{{defenderToken.name}}</strong> doit se défendre
|
||||||
{{~#if (eq surprise 'demi')}} avec une significative {{/if}} d'une attaque
|
{{~#if (eq surprise 'demi')}} avec une significative {{/if}} d'une attaque
|
||||||
{{~#if attaqueParticuliere}} <strong>particulière en
|
{{~#if attaqueParticuliere}} <strong>particulière en
|
||||||
{{~#if (eq attaqueParticuliere 'finesse')}} finesse
|
{{~#if (eq attaqueParticuliere 'finesse')}} finesse
|
||||||
{{else if (eq attaqueParticuliere 'force')}} force
|
{{else if (eq attaqueParticuliere 'force')}} force
|
||||||
{{else if (eq attaqueParticuliere 'rapidite')}} rapidité
|
{{else if (eq attaqueParticuliere 'rapidite')}} rapidité
|
||||||
{{/if~}}</strong>
|
{{/if~}}</strong>
|
||||||
{{/if}} de {{attacker.name}} ({{attaqueArme.name}}):
|
{{/if}} de {{attackerToken.name}} ({{attaqueArme.name}}):
|
||||||
</span>
|
</span>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<span class='chat-card-button-area'>
|
<span class='chat-card-button-area'>
|
||||||
@ -20,15 +20,17 @@
|
|||||||
{{#if essais.defense}}
|
{{#if essais.defense}}
|
||||||
{{#unless essais.defenseChance}}
|
{{#unless essais.defenseChance}}
|
||||||
{{#if (eq defender.type 'personnage')}}
|
{{#if (eq defender.type 'personnage')}}
|
||||||
<a class='chat-card-button' id='appel-chance-defense' data-attackerId='{{attackerId}}'
|
<a class='chat-card-button' id='appel-chance-defense'
|
||||||
data-defenderTokenId='{{defenderTokenId}}'>Faire appel à la chance</a>
|
data-attackerId='{{attackerId}}' data-defenderTokenId='{{defenderToken.id}}' data-attackerTokenId='{{attackerToken.id}}'>
|
||||||
|
Faire appel à la chance</a>
|
||||||
</a>
|
</a>
|
||||||
<br>
|
<br>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#if (eq defender.type 'personnage')}}
|
{{#if (eq defender.type 'personnage')}}
|
||||||
{{#if (gt defender.system.compteurs.destinee.value 0)}}
|
{{#if (gt defender.system.compteurs.destinee.value 0)}}
|
||||||
<a class='chat-card-button' id='appel-destinee-defense' data-attackerId='{{attackerId}}'
|
<a class='chat-card-button' id='appel-destinee-defense'
|
||||||
data-defenderTokenId='{{defenderTokenId}}'>Utiliser la destinée</a>
|
data-attackerId='{{attackerId}}' data-attackerTokenId='{{attackerToken.id}}' data-defenderTokenId='{{defenderToken.id}}'>
|
||||||
|
Utiliser la destinée</a>
|
||||||
</a>
|
</a>
|
||||||
<br>
|
<br>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
@ -36,14 +38,16 @@
|
|||||||
{{/unless}}
|
{{/unless}}
|
||||||
{{else}}
|
{{else}}
|
||||||
{{#each armes as |arme key|}}
|
{{#each armes as |arme key|}}
|
||||||
<a class='chat-card-button' id='parer-button' data-attackerId='{{../attackerId}}' data-defenderTokenId='{{../defenderTokenId}}'
|
<a class='chat-card-button' id='parer-button'
|
||||||
|
data-attackerId='{{../attackerId}}' data-defenderTokenId='{{../defenderToken.id}}' data-attackerTokenId='{{../attackerToken.id}}'
|
||||||
data-armeid='{{arme._id}}'>
|
data-armeid='{{arme._id}}'>
|
||||||
Parer avec {{arme.name}} à {{../diffLibre }}{{#if arme.system.nbUsage}} (Utilisations : {{arme.system.nbUsage}}){{/if}}
|
Parer avec {{arme.name}} à {{../diffLibre }}{{#if arme.system.nbUsage}} (Utilisations : {{arme.system.nbUsage}}){{/if}}
|
||||||
</a>
|
</a>
|
||||||
<br>
|
<br>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
{{#if mainsNues}}
|
{{#if mainsNues}}
|
||||||
<a class='chat-card-button' id='parer-button' data-attackerId='{{attackerId}}' data-defenderTokenId='{{defenderTokenId}}'
|
<a class='chat-card-button' id='parer-button'
|
||||||
|
data-attackerId='{{attackerId}}' data-defenderTokenId='{{defenderToken.id}}' data-attackerTokenId='{{attackerToken.id}}'
|
||||||
data-armeid='{{arme._id}}' data-competence='{{arme.system.competence}}'>
|
data-armeid='{{arme._id}}' data-competence='{{arme.system.competence}}'>
|
||||||
Parer à mains nues à {{diffLibre}}{{#if arme.system.nbUsage}} (Utilisations : {{arme.system.nbUsage}}){{/if}}
|
Parer à mains nues à {{diffLibre}}{{#if arme.system.nbUsage}} (Utilisations : {{arme.system.nbUsage}}){{/if}}
|
||||||
</a>
|
</a>
|
||||||
@ -51,9 +55,9 @@
|
|||||||
{{/if}}
|
{{/if}}
|
||||||
{{#if (ne attaqueCategorie 'tir')}}
|
{{#if (ne attaqueCategorie 'tir')}}
|
||||||
{{#each esquives as |esquive key|}}
|
{{#each esquives as |esquive key|}}
|
||||||
<a class='chat-card-button' id='esquiver-button' data-attackerId='{{../attackerId}}' data-defenderTokenId='{{../defenderTokenId}}'
|
<a class='chat-card-button' id='esquiver-button'
|
||||||
|
data-attackerId='{{../attackerId}}' data-defenderTokenId='{{../defenderToken.id}}' data-attackerTokenId='{{../attackerToken.id}}'
|
||||||
data-compid='{{esquive._id}}' data-competence='{{esquive.name}}'>
|
data-compid='{{esquive._id}}' data-competence='{{esquive.name}}'>
|
||||||
{{log 'esquive' esquive}}
|
|
||||||
{{esquive.name}} à {{../diffLibre}} {{#if esquive.system.nbUsage}} (Utilisations : {{esquive.system.nbUsage}}){{/if}}
|
{{esquive.name}} à {{../diffLibre}} {{#if esquive.system.nbUsage}} (Utilisations : {{esquive.system.nbUsage}}){{/if}}
|
||||||
</a>
|
</a>
|
||||||
<br>
|
<br>
|
||||||
@ -61,8 +65,8 @@
|
|||||||
{{/if}}
|
{{/if}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/unless}}
|
{{/unless}}
|
||||||
<a class='chat-card-button' id='encaisser-button' data-attackerId='{{attackerId}}'
|
<a class='chat-card-button' id='encaisser-button'
|
||||||
data-defenderTokenId='{{defenderTokenId}}'>
|
data-attackerId='{{attackerId}}' data-defenderTokenId='{{defenderToken.id}}' data-attackerTokenId='{{attackerToken.id}}'>
|
||||||
Encaisser à {{plusMoins dmg.total}}
|
Encaisser à {{plusMoins dmg.total}}
|
||||||
{{#if (eq dmg.mortalite 'non-mortel')~}}
|
{{#if (eq dmg.mortalite 'non-mortel')~}}
|
||||||
(non-mortel) !
|
(non-mortel) !
|
||||||
|
Loading…
Reference in New Issue
Block a user