GAME DEVELOPMENTSHIPPED

GhostBust Hotline

A 2D top-down shooter written entirely in Elm, where the ghosts are invisible until you reveal them. I led a team of 3 and worked on the gameplay, ghost AI, particle effects and CI.

ROLETeam lead, gameplay & VFX programmer
TEAM3-person team, SJTU
TIMELINEMay 2025 - Aug 2025
CATEGORYGame Development

3

TEAM SIZE

100% Elm

LANGUAGE

Per-ghost, distinct

GHOST AI BEHAVIOURS

Overview

GhostBust Hotline is a top-down shooter where the ghosts chasing you are invisible. You have to reveal a ghost before you can fight it, and each type needs a different approach once it shows up.

We wrote the whole game in Elm using the Messenger framework. Elm is a pure functional language with no runtime exceptions and it's mostly used for web apps, so making a real-time action game with it was a fun challenge.

What I did

  • Led our team of three from the first idea to the playable build that's online now. That meant planning the scope, splitting up tasks and doing a lot of the work of fitting everyone's code together.
  • Wrote the core gameplay: player movement and combat, the reveal-then-fight loop, and separate AI for each ghost type so they all play differently.
  • Made the particle effects by hand. There was no particle engine for Elm we could use, so the muzzle flashes, ghost reveals and death effects are all custom, and I tuned them frame by frame.
  • Set up GitHub Actions to check that the Elm code compiles on every push and pull request. The build stayed green for the whole project.
  • Recorded, edited and finished the trailer in DaVinci Resolve.

What I learned

Elm doesn't let you mutate state, so every system in the game (AI, particles, collisions) ends up as an explicit update over messages. That felt slow and wordy at first. Later on it made bugs much easier to track down than in any project I'd worked on before.

Play it

The game runs in the browser, you can play it here.

APPENDIX A // MEDIA

IMAGE SLOT · AWAITING UPLOAD

FIG.01 · GAMEPLAY, REVEALING AN INVISIBLE GHOST

VIDEO SLOT · AWAITING UPLOAD

FIG.02 · GAME TRAILER, EDITED IN DAVINCI RESOLVE

IMAGE SLOT · AWAITING UPLOAD

FIG.03 · CLOSE-UP OF THE PARTICLE EFFECTS