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.
The eras
Section titled “The eras”| Era | Name | Years | Settlers | Produced per player (bd ft) | Businesses | Roads | Floor (days) | Unlocks |
|---|---|---|---|---|---|---|---|---|
| 0 | Homestead | 1900 to 1909 | – | – | – | – | 0 | – |
| 1 | Steam and rails | 1910 to 1919 | 30 | 60,000 | 2 | – | 14 | rail-freight |
| 2 | Gas engines | 1920 to 1939 | – | 180,000 | 4 | 6 | 28 | garage-and-trucking |
| 3 | Power saw and highway | 1940 to 1969 | – | 500,000 | 5 | 10 | 42 | chain-saw-dealer |
What moves the clock
Section titled “What moves the clock”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 | What the prototype reads | What a shared server counts |
|---|---|---|
| settlers | settlers(now), the simulated town head count. It does not depend on the player. | Settlers who have joined, with townsfolk households capped at half. |
| producedBdFt | S.produced, the player's own output, taken per player. | The town's lumber produced divided by the players active in the last 7 days. |
| businesses | The businesses the player has open. | Every player's open businesses in the town. |
| roads | The 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.
The levers
Section titled “The levers”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.
| Lever | Era 0 | Era 1 | Era 2 | Era 3 |
|---|---|---|---|---|
| crewRest | 1 | 0.9 | 0.8 | 0.5 |
| skidLoss | 1 | 0.8 | 0.6 | 0.5 |
| haulShare | 1 | 0.7 | 0.55 | 0.45 |
| tripTime | 1 | 0.7 | 0.5 | 0.35 |
| sawWear | 1 | 1 | 0.9 | 0.5 |
| ownMillRate | 1 | 1.15 | 1.3 | 1.5 |
| cropYield | 1 | 1 | 1.15 | 1.4 |
| cropPrice | 1 | 1.05 | 0.95 | 0.8 |
| speciesDemand | – | l 1.15, wp 1.05 | wp 0.7, rc 1.1, l 1.1 | wp 0.5, df 1.1, l 0.9, lp 0.9 |
| Lever | Meaning |
|---|---|
| crewRest | Multiplies CREW_REST. Lower is faster work (power saws, more hands). |
| skidLoss | Multiplies the skidding loss fraction (animals, then donkey engines, then crawler tractors). |
| haulShare | Multiplies each mill's haul share (steamboat, rail, then trucks). |
| tripTime | Multiplies each mill's wagon trip time. |
| sawWear | Multiplies the sharpness lost per cut. |
| ownMillRate | Multiplies the logs per hour of the player's own sawmill. |
| cropYield | Multiplies crop yield per harvest (draft horses, then tractors). |
| cropPrice | Multiplies Mercantile base prices (mechanised farms depress prices). |
| speciesDemand | Multiplies 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 * crewRestskidLoss loss = min( 0.4, pathCost * 0.008 * skidLoss )haulShare haul = mill.haul * haulShare (then the teamster stable, below)tripTime trip = mill.trip * tripTimesawWear sharpness -= (0.2 or 0.05) * sawWear per cut; 0.2 * sawWear per Reserve standownMillRate 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.
Old trades fade, never vanish
Section titled “Old trades fade, never vanish”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 perkfadeFloor is 0.3. A listed value is the fraction of the benefit that remains.
| Perk | Era 0 | Era 1 | Era 2 | Era 3 |
|---|---|---|---|---|
| teamster-stable | 1 | 0.8 | 0.55 | 0.4 |
| filing-shop | 1 | 1 | 0.85 | 0.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) otherwiseAt 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.
Unlocks
Section titled “Unlocks”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.
What the player sees
Section titled “What the player sees”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.
For the shared game
Section titled “For the shared game”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