For each block, generate a set of "lots". Each lot will eventually contain a single building (compliant with zoning for that block).
GreenSpace v1: A block has a percentage chance to be "skipped" for zoning. Dead blocks will have nothing built on them, and will become greenspace.
Lot sizes are affected by population density as a linear-asymptotic function bound by a parametric min/max. (ie: Lots can’t be zero-sized, nor can they be infinitely large).
Each Lot has it’s own seed / id, based on a hash of the citySeed and the lot’s (x,y) "origin" coordinates . Origin coordinates are the x/y centroid for the lot polygon. This PRNG seed will be used in all "randomness" calculations for the lot (e.g.: zoning, building generation, green space, etc.). We use a per-lot seed to allow for domain-specific deterministic behavior, even when applied across parallel processing mechanisms. In this way, the deterministic behavior of a given lot is not affected by the order, thread, or time in which it is processed.
Lots are zoned for Industrial, Commercial, or Residential use, and marked for density according to population map. This affects the types of buildings that will be created later.
Every lot in the city is submitted to the Zoning Board for valuation .
Lots are excluded from the zoning process by a system of filters (e.g.: Lots with no road access, lots that are under water, lots that are allocated "greenspace", etc)
The Zoning Board consists of three parametric Zoning Agents (Residential, Commercial, Industrial), who will bid to determine how the lot should be zoned.
Before bidding begins, the City is given the opportunity to exclude particular zoning agents from the Board on a lot-by-lot basis, based on City Rules (e.g. no industrial downtown, too large a contiguous commercial zone with no residential, etc). Recused agents are not permitted to submit a valuation.
Agents may choose not to bid at all (stochastically).
After exclusion, Bids are solicited from each remaining Agent.
Each remaining Agent bids on the Lot according to their valuation function. Valuation functions take into account things like:
Local road density
Proximity to other lots of the same or complementary types.
Proximity to Greenspace or "Specials".
Proximity to water
Elevation above the average city height.
Population Density
Number of lots of the same type overall (ie: to not end up with a purely residential city with no jobs or industry or food).
Agents may choose not to bid, even when the lot has value according to the valuation function. They effectively submit a bid of zero value.
The highest bid determines the zoning for the lot. In the case of a tie, the lot is left un-zoned.
Once the Zoning is determined for a lot, the winning bid is attached to the lot as a "property value" attribute.
Since existing zoning can affect valuations (e.g.: proximity to the mall), the zoning process must be iterated multiple times to arrive at a "semi-stable" zoning model.
Once all lots have passed the Zoning Board, the process begins again with a new "Zoning Round".
A "Zoning Round" is "terminal" if, during the round, fewer than [P1]% of lots changed zones, OR there have been more than [P2] Zoning Rounds.
For each lot, zoning determines:
The type of lot (Commercial, Residential, Industrial)
The Maximum height of buildings for that lot
The Building geometry that will be used for construction on the lot.
The seed for the lot.
Once Zoning is completed, the user has the opportunity to "tweak" the zoning manually, prior to construction.
Modifying Terrain Map, Population Map, or Roads will erase all zoning and lots. Lots can not be reconstructed until Roads are in place.
P1: Automatic mode only.
Modifying Terrain Map, Population Map, or Roads will erase all zoning and lots. Lots can not be reconstructed until Roads are in place.