Files
Ringworld/module/ringworld.mjs.map
T
tevansandClaude Fable 5 6b63a95dc2 Ringworld 0.5.0: v13/v14 compatibility, Ringworld '84 theme, combat automation
- Foundry v13/v14 compatibility (verified on 14.364)
- Complete "Ringworld '84" retheme: CSS custom properties, warm
  space-black + bronze + ring-arc amber palette, uniform across sheets,
  dialogs, chat cards, hit-location picker, and impulse HUD
- Fix HP damage evaporating on re-prepare: maximums always derived,
  current values source-authoritative, with a one-time world migration
- Ammunition tracking: per-attack consumption, reload button, ammo
  badge; empty weapons block attacks
- Energy weapons auto-link a carried power pack instead of failing
- Special Success rolls damage dice twice; fumbles flag GM adjudication
  (both toggleable world settings)
- Defender Dodge prompt before damage (special hits need special dodge)
- Damage Mod and derived rolls always recompute; shown read-only
- Creature sheet rebuilt to full parity: characteristics, derived
  rolls, body-schema hit grid with AP totals, weapons/armor/skills
- Seeded "Ringworld GM Reference" journal (outcomes, impulses, attack
  workflow, wounds, 1984 quirks, quick start)
- Shared characteristic-check dialog between explorer and creature

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 23:41:33 +01:00

1 line
336 KiB
Plaintext

