Skip to content

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

Leaderboards

There are six boards, one per lane. A board lists the twelve simulated neighbors who have arrived, other real players whose scores are shared, and the player. Each board is ranked from highest to lowest.

The shared valley’s boards are built on the server, not by the page. They use the same six measures, with these differences:

Board Other players’ figure Your own row
Finest homestead the map’s age for every stand, rounded to 1,500 exact
Timber baron rounded to 6,200 exact
Merchant of the year rounded to 3,000 exact
Top sawyer rounded to 6,200 exact
Best forester the map’s figure (old growth is not counted, because the map cannot show it), not rounded, marked “about” exact, with old growth
Fair champion exact (a public contest score) exact

The era bar in the valley goes further: the town’s lumber produced is not shown at all, not even whether the goal has been reached, because an average that includes your own output lets you work out the others’ totals from any figure derived from it. The era change itself is announced. The other needs (settlers, businesses, roads) are exact counts.

All figures are made once per ten-minute tick, as of the tick boundary, so a change you make shows at the next tick (the first read after downtime, a rollback or an upgrade can make them from the claims as they are then, up to one tick early, once). Players are ranked on the figure others are shown (rounded where a step applies, the map’s figure for forest): equal figures share a rank (shown “=2”, with the number tied), and the order inside a shared rank is a shuffle that changes every tick and tells nothing about the exact figures. Your own rank comes from the figure others see for you, so your row shows that figure (“about 43,500”) with your exact one under it; they can differ a lot, because the shown figure leaves out old growth. Simulated settlers are listed apart and not ranked. A player who joins in the middle of a tick sees their own row at once, and is ranked for everyone else from the next tick.

Boards. Base and rate are the constants that grow simulated neighbors' scores.
BoardUnitYour score isBaseRate
Finest homesteadbd ft appraisedclaimValue()16,000700
Timber baronbd ft producedproduced01,100
Best foresterforest scoreforestScore()550.4
Top sawyerbd ft milledsawmill made (0 with no sawmill)01,500
Fair championcontest pointsbest axe score + best saw score00
Merchant of the yearbd ft earnedsum of business earned figures0400
land = parcels that are not meadow (61)
standing = land parcels with timber planted
old = standing parcels at 40 growth hours or more
forestScore = round( standing / land * 100 + old * 2 + replanted * 3 )

The score for a player is not capped. The cap of 160 below applies only to simulated neighbors.

The sum of earned across the player’s businesses. Each figure is net of cost of goods and upkeep and can be negative. Farm income is not included.

Neighbors. Style gives lane weights. Lanes not listed use a default weight. Arrives is the time after founding.
#NameLane weightsArrives
1Ingrid Halvorsentimber 1.3, forest 1.2founding
2Patrick Mulcahytimber 1.1, merchant 1.3founding
3Giuseppe Ferrarosawyer 1.4founding
4Anna Lindqvistforest 1.5founding
5Otto Brandthomestead 1.3, sawyer 1founding
6Mae Whitcombmerchant 1.5founding
7Silas Dunbartimber 1.5founding
8Rosa Delgadohomestead 1.4, forest 1founding
9Henrik Nybergsawyer 1.2, timber 1.140 min
10Clara Pettibonemerchant 1.2, homestead 1.280 min
11Thomas Ashbytimber 1, homestead 1120 min
12Lena Kowalskiforest 1.3, merchant 1160 min

Lane keys are timber (Timber baron), forest (Best forester), sawyer (Top sawyer), merchant (Merchant of the year) and homestead (Finest homestead). Neighbors 1 to 8 are present from founding. Neighbors 9 to 12 arrive 40, 80, 120 and 160 minutes after it.

hoursSinceArrival h = (now - arrival) / 3600000
w = style[board] if present, else 0.6
(0 for sawyer and merchant when not listed, so the neighbor has no row)
wobble = 0.85 + 0.3 * hash01(i, len(boardId))
forest board: min( 160, base * w * wobble + rate * h * w )
fair board: round( 330 + 520 * hash01(i, 99) ) a constant, no growth
all others: round( base * w * wobble + rate * w * wobble * h ^ 0.92 )

A neighbor with weight 0 has no score and no row on that board. Scores are deterministic for a given founding time.

rows = simulated neighbors who have arrived and have a score
+ other players' scores read from the shared "scores" table
+ you (your live local score)
sorted by score, highest first

The interface shows the top 8 rows and adds your row if you rank lower. Your own entry in the shared table is ignored, so you never appear twice.

A player’s scores are published after each save when their six numbers change: scores/{uid} = { scores: { homestead, timber, forest, sawyer, fair, merchant }, at }, each rounded. Rows from other players are labeled “player” and simulated ones “neighbor”. The header reads “Season 1” and shows the current town milestone; there is no season logic behind it.

Inputs are the player’s counters and claim, the clock, the founding time and the shared scores table. The output is a ranked list per board. The only stored state is the shared scores table and the player’s lastScoresKey for change detection, which is not saved.

In the shared game all six should be computed by the server from its own records of the player’s claim, production and contest results. The boards also mix two scales: neighbors’ scores grow without limit as time passes, so a player who stops playing falls down, while the fair board’s neighbors are fixed. Once there are enough real players the simulated neighbors can be retired. A season is a name only; a shared game that wants seasons needs a start and end, a reset rule and a record of past winners.

Source: prototype/index.html · constants BOARDS, NEIGHBORS, SETTLER_EVERY, SETTLER_START in rules.json · logic BOARDS, forestScore, neighborScore, neighborArrived, renderBoards, publishScores, watchScores