ripcrypt/module/data/Item/Weapon.mjs
2025-01-09 23:53:53 -07:00

77 lines
1.6 KiB
JavaScript

import { barAttribute, optionalInteger, requiredInteger } from "../helpers.mjs";
import { gameTerms } from "../../gameTerms.mjs";
const { fields } = foundry.data;
export class WeaponData extends foundry.abstract.TypeDataModel {
// MARK: Schema
static defineSchema() {
return {
traits: new fields.SetField(
new fields.StringField({
blank: false,
trim: true,
nullable: false,
}),
{
nullable: false,
required: true,
},
),
range: new fields.SchemaField({
short: optionalInteger(),
long: optionalInteger(),
}),
damage: requiredInteger({ min: 0, initial: 0 }),
wear: barAttribute(0, 0, 4),
access: new fields.StringField({
blank: true,
nullable: false,
trim: true,
choices: gameTerms.Access,
}),
};
};
// MARK: Base Data
prepareBaseData() {
super.prepareBaseData();
};
// MARK: Derived Data
prepareDerivedData() {
super.prepareDerivedData();
};
// #region Getters
get traitString() {
return [...this.traits].join(`, `);
}
get rangeString() {
if (this.range.short && this.range.long) {
return `${this.range.short} / ${this.range.long}`;
};
return String(this.range.short ?? this.range.long ?? ``);
}
// #endregion
// #region Sheet Data
getFormFields(ctx) {
const fields = [
{ type: `set`, label: `Traits` },
{ type: `integer`, label: `Short Range` },
{ type: `integer`, label: `Long Range` },
{ type: `integer`, label: `Damage` },
{ type: `bar`, label: `Wear` },
{ type: `dropdown`, label: `Access` },
];
if (this.parent.isEmbedded) {
fields.push({ type: `boolean`, label: `Equipped` });
};
return fields;
};
// #endregion
};