On this page
  1. Related
  2. Mechanics
  3. References
  4. Sources

SimCity came out in 19891. In 2008 Electronic Arts released its engine under the GPL as Micropolis2, and every claim here reads that Micropolis release: the C simulator of Don Hopkins’s Unix port. Comments mark the changes made after the original release, so where a claim rests on one it says so, and the 1989 versions may differ there.

The simulation runs in a 16-step cycle3. Every second cycle, three demand valves move by how far each zone type’s projected population runs ahead of its current one, plus a tax term that is positive below 7% and negative above it4. Each zone scores its valve plus a local term and rolls against the score to grow or decline5. Residential zones read land value; commercial zones read only their distance from the city center; industrial zones read neither6.

Trips stop at the first dead end. The search’s back-up step drops a saved position without moving back, so a trip that meets a dead end before a destination fails7.

Mechanics

MechanicKindHow
Simulation ticka 16-step cycle: one step for the clock and demand, eight for the map, one for census and tax, one for traffic decay, and five for the overlay maps and disasters
Demand meterthree valves pushed each second cycle by projected over current population, plus a tax term from +200 to −600
Zoninga zone's score is its valve plus land value (residential) or nearness to the center (commercial), and growth is a roll against it
Land value2×2 blocks valued by nearness to the center, terrain, pollution, and crime; police and fire coverage in 8×8 blocks
Traffic simulationeach zone's trip walks up to 30 road tiles to a destination type, adding 50 to traffic on the way
Disastersa roll each cycle, 1 in 481 to 1 in 61 by level, then one of six disasters
Every claim about this game, by concept (25)
generalAsked how he got from Raid on Bungeling Bay's world editor to SimCity, Will Wright said it began as a toy: he kept making his editor more elaborate, and thought it would be cool to have the world come to life.Interview
SimCity came out in 1989.Wikidata
Electronic Arts released the SimCity engine under the GPL, version 3 or later, as Micropolis, on 10 January 2008.Wikidata
Demand meterEvery second cycle, SetValves projects each zone type's population. Residential: the current figure (ResPop / 8) plus migration, that figure times (jobs per resident − 1), where jobs are the commercial and industrial populations at the previous census, plus 2% births. Commercial: (residential + commercial + industrial) / 3.7, times the labor base, residents per job at the previous census, held to 0–1.3. Industrial: the industrial population times the labor base times 1.2, 1.1, or 0.98 at game levels 0, 1, and 2 (starting funds $20,000, $10,000, $5,000), and at least 5. Each projection over the current population, capped at 2, is the type's ratio.Code
Each ratio becomes a step: (ratio − 1) × 600 plus TaxTable[tax rate + game level] (index capped at 20), which at game level 0 runs from +200 at 0% through 0 at 7% to −600 at 20%; each higher level shifts the index up one. The step is added to the type's valve, which is held to ±2000 for residential and ±1500 for commercial and industrial.Code
A valve is held at zero or below while the city lacks a building it needs: residential once the raw residential count (ResPop, eight times the figure the demand projection uses) passes 500 with no stadium, industrial past 70 with no seaport, and commercial past 100 with no airport. The check runs once every 64 clock ticks, one type at a time.Code
DisastersOnce per cycle, unless disasters are switched off (a switch added after the original release), a random disaster strikes with chance 1 in 481, 241, or 61 at game levels 0, 1, and 2. It is a fire or a flood with 2 chances in 9 each, a plane crash, tornado, or earthquake with 1 in 9 each, and with the last 2 in 9 a monster, but only if average pollution is above 60.Code
Each nuclear plant, on each cycle's visit and unless disasters are off, melts down with chance 1 in 30,001, 20,001, or 10,001 at game levels 0, 1, and 2.Code
Land valueA zone's new building takes one of four value classes from its block's land value minus pollution: below 30, below 80, below 150, and 150 or more.Code
Over the 120×100-tile city, the simulation keeps population density, traffic, pollution, land value, and crime in 2×2-tile blocks (60×50), terrain in 4×4 blocks (30×25), and fire coverage, police coverage, commercial location, and growth rate in 8×8 blocks (15×13).Code
A 2×2 block holding any developed tile (a road or anything numbered above it) gets land value 4 × (34 − its distance from the city center, capped at 32), plus its 4×4 block's terrain value, minus its pollution, minus 20 more where its crime is above 190, held to 1–250. A block with nothing developed gets 0.Code
A 2×2 block's pollution sums its tiles, held to 255, then is smoothed: heavy-traffic road 75, light-traffic road 50, fire 90, radiation 255, built industrial tiles 50, and seaport, airport, and coal plant tiles 100. Houses, commercial buildings, and the nuclear plant add nothing.Code
Crime in a 2×2 block with land value is 128 − land value + population density, held to 300, minus its 8×8 block's police coverage, held to 0–250; a block without land value has none.Code
Each police station adds the police funding effect, 1000 × spending / requested funds (1000 when nothing is requested), to its 8×8 block, halved if unpowered and, by a change after the original release, halved again if no road touches it. Fire stations fill the fire coverage map the same way. Each map is then smoothed three times, every pass setting a block to half its value plus an eighth of its four neighbours' sum.Code
Simulation tickSimFrame runs one step of the simulation on every call at speed 3, on every third call at speed 2, and on every fifth call at speed 1; at speed 0 (paused) it runs none.Code
The simulation runs as a 16-step cycle, one phase per step (Fcycle & 15). Phase 0 advances the city clock and, every second cycle, recomputes the demand valves; phases 1 to 8 each process one eighth of the 120 map columns; phase 9 takes the census every 4 clock ticks and collects tax every 48; phase 10 decays traffic; phases 11 to 14 rebuild the power, pollution and land value, crime, and population density maps; phase 15 rebuilds fire coverage and rolls for disasters.Code
The map rebuilds in phases 11 to 15 skip cycles at higher speeds. At speed 1, power and pollution run every second cycle and crime, population density, and fire coverage every cycle; at speed 2, every 4th, 7th, 8th, 9th, and 10th cycle; at speed 3, every 5th, 17th, 18th, 19th, and 20th. The disaster roll in phase 15 runs every cycle.Code
The city clock advances once per 16-step cycle, and the date shown divides it by 4 for the month and by 48 for the year, so a month is 64 steps.Code
Traffic simulationWhen the simulation visits a zone, a residential zone tries a trip if its population exceeds a random 0–35, a commercial or industrial zone if its population exceeds a random 0–5. If none of the 12 tiles bordering its 3×3 footprint (corners excluded) is a road or rail tile, the trip fails at once and the zone declines.Code
From the road found beside the zone, TryDrive walks up to 30 steps (MAXDIS), each step trying the four directions in turn from a random one and never straight back. The trip succeeds once the current tile borders a destination: tiles 423–816 (commercial zones through the nuclear plant) for a residential trip, 249–698 (houses through the seaport) for a commercial one, and 249–423 (houses to the first commercial tile) for an industrial one.Code
At a dead end TryDrive drops its last saved position and adds 3 to the step count, but it doesn't move back: the next try starts from the same tile, still barred from the way it came, so it fails again until the steps or the saved positions run out, and the trip fails.Code
A successful trip adds 50 to the traffic density of the 2×2 block under every second road tile on its path (rail tiles aren't counted). A sum above 240 is set to 240 one time in six, which also sends the helicopter there; otherwise it's stored in a byte, so a sum above 255 wraps around to 0–49. Each cycle, density above 200 falls by 34, density from 25 to 200 by 24, and density of 24 or less drops to 0.Code
ZoningOne visit in eight (every visit, for an empty residential zone), a zone takes a score: its type's valve plus a local term. The residential term is (land value − pollution) × 32, held to 0–6000, minus 3000; the commercial term is its 8×8 block's ComRate, 64 minus 4 × the block's distance from the city center, so from 64 down to −64; the industrial term is 0. An unpowered zone scores −500 whatever its valve.Code
A zone grows if its score is above −350 and (score − 26380) exceeds a random signed 16-bit number; failing that, it declines if its score is below 350 and (score + 26380) is under a second one. The numbers are uniform over −32768 to 32767, so growth comes with chance (score + 6388) / 65536 per evaluation, about 10% at a score of 0 and 17% at a residential zone's highest, 5000. An unpowered zone declines with chance 6887 / 65536, about 10.5%. A commercial zone whose trip failed can't grow; one that made no trip can.Code
Growth adds one level at a time and stops at each type's top: a residential zone below 40 population (levels 16, 24, 32, 40), commercial below 5, industrial below 4. A residential zone doesn't grow where its block's pollution is above 128, and a commercial zone grows only while its population is at most its block's land value / 32, so it can reach one level past that figure. An empty residential zone builds single houses until it has 8, then fills in at level 16 only where population density is above 64.Code

References

  1. ^SimCity came out in 1989.WikidataWikidata
    How we know
    +1989-10-03T00:00:00Z
    Q7798922, publication date (P577) · archived copy ↗

    The quote matches our archived copy.

    Checked by a second AI model, 2026-10-21.

    In the claim ledger

  2. ^Electronic Arts released the SimCity engine under the GPL, version 3 or later, as Micropolis, on 10 January 2008.WikidataWikidata · Micropolis (SimHacker/micropolis)
    How we know
    +2008-01-10T00:00:00Z
    Q2719130, publication date (P577) · archived copy ↗
    Per Child program. Copyright (C) 1989 - 2007 Electronic Arts Inc.
    micropolis-activity/README#L37-L44 · upstream ↗

    The quote matches our archived copy.

    Checked by a second AI model, 2026-10-21.

    In the claim ledger

  3. ^The simulation runs as a 16-step cycle, one phase per step (Fcycle & 15). Phase 0 advances the city clock and, every second cycle, recomputes the demand valves; phases 1 to 8 each process one eighth of the 120 map columns; phase 9 takes the census every 4 clock ticks and collects tax every 48; phase 10 decays traffic; phases 11 to 14 rebuild the power, pollution and land value, crime, and population density maps; phase 15 rebuilds fire coverage and rolls for disasters.CodeMicropolis (SimHacker/micropolis)
    How we know
    108  Simulate(Fcycle & 15);
    
    micropolis-activity/src/sim/s_sim.c line 108 at c98f6b0 · upstream ↗
    134      if (!(Scycle & 1)) SetValves();
    
    micropolis-activity/src/sim/s_sim.c lines 126–138 at c98f6b0 · upstream ↗
    165      if (!(CityTime % TAXFREQ))  {
    
    micropolis-activity/src/sim/s_sim.c lines 158–172 at c98f6b0 · upstream ↗
    200      DoDisasters();	
    
    micropolis-activity/src/sim/s_sim.c lines 182–201 at c98f6b0 · upstream ↗
    156#define SimWidth	120
    
    micropolis-activity/src/sim/headers/sim.h lines 156–157 at c98f6b0 · upstream ↗
    223#define TAXFREQ 48
    
    micropolis-activity/src/sim/headers/sim.h lines 222–223 at c98f6b0 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-21.

    Checked by a second AI model, 2026-10-21.

    In the claim ledger

  4. ^Each ratio becomes a step: (ratio − 1) × 600 plus TaxTable[tax rate + game level] (index capped at 20), which at game level 0 runs from +200 at 0% through 0 at 7% to −600 at 20%; each higher level shifts the index up one. The step is added to the type's valve, which is held to ±2000 for residential and ±1500 for commercial and industrial.CodeMicropolis (SimHacker/micropolis)revised
    How we know
    417    200, 150, 120, 100, 80, 50, 30, 0, -10, -40, -100,
    
    micropolis-activity/src/sim/s_sim.c lines 416–418 at c98f6b0 · upstream ↗
    492  Rratio = ((Rratio -1) * 600) + TaxTable[z]; /* global tax/Glevel effects */
    
    micropolis-activity/src/sim/s_sim.c lines 490–494 at c98f6b0 · upstream ↗
    509  if (RValve >  2000) RValve =  2000;
    
    micropolis-activity/src/sim/s_sim.c lines 496–514 at c98f6b0 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-21.

    Revised after a check by a second AI model, 2026-10-21.

    In the claim ledger

  5. ^A zone grows if its score is above −350 and (score − 26380) exceeds a random signed 16-bit number; failing that, it declines if its score is below 350 and (score + 26380) is under a second one. The numbers are uniform over −32768 to 32767, so growth comes with chance (score + 6388) / 65536 per evaluation, about 10% at a score of 0 and 17% at a residential zone's highest, 5000. An unpowered zone declines with chance 6887 / 65536, about 10.5%. A commercial zone whose trip failed can't grow; one that made no trip can.CodeMicropolis (SimHacker/micropolis)
    How we know
    254	(((short)(zscore - 26380)) > ((short)Rand16Signed()))) {
    
    micropolis-activity/src/sim/s_zone.c lines 253–264 at c98f6b0 · upstream ↗
    214    if (TrfGood &&
    
    micropolis-activity/src/sim/s_zone.c lines 214–222 at c98f6b0 · upstream ↗
    1221    i = 32767 - i;
    
    micropolis-activity/src/sim/s_sim.c lines 1216–1223 at c98f6b0 · upstream ↗
    47	return ((next % ((SIM_RAND_MAX + 1) <<8)) >>8);
    
    micropolis-activity/src/sim/rand.c lines 44–48 at c98f6b0 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-21.

    Checked by a second AI model, 2026-10-21.

    In the claim ledger

  6. ^One visit in eight (every visit, for an empty residential zone), a zone takes a score: its type's valve plus a local term. The residential term is (land value − pollution) × 32, held to 0–6000, minus 3000; the commercial term is its 8×8 block's ComRate, 64 minus 4 × the block's distance from the city center, so from 64 down to −64; the industrial term is 0. An unpowered zone scores −500 whatever its valve.CodeMicropolis (SimHacker/micropolis)
    How we know
    248  if ((CChr9 == FREEZ) || (!(Rand16() & 7))) {
    
    micropolis-activity/src/sim/s_zone.c lines 248–251 at c98f6b0 · upstream ↗
    211    zscore = CValve + locvalve;
    
    micropolis-activity/src/sim/s_zone.c lines 209–212 at c98f6b0 · upstream ↗
    178    zscore = IValve + EvalInd(TrfGood);
    
    micropolis-activity/src/sim/s_zone.c lines 177–179 at c98f6b0 · upstream ↗
    581  if (Value > 6000) Value = 6000;	/* Cap at 6000 */
    
    micropolis-activity/src/sim/s_zone.c lines 569–600 at c98f6b0 · upstream ↗
    537      z = 64 - z;
    
    micropolis-activity/src/sim/s_scan.c lines 529–539 at c98f6b0 · upstream ↗
    292  if (z > 32)
    
    micropolis-activity/src/sim/s_scan.c lines 277–296 at c98f6b0 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-21.

    Checked by a second AI model, 2026-10-21.

    In the claim ledger

  7. ^At a dead end TryDrive drops its last saved position and adds 3 to the step count, but it doesn't move back: the next try starts from the same tile, still barred from the way it came, so it fails again until the steps or the saved positions run out, and the trip fails.CodeMicropolis (SimHacker/micropolis)
    How we know
    213	PosStackN--;
    
    micropolis-activity/src/sim/s_traf.c lines 211–216 at c98f6b0 · upstream ↗
    236    if (RoadTest(GetFromMap(realdir))) {
    
    micropolis-activity/src/sim/s_traf.c lines 233–244 at c98f6b0 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-21.

    Checked by a second AI model, 2026-10-21.

    In the claim ledger

Sources

Code

Secondary