Vincent Vandemeulebrouck
2fa0ce5f15
L'item "race" permet de paramétrer des ajustements de caracs, des min/max de taille, et une limite de force. Ajouter une race à un acteur enlève la/les races précédentes et ajoute les modificateurs de caracs de la nouvelle race. Enlever une race enlève les modificateurs de caracs de la race aux caractéristiques
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());
|
|
}
|
|
} |