Arch Rogue is a grim isometric action-RPG roguelike built with Odin and raylib. It combines deterministic procedural dungeons, real-time combat, random loot, permanent consequences, and a seeded dark-fantasy story.
The active game now lives at the repository root. src/, assets/, tests/, android/, and build.sh are the canonical Odin project. The former Python/Pygame implementation is archived under arch-rogue-python/; it remains useful for archaeology and parity checks, but it is not an active development or runtime dependency.
Bleeding-edge prerelease builds are published on the Arch Rogue download site.
| Platform | Status |
|---|---|
| Linux | Available |
| Android | Available as a native Odin/raylib alpha build |
| Web (WebAssembly) | Play in a browser using the exact audited release archive. Requires a current desktop Chromium-family or Firefox browser with WebGL2 |
| Windows | Native x64 ZIP and Steam CI lanes configured; first CI run and hardware acceptance pending |
| macOS | Unsupported |
| Steam / Steam Deck integration | In progress: the game-side Steamworks integration (achievements, offline queue, cloud-ready saves) is built; store release pending |
| Multiplayer | Deferred |
The public workflow deploys the same content-addressed web archive attached to each prerelease. The Brotli wire budget and immutable/no-cache policy are self-hosted contracts validated by web-audit and web-serve; GitHub Pages controls its own compression and cache headers, so those delivery claims are not applied to the Pages endpoint.
This is an alpha release. Save formats are versioned and defensive, but gameplay, presentation, and platform contracts can still change before 6.0.
- Deterministic ten-depth runs with procedural rooms, corridors, doors, boss arenas, eight dungeon themes, dark floors, line-of-sight fog of war, and an isometric minimap.
- Five archetypes: Warden, Rogue, Arcanist, Acolyte, and Ranger.
- Fixed-step real-time combat with class kits, typed damage and statuses, elites, minibosses, five bosses, familiars, and a full discipline tree.
- Loot with rarity tiers, affixes, unidentified and cursed equipment, consumables, and thirteen named uniques.
- Traps, shrines, secrets, Shops, Bars, Gardens, Quest rooms, and the Hall of Unlost Echoes.
- A deterministic story engine with guests, relic choices, minigames, run consequences, and fifteen endings.
- Local save/resume, recovery-safe writes, persistent options, and the Chronicle run history.
- Authored PixelLab actor, world, UI, story, and effect art with point-sampled rendering.
- Keyboard/mouse and remappable gamepad input on Linux; native multi-touch, lifecycle, and semantic Back handling on Android.
See PARITY.md for the port ledger, ARCHITECTURE.md for design decisions and subsystem boundaries, and ITEM_BALANCE.md for the review tables covering Rare rolls and fixed named Unique stats.
- Use the mouse wheel to navigate menus and scroll inventory/shop lists.
- In inventory (
I), hover or tap an equipped weapon/armor to preview it.Tabor controllerRBcycles bag → weapon → armor; Up/Down and the D-pad also navigate between equipped slots and bag rows. Equipped previews are read-only. Enter/Eor a double-click uses/equips the selected bag item;1–9targets a bag item directly.Deletedrops the selected bag item;Shift+1–9drops that numbered bag item.Ssorts the bag; Left/Right (including the D-pad),Shift+S, controllerX(unless remapped to Character), or the sort buttons choose the sort mode. In shops,Tab/Left/Right switches Buy/Sell.- During gameplay,
Ctrl+wheelzooms the world; plain wheel over the minimap zooms only the minimap. Open menus take priority over both zoom controls.
- A Linux development host
- Bash
- The exact Odin tag, source commit, and LLVM backend recorded in root
toolchain.properties, available asodin - The normal Linux graphics, windowing, and audio development libraries required by raylib
build.sh verifies the ambient Odin executable before every compile, check, or test, so local builds cannot silently differ from CI/CD. The native Windows lane uses the same source commit with the source tree's separately pinned Windows LLVM 20.1.0 backend; the following LLVM pin applies to Linux. At the current pin this requires Odin dev-2026-07 at commit 301c287de90393608fb7c5b260210e1e67caf0fd, built with LLVM 21.1.8; a newer distro package is intentionally rejected. CI reads its setup-odin inputs from the same root contract and runs the same verifier.
The raylib 6.0 binding and checksum-pinned static libraries are included under vendor/raylib/; a separate raylib installation is not required. Root toolchain.properties owns project-wide Odin and raylib source pins, while android/toolchain.properties and web/toolchain.properties contain only platform-specific additions.
Run every command from the repository root. The wrapper also relocates itself correctly when invoked from another current directory.
./build.sh toolchain
./build.sh check
./build.sh test
./build.sh build
./build.sh run
./build.sh releasetoolchainverifies the exact Odin identity/backend and vendored Linux raylib archive without compiling.checkrunsodin check src -vet.testruns the headless deterministic Odin test package with vetting enabled.buildcreates a debug executable atbuild/archrogue.runbuilds and starts the debug game.releasecreates an optimized executable atbuild/archrogue.
Additional Odin arguments may be appended after the command.
Native Windows x64 CI produces a ZIP for GitHub releases and a separate Steam
depot. Use ./build.sh windows-package from Git Bash with the pinned Odin
compiler and VS 2022 x64 C++ tools. See Windows build instructions
for setup, audits, smoke testing, and outstanding hardware acceptance.
Android is a native NativeActivity package using the same Odin/raylib game loop as Linux. It targets API 35, supports API 28 and newer, and packages arm64-v8a, armeabi-v7a, and x86_64.
The pinned Android toolchain requires JDK 17, Android build-tools 35.0.0, NDK 28.2.13676358, and a populated offline Gradle/AGP cache. Start with preflight; it reports exact missing components.
./build.sh android-preflight
./build.sh android-debug
./build.sh android-install
./build.sh android-audit
./build.sh android-smoke --serial emulator-5554A signed release APK and AAB require the signing environment documented in android/README.md:
./build.sh android-releaseAndroid outputs are written under build/android/. See android/README.md for toolchain provisioning, application IDs, signing, AVD smoke testing, ABI auditing, and the NativeActivity/Back bridge.
src/ active Odin package: shared runtime, simulation, UI, and platform entries
assets/ sole canonical game-ready art, audio, shaders, fonts, and manifests
tests/ headless deterministic Odin tests plus repository/site contract tests
android/ pinned Gradle NativeActivity package and narrow Java platform shell
web/ pinned Emscripten contract, browser shell, JS bridge, and RAF driver
tools/ build, audit, asset verification, capture, smoke, and profiling tooling
tools/public-repo/ canonical workflows overlaid into the filtered public repository
vendor/raylib/ raylib 6.0 Odin binding and pinned Linux, Android, and Web archives
website/ GitHub Pages download-site source; CI stages the web build under play/
.github/workflows/ active CI entrypoints: private mirror automation or public release workflow
build/ generated local artifacts and validation evidence; never canonical source
arch-rogue-python/ archived read-only Python/Pygame implementation for historical reference
build.sh canonical Linux, Android, and Web command wrapper
The active Odin build must not read code or assets from arch-rogue-python/. assets/ is the only canonical runtime art tree.
Arch Rogue uses a commercially licensed third-party SFX library. Its runtime
WAV derivatives are not Apache-2.0 content and are excluded
from the public Git repository. The public tree retains
assets/audio/sfx/manifest.json as an integrity lock and
assets/audio/sfx/README.md with manual import/injection instructions. The game
and source checks degrade safely to silence when these files are absent; full
audio tests and release packages require an authorized complete injection.
Before mirroring source, private CI verifies the WAV set and automatically
creates or refreshes the arch-rogue-sfx-runtime.tar.gz asset on the private
sfx-runtime release. Public Linux, Android, and web jobs resolve the current
asset through that stable release tag, inject it independently, validate every
WAV against the committed manifest, and delete the downloaded bundle before
uploading only integrated game artifacts.
The public repository needs only one Actions secret:
ARCH_ROGUE_SFX_BUNDLE_AUTHORIZATION: the complete HTTP Authorization header value, such asBearer …, for a fine-grained token with read-only access tomattirk/arch-rogue-master.
The release API URL and asset name are stable, non-secret workflow constants.
An optional ARCH_ROGUE_SFX_BUNDLE_SHA256 environment value remains supported
for manual/custom runners, but public automation does not require it because
every extracted WAV is already locked by the manifest's SHA-256 and size.
Never store the bundle, raw source pack, or individual WAVs in the public repository, public workflow artifacts, public caches, or public release assets outside the integrated game distributions.
- Simulation uses a 60 Hz fixed timestep and seeded PCG streams. Rendering must not mutate simulation state.
- Simulation and content code remain raylib-free so the test package can run headlessly.
- Linux, native Android, and desktop WebAssembly/WebGL2 are the current release targets. The game-side Steam integration is built and a Steam release is being prepared; Windows now has native CI packaging pending runtime acceptance; multiplayer is coming soon and macOS is unsupported.
- The project is still awaiting final human side-by-side visual parity signoff and broader physical-device Android retesting noted in
PARITY.md.
Arch Rogue source and original project content are distributed under the Apache License 2.0. Third-party fonts, raylib, and licensed runtime SFX retain their own terms and are not relicensed under Apache-2.0. Required notices, bundled-dependency attribution, and the AI provenance/liability notice are in NOTICE.
raylib 6.0 is bundled under the zlib/libpng license; its complete text is in vendor/raylib/LICENSE, with Android archive provenance under vendor/raylib/android/PROVENANCE.md. Android packages include exact Arch Rogue and raylib license copies under their packaged assets/licenses/ directory.
The Arch Rogue name and octahedron crest are trademarks of the project author and are not granted for derivative branding by Apache-2.0.
See CHANGELOG.md for release history and current unreleased work.
