Akhenaten RA 0.27 — Eight Months of Script, Simulation, and Polish
RA 0.27 is out. Since RA 0.26 in late October 2025 the project has landed roughly two thousand commits — not a single headline feature, but a sustained push toward two goals: make the game behave more like original Pharaoh, and move as much of the engine as possible into JavaScript so modders can change behaviour without recompiling.
This post is the release-notes companion: what changed for players, what changed under the hood, and where the project is headed next.
The Big Theme: Logic Leaves C++
If RA 0.26 was about localization, deferred rendering, and the enemy system, RA 0.27 is the script migration wave. Piece by piece, hardcoded C++ has been replaced with MuJS configs and event handlers. The pattern is always the same: declare data in a [es=...] block, wire behaviour through events, hot-reload with --mixed, ship.
City overlays — all of them
The overlay menu moved to script in May. This release finishes the job: every built-in city overlay — Water, Health, Religion, Crime, Fire, Labor, Education, Entertainment, Food, Tax, and more — is now declared with [es=city_overlay] and registered through the entity-system registry. Tooltip text and column heights route through city.overlay_tooltip and script event handlers instead of per-overlay C++ subclasses.
For modders that means a custom overlay for a new building type is a self-contained .js file, not a new translation unit and a rebuild. See the dedicated write-up: Overlays Become Script-Declared.
Windows players actually open
- Main menu — continue/load/new game, GitHub update check, logo skip via
--no-logo - Scenario selection — campaign periods, mission info panel, custom map browser (write-up)
- All advisor screens — finance, religion, health, military, population, housing, entertainment, ratings, imperial overseer, chief advisor
- Build menu and sidebar — costs, captions, temple-complex upgrades, mothball toggles on industry windows
- Hotkey configuration — full remapping UI in script with persistence fixes
- Victory and defeat — win checks, continue-governing timer, and dialog content now live in
src/scripts/city/victory.js - Granary, bazaar, warehouse, tax collector, festival square, hold-festival — info and orders panels script-driven
- Top menu — save, load, replay, exit, screenshots, debug toggles
Build planner and roads
Road construction — path routing, junction sprites, drag preview — moved to road.js. The preview places tiles temporarily on the map to read real corner sprites, so half-drawn roads look correct. Statue placement preview and rotation (R hotkey, per-building allow_rotate) followed the same path. Copy-build-under-cursor (Q by default) also lives in script now.
Gameplay: Closer to Pharaoh.exe
Script migration is the engineering story; accuracy is the player story. RA 0.27 fixes and restores systems that had been missing, simplified, or wrong.
Combat and military
- Player legions fight again — on-map battles and distant battles both work; recruitment starts when the standard is at rest
- Army advisor layout fixed — legion rows stay inside the window, battalion counts correct
- Fort troop-type signs render properly; low-morale rout no longer crashes on a null soldier
Economy, resources, and industry
- Resource depletion for gold, stone, sandstone, copper, gems, and clay — mines and quarries exhaust their tiles over time, with save/load of depletion grids
- Irrigation — water lifts and ditches spread
irrigation_valueacross farmland - Meadow farms and unified floodplain/meadow placement rules
- Dock warehouse search retries across budget slots; optional double-haul gameplay flag
- Kingdom trader imports capped at 400 per storage slot (matching original behaviour)
- Bazaar spawn delay always runs; buyer dispatch preferred over trader when both are ready
Religion, monuments, and city life
- Monument rating uses Pharaoh.exe weights; mastabas and pyramid variants included
- Seth minor curse (fort destruction) and Osiris locust curse (
building_curse_farms) implemented - Temple complex upgrades, road-access corner offsets fixed, oracle branch for part 2
- Police station, mortuary, and festival logic restored or improved
- Hyenas hunt ostriches; city animals API exposed to mission scripts
- Figure phrase sounds overhauled for dozens of walker types
Missions and campaign
- Early missions (Nubt, Thinis, Perwadjyt) aligned with the original; Selima and Saqqara win criteria corrected
- Mission intro popups restored via per-mission JS handlers
- Empire map disabled in missions 4 and 5, as in the OG campaign
- Campaign victory now advances to the next mission reliably
- Tutorial triggers separated from real win conditions (e.g. disease_handled in mission 2)
- Pharaoh gift/request events for later missions ported to JS handlers
UI and Quality of Life
- BIK video playback — intro and briefing movies from the original
.bikfiles - Windows self-update from GitHub releases, URL configured in script
- Optional save prompt on Alt+F4 (
gameui_prompt_save_on_exit) - Hovered map tile highlighted with a black outline
- Sound settings window redesigned — per-channel volume for music, speech, effects, ambient, city (write-up)
- CLI flags:
--no-logo,--no-resource,--log-sound,--config:NAME=VALUE - Empire window always closable; siege battle icon position exposed; traders draw correctly on the map
- Message list capacity raised; mission goals panel layout fixed
Scenario Editor and Debug Tools
The in-game scenario editor gained real persistence for points that used to be discarded on save: land and sea invasion points, entry/exit, river entry, earthquake locations, predator herd tiles. Invasion points reset correctly on scenario load. A debug terrain paint brush lets you paint land, water, floodplain, reeds, rocks, ore, dunes, and meadow at runtime — with physics enforced (water depth, moisture regrowth, homeless on demolition). Contributed by @cwshields; see the brush write-up.
Debug panels for missions, buildings, migration, sound, clouds, game features, game time, build planner, and sentiment moved to JavaScript. Console commands for fire, victory, money, collapse, and more can be registered from script.
Platforms and Distribution
- Windows — nightly builds, self-update, BugTrap crash reporting
- Linux — binary zip, Flatpak, Bazzite image
- macOS — separate ARM and x86_64 builds with corrected deployment targets
- Android — Gradle-based build, SDL2/SDL2_mixer from source
- Browser — Emscripten build on its own play page
- itch.io — official download channel alongside GitHub
German localization files landed (localization_de.js, eventmsg_de.js). The Player Wiki grew substantially — housing, roads, farms, missions, and individual building pages written from live engine data.
Under the Hood: Tests and Stability
A JS-driven integral test framework now boots the real game under --integraltests, runs each tests/*.js file sequentially, and reports PASS/FAIL in the log. CI surfaces results on GitHub Actions. Current coverage includes main menu, file dialogs, granary info, road placement, pottery workshop placement, work camp info, and victory dialog flow. Tests fail automatically if the log contains a MuJS TypeError — catching script regressions before they reach players.
Dozens of on_place_checks fixes chain building overrides back to the base implementation so placement warnings (weaver flax source, shrine road access, water supply, workshops, and more) fire correctly. Routing improvements keep citizens off shorelines under roads and boats off corner tiles.
Modding Quick Reference
- Hot-reload scripts:
akhenaten --mixed /path/to/scripts(macOS/Linux) - Unpack embedded scripts from the mods window or
--unpack_scripts - Override features:
--config:pyramid_speedup=1style CLI flags - Building configs:
src/scripts/building/ - City systems:
src/scripts/city/(victory, festival, animals, …) - Mission scripts: dotted import paths, per-mission handlers in
src/scripts/mission/ - MuJS debugger: start from the top-menu debug entry, attach VS Code on port 4711
Download
RA 0.27 (version 0.2.7) is available from GitHub Releases and itch.io. Saves from RA 0.26 should load; report issues on GitHub or Discord.
Thank you to everyone who filed bugs, sent PRs, and playtested nightly builds — especially @cwshields, Chase Shields, MacThings, IvanAnis777, and the rest of the contributors who shaped this release.