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.
Species
Section titled “Species”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.
| Code | Key | Species | Value (bd ft per log) | Growth g | Real hours to mature | Real hours to old growth |
|---|---|---|---|---|---|---|
| WP | wp | Western white pine | 135 | 0.85 | 23.5 | 47.1 |
| RC | rc | Western redcedar | 120 | 0.7 | 28.6 | 57.1 |
| L | l | Western larch | 105 | 1.15 | 17.4 | 34.8 |
| DF | df | Douglas-fir | 100 | 1 | 20 | 40 |
| PP | pp | Ponderosa pine | 92 | 0.9 | 22.2 | 44.4 |
| GF | gf | Grand fir | 72 | 1.05 | 19 | 38.1 |
| WH | wh | Western hemlock | 68 | 0.95 | 21.1 | 42.1 |
| LP | lp | Lodgepole pine | 62 | 1.4 | 14.3 | 28.6 |
| CW | cw | Black cottonwood | 48 | 1.5 | 13.3 | 26.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.
Growth stages
Section titled “Growth stages”Age is measured in growth hours:
ageGrowthHours(parcel, now) = (now - planted) / 3600000 * g(species)stage = the last entry of STAGES whose "from" <= ageGrowthHours| Stage | From (growth hours) | Logs per cut |
|---|---|---|
| Seedlings | 0 | 0 |
| Saplings | 3 | 2 |
| Pole timber | 9 | 6 |
| Mature timber | 20 | 12 |
| Old growth | 40 | 16 |
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.
Replanting
Section titled “Replanting”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_COSTrequires lumber >= replantCoston success: lumber -= replantCost planted = now species = chosen species replanted += 1 (a counter, see the deed page)| Constant | Value |
|---|---|
| REPLANT_COST (bd ft) | 100 |
Replanting does not use a crew-day. The new stand starts at age zero, as seedlings.
Seedlings
Section titled “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, outputs and state
Section titled “Inputs, outputs and state”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.
For the shared game
Section titled “For the shared game”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