151 lines
6.0 KiB
JavaScript
151 lines
6.0 KiB
JavaScript
|
|
import BasePackage from "./base-package.mjs";
|
||
|
|
import * as fields from "../data/fields.mjs";
|
||
|
|
import AdditionalTypesField from "./sub-types.mjs";
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @typedef {import("./sub-types.mjs").DocumentTypesConfiguration} DocumentTypesConfiguration
|
||
|
|
*/
|
||
|
|
|
||
|
|
/**
|
||
|
|
* The data schema used to define System manifest files.
|
||
|
|
* Extends the basic PackageData schema with some additional system-specific fields.
|
||
|
|
* @property {DocumentTypesConfiguration} [documentTypes] Additional document subtypes provided by this system.
|
||
|
|
* @property {string} [background] A web URL or local file path which provides a default background banner for
|
||
|
|
* worlds which are created using this system
|
||
|
|
* @property {string} [initiative] A default initiative formula used for this system
|
||
|
|
* @property {number} [grid] The default grid settings to use for Scenes in this system
|
||
|
|
* @property {number} [grid.type] A default grid type to use for Scenes in this system
|
||
|
|
* @property {number} [grid.distance] A default distance measurement to use for Scenes in this system
|
||
|
|
* @property {string} [grid.units] A default unit of measure to use for distance measurement in this system
|
||
|
|
* @property {number} [grid.diagonals] The default rule used by this system for diagonal measurement on square grids
|
||
|
|
* @property {string} [primaryTokenAttribute] An Actor data attribute path to use for Token primary resource bars
|
||
|
|
* @property {string} [secondaryTokenAttribute] An Actor data attribute path to use for Token secondary resource bars
|
||
|
|
*/
|
||
|
|
export default class BaseSystem extends BasePackage {
|
||
|
|
|
||
|
|
/** @inheritDoc */
|
||
|
|
static defineSchema() {
|
||
|
|
return Object.assign({}, super.defineSchema(), {
|
||
|
|
documentTypes: new AdditionalTypesField(),
|
||
|
|
background: new fields.StringField({required: false, blank: false}),
|
||
|
|
initiative: new fields.StringField(),
|
||
|
|
grid: new fields.SchemaField({
|
||
|
|
type: new fields.NumberField({required: true, choices: Object.values(CONST.GRID_TYPES),
|
||
|
|
initial: CONST.GRID_TYPES.SQUARE, validationError: "must be a value in CONST.GRID_TYPES"}),
|
||
|
|
distance: new fields.NumberField({required: true, nullable: false, positive: true, initial: 1}),
|
||
|
|
units: new fields.StringField({required: true}),
|
||
|
|
diagonals: new fields.NumberField({required: true, choices: Object.values(CONST.GRID_DIAGONALS),
|
||
|
|
initial: CONST.GRID_DIAGONALS.EQUIDISTANT, validationError: "must be a value in CONST.GRID_DIAGONALS"}),
|
||
|
|
}),
|
||
|
|
primaryTokenAttribute: new fields.StringField(),
|
||
|
|
secondaryTokenAttribute: new fields.StringField()
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
/** @inheritdoc */
|
||
|
|
static type = "system";
|
||
|
|
|
||
|
|
/**
|
||
|
|
* The default icon used for this type of Package.
|
||
|
|
* @type {string}
|
||
|
|
*/
|
||
|
|
static icon = "fa-dice";
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Does the system template request strict type checking of data compared to template.json inferred types.
|
||
|
|
* @type {boolean}
|
||
|
|
*/
|
||
|
|
strictDataCleaning = false;
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
/* Deprecations and Compatibility */
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Static initializer block for deprecated properties.
|
||
|
|
*/
|
||
|
|
static {
|
||
|
|
/**
|
||
|
|
* Shim grid distance and units.
|
||
|
|
* @deprecated since v12
|
||
|
|
*/
|
||
|
|
Object.defineProperties(this.prototype, Object.fromEntries(
|
||
|
|
Object.entries({
|
||
|
|
gridDistance: "grid.distance",
|
||
|
|
gridUnits: "grid.units"
|
||
|
|
}).map(([o, n]) => [o, {
|
||
|
|
get() {
|
||
|
|
const msg = `You are accessing BasePackage#${o} which has been migrated to BasePackage#${n}.`;
|
||
|
|
foundry.utils.logCompatibilityWarning(msg, {since: 12, until: 14});
|
||
|
|
return foundry.utils.getProperty(this, n);
|
||
|
|
},
|
||
|
|
set(v) {
|
||
|
|
const msg = `You are accessing BasePackage#${o} which has been migrated to BasePackage#${n}.`;
|
||
|
|
foundry.utils.logCompatibilityWarning(msg, {since: 12, until: 14});
|
||
|
|
return foundry.utils.setProperty(this, n, v);
|
||
|
|
},
|
||
|
|
configurable: true
|
||
|
|
}])
|
||
|
|
));
|
||
|
|
}
|
||
|
|
|
||
|
|
/* -------------------------------------------- */
|
||
|
|
|
||
|
|
/** @override */
|
||
|
|
static migratedKeys = (function() {
|
||
|
|
return BasePackage.migratedKeys.union(new Set([
|
||
|
|
/** @deprecated since 12 until 14 */
|
||
|
|
"gridDistance", "gridUnits"
|
||
|
|
]));
|
||
|
|
})();
|
||
|
|
|
||
|
|
/* ---------------------------------------- */
|
||
|
|
|
||
|
|
/** @inheritdoc */
|
||
|
|
static migrateData(data, options) {
|
||
|
|
/**
|
||
|
|
* Migrate grid distance and units.
|
||
|
|
* @deprecated since v12
|
||
|
|
*/
|
||
|
|
for ( const [oldKey, [newKey, apply]] of Object.entries({
|
||
|
|
gridDistance: ["grid.distance", d => Math.max(d.gridDistance || 0, 1)],
|
||
|
|
gridUnits: ["grid.units", d => d.gridUnits || ""]
|
||
|
|
})) {
|
||
|
|
if ( (oldKey in data) && !foundry.utils.hasProperty(data, newKey) ) {
|
||
|
|
foundry.utils.setProperty(data, newKey, apply(data));
|
||
|
|
delete data[oldKey];
|
||
|
|
const warning = `The ${this.type} "${data.id}" is using "${oldKey}" which is deprecated in favor of "${newKey}".`;
|
||
|
|
this._logWarning(data.id, warning, {since: 12, until: 14, stack: false, installed: options.installed});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return super.migrateData(data, options);
|
||
|
|
}
|
||
|
|
|
||
|
|
/* ---------------------------------------- */
|
||
|
|
|
||
|
|
/** @inheritdoc */
|
||
|
|
static shimData(data, options) {
|
||
|
|
/**
|
||
|
|
* Shim grid distance and units.
|
||
|
|
* @deprecated since v12
|
||
|
|
*/
|
||
|
|
for ( const [oldKey, newKey] of Object.entries({
|
||
|
|
gridDistance: "grid.distance",
|
||
|
|
gridUnits: "grid.units"
|
||
|
|
})) {
|
||
|
|
if ( !data.hasOwnProperty(oldKey) && foundry.utils.hasProperty(data, newKey) ) {
|
||
|
|
Object.defineProperty(data, oldKey, {
|
||
|
|
get: () => {
|
||
|
|
const msg = `You are accessing BasePackage#${oldKey} which has been migrated to BasePackage#${newKey}.`;
|
||
|
|
foundry.utils.logCompatibilityWarning(msg, {since: 12, until: 14});
|
||
|
|
return foundry.utils.getProperty(data, newKey);
|
||
|
|
},
|
||
|
|
set: value => foundry.utils.setProperty(data, newKey, value),
|
||
|
|
configurable: true
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return super.shimData(data, options);
|
||
|
|
}
|
||
|
|
}
|