A top-down-ish twin-stick dungeon crawler built with Panda3D. Explore a procedurally generated dungeon that keeps growing as you explore — stepping into a new room can open a doorway to one that wasn't there before. Grab glowing orbs for score, dodge hazards, and gun down enemies that hunt you down.
- Orbs — collect them for points.
- Enemies — patrol their rooms until they spot you, then give chase. Shoot them down before they reach you. They keep spawning over time, so it never fully clears out.
- Hazards — glowing floor zones that burn you while you stand in them.
- Score — earned from orbs and kills, shown on the HUD alongside your health. Your best score is saved between runs and shown on the main menu.
| Input | Action |
|---|---|
| W A S D | Move (relative to where you're aiming) |
| Mouse | Aim / look, the camera and crosshair follow the mouse |
| Left click | Shoot |
| Mouse wheel | Zoom in / out |
| Space | Jump |
| Shift | Sprint |
Aiming, facing, and movement are all driven by the camera's forward direction, so the crosshair always marks exactly where your shots go including up and down when you tilt the view.
- Python 3.10+
- Panda3D 1.10+
# install dependencies (just Panda3D)
pip install -r requirements.txt
# launch the game
python main.pyThe pure-logic pieces (camera smoothing, scoring, high-score persistence) are covered by unit tests. From the repo root:
python -m unittest| Path | What's in it |
|---|---|
app.py |
Main App class — wires everything together and runs the game loop |
config.py |
Tunable constants (speeds, camera, spawning, collision masks) |
player/ |
Player movement, the follow/aim camera |
world/ |
Dungeon generation, rooms, lighting |
entities/ |
Orbs, enemies, hazards |
systems/ |
Collision, combat, scoring, audio, save |
ui/ |
HUD and menus |
utils/ |
Math helpers |
tests/ |
Unit tests |
Models:
- Wezu's p3d_samples, the amazing Panda-Chan model.
- ArsThaumaturgis's PandaSampleModels, other models like the walls of the dungeon
Audio:
- Obtaining orb sound: Item Get Inorganic.wav by SilverIllusionist -- https://freesound.org/s/411171/ -- License: Attribution 4.0
- Shoot sound: Laser FX #3 by danlucaz -- https://freesound.org/s/517763/ -- License: Creative Commons 0
- Damage sound effect: Damage sound effect by Raclure -- https://freesound.org/s/458867/ -- License: Creative Commons 0
- Ouch: Ouch ! by Legnalegna55 -- https://freesound.org/s/547344/ -- License: Creative Commons 0
- Room spawn: Earthquake M4 seismic sound by gfarge -- https://freesound.org/s/815484/ -- License: Attribution NonCommercial 4.0
- Ambient music: Ambient electronic music 001 by frankum -- https://freesound.org/s/328368/ -- License: Attribution 4.0
Released under the MIT License.