Skip to content

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

Eras and technology

The claim runs on a calendar of technology. A town begins in the hand-tool years and, as it grows, moves through steam and rails, gas engines, and the power saw and highway. Each era multiplies a handful of existing rules: how fast the crew recovers, how much timber is lost skidding, what hauling costs, how fast a saw dulls, and what mills and the Mercantile pay. Era 0 multiplies everything by 1, so a claim that never leaves it plays exactly like the claim before eras existed.

Eras 0 to 3 are timber-economy eras. A fifth era for the recreation and lake-home years is a placeholder in the design and is not modelled.

Era table. Floor is the number of days after the previous era began by which the next era arrives no matter what. Needs are what the town must reach, all of them together, to move on early. All dates and technology are unverified until checked against local sources.
EraNameYearsSettlersProduced per player (bd ft)BusinessesRoadsFloor (days)Unlocks
0Homestead1900 to 1909––––0–
1Steam and rails1910 to 19193060,0002–14rail-freight
2Gas engines1920 to 1939–180,0004628garage-and-trucking
3Power saw and highway1940 to 1969–500,00051042chain-saw-dealer
updateEra(now):
while era < last:
next = ERAS.eras[era + 1]
met = every need of next is reached
dueAt = era.since + next.floorDays * 24 hours
if not met and now < dueAt: stop
era += 1
since = now if met
dueAt otherwise (it began on the floor date)

The next era begins when its needs are met, or when its floor passes, whichever comes first. One call can cross several eras, so a claim reopened after a long absence catches up. Needs are checked at the time of the call, so an era reached by needs is stamped with the moment the game noticed, not the exact moment the last need was met.

Needs are all required together. Settlers appear only in the first era: they arrive on a fixed clock (SETTLER_EVERY), so once the town has its 30 settlers (about 15 hours in) the count says nothing about what players did. The other needs are things players cause: lumber produced, businesses opened, roads built. The lumber need is per active player, so a town of five and a town of five hundred are measured by the same numbers.

The pacing this aims for, in real days for a shared town: the first change never arrives in the first two days, and a town that moves faster than the calendar reaches each era at roughly a fifth to a third of its floor. The floors count from the previous era, so the latest arrivals are day 14, day 42 and day 84. In the simulator, a town of foresters checking in every 4 or 8 hours reached era 1 around day 2.5 to 3, era 2 around day 8.5 and era 3 around day 28; a mixed town of foresters, a farmer, a miller, an entrepreneur and casual players reached era 1 on day 4 and era 2 on day 20; and a town where nobody opened a business never met that need and arrived at each floor. The simulated foresters are close to the best a player can be, so a real town is likely to arrive later. Balance findings has the runs behind these figures.

The prototype has one player and a simulated town, so most needs use stand-ins:

Need stand-ins in the prototype, and what a shared server would count.
NeedWhat the prototype readsWhat a shared server counts
settlerssettlers(now), the simulated town head count. It does not depend on the player.Settlers who have joined, with townsfolk households capped at half.
producedBdFtS.produced, the player's own output, taken per player.The town's lumber produced divided by the players active in the last 7 days.
businessesThe businesses the player has open.Every player's open businesses in the town.
roadsThe number of road tiles on the player's own claim. The landing tile counts as one.The town's graded road tiles.

The simulator replaces the stand-ins with sums over its field of bots (townTotals), so a run behaves like one shared town.

A new claim starts at era 0 at the moment it is filed. A save from before eras start at era 0 at the moment it first loads. The sandbox test tool “Advance era” sets the next era at once, and “Grow timber 12 hours” also moves the era start back 12 hours.

Every modifier is a multiplier on a rule that already exists. The accessor is eraMod(name, key): eraMod('skidLoss') is the current era’s value, and eraMod('speciesDemand', 'wp') is the value for one species code, 1 when the era does not list it.

