Items: - CelestopolWeapon : degats (0/1/2/X), portee (contact/courte/longue), description - CelestopolArmure : protection (1-2), malus (0-2), description Config: - WEAPON_DAMAGE_TYPES et WEAPON_RANGE_TYPES ajoutés dans system.mjs - Enregistrement des DataModels, sheets et templates dans fvtt-celestopol.mjs - system.json : types weapon et armure avec htmlFields UI: - weapon.hbs : badge de dégâts avec hint, sélecteurs portée/dégâts - armure.hbs : blocs protection + malus art-déco - items.less : styles .weapon et .armure i18n: clés Weapon.*, Armure.*, Sheet.weapon, Sheet.armure Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
105 lines
4.6 KiB
JavaScript
105 lines
4.6 KiB
JavaScript
import { SYSTEM } from "../config/system.mjs"
|
|
|
|
/** Schéma partagé pour les bonus/malus par domaine (utilisé dans anomaly/aspect). */
|
|
function skillScoresSchema() {
|
|
const fields = foundry.data.fields
|
|
const reqInt = { required: true, nullable: false, integer: true }
|
|
const scoreField = () => new fields.SchemaField({
|
|
bonus: new fields.NumberField({ ...reqInt, initial: 0 }),
|
|
malus: new fields.NumberField({ ...reqInt, initial: 0 }),
|
|
})
|
|
|
|
const statGroup = (statId) => {
|
|
const skills = SYSTEM.SKILLS[statId]
|
|
const schema = {}
|
|
for (const key of Object.keys(skills)) {
|
|
schema[key] = scoreField()
|
|
}
|
|
return new fields.SchemaField(schema)
|
|
}
|
|
|
|
return new fields.SchemaField({
|
|
ame: statGroup("ame"),
|
|
corps: statGroup("corps"),
|
|
coeur: statGroup("coeur"),
|
|
esprit: statGroup("esprit"),
|
|
})
|
|
}
|
|
|
|
export class CelestopolAnomaly extends foundry.abstract.TypeDataModel {
|
|
static defineSchema() {
|
|
const fields = foundry.data.fields
|
|
const reqInt = { required: true, nullable: false, integer: true }
|
|
return {
|
|
subtype: new fields.StringField({ required: true, nullable: false, initial: "none",
|
|
choices: Object.keys(SYSTEM.ANOMALY_TYPES) }),
|
|
level: new fields.NumberField({ ...reqInt, initial: 2, min: 1, max: 4 }),
|
|
usesRemaining: new fields.NumberField({ ...reqInt, initial: 2, min: 0, max: 4 }),
|
|
technique: new fields.HTMLField({ required: true, textSearch: true }),
|
|
narratif: new fields.HTMLField({ required: true, textSearch: true }),
|
|
exemples: new fields.HTMLField({ required: true, textSearch: true }),
|
|
}
|
|
}
|
|
}
|
|
|
|
export class CelestopolAspect extends foundry.abstract.TypeDataModel {
|
|
static defineSchema() {
|
|
const fields = foundry.data.fields
|
|
const reqInt = { required: true, nullable: false, integer: true }
|
|
return {
|
|
value: new fields.NumberField({ ...reqInt, initial: 0, min: 0, max: 8 }),
|
|
scores: skillScoresSchema(),
|
|
description: new fields.HTMLField({ required: true, textSearch: true }),
|
|
technique: new fields.HTMLField({ required: true, textSearch: true }),
|
|
narratif: new fields.HTMLField({ required: true, textSearch: true }),
|
|
notes: new fields.HTMLField({ required: true, textSearch: true }),
|
|
}
|
|
}
|
|
}
|
|
|
|
export class CelestopolEquipment extends foundry.abstract.TypeDataModel {
|
|
static defineSchema() {
|
|
const fields = foundry.data.fields
|
|
const reqInt = { required: true, nullable: false, integer: true }
|
|
return {
|
|
subtype: new fields.StringField({ required: true, nullable: false, initial: "autre",
|
|
choices: Object.keys(SYSTEM.EQUIPMENT_TYPES) }),
|
|
quantity: new fields.NumberField({ ...reqInt, initial: 1, min: 0 }),
|
|
weight: new fields.NumberField({ required: true, nullable: false, initial: 0, min: 0 }),
|
|
damage: new fields.StringField({ required: true, nullable: false, initial: "" }),
|
|
range: new fields.StringField({ required: true, nullable: false, initial: "" }),
|
|
speed: new fields.StringField({ required: true, nullable: false, initial: "" }),
|
|
protection: new fields.StringField({ required: true, nullable: false, initial: "" }),
|
|
crew: new fields.StringField({ required: true, nullable: false, initial: "" }),
|
|
description:new fields.HTMLField({ required: true, textSearch: true }),
|
|
notes: new fields.HTMLField({ required: true, textSearch: true }),
|
|
}
|
|
}
|
|
}
|
|
|
|
export class CelestopolWeapon extends foundry.abstract.TypeDataModel {
|
|
static defineSchema() {
|
|
const fields = foundry.data.fields
|
|
const reqInt = { required: true, nullable: false, integer: true }
|
|
return {
|
|
degats: new fields.StringField({ required: true, nullable: false, initial: "0",
|
|
choices: Object.keys(SYSTEM.WEAPON_DAMAGE_TYPES) }),
|
|
portee: new fields.StringField({ required: true, nullable: false, initial: "contact",
|
|
choices: Object.keys(SYSTEM.WEAPON_RANGE_TYPES) }),
|
|
description: new fields.HTMLField({ required: true, textSearch: true }),
|
|
}
|
|
}
|
|
}
|
|
|
|
export class CelestopolArmure extends foundry.abstract.TypeDataModel {
|
|
static defineSchema() {
|
|
const fields = foundry.data.fields
|
|
const reqInt = { required: true, nullable: false, integer: true }
|
|
return {
|
|
protection: new fields.NumberField({ ...reqInt, initial: 1, min: 1, max: 2 }),
|
|
malus: new fields.NumberField({ ...reqInt, initial: 0, min: 0, max: 2 }),
|
|
description: new fields.HTMLField({ required: true, textSearch: true }),
|
|
}
|
|
}
|
|
}
|