{"version":3,"file":"ringworld.mjs","sources":["../src/module/utils/dice.ts","../src/module/utils/percentile.ts","../src/module/constants.ts","../src/module/hit-location-schemas.ts","../src/module/utils/hit-locations.ts","../src/module/data-base-skills.ts","../src/module/skill-icons.ts","../src/module/chat.ts","../src/module/mechanics.ts","../src/module/gm-reference.ts","../src/module/world-catalog.ts","../src/module/character-tools.ts","../src/module/actor/RingworldActor.ts","../src/module/item/RingworldItem.ts","../src/module/sheets/actors/ExplorerSheet.ts","../src/module/sheets/actors/CreatureSheet.ts","../src/module/sheets/actors/VehicleSheet.ts","../src/module/sheets/items/SkillSheet.ts","../src/module/sheets/items/WeaponSheet.ts","../src/module/sheets/items/ArmorSheet.ts","../src/module/sheets/items/GearSheet.ts","../src/module/sheets/items/SpeciesSheet.ts","../src/module/sheets/items/PursuitSheet.ts","../src/module/impulse-tracker.ts","../src/ringworld.ts"],"sourcesContent":["export async function showDiceSoNice(roll: Roll): Promise {\n const dice3d = (game as any)?.dice3d;\n if (!dice3d?.showForRoll) return;\n\n try {\n await dice3d.showForRoll(roll, game.user, true, null, false);\n } catch (_error) {\n // Ignore Dice So Nice integration failures and continue normal flow.\n }\n}\n\nexport async function evaluateRollWithDice(formula: string): Promise {\n const roll = await new Roll(formula).evaluate();\n await showDiceSoNice(roll as any);\n return roll as any;\n}\n","import { evaluateRollWithDice } from \"./dice\";\n\nexport type PercentileOutcome = \"special\" | \"success\" | \"failure\" | \"fumble\";\n\nexport interface PercentileResult {\n roll: number;\n target: number;\n outcome: PercentileOutcome;\n isSuccess: boolean;\n isSpecial: boolean;\n isFumble: boolean;\n}\n\nexport async function rollPercentile(target: number): Promise {\n const roll = await evaluateRollWithDice(\"1d100\");\n return classifyPercentile(roll.total ?? 0, target);\n}\n\nexport function classifyPercentile(roll: number, target: number): PercentileResult {\n const cleanTarget = Math.max(0, Math.floor(Number(target) || 0));\n const specialThreshold = Math.max(1, Math.floor(cleanTarget / 5));\n const fumbleThreshold = cleanTarget >= 50 ? 100 : 96;\n\n const isSuccess = roll <= cleanTarget;\n const isSpecial = isSuccess && roll <= specialThreshold;\n const isFumble = !isSuccess && roll >= fumbleThreshold;\n\n let outcome: PercentileOutcome = \"failure\";\n if (isFumble) outcome = \"fumble\";\n else if (isSpecial) outcome = \"special\";\n else if (isSuccess) outcome = \"success\";\n\n return {\n roll,\n target: cleanTarget,\n outcome,\n isSuccess,\n isSpecial,\n isFumble\n };\n}\n\nexport function outcomeLabel(outcome: PercentileOutcome): string {\n switch (outcome) {\n case \"special\":\n return \"Special Success\";\n case \"success\":\n return \"Success\";\n case \"fumble\":\n return \"Fumble\";\n default:\n return \"Failure\";\n }\n}\n","export type HitLocationSlug = \"rLeg\" | \"lLeg\" | \"abdomen\" | \"chest\" | \"rArm\" | \"lArm\" | \"head\";\n\nexport interface HitLocationEntry {\n slug: HitLocationSlug;\n label: string;\n min: number;\n max: number;\n}\n\nexport const SYSTEM_ID = \"ringworld\";\n\nexport const HIT_LOCATION_TABLE: HitLocationEntry[] = [\n { slug: \"rLeg\", label: \"Right Leg\", min: 1, max: 3 },\n { slug: \"lLeg\", label: \"Left Leg\", min: 4, max: 6 },\n { slug: \"abdomen\", label: \"Abdomen\", min: 7, max: 10 },\n { slug: \"chest\", label: \"Chest\", min: 11, max: 15 },\n { slug: \"rArm\", label: \"Right Arm\", min: 16, max: 17 },\n { slug: \"lArm\", label: \"Left Arm\", min: 18, max: 19 },\n { slug: \"head\", label: \"Head\", min: 20, max: 20 }\n];\n\nexport const HIT_LOCATION_ORDER: HitLocationSlug[] = [\n \"rLeg\",\n \"lLeg\",\n \"abdomen\",\n \"chest\",\n \"rArm\",\n \"lArm\",\n \"head\"\n];\n\nexport const LIMB_LOCATIONS: HitLocationSlug[] = [\"rArm\", \"lArm\", \"rLeg\", \"lLeg\"];\nexport const LEG_LOCATIONS: HitLocationSlug[] = [\"rLeg\", \"lLeg\"];\n\nexport function isLimb(slug: HitLocationSlug): boolean {\n return LIMB_LOCATIONS.includes(slug);\n}\n","import { HIT_LOCATION_ORDER, HIT_LOCATION_TABLE, type HitLocationEntry, type HitLocationSlug } from \"./constants\";\n\nexport type HitLocationSchemaId = \"humanoid\" | \"dolphin\" | \"puppeteer\" | \"trinoc\" | \"bandersnatchi\" | \"kzinti\";\n\nexport interface HitLocationSchemaEntry extends HitLocationEntry {\n hpFactor: number;\n}\n\nexport interface HitLocationSchema {\n id: HitLocationSchemaId;\n label: string;\n bodyOrder: HitLocationSlug[];\n entries: HitLocationSchemaEntry[];\n}\n\nfunction normalize(value: unknown): string {\n return String(value ?? \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"\");\n}\n\nfunction withFactors(entries: HitLocationEntry[], hpFactors?: Partial>): HitLocationSchemaEntry[] {\n return entries.map((entry) => ({\n ...entry,\n hpFactor: hpFactors?.[entry.slug] ?? (entry.slug === \"chest\" ? 0.35 : (entry.slug === \"rArm\" || entry.slug === \"lArm\") ? 0.25 : 0.3)\n }));\n}\n\nconst HUMANOID_SCHEMA: HitLocationSchema = {\n id: \"humanoid\",\n label: \"Humanoid\",\n bodyOrder: [\"head\", \"lArm\", \"chest\", \"rArm\", \"abdomen\", \"lLeg\", \"rLeg\"],\n entries: withFactors(HIT_LOCATION_TABLE)\n};\n\nconst DOLPHIN_SCHEMA: HitLocationSchema = {\n id: \"dolphin\",\n label: \"Dolphin\",\n bodyOrder: [\"head\", \"lArm\", \"chest\", \"rArm\", \"abdomen\", \"lLeg\", \"rLeg\"],\n entries: withFactors([\n { slug: \"rLeg\", label: \"Right Fluke\", min: 1, max: 3 },\n { slug: \"lLeg\", label: \"Left Fluke\", min: 4, max: 6 },\n { slug: \"abdomen\", label: \"Lower Body\", min: 7, max: 9 },\n { slug: \"chest\", label: \"Main Body\", min: 10, max: 15 },\n { slug: \"rArm\", label: \"Right Fin\", min: 16, max: 17 },\n { slug: \"lArm\", label: \"Left Fin\", min: 18, max: 19 },\n { slug: \"head\", label: \"Head\", min: 20, max: 20 }\n ], {\n head: 0.3,\n rArm: 0.2,\n lArm: 0.2,\n chest: 0.4,\n abdomen: 0.35,\n rLeg: 0.25,\n lLeg: 0.25\n })\n};\n\nconst PUPPETEER_SCHEMA: HitLocationSchema = {\n id: \"puppeteer\",\n label: \"Puppeteer\",\n bodyOrder: [\"head\", \"lArm\", \"chest\", \"rArm\", \"abdomen\", \"lLeg\", \"rLeg\"],\n entries: withFactors([\n { slug: \"rLeg\", label: \"Right Rear Leg\", min: 1, max: 3 },\n { slug: \"lLeg\", label: \"Left Rear Leg\", min: 4, max: 6 },\n { slug: \"rArm\", label: \"Right Foreleg\", min: 7, max: 9 },\n { slug: \"lArm\", label: \"Left Foreleg\", min: 10, max: 12 },\n { slug: \"chest\", label: \"Fore Body\", min: 13, max: 15 },\n { slug: \"abdomen\", label: \"Hind Body\", min: 16, max: 18 },\n { slug: \"head\", label: \"Twin Heads\", min: 19, max: 20 }\n ], {\n head: 0.32,\n chest: 0.35,\n abdomen: 0.35,\n rArm: 0.28,\n lArm: 0.28,\n rLeg: 0.28,\n lLeg: 0.28\n })\n};\n\nconst TRINOC_SCHEMA: HitLocationSchema = {\n id: \"trinoc\",\n label: \"Trinoc\",\n bodyOrder: [\"head\", \"lArm\", \"chest\", \"rArm\", \"abdomen\", \"lLeg\", \"rLeg\"],\n entries: withFactors([\n { slug: \"rArm\", label: \"Right Wing/Arm\", min: 1, max: 3 },\n { slug: \"lArm\", label: \"Left Wing/Arm\", min: 4, max: 6 },\n { slug: \"chest\", label: \"Upper Torso\", min: 7, max: 11 },\n { slug: \"abdomen\", label: \"Lower Torso\", min: 12, max: 14 },\n { slug: \"rLeg\", label: \"Right Leg\", min: 15, max: 17 },\n { slug: \"lLeg\", label: \"Left Leg\", min: 18, max: 19 },\n { slug: \"head\", label: \"Head\", min: 20, max: 20 }\n ], {\n head: 0.3,\n rArm: 0.27,\n lArm: 0.27,\n chest: 0.36,\n abdomen: 0.3,\n rLeg: 0.27,\n lLeg: 0.27\n })\n};\n\nconst BANDERSNATCHI_SCHEMA: HitLocationSchema = {\n id: \"bandersnatchi\",\n label: \"Bandersnatchi\",\n bodyOrder: [\"head\", \"lArm\", \"chest\", \"rArm\", \"abdomen\", \"lLeg\", \"rLeg\"],\n entries: withFactors([\n { slug: \"rLeg\", label: \"Right Rear Mass\", min: 1, max: 2 },\n { slug: \"lLeg\", label: \"Left Rear Mass\", min: 3, max: 4 },\n { slug: \"abdomen\", label: \"Lower Body Mass\", min: 5, max: 11 },\n { slug: \"chest\", label: \"Upper Body Mass\", min: 12, max: 17 },\n { slug: \"rArm\", label: \"Right Manipulator\", min: 18, max: 18 },\n { slug: \"lArm\", label: \"Left Manipulator\", min: 19, max: 19 },\n { slug: \"head\", label: \"Head Cluster\", min: 20, max: 20 }\n ], {\n head: 0.28,\n chest: 0.42,\n abdomen: 0.42,\n rArm: 0.2,\n lArm: 0.2,\n rLeg: 0.24,\n lLeg: 0.24\n })\n};\n\nconst KZINTI_SCHEMA: HitLocationSchema = {\n id: \"kzinti\",\n label: \"Kzinti\",\n bodyOrder: [\"head\", \"lArm\", \"chest\", \"rArm\", \"abdomen\", \"lLeg\", \"rLeg\"],\n entries: withFactors([\n { slug: \"rLeg\", label: \"Right Hind Leg\", min: 1, max: 3 },\n { slug: \"lLeg\", label: \"Left Hind Leg\", min: 4, max: 6 },\n { slug: \"abdomen\", label: \"Abdomen\", min: 7, max: 10 },\n { slug: \"chest\", label: \"Chest\", min: 11, max: 15 },\n { slug: \"rArm\", label: \"Right Foreleg\", min: 16, max: 17 },\n { slug: \"lArm\", label: \"Left Foreleg\", min: 18, max: 19 },\n { slug: \"head\", label: \"Head\", min: 20, max: 20 }\n ])\n};\n\nexport const HIT_LOCATION_SCHEMAS: Record = {\n humanoid: HUMANOID_SCHEMA,\n dolphin: DOLPHIN_SCHEMA,\n puppeteer: PUPPETEER_SCHEMA,\n trinoc: TRINOC_SCHEMA,\n bandersnatchi: BANDERSNATCHI_SCHEMA,\n kzinti: KZINTI_SCHEMA\n};\n\nexport function listHitLocationSchemas(): HitLocationSchema[] {\n return Object.values(HIT_LOCATION_SCHEMAS);\n}\n\nexport function inferHitLocationSchemaId(speciesValue: unknown): HitLocationSchemaId {\n const species = normalize(speciesValue);\n if (!species) return \"humanoid\";\n if (species.includes(\"dolphin\")) return \"dolphin\";\n if (species.includes(\"puppeteer\")) return \"puppeteer\";\n if (species.includes(\"trinoc\")) return \"trinoc\";\n if (species.includes(\"bandersnatch\")) return \"bandersnatchi\";\n if (species.includes(\"kzinti\")) return \"kzinti\";\n return \"humanoid\";\n}\n\nexport function getHitLocationSchemaById(schemaId: unknown): HitLocationSchema {\n const key = normalize(schemaId) as HitLocationSchemaId;\n return HIT_LOCATION_SCHEMAS[key] ?? HUMANOID_SCHEMA;\n}\n\nexport function getActorHitLocationSchema(actor: any): HitLocationSchema {\n const mode = String(actor?.system?.hitLocationSchema || \"auto\").trim().toLowerCase();\n if (mode && mode !== \"auto\") {\n return getHitLocationSchemaById(mode);\n }\n const species = actor?.system?.profile?.species ?? \"\";\n return getHitLocationSchemaById(inferHitLocationSchemaId(species));\n}\n\nexport function getSchemaLocationEntry(schema: HitLocationSchema, slug: HitLocationSlug): HitLocationSchemaEntry {\n return schema.entries.find((entry) => entry.slug === slug) ?? withFactors(HIT_LOCATION_TABLE).find((entry) => entry.slug === slug)!;\n}\n\nexport function getSchemaOrder(schema: HitLocationSchema): HitLocationSlug[] {\n const set = new Set(schema.entries.map((entry) => entry.slug));\n const ordered = schema.bodyOrder.filter((slug) => set.has(slug));\n if (ordered.length === schema.entries.length) return ordered;\n return [...HIT_LOCATION_ORDER];\n}\n\n","import { HIT_LOCATION_TABLE, type HitLocationEntry, type HitLocationSlug } from \"../constants\";\nimport { evaluateRollWithDice } from \"./dice\";\nimport { getActorHitLocationSchema, getHitLocationSchemaById } from \"../hit-location-schemas\";\n\nexport interface HitLocationRollResult {\n roll: number;\n location: HitLocationEntry;\n}\n\nexport function getHitLocationFromRoll(roll: number): HitLocationEntry {\n const found = HIT_LOCATION_TABLE.find((entry) => roll >= entry.min && roll <= entry.max);\n return found ?? HIT_LOCATION_TABLE[HIT_LOCATION_TABLE.length - 1];\n}\n\nfunction getTableForActor(actor?: any): HitLocationEntry[] {\n if (!actor) return HIT_LOCATION_TABLE;\n const schema = getActorHitLocationSchema(actor);\n return schema.entries;\n}\n\nfunction getHitLocationFromRollForTable(roll: number, table: HitLocationEntry[]): HitLocationEntry {\n const found = table.find((entry) => roll >= entry.min && roll <= entry.max);\n return found ?? table[table.length - 1];\n}\n\nexport async function rollHitLocation(actor?: any): Promise {\n const roll = await evaluateRollWithDice(\"1d20\");\n const total = roll.total ?? 20;\n const table = getTableForActor(actor);\n return {\n roll: total,\n location: getHitLocationFromRollForTable(total, table)\n };\n}\n\nexport async function chooseOrRollHitLocation(actor?: any): Promise<{\n slug: HitLocationSlug;\n label: string;\n rolled: number | null;\n} | null> {\n const schema = actor ? getActorHitLocationSchema(actor) : getHitLocationSchemaById(\"humanoid\");\n const table = schema.entries;\n const entriesBySlug = new Map(table.map((entry) => [entry.slug, entry]));\n const labelFor = (slug: HitLocationSlug, fallback: string) => entriesBySlug.get(slug)?.label ?? fallback;\n\n const html = `\n
\n \n
\n \n
\n
\n \n \n \n \n \n \n \n
\n
\n `;\n\n const result = await new Promise((resolve) => {\n let settled = false;\n const done = (value: string | null) => {\n if (settled) return;\n settled = true;\n resolve(value);\n };\n\n const dialog = new Dialog({\n title: \"Choose Hit Location\",\n content: html,\n buttons: {\n apply: {\n label: \"Apply\",\n callback: (dlgHtml: JQuery) => {\n const value = String(dlgHtml.find(\"input[name='location']\").val() || \"random\");\n done(value);\n }\n },\n cancel: {\n label: \"Cancel\",\n callback: () => done(null)\n }\n },\n default: \"apply\",\n render: (dlgHtml: JQuery) => {\n const picker = dlgHtml.find(\".ringworld-hit-picker\");\n picker.find(\".rw-hit-picker-choice\").on(\"click\", (event) => {\n event.preventDefault();\n const button = event.currentTarget as HTMLElement;\n const location = String(button.dataset.location || \"random\");\n picker.find(\".rw-hit-picker-choice\").removeClass(\"active\");\n $(button).addClass(\"active\");\n picker.find(\"input[name='location']\").val(location);\n });\n },\n close: () => done(null)\n }, {\n classes: [\"ringworld-hit-location-dialog\"],\n width: 500,\n resizable: false\n });\n dialog.render(true);\n });\n\n if (!result) return null;\n\n if (result === \"random\") {\n const rolled = await rollHitLocation(actor);\n return {\n slug: rolled.location.slug,\n label: rolled.location.label,\n rolled: rolled.roll\n };\n }\n\n const entry = table.find((loc) => loc.slug === result);\n if (!entry) return null;\n\n return {\n slug: entry.slug,\n label: entry.label,\n rolled: null\n };\n}\n","export interface BaseSkillDef {\n name: string;\n category: \"Agility\" | \"Communication\" | \"Knowledge\" | \"Perception\" | \"Technical\";\n base: number;\n specialization?: string;\n}\n\nexport const BASE_SKILL_CATEGORIES: Array = [\n \"Agility\",\n \"Communication\",\n \"Knowledge\",\n \"Perception\",\n \"Technical\"\n];\n\nexport const RINGWORLD_BASE_SKILLS: BaseSkillDef[] = [\n { name: \"Archaic Melee Weapon\", category: \"Agility\", base: 5 },\n { name: \"Archaic Ranged Weapons\", category: \"Agility\", base: 3 },\n { name: \"Athletics\", category: \"Agility\", base: 15 },\n { name: \"Hide\", category: \"Agility\", base: 10 },\n { name: \"Sneak\", category: \"Agility\", base: 5 },\n { name: \"Unarmed Combat\", category: \"Agility\", base: 0 },\n { name: \"V. Sword, F. Laser\", category: \"Agility\", base: 15 },\n\n { name: \"Bargain\", category: \"Communication\", base: 10 },\n { name: \"Debate\", category: \"Communication\", base: 5 },\n { name: \"Fast Talk\", category: \"Communication\", base: 10 },\n { name: \"Fine Arts\", category: \"Communication\", base: 5 },\n { name: \"Musicianship\", category: \"Communication\", base: 5 },\n { name: \"Orate\", category: \"Communication\", base: 5 },\n { name: \"Own Language\", category: \"Communication\", base: 0, specialization: \"INTx5 base\" },\n { name: \"Perform\", category: \"Communication\", base: 5 },\n { name: \"Psychology\", category: \"Communication\", base: 0 },\n\n { name: \"Anthropology\", category: \"Knowledge\", base: 0 },\n { name: \"Astronomy\", category: \"Knowledge\", base: 0 },\n { name: \"Biology\", category: \"Knowledge\", base: 0 },\n { name: \"Botany\", category: \"Knowledge\", base: 0 },\n { name: \"Chemistry\", category: \"Knowledge\", base: 0 },\n { name: \"Computers\", category: \"Knowledge\", base: 0 },\n { name: \"Emergency Treatment\", category: \"Knowledge\", base: 1 },\n { name: \"Engineering\", category: \"Knowledge\", base: 0 },\n { name: \"Farming\", category: \"Knowledge\", base: 0 },\n { name: \"History\", category: \"Knowledge\", base: 5 },\n { name: \"Law\", category: \"Knowledge\", base: 0 },\n { name: \"Mathematics\", category: \"Knowledge\", base: 0 },\n { name: \"Physics\", category: \"Knowledge\", base: 0 },\n { name: \"Planetology\", category: \"Knowledge\", base: 0 },\n { name: \"Second Languages\", category: \"Knowledge\", base: 0 },\n { name: \"Strategy\", category: \"Knowledge\", base: 0 },\n { name: \"Theology\", category: \"Knowledge\", base: 0 },\n { name: \"Zoology\", category: \"Knowledge\", base: 0 },\n\n { name: \"Handgun, Energy\", category: \"Perception\", base: 5 },\n { name: \"Handgun, Projectile\", category: \"Perception\", base: 3 },\n { name: \"Heavy Weapon, Energy\", category: \"Perception\", base: 5 },\n { name: \"Heavy Weapon, Projectile\", category: \"Perception\", base: 3 },\n { name: \"Listen\", category: \"Perception\", base: 5 },\n { name: \"Observe\", category: \"Perception\", base: 5 },\n { name: \"Scent\", category: \"Perception\", base: 0 },\n { name: \"Search\", category: \"Perception\", base: 5 },\n { name: \"Track\", category: \"Perception\", base: 5 },\n\n { name: \"Aquatic Vehicle\", category: \"Technical\", base: 0 },\n { name: \"Atmospheric Craft\", category: \"Technical\", base: 0 },\n { name: \"Ground Vehicle\", category: \"Technical\", base: 0 },\n { name: \"Hyperdrive\", category: \"Technical\", base: 0 },\n { name: \"Personal Flyer\", category: \"Technical\", base: 15 },\n { name: \"Reaction Drive\", category: \"Technical\", base: 0 },\n { name: \"Reactionless Drive\", category: \"Technical\", base: 0 },\n { name: \"Repair\", category: \"Technical\", base: 0 },\n { name: \"Ringworld\", category: \"Technical\", base: 0 },\n { name: \"Weapons System\", category: \"Technical\", base: 0 }\n];\n\nexport function normalizeSkillName(name: string): string {\n return String(name || \"\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"\")\n .trim();\n}\n\nexport function baseSkillNameSet(): Set {\n return new Set(RINGWORLD_BASE_SKILLS.map((skill) => normalizeSkillName(skill.name)));\n}\n","import { normalizeSkillName, RINGWORLD_BASE_SKILLS } from \"./data-base-skills\";\n\nexport const DEFAULT_SKILL_ICON = \"systems/ringworld/assets/icons/skill.svg\";\n\nfunction iconSlug(name: string): string {\n return String(name)\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nexport function skillIconPath(name: string): string {\n return `systems/ringworld/assets/icons/skill/${iconSlug(name)}.svg`;\n}\n\nexport function baseSkillByName(name: string): (typeof RINGWORLD_BASE_SKILLS)[number] | undefined {\n const key = normalizeSkillName(name);\n return RINGWORLD_BASE_SKILLS.find((skill) => normalizeSkillName(skill.name) === key);\n}\n\nexport function resolveSkillIcon(name: string, currentImg?: string): string {\n const img = String(currentImg || \"\").trim();\n if (img && img !== \"icons/svg/item-bag.svg\") return img;\n if (baseSkillByName(name)) return skillIconPath(name);\n return DEFAULT_SKILL_ICON;\n}\n\n","import { SYSTEM_ID } from \"./constants\";\nimport { DEFAULT_SKILL_ICON } from \"./skill-icons\";\n\ninterface CreateChatOptions {\n actor?: any;\n content: string;\n}\n\nasync function createChatMessage(options: CreateChatOptions): Promise {\n const speaker = options.actor ? ChatMessage.getSpeaker({ actor: options.actor }) : ChatMessage.getSpeaker();\n await ChatMessage.create({\n user: game.user?.id,\n speaker,\n content: options.content\n });\n}\n\nexport async function postSkillRollCard(data: {\n actor: any;\n actorName: string;\n actorImg?: string;\n skillName: string;\n skillImg?: string;\n roll: number;\n target: number;\n outcomeLabel: string;\n isSuccess: boolean;\n isSpecial: boolean;\n isFumble: boolean;\n}): Promise {\n const payload = {\n ...data,\n actorImg: data.actorImg || data.actor?.img || \"icons/svg/mystery-man.svg\",\n skillImg: data.skillImg || DEFAULT_SKILL_ICON\n };\n const content = await renderTemplate(`systems/${SYSTEM_ID}/templates/chat/skill-roll-card.hbs`, payload);\n await createChatMessage({ actor: data.actor, content });\n}\n\nexport async function postAttackCard(data: {\n actor: any;\n actorName: string;\n actorImg?: string;\n targetName: string;\n hasTarget?: boolean;\n weaponName: string;\n weaponImg?: string;\n skillName: string;\n skillImg?: string;\n attackRoll: number;\n attackTarget: number;\n attackOutcomeLabel: string;\n isSuccess: boolean;\n isSpecial: boolean;\n isFumble: boolean;\n hitLocationLabel: string;\n hitLocationRoll: number | null;\n rawDamage: number;\n armor: number;\n finalDamage: number;\n remainingLocationHp: number;\n remainingGeneralHp: number;\n energySourceLabel: string;\n energyCost: number;\n energyRemaining: number;\n ammoUsed?: boolean;\n ammoCost?: number;\n ammoRemaining?: number;\n dodge?: {\n attempted: boolean;\n roll: number;\n target: number;\n success: boolean;\n special: boolean;\n negated: boolean;\n } | null;\n notes: string;\n}): Promise {\n const payload = {\n ...data,\n actorImg: data.actorImg || data.actor?.img || \"icons/svg/mystery-man.svg\",\n weaponImg: data.weaponImg || \"icons/svg/sword.svg\",\n skillImg: data.skillImg || DEFAULT_SKILL_ICON,\n hasTarget: data.hasTarget ?? true\n };\n const content = await renderTemplate(`systems/${SYSTEM_ID}/templates/chat/attack-card.hbs`, payload);\n await createChatMessage({ actor: data.actor, content });\n}\n","import { outcomeLabel, rollPercentile } from \"./utils/percentile\";\nimport { chooseOrRollHitLocation, rollHitLocation } from \"./utils/hit-locations\";\nimport { LEG_LOCATIONS, SYSTEM_ID, isLimb, type HitLocationSlug } from \"./constants\";\nimport { postAttackCard, postSkillRollCard } from \"./chat\";\nimport { evaluateRollWithDice } from \"./utils/dice\";\nimport { getActorHitLocationSchema } from \"./hit-location-schemas\";\n\nfunction num(value: unknown, fallback = 0): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nfunction getSingleTargetActor(): any | null {\n const targets = Array.from(game.user?.targets ?? []);\n if (!targets.length) return null;\n return (targets[0] as any)?.actor ?? null;\n}\n\nexport async function rollStandaloneHitLocation(actor?: any): Promise {\n const result = await rollHitLocation(actor);\n const speaker = actor ? ChatMessage.getSpeaker({ actor }) : ChatMessage.getSpeaker();\n const content = `\n
\n

Hit Location

\n

Roll: ${result.roll}

\n

Location: ${result.location.label}

\n
\n `;\n\n await ChatMessage.create({\n user: game.user?.id,\n speaker,\n content\n });\n}\n\nexport async function rollSkillForActor(actor: any, skillName: string, target: number): Promise {\n const result = await rollPercentile(target);\n const skillItem = actor.items.find(\n (item: any) => item.type === \"skill\" && item.name.toLowerCase() === String(skillName).toLowerCase()\n );\n\n await postSkillRollCard({\n actor,\n actorName: actor.name,\n actorImg: actor.img,\n skillName,\n skillImg: skillItem?.img,\n roll: result.roll,\n target: result.target,\n outcomeLabel: outcomeLabel(result.outcome),\n isSuccess: result.isSuccess,\n isSpecial: result.isSpecial,\n isFumble: result.isFumble\n });\n}\n\nfunction resolveLinkedSkill(actor: any, weapon: any): { name: string; target: number; img?: string } {\n const skillId = weapon.system.linkedSkillId;\n const byId = skillId ? actor.items.get(skillId) : null;\n if (byId?.type === \"skill\") {\n return { name: byId.name, target: num(byId.system.value), img: byId.img };\n }\n\n const linkedSkillName = String(weapon.system.linkedSkill || \"\").trim();\n if (linkedSkillName) {\n const byName = actor.items.find(\n (item: any) => item.type === \"skill\" && item.name.toLowerCase() === linkedSkillName.toLowerCase()\n );\n if (byName) {\n return { name: byName.name, target: num(byName.system.value), img: byName.img };\n }\n }\n\n return {\n name: linkedSkillName || \"Unlinked Skill\",\n target: 0\n };\n}\n\ntype AimMode = \"unaimed\" | \"partial\" | \"full\";\n\ninterface AttackRollModifierResult {\n finalTarget: number;\n summary: string;\n aimMode: AimMode;\n aimMultiplier: number;\n flatModifierTotal: number;\n}\n\nfunction clampPercentTarget(value: number): number {\n return Math.max(0, Math.min(99, Math.floor(value)));\n}\n\nasync function promptAttackModifiers(attacker: any, weapon: any, baseSkillTarget: number): Promise {\n const attackType = String(weapon.system?.attackType || \"ranged\");\n const isRanged = attackType === \"ranged\";\n const defaultAim: AimMode = \"full\";\n const safeActorName = foundry.utils.escapeHTML(String(attacker?.name || \"Attacker\"));\n const safeWeaponName = foundry.utils.escapeHTML(String(weapon?.name || \"Weapon\"));\n const safeActorImg = foundry.utils.escapeHTML(String(attacker?.img || \"icons/svg/mystery-man.svg\"));\n const safeWeaponImg = foundry.utils.escapeHTML(String(weapon?.img || \"icons/svg/sword.svg\"));\n\n const content = `\n
\n
\n \"${safeActorName}\"\n \"${safeWeaponName}\"\n
\n

${safeWeaponName}

\n

${safeActorName} Attack Setup

\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n

Ringworld rule support: unaimed ranged attacks use quarter skill, partial aim uses half skill, full aim uses full skill.

\n
\n `;\n\n return new Promise((resolve) => {\n let settled = false;\n const done = (value: AttackRollModifierResult | null) => {\n if (settled) return;\n settled = true;\n resolve(value);\n };\n\n new Dialog({\n title: `${weapon.name} - Attack Modifiers`,\n content,\n buttons: {\n roll: {\n label: \"Roll Attack\",\n callback: (dlgHtml: JQuery) => {\n const root = dlgHtml[0] as HTMLElement | undefined;\n const query = (name: string) => (root?.querySelector(`[name=\"${name}\"]`) as HTMLInputElement | HTMLSelectElement | null);\n const aimModeRaw = String(query(\"aimMode\")?.value || defaultAim) as AimMode;\n const aimMode: AimMode = (aimModeRaw === \"unaimed\" || aimModeRaw === \"partial\" || aimModeRaw === \"full\")\n ? aimModeRaw\n : defaultAim;\n const aimMultiplier = isRanged ? ({ unaimed: 0.25, partial: 0.5, full: 1 } as const)[aimMode] : 1;\n const coverMod = num(query(\"coverMod\")?.value, 0);\n const movementMod = num(query(\"movementMod\")?.value, 0);\n const rangeMod = num(query(\"rangeMod\")?.value, 0);\n const situationalMod = num(query(\"situationalMod\")?.value, 0);\n const customMod = num(query(\"customMod\")?.value, 0);\n const customLabel = String(query(\"customLabel\")?.value || \"\").trim();\n\n const flatModifierTotal = coverMod + movementMod + rangeMod + situationalMod + customMod;\n const preAimTarget = baseSkillTarget + flatModifierTotal;\n const adjustedByAim = Math.floor(preAimTarget * aimMultiplier);\n const finalTarget = clampPercentTarget(adjustedByAim);\n\n const parts: string[] = [`Base ${baseSkillTarget}`];\n if (coverMod) parts.push(`Cover ${coverMod >= 0 ? \"+\" : \"\"}${coverMod}`);\n if (movementMod) parts.push(`Movement ${movementMod >= 0 ? \"+\" : \"\"}${movementMod}`);\n if (rangeMod) parts.push(`Range ${rangeMod >= 0 ? \"+\" : \"\"}${rangeMod}`);\n if (situationalMod) parts.push(`Situational ${situationalMod >= 0 ? \"+\" : \"\"}${situationalMod}`);\n if (customMod) parts.push(`${customLabel || \"Custom\"} ${customMod >= 0 ? \"+\" : \"\"}${customMod}`);\n parts.push(`Pre-Aim ${preAimTarget}`);\n if (isRanged) {\n const aimLabel = aimMode === \"unaimed\" ? \"Quarter\" : aimMode === \"partial\" ? \"Half\" : \"Full\";\n parts.push(`Aim ${aimLabel} x${aimMultiplier}`);\n }\n parts.push(`Final ${finalTarget}`);\n\n done({\n finalTarget,\n summary: parts.join(\" | \"),\n aimMode,\n aimMultiplier,\n flatModifierTotal\n });\n }\n },\n cancel: {\n label: \"Cancel\",\n callback: () => done(null)\n }\n },\n default: \"roll\",\n close: () => done(null)\n }, {\n classes: [\"ringworld-attack-dialog\"],\n width: 510,\n resizable: false\n }).render(true);\n });\n}\n\nasync function consumeWeaponAmmo(actor: any, weapon: any): Promise<{\n used: boolean;\n remaining: number;\n cost: number;\n insufficient: boolean;\n}> {\n const cost = Math.max(0, num(weapon.system.ammoUsedPerAttack));\n if (cost <= 0) {\n return { used: false, remaining: 0, cost: 0, insufficient: false };\n }\n\n const current = num(weapon.system.ammo?.value);\n const max = num(weapon.system.ammo?.max);\n if (max <= 0 && current <= 0) {\n // Ammo tracking not configured for this weapon; treat as untracked.\n return { used: false, remaining: 0, cost, insufficient: false };\n }\n\n if (current < cost) {\n ui.notifications?.warn(`${weapon.name} is out of ammunition. Reload before attacking.`);\n return { used: true, remaining: current, cost, insufficient: true };\n }\n\n const next = current - cost;\n await actor.updateEmbeddedDocuments(\"Item\", [{ _id: weapon.id, \"system.ammo.value\": next }]);\n return { used: true, remaining: next, cost, insufficient: false };\n}\n\nexport async function reloadWeapon(actor: any, weapon: any): Promise {\n const max = num(weapon.system.ammo?.max);\n if (max <= 0) {\n ui.notifications?.info(`${weapon.name} has no ammunition capacity configured (set Ammo Max on the weapon).`);\n return;\n }\n await actor.updateEmbeddedDocuments(\"Item\", [{ _id: weapon.id, \"system.ammo.value\": max }]);\n ui.notifications?.info(`${weapon.name} reloaded (${max}/${max}).`);\n}\n\nasync function consumeWeaponEnergy(actor: any, weapon: any): Promise<{\n sourceLabel: string;\n remaining: number;\n cost: number;\n insufficient: boolean;\n}> {\n const cost = Math.max(0, num(weapon.system.energyUsedPerAttack));\n if (cost <= 0) {\n return { sourceLabel: \"None\", remaining: 0, cost: 0, insufficient: false };\n }\n\n const source = String(weapon.system.powerSource || \"actor\");\n\n if (source === \"powerPack\") {\n const packId = String(weapon.system.powerPackId || \"\");\n let pack = packId ? actor.items.get(packId) : null;\n\n if (!pack || pack.type !== \"gear\" || !pack.system.isPowerPack) {\n // Auto-link the best carried power pack rather than failing the attack.\n pack = actor.items.find((item: any) =>\n item.type === \"gear\"\n && item.system.isPowerPack\n && !item.system.stowed\n && num(item.system.energy?.value) >= cost\n ) ?? null;\n\n if (pack) {\n await actor.updateEmbeddedDocuments(\"Item\", [{ _id: weapon.id, \"system.powerPackId\": pack.id }]);\n ui.notifications?.info(`${weapon.name} linked to ${pack.name}.`);\n }\n }\n\n if (!pack || pack.type !== \"gear\" || !pack.system.isPowerPack) {\n ui.notifications?.warn(\"Weapon is configured for a power pack but no valid power pack is carried.\");\n return { sourceLabel: \"Power Pack\", remaining: 0, cost, insufficient: true };\n }\n\n const current = num(pack.system.energy?.value);\n if (current < cost) {\n ui.notifications?.warn(`${pack.name} does not have enough energy.`);\n return { sourceLabel: pack.name, remaining: current, cost, insufficient: true };\n }\n\n const next = current - cost;\n await actor.updateEmbeddedDocuments(\"Item\", [{ _id: pack.id, \"system.energy.value\": next }]);\n return { sourceLabel: pack.name, remaining: next, cost, insufficient: false };\n }\n\n const current = num(actor.system.resources?.energy?.value);\n if (current < cost) {\n ui.notifications?.warn(`${actor.name} does not have enough actor energy.`);\n return { sourceLabel: \"Actor Energy\", remaining: current, cost, insufficient: true };\n }\n\n const next = current - cost;\n await actor.update({ \"system.resources.energy.value\": next });\n return { sourceLabel: \"Actor Energy\", remaining: next, cost, insufficient: false };\n}\n\nfunction getItemArmorAtLocation(item: any, slug: HitLocationSlug): number {\n if (item.type !== \"armor\" || !item.system.equipped || item.system.stowed) return 0;\n if (!item.system.coverage?.[slug]) return 0;\n\n const specific = num(item.system.perLocation?.[slug]);\n if (specific > 0) return specific;\n return num(item.system.value);\n}\n\nfunction getTotalArmorAtLocation(targetActor: any, slug: HitLocationSlug): number {\n const locArmor = num(targetActor.system.hitLocations?.[slug]?.armor);\n const stackedItemsArmor = targetActor.items\n .filter((item: any) => item.type === \"armor\")\n .reduce((sum: number, item: any) => sum + getItemArmorAtLocation(item, slug), 0);\n\n return locArmor + stackedItemsArmor;\n}\n\nfunction buildConditionUpdates(targetActor: any, slug: HitLocationSlug, locationValue: number, locationMax: number, generalHp: number) {\n const current = foundry.utils.deepClone(targetActor.system.conditions ?? {});\n current.unusableLimbs = current.unusableLimbs ?? { rArm: false, lArm: false, rLeg: false, lLeg: false };\n\n if (locationValue <= 0) {\n if (slug === \"head\" || slug === \"chest\") {\n current.unconscious = true;\n current.prone = true;\n }\n\n if (slug === \"abdomen\") {\n current.prone = true;\n current.unusableLimbs.rLeg = true;\n current.unusableLimbs.lLeg = true;\n }\n\n if (slug === \"rArm\" || slug === \"lArm\") {\n current.unusableLimbs[slug] = true;\n }\n\n if (LEG_LOCATIONS.includes(slug)) {\n current.unusableLimbs[slug] = true;\n current.prone = true;\n }\n }\n\n if (generalHp <= 0) {\n current.dying = true;\n }\n\n if ((slug === \"head\" || slug === \"chest\" || slug === \"abdomen\") && locationValue <= -locationMax) {\n current.dying = true;\n }\n\n if (slug === \"head\" && locationValue <= -locationMax) {\n current.dead = true;\n current.unconscious = true;\n }\n\n return current;\n}\n\nasync function syncCoreStatusEffects(targetActor: any, conditions: any): Promise {\n const toggler = (targetActor as any).toggleStatusEffect;\n if (typeof toggler !== \"function\") return;\n\n try {\n await toggler.call(targetActor, \"prone\", { active: !!conditions.prone });\n await toggler.call(targetActor, \"unconscious\", { active: !!conditions.unconscious });\n await toggler.call(targetActor, \"dead\", { active: !!conditions.dead });\n } catch (_err) {\n // Some worlds lock actor-level status manipulation; system conditions still update.\n }\n}\n\nasync function applyLocationDamage(targetActor: any, slug: HitLocationSlug, rawDamage: number): Promise<{\n armor: number;\n finalDamage: number;\n locationValue: number;\n generalHpValue: number;\n}> {\n const location = targetActor.system.hitLocations?.[slug];\n const currentLoc = num(location?.hp?.value);\n const locMax = Math.max(1, num(location?.hp?.max, 1));\n const armor = getTotalArmorAtLocation(targetActor, slug);\n const finalDamage = Math.max(0, rawDamage - armor);\n\n const unclampedLoc = currentLoc - finalDamage;\n const nextLoc = isLimb(slug) ? Math.max(unclampedLoc, -locMax) : unclampedLoc;\n\n const currentGeneral = num(targetActor.system.generalHp?.value);\n const nextGeneral = currentGeneral - finalDamage;\n\n const conditions = buildConditionUpdates(targetActor, slug, nextLoc, locMax, nextGeneral);\n\n const updates: Record = {\n [`system.hitLocations.${slug}.hp.value`]: nextLoc,\n \"system.generalHp.value\": nextGeneral,\n \"system.conditions\": conditions\n };\n\n await targetActor.update(updates);\n await syncCoreStatusEffects(targetActor, conditions);\n\n return {\n armor,\n finalDamage,\n locationValue: nextLoc,\n generalHpValue: nextGeneral\n };\n}\n\nexport async function promptCharacteristicCheck(actor: any, characterKey: string, label: string): Promise {\n const validKeys = new Set([\"str\", \"mas\", \"con\", \"int\", \"pow\", \"dex\", \"app\", \"edu\", \"age\"]);\n if (!validKeys.has(characterKey)) return;\n\n const base = Math.max(0, num(actor.system?.characteristics?.[characterKey], 0));\n const content = `\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n

Roll d100 against Characteristic x Multiplier.

\n
\n `;\n\n const multiplier = await new Promise((resolve) => {\n let settled = false;\n const done = (value: number | null) => {\n if (settled) return;\n settled = true;\n resolve(value);\n };\n\n new Dialog({\n title: `${label} Check`,\n content,\n buttons: {\n roll: {\n label: \"Roll\",\n callback: (dlgHtml: JQuery) => {\n const selected = Number((dlgHtml[0]?.querySelector(\"select[name='multiplier']\") as HTMLSelectElement | null)?.value || 1);\n const safeMultiplier = Math.max(1, Math.min(7, Math.floor(selected || 1)));\n done(safeMultiplier);\n }\n },\n cancel: {\n label: \"Cancel\",\n callback: () => done(null)\n }\n },\n default: \"roll\",\n close: () => done(null)\n }, {\n classes: [\"ringworld-attack-dialog\"]\n }).render(true);\n });\n\n if (!multiplier) return;\n const target = clampPercentTarget(base * multiplier);\n const result = await rollPercentile(target);\n\n await postSkillRollCard({\n actor,\n actorName: actor.name,\n actorImg: actor.img,\n skillName: `${label} x${multiplier}`,\n roll: result.roll,\n target: result.target,\n outcomeLabel: outcomeLabel(result.outcome),\n isSuccess: result.isSuccess,\n isSpecial: result.isSpecial,\n isFumble: result.isFumble\n });\n}\n\nfunction getWorldSetting(key: string, fallback: boolean): boolean {\n try {\n return Boolean(game.settings.get(SYSTEM_ID, key));\n } catch (_err) {\n return fallback;\n }\n}\n\nasync function promptDefenderDodge(targetActor: any, attackWasSpecial: boolean): Promise<{\n attempted: boolean;\n roll: number;\n target: number;\n success: boolean;\n special: boolean;\n negated: boolean;\n} | null> {\n const dodgeTarget = num(targetActor.system?.derivedRolls?.dodge, 0);\n const safeName = foundry.utils.escapeHTML(String(targetActor.name || \"Target\"));\n\n const attempt = await new Promise((resolve) => {\n let settled = false;\n const done = (value: boolean) => {\n if (settled) return;\n settled = true;\n resolve(value);\n };\n new Dialog({\n title: `${targetActor.name} - Dodge Attempt`,\n content: `\n
\n

${safeName} has been hit${attackWasSpecial ? \" by a special success\" : \"\"}.

\n

Dodge ${dodgeTarget}%. A successful dodge evades a normal hit; only a special dodge evades a special hit.

\n
\n `,\n buttons: {\n dodge: { label: `Dodge (${dodgeTarget}%)`, callback: () => done(true) },\n none: { label: \"No Dodge\", callback: () => done(false) }\n },\n default: \"dodge\",\n close: () => done(false)\n }, {\n classes: [\"ringworld-attack-dialog\"],\n width: 420\n }).render(true);\n });\n\n if (!attempt) return null;\n\n const result = await rollPercentile(dodgeTarget);\n const negated = result.isSuccess && (!attackWasSpecial || result.isSpecial);\n return {\n attempted: true,\n roll: result.roll,\n target: result.target,\n success: result.isSuccess,\n special: result.isSpecial,\n negated\n };\n}\n\nexport async function useWeaponWorkflow(attacker: any, weapon: any): Promise {\n const targetActor = getSingleTargetActor();\n const hasTarget = Boolean(targetActor);\n const targetName = targetActor?.name ?? \"No Target\";\n\n const linkedSkill = resolveLinkedSkill(attacker, weapon);\n const modifierResult = await promptAttackModifiers(attacker, weapon, linkedSkill.target);\n if (!modifierResult) return;\n\n const ammo = await consumeWeaponAmmo(attacker, weapon);\n if (ammo.insufficient) return;\n\n const energy = await consumeWeaponEnergy(attacker, weapon);\n if (energy.insufficient) return;\n\n const attack = await rollPercentile(modifierResult.finalTarget);\n\n if (!attack.isSuccess) {\n const remainingGeneralHp = targetActor ? num(targetActor.system.generalHp?.value, 0) : 0;\n await postAttackCard({\n actor: attacker,\n actorName: attacker.name,\n actorImg: attacker.img,\n targetName,\n hasTarget,\n weaponName: weapon.name,\n weaponImg: weapon.img,\n skillName: linkedSkill.name,\n skillImg: linkedSkill.img,\n attackRoll: attack.roll,\n attackTarget: attack.target,\n attackOutcomeLabel: outcomeLabel(attack.outcome),\n isSuccess: false,\n isSpecial: attack.isSpecial,\n isFumble: attack.isFumble,\n hitLocationLabel: \"-\",\n hitLocationRoll: null,\n rawDamage: 0,\n armor: 0,\n finalDamage: 0,\n remainingLocationHp: 0,\n remainingGeneralHp,\n energySourceLabel: energy.sourceLabel,\n energyCost: energy.cost,\n energyRemaining: energy.remaining,\n ammoUsed: ammo.used,\n ammoCost: ammo.cost,\n ammoRemaining: ammo.remaining,\n dodge: null,\n notes: attack.isFumble\n ? `Fumble! The GM should adjudicate a mishap (dropped or damaged weapon, hit an ally, drained power). ${modifierResult.summary}`\n : `Attack failed before damage was rolled. ${modifierResult.summary}`\n });\n return;\n }\n\n // Give the defender a dodge attempt before damage is applied.\n let dodge: Awaited> = null;\n if (targetActor && getWorldSetting(\"promptDefenderDodge\", true)) {\n dodge = await promptDefenderDodge(targetActor, attack.isSpecial);\n }\n\n if (dodge?.negated) {\n await postAttackCard({\n actor: attacker,\n actorName: attacker.name,\n actorImg: attacker.img,\n targetName,\n hasTarget,\n weaponName: weapon.name,\n weaponImg: weapon.img,\n skillName: linkedSkill.name,\n skillImg: linkedSkill.img,\n attackRoll: attack.roll,\n attackTarget: attack.target,\n attackOutcomeLabel: outcomeLabel(attack.outcome),\n isSuccess: false,\n isSpecial: attack.isSpecial,\n isFumble: false,\n hitLocationLabel: \"-\",\n hitLocationRoll: null,\n rawDamage: 0,\n armor: 0,\n finalDamage: 0,\n remainingLocationHp: 0,\n remainingGeneralHp: num(targetActor.system.generalHp?.value, 0),\n energySourceLabel: energy.sourceLabel,\n energyCost: energy.cost,\n energyRemaining: energy.remaining,\n ammoUsed: ammo.used,\n ammoCost: ammo.cost,\n ammoRemaining: ammo.remaining,\n dodge,\n notes: `${targetName} dodged the attack. ${modifierResult.summary}`\n });\n return;\n }\n\n const hitSelection = await chooseOrRollHitLocation(targetActor ?? attacker);\n if (!hitSelection) return;\n\n const damageFormula = String(weapon.system.damageFormula || \"0\").trim() || \"0\";\n const automateSpecial = getWorldSetting(\"automateSpecialDamage\", true);\n const rollSpecialDamage = attack.isSpecial && automateSpecial;\n const damageRoll = await evaluateRollWithDice(damageFormula);\n let rawDamage = Math.max(0, num(damageRoll.total));\n if (rollSpecialDamage) {\n const bonusRoll = await evaluateRollWithDice(damageFormula);\n rawDamage += Math.max(0, num(bonusRoll.total));\n }\n\n const application = targetActor\n ? await applyLocationDamage(targetActor, hitSelection.slug, rawDamage)\n : {\n armor: 0,\n finalDamage: rawDamage,\n locationValue: 0,\n generalHpValue: 0\n };\n\n await postAttackCard({\n actor: attacker,\n actorName: attacker.name,\n actorImg: attacker.img,\n targetName,\n hasTarget,\n weaponName: weapon.name,\n weaponImg: weapon.img,\n skillName: linkedSkill.name,\n skillImg: linkedSkill.img,\n attackRoll: attack.roll,\n attackTarget: attack.target,\n attackOutcomeLabel: outcomeLabel(attack.outcome),\n isSuccess: attack.isSuccess,\n isSpecial: attack.isSpecial,\n isFumble: attack.isFumble,\n hitLocationLabel: hitSelection.label,\n hitLocationRoll: hitSelection.rolled,\n rawDamage,\n armor: application.armor,\n finalDamage: application.finalDamage,\n remainingLocationHp: application.locationValue,\n remainingGeneralHp: application.generalHpValue,\n energySourceLabel: energy.sourceLabel,\n energyCost: energy.cost,\n energyRemaining: energy.remaining,\n ammoUsed: ammo.used,\n ammoCost: ammo.cost,\n ammoRemaining: ammo.remaining,\n dodge,\n notes: [\n rollSpecialDamage ? \"Special success: damage dice rolled twice.\" : \"\",\n targetActor\n ? \"Location and general HP were both reduced by final damage, per Ringworld rules.\"\n : \"No target selected: roll resolved with no damage application.\",\n modifierResult.summary\n ].filter(Boolean).join(\" \")\n });\n}\n\nexport function recomputeHitPointMaximums(actor: any): void {\n if (actor.type !== \"explorer\" && actor.type !== \"creature\") return;\n\n // Ringworld general HP is CON + MAS. Location HP then scales from that general HP.\n // Maximums are always derived; current values are source-authoritative so damage\n // survives re-preparation. A null source value means \"never set\": start at max.\n const con = num(actor.system?.characteristics?.con, 10);\n const mas = num(actor.system?.characteristics?.mas, 10);\n const generalMax = Math.max(1, Math.floor(con + mas));\n const source = (actor._source ?? actor.toObject?.(false) ?? {}).system ?? {};\n\n const sourceGeneralValue = source.generalHp?.value;\n actor.system.generalHp = actor.system.generalHp ?? {};\n actor.system.generalHp.max = generalMax;\n actor.system.generalHp.value = (sourceGeneralValue === null || sourceGeneralValue === undefined)\n ? generalMax\n : Math.min(num(sourceGeneralValue, generalMax), generalMax);\n\n actor.system.hitLocations = actor.system.hitLocations ?? {};\n actor.system.hitLocationSchema = actor.system.hitLocationSchema ?? \"auto\";\n const schema = getActorHitLocationSchema(actor);\n\n for (const entry of schema.entries) {\n const slug = entry.slug;\n const loc = actor.system.hitLocations[slug] ?? {\n label: slug,\n hp: {},\n armor: 0\n };\n loc.label = entry.label;\n const hpFactor = Math.max(0.05, num((entry as any).hpFactor, 0.3));\n const max = Math.max(1, Math.ceil(generalMax * hpFactor));\n const sourceLocValue = source.hitLocations?.[slug]?.hp?.value;\n\n loc.hp = loc.hp ?? {};\n loc.hp.max = max;\n loc.hp.value = (sourceLocValue === null || sourceLocValue === undefined)\n ? max\n : Math.min(num(sourceLocValue, max), max);\n actor.system.hitLocations[slug] = loc;\n }\n}\n\nexport function getTemplatePath(path: string): string {\n return `systems/${SYSTEM_ID}/templates/${path}`;\n}\n","import { SYSTEM_ID } from \"./constants\";\n\nconst JOURNAL_NAME = \"Ringworld GM Reference\";\n\ninterface ReferencePage {\n name: string;\n content: string;\n}\n\nfunction buildPages(): ReferencePage[] {\n return [\n {\n name: \"Percentile Outcomes\",\n content: `\n

Every check is a d100 roll against a target percentage. The system classifies results automatically:

\n
    \n
  • Success — roll ≤ target.
  • \n
  • Special Success — roll ≤ one fifth of the target (minimum 1). Attacks roll their damage dice twice when Automate Special Success Damage is enabled.
  • \n
  • Failure — roll > target.
  • \n
  • Fumble — roll of 96–100 when the target is below 50, or a natural 100 otherwise. The GM adjudicates a mishap: dropped or damaged weapon, hit an ally, drained power pack.
  • \n
\n

Characteristic checks use Characteristic × Multiplier (usually ×5): click any characteristic button on a sheet to pick the multiplier.

\n `\n },\n {\n name: \"Combat Sequence (Impulses)\",\n content: `\n

Ringworld does not use simple initiative. Combat rounds are split into impulses and each combatant acts on a rhythm set by their Action Ranking (AR), which is derived from DEX (lower is faster) and worsened by encumbrance.

\n
    \n
  1. Add combatants to the Combat Tracker as normal. The Ringworld impulse panel replaces the core tracker list.
  2. \n
  3. Each combatant schedules an action: a major action (attack, full move, complex task) completes after AR impulses; a minor action (drop prone, shout, draw) completes after 1 impulse.
  4. \n
  5. Advance the clock with Next Completion or +1. When a combatant's action completes, resolve it, then let them schedule the next one.
  6. \n
\n

The floating impulse HUD can be dragged anywhere on screen and mirrors the tracker for quick play.

\n `\n },\n {\n name: \"Attack Workflow\",\n content: `\n

Target a token, then press the weapon's Use button on the attacker's sheet. The system walks through the 1984 rules in order:

\n
    \n
  1. Aim state (ranged only): unaimed fires at quarter skill, partially aimed at half, fully aimed at full skill. Cover, movement, range and situational modifiers are applied before the aim multiplier.
  2. \n
  3. Ammunition and energy are spent. Projectile weapons with an ammo capacity are blocked when empty — use the Reload button on the weapon row. Energy weapons draw from the actor pool or a linked power pack.
  4. \n
  5. Dodge: on a hit, the defender is offered a Dodge roll (DEX ×5). A successful dodge evades a normal hit; only a special dodge evades a special hit. Disable with the Prompt Defender Dodge setting.
  6. \n
  7. Hit location is rolled on a d20 (or picked manually). Species use their own body schema — puppeteers, dolphins, trinocs, bandersnatchi and kzinti map differently.
  8. \n
  9. Damage is rolled, stacked armor at that location is subtracted, and the result reduces both the location HP and the general HP.
  10. \n
\n `\n },\n {\n name: \"Wounds & Conditions\",\n content: `\n

When a hit location reaches 0 HP or less, conditions are applied automatically:

\n
    \n
  • Head or Chest at 0 — unconscious and prone.
  • \n
  • Abdomen at 0 — prone, both legs unusable.
  • \n
  • Arm at 0 — that arm is unusable.
  • \n
  • Leg at 0 — that leg is unusable, and the character falls prone.
  • \n
  • General HP at 0 — dying.
  • \n
  • Head, chest or abdomen at negative full value — dying; a head at negative full value is death outright.
  • \n
\n

Limbs cannot go below their negative maximum. Use Reset Conditions on a sheet after treatment or recovery. Prone, unconscious and dead sync to token status icons.

\n `\n },\n {\n name: \"Running the 1984 Rules\",\n content: `\n

Quirks of the original boxed set that the system encodes for you:

\n
    \n
  • General HP = CON + MAS. MAS (mass) replaces the familiar SIZ. Location HP scale from general HP by body schema.
  • \n
  • Damage modifier comes from STR + MAS and is recomputed automatically when characteristics change.
  • \n
  • Skill pools: Education points = (EDU − 10) × 20, Pursuit points = (Age − EDU − 6) × 20, Special points = INT × 10. The character builder on the Skills tab tracks all three.
  • \n
  • Skill category caps: each category is capped by a characteristic pair (e.g. Agility by STR + DEX). The builder enforces the caps.
  • \n
  • Gravity matters: carried weight is halved in light gravity and doubled in heavy gravity before comparing to the STR limit; over-limit explorers slow to Move 2 and suffer an Action Ranking penalty.
  • \n
  • Energy economy: most Ringworld tech runs on power packs (R20/R50/R100). Weapons can draw from a linked pack — keep spares, and remember fumbles can drain them.
  • \n
\n `\n },\n {\n name: \"GM Quick Start\",\n content: `\n

To get a table playing quickly:

\n
    \n
  1. Seed the catalog (Items sidebar button) — species, 55 base skills, pursuits, weapons, armor and gear from the boxed set appear in organised folders. This runs automatically for new worlds.
  2. \n
  3. Create Random Explorer (Actors sidebar button) — rolls characteristics by species and gravity, adds base skills and a starter kit.
  4. \n
  5. For bespoke characters, unlock the sheet tools (padlock, top right of the sheet) and use the Character Builder on the Skills tab: pick pursuits, then allocate the three point pools.
  6. \n
  7. Creatures get the same automation — hit locations, dodge, armor stacking — via the creature sheet, with a body schema selector for non-humanoids.
  8. \n
  9. Check System Settings for the automation toggles (special success damage, defender dodge prompts).
  10. \n
\n `\n }\n ];\n}\n\nexport async function seedGmReference(): Promise {\n if (!game.user?.isGM) return false;\n\n const journals = (game as any).journal;\n const existing = journals?.find((entry: any) => entry.getFlag?.(SYSTEM_ID, \"gmReference\") === true)\n ?? journals?.getName?.(JOURNAL_NAME);\n if (existing) return false;\n\n const pages = buildPages().map((page, index) => ({\n name: page.name,\n type: \"text\",\n sort: (index + 1) * 100000,\n text: {\n format: 1,\n content: page.content.trim()\n }\n }));\n\n await (getDocumentClass(\"JournalEntry\") as any).create({\n name: JOURNAL_NAME,\n pages,\n flags: {\n [SYSTEM_ID]: {\n gmReference: true\n }\n },\n ownership: { default: 0 }\n });\n\n return true;\n}\n","import { SYSTEM_ID } from \"./constants\";\nimport { normalizeSkillName, RINGWORLD_BASE_SKILLS } from \"./data-base-skills\";\nimport { skillIconPath } from \"./skill-icons\";\nimport { seedGmReference } from \"./gm-reference\";\n\nexport type GravityType = \"light\" | \"normal\" | \"heavy\";\n\ninterface SpeciesCatalogEntry {\n name: string;\n playable: boolean;\n gravity: GravityType;\n homeworld: string;\n modifiers: {\n str: number;\n mas: number;\n con: number;\n int: number;\n pow: number;\n dex: number;\n app: number;\n edu: number;\n age: number;\n };\n notes: string;\n}\n\ninterface WeaponCatalogEntry {\n name: string;\n equipped?: boolean;\n weight?: number;\n linkedSkill: string;\n attackType: \"melee\" | \"ranged\";\n damageFormula: string;\n range: { close: string; medium: string; long: string };\n energyUsedPerAttack: number;\n ammoUsedPerAttack: number;\n powerSource: \"actor\" | \"powerPack\";\n notes: string;\n}\n\ninterface ArmorCatalogEntry {\n name: string;\n equipped: boolean;\n weight?: number;\n value: number;\n coverage: Record;\n notes: string;\n}\n\ninterface GearCatalogEntry {\n name: string;\n equipped?: boolean;\n weight: number;\n cost: number;\n energyUse: number;\n powerSupplyNotes: string;\n isPowerPack: boolean;\n energy: { value: number; max: number };\n notes: string;\n}\n\ninterface PursuitCatalogEntry {\n name: string;\n rollRange: string;\n wealthValue: number;\n occupationPointsPerYear: number;\n fixedSkills: string[];\n optionalSkillGroups?: Array<{\n choose: number;\n skills: string[];\n }>;\n notes: string;\n}\n\ninterface CatalogSeed {\n key: string;\n data: any;\n folderKey: \"species\" | \"skills\" | \"pursuits\" | \"gear\" | \"armor\" | \"weaponMelee\" | \"weaponRanged\";\n img: string;\n}\n\nexport const RINGWORLD_CATALOG_VERSION = 10;\n\nconst ICONS = {\n speciesDefault: \"systems/ringworld/assets/icons/species.svg\",\n skillDefault: \"systems/ringworld/assets/icons/skill.svg\",\n pursuitDefault: \"systems/ringworld/assets/icons/pursuit.svg\",\n weaponMelee: \"systems/ringworld/assets/icons/weapon-melee.svg\",\n weaponRanged: \"systems/ringworld/assets/icons/weapon-ranged.svg\",\n armor: \"systems/ringworld/assets/icons/armor.svg\",\n gearDefault: \"systems/ringworld/assets/icons/gear.svg\",\n powerPackDefault: \"systems/ringworld/assets/icons/power-pack.svg\"\n};\n\nfunction iconSlug(name: string): string {\n return String(name)\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nfunction speciesIconPath(name: string): string {\n return `systems/ringworld/assets/icons/species/${iconSlug(name)}.svg`;\n}\n\nfunction weaponIconPath(name: string): string {\n return `systems/ringworld/assets/icons/weapon/${iconSlug(name)}.svg`;\n}\n\nfunction armorIconPath(name: string): string {\n return `systems/ringworld/assets/icons/armor/${iconSlug(name)}.svg`;\n}\n\nfunction gearIconPath(name: string): string {\n return `systems/ringworld/assets/icons/gear/${iconSlug(name)}.svg`;\n}\n\nfunction pursuitIconPath(name: string): string {\n return `systems/ringworld/assets/icons/pursuit/${iconSlug(name)}.svg`;\n}\n\nconst allCoverage = {\n rLeg: true,\n lLeg: true,\n abdomen: true,\n chest: true,\n rArm: true,\n lArm: true,\n head: true\n};\n\nconst torsoCoverage = {\n rLeg: false,\n lLeg: false,\n abdomen: true,\n chest: true,\n rArm: false,\n lArm: false,\n head: false\n};\n\nconst headCoverage = {\n rLeg: false,\n lLeg: false,\n abdomen: false,\n chest: false,\n rArm: false,\n lArm: false,\n head: true\n};\n\nconst armCoverage = {\n rLeg: false,\n lLeg: false,\n abdomen: false,\n chest: false,\n rArm: true,\n lArm: true,\n head: false\n};\n\nconst legCoverage = {\n rLeg: true,\n lLeg: true,\n abdomen: false,\n chest: false,\n rArm: false,\n lArm: false,\n head: false\n};\n\nexport const SPECIES_CATALOG: SpeciesCatalogEntry[] = [\n {\n name: \"Human\",\n playable: true,\n gravity: \"normal\",\n homeworld: \"Known Space\",\n modifiers: { str: 0, mas: 0, con: 0, int: 0, pow: 0, dex: 0, app: 0, edu: 0, age: 0 },\n notes: \"Baseline human explorer profile.\"\n },\n {\n name: \"Earth Human\",\n playable: true,\n gravity: \"normal\",\n homeworld: \"Earth\",\n modifiers: { str: 0, mas: 0, con: 0, int: 0, pow: 1, dex: 0, app: 0, edu: 0, age: 0 },\n notes: \"Earth-line humans with stronger latent psionic potential.\"\n },\n {\n name: \"Kzinti\",\n playable: true,\n gravity: \"heavy\",\n homeworld: \"Kzin\",\n modifiers: { str: 2, mas: 2, con: 1, int: -1, pow: 0, dex: 0, app: -2, edu: 0, age: 0 },\n notes: \"Predatory felinoids with high physical strength.\"\n },\n {\n name: \"Pierson's Puppeteer\",\n playable: true,\n gravity: \"light\",\n homeworld: \"Fleet of Worlds\",\n modifiers: { str: -2, mas: -2, con: -1, int: 2, pow: 1, dex: 1, app: 0, edu: 1, age: 0 },\n notes: \"Highly intelligent, cautious engineers.\"\n },\n {\n name: \"Dolphin\",\n playable: true,\n gravity: \"normal\",\n homeworld: \"Human Space Oceans\",\n modifiers: { str: -2, mas: 1, con: 1, int: 0, pow: 0, dex: 0, app: 0, edu: 0, age: 0 },\n notes: \"Aquatic specialists with enhanced endurance.\"\n },\n {\n name: \"Trinoc\",\n playable: true,\n gravity: \"light\",\n homeworld: \"Trinoc Worlds\",\n modifiers: { str: -1, mas: -1, con: 0, int: 1, pow: 0, dex: 1, app: 0, edu: 0, age: 0 },\n notes: \"Three-eyed flyers with excellent perception.\"\n },\n {\n name: \"Martian\",\n playable: true,\n gravity: \"light\",\n homeworld: \"Mars\",\n modifiers: { str: -1, mas: -1, con: -1, int: 1, pow: 0, dex: 1, app: 0, edu: 0, age: 0 },\n notes: \"Light-gravity adapted intellect-focused profile.\"\n },\n {\n name: \"Pierin\",\n playable: true,\n gravity: \"normal\",\n homeworld: \"Pierin Space\",\n modifiers: { str: 0, mas: 0, con: 0, int: 1, pow: 0, dex: 0, app: 1, edu: 0, age: 0 },\n notes: \"Socially adept, technically curious explorers.\"\n },\n {\n name: \"Boat People\",\n playable: true,\n gravity: \"normal\",\n homeworld: \"Ringworld\",\n modifiers: { str: 0, mas: 0, con: 1, int: 0, pow: 0, dex: 0, app: 0, edu: -1, age: 0 },\n notes: \"Ringworld hominids adapted to river and sea cultures.\"\n },\n {\n name: \"Builder\",\n playable: true,\n gravity: \"normal\",\n homeworld: \"Ringworld\",\n modifiers: { str: 1, mas: 1, con: 0, int: 0, pow: 0, dex: 0, app: -1, edu: 0, age: 0 },\n notes: \"Ringworld labor stock with robust build.\"\n },\n {\n name: \"Ghoul\",\n playable: true,\n gravity: \"normal\",\n homeworld: \"Ringworld\",\n modifiers: { str: 0, mas: 0, con: 1, int: -1, pow: 0, dex: 1, app: -2, edu: -1, age: 0 },\n notes: \"Scavenger subspecies with strong survival instincts.\"\n },\n {\n name: \"Bandersnatchi\",\n playable: false,\n gravity: \"heavy\",\n homeworld: \"Known Space\",\n modifiers: { str: 4, mas: 4, con: 3, int: 0, pow: 0, dex: -2, app: -3, edu: 0, age: 10 },\n notes: \"Massive engineered beings; typically GM creature profile.\"\n }\n];\n\nexport const WEAPON_CATALOG: WeaponCatalogEntry[] = [\n {\n name: \"Variable Sword\",\n equipped: true,\n weight: 1.5,\n linkedSkill: \"V. Sword, F. Laser\",\n attackType: \"melee\",\n damageFormula: \"1d10+1\",\n range: { close: \"Melee\", medium: \"-\", long: \"-\" },\n energyUsedPerAttack: 1,\n ammoUsedPerAttack: 0,\n powerSource: \"powerPack\",\n notes: \"High-energy blade weapon.\"\n },\n {\n name: \"Monofilament Knife\",\n equipped: true,\n weight: 0.2,\n linkedSkill: \"Archaic Melee Weapon\",\n attackType: \"melee\",\n damageFormula: \"1d6+1\",\n range: { close: \"Melee\", medium: \"-\", long: \"-\" },\n energyUsedPerAttack: 0,\n ammoUsedPerAttack: 0,\n powerSource: \"actor\",\n notes: \"Fine-edge close combat blade.\"\n },\n {\n name: \"Shock Baton\",\n equipped: true,\n weight: 1.2,\n linkedSkill: \"Unarmed Combat\",\n attackType: \"melee\",\n damageFormula: \"1d8+1\",\n range: { close: \"Melee\", medium: \"-\", long: \"-\" },\n energyUsedPerAttack: 1,\n ammoUsedPerAttack: 0,\n powerSource: \"powerPack\",\n notes: \"Close-quarters stun baton.\"\n },\n {\n name: \"Flashlight Laser\",\n equipped: true,\n weight: 0.8,\n linkedSkill: \"V. Sword, F. Laser\",\n attackType: \"ranged\",\n damageFormula: \"1d10\",\n range: { close: \"Short\", medium: \"Medium\", long: \"Long\" },\n energyUsedPerAttack: 2,\n ammoUsedPerAttack: 0,\n powerSource: \"powerPack\",\n notes: \"Compact laser unit.\"\n },\n {\n name: \"Laser Pistol\",\n equipped: true,\n weight: 1.4,\n linkedSkill: \"Handgun, Energy\",\n attackType: \"ranged\",\n damageFormula: \"1d10+1\",\n range: { close: \"Short\", medium: \"Medium\", long: \"Long\" },\n energyUsedPerAttack: 2,\n ammoUsedPerAttack: 0,\n powerSource: \"powerPack\",\n notes: \"Common energy sidearm.\"\n },\n {\n name: \"Laser Rifle\",\n equipped: true,\n weight: 4.5,\n linkedSkill: \"Heavy Weapon, Energy\",\n attackType: \"ranged\",\n damageFormula: \"2d6+2\",\n range: { close: \"Short\", medium: \"Long\", long: \"Extreme\" },\n energyUsedPerAttack: 3,\n ammoUsedPerAttack: 0,\n powerSource: \"powerPack\",\n notes: \"Standard long-arm laser weapon.\"\n },\n {\n name: \"Stunner\",\n equipped: true,\n weight: 1.0,\n linkedSkill: \"Handgun, Energy\",\n attackType: \"ranged\",\n damageFormula: \"1d6\",\n range: { close: \"Short\", medium: \"Medium\", long: \"Long\" },\n energyUsedPerAttack: 1,\n ammoUsedPerAttack: 0,\n powerSource: \"powerPack\",\n notes: \"Low-lethality disruption sidearm.\"\n },\n {\n name: \"Handgun (Projectile)\",\n equipped: true,\n weight: 1.2,\n linkedSkill: \"Handgun, Projectile\",\n attackType: \"ranged\",\n damageFormula: \"1d10\",\n range: { close: \"Short\", medium: \"Medium\", long: \"Long\" },\n energyUsedPerAttack: 0,\n ammoUsedPerAttack: 1,\n powerSource: \"actor\",\n notes: \"Conventional projectile sidearm.\"\n },\n {\n name: \"Rifle (Projectile)\",\n equipped: true,\n weight: 5.0,\n linkedSkill: \"Heavy Weapon, Projectile\",\n attackType: \"ranged\",\n damageFormula: \"2d6\",\n range: { close: \"Short\", medium: \"Long\", long: \"Extreme\" },\n energyUsedPerAttack: 0,\n ammoUsedPerAttack: 1,\n powerSource: \"actor\",\n notes: \"Conventional projectile rifle.\"\n },\n {\n name: \"Slug Thrower Carbine\",\n equipped: true,\n weight: 3.8,\n linkedSkill: \"Heavy Weapon, Projectile\",\n attackType: \"ranged\",\n damageFormula: \"2d6+1\",\n range: { close: \"Short\", medium: \"Long\", long: \"Extreme\" },\n energyUsedPerAttack: 0,\n ammoUsedPerAttack: 1,\n powerSource: \"actor\",\n notes: \"Compact projectile carbine.\"\n }\n];\n\nexport const ARMOR_CATALOG: ArmorCatalogEntry[] = [\n { name: \"Cloth Vest\", equipped: true, weight: 2, value: 1, coverage: torsoCoverage, notes: \"Basic torso protection.\" },\n { name: \"Soft Combat Vest\", equipped: true, weight: 4, value: 2, coverage: torsoCoverage, notes: \"Flexible tactical vest.\" },\n { name: \"Combat Harness\", equipped: true, weight: 5, value: 2, coverage: { ...torsoCoverage, rArm: true, lArm: true }, notes: \"Torso + upper arms.\" },\n { name: \"Armored Coat\", equipped: true, weight: 7, value: 3, coverage: { ...torsoCoverage, rArm: true, lArm: true }, notes: \"Heavy coat with arm plating.\" },\n { name: \"Leg Guards\", equipped: true, weight: 4, value: 2, coverage: legCoverage, notes: \"Lower-body armor.\" },\n { name: \"Arm Bracers\", equipped: true, weight: 2, value: 2, coverage: armCoverage, notes: \"Forearm and upper arm guards.\" },\n { name: \"Combat Helmet\", equipped: true, weight: 1.5, value: 2, coverage: headCoverage, notes: \"Cranial protection.\" },\n { name: \"Full Combat Suit\", equipped: true, weight: 12, value: 3, coverage: allCoverage, notes: \"Full-body armored suit.\" },\n { name: \"Impact Suit\", equipped: true, weight: 16, value: 4, coverage: allCoverage, notes: \"High-end impact and hazard suit.\" }\n];\n\nexport const GEAR_CATALOG: GearCatalogEntry[] = [\n {\n name: \"Power Pack R20\",\n weight: 1,\n cost: 100,\n energyUse: 0,\n powerSupplyNotes: \"Rechargeable power pack\",\n isPowerPack: true,\n energy: { value: 20, max: 20 },\n notes: \"Standard personal battery pack.\"\n },\n {\n name: \"Power Pack R50\",\n weight: 2,\n cost: 220,\n energyUse: 0,\n powerSupplyNotes: \"Rechargeable power pack\",\n isPowerPack: true,\n energy: { value: 50, max: 50 },\n notes: \"Extended personal battery pack.\"\n },\n {\n name: \"Power Pack R100\",\n weight: 4,\n cost: 400,\n energyUse: 0,\n powerSupplyNotes: \"Rechargeable power pack\",\n isPowerPack: true,\n energy: { value: 100, max: 100 },\n notes: \"High-capacity field battery.\"\n },\n { name: \"Portable Generator\", weight: 8, cost: 700, energyUse: 0, powerSupplyNotes: \"Provides charging capacity\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Portable recharge generator.\" },\n { name: \"MicroMind Unit\", weight: 0.5, cost: 900, energyUse: 1, powerSupplyNotes: \"Requires external power\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Portable advanced computation module.\" },\n { name: \"Memory Bubble Reader\", weight: 0.5, cost: 450, energyUse: 1, powerSupplyNotes: \"Standard battery compatible\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Reads and writes memory bubbles.\" },\n { name: \"Autodoc (Portable)\", weight: 18, cost: 3500, energyUse: 6, powerSupplyNotes: \"High draw medical station\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Field medical support unit.\" },\n { name: \"Medkit\", weight: 1, cost: 120, energyUse: 0, powerSupplyNotes: \"None\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Manual emergency treatment supplies.\" },\n { name: \"Bioscanner\", weight: 1, cost: 300, energyUse: 1, powerSupplyNotes: \"Battery or generator\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Vitals and hazard scanning tool.\" },\n { name: \"Survey Scanner\", weight: 2, cost: 500, energyUse: 2, powerSupplyNotes: \"Battery or generator\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Terrain and structure analysis scanner.\" },\n { name: \"Translator Module\", weight: 0.5, cost: 650, energyUse: 1, powerSupplyNotes: \"Battery compatible\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Linguistic conversion and support.\" },\n { name: \"Holo Projector\", weight: 1.5, cost: 800, energyUse: 2, powerSupplyNotes: \"Battery compatible\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Short-range holographic projection.\" },\n { name: \"Stasis Box\", weight: 12, cost: 2600, energyUse: 5, powerSupplyNotes: \"Continuous power required\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Suspended animation container.\" },\n { name: \"Reactionless Flycycle\", weight: 35, cost: 4200, energyUse: 4, powerSupplyNotes: \"Vehicle power core\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Single-rider reactionless vehicle.\" },\n { name: \"Field Toolkit\", weight: 2, cost: 180, energyUse: 0, powerSupplyNotes: \"None\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Mechanical and electronics repair kit.\" },\n { name: \"Vac Suit\", weight: 7, cost: 1400, energyUse: 1, powerSupplyNotes: \"Suit battery required\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Pressure and vacuum survival suit.\" },\n { name: \"Air Reprocessor\", weight: 3, cost: 950, energyUse: 2, powerSupplyNotes: \"Continuous power\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Atmosphere recycling support unit.\" },\n { name: \"Signal Beacon\", weight: 1, cost: 140, energyUse: 1, powerSupplyNotes: \"Battery compatible\", isPowerPack: false, energy: { value: 0, max: 0 }, notes: \"Emergency and navigation beacon.\" }\n];\n\nexport const PURSUIT_CATALOG: PursuitCatalogEntry[] = [\n {\n name: \"Artist\",\n rollRange: \"01-07\",\n wealthValue: 0,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Athletics\", \"Computers\", \"Fast Talk\", \"Fine Arts\", \"Hide\", \"Musicianship\", \"Observe\", \"Perform\", \"Psychology\", \"Scent\", \"Theology\"],\n notes: \"Creative specialist pursuit.\"\n },\n {\n name: \"Colonist\",\n rollRange: \"08-27\",\n wealthValue: 1,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Atmospheric Craft\", \"Bargain\", \"Ground Vehicle\", \"Farming\", \"Handgun, Energy\", \"Personal Flyer\", \"Listen\", \"Heavy Weapon, Energy\", \"Observe\", \"Planetology\", \"Search\", \"Track\"],\n notes: \"Settlement and frontier operations pursuit.\"\n },\n {\n name: \"Criminal\",\n rollRange: \"28-29\",\n wealthValue: 1,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Bargain\", \"Computers\", \"Fast Talk\", \"Hide\", \"Personal Flyer\", \"Handgun, Energy\", \"Handgun, Projectile\", \"Sneak\", \"Unarmed Combat\"],\n notes: \"Underground survival pursuit.\"\n },\n {\n name: \"Dilettante\",\n rollRange: \"30\",\n wealthValue: 5,\n occupationPointsPerYear: 15,\n fixedSkills: [],\n notes: \"Any skills allowed; uses 15 occupation points per year.\"\n },\n {\n name: \"Engineer\",\n rollRange: \"31-36\",\n wealthValue: 2,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Astronomy\", \"Chemistry\", \"Computers\", \"Engineering\", \"Ground Vehicle\", \"Mathematics\", \"Personal Flyer\", \"Physics\", \"Planetology\", \"Reaction Drive\", \"Reactionless Drive\", \"Repair\"],\n notes: \"Technical design and maintenance pursuit.\"\n },\n {\n name: \"Entertainer\",\n rollRange: \"37-38\",\n wealthValue: 2,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Athletics\", \"Bargain\", \"Own Language\", \"Musicianship\", \"Observe\", \"Orate\", \"Perform\", \"Psychology\", \"Search\", \"Sneak\"],\n notes: \"Performance and social influence pursuit.\"\n },\n {\n name: \"Explorer\",\n rollRange: \"39-52\",\n wealthValue: 1,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Athletics\", \"Atmospheric Craft\", \"Bargain\", \"Biology\", \"Botany\", \"Emergency Treatment\", \"Engineering\", \"Ground Vehicle\", \"Handgun, Energy\", \"Heavy Weapon, Energy\", \"Hyperdrive\", \"Observe\", \"Planetology\", \"Reactionless Drive\", \"Repair\", \"Search\", \"Track\", \"Zoology\"],\n notes: \"Survey and expedition pursuit.\"\n },\n {\n name: \"Functionary\",\n rollRange: \"53-56\",\n wealthValue: 3,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Bargain\", \"Debate\", \"Fast Talk\", \"History\", \"Law\", \"Observe\", \"Orate\", \"Psychology\", \"Strategy\", \"Theology\"],\n notes: \"Administrative and governance pursuit.\"\n },\n {\n name: \"Journalist/Writer\",\n rollRange: \"57-59\",\n wealthValue: 1,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Anthropology\", \"Bargain\", \"Computers\", \"Debate\", \"History\", \"Fine Arts\", \"Own Language\", \"Law\", \"Observe\", \"Psychology\", \"Search\", \"Sneak\", \"Unarmed Combat\", \"Weapons System\"],\n notes: \"Investigation and reporting pursuit.\"\n },\n {\n name: \"Miner\",\n rollRange: \"60-65\",\n wealthValue: 1,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Atmospheric Craft\", \"Aquatic Vehicle\", \"Bargain\", \"Climb (Custom)\", \"Computers\", \"Emergency Treatment\", \"Engineering\", \"Handgun, Energy\", \"Heavy Weapon, Energy\", \"Observe\", \"Personal Flyer\", \"Planetology\", \"Reaction Drive\", \"Reactionless Drive\", \"Repair\", \"Search\"],\n notes: \"Resource extraction frontier pursuit.\"\n },\n {\n name: \"Pilot\",\n rollRange: \"66-68\",\n wealthValue: 3,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Astronomy\", \"Atmospheric Craft\", \"Computers\", \"Engineering\", \"Hyperdrive\", \"History\", \"Law\", \"Mathematics\", \"Physics\", \"Reaction Drive\", \"Reactionless Drive\", \"Repair\", \"Strategy\", \"Weapons System\"],\n notes: \"Flight and spacecraft operations pursuit.\"\n },\n {\n name: \"Police Officer\",\n rollRange: \"69-76\",\n wealthValue: 1,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Atmospheric Craft\", \"Bargain\", \"Computers\", \"Fast Talk\", \"Emergency Treatment\", \"Handgun, Energy\", \"Handgun, Projectile\", \"Heavy Weapon, Energy\", \"Heavy Weapon, Projectile\", \"Law\", \"Observe\", \"Personal Flyer\", \"Psychology\", \"Search\", \"Unarmed Combat\"],\n notes: \"Law enforcement and response pursuit.\"\n },\n {\n name: \"Politician\",\n rollRange: \"77-78\",\n wealthValue: 3,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Bargain\", \"Computers\", \"Debate\", \"Fast Talk\", \"History\", \"Orate\", \"Own Language\", \"Perform\", \"Psychology\"],\n optionalSkillGroups: [\n {\n choose: 1,\n skills: [\"Engineering\", \"Farming\", \"Second Languages\", \"Strategy\", \"Theology\"]\n }\n ],\n notes: \"Public office and influence pursuit.\"\n },\n {\n name: \"Prisoner\",\n rollRange: \"79-80\",\n wealthValue: 0,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Bargain\", \"Fast Talk\", \"Hide\", \"Observe\", \"Psychology\", \"Search\", \"Sneak\", \"Unarmed Combat\"],\n notes: \"Carceral survival pursuit.\"\n },\n {\n name: \"Scholar\",\n rollRange: \"81-84\",\n wealthValue: 1,\n occupationPointsPerYear: 20,\n fixedSkills: [],\n optionalSkillGroups: [\n {\n choose: 2,\n skills: [\"Anthropology\", \"Astronomy\", \"Biology\", \"Botany\", \"Chemistry\", \"Computers\", \"Engineering\", \"Fine Arts\", \"History\", \"Law\", \"Mathematics\", \"Own Language\", \"Physics\", \"Planetology\", \"Second Languages\", \"Theology\", \"Zoology\"]\n }\n ],\n notes: \"Academic pursuit; pick up to two listed skills.\"\n },\n {\n name: \"Scientific Researcher\",\n rollRange: \"85-94\",\n wealthValue: 1,\n occupationPointsPerYear: 20,\n fixedSkills: [],\n optionalSkillGroups: [\n {\n choose: 3,\n skills: [\"Anthropology\", \"Astronomy\", \"Bargain\", \"Biology\", \"Botany\", \"Chemistry\", \"Computers\", \"Engineering\", \"History\", \"Mathematics\", \"Observe\", \"Personal Flyer\", \"Physics\", \"Planetology\", \"Psychology\", \"Repair\", \"Search\", \"Zoology\"]\n }\n ],\n notes: \"Research pursuit; pick up to three listed skills.\"\n },\n {\n name: \"Soldier\",\n rollRange: \"95-98\",\n wealthValue: 1,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Athletics\", \"Atmospheric Craft\", \"Aquatic Vehicle\", \"Computers\", \"Emergency Treatment\", \"Fast Talk\", \"Ground Vehicle\", \"Handgun, Energy\", \"Handgun, Projectile\", \"Heavy Weapon, Energy\", \"Heavy Weapon, Projectile\"],\n notes: \"Military operations pursuit.\"\n },\n {\n name: \"Zealot\",\n rollRange: \"99-00\",\n wealthValue: 0,\n occupationPointsPerYear: 20,\n fixedSkills: [\"Bargain\", \"Debate\", \"Fast Talk\", \"Fine Arts\", \"Handgun, Energy\", \"Handgun, Projectile\", \"Hide\", \"Own Language\", \"Law\", \"Strategy\", \"Orate\", \"Psychology\", \"Theology\"],\n notes: \"Ideological dedication pursuit.\"\n }\n];\n\nexport function speciesCatalogForGeneration(): SpeciesCatalogEntry[] {\n return SPECIES_CATALOG.filter((entry) => entry.playable);\n}\n\nfunction itemKey(type: string, name: string): string {\n return `${type}:${normalizeSkillName(name)}`;\n}\n\nfunction itemTypeAvailable(type: string): boolean {\n const directTypes = (getDocumentClass(\"Item\") as any)?.TYPES;\n if (Array.isArray(directTypes)) return directTypes.includes(type);\n\n const docTypes = (game as any)?.system?.documentTypes?.Item;\n if (Array.isArray(docTypes)) return docTypes.includes(type);\n if (docTypes && typeof docTypes === \"object\") return Object.prototype.hasOwnProperty.call(docTypes, type);\n\n const configModels = (CONFIG as any)?.Item?.dataModels;\n if (configModels && typeof configModels === \"object\" && Object.prototype.hasOwnProperty.call(configModels, type)) {\n return true;\n }\n\n const gameModels = (game as any)?.model?.Item;\n if (gameModels && typeof gameModels === \"object\" && Object.prototype.hasOwnProperty.call(gameModels, type)) {\n return true;\n }\n\n return false;\n}\n\nfunction toSkillItem(entry: (typeof RINGWORLD_BASE_SKILLS)[number]): CatalogSeed {\n return {\n key: itemKey(\"skill\", entry.name),\n folderKey: \"skills\",\n img: skillIconPath(entry.name) || ICONS.skillDefault,\n data: {\n name: entry.name,\n type: \"skill\",\n system: {\n value: entry.base,\n category: entry.category,\n specialization: entry.specialization ?? \"\"\n }\n }\n };\n}\n\nfunction toSpeciesItem(entry: SpeciesCatalogEntry): CatalogSeed {\n const img = speciesIconPath(entry.name) || ICONS.speciesDefault;\n return {\n key: itemKey(\"species\", entry.name),\n folderKey: \"species\",\n img,\n data: {\n name: entry.name,\n type: \"species\",\n system: {\n playable: entry.playable,\n gravity: entry.gravity,\n homeworld: entry.homeworld,\n modifiers: entry.modifiers,\n notes: entry.notes\n }\n }\n };\n}\n\nfunction toWeaponItem(entry: WeaponCatalogEntry): CatalogSeed {\n const folderKey = entry.attackType === \"melee\" ? \"weaponMelee\" : \"weaponRanged\";\n const img = weaponIconPath(entry.name) || (entry.attackType === \"melee\" ? ICONS.weaponMelee : ICONS.weaponRanged);\n return {\n key: itemKey(\"weapon\", entry.name),\n folderKey,\n img,\n data: {\n name: entry.name,\n type: \"weapon\",\n system: {\n equipped: entry.equipped ?? true,\n stowed: false,\n weight: entry.weight ?? 0,\n linkedSkill: entry.linkedSkill,\n linkedSkillId: \"\",\n attackType: entry.attackType,\n damageFormula: entry.damageFormula,\n range: entry.range,\n energyUsedPerAttack: entry.energyUsedPerAttack,\n ammoUsedPerAttack: entry.ammoUsedPerAttack,\n powerSource: entry.powerSource,\n powerPackId: \"\",\n notes: entry.notes\n }\n }\n };\n}\n\nfunction toArmorItem(entry: ArmorCatalogEntry): CatalogSeed {\n const img = armorIconPath(entry.name) || ICONS.armor;\n return {\n key: itemKey(\"armor\", entry.name),\n folderKey: \"armor\",\n img,\n data: {\n name: entry.name,\n type: \"armor\",\n system: {\n equipped: entry.equipped,\n stowed: false,\n weight: entry.weight ?? 0,\n value: entry.value,\n coverage: entry.coverage,\n perLocation: {\n rLeg: 0,\n lLeg: 0,\n abdomen: 0,\n chest: 0,\n rArm: 0,\n lArm: 0,\n head: 0\n },\n notes: entry.notes\n }\n }\n };\n}\n\nfunction toGearItem(entry: GearCatalogEntry): CatalogSeed {\n const img = gearIconPath(entry.name) || (entry.isPowerPack ? ICONS.powerPackDefault : ICONS.gearDefault);\n return {\n key: itemKey(\"gear\", entry.name),\n folderKey: \"gear\",\n img,\n data: {\n name: entry.name,\n type: \"gear\",\n system: {\n equipped: entry.equipped ?? true,\n stowed: false,\n weight: entry.weight,\n cost: entry.cost,\n energyUse: entry.energyUse,\n powerSupplyNotes: entry.powerSupplyNotes,\n isPowerPack: entry.isPowerPack,\n energy: entry.energy,\n notes: entry.notes\n }\n }\n };\n}\n\nfunction toPursuitItem(entry: PursuitCatalogEntry): CatalogSeed {\n const img = pursuitIconPath(entry.name) || ICONS.pursuitDefault;\n return {\n key: itemKey(\"pursuit\", entry.name),\n folderKey: \"pursuits\",\n img,\n data: {\n name: entry.name,\n type: \"pursuit\",\n system: {\n wealthValue: entry.wealthValue,\n occupationPointsPerYear: entry.occupationPointsPerYear,\n rollRange: entry.rollRange,\n fixedSkills: entry.fixedSkills,\n optionalSkillGroups: entry.optionalSkillGroups ?? [],\n notes: entry.notes\n }\n }\n };\n}\n\nfunction pursuitAsGearNotes(entry: PursuitCatalogEntry): string {\n const fixed = entry.fixedSkills.length ? `Fixed skills: ${entry.fixedSkills.join(\", \")}` : \"Fixed skills: (none)\";\n const optional = (entry.optionalSkillGroups ?? []).map((group) => `Choose ${group.choose}: ${group.skills.join(\", \")}`).join(\" | \");\n const optionalText = optional ? ` Optional: ${optional}.` : \"\";\n return `${entry.notes} ${fixed}.${optionalText} Wealth ${entry.wealthValue}. Occupation points/year ${entry.occupationPointsPerYear}.`;\n}\n\nfunction toPursuitFallbackGearItem(entry: PursuitCatalogEntry): CatalogSeed {\n const img = pursuitIconPath(entry.name) || ICONS.pursuitDefault;\n const itemName = `Pursuit: ${entry.name}`;\n return {\n key: itemKey(\"gear\", itemName),\n folderKey: \"pursuits\",\n img,\n data: {\n name: itemName,\n type: \"gear\",\n system: {\n equipped: false,\n stowed: true,\n weight: 0,\n cost: 0,\n energyUse: 0,\n powerSupplyNotes: \"Pursuit reference\",\n isPowerPack: false,\n energy: { value: 0, max: 0 },\n notes: pursuitAsGearNotes(entry)\n },\n flags: {\n ringworld: {\n pursuitData: {\n pursuitName: entry.name,\n rollRange: entry.rollRange,\n wealthValue: entry.wealthValue,\n occupationPointsPerYear: entry.occupationPointsPerYear,\n fixedSkills: entry.fixedSkills,\n optionalSkillGroups: entry.optionalSkillGroups ?? []\n }\n }\n }\n }\n };\n}\n\nasync function getOrCreateItemFolder(name: string, parentId: string | null): Promise {\n const existing = game.folders.find(\n (folder: any) => folder.type === \"Item\" && folder.name === name && (folder.folder?.id ?? null) === parentId\n );\n if (existing) return existing;\n\n return Folder.create({\n name,\n type: \"Item\",\n folder: parentId,\n sorting: \"a\"\n });\n}\n\nasync function ensureCatalogFolders(): Promise> {\n const root = await getOrCreateItemFolder(\"Ringworld Catalog\", null);\n const species = await getOrCreateItemFolder(\"Species\", root.id);\n const skills = await getOrCreateItemFolder(\"Skills\", root.id);\n const pursuits = await getOrCreateItemFolder(\"Pursuits\", root.id);\n const gear = await getOrCreateItemFolder(\"Gear\", root.id);\n const armor = await getOrCreateItemFolder(\"Armor\", gear.id);\n const weapons = await getOrCreateItemFolder(\"Weapons\", root.id);\n const weaponMelee = await getOrCreateItemFolder(\"Melee Weapons\", weapons.id);\n const weaponRanged = await getOrCreateItemFolder(\"Ranged Weapons\", weapons.id);\n\n return {\n species: species.id,\n skills: skills.id,\n pursuits: pursuits.id,\n gear: gear.id,\n armor: armor.id,\n weaponMelee: weaponMelee.id,\n weaponRanged: weaponRanged.id\n };\n}\n\nfunction buildAllSeeds(): CatalogSeed[] {\n const canUsePursuitType = itemTypeAvailable(\"pursuit\");\n return [\n ...SPECIES_CATALOG.map(toSpeciesItem),\n ...RINGWORLD_BASE_SKILLS.map(toSkillItem),\n ...(canUsePursuitType ? PURSUIT_CATALOG.map(toPursuitItem) : PURSUIT_CATALOG.map(toPursuitFallbackGearItem)),\n ...WEAPON_CATALOG.map(toWeaponItem),\n ...ARMOR_CATALOG.map(toArmorItem),\n ...GEAR_CATALOG.map(toGearItem)\n ];\n}\n\nexport async function seedWorldCatalog(options?: { notify?: boolean }): Promise<{ added: number; updated: number }> {\n if (!game.user?.isGM) return { added: 0, updated: 0 };\n\n const folderIds = await ensureCatalogFolders();\n const seeds = buildAllSeeds();\n\n const existing = new Map(\n game.items.map((item: any) => [itemKey(item.type, item.name), item])\n );\n\n const createPayload: any[] = [];\n const updatePayload: any[] = [];\n\n for (const seed of seeds) {\n const folderId = folderIds[seed.folderKey];\n const existingItem = existing.get(seed.key);\n\n if (!existingItem) {\n createPayload.push({\n ...seed.data,\n img: seed.img,\n folder: folderId,\n flags: {\n ringworld: {\n catalog: true,\n catalogKey: seed.key\n }\n }\n });\n continue;\n }\n\n const update: Record = { _id: existingItem.id };\n\n if ((existingItem.folder?.id ?? null) !== folderId) {\n update.folder = folderId;\n }\n\n if (String(existingItem.img || \"\") !== seed.img) {\n update.img = seed.img;\n }\n\n if (existingItem.flags?.ringworld?.catalog !== true) {\n update[\"flags.ringworld.catalog\"] = true;\n }\n\n if (existingItem.flags?.ringworld?.catalogKey !== seed.key) {\n update[\"flags.ringworld.catalogKey\"] = seed.key;\n }\n\n const existingSystem = foundry.utils.deepClone(existingItem.system ?? {});\n const mergedSystem = foundry.utils.mergeObject(existingSystem, seed.data.system ?? {}, {\n inplace: false,\n insertKeys: true,\n insertValues: true,\n overwrite: false\n });\n const systemDiff = foundry.utils.diffObject(existingSystem, mergedSystem);\n if (Object.keys(systemDiff).length > 0) {\n update.system = mergedSystem;\n }\n\n if (Object.keys(update).length > 1) {\n updatePayload.push(update);\n }\n }\n\n if (createPayload.length) {\n await Item.createDocuments(createPayload as any[]);\n }\n\n if (updatePayload.length) {\n await Item.updateDocuments(updatePayload as any[]);\n }\n\n const addedReference = await seedGmReference();\n\n if (options?.notify) {\n const referenceNote = addedReference ? \" GM Reference journal added.\" : \"\";\n ui.notifications?.info(`Ringworld catalog synced: +${createPayload.length} new, ${updatePayload.length} updated.${referenceNote}`);\n }\n\n return { added: createPayload.length, updated: updatePayload.length };\n}\n\nexport function getPlayableSpeciesFromWorld(): any[] {\n return game.items.filter((item: any) => item.type === \"species\" && item.system.playable);\n}\n\nexport function ringworldSystemSettingKey(key: string): string {\n return `${SYSTEM_ID}.${key}`;\n}\n","import { speciesCatalogForGeneration, getPlayableSpeciesFromWorld } from \"./world-catalog\";\nimport { evaluateRollWithDice } from \"./utils/dice\";\n\ntype GravityType = \"light\" | \"normal\" | \"heavy\";\n\ninterface CharacteristicSet {\n str: number;\n mas: number;\n con: number;\n int: number;\n pow: number;\n dex: number;\n app: number;\n edu: number;\n age: number;\n}\n\nfunction clampScore(value: number): number {\n return Math.max(1, Math.min(99, Math.floor(value)));\n}\n\nasync function rollTotal(formula: string): Promise {\n const roll = await evaluateRollWithDice(formula);\n return Number(roll.total ?? 0);\n}\n\nasync function rollEdu(): Promise {\n let edu = 10;\n while (true) {\n const die = await rollTotal(\"1d6\");\n edu += die;\n if (die <= 4) break;\n }\n return clampScore(edu);\n}\n\nasync function rollByGravity(gravity: GravityType): Promise {\n const gravityFormulas = {\n light: { str: \"2d6+3\", mas: \"2d6+3\", con: \"2d6+6\", dex: \"2d6+9\" },\n normal: { str: \"2d6+6\", mas: \"2d6+6\", con: \"2d6+6\", dex: \"2d6+6\" },\n heavy: { str: \"2d6+9\", mas: \"2d6+9\", con: \"2d6+3\", dex: \"2d6+6\" }\n }[gravity];\n\n return {\n str: await rollTotal(gravityFormulas.str),\n mas: await rollTotal(gravityFormulas.mas),\n con: await rollTotal(gravityFormulas.con),\n int: await rollTotal(\"2d6+6\"),\n pow: await rollTotal(\"2d6+6\"),\n dex: await rollTotal(gravityFormulas.dex),\n app: await rollTotal(\"2d6+6\"),\n edu: await rollEdu(),\n age: await rollTotal(\"1d20+16\")\n };\n}\n\nfunction randomPick(arr: T[]): T {\n return arr[Math.floor(Math.random() * arr.length)];\n}\n\nfunction randomExplorerName(speciesName: string): string {\n const starts = [\"Ar\", \"Bel\", \"Cor\", \"Den\", \"Ela\", \"Far\", \"Gal\", \"Hel\", \"Ira\", \"Jun\", \"Kor\", \"Lys\", \"Mor\", \"Nyr\", \"Or\", \"Pra\", \"Qua\", \"Rin\", \"Sol\", \"Tor\", \"Uri\", \"Val\", \"Wen\", \"Xel\", \"Yor\", \"Zen\"];\n const ends = [\"an\", \"el\", \"is\", \"or\", \"us\", \"a\", \"en\", \"ion\", \"eth\", \"al\", \"ir\", \"os\"];\n return `${randomPick(starts)}${randomPick(ends)} (${speciesName})`;\n}\n\nfunction applySpeciesModifiers(base: CharacteristicSet, speciesSystem: any): CharacteristicSet {\n const mods = speciesSystem?.modifiers ?? {};\n return {\n str: clampScore(base.str + Number(mods.str || 0)),\n mas: clampScore(base.mas + Number(mods.mas || 0)),\n con: clampScore(base.con + Number(mods.con || 0)),\n int: clampScore(base.int + Number(mods.int || 0)),\n pow: clampScore(base.pow + Number(mods.pow || 0)),\n dex: clampScore(base.dex + Number(mods.dex || 0)),\n app: clampScore(base.app + Number(mods.app || 0)),\n edu: clampScore(base.edu + Number(mods.edu || 0)),\n age: clampScore(base.age + Number(mods.age || 0))\n };\n}\n\nexport async function rollCharacteristicsForActor(actor: any): Promise {\n const gravity = String(actor.system?.profile?.gravity || \"normal\") as GravityType;\n const gravityType: GravityType = gravity === \"light\" || gravity === \"heavy\" ? gravity : \"normal\";\n\n const currentSpeciesName = String(actor.system?.profile?.species || \"\");\n const worldSpecies = getPlayableSpeciesFromWorld();\n const speciesItem = worldSpecies.find((item: any) => item.name === currentSpeciesName);\n const builtIn = speciesCatalogForGeneration().find((entry) => entry.name === currentSpeciesName);\n const speciesSystem = speciesItem?.system ?? builtIn ?? null;\n\n const rolled = await rollByGravity(gravityType);\n const finalValues = applySpeciesModifiers(rolled, speciesSystem);\n\n await actor.update({\n \"system.characteristics.str\": finalValues.str,\n \"system.characteristics.mas\": finalValues.mas,\n \"system.characteristics.con\": finalValues.con,\n \"system.characteristics.int\": finalValues.int,\n \"system.characteristics.pow\": finalValues.pow,\n \"system.characteristics.dex\": finalValues.dex,\n \"system.characteristics.app\": finalValues.app,\n \"system.characteristics.edu\": finalValues.edu,\n \"system.characteristics.age\": finalValues.age,\n \"system.profile.chronologicalAge\": finalValues.age,\n \"system.profile.physiologicalAge\": finalValues.age\n });\n\n const ownLanguage = actor.items.find((item: any) => item.type === \"skill\" && item.name.toLowerCase() === \"own language\");\n if (ownLanguage) {\n await actor.updateEmbeddedDocuments(\"Item\", [{\n _id: ownLanguage.id,\n \"system.value\": Math.min(99, finalValues.int * 5)\n }]);\n }\n}\n\nexport async function applyStarterKit(actor: any): Promise {\n const starterNames = [\n [\"weapon\", \"Laser Pistol\"],\n [\"weapon\", \"Variable Sword\"],\n [\"armor\", \"Soft Combat Vest\"],\n [\"gear\", \"Power Pack R20\"],\n [\"gear\", \"Medkit\"],\n [\"gear\", \"Survey Scanner\"]\n ];\n\n const worldItems = game.items;\n const actorExisting = new Set(actor.items.map((item: any) => `${item.type}:${item.name.toLowerCase()}`));\n const createPayload: any[] = [];\n\n for (const [type, name] of starterNames) {\n if (actorExisting.has(`${type}:${String(name).toLowerCase()}`)) continue;\n const worldItem = worldItems.find((item: any) => item.type === type && item.name === name);\n if (!worldItem) continue;\n createPayload.push(worldItem.toObject());\n }\n\n if (createPayload.length) {\n await actor.createEmbeddedDocuments(\"Item\", createPayload);\n }\n}\n\nexport async function randomizeExplorerActor(actor: any): Promise {\n const worldSpecies = getPlayableSpeciesFromWorld();\n const builtInSpecies = speciesCatalogForGeneration();\n\n const pickedWorldSpecies = worldSpecies.length ? randomPick(worldSpecies) : null;\n const pickedBuiltInSpecies = !pickedWorldSpecies ? randomPick(builtInSpecies) : null;\n\n const speciesChoice = pickedWorldSpecies?.system ?? pickedBuiltInSpecies;\n const speciesName = pickedWorldSpecies?.name ?? pickedBuiltInSpecies?.name ?? \"Human\";\n\n const gravity = String(speciesChoice.gravity || \"normal\") as GravityType;\n const homeworld = String(speciesChoice.homeworld || \"Ringworld\");\n\n await actor.update({\n name: randomExplorerName(speciesName),\n \"system.profile.species\": speciesName,\n \"system.profile.gravity\": gravity,\n \"system.profile.homeworld\": homeworld\n });\n\n await rollCharacteristicsForActor(actor);\n await actor.ensureBaseSkills?.();\n await applyStarterKit(actor);\n}\n\nexport async function createRandomExplorer(): Promise {\n const ActorClass = getDocumentClass(\"Actor\");\n const actor = await ActorClass.create({\n name: \"Random Explorer\",\n type: \"explorer\"\n });\n\n await randomizeExplorerActor(actor);\n return actor;\n}\n","import { recomputeHitPointMaximums, reloadWeapon, rollSkillForActor, rollStandaloneHitLocation, useWeaponWorkflow } from \"../mechanics\";\nimport { normalizeSkillName, RINGWORLD_BASE_SKILLS } from \"../data-base-skills\";\nimport { randomizeExplorerActor, rollCharacteristicsForActor } from \"../character-tools\";\nimport { skillIconPath } from \"../skill-icons\";\n\ntype DerivedCheckKey = \"health\" | \"reasoning\" | \"luck\" | \"dodge\";\ntype SpeciesModifierKey = \"str\" | \"mas\" | \"con\" | \"int\" | \"pow\" | \"dex\" | \"app\" | \"edu\" | \"age\";\nconst SPECIES_MODIFIER_KEYS: SpeciesModifierKey[] = [\"str\", \"mas\", \"con\", \"int\", \"pow\", \"dex\", \"app\", \"edu\", \"age\"];\n\nfunction num(value: unknown, fallback = 0): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nfunction clampCharacteristic(value: number): number {\n return Math.max(1, Math.min(99, Math.floor(value)));\n}\n\nfunction computeDamageMod(str: number, mas: number): string {\n const total = str + mas;\n if (total <= 12) return \"-1d6\";\n if (total <= 24) return \"-1d4\";\n if (total <= 32) return \"0\";\n if (total <= 40) return \"+1d4\";\n if (total <= 56) return \"+1d6\";\n if (total <= 72) return \"+2d6\";\n return \"+3d6\";\n}\n\nfunction computeDerivedRolls(characteristics: any): Record {\n const con = num(characteristics?.con, 10);\n const int = num(characteristics?.int, 10);\n const pow = num(characteristics?.pow, 10);\n const dex = num(characteristics?.dex, 10);\n\n return {\n health: Math.max(0, Math.min(99, con * 5)),\n reasoning: Math.max(0, Math.min(99, int * 5)),\n luck: Math.max(0, Math.min(99, pow * 5)),\n dodge: Math.max(0, Math.min(99, dex * 5))\n };\n}\n\nfunction computeRootMaxes(characteristics: any): Record {\n const str = num(characteristics?.str, 10);\n const dex = num(characteristics?.dex, 10);\n const app = num(characteristics?.app, 10);\n const edu = num(characteristics?.edu, 10);\n const int = num(characteristics?.int, 10);\n const pow = num(characteristics?.pow, 10);\n const con = num(characteristics?.con, 10);\n\n return {\n agility: Math.max(0, str + dex),\n communication: Math.max(0, int + app),\n knowledge: Math.max(0, int + edu),\n perception: Math.max(0, pow + con),\n technical: Math.max(0, dex + int)\n };\n}\n\nfunction computeActionRanking(dex: number): number {\n if (dex <= 4) return 7;\n if (dex <= 8) return 6;\n if (dex <= 12) return 5;\n if (dex <= 16) return 4;\n if (dex <= 20) return 3;\n if (dex <= 24) return 2;\n return 1;\n}\n\nfunction gravityLoadMultiplier(gravity: string): number {\n if (gravity === \"light\") return 0.5;\n if (gravity === \"heavy\") return 2;\n return 1;\n}\n\nfunction contributesToEncumbrance(item: any): boolean {\n if (item.type !== \"weapon\" && item.type !== \"armor\" && item.type !== \"gear\") return false;\n return item.system?.stowed !== true;\n}\n\nfunction itemWeightKg(item: any): number {\n return Math.max(0, num(item.system?.weight, 0));\n}\n\nfunction computeEncumbrance(system: any, items: any[]): {\n rawLoadKg: number;\n effectiveLoadKg: number;\n limitKg: number;\n overLimitKg: number;\n actionRankingPenalty: number;\n overLimit: boolean;\n currentMove: number;\n currentRun: number;\n gravityMultiplier: number;\n} {\n const gravity = String(system?.profile?.gravity || \"normal\");\n const gravityMultiplier = gravityLoadMultiplier(gravity);\n const equippedLoadKg = items\n .filter((item) => item.type === \"weapon\" || item.type === \"armor\" || item.type === \"gear\")\n .filter(contributesToEncumbrance)\n .reduce((sum, item) => sum + itemWeightKg(item), 0);\n\n const rawLoadKg = Math.max(0, equippedLoadKg);\n const effectiveLoadKg = rawLoadKg * gravityMultiplier;\n const limitKg = Math.max(0, num(system?.characteristics?.str, 0));\n const overLimitKg = Math.max(0, effectiveLoadKg - limitKg);\n const actionRankingPenalty = overLimitKg > 0 ? Math.ceil(overLimitKg / 10) : 0;\n const overLimit = overLimitKg > 0;\n\n const baseMove = Math.max(1, num(system?.derived?.move, 3));\n const baseRun = Math.max(1, num(system?.derived?.run, baseMove * 2));\n const currentMove = overLimit ? 2 : baseMove;\n const currentRun = overLimit ? 4 : baseRun;\n\n return {\n rawLoadKg,\n effectiveLoadKg,\n limitKg,\n overLimitKg,\n actionRankingPenalty,\n overLimit,\n currentMove,\n currentRun,\n gravityMultiplier\n };\n}\n\nexport class RingworldActor extends Actor {\n prepareDerivedData(): void {\n super.prepareDerivedData();\n recomputeHitPointMaximums(this as any);\n\n if (this.type !== \"explorer\" && this.type !== \"creature\") return;\n\n const system = (this as any).system ?? {};\n const characteristics = system.characteristics ?? {};\n const profile = system.profile ?? {};\n\n profile.chronologicalAge = num(profile.chronologicalAge, num(characteristics.age, 25));\n profile.physiologicalAge = num(profile.physiologicalAge, profile.chronologicalAge);\n system.profile = profile;\n\n // Damage mod and derived rolls are always recomputed from characteristics so\n // they can never go stale after a characteristic edit.\n system.combat = system.combat ?? {};\n system.combat.damageMod = computeDamageMod(num(characteristics.str, 10), num(characteristics.mas, 10));\n\n system.derivedRolls = system.derivedRolls ?? {};\n const derivedRollDefaults = computeDerivedRolls(characteristics);\n for (const key of Object.keys(derivedRollDefaults) as DerivedCheckKey[]) {\n system.derivedRolls[key] = derivedRollDefaults[key];\n }\n\n system.skillRootMax = system.skillRootMax ?? {};\n const rootMaxDefaults = computeRootMaxes(characteristics);\n for (const [key, value] of Object.entries(rootMaxDefaults)) {\n system.skillRootMax[key] = value;\n }\n\n system.derived = system.derived ?? {};\n system.derived.actionRanking = computeActionRanking(num(characteristics.dex, 10));\n system.derived.move = num(system.derived.move, 3);\n system.derived.run = num(system.derived.run, Math.max(1, num(system.derived.move, 3) * 2));\n\n system.encumbrance = system.encumbrance ?? {};\n const encumbrance = computeEncumbrance(system, this.items as any[]);\n system.encumbrance.rawLoadKg = encumbrance.rawLoadKg;\n system.encumbrance.effectiveLoadKg = encumbrance.effectiveLoadKg;\n system.encumbrance.limitKg = encumbrance.limitKg;\n system.encumbrance.overLimitKg = encumbrance.overLimitKg;\n system.encumbrance.actionRankingPenalty = encumbrance.actionRankingPenalty;\n system.encumbrance.overLimit = encumbrance.overLimit;\n system.encumbrance.gravityMultiplier = encumbrance.gravityMultiplier;\n system.derived.currentMove = encumbrance.currentMove;\n system.derived.currentRun = encumbrance.currentRun;\n\n system.finance = system.finance ?? { money: 0, inBank: 0 };\n system.finance.money = num(system.finance.money, 0);\n system.finance.inBank = num(system.finance.inBank, 0);\n\n system.notes = system.notes ?? { defects: \"\", habits: \"\" };\n if (typeof system.sheetToolsUnlocked !== \"boolean\") {\n system.sheetToolsUnlocked = false;\n }\n system.characterBuilder = system.characterBuilder ?? {\n pursuits: [],\n allocations: {},\n baseBySkillId: {}\n };\n system.unconsciousLevel = num(system.unconsciousLevel, 0);\n }\n\n get skills(): any[] {\n return this.items.filter((item) => item.type === \"skill\");\n }\n\n get weapons(): any[] {\n return this.items.filter((item) => item.type === \"weapon\");\n }\n\n get armors(): any[] {\n return this.items.filter((item) => item.type === \"armor\");\n }\n\n get gears(): any[] {\n return this.items.filter((item) => item.type === \"gear\");\n }\n\n async rollSkillById(skillId: string): Promise {\n const skill = this.items.get(skillId);\n if (!skill || skill.type !== \"skill\") return;\n await rollSkillForActor(this, skill.name, Number((skill as any).system.value ?? 0));\n }\n\n async rollHitLocation(): Promise {\n await rollStandaloneHitLocation(this);\n }\n\n async useWeaponById(weaponId: string): Promise {\n const weapon = this.items.get(weaponId);\n if (!weapon || weapon.type !== \"weapon\") return;\n await useWeaponWorkflow(this, weapon);\n }\n\n async reloadWeaponById(weaponId: string): Promise {\n const weapon = this.items.get(weaponId);\n if (!weapon || weapon.type !== \"weapon\") return;\n await reloadWeapon(this, weapon);\n }\n\n async ensureBaseSkills(): Promise {\n if (this.type !== \"explorer\" && this.type !== \"creature\") return 0;\n\n const existing = new Set(\n this.items\n .filter((item) => item.type === \"skill\")\n .map((item) => normalizeSkillName(item.name))\n );\n\n const toCreate = RINGWORLD_BASE_SKILLS\n .filter((skill) => !existing.has(normalizeSkillName(skill.name)))\n .map((skill) => ({\n name: skill.name,\n type: \"skill\",\n img: skillIconPath(skill.name),\n system: {\n value: skill.base,\n category: skill.category,\n specialization: skill.specialization ?? \"\"\n }\n }));\n\n if (!toCreate.length) return 0;\n await this.createEmbeddedDocuments(\"Item\", toCreate as any[]);\n return toCreate.length;\n }\n\n async rollCharacteristics(): Promise {\n if (this.type !== \"explorer\") return;\n await rollCharacteristicsForActor(this as any);\n }\n\n async randomizeCharacter(): Promise {\n if (this.type !== \"explorer\") return;\n await randomizeExplorerActor(this as any);\n }\n\n async applySpeciesItem(speciesData: any): Promise {\n if (this.type !== \"explorer\" && this.type !== \"creature\") return;\n\n const speciesName = String(speciesData?.name || \"\").trim();\n const speciesSystem = speciesData?.system ?? {};\n const incomingMods = speciesSystem?.modifiers ?? {};\n const appliedState = (this as any).system?.speciesApplied ?? {};\n const previousMods = appliedState?.modifiers ?? {};\n\n const currentCharacteristics = (this as any).system?.characteristics ?? {};\n const currentProfile = (this as any).system?.profile ?? {};\n const update: Record = {};\n const normalizedMods: Record = {\n str: 0,\n mas: 0,\n con: 0,\n int: 0,\n pow: 0,\n dex: 0,\n app: 0,\n edu: 0,\n age: 0\n };\n\n for (const key of SPECIES_MODIFIER_KEYS) {\n const prev = num(previousMods?.[key], 0);\n const next = num(incomingMods?.[key], 0);\n normalizedMods[key] = next;\n\n const current = num(currentCharacteristics?.[key], key === \"age\" ? 25 : 10);\n const base = current - prev;\n update[`system.characteristics.${key}`] = clampCharacteristic(base + next);\n }\n\n const agePrev = num(previousMods?.age, 0);\n const ageNext = normalizedMods.age;\n const chronoCurrent = num(currentProfile?.chronologicalAge, num(currentCharacteristics?.age, 25));\n const physCurrent = num(currentProfile?.physiologicalAge, chronoCurrent);\n update[\"system.profile.chronologicalAge\"] = clampCharacteristic((chronoCurrent - agePrev) + ageNext);\n update[\"system.profile.physiologicalAge\"] = clampCharacteristic((physCurrent - agePrev) + ageNext);\n\n if (speciesName) update[\"system.profile.species\"] = speciesName;\n if (speciesSystem?.gravity) update[\"system.profile.gravity\"] = String(speciesSystem.gravity);\n if (speciesSystem?.homeworld !== undefined) update[\"system.profile.homeworld\"] = String(speciesSystem.homeworld || \"\");\n\n update[\"system.speciesApplied\"] = {\n name: speciesName,\n modifiers: normalizedMods\n };\n\n await this.update(update);\n }\n\n async rollDerivedCheck(key: DerivedCheckKey): Promise {\n if (this.type !== \"explorer\" && this.type !== \"creature\") return;\n\n const labels: Record = {\n health: \"Health Roll\",\n reasoning: \"Reasoning Roll\",\n luck: \"Luck Roll\",\n dodge: \"Dodge Roll\"\n };\n\n const defaults = computeDerivedRolls((this as any).system?.characteristics ?? {});\n const target = num((this as any).system?.derivedRolls?.[key], defaults[key]);\n await rollSkillForActor(this, labels[key], target);\n }\n}\n","import { rollSkillForActor, useWeaponWorkflow } from \"../mechanics\";\n\nexport class RingworldItem extends Item {\n async rollSkill(): Promise {\n if (this.type !== \"skill\") return;\n\n const actor = this.actor;\n if (!actor) {\n ui.notifications?.warn(\"Skill must be owned by an Actor to roll.\");\n return;\n }\n\n await rollSkillForActor(actor, this.name, Number((this as any).system.value ?? 0));\n }\n\n async useWeapon(): Promise {\n if (this.type !== \"weapon\") return;\n\n const actor = this.actor;\n if (!actor) {\n ui.notifications?.warn(\"Weapon must be owned by an Actor to use.\");\n return;\n }\n\n await useWeaponWorkflow(actor, this);\n }\n}\n","import { type HitLocationSlug } from \"../../constants\";\nimport {\n BASE_SKILL_CATEGORIES,\n baseSkillNameSet,\n normalizeSkillName,\n RINGWORLD_BASE_SKILLS\n} from \"../../data-base-skills\";\nimport { baseSkillByName, DEFAULT_SKILL_ICON, resolveSkillIcon, skillIconPath } from \"../../skill-icons\";\nimport { getActorHitLocationSchema, listHitLocationSchemas } from \"../../hit-location-schemas\";\nimport { PURSUIT_CATALOG } from \"../../world-catalog\";\nimport { outcomeLabel, rollPercentile } from \"../../utils/percentile\";\nimport { postSkillRollCard } from \"../../chat\";\nimport { promptCharacteristicCheck } from \"../../mechanics\";\n\nconst BaseActorSheet = (foundry as any).appv1.sheets.ActorSheet;\n\nconst ROOT_KEY_BY_CATEGORY: Record = {\n Agility: \"agility\",\n Communication: \"communication\",\n Knowledge: \"knowledge\",\n Perception: \"perception\",\n Technical: \"technical\"\n};\n\nconst ROOT_FORMULA_BY_CATEGORY: Record = {\n Agility: \"STR + DEX\",\n Communication: \"INT + APP\",\n Knowledge: \"INT + EDU\",\n Perception: \"POW + CON\",\n Technical: \"DEX + INT\"\n};\n\nconst EXCLUDED_EDUCATION_SKILLS = new Set([\n normalizeSkillName(\"Archaic Melee Weapon\"),\n normalizeSkillName(\"Archaic Ranged Weapons\")\n]);\n\nconst HYPERDRIVE_KEY = normalizeSkillName(\"Hyperdrive\");\n\ninterface BuilderAllocation {\n education: number;\n pursuits: number;\n special: number;\n}\n\ninterface BuilderPursuitSelection {\n name: string;\n years: number;\n}\n\ninterface BuilderState {\n pursuits: BuilderPursuitSelection[];\n allocations: Record;\n baseBySkillId: Record;\n}\n\ninterface BuilderPool {\n total: number;\n spent: number;\n remaining: number;\n}\n\ninterface BuilderSkillMeta {\n allocation: BuilderAllocation;\n totalAllocated: number;\n baseValue: number;\n rootCap: number;\n maxAllocation: number;\n allowsEducation: boolean;\n allowsPursuits: boolean;\n allowsSpecial: boolean;\n}\n\ninterface BuilderContext {\n state: BuilderState;\n education: BuilderPool;\n pursuits: BuilderPool;\n special: BuilderPool;\n pursuitYears: BuilderPool;\n pursuitOptions: string[];\n pursuitAllowedSkills: Set;\n bySkillId: Map;\n}\n\nfunction byName(a: any, b: any): number {\n return a.name.localeCompare(b.name);\n}\n\nfunction num(value: unknown, fallback = 0): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nfunction toInt(value: unknown, fallback = 0): number {\n return Math.max(0, Math.floor(num(value, fallback)));\n}\n\nfunction normalizeAllocation(raw: any): BuilderAllocation {\n return {\n education: toInt(raw?.education, 0),\n pursuits: toInt(raw?.pursuits, 0),\n special: toInt(raw?.special, 0)\n };\n}\n\nfunction normalizePursuitSelection(raw: any): BuilderPursuitSelection | null {\n const name = String(raw?.name || \"\").trim();\n const years = toInt(raw?.years, 0);\n if (!name || years <= 0) return null;\n return { name, years };\n}\n\nfunction normalizeBuilderState(raw: any): BuilderState {\n const pursuits = Array.isArray(raw?.pursuits)\n ? raw.pursuits.map((entry: any) => normalizePursuitSelection(entry)).filter((entry: any) => Boolean(entry))\n : [];\n\n const allocations: Record = {};\n if (raw?.allocations && typeof raw.allocations === \"object\") {\n for (const [skillId, allocation] of Object.entries(raw.allocations)) {\n if (!skillId) continue;\n const normalized = normalizeAllocation(allocation);\n if (normalized.education + normalized.pursuits + normalized.special <= 0) continue;\n allocations[skillId] = normalized;\n }\n }\n\n const baseBySkillId: Record = {};\n if (raw?.baseBySkillId && typeof raw.baseBySkillId === \"object\") {\n for (const [skillId, value] of Object.entries(raw.baseBySkillId)) {\n if (!skillId) continue;\n baseBySkillId[skillId] = Math.max(0, toInt(value, 0));\n }\n }\n\n return {\n pursuits,\n allocations,\n baseBySkillId\n };\n}\n\nfunction isEducationEligible(skillName: string): boolean {\n return !EXCLUDED_EDUCATION_SKILLS.has(normalizeSkillName(skillName));\n}\n\nfunction isSpecialEligible(skillName: string): boolean {\n return normalizeSkillName(skillName) !== HYPERDRIVE_KEY;\n}\n\nfunction buildPursuitAllowedSkillSet(pursuits: BuilderPursuitSelection[]): Set {\n const entriesByName = new Map(\n PURSUIT_CATALOG.map((entry) => [normalizeSkillName(entry.name), entry])\n );\n const allowed = new Set();\n\n for (const pursuit of pursuits) {\n const entry = entriesByName.get(normalizeSkillName(pursuit.name));\n if (!entry) continue;\n\n for (const skillName of entry.fixedSkills || []) {\n allowed.add(normalizeSkillName(skillName));\n }\n\n for (const group of entry.optionalSkillGroups || []) {\n for (const skillName of group.skills || []) {\n allowed.add(normalizeSkillName(skillName));\n }\n }\n }\n\n return allowed;\n}\n\nfunction computeBuilderPools(characteristics: any): {\n educationTotal: number;\n pursuitsTotal: number;\n specialTotal: number;\n pursuitYearsTotal: number;\n} {\n const age = toInt(characteristics?.age, 0);\n const edu = toInt(characteristics?.edu, 0);\n const int = toInt(characteristics?.int, 0);\n\n const educationTotal = Math.max(0, (edu - 10) * 20);\n const pursuitYearsTotal = Math.max(0, age - edu - 6);\n const pursuitsTotal = pursuitYearsTotal * 20;\n const specialTotal = Math.max(0, int * 10);\n\n return {\n educationTotal,\n pursuitsTotal,\n specialTotal,\n pursuitYearsTotal\n };\n}\n\nfunction buildBuilderContext(actor: any, skills: any[]): BuilderContext {\n const pools = computeBuilderPools(actor.system?.characteristics ?? {});\n const state = normalizeBuilderState(actor.system?.characterBuilder ?? {});\n\n const pursuitOptions = PURSUIT_CATALOG.map((entry) => entry.name).sort((a, b) => a.localeCompare(b));\n const pursuitAllowedSkills = buildPursuitAllowedSkillSet(state.pursuits);\n\n const bySkillId = new Map();\n\n let educationSpent = 0;\n let pursuitsSpent = 0;\n let specialSpent = 0;\n\n for (const skill of skills) {\n const allocation = normalizeAllocation(state.allocations[skill.id]);\n const totalAllocated = allocation.education + allocation.pursuits + allocation.special;\n\n const baseFromState = state.baseBySkillId[skill.id];\n const baseFromDefinition = baseSkillByName(skill.name)?.base;\n const inferredBase = Math.max(0, num(skill.system?.value, 0) - totalAllocated);\n const baseValue = Math.max(\n 0,\n Number.isFinite(baseFromState)\n ? baseFromState\n : (baseFromDefinition ?? inferredBase)\n );\n\n const rootKey = ROOT_KEY_BY_CATEGORY[String(skill.system?.category || \"\")] ?? \"\";\n const rootCap = rootKey ? Math.max(0, toInt(actor.system?.skillRootMax?.[rootKey], 0)) : 99;\n const maxAllocation = Math.max(0, rootCap - baseValue);\n\n const normalizedSkillName = normalizeSkillName(skill.name);\n const allowsEducation = isEducationEligible(skill.name);\n const allowsPursuits = pursuitAllowedSkills.has(normalizedSkillName);\n const allowsSpecial = isSpecialEligible(skill.name);\n\n bySkillId.set(skill.id, {\n allocation,\n totalAllocated,\n baseValue,\n rootCap,\n maxAllocation,\n allowsEducation,\n allowsPursuits,\n allowsSpecial\n });\n\n educationSpent += allocation.education;\n pursuitsSpent += allocation.pursuits;\n specialSpent += allocation.special;\n }\n\n const pursuitYearsAllocated = state.pursuits.reduce((sum, row) => sum + row.years, 0);\n\n return {\n state,\n education: {\n total: pools.educationTotal,\n spent: educationSpent,\n remaining: pools.educationTotal - educationSpent\n },\n pursuits: {\n total: pools.pursuitsTotal,\n spent: pursuitsSpent,\n remaining: pools.pursuitsTotal - pursuitsSpent\n },\n special: {\n total: pools.specialTotal,\n spent: specialSpent,\n remaining: pools.specialTotal - specialSpent\n },\n pursuitYears: {\n total: pools.pursuitYearsTotal,\n spent: pursuitYearsAllocated,\n remaining: pools.pursuitYearsTotal - pursuitYearsAllocated\n },\n pursuitOptions,\n pursuitAllowedSkills,\n bySkillId\n };\n}\n\nfunction getItemArmorAtLocation(item: any, slug: string): number {\n if (item.type !== \"armor\" || !item.system?.equipped || item.system?.stowed) return 0;\n if (!item.system?.coverage?.[slug]) return 0;\n\n const specific = num(item.system?.perLocation?.[slug], 0);\n if (specific > 0) return specific;\n return num(item.system?.value, 0);\n}\n\nfunction getTotalArmorAtLocation(actor: any, slug: string): number {\n const base = num(actor.system?.hitLocations?.[slug]?.armor, 0);\n const fromItems = actor.items\n .filter((item: any) => item.type === \"armor\")\n .reduce((sum: number, item: any) => sum + getItemArmorAtLocation(item, slug), 0);\n return base + fromItems;\n}\n\nfunction getPreparedHitLocation(actor: any, slug: string, rollRange: string): any {\n const locationConfig = getActorHitLocationSchema(actor).entries.find((entry) => entry.slug === slug);\n const source = actor.system?.hitLocations?.[slug] ?? {};\n const hp = source.hp ?? {};\n const rawLabel = String(source.label ?? \"\").trim();\n return {\n slug,\n rollRange,\n label: rawLabel || String(locationConfig?.label || slug),\n armor: num(source.armor, 0),\n totalArmor: getTotalArmorAtLocation(actor, slug),\n hp: {\n value: num(hp.value, 0),\n max: num(hp.max, 0)\n }\n };\n}\n\nfunction chooseRandom(items: T[]): T {\n return items[Math.floor(Math.random() * items.length)];\n}\n\nfunction clampPercent(value: number): number {\n return Math.max(0, Math.min(99, Math.floor(value)));\n}\n\nexport class RingworldExplorerSheet extends BaseActorSheet {\n private isToolsUnlocked(): boolean {\n return Boolean((this.actor as any)?.system?.sheetToolsUnlocked);\n }\n\n static get defaultOptions(): any {\n return foundry.utils.mergeObject(super.defaultOptions, {\n classes: [\"ringworld\", \"sheet\", \"actor\", \"explorer\"],\n width: 930,\n height: 1460,\n tabs: [{ navSelector: \".tabs\", contentSelector: \".sheet-body\", initial: \"overview\" }]\n });\n }\n\n get template(): string {\n return \"systems/ringworld/templates/actor/explorer-sheet.hbs\";\n }\n\n async getData(options?: any): Promise {\n const data = await super.getData(options);\n const actor = this.actor as any;\n\n if (game.user?.isGM && actor.isOwner) {\n await actor.ensureBaseSkills?.();\n }\n\n const skills = actor.items.filter((item: any) => item.type === \"skill\").sort(byName);\n const builderContext = buildBuilderContext(actor, skills);\n\n const weapons = actor.items.filter((item: any) => item.type === \"weapon\").sort(byName);\n const armors = actor.items.filter((item: any) => item.type === \"armor\").sort(byName);\n const gear = actor.items.filter((item: any) => item.type === \"gear\").sort(byName);\n const speciesOptions = game.items\n .filter((item: any) => item.type === \"species\" && item.system.playable)\n .map((item: any) => item.name)\n .sort();\n const baseSet = baseSkillNameSet();\n\n const skillByNormalized = new Map();\n for (const skill of skills) {\n const key = normalizeSkillName(skill.name);\n if (!skillByNormalized.has(key)) {\n skillByNormalized.set(key, skill);\n }\n }\n\n const skillRootMax = actor.system.skillRootMax ?? {};\n const skillsByCategory = BASE_SKILL_CATEGORIES.map((category) => {\n const rootKey = ROOT_KEY_BY_CATEGORY[category] ?? category.toLowerCase();\n const rows = RINGWORLD_BASE_SKILLS\n .filter((skill) => skill.category === category)\n .map((skill) => {\n const existing = skillByNormalized.get(normalizeSkillName(skill.name));\n const meta = existing ? builderContext.bySkillId.get(existing.id) : null;\n return {\n name: skill.name,\n base: skill.base,\n category: skill.category,\n specialization: skill.specialization ?? \"\",\n itemId: existing?.id ?? null,\n icon: existing?.img || skillIconPath(skill.name),\n value: existing?.system?.value ?? skill.base,\n missing: !existing,\n allocationTotal: meta?.totalAllocated ?? 0,\n allocation: meta?.allocation ?? { education: 0, pursuits: 0, special: 0 }\n };\n });\n\n return {\n category,\n rootKey,\n rootFormula: ROOT_FORMULA_BY_CATEGORY[category] ?? \"\",\n rootValue: num(skillRootMax[rootKey], 0),\n rows\n };\n });\n\n const customSkills = skills\n .filter((item: any) => !baseSet.has(normalizeSkillName(item.name)))\n .map((item: any) => {\n const meta = builderContext.bySkillId.get(item.id);\n return {\n id: item.id,\n name: item.name,\n system: item.system,\n img: resolveSkillIcon(item.name, item.img || DEFAULT_SKILL_ICON),\n allocationTotal: meta?.totalAllocated ?? 0,\n allocation: meta?.allocation ?? { education: 0, pursuits: 0, special: 0 }\n };\n });\n\n const missingBaseSkillsCount = skillsByCategory.reduce(\n (total, group) => total + group.rows.filter((row) => row.missing).length,\n 0\n );\n\n const schema = getActorHitLocationSchema(actor);\n const rangesFromSchema = new Map(schema.entries.map((entry) => [entry.slug, `${entry.min}-${entry.max}`]));\n const order = schema.entries.map((entry) => entry.slug as HitLocationSlug);\n const hitLocations = order.map((slug) =>\n getPreparedHitLocation(actor, slug, rangesFromSchema.get(slug) ?? \"\")\n );\n\n const bodyLayoutOrder = schema.bodyOrder;\n const bodyLocations = bodyLayoutOrder.map((slug) =>\n getPreparedHitLocation(actor, slug, rangesFromSchema.get(slug) ?? \"\")\n );\n\n const enc = actor.system?.encumbrance ?? {};\n const encRaw = num(enc.rawLoadKg, 0);\n const encEffective = num(enc.effectiveLoadKg, encRaw);\n const encLimit = num(enc.limitKg, num(actor.system?.characteristics?.str, 0));\n const encPenalty = num(enc.actionRankingPenalty, 0);\n const baseActionRanking = num(actor.system?.derived?.actionRanking, 0);\n const effectiveActionRanking = Math.max(1, baseActionRanking + encPenalty);\n const encumbranceSummary = `${encRaw.toFixed(1)}kg on-person | ${encEffective.toFixed(1)}kg effective / ${encLimit.toFixed(1)}kg limit | AR +${encPenalty} (stowed ignored)`;\n const movementSummary = `${num(actor.system?.derived?.currentMove, num(actor.system?.derived?.move, 3))}m / ${num(actor.system?.derived?.currentRun, num(actor.system?.derived?.run, 6))}m`;\n\n return {\n ...data,\n system: actor.system,\n skills,\n skillsByCategory,\n customSkills,\n missingBaseSkillsCount,\n weapons,\n armors,\n gear,\n speciesOptions,\n hitLocations,\n bodyLocations,\n hitLocationSchemaOptions: listHitLocationSchemas(),\n currentHitLocationSchema: String(actor.system.hitLocationSchema || \"auto\"),\n activeHitLocationSchemaId: schema.id,\n activeHitLocationSchemaLabel: schema.label,\n sheetToolsUnlocked: Boolean(actor.system?.sheetToolsUnlocked),\n baseActionRanking,\n effectiveActionRanking,\n encumbranceSummary,\n movementSummary,\n builder: {\n education: builderContext.education,\n pursuits: builderContext.pursuits,\n special: builderContext.special,\n pursuitYears: builderContext.pursuitYears,\n pursuitsList: builderContext.state.pursuits,\n pursuitOptions: builderContext.pursuitOptions\n }\n };\n }\n\n private async updateBuilderState(state: BuilderState): Promise {\n await this.actor.update({\n \"system.characterBuilder\": {\n pursuits: state.pursuits,\n allocations: state.allocations,\n baseBySkillId: state.baseBySkillId\n }\n });\n }\n\n private async syncSkillsFromBuilderState(state: BuilderState): Promise {\n const skills = this.actor.items.filter((item: any) => item.type === \"skill\");\n const updates: any[] = [];\n\n for (const skill of skills) {\n const allocation = normalizeAllocation(state.allocations[skill.id]);\n const total = allocation.education + allocation.pursuits + allocation.special;\n\n const rootKey = ROOT_KEY_BY_CATEGORY[String(skill.system?.category || \"\")] ?? \"\";\n const rootCap = rootKey ? Math.max(0, toInt(this.actor.system?.skillRootMax?.[rootKey], 0)) : 99;\n\n let base = state.baseBySkillId[skill.id];\n if (!Number.isFinite(base)) {\n const fromBase = baseSkillByName(skill.name)?.base;\n base = Math.max(0, fromBase ?? (num(skill.system?.value, 0) - total));\n state.baseBySkillId[skill.id] = base;\n }\n\n const value = Math.max(0, Math.min(99, Math.min(rootCap, base + total)));\n if (num(skill.system?.value, 0) !== value) {\n updates.push({ _id: skill.id, \"system.value\": value });\n }\n }\n\n if (updates.length) {\n await this.actor.updateEmbeddedDocuments(\"Item\", updates);\n }\n }\n\n private async addOrUpdatePursuit(name: string, years: number): Promise {\n if (!this.isToolsUnlocked()) return;\n const trimmed = String(name || \"\").trim();\n const cleanYears = Math.max(0, Math.floor(Number(years) || 0));\n if (!trimmed || cleanYears <= 0) {\n ui.notifications?.warn(\"Choose a pursuit and set years above 0.\");\n return;\n }\n\n const skills = this.actor.items.filter((item: any) => item.type === \"skill\");\n const context = buildBuilderContext(this.actor, skills);\n const nextState = foundry.utils.deepClone(context.state) as BuilderState;\n\n const existingIndex = nextState.pursuits.findIndex((entry) => normalizeSkillName(entry.name) === normalizeSkillName(trimmed));\n if (existingIndex >= 0) {\n nextState.pursuits[existingIndex].years = cleanYears;\n } else {\n nextState.pursuits.push({ name: trimmed, years: cleanYears });\n }\n\n await this.updateBuilderState(nextState);\n }\n\n private async removePursuit(index: number): Promise {\n if (!this.isToolsUnlocked()) return;\n const skills = this.actor.items.filter((item: any) => item.type === \"skill\");\n const context = buildBuilderContext(this.actor, skills);\n const nextState = foundry.utils.deepClone(context.state) as BuilderState;\n if (index < 0 || index >= nextState.pursuits.length) return;\n\n nextState.pursuits.splice(index, 1);\n await this.updateBuilderState(nextState);\n }\n\n private async resetBuilderAllocations(): Promise {\n if (!this.isToolsUnlocked()) return;\n const skills = this.actor.items.filter((item: any) => item.type === \"skill\");\n const context = buildBuilderContext(this.actor, skills);\n const nextState = foundry.utils.deepClone(context.state) as BuilderState;\n\n nextState.allocations = {};\n await this.updateBuilderState(nextState);\n await this.syncSkillsFromBuilderState(nextState);\n }\n\n private async randomizeBuilderAllocations(): Promise {\n if (!this.isToolsUnlocked()) return;\n await (this.actor as any).ensureBaseSkills?.();\n\n const skills = this.actor.items.filter((item: any) => item.type === \"skill\").sort(byName);\n const context = buildBuilderContext(this.actor, skills);\n const nextState = foundry.utils.deepClone(context.state) as BuilderState;\n\n const totalYears = Math.max(0, context.pursuitYears.total);\n const pursuits = PURSUIT_CATALOG.map((entry) => entry.name);\n nextState.pursuits = [];\n\n if (totalYears > 0 && pursuits.length > 0) {\n const desiredCount = Math.min(\n pursuits.length,\n Math.max(1, Math.min(3, Math.floor(totalYears / 2) || 1))\n );\n\n const available = [...pursuits];\n for (let i = 0; i < desiredCount && available.length; i += 1) {\n const idx = Math.floor(Math.random() * available.length);\n nextState.pursuits.push({ name: available[idx], years: 1 });\n available.splice(idx, 1);\n }\n\n let remainingYears = totalYears - nextState.pursuits.length;\n while (remainingYears > 0 && nextState.pursuits.length) {\n const row = chooseRandom(nextState.pursuits);\n row.years += 1;\n remainingYears -= 1;\n }\n }\n\n const seededState = normalizeBuilderState(nextState);\n seededState.allocations = {};\n\n const freshContext = buildBuilderContext(\n { ...this.actor, system: { ...this.actor.system, characterBuilder: seededState } },\n skills\n );\n\n for (const skill of skills) {\n const meta = freshContext.bySkillId.get(skill.id);\n if (!meta) continue;\n seededState.baseBySkillId[skill.id] = meta.baseValue;\n seededState.allocations[skill.id] = { education: 0, pursuits: 0, special: 0 };\n }\n\n const totalBySkill = new Map();\n for (const skill of skills) {\n totalBySkill.set(skill.id, 0);\n }\n\n const maxForSkill = (skillId: string): number => {\n const meta = freshContext.bySkillId.get(skillId);\n return meta ? Math.max(0, meta.maxAllocation) : 0;\n };\n\n const allocatePool = (\n points: number,\n poolKey: keyof BuilderAllocation,\n eligible: (skill: any, meta: BuilderSkillMeta) => boolean\n ): number => {\n let remaining = Math.max(0, points);\n let guard = 0;\n\n while (remaining > 0 && guard < 300000) {\n guard += 1;\n const candidates = skills.filter((skill) => {\n const meta = freshContext.bySkillId.get(skill.id);\n if (!meta || !eligible(skill, meta)) return false;\n const allocated = totalBySkill.get(skill.id) ?? 0;\n return allocated < maxForSkill(skill.id);\n });\n\n if (!candidates.length) break;\n const picked = chooseRandom(candidates);\n const current = seededState.allocations[picked.id] ?? { education: 0, pursuits: 0, special: 0 };\n current[poolKey] += 1;\n seededState.allocations[picked.id] = current;\n totalBySkill.set(picked.id, (totalBySkill.get(picked.id) ?? 0) + 1);\n remaining -= 1;\n }\n\n return remaining;\n };\n\n const educationUnspent = allocatePool(\n Math.max(0, freshContext.education.total),\n \"education\",\n (skill, meta) => meta.allowsEducation\n );\n\n const pursuitsUnspent = allocatePool(\n Math.max(0, freshContext.pursuits.total),\n \"pursuits\",\n (skill, meta) => meta.allowsPursuits\n );\n\n const specialUnspent = allocatePool(\n Math.max(0, freshContext.special.total),\n \"special\",\n (skill, meta) => meta.allowsSpecial\n );\n\n for (const skill of skills) {\n const allocation = normalizeAllocation(seededState.allocations[skill.id]);\n if (allocation.education + allocation.pursuits + allocation.special <= 0) {\n delete seededState.allocations[skill.id];\n }\n }\n\n await this.updateBuilderState(seededState);\n await this.syncSkillsFromBuilderState(seededState);\n\n if (educationUnspent > 0 || pursuitsUnspent > 0 || specialUnspent > 0) {\n ui.notifications?.info(\n `Random build complete. Unspent points: EDU ${educationUnspent}, Pursuits ${pursuitsUnspent}, Special ${specialUnspent}.`\n );\n } else {\n ui.notifications?.info(\"Random build complete. All available points allocated.\");\n }\n }\n\n private async promptSkillAllocation(skillId: string): Promise {\n if (!this.isToolsUnlocked()) return;\n const skill = this.actor.items.get(skillId);\n if (!skill || skill.type !== \"skill\") return;\n\n const skills = this.actor.items.filter((item: any) => item.type === \"skill\");\n const context = buildBuilderContext(this.actor, skills);\n const meta = context.bySkillId.get(skillId);\n if (!meta) return;\n\n const current = meta.allocation;\n const maxEducation = Math.max(0, context.education.remaining + current.education);\n const maxPursuits = Math.max(0, context.pursuits.remaining + current.pursuits);\n const maxSpecial = Math.max(0, context.special.remaining + current.special);\n\n const maxByCap = Math.max(0, meta.maxAllocation);\n\n const content = `\n
\n
\n \"\"\n
\n

${skill.name}

\n

Base ${meta.baseValue}% | Root cap ${meta.rootCap}% | Current ${num(skill.system?.value, 0)}%

\n
\n
\n\n \n\n \n\n \n\n

Max additional from root cap: ${maxByCap}. Pools: EDU ${context.education.remaining}, Pursuits ${context.pursuits.remaining}, Special ${context.special.remaining}.

\n
\n `;\n\n const result = await new Promise((resolve) => {\n new Dialog({\n title: `${skill.name} - Allocate Character Points`,\n content,\n buttons: {\n save: {\n label: \"Apply\",\n callback: (html: JQuery) => {\n const form = html.find(\"form\")[0] as HTMLFormElement | undefined;\n if (!form) {\n resolve(null);\n return;\n }\n const data = new FormData(form);\n resolve({\n education: meta.allowsEducation ? toInt(data.get(\"education\"), current.education) : current.education,\n pursuits: meta.allowsPursuits ? toInt(data.get(\"pursuits\"), current.pursuits) : current.pursuits,\n special: meta.allowsSpecial ? toInt(data.get(\"special\"), current.special) : current.special\n });\n }\n },\n cancel: {\n label: \"Cancel\",\n callback: () => resolve(null)\n }\n },\n default: \"save\",\n close: () => resolve(null)\n }).render(true);\n });\n\n if (!result) return;\n\n const requestedTotal = result.education + result.pursuits + result.special;\n if (requestedTotal > maxByCap) {\n ui.notifications?.warn(`Allocation exceeds this skill's root-cap allowance (${maxByCap}).`);\n return;\n }\n\n if (result.education > maxEducation || result.pursuits > maxPursuits || result.special > maxSpecial) {\n ui.notifications?.warn(\"Allocation exceeds remaining pool points.\");\n return;\n }\n\n const nextState = foundry.utils.deepClone(context.state) as BuilderState;\n nextState.baseBySkillId[skill.id] = meta.baseValue;\n if (requestedTotal <= 0) {\n delete nextState.allocations[skill.id];\n } else {\n nextState.allocations[skill.id] = result;\n }\n\n await this.updateBuilderState(nextState);\n await this.syncSkillsFromBuilderState(nextState);\n }\n\n activateListeners(html: JQuery): void {\n super.activateListeners(html);\n\n html.find(\".toggle-sheet-lock\").on(\"click\", async (event) => {\n event.preventDefault();\n const next = !this.isToolsUnlocked();\n await this.actor.update({ \"system.sheetToolsUnlocked\": next });\n ui.notifications?.info(next ? \"Sheet tools unlocked.\" : \"Sheet tools locked.\");\n });\n\n html.find(\".roll-characteristic\").on(\"click\", async (event) => {\n event.preventDefault();\n const button = event.currentTarget as HTMLElement;\n const key = String(button.dataset.char || \"\").trim().toLowerCase();\n const label = String(button.dataset.label || key.toUpperCase());\n if (!key) return;\n await promptCharacteristicCheck(this.actor, key, label);\n });\n\n html.find(\".item-create\").on(\"click\", async (event) => {\n event.preventDefault();\n const type = String((event.currentTarget as HTMLElement).dataset.type || \"gear\");\n const doc: any = { name: `New ${type}`, type };\n if (type === \"skill\") {\n doc.img = DEFAULT_SKILL_ICON;\n doc.system = { value: 0, category: \"Technical\", specialization: \"\" };\n }\n await this.actor.createEmbeddedDocuments(\"Item\", [doc]);\n });\n\n html.find(\".item-edit\").on(\"click\", (event) => {\n event.preventDefault();\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n const item = li ? this.actor.items.get(li.dataset.itemId ?? \"\") : null;\n item?.sheet?.render(true);\n });\n\n html.find(\".item-delete\").on(\"click\", async (event) => {\n event.preventDefault();\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n if (!li?.dataset.itemId) return;\n await this.actor.deleteEmbeddedDocuments(\"Item\", [li.dataset.itemId]);\n });\n\n html.find(\".item-roll-skill\").on(\"click\", async (event) => {\n event.preventDefault();\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n if (!li?.dataset.itemId) return;\n await (this.actor as any).rollSkillById(li.dataset.itemId);\n });\n\n html.find(\".roll-derived\").on(\"click\", async (event) => {\n event.preventDefault();\n const key = String((event.currentTarget as HTMLElement).dataset.check || \"\");\n if (!key) return;\n await (this.actor as any).rollDerivedCheck(key);\n });\n\n html.find(\".item-use-weapon\").on(\"click\", async (event) => {\n event.preventDefault();\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n if (!li?.dataset.itemId) return;\n await (this.actor as any).useWeaponById(li.dataset.itemId);\n });\n\n html.find(\".item-reload-weapon\").on(\"click\", async (event) => {\n event.preventDefault();\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n if (!li?.dataset.itemId) return;\n await (this.actor as any).reloadWeaponById(li.dataset.itemId);\n });\n\n html.find(\".item-toggle-equipped\").on(\"click\", async (event) => {\n event.preventDefault();\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n if (!li?.dataset.itemId) return;\n const item = this.actor.items.get(li.dataset.itemId);\n if (!item) return;\n\n const nextEquipped = !Boolean(item.system?.equipped);\n const update: Record = {\n _id: item.id,\n \"system.equipped\": nextEquipped\n };\n if (nextEquipped) {\n update[\"system.stowed\"] = false;\n }\n await this.actor.updateEmbeddedDocuments(\"Item\", [update]);\n });\n\n html.find(\".item-toggle-stowed\").on(\"click\", async (event) => {\n event.preventDefault();\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n if (!li?.dataset.itemId) return;\n const item = this.actor.items.get(li.dataset.itemId);\n if (!item) return;\n\n const nextStowed = !Boolean(item.system?.stowed);\n const update: Record = {\n _id: item.id,\n \"system.stowed\": nextStowed\n };\n if (nextStowed) {\n update[\"system.equipped\"] = false;\n }\n await this.actor.updateEmbeddedDocuments(\"Item\", [update]);\n });\n\n html.find(\".roll-hit-location\").on(\"click\", async (event) => {\n event.preventDefault();\n await (this.actor as any).rollHitLocation();\n });\n\n html.find(\".reset-conditions\").on(\"click\", async (event) => {\n event.preventDefault();\n await this.actor.update({\n \"system.conditions.prone\": false,\n \"system.conditions.unconscious\": false,\n \"system.conditions.dead\": false,\n \"system.conditions.dying\": false,\n \"system.conditions.unusableLimbs.rArm\": false,\n \"system.conditions.unusableLimbs.lArm\": false,\n \"system.conditions.unusableLimbs.rLeg\": false,\n \"system.conditions.unusableLimbs.lLeg\": false\n });\n });\n\n html.find(\".populate-base-skills\").on(\"click\", async (event) => {\n event.preventDefault();\n const added = await (this.actor as any).ensureBaseSkills();\n if (added > 0) ui.notifications?.info(`Added ${added} Ringworld base skills.`);\n else ui.notifications?.info(\"All Ringworld base skills are already present.\");\n });\n\n html.find(\".add-base-skill\").on(\"click\", async (event) => {\n event.preventDefault();\n const button = event.currentTarget as HTMLElement;\n const name = String(button.dataset.skillName || \"\");\n const category = String(button.dataset.skillCategory || \"\");\n const base = Number(button.dataset.skillBase || 0);\n const specialization = String(button.dataset.skillSpecialization || \"\");\n if (!name) return;\n\n await this.actor.createEmbeddedDocuments(\"Item\", [{\n name,\n type: \"skill\",\n img: skillIconPath(name),\n system: { value: base, category, specialization }\n }]);\n });\n\n html.find(\".builder-add-pursuit\").on(\"click\", async (event) => {\n event.preventDefault();\n const root = (event.currentTarget as HTMLElement).closest(\".rw-builder-pursuits\");\n if (!root) return;\n const name = String((root.querySelector(\".builder-new-pursuit\") as HTMLSelectElement | null)?.value || \"\");\n const years = Number((root.querySelector(\".builder-new-years\") as HTMLInputElement | null)?.value || 0);\n await this.addOrUpdatePursuit(name, years);\n });\n\n html.find(\".builder-update-pursuit\").on(\"click\", async (event) => {\n event.preventDefault();\n const row = (event.currentTarget as HTMLElement).closest(\".builder-pursuit-row\");\n if (!row) return;\n const name = String((row.querySelector(\".builder-pursuit-name\") as HTMLSelectElement | null)?.value || \"\");\n const years = Number((row.querySelector(\".builder-pursuit-years\") as HTMLInputElement | null)?.value || 0);\n await this.addOrUpdatePursuit(name, years);\n });\n\n html.find(\".builder-remove-pursuit\").on(\"click\", async (event) => {\n event.preventDefault();\n const index = Number((event.currentTarget as HTMLElement).dataset.index ?? -1);\n if (!Number.isFinite(index) || index < 0) return;\n await this.removePursuit(index);\n });\n\n html.find(\".builder-reset-points\").on(\"click\", async (event) => {\n event.preventDefault();\n await this.resetBuilderAllocations();\n ui.notifications?.info(\"Character-builder allocations reset.\");\n });\n\n html.find(\".roll-characteristics\").on(\"click\", async (event) => {\n event.preventDefault();\n if (!this.isToolsUnlocked()) return;\n await (this.actor as any).rollCharacteristics?.();\n ui.notifications?.info(\"Characteristics rolled.\");\n });\n\n html.find(\".builder-auto-allocate\").on(\"click\", async (event) => {\n event.preventDefault();\n if (!this.isToolsUnlocked()) return;\n await (this.actor as any).ensureBaseSkills?.();\n await this.randomizeBuilderAllocations();\n });\n\n html.find(\".builder-skill-allocate\").on(\"click\", async (event) => {\n event.preventDefault();\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n const skillId = String(li?.dataset.itemId || \"\");\n if (!skillId) return;\n await this.promptSkillAllocation(skillId);\n });\n }\n\n protected async _onDropItemCreate(itemData: any): Promise {\n const items = Array.isArray(itemData) ? itemData : [itemData];\n const speciesItems = items.filter((entry: any) => entry?.type === \"species\");\n const createItems = items.filter((entry: any) => entry?.type !== \"species\");\n\n for (const species of speciesItems) {\n await (this.actor as any).applySpeciesItem?.(species);\n }\n if (speciesItems.length > 0) {\n const names = speciesItems.map((entry: any) => String(entry?.name || \"Species\")).join(\", \");\n ui.notifications?.info(`Applied species to actor: ${names}`);\n }\n\n if (createItems.length === 0) return [];\n\n const patched = createItems.map((entry: any) => {\n if (entry?.type !== \"skill\") return entry;\n return {\n ...entry,\n img: resolveSkillIcon(String(entry?.name || \"Skill\"), String(entry?.img || \"\"))\n };\n });\n return super._onDropItemCreate(Array.isArray(itemData) ? patched : patched[0]);\n }\n}\n","import { getActorHitLocationSchema, listHitLocationSchemas } from \"../../hit-location-schemas\";\nimport { promptCharacteristicCheck } from \"../../mechanics\";\n\nconst BaseActorSheet = (foundry as any).appv1.sheets.ActorSheet;\n\nfunction num(value: unknown, fallback = 0): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nfunction itemArmorAtLocation(item: any, slug: string): number {\n if (item.type !== \"armor\" || !item.system.equipped || item.system.stowed) return 0;\n if (!item.system.coverage?.[slug]) return 0;\n const specific = num(item.system.perLocation?.[slug]);\n if (specific > 0) return specific;\n return num(item.system.value);\n}\n\nexport class RingworldCreatureSheet extends BaseActorSheet {\n static get defaultOptions(): any {\n return foundry.utils.mergeObject(super.defaultOptions, {\n classes: [\"ringworld\", \"sheet\", \"actor\", \"creature\"],\n width: 860,\n height: 780\n });\n }\n\n get template(): string {\n return \"systems/ringworld/templates/actor/creature-sheet.hbs\";\n }\n\n async getData(options?: any): Promise {\n const data = await super.getData(options);\n const actor = this.actor as any;\n const schema = getActorHitLocationSchema(actor);\n\n return {\n ...data,\n system: actor.system,\n skills: actor.items\n .filter((item: any) => item.type === \"skill\")\n .sort((a: any, b: any) => a.name.localeCompare(b.name)),\n weapons: actor.items.filter((item: any) => item.type === \"weapon\"),\n armors: actor.items.filter((item: any) => item.type === \"armor\"),\n hitSchemaId: schema.id,\n hitSchemas: listHitLocationSchemas().map((entry: any) => ({ id: entry.id, label: entry.label })),\n hitLocations: schema.entries.map((entry) => {\n const loc = actor.system.hitLocations?.[entry.slug] ?? {};\n const baseArmor = num(loc.armor);\n const itemArmor = actor.items\n .filter((item: any) => item.type === \"armor\")\n .reduce((sum: number, item: any) => sum + itemArmorAtLocation(item, entry.slug), 0);\n return {\n slug: entry.slug,\n rollRange: `${entry.min}-${entry.max}`,\n label: entry.label,\n armor: baseArmor,\n apTotal: baseArmor + itemArmor,\n hp: loc.hp ?? { value: 1, max: 1 }\n };\n })\n };\n }\n\n activateListeners(html: JQuery): void {\n super.activateListeners(html);\n\n html.find(\".item-create\").on(\"click\", async (event) => {\n event.preventDefault();\n const type = String((event.currentTarget as HTMLElement).dataset.type || \"skill\");\n await this.actor.createEmbeddedDocuments(\"Item\", [{ name: `New ${type}`, type }]);\n });\n\n html.find(\".item-edit\").on(\"click\", (event) => {\n event.preventDefault();\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n const item = li ? this.actor.items.get(li.dataset.itemId ?? \"\") : null;\n item?.sheet?.render(true);\n });\n\n html.find(\".item-delete\").on(\"click\", async (event) => {\n event.preventDefault();\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n if (!li?.dataset.itemId) return;\n await this.actor.deleteEmbeddedDocuments(\"Item\", [li.dataset.itemId]);\n });\n\n html.find(\".item-roll-skill\").on(\"click\", async (event) => {\n event.preventDefault();\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n if (!li?.dataset.itemId) return;\n await (this.actor as any).rollSkillById(li.dataset.itemId);\n });\n\n html.find(\".item-use-weapon\").on(\"click\", async (event) => {\n event.preventDefault();\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n if (!li?.dataset.itemId) return;\n await (this.actor as any).useWeaponById(li.dataset.itemId);\n });\n\n html.find(\".item-reload-weapon\").on(\"click\", async (event) => {\n event.preventDefault();\n const li = (event.currentTarget as HTMLElement).closest(\".item\");\n if (!li?.dataset.itemId) return;\n await (this.actor as any).reloadWeaponById(li.dataset.itemId);\n });\n\n html.find(\".roll-hit-location\").on(\"click\", async (event) => {\n event.preventDefault();\n await (this.actor as any).rollHitLocation();\n });\n\n html.find(\".roll-characteristic\").on(\"click\", async (event) => {\n event.preventDefault();\n const button = event.currentTarget as HTMLElement;\n const key = String(button.dataset.char || \"\").trim().toLowerCase();\n const label = String(button.dataset.label || key.toUpperCase());\n if (!key) return;\n await promptCharacteristicCheck(this.actor, key, label);\n });\n\n html.find(\".roll-derived\").on(\"click\", async (event) => {\n event.preventDefault();\n const key = String((event.currentTarget as HTMLElement).dataset.check || \"\");\n if (!key) return;\n await (this.actor as any).rollDerivedCheck(key);\n });\n\n html.find(\".reset-conditions\").on(\"click\", async (event) => {\n event.preventDefault();\n await this.actor.update({\n \"system.conditions.prone\": false,\n \"system.conditions.unconscious\": false,\n \"system.conditions.dead\": false,\n \"system.conditions.dying\": false,\n \"system.conditions.unusableLimbs.rArm\": false,\n \"system.conditions.unusableLimbs.lArm\": false,\n \"system.conditions.unusableLimbs.rLeg\": false,\n \"system.conditions.unusableLimbs.lLeg\": false\n });\n });\n\n html.find(\".rw-portrait-img\").on(\"click\", (event) => {\n event.preventDefault();\n const FilePickerImpl = (foundry as any).applications?.apps?.FilePicker?.implementation ?? (globalThis as any).FilePicker;\n const picker = new FilePickerImpl({\n type: \"image\",\n current: (this.actor as any).img,\n callback: async (path: string) => {\n await this.actor.update({ img: path });\n }\n });\n picker.render(true);\n });\n }\n}\n","const BaseActorSheet = (foundry as any).appv1.sheets.ActorSheet;\n\nexport class RingworldVehicleSheet extends BaseActorSheet {\n static get defaultOptions(): any {\n return foundry.utils.mergeObject(super.defaultOptions, {\n classes: [\"ringworld\", \"sheet\", \"actor\", \"vehicle\"],\n width: 680,\n height: 560\n });\n }\n\n get template(): string {\n return \"systems/ringworld/templates/actor/vehicle-sheet.hbs\";\n }\n\n async getData(options?: any): Promise {\n const data = await super.getData(options);\n return {\n ...data,\n system: (this.actor as any).system\n };\n }\n}\n","const BaseItemSheet = (foundry as any).appv1.sheets.ItemSheet;\n\nexport class RingworldSkillSheet extends BaseItemSheet {\n static get defaultOptions(): any {\n return foundry.utils.mergeObject(super.defaultOptions, {\n classes: [\"ringworld\", \"sheet\", \"item\", \"skill\"],\n width: 520,\n height: 420\n });\n }\n\n get template(): string {\n return \"systems/ringworld/templates/item/skill-sheet.hbs\";\n }\n\n async getData(options?: any): Promise {\n const data = await super.getData(options);\n return {\n ...data,\n system: (this.item as any).system\n };\n }\n\n activateListeners(html: JQuery): void {\n super.activateListeners(html);\n html.find(\".roll-skill\").on(\"click\", async (event) => {\n event.preventDefault();\n await (this.item as any).rollSkill();\n });\n }\n}\n","const BaseItemSheet = (foundry as any).appv1.sheets.ItemSheet;\n\nexport class RingworldWeaponSheet extends BaseItemSheet {\n static get defaultOptions(): any {\n return foundry.utils.mergeObject(super.defaultOptions, {\n classes: [\"ringworld\", \"sheet\", \"item\", \"weapon\"],\n width: 620,\n height: 620\n });\n }\n\n get template(): string {\n return \"systems/ringworld/templates/item/weapon-sheet.hbs\";\n }\n\n async getData(options?: any): Promise {\n const data = await super.getData(options);\n const actor = this.item.actor as any;\n\n return {\n ...data,\n system: (this.item as any).system,\n skills: actor ? actor.items.filter((item: any) => item.type === \"skill\") : [],\n powerPacks: actor ? actor.items.filter((item: any) => item.type === \"gear\" && item.system.isPowerPack) : []\n };\n }\n\n activateListeners(html: JQuery): void {\n super.activateListeners(html);\n html.find(\".use-weapon\").on(\"click\", async (event) => {\n event.preventDefault();\n await (this.item as any).useWeapon();\n });\n }\n}\n","const BaseItemSheet = (foundry as any).appv1.sheets.ItemSheet;\n\nexport class RingworldArmorSheet extends BaseItemSheet {\n static get defaultOptions(): any {\n return foundry.utils.mergeObject(super.defaultOptions, {\n classes: [\"ringworld\", \"sheet\", \"item\", \"armor\"],\n width: 620,\n height: 560\n });\n }\n\n get template(): string {\n return \"systems/ringworld/templates/item/armor-sheet.hbs\";\n }\n\n async getData(options?: any): Promise {\n const data = await super.getData(options);\n return {\n ...data,\n system: (this.item as any).system\n };\n }\n}\n","const BaseItemSheet = (foundry as any).appv1.sheets.ItemSheet;\n\nexport class RingworldGearSheet extends BaseItemSheet {\n static get defaultOptions(): any {\n return foundry.utils.mergeObject(super.defaultOptions, {\n classes: [\"ringworld\", \"sheet\", \"item\", \"gear\"],\n width: 620,\n height: 520\n });\n }\n\n get template(): string {\n return \"systems/ringworld/templates/item/gear-sheet.hbs\";\n }\n\n async getData(options?: any): Promise {\n const data = await super.getData(options);\n return {\n ...data,\n system: (this.item as any).system\n };\n }\n}\n","const BaseItemSheet = (foundry as any).appv1.sheets.ItemSheet;\n\nexport class RingworldSpeciesSheet extends BaseItemSheet {\n static get defaultOptions(): any {\n return foundry.utils.mergeObject(super.defaultOptions, {\n classes: [\"ringworld\", \"sheet\", \"item\", \"species\"],\n width: 620,\n height: 560\n });\n }\n\n get template(): string {\n return \"systems/ringworld/templates/item/species-sheet.hbs\";\n }\n\n async getData(options?: any): Promise {\n const data = await super.getData(options);\n return {\n ...data,\n system: (this.item as any).system\n };\n }\n}\n","const BaseItemSheet = (foundry as any).appv1.sheets.ItemSheet;\n\nfunction asArray(value: unknown): string[] {\n return Array.isArray(value) ? value.map((entry) => String(entry)) : [];\n}\n\nexport class RingworldPursuitSheet extends BaseItemSheet {\n static get defaultOptions(): any {\n return foundry.utils.mergeObject(super.defaultOptions, {\n classes: [\"ringworld\", \"sheet\", \"item\", \"pursuit\"],\n width: 680,\n height: 620\n });\n }\n\n get template(): string {\n return \"systems/ringworld/templates/item/pursuit-sheet.hbs\";\n }\n\n async getData(options?: any): Promise {\n const data = await super.getData(options);\n const system = (this.item as any).system ?? {};\n const fixedSkills = asArray(system.fixedSkills);\n const optionalGroups = Array.isArray(system.optionalSkillGroups)\n ? system.optionalSkillGroups.map((group: any) => ({\n choose: Number(group?.choose ?? 1),\n skills: asArray(group?.skills)\n }))\n : [];\n\n return {\n ...data,\n system,\n fixedSkills,\n optionalGroups\n };\n }\n}\n\n","import { SYSTEM_ID } from \"./constants\";\n\ntype MajorActionKind = \"draw\" | \"aim\" | \"melee\" | \"stand\" | \"perception\" | \"unarmed\";\ntype MinorActionKind = \"fire\" | \"fall\" | \"rise\" | \"minorCustom\";\ntype ActionKind = MajorActionKind | MinorActionKind;\n\ninterface ActionEvent {\n id: string;\n actorId: string | null;\n combatantId: string;\n kind: ActionKind;\n major: boolean;\n startImpulse: number;\n completeImpulse: number;\n itemId?: string;\n skillId?: string;\n targetTokenId?: string;\n}\n\ninterface ImpulseState {\n currentImpulse: number;\n queue: ActionEvent[];\n}\n\nconst IMPULSE_FLAG = \"impulseState\";\nconst IMPULSE_HUD_POS_KEY = `${SYSTEM_ID}.impulseHudPos`;\nconst MAJOR_ACTION_OPTIONS: { value: MajorActionKind; label: string }[] = [\n { value: \"draw\", label: \"Draw / Stow Weapon\" },\n { value: \"aim\", label: \"Aim Ranged Weapon\" },\n { value: \"melee\", label: \"Melee Attack\" },\n { value: \"stand\", label: \"Stand / Recover\" },\n { value: \"perception\", label: \"Perception Skill\" },\n { value: \"unarmed\", label: \"Unarmed Combat\" }\n];\nconst MINOR_ACTION_OPTIONS: { value: MinorActionKind; label: string }[] = [\n { value: \"fire\", label: \"Fire Ranged Weapon\" },\n { value: \"fall\", label: \"Fall\" },\n { value: \"rise\", label: \"Rise (Kneeling to Stand/Run)\" },\n { value: \"minorCustom\", label: \"Other Minor Action\" }\n];\n\nfunction num(value: unknown, fallback = 0): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nfunction esc(value: unknown): string {\n return String(value ?? \"\")\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll(\"\\\"\", \""\");\n}\n\nexport function actionRankingFromDex(dex: number): number {\n if (dex <= 4) return 7;\n if (dex <= 8) return 6;\n if (dex <= 12) return 5;\n if (dex <= 16) return 4;\n if (dex <= 20) return 3;\n if (dex <= 24) return 2;\n return 1;\n}\n\nfunction actionKindLabel(kind: ActionKind): string {\n switch (kind) {\n case \"draw\":\n return \"Draw / Stow\";\n case \"aim\":\n return \"Aim\";\n case \"melee\":\n return \"Melee Attack\";\n case \"stand\":\n return \"Stand / Recover\";\n case \"perception\":\n return \"Perception\";\n case \"unarmed\":\n return \"Unarmed Combat\";\n case \"fire\":\n return \"Fire Ranged Weapon\";\n case \"fall\":\n return \"Fall\";\n case \"rise\":\n return \"Rise\";\n case \"minorCustom\":\n return \"Minor Action\";\n default:\n return String(kind);\n }\n}\n\nfunction getDexForCombatant(combatant: any): number {\n return Math.max(1, num(combatant?.actor?.system?.characteristics?.dex, 10));\n}\n\nfunction getCombatantActionRanking(combatant: any): number {\n const fromFlag = num(combatant?.flags?.[SYSTEM_ID]?.actionRanking, 0);\n if (fromFlag > 0) return fromFlag;\n return actionRankingFromDex(getDexForCombatant(combatant));\n}\n\nfunction getEncumbranceArPenalty(combatant: any): number {\n const fromActor = num(combatant?.actor?.system?.encumbrance?.actionRankingPenalty, 0);\n return Math.max(0, Math.trunc(fromActor));\n}\n\nasync function syncCombatantActionRanking(combatant: any): Promise {\n const ranking = actionRankingFromDex(getDexForCombatant(combatant));\n const existing = num(combatant?.flags?.[SYSTEM_ID]?.actionRanking, 0);\n if (existing !== ranking) {\n await combatant.update({ [`flags.${SYSTEM_ID}.actionRanking`]: ranking });\n }\n return ranking;\n}\n\nfunction getImpulseState(combat: any): ImpulseState {\n const raw = foundry.utils.deepClone(combat.getFlag(SYSTEM_ID, IMPULSE_FLAG) ?? {});\n const queue = Array.isArray(raw.queue) ? raw.queue : [];\n return {\n currentImpulse: Math.max(1, num(raw.currentImpulse, 1)),\n queue\n };\n}\n\nasync function setImpulseState(combat: any, state: ImpulseState): Promise {\n await combat.setFlag(SYSTEM_ID, IMPULSE_FLAG, {\n currentImpulse: Math.max(1, num(state.currentImpulse, 1)),\n queue: Array.isArray(state.queue) ? state.queue : []\n });\n}\n\nfunction sortQueueByCompletion(queue: ActionEvent[], combat: any): ActionEvent[] {\n return [...queue].sort((a, b) => {\n if (a.completeImpulse !== b.completeImpulse) return a.completeImpulse - b.completeImpulse;\n const aDex = getDexForCombatant(combat.combatants.get(a.combatantId));\n const bDex = getDexForCombatant(combat.combatants.get(b.combatantId));\n return bDex - aDex;\n });\n}\n\nfunction pruneQueueToCombatants(queue: ActionEvent[], combat: any): ActionEvent[] {\n const validIds = new Set(combat.combatants.map((c: any) => c.id));\n return queue.filter((entry) => validIds.has(entry.combatantId));\n}\n\nfunction loadHudPosition(): { left: number; top: number } | null {\n try {\n const raw = localStorage.getItem(IMPULSE_HUD_POS_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n const left = num(parsed?.left, NaN);\n const top = num(parsed?.top, NaN);\n if (!Number.isFinite(left) || !Number.isFinite(top)) return null;\n return { left, top };\n } catch (_err) {\n return null;\n }\n}\n\nfunction saveHudPosition(position: { left: number; top: number }): void {\n try {\n localStorage.setItem(\n IMPULSE_HUD_POS_KEY,\n JSON.stringify({ left: Math.round(position.left), top: Math.round(position.top) })\n );\n } catch (_err) {\n // Ignore storage issues.\n }\n}\n\nfunction clearHudPosition(): void {\n try {\n localStorage.removeItem(IMPULSE_HUD_POS_KEY);\n } catch (_err) {\n // Ignore storage issues.\n }\n}\n\nfunction clampHudPosition(position: { left: number; top: number }, element: HTMLElement): { left: number; top: number } {\n const margin = 8;\n const width = element.offsetWidth || 300;\n const height = element.offsetHeight || 220;\n const maxLeft = Math.max(margin, window.innerWidth - width - margin);\n const maxTop = Math.max(margin, window.innerHeight - height - margin);\n return {\n left: Math.min(Math.max(margin, position.left), maxLeft),\n top: Math.min(Math.max(margin, position.top), maxTop)\n };\n}\n\nfunction applyHudAbsolutePosition(hud: JQuery, position: { left: number; top: number }): void {\n const el = hud.get(0) as HTMLElement | undefined;\n if (!el) return;\n const clamped = clampHudPosition(position, el);\n hud.css({\n left: `${clamped.left}px`,\n top: `${clamped.top}px`,\n right: \"auto\",\n bottom: \"auto\"\n });\n}\n\nfunction makeHudDraggable(hud: JQuery): void {\n const el = hud.get(0) as HTMLElement | undefined;\n if (!el) return;\n\n const handle = hud.find(\".rw-imp-mini-head\");\n if (!handle.length) return;\n\n const saved = loadHudPosition();\n if (saved) {\n applyHudAbsolutePosition(hud, saved);\n }\n\n let dragging = false;\n let startX = 0;\n let startY = 0;\n let startLeft = 0;\n let startTop = 0;\n\n handle.on(\"mousedown\", (event) => {\n const mouseEvent = event as JQuery.MouseDownEvent;\n if (mouseEvent.button !== 0) return;\n if ((mouseEvent.target as HTMLElement)?.closest(\"button\")) return;\n mouseEvent.preventDefault();\n\n const rect = el.getBoundingClientRect();\n startX = mouseEvent.clientX;\n startY = mouseEvent.clientY;\n startLeft = rect.left;\n startTop = rect.top;\n dragging = true;\n\n hud.addClass(\"dragging\");\n hud.css({ left: `${startLeft}px`, top: `${startTop}px`, right: \"auto\", bottom: \"auto\" });\n\n $(document).on(\"mousemove.ringworldImpulseHudDrag\", (moveEvent) => {\n if (!dragging) return;\n const evt = moveEvent as JQuery.MouseMoveEvent;\n const deltaX = evt.clientX - startX;\n const deltaY = evt.clientY - startY;\n applyHudAbsolutePosition(hud, { left: startLeft + deltaX, top: startTop + deltaY });\n });\n\n $(document).one(\"mouseup.ringworldImpulseHudDrag\", () => {\n dragging = false;\n hud.removeClass(\"dragging\");\n $(document).off(\"mousemove.ringworldImpulseHudDrag\");\n const latestRect = el.getBoundingClientRect();\n saveHudPosition({ left: latestRect.left, top: latestRect.top });\n });\n });\n\n handle.on(\"dblclick\", () => {\n clearHudPosition();\n hud.css({ left: \"\", top: \"\", right: \"\", bottom: \"\" });\n });\n}\n\nfunction getQueueWithNames(combat: any, queue: ActionEvent[]): Array<{\n combatantId: string;\n name: string;\n label: string;\n completeImpulse: number;\n dex: number;\n}> {\n return sortQueueByCompletion(pruneQueueToCombatants(queue, combat), combat).map((entry) => {\n const combatant = combat.combatants.get(entry.combatantId);\n return {\n combatantId: entry.combatantId,\n name: String(combatant?.name || \"Unknown\"),\n label: actionKindLabel(entry.kind),\n completeImpulse: entry.completeImpulse,\n dex: getDexForCombatant(combatant)\n };\n });\n}\n\nfunction renderQueueRowsMarkup(rows: ReturnType, limit = 8): string {\n if (!rows.length) return `
No actions queued.
`;\n return rows.slice(0, limit).map((row) => `\n
\n ${esc(row.name)}\n ${esc(row.label)} @ ${row.completeImpulse}\n
\n `).join(\"\");\n}\n\nfunction attachOverlayControls(root: JQuery, combat: any): void {\n const disabled = game.user?.isGM ? false : true;\n root.find(\".rw-mini-next\").prop(\"disabled\", disabled).on(\"click\", async (event) => {\n event.preventDefault();\n await advanceImpulse(combat, \"next\");\n });\n root.find(\".rw-mini-step\").prop(\"disabled\", disabled).on(\"click\", async (event) => {\n event.preventDefault();\n await advanceImpulse(combat, \"step\");\n });\n root.find(\".rw-mini-reset\").prop(\"disabled\", disabled).on(\"click\", async (event) => {\n event.preventDefault();\n await resetImpulseSequence(combat);\n });\n}\n\nfunction renderChatImpulseMarker(combat: any | null): void {\n const chatEl = (ui as any)?.chat?.element as JQuery | undefined;\n if (!chatEl?.length) return;\n chatEl.find(\".ringworld-impulse-chat-marker\").remove();\n if (!combat) return;\n\n const state = getImpulseState(combat);\n const rows = getQueueWithNames(combat, state.queue);\n const marker = $(`\n
\n
\n Impulse ${state.currentImpulse}\n Queued ${rows.length}\n
\n
${renderQueueRowsMarkup(rows, 5)}
\n
\n \n \n \n
\n
\n `);\n attachOverlayControls(marker, combat);\n chatEl.prepend(marker);\n}\n\nfunction renderFloatingImpulseHud(combat: any | null): void {\n const existing = $(\"#ringworld-impulse-hud\");\n existing.remove();\n if (!combat) return;\n\n const state = getImpulseState(combat);\n const rows = getQueueWithNames(combat, state.queue);\n const hud = $(`\n
\n
\n Impulse ${state.currentImpulse}\n Queued ${rows.length}\n
\n
${renderQueueRowsMarkup(rows, 8)}
\n
\n \n \n \n
\n
\n `);\n attachOverlayControls(hud, combat);\n $(\"body\").append(hud);\n makeHudDraggable(hud);\n}\n\nfunction refreshImpulseOverlays(combat: any | null): void {\n renderChatImpulseMarker(combat);\n renderFloatingImpulseHud(combat);\n}\n\nasync function ensureGmControl(): Promise {\n if (game.user?.isGM) return true;\n ui.notifications?.warn(\"Only the GM can modify Ringworld impulse sequencing.\");\n return false;\n}\n\nasync function scheduleAction(\n combat: any,\n combatantId: string,\n kind: ActionKind,\n major: boolean\n): Promise {\n if (!(await ensureGmControl())) return;\n\n const combatant = combat.combatants.get(combatantId);\n if (!combatant) return;\n\n const state = getImpulseState(combat);\n const currentImpulse = state.currentImpulse;\n const actionRanking = await syncCombatantActionRanking(combatant);\n const encPenalty = getEncumbranceArPenalty(combatant);\n const impulseMod = num(combatant.flags?.[SYSTEM_ID]?.impulseModifier, 0);\n const effectiveAr = Math.max(1, actionRanking + encPenalty);\n const baseDuration = major ? effectiveAr : 1;\n const duration = Math.max(1, baseDuration + impulseMod);\n const completeImpulse = currentImpulse + duration;\n\n const event: ActionEvent = {\n id: foundry.utils.randomID(),\n actorId: combatant.actor?.id ?? null,\n combatantId,\n kind,\n major,\n startImpulse: currentImpulse,\n completeImpulse\n };\n\n const queueWithoutCombatant = pruneQueueToCombatants(\n state.queue.filter((entry) => entry.combatantId !== combatantId),\n combat\n );\n queueWithoutCombatant.push(event);\n\n await setImpulseState(combat, {\n currentImpulse,\n queue: sortQueueByCompletion(queueWithoutCombatant, combat)\n });\n\n await combatant.update({\n [`flags.${SYSTEM_ID}.pendingEventId`]: event.id,\n [`flags.${SYSTEM_ID}.pendingKind`]: kind,\n [`flags.${SYSTEM_ID}.actionRanking`]: actionRanking,\n [`flags.${SYSTEM_ID}.effectiveActionRanking`]: effectiveAr\n });\n\n const timingLabel = major\n ? `AR ${actionRanking} + Enc ${encPenalty}${impulseMod ? ` ${impulseMod > 0 ? \"+\" : \"\"} Imp ${impulseMod}` : \"\"}`\n : `Minor 1${impulseMod ? ` ${impulseMod > 0 ? \"+\" : \"\"} Imp ${impulseMod}` : \"\"}`;\n ui.notifications?.info(\n `${combatant.name}: ${actionKindLabel(kind)} completes on impulse ${completeImpulse} (${timingLabel} => ${duration}).`\n );\n refreshImpulseOverlays(combat);\n}\n\nasync function cancelAction(combat: any, combatantId: string): Promise {\n if (!(await ensureGmControl())) return;\n\n const combatant = combat.combatants.get(combatantId);\n if (!combatant) return;\n\n const state = getImpulseState(combat);\n const nextQueue = pruneQueueToCombatants(\n state.queue.filter((entry) => entry.combatantId !== combatantId),\n combat\n );\n\n await setImpulseState(combat, {\n currentImpulse: state.currentImpulse,\n queue: sortQueueByCompletion(nextQueue, combat)\n });\n\n await combatant.update({\n [`flags.${SYSTEM_ID}.pendingEventId`]: null,\n [`flags.${SYSTEM_ID}.pendingKind`]: \"\",\n [`flags.${SYSTEM_ID}.aimState`]: {\n active: false,\n targetId: null,\n sinceImpulse: null\n }\n });\n refreshImpulseOverlays(combat);\n}\n\nasync function resolveActionEvent(combat: any, event: ActionEvent, impulse: number): Promise {\n const combatant = combat.combatants.get(event.combatantId);\n if (!combatant) return;\n\n const updates: Record = {\n [`flags.${SYSTEM_ID}.pendingEventId`]: null,\n [`flags.${SYSTEM_ID}.pendingKind`]: \"\"\n };\n\n if (event.kind === \"aim\") {\n updates[`flags.${SYSTEM_ID}.aimState`] = {\n active: true,\n targetId: event.targetTokenId ?? null,\n sinceImpulse: impulse\n };\n }\n\n await combatant.update(updates);\n\n const content = `\n
\n

Impulse ${impulse} Completion

\n

${esc(combatant.name)} completes ${esc(actionKindLabel(event.kind))}.

\n

DEX ${getDexForCombatant(combatant)} | AR ${getCombatantActionRanking(combatant)}

\n
\n `;\n await ChatMessage.create({\n user: game.user?.id,\n speaker: ChatMessage.getSpeaker({ actor: combatant.actor ?? undefined }),\n content\n });\n}\n\nasync function advanceImpulse(combat: any, mode: \"next\" | \"step\"): Promise {\n if (!(await ensureGmControl())) return;\n\n const state = getImpulseState(combat);\n const queue = sortQueueByCompletion(pruneQueueToCombatants(state.queue, combat), combat);\n const current = state.currentImpulse;\n\n let targetImpulse = current + 1;\n if (mode === \"next\") {\n const next = queue\n .map((event) => event.completeImpulse)\n .filter((impulse) => impulse >= current)\n .sort((a, b) => a - b)[0];\n if (Number.isFinite(next)) {\n targetImpulse = next;\n }\n }\n\n const completing = queue.filter((event) => event.completeImpulse === targetImpulse);\n const remaining = queue.filter((event) => event.completeImpulse !== targetImpulse);\n\n await setImpulseState(combat, {\n currentImpulse: targetImpulse,\n queue: remaining\n });\n\n const ordered = sortQueueByCompletion(completing, combat);\n for (const event of ordered) {\n await resolveActionEvent(combat, event, targetImpulse);\n }\n\n if (!ordered.length) {\n ui.notifications?.info(`Impulse advanced to ${targetImpulse}.`);\n }\n refreshImpulseOverlays(combat);\n}\n\nasync function resetImpulseSequence(combat: any): Promise {\n if (!(await ensureGmControl())) return;\n\n await setImpulseState(combat, { currentImpulse: 1, queue: [] });\n\n for (const combatant of combat.combatants) {\n await combatant.update({\n [`flags.${SYSTEM_ID}.pendingEventId`]: null,\n [`flags.${SYSTEM_ID}.pendingKind`]: \"\",\n [`flags.${SYSTEM_ID}.aimState`]: {\n active: false,\n targetId: null,\n sinceImpulse: null\n },\n [`flags.${SYSTEM_ID}.actionRanking`]: actionRankingFromDex(getDexForCombatant(combatant)),\n [`flags.${SYSTEM_ID}.effectiveActionRanking`]: null,\n [`flags.${SYSTEM_ID}.impulseModifier`]: 0\n });\n }\n refreshImpulseOverlays(combat);\n}\n\nfunction renderImpulsePanel(app: any, htmlLike: JQuery | HTMLElement): void {\n const html = \"find\" in (htmlLike as any) ? (htmlLike as JQuery) : $(htmlLike);\n if (!html?.length) return;\n html.addClass(\"ringworld-impulse-mode ringworld-impulse-only\");\n\n const combat = app?.viewed ?? game.combat;\n if (!combat) return;\n\n const state = getImpulseState(combat);\n const queue = sortQueueByCompletion(pruneQueueToCombatants(state.queue, combat), combat);\n if (queue.length !== state.queue.length) {\n void setImpulseState(combat, { currentImpulse: state.currentImpulse, queue });\n }\n\n html\n .find(\n \".token-initiative, .combatant-initiative, .initiative, [data-action='rollInitiative'], [data-control='rollInitiative'], .combatant .fa-dice-d20\"\n )\n .addClass(\"rw-hide-initiative\");\n\n html.find(\".ringworld-impulse-panel\").remove();\n\n const disabled = game.user?.isGM ? \"\" : \"disabled\";\n const rows = combat.combatants.map((combatant: any) => {\n const ar = getCombatantActionRanking(combatant);\n const encPenalty = getEncumbranceArPenalty(combatant);\n const impMod = num(combatant.flags?.[SYSTEM_ID]?.impulseModifier, 0);\n const effAr = Math.max(1, ar + encPenalty);\n const dex = getDexForCombatant(combatant);\n const pending = queue.find((event) => event.combatantId === combatant.id);\n const pendingLabel = pending\n ? `${actionKindLabel(pending.kind)} @ ${pending.completeImpulse}`\n : \"Ready\";\n const aimState = combatant.flags?.[SYSTEM_ID]?.aimState;\n const aimLabel = aimState?.active ? `Aiming since ${aimState.sinceImpulse}` : \"Not aiming\";\n\n const options = MAJOR_ACTION_OPTIONS.map((opt) => {\n const selected = pending?.major && pending?.kind === opt.value ? \"selected\" : \"\";\n return ``;\n }).join(\"\");\n const minorOptions = MINOR_ACTION_OPTIONS.map((opt) => {\n const selected = !pending?.major && pending?.kind === opt.value ? \"selected\" : \"\";\n return ``;\n }).join(\"\");\n\n return `\n
\n
\n ${esc(combatant.name)}\n DEX ${dex} | AR ${ar} + Enc ${encPenalty} = ${effAr} | Imp Mod ${impMod >= 0 ? `+${impMod}` : impMod} | ${esc(pendingLabel)} | ${esc(aimLabel)}\n
\n
\n \n \n \n \n \n \n \n
\n
\n `;\n }).join(\"\");\n\n const panel = $(`\n
\n
\n
Impulse ${state.currentImpulse}
\n
Queued: ${queue.length}
\n
\n \n \n \n
\n
\n
${rows}
\n
\n `);\n\n html.prepend(panel);\n\n // Hide all native combat tracker blocks so only Ringworld impulse UI is shown.\n const root = html.get(0);\n if (root) {\n for (const child of Array.from(root.children)) {\n if (!(child as HTMLElement).classList.contains(\"ringworld-impulse-panel\")) {\n (child as HTMLElement).classList.add(\"rw-hide-core-tracker\");\n }\n }\n }\n\n panel.find(\".rw-advance-next\").on(\"click\", async (event) => {\n event.preventDefault();\n await advanceImpulse(combat, \"next\");\n });\n\n panel.find(\".rw-advance-step\").on(\"click\", async (event) => {\n event.preventDefault();\n await advanceImpulse(combat, \"step\");\n });\n\n panel.find(\".rw-reset-sequence\").on(\"click\", async (event) => {\n event.preventDefault();\n await resetImpulseSequence(combat);\n });\n\n panel.find(\".rw-major-start\").on(\"click\", async (event) => {\n event.preventDefault();\n const row = (event.currentTarget as HTMLElement).closest(\".rw-imp-row\");\n if (!row) return;\n const combatantId = String(row.getAttribute(\"data-combatant-id\") || \"\");\n const select = row.querySelector(\".rw-major-kind\") as HTMLSelectElement | null;\n const kind = String(select?.value || \"draw\") as MajorActionKind;\n await scheduleAction(combat, combatantId, kind, true);\n });\n\n panel.find(\".rw-minor-start\").on(\"click\", async (event) => {\n event.preventDefault();\n const row = (event.currentTarget as HTMLElement).closest(\".rw-imp-row\");\n if (!row) return;\n const combatantId = String(row.getAttribute(\"data-combatant-id\") || \"\");\n const select = row.querySelector(\".rw-minor-kind\") as HTMLSelectElement | null;\n const kind = String(select?.value || \"minorCustom\") as MinorActionKind;\n await scheduleAction(combat, combatantId, kind, false);\n });\n\n panel.find(\".rw-cancel-start\").on(\"click\", async (event) => {\n event.preventDefault();\n const row = (event.currentTarget as HTMLElement).closest(\".rw-imp-row\");\n if (!row) return;\n const combatantId = String(row.getAttribute(\"data-combatant-id\") || \"\");\n await cancelAction(combat, combatantId);\n });\n\n panel.find(\".rw-save-mods\").on(\"click\", async (event) => {\n event.preventDefault();\n if (!(await ensureGmControl())) return;\n const row = (event.currentTarget as HTMLElement).closest(\".rw-imp-row\");\n if (!row) return;\n const combatantId = String(row.getAttribute(\"data-combatant-id\") || \"\");\n const combatant = combat.combatants.get(combatantId);\n if (!combatant) return;\n\n const impModInput = row.querySelector(\".rw-imp-mod\") as HTMLInputElement | null;\n const impMod = Math.trunc(num(impModInput?.value, 0));\n await combatant.update({\n [`flags.${SYSTEM_ID}.impulseModifier`]: impMod\n });\n });\n\n refreshImpulseOverlays(combat);\n}\n\nexport function initializeImpulseTracker(): void {\n Hooks.on(\"renderCombatTracker\", (app: any, htmlLike: JQuery | HTMLElement) => {\n renderImpulsePanel(app, htmlLike);\n });\n\n Hooks.on(\"createCombat\", async (combat: any) => {\n await setImpulseState(combat, { currentImpulse: 1, queue: [] });\n refreshImpulseOverlays(combat);\n });\n\n Hooks.on(\"createCombatant\", async (combatant: any) => {\n await syncCombatantActionRanking(combatant);\n refreshImpulseOverlays(game.combat ?? null);\n });\n\n Hooks.on(\"deleteCombatant\", async () => {\n refreshImpulseOverlays(game.combat ?? null);\n });\n\n Hooks.on(\"updateCombat\", (combat: any) => {\n refreshImpulseOverlays(combat ?? game.combat ?? null);\n });\n\n Hooks.on(\"deleteCombat\", () => {\n refreshImpulseOverlays(null);\n });\n\n Hooks.on(\"renderChatLog\", () => {\n refreshImpulseOverlays(game.combat ?? null);\n });\n\n Hooks.on(\"canvasReady\", () => {\n refreshImpulseOverlays(game.combat ?? null);\n });\n\n Hooks.on(\"updateActor\", (actor: any) => {\n const combat = game.combat;\n if (!combat) return;\n const inCombat = combat.combatants.some((c: any) => c.actor?.id === actor.id);\n if (inCombat) {\n ui.combat?.render(true);\n refreshImpulseOverlays(combat);\n }\n });\n\n Hooks.on(\"updateItem\", (item: any) => {\n const actor = item?.parent;\n if (!actor) return;\n const combat = game.combat;\n if (!combat) return;\n const inCombat = combat.combatants.some((c: any) => c.actor?.id === actor.id);\n if (inCombat) {\n ui.combat?.render(true);\n refreshImpulseOverlays(combat);\n }\n });\n}\n","import \"./styles/ringworld.scss\";\n\nimport { RingworldActor } from \"./module/actor/RingworldActor\";\nimport { RingworldItem } from \"./module/item/RingworldItem\";\nimport { RingworldExplorerSheet } from \"./module/sheets/actors/ExplorerSheet\";\nimport { RingworldCreatureSheet } from \"./module/sheets/actors/CreatureSheet\";\nimport { RingworldVehicleSheet } from \"./module/sheets/actors/VehicleSheet\";\nimport { RingworldSkillSheet } from \"./module/sheets/items/SkillSheet\";\nimport { RingworldWeaponSheet } from \"./module/sheets/items/WeaponSheet\";\nimport { RingworldArmorSheet } from \"./module/sheets/items/ArmorSheet\";\nimport { RingworldGearSheet } from \"./module/sheets/items/GearSheet\";\nimport { RingworldSpeciesSheet } from \"./module/sheets/items/SpeciesSheet\";\nimport { RingworldPursuitSheet } from \"./module/sheets/items/PursuitSheet\";\nimport { HIT_LOCATION_TABLE } from \"./module/constants\";\nimport { createRandomExplorer } from \"./module/character-tools\";\nimport { RINGWORLD_CATALOG_VERSION, seedWorldCatalog } from \"./module/world-catalog\";\nimport { initializeImpulseTracker } from \"./module/impulse-tracker\";\nimport { DEFAULT_SKILL_ICON, baseSkillByName, resolveSkillIcon } from \"./module/skill-icons\";\n\nconst ENCUMBRANCE_DATA_MIGRATION_VERSION = 2;\nconst HP_DATA_MIGRATION_VERSION = 1;\n\n// Under the pre-0.5 HP logic, any actor whose stored HP value was >= its stale\n// stored max displayed as full (the value was healed to max on every prepare).\n// Migrate those stored values to null (\"never set\" = derived full) so the new\n// source-authoritative HP logic preserves what tables actually saw.\nasync function migrateActorHpData(): Promise {\n if (!game.user?.isGM) return 0;\n let touched = 0;\n\n const buildActorPatch = (sourceSystem: any): Record | null => {\n const patch: Record = {};\n const gv = sourceSystem?.generalHp?.value;\n const gm = sourceSystem?.generalHp?.max;\n if (gv !== null && gv !== undefined && Number(gv) >= Number(gm ?? 0)) {\n patch[\"system.generalHp.value\"] = null;\n }\n for (const [slug, loc] of Object.entries(sourceSystem?.hitLocations ?? {})) {\n const lv = loc?.hp?.value;\n const lm = loc?.hp?.max;\n if (lv === null || lv === undefined) continue;\n if (Number(lv) >= Number(lm ?? 0) || (Number(lm ?? 0) <= 1 && Number(lv) <= 1)) {\n patch[`system.hitLocations.${slug}.hp.value`] = null;\n }\n }\n return Object.keys(patch).length ? patch : null;\n };\n\n for (const actor of game.actors ?? []) {\n if ((actor as any).type !== \"explorer\" && (actor as any).type !== \"creature\") continue;\n const patch = buildActorPatch((actor as any)._source?.system ?? {});\n if (patch) {\n await actor.update(patch);\n touched += 1;\n }\n }\n\n return touched;\n}\n\nfunction normName(value: unknown): string {\n return String(value ?? \"\").trim().toLowerCase();\n}\n\nfunction worldItemWeightMap(): Map {\n const map = new Map();\n for (const item of game.items ?? []) {\n if (item.type !== \"weapon\" && item.type !== \"armor\" && item.type !== \"gear\") continue;\n const key = `${item.type}:${normName(item.name)}`;\n map.set(key, Number((item as any).system?.weight ?? 0) || 0);\n }\n return map;\n}\n\nasync function migrateActorItemEncumbranceData(): Promise {\n if (!game.user?.isGM) return 0;\n const weightMap = worldItemWeightMap();\n let touched = 0;\n\n for (const actor of game.actors ?? []) {\n const updates: any[] = [];\n\n for (const item of actor.items ?? []) {\n if (item.type !== \"weapon\" && item.type !== \"armor\" && item.type !== \"gear\") continue;\n const patch: Record = { _id: item.id };\n let changed = false;\n\n if ((item as any).system?.equipped === undefined) {\n patch[\"system.equipped\"] = true;\n changed = true;\n }\n\n if ((item as any).system?.weight === undefined) {\n const key = `${item.type}:${normName(item.name)}`;\n patch[\"system.weight\"] = Number(weightMap.get(key) ?? 0);\n changed = true;\n }\n\n if ((item as any).system?.stowed === undefined) {\n patch[\"system.stowed\"] = false;\n changed = true;\n }\n\n if (changed) {\n updates.push(patch);\n }\n }\n\n if (updates.length) {\n await actor.updateEmbeddedDocuments(\"Item\", updates);\n touched += updates.length;\n }\n }\n\n return touched;\n}\n\nfunction injectDirectoryButton(htmlLike: JQuery | HTMLElement | null | undefined, className: string, label: string, onClick: () => Promise | void): void {\n if (!htmlLike) return;\n const html = \"find\" in (htmlLike as any) ? (htmlLike as JQuery) : $(htmlLike);\n if (!html.length || html.find(`.${className}`).length) return;\n\n const button = $(``);\n button.on(\"click\", async () => {\n await onClick();\n });\n\n const containers = [\n html.find(\".directory-footer\"),\n html.find(\"footer.directory-footer\"),\n html.find(\"footer\"),\n html.find(\".footer-actions\"),\n html.find(\".header-actions\"),\n html.find(\".action-buttons\")\n ];\n\n const container = containers.find((candidate) => candidate.length);\n if (container) {\n container.first().append(button);\n return;\n }\n\n let fallback = html.find(\".ringworld-directory-controls\");\n if (!fallback.length) {\n fallback = $('
');\n html.append(fallback);\n }\n fallback.first().append(button);\n}\n\nasync function handleSeedCatalogClick(): Promise {\n await seedWorldCatalog({ notify: true });\n}\n\nasync function handleCreateRandomExplorerClick(): Promise {\n const actor = await createRandomExplorer();\n actor?.sheet?.render(true);\n}\n\nfunction ensureSidebarDirectoryButtons(): void {\n if (!game.user?.isGM) return;\n\n const itemElement = (ui as any).items?.element;\n injectDirectoryButton(itemElement, \"ringworld-seed-items\", \"Seed Ringworld Items\", handleSeedCatalogClick);\n\n const actorElement = (ui as any).actors?.element;\n injectDirectoryButton(actorElement, \"ringworld-random-actor\", \"Create Random Explorer\", handleCreateRandomExplorerClick);\n}\n\nfunction itemTypeAvailable(type: string): boolean {\n const directTypes = (getDocumentClass(\"Item\") as any)?.TYPES;\n if (Array.isArray(directTypes)) return directTypes.includes(type);\n\n const docTypes = (game as any)?.system?.documentTypes?.Item;\n if (Array.isArray(docTypes)) return docTypes.includes(type);\n if (docTypes && typeof docTypes === \"object\") return Object.prototype.hasOwnProperty.call(docTypes, type);\n\n const configModels = (CONFIG as any)?.Item?.dataModels;\n if (configModels && typeof configModels === \"object\" && Object.prototype.hasOwnProperty.call(configModels, type)) {\n return true;\n }\n return false;\n}\n\nHooks.once(\"init\", async () => {\n console.log(\"ringworld | Initializing Ringworld system\");\n initializeImpulseTracker();\n\n const ActorRegistry = (foundry as any)?.documents?.collections?.Actors;\n const ItemRegistry = (foundry as any)?.documents?.collections?.Items;\n const BaseActorSheet = (foundry as any)?.appv1?.sheets?.ActorSheet;\n const BaseItemSheet = (foundry as any)?.appv1?.sheets?.ItemSheet;\n\n (CONFIG as any).ringworld = {\n hitLocations: HIT_LOCATION_TABLE\n };\n CONFIG.Combat.initiative = foundry.utils.mergeObject(CONFIG.Combat.initiative ?? {}, {\n formula: \"1d100\",\n decimals: 0\n }, { inplace: false });\n\n CONFIG.Actor.documentClass = RingworldActor as any;\n CONFIG.Item.documentClass = RingworldItem as any;\n\n if (!ActorRegistry || !ItemRegistry || !BaseActorSheet || !BaseItemSheet) {\n console.error(\"ringworld | Foundry sheet registries were not available during init.\");\n return;\n }\n\n ActorRegistry.unregisterSheet(\"core\", BaseActorSheet);\n ActorRegistry.registerSheet(\"ringworld\", RingworldExplorerSheet as any, {\n types: [\"explorer\"],\n makeDefault: true\n });\n ActorRegistry.registerSheet(\"ringworld\", RingworldCreatureSheet as any, {\n types: [\"creature\"],\n makeDefault: true\n });\n ActorRegistry.registerSheet(\"ringworld\", RingworldVehicleSheet as any, {\n types: [\"vehicle\"],\n makeDefault: true\n });\n\n ItemRegistry.unregisterSheet(\"core\", BaseItemSheet);\n ItemRegistry.registerSheet(\"ringworld\", RingworldSkillSheet as any, {\n types: [\"skill\"],\n makeDefault: true\n });\n ItemRegistry.registerSheet(\"ringworld\", RingworldWeaponSheet as any, {\n types: [\"weapon\"],\n makeDefault: true\n });\n ItemRegistry.registerSheet(\"ringworld\", RingworldArmorSheet as any, {\n types: [\"armor\"],\n makeDefault: true\n });\n ItemRegistry.registerSheet(\"ringworld\", RingworldGearSheet as any, {\n types: [\"gear\"],\n makeDefault: true\n });\n ItemRegistry.registerSheet(\"ringworld\", RingworldSpeciesSheet as any, {\n types: [\"species\"],\n makeDefault: true\n });\n if (itemTypeAvailable(\"pursuit\")) {\n ItemRegistry.registerSheet(\"ringworld\", RingworldPursuitSheet as any, {\n types: [\"pursuit\"],\n makeDefault: true\n });\n }\n\n game.settings.register(\"ringworld\", \"catalogSeedVersion\", {\n scope: \"world\",\n config: false,\n type: Number,\n default: 0\n });\n game.settings.register(\"ringworld\", \"encumbranceDataMigrationVersion\", {\n scope: \"world\",\n config: false,\n type: Number,\n default: 0\n });\n game.settings.register(\"ringworld\", \"hpDataMigrationVersion\", {\n scope: \"world\",\n config: false,\n type: Number,\n default: 0\n });\n game.settings.register(\"ringworld\", \"automateSpecialDamage\", {\n name: \"Automate Special Success Damage\",\n hint: \"When an attack is a Special Success, roll the weapon damage dice twice and sum them.\",\n scope: \"world\",\n config: true,\n type: Boolean,\n default: true\n });\n game.settings.register(\"ringworld\", \"promptDefenderDodge\", {\n name: \"Prompt Defender Dodge\",\n hint: \"After a successful attack on a target, offer a Dodge roll before damage is applied. A successful dodge evades a normal hit; only a special dodge evades a special hit.\",\n scope: \"world\",\n config: true,\n type: Boolean,\n default: true\n });\n\n Handlebars.registerHelper(\"eq\", (a: unknown, b: unknown) => a === b);\n Handlebars.registerHelper(\"or\", (a: unknown, b: unknown) => Boolean(a || b));\n});\n\nHooks.once(\"ready\", async () => {\n const path = \"systems/ringworld/resources/hit-locations/humanoid.json\";\n try {\n const response = await fetch(path);\n if (response.ok) {\n const table = await response.json();\n (CONFIG as any).ringworld.hitLocations = table.entries ?? HIT_LOCATION_TABLE;\n }\n } catch (_error) {\n console.warn(`ringworld | Could not load ${path}, using built-in table`);\n }\n\n if (game.user?.isGM) {\n for (const combat of game.combats ?? []) {\n const formula = String(combat?.settings?.initiative?.formula ?? \"\").trim();\n if (!formula || formula.toLowerCase() === \"undefined\") {\n await combat.update({\n \"settings.initiative.formula\": \"1d100\",\n \"settings.initiative.decimals\": 0\n });\n }\n }\n\n const seededVersion = Number(game.settings.get(\"ringworld\", \"catalogSeedVersion\") ?? 0);\n if (seededVersion < RINGWORLD_CATALOG_VERSION) {\n const result = await seedWorldCatalog({ notify: true });\n if (result.added >= 0) {\n await game.settings.set(\"ringworld\", \"catalogSeedVersion\", RINGWORLD_CATALOG_VERSION);\n }\n }\n\n const migratedVersion = Number(game.settings.get(\"ringworld\", \"encumbranceDataMigrationVersion\") ?? 0);\n if (migratedVersion < ENCUMBRANCE_DATA_MIGRATION_VERSION) {\n const touched = await migrateActorItemEncumbranceData();\n await game.settings.set(\"ringworld\", \"encumbranceDataMigrationVersion\", ENCUMBRANCE_DATA_MIGRATION_VERSION);\n if (touched > 0) {\n ui.notifications?.info(`Ringworld encumbrance migration updated ${touched} actor items.`);\n }\n }\n\n const hpMigratedVersion = Number(game.settings.get(\"ringworld\", \"hpDataMigrationVersion\") ?? 0);\n if (hpMigratedVersion < HP_DATA_MIGRATION_VERSION) {\n const touched = await migrateActorHpData();\n await game.settings.set(\"ringworld\", \"hpDataMigrationVersion\", HP_DATA_MIGRATION_VERSION);\n if (touched > 0) {\n ui.notifications?.info(`Ringworld HP migration updated ${touched} actors.`);\n }\n }\n }\n\n ensureSidebarDirectoryButtons();\n window.setTimeout(() => ensureSidebarDirectoryButtons(), 300);\n\n (game as any).ringworld = {\n ...((game as any).ringworld ?? {}),\n seedWorldCatalog: async (options?: { notify?: boolean }) => seedWorldCatalog(options),\n createRandomExplorer: async () => createRandomExplorer(),\n catalogVersion: RINGWORLD_CATALOG_VERSION,\n systemId: \"ringworld\",\n systemVersion: String(game.system?.version ?? \"0.0.0\")\n };\n Hooks.callAll(\"ringworldReady\", (game as any).ringworld);\n});\n\nHooks.on(\"createActor\", async (actor: any, _options: any, userId: string) => {\n if (!game.user?.isGM) return;\n if (userId !== game.user.id) return;\n if (!actor || (actor.type !== \"explorer\" && actor.type !== \"creature\")) return;\n\n try {\n const added = await actor.ensureBaseSkills?.();\n if (Number(added) > 0) {\n console.log(`ringworld | Added ${added} base skills to ${actor.name}`);\n }\n } catch (error) {\n console.error(\"ringworld | Failed to auto-populate base skills\", error);\n }\n});\n\nHooks.on(\"preCreateItem\", (item: any) => {\n if (item.type !== \"skill\") return;\n\n const updates: Record = {};\n const name = String(item.name || \"Skill\");\n const currentImg = String(item.img || \"\");\n updates.img = resolveSkillIcon(name, currentImg);\n\n const base = baseSkillByName(name);\n const currentSystem = (item as any).system ?? {};\n const currentValue = Number(currentSystem?.value ?? NaN);\n const currentCategory = String(currentSystem?.category ?? \"\").trim();\n\n updates.system = {\n value: Number.isFinite(currentValue) ? currentValue : (base?.base ?? 0),\n category: currentCategory || (base?.category ?? \"Technical\"),\n specialization: String(currentSystem?.specialization ?? base?.specialization ?? \"\")\n };\n\n if (!updates.img) updates.img = DEFAULT_SKILL_ICON;\n item.updateSource(updates);\n});\n\nHooks.on(\"renderItemDirectory\", (_app: any, html: JQuery) => {\n if (!game.user?.isGM) return;\n injectDirectoryButton(html, \"ringworld-seed-items\", \"Seed Ringworld Items\", handleSeedCatalogClick);\n ensureSidebarDirectoryButtons();\n});\n\nHooks.on(\"renderActorDirectory\", (_app: any, html: JQuery) => {\n if (!game.user?.isGM) return;\n injectDirectoryButton(html, \"ringworld-random-actor\", \"Create Random Explorer\", handleCreateRandomExplorerClick);\n ensureSidebarDirectoryButtons();\n});\n\nHooks.on(\"renderSidebar\", () => {\n ensureSidebarDirectoryButtons();\n});\n\nHooks.on(\"changeSidebarTab\", (app: any) => {\n const tabName = String(app?.tabName ?? app?.id ?? app?.options?.id ?? \"\");\n if (tabName === \"items\" || tabName === \"actors\") {\n ensureSidebarDirectoryButtons();\n }\n});\n"],"names":["showDiceSoNice","roll","dice3d","evaluateRollWithDice","formula","rollPercentile","target","classifyPercentile","cleanTarget","specialThreshold","fumbleThreshold","isSuccess","isSpecial","isFumble","outcome","outcomeLabel","SYSTEM_ID","HIT_LOCATION_TABLE","LIMB_LOCATIONS","LEG_LOCATIONS","isLimb","slug","normalize","value","withFactors","entries","hpFactors","entry","HUMANOID_SCHEMA","DOLPHIN_SCHEMA","PUPPETEER_SCHEMA","TRINOC_SCHEMA","BANDERSNATCHI_SCHEMA","KZINTI_SCHEMA","HIT_LOCATION_SCHEMAS","listHitLocationSchemas","inferHitLocationSchemaId","speciesValue","species","getHitLocationSchemaById","schemaId","key","getActorHitLocationSchema","actor","_a","_b","_c","mode","getTableForActor","getHitLocationFromRollForTable","table","rollHitLocation","total","chooseOrRollHitLocation","schema","entriesBySlug","labelFor","fallback","html","result","resolve","settled","done","dlgHtml","picker","event","button","location","rolled","loc","BASE_SKILL_CATEGORIES","RINGWORLD_BASE_SKILLS","normalizeSkillName","name","baseSkillNameSet","skill","DEFAULT_SKILL_ICON","iconSlug","skillIconPath","baseSkillByName","resolveSkillIcon","currentImg","img","createChatMessage","options","speaker","postSkillRollCard","data","payload","content","postAttackCard","num","n","getSingleTargetActor","targets","rollStandaloneHitLocation","rollSkillForActor","skillName","skillItem","item","resolveLinkedSkill","weapon","skillId","byId","linkedSkillName","byName","clampPercentTarget","promptAttackModifiers","attacker","baseSkillTarget","isRanged","defaultAim","safeActorName","safeWeaponName","safeActorImg","safeWeaponImg","_d","_e","_f","_g","root","query","aimModeRaw","aimMode","aimMultiplier","coverMod","movementMod","rangeMod","situationalMod","customMod","customLabel","flatModifierTotal","preAimTarget","adjustedByAim","finalTarget","parts","aimLabel","consumeWeaponAmmo","cost","current","next","reloadWeapon","max","consumeWeaponEnergy","packId","pack","getItemArmorAtLocation","specific","getTotalArmorAtLocation","targetActor","locArmor","stackedItemsArmor","sum","buildConditionUpdates","locationValue","locationMax","generalHp","syncCoreStatusEffects","conditions","toggler","applyLocationDamage","rawDamage","currentLoc","locMax","armor","finalDamage","unclampedLoc","nextLoc","nextGeneral","updates","promptCharacteristicCheck","characterKey","label","base","multiplier","selected","safeMultiplier","getWorldSetting","promptDefenderDodge","attackWasSpecial","dodgeTarget","safeName","negated","useWeaponWorkflow","hasTarget","targetName","linkedSkill","modifierResult","ammo","energy","attack","remainingGeneralHp","dodge","hitSelection","damageFormula","automateSpecial","rollSpecialDamage","damageRoll","bonusRoll","application","recomputeHitPointMaximums","_h","_i","con","mas","generalMax","source","sourceGeneralValue","hpFactor","sourceLocValue","JOURNAL_NAME","buildPages","seedGmReference","journals","pages","page","index","RINGWORLD_CATALOG_VERSION","ICONS","speciesIconPath","weaponIconPath","armorIconPath","gearIconPath","pursuitIconPath","allCoverage","torsoCoverage","headCoverage","armCoverage","legCoverage","SPECIES_CATALOG","WEAPON_CATALOG","ARMOR_CATALOG","GEAR_CATALOG","PURSUIT_CATALOG","speciesCatalogForGeneration","itemKey","type","itemTypeAvailable","directTypes","docTypes","configModels","gameModels","toSkillItem","toSpeciesItem","toWeaponItem","folderKey","toArmorItem","toGearItem","toPursuitItem","pursuitAsGearNotes","fixed","optional","group","optionalText","toPursuitFallbackGearItem","itemName","getOrCreateItemFolder","parentId","existing","folder","ensureCatalogFolders","skills","pursuits","gear","weapons","weaponMelee","weaponRanged","buildAllSeeds","canUsePursuitType","seedWorldCatalog","folderIds","seeds","createPayload","updatePayload","seed","folderId","existingItem","update","existingSystem","mergedSystem","systemDiff","addedReference","referenceNote","getPlayableSpeciesFromWorld","clampScore","rollTotal","rollEdu","edu","die","rollByGravity","gravity","gravityFormulas","randomPick","arr","randomExplorerName","speciesName","starts","ends","applySpeciesModifiers","speciesSystem","mods","rollCharacteristicsForActor","gravityType","currentSpeciesName","speciesItem","builtIn","finalValues","ownLanguage","applyStarterKit","starterNames","worldItems","actorExisting","worldItem","randomizeExplorerActor","worldSpecies","builtInSpecies","pickedWorldSpecies","pickedBuiltInSpecies","speciesChoice","homeworld","createRandomExplorer","SPECIES_MODIFIER_KEYS","clampCharacteristic","computeDamageMod","str","computeDerivedRolls","characteristics","int","pow","dex","computeRootMaxes","app","computeActionRanking","gravityLoadMultiplier","contributesToEncumbrance","itemWeightKg","computeEncumbrance","system","items","gravityMultiplier","equippedLoadKg","rawLoadKg","effectiveLoadKg","limitKg","overLimitKg","actionRankingPenalty","overLimit","baseMove","baseRun","RingworldActor","profile","derivedRollDefaults","rootMaxDefaults","encumbrance","weaponId","toCreate","speciesData","incomingMods","appliedState","previousMods","currentCharacteristics","currentProfile","normalizedMods","prev","agePrev","ageNext","chronoCurrent","physCurrent","labels","defaults","RingworldItem","BaseActorSheet","ROOT_KEY_BY_CATEGORY","ROOT_FORMULA_BY_CATEGORY","EXCLUDED_EDUCATION_SKILLS","HYPERDRIVE_KEY","a","b","toInt","normalizeAllocation","raw","normalizePursuitSelection","years","normalizeBuilderState","allocations","allocation","normalized","baseBySkillId","isEducationEligible","isSpecialEligible","buildPursuitAllowedSkillSet","entriesByName","allowed","pursuit","computeBuilderPools","age","educationTotal","pursuitYearsTotal","pursuitsTotal","specialTotal","buildBuilderContext","pools","state","pursuitOptions","pursuitAllowedSkills","bySkillId","educationSpent","pursuitsSpent","specialSpent","totalAllocated","baseFromState","baseFromDefinition","inferredBase","baseValue","rootKey","rootCap","maxAllocation","normalizedSkillName","allowsEducation","allowsPursuits","allowsSpecial","pursuitYearsAllocated","row","fromItems","getPreparedHitLocation","rollRange","locationConfig","hp","rawLabel","chooseRandom","RingworldExplorerSheet","_j","_k","_l","_m","_n","_o","_p","builderContext","armors","speciesOptions","baseSet","skillByNormalized","skillRootMax","skillsByCategory","category","rows","meta","customSkills","missingBaseSkillsCount","rangesFromSchema","hitLocations","bodyLocations","enc","encRaw","encEffective","encLimit","encPenalty","baseActionRanking","effectiveActionRanking","encumbranceSummary","movementSummary","fromBase","trimmed","cleanYears","context","nextState","existingIndex","totalYears","desiredCount","available","i","idx","remainingYears","seededState","freshContext","totalBySkill","maxForSkill","allocatePool","points","poolKey","eligible","remaining","guard","candidates","picked","educationUnspent","pursuitsUnspent","specialUnspent","maxEducation","maxPursuits","maxSpecial","maxByCap","form","requestedTotal","doc","li","nextEquipped","nextStowed","added","specialization","itemData","speciesItems","createItems","names","patched","itemArmorAtLocation","RingworldCreatureSheet","baseArmor","itemArmor","FilePickerImpl","path","RingworldVehicleSheet","BaseItemSheet","RingworldSkillSheet","RingworldWeaponSheet","RingworldArmorSheet","RingworldGearSheet","RingworldSpeciesSheet","asArray","RingworldPursuitSheet","fixedSkills","optionalGroups","IMPULSE_FLAG","IMPULSE_HUD_POS_KEY","MAJOR_ACTION_OPTIONS","MINOR_ACTION_OPTIONS","esc","actionRankingFromDex","actionKindLabel","kind","getDexForCombatant","combatant","getCombatantActionRanking","fromFlag","getEncumbranceArPenalty","fromActor","syncCombatantActionRanking","ranking","getImpulseState","combat","queue","setImpulseState","sortQueueByCompletion","aDex","pruneQueueToCombatants","validIds","c","loadHudPosition","parsed","left","top","saveHudPosition","position","clearHudPosition","clampHudPosition","element","width","height","maxLeft","maxTop","applyHudAbsolutePosition","hud","el","clamped","makeHudDraggable","handle","saved","dragging","startX","startY","startLeft","startTop","mouseEvent","rect","moveEvent","evt","deltaX","deltaY","latestRect","getQueueWithNames","renderQueueRowsMarkup","limit","attachOverlayControls","disabled","advanceImpulse","resetImpulseSequence","renderChatImpulseMarker","chatEl","marker","renderFloatingImpulseHud","refreshImpulseOverlays","ensureGmControl","scheduleAction","combatantId","major","currentImpulse","actionRanking","impulseMod","effectiveAr","duration","completeImpulse","queueWithoutCombatant","timingLabel","cancelAction","nextQueue","resolveActionEvent","impulse","targetImpulse","completing","ordered","renderImpulsePanel","htmlLike","ar","impMod","effAr","pending","pendingLabel","aimState","opt","minorOptions","panel","child","select","impModInput","initializeImpulseTracker","ENCUMBRANCE_DATA_MIGRATION_VERSION","HP_DATA_MIGRATION_VERSION","migrateActorHpData","touched","buildActorPatch","sourceSystem","patch","gv","gm","lv","lm","normName","worldItemWeightMap","map","migrateActorItemEncumbranceData","weightMap","changed","injectDirectoryButton","className","onClick","container","candidate","handleSeedCatalogClick","handleCreateRandomExplorerClick","ensureSidebarDirectoryButtons","itemElement","actorElement","ActorRegistry","ItemRegistry","response","_options","userId","error","currentSystem","currentValue","currentCategory","_app","tabName"],"mappings":"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"}