mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-03-07 14:36:13 +01:00
parent
d2fc9fd648
commit
739a7a3c3f
2 changed files with 11 additions and 67 deletions
|
|
@ -8,10 +8,13 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac
|
||||||
this.changeChoices = Object.keys(game.system.api.models.actors).reduce((acc, key) => {
|
this.changeChoices = Object.keys(game.system.api.models.actors).reduce((acc, key) => {
|
||||||
if (!ignoredActorKeys.includes(key)) {
|
if (!ignoredActorKeys.includes(key)) {
|
||||||
const model = game.system.api.models.actors[key];
|
const model = game.system.api.models.actors[key];
|
||||||
const attributes = CONFIG.Token.documentClass.getTrackedAttributes(model, [], true);
|
const attributes = CONFIG.Token.documentClass.getTrackedAttributes(model);
|
||||||
|
// As per DHToken._getTrackedAttributesFromSchema, attributes.bar have a max version as well.
|
||||||
|
const maxAttributes = attributes.bar.map(x => [...x, 'max']);
|
||||||
|
attributes.value.push(...maxAttributes);
|
||||||
const group = game.i18n.localize(model.metadata.label);
|
const group = game.i18n.localize(model.metadata.label);
|
||||||
const choices = CONFIG.Token.documentClass
|
const choices = CONFIG.Token.documentClass
|
||||||
.getTrackedAttributeChoices(attributes, model, true)
|
.getTrackedAttributeChoices(attributes, model)
|
||||||
.map(x => ({ ...x, group: group }));
|
.map(x => ({ ...x, group: group }));
|
||||||
acc.push(...choices);
|
acc.push(...choices);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,66 +1,17 @@
|
||||||
export default class DHToken extends CONFIG.Token.documentClass {
|
export default class DHToken extends CONFIG.Token.documentClass {
|
||||||
/**@inheritdoc */
|
|
||||||
static getTrackedAttributes(data, _path = [], resourcesUseMax = false) {
|
|
||||||
// Case 1 - Infer attributes from schema structure.
|
|
||||||
if (data instanceof foundry.abstract.DataModel || foundry.utils.isSubclass(data, foundry.abstract.DataModel)) {
|
|
||||||
return this._getTrackedAttributesFromSchema(data.schema, _path, resourcesUseMax);
|
|
||||||
}
|
|
||||||
if (data instanceof foundry.data.fields.SchemaField)
|
|
||||||
return this._getTrackedAttributesFromSchema(data, _path, resourcesUseMax);
|
|
||||||
|
|
||||||
// Case 2 - Infer attributes from object structure.
|
|
||||||
if (Array.isArray(data) || foundry.utils.isPlainObject(data)) {
|
|
||||||
return this._getTrackedAttributesFromObject(data, _path);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Case 3 - Retrieve explicitly configured attributes.
|
|
||||||
if (!data || typeof data === 'string') {
|
|
||||||
const config = this._getConfiguredTrackedAttributes(data);
|
|
||||||
if (config) return config;
|
|
||||||
data = undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Track the path and record found attributes
|
|
||||||
if (data !== undefined) return { bar: [], value: [] };
|
|
||||||
|
|
||||||
// Case 4 - Infer attributes from system template.
|
|
||||||
const bar = new Set();
|
|
||||||
const value = new Set();
|
|
||||||
for (const [type, model] of Object.entries(game.model.Actor)) {
|
|
||||||
const dataModel = CONFIG.Actor.dataModels?.[type];
|
|
||||||
const inner = this.getTrackedAttributes(dataModel ?? model, _path);
|
|
||||||
inner.bar.forEach(attr => bar.add(attr.join('.')));
|
|
||||||
inner.value.forEach(attr => value.add(attr.join('.')));
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
bar: Array.from(bar).map(attr => attr.split('.')),
|
|
||||||
value: Array.from(value).map(attr => attr.split('.'))
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Inspect the Actor data model and identify the set of attributes which could be used for a Token Bar.
|
* Inspect the Actor data model and identify the set of attributes which could be used for a Token Bar.
|
||||||
* @param {object} attributes The tracked attributes which can be chosen from
|
* @param {object} attributes The tracked attributes which can be chosen from
|
||||||
* @returns {object} A nested object of attribute choices to display
|
* @returns {object} A nested object of attribute choices to display
|
||||||
*/
|
*/
|
||||||
static getTrackedAttributeChoices(attributes, model, resourcesUseMax = false) {
|
static getTrackedAttributeChoices(attributes, model) {
|
||||||
attributes = attributes || this.getTrackedAttributes();
|
attributes = attributes || this.getTrackedAttributes();
|
||||||
const barGroup = game.i18n.localize('TOKEN.BarAttributes');
|
const barGroup = game.i18n.localize('TOKEN.BarAttributes');
|
||||||
const valueGroup = game.i18n.localize('TOKEN.BarValues');
|
const valueGroup = game.i18n.localize('TOKEN.BarValues');
|
||||||
|
|
||||||
const bars = attributes.bar.map(v => {
|
const bars = attributes.bar.map(v => {
|
||||||
/* Ugly solution for hope */
|
|
||||||
const isHope = resourcesUseMax && v.includes('hope');
|
|
||||||
|
|
||||||
const a = v.join('.');
|
const a = v.join('.');
|
||||||
const modelLabel = model
|
const modelLabel = model ? game.i18n.localize(model.schema.getField(`${a}.value`).label) : null;
|
||||||
? game.i18n.localize(
|
|
||||||
isHope
|
|
||||||
? 'DAGGERHEART.SETTINGS.Homebrew.FIELDS.maxHope.label'
|
|
||||||
: model.schema.getField(`${resourcesUseMax ? a : `${a}.value`}`).label
|
|
||||||
)
|
|
||||||
: null;
|
|
||||||
return { group: barGroup, value: a, label: modelLabel ? modelLabel : a };
|
return { group: barGroup, value: a, label: modelLabel ? modelLabel : a };
|
||||||
});
|
});
|
||||||
bars.sort((a, b) => a.label.compare(b.label));
|
bars.sort((a, b) => a.label.compare(b.label));
|
||||||
|
|
@ -96,7 +47,7 @@ export default class DHToken extends CONFIG.Token.documentClass {
|
||||||
return bars.concat(values);
|
return bars.concat(values);
|
||||||
}
|
}
|
||||||
|
|
||||||
static _getTrackedAttributesFromSchema(schema, _path = [], resourcesUseMax = false) {
|
static _getTrackedAttributesFromSchema(schema, _path = []) {
|
||||||
const attributes = { bar: [], value: [] };
|
const attributes = { bar: [], value: [] };
|
||||||
for (const [name, field] of Object.entries(schema.fields)) {
|
for (const [name, field] of Object.entries(schema.fields)) {
|
||||||
const p = _path.concat([name]);
|
const p = _path.concat([name]);
|
||||||
|
|
@ -111,20 +62,10 @@ export default class DHToken extends CONFIG.Token.documentClass {
|
||||||
if (isSchema || isModel) {
|
if (isSchema || isModel) {
|
||||||
const schema = isModel ? field.model.schema : field;
|
const schema = isModel ? field.model.schema : field;
|
||||||
const isBar = schema.has && schema.has('value') && schema.has('max');
|
const isBar = schema.has && schema.has('value') && schema.has('max');
|
||||||
if (isBar) {
|
if (isBar) attributes.bar.push(p);
|
||||||
attributes.bar.push(p);
|
else {
|
||||||
} else {
|
|
||||||
const inner = this.getTrackedAttributes(schema, p);
|
const inner = this.getTrackedAttributes(schema, p);
|
||||||
|
attributes.bar.push(...inner.bar);
|
||||||
/* TODO: Ugly solution. Hope doesn't have a max in schema, it's set in prepareData, so it's not counted as a bar */
|
|
||||||
if (name === 'hope') {
|
|
||||||
inner.bar = [['resources', 'hope']];
|
|
||||||
inner.value = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
attributes.bar.push(
|
|
||||||
...(inner.bar.length ? inner.bar.map(x => [...x, ...(resourcesUseMax ? ['max'] : [])]) : [])
|
|
||||||
);
|
|
||||||
attributes.value.push(...inner.value);
|
attributes.value.push(...inner.value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue