A native Linux port of SimTower (Maxis / OpenBook, 1994), written fresh in
C + SDL2. All of the game code is written from scratch. The mechanics are
reimplemented to match the original's behaviour — their rules, thresholds, and
timing constants reverse-engineered by studying a Ghidra decompilation of
SIMTOWER.EXE and the
YootTower code map.
No original code or data is extracted from or executed out of the binary; the
only thing read from the EXE at runtime is its art and sound.
Built by Claw 🦞 — an autonomous AI agent (Claude), running on a Raspberry Pi 5 in Berkeley. The reverse-engineering, the decompilation analysis, and every line of code in this repository are its work.
The goal is a faithful reproduction of the original mechanics — population growth, tenant satisfaction, elevator dispatch, star ratings, the disasters — running natively on Linux, using the original game's own bitmaps and sounds.
→ kvetch.io/conciliatower (mirror: jonahss.github.io/concilia-tower)
The story of how it was built: A complete and faithful SimTower remake, playable in the browser.
The same engine, compiled to WebAssembly. Bring your own SIMTOWER.EXE — it
is parsed entirely in your browser (there is no server) and remembered
locally, along with your saves. The page checks the file's structure and
tells you exactly what to fix if you picked the wrong thing; see
docs/SUPPORTED-BUILDS.md for the builds we
recognize and how to report a new one.
Imported original towers, rendered live by the port using assets read from
SIMTOWER.EXE:


Note on assets: this repository contains no copyrighted Maxis content. No sprites, sounds, or the original executable are distributed here. To run the game you must supply your own copy of
SIMTOWER.EXE, from which sprites and sound effects are read at runtime (nothing is copied out or redistributed). See Providing the original EXE.
Read live from your SIMTOWER.EXE at runtime — and only this:
Reimplemented from scratch, matching the original's behaviour:
Game mechanics: population, tenants, elevators, star ratings, disasters
Magic numbers, thresholds, and timing constants
These are our own C code, not taken from the binary. Their behaviour and
constants were reverse-engineered by reading a Ghidra decompilation and the
YootTower code map, then re-derived and verified against the original — see
docs/ORIGINAL-BUGS.md and
docs/OPENSKYSCRAPER-ERRATA.md.
Platform layer, written fresh:
src/ne_resource.c, src/sprites.c).TWR/.TDT format (src/twr.c), so towers
round-trip and are interchangeable with the original gameRequires a C11 compiler and the SDL2 development libraries.
# Debian / Raspberry Pi OS
sudo apt install build-essential libsdl2-dev libsdl2-ttf-dev
make # produces ./simtower
The game reads its art and sound directly from an original SIMTOWER.EXE every
time it launches. You need a legitimately-obtained copy of the file — it is
not included in this repository and never will be.
The binary looks for the EXE in this order:
./simtower /path/to/SIMTOWER.EXE
./SIMTOWER.EXE./data/SIMTOWER.EXE../OpenSkyscraper/data/SIMTOWER.EXEThe simplest setup is to drop the file at data/SIMTOWER.EXE:
mkdir -p data
cp /wherever/you/have/SIMTOWER.EXE data/SIMTOWER.EXE
make run # equivalent to ./simtower data/SIMTOWER.EXE
You can also point the Makefile's run target elsewhere:
make run EXE_PATH=/path/to/SIMTOWER.EXE
The filename match is case-insensitive on the resource contents, but keep the
name SIMTOWER.EXE for the auto-detected paths to work.
If no EXE is found the game exits with:
Cannot find SIMTOWER.EXE. Pass path as argument.
./simtower data/SIMTOWER.EXE
Optionally pass a tower file to load a saved game:
./simtower data/SIMTOWER.EXE mytower.tdt
On a headless machine (e.g. a Raspberry Pi), scripts/launch.sh starts the
game inside Xvfb and exposes it over VNC/noVNC — see the comments at the top
of that script.
| Path | Contents |
|---|---|
src/ | Game source (C + SDL2) |
src/ne_resource.c | NE-format resource parser for SIMTOWER.EXE |
src/sprites.c | Bitmap/palette → SDL surface pipeline |
src/twr.c | .TWR / .TDT tower-file import and export |
tests/ | Unit tests and real 1995/96 tower fixtures |
scripts/ | Launch/screenshot helpers and small dev utilities |
docs/ | Research notes — original bugs, OpenSkyscraper errata |
PLAN.md | Build plan and phase history (all phases complete) |
PLAN.md — architecture and the phase-by-phase build history
(all six phases complete).docs/ORIGINAL-BUGS.md — a catalogue of the
original SimTower's genuine bugs, kept separate from its surprising-but-intended
mechanics. We reproduce the intended behaviour faithfully; the bugs are documented
so we can decide case-by-case whether to preserve them.docs/OPENSKYSCRAPER-ERRATA.md — where the
OpenSkyscraper reference implementation diverges from the original binary, verified
against the decompilation.UI_TODO.md — the live worklist: remaining faithful loose
ends and the mod-idea backlog.docs/REFACTOR-PLAN-runtime-model.md —
the runtime-model refactor brief (completed and merged, June 2026).Playable end to end. All six planned build phases are complete
(PLAN.md) — the port goes from an empty lot to the 5⭐ → TOWER
win condition (cathedral, VIP, wedding ceremony) with the original's mechanics:
0x8190) and the full-screen
"Simulate" shaft-edit mode.0x81f4 artwork, campaign (star-gated) and sandbox modes..TWR/.TDT towers
import, play, and export byte-identically.tests/test_sim.c).Remaining loose ends are small and tracked in UI_TODO.md:
shop closed/for-rent storefront frames, the elevator dialog's 24px mode-icon
art, a couple of unwired sound effects, and a reader for the EXE's dialog
string table (event text is currently hardcoded to matching wording). A
backlog of deliberate, clearly-labelled mods (multi-tower bridges,
window-washing cranes, …) lives there too — the faithful base stays clean.
This is a clean-room-style reimplementation of the game's code. It ships no
Maxis assets and no original executable. SimTower is © its respective rights
holders; you must own a copy to supply the SIMTOWER.EXE this port reads at
runtime. This project is not affiliated with or endorsed by Maxis, OpenBook,
Vivarium, or any rights holder.
src/vendor/mspack/ contains a minimal subset of
libmspack (© Stuart Caie,
LGPL 2.1), used to expand the MS-Compress SIMTOWER.EX_ found on original
CD/floppy media. See src/vendor/mspack/README.md.
C
91.4%
HTML
3.7%
JavaScript
3.5%
A native Linux port of SimTower (Maxis / OpenBook, 1994), written fresh in
C + SDL2. All of the game code is written from scratch. The mechanics are
reimplemented to match the original's behaviour — their rules, thresholds, and
timing constants reverse-engineered by studying a Ghidra decompilation of
SIMTOWER.EXE and the
YootTower code map.
No original code or data is extracted from or executed out of the binary; the
only thing read from the EXE at runtime is its art and sound.
Built by Claw 🦞 — an autonomous AI agent (Claude), running on a Raspberry Pi 5 in Berkeley. The reverse-engineering, the decompilation analysis, and every line of code in this repository are its work.
The goal is a faithful reproduction of the original mechanics — population growth, tenant satisfaction, elevator dispatch, star ratings, the disasters — running natively on Linux, using the original game's own bitmaps and sounds.
→ kvetch.io/conciliatower (mirror: jonahss.github.io/concilia-tower)
The story of how it was built: A complete and faithful SimTower remake, playable in the browser.
The same engine, compiled to WebAssembly. Bring your own SIMTOWER.EXE — it
is parsed entirely in your browser (there is no server) and remembered
locally, along with your saves. The page checks the file's structure and
tells you exactly what to fix if you picked the wrong thing; see
docs/SUPPORTED-BUILDS.md for the builds we
recognize and how to report a new one.
Imported original towers, rendered live by the port using assets read from
SIMTOWER.EXE:


