01 / Problem
C++ Game Prototype
Room Run Shooter
A small top-down extraction-shooter prototype built around an explicit frame pipeline and a readable three-room run.
Proof of C++ stateful systems, frame-order discipline, collision boundaries, and prototype scope control.
02 / What I built
Built a C++/raylib prototype with a three-room run, weapons, grenades, four enemy types, pickups, early or final extraction, an in-session stash, and pre-raid purchases.
System boundary
How the pieces connect.
One frame snapshots input, advances small systems over aggregate run state, resolves collisions and room decisions, then renders from the settled state.
- 01Input snapshot
- 02Player and combat
- 03Enemies and projectiles
- 04Collision resolution
- 05Room / extraction state
- 06Render
Engineering decision
Prototype architecture should make the experiment easy to read before making it easy to extend.
Tradeoff
Plain state and small systems keep the prototype direct and testable, while deliberately deferring extensibility, external room data, and editor tooling.
What happens next
External playtesting and tuning remain the next documented phase; no public playtest outcome is claimed yet.
Implemented proof
What can be evaluated today.
All documented prototype feature phases are implemented, while graphics and content remain intentionally minimal.
- 01
Implements a three-room run with optional room-two extraction and final-room extraction.
- 02
Includes pistol and shotgun state, dash, grenades, four enemy types, and multiple pickup types.
- 03
Separates per-raid state from an in-session player profile and stash.
Source proof
A decision visible in code.
update_player(state.player, input, delta_time, current_room.bounds);update_weapon_pickups(state);update_loot_pickups(state);update_weapon(state.player.weapon, input.reload_pressed, delta_time);try_fire_player_weapon(state, input, muzzle_position, aim_direction);try_throw_grenade(state, input, aim_direction);update_enemy_attacks(state, delta_time);update_bullets(state.bullets, delta_time, current_room.bounds);update_bullets(state.enemy_bullets, delta_time, current_room.bounds);update_grenades(state, delta_time, current_room.bounds);resolve_collisions(state);update_room_state(state);update_room_transition(state);update_extraction(state, delta_time);update_feedback_timers(state, delta_time);render_game(state, assets, profile);
Collision and room state settle before extraction, feedback, and final rendering.
Next case study
NovionOS