data/claims/simcity.yamlSimCity (the Micropolis release of its engine)
Game: SimCity.
SimCity came out in 1989. simcity/release
Value: 1989
WikidataWikidata ·Q7798922, publication date (P577)+1989-10-03T00:00:00ZWikidata's statement carries one reference. The atlas uses the year only and hasn't checked the day or which platform came first.
Cited by: SimCity
Electronic Arts released the SimCity engine under the GPL, version 3 or later, as Micropolis, on 10 January 2008. simcity/micropolis-release
Value: 2008-01-10
WikidataWikidata ·Q2719130, publication date (P577)+2008-01-10T00:00:00ZMicropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/README#L37-L44Per Child program. Copyright (C) 1989 - 2007 Electronic Arts Inc.The date is Wikidata's; the README gives the license and the copyright holder but no date. Its section 7 terms withhold the SimCity trademark, which is why the release is named Micropolis.
Cited by: SimCity
SimFrame 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. simcity/sim-speed
About: SimCity Simulation tick
Value
{
"0": 0,
"1": 0.2,
"2": 0.333,
"3": 1
}micropolis-activity/src/sim/s_sim.c#L94-L108if (SimSpeed == 1 && Spdcycle % 5)Checked by claude, 2026-10-21 — read SimFrame at the pinned commit: speed 0 returns at once; speeds 1 and 2 return unless Spdcycle is a multiple of 5 or 3; then Simulate(Fcycle & 15)How often SimFrame itself is called belongs to the Unix port (a timer in w_tk.c), so this release doesn't say how many steps per second the 1989 versions ran.
Cited by: Simulation tick
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. simcity/sim-phases
About: SimCity Simulation tick
Value
{
"phases": 16,
"columnsPerScanPhase": 15,
"censusEvery": 4,
"taxEvery": 48
}micropolis-activity/src/sim/s_sim.c#L108Simulate(Fcycle & 15);Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_sim.c#L126-L138if (!(Scycle & 1)) SetValves();Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_sim.c#L158-L172if (!(CityTime % TAXFREQ)) {Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_sim.c#L182-L201DoDisasters();Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/headers/sim.h#L156-L157#define SimWidth 120Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/headers/sim.h#L222-L223#define TAXFREQ 48Checked by claude, 2026-10-21 — read Simulate's switch case by case at the pinned commit; Scycle counts cycles at phase 0; MapScan bounds are k * WORLD_X / 8; CENSUSRATE is 4Phases 11 to 15 skip cycles at the faster speeds (sim/scan-rates). The census and tax checks read CityTime, the clock phase 0 advances. The 120-column map holds when MEGA isn't defined, which the makefile doesn't define.
Cited by: SimCity, Simulation tick
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. simcity/scan-rates
About: SimCity Simulation tick
Value
{
"power": [
1,
2,
4,
5
],
"pollution-land-value": [
1,
2,
7,
17
],
"crime": [
1,
1,
8,
18
],
"population-density": [
1,
1,
9,
19
],
"fire": [
1,
1,
10,
20
]
}micropolis-activity/src/sim/s_sim.c#L115-L123static short SpdPtl[4] = { 1, 2, 7, 17 };Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_sim.c#L182-L201if (!(Scycle % SpdFir[x])) FireAnalysis();Checked by claude, 2026-10-21 — read the five tables and the five guarded calls at the pinned commit; DoDisasters sits outside the guardSpeed 3 runs five times as many steps per call as speed 1 (sim/sim-speed), so the slower rebuild rates keep these maps' cost per call close to level across speeds. That is the likely aim; the code doesn't say.
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. simcity/calendar
About: SimCity Simulation tick
Value
{
"ticksPerMonth": 4,
"ticksPerYear": 48,
"stepsPerMonth": 64
}micropolis-activity/src/sim/s_sim.c#L126-L132CityTime++;Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/w_graph.c#L710-L711int month = (CityTime / 4) % 12;Checked by claude, 2026-10-21 — CityTime++ sits in case 0 of Simulate; the graph's date line divides it by 4 and 48Cited by: Calendar
Every 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. simcity/demand-projection
About: SimCity Demand meter
Value
{
"births": 0.02,
"internalMarketDivisor": 3.7,
"laborBaseMax": 1.3,
"externalMarket": [
1.2,
1.1,
0.98
],
"minIndustry": 5,
"ratioCap": 2
}micropolis-activity/src/sim/s_sim.c#L440-L449Migration = NormResPop * (Employment - 1);Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_sim.c#L451-L477IntMarket = (NormResPop + ComPop + IndPop) / 3.7;Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_sim.c#L479-L488if (NormResPop) Rratio = (PjResPop / NormResPop); /* projected -vs- actual */Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_sim.c#L578-L582ResHis[0] = ResPop / 8;Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/w_util.c#L177-L192SetFunds(5000);Checked by claude, 2026-10-21 — read SetValves from the projections to the ratio caps; TakeCensus shifts each history down one before writing index 0, so index 1 is the previous census; level 2 sets .98With no residents, the residential ratio is 1.3; with no commercial or industrial population, that type's ratio is its projection itself. A loop at L456–L457 sums the histories into temp and is then overwritten, so it does nothing.
Cited by: Demand meter
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. simcity/demand-tax
About: SimCity Demand meter
Value
{
"taxTable": [
200,
150,
120,
100,
80,
50,
30,
0,
-10,
-40,
-100,
-150,
-200,
-250,
-300,
-350,
-400,
-450,
-500,
-550,
-600
],
"scale": 600,
"residentialLimit": 2000,
"commercialIndustrialLimit": 1500
}micropolis-activity/src/sim/s_sim.c#L416-L418200, 150, 120, 100, 80, 50, 30, 0, -10, -40, -100,Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_sim.c#L490-L494Rratio = ((Rratio -1) * 600) + TaxTable[z]; /* global tax/Glevel effects */Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_sim.c#L496-L514if (RValve > 2000) RValve = 2000;Checked by claude, 2026-10-21 — read the table, the index (CityTax + GameLevel, capped at 20), and the add-then-clamp at the pinned commitThe game level shifts the tax index, so at level 2 a 7% tax reads the 9% entry. The valves are what the RCI meter shows; the step is a velocity, so a steady shortfall keeps pushing a valve until it reaches its limit.
Cited by: Demand meter, SimCity
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. simcity/demand-caps
About: SimCity Demand meter
Value
{
"residential": 500,
"industrial": 70,
"commercial": 100
}micropolis-activity/src/sim/s_msg.c#L92-L94z = CityTime & 63;Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_msg.c#L120-L141if ((ResPop > 500) && (StadiumPop == 0)) {Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_sim.c#L516-L518if ((ResCap) && (RValve > 0)) RValve = 0; /* Stad, Prt, Airprt */Checked by claude, 2026-10-21 — SendMessages (called in phase 10) switches on CityTime & 63; cases 26, 28, and 30 set the three caps, which SetValves appliesCited by: Demand meter
When 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. simcity/zone-trip
About: SimCity Traffic simulation
CodeMicropolis: the GPL release of the SimCity engine (SimHacker/micropolis) ·micropolis-activity/src/sim/s_zone.c#L239-L246if (tpop > Rand(35)) TrfGood = MakeTraf(0);Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_zone.c#L200-L207if (tpop > Rand(5)) TrfGood = MakeTraf(1);Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_zone.c#L169-L175if (tpop > Rand(5)) TrfGood = MakeTraf(2);Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_traf.c#L93-L104else return (-1); /* no road found */Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_traf.c#L160-L178static short PerimX[12] = {-1, 0, 1, 2, 2, 2, 1, 0,-1,-2,-2,-2};Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_sim.c#L1195-L1205range++;Checked by claude, 2026-10-21 — read the three zone routines' trip lines, MakeTraf's -1 return, FindPRoad's perimeter, and Rand (which returns 0 to range inclusive)RoadTest accepts road and rail tiles and their crossings, not bare power lines. A zone that doesn't try a trip counts as served. Residential population per zone runs 16–40 once built, so a built residential zone tries most visits; an empty one with a few houses rarely does.
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. simcity/traffic-drive
About: SimCity Traffic simulation
Value
{
"maxSteps": 30,
"residential": [
423,
816
],
"commercial": [
249,
698
],
"industrial": [
249,
423
]
}micropolis-activity/src/sim/s_traf.c#L68#define MAXDIS 30Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_traf.c#L206-L219for (z = 0; z < MAXDIS; z++) { /* Maximum distance to try */The atlas reads this differently: Nothing restores the saved position: the stack count drops and z grows by 3, but the next try starts from the same tile, still barred from the way it came. (simcity/traffic-dead-end)Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_traf.c#L231-L238if (realdir == LDir) continue; /* skip last direction */Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_traf.c#L277-L278static short TARGH[3] = {NUCLEAR, PORT, COMBASE}; /* for destinations */Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/headers/sim.h#L351-L389#define COMBASE 423Checked by claude, 2026-10-21 — read TryDrive, TryGo, and DriveDone at the pinned commit; LHTHR is 249, COMBASE 423, PORT 698, NUCLEAR 816 in sim.h; DriveDone tests the four neighbours of the current tileThe code's comment reads "R>C C>I I>R", but the ranges are wider: a residential trip also ends at an industrial zone, a seaport, an airport, or a power plant, and a commercial one at a house or an industrial zone. LDir starts at 5, so the first step may go any way.
Cited by: Traffic simulation
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. simcity/traffic-dead-end
About: SimCity Traffic simulation
CodeMicropolis: the GPL release of the SimCity engine (SimHacker/micropolis) ·micropolis-activity/src/sim/s_traf.c#L211-L216PosStackN--;The atlas reads this differently: Nothing restores the saved position: the stack count drops and z grows by 3, but the next try starts from the same tile, still barred from the way it came.Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_traf.c#L233-L244if (RoadTest(GetFromMap(realdir))) {Checked by claude, 2026-10-21 — the dead-end branch only decrements PosStackN; SMapX/SMapY and LDir change only inside TryGo's successful move, and TryGo's loop covers every direction but LDir, so at a dead end it fails each timeThe comment says "deadend , backup", but nothing restores the position from the stack. In effect a trip that meets a dead end before a destination fails. The atlas hasn't checked whether the 1989 versions do the same.
Cited by: SimCity, Traffic simulation
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. simcity/traffic-density
About: SimCity Traffic simulation
Value
{
"perTrip": 50,
"cap": 240,
"capChance": 0.1667,
"decayAbove200": 34,
"decay": 24
}micropolis-activity/src/sim/s_traf.c#L239-L240if (z & 1) /* save pos every other move */Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_traf.c#L113-L134TrfDensity[SMapX >>1][SMapY >>1] = z;Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/headers/sim.h#L475extern Byte *TrfDensity[HWLDX];Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/w_sprite.c#L470if (z = Oframe[COP]) DrawCopter(view, z);Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_sim.c#L256-L268if (z > 200) TrfDensity[x][y] = z - 34;Checked by claude, 2026-10-21 — SetTrafMem adds 50 to a short, caps at 240 only when Rand(5) is 0 (1 in 6), and stores into the Byte map; DecTrafficMem runs in phase 10; the COP sprite is drawn as the copterRail tiles (224 up) fall outside the ROADBASE–POWERBASE test despite the "check for rail" comment. The wrap is what the Micropolis C code does; the atlas hasn't checked the 1989 versions, and a block that wraps reads as light traffic until trips push it up again.
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. simcity/zone-score
Value
{
"residentialTerm": [
-3000,
3000
],
"commercialTerm": [
-64,
64
],
"industrialTerm": 0,
"unpowered": -500
}micropolis-activity/src/sim/s_zone.c#L248-L251if ((CChr9 == FREEZ) || (!(Rand16() & 7))) {Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_zone.c#L209-L212zscore = CValve + locvalve;Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_zone.c#L177-L179zscore = IValve + EvalInd(TrfGood);Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_zone.c#L569-L600if (Value > 6000) Value = 6000; /* Cap at 6000 */Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_scan.c#L529-L539z = 64 - z;Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_scan.c#L277-L296if (z > 32)Checked by claude, 2026-10-21 — read the three zone routines and EvalRes, EvalCom, EvalInd; DistIntMarket fills ComRate from GetDisCC, capped at 32; the -3000 and -1000 branches need traf < 0, which returns earlier, so they never applyThe city center is the average position of all zone centers (PopDenScan, s_scan.c L128–L131), and distance is x plus y in 2×2 blocks. A failed trip doesn't lower the score: Eval* see only a trip result of 0 or 1.
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. simcity/zone-roll
Value
{
"growAbove": -350,
"declineBelow": 350,
"offset": 26380,
"growChanceAt0": 0.0975
}micropolis-activity/src/sim/s_zone.c#L253-L264(((short)(zscore - 26380)) > ((short)Rand16Signed()))) {Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_zone.c#L214-L222if (TrfGood &&Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_sim.c#L1216-L1223i = 32767 - i;Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/rand.c#L44-L48return ((next % ((SIM_RAND_MAX + 1) <<8)) >>8);Checked by claude, 2026-10-21 — sim_rand returns 0–65535; Rand16Signed maps 32768–65535 to -1 to -32768, a uniform signed range; counted the values below score - 26380 and above score + 26380; residential and industrial use the same test without the TrfGood term, so a failed trip doesn''t stop themBetween −350 and 350 a zone can go either way on the same visit. The score's highest is 2000 + 3000 for residential and 1500 + 64 for commercial. rand.c is the Unix port's own generator, so the 1989 versions' random numbers differ in detail, though the thresholds are the engine's.
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. simcity/zone-limits
Value
{
"residentialLevels": [
16,
24,
32,
40
],
"commercialMax": 5,
"industrialMax": 4,
"residentialPollutionMax": 128,
"emptyZoneHouses": 8,
"fillDensity": 64
}micropolis-activity/src/sim/s_zone.c#L300-L346if (z > 128) return;Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_zone.c#L428-L453return ((CzDen * 8) + 16);Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_zone.c#L605-L618if ((loc >= LHTHR) && (loc <= HHTHR))Checked by claude, 2026-10-21 — read DoResIn, DoComIn, DoIndIn, the three population functions, and DoFreePop (which counts house tiles in the 3x3) at the pinned commitAn empty residential zone that would grow builds a hospital or church instead, one time in four, when the city needs one (L255–L258, MakeHosp).
A 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. simcity/value-class
About: SimCity Land value
Value
[ 30, 80, 150 ]
micropolis-activity/src/sim/s_zone.c#L287-L297if (LVal < 150) return (2);Checked by claude, 2026-10-21 — GetCRVal's result is passed as value to DoResIn, DoComIn, and their Plop callsOver 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). simcity/map-scales
About: SimCity Land value
Value
{
"2x2": [
60,
50
],
"4x4": [
30,
25
],
"8x8": [
15,
13
]
}micropolis-activity/src/sim/headers/sim.h#L156-L167#define SmY ((SimHeight + 7) >>3)Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/headers/sim.h#L474-L488extern short FireStMap[SmX][SmY]; /* 8X8 Maps 15 x 13 */Checked by claude, 2026-10-21 — read the declarations and the HWLDX, QWX, SmX macros at the pinned commit; 100 / 8 rounds up to 13Cited by: Land value
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. simcity/land-value
About: SimCity Land value
Value
{
"distanceBase": 34,
"distanceCap": 32,
"crimePenalty": 20,
"crimeThreshold": 190,
"range": [
1,
250
]
}micropolis-activity/src/sim/s_scan.c#L184-L215dis = 34 - GetDisCC(x, y);Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_scan.c#L277-L296z = (xdis + ydis);Checked by claude, 2026-10-21 — read PTLScan's land value equation and GetDisCC at the pinned commit; LVflag counts tiles at ROADBASE or aboveThe terrain value adds 15 for each natural tile (water, shore, and trees, numbered below rubble) in the 4×4 block, before smoothing (L187–L188). Pollution and crime here are the maps from the previous runs of their scans.
Cited by: Land value
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. simcity/pollution
About: SimCity Land value
Value
{
"heavyTraffic": 75,
"lightTraffic": 50,
"fire": 90,
"radiation": 255,
"industry": 50,
"portAirportCoal": 100
}micropolis-activity/src/sim/s_scan.c#L257-L273if (loc >= HTRFBASE) return (/* 25 */ 75); /* heavy traf */Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_scan.c#L191-L202Plevel += GetPValue(loc);Checked by claude, 2026-10-21 — read GetPValue against sim.h's tile ranges: LTRFBASE 80, HTRFBASE 144, IND1 621 to PORTBASE 693, PORTBASE to LASTPOWERPLANT 760; the nuclear plant (811) falls past 760Comments keep older values beside each: 25 for heavy traffic, 10 for light, 60 for fire and for ports and plants, and −40 for radiation. Which set shipped in 1989 the code doesn't say. The first fire tile (56) falls through to the radiation test and counts 255.
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. simcity/crime
About: SimCity Land value
Value
{
"base": 128,
"preCap": 300,
"cap": 250
}micropolis-activity/src/sim/s_scan.c#L313-L323z -= PoliceMap[x >>2][y >>2];Checked by claude, 2026-10-21 — read CrimeScan at the pinned commitEach 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. simcity/station-coverage
About: SimCity Land value
Value
{
"full": 1000,
"smoothingPasses": 3
}micropolis-activity/src/sim/s_sim.c#L1040-L1069z = z >>1; /* post PD's need roads */Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_sim.c#L678-L688(float)PoliceFund) * 1000.0);Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_scan.c#L307-L309SmoothPSMap();Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_scan.c#L81-L83SmoothFSMap();Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_scan.c#L515-L520edge = (edge >>2) + PoliceMap[x][y];Checked by claude, 2026-10-21 — read DoSPZone's two station cases, UpdateFundEffects, and both smoothing routines; ClearCensus zeroes both maps at phase 0 and the map scan refills themThe road halving is marked "post", a change after the original release, so the 1989 versions likely lack it.
Once 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. simcity/disaster-roll
Value
{
"chance": [
"1/481",
"1/241",
"1/61"
],
"fire": "2/9",
"flood": "2/9",
"planeCrash": "1/9",
"tornado": "1/9",
"earthquake": "1/9",
"monster": "2/9",
"monsterPollution": 60
}micropolis-activity/src/sim/s_disast.c#L76-L113static short DisChance[3] = { 10*48, 5*48, 60};Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_sim.c#L1195-L1205return (rnum % range);Checked by claude, 2026-10-21 — read DoDisasters (called each cycle in phase 15) and Rand, which returns 0 to range inclusive, so Rand(480) is 0 one time in 481 and Rand(8) picks one of nine casesThe table writes the first two chances as 10 × 48 and 5 × 48, ten and five years of clock ticks. The monster threshold keeps an older 80 in a comment. The off switch at L87 is marked "post".
Cited by: Disasters
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. simcity/meltdown
Value
[ "1/30001", "1/20001", "1/10001" ]
micropolis-activity/src/sim/s_sim.c#L1016static short MltdwnTab[3] = { 30000, 20000, 10000 }; /* simadj */Micropolis: the GPL release of the SimCity engine (SimHacker/micropolis) · micropolis-activity/src/sim/s_sim.c#L1029-L1033if (!NoDisasters && !Rand(MltdwnTab[GameLevel])) {Checked by claude, 2026-10-21 — read DoSPZone's nuclear case; Rand(n) is 0 one time in n + 1