Files
fvtt-machine-gods-noxian-ex…/module/applications/sheets/select-options.mjs
T

52 lines
2.0 KiB
JavaScript

import { SYSTEM } from "../../config/system.mjs"
function normalizeMax(max, current) {
return Math.max(max ?? 0, Number.isFinite(current) ? current : 0)
}
export function numericOptions(min, max, current = null) {
const resolvedMin = Math.min(min, Number.isFinite(current) ? current : min)
const resolvedMax = normalizeMax(max, current)
return Array.from({ length: Math.max(0, resolvedMax - resolvedMin) + 1 }, (_, index) => {
const value = resolvedMin + index
return { value, label: String(value) }
})
}
export function objectOptions(choices) {
return Object.entries(choices).map(([value, label]) => ({ value, label }))
}
export function dieMax(die) {
if (typeof die !== "string" || !die.startsWith("d")) return 0
const faces = Number.parseInt(die.slice(1), 10)
return Number.isFinite(faces) ? faces : 0
}
export function buildSharedSelectOptions() {
return {
abilityValues: numericOptions(-3, 6),
conditionValues: numericOptions(0, 12),
moraleValues: numericOptions(2, 12),
armorPenalties: numericOptions(0, 6),
shieldPenalties: numericOptions(0, 4),
weaponCategories: objectOptions(SYSTEM.weaponCategories),
weaponProperties: Object.entries(SYSTEM.weaponProperties).map(([key, p]) => ({ value: key, label: p.label, hint: p.hint })),
weightCategories: objectOptions(SYSTEM.weightCategories),
usageDice: objectOptions(SYSTEM.usageDieChoices),
armorDice: objectOptions(SYSTEM.armorDieChoices),
omenDice: objectOptions(SYSTEM.omenDieChoices),
resonanceList: objectOptions(SYSTEM.resonanceList),
equipmentSubtypes: objectOptions(SYSTEM.equipmentSubtypes),
featureIds: objectOptions(SYSTEM.featureChoices),
}
}
export function buildCharacterSelectOptions(system) {
return {
omenCurrent: numericOptions(0, dieMax(system.omens?.die), system.omens?.current),
resonanceUsed: numericOptions(0, system.resonance?.max ?? 0, system.resonance?.used),
artifactSyncUsed: numericOptions(0, system.syncLimit ?? 0, system.artifactSync?.used),
}
}