Home Economic Map Zones

Economic Map Zones

Tax, property, and growth are segment overlays — axis-aligned zones on the same map layout as terrain and resources. They are not biomes and not terrain surface tiles. Biomes, adjacency, and cultivation live in 38 — Biomes, adjacency & terrain transitions.

Related: 10 — Economy & markets, 40 — Property plots & farming, 40b — Cultivation depth, 23 — Harvest, 08 — Inventory & storage, 21 — World content schemas.


1. Summary

Designers draw three overlay kinds in content-admin World → Map layout:

Overlay Purpose
Tax zones Copper sink on successful harvest; market-hall sales tax fields
Property zones Crown catalog of claimable land (price, upkeep, grace, tax discount)
Growth zones Fertility for wild respawn + farm growth; till/plant soil knobs

Layers stay independent: a cell can sit in temperate biome + taxed crown land + fertile growth at once. Sampling uses highest z_order wins within each overlay family (tie-break: later in the YAML list).

Land ownership is fractional property plots + deeds (40) — not whole-zone buy. Property zone YAML is the crown terms and footprint where plots may be claimed.


2. Design principles

Principle Meaning
Overlays, not tiles Econ rules query (x,y) at harvest / buy / respawn / cultivate
Web Map first Place, select, drag, delete, and property panels ship in content-admin Map layout
Soft tax Broke players still complete harvest; tax deducts what they can pay
Growth ≠ biome Fertility and crop tags are economic/farming rules; climate is a biome layer
Farm soil knobs Growth zones tune cultivate duration, stamina, and fallow (40b)
Weather as multiplier Respawn / growth use weather_mult (default 1.0)

3. Shared zone shape

Same rect model as terrain (21):

tax_zones:
  - id: mill-road-tax
    z_order: 0
    rects:
      - { x0: 120, y0: 130, x1: 160, y1: 150 }

Legacy single-rect x0/y0/x1/y1 on the zone may load; prefer rects:.

Overlap: highest z_order among zones of the same overlay family. Different families stack independently.


4. Tax zones

4.1 Fields

Field Type Meaning
id string Stable id
rects list Coverage
z_order int Stack within tax overlays
rate_bps int Tax in basis points of harvest copper value (e.g. 500 = 5%)
flat_copper int Optional flat copper added to the tax bill (default 0)
market_sales_tax_bps int Basis points of market-hall sale total sunk to crown (default 0)
market_sales_flat_copper int Optional flat copper per market-hall purchase (default 0)
label string? Designer / UI label

Market hall sales use market_sales_* on the tax zone covering the listing hall (not harvest rate_bps). Tax is sunk from seller proceeds; buyer pays the listed line total (10).

4.2 Harvest tax runtime

On harvest complete:

  1. Resolve tax_zone_at(x, y).
  2. Compute bill = flat_copper + floor(harvest_value_copper * rate_bps / 10000).
  3. Apply owner / tenant discount when the cell lies on a property plot (40).
  4. Deduct min(bill, player_copper)soft deduct. Ledger: LedgerCategory::Taxes.
  5. Credit plot owner tax share from tax actually paid (owner_tax_share_bps).
  6. Never cancel the harvest for insufficient funds.

Workers harvesting for an employer: tax follows employer / acting-character policy (default: character that receives the items).


5. Property zones

5.1 Fields

Field Type Meaning
id string Zone id
rects list Claimable footprint
z_order int Stack within property overlays
crown_price_copper int Base price for entire zone area (pro-rated per plot)
max_area_m2 float? Optional cap on a single claim
upkeep_copper_per_day int Base daily upkeep for entire zone (pro-rated)
upkeep_grace_days int Days unpaid before reclaim
owner_tax_discount_bps int Cap for owner / tenant harvest tax discounts
label string? UI label

Runtime plots + deeds live in worker persistence. Segment YAML is geometry + crown terms only.

5.2 Player ownership

