Affichage de la cible dans la fenêtre d'attaque
This commit is contained in:
parent
81aaf9e8d7
commit
7698147e97
@ -35,7 +35,7 @@ import { ENTITE_BLURETTE, ENTITE_INCARNE, ENTITE_NONINCARNE, HIDE_DICE, SHOW_DIC
|
|||||||
import { RdDConfirm } from "./rdd-confirm.js";
|
import { RdDConfirm } from "./rdd-confirm.js";
|
||||||
import { DialogValidationEncaissement } from "./dialog-validation-encaissement.js";
|
import { DialogValidationEncaissement } from "./dialog-validation-encaissement.js";
|
||||||
import { RdDRencontre } from "./item-rencontre.js";
|
import { RdDRencontre } from "./item-rencontre.js";
|
||||||
import { DialogSelectTarget } from "./dialog-select-target.js";
|
import { Targets } from "./targets.js";
|
||||||
|
|
||||||
const POSSESSION_SANS_DRACONIC = {
|
const POSSESSION_SANS_DRACONIC = {
|
||||||
img: 'systems/foundryvtt-reve-de-dragon/icons/entites/possession.webp',
|
img: 'systems/foundryvtt-reve-de-dragon/icons/entites/possession.webp',
|
||||||
@ -2552,8 +2552,8 @@ export class RdDActor extends Actor {
|
|||||||
competence: this.getCompetence(idOrName)
|
competence: this.getCompetence(idOrName)
|
||||||
}
|
}
|
||||||
if (rollData.competence.type == 'competencecreature') {
|
if (rollData.competence.type == 'competencecreature') {
|
||||||
if (rollData.competence.system.iscombat && options.tryTarget && DialogSelectTarget.hasTargets()) {
|
if (rollData.competence.system.iscombat && options.tryTarget && Targets.hasTargets()) {
|
||||||
DialogSelectTarget.selectOneToken(target => {
|
Targets.selectOneToken(target => {
|
||||||
if (rollData.competence.system.ispossession) {
|
if (rollData.competence.system.ispossession) {
|
||||||
RdDPossession.onAttaquePossession(target, this, rollData.competence)
|
RdDPossession.onAttaquePossession(target, this, rollData.competence)
|
||||||
}
|
}
|
||||||
@ -3222,7 +3222,7 @@ export class RdDActor extends Actor {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
rollArme(arme) {
|
rollArme(arme) {
|
||||||
if (!DialogSelectTarget.hasTargets()) {
|
if (!Targets.hasTargets()) {
|
||||||
RdDConfirm.confirmer({
|
RdDConfirm.confirmer({
|
||||||
settingConfirmer: "confirmer-combat-sans-cible",
|
settingConfirmer: "confirmer-combat-sans-cible",
|
||||||
content: `<p>Voulez vous faire un jet de compétence ${arme.system.competence} sans choisir de cible valide?
|
content: `<p>Voulez vous faire un jet de compétence ${arme.system.competence} sans choisir de cible valide?
|
||||||
@ -3236,8 +3236,8 @@ export class RdDActor extends Actor {
|
|||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
DialogSelectTarget.selectOneToken(target => {
|
Targets.selectOneToken(target => {
|
||||||
if (RdDCombat.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;
|
||||||
}
|
}
|
||||||
|
@ -1,29 +1,5 @@
|
|||||||
|
|
||||||
export class DialogSelectTarget extends Dialog {
|
export class DialogSelectTarget extends Dialog {
|
||||||
static hasTargets() {
|
|
||||||
return (game.user.targets?.size ?? 0) > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static async selectOneToken(onSelectTarget = target => { }) {
|
|
||||||
if (DialogSelectTarget.hasTargets()) {
|
|
||||||
const targets = game.user.targets.map(it => it);
|
|
||||||
switch (targets.size) {
|
|
||||||
case 0: return;
|
|
||||||
case 1:
|
|
||||||
onSelectTarget(targets[0]);
|
|
||||||
return;
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
const tokens = targets.map(it => { return { id: it.id, name: it.document.name, img: it.document.texture.src ?? it.actor.img ?? 'icons/svg/mystery-man.svg' } })
|
|
||||||
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-select-target.html", {
|
|
||||||
tokens: tokens
|
|
||||||
});
|
|
||||||
new DialogSelectTarget(html, onSelectTarget, targets).render(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(html, onSelectTarget, targets) {
|
constructor(html, onSelectTarget, targets) {
|
||||||
const options = {
|
const options = {
|
||||||
classes: ["rdd-dialog-select-target"],
|
classes: ["rdd-dialog-select-target"],
|
||||||
|
@ -12,6 +12,7 @@ import { RdDRoll } from "./rdd-roll.js";
|
|||||||
import { RdDRollTables } from "./rdd-rolltables.js";
|
import { RdDRollTables } from "./rdd-rolltables.js";
|
||||||
import { ReglesOptionelles } from "./settings/regles-optionelles.js";
|
import { ReglesOptionelles } from "./settings/regles-optionelles.js";
|
||||||
import { STATUSES } from "./settings/status-effects.js";
|
import { STATUSES } from "./settings/status-effects.js";
|
||||||
|
import { Targets } from "./targets.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
const premierRoundInit = [
|
const premierRoundInit = [
|
||||||
@ -470,28 +471,6 @@ export class RdDCombat {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
static getTarget() {
|
|
||||||
const targets = game.user.targets;
|
|
||||||
switch (targets?.size ?? 0) {
|
|
||||||
case 1:
|
|
||||||
for (let t of targets) {
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
case 0:
|
|
||||||
ui.notifications.warn("Vous devez choisir une cible à attaquer!");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
DialogSelectTarget.selectOneToken(t => console.info(`selecte target ${t}`));
|
|
||||||
ui.notifications.warn("Vous devez choisir une cible (et <strong>une seule</strong>) à attaquer!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static isTargetEntite(target) {
|
|
||||||
return target?.actor.type == 'entite' && target?.actor.system.definition.typeentite == ENTITE_NONINCARNE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static rddCombatTarget(target, attacker) {
|
static rddCombatTarget(target, attacker) {
|
||||||
const defender = target?.actor;
|
const defender = target?.actor;
|
||||||
@ -506,7 +485,7 @@ export class RdDCombat {
|
|||||||
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 = RdDCombat.getTarget()
|
target = Targets.getTarget()
|
||||||
if (!target) {
|
if (!target) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -841,6 +820,7 @@ export class RdDCombat {
|
|||||||
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),
|
||||||
essais: {}
|
essais: {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
56
module/targets.js
Normal file
56
module/targets.js
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
import { ENTITE_NONINCARNE } from "./constants.js";
|
||||||
|
import { DialogSelectTarget } from "./dialog-select-target.js";
|
||||||
|
|
||||||
|
export class Targets {
|
||||||
|
static listTargets() {
|
||||||
|
return Array.from(game.user.targets);
|
||||||
|
}
|
||||||
|
|
||||||
|
static hasTargets() {
|
||||||
|
return Targets.listTargets().length > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static extractTokenData(target) {
|
||||||
|
if (!target) {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
return { id: target.id, name: target.document.name, img: target.document.texture.src ?? target.actor.img ?? 'icons/svg/mystery-man.svg' };
|
||||||
|
}
|
||||||
|
|
||||||
|
static isTargetEntite(target) {
|
||||||
|
return target?.actor.type == 'entite' && target?.actor.system.definition.typeentite == ENTITE_NONINCARNE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static async selectOneToken(onSelectTarget = target => { }) {
|
||||||
|
const targets = Targets.listTargets();
|
||||||
|
switch (targets.length) {
|
||||||
|
case 0: return;
|
||||||
|
case 1:
|
||||||
|
onSelectTarget(targets[0]);
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
const tokens = targets.map(it => Targets.extractTokenData(it))
|
||||||
|
const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-select-target.html", {
|
||||||
|
tokens: tokens
|
||||||
|
});
|
||||||
|
new DialogSelectTarget(html, onSelectTarget, targets).render(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static getTarget() {
|
||||||
|
const targets = Targets.listTargets();
|
||||||
|
switch (targets.length) {
|
||||||
|
case 1:
|
||||||
|
return targets[0];
|
||||||
|
case 0:
|
||||||
|
ui.notifications.warn("Vous devez choisir une cible à attaquer!");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ui.notifications.warn("Vous devez choisir une cible (et <strong>une seule</strong>) à attaquer!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -33,22 +33,26 @@
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
{{#if targetToken}}
|
||||||
|
<div class="flexrow">
|
||||||
|
Cible: {{targetToken.name}}
|
||||||
|
<img class="sheet-competence-img" src="{{targetToken.img}}" title="{{targetToken.name}}" />
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
{{#if ajustements.attaqueDefenseurSurpris.used}}
|
{{#if ajustements.attaqueDefenseurSurpris.used}}
|
||||||
<div class="flexrow">
|
<div class="flexrow">
|
||||||
<label id="defenseur-surprise">{{ajustements.attaqueDefenseurSurpris.label}}</label>
|
<label id="defenseur-surprise">{{ajustements.attaqueDefenseurSurpris.label}}</label>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
{{#if arme}}
|
|
||||||
{{#unless attackerRoll}}
|
{{#unless attackerRoll}}
|
||||||
<div class="flexrow">
|
<div class="flexrow">
|
||||||
{{#if (eq arme.system.mortalite 'non-mortel')}}
|
|
||||||
<label>Dégats:</label><label class="dmg-arme-actor"></label>
|
|
||||||
{{else if (eq arme.system.mortalite 'empoignade')}}
|
|
||||||
<label>Dégats:</label><label>Empoignade</label>
|
|
||||||
{{else}}
|
|
||||||
<label>Dégats:</label>
|
<label>Dégats:</label>
|
||||||
|
{{#if (eq arme.system.mortalite 'non-mortel')}}
|
||||||
|
<label class="dmg-arme-actor"></label>
|
||||||
|
{{else if (eq arme.system.mortalite 'empoignade')}}
|
||||||
|
<label>Empoignade</label>
|
||||||
|
{{else}}
|
||||||
<span>
|
<span>
|
||||||
<input class="attribute-value" type="checkbox" name="coupsNonMortels" {{#unless (eq mortalite 'mortel')}}checked{{/unless}} />
|
<input class="attribute-value" type="checkbox" name="coupsNonMortels" {{#unless (eq mortalite 'mortel')}}checked{{/unless}} />
|
||||||
<label class="dmg-arme-actor"></label>
|
<label class="dmg-arme-actor"></label>
|
||||||
|
Loading…
Reference in New Issue
Block a user