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").