Support de races

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
This commit is contained in:
2024-12-29 01:52:37 +01:00
parent b4eed49e9a
commit 2fa0ce5f15
49 changed files with 2850 additions and 532 deletions

View File

@ -1,9 +1,11 @@
import { RdDItem } from "../item.js";
import { ITEM_TYPES, RdDItem } from "../item.js";
import { Misc } from "../misc.js";
import { ReglesOptionnelles } from "../settings/regles-optionnelles.js";
export class RdDItemArmure extends RdDItem {
static get ITEM_TYPE() { return ITEM_TYPES.armure }
static get defaultIcon() {
return "systems/foundryvtt-reve-de-dragon/icons/armes_armures/armure_plaques.webp";
}

100
module/item/race.js Normal file
View File

@ -0,0 +1,100 @@
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());
}
}

View File

@ -1,11 +1,12 @@
import { RdDBaseActorSheet } from "../actor/base-actor-sheet.js";
import { ITEM_TYPES } from "../item.js";
import { RdDSheetUtility } from "../rdd-sheet-utility.js";
import { RdDUtility } from "../rdd-utility.js";
import { RdDItemInventaireSheet } from "./sheet-base-inventaire.js";
export class RdDConteneurItemSheet extends RdDItemInventaireSheet {
static get ITEM_TYPE() { return "conteneur" };
static get ITEM_TYPE() { return ITEM_TYPES.conteneur };
async getData() {
const formData = await super.getData();