Files
roll20-character-sheets/Stars_Without_Number_Revised/Source/ts/drones.ts
T

74 lines
3.4 KiB
TypeScript

/* global getAttrs, setAttrs, getSectionIDs, generateRowID, on, removeRepeatingRow, _, getTranslationByKey */
/* Drones */
const fillDroneStats = () => {
// This must be run from a repeating event, otherwise it will not know where to draw the data from.
getAttrs(["repeating_drones_drone_model"], v => {
const model = (v.repeating_drones_drone_model || "").toLowerCase().trim().replace(/ /g, "_");
if (autofillData.drones.hasOwnProperty(model)) {
const setting = Object.entries(autofillData.drones[model as keyof typeof autofillData.drones]).reduce((m: {[key: string]: string}, [key, value]) => {
if (typeof value === "string") {
m[`repeating_drones_${key}`] = value;
}
return m;
}, {});
setting.repeating_drones_drone_HP_max = setting.repeating_drones_drone_HP;
setAttrs(setting);
}
});
};
const fillDroneFitting = (num: number) => {
const prefix = `repeating_drones_drone_fitting_${num}`;
getAttrs([`${prefix}_desc`, `${prefix}_name`], v => {
const fittingName = (v[`${prefix}_name`] || "").toLowerCase().trim().replace(/ /g, "_");
if (v[`${prefix}_desc`] === "" && autofillData.droneFittings.includes(fittingName)) {
setAttrs({
[`${prefix}_desc`]: translate(`${fittingName.toUpperCase()}_DESC`)
});
}
});
};
const calculateDroneAttack = (prefixes: string[], callback?: (values: {[key: string]: string}) => void) => {
const sourceAttrs = prefixes.reduce((m, prefix) => {
return m.concat([
`${prefix}_drone_weapon1_ab`,
`${prefix}_drone_weapon1_active`,
`${prefix}_drone_weapon1_attack`,
`${prefix}_drone_weapon1_skill`,
`${prefix}_drone_weapon2_ab`,
`${prefix}_drone_weapon2_active`,
`${prefix}_drone_weapon2_attack`,
`${prefix}_drone_weapon2_skill`,
`${prefix}_drone_weapon3_ab`,
`${prefix}_drone_weapon3_active`,
`${prefix}_drone_weapon3_attack`,
`${prefix}_drone_weapon3_skill`,
]);
}, ["attack_bonus", "intelligence_mod", "skill_pilot", "skill_program", "npc", "npc_attack_bonus"]);
getAttrs(sourceAttrs, v => {
let skillMod: number,
intMod: number,
attackBonus: number;
if (v.npc !== "1") {
skillMod = Math.max(parseInt(v.skill_pilot), parseInt(v.skill_program)) || 0;
intMod = parseInt(v.intelligence_mod) || 0;
attackBonus = parseInt(v.attack_bonus) || 0;
} else {
skillMod = 0;
intMod = 0;
attackBonus = parseInt(v.npc_attack_bonus) || 0;
}
const setting = prefixes.reduce((m: {[key:string]: string}, prefix) => {
[1, 2, 3].filter(num => v[`${prefix}_drone_weapon${num}_active`] === "1")
.forEach(num => {
m[`${prefix}_drone_weapon${num}_attack`] = (intMod + attackBonus +
((skillMod === -1) ? -2 : skillMod) +
parseInt(v[`${prefix}_drone_weapon${num}_ab`]) || 0).toString();
m[`${prefix}_drone_weapon${num}_skill`] =
((skillMod === -1) ? -2 : skillMod).toString();
});
return m;
}, {});
mySetAttrs(setting, v, null, callback);
});
};