
Siren Jam: a parking puzzle with a way out
What if an ambulance was stuck in the jam?

The question behind the game
Siren Jam started with a small what if: what if the car stuck in the jam was an ambulance? Giving the trapped vehicle somewhere urgent to be changed how I wanted the game to feel. Clearing the lot stops being tidying and becomes a rescue, with a hospital, a fire or a bank alarm waiting at the top of the map.
The design problem followed from that. A rescue only feels good if the jam is real. The unit has to be boxed in on every side, the way out has to take some thought, and the player has to trust that every level has an answer. An impossible level, or one that falls apart on the first tap, breaks that trust quickly.
How a level plays
The emergency unit (an ambulance, a fire engine or a police car) is parked inside the lot and can’t turn on the spot. It has exactly two ways out: straight ahead or straight back. Each way out is a lane of lot cells running from the unit to the kerb, and the level is won as soon as either lane is empty.
Every other vehicle has an arrow. Tap it and it drives straight ahead to a one-way ring road round the lot, follows the flow and leaves by the first open corner exit. It only goes if nothing stands in its way. Otherwise it honks, and the cars in the way flash red. Later worlds add barricades, traffic lights, timed zebra crossings, a drawbridge on the driveway and broken-down wrecks that need a tow.
There are 160 levels across eight worlds, from Downtown to Frontline Valley. Each level has a move limit, and the limit is what turns reading the board into the puzzle.
Architecture: rules apart from pictures
The game is built in Unity 6 with the Universal Render Pipeline. The most important decision was to keep the rules out of Unity. The core of the game is plain C# with no UnityEngine references: the level and board model, the rules, the solver, the play session, the generator and the campaign. A separate .NET 8 test host runs that code without opening the editor.
The Unity side is presentation. It builds the world from a level, dresses the city around it, drives the vehicles along proper circular bends, walks the pedestrians, draws the HUD and plays the audio. By the time a car pulls away, the rules have already decided that it can.
Levels are small JSON files. The lot is drawn as ASCII, one string per row, with arrows for vehicle fronts and letters for their bodies. That format is easy to read in a diff and easy for a program to write.
Around the game sit the services a released mobile game needs: Firebase Analytics and Crashlytics, optional Google Play Games or Game Center sign-in with a cloud save, a leaderboard ranked by campaign stars, and rewarded AdMob videos.
The challenges that shaped it
A campaign I could trust
I didn’t want to check 160 levels by hand. The levels are generated from a campaign plan, and every one is solved before it ships. The solver works out the cheaper of the two lanes, how many moves are locked behind other moves, and the move limit. The test suite holds every level to the same standard: the unit is boxed in, both lanes start full, nothing in either lane can leave on the first tap, and each world ends at least as hard as the one before. I wrote about how that works in How Siren Jam proves every jam has a way out.
A phone that got hot on the menu
An early build made my phone hot on the main menu. It rendered the full 3D level at native resolution with 4x MSAA, SMAA, HDR, screen-space ambient occlusion, 4096 soft shadows and bloom. It aimed at 60 fps and reached about 45.
The fix was to draw at 60 fps only while something moves and at 30 on calm screens, to cap the 3D view at the pixel count of a 1080x2400 screen, and to switch the 3D camera off under full-screen menus. On my phone, the idle home screen had reached 59.5 °C after five minutes and was still rising. After the change it held 51.8 °C, flat from the first minute.
A rename that couldn’t touch the save
The game was developed as Emergency Rush. Renaming it Siren Jam changed every title and label, but the save keys kept their old er. prefix on purpose. Renaming them would have reset every player’s progress. An inconsistent prefix in the code was the cheaper problem.
What shipped
Siren Jam is free on Google Play and the App Store. There is nothing to buy; a short optional video earns extra coins, up to five a day. The campaign runs from an eight-move opener in Downtown to Frontline Valley levels that need more than 30 moves, with over 40 vehicles on a 9x12 lot. You can watch the trailer next to Narrow Front’s on the games page.
What I learned
Keeping the rules in plain C# paid for itself many times over. It made the solver possible, it let the tests run in seconds, and it let the generator try hundreds of candidate boards for each level without building a scene.
The second lesson was about measuring on the device. The heat problem never showed in the editor. A recording of a real cold start and a five-minute temperature curve on a real phone told me more than any profiler window on my desk.