mirror of
https://github.com/Nighthawk42/roll20-character-sheets.git
synced 2026-08-31 04:02:29 +00:00
197 lines
9.3 KiB
TypeScript
197 lines
9.3 KiB
TypeScript
/* global getAttrs, setAttrs, getSectionIDs, generateRowID, on, removeRepeatingRow, _, getTranslationByKey */
|
|
|
|
/* Menu builders */
|
|
/* Helper functions for producing skill chat menus */
|
|
const skillToMacro = (v: { [x: string]: string; }) => (skill: string) => {
|
|
const namedSkills = [
|
|
"culture_one", "culture_two", "culture_three",
|
|
"culture_alien", "profession", "magic2"
|
|
];
|
|
if (namedSkills.includes(skill))
|
|
return [`@{skill_${skill}_name} (${sign(parseInt(v[`skill_${skill}`]))})`, `skill_${skill}`];
|
|
else
|
|
return [`^{${skill.toUpperCase()}} (${sign(parseInt(v[`skill_${skill}`]))})`, `skill_${skill}`];
|
|
};
|
|
const idToSkillMacro = (v: { [x: string]: string; }, sName: string) => (id: any) => {
|
|
const prefix = `repeating_${sName}_${id}_skill`;
|
|
return [`${v[`${prefix}_name`]} (${sign(parseInt(v[prefix]))})`, prefix];
|
|
};
|
|
const buildSkillMacro = ([name, command]: [string, string], index: number, allSkills: string[][]) => {
|
|
return buildLink(name, command, index + 1 === allSkills.length);
|
|
};
|
|
/* End helper functions */
|
|
const buildSaveMenu = () => {
|
|
getAttrs(["homebrew_luck_save", "macro_saves"], v => {
|
|
const macro_saves = buildLink("^{PHYSICAL} (v@{save_physical})", ("save_physical")) + " " +
|
|
buildLink("^{MENTAL} (v@{save_mental})", ("save_mental")) + " " +
|
|
buildLink("^{EVASION} (v@{save_evasion})", ("save_evasion"), v.homebrew_luck_save !== "1") +
|
|
((v.homebrew_luck_save === "1") ?
|
|
(" " + buildLink("^{LUCK} (v@{save_luck})", ("save_luck"), true)) : "");
|
|
mySetAttrs({
|
|
macro_saves
|
|
}, v);
|
|
});
|
|
};
|
|
const buildSkillMenu = () => {
|
|
getSectionIDs("repeating_skills", idArray => {
|
|
const sourceAttrs = [
|
|
...skills.revised.map(sk => `skill_${sk}`),
|
|
...skills.first.map(sk => `skill_${sk}`),
|
|
"homebrew_skill_list",
|
|
"setting_show_untrained_skills",
|
|
"macro_skills",
|
|
...idArray.map(id => `repeating_skills_${id}_skill_name`),
|
|
...idArray.map(id => `repeating_skills_${id}_skill`),
|
|
];
|
|
getAttrs(sourceAttrs, v => {
|
|
const skillList = skills[v.homebrew_skill_list] || [];
|
|
const hasSkills = skillList.filter(skill => v[`skill_${skill}`] !== "-1").length ||
|
|
idArray.filter(id => v[`repeating_skills_${id}_skill`] !== "-1").length;
|
|
|
|
const macro_skills = `${[
|
|
...skillList.filter(skill => v[`skill_${skill}`] !== "-1").map(skillToMacro(v)),
|
|
...idArray.filter(id => v[`repeating_skills_${id}_skill`] !== "-1").map(idToSkillMacro(v, "skills"))
|
|
].map(buildSkillMacro).join(" ")}${v.setting_show_untrained_skills === "1" ? `${
|
|
hasSkills ? "\n\n**^{UNTRAINED}**\n" : ""}${[
|
|
...skillList.filter(skill => v[`skill_${skill}`] === "-1").map(skillToMacro(v)),
|
|
...idArray.filter(id => v[`repeating_skills_${id}_skill`] === "-1").map(idToSkillMacro(v, "skills"))
|
|
].map(buildSkillMacro).join(" ")}` : ""}`;
|
|
mySetAttrs({
|
|
macro_skills
|
|
}, v);
|
|
});
|
|
});
|
|
};
|
|
const buildPsionicsMenu = () => {
|
|
getSectionIDs("repeating_techniques", techniqueIDs => {
|
|
getSectionIDs("repeating_psychic-skills", skillIDs => {
|
|
const sourceAttrs = [
|
|
...skills.psionic.map(sk => `skill_${sk}`),
|
|
"setting_super_type",
|
|
"macro_psionics",
|
|
...skillIDs.map(id => `repeating_psychic-skills_${id}_skill_name`),
|
|
...skillIDs.map(id => `repeating_psychic-skills_${id}_skill`),
|
|
...techniqueIDs.map(id => `repeating_techniques_${id}_technique_name`),
|
|
];
|
|
getAttrs(sourceAttrs, v => {
|
|
if (v.setting_super_type === "magic" || v.setting_super_type === "neither") return;
|
|
const macro_psionics = `${[
|
|
...skills.psionic.filter(skill => v[`skill_${skill}`] !== "-1").map(skillToMacro(v)),
|
|
...skillIDs.filter(id => v[`repeating_psychic-skills_${id}_skill`] !== "-1")
|
|
.map(idToSkillMacro(v, "psychic-skills"))
|
|
].map(buildSkillMacro).join(" ")}${(techniqueIDs.length ? "\n\n" : "")}${
|
|
techniqueIDs.map((id, index, allIDs) => buildLink(v[`repeating_techniques_${id}_technique_name`],
|
|
`repeating_techniques_${id}_technique`, index + 1 === allIDs.length)).join(" ")}`;
|
|
mySetAttrs({
|
|
macro_psionics
|
|
}, v);
|
|
});
|
|
});
|
|
});
|
|
};
|
|
const buildMagicMenu = () => {
|
|
getSectionIDs("repeating_spells", spellIDs => {
|
|
getSectionIDs("repeating_magic-skills", skillIDs => {
|
|
const sourceAttrs = [
|
|
"skill_know_magic", "skill_use_magic", "skill_sunblade_magic", "skill_fight", "skill_magic2", "skill_magic2_name",
|
|
"setting_super_type", "macro_magic",
|
|
...skillIDs.map(id => `repeating_magic-skills_${id}_skill_name`),
|
|
...skillIDs.map(id => `repeating_magic-skills_${id}_skill`),
|
|
...spellIDs.map(id => `repeating_spells_${id}_spell_name`),
|
|
];
|
|
getAttrs(sourceAttrs, v => {
|
|
if (v.setting_super_type === "psionics" || v.setting_super_type === "neither") return;
|
|
const macro_magic = `${[
|
|
...(v.skill_magic2_name ? ["know_magic", "use_magic", "fight", "sunblade", "magic2"] : ["know_magic", "use_magic", "fight", "sunblade"]).map(skillToMacro(v)),
|
|
...skillIDs.map(idToSkillMacro(v, "magic-skills"))
|
|
].map(buildSkillMacro).join(" ")}${spellIDs.length ? "\n\n" : ""}${
|
|
spellIDs.map(id => buildLink(v[`repeating_spells_${id}_spell_name`], `repeating_spells_${id}_spell`))
|
|
.join(" ")}`;
|
|
mySetAttrs({
|
|
macro_magic
|
|
}, v);
|
|
});
|
|
});
|
|
});
|
|
};
|
|
const buildShipWeaponsMenu = () => {
|
|
getSectionIDs("repeating_ship-weapons", idArray => {
|
|
const sourceAttrs = [
|
|
...idArray.map(id => `repeating_ship-weapons_${id}_weapon_name`),
|
|
...idArray.map(id => `repeating_ship-weapons_${id}_weapon_attack_bonus`),
|
|
"macro_ship_weapons"
|
|
];
|
|
getAttrs(sourceAttrs, v => {
|
|
const macro_ship_weapons = idArray.map((id, index) => {
|
|
const title = v[`repeating_ship-weapons_${id}_weapon_name`] +
|
|
` ${sign(v[`repeating_ship-weapons_${id}_weapon_attack_bonus`])}`;
|
|
return buildLink(title, `repeating_ship-weapons_${id}_attack`, index + 1 === idArray.length);
|
|
}).join(" ");
|
|
mySetAttrs({
|
|
macro_ship_weapons
|
|
}, v);
|
|
});
|
|
});
|
|
};
|
|
const buildAttacksMenu = () => {
|
|
getSectionIDs("repeating_npc-attacks", idArray => {
|
|
const sourceAttrs = [
|
|
...idArray.map(id => `repeating_npc-attacks_${id}_attack_name`),
|
|
...idArray.map(id => `repeating_npc-attacks_${id}_attack_ab`),
|
|
...idArray.map(id => `repeating_npc-attacks_${id}_attack_number`),
|
|
"macro_npc_attacks"
|
|
];
|
|
getAttrs(sourceAttrs, v => {
|
|
const macro_npc_attacks = idArray.map((id, index) => {
|
|
const title = v[`repeating_npc-attacks_${id}_attack_name`] +
|
|
` ${sign(v[`repeating_npc-attacks_${id}_attack_ab`])}` +
|
|
((v[`repeating_npc-attacks_${id}_attack_number`] !== "1") ?
|
|
` (${v[`repeating_npc-attacks_${id}_attack_number`]} attacks)` : "");
|
|
return buildLink(title, `repeating_npc-attacks_${id}_attack`, index + 1 === idArray.length);
|
|
}).join(" ");
|
|
mySetAttrs({
|
|
macro_npc_attacks
|
|
}, v);
|
|
});
|
|
});
|
|
};
|
|
const buildAbilitiesMenu = () => {
|
|
getSectionIDs("repeating_npc-abilities", idArray => {
|
|
const sourceAttrs = [
|
|
...idArray.map(id => `repeating_npc-abilities_${id}_ability_name`),
|
|
"macro_npc_abilities"
|
|
];
|
|
getAttrs(sourceAttrs, v => {
|
|
const macro_npc_abilities = idArray.map((id, index) => {
|
|
return buildLink(v[`repeating_npc-abilities_${id}_ability_name`],
|
|
`repeating_npc-abilities_${id}_ability`, index + 1 === idArray.length);
|
|
}).join(" ");
|
|
mySetAttrs({
|
|
macro_npc_abilities
|
|
}, v);
|
|
});
|
|
});
|
|
};
|
|
const buildStatblock = () => {
|
|
const sourceAttrs = [
|
|
"npc",
|
|
"macro_npc_abilities",
|
|
"macro_npc_attacks",
|
|
"macro_statblock",
|
|
];
|
|
getAttrs(sourceAttrs, v => {
|
|
if (v.npc !== "1") return;
|
|
const macroList = [
|
|
"[**^{SAVES}** v@{npc_saves},](~npc_save) [**^{SKILLS}** +@{npc_skills},](~npc_skill) ",
|
|
"[**^{MORALE}** v@{npc_morale}](~npc_morale)\n",
|
|
"[**^{INITIATIVE_FIXED}** d8,](~npc_initiative) [**^{REACTION}** 2d6,](~npc_reaction) ",
|
|
"**Move** @{npc_move}\n"
|
|
];
|
|
if (v.macro_npc_attacks) macroList.push("\n**Attacks:** @{macro_npc_attacks}");
|
|
if (v.macro_npc_abilities) macroList.push("\n**Abilities:** @{macro_npc_abilities}");
|
|
mySetAttrs({
|
|
macro_statblock: macroList.join("")
|
|
}, v);
|
|
});
|
|
};
|