Note on assets: this repository contains no copyrighted Maxis content. No sprites, sounds, or the original executable are distributed here. To run the game you must supply your own copy of
SIMTOWER.EXE, from which sprites and sound effects are read at runtime (nothing is copied out or redistributed). See Providing the original EXE.
Read live from your SIMTOWER.EXE at runtime — and only this:
Reimplemented from scratch, matching the original's behaviour:
Game mechanics: population, tenants, elevators, star ratings, disasters
Magic numbers, thresholds, and timing constants
These are our own C code, not taken from the binary. Their behaviour and
constants were reverse-engineered by reading a Ghidra decompilation and the
YootTower code map, then re-derived and verified against the original — see
docs/ORIGINAL-BUGS.md and
docs/OPENSKYSCRAPER-ERRATA.md.
Platform layer, written fresh:
src/ne_resource.c, src/sprites.c).TWR/.TDT format (src/twr.c), so towers
round-trip and are interchangeable with the original gameRequires a C11 compiler and the SDL2 development libraries.
# Debian / Raspberry Pi OS
sudo apt install build-essential libsdl2-dev libsdl2-ttf-dev
make # produces ./simtower
The game reads its art and sound directly from an original SIMTOWER.EXE every
time it launches. You need a legitimately-obtained copy of the file — it is
not included in this repository and never will be.
The binary looks for the EXE in this order:
./simtower /path/to/SIMTOWER.EXE
./SIMTOWER.EXE./data/SIMTOWER.EXE../OpenSkyscraper/data/SIMTOWER.EXEThe simplest setup is to drop the file at data/SIMTOWER.EXE:
mkdir -p data
cp /wherever/you/have/SIMTOWER.EXE data/SIMTOWER.EXE
make run # equivalent to ./simtower data/SIMTOWER.EXE
You can also point the Makefile's run target elsewhere:
make run EXE_PATH=/path/to/SIMTOWER.EXE
The filename match is case-insensitive on the resource contents, but keep the
name SIMTOWER.EXE for the auto-detected paths to work.
If no EXE is found the game exits with:
Cannot find SIMTOWER.EXE. Pass path as argument.
./simtower data/SIMTOWER.EXE
Optionally pass a tower file to load a saved game:
./simtower data/SIMTOWER.EXE mytower.tdt
On a headless machine (e.g. a Raspberry Pi), scripts/launch.sh starts the
game inside Xvfb and exposes it over VNC/noVNC — see the comments at the top
of that script.
| Path | Contents |
|---|---|
src/ | Game source (C + SDL2) |
src/ne_resource.c | NE-format resource parser for SIMTOWER.EXE |
src/sprites.c | Bitmap/palette → SDL surface pipeline |
src/twr.c | .TWR / .TDT tower-file import and export |
tests/ | Unit tests and real 1995/96 tower fixtures |
scripts/ | Launch/screenshot helpers and small dev utilities |
docs/ | Research notes — original bugs, OpenSkyscraper errata |
PLAN.md | Build plan and phase history (all phases complete) |
PLAN.md — architecture and the phase-by-phase build history
(all six phases complete).docs/ORIGINAL-BUGS.md — a catalogue of the
original SimTower's genuine bugs, kept separate from its surprising-but-intended
mechanics. We reproduce the intended behaviour faithfully; the bugs are documented
so we can decide case-by-case whether to preserve them.docs/OPENSKYSCRAPER-ERRATA.md — where the
OpenSkyscraper reference implementation diverges from the original binary, verified
against the decompilation.UI_TODO.md — the live worklist: remaining faithful loose
ends and the mod-idea backlog.docs/REFACTOR-PLAN-runtime-model.md —
the runtime-model refactor brief (completed and merged, June 2026).Playable end to end. All six planned build phases are complete
(PLAN.md) — the port goes from an empty lot to the 5⭐ → TOWER
win condition (cathedral, VIP, wedding ceremony) with the original's mechanics:
0x8190) and the full-screen
"Simulate" shaft-edit mode.0x81f4 artwork, campaign (star-gated) and sandbox modes..TWR/.TDT towers
import, play, and export byte-identically.tests/test_sim.c).Remaining loose ends are small and tracked in UI_TODO.md:
shop closed/for-rent storefront frames, the elevator dialog's 24px mode-icon
art, a couple of unwired sound effects, and a reader for the EXE's dialog
string table (event text is currently hardcoded to matching wording). A
backlog of deliberate, clearly-labelled mods (multi-tower bridges,
window-washing cranes, …) lives there too — the faithful base stays clean.
This is a clean-room-style reimplementation of the game's code. It ships no
Maxis assets and no original executable. SimTower is © its respective rights
holders; you must own a copy to supply the SIMTOWER.EXE this port reads at
runtime. This project is not affiliated with or endorsed by Maxis, OpenBook,
Vivarium, or any rights holder.
src/vendor/mspack/ contains a minimal subset of
libmspack (© Stuart Caie,
LGPL 2.1), used to expand the MS-Compress SIMTOWER.EX_ found on original
CD/floppy media. See src/vendor/mspack/README.md.
C
91.4%
HTML
3.7%
JavaScript
3.5%