Overview
A single-player game shaped by a live audience
The player moves through a series of maps, fighting enemies, collecting keys, and working toward a final boss.
What makes it different is the audience. Spectators join using a session code and send actions live, either helping the player or making things harder.
Every run feels different, as both the player and the audience influence what happens in real time.
Screenshots
Key moments from the game client and spectator app
Game Client
SFML start screen
The title screen sets the tone straight away, using gothic visuals and a session code for spectators to join.
Spectator App
PWA login screen
The spectator app keeps the same style as the game, but uses a cleaner layout for login and session access.
Interaction
Action selection in the PWA
Spectators use a radial menu to quickly choose actions, keeping interaction fast and easy to follow.
Progression
Unlocked support options
Audience progression unlocks stronger actions, giving spectators a reason to stay involved throughout the session.
Boss Encounter
Turn-based finale
The final encounter shifts into a turn-based boss fight, changing the pace and showing a different side of the gameplay.
Base Enemy
Goblin
One of the two base enemy variants used for standard encounters and keeps the pressure on.
Base Enemy
Skeleton
The second base enemy that, along with the Goblin, keeps fights varied.
Enemy Roster
Brute
A tougher enemy that increases the challenge when hinder actions build up.
Enemy Roster
Boss
The final enemy challenge that the player must defeat to complete the game.
Gameplay Loop
Explore, fight, collect, survive
The core loop is simple...move through maps, fight enemies, collect items, and reach the boss.
The audience changes this at any moment, making each run feel different.
Spectator System
Live help and hinder actions
Spectators join using a session code and send actions in real time. They can help the player or make things harder by spawning enemies, slowing movement, or placing traps.
Help Actions
Support the player
- Heal the player during combat.
- Increase movement speed temporarily.
- Boost attack power.
- Apply a temporary shield.
- Unlock God Mode after sustained support.
Hinder Actions
Disrupt the run
- Spawn standard enemies near the player.
- Reduce movement speed.
- Temporarily lower attack damage.
- Drop a trap to block progress.
- Unlock brute spawns after repeated hinder actions.
Player Systems
Combat, items, HUD, and controller support
- 8-direction movement with keyboard or Xbox controller.
- Melee combat with directional hitboxes.
- Item hotbar for potions and collected keys.
- HUD showing health, session code, and spectator chat.
- Boss dialogue and turn-based final encounter.
Flow
How the system works
Game starts
The player enters the game client and a session code is generated for the run.
Spectators join
Users authenticate through the web app, enter the session code, and connect to the live session.
Actions are sent live
Help or hinder actions are sent as structured JSON messages over WebSockets and broadcast through the relay.
Gameplay reacts immediately
The game client applies buffs, debuffs, enemy spawns, and obstacles in real time, changing the run as it unfolds.
Technical Design
Distributed architecture across game, web, and backend systems
Game Client
C++, SFML 3.0, Boost.Beast, OpenSSL, TMX map loading, AI behaviour, combat, HUD, audio, and boss systems.
Spectator Interface
React 19, TypeScript, Vite, and PWA tooling provide the real-time audience control layer.
Relay and API
Node.js WebSocket relay handles message fan-out while ASP.NET Core 8 manages authentication, sessions, and persistence.
Design Focus
The system is designed to keep each part separate, while still working together in real time. This keeps things manageable while supporting live interaction.
What this project shows
Gameplay Engineering
Real-time combat, map progression, boss sequencing, inventory, and state management.
Networked Interaction
Low-latency spectator actions delivered through WebSockets and reflected in the game immediately.
Full-Stack Integration
The project brings together a game client, web app, backend, and database, all working together as a single system.
Screenshot