40 — Property plots & player farming
Related: 37 — Economic map zones, 40b — Farming cultivation depth, 38 — Biomes & cultivate, 23 — Harvest, 13 — Workers, 10 — Economy & markets.
1. Summary
Players buy plots of land only inside property zones. A plot is a fraction of a zone’s footprint — not the whole crown parcel, and not arbitrary wilderness. Ownership is a unique property deed item. Holding the deed (or a granted farm permission) unlocks cultivate / plant / harvest on that land, and the owner receives a share of harvest tax collected on the plot.
Farming loop: own plot → till with a hoe → plant seeds with a dibber → crops grow through gfx stages → harvest like a resource node → replant. Cultivation depth (tools, zone timing, fallow, planting channels) is 40b.
Zone YAML remains the crown catalog of where land can be claimed. Whole-zone ownership is obsolete; fractional plots + deeds are the model.
2. Design principles
| Principle | Meaning |
|---|---|
| Property zones only | No purchase outside a property_zone |
| Fractional claims | Buy a sub-rect (cell grid) inside a zone; pay proportional purchase + upkeep |
| Deed = title | Unique deed item; store or trade it; cannot drop or destroy |
| Tax-aware pricing | Period cost scales with zone upkeep and local tax pressure |
| Own → act | Farm / tax share require ownership or grant; one player building per plot on the plot’s solid tilled rectangle (20 §18) |
| Harvest parity | Mature crops are harvestable like resource nodes (23) |
| Growth presentation | Crop sprites use stage modes (grow_10 … grow_100) |
| Layer multipliers | Growth speed = base × fertility × biome × weather |
3. What can be bought
World cell (x,y)
└─ inside property_zone Z? → claimable (if free)
└─ else → not for sale
- One property zone may host many plots owned by different players (and leftover crown remainder).
- Plots are axis-aligned cell rects on the claim grid (same meter grid as movement).
- Claims that overlap another plot, fall under
min_plot_area_m2, or exceed zonemax_area_m2are rejected.
3.1 Plot record (runtime)
PropertyPlot {
plot_id,
property_zone_id, // crown terms from zone YAML
deed_instance_id,
owner_character_id, // billed for upkeep (deed may be in storage)
rect: { x0, y0, x1, y1 },
purchased_at_day,
purchase_basis_copper,
upkeep_copper_per_day,
arrears_days,
farm_public,
public_tax_discount_bps,
farm_allow: [{ character_id, tax_discount_bps }],
}
Persisted in the worker world snapshot. Deeds carry plot geometry props so the server can restore after a bad reload; orphaned deeds are stripped on login.
4. Purchase price & period cost
Zone YAML defines crown terms (37):
| Zone field | Role |
|---|---|
crown_price_copper |
Base price for entire zone area |
upkeep_copper_per_day |
Base daily upkeep for entire zone |
upkeep_grace_days |
Grace before reclaim |
owner_tax_discount_bps |
Cap for owner / tenant tax discounts |
For a plot of area A inside zone of area Z:
area_frac = A / Z
tax_premium = 1 + (rate_bps / 10000) * tax_premium_weight
purchase = ceil(crown_price_copper * area_frac * tax_premium)
upkeep_day = max(1, ceil(upkeep_copper_per_day * area_frac * tax_premium)) # if zone upkeep > 0
tax_premium_weight comes from property_plots in server settings (e.g. 0.5). Use the highest overlapping tax zone’s rate_bps.
4.1 Buy / sell / reclaim
| Action | Behavior |
|---|---|
| Buy from crown | Claim mode on free cells; pick size; pay purchase; mint deed |
| Sell to crown | Owner sells at sellback_bps of that plot’s purchase basis; clears farm state; demolishes any player building and evicts storage / lodging / placed items |
| Player → player | Trade or store the deed (private transfer); building transfers intact; door lock re-minted for buyer; previous contents evicted |
| Upkeep | Each game day: charge upkeep_day from bank ledger first, then coins on person — including while offline |
| Reclaim | After upkeep_grace_days unpaid: plot returns to crown; deed voided; farm state cleared; building demolished like crown sell |
4.2 Tax share (owner benefit)
When harvest tax is paid on an owned plot cell:
owner_share = floor(tax_paid * owner_tax_share_bps / 10000)
Credited to the plot owner (LedgerCategory::TaxShare). Deed-holders get the full zone owner tax discount; public/allow-list farmers may get a partial discount capped by the zone.
5. Deed farm access
Deed-holders open Farm access on their plot (o in gfx while standing on it):
| Mode | Effect |
|---|---|
| Public farming | Anyone may cultivate / plant / harvest farm crops on the plot |
| Public tax discount | Walk-up farmers get this bps discount (capped by zone) |
| Allow-list | Named tenants with negotiated discounts; add nearby players; remove anytime |
Workers inherit their employer’s farm permission (owner or permitted tenant).
6. Farming overview
Own / permitted plot cells
→ Cultivate (hoe; timed; zone-tuned) → tilled cells
→ Plant seed (dibber; planting_ticks channel)
→ Grow (sprite stages; fertility / biome / weather)
→ Harvest at grow_100 (loot table; cell stays tilled)
→ Replant
Details: tools, fallow, zone knobs, Eli content → 40b.
When claim_must_be_in_growth_to_farm is true (starter config may enable this), cultivate / plant require a covering growth zone. Default in code is false — growth zones still boost fertility when present.
6.1 Worker farm routes
Ordered stops: cultivate_plot, plant_plot (with seed_template), harvest_plot. Soft-skip when tools/seeds are missing; harvest no-ops when nothing is mature.
7. Client / UX
| Surface | Behavior |
|---|---|
| Claim | Location panel k → Claim plot; size presets / nudge; purchase + daily upkeep preview |
| Deed | Inventory label Deed — Zone Label (N m²); ledger lists property assets |
| Farm | f till / plant / harvest; f×2 sell to crown; Farm access o |
| Build | On owned plot with a solid tilled rect and no building: start timed craft (wall/roof materials); footprint = tilled rect; door key → keychain |
| Interior | Owner splits rooms inside dotted exterior outline; copper charged on Confirm |
| Map | Owned plot outline; tilled tint; crop grow_* sprites; player building footprint |
| CLI / agent | BuyPlot / BuyPlotAllFree / SellPlotToCrown; Cultivate / PlantSeeds; StartPlotBuild / ConfirmInteriorEdit / SetDoorLocked |
8. Settings knobs
property_plots:
plant_slot_m2: 1.0
min_plot_area_m2: 4.0
tax_premium_weight: 0.5
owner_tax_share_bps: 2500
sellback_bps: 5000
claim_must_be_in_growth_to_farm: false # starter worlds may set true
cultivate_ticks: 600 # ~20s @ 30 Hz baseline
plot_building:
min_tilled_area_m2: 8.0
min_short_side_m: 2.0
min_long_side_m: 4.0
tick_per_m2: 120
base_ticks: 300
interior_edit:
base_copper: 50
per_room_copper: 25
per_door_copper: 10
min_room_m: 2.0
farming:
default_weather_mult: 1.0
wither_on_reclaim: true
default_fallow_revert_ticks: 1620000
9. Non-goals
- Buying land outside property zones
- Stock-market land speculation / auctions
- Full greenhouse / multi-story farms
- Multiple buildings per plot / wilderness player builds
- Replacing wild resource nodes (wild carrots stay 23)