SimCity
Will Wright's 1989 city builder for Maxis, read through Micropolis, the GPL release of its engine.
On this page
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
| Mechanic | Kind | How |
|---|---|---|
| Simulation tick | a 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 meter | three valves pushed each second cycle by projected over current population, plus a tax term from +200 to −600 | |
| Zoning | a zone's score is its valve plus land value (residential) or nearness to the center (commercial), and growth is a roll against it | |
| Land value | 2×2 blocks valued by nearness to the center, terrain, pollution, and crime; police and fire coverage in 8×8 blocks | |
| Traffic simulation | each zone's trip walks up to 30 road tiles to a destination type, adding 50 to traffic on the way | |
| Disasters | a 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)
References
- ^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.
- ^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.
- ^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 120micropolis-activity/src/sim/headers/sim.h lines 156–157 at c98f6b0 · upstream ↗ 223#define TAXFREQ 48micropolis-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.
- ^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)revisedHow 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.
- ^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 &µpolis-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.
- ^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.
- ^At a dead end
TryDrivedrops 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.
Sources
Code
- Wright, Will, Don Hopkins, and Electronic Arts. 2026. “Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis).” Commit c98f6b0. SimHacker/micropolis @ c98f6b0 · licence, all uses
Secondary
- Wikidata contributors. 2026. “Wikidata.” Wikimedia Foundation. original · licence, all uses