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:
- Resolve
tax_zone_at(x, y). - Compute
bill = flat_copper + floor(harvest_value_copper * rate_bps / 10000). - Apply owner / tenant discount when the cell lies on a property plot (40).
- Deduct
min(bill, player_copper)— soft deduct. Ledger:LedgerCategory::Taxes. - Credit plot owner tax share from tax actually paid (
owner_tax_share_bps). - 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 }