Players claim fractional plots inside the zone (40): buy, deed, upkeep (bank-first, including offline), sellback, reclaim. Farm access and tax share are plot-scoped.


6. Growth zones

6.1 Fields

Field Type Meaning
id string Zone id
rects list Coverage
z_order int Stack within growth overlays
fertility float >= 1.0 shortens wild plant respawn and speeds farm crop growth
crop_tags string[] Tags that receive fertility bonus; empty = all plant nodes in zone
cultivate_ticks u32? Till channel duration in this zone; unset → server default
cultivate_stamina_mult float Multiplies cultivate stamina (default 1.0)
fallow_revert_ticks u32? Empty tilled revert; unset → farming.default_fallow_revert_ticks
allowed_kinds string[] Terrain kinds allowed for farm tiles / cultivate gates
allowed_biomes string[] Biome ids for farming rules
label string? UI label

6.2 Wild respawn formula

At harvest-complete when entering cooldown:

base = node.respawn_ticks
zone = growth_zone_at(node.x, node.y)
if zone matches node (crop_tags empty OR intersection with node/item tags):
  effective = base / fertility * weather_mult
else:
  effective = base * weather_mult_outside
until_tick = tick + max(1, ceil(effective))

weather_mult defaults to 1.0 until regional weather exists.

6.3 Farm till / fallow

Cultivate and fallow sample the same covering growth zone (40b). Fertility still speeds growth, not till duration.


7. Sampling helpers

  • tax_zone_at(segment, x, y)
  • property_zone_at(...) / property_zones_covering(...)
  • growth_zone_at(...) / farm-zone tuning helpers

Mirror terrain_zone_at overlap rules within each family.


8. Content-admin Map layout

Capability Detail
Draw Brush or rect tool for tax / property / growth
Select / drag / delete Same patterns as terrain and nodes
Property panel Kind-specific fields above (including growth cultivate / fallow)
Labels Prefer zone label; id secondary
Validate Overlap warnings; property area vs max_area_m2; unknown crop tags
Save PUT map-layout → segment YAML

Native flatland-editor may visualize overlays; web Map layout is primary for large-scale placement.


9. Settings knobs

economy_zones:
  tax_soft_deduct: true
  default_owner_tax_discount_bps: 0
  property_sellback_bps: 5000
  growth_fertility_min: 1.0
  growth_fertility_max: 3.0
  weather_mult_default: 1.0

property_plots:   # see plan 40
  tax_premium_weight: 0.5
  owner_tax_share_bps: 2500
  cultivate_ticks: 600

farming:          # see plan 40b
  wither_on_reclaim: true
  default_fallow_revert_ticks: 1620000

10. Example (starter-plains sketch)

tax_zones:
  - id: plains-crossroads-tax
    z_order: 0
    rate_bps: 400
    market_sales_tax_bps: 250
    rects:
      - { x0: 118, y0: 128, x1: 155, y1: 148 }

property_zones:
  - id: crown-plot-a
    z_order: 0
    crown_price_copper: 5000
    upkeep_copper_per_day: 25
    upkeep_grace_days: 3
    owner_tax_discount_bps: 2500
    rects:
      - { x0: 130, y0: 135, x1: 145, y1: 145 }

growth_zones:
  - id: mill-fields
    z_order: 0
    fertility: 1.4
    crop_tags: [carrot, potato, vegetable]
    cultivate_ticks: 450
    cultivate_stamina_mult: 1.0
    fallow_revert_ticks: 1620000
    allowed_kinds: [grass, tilled]
    allowed_biomes: [temperate_plains]
    rects:
      - { x0: 125, y0: 120, x1: 150, y1: 135 }

11. Non-goals

  • Biome climate, adjacency, procedural fill → 38
  • Market hall list/buy UX detail → 10
  • Deed / farm access / plot claim UX → 40
  • Bank chests keyed to parcels (future housing hook)