Realtime .NET runtime that launches game variants, manages controller communication, executes game logic, and coordinates restart flow with the kiosk system.
30+ game variants
8 game rooms
.NET console runtime
Socket + controller communication
5-10ms optimized custom sensor latency
Basket Room - realtime score-driven throwing challenge
The Game Engine is a .NET console application launched by the Kiosk Host with the runtime arguments required to run a session.
These arguments include:
The engine is responsible for:
It acts as the runtime core of each room.
The engine sits between the kiosk host and the physical controller layer, turning controller events into gameplay state and streaming runtime status back to the room system.
The general runtime flow is handled by Program.cs and BaseGame.cs.
BaseGame begins the shared gameplay lifecycleBefore gameplay begins, the communication handler verifies:
If validation succeeds:
When the game ends:
Then:
The runtime is divided into three major layers:
This contains the gameplay rules and progression system.
At the core is:
BaseGame -> shared logic for all gamesGame logic is organized by:
This structure allowed shared systems while still supporting unique gameplay behavior for each room.
Communication handlers are responsible for controller/device communication.
Their role is to:
Most handlers were built around:
These worked using RS422 -> Ethernet communication.
Some games also used:
The engine also coordinates room-specific external devices as part of gameplay flow, depending on the variant and room.
At the beginning, the Game Engine was integrated directly into the Kiosk Host because only two rooms existed.
At that stage:
As the facility expanded, it became obvious that both the kiosk and the runtime logic would grow into large independent systems.
So the engine was separated into its own application.
During testing, rooms could break 10-20 times per day, often due to multithreading and runtime synchronization issues.
Over time we:
Once the first two rooms became stable and the public response was positive, the facility expanded.
That expansion changed the scale of the project significantly:
At the beginning, I was not experienced with:
I had to learn by building:
The more I built, the more progress I made, and the more interesting the work became.
A major challenge came when working on the Laser game.
The setup included:
Initially, data was sent using string-based messages made of "0" and "1" values.
That meant:
To fix this:
Then I improved it further:
That reduced latency to roughly 5-10ms, which made the Laser game feel smooth and playable.
To run properly, the engine depends on many concurrent processes such as:
At key events like:
all of these threads needed to stay synchronized.
Early issues included:
To solve this, I gradually moved the major shared event handling into the BaseGame layer.
That made it easier to centralize state transitions and update threads in a coordinated way without breaking the runtime.
I was one of the main contributors to the runtime foundation of the Game Engine.
My work included:
In the early stage, I spent a lot of time building the base architecture that later made scaling possible.
Once that base became stable:
As the project grew, we expanded the team. At that point, I also:
Core tools and technologies used in this project.
Core technologies
Supporting technologies