Inspiration

I wanted to make The Last Line for a long time. After a layoff earlier this year, I decided to spend the time building it.

I wanted to hold a barricade against a huge zombie crowd, then face a Souls-style boss. Getting both experiences onto a phone became my project.

I published the game on the App Store today, September 10, about an hour before writing this application.

What it does

The Last Line: Zombie Siege is a free-to-play zombie survival shooter for iPhone and iPad.

You defend barricades against waves of up to 150-200 zombies, scavenge ruined cities, and upgrade your weapons. Heavies absorb damage and flyers come over the wall. In boss encounters, you have to watch attack patterns instead of concentrating on the crowd.

You fight across gas stations, subway platforms, and flooded arenas, with weapons ranging from bows to a flamethrower.

How we built it

I built the game solo in Unreal Engine 5, using C++ for the underlying systems and performance-sensitive code, and Blueprints for most gameplay and UI logic.

For the horde, I built a shared update system that spends more time on zombies near the player and less on those at the back. I used authored paths instead of navigation queries and reused zombies through an object pool to avoid spawning and destroying them during fights.

I built the bosses with my Soulslike Enemy Combat framework, which I developed during the project and released as a standalone plugin.

For purchases and subscriptions, I integrated RevenueCat through another plugin I built, RevenueCat Bridge (Available on FAB for Unreal Engine). Through it, I can handle purchases, entitlements, and restores from Unreal.

I used Claude Code for repetitive scaffolding and save-system wiring. I gave it examples from systems I had written and reviewed its output. I kept the design decisions and spent my development time on the horde scheduler, boss behavior, and device optimization.

Challenges we ran into

Running these fights on a phone meant working within tight processing, memory, and thermal limits. I couldn’t afford to update each zombie at full speed. Drawing floating damage numbers as individual UI widgets caused frame-time spikes too, so I replaced them with a small reusable pool drawn onto the HUD.

My favorite bug involved the cleanup system for zombies stuck on geometry. I’d made it scan all zombies, including the inactive ones waiting in the pool. It treated those as stuck and killed them before they could spawn. I fixed the check to account for their state and age and limited it to active enemies.

Outside the code, I spent five months without a salary. That was a bit stressful. Sales of my combat framework and RevenueCat Bridge plugin helped pay for part of development.

Accomplishments that we're proud of

I’m proud of getting a full 200-zombie wave running on a phone alongside the boss fights I wanted to make.

Finishing the game meant handling the work around combat too: menus, progression, saves, purchases, device settings, and store preparation. I did that alone, and I published the result today.

I released two reusable plugins during development, Soulslike Enemy Combat and RevenueCat Bridge. Selling the combat framework helped me keep working on the game that I built it for.

What we learned

I learned how much I could save by treating distant enemies differently from the ones in front of the player. I could reduce their update rate and animation cost without losing the feeling of a large crowd.

I changed how I structure enemy behavior after working with one sprawling behavior tree in my previous shooter. For this game, I split attacks into smaller, reusable abilities. I could add a move without threading another branch through the same graph.

What's next for The Last Line: Zombie Siege

I plan to add more content and levels, with player feedback helping me decide what to improve and expand.

I want to add multiplayer too. I’ll need to work out how to adapt the barricade fights and boss encounters for players fighting together.

Built With

  • blender
  • claude
  • revenuecat
  • substancepainter
  • ue5
  • unrealengine
Share this project:

Updates

Submission history