A DOOM-inspired 3D first-person shooter with sprite-based enemies, split-screen multiplayer, and data-driven design
Daemonstein is a 3D first-person shooter inspired by classic DOOM. Players control a Marine (100 HP) armed with a Pistol and Plasma Rifle, fighting through tile-based maps populated by Demon enemies (160 HP) that use sight-based AI with a 120° field of view. The game supports local 2-player split-screen via a lobby system, with both keyboard/mouse and Xbox controller input.
Built as a course project at SMU Guildhall, the game runs on a custom Daemon Engine providing DirectX 11 rendering with diffuse lighting, FMOD 3D audio, sprite-based 8-directional animations, and a developer console with V8 JavaScript integration.
- Sprite-based 8-directional enemies — Demons rendered as billboarded sprites with walk, attack, hurt, and death animations from 8 viewing angles
- 3 weapon types — Pistol (hitscan, 10–15 dmg), Plasma Rifle (projectile, rapid-fire), and Demon Melee (180° arc, AI-only)
- Local 2-player split-screen — Lobby-based join system with horizontal viewport splitting and independent cameras
- Sight-based AI — Enemies detect targets within a 64-unit radius and 120° cone, chase using turn-toward steering, and engage in melee range
- Data-driven design — XML files define all actors, weapons, maps, tiles, and spawn configurations
- Visual Studio 2022 (or 2019) with C++ desktop development workload
- Windows 10/11 (x64)
- DirectX 11 compatible GPU
- Daemon Engine cloned as a sibling directory
# Clone both repos side by side
git clone https://github.com/dadavidtseng/Engine.git
git clone https://github.com/dadavidtseng/Daemonstein.git
# Directory layout should be:
# ├── Engine/
# └── Daemonstein/- Open
Doomenstein.slnin Visual Studio - Set configuration to
Debug | x64 - Build the solution (the Engine project is referenced automatically)
- The executable is deployed to
Run/via post-build event
| Action | Key |
|---|---|
| Move | W / A / S / D |
| Look | Mouse |
| Shoot | Left Mouse Button |
| Sprint | Shift |
| Switch to Pistol | 1 |
| Switch to Plasma Rifle | 2 |
| Free camera toggle | F |
| Possess next actor | N |
| Action | Button |
|---|---|
| Move | Left Stick |
| Look | Right Stick |
| Shoot | Right Trigger |
| Sprint | A |
| Switch weapon | D-Pad Up / Down, X / Y |
| Action | Key |
|---|---|
| Developer console | ` |
- Attract Mode — Title screen (press Space or Start to join)
- Lobby — Players join/leave; press Space/Start again to begin or add a second player
- In-Game — FPS combat on tile-based maps (TestMap, MPMap)
Launch Run/Doomenstein_Debug_x64.exe from the Run/ directory (working directory must be Run/ for asset loading).
Daemonstein/
├── Code/Game/
│ ├── Definition/ # Data-driven definitions
│ │ ├── ActorDefinition # Actor stats, visuals, sounds, inventory
│ │ ├── MapDefinition # Map image, spawn info, tile sheets
│ │ ├── TileDefinition # Tile type properties
│ │ └── WeaponDefinition # Weapon stats, HUD, projectiles
│ ├── Framework/ # Application framework
│ │ ├── Main_Windows.cpp # WinMain entry point
│ │ ├── App # Application lifecycle
│ │ ├── GameCommon # Global pointers and constants
│ │ ├── Controller # Base controller (viewport, cameras)
│ │ ├── PlayerController # Keyboard/mouse & gamepad input
│ │ ├── AIController # Sight-based enemy AI
│ │ ├── Animation # Sprite animation playback
│ │ └── AnimationGroup # 8-directional animation sets
│ ├── Gameplay/ # Core game logic
│ │ ├── Game # State machine, lobby, split-screen
│ │ ├── Map # Tile world, raycasting, actor management
│ │ ├── Actor # Entity with physics, combat, inventory
│ │ ├── Tile # Individual tile in the grid
│ │ ├── Weapon # Hitscan, projectile, melee systems
│ │ ├── HUD # Weapon sprite, reticle, health display
│ │ └── Sound # FMOD audio wrapper
│ └── Subsystem/ # Engine subsystems
│ ├── Light/ # Diffuse lighting
│ └── Widget/ # UI widget framework
├── Run/ # Runtime directory
│ ├── Data/Audio/ # SFX + music (WAV, MP2, MP3)
│ ├── Data/Definitions/ # XML config (Actors, Weapons, Maps, Tiles)
│ ├── Data/Fonts/ # Bitmap fonts (PNG)
│ ├── Data/Images/ # Sprite sheets and textures
│ ├── Data/Maps/ # Map images (PNG, 32×32 grids)
│ └── Data/Shaders/ # HLSL shaders (Default, Diffuse)
├── Docs/ # Documentation
└── Doomenstein.sln # Visual Studio solution
Copyright 2025 Yu-Wei Tseng
Licensed under the Apache License, Version 2.0.
Yu-Wei Tseng
- Portfolio: dadavidtseng.info
- GitHub: @dadavidtseng
- LinkedIn: dadavidtseng
- Email: dadavidtseng@gmail.com