Compare commits

..

No commits in common. "main" and "master" have entirely different histories.
main ... master

2 changed files with 37 additions and 63 deletions

View file

@ -4,11 +4,11 @@
"description": "Adds a browser to easily find and copy Active Effect data paths in Daggerheart.", "description": "Adds a browser to easily find and copy Active Effect data paths in Daggerheart.",
"url": "https://git.geeks.gay/cosmo/dh-path-browser", "url": "https://git.geeks.gay/cosmo/dh-path-browser",
"manifest": "https://git.geeks.gay/cosmo/dh-path-browser/raw/branch/main/module.json", "manifest": "https://git.geeks.gay/cosmo/dh-path-browser/raw/branch/main/module.json",
"download": "https://git.geeks.gay/cosmo/dh-path-browser/releases/download/1.1.1/dh-path-browser.zip", "download": "https://git.geeks.gay/cosmo/dh-path-browser/releases/download/1.0.0/dh-path-browser.zip",
"version": "1.1.1", "version": "1.0.0",
"compatibility": { "compatibility": {
"minimum": "13", "minimum": "13",
"verified": "14" "verified": "13"
}, },
"authors": [ "authors": [
{ {
@ -31,7 +31,7 @@
"id": "daggerheart", "id": "daggerheart",
"type": "system", "type": "system",
"compatibility": { "compatibility": {
"minimum": "1.9.9" "minimum": "1.9.4"
} }
} }
] ]

View file

@ -97,87 +97,61 @@ export class DhPathBrowserApp extends HandlebarsApplicationMixin(ApplicationV2)
static getChangeChoices() { static getChangeChoices() {
const ignoredActorKeys = ['config', 'DhEnvironment', 'DhParty']; const ignoredActorKeys = ['config', 'DhEnvironment', 'DhParty'];
const getTranslations = (model, path) => { const getAllLeaves = (root, group, parentPath = '') => {
if (path === 'resources.hope.max')
return {
label: game.i18n.localize('DAGGERHEART.SETTINGS.Homebrew.FIELDS.maxHope.label'),
hint: ''
};
// Armor overrides
if (path.endsWith('armor.max')) return { label: game.i18n.localize('DAGGERHEART.ArmorScoreMax'), hint: '' };
if (path.endsWith('armor.current')) return { label: game.i18n.localize('DAGGERHEART.ArmorScoreCurrent'), hint: '' };
const field = model.schema.getField(path);
return {
label: field ? game.i18n.localize(field.label) : path,
hint: field ? game.i18n.localize(field.hint) : ''
};
};
const getAllLeaves = (model, root, group, parentPath = '') => {
if (!root) return [];
const leaves = []; const leaves = [];
const rootKey = `${parentPath ? `${parentPath}.` : ''}${root.name}`; const rootKey = `${parentPath ? `${parentPath}.` : ''}${root.name}`;
for (const field of Object.values(root.fields)) {
const fields = root.fields || root; if (field instanceof foundry.data.fields.SchemaField)
leaves.push(...getAllLeaves(field, group, rootKey));
for (const [name, field] of Object.entries(fields)) { else
const currentPath = `${rootKey}.${name}`;
if (field instanceof foundry.data.fields.SchemaField) {
leaves.push(...getAllLeaves(model, field, group, rootKey));
} else {
const trans = getTranslations(model, currentPath);
leaves.push({ leaves.push({
value: currentPath, value: `${rootKey}.${field.name}`,
label: trans.label || name, label: game.i18n.localize(field.label),
hint: trans.hint || '', hint: game.i18n.localize(field.hint),
group group
}); });
}
} }
return leaves; return leaves;
}; };
const choices = []; return Object.keys(game.system.api.models.actors).reduce((acc, key) => {
if (ignoredActorKeys.includes(key)) return acc;
// Process Actors
for (const [key, model] of Object.entries(game.system.api.models.actors)) {
if (ignoredActorKeys.includes(key) || !model?.metadata) continue;
const model = game.system.api.models.actors[key];
const group = game.i18n.localize(model.metadata.label); const group = game.i18n.localize(model.metadata.label);
const attributes = CONFIG.Token.documentClass.getTrackedAttributes(model.metadata.type); const attributes = CONFIG.Token.documentClass.getTrackedAttributes(model.metadata.type);
const getTranslations = path => {
if (path === 'resources.hope.max')
return {
label: game.i18n.localize('DAGGERHEART.SETTINGS.Homebrew.FIELDS.maxHope.label'),
hint: ''
};
const field = model.schema.getField(path);
return {
label: field ? game.i18n.localize(field.label) : path,
hint: field ? game.i18n.localize(field.hint) : ''
};
};
const bars = attributes.bar.flatMap(x => { const bars = attributes.bar.flatMap(x => {
const baseJoined = x.join('.'); const baseJoined = x.join('.');
return [ return [
{ value: `${baseJoined}.max`, ...getTranslations(model, `${baseJoined}.max`), group }, { value: `${baseJoined}.max`, ...getTranslations(`${baseJoined}.max`), group },
{ value: `${baseJoined}.value`, ...getTranslations(model, `${baseJoined}.value`), group } { value: `${baseJoined}.value`, ...getTranslations(`${baseJoined}.value`), group }
]; ];
}); });
const values = attributes.value.flatMap(x => { const values = attributes.value.flatMap(x => {
const joined = x.join('.'); const joined = x.join('.');
return { value: joined, ...getTranslations(model, joined), group }; return { value: joined, ...getTranslations(joined), group };
}); });
const bonuses = getAllLeaves(model, model.schema.fields.bonuses, group); const bonuses = getAllLeaves(model.schema.fields.bonuses, group);
const rules = getAllLeaves(model, model.schema.fields.rules, group); const rules = getAllLeaves(model.schema.fields.rules, group);
const armor = getAllLeaves(model, model.schema.fields.armor, group);
choices.push(...bars, ...values, ...rules, ...bonuses, ...armor); acc.push(...bars, ...values, ...rules, ...bonuses);
} return acc;
}, []);
// Process Items
for (const [key, model] of Object.entries(game.system.api.models.items)) {
if (!model?.metadata) continue;
const group = `${game.i18n.localize('DOCUMENT.Item')} (${game.i18n.localize(model.metadata.label)})`;
const bonuses = getAllLeaves(model, model.schema.fields.bonuses, group);
const armor = getAllLeaves(model, model.schema.fields.armor, group);
choices.push(...bonuses, ...armor);
}
return choices;
} }
} }