mirror of
https://github.com/Nighthawk42/roll20-character-sheets.git
synced 2026-08-30 11:42:29 +00:00
273 lines
8.1 KiB
TypeScript
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
|
|
);
|
|
});
|
|
};
|