A story-driven, top-down action-RPG set in the Luhya/Abawanga world of Nabongo Mumia โ built from scratch in Odin + raylib.
Three acts, nine procedurally-generated levels, nine bosses, an adaptive learning AI, and a narrated prologue. You are Wekesa, the Nabongo's shield, sent to reclaim the stolen great Drum of Wanga โ and to cleanse the blight and wildwood beyond.
- Screenshots
- What is this?
- The Three Acts
- Quick Start
- Controls
- Gameplay Systems (combat ยท leveling ยท adaptive difficulty ยท bosses ยท quests ยท procedural generation)
- Project Layout
- Tools & Asset Pipeline
- Documentation
- Roadmap
- Contributing
- License
- Credits & Attribution
| The Catacombs (Act I boss) | The Cursed Land (Act II) | The Fantasy Forest (Act III) |
|---|---|---|
![]() |
![]() |
![]() |
| Full map (M / Tab) | Journal (objectives) | Fast-travel |
|---|---|---|
![]() |
![]() |
![]() |
Nabongo is a complete, self-contained action-RPG written without a game engine โ just the Odin standard library and raylib for windowing, input, drawing and audio. Everything else (the tilemap renderer, animation system, combat, AI, pathfinding, procedural level generation, quest engine, menus, save system) is hand-built and lives in this repo.
It is also a small history project: the story, names and places draw on the oral history of Nabongo Mumia and the Wanga kingdom of western Kenya.
โ ๏ธ Assets are not included. The character/tileset/UI art is a commercial CraftPix.net pack whose license forbids public redistribution, so it is gitignored. The code, maps, generated music/narration and (CC0) sound effects are here; see docs/ASSETS.md to obtain the art and run the game with visuals.
The campaign is a single 21-objective quest line across three distinct environments, each a 3-level procedural sub-world with its own art, foes and bosses.
Act I โ The Dungeon ยท reclaim the Drum (3 levels ยท 3 Gorgons)
| Level | Theme | Boss |
|---|---|---|
| The Catacombs | flagstone crypt | Inanyi, the Ash-Mouthed (Gorgon โ two-phase evolution) |
| The Cursed Grove | crimson-washed crypt | Sirull, the Bone-Crowned |
| The Ash Barrows | ashen-green crypt | Nyangwe, the Drum-Eater (holds the Drum) |
The Gorgons are side-view strip-animated bosses with personality dialogue, a surprise mid-fight transformation (a second health bar), and lair-locked arenas.
Act II โ The Cursed Land ยท cleanse the blight (3 levels ยท 3 warlords)
Cracked red earth and root-overgrowth. Enemies are orcs, slimes and plants.
| Level | Boss (giant "warlord" elite) |
|---|---|
| Bleeding Fields | Kamabeka, the Bramble Maw (giant plant) |
| Marrow Mire | Mukhwana, the Mire Mother (giant slime โ splits on death) |
| Heart of Rot | Sululu, the Rot-Chief (giant orc) |
Act III โ The Fantasy Forest ยท free the wildwood (3 levels ยท 3 warlords)
Bright grass clearings walled by dense canopy.
| Level | Boss |
|---|---|
| Wildwood Eaves | Sirikwa, the Thorn King (giant plant) |
| Hollow Deep | Nasimiyu, the Bog Mother (giant slime) |
| Heartwood | Mwambu, the Elder Tusk (giant orc) |
Every lair is a sealed single-entrance arena opened by finding and pulling a hidden lever โ the dungeon puzzle. Each of the nine levels has 6 baked layout variants, and the game picks one at random on entry, so every descent is different.
You need the Odin toolchain (which bundles raylib 5.5). See https://odin-lang.org/docs/install/.
Linux / WSL
git clone https://github.com/nyongesa637/nabongo-lion-of-wanga.git
cd nabongo-lion-of-wanga
# 1) Add the art assets (not in the repo) โ see docs/ASSETS.md
# 2) Build & run:
odin run src -out:build/nabongoWindows (required for gamepad)
WSL does not pass USB controllers through to Linux processes, so gamepads only work in a native Windows build.
- Install Odin for Windows and put it on
PATH. - From a Windows terminal in the project folder (reachable from WSL at
\\wsl.localhost\<distro>\home\<you>\Projects\Nabongo, or copy it toC:\Nabongo):build_windows.bat
- Run
nabongo.exewith theassets\folder beside it and your controller connected.
Odin cannot cross-link Linux โ Windows, so the
.exemust be built on Windows.
Screenshot / headless mode
The binary accepts a shot <screen> argument that loads a scene, renders a few frames
and writes a PNG โ used to verify the game without a display:
./build/nabongo shot forest # menu | dungeon | cursed | ash | land | forest | map | journal | travel | inv | โฆFully rebindable in Settings โ Controls, with a keyboard/mouse vs. controller device toggle.
| Action | Keyboard | Gamepad |
|---|---|---|
| Move | W A S D / Arrows |
Left stick / D-pad |
| Attack | J |
A / โ |
| Sprint | hold a direction | (auto) |
| Interact / talk / lever | E |
B / โฏ |
| Inventory | I |
Y |
| Map (mini โ full) | M / Tab |
โ |
| Pause / Journal / Travel | Esc |
Start |
Combat moves: a tight melee swing, a 2-hit combo (press attack again during recovery), and a run-lunge (attack while sprinting). Health is staged: 3 โ 5 โ 7 hearts as you reach new tiers.
Combat & movement
- Feet-box collision against walls and solid bodies (you can't walk through enemies).
- Tight, close-range hitboxes; i-frames on hit; knockback.
- Hit sparks + screen shake on impact; enemies flash on damage.
- Y-sorted rendering so actors layer correctly with walls and each other.
Leveling & a deliberately steep curve
- XP from kills โ levels (cap 10), with sprite tier-ups at L4 and L8.
- Health grows only at tier-ups (3/5/7); damage grows every other level.
- Reaching the cap takes a whole thorough run, not a few rooms.
Adaptive, learning difficulty
- Three settings (Easy / Normal / Hard) plus an adaptive nudge that eases when you keep dying and tightens when you breeze through.
- Enemies scale to your level and the zone depth, so a maxed-out hero still meets a real fight instead of one-shotting everything.
- Foes "learn": aggression, flanking and attack tempo rise as you win.
Enemy AI & pathfinding
- A shared flow-field (one BFS from the player per tile-change) routes every foe around walls โ no more getting stuck on corners.
- Foes run when far, flank to surround when close, and coordinate so only a few strike at once while the rest pressure from angles.
- Per-creature movesets: orcs charge / poke / swing; plants spit venom and lunge-bite; slimes hop and split into minis on death.
Bosses
- Gorgons (Act I): side-view strip-animated, two-phase with a transform + second health bar, dialogue, and arena-lock.
- Warlords (Acts IIโIII): giant orc/slime/plant elites with a screen-spanning health bar, a name-reveal banner, capped hits, and a big reward.
Quests, waypoints & navigation
- A 21-objective main quest across three acts (see the in-game Journal, which scrolls).
- A pulsing waypoint points at the current target (lever โ boss โ deeper portal), and an edge-arrow when it's off-screen.
- A baked minimap + full map (M/Tab) with markers, and a pause-menu Travel to fast-travel to any place you've reached.
- An NPC toll: the ferryman charges 3 cowries for the south passage.
Procedural generation
- BSP room partition โ guaranteed-connected rooms + corridors.
- A final room is carved into a larger boss arena, then sealed to a single gated door wired to a hidden lever.
- Autotiled dungeon walls; dirt+overgrowth and grass+canopy themes for the outdoor acts.
- 6 seeded variants per level, baked to TMX; chosen at random per entry.
- All generators live in
tools/(see below).
src/
main.odin # game loop, modes, menus, HUD, camera, transitions, waypoints
engine/ # reusable, game-agnostic layer
assets.odin # lazy (character,state) animation-clip registry
anim.odin # 4-direction + strip sprite animation
tilemap.odin # TMX render + collision grid + runtime door-opening
tmx.odin # custom TMX (XML/CSV) parser
input.odin # unified, rebindable keyboard + gamepad
audio.odin # music + SFX + narration
...
game/ # the game itself
player.odin enemy.odin boss.odin projectile.odin effects.odin
difficulty.odin quest.odin world_items.odin pathfind.odin
inventory.odin minimap.odin save.odin story.odin
tools/ # Python generators + asset pipeline (see below)
assets/maps/ # generated Tiled maps (.tmx) โ kept
assets/audio/ # generated music + narration, Kenney SFX โ kept
assets/{sprites,tiles,ui}/ # CraftPix art โ NOT in the repo (see docs/ASSETS.md)
docs/ # ARCHITECTURE, STORY, ASSETS, PLAN, screenshots
build_windows.bat # native Windows build (gamepad)
All in tools/ (Python 3). They generate the maps and audio that ship in assets/.
| Tool | Purpose |
|---|---|
gen_dungeon.py |
Act I โ BSP catacombs/grove/barrows + Gorgon arenas (6 variants each) |
gen_cursed.py |
Act II โ 3 cursed-land levels + warlord arenas |
gen_forest.py |
Act III โ 3 forest levels + warlord arenas |
gen_elureko.py |
the Elureko hub town (roads + NPCs) |
mapgen.py |
shared TMX builder + tile vocabulary |
gen_music.py |
NumPy-synthesised OGG soundtracks (menu/town/dungeon/boss) |
narrate.py |
Piper TTS deep-narrator prologue (venv in tools/ttsenv, gitignored) |
python3 tools/gen_dungeon.py all # regenerate all dungeon variants
python3 tools/gen_cursed.py all
python3 tools/gen_forest.py all| Doc | Contents |
|---|---|
| docs/ARCHITECTURE.md | engine/game split, systems, data flow |
| docs/STORY.md | the narrative, characters and the three acts |
| docs/ASSETS.md | how to obtain the CraftPix art and place it |
| docs/PLAN.md | the original phased build plan |
| CONTRIBUTING.md | how to build, propose changes, and the asset rule |
| CODE_OF_CONDUCT.md | community standards |
| SECURITY.md | how to report issues |
- Bespoke boss sprites for the warlords (currently scaled orcs/slimes/plants)
- Dedicated wolf creature wired from the wolf sheets
- More puzzle types (pressure plates, hidden rooms, keyed doors)
- Runtime (in-engine) generation so seeds change without baking variants
- Save slots & New Game+
Issues and pull requests are welcome โ please read CONTRIBUTING.md
and the CODE_OF_CONDUCT.md first. The one hard rule:
never commit the CraftPix art (it's gitignored for a reason โ see docs/ASSETS.md).
This project's original work (code, maps, generated audio, docs, screenshots) is released under the PolyForm Noncommercial License 1.0.0.
You may read, learn from, run and modify it for non-commercial purposes. You may not sell it or use it (or derivatives) for commercial advantage without a separate written agreement. ยฉ 2026 Nimrod Nyongesa (@nyongesa637).
Third-party assets are not covered by this license and are not redistributed here.
- Code, design, story, maps, music & narration: Nimrod Nyongesa (@nyongesa637).
- Art: CraftPix.net (characters, tilesets, UI) โ under CraftPix's license, obtained separately.
- Sound effects: Kenney.nl โ CC0.
- Engine/tools: Odin, raylib, Piper TTS, NumPy.
- Story inspiration: the oral history of Nabongo Mumia and the Wanga kingdom.






