Building an Air Traffic Control Game That Doesn't Fall Apart at 3 AM

I spent three years trying to build an air traffic control game that felt even remotely authentic. The first version crashed every time more than eight aircraft were on screen. Not a simulation crash — the math itself broke down because I was calculating separation using Euclidean distance on a flat plane while planes were climbing and descending. That was 2019. I'm still patching holes in it. The core problem most people running into when they try to create an Air Traffic Control Game is that they treat it as a pathfinding puzzle. It isn't. It's a real-time constraint satisfaction problem with unpredictable variables. Weather, pilot error, fuel burn rates, emergency declarations. The moment you treat ATC as just "guide the dot from A to B," you've already failed.

Start With the Separation Standards, Not the Graphics

Vertical separation minimums are the easiest place to begin. In controlled airspace, you need 1,000 feet vertically between aircraft at or below FL180, and 2,000 feet above that. That's ICAO standard. Every major developer gets this wrong on day one because they're thinking in game units, not flight levels. When I first coded my altitude system, I used integer values from 0 to 400 representing flight levels. A collision detection loop ran every frame comparing current and planned altitudes. Simple. Right? Wrong. The issue came when I introduced descent profiles. An aircraft at FL350 starting a descent to FL200 doesn't vanish from the upper sector the moment it begins leveling off. It occupies that airspace for approximately twelve minutes at a typical cruise descent rate of 1,500 feet per minute. My system deleted the traffic record at the first descent command. Two aircraft collided in testing because both thought the other had already left their sector. The fix was adding a sector occupancy timer. Each aircraft carries its planned vertical profile through every sector it passes through, not just its current altitude. Collision checks run against the full profile envelope, not just the instantaneous position. This adds maybe four milliseconds per frame on a mid-range machine. It also prevents the vast majority of mid-air incidents that come from premature sector deletion.

Heading Sequences Are Where Everything Falls Apart

Beginners give pilots a direct line to their destination and call it freedom. That's not an Air Traffic Control Game. That's a screen saver. The actual job is sequencing. You have six aircraft converging on a single airport with one runway. They arrive from different cardinal directions at different speeds. If they all land at once, you get wake turbulence violations and runway incursions. The trick most guides don't mention is that lateral spacing matters more than longitudinal spacing in the initial approach phase. A 3-mile lateral gap between two aircraft on parallel final approaches is acceptable. A 2-mile longitudinal gap on the same runway is not, especially behind a heavy aircraft. You can stretch time by making aircraft fly wider patterns. You can stretch space by putting them on different vectors. But you cannot stretch both simultaneously without burning fuel reserves, and the game ends there if you don't model that resource.

Get the Full Details

Best Air Traffic Control Game at Jaclyn Glenn blog
Best Air Traffic Control Game at Jaclyn Glenn blog

Model Fuel Correctly or Lose Your Players Fast

I kept fuel as a simple percentage bar. One player noticed that the same holding pattern ate different amounts of fuel depending on altitude and asked why. Nobody in the dev team had an answer because nobody had modeled it. We just had a flat drain rate. That question went unanswered for six months. Real fuel burn varies significantly with altitude, airspeed, and aircraft weight. A B737 at FL350 burns roughly 2,200 pounds per hour. At FL280 it's closer to 2,800. Climb phase is the worst — you're pushing maximum thrust at relatively low altitude where the air is dense. Descent idle is almost nothing. When I finally wired in a simplified fuel model based on phase of flight and altitude bands, something unexpected happened: players started using holding patterns as tactical tools instead of punishment. If you tell an aircraft to hold at 5,000 feet instead of 15,000, it burns less fuel while waiting. It's a real technique used by actual controllers. Players figured this out within two weeks of the update.

Radio Communication Is Not Optional

You can issue commands through a GUI. It's faster. It's also completely unlike the experience of actually working a tower. Real ATC is built on phraseology and readback. A pilot confirms instructions by repeating them back. If they don't, you assume they didn't hear you and repeat. This back-and-forth takes time. That time is the entire game. My approach was to make the pilot response unreliable. Not randomly wrong — that's frustrating for no reason — but occasionally delayed or partially incorrect. A pilot might read back "descend and maintain six thousand" when you said eight thousand. The aircraft begins descending to six. You catch it. You issue a correction. This takes about twelve seconds of real time. Those twelve seconds matter when you're managing ten aircraft and the next arrival is forty seconds out.

Weather Needs to Actually Change Arrival Rates

Most games treat weather as a visual filter or a generic slowdown. Real weather changes the fundamental math of your airport's capacity. Crosswind components reduce runway capacity. Thunderstorms close sectors. Low visibility increases separation minima from 3 miles to 4 or even 5. When I added a weather system that adjusted separation minima dynamically, the average arrival rate at my virtual airport dropped from 32 per hour to 18. That's approximately correct for moderate IFR conditions. Players hated it at first. Then they adapted. One player wrote in saying they'd developed a habit of clearing arriving aircraft to hold at different altitudes before descending into the approach sequence when weather was poor. That's literally what real controllers do. They call it the metering function. The game had accidentally taught someone something real.

Air Traffic Control Game Steam at Mia Mullins blog
Air Traffic Control Game Steam at Mia Mullins blog

Where This Approach Breaks Down

This model works well for terminal area control — arrivals and departures at a single airport. It does not scale to en-route control across a continental airspace. The processing overhead grows non-linearly when you add more sectors and longer flight profiles. I attempted an en-route expansion once. The frame time jumped from 4ms to 47ms with twenty aircraft on screen because the sector occupancy calculations are more expensive when aircraft spend twenty minutes in each sector instead of two. I cut the scope back and recommend you do the same unless you're prepared to optimize heavily or target lower aircraft counts. There's also the problem of AI pilot competence. Good AI pilots make you look bad. Bad ones make the game unplayable. I settled on a middle ground where AI follows instructions accurately but has a slight delay in response — roughly 1.5 seconds from command to execution — which mirrors real-world radio latency and gives the player breathing room without making the aircraft feel sluggish.

What You Actually Need to Build This

You don't need a physics engine. You need a state machine for each aircraft, a separation conflict detection loop, and a scheduling system that processes events in chronological order rather than frame order. Frame-ordered processing creates race conditions. Chronological processing requires a priority queue and a tick-based simulation loop that advances based on simulated time, not display refresh rate. The conflict detection itself is where most projects stall. A naive O(n²) comparison works fine up to about fifteen aircraft. Beyond that you need spatial partitioning — a grid-based approach works well since airspace sectors are naturally grid-like. Divide your airspace into cells, track which aircraft occupy which cells, and only run collision checks between aircraft in adjacent cells. This drops your complexity from O(n²) to roughly O(n). I saw my air traffic management system go from choking at twelve aircraft to handling forty-five without breaking a sweat after this change. If you want to actually play something close to what I've described, there are a few titles out there that get the sequencing right, though none of them model fuel or weather accurately enough for anyone who cares about realism. The most accessible one is currently Air Traffic Control Game on Steam, which handles the vectoring and sequencing logic decently even if the fuel model is abstracted. For something closer to a simulation, you'd look at services like VATSIM or VPS, though those are multiplayer networks rather than standalone games and require significant setup to learn the phraseology properly.