Game design, systems work, and production. Two projects in active development, plus media I produced during my time at Futuregames.
You are the last human in the loop. Every ticket is someone's life. Every response is a choice.
A narrative horror game about surviving one work week as a support agent at a company that quietly owns the things people need to live: their homes, their medicine, their transit, their warmth. Every subscription can be revoked. Every complaint can be reframed. The voices on the other side of the screen shift from annoyed to afraid.
Your humanity doesn't break all at once. It erodes, ticket by ticket, until the nightmares start. How long before you can't tell the difference between company policy and cruelty?
Work-in-progress captures straight out of Unity, editor chrome and all. Click any image to enlarge.
City street, one of the between-shift dream spaces.
Service Inbox, the ticket triage core loop.
Bedroom set, scene view with lighting and camera gizmos.
Designer-facing Unity components, so content can be authored in the inspector without new code.
Inspectable3DLets any prop be picked up and examined without bespoke code. Everything a scene needs is exposed in the inspector: interaction collider and auto-layering, inspect distance, scale and zoomability, smooth transition speed, per-axis rotation constraints and sensitivity, panning, an optional text overlay with its own toggle key and typography override, pickup, putdown and rotation sounds, plus start and end UnityEvents.
The flyer below is this component doing its job.
An inspectable prop, rotated and read in-world.
ExamineNoteThe click-to-examine companion. It zooms the camera onto an object and raises its dialogue text, which is how the environment delivers context clues and the player's own internal thoughts.
Each note carries its own presentation: message and display duration, a per-note typography override for font, size and colour, anchored screen position with padding and max width, and a typewriter reveal at a set characters-per-second. Per-letter sounds are drawn from a pool with a minimum delay, random sequencing, and the option to skip whitespace, so text never reads as one flat tone.
A hex-based autobattler with live PvP and an asynchronous mode, built at Giantsbane, whose website I also built.
The screenshot above is our random encounter system, branching choice prompts layered on top of the board. Alongside it we got live PvP running on a live server node, and prototyped an async play mode for players who can't sit down for a full match.
Godot on the client, with a network backend on Redis and PostgreSQL. Every autobattler fight is simulated on the server and the result is sent back for the client to replay, so the client never decides an outcome.
PostgreSQL handles long-term storage. Redis carries the player while they are online and playing, chosen for its speed and for its morph and mutex capabilities.
I'm currently building an early anti-cheat pass that flags impossible gold and impossible experience: totals a legitimate session could not have produced. It runs entirely server side, like everything else that decides state.
The first pass at async mode was built in ebiten, a 2D game library for Go. It was a throwaway prototype meant to be ported into our own Go protobuf system once the rules settled.
Working captures from Godot, editor windows included.
The moment live PvP came up on a live server node: two debug clients, the Godot inspector, and the damage log all at once.
Early async PvE board, from when the async mode was launching.
Video and stream production I produced or co-produced during my employment at Futuregames.
Coverage of Futuregames' Skellefteå campus in Norran.
Most of my released work lives under the Frosty Pixels label.