Five years building games, three professionally. Sole gameplay programmer on a UE5 co-op open-world pirate action-adventure with a publicly exhibited demo; client developer on a live-service mobile ARPG in closed beta. I build gameplay systems — AI, navigation, physics-driven movement, UI and LiveOps infrastructure — and I test what I build.
A co-op open-world pirate action-adventure. I was the only gameplay programmer on the team: every gameplay system in the publicly exhibited demo — sailing, naval combat, enemy and crew AI, the crew-management layer, destruction, UI and the co-op replication underneath — is my work.
Ships in Grog 'n Glory are physically simulated hulls driven by wind and rudder — stock UE navigation can't steer them. I built a custom system: routes planned over a grid-based cost field where every hand-placed danger zone carries a power level, so a zone is only dangerous relative to the ship evaluating it. Weak ships route around waters a flagship sails straight through; a fully surrounded ship escapes through the weakest zone rather than freezing. The follower steers with the ship's real maneuverability in mind — starting the turn before the corner, the way a helmsman does — and routes re-solve when zones move, power levels change, or the ship is knocked off course. One system served both enemy fleets and the player's own autopilot.
Development footage from the editor: the planner's cost field, a danger zone's power level being changed live, and the route re-solving as a result.
The core ideas are re-implemented from scratch in my open-source naval-navigation-sample — same thinking, brand-new code, 30 in-engine tests plus a 600-assertion engine-free harness.
The demo's signature system: a crew of fifteen split across three roles — gunners, sailors, repairers — reassigned live through a radial triangle menu. Drag the pin toward gunners and more cannons fire; toward sailors and the ship turns faster; toward repairers and the hull regenerates. Ammo types (round shot, shrapnel, chain) target hull, crew, and sails respectively, so mid-fight reallocation is the tactical heart of naval combat.
Seven sailors and four gunners meant fast manoeuvring but only two of five cannons could fire. Reallocating to ten gunners brought all five guns online. The crew is one pool: speed and firepower are bought with the same currency, and a fight is a series of decisions about which one you need in the next ten seconds.
Gameplay from the demo: crew reassigned and ammunition switched mid-engagement, in one continuous take.
A mobile ARPG in closed beta. I develop the client: the FairyGUI-based UI architecture, the event-driven Lua layer and hot-update infrastructure that lets LiveOps ship behavior without app-store releases, client–server communication and state synchronization, and the pooling work that keeps it fast on mid-range phones.
Production code is private — so the architecture is demonstrated in my open-source ui-reddot-system: a hot-updatable notification system in the same Unity · FairyGUI · xLua stack, built from scratch.
Workplace code stays private, so these three repos re-implement the ideas from scratch — small, focused, and heavily tested. Each one states its own limits in its README, including what the test suite does not cover and how that was found.
Unity · C# · xLua · FairyGUI · a LiveOps A/B testing framework: deterministic layered bucketing, exposure telemetry, a sample-ratio-mismatch guardrail, kill switches, and variant behavior delivered as hot-updatable Lua.
dotnet test in CI and again
inside Unity, plus 118 Unity-only EditMode tests and 42 PlayMode tests
UE 5.5 · C++ · threat-aware pathfinding over a sea-grid cost field, a wind-driven sailing model, and a predictive helmsman that starts turns before the corner. Event-driven replanning with hysteresis; escape-through-the-weakest-zone behavior.
Unity · FairyGUI · xLua · a production-shaped red-dot notification system: rules as hot-updatable Lua data, type+key dot identities with page-scoped lifecycles, token-based seen tracking, and an event-queue/flush pipeline — no polling anywhere.