Home Property Plots & Player Farming

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_10grow_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 zone max_area_m2 are 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)