clone

an rts arena for scripts: submit tribe strategies over the web or mcp, run deterministic matches, watch them

feat: make the war meta fire — stone bootstrap, raid no-ops, phased bots, bigger maps

Dami committed 6d99d4c
- mine costs timber only (stone came only from miners, so a misspent
  starting 20 stone permanently locked a tribe out of the metal economy)
- raids on a target with no garrison, near-floor pop, and bare stores no
  longer resolve: no more farming a beaten camp for infinite battle wins
- warlord founds mining outposts properly: packs only affordable supplies,
  respects settle distance, retries instead of one-shotting; routes stone
  home alongside ore
- bulwark and magnate get phased labor policies (farm-first to ~150 pop,
  then their identity diet), affordability-aware build chains, reachable
  muster gates, and a landlocked check before betting on docks
- map ladder up one tier: 2-3 tribes 48, 4-5 64, 6-8 80 - most games now
  end with real wilderness between borders (~13% claimed in a 4-way)
- docs updated (map sizes, raid rule, mine bootstrap note)

Balance matrix (3 seeds x 8k ticks): every archetype wins somewhere
(homesteader 6, bulwark 5, warlord 5, magnate 2 of 18); bulwark counters
warlord 2/3; battles 87-1208 per warlord game, 0 in peaceful matchups.
commit
6d99d4c45fbe67e41cc0ff009771a20ac00bd065
parent
f53f681ac4f9987df9040a4aa9c2fd754f910c9b
author
Dami <dami.etoile@gmail.com>
14 files changed, +577 -127
M.gitignore2+
Mdocs/llms.txt33++-
Mpackages/engine/src/constants.ts57+++---
Mpackages/engine/src/world.ts21++-
Dpackages/engine/tsconfig.tsbuildinfo1-
Mpackages/protocol/src/game.ts23+-
Dpackages/protocol/tsconfig.tsbuildinfo1-
Mpackages/script-host/bots/bulwark.js66++++++-
Mpackages/script-host/bots/homesteader.js24+++-
Mpackages/script-host/bots/magnate.js66++++++-
Mpackages/script-host/bots/warlord.js110++++++++++++-
Mpackages/script-host/src/bots.ts266+++++++++++++++++++++++++++---
Dpackages/script-host/tsconfig.tsbuildinfo1-
Mworker/src/mcp/docs.ts33++-
M .gitignore +2 -0
M docs/llms.txt +21 -12
@@ -1,8 +1,8 @@
11 # Tribes — govern a tribe, throw it in the fishbowl22 33 Tribes is a deterministic strategy-game fishbowl. You submit a JavaScript4-strategy script ("logic") that GOVERNS a dense simulated tribe — 1,2005-citizens at the start, thousands later — pit 2-8 scripts against each other4+strategy script ("logic") that GOVERNS a simulated tribe — ten souls and a5+wagon at the start, thousands of citizens later — pit 2-8 scripts against each other66 on a shared map, and share replayable sims by URL. You do not push units77 around: you set persistent policies and the population executes them.88 Everything an agent needs — submitting scripts, running sims, starring, these
@@ -82,11 +82,16 @@ the sim bundle (metadata + locked script sources) is public at
8282 8383 ## The mental model: govern, don't micromanage8484 85-Your tribe is a POPULATION, not a unit roster. It starts as one settlement of86-1,200 citizens on a 64×64 map and grows into a multi-settlement polity of87-thousands. The simulation is dense cohort accounting: citizens are counted,88-apportioned into professions, fed, housed, and taxed by events — never89-addressed individually.85+Your tribe is a POPULATION, not a unit roster. It starts as a ten-soul86+founding CAMP: one hall (whose kitchen gardens and salvage yard bootstrap a87+trickle of food and timber), a wagon-load of supplies, four herds, a few88+spears — and grows, if you govern well, into a multi-settlement polity of89+thousands. THE EARLY GAME IS ESTABLISHMENT (think StarCraft openings): a90+frontier birth boom rewards free housing, monster camps stay away for the91+first ~1,200 ticks, and your build order — farms, lumber camps, houses, then92+workshops — decides everything. The simulation is dense cohort accounting:93+citizens are counted, apportioned into professions, fed, housed, and taxed by94+events — never addressed individually.9095 9196 Your script sets **persistent per-mille policies**: labor allocations, craft9297 splits, decrees, standing trade offers, standing routes, warband standing
@@ -226,7 +231,7 @@ population growth.
226231 | `dock` | — | fisher slots (must touch water) |227232 | `pasture` | — | herder slots; herds & horses live here |228233 | `lumber_camp` | — | woodcutter + carpenter slots |229-| `mine` | — | miner slots (hills/mountain/veins) |234+| `mine` | — | miner slots (hills/mountain/veins); costs timber only, so stone always bootstraps |230235 | `mill` | milling | miller slots |231236 | `bakery` | milling | baker slots |232237 | `brewery` | — | brewer slots |
@@ -293,7 +298,7 @@ territory means buying metal or taking someone else's.
293298 | --- | --- | --- |294299 | `tick` | number | Current tick, 0-based. |295300 | `tribeId` | number | Your tribe id. |296-| `mapSize` | number | Map is `mapSize × mapSize` tiles (64). |301+| `mapSize` | number | Map is `mapSize × mapSize` tiles (48-80, set by roster size). |297302 | `terrain` | string | Explored terrain (legend above). |298303 | `settlements` | `SettlementView[]` | Your settlements. |299304 | `warbands` | `WarbandView[]` | Your warbands. |
@@ -378,7 +383,10 @@ v2. One-shot verbs act once and are done. All are subject to the 64-order
378383 `garrison` (settlement id) — defend a settlement from inside;379384 `patrol` (`{x, y}`) — hold and sweep an area;380385 `march` (`{x, y}`) — move to a point, fighting hostiles and threats there;381- `raid` (settlement id or caravan id) — hit-and-run for loot, no capture;386+ `raid` (settlement id or caravan id) — hit-and-run for loot, no capture.387+ A target with nothing to take (no garrison, a handful of people, bare388+ stores) yields no battle at all: the band just waits at the gates, burning389+ supply. There is no glory farming the starving;382390 `besiege` (settlement id) — invest a settlement to grind walls and take it;383391 `escort` (caravan id) — guard a caravan;384392 `disband` (`null`) — soldiers rejoin the nearest settlement's population.
@@ -473,10 +481,11 @@ signaling, and coordination between agents.
473481 474482 | Limit | Value | Consequence |475483 | --- | --- | --- |476-| Map size | scales with roster: 2-3 tribes → 32 × 32, 4-5 → 48 × 48, 6-8 → 64 × 64 | — |484+| Map size | scales with roster: 2-3 tribes → 48 × 48, 4-5 → 64 × 64, 6-8 → 80 × 80 | — |477485 | Max ticks per sim | 10,000 | Sim ends at cap; highest score wins. |478486 | Tribes per sim | 2–8 | One script per tribe slot. |479-| Starting population | 1,200 | One founding settlement per tribe. |487+| Starting population | 10 | One founding camp per tribe; a frontier birth boom (scaled by free housing) grows it fast when fed and housed. |488+| Threat grace | 1,200 ticks | No monster camps spawn earlier — the establishment window. |480489 | Slow-tick cadence | 10 ticks | Slow systems + metrics frames (`SLOW_TICK_INTERVAL`). |481490 | Orders per tick | 64 | Extra orders are dropped and tallied (`ACTIONS_PER_TICK`). |482491 | Script source | 64 KiB UTF-8 | Larger submissions are rejected (stage `size`). |
M packages/engine/src/constants.ts +28 -29
@@ -302,6 +302,16 @@ export const MORALE_BLESSING_BONUS = 150;
302302 // ---------------------------------------------------------------------------303303 304304 export const BIRTH_RATE = 8; // ‰ per 10t, x housing x morale x surplus factors305+/** Frontier boom: extra birth rate (‰) scaled by FREE housing share. A young306+ * camp with room to grow booms StarCraft-style; growth tapers to BIRTH_RATE307+ * as housing fills. */308+export const BIRTH_BOOM_MAX = 55;309+/** Carpenters stop milling planks once this many sit unused in the310+ * settlement — they don't eat every stick of construction timber. */311+export const PLANKS_SOFT_CAP = 120;312+/** No monster camps spawn before this tick: the StarCraft-style safety313+ * window — ten souls get a fighting chance to establish before pressure. */314+export const THREAT_GRACE_TICKS = 1200;305315 export const NATURAL_DEATH_RATE = 2; // ‰ per 10t306316 export const EMIGRATION_MORALE = 300; // below this, people leave307317 /** Hardship (starvation/emigration/natural death) never empties a settlement
@@ -361,7 +371,8 @@ export const BUILD_SPECS: Record<Building, BuildingSpec> = {
361371 dock: { cost: { timber: 40 }, points: 80, tech: -1 },362372 pasture: { cost: { timber: 20 }, points: 50, tech: -1 },363373 lumber_camp: { cost: { timber: 20 }, points: 50, tech: -1 },364- mine: { cost: { timber: 30, stone: 20 }, points: 100, tech: -1 },374+ // timber-only: stone comes from miners, so the first mine must not need stone375+ mine: { cost: { timber: 40 }, points: 100, tech: -1 },365376 mill: { cost: { timber: 30, stone: 10 }, points: 100, tech: TECH_IDX.milling },366377 bakery: { cost: { timber: 30, stone: 20 }, points: 100, tech: TECH_IDX.milling },367378 brewery: { cost: { timber: 30, stone: 10 }, points: 100, tech: TECH_IDX.brewing },
@@ -604,40 +615,28 @@ export const SCORE_PER_BUILDING = 2;
604615 // ---------------------------------------------------------------------------605616 606617 export const START_MORALE = 600;607-export const START_HERDS = 40;608-export const START_HORSES = 10;618+export const START_HERDS = 4;619+export const START_HORSES = 0;609620 621+/** A founding CAMP, not a town: one hall (kitchen gardens + salvage yard622+ * bootstrap food and timber). Everything else must be built — establishing623+ * safety and an economy IS the early game. */610624 export const START_BUILDINGS: Partial<Record<Building, number>> = {611625 hall: 1,612- house: 10,613- granary: 1,614- warehouse: 1,615- farm: 10,616- pasture: 2,617- lumber_camp: 2,618- mine: 1,619- smithy: 1,620- market: 1,621- shrine: 1,622- library: 1,623- barracks: 1,624626 };625627 628+/** Wagon-load supplies for ten souls: days of food, a little materiel, a few629+ * spears. Armies, walls and workshops all come later — from the land. */626630 export const START_STORES: Partial<Record<Resource, number>> = {627- grain: 2000,628- meat: 100,629- hides: 50,630- timber: 400,631- stone: 250,632- coin: 100,633- metal: 40,634- leather: 40,635- tools: 250,636- // Starter armory arms a small home guard only; a raiding force must be637- // equipped from your own smithy chain (anti-rush).638- weapons: 24,639- armor: 8,640- clothes: 100,631+ grain: 150,632+ meat: 30,633+ hides: 8,634+ timber: 80,635+ stone: 20,636+ coin: 10,637+ tools: 12,638+ weapons: 4,639+ clothes: 12,641640 };642641 643642 /** Default craft splits (tools/weapons/armor; mill/brew/fodder). */
M packages/engine/src/world.ts +17 -4
@@ -1606,8 +1606,10 @@ class World implements EngineWorld {
16061606 this.prod(s.tribe, res, this.addStore(s, res, n));16071607 }16081608 }1609- // carpenter: 1 timber -> 1 plank1610- out = this.refine(s, ACC.CARP, wk[PI.carpenter]!, C.CARPENTER_RATE, st[RI.timber]!);1609+ // carpenter: 1 timber -> 1 plank (idle at the planks soft cap — they1610+ // must not starve construction of raw timber)1611+ const plankRoom = Math.max(0, C.PLANKS_SOFT_CAP - st[RI.planks]!);1612+ out = this.refine(s, ACC.CARP, wk[PI.carpenter]!, C.CARPENTER_RATE, Math.min(st[RI.timber]!, plankRoom));16111613 if (out > 0) {16121614 st[RI.timber]! -= out;16131615 this.cons(s.tribe, RI.timber, out);
@@ -2017,7 +2019,9 @@ class World implements EngineWorld {
20172019 // Combined factor in ‰ (each stage floors; keeps accumulators 32-bit).20182020 let f = Math.trunc((fHousing * s.morale) / 1000);20192021 f = Math.trunc((f * fSurplus) / 1000);2020- const bTotal = s.pop * C.BIRTH_RATE * f + s.acc[ACC.BIRTH]!;2022+ // Frontier boom: young settlements with empty housing grow fast.2023+ const boom = Math.trunc((C.BIRTH_BOOM_MAX * Math.max(0, housing - s.pop)) / Math.max(1, housing));2024+ const bTotal = s.pop * (C.BIRTH_RATE + boom) * f + s.acc[ACC.BIRTH]!;20212025 const births = Math.trunc(bTotal / 1_000_000);20222026 s.acc[ACC.BIRTH] = bTotal - births * 1_000_000;20232027 if (births > 0) {
@@ -2237,11 +2241,18 @@ class World implements EngineWorld {
22372241 }22382242 22392243 private resolveRaid(w: Warband, s: Settlement): void {2244+ const garrisons = this.garrisonsAt(s);2245+ // Nothing worth taking: an empty, cowed camp yields no battle. The band2246+ // waits at the gates (burning supply) until stores or people return.2247+ if (garrisons.length === 0 && Math.trunc(s.pop / 50) <= 0) {2248+ let lootable = 0;2249+ for (const res of LOOT_ORDER) lootable += s.stores[res]!;2250+ if (lootable <= 0) return;2251+ }22402252 w.engaged = true;22412253 const tribe = this.tribes[w.tribe]!;22422254 const victim = this.tribes[s.tribe]!;22432255 const rite = this.consumeWarRite(w);2244- const garrisons = this.garrisonsAt(s);22452256 let pa = Math.trunc((this.warbandPower(w, -1, 0) * (1000 + rite)) / 1000);22462257 let pd = this.settlementDefense(s, garrisons);22472258 pa = Math.trunc((pa * this.variance()) / 1000);
@@ -2743,6 +2754,8 @@ class World implements EngineWorld {
27432754 // -- phase 11: threats ----------------------------------------------------27442755 27452756 private phaseThreats(): void {2757+ // Grace period: the wilderness is quiet while camps are founded.2758+ if (this.tick < C.THREAT_GRACE_TICKS) return;27462759 // Growth.27472760 for (const camp of this.camps) {27482761 const cap = C.THREAT_BASE_STRENGTH[camp.kind]! * C.THREAT_STRENGTH_CAP_MULT;
D packages/engine/tsconfig.tsbuildinfo +0 -1
@@ -1 +0,0 @@
1-{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","./src/apportion.ts","../protocol/dist/game.d.ts","../../node_modules/zod/v4/core/json-schema.d.cts","../../node_modules/zod/v4/core/standard-schema.d.cts","../../node_modules/zod/v4/core/registries.d.cts","../../node_modules/zod/v4/core/to-json-schema.d.cts","../../node_modules/zod/v4/core/util.d.cts","../../node_modules/zod/v4/core/versions.d.cts","../../node_modules/zod/v4/core/schemas.d.cts","../../node_modules/zod/v4/core/checks.d.cts","../../node_modules/zod/v4/core/errors.d.cts","../../node_modules/zod/v4/core/core.d.cts","../../node_modules/zod/v4/core/parse.d.cts","../../node_modules/zod/v4/core/regexes.d.cts","../../node_modules/zod/v4/locales/ar.d.cts","../../node_modules/zod/v4/locales/az.d.cts","../../node_modules/zod/v4/locales/be.d.cts","../../node_modules/zod/v4/locales/bg.d.cts","../../node_modules/zod/v4/locales/ca.d.cts","../../node_modules/zod/v4/locales/cs.d.cts","../../node_modules/zod/v4/locales/da.d.cts","../../node_modules/zod/v4/locales/de.d.cts","../../node_modules/zod/v4/locales/el.d.cts","../../node_modules/zod/v4/locales/en.d.cts","../../node_modules/zod/v4/locales/eo.d.cts","../../node_modules/zod/v4/locales/es.d.cts","../../node_modules/zod/v4/locales/fa.d.cts","../../node_modules/zod/v4/locales/fi.d.cts","../../node_modules/zod/v4/locales/fr.d.cts","../../node_modules/zod/v4/locales/fr-ca.d.cts","../../node_modules/zod/v4/locales/he.d.cts","../../node_modules/zod/v4/locales/hr.d.cts","../../node_modules/zod/v4/locales/hu.d.cts","../../node_modules/zod/v4/locales/hy.d.cts","../../node_modules/zod/v4/locales/id.d.cts","../../node_modules/zod/v4/locales/is.d.cts","../../node_modules/zod/v4/locales/it.d.cts","../../node_modules/zod/v4/locales/ja.d.cts","../../node_modules/zod/v4/locales/ka.d.cts","../../node_modules/zod/v4/locales/kh.d.cts","../../node_modules/zod/v4/locales/km.d.cts","../../node_modules/zod/v4/locales/ko.d.cts","../../node_modules/zod/v4/locales/lt.d.cts","../../node_modules/zod/v4/locales/mk.d.cts","../../node_modules/zod/v4/locales/ms.d.cts","../../node_modules/zod/v4/locales/nl.d.cts","../../node_modules/zod/v4/locales/no.d.cts","../../node_modules/zod/v4/locales/ota.d.cts","../../node_modules/zod/v4/locales/ps.d.cts","../../node_modules/zod/v4/locales/pl.d.cts","../../node_modules/zod/v4/locales/pt.d.cts","../../node_modules/zod/v4/locales/ro.d.cts","../../node_modules/zod/v4/locales/ru.d.cts","../../node_modules/zod/v4/locales/sl.d.cts","../../node_modules/zod/v4/locales/sv.d.cts","../../node_modules/zod/v4/locales/ta.d.cts","../../node_modules/zod/v4/locales/th.d.cts","../../node_modules/zod/v4/locales/tr.d.cts","../../node_modules/zod/v4/locales/ua.d.cts","../../node_modules/zod/v4/locales/uk.d.cts","../../node_modules/zod/v4/locales/ur.d.cts","../../node_modules/zod/v4/locales/uz.d.cts","../../node_modules/zod/v4/locales/vi.d.cts","../../node_modules/zod/v4/locales/zh-cn.d.cts","../../node_modules/zod/v4/locales/zh-tw.d.cts","../../node_modules/zod/v4/locales/yo.d.cts","../../node_modules/zod/v4/locales/index.d.cts","../../node_modules/zod/v4/core/doc.d.cts","../../node_modules/zod/v4/core/api.d.cts","../../node_modules/zod/v4/core/json-schema-processors.d.cts","../../node_modules/zod/v4/core/json-schema-generator.d.cts","../../node_modules/zod/v4/core/index.d.cts","../../node_modules/zod/v4/classic/errors.d.cts","../../node_modules/zod/v4/classic/parse.d.cts","../../node_modules/zod/v4/classic/schemas.d.cts","../../node_modules/zod/v4/classic/checks.d.cts","../../node_modules/zod/v4/classic/compat.d.cts","../../node_modules/zod/v4/classic/from-json-schema.d.cts","../../node_modules/zod/v4/classic/iso.d.cts","../../node_modules/zod/v4/classic/coerce.d.cts","../../node_modules/zod/v4/classic/external.d.cts","../../node_modules/zod/index.d.cts","../protocol/dist/api.d.ts","../protocol/dist/index.d.ts","./src/constants.ts","./src/hash.ts","./src/rng.ts","./src/mapgen.ts","./src/world.ts","./src/index.ts","../../node_modules/@types/deep-eql/index.d.ts","../../node_modules/assertion-error/index.d.ts","../../node_modules/@types/chai/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/gensync/index.d.ts","../../node_modules/@types/jsesc/index.d.ts"],"fileIdsList":[[152,153],[142],[133],[133,136],[68,128,131,133,134,135,136,137,138,139,140,141],[64,66,136],[133,134],[65,133,135],[66,68,70,71,72,73],[68,70,72,73],[68,70,72],[65,68,70,71,73],[64,66,67,68,69,70,71,72,73,74,75,128,129,130,131,132],[64,66,67,70],[66,67,70],[70,73],[64,65,67,68,69,71,72,73],[64,65,66,70,133],[70,71,72,73],[72],[76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127],[145],[62,146,150],[146,148],[62,145,146,147,148,149],[143],[63,144]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"392d2b85a55284efc3df05960dde4ede8cba385ed1478432606a2ca0e693708b","signature":"477ad12a4b3a8f286d1cb2b419ea8add288c817aec37c47e64c6c6a1392e6ab9"},"a4a5b6da7b3312273484ced3d5f5922782ca0f1eed33d1ff26dfac9f2259cbd3",{"version":"c1a2e05eb6d7ca8d7e4a7f4c93ccf0c2857e842a64c98eaee4d85841ee9855e6","impliedFormat":1},{"version":"835fb2909ce458740fb4a49fc61709896c6864f5ce3db7f0a88f06c720d74d02","impliedFormat":1},{"version":"6e5857f38aa297a859cab4ec891408659218a5a2610cd317b6dcbef9979459cc","impliedFormat":1},{"version":"ead8e39c2e11891f286b06ae2aa71f208b1802661fcdb2425cffa4f494a68854","impliedFormat":1},{"version":"40ba6c32eb732a09e4446ade5cb6ad0c147f186f9c9dc6878b90b4418ad9f6ea","impliedFormat":1},{"version":"fdd814741843f85c98281522c58f5a646590ba9019fad2efaa95987655e0611b","impliedFormat":1},{"version":"c78aff4fb58b28b8f642d5095fc7eeb79f00e652a67caa19693af1adabb833c9","impliedFormat":1},{"version":"f80a08ced8818dc99359c0acd5b3f12762e1ce53758007759b0d4e503cbf4a5e","impliedFormat":1},{"version":"37935fa7564bcc6e0bc845b766a24391098d26f7c8245d6e8ab37bc016816e94","impliedFormat":1},{"version":"68add36d9632bc096d7245d24d6b0b8ad5f125183016102a3dad4c9c2438ccb0","impliedFormat":1},{"version":"3a819c2928ee06bbcc84e2797fd3558ae2ebb7e0ed8d87f71732fb2e2acc87b4","impliedFormat":1},{"version":"0f8a263f4c8595c8a07de52e3f3927640c44386c1aa2984de9eae50d75e613b2","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"346fffde7c32da87c2196eb7494422449dc2ca82d3b4e6bf55be1d1a33ffc2b0","impliedFormat":1},{"version":"add0ce7b77ba5b308492fa68f77f24d1ed1d9148534bdf05ac17c30763fc1a79","impliedFormat":1},{"version":"8b5875e4958528042103fdd775e106a7f76bafc29709f0690df9a7d2241d52a7","impliedFormat":1},{"version":"2f67911e4bf4e0717dc2ded248ce2d5e4398d945ee13889a6852c1233ea41508","impliedFormat":1},{"version":"d8430c275b0f59417ea8e173cfb888a4477b430ec35b595bf734f3ec7a7d729f","impliedFormat":1},{"version":"69364df1c776372d7df1fb46a6cb3a6bf7f55e700f533a104e3f9d70a32bec18","impliedFormat":1},{"version":"6042774c61ece4ba77b3bf375f15942eb054675b7957882a00c22c0e4fe5865c","impliedFormat":1},{"version":"5a3bd57ed7a9d9afef74c75f77fce79ba3c786401af9810cdf45907c4e93f30e","impliedFormat":1},{"version":"aef26cf95593c8ace1c62c4724f9afac77bdfa756fb8a00613cd152117cb2f43","impliedFormat":1},{"version":"30db853bb2e60170ba11e39ab48bacecb32d06d4def89eedf17e58ebab762a65","impliedFormat":1},{"version":"e27451b24234dfed45f6cf22112a04955183a99c42a2691fb4936d63cfe42761","impliedFormat":1},{"version":"2316301dd223d31962d917999acf8e543e0119c5d24ec984c9f22cb23247160c","impliedFormat":1},{"version":"58d65a2803c3b6629b0e18c8bf1bc883a686fcf0333230dd0151ab6e85b74307","impliedFormat":1},{"version":"e818471014c77c103330aee11f00a7a00b37b35500b53ea6f337aefacd6174c9","impliedFormat":1},{"version":"268fd6d9f2e807a39a6c5aa654b00f949feb63d3faa7dd0f9bba7dde9172159c","impliedFormat":1},{"version":"29f823cbe0166e10e7176a94afe609a24b9e5af3858628c541ff8ce1727023cd","impliedFormat":1},"39aa9272486cd0309104c4ea5399c527fd6c4c3ab51ba944fdea90d26cdc6675","cf39dbfc1e1091c11f157bf8c74b2d51f54d9233056b181688d680aff9caf06f",{"version":"26ad481afae4764e234370fafb4a409bc6b4d27991afd896a40f5e169d68f213","signature":"33d1b5fd97e855c111d42db6dc1bf4c4f4cc1b4250ff9394dc8195779f1bf5c3"},{"version":"b3ae0ebe569d566408bc58c42d2b7ab43956643096da5cf24e1893ccc4462470","signature":"b9674d8a64ccab87bfca2e0a184849d99ce466becc0d1b17156df78199eb6368"},{"version":"02011227f74a84ac69fe8259e7a75a80c829e2e48183f2fe4289f85dd305bd2e","signature":"c236355e23b97523f43af1b2e1fe931bdb278f06ac154ef1ef09d372e628c300"},{"version":"456fc45e241a13050cf9a7ba9651209f6d7f049dbbbcffceee8e2ed19e2ad46c","signature":"eb45a42e90b6d42e064e7e301066123c6a838fffe4e4f9f88ba5357ffd776784"},{"version":"ce751a28cca60bc732ae2cf9ac8abbe735e53c6200e1b72bb791c582bddc2336","signature":"80b747bc1691855763a4a7e1c9cc4010cb628681631e248b0aeeec049a4853e2"},"16e9b1536a7fb19b8602456639f40b23d64721d785eb8548d9f9e8b16ab7474d",{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"751764bb94219b4ce8f5475dc35d3de2e432fea01a0c9610cd7f69ad05e398c6","impliedFormat":1},{"version":"f17f57ca366ffa33c99fbb74011eeaac4636722fdeb63d6de90b3450765f584f","impliedFormat":1},{"version":"84a805c22a49922085dc337ca71ac0b85aad6d4dba6b01cee5bd5776ff54df39","impliedFormat":1}],"root":[62,[146,151]],"options":{"composite":true,"declaration":true,"module":99,"noUncheckedIndexedAccess":true,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":10},"referencedMap":[[154,1],[143,2],[137,3],[141,4],[138,4],[134,3],[142,5],[139,6],[140,4],[135,7],[136,8],[130,9],[71,10],[73,11],[72,12],[133,13],[132,14],[131,15],[74,10],[66,16],[70,17],[67,18],[68,19],[76,20],[77,20],[78,20],[79,20],[80,20],[81,20],[82,20],[83,20],[84,20],[85,20],[86,20],[87,20],[88,20],[89,20],[91,20],[90,20],[92,20],[93,20],[94,20],[95,20],[96,20],[128,21],[97,20],[98,20],[99,20],[100,20],[101,20],[102,20],[103,20],[104,20],[105,20],[106,20],[107,20],[108,20],[109,20],[111,20],[110,20],[112,20],[113,20],[114,20],[115,20],[116,20],[117,20],[118,20],[119,20],[120,20],[121,20],[122,20],[123,20],[124,20],[127,20],[125,20],[126,20],[146,22],[151,23],[149,24],[150,25],[144,26],[145,27]],"latestChangedDtsFile":"./dist/constants.d.ts","version":"5.9.3"}\ No newline at end of file
M packages/protocol/src/game.ts +12 -11
@@ -26,13 +26,14 @@
2626 // ---------------------------------------------------------------------------2727 2828 export const LIMITS = {29- /** Largest world (7-8 tribes); see mapSizeForTribes for the ladder. */30- MAP_SIZE: 64,29+ /** Largest world (6-8 tribes); see mapSizeForTribes for the ladder. */30+ MAP_SIZE: 80,3131 MAX_TICKS: 10_000,3232 MIN_TRIBES: 2,3333 MAX_TRIBES: 8,34- /** Starting population per tribe (single founding settlement). */35- START_POP: 1_200,34+ /** Starting population: a 10-soul founding camp. Tribes GROW into their35+ * thousands — establishing safety and an economy is the early game. */36+ START_POP: 10,3637 /** Cadence (ticks) for slow systems and metrics frames. */3738 SLOW_TICK_INTERVAL: 10,3839 /** Max UTF-8 bytes of a submitted script. */
@@ -68,15 +69,15 @@ export const LIMITS = {
6869 // ---------------------------------------------------------------------------6970 7071 /**71- * World size scales with the roster so games stay contested: 2-3 tribes fight72- * over 32×32, 4-5 over 48×48, 6-8 over 64×64. Floors are set by physical73- * feasibility: a tier-3 settlement's territory is 24×24 and 1,200 citizens74- * need real plains capacity, so 32 is the smallest world a tribe survives on.72+ * World size scales with the roster: 2-3 tribes share 48×48, 4-5 share 64×64,73+ * 6-8 share 80×80. Sized so contested ground exists without the map filling74+ * up — claim budgets cap each tribe's reach, and most games should end with75+ * real wilderness left between the borders.7576 */7677 export function mapSizeForTribes(tribeCount: number): number {77- if (tribeCount <= 3) return 32;78- if (tribeCount <= 5) return 48;79- return 64;78+ if (tribeCount <= 3) return 48;79+ if (tribeCount <= 5) return 64;80+ return 80;8081 }8182 8283 /** Resources in dependency chains: raw → intermediate → finished. */
D packages/protocol/tsconfig.tsbuildinfo +0 -1
@@ -1 +0,0 @@
1-{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/zod/v4/core/json-schema.d.cts","../../node_modules/zod/v4/core/standard-schema.d.cts","../../node_modules/zod/v4/core/registries.d.cts","../../node_modules/zod/v4/core/to-json-schema.d.cts","../../node_modules/zod/v4/core/util.d.cts","../../node_modules/zod/v4/core/versions.d.cts","../../node_modules/zod/v4/core/schemas.d.cts","../../node_modules/zod/v4/core/checks.d.cts","../../node_modules/zod/v4/core/errors.d.cts","../../node_modules/zod/v4/core/core.d.cts","../../node_modules/zod/v4/core/parse.d.cts","../../node_modules/zod/v4/core/regexes.d.cts","../../node_modules/zod/v4/locales/ar.d.cts","../../node_modules/zod/v4/locales/az.d.cts","../../node_modules/zod/v4/locales/be.d.cts","../../node_modules/zod/v4/locales/bg.d.cts","../../node_modules/zod/v4/locales/ca.d.cts","../../node_modules/zod/v4/locales/cs.d.cts","../../node_modules/zod/v4/locales/da.d.cts","../../node_modules/zod/v4/locales/de.d.cts","../../node_modules/zod/v4/locales/el.d.cts","../../node_modules/zod/v4/locales/en.d.cts","../../node_modules/zod/v4/locales/eo.d.cts","../../node_modules/zod/v4/locales/es.d.cts","../../node_modules/zod/v4/locales/fa.d.cts","../../node_modules/zod/v4/locales/fi.d.cts","../../node_modules/zod/v4/locales/fr.d.cts","../../node_modules/zod/v4/locales/fr-ca.d.cts","../../node_modules/zod/v4/locales/he.d.cts","../../node_modules/zod/v4/locales/hr.d.cts","../../node_modules/zod/v4/locales/hu.d.cts","../../node_modules/zod/v4/locales/hy.d.cts","../../node_modules/zod/v4/locales/id.d.cts","../../node_modules/zod/v4/locales/is.d.cts","../../node_modules/zod/v4/locales/it.d.cts","../../node_modules/zod/v4/locales/ja.d.cts","../../node_modules/zod/v4/locales/ka.d.cts","../../node_modules/zod/v4/locales/kh.d.cts","../../node_modules/zod/v4/locales/km.d.cts","../../node_modules/zod/v4/locales/ko.d.cts","../../node_modules/zod/v4/locales/lt.d.cts","../../node_modules/zod/v4/locales/mk.d.cts","../../node_modules/zod/v4/locales/ms.d.cts","../../node_modules/zod/v4/locales/nl.d.cts","../../node_modules/zod/v4/locales/no.d.cts","../../node_modules/zod/v4/locales/ota.d.cts","../../node_modules/zod/v4/locales/ps.d.cts","../../node_modules/zod/v4/locales/pl.d.cts","../../node_modules/zod/v4/locales/pt.d.cts","../../node_modules/zod/v4/locales/ro.d.cts","../../node_modules/zod/v4/locales/ru.d.cts","../../node_modules/zod/v4/locales/sl.d.cts","../../node_modules/zod/v4/locales/sv.d.cts","../../node_modules/zod/v4/locales/ta.d.cts","../../node_modules/zod/v4/locales/th.d.cts","../../node_modules/zod/v4/locales/tr.d.cts","../../node_modules/zod/v4/locales/ua.d.cts","../../node_modules/zod/v4/locales/uk.d.cts","../../node_modules/zod/v4/locales/ur.d.cts","../../node_modules/zod/v4/locales/uz.d.cts","../../node_modules/zod/v4/locales/vi.d.cts","../../node_modules/zod/v4/locales/zh-cn.d.cts","../../node_modules/zod/v4/locales/zh-tw.d.cts","../../node_modules/zod/v4/locales/yo.d.cts","../../node_modules/zod/v4/locales/index.d.cts","../../node_modules/zod/v4/core/doc.d.cts","../../node_modules/zod/v4/core/api.d.cts","../../node_modules/zod/v4/core/json-schema-processors.d.cts","../../node_modules/zod/v4/core/json-schema-generator.d.cts","../../node_modules/zod/v4/core/index.d.cts","../../node_modules/zod/v4/classic/errors.d.cts","../../node_modules/zod/v4/classic/parse.d.cts","../../node_modules/zod/v4/classic/schemas.d.cts","../../node_modules/zod/v4/classic/checks.d.cts","../../node_modules/zod/v4/classic/compat.d.cts","../../node_modules/zod/v4/classic/from-json-schema.d.cts","../../node_modules/zod/v4/classic/iso.d.cts","../../node_modules/zod/v4/classic/coerce.d.cts","../../node_modules/zod/v4/classic/external.d.cts","../../node_modules/zod/index.d.cts","./src/game.ts","./src/api.ts","./src/index.ts","../../node_modules/@types/deep-eql/index.d.ts","../../node_modules/assertion-error/index.d.ts","../../node_modules/@types/chai/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/gensync/index.d.ts","../../node_modules/@types/jsesc/index.d.ts"],"fileIdsList":[[145,146],[140],[131],[131,134],[66,126,129,131,132,133,134,135,136,137,138,139],[62,64,134],[131,132],[63,131,133],[64,66,68,69,70,71],[66,68,70,71],[66,68,70],[63,66,68,69,71],[62,64,65,66,67,68,69,70,71,72,73,126,127,128,129,130],[62,64,65,68],[64,65,68],[68,71],[62,63,65,66,67,69,70,71],[62,63,64,68,131],[68,69,70,71],[70],[74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125],[141,142],[142,143]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"c1a2e05eb6d7ca8d7e4a7f4c93ccf0c2857e842a64c98eaee4d85841ee9855e6","impliedFormat":1},{"version":"835fb2909ce458740fb4a49fc61709896c6864f5ce3db7f0a88f06c720d74d02","impliedFormat":1},{"version":"6e5857f38aa297a859cab4ec891408659218a5a2610cd317b6dcbef9979459cc","impliedFormat":1},{"version":"ead8e39c2e11891f286b06ae2aa71f208b1802661fcdb2425cffa4f494a68854","impliedFormat":1},{"version":"40ba6c32eb732a09e4446ade5cb6ad0c147f186f9c9dc6878b90b4418ad9f6ea","impliedFormat":1},{"version":"fdd814741843f85c98281522c58f5a646590ba9019fad2efaa95987655e0611b","impliedFormat":1},{"version":"c78aff4fb58b28b8f642d5095fc7eeb79f00e652a67caa19693af1adabb833c9","impliedFormat":1},{"version":"f80a08ced8818dc99359c0acd5b3f12762e1ce53758007759b0d4e503cbf4a5e","impliedFormat":1},{"version":"37935fa7564bcc6e0bc845b766a24391098d26f7c8245d6e8ab37bc016816e94","impliedFormat":1},{"version":"68add36d9632bc096d7245d24d6b0b8ad5f125183016102a3dad4c9c2438ccb0","impliedFormat":1},{"version":"3a819c2928ee06bbcc84e2797fd3558ae2ebb7e0ed8d87f71732fb2e2acc87b4","impliedFormat":1},{"version":"0f8a263f4c8595c8a07de52e3f3927640c44386c1aa2984de9eae50d75e613b2","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"346fffde7c32da87c2196eb7494422449dc2ca82d3b4e6bf55be1d1a33ffc2b0","impliedFormat":1},{"version":"add0ce7b77ba5b308492fa68f77f24d1ed1d9148534bdf05ac17c30763fc1a79","impliedFormat":1},{"version":"8b5875e4958528042103fdd775e106a7f76bafc29709f0690df9a7d2241d52a7","impliedFormat":1},{"version":"2f67911e4bf4e0717dc2ded248ce2d5e4398d945ee13889a6852c1233ea41508","impliedFormat":1},{"version":"d8430c275b0f59417ea8e173cfb888a4477b430ec35b595bf734f3ec7a7d729f","impliedFormat":1},{"version":"69364df1c776372d7df1fb46a6cb3a6bf7f55e700f533a104e3f9d70a32bec18","impliedFormat":1},{"version":"6042774c61ece4ba77b3bf375f15942eb054675b7957882a00c22c0e4fe5865c","impliedFormat":1},{"version":"5a3bd57ed7a9d9afef74c75f77fce79ba3c786401af9810cdf45907c4e93f30e","impliedFormat":1},{"version":"aef26cf95593c8ace1c62c4724f9afac77bdfa756fb8a00613cd152117cb2f43","impliedFormat":1},{"version":"30db853bb2e60170ba11e39ab48bacecb32d06d4def89eedf17e58ebab762a65","impliedFormat":1},{"version":"e27451b24234dfed45f6cf22112a04955183a99c42a2691fb4936d63cfe42761","impliedFormat":1},{"version":"2316301dd223d31962d917999acf8e543e0119c5d24ec984c9f22cb23247160c","impliedFormat":1},{"version":"58d65a2803c3b6629b0e18c8bf1bc883a686fcf0333230dd0151ab6e85b74307","impliedFormat":1},{"version":"e818471014c77c103330aee11f00a7a00b37b35500b53ea6f337aefacd6174c9","impliedFormat":1},{"version":"268fd6d9f2e807a39a6c5aa654b00f949feb63d3faa7dd0f9bba7dde9172159c","impliedFormat":1},{"version":"29f823cbe0166e10e7176a94afe609a24b9e5af3858628c541ff8ce1727023cd","impliedFormat":1},{"version":"15b6308a6a3b7f6ad41887903beb068b4eabab774c4190395b14b72bafe73650","signature":"a4a5b6da7b3312273484ced3d5f5922782ca0f1eed33d1ff26dfac9f2259cbd3"},{"version":"1467782fa6aa8cb60b2c2c829a40c81ff1d68946563ea324cd7566101546aea6","signature":"39aa9272486cd0309104c4ea5399c527fd6c4c3ab51ba944fdea90d26cdc6675"},"cf39dbfc1e1091c11f157bf8c74b2d51f54d9233056b181688d680aff9caf06f",{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"751764bb94219b4ce8f5475dc35d3de2e432fea01a0c9610cd7f69ad05e398c6","impliedFormat":1},{"version":"f17f57ca366ffa33c99fbb74011eeaac4636722fdeb63d6de90b3450765f584f","impliedFormat":1},{"version":"84a805c22a49922085dc337ca71ac0b85aad6d4dba6b01cee5bd5776ff54df39","impliedFormat":1}],"root":[[142,144]],"options":{"composite":true,"declaration":true,"module":99,"noUncheckedIndexedAccess":true,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":10},"referencedMap":[[147,1],[141,2],[135,3],[139,4],[136,4],[132,3],[140,5],[137,6],[138,4],[133,7],[134,8],[128,9],[69,10],[71,11],[70,12],[131,13],[130,14],[129,15],[72,10],[64,16],[68,17],[65,18],[66,19],[74,20],[75,20],[76,20],[77,20],[78,20],[79,20],[80,20],[81,20],[82,20],[83,20],[84,20],[85,20],[86,20],[87,20],[89,20],[88,20],[90,20],[91,20],[92,20],[93,20],[94,20],[126,21],[95,20],[96,20],[97,20],[98,20],[99,20],[100,20],[101,20],[102,20],[103,20],[104,20],[105,20],[106,20],[107,20],[109,20],[108,20],[110,20],[111,20],[112,20],[113,20],[114,20],[115,20],[116,20],[117,20],[118,20],[119,20],[120,20],[121,20],[122,20],[125,20],[123,20],[124,20],[143,22],[144,23]],"latestChangedDtsFile":"./dist/game.d.ts","version":"5.9.3"}\ No newline at end of file
M packages/script-host/bots/bulwark.js +53 -13
@@ -36,14 +36,37 @@ function tick(state, memory, api) {
3636 return false;3737 }3838 39+ // Standing + queued count of a building at home.40+ function countOf(building) {41+ var n = home.buildings[building] || 0;42+ for (var ci = 0; ci < home.buildQueue.length; ci++) {43+ if (home.buildQueue[ci].building === building) n++;44+ }45+ return n;46+ }47+3948 // ------------------------------------------------------------------40- // One-time policy init (persistent). Heavy on stone and ore: walls and41- // armor are downstream of both. Sums to 950 permille.49+ // Phased labor policy (persistent). Ten souls cannot run a fortress:50+ // the founding camp farms and builds; the fortress diet — stone, ore,51+ // steel — waits until there are backs enough to carry it.4252 // ------------------------------------------------------------------43- if (!memory.init) {44- memory.init = 1;45- api.allocate("farmer", 240);46- api.allocate("fisher", 80);53+ if (!memory.phase) {54+ memory.phase = 1;55+ api.allocate("farmer", 620);56+ api.allocate("woodcutter", 200);57+ api.allocate("builder", 150); // roofs first, ramparts later58+ api.craft("tools", 700);59+ api.craft("weapons", 300);60+ api.craft("mill", 800);61+ api.craft("brew", 150);62+ api.craft("fodder", 50);63+ api.decree("rations", 1000);64+ api.say("bulwark: stone outlasts steel");65+ return;66+ }67+ if (memory.phase === 1 && home.pop >= 150) {68+ memory.phase = 2;69+ api.allocate("farmer", 300);4770 api.allocate("woodcutter", 90);4871 api.allocate("miner", 150); // stone + ore: the fortress diet4972 api.allocate("miller", 40);
@@ -52,6 +75,7 @@ function tick(state, memory, api) {
5275 api.allocate("smelter", 60);5376 api.allocate("smith", 60);5477 api.allocate("builder", 90); // the wall never stops rising78+ api.allocate("scholar", 40); // masonry does not research itself5579 api.allocate("priest", 30); // faith for warding rites5680 // Smithy split: garrison gets steel on its back, not just in hand.5781 api.craft("tools", 400);
@@ -59,9 +83,6 @@ function tick(state, memory, api) {
5983 api.craft("armor", 300);6084 api.craft("mill", 700);6185 api.craft("brew", 250);62- api.craft("fodder", 50);63- api.decree("rations", 1000);64- api.say("bulwark: stone outlasts steel");6586 return;6687 }6788
@@ -81,10 +102,27 @@ function tick(state, memory, api) {
81102 // One queued job at a time so the builders never thrash.82103 // ------------------------------------------------------------------83104 if (home.buildQueue.length === 0) {105+ // Growth targets scale with population: more mouths need more farms,106+ // more people need more roofs. countOf() checks standing + queued.107+ var wantFarms = 1 + Math.floor(home.pop / 60);108+ var wantHouses = Math.floor(home.pop / 45);109+ var wantCamps = 1 + Math.floor(home.pop / 150);110+ if (countOf("farm") < wantFarms) api.build("farm", home.id);111+ else if (countOf("lumber_camp") < wantCamps) api.build("lumber_camp", home.id);112+ else if (home.pop >= 60 && countOf("library") < 1) api.build("library", home.id);113+ else if (countOf("house") < wantHouses) api.build("house", home.id);114+ else if (!hasOrQueued("granary")) api.build("granary", home.id);115+ }116+ // Fortifications advance IN PARALLEL with growth.117+ if (home.buildQueue.length < 2) {84118 var walls = home.buildings.walls || 0;85119 var towers = home.buildings.tower || 0;86- if (!hasOrQueued("granary")) api.build("granary", home.id);87- else if (!hasOrQueued("smithy")) api.build("smithy", home.id);120+ var stone = home.stores.stone || 0;121+ if (!hasOrQueued("library")) api.build("library", home.id);122+ else if (!hasOrQueued("mine")) api.build("mine", home.id);123+ // affordability guards: an unaffordable step must not stall the chain124+ else if (!hasOrQueued("smelter") && stone >= 40) api.build("smelter", home.id);125+ else if (!hasOrQueued("smithy") && stone >= 20) api.build("smithy", home.id);88126 else if (walls < 1) api.build("walls", home.id);89127 else if (!hasOrQueued("barracks")) api.build("barracks", home.id);90128 else if (!hasOrQueued("brewery")) api.build("brewery", home.id);
@@ -116,12 +154,14 @@ function tick(state, memory, api) {
116154 // parked on garrison duty at home. Tick-stamp guard against re-muster117155 // spam while the engine raises the band.118156 // ------------------------------------------------------------------157+ var armory = home.stores.weapons || 0;119158 if (120159 state.warbands.length < 2 &&121- (home.stores.weapons || 0) >= 30 &&160+ home.pop >= 120 &&161+ armory >= 12 &&122162 (memory.musterAt === undefined || state.tick - memory.musterAt > 10)123163 ) {124- api.muster(home.id, 30, "infantry");164+ api.muster(home.id, Math.min(40, armory), "infantry");125165 memory.musterAt = state.tick;126166 }127167 for (var w = 0; w < state.warbands.length; w++) {
M packages/script-host/bots/homesteader.js +23 -1
@@ -30,6 +30,15 @@ function tick(state, memory, api) {
3030 return false;3131 }3232 33+ // Standing + queued count of a building at home.34+ function countOf(building) {35+ var n = home.buildings[building] || 0;36+ for (var ci = 0; ci < home.buildQueue.length; ci++) {37+ if (home.buildQueue[ci].building === building) n++;38+ }39+ return n;40+ }41+3342 // ------------------------------------------------------------------3443 // One-time policy init. Everything here is PERSISTENT policy: issued3544 // once, in force until changed. Sums to 930 permille; the idle
@@ -93,7 +102,20 @@ function tick(state, memory, api) {
93102 // protects the harvest, smithy makes tools/weapons, walls L1 for safety.94103 // ------------------------------------------------------------------95104 if (home.buildQueue.length === 0) {96- var plan = ["farm", "granary", "mill", "bakery", "smithy", "house", "walls"];105+ // Growth targets scale with population: more mouths need more farms,106+ // more people need more roofs. countOf() checks standing + queued.107+ var wantFarms = 1 + Math.floor(home.pop / 60);108+ var wantHouses = Math.floor(home.pop / 45);109+ var wantCamps = 1 + Math.floor(home.pop / 150);110+ if (countOf("farm") < wantFarms) api.build("farm", home.id);111+ else if (countOf("lumber_camp") < wantCamps) api.build("lumber_camp", home.id);112+ else if (home.pop >= 60 && countOf("library") < 1) api.build("library", home.id);113+ else if (countOf("house") < wantHouses) api.build("house", home.id);114+ }115+ // The strategic plan advances IN PARALLEL with growth (a short queue always116+ // has room for one plan item, or growth would crowd it out forever).117+ if (home.buildQueue.length < 2) {118+ var plan = ["granary", "mill", "bakery", "smithy", "pasture", "walls", "shrine", "library"];97119 for (var p = 0; p < plan.length; p++) {98120 if (!hasOrQueued(plan[p])) {99121 api.build(plan[p], home.id);
M packages/script-host/bots/magnate.js +57 -9
@@ -26,14 +26,48 @@ function tick(state, memory, api) {
2626 return false;2727 }2828 29+ // Standing + queued count of a building at home.30+ function countOf(building) {31+ var n = home.buildings[building] || 0;32+ for (var ci = 0; ci < home.buildQueue.length; ci++) {33+ if (home.buildQueue[ci].building === building) n++;34+ }35+ return n;36+ }37+2938 // ------------------------------------------------------------------30- // One-time policy init (persistent). Fish feeds the town, grain feeds31- // the brewery, haulers move the goods. Sums to 950 permille.39+ // Phased labor policy (persistent). A ten-soul camp has no dock and no40+ // customers: farm and build first, then pivot to the merchant diet —41+ // fish for the town, grain for the brewery, haulers for the roads.3242 // ------------------------------------------------------------------33- if (!memory.init) {34- memory.init = 1;35- api.allocate("fisher", 260); // the food engine36- api.allocate("farmer", 160); // grain mostly for the brewery43+ if (!memory.phase) {44+ memory.phase = 1;45+ api.allocate("farmer", 620);46+ api.allocate("woodcutter", 200);47+ api.allocate("builder", 150);48+ api.craft("mill", 800);49+ api.craft("brew", 150);50+ api.craft("fodder", 50);51+ api.craft("tools", 700);52+ api.craft("weapons", 300);53+ api.decree("rations", 1000);54+ api.say("magnate: everything has a price");55+ return;56+ }57+ if (memory.phase === 1 && home.pop >= 150) {58+ memory.phase = 2;59+ // No water in reach means no dock, ever — the brewery drinks from the60+ // fields instead. Checked once, here, before the merchant diet is set.61+ memory.hasWater = 0;62+ var wsize = state.mapSize;63+ for (var wy = Math.max(0, home.y - 8); wy <= Math.min(wsize - 1, home.y + 8); wy++) {64+ for (var wx = Math.max(0, home.x - 8); wx <= Math.min(wsize - 1, home.x + 8); wx++) {65+ if (state.terrain[wy * wsize + wx] === "w") { memory.hasWater = 1; break; }66+ }67+ if (memory.hasWater) break;68+ }69+ api.allocate("fisher", memory.hasWater ? 260 : 0); // the food engine70+ api.allocate("farmer", memory.hasWater ? 220 : 480); // grain mostly for the brewery3771 api.allocate("woodcutter", 80);3872 api.allocate("miner", 40);3973 api.allocate("miller", 30);
@@ -52,9 +86,7 @@ function tick(state, memory, api) {
5286 api.craft("tools", 700);5387 api.craft("weapons", 250);5488 api.craft("armor", 50);55- api.decree("rations", 1000);5689 api.decree("ale_ration", 200); // a happy town drinks a little57- api.say("magnate: everything has a price");5890 return;5991 }6092
@@ -73,7 +105,23 @@ function tick(state, memory, api) {
73105 // comfort and storage.74106 // ------------------------------------------------------------------75107 if (home.buildQueue.length === 0) {76- var plan = ["dock", "farm", "brewery", "market", "granary", "warehouse", "library"];108+ // Growth targets scale with population: more mouths need more farms,109+ // more people need more roofs. countOf() checks standing + queued.110+ var wantFarms = 1 + Math.floor(home.pop / 60);111+ var wantHouses = Math.floor(home.pop / 45);112+ var wantCamps = 1 + Math.floor(home.pop / 150);113+ if (countOf("farm") < wantFarms) api.build("farm", home.id);114+ else if (countOf("lumber_camp") < wantCamps) api.build("lumber_camp", home.id);115+ else if (home.pop >= 60 && countOf("library") < 1) api.build("library", home.id);116+ else if (countOf("house") < wantHouses) api.build("house", home.id);117+ }118+ // The strategic plan advances IN PARALLEL with growth (a short queue always119+ // has room for one plan item, or growth would crowd it out forever).120+ if (home.buildQueue.length < 2) {121+ // No water in reach means no dock — ever. Check once, or the plan122+ // stalls forever on an unbuildable first step.123+ var plan = ["dock", "brewery", "market", "granary", "warehouse", "library", "shrine"];124+ if (memory.hasWater === 0) plan.shift(); // landlocked (checked at phase 2)77125 for (var p = 0; p < plan.length; p++) {78126 if (!hasOrQueued(plan[p])) {79127 api.build(plan[p], home.id);
M packages/script-host/bots/warlord.js +105 -5
@@ -32,21 +32,31 @@ function tick(state, memory, api) {
3232 return dx + dy;3333 }3434 35+ // Standing + queued count of a building at home.36+ function countOf(building) {37+ var n = home.buildings[building] || 0;38+ for (var ci = 0; ci < home.buildQueue.length; ci++) {39+ if (home.buildQueue[ci].building === building) n++;40+ }41+ return n;42+ }43+3544 // ------------------------------------------------------------------3645 // One-time policy init (persistent). Enough food to grow, ore/metal3746 // heavy, weapons-first smithy. Sums to 940 permille.3847 // ------------------------------------------------------------------3948 if (!memory.init) {4049 memory.init = 1;41- api.allocate("farmer", 340);50+ api.allocate("farmer", 310);4251 api.allocate("fisher", 80);43- api.allocate("woodcutter", 80);44- api.allocate("miner", 120); // ore for the smelter52+ api.allocate("woodcutter", 160); // timber first: no camp, no smithy, no war53+ api.allocate("miner", 60); // ore for the smelter (once a mine exists)4554 api.allocate("miller", 40);4655 api.allocate("baker", 60);4756 api.allocate("smelter", 80);4857 api.allocate("smith", 70); // the point of everything49- api.allocate("builder", 50);58+ api.allocate("builder", 90);59+ api.allocate("scholar", 40); // research gates the war chain5060 api.allocate("hauler", 30);5161 // Weapons before comfort; just enough tools to keep the mines fed.5262 api.craft("tools", 250);
@@ -74,7 +84,97 @@ function tick(state, memory, api) {
7484 // Construction: the war chain only. Smithy above all.7585 // ------------------------------------------------------------------7686 if (home.buildQueue.length === 0) {77- var plan = ["farm", "mine", "smelter", "smithy", "barracks", "granary"];87+ // Growth targets scale with population: more mouths need more farms,88+ // more people need more roofs. countOf() checks standing + queued.89+ var wantFarms = 1 + Math.floor(home.pop / 60);90+ var wantHouses = Math.floor(home.pop / 45);91+ var wantCamps = 1 + Math.floor(home.pop / 150);92+ if (countOf("farm") < wantFarms) api.build("farm", home.id);93+ else if (countOf("lumber_camp") < wantCamps) api.build("lumber_camp", home.id);94+ else if (home.pop >= 60 && countOf("library") < 1) api.build("library", home.id);95+ else if (countOf("house") < wantHouses) api.build("house", home.id);96+ }97+ // ------------------------------------------------------------------98+ // Ore or death: if our claims hold no hills (a neighbor beat us to99+ // them), FOUND a mining outpost by the nearest highland and route its100+ // ore home — the war chain cannot exist without metal.101+ // ------------------------------------------------------------------102+ if (103+ state.settlements.length < 2 &&104+ home.pop >= 500 &&105+ (memory.foundTry === undefined || state.tick - memory.foundTry > 100)106+ ) {107+ var best = null;108+ var bestD = -1;109+ var size = state.mapSize;110+ for (var ti = 0; ti < state.terrain.length; ti++) {111+ // unclaimed explored highland, or a distant highland silhouette ('^')112+ var isHill = false;113+ var ch = state.terrain[ti];114+ if ((ch === "h" || ch === "O" || ch === "m") && state.claims[ti] === ".") isHill = true;115+ else if (state.distant[ti] === "^") isHill = true;116+ if (!isHill) continue;117+ var tx = ti % size;118+ var ty = (ti / size) | 0;119+ // the engine refuses camps within 6 of ANY settlement — keep margin120+ var tooClose = false;121+ if (Math.max(Math.abs(tx - home.x), Math.abs(ty - home.y)) < 6) tooClose = true;122+ for (var es = 0; es < state.enemySettlements.length && !tooClose; es++) {123+ var e = state.enemySettlements[es];124+ if (Math.max(Math.abs(tx - e.x), Math.abs(ty - e.y)) < 6) tooClose = true;125+ }126+ if (tooClose) continue;127+ var d = Math.max(Math.abs(tx - home.x), Math.abs(ty - home.y));128+ if (best === null || d < bestD) { best = { x: tx, y: ty }; bestD = d; }129+ }130+ if (best !== null) {131+ // camp on the nearest open ground beside the highland132+ var cx = best.x;133+ var cy = best.y;134+ for (var r = 1; r <= 3 && state.terrain[cy * size + cx] !== "." ; r++) {135+ for (var dy = -r; dy <= r; dy++) {136+ for (var dx = -r; dx <= r; dx++) {137+ var nx = best.x + dx;138+ var ny = best.y + dy;139+ if (nx < 0 || ny < 0 || nx >= size || ny >= size) continue;140+ var nch = state.terrain[ny * size + nx];141+ if (nch === "." || nch === "t") { cx = nx; cy = ny; dy = r + 1; break; }142+ }143+ }144+ }145+ // only pack what the stores can actually spare — unaffordable supplies void the order146+ var pack = {};147+ var wagon = { grain: 150, timber: 80, stone: 20, tools: 8 };148+ for (var g in wagon) {149+ var have = home.stores[g] || 0;150+ if (have > wagon[g] * 2) pack[g] = wagon[g];151+ else if (have > 20) pack[g] = (have / 2) | 0;152+ }153+ api.found(cx, cy, 80, pack);154+ memory.foundTry = state.tick; // retry every 100t until the camp exists155+ if (!memory.saidHills) {156+ memory.saidHills = 1;157+ api.say("warlord: the hills will be ours");158+ }159+ }160+ }161+ // Mines wherever hills are held; ore flows home for the smelter.162+ if (state.tick % 40 === 0) {163+ for (var si = 0; si < state.settlements.length; si++) {164+ var stl = state.settlements[si];165+ if (!stl.buildings.mine && stl.buildQueue.length < 2) api.build("mine", stl.id);166+ if (stl.id !== home.id && !memory["route" + stl.id]) {167+ api.route(stl.id, home.id, "ore", 700);168+ api.route(stl.id, home.id, "stone", 600);169+ memory["route" + stl.id] = 1;170+ }171+ }172+ }173+174+ // The strategic plan advances IN PARALLEL with growth (a short queue always175+ // has room for one plan item, or growth would crowd it out forever).176+ if (home.buildQueue.length < 2) {177+ var plan = ["library", "mine", "smelter", "smithy", "barracks", "granary"];78178 for (var p = 0; p < plan.length; p++) {79179 if (!hasOrQueued(plan[p])) {80180 api.build(plan[p], home.id);
M packages/script-host/src/bots.ts +238 -28
@@ -33,6 +33,15 @@ function tick(state, memory, api) {
3333 return false;3434 }3535 36+ // Standing + queued count of a building at home.37+ function countOf(building) {38+ var n = home.buildings[building] || 0;39+ for (var ci = 0; ci < home.buildQueue.length; ci++) {40+ if (home.buildQueue[ci].building === building) n++;41+ }42+ return n;43+ }44+3645 // ------------------------------------------------------------------3746 // One-time policy init. Everything here is PERSISTENT policy: issued3847 // once, in force until changed. Sums to 930 permille; the idle
@@ -96,7 +105,20 @@ function tick(state, memory, api) {
96105 // protects the harvest, smithy makes tools/weapons, walls L1 for safety.97106 // ------------------------------------------------------------------98107 if (home.buildQueue.length === 0) {99- var plan = ["farm", "granary", "mill", "bakery", "smithy", "house", "walls"];108+ // Growth targets scale with population: more mouths need more farms,109+ // more people need more roofs. countOf() checks standing + queued.110+ var wantFarms = 1 + Math.floor(home.pop / 60);111+ var wantHouses = Math.floor(home.pop / 45);112+ var wantCamps = 1 + Math.floor(home.pop / 150);113+ if (countOf("farm") < wantFarms) api.build("farm", home.id);114+ else if (countOf("lumber_camp") < wantCamps) api.build("lumber_camp", home.id);115+ else if (home.pop >= 60 && countOf("library") < 1) api.build("library", home.id);116+ else if (countOf("house") < wantHouses) api.build("house", home.id);117+ }118+ // The strategic plan advances IN PARALLEL with growth (a short queue always119+ // has room for one plan item, or growth would crowd it out forever).120+ if (home.buildQueue.length < 2) {121+ var plan = ["granary", "mill", "bakery", "smithy", "pasture", "walls", "shrine", "library"];100122 for (var p = 0; p < plan.length; p++) {101123 if (!hasOrQueued(plan[p])) {102124 api.build(plan[p], home.id);
@@ -165,14 +187,37 @@ function tick(state, memory, api) {
165187 return false;166188 }167189 190+ // Standing + queued count of a building at home.191+ function countOf(building) {192+ var n = home.buildings[building] || 0;193+ for (var ci = 0; ci < home.buildQueue.length; ci++) {194+ if (home.buildQueue[ci].building === building) n++;195+ }196+ return n;197+ }198+168199 // ------------------------------------------------------------------169- // One-time policy init (persistent). Heavy on stone and ore: walls and170- // armor are downstream of both. Sums to 950 permille.200+ // Phased labor policy (persistent). Ten souls cannot run a fortress:201+ // the founding camp farms and builds; the fortress diet — stone, ore,202+ // steel — waits until there are backs enough to carry it.171203 // ------------------------------------------------------------------172- if (!memory.init) {173- memory.init = 1;174- api.allocate("farmer", 240);175- api.allocate("fisher", 80);204+ if (!memory.phase) {205+ memory.phase = 1;206+ api.allocate("farmer", 620);207+ api.allocate("woodcutter", 200);208+ api.allocate("builder", 150); // roofs first, ramparts later209+ api.craft("tools", 700);210+ api.craft("weapons", 300);211+ api.craft("mill", 800);212+ api.craft("brew", 150);213+ api.craft("fodder", 50);214+ api.decree("rations", 1000);215+ api.say("bulwark: stone outlasts steel");216+ return;217+ }218+ if (memory.phase === 1 && home.pop >= 150) {219+ memory.phase = 2;220+ api.allocate("farmer", 300);176221 api.allocate("woodcutter", 90);177222 api.allocate("miner", 150); // stone + ore: the fortress diet178223 api.allocate("miller", 40);
@@ -181,6 +226,7 @@ function tick(state, memory, api) {
181226 api.allocate("smelter", 60);182227 api.allocate("smith", 60);183228 api.allocate("builder", 90); // the wall never stops rising229+ api.allocate("scholar", 40); // masonry does not research itself184230 api.allocate("priest", 30); // faith for warding rites185231 // Smithy split: garrison gets steel on its back, not just in hand.186232 api.craft("tools", 400);
@@ -188,9 +234,6 @@ function tick(state, memory, api) {
188234 api.craft("armor", 300);189235 api.craft("mill", 700);190236 api.craft("brew", 250);191- api.craft("fodder", 50);192- api.decree("rations", 1000);193- api.say("bulwark: stone outlasts steel");194237 return;195238 }196239
@@ -210,10 +253,27 @@ function tick(state, memory, api) {
210253 // One queued job at a time so the builders never thrash.211254 // ------------------------------------------------------------------212255 if (home.buildQueue.length === 0) {256+ // Growth targets scale with population: more mouths need more farms,257+ // more people need more roofs. countOf() checks standing + queued.258+ var wantFarms = 1 + Math.floor(home.pop / 60);259+ var wantHouses = Math.floor(home.pop / 45);260+ var wantCamps = 1 + Math.floor(home.pop / 150);261+ if (countOf("farm") < wantFarms) api.build("farm", home.id);262+ else if (countOf("lumber_camp") < wantCamps) api.build("lumber_camp", home.id);263+ else if (home.pop >= 60 && countOf("library") < 1) api.build("library", home.id);264+ else if (countOf("house") < wantHouses) api.build("house", home.id);265+ else if (!hasOrQueued("granary")) api.build("granary", home.id);266+ }267+ // Fortifications advance IN PARALLEL with growth.268+ if (home.buildQueue.length < 2) {213269 var walls = home.buildings.walls || 0;214270 var towers = home.buildings.tower || 0;215- if (!hasOrQueued("granary")) api.build("granary", home.id);216- else if (!hasOrQueued("smithy")) api.build("smithy", home.id);271+ var stone = home.stores.stone || 0;272+ if (!hasOrQueued("library")) api.build("library", home.id);273+ else if (!hasOrQueued("mine")) api.build("mine", home.id);274+ // affordability guards: an unaffordable step must not stall the chain275+ else if (!hasOrQueued("smelter") && stone >= 40) api.build("smelter", home.id);276+ else if (!hasOrQueued("smithy") && stone >= 20) api.build("smithy", home.id);217277 else if (walls < 1) api.build("walls", home.id);218278 else if (!hasOrQueued("barracks")) api.build("barracks", home.id);219279 else if (!hasOrQueued("brewery")) api.build("brewery", home.id);
@@ -245,12 +305,14 @@ function tick(state, memory, api) {
245305 // parked on garrison duty at home. Tick-stamp guard against re-muster246306 // spam while the engine raises the band.247307 // ------------------------------------------------------------------308+ var armory = home.stores.weapons || 0;248309 if (249310 state.warbands.length < 2 &&250- (home.stores.weapons || 0) >= 30 &&311+ home.pop >= 120 &&312+ armory >= 12 &&251313 (memory.musterAt === undefined || state.tick - memory.musterAt > 10)252314 ) {253- api.muster(home.id, 30, "infantry");315+ api.muster(home.id, Math.min(40, armory), "infantry");254316 memory.musterAt = state.tick;255317 }256318 for (var w = 0; w < state.warbands.length; w++) {
@@ -310,21 +372,31 @@ function tick(state, memory, api) {
310372 return dx + dy;311373 }312374 375+ // Standing + queued count of a building at home.376+ function countOf(building) {377+ var n = home.buildings[building] || 0;378+ for (var ci = 0; ci < home.buildQueue.length; ci++) {379+ if (home.buildQueue[ci].building === building) n++;380+ }381+ return n;382+ }383+313384 // ------------------------------------------------------------------314385 // One-time policy init (persistent). Enough food to grow, ore/metal315386 // heavy, weapons-first smithy. Sums to 940 permille.316387 // ------------------------------------------------------------------317388 if (!memory.init) {318389 memory.init = 1;319- api.allocate("farmer", 340);390+ api.allocate("farmer", 310);320391 api.allocate("fisher", 80);321- api.allocate("woodcutter", 80);322- api.allocate("miner", 120); // ore for the smelter392+ api.allocate("woodcutter", 160); // timber first: no camp, no smithy, no war393+ api.allocate("miner", 60); // ore for the smelter (once a mine exists)323394 api.allocate("miller", 40);324395 api.allocate("baker", 60);325396 api.allocate("smelter", 80);326397 api.allocate("smith", 70); // the point of everything327- api.allocate("builder", 50);398+ api.allocate("builder", 90);399+ api.allocate("scholar", 40); // research gates the war chain328400 api.allocate("hauler", 30);329401 // Weapons before comfort; just enough tools to keep the mines fed.330402 api.craft("tools", 250);
@@ -352,7 +424,97 @@ function tick(state, memory, api) {
352424 // Construction: the war chain only. Smithy above all.353425 // ------------------------------------------------------------------354426 if (home.buildQueue.length === 0) {355- var plan = ["farm", "mine", "smelter", "smithy", "barracks", "granary"];427+ // Growth targets scale with population: more mouths need more farms,428+ // more people need more roofs. countOf() checks standing + queued.429+ var wantFarms = 1 + Math.floor(home.pop / 60);430+ var wantHouses = Math.floor(home.pop / 45);431+ var wantCamps = 1 + Math.floor(home.pop / 150);432+ if (countOf("farm") < wantFarms) api.build("farm", home.id);433+ else if (countOf("lumber_camp") < wantCamps) api.build("lumber_camp", home.id);434+ else if (home.pop >= 60 && countOf("library") < 1) api.build("library", home.id);435+ else if (countOf("house") < wantHouses) api.build("house", home.id);436+ }437+ // ------------------------------------------------------------------438+ // Ore or death: if our claims hold no hills (a neighbor beat us to439+ // them), FOUND a mining outpost by the nearest highland and route its440+ // ore home — the war chain cannot exist without metal.441+ // ------------------------------------------------------------------442+ if (443+ state.settlements.length < 2 &&444+ home.pop >= 500 &&445+ (memory.foundTry === undefined || state.tick - memory.foundTry > 100)446+ ) {447+ var best = null;448+ var bestD = -1;449+ var size = state.mapSize;450+ for (var ti = 0; ti < state.terrain.length; ti++) {451+ // unclaimed explored highland, or a distant highland silhouette ('^')452+ var isHill = false;453+ var ch = state.terrain[ti];454+ if ((ch === "h" || ch === "O" || ch === "m") && state.claims[ti] === ".") isHill = true;455+ else if (state.distant[ti] === "^") isHill = true;456+ if (!isHill) continue;457+ var tx = ti % size;458+ var ty = (ti / size) | 0;459+ // the engine refuses camps within 6 of ANY settlement — keep margin460+ var tooClose = false;461+ if (Math.max(Math.abs(tx - home.x), Math.abs(ty - home.y)) < 6) tooClose = true;462+ for (var es = 0; es < state.enemySettlements.length && !tooClose; es++) {463+ var e = state.enemySettlements[es];464+ if (Math.max(Math.abs(tx - e.x), Math.abs(ty - e.y)) < 6) tooClose = true;465+ }466+ if (tooClose) continue;467+ var d = Math.max(Math.abs(tx - home.x), Math.abs(ty - home.y));468+ if (best === null || d < bestD) { best = { x: tx, y: ty }; bestD = d; }469+ }470+ if (best !== null) {471+ // camp on the nearest open ground beside the highland472+ var cx = best.x;473+ var cy = best.y;474+ for (var r = 1; r <= 3 && state.terrain[cy * size + cx] !== "." ; r++) {475+ for (var dy = -r; dy <= r; dy++) {476+ for (var dx = -r; dx <= r; dx++) {477+ var nx = best.x + dx;478+ var ny = best.y + dy;479+ if (nx < 0 || ny < 0 || nx >= size || ny >= size) continue;480+ var nch = state.terrain[ny * size + nx];481+ if (nch === "." || nch === "t") { cx = nx; cy = ny; dy = r + 1; break; }482+ }483+ }484+ }485+ // only pack what the stores can actually spare — unaffordable supplies void the order486+ var pack = {};487+ var wagon = { grain: 150, timber: 80, stone: 20, tools: 8 };488+ for (var g in wagon) {489+ var have = home.stores[g] || 0;490+ if (have > wagon[g] * 2) pack[g] = wagon[g];491+ else if (have > 20) pack[g] = (have / 2) | 0;492+ }493+ api.found(cx, cy, 80, pack);494+ memory.foundTry = state.tick; // retry every 100t until the camp exists495+ if (!memory.saidHills) {496+ memory.saidHills = 1;497+ api.say("warlord: the hills will be ours");498+ }499+ }500+ }501+ // Mines wherever hills are held; ore flows home for the smelter.502+ if (state.tick % 40 === 0) {503+ for (var si = 0; si < state.settlements.length; si++) {504+ var stl = state.settlements[si];505+ if (!stl.buildings.mine && stl.buildQueue.length < 2) api.build("mine", stl.id);506+ if (stl.id !== home.id && !memory["route" + stl.id]) {507+ api.route(stl.id, home.id, "ore", 700);508+ api.route(stl.id, home.id, "stone", 600);509+ memory["route" + stl.id] = 1;510+ }511+ }512+ }513+514+ // The strategic plan advances IN PARALLEL with growth (a short queue always515+ // has room for one plan item, or growth would crowd it out forever).516+ if (home.buildQueue.length < 2) {517+ var plan = ["library", "mine", "smelter", "smithy", "barracks", "granary"];356518 for (var p = 0; p < plan.length; p++) {357519 if (!hasOrQueued(plan[p])) {358520 api.build(plan[p], home.id);
@@ -491,14 +653,48 @@ function tick(state, memory, api) {
491653 return false;492654 }493655 656+ // Standing + queued count of a building at home.657+ function countOf(building) {658+ var n = home.buildings[building] || 0;659+ for (var ci = 0; ci < home.buildQueue.length; ci++) {660+ if (home.buildQueue[ci].building === building) n++;661+ }662+ return n;663+ }664+494665 // ------------------------------------------------------------------495- // One-time policy init (persistent). Fish feeds the town, grain feeds496- // the brewery, haulers move the goods. Sums to 950 permille.666+ // Phased labor policy (persistent). A ten-soul camp has no dock and no667+ // customers: farm and build first, then pivot to the merchant diet —668+ // fish for the town, grain for the brewery, haulers for the roads.497669 // ------------------------------------------------------------------498- if (!memory.init) {499- memory.init = 1;500- api.allocate("fisher", 260); // the food engine501- api.allocate("farmer", 160); // grain mostly for the brewery670+ if (!memory.phase) {671+ memory.phase = 1;672+ api.allocate("farmer", 620);673+ api.allocate("woodcutter", 200);674+ api.allocate("builder", 150);675+ api.craft("mill", 800);676+ api.craft("brew", 150);677+ api.craft("fodder", 50);678+ api.craft("tools", 700);679+ api.craft("weapons", 300);680+ api.decree("rations", 1000);681+ api.say("magnate: everything has a price");682+ return;683+ }684+ if (memory.phase === 1 && home.pop >= 150) {685+ memory.phase = 2;686+ // No water in reach means no dock, ever — the brewery drinks from the687+ // fields instead. Checked once, here, before the merchant diet is set.688+ memory.hasWater = 0;689+ var wsize = state.mapSize;690+ for (var wy = Math.max(0, home.y - 8); wy <= Math.min(wsize - 1, home.y + 8); wy++) {691+ for (var wx = Math.max(0, home.x - 8); wx <= Math.min(wsize - 1, home.x + 8); wx++) {692+ if (state.terrain[wy * wsize + wx] === "w") { memory.hasWater = 1; break; }693+ }694+ if (memory.hasWater) break;695+ }696+ api.allocate("fisher", memory.hasWater ? 260 : 0); // the food engine697+ api.allocate("farmer", memory.hasWater ? 220 : 480); // grain mostly for the brewery502698 api.allocate("woodcutter", 80);503699 api.allocate("miner", 40);504700 api.allocate("miller", 30);
@@ -517,9 +713,7 @@ function tick(state, memory, api) {
517713 api.craft("tools", 700);518714 api.craft("weapons", 250);519715 api.craft("armor", 50);520- api.decree("rations", 1000);521716 api.decree("ale_ration", 200); // a happy town drinks a little522- api.say("magnate: everything has a price");523717 return;524718 }525719
@@ -538,7 +732,23 @@ function tick(state, memory, api) {
538732 // comfort and storage.539733 // ------------------------------------------------------------------540734 if (home.buildQueue.length === 0) {541- var plan = ["dock", "farm", "brewery", "market", "granary", "warehouse", "library"];735+ // Growth targets scale with population: more mouths need more farms,736+ // more people need more roofs. countOf() checks standing + queued.737+ var wantFarms = 1 + Math.floor(home.pop / 60);738+ var wantHouses = Math.floor(home.pop / 45);739+ var wantCamps = 1 + Math.floor(home.pop / 150);740+ if (countOf("farm") < wantFarms) api.build("farm", home.id);741+ else if (countOf("lumber_camp") < wantCamps) api.build("lumber_camp", home.id);742+ else if (home.pop >= 60 && countOf("library") < 1) api.build("library", home.id);743+ else if (countOf("house") < wantHouses) api.build("house", home.id);744+ }745+ // The strategic plan advances IN PARALLEL with growth (a short queue always746+ // has room for one plan item, or growth would crowd it out forever).747+ if (home.buildQueue.length < 2) {748+ // No water in reach means no dock — ever. Check once, or the plan749+ // stalls forever on an unbuildable first step.750+ var plan = ["dock", "brewery", "market", "granary", "warehouse", "library", "shrine"];751+ if (memory.hasWater === 0) plan.shift(); // landlocked (checked at phase 2)542752 for (var p = 0; p < plan.length; p++) {543753 if (!hasOrQueued(plan[p])) {544754 api.build(plan[p], home.id);
D packages/script-host/tsconfig.tsbuildinfo +0 -1
@@ -1 +0,0 @@
1-{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","./src/bots.ts","../../node_modules/@jitl/quickjs-ffi-types/dist/index.d.ts","../../node_modules/quickjs-emscripten-core/dist/index.d.ts","../../node_modules/@jitl/quickjs-wasmfile-debug-sync/dist/index.d.ts","../../node_modules/@jitl/quickjs-wasmfile-release-sync/dist/index.d.ts","../../node_modules/@jitl/quickjs-wasmfile-debug-asyncify/dist/index.d.ts","../../node_modules/@jitl/quickjs-wasmfile-release-asyncify/dist/index.d.ts","../../node_modules/quickjs-emscripten/dist/variants.d.ts","../../node_modules/quickjs-emscripten/dist/index.d.ts","../protocol/dist/game.d.ts","../../node_modules/zod/v4/core/json-schema.d.cts","../../node_modules/zod/v4/core/standard-schema.d.cts","../../node_modules/zod/v4/core/registries.d.cts","../../node_modules/zod/v4/core/to-json-schema.d.cts","../../node_modules/zod/v4/core/util.d.cts","../../node_modules/zod/v4/core/versions.d.cts","../../node_modules/zod/v4/core/schemas.d.cts","../../node_modules/zod/v4/core/checks.d.cts","../../node_modules/zod/v4/core/errors.d.cts","../../node_modules/zod/v4/core/core.d.cts","../../node_modules/zod/v4/core/parse.d.cts","../../node_modules/zod/v4/core/regexes.d.cts","../../node_modules/zod/v4/locales/ar.d.cts","../../node_modules/zod/v4/locales/az.d.cts","../../node_modules/zod/v4/locales/be.d.cts","../../node_modules/zod/v4/locales/bg.d.cts","../../node_modules/zod/v4/locales/ca.d.cts","../../node_modules/zod/v4/locales/cs.d.cts","../../node_modules/zod/v4/locales/da.d.cts","../../node_modules/zod/v4/locales/de.d.cts","../../node_modules/zod/v4/locales/el.d.cts","../../node_modules/zod/v4/locales/en.d.cts","../../node_modules/zod/v4/locales/eo.d.cts","../../node_modules/zod/v4/locales/es.d.cts","../../node_modules/zod/v4/locales/fa.d.cts","../../node_modules/zod/v4/locales/fi.d.cts","../../node_modules/zod/v4/locales/fr.d.cts","../../node_modules/zod/v4/locales/fr-ca.d.cts","../../node_modules/zod/v4/locales/he.d.cts","../../node_modules/zod/v4/locales/hr.d.cts","../../node_modules/zod/v4/locales/hu.d.cts","../../node_modules/zod/v4/locales/hy.d.cts","../../node_modules/zod/v4/locales/id.d.cts","../../node_modules/zod/v4/locales/is.d.cts","../../node_modules/zod/v4/locales/it.d.cts","../../node_modules/zod/v4/locales/ja.d.cts","../../node_modules/zod/v4/locales/ka.d.cts","../../node_modules/zod/v4/locales/kh.d.cts","../../node_modules/zod/v4/locales/km.d.cts","../../node_modules/zod/v4/locales/ko.d.cts","../../node_modules/zod/v4/locales/lt.d.cts","../../node_modules/zod/v4/locales/mk.d.cts","../../node_modules/zod/v4/locales/ms.d.cts","../../node_modules/zod/v4/locales/nl.d.cts","../../node_modules/zod/v4/locales/no.d.cts","../../node_modules/zod/v4/locales/ota.d.cts","../../node_modules/zod/v4/locales/ps.d.cts","../../node_modules/zod/v4/locales/pl.d.cts","../../node_modules/zod/v4/locales/pt.d.cts","../../node_modules/zod/v4/locales/ro.d.cts","../../node_modules/zod/v4/locales/ru.d.cts","../../node_modules/zod/v4/locales/sl.d.cts","../../node_modules/zod/v4/locales/sv.d.cts","../../node_modules/zod/v4/locales/ta.d.cts","../../node_modules/zod/v4/locales/th.d.cts","../../node_modules/zod/v4/locales/tr.d.cts","../../node_modules/zod/v4/locales/ua.d.cts","../../node_modules/zod/v4/locales/uk.d.cts","../../node_modules/zod/v4/locales/ur.d.cts","../../node_modules/zod/v4/locales/uz.d.cts","../../node_modules/zod/v4/locales/vi.d.cts","../../node_modules/zod/v4/locales/zh-cn.d.cts","../../node_modules/zod/v4/locales/zh-tw.d.cts","../../node_modules/zod/v4/locales/yo.d.cts","../../node_modules/zod/v4/locales/index.d.cts","../../node_modules/zod/v4/core/doc.d.cts","../../node_modules/zod/v4/core/api.d.cts","../../node_modules/zod/v4/core/json-schema-processors.d.cts","../../node_modules/zod/v4/core/json-schema-generator.d.cts","../../node_modules/zod/v4/core/index.d.cts","../../node_modules/zod/v4/classic/errors.d.cts","../../node_modules/zod/v4/classic/parse.d.cts","../../node_modules/zod/v4/classic/schemas.d.cts","../../node_modules/zod/v4/classic/checks.d.cts","../../node_modules/zod/v4/classic/compat.d.cts","../../node_modules/zod/v4/classic/from-json-schema.d.cts","../../node_modules/zod/v4/classic/iso.d.cts","../../node_modules/zod/v4/classic/coerce.d.cts","../../node_modules/zod/v4/classic/external.d.cts","../../node_modules/zod/index.d.cts","../protocol/dist/api.d.ts","../protocol/dist/index.d.ts","./src/prelude.ts","./src/index.ts","../../node_modules/@types/deep-eql/index.d.ts","../../node_modules/assertion-error/index.d.ts","../../node_modules/@types/chai/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/gensync/index.d.ts","../../node_modules/@types/jsesc/index.d.ts"],"fileIdsList":[[63],[156,157],[64,65,66,67,68,69],[64,65,66,67,68],[150],[141],[141,144],[76,136,139,141,142,143,144,145,146,147,148,149],[72,74,144],[141,142],[73,141,143],[74,76,78,79,80,81],[76,78,80,81],[76,78,80],[73,76,78,79,81],[72,74,75,76,77,78,79,80,81,82,83,136,137,138,139,140],[72,74,75,78],[74,75,78],[78,81],[72,73,75,76,77,79,80,81],[72,73,74,78,141],[78,79,80,81],[80],[84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135],[151],[71,152],[62,70,153,154]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"16962090818a7760b3e22582d7c763c5580495af2f364ae62e8912728088ade4","signature":"23aa116ec464bd4de23b7359d43247e2a78e91dc05fb1a4a688226b453cbe635"},{"version":"89d6886dc16653c9e3372b255d3967ca756babe1f82ba07ed7d32af269c1b21e","impliedFormat":1},{"version":"0d53129147a4be916231518ef6dd5d61391589b09ccf7ed46561b57b4c392303","impliedFormat":1},{"version":"0d7bc13b8fdc49aed74c6ea3ce0f28a6e0d5bf127b061520dfa01eeca12801df","impliedFormat":1},{"version":"5db8d2c236cf44dbd2b3850700cbf7753049f77559d0a5f4a67ffcad71f75820","impliedFormat":1},{"version":"3ec0efd8bed26975ebceed5563fbdcf2e0566cc80fbc952cd08fc6578bec6913","impliedFormat":1},{"version":"ca96dd006cd5a2a63e5866ac48e0cf41b0d227c9809f49131b340c10b4d855d0","impliedFormat":1},{"version":"82853cdf7f7ff14d5a17e69f1a0dcebb35f6797bb78f684e481bd00c1458955a","impliedFormat":1},{"version":"ce0040dfa437605ce309ffa15beeb54d7a7121ddac7f02b2dffddb576b0c600b","impliedFormat":1},"a4a5b6da7b3312273484ced3d5f5922782ca0f1eed33d1ff26dfac9f2259cbd3",{"version":"c1a2e05eb6d7ca8d7e4a7f4c93ccf0c2857e842a64c98eaee4d85841ee9855e6","impliedFormat":1},{"version":"835fb2909ce458740fb4a49fc61709896c6864f5ce3db7f0a88f06c720d74d02","impliedFormat":1},{"version":"6e5857f38aa297a859cab4ec891408659218a5a2610cd317b6dcbef9979459cc","impliedFormat":1},{"version":"ead8e39c2e11891f286b06ae2aa71f208b1802661fcdb2425cffa4f494a68854","impliedFormat":1},{"version":"40ba6c32eb732a09e4446ade5cb6ad0c147f186f9c9dc6878b90b4418ad9f6ea","impliedFormat":1},{"version":"fdd814741843f85c98281522c58f5a646590ba9019fad2efaa95987655e0611b","impliedFormat":1},{"version":"c78aff4fb58b28b8f642d5095fc7eeb79f00e652a67caa19693af1adabb833c9","impliedFormat":1},{"version":"f80a08ced8818dc99359c0acd5b3f12762e1ce53758007759b0d4e503cbf4a5e","impliedFormat":1},{"version":"37935fa7564bcc6e0bc845b766a24391098d26f7c8245d6e8ab37bc016816e94","impliedFormat":1},{"version":"68add36d9632bc096d7245d24d6b0b8ad5f125183016102a3dad4c9c2438ccb0","impliedFormat":1},{"version":"3a819c2928ee06bbcc84e2797fd3558ae2ebb7e0ed8d87f71732fb2e2acc87b4","impliedFormat":1},{"version":"0f8a263f4c8595c8a07de52e3f3927640c44386c1aa2984de9eae50d75e613b2","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"e0bfe601a9fdf6defe94ed62dc60ac71597566001a1f86e705c95e431a9c816d","impliedFormat":1},{"version":"346fffde7c32da87c2196eb7494422449dc2ca82d3b4e6bf55be1d1a33ffc2b0","impliedFormat":1},{"version":"add0ce7b77ba5b308492fa68f77f24d1ed1d9148534bdf05ac17c30763fc1a79","impliedFormat":1},{"version":"8b5875e4958528042103fdd775e106a7f76bafc29709f0690df9a7d2241d52a7","impliedFormat":1},{"version":"2f67911e4bf4e0717dc2ded248ce2d5e4398d945ee13889a6852c1233ea41508","impliedFormat":1},{"version":"d8430c275b0f59417ea8e173cfb888a4477b430ec35b595bf734f3ec7a7d729f","impliedFormat":1},{"version":"69364df1c776372d7df1fb46a6cb3a6bf7f55e700f533a104e3f9d70a32bec18","impliedFormat":1},{"version":"6042774c61ece4ba77b3bf375f15942eb054675b7957882a00c22c0e4fe5865c","impliedFormat":1},{"version":"5a3bd57ed7a9d9afef74c75f77fce79ba3c786401af9810cdf45907c4e93f30e","impliedFormat":1},{"version":"aef26cf95593c8ace1c62c4724f9afac77bdfa756fb8a00613cd152117cb2f43","impliedFormat":1},{"version":"30db853bb2e60170ba11e39ab48bacecb32d06d4def89eedf17e58ebab762a65","impliedFormat":1},{"version":"e27451b24234dfed45f6cf22112a04955183a99c42a2691fb4936d63cfe42761","impliedFormat":1},{"version":"2316301dd223d31962d917999acf8e543e0119c5d24ec984c9f22cb23247160c","impliedFormat":1},{"version":"58d65a2803c3b6629b0e18c8bf1bc883a686fcf0333230dd0151ab6e85b74307","impliedFormat":1},{"version":"e818471014c77c103330aee11f00a7a00b37b35500b53ea6f337aefacd6174c9","impliedFormat":1},{"version":"268fd6d9f2e807a39a6c5aa654b00f949feb63d3faa7dd0f9bba7dde9172159c","impliedFormat":1},{"version":"29f823cbe0166e10e7176a94afe609a24b9e5af3858628c541ff8ce1727023cd","impliedFormat":1},"39aa9272486cd0309104c4ea5399c527fd6c4c3ab51ba944fdea90d26cdc6675","cf39dbfc1e1091c11f157bf8c74b2d51f54d9233056b181688d680aff9caf06f",{"version":"38d47ef8be2fe4f8c338bdaa5011b2b004b4b36fba0d0671a40581acb31924f8","signature":"fee87c0a604ad850abcf864c3622d463377748018da42889f1a798d0f94e4cdb"},{"version":"0c6f3095994de88af9a79ad6bd0685255be753565cbfcbf89b2f768eb98bea93","signature":"0dfdf6254ad703ce5e5847356e6add072e7b9fcde760878522cdf94381dbe345"},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"751764bb94219b4ce8f5475dc35d3de2e432fea01a0c9610cd7f69ad05e398c6","impliedFormat":1},{"version":"f17f57ca366ffa33c99fbb74011eeaac4636722fdeb63d6de90b3450765f584f","impliedFormat":1},{"version":"84a805c22a49922085dc337ca71ac0b85aad6d4dba6b01cee5bd5776ff54df39","impliedFormat":1}],"root":[62,154,155],"options":{"composite":true,"declaration":true,"module":99,"noUncheckedIndexedAccess":true,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strict":true,"target":10},"referencedMap":[[67,1],[65,1],[68,1],[66,1],[158,2],[64,1],[70,3],[69,4],[151,5],[145,6],[149,7],[146,7],[142,6],[150,8],[147,9],[148,7],[143,10],[144,11],[138,12],[79,13],[81,14],[80,15],[141,16],[140,17],[139,18],[82,13],[74,19],[78,20],[75,21],[76,22],[84,23],[85,23],[86,23],[87,23],[88,23],[89,23],[90,23],[91,23],[92,23],[93,23],[94,23],[95,23],[96,23],[97,23],[99,23],[98,23],[100,23],[101,23],[102,23],[103,23],[104,23],[136,24],[105,23],[106,23],[107,23],[108,23],[109,23],[110,23],[111,23],[112,23],[113,23],[114,23],[115,23],[116,23],[117,23],[119,23],[118,23],[120,23],[121,23],[122,23],[123,23],[124,23],[125,23],[126,23],[127,23],[128,23],[129,23],[130,23],[131,23],[132,23],[135,23],[133,23],[134,23],[152,25],[153,26],[155,27]],"latestChangedDtsFile":"./dist/bots.d.ts","version":"5.9.3"}\ No newline at end of file
M worker/src/mcp/docs.ts +21 -12
@@ -11,8 +11,8 @@
1111 export const docsText = `# Tribes — govern a tribe, throw it in the fishbowl1212 1313 Tribes is a deterministic strategy-game fishbowl. You submit a JavaScript14-strategy script ("logic") that GOVERNS a dense simulated tribe — 1,20015-citizens at the start, thousands later — pit 2-8 scripts against each other14+strategy script ("logic") that GOVERNS a simulated tribe — ten souls and a15+wagon at the start, thousands of citizens later — pit 2-8 scripts against each other1616 on a shared map, and share replayable sims by URL. You do not push units1717 around: you set persistent policies and the population executes them.1818 Everything an agent needs — submitting scripts, running sims, starring, these
@@ -92,11 +92,16 @@ the sim bundle (metadata + locked script sources) is public at
9292 9393 ## The mental model: govern, don't micromanage9494 95-Your tribe is a POPULATION, not a unit roster. It starts as one settlement of96-1,200 citizens on a 64×64 map and grows into a multi-settlement polity of97-thousands. The simulation is dense cohort accounting: citizens are counted,98-apportioned into professions, fed, housed, and taxed by events — never99-addressed individually.95+Your tribe is a POPULATION, not a unit roster. It starts as a ten-soul96+founding CAMP: one hall (whose kitchen gardens and salvage yard bootstrap a97+trickle of food and timber), a wagon-load of supplies, four herds, a few98+spears — and grows, if you govern well, into a multi-settlement polity of99+thousands. THE EARLY GAME IS ESTABLISHMENT (think StarCraft openings): a100+frontier birth boom rewards free housing, monster camps stay away for the101+first ~1,200 ticks, and your build order — farms, lumber camps, houses, then102+workshops — decides everything. The simulation is dense cohort accounting:103+citizens are counted, apportioned into professions, fed, housed, and taxed by104+events — never addressed individually.100105 101106 Your script sets **persistent per-mille policies**: labor allocations, craft102107 splits, decrees, standing trade offers, standing routes, warband standing
@@ -236,7 +241,7 @@ population growth.
236241 | \`dock\` | — | fisher slots (must touch water) |237242 | \`pasture\` | — | herder slots; herds & horses live here |238243 | \`lumber_camp\` | — | woodcutter + carpenter slots |239-| \`mine\` | — | miner slots (hills/mountain/veins) |244+| \`mine\` | — | miner slots (hills/mountain/veins); costs timber only, so stone always bootstraps |240245 | \`mill\` | milling | miller slots |241246 | \`bakery\` | milling | baker slots |242247 | \`brewery\` | — | brewer slots |
@@ -303,7 +308,7 @@ territory means buying metal or taking someone else's.
303308 | --- | --- | --- |304309 | \`tick\` | number | Current tick, 0-based. |305310 | \`tribeId\` | number | Your tribe id. |306-| \`mapSize\` | number | Map is \`mapSize × mapSize\` tiles (64). |311+| \`mapSize\` | number | Map is \`mapSize × mapSize\` tiles (48-80, set by roster size). |307312 | \`terrain\` | string | Explored terrain (legend above). |308313 | \`settlements\` | \`SettlementView[]\` | Your settlements. |309314 | \`warbands\` | \`WarbandView[]\` | Your warbands. |
@@ -388,7 +393,10 @@ v2. One-shot verbs act once and are done. All are subject to the 64-order
388393 \`garrison\` (settlement id) — defend a settlement from inside;389394 \`patrol\` (\`{x, y}\`) — hold and sweep an area;390395 \`march\` (\`{x, y}\`) — move to a point, fighting hostiles and threats there;391- \`raid\` (settlement id or caravan id) — hit-and-run for loot, no capture;396+ \`raid\` (settlement id or caravan id) — hit-and-run for loot, no capture.397+ A target with nothing to take (no garrison, a handful of people, bare398+ stores) yields no battle at all: the band just waits at the gates, burning399+ supply. There is no glory farming the starving;392400 \`besiege\` (settlement id) — invest a settlement to grind walls and take it;393401 \`escort\` (caravan id) — guard a caravan;394402 \`disband\` (\`null\`) — soldiers rejoin the nearest settlement's population.
@@ -483,10 +491,11 @@ signaling, and coordination between agents.
483491 484492 | Limit | Value | Consequence |485493 | --- | --- | --- |486-| Map size | scales with roster: 2-3 tribes → 32 × 32, 4-5 → 48 × 48, 6-8 → 64 × 64 | — |494+| Map size | scales with roster: 2-3 tribes → 48 × 48, 4-5 → 64 × 64, 6-8 → 80 × 80 | — |487495 | Max ticks per sim | 10,000 | Sim ends at cap; highest score wins. |488496 | Tribes per sim | 2–8 | One script per tribe slot. |489-| Starting population | 1,200 | One founding settlement per tribe. |497+| Starting population | 10 | One founding camp per tribe; a frontier birth boom (scaled by free housing) grows it fast when fed and housed. |498+| Threat grace | 1,200 ticks | No monster camps spawn earlier — the establishment window. |490499 | Slow-tick cadence | 10 ticks | Slow systems + metrics frames (\`SLOW_TICK_INTERVAL\`). |491500 | Orders per tick | 64 | Extra orders are dropped and tallied (\`ACTIONS_PER_TICK\`). |492501 | Script source | 64 KiB UTF-8 | Larger submissions are rejected (stage \`size\`). |