From 0ab47fee07bb953746f931c2ff1bb314d9984d97 Mon Sep 17 00:00:00 2001 From: Karlinator Date: Sat, 20 Feb 2021 18:42:21 +0100 Subject: [PATCH] Fix Roll20 types, getTranslationByKey return false not undefined. --- .../Source/Roll20.d.ts | 6 ++-- .../Source/js/autofill.ts | 8 ++--- .../Source/js/calculations.ts | 4 +-- .../Source/js/constants.ts | 36 +++++++++---------- Stars_Without_Number_Revised/Source/js/npc.ts | 6 ++-- .../Source/js/ship.ts | 6 ++-- .../Source/js/translations.ts | 2 +- .../Source/js/util.ts | 2 +- 8 files changed, 36 insertions(+), 34 deletions(-) diff --git a/Stars_Without_Number_Revised/Source/Roll20.d.ts b/Stars_Without_Number_Revised/Source/Roll20.d.ts index 1ddfd667fe..4dea5c1200 100644 --- a/Stars_Without_Number_Revised/Source/Roll20.d.ts +++ b/Stars_Without_Number_Revised/Source/Roll20.d.ts @@ -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 diff --git a/Stars_Without_Number_Revised/Source/js/autofill.ts b/Stars_Without_Number_Revised/Source/js/autofill.ts index a0f8c0503a..57b9976e58 100644 --- a/Stars_Without_Number_Revised/Source/js/autofill.ts +++ b/Stars_Without_Number_Revised/Source/js/autofill.ts @@ -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 diff --git a/Stars_Without_Number_Revised/Source/js/calculations.ts b/Stars_Without_Number_Revised/Source/js/calculations.ts index 0b6e8f5ee9..0436e2412e 100644 --- a/Stars_Without_Number_Revised/Source/js/calculations.ts +++ b/Stars_Without_Number_Revised/Source/js/calculations.ts @@ -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`]})`; diff --git a/Stars_Without_Number_Revised/Source/js/constants.ts b/Stars_Without_Number_Revised/Source/js/constants.ts index 9d0349435c..a829ff4290 100644 --- a/Stars_Without_Number_Revised/Source/js/constants.ts +++ b/Stars_Without_Number_Revised/Source/js/constants.ts @@ -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*", diff --git a/Stars_Without_Number_Revised/Source/js/npc.ts b/Stars_Without_Number_Revised/Source/js/npc.ts index fec534c2bb..8d1b578295 100644 --- a/Stars_Without_Number_Revised/Source/js/npc.ts +++ b/Stars_Without_Number_Revised/Source/js/npc.ts @@ -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); diff --git a/Stars_Without_Number_Revised/Source/js/ship.ts b/Stars_Without_Number_Revised/Source/js/ship.ts index 529b1504e1..5e7502613f 100644 --- a/Stars_Without_Number_Revised/Source/js/ship.ts +++ b/Stars_Without_Number_Revised/Source/js/ship.ts @@ -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" }); diff --git a/Stars_Without_Number_Revised/Source/js/translations.ts b/Stars_Without_Number_Revised/Source/js/translations.ts index 0a7b71b0a2..0caceba781 100644 --- a/Stars_Without_Number_Revised/Source/js/translations.ts +++ b/Stars_Without_Number_Revised/Source/js/translations.ts @@ -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); }); }; diff --git a/Stars_Without_Number_Revised/Source/js/util.ts b/Stars_Without_Number_Revised/Source/js/util.ts index b29c80cb3c..2924e12bda 100644 --- a/Stars_Without_Number_Revised/Source/js/util.ts +++ b/Stars_Without_Number_Revised/Source/js/util.ts @@ -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