joecgo.com

Software engineer · Autonomous behavior

Joe Goldman

From game NPCs to real robots.

I build the logic that decides what a character does next. Since 2018 I've worked on NPC and enemy behavior for shipped games, including The Last of Us Part II and Killing Floor 3. Now I'm applying the same techniques to robots, where sensors are noisy, positions drift and safety comes first.

HIDING Testing spots for line of sight tick 00000 · 20 Hz
How the hide-and-seek drone picks a spot: test spots 2–5 m from the launch point for line of sight, fly to one with a wall in between, land and cut the motors. Illustration with time compressed.

Personal work, open source

Projects

Status
In progress
Runs on a mock drone; flight tests next
Started
2026
Language
Python 3.12
Tools
cflib, pytest, pyright (strict), ruff, GitHub Actions
Hardware
Crazyflie 2.1+ with Flow, Multi-ranger and Buzzer decks

crazyflie-behavior

Hide-and-seek drone

A Crazyflie nano drone that plays hide-and-seek with a small child, built with techniques from game NPCs: a map of the room, hiding-spot selection and line-of-sight checks, on a robot whose sensors are noisy and whose position drifts.

While the child waits behind a gate, the drone flies off, lands behind a wall and turns its motors off. The child hunts for it, helped by a flash-and-chirp hint every 15 seconds. When they pick it up, it lights up and the computer plays a fanfare.

Design decisions

  • Safe because of how the game works

    The drone flies only while the play area is empty, then lands and stops its motors before the search begins. A child only ever meets a drone with its motors off.

    ADR-0016
  • One narrow path to the motors

    Only the safety layer commands the drone. The operator's kill switch is the single exception: it can only cut the motors, and it runs on its own thread so it still works if the tick loop hangs.

    ADR-0008 · 0013
  • It always lands

    Touchdown counts only on a steady downward range reading. Without one, a slow final descent continues until a time limit, so a failing sensor can't cut the motors in mid-air.

    ADR-0012 · 0019
  • Game instincts, robot rules

    A game keeps playing and logs the failure. Here, a failure that leaves flight safe is logged and worked around, and one that makes flight unsafe makes the drone fail safe.

    ADR-0020
  • Hardware behind an interface

    Behavior code talks only to a drone interface, so the same logic runs against a mock, a simulator or the real Crazyflie, on a 20 Hz tick loop with a swappable clock for tests.

    ADR-0002 · 0009 · 0023

Every design decision is written up with the options considered, 28 records so far. I set the goals and make the calls; implementation is AI-assisted, and each record notes whose idea it was. Formatting, lint, strict type checks and tests, including architecture rules enforced as tests, run on every push.

Status
Prototype
Year
2021
Language
C++
Tools
OpenGL, Box2D, GLFW, Doxygen

GenevaEngine

Geneva Engine

A custom C++ engine built from scratch for physics-driven games, where the gameplay comes from mechanical constructions like soft bodies and linkages.

The core problems are the ones robots have too: a fixed-rate update loop, rigid-body physics, and state machines that turn commands into motion.

  • Fixed-timestep loop

    Input, physics, gameplay, render. Physics steps at a fixed 100 Hz with an accumulator, so the simulation behaves the same at any frame rate.

    Core/GameSession.cpp
  • Entities and constructs

    An entity owns a construct, a composite of Box2D bodies and joints. Player and AI commands arrive through one path, so either can drive any construct.

    Constructs/Construct.hpp
  • Templated state machines

    Behavior runs on a State<T> finite-state machine. The soft-body character switches between grounded and airborne states.

    Core/State.hpp
  • Soft-body character

    What looks like a box is five circles held together by joints, moved and jumped by forces applied to the center body.

    Constructs/SoftBox.cpp
Debug view of the soft-body character, with its circles and joints drawn.

Shipped games

Experience

Apr 2021 – present

Tripwire Interactive

Enemy behavior

  • Senior AI Programmer Jul 2024 – present

    Killing Floor 3, a co-op action-horror shooter released in July 2025 on PC, PlayStation 5 and Xbox Series X|S.

  • AI Programmer Apr 2021 – Jun 2024

Oct 2018 – Mar 2020

Naughty Dog

Santa Monica, CA

  • Game Designer – Gameplay Scripter The Last of Us Part II

    Scripted gameplay events, NPC behavior queues and animation sequences.

Get in touch

Contact

Email is the best way to reach me.