Files
roll20-character-sheets/Without Numbers/Source/ts/menuBuilders.ts
T

273 lines
8.1 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(["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.luck_save !== "1"
) +
(v.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}`),
"system",
"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.system] || [];
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 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
);
});
};