Fix Roll20 types, getTranslationByKey return false not undefined.

This commit is contained in:
Karlinator
2021-02-20 18:42:21 +01:00
parent ac6683f6a7
commit 0ab47fee07
8 changed files with 36 additions and 34 deletions
+4 -2
View File
@@ -10,9 +10,11 @@ declare type EventInfo = {
removedInfo: string
}
declare type AttributeContent = string | number | boolean
declare function getAttrs(attributes: string[], callback?: (values: {[key: string]: string}) => void): void
declare function setAttrs(values: {[key: string]: string | number | boolean}, options?: {silent?: boolean}, callback?: (values: {[key: string]: string}) => void): void
declare function setAttrs(values: {[key: string]: AttributeContent}, options?: {silent?: boolean}, callback?: (values: {[key: string]: string}) => void): void
declare function getSectionIDs(section_name: string, callback: (values: string[]) => void): void
@@ -20,7 +22,7 @@ declare function generateRowID(): string
declare function removeRepeatingRow(RowID: string): void
declare function getTranslationByKey(key: string): string | undefined
declare function getTranslationByKey(key: string): string | false
declare function getTranslationLanguage(): string
@@ -4,9 +4,9 @@
/* Autofill stuff */
const fillClassStats = () => {
getAttrs(["class", "class_ability", "attack_bonus"], v => {
const label = v.class && reverseClasses[v.class.toLowerCase()];
const label = v.class && reverseClasses[v.class ? v.class.toLowerCase() : ""];
if (label && autofillData.classes.hasOwnProperty(label)) {
const data: {[key: string]: string} = Object.assign({}, autofillData.classes[label]);
const data: {[key: string]: string | false} = Object.assign({}, autofillData.classes[label]);
Object.keys(data).forEach(key => {
if (!(["", "0"].includes(`${v[key]}`))) delete data[key];
});
@@ -39,7 +39,7 @@ const getAutofillData = ({sName, v, data, label}: AutofillData) => {
// inclusion into the sheet.
const output = Object.assign({}, data);
if (sName === "ship-defenses") {
if (label) output.defense_name = translate(label.toUpperCase());
if (label) output.defense_name = translate(label.toUpperCase()) ? translate(label.toUpperCase()) : "false";
if (output.defense_mass.includes("#")) {
output.defense_mass = `${parseInt(output.defense_mass) * v.ship_multiplier}`;
}
@@ -210,7 +210,7 @@ const generateAutofillInfo = (sName: string) => {
});
};
const fillRepeatingSectionFromData = (sName: string, data: {[key: string]: string}[] | {[key: string]: string}, callback?: () => void) => {
const fillRepeatingSectionFromData = (sName: string, data: {[key: string]: AttributeContent}[] | {[key: string]: AttributeContent}, callback?: () => void) => {
// Populates the repeating section repeating_${SName} with new
// rows from the data array. Every entry of the array is expected
// to be an object, and its key/value pairs will be written into
@@ -344,7 +344,7 @@ const generateWeaponDisplay = () => {
const weaponDamage = (v[`${prefix}_weapon_damage`] === "0") ? "" : v[`${prefix}_weapon_damage`];
const shockString = (v[`${prefix}_weapon_shock`] !== "0") ? `, ${
(parseInt(v[`${prefix}_weapon_shock_damage`])||0) + damageBonus
}\xa0${translate("SHOCK").toLowerCase()}${
}\xa0${translate("SHOCK").toString().toLowerCase()}${
v[`${prefix}_weapon_shock_ac`] ? ` ${translate("VS_AC_LEQ")} ${v[`${prefix}_weapon_shock_ac`]}` : ""
}` : "";
@@ -355,7 +355,7 @@ const generateWeaponDisplay = () => {
damageBonus);
setting[`${prefix}_weapon_attack_display`] = (attack >= 0) ? `+${attack}` : attack.toString();
setting[`${prefix}_weapon_damage_display`] = `${damage || 0}\xa0${translate("DAMAGE").toLowerCase()}${shockString}`;
setting[`${prefix}_weapon_damage_display`] = `${damage || 0}\xa0${translate("DAMAGE").toString().toLowerCase()}${shockString}`;
});
setting.macro_weapons = prefixes.map((prefix, index) => {
const label = `${v[`${prefix}_weapon_name`]} (${setting[`${prefix}_weapon_attack_display`]})`;
@@ -50,27 +50,27 @@ const shipStats = ["ship_ac", "ship_armor", "ship_class", "ship_crew_max", "ship
"ship_hardpoints_max", "ship_hp", "ship_hp_max", "ship_mass_max", "ship_power_max", "ship_speed", "ship_hull_price",
];
const reverseHullTypes = {
[translate("BATTLESHIP").toLowerCase()]: "battleship",
[translate("BULK_FREIGHTER").toLowerCase()]: "bulk_freighter",
[translate("CARRIER").toLowerCase()]: "carrier",
[translate("CORVETTE").toLowerCase()]: "corvette",
[translate("FLEET_CRUISER").toLowerCase()]: "fleet_cruiser",
[translate("FREE_MERCHANT").toLowerCase()]: "free_merchant",
[translate("HEAVY_FRIGATE").toLowerCase()]: "heavy_frigate",
[translate("LARGE_STATION").toLowerCase()]: "large_station",
[translate("PATROL_BOAT").toLowerCase()]: "patrol_boat",
[translate("SMALL_STATION").toLowerCase()]: "small station",
[translate("STRIKE_FIGHTER").toLowerCase()]: "strike_fighter",
[translate("SHUTTLE").toLowerCase()]: "shuttle",
[translate("BATTLESHIP").toString().toLowerCase()]: "battleship",
[translate("BULK_FREIGHTER").toString().toLowerCase()]: "bulk_freighter",
[translate("CARRIER").toString().toLowerCase()]: "carrier",
[translate("CORVETTE").toString().toLowerCase()]: "corvette",
[translate("FLEET_CRUISER").toString().toLowerCase()]: "fleet_cruiser",
[translate("FREE_MERCHANT").toString().toLowerCase()]: "free_merchant",
[translate("HEAVY_FRIGATE").toString().toLowerCase()]: "heavy_frigate",
[translate("LARGE_STATION").toString().toLowerCase()]: "large_station",
[translate("PATROL_BOAT").toString().toLowerCase()]: "patrol_boat",
[translate("SMALL_STATION").toString().toLowerCase()]: "small station",
[translate("STRIKE_FIGHTER").toString().toLowerCase()]: "strike_fighter",
[translate("SHUTTLE").toString().toLowerCase()]: "shuttle",
};
const reverseClasses = {
[translate("ADVENTURER").toLowerCase()]: "adventurer",
[translate("EXPERT").toLowerCase()]: "expert",
[translate("PSYCHIC").toLowerCase()]: "psychic",
[translate("WARRIOR").toLowerCase()]: "warrior",
[translate("ADVENTURER").toString().toLowerCase()]: "adventurer",
[translate("EXPERT").toString().toLowerCase()]: "expert",
[translate("PSYCHIC").toString().toLowerCase()]: "psychic",
[translate("WARRIOR").toString().toLowerCase()]: "warrior",
};
const autofillSections = ["armor", "cyberware", "foci", "gear", "ship-defenses", "ship-fittings", "ship-weapons", "techniques", "weapons"];
const autofillData: {[key: string]: {[key: string]: {[key: string]: string}}} = {
const autofillData: {[key: string]: {[key: string]: {[key: string]: string | false}}} = {
"classes": {
adventurer: {
class_ability: translate("ADVENTURER_CLASS_ABILITY"),
@@ -1274,7 +1274,7 @@ const autofillData: {[key: string]: {[key: string]: {[key: string]: string}}} =
"ship-defenses": {
ablative_hull_compartments: {
class: "CAPITAL",
defense_effect: `+1 ${translate("AC")}, +20 ${translate("MAXIMUM_HIT_POINTS").toLowerCase()}.`,
defense_effect: `+1 ${translate("AC")}, +20 ${translate("MAXIMUM_HIT_POINTS").toString().toLowerCase()}.`,
defense_mass: "2#",
defense_power: "5",
defense_price: "100000*",
@@ -7,9 +7,9 @@ const fillNPC = () => {
const {
HD, AC, npc_attack_bonus, damage, attacks, npc_move,
npc_morale, npc_skills, npc_saves, armor_type
}: {[key: string]: string} = autofillData.statblocks[v.npc_stat_block];
}: {[key: string]: string | false} = autofillData.statblocks[v.npc_stat_block];
const setting: {[key: string]: string} = {
const setting: {[key: string]: string | false} = {
AC,
npc_attack_bonus,
npc_move,
@@ -19,7 +19,7 @@ const fillNPC = () => {
};
if (armor_type) setting.npc_armor_type = armor_type;
if (HD.includes("hp")) setting.HP = HD.replace("hp", "");
if (typeof HD === "string" && HD.includes("hp")) setting.HP = HD.replace("hp", "");
else setting.npc_hd = HD;
setAttrs(setting);
@@ -20,15 +20,15 @@ const setShipClass = () => {
// Sets the internal ship_class_normalised attribute responsible
// for filtering ship modules according to class.
getAttrs(["ship_class", "ship_class_normalised"], v => {
if (["fighter", translate("FIGHTER").toLowerCase()].includes(v.ship_class.toLowerCase()))
if (["fighter", translate("FIGHTER").toString().toLowerCase()].includes(v.ship_class.toLowerCase()))
setAttrs({
ship_class_normalised: "fighter"
});
else if (["frigate", translate("FRIGATE").toLowerCase()].includes(v.ship_class.toLowerCase()))
else if (["frigate", translate("FRIGATE").toString().toLowerCase()].includes(v.ship_class.toLowerCase()))
setAttrs({
ship_class_normalised: "frigate"
});
else if (["cruiser", translate("CRUISER").toLowerCase()].includes(v.ship_class.toLowerCase()))
else if (["cruiser", translate("CRUISER").toString().toLowerCase()].includes(v.ship_class.toLowerCase()))
setAttrs({
ship_class_normalised: "cruiser"
});
@@ -31,7 +31,7 @@ const setTranslatedDefaults = () => {
if (v[name] === data.default && v[name] !== data.trans) setting[name] = data.trans;
});
}
setting.innate_ac_name = translate("INNATE_AC");
setting.innate_ac_name = translate("INNATE_AC").toString();
mySetAttrs(setting, v);
});
};
@@ -8,7 +8,7 @@ const sign = (value: number | string):string => {
};
const sum = (list: string[]) => list.reduce((m, c) => m + (parseInt(c) || 0), 0);
const buildLink = (caption: string, ability: string, last?: boolean) => `[${caption}${!last ? "," : ""}](~${ability})`;
const mySetAttrs = (setting: {[key: string]: string | number | boolean}, values: {[key: string]: string}, ...rest: any[]) => {
const mySetAttrs = (setting: {[key: string]: AttributeContent}, values: {[key: string]: string}, ...rest: any[]) => {
// This is a version of setAttrs that expects an extra values parameter
// (as received from getAttrs). It will only set values in setting that differ
// from their current value on the sheet. The intention is to not