Skip to content

Search is only available in production builds. Try building and previewing the site to test it out locally.

Map and terrain

A claim is a square grid of 8 by 8 parcels (the constant N). Each parcel is 2.5 acres, so a claim is 160 acres. Columns run A to H from west to east and rows run 1 to 8 from north to south. The Coeur d’Alene River runs along the south edge.

Parcels are stored in a flat array. The index of a parcel is r * 8 + c.

Every parcel has two fixed flags set when the claim is created: slope (steep) and meadow. Neither changes during play.

slope = (r + c >= 9 AND r <= 4) OR (r <= 1 AND c >= 4)
meadow = (r == 7 AND c <= 2)
zone(parcel) = "ridge" if slope
"bottom" if r >= 6
"bench" otherwise

Row numbers in the code are zero-based, so r >= 6 means rows 7 and 8. The 14 steep parcels are E1, F1, G1, H1, E2, F2, G2, H2, H3, G4, H4, F5, G5 and H5. The meadow is A8, B8 and C8. The claim therefore has 14 ridge parcels, 13 timbered bottom parcels, 34 bench parcels and 3 meadow parcels.

The meadow starts with no timber (planted = null). It can be built on, farmed, or left open. It cannot be replanted, and it is not counted when the game computes forest cover (61 parcels count, not 64).

Zones. Mix is the share of species when a claim is seeded. Plant is the list of species a player may replant.
ZoneSeeding mixReplant options
River bottomrc 0.4, cw 0.2, wh 0.2, gf 0.2rc, wh, gf, cw
Bench groundwp 0.28, df 0.27, l 0.15, gf 0.12, wh 0.1, lp 0.08wp, df, l, gf, lp
Steep, dry ridgepp 0.45, l 0.3, df 0.15, lp 0.1pp, l, df, lp

Species keys are listed on the timber and growth page.

The landing is parcel B8 (the constant LANDING: zero-based row 7, column 1). It starts as a road parcel. Cut logs accumulate in the landing deck, and the wagon leaves from it. The landing cannot be farmed, and the interface does not offer buildings or businesses on it.

A new claim is generated from a random generator seeded with the creation time in whole seconds. The generator is a linear congruential sequence (s = s * 1664525 + 1013904223, modulo 2 to the 32). The same creation second always gives the same claim.

for each parcel in row-major order:
if meadow: planted = null (no timber, no species)
else if rand() < 0.22: age = 22 + rand() * 30 real hours
else: age = 1 + rand() * 17 real hours
species = pickSpecies(zone, rand())
planted = createdAt - age * 3600000
pickSpecies walks the zone mix in key order, adding weights,
and returns the first species whose running total exceeds x.

Each non-meadow parcel has an independent 22 percent chance to start old, so the share of old parcels varies by claim. Ages are real hours. A parcel’s growth-adjusted age is its real age times the species growth factor.

The landing parcel is then marked as a road.

The only input to the map is the creation time. The output is the 64 parcel records. The map keeps no time-based state of its own; timber growth is derived from each parcel’s planted timestamp (see timber and growth).

Terrain flags are pure functions of position, so a server can compute them on demand. Seeding is not safe to leave on the client: a seed derived from a client clock lets a player choose a favorable claim by choosing the second. A server should assign claims from its own seed or from a surveyed parcel table, and should record which claim and which block each player owns. The prototype puts one claim in a fixed valley block; a shared game needs a registry of claims and parcels with an owner on each.

Source: prototype/index.html · constants N, ZONES, LANDING in rules.json · logic newClaim, zoneOf, pickSpecies, rng