SimCity 2000 City Reconstruction
← Project Index SimCity 2000 City Reconstruction

SimCity 2000 City Reconstruction

Reverse-engineers SimCity 2000 .sc2 save files and rebuilds the cities in 3D inside Unreal Engine 5 -; parsing the old IFF format, then spawning buildings on a grid with procedural terrain, weather and seasons.

Archived Started: Summer 2025 Updated: Summer 2025

Overview

Take a city you built in SimCity 2000 in 1995 and walk through it in 3D. A Python parser cracks open the binary .sc2 save, pulls out the terrain and every building, and writes it to JSON; an Unreal Engine 5 C++/Blueprint importer reads that JSON and reconstructs the city on a grid, draped in a procedural natural environment.

Worth stating plainly: the "photorealistic, VR-navigable" framing is the roadmap, not the shipped state. What actually works is the parse-and-rebuild pipeline with default meshes and procedural environment systems; photorealistic assets and VR are stated goals.

Background

SimCity 2000's save format was reverse-engineered publicly back in the '90s, and this project stands on that work -; David Moews' 1995 spec and the community SC2k-docs -; to do something the original never could: render your city as a place you can move a camera through. The "UR" in the project name nods both to Unreal and to Maxis's own 1995 Urban Renewal Kit.

How It Works

The .sc2 file is an IFF container of RLE-compressed chunks. The parser validates the FORM header, decompresses each chunk, and reads out the two things that matter for reconstruction: the building grid (XBLD) and the terrain heightmap (ALTM).

# buildings: a 128x128 grid, each tile byte -> a building type
# footprints derived from the hex range:
#   0x70-0x8C = 1x1,  0x8C-0xAE = 2x2
#   0xAE-0xC6 = 3x3,  arcologies = 4x4

# terrain: altitude lives in the low 5 bits of each 16-bit ALTM word
altitude = (value & 0x1F) * 100 + 50   # 50-3150 ft

That JSON -; city name, grid size, a typed building list, and the full altitude map -; feeds an Unreal C++ actor (ASimCity2000CityBuilder) with Blueprint-callable Load / Build / Clear. Buildings spawn via Hierarchical Instanced Static Meshes for draw-call efficiency, with tiered cull distances so a 128×128 city stays performant. A DataTable maps building codes to meshes. On top of that sits a procedural environment system -; biome detection, vegetation, water and rivers, Niagara weather, day/night and seasons -; plus an optional LLM hook that calls Claude or Ollama to generate per-building architectural descriptions at build time.

Current Status

Archived as a working prototype. There's real proof it ran: a converted dataset for a city called "Beagville" sits in the tree, with the building grid and altitude map fully extracted.

  • Parser handles the full 256-code building taxonomy, footprints, and terrain heights; one real city is converted.
  • UE5 importer, instanced rendering, procedural environment and the optional AI hook are specified and built; building meshes are left to the user (default cubes to start).
  • VR navigation and photorealistic assets are roadmap, not built -; the Beagville output even shows minor parser gaps (some tree tiles read as "Unknown building").