Modifiers by era. 1 is the hand-tool baseline. Species demand is a map from species code to multiplier.
LeverEra 0Era 1Era 2Era 3
crewRest10.90.80.5
skidLoss10.80.60.5
haulShare10.70.550.45
tripTime10.70.50.35
sawWear110.90.5
ownMillRate11.151.31.5
cropYield111.151.4
cropPrice11.050.950.8
speciesDemand–l 1.15, wp 1.05wp 0.7, rc 1.1, l 1.1wp 0.5, df 1.1, l 0.9, lp 0.9
What each lever multiplies, and where.
LeverMeaning
crewRestMultiplies CREW_REST. Lower is faster work (power saws, more hands).
skidLossMultiplies the skidding loss fraction (animals, then donkey engines, then crawler tractors).
haulShareMultiplies each mill's haul share (steamboat, rail, then trucks).
tripTimeMultiplies each mill's wagon trip time.
sawWearMultiplies the sharpness lost per cut.
ownMillRateMultiplies the logs per hour of the player's own sawmill.
cropYieldMultiplies crop yield per harvest (draft horses, then tractors).
cropPriceMultiplies Mercantile base prices (mechanised farms depress prices).
speciesDemandMultiplies what mills bid for a species, on top of the mill's own specialty multiplier. This is where blister rust and shifting markets live.

Where each one is applied:

crewRest rest = CREW_REST * woodshed * boarding house * crewRest
skidLoss loss = min( 0.4, pathCost * 0.008 * skidLoss )
haulShare haul = mill.haul * haulShare (then the teamster stable, below)
tripTime trip = mill.trip * tripTime
sawWear sharpness -= (0.2 or 0.05) * sawWear per cut; 0.2 * sawWear per Reserve stand
ownMillRate logs/hour = level.cap * ownMillRate (the yard cap does not change)
cropYield units = max( 1, round( yield * cropYield * fertility ) )
cropPrice price = round( base * cropPrice * clamp( 1.45 - stock/cap, 0.45, 1.45 ) )
speciesDemand bid = max( 20, round( value * mill multiplier * speciesDemand * yardFactor ) )

A wagon already on the road when an era changes finishes by the new trip time. The load was priced at the old haul share when it left.

A business perk keeps working in later eras, but its benefit shrinks toward a floor.

strength(perk) = max( ERAS.fadeFloor, era.fades[perk] ) 1 when the era does not list the perk

fadeFloor is 0.3. A listed value is the fraction of the benefit that remains.

Remaining fraction of each perk's benefit, by era, before the floor is applied.
PerkEra 0Era 1Era 2Era 3
teamster-stable10.80.550.4
filing-shop110.850.6
teamster stable (Teamster stable):
haul multiplier = 1 - 0.5 * strength 0.5 at full strength, toward 1 as it fades
applies to the haul share on town mill sales and to the Mercantile freight cost (0.05 * multiplier)
filing shop (Filing shop):
fee = round( FILER_COST * (1 - strength) ) free at full strength, 150 * (1 - strength) otherwise

At era 3 the stable’s multiplier is 1 - 0.5 * 0.4 = 0.8, so the owner saves a fifth of the haul share instead of half. The filing shop charges 60 bd ft per filing instead of nothing. The business itself keeps earning its normal income. Only the owner’s own perk fades.

ERA_UNLOCKS names three businesses that the table says each era opens: rail freight (era 1), garage and trucking (era 2) and chain saw dealer (era 3). They are names only in this prototype. Nothing in the game reads them yet, and each needs a market entry of its own.

A line under the claim title shows the era name and years, a one-line description of its technology, and progress toward the next era: each need with a small bar, and the time left until the calendar floor. Reaching a new era shows a toast and writes a ledger entry.

The era should belong to the town, not to a player. In a shared game the server keeps one era record per town and advances it from the real town: settlers who have joined, lumber produced per active player, businesses open and roads that exist, plus the calendar floor. The prototype stand-ins (the player’s own output, businesses and roads) would be replaced by those. Because every modifier is a pure multiplier, players in the same town can hold different claims and still share one set of rules. The server should own the clock, because an era change moves every price and wait in the game at once. The modifiers in the table are still first guesses, and the fade values in particular decide whether the early trades stay worth owning. The needs and floors were tuned with the simulator on 2026-10-08.

Source: prototype/index.html · constants ERAS, ERA_UNLOCKS in rules.json · logic updateEra, eraNeeds, townTotals, eraAdvance, eraMod, perkStrength, stableHaulMult, filerFee, haulOf, tripOf, crewReady, skidLoss, bidFor, offer, harvest, mercPrice, updateOwn