@pikehub/warpass-bot 0.0.0-stage → 62.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/docs/llms.txt ADDED
@@ -0,0 +1,41 @@
1
+ # Warpass bot SDK
2
+
3
+ > Play Warpass (a real-time strategy game) from code: online ranked matches as a bot account, local games against the built-in AI, custom staged games and replays. Node.js and Python bindings over the native engine.
4
+
5
+ ## Start
6
+
7
+ - [README](README.md): what the SDK is, install, a first bot
8
+ - [AGENTS](AGENTS.md): the think loop, invariants and pitfalls for coding agents
9
+ - [Quickstart](quickstart.md): bot account and key, local game, online match
10
+
11
+ ## Concepts
12
+
13
+ - [Time and turns](concepts/time.md): ticks, turns, think scheduling, when orders land
14
+ - [Seeing the game](concepts/view.md): fog of war, entity ids, coordinates
15
+ - [Players](concepts/players.md): Bot, Ai, Idle and the remote opponent
16
+ - [Versioning](concepts/versioning.md): engine versions, OutdatedEngine, upgrades
17
+ - [Limits](concepts/limits.md): order rate, payloads, fair play
18
+
19
+ ## API
20
+
21
+ - [Online](api/online.md): Warpass.connect, queue, Offer, OnlineMatch, results
22
+ - [Local play](api/local.md): Match, Bot, Ai, Idle, play, playMany, GameResult
23
+ - [View](api/view.md): every field a bot sees
24
+ - [Game queries](api/game.md): canTrain, findPlacement, nearestResource and the rest
25
+ - [Orders](api/act.md): every order and its arguments
26
+ - [Events](api/events.md): what a bot hears between thinks
27
+ - [Custom games](api/custom.md): setup ops, stepping, observer view
28
+ - [Replays](api/replay.md): save, load, verify, analyse
29
+ - [Rules and docs](api/rules.md): rules(), docs(), constants
30
+
31
+ ## Guides
32
+
33
+ - [An economy bot](guides/economy.md): workers, housing, a production loop
34
+ - [Testing a bot](guides/testing.md): playMany over seeds, comparing versions
35
+ - [Drills with custom games](guides/drills.md): staged fights and timing
36
+ - [LLM strategists](guides/llm.md): a slow planner over a fast scripted bot
37
+
38
+ ## Reference
39
+
40
+ - [Errors](errors.md): every error kind and what to do
41
+ - [Rules](rules/index.md): units of measure, terrain ids and one page per race
@@ -0,0 +1,77 @@
1
+ # Quickstart
2
+
3
+ From nothing to a bot that has played a local game and an online match.
4
+
5
+ ## 1. Create a bot account
6
+
7
+ Sign in on the site, open **Developer** in the menu and create a bot. It gets its own name (shown as `<name> (AI)` to other players), rating and match history. The key (`wpb_…`) is shown once; keep it secret and pass it to the SDK. Rotating the key kills the old one at once.
8
+
9
+ ## 2. Install
10
+
11
+ Node.js 20 or newer:
12
+
13
+ ```
14
+ npm i @pikehub/warpass-bot
15
+ ```
16
+
17
+ The package carries the engine for Linux (x64 and arm64, glibc 2.17 or newer). On macOS or Windows, run your bot in a Linux container or WSL.
18
+
19
+ ## 3. Play locally
20
+
21
+ Local games need no key and no network. They run as fast as the CPU allows.
22
+
23
+ ```js
24
+ import { Ai, Bot, Match, play, rules } from "@pikehub/warpass-bot";
25
+
26
+ const r = rules();
27
+ const [mine, theirs] = r.races;
28
+
29
+ function think({ view, act }) {
30
+ const army = view.units.filter((u) => !u.worker);
31
+ const seen = view.enemyBuildings[0];
32
+ if (army.length >= 4 && seen) act.attackMove(army, seen.x, seen.y);
33
+ }
34
+
35
+ const result = await play(new Match({ seed: 7, maxTicks: 2400, players: [Bot({ race: mine, think }), Ai({ race: theirs, level: 2 })] }));
36
+ console.log({ winner: result.winnerSlot, ticks: result.endTick, finished: result.finished });
37
+ ```
38
+
39
+ ## 4. Play online
40
+
41
+ ```js online
42
+ import { Warpass } from "@pikehub/warpass-bot";
43
+
44
+ const wp = await Warpass.connect({ token: process.env.WARPASS_BOT_TOKEN });
45
+ const offer = await wp.queue({ race: "templars" });
46
+ console.log(`matched with ${offer.opponent.name} (${offer.opponent.rating})`);
47
+ const match = await offer.accept({ everyTicks: 10 });
48
+ match.onThink(({ view, act }) => {
49
+ const idle = view.units.filter((u) => !u.worker && u.order === "idle");
50
+ const enemy = view.enemyBuildings[0];
51
+ if (idle.length >= 6 && enemy) act.attackMove(idle, enemy.x, enemy.y);
52
+ });
53
+ const result = await match.result();
54
+ console.log(result.outcome, result.verified, result.ratingDelta);
55
+ ```
56
+
57
+ `result()` waits until the match is over and the server has replayed it (`verified: "ok"`). A bot plays under the same rules as a person: same queue, same rating, same match ledger.
58
+
59
+ ## Python
60
+
61
+ The same API in snake_case (`pip install warpass-bot` once published):
62
+
63
+ ```python
64
+ from warpass_bot import Ai, Bot, Match, play, rules
65
+
66
+ r = rules()
67
+
68
+ def think(t):
69
+ idle = [u for u in t.view.units if u.worker and u.order == "idle"]
70
+ home = t.view.buildings[0] if t.view.buildings else None
71
+ gold = t.game.nearest_resource(home.tile, "gold", 30) if home else None
72
+ if idle and gold:
73
+ t.act.gather(idle, gold)
74
+
75
+ result = play(Match(seed=7, max_ticks=1200, players=[Bot(r.races[0], think), Ai(r.races[1], level=2)]))
76
+ print(result.winner_slot, result.end_tick)
77
+ ```
@@ -0,0 +1,45 @@
1
+ # Rules for engine 62
2
+
3
+ Generated from the engine this SDK bundles. Every id below is what the view, the queries and the orders use.
4
+
5
+ - Ticks per second: 20
6
+ - One tile is 256 position units; positions (`x`, `y`) are in 1/256 tile, tiles (`tile`, `at`) in whole tiles
7
+ - Map size: 256 × 256 tiles
8
+ - Resources: food, wood, stone, gold
9
+ - Races: [templars](templars.md), [orcs](orcs.md), [witches](witches.md)
10
+
11
+ ## Terrain ids
12
+
13
+ | id | terrain |
14
+ |---|---|
15
+ | 0 | deep |
16
+ | 1 | shallow |
17
+ | 2 | river |
18
+ | 3 | sand |
19
+ | 4 | grass |
20
+ | 5 | dirt |
21
+ | 6 | road |
22
+ | 7 | forest |
23
+ | 8 | thicket |
24
+ | 9 | rock |
25
+ | 10 | gold |
26
+ | 11 | stone |
27
+ | 12 | berries |
28
+ | 13 | marsh |
29
+ | 14 | bridge |
30
+ | 15 | burnt |
31
+ | 16 | stumps |
32
+ | 17 | spentVein |
33
+ | 18 | pickedBush |
34
+ | 19 | orchard |
35
+ | 20 | grainField |
36
+ | 21 | mushrooms |
37
+ | 22 | stubble |
38
+
39
+ ## Units of measure
40
+
41
+ - `hp`, `damage`, `armor`: hit points
42
+ - `speed`: 1/256 tile per tick (tiles per second = speed × 20 / 256)
43
+ - `range`, `minRange`: 1/256 tile
44
+ - `sight`: tiles
45
+ - `cooldown`, `trainTicks`, `buildTicks`, `ticks`: ticks
@@ -0,0 +1,54 @@
1
+ # orcs (engine 62)
2
+
3
+ Generated from the bundled engine. Units of measure are in [index.md](index.md).
4
+
5
+ ## Units
6
+
7
+ | id | cost | supply | hp | armor m/p | attack | speed (tiles/s) | sight | train | trained at | requires | abilities |
8
+ |---|---|---|---|---|---|---|---|---|---|---|---|
9
+ | peon (worker) | 50 food | 1 | 28 | 0/1 | - | 2.58 | 5 | 8.2 s | skullHall | - | gather, build, repair |
10
+ | goblin | 45 food | 1 | 26 | 0/0 | 4 dmg, range 0.4 tiles, every 1.2 s | 2.81 | 6 | 6.8 s | spawningPit | - | - |
11
+ | shaman | 60 food, 55 gold | 1 | 40 | 0/1 | - | 2.50 | 7 | 12.4 s | totemLodge | - | - |
12
+ | warDrummer | 70 food, 45 wood | 1 | 48 | 0/1 | - | 2.50 | 7 | 12.4 s | totemLodge | - | - |
13
+ | witchDoctor | 50 food, 70 gold | 1 | 36 | 0/1 | - | 2.50 | 7 | 13.8 s | totemLodge | - | - |
14
+ | fleshShaper | 90 food, 45 gold | 2 | 70 | 0/1 | - | 2.19 | 7 | 15.2 s | fleshDen | - | - |
15
+ | bonecaller | 60 food, 60 wood | 1 | 50 | 0/1 | - | 2.50 | 7 | 13.8 s | fleshDen | - | - |
16
+ | venomBrewer | 60 food, 60 gold | 1 | 42 | 0/1 | - | 2.50 | 7 | 13.8 s | fleshDen | - | - |
17
+
18
+ ## Buildings
19
+
20
+ | id | size | cost | hp | build | supply | trains | researches | requires |
21
+ |---|---|---|---|---|---|---|---|---|
22
+ | skullHall | 4×4 | 275 wood, 150 stone | 2200 | 58.6 s | 10 | peon | grubRations, slaveDrivers | - |
23
+ | burrow | 2×2 | 30 wood | 450 | 15.2 s | 8 | - | - | - |
24
+ | mushroomBed | 3×3 | 55 wood | 200 | 10.3 s | 0 | - | - | - |
25
+ | gutLarder | 2×2 | 100 wood | 550 | 19.3 s | 0 | - | - | - |
26
+ | boneYard | 2×2 | 100 wood | 550 | 19.3 s | 0 | - | boneSaws | - |
27
+ | goldPit | 2×2 | 100 wood | 550 | 19.3 s | 0 | - | deepPits | - |
28
+ | spawningPit | 3×3 | 175 wood | 1000 | 24.1 s | 0 | - | broodMothers, feedingFrenzy, endlessHorde | all of burrow |
29
+ | totemLodge | 3×3 | 175 wood, 50 gold | 1000 | 27.6 s | 0 | shaman, warDrummer, witchDoctor | bloodRites, deepTrance, bloodFrenzy | all of spawningPit |
30
+ | fleshDen | 3×3 | 175 wood, 50 gold | 1000 | 27.6 s | 0 | fleshShaper, bonecaller, venomBrewer | thickHides, grislyMending, abomination | all of spawningPit |
31
+ | bloodAltar | 2×2 | 125 wood, 50 stone | 800 | 24.1 s | 0 | - | jaggedIron, serratedIron, hideArmor, bonePlate | all of spawningPit |
32
+ | spikeTower | 2×2 | 90 wood, 100 stone | 650 | 22.1 s | 0 | - | - | all of spawningPit |
33
+
34
+ ## Upgrades
35
+
36
+ | id | cost | time | requires |
37
+ |---|---|---|---|
38
+ | grubRations | 100 food, 100 wood | 20.6 s | - |
39
+ | slaveDrivers | 175 food, 150 wood, 75 gold | 31.0 s | researched grubRations |
40
+ | boneSaws | 75 food, 75 wood | 20.6 s | - |
41
+ | deepPits | 100 food, 75 wood | 24.1 s | - |
42
+ | jaggedIron | 100 food, 50 gold | 24.1 s | - |
43
+ | serratedIron | 200 food, 125 gold | 34.5 s | researched jaggedIron |
44
+ | hideArmor | 100 food, 50 gold | 24.1 s | - |
45
+ | bonePlate | 200 food, 125 gold | 34.5 s | researched hideArmor |
46
+ | broodMothers | 125 food, 75 wood | 24.1 s | - |
47
+ | feedingFrenzy | 175 food, 100 wood, 75 gold | 31.0 s | researched broodMothers |
48
+ | endlessHorde | 250 food, 150 wood, 175 gold | 37.9 s | researched feedingFrenzy |
49
+ | bloodRites | 100 food, 75 gold | 24.1 s | - |
50
+ | deepTrance | 150 food, 150 gold | 31.0 s | researched bloodRites |
51
+ | bloodFrenzy | 200 food, 250 gold | 37.9 s | researched deepTrance |
52
+ | thickHides | 125 food, 50 wood | 24.1 s | - |
53
+ | grislyMending | 175 food, 100 gold | 31.0 s | researched thickHides |
54
+ | abomination | 250 food, 200 gold | 37.9 s | researched grislyMending |
@@ -0,0 +1,84 @@
1
+ # templars (engine 62)
2
+
3
+ Generated from the bundled engine. Units of measure are in [index.md](index.md).
4
+
5
+ ## Units
6
+
7
+ | id | cost | supply | hp | armor m/p | attack | speed (tiles/s) | sight | train | trained at | requires | abilities |
8
+ |---|---|---|---|---|---|---|---|---|---|---|---|
9
+ | peasant (worker) | 50 food | 1 | 25 | 0/1 | 4 dmg, range 0.4 tiles, every 1.5 s | 2.50 | 5 | 8.2 s | keep | - | gather, build, repair |
10
+ | spearman | 35 food, 25 wood | 1 | 45 | 0/0 | 4 dmg, range 0.6 tiles, every 1.5 s | 2.34 | 6 | 9.7 s | barracks | - | - |
11
+ | swordsman | 50 food, 40 gold | 1 | 60 | 1/1 | 7 dmg, range 0.4 tiles, every 1.4 s | 2.19 | 6 | 11.0 s | barracks | all of blacksmith | - |
12
+ | archer | 35 wood, 30 gold | 1 | 32 | 0/0 | 5 dmg, range 5.0 tiles, every 1.8 s | 2.34 | 7 | 11.0 s | archeryRange | - | - |
13
+ | crossbowman | 50 wood, 40 gold | 1 | 38 | 0/0 | 6 dmg, range 6.0 tiles, every 2.0 s | 2.19 | 8 | 12.4 s | archeryRange | researched crossbowDrill | - |
14
+ | outrider | 80 food | 2 | 60 | 0/2 | 4 dmg, range 0.5 tiles, every 1.8 s | 4.38 | 9 | 10.3 s | stable | - | - |
15
+ | knight | 70 food, 60 gold | 2 | 105 | 2/2 | 10 dmg, range 0.5 tiles, every 1.8 s | 3.36 | 6 | 15.2 s | stable | researched squires | - |
16
+ | cleric | 40 food, 75 gold | 1 | 30 | 0/0 | - | 1.88 | 8 | 13.8 s | chapel | - | - |
17
+ | ram | 150 wood, 30 gold | 3 | 175 | -2/180 | 2 dmg, range 0.4 tiles, every 4.0 s | 1.72 | 3 | 14.4 s | siegeWorkshop | researched engineersCorps | - |
18
+ | mangonel | 120 wood, 100 gold | 3 | 50 | 0/6 | 30 dmg, range 7.0 tiles, every 4.5 s | 1.72 | 8 | 15.2 s | siegeWorkshop | researched engineersCorps | - |
19
+ | handgunner | 40 food, 50 gold | 1 | 45 | 0/1 | 8 dmg, range 6.0 tiles, every 3.0 s | 2.11 | 7 | 13.8 s | powderMill | - | - |
20
+ | bombard | 130 wood, 140 gold | 3 | 80 | 2/5 | 40 dmg, range 9.0 tiles, every 6.0 s | 1.56 | 9 | 20.6 s | siegeWorkshop | any researched siegeTrain, saltpeter | - |
21
+
22
+ ## Buildings
23
+
24
+ | id | size | cost | hp | build | supply | trains | researches | requires |
25
+ |---|---|---|---|---|---|---|---|---|
26
+ | keep | 4×4 | 300 wood, 175 stone | 2400 | 62.0 s | 10 | peasant | guildCharter, merchantGuilds, guildmasters, wheelbarrow, townWatch | - |
27
+ | house | 2×2 | 30 wood | 550 | 17.2 s | 8 | - | - | - |
28
+ | farm | 3×3 | 60 wood | 200 | 10.3 s | 0 | - | - | - |
29
+ | granary | 2×2 | 100 wood | 600 | 20.6 s | 0 | - | horseCollar, heavyPlow | - |
30
+ | lumberMill | 2×2 | 100 wood | 600 | 20.6 s | 0 | - | doubleBitAxe, bowSaw | - |
31
+ | miningCamp | 2×2 | 100 wood | 600 | 20.6 s | 0 | - | goldMining, stoneMining | - |
32
+ | barracks | 3×3 | 175 wood | 1200 | 27.6 s | 0 | spearman, swordsman | levyRights, drillYards, warhost | all of house |
33
+ | archeryRange | 3×3 | 175 wood | 1200 | 27.6 s | 0 | archer, crossbowman | crossbowDrill, fireArrows | all of barracks |
34
+ | blacksmith | 3×3 | 150 wood | 1200 | 27.6 s | 0 | - | forging, steel, mail, plate, fletching, bodkin, shieldWall, saltpeter | all of barracks |
35
+ | stable | 3×3 | 175 wood | 1200 | 31.0 s | 0 | outrider, knight | squires, lanceCharge, knightsOrder | all of barracks |
36
+ | chapel | 3×3 | 150 wood, 75 stone | 1000 | 27.6 s | 0 | cleric | sanctify | all of barracks |
37
+ | masonsLodge | 3×3 | 150 wood, 50 stone | 1200 | 31.0 s | 0 | - | masterMasons, guardTowers, fortress | all of barracks |
38
+ | siegeWorkshop | 3×3 | 200 wood | 1200 | 34.5 s | 0 | ram, mangonel, bombard | engineersCorps, siegeTrain, grandBattery | all of barracks |
39
+ | powderMill | 3×3 | 150 wood, 100 stone | 1300 | 27.6 s | 0 | handgunner | volleyFire, arsenal | researched saltpeter |
40
+ | palisade | 1×1 | 6 wood | 160 | 4.1 s | 0 | - | - | - |
41
+ | stoneWall | 1×1 | 12 stone | 900 | 6.8 s | 0 | - | - | all of masonsLodge |
42
+ | gate | 1×1 | 40 stone | 1200 | 10.3 s | 0 | - | - | all of masonsLodge |
43
+ | watchtower | 2×2 | 75 wood, 125 stone | 700 | 24.1 s | 0 | - | - | all of barracks |
44
+
45
+ ## Upgrades
46
+
47
+ | id | cost | time | requires |
48
+ |---|---|---|---|
49
+ | guildCharter | 100 food, 100 wood | 20.6 s | - |
50
+ | merchantGuilds | 175 food, 150 wood, 75 gold | 31.0 s | researched guildCharter |
51
+ | guildmasters | 200 food, 150 wood, 100 gold | 34.5 s | researched merchantGuilds |
52
+ | levyRights | 75 food, 50 wood | 17.2 s | - |
53
+ | drillYards | 150 food, 100 wood, 50 gold | 27.6 s | researched levyRights |
54
+ | warhost | 175 food, 100 wood, 100 gold | 34.5 s | researched drillYards |
55
+ | masterMasons | 100 wood, 100 stone | 20.6 s | - |
56
+ | guardTowers | 150 wood, 125 stone | 31.0 s | researched masterMasons |
57
+ | fortress | 150 wood, 175 stone, 100 gold | 34.5 s | researched guardTowers |
58
+ | squires | 75 food, 40 gold | 20.6 s | - |
59
+ | lanceCharge | 125 food, 100 gold | 31.0 s | researched squires |
60
+ | knightsOrder | 200 food, 200 gold | 34.5 s | researched lanceCharge |
61
+ | engineersCorps | 100 wood, 50 gold | 20.6 s | - |
62
+ | siegeTrain | 150 wood, 100 gold | 31.0 s | researched engineersCorps |
63
+ | grandBattery | 150 wood, 150 gold | 34.5 s | researched siegeTrain |
64
+ | saltpeter | 75 wood, 75 gold | 17.2 s | - |
65
+ | volleyFire | 150 wood, 200 gold | 31.0 s | researched saltpeter |
66
+ | arsenal | 175 wood, 250 gold | 34.5 s | researched volleyFire |
67
+ | wheelbarrow | 130 food, 100 wood | 31.0 s | - |
68
+ | townWatch | 50 food, 25 wood | 17.2 s | - |
69
+ | horseCollar | 55 food, 100 wood | 13.8 s | - |
70
+ | heavyPlow | 95 food, 160 wood | 27.6 s | researched horseCollar |
71
+ | doubleBitAxe | 75 food, 75 wood | 17.2 s | - |
72
+ | bowSaw | 110 food, 140 wood | 27.6 s | researched doubleBitAxe |
73
+ | goldMining | 75 food, 100 wood | 20.6 s | - |
74
+ | stoneMining | 75 food, 100 wood | 20.6 s | - |
75
+ | crossbowDrill | 40 food, 120 gold | 24.1 s | all of blacksmith |
76
+ | fireArrows | 75 wood, 150 gold | 27.6 s | researched fletching |
77
+ | forging | 50 food, 100 gold | 20.6 s | - |
78
+ | steel | 80 food, 225 gold | 34.5 s | researched forging |
79
+ | mail | 50 food, 100 gold | 20.6 s | - |
80
+ | plate | 80 food, 250 gold | 34.5 s | researched mail |
81
+ | shieldWall | 60 food, 150 gold | 27.6 s | researched mail |
82
+ | fletching | 60 wood, 90 gold | 20.6 s | - |
83
+ | bodkin | 100 wood, 200 gold | 31.0 s | researched fletching |
84
+ | sanctify | 175 gold | 27.6 s | - |
@@ -0,0 +1,78 @@
1
+ # witches (engine 62)
2
+
3
+ Generated from the bundled engine. Units of measure are in [index.md](index.md).
4
+
5
+ ## Units
6
+
7
+ | id | cost | supply | hp | armor m/p | attack | speed (tiles/s) | sight | train | trained at | requires | abilities |
8
+ |---|---|---|---|---|---|---|---|---|---|---|---|
9
+ | acolyte (worker) | 50 food | 1 | 24 | 0/1 | 3 dmg, range 0.4 tiles, every 1.5 s | 2.50 | 5 | 8.2 s | covenSpire | - | gather, build, repair |
10
+ | weaver | 50 food, 30 gold | 1 | 42 | 0/1 | 3 dmg, range 0.7 tiles, every 1.6 s | 2.50 | 7 | 11.0 s | atelier | - | gather, build, repair |
11
+ | moonblade | 35 food, 35 gold | 1 | 50 | 1/1 | 6 dmg, range 0.6 tiles, every 1.5 s | 2.34 | 6 | 10.3 s | sanctum | - | - |
12
+ | hexer | 25 food, 50 gold | 1 | 30 | 0/0 | 4 dmg, range 6.0 tiles, every 2.0 s | 2.34 | 7 | 11.7 s | sanctum | - | - |
13
+ | broomrider | 70 food, 25 gold | 2 | 60 | 0/1 | 3 dmg, range 3.0 tiles, every 1.5 s | 4.61 | 10 | 11.0 s | aerie | - | - |
14
+ | astromancer | 40 food, 40 stone, 130 gold | 3 | 45 | 0/3 | 24 dmg, range 9.0 tiles, every 5.0 s | 1.88 | 9 | 16.6 s | observatory | - | - |
15
+ | gargoyle | 60 food, 40 gold | 1 | 100 | 2/2 | 6 dmg, range 0.5 tiles, every 1.8 s | 2.34 | 6 | 20.6 s | gargoyleRoost | - | - |
16
+
17
+ ## Buildings
18
+
19
+ | id | size | cost | hp | build | supply | trains | researches | requires |
20
+ |---|---|---|---|---|---|---|---|---|
21
+ | covenSpire | 4×4 | 300 wood, 175 stone | 2400 | 51.7 s | 10 | acolyte | spindleCarry, starChart, swiftLooms, seedstones, moonrise | - |
22
+ | starlitCottage | 2×2 | 30 wood | 500 | 15.2 s | 8 | - | - | - |
23
+ | moonGarden | 3×3 | 45 wood | 200 | 10.3 s | 0 | - | - | - |
24
+ | stillroom | 2×2 | 100 wood | 600 | 20.6 s | 0 | - | herbLore, deepRoots | - |
25
+ | sylvanLodge | 2×2 | 100 wood | 600 | 20.6 s | 0 | - | whisperingAxe, heartwood | - |
26
+ | geodeVault | 2×2 | 100 wood | 650 | 20.6 s | 0 | - | veinSight, stoneSong | - |
27
+ | wayshrine | 2×2 | 90 wood, 80 stone | 400 | 17.2 s | 4 | acolyte, moonblade, hexer | - | all of sanctum |
28
+ | sanctum | 3×3 | 140 wood, 40 stone | 1150 | 27.6 s | 0 | moonblade, hexer | silverGlaives, moonsteel, wardedRobes, starweave, hexcraft, deepHexes | all of starlitCottage |
29
+ | aerie | 3×3 | 110 wood, 75 gold | 1100 | 27.6 s | 0 | broomrider | tailwinds | all of sanctum |
30
+ | observatory | 3×3 | 100 wood, 125 stone | 1100 | 31.0 s | 0 | astromancer | astralDrill, constellations, nightOfFallingStars, leyAttunement, wellspring, grandConvergence | all of starlitCottage |
31
+ | atelier | 3×3 | 100 wood, 100 stone | 1100 | 27.6 s | 0 | weaver | bitterSoil, creepingMire, blightCrown, briarcraft, hollowGround, gardenOfThorns, wardMasonry, crystalLenses | all of starlitCottage |
32
+ | gargoyleRoost | 2×2 | 80 wood, 60 stone | 800 | 24.1 s | 0 | - | - | all of starlitCottage |
33
+ | wardstone | 2×2 | 120 stone, 20 gold | 550 | 20.6 s | 0 | - | - | all of sanctum |
34
+ | hexSpire | 2×2 | 150 stone, 75 gold | 600 | 27.6 s | 0 | - | - | all of atelier |
35
+ | starfallBeacon | 3×3 | 250 stone, 150 gold | 900 | 37.9 s | 0 | - | - | all of observatory |
36
+ | leyObelisk | 1×1 | 60 stone, 40 gold | 250 | 13.8 s | 0 | - | - | all of sanctum |
37
+ | hexCircle | 3×3 | 50 stone, 100 gold | 300 | 17.2 s | 0 | - | - | all of atelier |
38
+ | thornSnare | 1×1 | 25 wood, 15 gold | 60 | 6.8 s | 0 | - | - | all of sanctum |
39
+ | briarHedge | 1×1 | 8 wood | 220 | 4.1 s | 0 | - | - | - |
40
+ | moonstoneWall | 1×1 | 14 stone | 850 | 6.8 s | 0 | - | - | all of atelier |
41
+ | moonGate | 1×1 | 40 stone | 1100 | 10.3 s | 0 | - | - | all of atelier |
42
+
43
+ ## Upgrades
44
+
45
+ | id | cost | time | requires |
46
+ |---|---|---|---|
47
+ | leyAttunement | 100 stone, 100 gold | 24.1 s | - |
48
+ | wellspring | 175 stone, 150 gold | 31.0 s | researched leyAttunement |
49
+ | grandConvergence | 200 stone, 250 gold | 37.9 s | researched wellspring |
50
+ | bitterSoil | 100 wood, 100 gold | 24.1 s | - |
51
+ | creepingMire | 150 wood, 175 gold | 31.0 s | researched bitterSoil |
52
+ | blightCrown | 150 wood, 100 stone, 250 gold | 37.9 s | researched creepingMire |
53
+ | briarcraft | 125 wood, 50 gold | 20.6 s | - |
54
+ | hollowGround | 200 wood, 125 gold | 31.0 s | researched briarcraft |
55
+ | gardenOfThorns | 200 wood, 200 gold | 37.9 s | researched hollowGround |
56
+ | astralDrill | 100 wood, 100 gold | 24.1 s | - |
57
+ | constellations | 125 wood, 50 stone, 125 gold | 31.0 s | researched astralDrill |
58
+ | nightOfFallingStars | 150 wood, 75 stone, 150 gold | 37.9 s | researched constellations |
59
+ | swiftLooms | 75 wood, 75 gold | 17.2 s | - |
60
+ | seedstones | 225 wood, 125 gold | 31.0 s | researched swiftLooms |
61
+ | moonrise | 250 wood, 100 stone, 150 gold | 37.9 s | researched seedstones |
62
+ | spindleCarry | 130 food, 100 wood | 31.0 s | - |
63
+ | starChart | 50 food, 25 wood | 17.2 s | - |
64
+ | herbLore | 55 food, 100 wood | 13.8 s | - |
65
+ | deepRoots | 95 food, 160 wood | 27.6 s | researched herbLore |
66
+ | whisperingAxe | 75 food, 75 wood | 17.2 s | - |
67
+ | heartwood | 110 food, 140 wood | 27.6 s | researched whisperingAxe |
68
+ | veinSight | 75 food, 100 wood | 20.6 s | - |
69
+ | stoneSong | 75 food, 100 wood | 20.6 s | - |
70
+ | silverGlaives | 50 food, 100 gold | 20.6 s | - |
71
+ | moonsteel | 80 food, 225 gold | 34.5 s | researched silverGlaives |
72
+ | wardedRobes | 50 food, 100 gold | 20.6 s | - |
73
+ | starweave | 80 food, 250 gold | 34.5 s | researched wardedRobes |
74
+ | hexcraft | 60 wood, 90 gold | 20.6 s | - |
75
+ | deepHexes | 100 wood, 200 gold | 31.0 s | researched hexcraft |
76
+ | tailwinds | 100 food, 75 gold | 20.6 s | - |
77
+ | wardMasonry | 100 wood, 150 stone | 24.1 s | - |
78
+ | crystalLenses | 100 wood, 100 stone, 150 gold | 31.0 s | researched wardMasonry |