@onimaxxing/sussy-seeds-mcp 0.9.2 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
7
  // package.json
8
8
  var package_default = {
9
9
  name: "@onimaxxing/sussy-seeds-mcp",
10
- version: "0.9.2",
10
+ version: "0.9.4",
11
11
  description: "MCP server for Oxygen Not Included seed hunting. Runs the sussy-seeds wasm scanner over stdio; the LLM composes Builder AST specs and drives cluster / summary / map-tier scans against the game's real worldgen.",
12
12
  keywords: [
13
13
  "claude",
@@ -54,17 +54,18 @@ var package_default = {
54
54
  },
55
55
  dependencies: {
56
56
  "@modelcontextprotocol/sdk": "1.26.0",
57
- "@onimaxxing/worldgen-node": "0.33.2",
57
+ "@onimaxxing/worldgen-node": "0.33.3",
58
58
  zod: "^3.25.0"
59
59
  },
60
60
  devDependencies: {
61
61
  "@onimaxxing/coord-codec": "workspace:*",
62
+ "@onimaxxing/geyser-roll": "workspace:*",
62
63
  "@onimaxxing/i18n": "workspace:*",
63
64
  "@onimaxxing/knowledge-graph": "workspace:*",
64
65
  "@onimaxxing/prefab-kind": "workspace:*",
65
- "@onimaxxing/worldgen": "0.33.2",
66
+ "@onimaxxing/worldgen": "0.33.3",
66
67
  "@onimaxxing/worldmaxxing-registry": "workspace:*",
67
- "@tigin-backwards/oxygen-not-included-gambling": "0.6.4",
68
+ "@tigin-backwards/oxygen-not-included-gambling": "0.6.5",
68
69
  "@tigin-backwards/oxygen-not-included-mod-extensions": "0.13.0",
69
70
  "@types/node": "^24.10.1",
70
71
  oxfmt: "0.53.0",
@@ -26418,6 +26419,31 @@ function worldName(worldPath) {
26418
26419
  const tail = worldPath.split("/").pop() ?? worldPath;
26419
26420
  return fallback(tail);
26420
26421
  }
26422
+ var SPACEDEST_PARENTS = ["ASTEROIDS", "DWARFPLANETS", "GIANTS", "PLANETS", "DEBRIS"];
26423
+ var SPACEDEST_ID_ALIASES = {
26424
+ OilyAsteriod: "OilyAsteroid",
26425
+ HeliumGiant: "HydrogenGiant",
26426
+ DustyMoon: "DustyDwarf",
26427
+ DLC5AquaticSpaceDestination: "DLC5AquaticSpaceDescription"
26428
+ };
26429
+ var SPACEDEST_TYPENAME_FALLBACK = {
26430
+ Earth: "Shattered Planet"
26431
+ };
26432
+ function spaceDestinationName(id) {
26433
+ if (id === null || id === void 0 || id === "") return "";
26434
+ const resolved = SPACEDEST_ID_ALIASES[id] ?? id;
26435
+ const upper = resolved.toUpperCase();
26436
+ const direct = lookup(`UI.SPACEDESTINATIONS.${upper}.NAME`);
26437
+ if (direct) return direct;
26438
+ for (const parent of SPACEDEST_PARENTS) {
26439
+ const hit = lookup(`UI.SPACEDESTINATIONS.${parent}.${upper}.NAME`);
26440
+ if (hit) return hit;
26441
+ }
26442
+ const typeNameFallback = SPACEDEST_TYPENAME_FALLBACK[id];
26443
+ if (typeNameFallback) return typeNameFallback;
26444
+ console.error(`[@onimaxxing/i18n] no UI.SPACEDESTINATIONS.* match for '${id}'`);
26445
+ return id;
26446
+ }
26421
26447
  function biomeName(subworldPath) {
26422
26448
  if (subworldPath === null || subworldPath === void 0 || subworldPath === "") return "";
26423
26449
  const tail = subworldPath.split("/").pop() ?? subworldPath;
@@ -35095,7 +35121,7 @@ var jsYaml = {
35095
35121
  safeDump
35096
35122
  };
35097
35123
 
35098
- // ../../node_modules/.pnpm/@onimaxxing+worldgen@0.33.2/node_modules/@onimaxxing/worldgen/yaml.js
35124
+ // ../../node_modules/.pnpm/@onimaxxing+worldgen@0.33.3/node_modules/@onimaxxing/worldgen/yaml.js
35099
35125
  var KleiBool = new jsYaml.Type("tag:yaml.org,2002:bool", {
35100
35126
  kind: "scalar",
35101
35127
  // Single-letter `y`/`n` are intentionally EXCLUDED: many files
@@ -463746,6 +463772,13 @@ function translateCgmPreset(engine, presetJson) {
463746
463772
  // src/worldgen.ts
463747
463773
  import { createRequire } from "module";
463748
463774
 
463775
+ // ../knowledge-graph/dist/tables/geysers.json
463776
+ var geysers_default = [{ DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "Magma", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "big_volcano", idHash: "0xA115A2F3", maxIterationLength: 12e3, maxIterationPercent: 0.009999999776482582, maxPressure: 150, maxRatePerCycle: 1600, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 6e3, minIterationPercent: 0.004999999888241291, minRatePerCycle: 800, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Molten", temperature: 2e3 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "ChlorineGas", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "chlorine_gas", idHash: "0x58719BD0", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 5, maxRatePerCycle: 140, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 70, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Gas", temperature: 333.1499938964844 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "ChlorineGas", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "chlorine_gas_cool", idHash: "0xE1B0F818", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 5, maxRatePerCycle: 140, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 70, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Gas", temperature: 278.1499938964844 }, { DlcID: null, diseaseInfo: { count: 2e4, idx: 0 }, element: "DirtyWater", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "filthy_water", idHash: "0xE7593594", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 500, maxRatePerCycle: 4e3, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 2e3, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Liquid", temperature: 303.1499938964844 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "CarbonDioxide", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "hot_co2", idHash: "0xDB00AC74", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 5, maxRatePerCycle: 140, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 70, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Gas", temperature: 773.1500244140625 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "Hydrogen", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "hot_hydrogen", idHash: "0x42F75412", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 5, maxRatePerCycle: 140, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 70, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Gas", temperature: 773.1500244140625 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "ContaminatedOxygen", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "hot_po2", idHash: "0xE1677601", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 5, maxRatePerCycle: 140, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 70, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Gas", temperature: 773.1500244140625 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "Steam", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "hot_steam", idHash: "0x876FE53E", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 5, maxRatePerCycle: 1e3, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 500, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Gas", temperature: 773.1500244140625 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "Water", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "hot_water", idHash: "0x2A86CCA5", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 500, maxRatePerCycle: 4e3, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 2e3, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Liquid", temperature: 368.1499938964844 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "LiquidCarbonDioxide", forbiddenDlcIds: null, geyserTemperature: 218, id: "liquid_co2", idHash: "0x5856E7C3", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 50, maxRatePerCycle: 200, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 100, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Liquid", temperature: 218 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "LiquidSulfur", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "liquid_sulfur", idHash: "0x96C23E5C", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 500, maxRatePerCycle: 2e3, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 1e3, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: ["EXPANSION1_ID"], shape: "Liquid", temperature: 438.3499755859375 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "Methane", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "methane", idHash: "0xCDDBC02C", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 5, maxRatePerCycle: 140, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 70, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Gas", temperature: 423.1499938964844 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "MoltenAluminum", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "molten_aluminum", idHash: "0xC645C58C", maxIterationLength: 1080, maxIterationPercent: 0.10000000149011612, maxPressure: 150, maxRatePerCycle: 400, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 480, minIterationPercent: 0.01666666753590107, minRatePerCycle: 200, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: ["EXPANSION1_ID"], shape: "Molten", temperature: 2e3 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "MoltenCobalt", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "molten_cobalt", idHash: "0x43D33A5F", maxIterationLength: 1080, maxIterationPercent: 0.10000000149011612, maxPressure: 150, maxRatePerCycle: 400, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 480, minIterationPercent: 0.01666666753590107, minRatePerCycle: 200, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: ["EXPANSION1_ID"], shape: "Molten", temperature: 2500 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "MoltenCopper", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "molten_copper", idHash: "0xD68E8BA5", maxIterationLength: 1080, maxIterationPercent: 0.10000000149011612, maxPressure: 150, maxRatePerCycle: 400, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 480, minIterationPercent: 0.01666666753590107, minRatePerCycle: 200, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Molten", temperature: 2500 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "MoltenGold", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "molten_gold", idHash: "0xB09A604C", maxIterationLength: 1080, maxIterationPercent: 0.10000000149011612, maxPressure: 150, maxRatePerCycle: 400, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 480, minIterationPercent: 0.01666666753590107, minRatePerCycle: 200, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Molten", temperature: 2900 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "MoltenIron", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "molten_iron", idHash: "0xF253114", maxIterationLength: 1080, maxIterationPercent: 0.10000000149011612, maxPressure: 150, maxRatePerCycle: 400, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 480, minIterationPercent: 0.01666666753590107, minRatePerCycle: 200, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Molten", temperature: 2800 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "MoltenNiobium", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "molten_niobium", idHash: "0x3A36CB67", maxIterationLength: 12e3, maxIterationPercent: 0.009999999776482582, maxPressure: 150, maxRatePerCycle: 1600, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 6e3, minIterationPercent: 0.004999999888241291, minRatePerCycle: 800, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Molten", temperature: 3500 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "MoltenNiobium", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "molten_niobium", idHash: "0x3A36CB67", maxIterationLength: 12e3, maxIterationPercent: 0.009999999776482582, maxPressure: 150, maxRatePerCycle: 1600, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 6e3, minIterationPercent: 0.004999999888241291, minRatePerCycle: 800, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: ["EXPANSION1_ID"], shape: "Molten", temperature: 3500 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "MoltenTungsten", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "molten_tungsten", idHash: "0x97FF710", maxIterationLength: 1080, maxIterationPercent: 0.10000000149011612, maxPressure: 150, maxRatePerCycle: 400, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 480, minIterationPercent: 0.01666666753590107, minRatePerCycle: 200, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: ["EXPANSION1_ID"], shape: "Molten", temperature: 4e3 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "MurkyBrine", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "murky_brine", idHash: "0x46FCCA29", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 500, maxRatePerCycle: 4e3, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 2e3, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: ["DLC5_ID"], shape: "Liquid", temperature: 368.1499938964844 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "CrudeOil", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "oil_drip", idHash: "0x80EDB902", maxIterationLength: 600, maxIterationPercent: 1, maxPressure: 50, maxRatePerCycle: 250, maxYearLength: 500, maxYearPercent: 0.800000011920929, minIterationLength: 600, minIterationPercent: 1, minRatePerCycle: 1, minYearLength: 100, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Liquid", temperature: 600 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "SaltWater", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "salt_water", idHash: "0x2596C7AE", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 500, maxRatePerCycle: 4e3, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 2e3, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Liquid", temperature: 368.1499938964844 }, { DlcID: null, diseaseInfo: { count: 5e3, idx: 1 }, element: "ContaminatedOxygen", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "slimy_po2", idHash: "0x7EDED410", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 5, maxRatePerCycle: 140, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 70, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Gas", temperature: 333.1499938964844 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "Brine", forbiddenDlcIds: null, geyserTemperature: 263, id: "slush_salt_water", idHash: "0x7650909C", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 500, maxRatePerCycle: 2e3, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 1e3, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Liquid", temperature: 263.1499938964844 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "DirtyWater", forbiddenDlcIds: null, geyserTemperature: 263, id: "slush_water", idHash: "0x4C574F29", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 500, maxRatePerCycle: 2e3, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 1e3, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Liquid", temperature: 263.1499938964844 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "Magma", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "small_volcano", idHash: "0xE3E454FA", maxIterationLength: 12e3, maxIterationPercent: 0.009999999776482582, maxPressure: 150, maxRatePerCycle: 800, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 6e3, minIterationPercent: 0.004999999888241291, minRatePerCycle: 400, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Molten", temperature: 2e3 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "Steam", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "steam", idHash: "0xCA627A30", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 5, maxRatePerCycle: 2e3, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 1e3, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Gas", temperature: 383.1499938964844 }];
463777
+
463778
+ // ../knowledge-graph/src/tables/geysers.ts
463779
+ var geysers = geysers_default;
463780
+ var geysers_default2 = geysers;
463781
+
463749
463782
  // ../knowledge-graph/dist/tables/biome-elements.json
463750
463783
  var biome_elements_default = [
463751
463784
  {
@@ -528355,9 +528388,30 @@ function buildOracle(inputs) {
528355
528388
  clusterTags: CLUSTER_TAGS_BY_PREFIX.get(inputs.mixing.clusterPrefix) ?? [],
528356
528389
  stockCluster: CLUSTER_TAGS_BY_PREFIX.has(inputs.mixing.clusterPrefix)
528357
528390
  } : void 0,
528391
+ baseGame: isBaseGameClusterPrefix(inputs.clusterPrefix),
528358
528392
  cache: /* @__PURE__ */ new Map()
528359
528393
  };
528360
528394
  }
528395
+ var BASE_GAME_CLUSTER_PREFIXES = (() => {
528396
+ const spacedOut = /* @__PURE__ */ new Map();
528397
+ for (const c of clusters_default2) {
528398
+ const so = (c.requiredDlcIds ?? []).includes("EXPANSION1_ID");
528399
+ spacedOut.set(c.coordinatePrefix, (spacedOut.get(c.coordinatePrefix) ?? false) || so);
528400
+ }
528401
+ return new Set([...spacedOut].filter(([, so]) => !so).map(([prefix]) => prefix));
528402
+ })();
528403
+ function isBaseGameClusterPrefix(prefix) {
528404
+ return prefix != null && BASE_GAME_CLUSTER_PREFIXES.has(prefix);
528405
+ }
528406
+ var SPACED_OUT_GEYSER_IDS = new Set(
528407
+ geysers_default2.filter((g) => g.requiredDlcIds?.includes("EXPANSION1_ID")).map((g) => g.id)
528408
+ );
528409
+ var BASE_GAME_GENERIC_GEYSER_POOL_IDS = GENERIC_GEYSER_POOL_IDS.filter(
528410
+ (id) => !SPACED_OUT_GEYSER_IDS.has(id)
528411
+ );
528412
+ function genericGeyserPool() {
528413
+ return activeOracle.baseGame ? BASE_GAME_GENERIC_GEYSER_POOL_IDS : GENERIC_GEYSER_POOL_IDS;
528414
+ }
528361
528415
  var STOCK_ORACLE = buildOracle({});
528362
528416
  var activeOracle = STOCK_ORACLE;
528363
528417
  function withOracle(oracle, fn) {
@@ -528473,7 +528527,7 @@ function harvestSubworld(subName) {
528473
528527
  for (const r of sub.subworldTemplateRules ?? []) {
528474
528528
  for (const n of r.names ?? []) {
528475
528529
  if (isGenericGeyserPoolRef(n)) {
528476
- for (const g of GENERIC_GEYSER_POOL_IDS) geysers2.add(g);
528530
+ for (const g of genericGeyserPool()) geysers2.add(g);
528477
528531
  continue;
528478
528532
  }
528479
528533
  if (isOilWellTemplateRef(n)) {
@@ -528498,7 +528552,7 @@ function harvestSubworld(subName) {
528498
528552
  for (const r of subExtras.templateRules ?? []) {
528499
528553
  for (const n of r.names ?? []) {
528500
528554
  if (isGenericGeyserPoolRef(n)) {
528501
- for (const g of GENERIC_GEYSER_POOL_IDS) geysers2.add(g);
528555
+ for (const g of genericGeyserPool()) geysers2.add(g);
528502
528556
  continue;
528503
528557
  }
528504
528558
  if (isOilWellTemplateRef(n)) {
@@ -528524,7 +528578,7 @@ function harvestWorldTemplateGeysers(world) {
528524
528578
  for (const r of worldExtras(world).worldTemplateRules ?? []) {
528525
528579
  for (const n of r.names ?? []) {
528526
528580
  if (isGenericGeyserPoolRef(n)) {
528527
- for (const g of GENERIC_GEYSER_POOL_IDS) out.add(g);
528581
+ for (const g of genericGeyserPool()) out.add(g);
528528
528582
  continue;
528529
528583
  }
528530
528584
  if (isOilWellTemplateRef(n)) {
@@ -528550,7 +528604,7 @@ function harvestTraitGeysers(traitId) {
528550
528604
  }
528551
528605
  for (const tplRef of row.templates) {
528552
528606
  if (isGenericGeyserPoolRef(tplRef)) {
528553
- for (const g of GENERIC_GEYSER_POOL_IDS) out.add(g);
528607
+ for (const g of genericGeyserPool()) out.add(g);
528554
528608
  continue;
528555
528609
  }
528556
528610
  if (isOilWellTemplateRef(tplRef)) {
@@ -528734,7 +528788,7 @@ function computeAdmissibility(worldPath) {
528734
528788
  for (const r of extras ?? []) {
528735
528789
  for (const n of r.names ?? []) {
528736
528790
  if (isGenericGeyserPoolRef(n)) {
528737
- for (const g of GENERIC_GEYSER_POOL_IDS) if (!geysers2.has(g)) mixG.add(g);
528791
+ for (const g of genericGeyserPool()) if (!geysers2.has(g)) mixG.add(g);
528738
528792
  continue;
528739
528793
  }
528740
528794
  if (isOilWellTemplateRef(n)) {
@@ -528812,7 +528866,7 @@ function computeAdmissibility(worldPath) {
528812
528866
  for (const r of raw.additionalWorldTemplateRules ?? []) {
528813
528867
  for (const n of r.names ?? []) {
528814
528868
  if (isGenericGeyserPoolRef(n)) {
528815
- for (const g of GENERIC_GEYSER_POOL_IDS) geysers2.add(g);
528869
+ for (const g of genericGeyserPool()) geysers2.add(g);
528816
528870
  continue;
528817
528871
  }
528818
528872
  if (isOilWellTemplateRef(n)) {
@@ -529142,16 +529196,20 @@ var ORACLE_CACHE_CAP = 4;
529142
529196
  async function oracleForCoord(coord) {
529143
529197
  const { source, files, key: snapshotKey, overlaysActive } = await ensureSnapshotForCoord(coord);
529144
529198
  const modContent = source.kind !== "stock" || overlaysActive;
529145
- const mixing = oracleMixingForCoord(coord, clusterPrefixForCoord(coord));
529146
- if (files === null && !modContent && !mixing) return { oracle: STOCK_ORACLE, source };
529147
- const key = `${snapshotKey}|mc:${modContent}|mx:${mixing?.key ?? ""}`;
529199
+ const clusterPrefix = clusterPrefixForCoord(coord);
529200
+ const mixing = oracleMixingForCoord(coord, clusterPrefix);
529201
+ const baseGame = isBaseGameClusterPrefix(clusterPrefix);
529202
+ if (files === null && !modContent && !mixing && !baseGame) {
529203
+ return { oracle: STOCK_ORACLE, source };
529204
+ }
529205
+ const key = `${snapshotKey}|mc:${modContent}|mx:${mixing?.key ?? ""}|bg:${baseGame}`;
529148
529206
  let oracle = ORACLE_CACHE.get(key);
529149
529207
  if (oracle) {
529150
529208
  ORACLE_CACHE.delete(key);
529151
529209
  ORACLE_CACHE.set(key, oracle);
529152
529210
  }
529153
529211
  if (!oracle) {
529154
- oracle = buildOracle({ snapshotFiles: files, modContent, mixing });
529212
+ oracle = buildOracle({ snapshotFiles: files, modContent, mixing, clusterPrefix });
529155
529213
  ORACLE_CACHE.set(key, oracle);
529156
529214
  if (ORACLE_CACHE.size > ORACLE_CACHE_CAP) {
529157
529215
  const oldest = ORACLE_CACHE.keys().next().value;
@@ -530123,6 +530181,7 @@ var CONSTRAINT_KIND_META = {
530123
530181
  "world.distToHome": { tier: "bytecode-capable", scope: "world" },
530124
530182
  "world.distTo": { tier: "bytecode-capable", scope: "world-pair" },
530125
530183
  "poi.count": { tier: "bytecode-capable", scope: "cluster" },
530184
+ "destination.count": { tier: "bytecode-capable", scope: "cluster" },
530126
530185
  "world.traitCount": { tier: "bytecode-capable", scope: "world" },
530127
530186
  "world.asteroidRemix": { tier: "bytecode-capable", scope: "world" },
530128
530187
  // Partial-worldgen tier (JS + await worldgenPartial(...)): the
@@ -530132,6 +530191,7 @@ var CONSTRAINT_KIND_META = {
530132
530191
  // for the near-start distance, OilWell reservoirs).
530133
530192
  "world.geyser": { tier: "partial-worldgen", scope: "world" },
530134
530193
  "world.oilWells": { tier: "partial-worldgen", scope: "world" },
530194
+ "world.geyserGodRoll": { tier: "partial-worldgen", scope: "world" },
530135
530195
  "home.geyserNearStart": { tier: "partial-worldgen", scope: "home" },
530136
530196
  // Template stamps are part of the partial contract's guaranteed
530137
530197
  // payload (everything but story traits places, bit-identical), and
@@ -530185,13 +530245,6 @@ function constraintBytecodeCapable(kind) {
530185
530245
  return CONSTRAINT_KIND_META[kind].tier === "bytecode-capable";
530186
530246
  }
530187
530247
 
530188
- // ../knowledge-graph/dist/tables/geysers.json
530189
- var geysers_default = [{ DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "Magma", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "big_volcano", idHash: "0xA115A2F3", maxIterationLength: 12e3, maxIterationPercent: 0.009999999776482582, maxPressure: 150, maxRatePerCycle: 1600, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 6e3, minIterationPercent: 0.004999999888241291, minRatePerCycle: 800, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Molten", temperature: 2e3 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "ChlorineGas", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "chlorine_gas", idHash: "0x58719BD0", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 5, maxRatePerCycle: 140, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 70, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Gas", temperature: 333.1499938964844 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "ChlorineGas", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "chlorine_gas_cool", idHash: "0xE1B0F818", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 5, maxRatePerCycle: 140, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 70, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Gas", temperature: 278.1499938964844 }, { DlcID: null, diseaseInfo: { count: 2e4, idx: 0 }, element: "DirtyWater", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "filthy_water", idHash: "0xE7593594", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 500, maxRatePerCycle: 4e3, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 2e3, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Liquid", temperature: 303.1499938964844 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "CarbonDioxide", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "hot_co2", idHash: "0xDB00AC74", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 5, maxRatePerCycle: 140, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 70, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Gas", temperature: 773.1500244140625 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "Hydrogen", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "hot_hydrogen", idHash: "0x42F75412", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 5, maxRatePerCycle: 140, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 70, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Gas", temperature: 773.1500244140625 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "ContaminatedOxygen", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "hot_po2", idHash: "0xE1677601", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 5, maxRatePerCycle: 140, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 70, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Gas", temperature: 773.1500244140625 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "Steam", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "hot_steam", idHash: "0x876FE53E", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 5, maxRatePerCycle: 1e3, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 500, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Gas", temperature: 773.1500244140625 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "Water", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "hot_water", idHash: "0x2A86CCA5", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 500, maxRatePerCycle: 4e3, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 2e3, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Liquid", temperature: 368.1499938964844 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "LiquidCarbonDioxide", forbiddenDlcIds: null, geyserTemperature: 218, id: "liquid_co2", idHash: "0x5856E7C3", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 50, maxRatePerCycle: 200, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 100, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Liquid", temperature: 218 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "LiquidSulfur", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "liquid_sulfur", idHash: "0x96C23E5C", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 500, maxRatePerCycle: 2e3, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 1e3, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: ["EXPANSION1_ID"], shape: "Liquid", temperature: 438.3499755859375 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "Methane", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "methane", idHash: "0xCDDBC02C", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 5, maxRatePerCycle: 140, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 70, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Gas", temperature: 423.1499938964844 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "MoltenAluminum", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "molten_aluminum", idHash: "0xC645C58C", maxIterationLength: 1080, maxIterationPercent: 0.10000000149011612, maxPressure: 150, maxRatePerCycle: 400, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 480, minIterationPercent: 0.01666666753590107, minRatePerCycle: 200, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: ["EXPANSION1_ID"], shape: "Molten", temperature: 2e3 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "MoltenCobalt", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "molten_cobalt", idHash: "0x43D33A5F", maxIterationLength: 1080, maxIterationPercent: 0.10000000149011612, maxPressure: 150, maxRatePerCycle: 400, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 480, minIterationPercent: 0.01666666753590107, minRatePerCycle: 200, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: ["EXPANSION1_ID"], shape: "Molten", temperature: 2500 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "MoltenCopper", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "molten_copper", idHash: "0xD68E8BA5", maxIterationLength: 1080, maxIterationPercent: 0.10000000149011612, maxPressure: 150, maxRatePerCycle: 400, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 480, minIterationPercent: 0.01666666753590107, minRatePerCycle: 200, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Molten", temperature: 2500 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "MoltenGold", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "molten_gold", idHash: "0xB09A604C", maxIterationLength: 1080, maxIterationPercent: 0.10000000149011612, maxPressure: 150, maxRatePerCycle: 400, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 480, minIterationPercent: 0.01666666753590107, minRatePerCycle: 200, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Molten", temperature: 2900 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "MoltenIron", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "molten_iron", idHash: "0xF253114", maxIterationLength: 1080, maxIterationPercent: 0.10000000149011612, maxPressure: 150, maxRatePerCycle: 400, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 480, minIterationPercent: 0.01666666753590107, minRatePerCycle: 200, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Molten", temperature: 2800 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "MoltenNiobium", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "molten_niobium", idHash: "0x3A36CB67", maxIterationLength: 12e3, maxIterationPercent: 0.009999999776482582, maxPressure: 150, maxRatePerCycle: 1600, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 6e3, minIterationPercent: 0.004999999888241291, minRatePerCycle: 800, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Molten", temperature: 3500 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "MoltenNiobium", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "molten_niobium", idHash: "0x3A36CB67", maxIterationLength: 12e3, maxIterationPercent: 0.009999999776482582, maxPressure: 150, maxRatePerCycle: 1600, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 6e3, minIterationPercent: 0.004999999888241291, minRatePerCycle: 800, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: ["EXPANSION1_ID"], shape: "Molten", temperature: 3500 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "MoltenTungsten", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "molten_tungsten", idHash: "0x97FF710", maxIterationLength: 1080, maxIterationPercent: 0.10000000149011612, maxPressure: 150, maxRatePerCycle: 400, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 480, minIterationPercent: 0.01666666753590107, minRatePerCycle: 200, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: ["EXPANSION1_ID"], shape: "Molten", temperature: 4e3 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "MurkyBrine", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "murky_brine", idHash: "0x46FCCA29", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 500, maxRatePerCycle: 4e3, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 2e3, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: ["DLC5_ID"], shape: "Liquid", temperature: 368.1499938964844 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "CrudeOil", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "oil_drip", idHash: "0x80EDB902", maxIterationLength: 600, maxIterationPercent: 1, maxPressure: 50, maxRatePerCycle: 250, maxYearLength: 500, maxYearPercent: 0.800000011920929, minIterationLength: 600, minIterationPercent: 1, minRatePerCycle: 1, minYearLength: 100, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Liquid", temperature: 600 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "SaltWater", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "salt_water", idHash: "0x2596C7AE", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 500, maxRatePerCycle: 4e3, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 2e3, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Liquid", temperature: 368.1499938964844 }, { DlcID: null, diseaseInfo: { count: 5e3, idx: 1 }, element: "ContaminatedOxygen", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "slimy_po2", idHash: "0x7EDED410", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 5, maxRatePerCycle: 140, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 70, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Gas", temperature: 333.1499938964844 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "Brine", forbiddenDlcIds: null, geyserTemperature: 263, id: "slush_salt_water", idHash: "0x7650909C", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 500, maxRatePerCycle: 2e3, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 1e3, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Liquid", temperature: 263.1499938964844 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "DirtyWater", forbiddenDlcIds: null, geyserTemperature: 263, id: "slush_water", idHash: "0x4C574F29", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 500, maxRatePerCycle: 2e3, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 1e3, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Liquid", temperature: 263.1499938964844 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "Magma", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "small_volcano", idHash: "0xE3E454FA", maxIterationLength: 12e3, maxIterationPercent: 0.009999999776482582, maxPressure: 150, maxRatePerCycle: 800, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 6e3, minIterationPercent: 0.004999999888241291, minRatePerCycle: 400, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Molten", temperature: 2e3 }, { DlcID: null, diseaseInfo: { count: 0, idx: 255 }, element: "Steam", forbiddenDlcIds: null, geyserTemperature: 372.1499938964844, id: "steam", idHash: "0xCA627A30", maxIterationLength: 1140, maxIterationPercent: 0.8999999761581421, maxPressure: 5, maxRatePerCycle: 2e3, maxYearLength: 135e3, maxYearPercent: 0.800000011920929, minIterationLength: 60, minIterationPercent: 0.10000000149011612, minRatePerCycle: 1e3, minYearLength: 15e3, minYearPercent: 0.4000000059604645, requiredDlcIds: null, shape: "Gas", temperature: 383.1499938964844 }];
530190
-
530191
- // ../knowledge-graph/src/tables/geysers.ts
530192
- var geysers = geysers_default;
530193
- var geysers_default2 = geysers;
530194
-
530195
530248
  // ../knowledge-graph/dist/tables/space-poi-config.json
530196
530249
  var space_poi_config_default = [{ anim: "cloud", canProvideArtifacts: true, capacityMax: 45e3, capacityMin: 3e4, forbiddenDlcIds: [], id: "CarbonAsteroidField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "Carbon", weight: 5.5 }, { element: "RefinedCarbon", weight: 1.5 }] }, { anim: "chlorine_cloud", canProvideArtifacts: true, capacityMax: 81e3, capacityMin: 54e3, forbiddenDlcIds: [], id: "ChlorineCloud", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "BleachStone", weight: 7.5 }, { element: "Chlorine", weight: 2.5 }] }, { anim: "ceres_debris_field", canProvideArtifacts: true, capacityMax: 25e3, capacityMin: 15e3, forbiddenDlcIds: [], id: "DLC2CeresField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID", "DLC2_ID"], weights: [{ element: "Cinnabar", weight: 4.5 }, { element: "Ice", weight: 2.5 }, { element: "Mercury", weight: 2.5 }] }, { anim: "ceres_starting_field", canProvideArtifacts: true, capacityMax: 25e3, capacityMin: 15e3, forbiddenDlcIds: [], id: "DLC2CeresOreField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID", "DLC2_ID"], weights: [{ element: "Cinnabar", weight: 2.5 }, { element: "Ice", weight: 3.5 }, { element: "Mercury", weight: 2.5 }] }, { anim: "prehistoric_impactor_1", canProvideArtifacts: false, capacityMax: 45e3, capacityMin: 35e3, forbiddenDlcIds: [], id: "DLC4ImpactorDebrisField1", initialDataBanks: 50, rechargeMax: 3e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID", "DLC4_ID"], weights: [{ element: "Gold", weight: 2.0999999046325684 }, { element: "Granite", weight: 3.9000000953674316 }, { element: "Iridium", weight: 1.7000000476837158 }, { element: "MaficRock", weight: 2.299999952316284 }] }, { anim: "prehistoric_impactor_2", canProvideArtifacts: false, capacityMax: 66800, capacityMin: 33400, forbiddenDlcIds: [], id: "DLC4ImpactorDebrisField2", initialDataBanks: 50, rechargeMax: 3e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID", "DLC4_ID"], weights: [{ element: "Isoresin", weight: 1.7999999523162842 }, { element: "LiquidSulfur", weight: 4.699999809265137 }, { element: "Petroleum", weight: 3.5 }] }, { anim: "prehistoric_impactor_3", canProvideArtifacts: false, capacityMax: 137500, capacityMin: 11e4, forbiddenDlcIds: [], id: "DLC4ImpactorDebrisField3", initialDataBanks: 50, rechargeMax: 3e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID", "DLC4_ID"], weights: [{ element: "LiquidHydrogen", weight: 0.6000000238418579 }, { element: "LiquidOxygen", weight: 0.6000000238418579 }, { element: "Magma", weight: 5.099999904632568 }, { element: "MoltenIridium", weight: 3.700000047683716 }] }, { anim: "prehistoric_SO1", canProvideArtifacts: true, capacityMax: 25e3, capacityMin: 15e3, forbiddenDlcIds: [], id: "DLC4PrehistoricMixingField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID", "DLC4_ID"], weights: [{ element: "Amber", weight: 1 }, { element: "Iridium", weight: 0.5 }, { element: "NickelOre", weight: 4.5 }, { element: "Peat", weight: 2.5 }, { element: "Shale", weight: 1 }] }, { anim: "prehistoric_SO2", canProvideArtifacts: true, capacityMax: 25e3, capacityMin: 15e3, forbiddenDlcIds: [], id: "DLC4PrehistoricOreField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID", "DLC4_ID"], weights: [{ element: "Amber", weight: 1 }, { element: "NickelOre", weight: 1.5 }, { element: "Peat", weight: 2.5 }, { element: "Shale", weight: 1 }] }, { anim: "aquatic_mix", canProvideArtifacts: true, capacityMax: 25e3, capacityMin: 15e3, forbiddenDlcIds: [], id: "DLC5AquaticMixingField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID", "DLC5_ID"], weights: [{ element: "Basalt", weight: 1.5 }, { element: "Coquina", weight: 1.5 }, { element: "Corallium", weight: 2.5 }, { element: "SiltStone", weight: 2.5 }, { element: "ZincOre", weight: 4.5 }] }, { anim: "aquatic_field", canProvideArtifacts: true, capacityMax: 25e3, capacityMin: 15e3, forbiddenDlcIds: [], id: "DLC5AquaticOreField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID", "DLC5_ID"], weights: [{ element: "Basalt", weight: 1.5 }, { element: "Coquina", weight: 1.5 }, { element: "Corallium", weight: 2.5 }, { element: "SiltStone", weight: 2.5 }, { element: "ZincOre", weight: 4.5 }] }, { anim: "foresty_ore_field", canProvideArtifacts: true, capacityMax: 81e3, capacityMin: 54e3, forbiddenDlcIds: [], id: "ForestyOreField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "AluminumOre", weight: 1 }, { element: "CarbonDioxide", weight: 2 }, { element: "IgneousRock", weight: 7 }] }, { anim: "frozen_ore_field", canProvideArtifacts: true, capacityMax: 81e3, capacityMin: 54e3, forbiddenDlcIds: [], id: "FrozenOreField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "AluminumOre", weight: 2 }, { element: "DirtyIce", weight: 2.3299999237060547 }, { element: "Ice", weight: 2.3299999237060547 }, { element: "Snow", weight: 1.8300000429153442 }] }, { anim: "gas_giant_cloud", canProvideArtifacts: true, capacityMax: 2e4, capacityMin: 15e3, forbiddenDlcIds: [], id: "GasGiantCloud", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "Hydrogen", weight: 7 }, { element: "LiquidMethane", weight: 1 }, { element: "Methane", weight: 1 }, { element: "SolidMethane", weight: 1 }] }, { anim: "gilded_asteroid_field", canProvideArtifacts: true, capacityMax: 45e3, capacityMin: 3e4, forbiddenDlcIds: [], id: "GildedAsteroidField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "Fullerene", weight: 1 }, { element: "Gold", weight: 2.5 }, { element: "RefinedCarbon", weight: 1 }, { element: "Regolith", weight: 1 }, { element: "SedimentaryRock", weight: 4.5 }] }, { anim: "glimmering_asteroid_field", canProvideArtifacts: true, capacityMax: 45e3, capacityMin: 3e4, forbiddenDlcIds: [], id: "GlimmeringAsteroidField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "Carbon", weight: 1 }, { element: "CarbonDioxide", weight: 1 }, { element: "MoltenTungsten", weight: 2 }, { element: "Wolframite", weight: 6 }] }, { anim: "helium_cloud", canProvideArtifacts: true, capacityMax: 45e3, capacityMin: 3e4, forbiddenDlcIds: [], id: "HeliumCloud", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "Hydrogen", weight: 2 }, { element: "Water", weight: 8 }] }, { anim: "ice_asteroid_field", canProvideArtifacts: true, capacityMax: 81e3, capacityMin: 54e3, forbiddenDlcIds: [], id: "IceAsteroidField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "Ice", weight: 6 }, { element: "Oxygen", weight: 1.5 }, { element: "SolidCarbonDioxide", weight: 2 }, { element: "SolidMethane", weight: 0.5 }] }, { anim: "interstellar_ice_field", canProvideArtifacts: true, capacityMax: 81e3, capacityMin: 54e3, forbiddenDlcIds: [], id: "InterstellarIceField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "Ice", weight: 2.5 }, { element: "SolidCarbonDioxide", weight: 7 }, { element: "SolidOxygen", weight: 0.5 }] }, { anim: "interstellar_ocean", canProvideArtifacts: true, capacityMax: 25e3, capacityMin: 15e3, forbiddenDlcIds: [], id: "InterstellarOcean", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "Brine", weight: 2.5 }, { element: "Ice", weight: 2.5 }, { element: "Salt", weight: 2.5 }, { element: "SaltWater", weight: 2.5 }] }, { anim: "metallic_asteroid_field", canProvideArtifacts: true, capacityMax: 81e3, capacityMin: 54e3, forbiddenDlcIds: [], id: "MetallicAsteroidField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "Cuprite", weight: 1.75 }, { element: "MoltenIron", weight: 1.25 }, { element: "MoltenLead", weight: 1.75 }, { element: "Obsidian", weight: 6.25 }] }, { anim: "oily_asteroid_field", canProvideArtifacts: true, capacityMax: 25e3, capacityMin: 15e3, forbiddenDlcIds: [], id: "OilyAsteroidField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "CrudeOil", weight: 1.125 }, { element: "SolidCarbonDioxide", weight: 7.75 }, { element: "SolidMethane", weight: 1.125 }] }, { anim: "organic_mass_field", canProvideArtifacts: true, capacityMax: 81e3, capacityMin: 54e3, forbiddenDlcIds: [], id: "OrganicMassField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "Algae", weight: 3 }, { element: "ContaminatedOxygen", weight: 1 }, { element: "Dirt", weight: 3 }, { element: "SlimeMold", weight: 3 }] }, { anim: "oxidized_asteroid_field", canProvideArtifacts: true, capacityMax: 81e3, capacityMin: 54e3, forbiddenDlcIds: [], id: "OxidizedAsteroidField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "Rust", weight: 8 }, { element: "SolidCarbonDioxide", weight: 2 }] }, { anim: "oxygen_rich_asteroid_field", canProvideArtifacts: true, capacityMax: 25e3, capacityMin: 15e3, forbiddenDlcIds: [], id: "OxygenRichAsteroidField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "ContaminatedOxygen", weight: 2 }, { element: "Ice", weight: 4 }, { element: "Water", weight: 4 }] }, { anim: "radioactive_asteroid_field", canProvideArtifacts: true, capacityMax: 1e4, capacityMin: 5e3, forbiddenDlcIds: [], id: "RadioactiveAsteroidField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "BleachStone", weight: 2 }, { element: "Rust", weight: 4 }, { element: "Sulfur", weight: 3 }, { element: "UraniumOre", weight: 2 }] }, { anim: "radioactive_gas_cloud", canProvideArtifacts: true, capacityMax: 1e4, capacityMin: 5e3, forbiddenDlcIds: [], id: "RadioactiveGasCloud", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "CarbonDioxide", weight: 7 }, { element: "Chlorine", weight: 2 }, { element: "UraniumOre", weight: 2 }] }, { anim: "rocky_asteroid_field", canProvideArtifacts: true, capacityMax: 94e3, capacityMin: 81e3, forbiddenDlcIds: [], id: "RockyAsteroidField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "Granite", weight: 2 }, { element: "IgneousRock", weight: 3 }, { element: "Katairite", weight: 2 }, { element: "SedimentaryRock", weight: 3 }] }, { anim: "salty_asteroid_field", canProvideArtifacts: true, capacityMax: 81e3, capacityMin: 54e3, forbiddenDlcIds: [], id: "SaltyAsteroidField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "Brine", weight: 4 }, { element: "SaltWater", weight: 5 }, { element: "SolidCarbonDioxide", weight: 1 }] }, { anim: "sandy_ore_field", canProvideArtifacts: true, capacityMax: 81e3, capacityMin: 54e3, forbiddenDlcIds: [], id: "SandyOreField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "Algae", weight: 2 }, { element: "Cuprite", weight: 1 }, { element: "Sand", weight: 3 }, { element: "SandStone", weight: 4 }] }, { anim: "satellite_field", canProvideArtifacts: true, capacityMax: 45e3, capacityMin: 3e4, forbiddenDlcIds: [], id: "SatelliteField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "Glass", weight: 1.3300000429153442 }, { element: "IronOre", weight: 3 }, { element: "MoltenCopper", weight: 2.6700000762939453 }, { element: "Sand", weight: 3 }] }, { anim: "swampy_ore_field", canProvideArtifacts: true, capacityMax: 81e3, capacityMin: 54e3, forbiddenDlcIds: [], id: "SwampyOreField", initialDataBanks: 50, rechargeMax: 6e4, rechargeMin: 3e4, requiredDlcIds: ["EXPANSION1_ID"], weights: [{ element: "Cobaltite", weight: 1 }, { element: "Mud", weight: 2 }, { element: "ToxicSand", weight: 7 }] }];
530197
530250
 
@@ -534433,7 +534486,8 @@ var scene_layers_default = [
534433
534486
  id: "FetchDrone",
534434
534487
  initialAnim: "idle_loop",
534435
534488
  sceneLayer: "Move",
534436
- source: "kbac"
534489
+ source: "kbac",
534490
+ runtimeForegroundLayer: "InteriorWall"
534437
534491
  },
534438
534492
  {
534439
534493
  id: "FieldRation",
@@ -541811,7 +541865,8 @@ var scene_layers_default = [
541811
541865
  id: "PropFacilityDisplay3",
541812
541866
  initialAnim: "off",
541813
541867
  sceneLayer: "Building",
541814
- source: "kbac"
541868
+ source: "kbac",
541869
+ runtimeForegroundLayer: "InteriorWall"
541815
541870
  },
541816
541871
  {
541817
541872
  id: "PropFacilityGlobeDroors",
@@ -610961,21 +611016,201 @@ var ROWS = [
610961
611016
  ];
610962
611017
  var BY_ID = new Map(ROWS.map((r) => [r.id, r]));
610963
611018
 
610964
- // ../../apps/onimaxxing/src/gambling/query/validate-ast.ts
611019
+ // ../geyser-roll/src/index.ts
611020
+ var I32_MAX = 2147483647;
611021
+ var I32_MIN = -2147483648;
611022
+ var MBIG = I32_MAX;
611023
+ var MSEED = 161803398;
611024
+ function toI32(n) {
611025
+ return n | 0;
611026
+ }
611027
+ function addI32(a, b) {
611028
+ return a + b | 0;
611029
+ }
611030
+ function subI32(a, b) {
611031
+ return a - b | 0;
611032
+ }
610965
611033
  var f32 = Math.fround;
611034
+ var KRandom = class {
611035
+ seedArray;
611036
+ inext;
611037
+ inextp;
611038
+ constructor(seed) {
611039
+ seed = toI32(seed);
611040
+ const seedArray = new Int32Array(56);
611041
+ const absSeed = seed === I32_MIN ? I32_MAX : Math.abs(seed);
611042
+ let mj = subI32(MSEED, absSeed);
611043
+ seedArray[55] = mj;
611044
+ let mk = 1;
611045
+ for (let i = 1; i < 55; i++) {
611046
+ const ii = 21 * i % 55;
611047
+ seedArray[ii] = mk;
611048
+ mk = subI32(mj, mk);
611049
+ if (mk < 0) mk = addI32(mk, MBIG);
611050
+ mj = seedArray[ii];
611051
+ }
611052
+ for (let iter = 1; iter < 5; iter++) {
611053
+ for (let k = 1; k < 56; k++) {
611054
+ seedArray[k] = subI32(seedArray[k], seedArray[1 + (k + 30) % 55]);
611055
+ if (seedArray[k] < 0) seedArray[k] = addI32(seedArray[k], MBIG);
611056
+ }
611057
+ }
611058
+ this.seedArray = seedArray;
611059
+ this.inext = 0;
611060
+ this.inextp = 21;
611061
+ }
611062
+ internalSample() {
611063
+ let num = this.inext;
611064
+ let num2 = this.inextp;
611065
+ num += 1;
611066
+ if (num >= 56) num = 1;
611067
+ num2 += 1;
611068
+ if (num2 >= 56) num2 = 1;
611069
+ let num3 = subI32(this.seedArray[num], this.seedArray[num2]);
611070
+ if (num3 === MBIG) num3 -= 1;
611071
+ if (num3 < 0) num3 = addI32(num3, MBIG);
611072
+ this.seedArray[num] = num3;
611073
+ this.inext = num;
611074
+ this.inextp = num2;
611075
+ return num3;
611076
+ }
611077
+ nextDouble() {
611078
+ return this.internalSample() * 4656612875245797e-25;
611079
+ }
611080
+ };
611081
+ function resample(t2, min, max) {
611082
+ const num2 = f32(2472623e-9);
611083
+ const num3 = f32(t2 * (1 - num2 * 2) + num2);
611084
+ const logArg = f32(1 / num3 - 1);
611085
+ const logF32 = f32(Math.log(logArg));
611086
+ return f32((-logF32 + 6) / 12 * (max - min) + min);
611087
+ }
611088
+ var BOUNDS_BY_TEMPLATE = /* @__PURE__ */ new Map();
611089
+ for (const g of geysers_default2) {
611090
+ if (g.minRatePerCycle === void 0 || g.maxRatePerCycle === void 0 || g.minIterationLength === void 0 || g.maxIterationLength === void 0 || g.minIterationPercent === void 0 || g.maxIterationPercent === void 0 || g.minYearLength === void 0 || g.maxYearLength === void 0 || g.minYearPercent === void 0 || g.maxYearPercent === void 0) {
611091
+ continue;
611092
+ }
611093
+ BOUNDS_BY_TEMPLATE.set(g.id, {
611094
+ minRatePerCycle: g.minRatePerCycle,
611095
+ maxRatePerCycle: g.maxRatePerCycle,
611096
+ minIterationLength: g.minIterationLength,
611097
+ maxIterationLength: g.maxIterationLength,
611098
+ minIterationPercent: g.minIterationPercent,
611099
+ maxIterationPercent: g.maxIterationPercent,
611100
+ minYearLength: g.minYearLength,
611101
+ maxYearLength: g.maxYearLength,
611102
+ minYearPercent: g.minYearPercent,
611103
+ maxYearPercent: g.maxYearPercent
611104
+ });
611105
+ }
611106
+ function rollScaled(template, clusterX, clusterY, globalWorldSeed) {
611107
+ const b = BOUNDS_BY_TEMPLATE.get(template);
611108
+ if (!b) return null;
611109
+ const seed = toI32(globalWorldSeed + toI32(clusterX) + toI32(clusterY));
611110
+ const rs = new KRandom(seed);
611111
+ const rateRoll = f32(rs.nextDouble());
611112
+ const iterLenRoll = f32(rs.nextDouble());
611113
+ const iterPctRoll = f32(rs.nextDouble());
611114
+ const yearLenRoll = f32(rs.nextDouble());
611115
+ const yearPctRoll = f32(rs.nextDouble());
611116
+ return {
611117
+ scaled_rate: resample(rateRoll, b.minRatePerCycle, b.maxRatePerCycle),
611118
+ scaled_iter_len: resample(iterLenRoll, b.minIterationLength, b.maxIterationLength),
611119
+ scaled_iter_pct: resample(iterPctRoll, b.minIterationPercent, b.maxIterationPercent),
611120
+ scaled_year_len: resample(yearLenRoll, b.minYearLength, b.maxYearLength),
611121
+ scaled_year_pct: resample(yearPctRoll, b.minYearPercent, b.maxYearPercent),
611122
+ rateRoll,
611123
+ iterationLengthRoll: iterLenRoll,
611124
+ iterationPercentRoll: iterPctRoll,
611125
+ yearLengthRoll: yearLenRoll,
611126
+ yearPercentRoll: yearPctRoll
611127
+ };
611128
+ }
611129
+
611130
+ // ../../apps/onimaxxing/src/gambling/builder/god-roll.ts
611131
+ var GOD_ROLL_SEED_INPUT = 71414151;
611132
+ var FALLBACK_SUM_MAX = 4096;
611133
+ var FALLBACK_WORLD_COUNT = 16;
611134
+ var expectedByType = /* @__PURE__ */ new Map();
611135
+ function expectedFor(type2) {
611136
+ const hit = expectedByType.get(type2);
611137
+ if (hit !== void 0) return hit;
611138
+ const r = rollScaled(type2, 0, 0, GOD_ROLL_SEED_INPUT);
611139
+ const v = r ? [r.scaled_rate, r.scaled_iter_len, r.scaled_iter_pct, r.scaled_year_len, r.scaled_year_pct] : null;
611140
+ expectedByType.set(type2, v);
611141
+ return v;
611142
+ }
611143
+ function close(a, b) {
611144
+ return a !== void 0 && Math.abs(a - b) <= 1e-6 * Math.max(1, Math.abs(b));
611145
+ }
611146
+ function isGodRollGeyser(type2, g) {
611147
+ const e = expectedFor(type2);
611148
+ if (!e) return false;
611149
+ return close(g.scaled_rate, e[0]) && close(g.scaled_iter_len, e[1]) && close(g.scaled_iter_pct, e[2]) && close(g.scaled_year_len, e[3]) && close(g.scaled_year_pct, e[4]);
611150
+ }
611151
+ function canonicalWorldPath(yamlPath) {
611152
+ const dlc = /^dlc\/([^/]+)\/worldgen\/worlds\/(.+)\.yaml$/.exec(yamlPath);
611153
+ if (dlc) return `${dlc[1]}::worlds/${dlc[2]}`;
611154
+ const base = /^worldgen\/worlds\/(.+)\.yaml$/.exec(yamlPath);
611155
+ return base ? `worlds/${base[1]}` : null;
611156
+ }
611157
+ var SIZE_BY_PATH = /* @__PURE__ */ new Map();
611158
+ var mixingMax = { w: 0, h: 0 };
611159
+ for (const row of worlds_default2) {
611160
+ const path = canonicalWorldPath(row.yamlPath);
611161
+ if (!path) continue;
611162
+ const raw = row;
611163
+ if (raw.worldsize?.X === void 0 || raw.worldsize.Y === void 0) continue;
611164
+ const size = { w: raw.worldsize.X, h: raw.worldsize.Y };
611165
+ SIZE_BY_PATH.set(path, size);
611166
+ if (raw.worldTags?.includes("Mixing")) {
611167
+ mixingMax = { w: Math.max(mixingMax.w, size.w), h: Math.max(mixingMax.h, size.h) };
611168
+ }
611169
+ }
611170
+ function clusterSumMax(placements) {
611171
+ let widths = 0;
611172
+ let tallest = 0;
611173
+ for (const p of placements) {
611174
+ const size = p.world ? SIZE_BY_PATH.get(p.world) : void 0;
611175
+ if (!size) return null;
611176
+ const w = p.worldMixing ? Math.max(size.w, mixingMax.w) : size.w;
611177
+ const h = p.worldMixing ? Math.max(size.h, mixingMax.h) : size.h;
611178
+ widths += w + 2;
611179
+ tallest = Math.max(tallest, h);
611180
+ }
611181
+ return widths + tallest + 32;
611182
+ }
611183
+ function godRollSeedWindow(coord) {
611184
+ const prefix = matchClusterPrefix(coord);
611185
+ const cluster = prefix ? clusters_default2.find((c) => c.coordinatePrefix === prefix) : void 0;
611186
+ const placements = cluster?.worldPlacements ?? [];
611187
+ const sumMax = placements.length > 0 ? clusterSumMax(placements) : null;
611188
+ if (sumMax === null) {
611189
+ const lo = GOD_ROLL_SEED_INPUT - (FALLBACK_WORLD_COUNT - 1) - FALLBACK_SUM_MAX;
611190
+ return { lo: Math.max(0, lo), hi: GOD_ROLL_SEED_INPUT + 1 };
611191
+ }
611192
+ const top = GOD_ROLL_SEED_INPUT - (placements.length - 1);
611193
+ return { lo: Math.max(0, top - sumMax), hi: top + 1 };
611194
+ }
611195
+ function specGodRollWindow(constraints, coord) {
611196
+ return constraints.some((c) => c.kind === "world.geyserGodRoll") ? godRollSeedWindow(coord) : null;
611197
+ }
611198
+
611199
+ // ../../apps/onimaxxing/src/gambling/query/validate-ast.ts
611200
+ var f322 = Math.fround;
610966
611201
  function projectAvgKgPerS(g) {
610967
611202
  const { scaled_rate, scaled_iter_len, scaled_iter_pct, scaled_year_len, scaled_year_pct } = g;
610968
611203
  if (scaled_rate === void 0 || scaled_iter_len === void 0 || scaled_iter_pct === void 0 || scaled_year_len === void 0 || scaled_year_pct === void 0) {
610969
611204
  return 0;
610970
611205
  }
610971
611206
  const iterationLength = scaled_iter_len;
610972
- const iterationPercent = f32(Math.max(0, Math.min(1, scaled_iter_pct)));
610973
- const onDuration = f32(iterationLength * iterationPercent);
611207
+ const iterationPercent = f322(Math.max(0, Math.min(1, scaled_iter_pct)));
611208
+ const onDuration = f322(iterationLength * iterationPercent);
610974
611209
  const yearLength = scaled_year_len;
610975
- const yearPercent = f32(Math.max(0, Math.min(1, scaled_year_pct)));
610976
- const yearOnDuration = f32(yearLength * yearPercent);
610977
- const emitRate = onDuration > 0 ? f32(f32(scaled_rate / f32(600 / iterationLength)) / onDuration) : 0;
610978
- const avg = f32(yearOnDuration / iterationLength * (emitRate * onDuration) / yearLength);
611210
+ const yearPercent = f322(Math.max(0, Math.min(1, scaled_year_pct)));
611211
+ const yearOnDuration = f322(yearLength * yearPercent);
611212
+ const emitRate = onDuration > 0 ? f322(f322(scaled_rate / f322(600 / iterationLength)) / onDuration) : 0;
611213
+ const avg = f322(yearOnDuration / iterationLength * (emitRate * onDuration) / yearLength);
610979
611214
  return Number.isFinite(avg) ? avg : 0;
610980
611215
  }
610981
611216
  function summarizeWorldgen(data2, spacePoiScore = 0) {
@@ -611248,6 +611483,14 @@ function geyserCount(world, type2) {
611248
611483
  }
611249
611484
  return n;
611250
611485
  }
611486
+ function godRollGeyserCount(world, type2) {
611487
+ if (!world) return 0;
611488
+ let n = 0;
611489
+ for (const g of world.geysers) {
611490
+ if ((g.type ?? g.tag) === type2 && isGodRollGeyser(type2, g)) n++;
611491
+ }
611492
+ return n;
611493
+ }
611251
611494
  function clusterGeyserSum(map2, type2) {
611252
611495
  let sum = 0;
611253
611496
  for (const w of map2.worlds) sum += geyserSum(w, type2);
@@ -611824,6 +612067,7 @@ var ADVANCED_HELPERS = {
611824
612067
  clusterSpawnCount,
611825
612068
  templateCount,
611826
612069
  clusterTemplateCount,
612070
+ godRollGeyserCount,
611827
612071
  oilWells,
611828
612072
  critterCount,
611829
612073
  plantCount,
@@ -612395,6 +612639,16 @@ var CONSTRAINT_KIND_CATALOG = [
612395
612639
  },
612396
612640
  outputHint: "Set `output` to shape the rate gate: `uniform` demands EACH geyser meet the threshold; `sum` gates on the combined kg/s; `tiers` compares [sorted geyser rates] against your ordered thresholds slot-by-slot. `null` (default) means count-only, no rate gate."
612397
612641
  },
612642
+ {
612643
+ kind: "world.geyserGodRoll",
612644
+ hint: "A geyser of this type with the best stats it can roll (seed input 71414151). A filter only (mode `require`): the scan covers only the cluster seeds that can place one, so seedRangeStart/End are replaced by that window.",
612645
+ example: {
612646
+ kind: "world.geyserGodRoll",
612647
+ mode: "require",
612648
+ world: { kind: "homeWorld" },
612649
+ geyser: "salt_water"
612650
+ }
612651
+ },
612398
612652
  {
612399
612653
  kind: "world.distToHome",
612400
612654
  hint: "Hex distance from home to a specific world.",
@@ -612429,6 +612683,18 @@ var CONSTRAINT_KIND_CATALOG = [
612429
612683
  n: 2
612430
612684
  }
612431
612685
  },
612686
+ {
612687
+ kind: "destination.count",
612688
+ hint: "Count of a base-game starmap destination type, optionally within a distance tier. Base-game clusters only. Worldgen fixes type and distance; masses roll in game.",
612689
+ example: {
612690
+ kind: "destination.count",
612691
+ mode: "require",
612692
+ destType: "GoldAsteroid",
612693
+ op: ">=",
612694
+ n: 1,
612695
+ maxDistance: 4
612696
+ }
612697
+ },
612432
612698
  {
612433
612699
  kind: "poi.count",
612434
612700
  hint: "Count of a POI type in the cluster, with optional cap/recharge gates.",
@@ -612697,7 +612963,7 @@ import { createRequire as createRequire2 } from "module";
612697
612963
  import { dirname, join } from "path";
612698
612964
  import { fileURLToPath } from "url";
612699
612965
 
612700
- // ../../node_modules/.pnpm/@tigin-backwards+oxygen-not-included-gambling@0.6.4/node_modules/@tigin-backwards/oxygen-not-included-gambling/oni_roll_wasm.js
612966
+ // ../../node_modules/.pnpm/@tigin-backwards+oxygen-not-included-gambling@0.6.5/node_modules/@tigin-backwards/oxygen-not-included-gambling/oni_roll_wasm.js
612701
612967
  var Roller = class {
612702
612968
  __destroy_into_raw() {
612703
612969
  const ptr = this.__wbg_ptr;
@@ -613230,19 +613496,19 @@ function projectDeep(map2) {
613230
613496
  });
613231
613497
  }
613232
613498
  function projectAvgKgPerS3(g) {
613233
- const f322 = Math.fround;
613499
+ const f323 = Math.fround;
613234
613500
  const { scaled_rate, scaled_iter_len, scaled_iter_pct, scaled_year_len, scaled_year_pct } = g;
613235
613501
  if (scaled_rate === void 0 || scaled_iter_len === void 0 || scaled_iter_pct === void 0 || scaled_year_len === void 0 || scaled_year_pct === void 0) {
613236
613502
  return 0;
613237
613503
  }
613238
613504
  const iterationLength = scaled_iter_len;
613239
- const iterationPercent = f322(Math.max(0, Math.min(1, scaled_iter_pct)));
613240
- const onDuration = f322(iterationLength * iterationPercent);
613505
+ const iterationPercent = f323(Math.max(0, Math.min(1, scaled_iter_pct)));
613506
+ const onDuration = f323(iterationLength * iterationPercent);
613241
613507
  const yearLength = scaled_year_len;
613242
- const yearPercent = f322(Math.max(0, Math.min(1, scaled_year_pct)));
613243
- const yearOnDuration = f322(yearLength * yearPercent);
613244
- const emitRate = onDuration > 0 ? f322(f322(scaled_rate / f322(600 / iterationLength)) / onDuration) : 0;
613245
- const avg = f322(yearOnDuration / iterationLength * (emitRate * onDuration) / yearLength);
613508
+ const yearPercent = f323(Math.max(0, Math.min(1, scaled_year_pct)));
613509
+ const yearOnDuration = f323(yearLength * yearPercent);
613510
+ const emitRate = onDuration > 0 ? f323(f323(scaled_rate / f323(600 / iterationLength)) / onDuration) : 0;
613511
+ const avg = f323(yearOnDuration / iterationLength * (emitRate * onDuration) / yearLength);
613246
613512
  return Number.isFinite(avg) ? avg : 0;
613247
613513
  }
613248
613514
  function narrateSeed(seedCoord, summary, deep) {
@@ -613579,6 +613845,13 @@ function describeConstraint(c) {
613579
613845
  const tiers = c.output.tiers.map((t2) => `${t2} kg/s`).join(" + ");
613580
613846
  return `${head}, with tiered rates ${tiers}`;
613581
613847
  }
613848
+ case "world.geyserGodRoll":
613849
+ return `${refLabel(c.world)} has a ${geyserTemplateName(c.geyser)} with the best possible roll`;
613850
+ case "destination.count": {
613851
+ const name = spaceDestinationName(c.destType);
613852
+ const head = `The starmap has ${cmpCount(c.op, c.n, name, pluralize(name))}`;
613853
+ return c.maxDistance === null ? head : `${head} within ${destinationDistanceKm(c.maxDistance)}`;
613854
+ }
613582
613855
  case "poi.count": {
613583
613856
  const name = spacePoiName(c.poiType);
613584
613857
  let head = `The cluster has ${cmpCount(c.op, c.n, name, pluralize(name))}`;
@@ -613659,6 +613932,9 @@ function pluralize(name) {
613659
613932
  if (/o$/i.test(name)) return `${name}es`;
613660
613933
  return `${name}s`;
613661
613934
  }
613935
+ function destinationDistanceKm(tier) {
613936
+ return `${((tier + 1) * 1e4).toLocaleString("en-US")} km`;
613937
+ }
613662
613938
  function cmpCount(op, n, singular, plural) {
613663
613939
  const noun = n === 1 ? singular : plural;
613664
613940
  switch (op) {
@@ -613838,7 +614114,7 @@ function compileToJs(constraints, opts = {}) {
613838
614114
  for (const c of partials) {
613839
614115
  let ref2 = null;
613840
614116
  if (c.kind === "home.geyserNearStart") ref2 = { kind: "homeWorld" };
613841
- else if (c.kind === "world.geyser" || c.kind === "world.oilWells" || c.kind === "world.template") {
614117
+ else if (c.kind === "world.geyser" || c.kind === "world.geyserGodRoll" || c.kind === "world.oilWells" || c.kind === "world.template") {
613842
614118
  ref2 = c.world;
613843
614119
  }
613844
614120
  if (ref2 === null) continue;
@@ -613953,8 +614229,20 @@ function compileRequire(c, emit) {
613953
614229
  case "world.geyser":
613954
614230
  case "cluster.geyser":
613955
614231
  return compileGeyserRequire(c, emit);
614232
+ case "world.geyserGodRoll": {
614233
+ const v = emit(c.world);
614234
+ return [
614235
+ `// ${describe(c)}`,
614236
+ `if (${v} < 0 || godRollGeyserCount(${worldExprFor(c.world)}, ${jsstr(c.geyser)}) < 1) return { pass: false };`
614237
+ ];
614238
+ }
613956
614239
  case "poi.count":
613957
614240
  return compilePoiCountRequire(c);
614241
+ case "destination.count":
614242
+ return [
614243
+ `// ${describe(c)}`,
614244
+ `if (!(${destinationCountExpr(c)} ${c.op} ${c.n})) return { pass: false };`
614245
+ ];
613958
614246
  case "map.elementMass": {
613959
614247
  const worldExpr = c.world.kind === "homeWorld" ? "homeWorld(map)" : `findWorld(map, ${jsstr(pathClassName(c.world.path))})`;
613960
614248
  return [
@@ -614127,8 +614415,12 @@ function colExpr(c, emit) {
614127
614415
  case "world.geyser":
614128
614416
  case "cluster.geyser":
614129
614417
  return geyserPool(c, emit).sumCall;
614418
+ case "world.geyserGodRoll":
614419
+ return `godRollGeyserCount(${worldExprFor(c.world)}, ${jsstr(c.geyser)})`;
614130
614420
  case "poi.count":
614131
614421
  return poiCountDiagnosticExpr(c);
614422
+ case "destination.count":
614423
+ return destinationCountExpr(c);
614132
614424
  case "map.elementMass": {
614133
614425
  const wExpr = c.world.kind === "homeWorld" ? "homeWorld(map)" : `findWorld(map, ${jsstr(pathClassName(c.world.path))})`;
614134
614426
  return `elementMass(map, ${jsstr(c.element)}, ${wExpr})`;
@@ -614238,8 +614530,14 @@ function preferMatchExpr(c, emit) {
614238
614530
  case "world.geyser":
614239
614531
  case "cluster.geyser":
614240
614532
  return compileGeyserPreferExpr(c, emit);
614533
+ case "world.geyserGodRoll": {
614534
+ const v = emit(c.world);
614535
+ return `${v} >= 0 && godRollGeyserCount(${worldExprFor(c.world)}, ${jsstr(c.geyser)}) >= 1`;
614536
+ }
614241
614537
  case "poi.count":
614242
614538
  return poiCountMatchExpr(c);
614539
+ case "destination.count":
614540
+ return `(${destinationCountExpr(c)} ${c.op} ${c.n})`;
614243
614541
  case "map.elementMass": {
614244
614542
  const worldExpr = c.world.kind === "homeWorld" ? "homeWorld(map)" : `findWorld(map, ${jsstr(pathClassName(c.world.path))})`;
614245
614543
  return `elementMass(map, ${jsstr(c.element)}, ${worldExpr}) ${c.op} ${c.kg}`;
@@ -614346,8 +614644,12 @@ function columnName(c, idx) {
614346
614644
  return `${refTag(c.world)}_${c.geyser}_geyser`;
614347
614645
  case "cluster.geyser":
614348
614646
  return `cluster_${c.geyser}_geyser`;
614647
+ case "world.geyserGodRoll":
614648
+ return `${refTag(c.world)}_${c.geyser}_godRoll`;
614349
614649
  case "poi.count":
614350
614650
  return `poi_${c.poiType.replace(/^HarvestableSpacePOI_|^ArtifactSpacePOI_/, "")}`;
614651
+ case "destination.count":
614652
+ return `dest_${c.destType}`;
614351
614653
  case "map.elementMass":
614352
614654
  return `${refTag(c.world)}_${c.element}`;
614353
614655
  case "home.geyserNearStart":
@@ -614487,6 +614789,10 @@ function poiCountDiagnosticExpr(c) {
614487
614789
  }
614488
614790
  return `(() => { const s = (${caps}).slice().sort((a,b)=>b-a); return s[${c.output.tiers.length - 1}] ?? -1; })()`;
614489
614791
  }
614792
+ function destinationCountExpr(c) {
614793
+ if (c.maxDistance === null) return `countVanilla(summary, ${jsstr(c.destType)})`;
614794
+ return `summary.vanilla_destinations.filter(d => d.dest_type === ${jsstr(c.destType)} && d.distance <= ${c.maxDistance}).length`;
614795
+ }
614490
614796
  function jsident(s) {
614491
614797
  return s.replace(/[^A-Za-z0-9_]/g, "_");
614492
614798
  }
@@ -614836,6 +615142,12 @@ var constraintSchema = z7.discriminatedUnion("kind", [
614836
615142
  n: z7.number().int(),
614837
615143
  output: GeyserOutputSpec.default(null)
614838
615144
  }),
615145
+ z7.object({
615146
+ kind: z7.literal("world.geyserGodRoll"),
615147
+ mode: z7.literal("require").describe("A filter only: no prefer form."),
615148
+ world: WorldRef,
615149
+ geyser: z7.string().describe("KG geyser template id (e.g. 'salt_water', 'methane', 'molten_iron').")
615150
+ }),
614839
615151
  z7.object({
614840
615152
  kind: z7.literal("world.distToHome"),
614841
615153
  mode: ConstraintMode,
@@ -614872,6 +615184,20 @@ var constraintSchema = z7.discriminatedUnion("kind", [
614872
615184
  output: PoiOutputSpec.default(null),
614873
615185
  recharge: PoiRechargeFilter.default(null)
614874
615186
  }),
615187
+ // ── Base-game starmap destination (summary tier) ───────────────
615188
+ z7.object({
615189
+ kind: z7.literal("destination.count"),
615190
+ mode: ConstraintMode,
615191
+ weight: z7.number().optional(),
615192
+ destType: z7.string().describe(
615193
+ "SpaceDestinationTypes id on the base-game linear starmap, e.g. 'GoldAsteroid', 'TerraPlanet'. Base-game clusters only; Spaced Out clusters place none."
615194
+ ),
615195
+ op: CmpOp,
615196
+ n: z7.number().int(),
615197
+ maxDistance: z7.number().int().min(0).nullable().default(null).describe(
615198
+ "Count only destinations at this zero-based distance tier or closer (tier d = (d+1) x 10,000 km in game). null = any distance."
615199
+ )
615200
+ }),
614875
615201
  // ── Map-level (JS tier, awaits worldgen) ───────────────────────
614876
615202
  z7.object({
614877
615203
  kind: z7.literal("map.elementMass"),
@@ -615196,6 +615522,96 @@ function progressLine(args) {
615196
615522
  return parts.join(", ");
615197
615523
  }
615198
615524
 
615525
+ // ../knowledge-graph/dist/tables/space-destination-tiers.json
615526
+ var space_destination_tiers_default = { always: [{ distance: 4, type: "Earth" }, { distance: 17, type: "Wormhole" }], fixed: [{ distance: 0, type: "CarbonaceousAsteroid" }, { distance: 0, type: "CarbonaceousAsteroid" }, { distance: 1, type: "MetallicAsteroid" }, { distance: 2, type: "RockyAsteroid" }, { distance: 3, type: "IcyDwarf" }, { distance: 4, type: "OrganicDwarf" }], mixed: [{ dlcId: "DLC2_ID", maxTier: 10, minTier: 3, type: "DLC2CeresSpaceDestination" }, { dlcId: "DLC4_ID", maxTier: 10, minTier: 3, type: "DLC4PrehistoricSpaceDestination" }, { dlcId: "DLC5_ID", maxTier: 10, minTier: 3, type: "DLC5AquaticSpaceDestination" }], picksPerTier: 3, randomCountMaxExclusive: 25, randomCountMin: 15, tiers: [{ distance: 0, types: [] }, { distance: 1, types: ["OilyAsteriod"] }, { distance: 2, types: ["Satellite"] }, { distance: 3, types: ["Satellite", "RockyAsteroid", "CarbonaceousAsteroid", "ForestPlanet"] }, { distance: 4, types: ["MetallicAsteroid", "RockyAsteroid", "CarbonaceousAsteroid", "SaltDwarf"] }, { distance: 5, types: ["MetallicAsteroid", "RockyAsteroid", "CarbonaceousAsteroid", "IcyDwarf", "OrganicDwarf"] }, { distance: 6, types: ["IcyDwarf", "OrganicDwarf", "DustyMoon", "ChlorinePlanet", "RedDwarf"] }, { distance: 7, types: ["DustyMoon", "TerraPlanet", "VolcanoPlanet"] }, { distance: 8, types: ["TerraPlanet", "GasGiant", "IceGiant", "RustPlanet"] }, { distance: 9, types: ["GasGiant", "IceGiant", "HeliumGiant"] }, { distance: 10, types: ["RustPlanet", "VolcanoPlanet", "RockyAsteroid", "TerraPlanet", "MetallicAsteroid"] }, { distance: 11, types: ["ShinyPlanet", "MetallicAsteroid", "RockyAsteroid"] }, { distance: 12, types: ["GoldAsteroid", "OrganicDwarf", "ForestPlanet", "ChlorinePlanet"] }, { distance: 13, types: ["IcyDwarf", "MetallicAsteroid", "DustyMoon", "VolcanoPlanet", "IceGiant"] }, { distance: 14, types: ["ShinyPlanet", "RedDwarf", "RockyAsteroid", "GasGiant"] }, { distance: 15, types: ["HeliumGiant", "ForestPlanet", "OilyAsteriod"] }, { distance: 16, types: ["GoldAsteroid", "SaltDwarf", "TerraPlanet", "VolcanoPlanet"] }] };
615527
+
615528
+ // ../knowledge-graph/src/tables/space-destination-tiers.ts
615529
+ var spaceDestinationTiers = space_destination_tiers_default;
615530
+ var space_destination_tiers_default2 = spaceDestinationTiers;
615531
+
615532
+ // ../../apps/onimaxxing/src/shared/destination-admissibility.ts
615533
+ var RANDOM_MAX = space_destination_tiers_default2.randomCountMaxExclusive - 1;
615534
+ var PERMISSIVE = { mixingOff: /* @__PURE__ */ new Set(), spacedOut: false };
615535
+ function destinationContextForCoord(coord, clusterPrefix) {
615536
+ const mixing = oracleMixingForCoord(coord, clusterPrefix);
615537
+ if (!mixing) return PERMISSIVE;
615538
+ const required = new Set(
615539
+ clusters_default2.filter((c) => c.coordinatePrefix === mixing.clusterPrefix).flatMap((c) => c.requiredDlcIds ?? [])
615540
+ );
615541
+ if (required.has("EXPANSION1_ID")) return { mixingOff: /* @__PURE__ */ new Set(), spacedOut: true };
615542
+ const off = /* @__PURE__ */ new Set();
615543
+ for (const m of space_destination_tiers_default2.mixed) {
615544
+ const level = mixing.levels[m.dlcId.replace(/_ID$/, "Mixing")] ?? 0;
615545
+ if (level === 0 && !required.has(m.dlcId)) off.add(m.dlcId);
615546
+ }
615547
+ return { mixingOff: off, spacedOut: false };
615548
+ }
615549
+ function nearestDestinationTier(destType, ctx = PERMISSIVE) {
615550
+ if (ctx.spacedOut) return null;
615551
+ const candidates = [];
615552
+ for (const p of [...space_destination_tiers_default2.fixed, ...space_destination_tiers_default2.always]) {
615553
+ if (p.type === destType) candidates.push(p.distance);
615554
+ }
615555
+ for (const t2 of space_destination_tiers_default2.tiers) if (t2.types.includes(destType)) candidates.push(t2.distance);
615556
+ for (const m of space_destination_tiers_default2.mixed) {
615557
+ if (m.type === destType && !ctx.mixingOff.has(m.dlcId)) candidates.push(m.minTier);
615558
+ }
615559
+ return candidates.length === 0 ? null : Math.min(...candidates);
615560
+ }
615561
+ function destinationCountBounds(destType, maxDistance, ctx = PERMISSIVE) {
615562
+ if (ctx.spacedOut) return { min: 0, max: 0 };
615563
+ const within = (d) => maxDistance === null || d <= maxDistance;
615564
+ let guaranteed = 0;
615565
+ for (const p of [...space_destination_tiers_default2.fixed, ...space_destination_tiers_default2.always]) {
615566
+ if (p.type === destType && within(p.distance)) guaranteed++;
615567
+ }
615568
+ let random = 0;
615569
+ for (const t2 of space_destination_tiers_default2.tiers) {
615570
+ if (within(t2.distance) && t2.types.includes(destType)) random += space_destination_tiers_default2.picksPerTier;
615571
+ }
615572
+ let mixed = 0;
615573
+ for (const m of space_destination_tiers_default2.mixed) {
615574
+ if (m.type === destType && !ctx.mixingOff.has(m.dlcId) && within(m.minTier)) mixed++;
615575
+ }
615576
+ return { min: guaranteed, max: guaranteed + Math.min(random, RANDOM_MAX) + mixed };
615577
+ }
615578
+ function satisfiable(op, n, min, max) {
615579
+ switch (op) {
615580
+ case ">=":
615581
+ return max >= n;
615582
+ case ">":
615583
+ return max > n;
615584
+ case "<=":
615585
+ return min <= n;
615586
+ case "<":
615587
+ return min < n;
615588
+ case "==":
615589
+ return n >= min && n <= max;
615590
+ case "!=":
615591
+ return !(min === max && min === n);
615592
+ }
615593
+ }
615594
+ function destinationCountVerdict(rule, ctx = PERMISSIVE) {
615595
+ const { min, max } = destinationCountBounds(rule.destType, rule.maxDistance, ctx);
615596
+ if (satisfiable(rule.op, rule.n, min, max)) return { kind: "admitted" };
615597
+ const nearestTier = nearestDestinationTier(rule.destType, ctx);
615598
+ const anywhere = destinationCountBounds(rule.destType, null, ctx);
615599
+ const why = ctx.spacedOut ? "spaced-out" : nearestTier === null ? "never-placed" : max === 0 && anywhere.max > 0 && satisfiable(rule.op, rule.n, anywhere.min, anywhere.max) ? "too-close" : "count";
615600
+ return { kind: "impossible", why, nearestTier, min, max };
615601
+ }
615602
+ function describeDestinationVerdict(v, destType) {
615603
+ switch (v.why) {
615604
+ case "spaced-out":
615605
+ return "Spaced Out clusters have no base-game starmap, so they place no destinations.";
615606
+ case "never-placed":
615607
+ return `Worldgen never places '${destType}' on this cluster's starmap.`;
615608
+ case "too-close":
615609
+ return `'${destType}' is never closer than distance tier ${v.nearestTier}.`;
615610
+ case "count":
615611
+ return `A seed has between ${v.min} and ${v.max} '${destType}' in that range.`;
615612
+ }
615613
+ }
615614
+
615199
615615
  // src/verdicts.ts
615200
615616
  var STORY_TRAIT_BASENAMES2 = new Set(
615201
615617
  storytraits_default2.map(
@@ -615239,6 +615655,13 @@ function verdictOfConstraintSync(coord, c, vopts) {
615239
615655
  if (v.kind === "impossible") return v;
615240
615656
  return v.kind === "remix-only" ? v : admitted();
615241
615657
  }
615658
+ case "world.geyserGodRoll": {
615659
+ const worldPath = resolveWorldPath(coord, c.world);
615660
+ if (!worldPath) return { kind: "admitted", unknown: true };
615661
+ const v = worldAdmitsGeyserVerdict(worldPath, c.geyser, vopts);
615662
+ if (v.kind === "impossible") return v;
615663
+ return v.kind === "remix-only" ? v : admitted();
615664
+ }
615242
615665
  case "cluster.geyser": {
615243
615666
  if (!requiresPresence(c.countOp, c.n)) return admitted();
615244
615667
  const paths = allWorldPaths(coord);
@@ -615289,6 +615712,13 @@ function verdictOfConstraintSync(coord, c, vopts) {
615289
615712
  if (!pathA || !pathB) return { kind: "admitted", unknown: true };
615290
615713
  return worldToWorldDistanceVerdict(clusterPrefix, pathA, pathB, c.op, c.hexes);
615291
615714
  }
615715
+ case "destination.count": {
615716
+ const v = destinationCountVerdict(
615717
+ c,
615718
+ destinationContextForCoord(coord, clusterPrefixForCoord(coord))
615719
+ );
615720
+ return v.kind === "impossible" ? { kind: "impossible", reason: describeDestinationVerdict(v, c.destType) } : admitted();
615721
+ }
615292
615722
  case "map.elementMass": {
615293
615723
  const worldPath = resolveWorldPath(coord, c.world);
615294
615724
  if (!worldPath) return { kind: "admitted", unknown: true };
@@ -615733,6 +616163,7 @@ function canCompile(c) {
615733
616163
  if (c.mode !== "require") return false;
615734
616164
  if (!constraintBytecodeCapable(c.kind)) return false;
615735
616165
  if (c.kind === "poi.count" && (c.output !== null || c.recharge !== null)) return false;
616166
+ if (c.kind === "destination.count" && c.maxDistance !== null) return false;
615736
616167
  return true;
615737
616168
  }
615738
616169
  function needsHomeSubstitution(c) {
@@ -615807,6 +616238,7 @@ function tryCompileToBytecodeSource(constraints, clusterCoord) {
615807
616238
  addWorld(c.to);
615808
616239
  break;
615809
616240
  case "poi.count":
616241
+ case "destination.count":
615810
616242
  break;
615811
616243
  }
615812
616244
  }
@@ -615849,6 +616281,10 @@ function tryCompileToBytecodeSource(constraints, clusterCoord) {
615849
616281
  lines.push(`require(countPoi(${jsstr2(c.poiType)}) ${c.op} ${c.n});`);
615850
616282
  break;
615851
616283
  }
616284
+ case "destination.count": {
616285
+ lines.push(`require(countVanilla(${jsstr2(c.destType)}) ${c.op} ${c.n});`);
616286
+ break;
616287
+ }
615852
616288
  }
615853
616289
  }
615854
616290
  const seenColNames = /* @__PURE__ */ new Set();
@@ -615878,6 +616314,8 @@ function bytecodeColExpr(c) {
615878
616314
  return `dist(${refExpr(c.from)}, ${refExpr(c.to)})`;
615879
616315
  case "poi.count":
615880
616316
  return `countPoi(${jsstr2(c.poiType)})`;
616317
+ case "destination.count":
616318
+ return `countVanilla(${jsstr2(c.destType)})`;
615881
616319
  case "world.trait":
615882
616320
  case "world.asteroidRemix":
615883
616321
  return null;
@@ -615897,6 +616335,8 @@ function bytecodeColName(c, idx) {
615897
616335
  return `${refTag2(c.from)}_${refTag2(c.to)}_dist`;
615898
616336
  case "poi.count":
615899
616337
  return `poi_${c.poiType.replace(/^HarvestableSpacePOI_|^ArtifactSpacePOI_/, "")}`;
616338
+ case "destination.count":
616339
+ return `dest_${c.destType}`;
615900
616340
  default:
615901
616341
  return `col_${idx}`;
615902
616342
  }
@@ -617888,9 +618328,9 @@ pp$7.parseBindingAtom = function() {
617888
618328
  }
617889
618329
  return this.parseIdent();
617890
618330
  };
617891
- pp$7.parseBindingList = function(close, allowEmpty, allowTrailingComma, allowModifiers) {
618331
+ pp$7.parseBindingList = function(close2, allowEmpty, allowTrailingComma, allowModifiers) {
617892
618332
  var elts = [], first = true;
617893
- while (!this.eat(close)) {
618333
+ while (!this.eat(close2)) {
617894
618334
  if (first) {
617895
618335
  first = false;
617896
618336
  } else {
@@ -617898,7 +618338,7 @@ pp$7.parseBindingList = function(close, allowEmpty, allowTrailingComma, allowMod
617898
618338
  }
617899
618339
  if (allowEmpty && this.type === types$1.comma) {
617900
618340
  elts.push(null);
617901
- } else if (allowTrailingComma && this.afterTrailingComma(close)) {
618341
+ } else if (allowTrailingComma && this.afterTrailingComma(close2)) {
617902
618342
  break;
617903
618343
  } else if (this.type === types$1.ellipsis) {
617904
618344
  var rest = this.parseRestBinding();
@@ -617907,7 +618347,7 @@ pp$7.parseBindingList = function(close, allowEmpty, allowTrailingComma, allowMod
617907
618347
  if (this.type === types$1.comma) {
617908
618348
  this.raiseRecoverable(this.start, "Comma is not permitted after the rest element");
617909
618349
  }
617910
- this.expect(close);
618350
+ this.expect(close2);
617911
618351
  break;
617912
618352
  } else {
617913
618353
  elts.push(this.parseAssignableListItem(allowModifiers));
@@ -619073,12 +619513,12 @@ pp$5.checkParams = function(node, allowDuplicates) {
619073
619513
  this.checkLValInnerPattern(param, BIND_VAR, allowDuplicates ? null : nameHash);
619074
619514
  }
619075
619515
  };
619076
- pp$5.parseExprList = function(close, allowTrailingComma, allowEmpty, refDestructuringErrors) {
619516
+ pp$5.parseExprList = function(close2, allowTrailingComma, allowEmpty, refDestructuringErrors) {
619077
619517
  var elts = [], first = true;
619078
- while (!this.eat(close)) {
619518
+ while (!this.eat(close2)) {
619079
619519
  if (!first) {
619080
619520
  this.expect(types$1.comma);
619081
- if (allowTrailingComma && this.afterTrailingComma(close)) {
619521
+ if (allowTrailingComma && this.afterTrailingComma(close2)) {
619082
619522
  break;
619083
619523
  }
619084
619524
  } else {
@@ -621569,7 +622009,7 @@ function parse3(input, options) {
621569
622009
  return Parser.parse(input, options);
621570
622010
  }
621571
622011
 
621572
- // ../../node_modules/.pnpm/@tigin-backwards+oxygen-not-included-gambling@0.6.4/node_modules/@tigin-backwards/oxygen-not-included-gambling/query.js
622012
+ // ../../node_modules/.pnpm/@tigin-backwards+oxygen-not-included-gambling@0.6.5/node_modules/@tigin-backwards/oxygen-not-included-gambling/query.js
621573
622013
  var OP = {
621574
622014
  Nop: 0,
621575
622015
  PushI32: 1,
@@ -622751,7 +623191,7 @@ function registerScanTool(server) {
622751
623191
  coord: z9.string().min(3).describe("Cluster coord (e.g. 'V-AQU-C-1-0-0-0')."),
622752
623192
  spec: z9.object({
622753
623193
  constraints: z9.array(constraintSchema).describe(
622754
- "Builder AST constraint list. v0.4 covers every kind the web app builder supports: world.trait, world.geyser, world.distToHome, world.distTo, world.traitCount, world.oilWells, world.critter, world.plant, world.spawn, world.biomeCount, world.marshyTungstenInMagma, world.niobiumVolcanoAccess, world.sussy, world.trash, world.asteroidRemix, poi.count, map.elementMass, home.geyserNearStart, cluster.geyser, cluster.oilWells, cluster.critter, cluster.plant, cluster.spawn, cluster.sussy, cluster.trash. Call listConstraintKinds (v0.5) for the shape catalog."
623194
+ "Builder AST constraint list. v0.4 covers every kind the web app builder supports: world.trait, world.geyser, world.geyserGodRoll, world.distToHome, world.distTo, world.traitCount, world.oilWells, world.critter, world.plant, world.spawn, world.biomeCount, world.marshyTungstenInMagma, world.niobiumVolcanoAccess, world.sussy, world.trash, world.asteroidRemix, poi.count, destination.count, map.elementMass, home.geyserNearStart, cluster.geyser, cluster.oilWells, cluster.critter, cluster.plant, cluster.spawn, cluster.sussy, cluster.trash. Call listConstraintKinds (v0.5) for the shape catalog."
622755
623195
  ),
622756
623196
  preHook: z9.string().optional().describe(
622757
623197
  "v0.6 raw-JS escape hatch. Runs BEFORE Builder requires. Can `return {pass: false}` to skip a seed cheaper than any AST constraint. Async-first: top-level `await worldgen()` works, and an async `{pass: false}` gates the seed. Keep the cheap summary checks (hasTrait etc.) BEFORE the first await so rejected seeds never pay the worldgen cost. Store computed values on `scratch` (per-seed {}) for the postHook to turn into a score. Bindings: summary, seed, worldgen, col, scratch, plus every ADVANCED_HELPERS function (call listHelpers). Forces JS-tier (bytecode won't run). Must not shadow reserved names."
@@ -622784,8 +623224,10 @@ function registerScanTool(server) {
622784
623224
  },
622785
623225
  async ({ coord, spec, opts }, extra) => {
622786
623226
  const constraints = spec.constraints;
622787
- const rangeStart = opts.seedRangeStart;
622788
- const rangeEnd = opts.seedRangeEnd;
623227
+ const godRollWindow = specGodRollWindow(constraints, coord);
623228
+ const rangeStart = godRollWindow?.lo ?? opts.seedRangeStart;
623229
+ const rangeEnd = godRollWindow?.hi ?? opts.seedRangeEnd;
623230
+ const rangeNote = godRollWindow ? `Range replaced by the god-roll window: only cluster seeds ${godRollWindow.lo} to ${godRollWindow.hi - 1} can place a geyser that rolled from seed input ${GOD_ROLL_SEED_INPUT}.` : void 0;
622789
623231
  const topN = opts.topN;
622790
623232
  const sortBy = opts.sortBy;
622791
623233
  const order = opts.order;
@@ -622937,6 +623379,7 @@ function registerScanTool(server) {
622937
623379
  topN,
622938
623380
  rangeStart,
622939
623381
  rangeEnd,
623382
+ ...rangeNote !== void 0 ? { rangeNote } : {},
622940
623383
  sortBy,
622941
623384
  ...spec.hooksTier !== void 0 ? { declaredHooksTier: spec.hooksTier } : {},
622942
623385
  ...firstEvalError !== void 0 ? { evalError: firstEvalError } : {},
@@ -622988,6 +623431,7 @@ function successResponse(a) {
622988
623431
  totalScanned: a.totalScanned,
622989
623432
  seedRangeStart: a.rangeStart,
622990
623433
  seedRangeEnd: a.rangeEnd,
623434
+ ...a.rangeNote !== void 0 ? { seedRangeNote: a.rangeNote } : {},
622991
623435
  rollerBootMs: a.rollerBootMs,
622992
623436
  scanMs: a.scanMs,
622993
623437
  topN: a.topN,
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onimaxxing/sussy-seeds-mcp",
3
- "version": "0.9.2",
3
+ "version": "0.9.4",
4
4
  "description": "MCP server for Oxygen Not Included seed hunting. Runs the sussy-seeds wasm scanner over stdio; the LLM composes Builder AST specs and drives cluster / summary / map-tier scans against the game's real worldgen.",
5
5
  "keywords": [
6
6
  "claude",
@@ -47,17 +47,18 @@
47
47
  },
48
48
  "dependencies": {
49
49
  "@modelcontextprotocol/sdk": "1.26.0",
50
- "@onimaxxing/worldgen-node": "0.33.2",
50
+ "@onimaxxing/worldgen-node": "0.33.3",
51
51
  "zod": "^3.25.0"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@onimaxxing/coord-codec": "workspace:*",
55
+ "@onimaxxing/geyser-roll": "workspace:*",
55
56
  "@onimaxxing/i18n": "workspace:*",
56
57
  "@onimaxxing/knowledge-graph": "workspace:*",
57
58
  "@onimaxxing/prefab-kind": "workspace:*",
58
- "@onimaxxing/worldgen": "0.33.2",
59
+ "@onimaxxing/worldgen": "0.33.3",
59
60
  "@onimaxxing/worldmaxxing-registry": "workspace:*",
60
- "@tigin-backwards/oxygen-not-included-gambling": "0.6.4",
61
+ "@tigin-backwards/oxygen-not-included-gambling": "0.6.5",
61
62
  "@tigin-backwards/oxygen-not-included-mod-extensions": "0.13.0",
62
63
  "@types/node": "^24.10.1",
63
64
  "oxfmt": "0.53.0",