Crew, cutting and saws
Work on the claim is rationed by crew-days. A cut turns a stand into logs at the landing, minus losses for skidding and for dull saws.
Constants
Section titled “Constants”| Constant | Value | Unit |
|---|---|---|
| CREW_MAX | 6 | crew-days held at once |
| CREW_REST | 20 | minutes before a used crew-day returns |
| RESTED.from | 3 | hours without crew work before the rested bonus starts |
| RESTED.full | 8 | hours away at which the rested bonus is complete |
| RESTED.cuts | 6 | cuts that carry the bonus |
| RESTED.bonus | 0.7 | extra yield at the full bonus (0.7 is +70 percent) |
| ROAD_SHARE | 0.9 | share of timber kept on a road parcel |
| FILER_COST | 150 | bd ft to hire the saw filer |
Crew-days
Section titled “Crew-days”The crew has six crew-days. Using a crew-day records a timestamp. A used crew-day returns when its rest time has passed. Six days at 20 minutes each is the same flow as the earlier three at 10 minutes (three crew-days every ten minutes), so a player working all day gets nothing extra. The difference is for a player who looks in every few hours: the bank holds six cuts instead of three.
rest = CREW_REST * (0.75 if a woodshed exists) * (0.75 if the boarding house is owned)crewUsed = timestamps in crewUsed with (now - timestamp) < restready = CREW_MAX - length(crewUsed)nextIn = rest - (now - oldest timestamp) (0 if none are used)With neither bonus, rest is 20 minutes. With both, it is 11.25 minutes. The rest time is applied when the list is read, so building a woodshed shortens the rest of crew-days already used.
These actions each use one crew-day: cutting a parcel (including clearing seedlings), filing the saws yourself, breaking ground for a field, harvesting a field, and buying a Forest Reserve stand. Planting, replanting, building, hauling and selling use none. In the sandbox test mode, ready is always 6 and no timestamps are recorded.
The cut
Section titled “The cut”A parcel can be cut when it has a stage (it is planted) and holds no building. The player may name a destination: the landing, or their own sawmill if they have one.
1. require ready crew-days >= 12. loss = skidLoss(parcel, destination) (see below)3. logs = round( stageLogs * (0.9 if the parcel has a road, else 1) * sawYield * (1 - loss) * restedMult ) (see "A rested crew")4. saw sharpness = max(0, sharpness - (0.20 if stageLogs > 0 else 0.05))5. record one crew-day, and the time of the work6. parcel: planted = null, cut += 1; claim: cleared += 17. deck[species] += logs (the landing deck, or the sawmill yard)The stage used in step 3 is the stage at the moment of the cut. The loss in step 2 is computed before the parcel is cleared, so the parcel itself is costed as standing timber. The species stays on the parcel record after a cut. It is replaced only by a replant.
A rested crew
Section titled “A rested crew”The bank alone lifts a casual forester by about 40 percent (it checks in with six cuts to spend instead of three), but the cuts still pay the same. The rested bonus adds to the cut itself. The game remembers the time of the last crew work: a cut, filing the saws yourself, breaking ground, harvesting, or buying a Reserve stand. Hauling, building and planting do not count, so opening the game to haul does not reset the clock.
away = now - time of the last crew workshare = clamp( (away - RESTED.from) / (RESTED.full - RESTED.from), 0, 1 ) 0 below 3 hours, 1 from 8 hourswhen away >= RESTED.from: the next RESTED.cuts cuts carry bonus = RESTED.bonus * shareyield of each of those cuts is multiplied by (1 + bonus)The first cut sets the bonus and the following five use it, even though each cut restarts the away clock. With the numbers above, a player who comes back after eight hours or more gets 70 percent more logs from each of the next six cuts. After five hours the bonus is 40 percent of that, 28 percent. After three hours or less there is none.
The ramp is deliberate. A first version paid the whole bonus at a fixed threshold, and the simulator showed a player who checked in exactly at the threshold doing better than one who checked in more often (a forester checking every 8 hours made 45,465 against 31,616 for one checking every 6). A straight ramp removes that cliff, and the check-in curve falls steadily from hourly to daily. The bonus starts at 3 hours rather than 2 because an active forester who pauses for two hours while stands ripen collected it too, a 2 percent gain in net worth.
The bonus applies to timber cuts only, and not to harvests, Reserve stands or the sawmill’s own output.
Skidding loss
Section titled “Skidding loss”Logs are skidded along the cheapest path from the parcel to the landing or to the sawmill. The path is found with Dijkstra’s algorithm over the 64 parcels, moving between the four edge neighbors.
stepCost(parcel) = road: 1 (2 if slope) otherwise: 2 if cleared ground, 3 if standing timber + 3 if slope
pathCost(from, to) = sum of stepCost of every parcel entered after "from", including the final parcelskidLoss = min(0.40, pathCost * 0.008)The cost of a step is the cost of the parcel being entered. Cleared ground includes meadow, fields and buildings, which all have no standing timber. Because a road makes a parcel cost 1 or 2 regardless of what stands on it, a chain of roads to the landing lowers the loss for every parcel that joins it. The cap of 40 percent is reached at a path cost of 50.
For the destination “sawmill”, the path is measured from the sawmill parcel instead of the landing. Moving the landing deck to the sawmill uses the same function with the landing as the starting parcel.
Sharpness s runs from 0 to 1 and starts at 1. If it has never been set it is 1.
sawYield = 0.7 + 0.3 * sA fully dull saw (s = 0) wastes 30 percent of every cut. Each cut of a stand with logs removes 0.20 of sharpness. Clearing seedlings removes 0.05. Buying a Reserve stand removes 0.20.
Sharpening is allowed only when s < 1, and it always sets s = 1. There are two ways:
file it yourself: uses one crew-day, costs no lumberhire the filer: costs FILER_COST bd ft, or 0 if the player owns a filing shopInputs, outputs and state
Section titled “Inputs, outputs and state”Inputs are a parcel, a destination, the current time, the crew timestamps, the saw sharpness and the road layout. The outputs are a changed parcel, a log count added to a deck, a lower sharpness, and one crew timestamp. The state is crewUsed (a list of at most three timestamps), saw (a number, or null meaning 1), cleared (a counter) and the per-parcel cut counter.
For the shared game
Section titled “For the shared game”Crew-days are a rate limit, so the server should hold the timestamps. A server should own the crew timestamps, the saw sharpness, the road layout and the skid calculation, and should reject a cut that the player’s crew cannot pay for. The path cost depends on neighbors’ state only through the player’s own parcels, so it can be computed per claim. Whether the crew is per player or per claim, and whether it should keep ticking when the player is away, is a design choice the prototype does not settle; it lets crew-days refill offline.
Source: prototype/index.html · constants CREW_MAX, CREW_REST, RESTED, ROAD_SHARE, FILER_COST, STAGES in rules.json · logic crewReady, useCrew, restedState, restedMult, cut, stepCost, pathFrom, skidLoss, sawYield, sharpen