100 lines
2.9 KiB
JavaScript
100 lines
2.9 KiB
JavaScript
|
import { ITEM_TYPES, RdDItem } from "../item.js";
|
||
|
import { Misc } from "../misc.js";
|
||
|
import { LIST_CARAC, RdDCarac } from "../rdd-carac.js";
|
||
|
|
||
|
export class RdDItemRace extends RdDItem {
|
||
|
|
||
|
static get ITEM_TYPE() { return ITEM_TYPES.race }
|
||
|
|
||
|
static get defaultIcon() {
|
||
|
return "systems/foundryvtt-reve-de-dragon/icons/humanoides/humain.webp";
|
||
|
}
|
||
|
|
||
|
static checkRacialMax(actor, code, value) {
|
||
|
const race = RdDItemRace.getRace(actor)
|
||
|
if (code == LIST_CARAC.force.code) {
|
||
|
if (!race.isForceValid(actor, value)) {
|
||
|
ui.notifications.warn(race.system.carac.force.limitmessage)
|
||
|
return false
|
||
|
}
|
||
|
}
|
||
|
const carac = RdDCarac.carac(code)
|
||
|
if (race.isMax(actor, code, value - 1)) {
|
||
|
ui.notifications.warn(`${value} est supérieure au maximum de ${carac.label}`)
|
||
|
return false
|
||
|
}
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
static applyRacialLimits(actor) {
|
||
|
const race = RdDItemRace.getRace(actor)
|
||
|
actor.system.carac.taille.value = race.getValidTaille(actor.getTaille())
|
||
|
actor.system.carac.force.value = Math.min(
|
||
|
actor.getForce(),
|
||
|
race.getForceMax(actor))
|
||
|
}
|
||
|
|
||
|
static isRacialMax(actor, code, value = undefined) {
|
||
|
return RdDItemRace.getRace(actor).isMax(actor, code, value)
|
||
|
}
|
||
|
|
||
|
static getRace(actor) {
|
||
|
return actor.itemTypes[ITEM_TYPES.race].find(it => true) ?? RdDItemRace.getFallbackRace()
|
||
|
}
|
||
|
|
||
|
static getFallbackRace() {
|
||
|
if (RdDItemRace.fallback == undefined) {
|
||
|
RdDItemRace.fallback = new RdDItemRace({ name: 'Humain', type: RdDItemRace.ITEM_TYPE })
|
||
|
}
|
||
|
return RdDItemRace.fallback
|
||
|
}
|
||
|
|
||
|
|
||
|
isMax(actor, code, value = undefined) {
|
||
|
const path = RdDCarac.carac(code)?.path
|
||
|
if (value == undefined) {
|
||
|
value = path ? foundry.utils.getProperty(actor, path) : 0
|
||
|
}
|
||
|
if (code == LIST_CARAC.force.code) {
|
||
|
return value >= this.getForceMax(actor)
|
||
|
}
|
||
|
const max = foundry.utils.getProperty(this, path) ?? -1
|
||
|
return (max > 0 && value >= max)
|
||
|
}
|
||
|
|
||
|
getValidTaille(taille) {
|
||
|
const min = Math.max(this.system.carac.taille.min, 0)
|
||
|
if (min > taille) {
|
||
|
ui.notifications.warn("La Taille est inférieur au minimum racial")
|
||
|
return min
|
||
|
}
|
||
|
const raceMax = this.system.carac.taille.max;
|
||
|
const max = raceMax < 0 ? taille + 1 : raceMax
|
||
|
if (max < taille) {
|
||
|
ui.notifications.warn("La Taille est supérieure au maximum racial")
|
||
|
return max
|
||
|
}
|
||
|
return taille
|
||
|
}
|
||
|
|
||
|
isForceValid(actor, value) {
|
||
|
return value <= this.getForceMax(actor)
|
||
|
}
|
||
|
|
||
|
getForceMax(actor) {
|
||
|
const terms = this.system.carac.force.limit.replaceAll(' ', '').split('+')
|
||
|
return terms.map(
|
||
|
it => {
|
||
|
const term = Number.parseInt(it)
|
||
|
if (Number.isInteger(term)) {
|
||
|
return term
|
||
|
}
|
||
|
const path = RdDCarac.carac(it)?.path
|
||
|
if (path) {
|
||
|
return foundry.utils.getProperty(actor, path)
|
||
|
}
|
||
|
return 0
|
||
|
}
|
||
|
).reduce(Misc.sum());
|
||
|
}
|
||
|
}
|