export enum RollTable { Setting = 0, Theme = 1, Start = 2, Challenge = 3, Twist = 4, Focus = 5, Word = 6, } export enum ValueAccess { Global = 0, Server = 1, CreatorDM = 2, } export const RollTableOrder = [RollTable.Setting, RollTable.Theme, RollTable.Start, RollTable.Challenge, RollTable.Twist, RollTable.Focus, RollTable.Word] as const satisfies RollTable[] export const RollTableOrdinals = { [RollTable.Setting]: 0, [RollTable.Theme]: 1, [RollTable.Start]: 2, [RollTable.Challenge]: 3, [RollTable.Twist]: 4, [RollTable.Focus]: 5, [RollTable.Word]: 6, } as const satisfies {[key in RollTable]: number} & {[key in Extract as typeof RollTableOrder[key]]: key} export type RollableTables = {readonly [key in RollTable]: readonly string[]} export function isTable(val: number): val is RollTable { return RollTableOrdinals.hasOwnProperty(val) } export function rollOn(table: RollTable, tables: RollableTables): string { const values = tables[table] if (values.length === 0) { throw Error(`no possible options for table ${table}`) } return values[Math.floor(values.length * Math.random())] }