Skip to content

Commit

Permalink
[#2528] Add categories to languages
Browse files Browse the repository at this point in the history
  • Loading branch information
arbron committed Nov 9, 2023
1 parent a73f852 commit 369a7cb
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 33 deletions.
2 changes: 2 additions & 0 deletions lang/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -807,6 +807,7 @@
"DND5E.LanguagesDruidic": "Druidic",
"DND5E.LanguagesDwarvish": "Dwarvish",
"DND5E.LanguagesElvish": "Elvish",
"DND5E.LanguagesExotic": "Exotic Languages",
"DND5E.LanguagesGiant": "Giant",
"DND5E.LanguagesGith": "Gith",
"DND5E.LanguagesGnoll": "Gnoll",
Expand All @@ -817,6 +818,7 @@
"DND5E.LanguagesInfernal": "Infernal",
"DND5E.LanguagesOrc": "Orc",
"DND5E.LanguagesPrimordial": "Primordial",
"DND5E.LanguagesStandard": "Standard Languages",
"DND5E.LanguagesSylvan": "Sylvan",
"DND5E.LanguagesTerran": "Terran",
"DND5E.LanguagesThievesCant": "Thieves' Cant",
Expand Down
83 changes: 55 additions & 28 deletions module/config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -1683,38 +1683,62 @@ DND5E.conditionTypes = {
};
preLocalize("conditionTypes", { sort: true });

/* -------------------------------------------- */
/* Languages */
/* -------------------------------------------- */

/**
* Languages a character can learn.
* @enum {string}
*/
DND5E.languages = {
common: "DND5E.LanguagesCommon",
aarakocra: "DND5E.LanguagesAarakocra",
abyssal: "DND5E.LanguagesAbyssal",
aquan: "DND5E.LanguagesAquan",
auran: "DND5E.LanguagesAuran",
celestial: "DND5E.LanguagesCelestial",
deep: "DND5E.LanguagesDeepSpeech",
draconic: "DND5E.LanguagesDraconic",
druidic: "DND5E.LanguagesDruidic",
dwarvish: "DND5E.LanguagesDwarvish",
elvish: "DND5E.LanguagesElvish",
giant: "DND5E.LanguagesGiant",
gith: "DND5E.LanguagesGith",
gnomish: "DND5E.LanguagesGnomish",
goblin: "DND5E.LanguagesGoblin",
gnoll: "DND5E.LanguagesGnoll",
halfling: "DND5E.LanguagesHalfling",
ignan: "DND5E.LanguagesIgnan",
infernal: "DND5E.LanguagesInfernal",
orc: "DND5E.LanguagesOrc",
primordial: "DND5E.LanguagesPrimordial",
sylvan: "DND5E.LanguagesSylvan",
terran: "DND5E.LanguagesTerran",
cant: "DND5E.LanguagesThievesCant",
undercommon: "DND5E.LanguagesUndercommon"
};
preLocalize("languages", { sort: true });
standard: {
label: "DND5E.LanguagesStandard",
children: {
common: "DND5E.LanguagesCommon",
dwarvish: "DND5E.LanguagesDwarvish",
elvish: "DND5E.LanguagesElvish",
giant: "DND5E.LanguagesGiant",
gnomish: "DND5E.LanguagesGnomish",
goblin: "DND5E.LanguagesGoblin",
halfling: "DND5E.LanguagesHalfling",
orc: "DND5E.LanguagesOrc"
}
},
exotic: {
label: "DND5E.LanguagesExotic",
children: {
aarakocra: "DND5E.LanguagesAarakocra",
abyssal: "DND5E.LanguagesAbyssal",
celestial: "DND5E.LanguagesCelestial",
deep: "DND5E.LanguagesDeepSpeech",
draconic: "DND5E.LanguagesDraconic",
druidic: "DND5E.LanguagesDruidic",
gith: "DND5E.LanguagesGith",
gnoll: "DND5E.LanguagesGnoll",
infernal: "DND5E.LanguagesInfernal",
primordial: {
label: "DND5E.LanguagesPrimordial",
children: {
aquan: "DND5E.LanguagesAquan",
auran: "DND5E.LanguagesAuran",
ignan: "DND5E.LanguagesIgnan",
terran: "DND5E.LanguagesTerran"
}
},
sylvan: "DND5E.LanguagesSylvan",
undercommon: "DND5E.LanguagesUndercommon"
}
},
cant: "DND5E.LanguagesThievesCant"
};
preLocalize("languages", { key: "label" });
preLocalize("languages.standard.children", { sort: true });
preLocalize("languages.exotic.children", { key: "label", sort: true });
preLocalize("languages.exotic.children.primordial.children", { sort: true });
patchConfig("languages", "label", { since: "DnD5e 2.4", until: "DnD5e 2.6" });

/* -------------------------------------------- */

/**
* Maximum allowed character level.
Expand Down Expand Up @@ -2063,7 +2087,10 @@ function patchConfig(key, fallbackKey, options) {
return this[fallbackKey];
}

Object.values(DND5E[key]).forEach(o => o.toString = toString);
Object.values(DND5E[key]).forEach(o => {
if ( foundry.utils.getType(o) !== "Object" ) return;
o.toString = toString;
});
}

/* -------------------------------------------- */
Expand Down
25 changes: 20 additions & 5 deletions module/documents/actor/trait.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,7 @@ export function keyLabel(key, config={}) {
if ( !trait ) trait = parts.shift();
const traitConfig = CONFIG.DND5E.traits[trait];
if ( !traitConfig ) return key;
const traitData = CONFIG.DND5E[traitConfig.configKey ?? trait] ?? {};
let categoryLabel = game.i18n.localize(`${traitConfig.labels.localization}.${
pluralRules.select(count ?? 1)}`);

Expand All @@ -383,8 +384,11 @@ export function keyLabel(key, config={}) {
if ( lastKey === "*" ) {
let type;
if ( parts.length ) {
const category = CONFIG.DND5E[traitConfig.configKey ?? trait]?.[parts.pop()];
if ( !category ) return key;
let category = traitData;
do {
category = (category.children ?? category)[parts.shift()];
if ( !category ) return key;
} while (parts.length);
type = _innerLabel(category, traitConfig);
} else type = categoryLabel.toLowerCase();
const localization = `DND5E.TraitConfigChoose${final ? "Other" : `Any${count ? "Counted" : "Uncounted"}`}`;
Expand All @@ -393,7 +397,7 @@ export function keyLabel(key, config={}) {

else {
// Category (e.g. "Gaming Sets")
const category = CONFIG.DND5E[traitConfig.configKey ?? trait]?.[lastKey];
const category = traitData[lastKey];
if ( category ) return _innerLabel(category, traitConfig);

// Child (e.g. "Land Vehicle")
Expand All @@ -410,9 +414,20 @@ export function keyLabel(key, config={}) {
if ( index ) return index.name;
break;
}
}

return key;
// Explicit categories (e.g. languages)
const searchCategory = (data, key) => {
for ( const [k, v] of Object.entries(data) ) {
if ( k === key ) return v;
if ( v.children ) {
const result = searchCategory(v.children, key);
if ( result ) return result;
}
}
};
const config = searchCategory(traitData, lastKey);
return config ? _innerLabel(config, traitConfig) : key;
}
}

/* -------------------------------------------- */
Expand Down

0 comments on commit 369a7cb

Please sign in to comment.