{"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<void> {\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<Roll> {\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<PercentileResult> {\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<Record<HitLocationSlug, number>>): 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<HitLocationSchemaId, HitLocationSchema> = {\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<HitLocationRollResult> {\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 <form class=\"ringworld-hit-picker schema-${schema.id}\">\n <input type=\"hidden\" name=\"location\" value=\"random\" />\n <div class=\"rw-hit-picker-top\">\n <button type=\"button\" class=\"rw-hit-picker-choice active\" data-location=\"random\">\n Roll Random (1d20)\n </button>\n </div>\n <div class=\"rw-hit-picker-body\">\n <button type=\"button\" class=\"rw-hit-picker-choice rw-loc-head\" data-location=\"head\">${labelFor(\"head\", \"Head\")}</button>\n <button type=\"button\" class=\"rw-hit-picker-choice rw-loc-l-arm\" data-location=\"lArm\">${labelFor(\"lArm\", \"Left Arm\")}</button>\n <button type=\"button\" class=\"rw-hit-picker-choice rw-loc-chest\" data-location=\"chest\">${labelFor(\"chest\", \"Chest\")}</button>\n <button type=\"button\" class=\"rw-hit-picker-choice rw-loc-r-arm\" data-location=\"rArm\">${labelFor(\"rArm\", \"Right Arm\")}</button>\n <button type=\"button\" class=\"rw-hit-picker-choice rw-loc-abdomen\" data-location=\"abdomen\">${labelFor(\"abdomen\", \"Abdomen\")}</button>\n <button type=\"button\" class=\"rw-hit-picker-choice rw-loc-l-leg\" data-location=\"lLeg\">${labelFor(\"lLeg\", \"Left Leg\")}</button>\n <button type=\"button\" class=\"rw-hit-picker-choice rw-loc-r-leg\" data-location=\"rLeg\">${labelFor(\"rLeg\", \"Right Leg\")}</button>\n </div>\n </form>\n `;\n\n const result = await new Promise<string | null>((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<BaseSkillDef[\"category\"]> = [\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<string> {\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<void> {\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<void> {\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<void> {\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<void> {\n const result = await rollHitLocation(actor);\n const speaker = actor ? ChatMessage.getSpeaker({ actor }) : ChatMessage.getSpeaker();\n const content = `\n <div class=\"ringworld-chat-card\">\n <h3>Hit Location</h3>\n <p><strong>Roll:</strong> ${result.roll}</p>\n <p><strong>Location:</strong> ${result.location.label}</p>\n </div>\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<void> {\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<AttackRollModifierResult | null> {\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 <form class=\"ringworld-attack-modifiers\">\n <header class=\"rw-attack-dialog-head\">\n <img class=\"rw-attack-dialog-avatar\" src=\"${safeActorImg}\" alt=\"${safeActorName}\" />\n <img class=\"rw-attack-dialog-weapon\" src=\"${safeWeaponImg}\" alt=\"${safeWeaponName}\" />\n <div class=\"rw-attack-dialog-title-block\">\n <h3>${safeWeaponName}</h3>\n <p>${safeActorName} Attack Setup</p>\n </div>\n </header>\n <div class=\"form-group\">\n <label>Base Skill</label>\n <input type=\"number\" name=\"baseSkill\" value=\"${baseSkillTarget}\" disabled />\n </div>\n <div class=\"form-group\">\n <label>Aim State</label>\n <select name=\"aimMode\" ${isRanged ? \"\" : \"disabled\"}>\n <option value=\"unaimed\" ${defaultAim === \"unaimed\" ? \"selected\" : \"\"}>Unaimed (Quarter Skill)</option>\n <option value=\"partial\" ${defaultAim === \"partial\" ? \"selected\" : \"\"}>Partially Aimed (Half Skill)</option>\n <option value=\"full\" ${defaultAim === \"full\" ? \"selected\" : \"\"}>Fully Aimed (Full Skill)</option>\n </select>\n </div>\n <div class=\"form-group\">\n <label>Cover Modifier</label>\n <input type=\"number\" name=\"coverMod\" value=\"0\" />\n </div>\n <div class=\"form-group\">\n <label>Movement Modifier</label>\n <input type=\"number\" name=\"movementMod\" value=\"0\" />\n </div>\n <div class=\"form-group\">\n <label>Range Modifier</label>\n <input type=\"number\" name=\"rangeMod\" value=\"0\" />\n </div>\n <div class=\"form-group\">\n <label>Situational Modifier</label>\n <input type=\"number\" name=\"situationalMod\" value=\"0\" />\n </div>\n <div class=\"form-group\">\n <label>Custom Modifier Label</label>\n <input type=\"text\" name=\"customLabel\" value=\"\" />\n </div>\n <div class=\"form-group\">\n <label>Custom Modifier Value</label>\n <input type=\"number\" name=\"customMod\" value=\"0\" />\n </div>\n <p class=\"notes\">Ringworld rule support: unaimed ranged attacks use quarter skill, partial aim uses half skill, full aim uses full skill.</p>\n </form>\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<void> {\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<void> {\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<string, unknown> = {\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<void> {\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 <form class=\"rw-stat-roll-form\">\n <div class=\"form-group\">\n <label>Characteristic</label>\n <input type=\"text\" value=\"${foundry.utils.escapeHTML(label)}\" disabled />\n </div>\n <div class=\"form-group\">\n <label>Base Value</label>\n <input type=\"number\" value=\"${base}\" disabled />\n </div>\n <div class=\"form-group\">\n <label>Multiplier</label>\n <select name=\"multiplier\">\n <option value=\"1\">x1</option>\n <option value=\"2\">x2</option>\n <option value=\"3\">x3</option>\n <option value=\"4\">x4</option>\n <option value=\"5\" selected>x5</option>\n <option value=\"6\">x6</option>\n <option value=\"7\">x7</option>\n </select>\n </div>\n <p class=\"hint\">Roll d100 against Characteristic x Multiplier.</p>\n </form>\n `;\n\n const multiplier = await new Promise<number | null>((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<boolean>((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 <div class=\"rw-stat-roll-form\">\n <p><strong>${safeName}</strong> has been hit${attackWasSpecial ? \" by a special success\" : \"\"}.</p>\n <p class=\"hint\">Dodge ${dodgeTarget}%. A successful dodge evades a normal hit; only a special dodge evades a special hit.</p>\n </div>\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<void> {\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<ReturnType<typeof promptDefenderDodge>> = 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 <p>Every check is a d100 roll against a target percentage. The system classifies results automatically:</p>\n <ul>\n <li><strong>Success</strong> &mdash; roll &le; target.</li>\n <li><strong>Special Success</strong> &mdash; roll &le; one fifth of the target (minimum 1). Attacks roll their damage dice twice when <em>Automate Special Success Damage</em> is enabled.</li>\n <li><strong>Failure</strong> &mdash; roll &gt; target.</li>\n <li><strong>Fumble</strong> &mdash; roll of 96&ndash;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.</li>\n </ul>\n <p>Characteristic checks use Characteristic &times; Multiplier (usually &times;5): click any characteristic button on a sheet to pick the multiplier.</p>\n `\n },\n {\n name: \"Combat Sequence (Impulses)\",\n content: `\n <p>Ringworld does not use simple initiative. Combat rounds are split into <strong>impulses</strong> and each combatant acts on a rhythm set by their <strong>Action Ranking (AR)</strong>, which is derived from DEX (lower is faster) and worsened by encumbrance.</p>\n <ol>\n <li>Add combatants to the Combat Tracker as normal. The Ringworld impulse panel replaces the core tracker list.</li>\n <li>Each combatant schedules an action: a <strong>major action</strong> (attack, full move, complex task) completes after AR impulses; a <strong>minor action</strong> (drop prone, shout, draw) completes after 1 impulse.</li>\n <li>Advance the clock with <em>Next Completion</em> or <em>+1</em>. When a combatant's action completes, resolve it, then let them schedule the next one.</li>\n </ol>\n <p>The floating impulse HUD can be dragged anywhere on screen and mirrors the tracker for quick play.</p>\n `\n },\n {\n name: \"Attack Workflow\",\n content: `\n <p>Target a token, then press the weapon's <strong>Use</strong> button on the attacker's sheet. The system walks through the 1984 rules in order:</p>\n <ol>\n <li><strong>Aim state</strong> (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.</li>\n <li><strong>Ammunition and energy</strong> are spent. Projectile weapons with an ammo capacity are blocked when empty &mdash; use the <em>Reload</em> button on the weapon row. Energy weapons draw from the actor pool or a linked power pack.</li>\n <li><strong>Dodge</strong>: on a hit, the defender is offered a Dodge roll (DEX &times;5). A successful dodge evades a normal hit; only a <em>special</em> dodge evades a <em>special</em> hit. Disable with the <em>Prompt Defender Dodge</em> setting.</li>\n <li><strong>Hit location</strong> is rolled on a d20 (or picked manually). Species use their own body schema &mdash; puppeteers, dolphins, trinocs, bandersnatchi and kzinti map differently.</li>\n <li><strong>Damage</strong> is rolled, stacked armor at that location is subtracted, and the result reduces <em>both</em> the location HP and the general HP.</li>\n </ol>\n `\n },\n {\n name: \"Wounds & Conditions\",\n content: `\n <p>When a hit location reaches 0 HP or less, conditions are applied automatically:</p>\n <ul>\n <li><strong>Head or Chest at 0</strong> &mdash; unconscious and prone.</li>\n <li><strong>Abdomen at 0</strong> &mdash; prone, both legs unusable.</li>\n <li><strong>Arm at 0</strong> &mdash; that arm is unusable.</li>\n <li><strong>Leg at 0</strong> &mdash; that leg is unusable, and the character falls prone.</li>\n <li><strong>General HP at 0</strong> &mdash; dying.</li>\n <li><strong>Head, chest or abdomen at negative full value</strong> &mdash; dying; a head at negative full value is death outright.</li>\n </ul>\n <p>Limbs cannot go below their negative maximum. Use <em>Reset Conditions</em> on a sheet after treatment or recovery. Prone, unconscious and dead sync to token status icons.</p>\n `\n },\n {\n name: \"Running the 1984 Rules\",\n content: `\n <p>Quirks of the original boxed set that the system encodes for you:</p>\n <ul>\n <li><strong>General HP = CON + MAS.</strong> MAS (mass) replaces the familiar SIZ. Location HP scale from general HP by body schema.</li>\n <li><strong>Damage modifier</strong> comes from STR + MAS and is recomputed automatically when characteristics change.</li>\n <li><strong>Skill pools:</strong> Education points = (EDU &minus; 10) &times; 20, Pursuit points = (Age &minus; EDU &minus; 6) &times; 20, Special points = INT &times; 10. The character builder on the Skills tab tracks all three.</li>\n <li><strong>Skill category caps:</strong> each category is capped by a characteristic pair (e.g. Agility by STR + DEX). The builder enforces the caps.</li>\n <li><strong>Gravity matters:</strong> 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.</li>\n <li><strong>Energy economy:</strong> most Ringworld tech runs on power packs (R20/R50/R100). Weapons can draw from a linked pack &mdash; keep spares, and remember fumbles can drain them.</li>\n </ul>\n `\n },\n {\n name: \"GM Quick Start\",\n content: `\n <p>To get a table playing quickly:</p>\n <ol>\n <li><strong>Seed the catalog</strong> (Items sidebar button) &mdash; species, 55 base skills, pursuits, weapons, armor and gear from the boxed set appear in organised folders. This runs automatically for new worlds.</li>\n <li><strong>Create Random Explorer</strong> (Actors sidebar button) &mdash; rolls characteristics by species and gravity, adds base skills and a starter kit.</li>\n <li>For bespoke characters, unlock the sheet tools (padlock, top right of the sheet) and use the <strong>Character Builder</strong> on the Skills tab: pick pursuits, then allocate the three point pools.</li>\n <li>Creatures get the same automation &mdash; hit locations, dodge, armor stacking &mdash; via the creature sheet, with a body schema selector for non-humanoids.</li>\n <li>Check <strong>System Settings</strong> for the automation toggles (special success damage, defender dodge prompts).</li>\n </ol>\n `\n }\n ];\n}\n\nexport async function seedGmReference(): Promise<boolean> {\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<string, boolean>;\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<any> {\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<Record<CatalogSeed[\"folderKey\"], string>> {\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<string, unknown> = { _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<number> {\n const roll = await evaluateRollWithDice(formula);\n return Number(roll.total ?? 0);\n}\n\nasync function rollEdu(): Promise<number> {\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<CharacteristicSet> {\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<T>(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<void> {\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<void> {\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<void> {\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<any> {\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<DerivedCheckKey, number> {\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<string, number> {\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<void> {\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<void> {\n await rollStandaloneHitLocation(this);\n }\n\n async useWeaponById(weaponId: string): Promise<void> {\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<void> {\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<number> {\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<void> {\n if (this.type !== \"explorer\") return;\n await rollCharacteristicsForActor(this as any);\n }\n\n async randomizeCharacter(): Promise<void> {\n if (this.type !== \"explorer\") return;\n await randomizeExplorerActor(this as any);\n }\n\n async applySpeciesItem(speciesData: any): Promise<void> {\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<string, unknown> = {};\n const normalizedMods: Record<SpeciesModifierKey, number> = {\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<void> {\n if (this.type !== \"explorer\" && this.type !== \"creature\") return;\n\n const labels: Record<DerivedCheckKey, string> = {\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<void> {\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<void> {\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<string, string> = {\n Agility: \"agility\",\n Communication: \"communication\",\n Knowledge: \"knowledge\",\n Perception: \"perception\",\n Technical: \"technical\"\n};\n\nconst ROOT_FORMULA_BY_CATEGORY: Record<string, string> = {\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<string, BuilderAllocation>;\n baseBySkillId: Record<string, number>;\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<string>;\n bySkillId: Map<string, BuilderSkillMeta>;\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<string, BuilderAllocation> = {};\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<string, number> = {};\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<string> {\n const entriesByName = new Map(\n PURSUIT_CATALOG.map((entry) => [normalizeSkillName(entry.name), entry])\n );\n const allowed = new Set<string>();\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<string, BuilderSkillMeta>();\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<T>(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<any> {\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<string, any>();\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<void> {\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<void> {\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<void> {\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<void> {\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<void> {\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<void> {\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<string, number>();\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<void> {\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 <form class=\"rw-builder-alloc-form\">\n <header class=\"rw-builder-alloc-head\">\n <img src=\"${skill.img || DEFAULT_SKILL_ICON}\" alt=\"\" />\n <div>\n <h3>${skill.name}</h3>\n <p>Base ${meta.baseValue}% | Root cap ${meta.rootCap}% | Current ${num(skill.system?.value, 0)}%</p>\n </div>\n </header>\n\n <label>Education ${(meta.allowsEducation ? \"\" : \"(Not eligible)\")}\n <input name=\"education\" type=\"number\" min=\"0\" max=\"${maxEducation}\" value=\"${current.education}\" ${meta.allowsEducation ? \"\" : \"disabled\"} />\n </label>\n\n <label>Pursuits ${(meta.allowsPursuits ? \"\" : \"(Not in selected pursuits)\")}\n <input name=\"pursuits\" type=\"number\" min=\"0\" max=\"${maxPursuits}\" value=\"${current.pursuits}\" ${meta.allowsPursuits ? \"\" : \"disabled\"} />\n </label>\n\n <label>Special Interests ${(meta.allowsSpecial ? \"\" : \"(Hyperdrive excluded)\")}\n <input name=\"special\" type=\"number\" min=\"0\" max=\"${maxSpecial}\" value=\"${current.special}\" ${meta.allowsSpecial ? \"\" : \"disabled\"} />\n </label>\n\n <p class=\"hint\">Max additional from root cap: ${maxByCap}. Pools: EDU ${context.education.remaining}, Pursuits ${context.pursuits.remaining}, Special ${context.special.remaining}.</p>\n </form>\n `;\n\n const result = await new Promise<BuilderAllocation | null>((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<string, unknown> = {\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<string, unknown> = {\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<any> {\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<any> {\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<any> {\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<any> {\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<any> {\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<any> {\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<any> {\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<any> {\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<any> {\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(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll(\"\\\"\", \"&quot;\");\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<number> {\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<void> {\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<typeof getQueueWithNames>, limit = 8): string {\n if (!rows.length) return `<div class=\"rw-imp-mini-empty\">No actions queued.</div>`;\n return rows.slice(0, limit).map((row) => `\n <div class=\"rw-imp-mini-row\" data-combatant-id=\"${esc(row.combatantId)}\">\n <span class=\"rw-imp-mini-name\">${esc(row.name)}</span>\n <span class=\"rw-imp-mini-action\">${esc(row.label)} @ ${row.completeImpulse}</span>\n </div>\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 <section class=\"ringworld-impulse-chat-marker\">\n <div class=\"rw-imp-mini-head\">\n <strong>Impulse ${state.currentImpulse}</strong>\n <span>Queued ${rows.length}</span>\n </div>\n <div class=\"rw-imp-mini-list\">${renderQueueRowsMarkup(rows, 5)}</div>\n <div class=\"rw-imp-mini-controls\">\n <button type=\"button\" class=\"rw-mini-next\">Next</button>\n <button type=\"button\" class=\"rw-mini-step\">+1</button>\n <button type=\"button\" class=\"rw-mini-reset\">Reset</button>\n </div>\n </section>\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 <section id=\"ringworld-impulse-hud\" class=\"ringworld-impulse-hud\">\n <div class=\"rw-imp-mini-head\">\n <strong>Impulse ${state.currentImpulse}</strong>\n <span>Queued ${rows.length}</span>\n </div>\n <div class=\"rw-imp-mini-list\">${renderQueueRowsMarkup(rows, 8)}</div>\n <div class=\"rw-imp-mini-controls\">\n <button type=\"button\" class=\"rw-mini-next\">Next Completion</button>\n <button type=\"button\" class=\"rw-mini-step\">+1 Impulse</button>\n <button type=\"button\" class=\"rw-mini-reset\">Break / Reset</button>\n </div>\n </section>\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<boolean> {\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<void> {\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<void> {\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<void> {\n const combatant = combat.combatants.get(event.combatantId);\n if (!combatant) return;\n\n const updates: Record<string, unknown> = {\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 <div class=\"ringworld-chat-card\">\n <h3>Impulse ${impulse} Completion</h3>\n <p><strong>${esc(combatant.name)}</strong> completes <strong>${esc(actionKindLabel(event.kind))}</strong>.</p>\n <p><small>DEX ${getDexForCombatant(combatant)} | AR ${getCombatantActionRanking(combatant)}</small></p>\n </div>\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<void> {\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<void> {\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 `<option value=\"${opt.value}\" ${selected}>${opt.label}</option>`;\n }).join(\"\");\n const minorOptions = MINOR_ACTION_OPTIONS.map((opt) => {\n const selected = !pending?.major && pending?.kind === opt.value ? \"selected\" : \"\";\n return `<option value=\"${opt.value}\" ${selected}>${opt.label}</option>`;\n }).join(\"\");\n\n return `\n <div class=\"rw-imp-row\" data-combatant-id=\"${combatant.id}\">\n <div class=\"rw-imp-row-head\">\n <span class=\"rw-imp-name\">${esc(combatant.name)}</span>\n <span class=\"rw-imp-meta\">DEX ${dex} | AR ${ar} + Enc ${encPenalty} = ${effAr} | Imp Mod ${impMod >= 0 ? `+${impMod}` : impMod} | ${esc(pendingLabel)} | ${esc(aimLabel)}</span>\n </div>\n <div class=\"rw-imp-row-controls\">\n <select class=\"rw-major-kind\" ${disabled}>${options}</select>\n <select class=\"rw-minor-kind\" ${disabled}>${minorOptions}</select>\n <button type=\"button\" class=\"rw-major-start\" ${disabled}>Major</button>\n <button type=\"button\" class=\"rw-minor-start\" ${disabled}>Minor</button>\n <button type=\"button\" class=\"rw-cancel-start\" ${disabled}>Cancel</button>\n <label>Imp Mod <input type=\"number\" class=\"rw-imp-mod\" value=\"${impMod}\" ${disabled} /></label>\n <button type=\"button\" class=\"rw-save-mods\" ${disabled}>Save Mods</button>\n </div>\n </div>\n `;\n }).join(\"\");\n\n const panel = $(`\n <section class=\"ringworld-impulse-panel\">\n <div class=\"rw-impulse-top\">\n <div class=\"rw-impulse-clock\">Impulse <strong>${state.currentImpulse}</strong></div>\n <div class=\"rw-impulse-queue\">Queued: ${queue.length}</div>\n <div class=\"rw-impulse-controls\">\n <button type=\"button\" class=\"rw-advance-next\" ${disabled}>Next Completion</button>\n <button type=\"button\" class=\"rw-advance-step\" ${disabled}>+1 Impulse</button>\n <button type=\"button\" class=\"rw-reset-sequence\" ${disabled}>Break / Reset</button>\n </div>\n </div>\n <div class=\"rw-imp-list\">${rows}</div>\n </section>\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<number> {\n if (!game.user?.isGM) return 0;\n let touched = 0;\n\n const buildActorPatch = (sourceSystem: any): Record<string, unknown> | null => {\n const patch: Record<string, unknown> = {};\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<any>(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<string, number> {\n const map = new Map<string, number>();\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<number> {\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<string, unknown> = { _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): 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 = $(`<button type=\\\"button\\\" class=\\\"ringworld-directory-button ${className}\\\">${label}</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 = $('<div class=\"ringworld-directory-controls\"></div>');\n html.append(fallback);\n }\n fallback.first().append(button);\n}\n\nasync function handleSeedCatalogClick(): Promise<void> {\n await seedWorldCatalog({ notify: true });\n}\n\nasync function handleCreateRandomExplorerClick(): Promise<void> {\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<string, unknown> = {};\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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"}