← All Projects Team Project · Studio · 2025

Artificial
Overthrow

A first-person arcade shooter built in Unreal Engine 5 as a criticism of generative AI. As the sole systems designer, I built every gameplay system — enemy AI, weapons, the EMP, spawning, and save/persistence — and shipped the build to Steam myself.

EngineUnreal Engine 5
RoleSole Systems Designer
ScriptingBlueprints
TeamTeam Project · 20 Weeks
PlatformPC · Steam
StatusShipped · Playable
UE5 Behavior Trees Enemy AI Weapon Systems Build & Ship

// Gameplay Trailer

// Enemy AI — Behavior Tree in Action

Watch the tree think

Left is the Roller in-game; right is its Behavior Tree running live. As it spots the player the active nodes light up and it moves through its states — detecting, chasing, and attaching — in sync with what's on screen.

It's the same tree broken down below: a Selector prioritizing states, fed by custom services and a drop-and-fall task.

// The Concept

Fighting the slop

AI slop has overtaken a robotics HQ and corrupted its machines. You're the last security guard left — reduce the rogue creations to scrap using two weapons and scattered EMPs in fast, relentless, no-breaks combat.

The game is a deliberate criticism of generative AI: the enemies and environment are built from found, pre-existing AI imagery. The thing you're fighting is literally made of the thing the game critiques.

A complete slice in 20 weeks

Built by a small team on a 20-week timeline, the game is a finished, shippable vertical slice: two levels and an ending, two guns, four enemy types, an EMP device, and several puzzles — with a full Steam store page.

As the sole systems designer, I owned effectively every interactive system, plus packaging, building, and the Steam release pipeline. The only work outside my scope was map layout, Niagara VFX, and two small UI hookups.

// Enemy AI — Two Architectures

BB_Roller blackboard keys
BB_Roller — blackboard keys the tree reads and writes

State-driven, blackboard-fed

The Roller runs on a Behavior Tree + Blackboard. A Selector prioritizes three states — Attached, Falling, Chasing — each gated by a blackboard decorator on RollerState.

Custom services keep it reactive: BTService_Detect checks for the player on a 0.1–0.3s tick, and BTService_UpdatePlayerLocation refreshes the chase target every 0.05s. A custom task, BTTask_DropAndFall, handles the drop from a surface. Writing my own services and tasks — not just wiring existing nodes — is where the real AI work is.

BTService_Detect logic
BTService_Detect — line-of-sight / range check that flips the Roller's blackboard state Custom BT Service
Flyer state machine switch on E_FlyerState
BP_Flyer — Event Tick state detection feeding a Switch on E_FlyerState (Patrolling / Heading to Reload / Reloading / Exit Reload) Blueprint State Machine

Same goal, different tool

Where the Roller uses a Behavior Tree, the Flyer runs on a hand-built Blueprint state machine driven by an E_FlyerState enum. Each tick evaluates conditions and routes through a Switch into the active state's logic.

Building enemies two ways — a BT for the Roller, a custom state machine for the Flyer — was a deliberate choice to fit each enemy's needs and to demonstrate range across AI architectures.

E_FlyerState enum
E_FlyerState — the enum that drives the machine
Flyer patrolling branch
Patrolling branch — waypoint indexing and movement
Flyer heading-to-reload path logic
Heading to Reload — the Flyer breaks off, flies a reload path, then returns to patrol Flyer State

// Combat Systems

EMP full Blueprint graph
EMP — organized into phases: material prep, trace-and-disable, ground-hit detonation, and pickup/throw EMP System

The panic button

The EMP is a throwable crowd-control device — the game's risk/relief beat. On detonation it runs a multi-sphere trace in a blast radius, then a for-each loop disables each caught enemy by type (Flyer, Roller, Turret, Tank), applies a VFX and material blend, and despawns.

It's pickup-and-throw with detonate-on-bounce ground detection, so positioning it under a swarm is a real tactical decision when you're about to be overrun.

EMP disable-by-type loop close-up
Trace → for-each → disable-by-type → detach — the core of the mechanic
Shockgun line-trace effects
ShockGun — line-trace hit resolution and impact effects

Weapon feel, end to end

Both guns were built from the ground up — firing, ammo, and feel. The Shockgun combines a line trace with projectile and impact VFX and camera shake, so hits read with weight and enemies visibly break down to scrap.

Weapon switching, input, movement, and world interaction all run through the player Blueprint I built, organized into named functions and categorized variables rather than one tangled graph.

// Encounter & Persistence Systems

Drone spawner variable relay
BP_Spawner — spawns drone clusters and relays per-drone data (patrol points, reload path, speed) to each new enemy Spawner

A spawner with a difficulty dial

The spawner manages drone clusters and hands each new enemy its own data — patrol points, reload path, and speed — as it spawns. Slow, normal, and fast spawn tiers let the encounter's intensity be tuned, which is what sells the game's "no breaks" feeling.

State that survives level loads

A save/persistence chain carries player state — health, shield, ammo, keycards, kill count, elapsed time — across level transitions and into the level-swap setup, so progress isn't lost between the game's two levels. Under the hood the game uses a component-based, event-driven architecture (health and shield components fire dispatchers that drive the HUD).

Player variable save and level-swap setup
PlayerVariableChainSave & LevelSwapSetup — persists player state across level loads Save / Level Swap

// EMP — In Action

Clear the swarm

The EMP in the field — the throwable that buys you space when you're about to be overrun. Land it under a cluster and everything caught in the blast disables at once.

The trace-and-disable-by-type logic behind it is broken down in the Combat section above.

// What I Owned

AI

Two enemy architectures

Behavior Tree + Blackboard for the Roller (with custom services and tasks), and a hand-built enum state machine for the Flyer — each chosen to fit the enemy rather than forced into one pattern.

Combat

Weapons & the EMP

Both guns end to end, plus the EMP's trace-and-disable-by-type crowd control with detonate-on-bounce throwing — the mechanic that gives the combat its risk/relief rhythm.

Systems

Spawning & persistence

A cluster spawner that relays per-drone data with tunable difficulty tiers, and a save chain that carries player state across level loads — built on component-based, event-driven architecture.

Shipping

Built and shipped to Steam

I packaged and built the game and set up the Steam release pipeline on my own machine — taking it from prototype to a live store page. Owning the full pipeline is uncommon for a designer.

← All Projects