Nouveau roll-dialog: mode attaque
This commit is contained in:
@@ -187,7 +187,12 @@ export default class RollDialog extends HandlebarsApplicationMixin(ApplicationV2
|
||||
foundry.applications.handlebars.loadTemplates(ROLL_PARTS.map(p => p.template))
|
||||
ROLL_PARTS.forEach(p => p.onReady())
|
||||
|
||||
Handlebars.registerHelper('roll-centered-array', (base, show) => RollDialog.centeredArray(base, show))
|
||||
Handlebars.registerHelper('roll-centered-array', (base, show) => {
|
||||
show = Math.abs(show)
|
||||
const start = base - show
|
||||
return [...Array(2 * show + 1).keys()].map(it => start + it)
|
||||
})
|
||||
|
||||
Handlebars.registerHelper('roll-list-item-value', (list, key, path = undefined) => {
|
||||
const selected = list.find(p => p.key == key)
|
||||
if (selected && path && path != '') {
|
||||
@@ -195,6 +200,7 @@ export default class RollDialog extends HandlebarsApplicationMixin(ApplicationV2
|
||||
}
|
||||
return selected
|
||||
})
|
||||
|
||||
Handlebars.registerHelper('roll-part-context', (rollData, code) => {
|
||||
const rollPart = ROLL_PARTS.find(it => it.code == code)
|
||||
if (rollPart == undefined) {
|
||||
@@ -211,12 +217,7 @@ export default class RollDialog extends HandlebarsApplicationMixin(ApplicationV2
|
||||
})
|
||||
}
|
||||
|
||||
static centeredArray(base, show) {
|
||||
show = Math.abs(show)
|
||||
const start = base - show
|
||||
return [...Array(2 * show + 1).keys()].map(it => start + it)
|
||||
}
|
||||
|
||||
|
||||
static async create(rollData, rollOptions = {}) {
|
||||
const rollDialog = new RollDialog(rollData, rollOptions)
|
||||
rollDialog.render(true)
|
||||
@@ -267,30 +268,33 @@ export default class RollDialog extends HandlebarsApplicationMixin(ApplicationV2
|
||||
/** pre-configure les paramètres des différentes parties de la fenêtre (par exemple, prépare les listes de caractéristiques/compétences */
|
||||
$loadParts() {
|
||||
const rollData = this.rollData;
|
||||
const loadedMode = rollData.mode?.current
|
||||
rollData.current = rollData.current ?? {}
|
||||
rollData.selected = rollData.selected ?? {}
|
||||
rollData.mode = rollData.mode ?? {}
|
||||
rollData.mode.retry = rollData.mode.retry ?? false
|
||||
BASIC_PARTS.restore(rollData)
|
||||
|
||||
const loadedMode = ROLL_MODE_TABS.find(m => m.code == rollData.mode?.current)?.code
|
||||
const allowedModes = ROLL_MODE_TABS.filter(m => m.isAllowed(rollData) && m.visible(rollData)).map(m => m.code)
|
||||
|
||||
rollData.mode.allowed = rollData.mode.retry ? [loadedMode] : rollData.mode.allowed ?? ROLL_MODE_TABS.map(m => m.code)
|
||||
rollData.mode.current = loadedMode ?? ROLL_MODE_TABS.find(m => m.isAllowed(rollData) && m.visible(rollData))?.code ?? ROLL_MODE_COMP
|
||||
rollData.mode.current = allowedModes.find(m => m == rollData.mode?.current) ?? (allowedModes.length > 0 ? allowedModes[0] : ROLL_MODE_COMP)
|
||||
|
||||
this.getSelectedMode().setRollDataMode(rollData)
|
||||
|
||||
|
||||
rollData.refs = this.$prepareRefs(rollData)
|
||||
rollData.options = rollData.options ?? { showDice: true, rollMode: game.settings.get("core", "rollMode") }
|
||||
|
||||
|
||||
ROLL_PARTS.forEach(p => p.initialize(rollData))
|
||||
ROLL_PARTS.forEach(p => p.restore(rollData))
|
||||
ROLL_PARTS.filter(p => p.isValid(rollData))
|
||||
.forEach(p => {
|
||||
p.loadRefs(rollData)
|
||||
p.prepareContext(rollData)
|
||||
})
|
||||
.forEach(p => {
|
||||
p.loadRefs(rollData)
|
||||
p.prepareContext(rollData)
|
||||
})
|
||||
this.selectMode();
|
||||
}
|
||||
|
||||
|
||||
selectMode() {
|
||||
this.rollData.mode.label = this.getSelectedMode().title(this.rollData)
|
||||
this.getSelectedMode().setRollDataMode(this.rollData)
|
||||
|
@@ -37,6 +37,7 @@ export class RollPartAppelMoral extends RollPartCheckbox {
|
||||
}
|
||||
return '<i class="fa-regular fa-face-meh"></i>'
|
||||
}
|
||||
|
||||
getCheckboxLabel(rollData) { return "Appel au moral" }
|
||||
getCheckboxValue(rollData) { return 1 }
|
||||
}
|
||||
|
@@ -1,4 +1,6 @@
|
||||
import { Grammar } from "../grammar.js"
|
||||
import { RdDBonus } from "../rdd-bonus.js"
|
||||
import { StatusEffects } from "../settings/status-effects.js"
|
||||
import { ROLL_MODE_ATTAQUE } from "./roll-constants.mjs"
|
||||
import { PART_CARAC } from "./roll-part-carac.mjs"
|
||||
import { PART_COMP } from "./roll-part-comp.mjs"
|
||||
@@ -7,6 +9,12 @@ import { ROLLDIALOG_SECTION, RollPart } from "./roll-part.mjs"
|
||||
|
||||
export const PART_ATTAQUE = 'attaque'
|
||||
|
||||
const TACTIQUES = [
|
||||
{ key: "", label: "Attaque normale" },
|
||||
{ key: "charge", label: "Charge" },
|
||||
{ key: "feinte", label: "Feinte" },
|
||||
]
|
||||
|
||||
export class RollPartAttaque extends RollPartSelect {
|
||||
|
||||
get code() { return PART_ATTAQUE }
|
||||
@@ -18,7 +26,8 @@ export class RollPartAttaque extends RollPartSelect {
|
||||
const refs = this.getRefs(rollData)
|
||||
const attaques = rollData.active.actor.listAttaques()
|
||||
refs.attaques = attaques.map(it => RollPartAttaque.$extractAttaque(it, rollData.active.actor))
|
||||
if (refs.attaques.length>0){
|
||||
refs.tactiques = TACTIQUES
|
||||
if (refs.attaques.length > 0) {
|
||||
this.$selectAttaque(rollData)
|
||||
}
|
||||
}
|
||||
@@ -27,20 +36,54 @@ export class RollPartAttaque extends RollPartSelect {
|
||||
|
||||
static $extractAttaque(action, actor) {
|
||||
return {
|
||||
key: `${action.action}::${action.arme.id}::${action.comp.id}`,
|
||||
key: `${action.action}::${action.name}`,
|
||||
label: action.name,
|
||||
action: action,
|
||||
tactique: "",
|
||||
arme: action.arme,
|
||||
comp: action.comp,
|
||||
}
|
||||
}
|
||||
|
||||
prepareContext(rollData) {
|
||||
const current = this.getCurrent(rollData)
|
||||
const defenseurSurpris = rollData.opponent?.actor?.getSurprise(true) ?? ''
|
||||
current.defenseur = defenseurSurpris
|
||||
? {
|
||||
surprise: RdDBonus.find(defenseurSurpris),
|
||||
effects: rollData.opponent.actor.getEffects(it => StatusEffects.niveauSurprise(it, true) > 0)
|
||||
}
|
||||
: undefined
|
||||
current.dmg = this.dmgRollV2(rollData, current)
|
||||
}
|
||||
|
||||
dmgRollV2(rollData, current) {
|
||||
const actor = rollData.active.actor
|
||||
const defender = rollData.opponent.actor
|
||||
const dmgArme = RdDBonus.dmgArme(current.arme, current.action.dommagesArme)
|
||||
const dmg = {
|
||||
total: 0,
|
||||
dmgArme: dmgArme,
|
||||
penetration: current.arme.penetration(),
|
||||
dmgTactique: RdDBonus.dmgBonus(current.tactique),
|
||||
dmgParticuliere: 0, // TODO RdDBonus._dmgParticuliere(rollData),
|
||||
dmgSurprise: RdDBonus.dmgBonus(current.defenseur.surprise),
|
||||
mortalite: RdDBonus.mortalite(current.dmg?.mortalite, current.arme.system.mortalite, defender?.isEntite()),
|
||||
dmgActor: RdDBonus.bonusDmg(actor, current.action.carac.key, dmgArme)
|
||||
}
|
||||
dmg.total = dmg.dmgSurprise + dmg.dmgTactique + dmg.dmgArme + dmg.dmgActor + dmg.dmgParticuliere
|
||||
return dmg;
|
||||
}
|
||||
|
||||
$selectAttaque(rollData, key) {
|
||||
this.selectByKey(rollData, key, 0)
|
||||
}
|
||||
|
||||
async _onRender(rollDialog, context, options) {
|
||||
const selectAttaque = rollDialog.element.querySelector(`roll-section[name="${this.code}"] select[name="select-attaque"]`)
|
||||
const selectTactique = rollDialog.element.querySelector(`roll-section[name="${this.code}"] select[name="select-tactique"]`)
|
||||
const checkMortalite = rollDialog.element.querySelector(`roll-section[name="${this.code}"] input[name="check-mortalite"]`)
|
||||
const current = this.getCurrent(rollDialog.rollData)
|
||||
|
||||
selectAttaque.addEventListener("change", e => {
|
||||
const selectOptions = e.currentTarget.options
|
||||
@@ -49,6 +92,18 @@ export class RollPartAttaque extends RollPartSelect {
|
||||
rollDialog.setModeTitle()
|
||||
rollDialog.render()
|
||||
})
|
||||
|
||||
selectTactique.addEventListener("change", e => {
|
||||
const selectOptions = e.currentTarget.options
|
||||
const index = selectOptions.selectedIndex
|
||||
current.tactique = TACTIQUES[index].key
|
||||
rollDialog.render()
|
||||
})
|
||||
|
||||
checkMortalite?.addEventListener("change", e => {
|
||||
current.dmg.mortalite = (e.currentTarget.checked ? 'mortel' : 'non-mortel')
|
||||
rollDialog.render()
|
||||
})
|
||||
}
|
||||
|
||||
getExternalPartsFilter(partCode, rollData) {
|
||||
|
@@ -18,8 +18,8 @@ export class RollPartCheckbox extends RollPart {
|
||||
}
|
||||
|
||||
loadRefs(rollData) {
|
||||
const current = this.getCurrent(rollData)
|
||||
current.label = this.getCheckboxLabel(rollData)
|
||||
const refs = this.getRefs(rollData)
|
||||
refs.label = this.getCheckboxLabel(rollData)
|
||||
}
|
||||
|
||||
prepareContext(rollData) {
|
||||
@@ -43,7 +43,7 @@ export class RollPartCheckbox extends RollPart {
|
||||
}
|
||||
|
||||
getCheckboxLabelAjustement(rollData) {
|
||||
return `${this.getCheckboxIcon(rollData)} ${this.getCurrent(rollData).label}`
|
||||
return `${this.getCheckboxIcon(rollData)} ${this.getRefs(rollData).label}`
|
||||
}
|
||||
|
||||
async _onRender(rollDialog, context, options) {
|
||||
|
@@ -14,4 +14,8 @@ export class RollPartDefense extends RollPart {
|
||||
refs.defenses =[]
|
||||
}
|
||||
|
||||
isForceInsuffisante(rollData) {
|
||||
return true
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -43,15 +43,15 @@ export class RollPartOeuvre extends RollPartSelect {
|
||||
loadRefs(rollData) {
|
||||
const refs = this.getRefs(rollData)
|
||||
refs.oeuvres = rollData.active.actor.items
|
||||
.filter(it => it.isOeuvre() && RollPartOeuvre.getArt(it))
|
||||
.map(it => RollPartOeuvre.$extractOeuvre(it, rollData.active.actor))
|
||||
.filter(it => it.isOeuvre() && RollPartOeuvre.getArt(it))
|
||||
.map(it => RollPartOeuvre.$extractOeuvre(it, rollData.active.actor))
|
||||
if (refs.oeuvres.length > 0) {
|
||||
this.$selectOeuvre(rollData)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
choices(refs) { return refs.oeuvres }
|
||||
|
||||
|
||||
static $extractOeuvre(oeuvre, actor) {
|
||||
const art = RollPartOeuvre.getArt(oeuvre)
|
||||
return {
|
||||
@@ -64,7 +64,7 @@ export class RollPartOeuvre extends RollPartSelect {
|
||||
comp: actor.getCompetence(art.competence(oeuvre))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static getArt(oeuvre) {
|
||||
return ARTS.find(it => it.type == oeuvre.type)
|
||||
}
|
||||
|
@@ -27,7 +27,7 @@ export class RollPartSelect extends RollPart {
|
||||
const current = this.getCurrent(rollData)
|
||||
const newChoice = (choices.length == 0)
|
||||
? { key: '', value: defValue }
|
||||
: this.$getSelectedChoice(choices, key ?? current?.key ?? refs.key ?? '')
|
||||
: this.$getSelectedChoice(choices, key ?? current?.key ?? refs?.key ?? '')
|
||||
this.setCurrent(rollData, newChoice)
|
||||
return newChoice
|
||||
}
|
||||
|
@@ -1,6 +1,7 @@
|
||||
import { Misc } from "../misc.js"
|
||||
import { StatusEffects } from "../settings/status-effects.js"
|
||||
import { ROLL_MODE_ATTAQUE, ROLL_MODE_DEFENSE } from "./roll-constants.mjs"
|
||||
import { PART_ATTAQUE, RollPartAttaque } from "./roll-part-attaque.mjs"
|
||||
import { ROLLDIALOG_SECTION, RollPart } from "./roll-part.mjs"
|
||||
|
||||
export const PART_SIGN = "sign"
|
||||
@@ -64,8 +65,17 @@ export class RollPartSign extends RollPart {
|
||||
}
|
||||
|
||||
isForceInsuffisante(rollData) {
|
||||
//this.isCombat(rollData) && ... arme avec force min
|
||||
return this.isCombat(rollData) && true
|
||||
if ([ROLL_MODE_ATTAQUE, ROLL_MODE_DEFENSE].includes(rollData.mode.current)) {
|
||||
const arme = rollData.current[rollData.mode.current]?.arme
|
||||
const actor = rollData.active.actor
|
||||
|
||||
if (actor?.isPersonnage() && arme) {
|
||||
const requise = parseInt(arme?.system.force ?? 0)
|
||||
const force = parseInt(actor.system.carac.force.value)
|
||||
return requise > force
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
isAttaqueFinesse(rollData) {
|
||||
|
Reference in New Issue
Block a user