Selected Work

Portfolio

Game design, systems work, and production. Two projects in active development, plus media I produced during my time at Futuregames.

Tomorrow's Gonna Be a Long Day promotional banner

Narrative Horror, Unity

Tomorrow's Gonna Be a Long Day

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?

View on Steam

Core features

  • A work week that starts routine and quietly falls apart.
  • Ticket triage as the central mechanic, where every choice shapes tone, relationship, and outcome.
  • A growing chorus of customer voices that carry the real weight of the horror.
  • Mood, repetition, and ethical strain as the engine driving it all.

Themes

  • Work as the slow erosion of self.
  • Technology as a form of custody.
  • Language as a tool of control.
  • The quiet terror of being useful to the wrong thing.
Tomorrow's Gonna Be a Long Day key art: an empty cubicle office

From the editor

Work-in-progress captures straight out of Unity, editor chrome and all. Click any image to enlarge.

Deserted city street at dusk in the Unity game view City street, one of the between-shift dream spaces.
Service Inbox ticket queue in the Unity game view Service Inbox, the ticket triage core loop.
Unity scene view of the bedroom set with lighting gizmos Bedroom set, scene view with lighting and camera gizmos.

Tools I built

Designer-facing Unity components, so content can be authored in the inspector without new code.

Unity inspector for the custom Inspectable3D component

Inspectable3D

Lets 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.

Fake Pizza Hotline flyer shown in the in-game 3D inspector An inspectable prop, rotated and read in-world.
Unity inspector for the custom Examine Note component

ExamineNote

The 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.

Office walkthrough, roughly two minutes. Press play to load.
Main menu and title treatment.
Battles of Prophecy logo
Battles of Prophecy random encounter dialogue: a locked treasure chest with three choices

Multiplayer Autobattler, Godot and Go

Battles of Prophecy

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.

giantsbane.games

Architecture

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.

Anti-cheat

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.

Async prototype

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.

Async mode prototype in ebiten. Press play to load.

From the editor

Working captures from Godot, editor windows included.

Godot editor with two Battles of Prophecy clients running live PvP against a server node 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 layout for Battles of Prophecy Early async PvE board, from when the async mode was launching.

More of my games

Most of my released work lives under the Frosty Pixels label.

frostypixels.com itch.io Steam