Skip to content

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

Timber and growth

Standing timber is the only renewable resource on the claim. Each timbered parcel holds one species and one planting timestamp. Its stage is computed from the age, never stored.

value is the number of bd ft of lumber one log fetches at an ordinary bid. g is the growth factor. The last two columns are derived: real hours from planting to the mature and old-growth stages, which are 20 / g and 40 / g.

Species. Rows are in the order of the SPECIES constant.
CodeKeySpeciesValue (bd ft per log)Growth gReal hours to matureReal hours to old growth
WPwpWestern white pine1350.8523.547.1
RCrcWestern redcedar1200.728.657.1
LlWestern larch1051.1517.434.8
DFdfDouglas-fir10012040
PPppPonderosa pine920.922.244.4
GFgfGrand fir721.051938.1
WHwhWestern hemlock680.9521.142.1
LPlpLodgepole pine621.414.328.6
CWcwBlack cottonwood481.513.326.7

A parcel whose species field is empty is treated as Douglas-fir. This only happens for claims saved before species existed, and the migration step fills the field in.

Age is measured in growth hours:

ageGrowthHours(parcel, now) = (now - planted) / 3600000 * g(species)
stage = the last entry of STAGES whose "from" <= ageGrowthHours
Stages. From is in growth hours. Logs is the log count of one cut before any loss.
StageFrom (growth hours)Logs per cut
Seedlings00
Saplings32
Pole timber96
Mature timber2012
Old growth4016

A parcel with planted = null has no stage. It is cleared ground. Timber on cleared ground does not return by itself. The only way to restore it is to replant.

The time until the next stage, in real hours, is:

realHoursToNext = (nextStage.from - ageGrowthHours) / g(species)

Old growth is the last stage; it never advances. The map draws a star on a parcel at 40 growth hours or more.

A player can replant a parcel that is cleared, has no building, is not meadow and has no field. The species must be in the replant list of the parcel’s zone (see map and terrain).

replantCost = 0 if the player owns a tree nursery, otherwise REPLANT_COST
requires lumber >= replantCost
on success:
lumber -= replantCost
planted = now
species = chosen species
replanted += 1 (a counter, see the deed page)
Replanting constants.
ConstantValue
REPLANT_COST (bd ft)100

Replanting does not use a crew-day. The new stand starts at age zero, as seedlings.

Seedlings have no logs. They can be cleared to free the ground, which uses a crew-day and dulls the saws by 5 percent (see crew, cutting and saws). They count as standing timber in forest cover and in the appraisal (with zero logs, so they add no value).

Inputs are the planting time, the species and the current time. The output is a stage, a log count and a time to the next stage. The state is two fields per parcel: planted (a millisecond timestamp or null) and sp. A parcel’s cut field counts how many times it has been cut. It is never read.

Growth is a pure function of a timestamp, so it needs no tick. A server stores planted and species per parcel and derives the stage on read. What the server must own is the timestamp itself: the prototype uses the client clock. A server should stamp planted from its own clock. It also has to decide whether cleared land can regrow without a replant, because the prototype has no natural regeneration on a player’s claim, while the Forest Reserve regrows on its own.

Source: prototype/index.html · constants SPECIES, STAGES, REPLANT_COST in rules.json · logic ageH, stageOf, nextStage, replant, pickSpecies