SkyChart: Airline Executive Playtest · build 22823408 · published
Steam Deck captain filed a report. Casey did NOT enjoy reading. 'Open the tutorial card on Deck. Move the right stick. Cursor is somewhere — can't see it. Want to click NEXT? Have to switch to the Steam trackpad cursor just to AIM at the buttons.' Casey pulled the layer manifest, took one look, and groaned. 'Captains. The tutorial card sits on render-layer 121. Our virtual cursor was painting on layer 110. Higher layer wins. The cursor was DUTIFULLY tracking the right stick — under the card. Like a pilot waving a flashlight from inside the cargo hold.'
Casey moved the cursor to render-layer 200 — above the tutorial overlay, above the era/mode/difficulty pickers, above every modal panel currently on the manifest, with headroom for whatever Casey builds next. 'It's a pure render-order change — clicks still pass straight through to the buttons underneath. Captain can now SEE the reticle hovering over NEXT, BACK, SKIP CH., whatever they're aiming at. No more squinting. No more falling back to the Steam trackpad to find the cursor.'
While Casey was in the tutorial overlay, he found a dead bird: a 'suppress the virtual cursor while the tutorial card is open' helper that searched for a node named 'VirtualCursorUI' — except the actual node was named 'VirtualCursor'. The lookup never matched. The function has been a silent no-op since the day someone wrote it, which is FORTUNATE because once the cursor was actually on top, suppressing it was exactly the wrong call. Casey ripped the whole helper out. One less ghost in the cockpit.
Steam Deck captain filed a report that made Casey groan and set down his clipboard. 'Tutorial window says [A] Next, Back, [X] Skip Ch., [Y] Skip All. Captain presses A. Captain presses B. Nothing happens. Casey — you printed hotkeys on the card, but nobody wired them to the cockpit.' Casey stared at the ceiling for a long moment. 'Yep. Those labels were a lie. No keybinding exists. Pure decoration. Utterly shameful.'
Casey tore off the fake annotations. Tutorial buttons now show plain labels: NEXT, BACK, SKIP CH., SKIP ALL, START OVER. On Deck, the captain moves the virtual cursor over whichever button they want and taps A to activate it — exactly how every other panel in the game works. No fake shortcuts. No broken promises. What you see is what you can actually do.
Casey also caught himself telling the tutorial classroom — and the in-game Help reference, and the player help guide — that WASD and arrow keys pan the world map. Casey re-read the flight manual. WASD and arrows do NOT pan the map. Never have. 'I've been lying to every captain who picked up a keyboard. To pan the map: click-drag with the mouse, or use the left stick on a controller. That's it. That's the whole menu. I scrubbed the false instruction from Chapter 2, Map Navigation in Help, and the keyboard shortcut reference.'
Casey spent the morning kicking the tires on yesterday's jetway rebuild and found a corner case. 'Captains. If a passenger clicks New Campaign, waits for the Era Select card, and then IMMEDIATELY clicks Back before the ground crew finishes loading all 496 city markers behind the card — we'd keep trying to staple city markers onto a terminal that's already being demolished. Red errors in the logbook. No crash — Godot caught it — but the log looked haunted.'
Casey welded in a cheap check: the marker-loading loop now peeks at whether the world map still exists before every city. The second someone yanks the rug out by clicking Back, the loop just stops. Nothing to staple markers to means nothing to staple. Logbook stays clean. 'Also tightened the type annotation on the loop variable — Casey likes it when the compiler knows what's in a crate before the crate gets opened.'
Steam Deck captain filed a bug report that made Casey wince. 'Click New Campaign. Stare at the main menu. Count to seven. SEVEN, Mississippi. Only THEN does the Era Select card bother showing up.' Casey pulled the flight plan and grimaced. 'Our cold-start sequence was loading the entire 8192x8192 world map, 496 city markers, the tile detail layer, the day-night overlay, and the full weather climatology before it remembered to ask the captain which decade they wanted to fly in. Cruel. Just cruel.'
Casey reordered the gate. 'Era Select now appears roughly a second after the click — the picker card slides up OVER the still-loading map instead of waiting for every screw to be torqued first. All the heavy map setup continues behind the card while the captain is picking between 1930 and 1970. Same work, just hidden behind the thing the captain actually wants to see.'
Casey also wired up the airplane-spinner loading overlay — the one with the rotating boarding-pass flavor text — to fire the INSTANT you click New Campaign. 'No more black screen. No more frozen menu. If the Deck needs five seconds to warm up its engines, the captain sees a loading card with the spinner going the whole time.' The overlay hands off seamlessly to Era Select the moment the picker is ready.
Casey also spread the 496-city marker build across roughly ten frames instead of cramming them all into one synchronous hitch. 'On the deck, that frame-hitch alone was a full second. Now the spinner keeps spinning, the frame rate stays reasonable, and the captain never sees the tower go quiet. Click-to-Era-Select dropped from ~7 seconds to ~1.5 seconds on the Steam Deck. Captain gets on the plane FASTER.'
Casey stormed into the control tower, dragging the new black box reader. 'CAPTAINS. THE NUMBERS. The black box says half our routes are vanishing on load. Two thousand. Two THOUSAND flights. Missing. I've been ringing alarm bells for TWO patches now —' Casey stopped mid-sentence. The apprentice inspector was quietly pointing at a line of code. Casey squinted. Casey's feathers drooped. Casey said a word even the mascot union doesn't allow.
Casey had been reading the logbook wrong. The 'missing resource' warning wasn't firing when a flight was actually lost. It was firing every time a PLAYER-owned flight successfully loaded. Wrong indentation. Wrong nesting. A stray `else` that was attached to the captain-vs-AI check instead of the did-the-data-load check. Every captain's save has been dutifully printing 'ROUTE 47 DROPPED, ROUTE 48 DROPPED, ROUTE 49 DROPPED' at the top of its lungs while simultaneously, quietly, correctly, loading routes 47, 48, and 49 into the schedule. The airplane was fine. The logbook was a lie.
Casey fixed the nesting. The false alarm is gone. No captain ever lost a route to this bug — the game was loading saves correctly the whole time. The progress bar was lying, the log was lying, but the flights were flying. 'Humbled, Captains. Truly humbled. Casey is going to take a long walk around the hangar and think about how confidently he blamed the wings for a problem that was in the clipboard.' (The 4 MB autosave warning and the rest of the v14-v15 diagnostic plumbing are still VERY much real and useful — the black box stays in. Casey just promises to read the numbers more carefully next time.)
Casey plugged the fresh black box into the reader and got back numbers that made the control tower go quiet. 'Captains. Every save file this ship has been loading is silently losing about HALF its routes. Slot 4: four thousand five hundred flights on the manifest, two thousand two hundred actually in the air. The other half? Gone. Vanished. And the game never said a word.' Casey slammed the logbook. 'That stops NOW.'
Casey sharpened the flight recorder. 'Before, when a route went missing on load, all we got was a vague complaint that SOMETHING didn't match. Was the city gone? Was the aircraft gone? Both? Casey's investigators couldn't tell.' The per-route drop line now splits the blame: city_a / city_b / aircraft, with a type tag for each failure so we can tell 'file not found' from 'file loaded but wrong shape'. The summary line at the end of every load now reports the exact attribution breakdown — x cities-a failed, y cities-b failed, z aircraft failed — plus three full-path samples. 'Next time a route goes missing, we'll know EXACTLY which rivet popped out.'
Casey also dialed in the autosave size alarm. 'If a save gets fat enough that writing it is noticeable — four megabytes and climbing — the black box logs a WARNING the moment the write finishes. Can Captain Save Balloon's to seven megabytes? Casey's on it before the captain even notices the frame rate drop.'
Casey marched in holding a charred logbook and a captain's bug report that read 'game got laggy over four hours then crashed around 1940.' Casey fanned out the wreckage. 'Captains. Look at this log. It STOPS before the crash. We have zero idea what the game was DOING when the wing fell off. That ends today.' Casey bolted on a proper diagnostic flight recorder that writes a dedicated file to user://skychart_diagnostics.log and rotates it every 10 MB so a previous session is always recoverable. 'Every save, every load, every new game, every year rollover, every shutdown now punches a timestamped row into the black box. Memory, FPS, route count, cash, year/month. Future crash reports: attach this file. Casey's investigators will actually be able to tell you what broke.'
Casey also spotted a stowaway: the ScreenshotCapture helper was listed on the autoload manifest, but the ship's packing list was shipping the box WITHOUT the helper inside. 'Every single player build was booting with a big red cargo-missing error in the log. Dev-only hardware that should never have been in the manifest — or the exclusion list — in the first place.' Casey trimmed the exclusion list to exclude ONLY the heavy trailer-production rigs, so the helper ships cleanly, and the startup error is gone.
While the black box was in the shop, Casey noticed something else. 'Captains who returned to the main menu mid-route-scan and started a new game — the scanner was still on stall from the previous flight. Stale callbacks. Stuck flags. Next scan blocked FOREVER.' Casey added a hard-reset on new-game-start: joins any in-flight scan thread, drops every lambda captured by the prior session's UI panels, and reassigns every cache. 'New games now start CLEAN, the way new games are supposed to.'
Bonus: Casey patched the loading-bar progress animation. 'Captains, the old bar did a little sine-wave dance: goes up, goes DOWN, goes up, goes DOWN. The captain has been glaring at the bar, thinking the load was REGRESSING. It was just vibing. Embarrassing.' The bar now climbs monotonically, tracks real route-restore progress where we have it, and snaps to 100% the frame it finishes. And when a save references aircraft or city data that's no longer in the build, the captain now gets a NOTIFICATION — not a silent black hole that deletes routes. '75 routes evaporating without a peep is not OK. If data is lost, captain SEES it.'
Four new smoke guardrails so none of this regresses. 248/0 smoke. 269/269 GUT. 'The black box is LIVE, Captains. Next time a wing falls off, Casey's investigators are going to know exactly which rivet, at exactly what altitude, on exactly which heading.'
Casey got a bug report that made his feathers stand straight up. 'Captain reports: press Space to pause, game does NOT pause. Press Space again, still no pause. Press Space a third time — maybe, if the wind is right, MAYBE it pauses.' Casey traced the wiring. 'The Space key was bound to TWO different jobs: activating the currently-focused button AND firing the dedicated Pause action. When the Play/Pause button had keyboard focus — which happens EVERY TIME you click it with the mouse — pressing Space made it toggle TWICE in a single frame. Pause on. Pause off. Net effect: no pause. The game was gaslighting the captain.'
Casey added a one-frame debounce on the play/pause toggle. 'If something tries to toggle the speed twice in the same frame, the second call is a NO-OP. First toggle wins. Clean pause. Clean unpause. Exactly what the captain pressed. No more phantom unpausing.' Also removed a redundant second pause handler on the world map that was a leftover from before the HUD took over as the canonical pause owner — belt-and-suspenders to prevent this class of bug ever resurfacing.
Spacebar pauses. Press it again, and the game plays. That's it. That's the whole feature. It should have worked like this since v0.1.0, and Casey is very annoyed it didn't.
Casey marched into the ops room, waving a sticky note from a player. 'Captains. Player message: I beat Combined mode in three different eras, and Cargo is STILL locked on the operations select screen. WHAT?!' Casey pulled up the unlock chain. 'Cargo unlocks when you complete a Passenger era. Combined unlocks when you complete a Cargo era. CHAIN GOES UP. So how can a captain have COMBINED unlocked without CARGO unlocked?' Casey did the math out loud: 'Because the chain only goes UP. If a captain unlocked Combined the old way, then we ratcheted gating in later, the unlock arrays don't backfill DOWN. Cargo gets stranded behind a passenger's requirement, the captain has already proved they don't NEED.'
So Casey taught the unlock reconciler to walk DOWN the chain too. 'Completing Combined now implies you've earned Cargo AND Passengers — because Combined is literally Passengers PLUS Cargo, you can't fly it without both skill sets. Completing Cargo implies Passengers (the entry-level mode). Self-heals on the very next launch — open the game, the reconciler walks your era_completions history, sees that Combined trophy on your shelf, and quietly unlocks every mode you'd already earned. No migration prompt, no lost progression, no manual save edit.'
And Casey added five new guardrails to the smoke suite. 'Now smoke verifies the transitive chain: combined → cargo + passengers, cargo → passengers, but cargo does NOT promote combined (the chain only flows DOWN, not UP). 248 passing smoke assertions. If a future refactor breaks the chain, smoke SCREAMS before the build ships. Cargo bay door is OPEN, Captains. Go fly some freight.'
Casey rolled in with a fresh clipboard and a very stern expression. 'Captains, behind the scenes, I just installed a brand-new pre-flight lockout. From now on, if the version number printed on the game doesn't match the version the release paperwork says, the whole build refuses to take off. No mismatched decals. No stale patch notes sneaking past the gate agent. ONE consistent version, end to end, every single release.'
The Seat Class Configuration project is officially wheels-up end-to-end — Aircraft Info Panel, cabin math, demand split, stepper UI, rival archetypes, tutorial chapter, save persistence, and polish pass all shipped and flying together. 'The feature is DONE, Captains. Go configure some cabins.'
Casey sat down to play his own feature and immediately started yelling. 'I'm configuring a route, I'm tweaking the steppers, and I have NO IDEA if what I'm doing is actually HELPING! No feedback! No delta! Just guess-and-check!' So Casey added a live revenue readout right below the stacked bar. 'Est revenue: +18.3% vs all-economy at this route's demand mix.' Green when positive, red when negative, muted grey when flat. Updates every time you click a stepper or apply a template. Uses THIS route's actual biz/leisure mix and last-month demand — not some generic fallback. Shows you whether your config is smart for THIS city pair before you commit.
Then Casey caught a GAMEPLAY BUG hiding in the math. 'When a premium class fills up, those passengers were EVAPORATING. Just gone. A business traveler arrives, sees Business is sold out, and instead of accepting a Premium Economy downgrade like a REAL HUMAN, they just VANISH.' Casey wrote apply_demand_rollover(): First overflow spills to Business. Business overflow spills to Premium Economy. PE overflow spills to the Economy. Only the economy overflow is truly lost (seats sold out, go find a competitor). 'Now your premium configs work correctly, Captains. Overbooked First flows to Business at the lower fare — better than losing the whole sale.'
The rollover fix also restored a parity invariant: an all-economy OVERRIDE now produces IDENTICAL revenue to running the pre-Phase-B single-pool math. Before the fix, overriding with all-economy cost you money compared to leaving the override off, because the per-class pipeline was splitting demand by city mix and then DROPPING the premium slices. Now, all demand flows down to the economy via rollover. Parity restored.
Polish lap two: color-coded stepper row labels now match the stacked bar segments (blue Economy, purple Premium Economy, green Business, gold First), so you can cross-reference at a glance. And lap three: the Route Manager list shows an orange 'CUSTOM' badge on any route with a cabin override — no more forgetting which routes you tuned. Four new GUT tests pin the rollover behavior + delta helper edge cases.
Casey was reviewing the Seat Class release notes and STOPPED dead. 'WAIT. WAIT WAIT WAIT. I shipped the per-route cabin override in Phase C and the AI rivals' cabin strategies in Phase D — but I NEVER CHECKED IF THE CABIN OVERRIDE WAS ACTUALLY SAVED TO DISK!' Casey ran a grep. Zero hits. 'Every single time a captain saved the game, every configuration they had painstakingly set disappeared! AI rivals reset to their type defaults! I was shipping a feature that DIDN'T PERSIST!' Casey added cabin_override to both the save dict (route dict entry) AND the load restore block (r_data.get with empty-dict default for pre-Phase-A saves).
Then Casey wired a tripwire. New Suite 14 check `_check_route_cabin_override_persisted()` greps the game_manager for BOTH the save write AND the load restore. If either ever gets renamed, removed, or left out of a refactor — SMOKE TEST FAILS. No more silent data loss. Casey is DONE with save-game leaks.
Phase F also added a JSON round-trip GUT test proving the cabin override survives serialize→deserialize with exact seat counts, a legacy-path parity test confirming that empty-override routes still flow through the pre-Phase-B single-pool math (critical for million-save backward compat), and an all-economy-vs-default parity test across four aircraft sizes.
Two hundred and thirty-four smoke tests pass. Two hundred and sixty-five GUT tests pass. SEAT CLASS CONFIG PLAN IS SHIPPED END-TO-END, Captains. Phase 0 Aircraft Info Panel, Phase A model layer, Phase B demand split, Phase C UI, Phase D AI archetypes, Phase E tutorial, Phase F persistence fix. Save. Load. Override. Restore. It all works. Go forth and configure cabins that actually STAY configured.
Casey barged into the ready room with a laminated training deck. 'Captains! I built a seat-class system. I split the demand pool. I gave the AI rivals four different personalities. And THEN I FORGOT to teach anyone how to USE it?! That ends TODAY!' Casey wrote Chapter 17 of the tutorial: 'Filling the Seats.' Eight steps walking you through WHY cabin classes matter (suit-and-briefcase pays ×4 more than the flip-flop crowd), HOW to read the stacked bar (Economy takes 1.0 space units, First takes 2.5 — the aircraft's capacity is a BUDGET), WHICH template to pick (six presets, from All-Economy to Premium), WHEN small aircraft lock you out (Business unlocks at 50+ seats, First at 150+), WHY some classes are historically gated (Business 1955, First 1960, Premium Economy 1992), HOW city flavor drives the demand mix (NYC–LON skews 65% business, MIA–NAS skews 15%), WHAT the per-route override does (orange CUSTOM badge, surgical), and WHEN to break the template (don't micromanage — pick a carrier-wide default and override the exceptions).
Then Casey expanded the in-game help reference with a full Cabin Configuration section. Space-unit table, fare multiplier reference, era-gate calendar, six template descriptions with when-to-use strategy notes, small-aircraft soft caps, and the rival archetype distribution so you know WHY enemy route quality varies. Everything a captain needs to strategize, all in one place.
And Casey ran the POT extractor one more time. 'Every new tutorial string — chapter name, 8 titles, 8 casey_texts — lands in the translation template automatically, because my POT extractor already knows how to walk data/tutorial_steps.json. Two hundred and fifteen strings grew to two hundred and fifteen plus Ch 17. Weblate picks them up on the next pull. Translators can start on Ch 17 while I sleep.'
Two hundred and thirty-four smoke tests pass. Zero fail. Tutorial chapter count is now SEVENTEEN. That completes Phases 0–E of the Seat Class plan. Only Phase F remains — tuning, transfer-pax class split, migration polish. Captains: the feature is DONE. Go configure something.
Casey stormed into the situation room holding a player report. 'Captains. A player couldn't CLICK on an aircraft name to see its details. Said the rows didn't respond. Said the feature was GHOST CODE.' Casey dug into the aircraft timeline panel and found the bug: Label controls default to mouse_filter=STOP in Godot, which means every label EATS the click before it reaches the button underneath. 'I had the button on the BOTTOM z-layer, Captains. Every label sat on top, eating mouse events like they were CANAPÉS at an airline banquet.' Casey flipped the z-order — button moved to LAST child with PRESET_FULL_RECT — and now clicks on the name, the badge, the stats line, ANYWHERE on the row opens the Aircraft Info panel.
Then Casey renamed the window itself. It was called 'Aircraft Release Timeline.' 'What a BORING name, Captains. Sounds like an AVIATION WIKI article. It's a CATALOG. It's a REFERENCE. It's a SHOPPING AISLE.' New title: 'Aircraft Catalog & Timeline · Click any aircraft for details.' The subtitle TELLS you the rows are clickable, so nobody has to guess.
And Casey added auto-scroll. 'If you open the catalog in 2015, you should NOT have to scroll past the 1930s, 1940s, 1950s, 1960s, 1970s, 1980s, 1990s, AND 2000s to see what's current. The panel now remembers which decade header contains the current year and scrolls to it automatically after the layout settles. Open the panel, boom — you land on the 2010s.'
Finally, Casey fixed a lying label. The Aircraft Info panel's cabin section said 'Configurable cabin mix ships in a future patch (Phase C).' 'PHASE C ALREADY SHIPPED, Captains! In v0.2.43.2! My label was LYING to the player!' New text explains: 'This is the aircraft type's default cabin. To customize a specific route's mix, open Route Info → CABIN CONFIGURATION and toggle Customize cabin for this route.' Points right at the feature. No more stale references to phases that have already landed.
Casey stormed into the ops room holding a paper airplane made of a stats file. 'CAPTAINS. We have been losing people. Players who beat every era — FOUR eras, nine years of their lives, thousands of routes — come back, click Era Select, and everything says LOCKED. Like they never flew a plane. Like Casey has no memory of their VICTORIES.' Casey pointed at a whiteboard diagram with two arrows. 'Turns out career_stats has TWO arrays: era_completions (the immutable history — every era end ever, win or lose) and eras_completed (the unlock list that era select reads). If Steam Cloud gets weird, or an old build never wrote them, or somebody hand-edits the file, only the unlock list gets wiped. History stays intact. UI reads the empty one. Player CRIES.'
So Casey installed a reconciler. 'Every time career stats load, I walk era_completions, find every entry with goals_achieved=true, and set-merge those era indices and game modes back into the unlock arrays. Never removes anything. Completely idempotent. If the unlock list is already correct, the reconciler does NOTHING. If it drifted, it heals on the very next launch — no migration flag, no prompt, no lost progression.' Casey crossed his wings. 'Play for ten years. Clear every era. Steam cloud syncs a bad file from a different machine. ZERO PROBLEM. Next launch, Casey looks at your history, rebuilds your unlocks, pushes warnings to the log so I know I saved somebody, and keeps flying.'
And Casey added thirteen new smoke-test assertions to guard it. 'Suite 14 now verifies the reconciler function EXISTS in game_manager.gd and is CALLED from _load_career_stats. Then it runs the logic itself against a synthetic stats dict — era 0 with failed goals ignored (correct), eras 1/2/3 with won goals promoted (correct), duplicate entries collapsed into unique sets (correct), running the reconciler twice doesn't double-count anything (correct). 213 passing smoke assertions now. If a future refactor ever breaks this healing path, the smoke test SCREAMS before the build ships.' Casey dusted his wings. 'Your progression is safe, Captains. Your history is SACRED.'
Casey paced the ready room and stabbed a finger at the rival panel. 'Captains. Every AI airline up to now has been flying the SAME default cabin — all economy, end of story. Pan Atlantic looks EXACTLY like Emerald Skies looks EXACTLY like Desert Silk. THAT ENDS TODAY.' Casey assigned every rival a cabin strategy at creation: BUDGET (all-economy, LCC style), REGIONAL (mostly economy with a bit of business), LEGACY (balanced 78/5/14/3 split, flagship carrier), or PREMIUM (22% business, 10% first — Emirates energy). Fifty percent legacy, twenty-five budget, fifteen premium, ten regional. Real-world mix, REAL rivals.'
Then Casey wired it into route creation. 'Every time an AI rival opens a new route, my CabinConfig.apply_template_for_year() slots in the right mix AND respects era gates automatically. A 1965 rival with a premium strategy doesn't try to install Premium Economy (doesn't exist yet). A budget carrier skips the override entirely — all-economy runs through the Phase B no-op path for zero extra overhead. Legacy, regional, and premium rivals hit the per-class revenue pipeline properly.'
And Casey added a smoke-test trip wire. 'Fourteen suites of static checks now include a FIFTEENTH assertion: if the AICompany field is missing, or pick_random_cabin_strategy() is gone, or the _init_rivals assignment is missing, or save/load doesn't persist rival_cabin_strategies — SMOKE TEST FAILS. No silent fallback to legacy for all rivals. No same-same AI fleet. If future Casey refactors break the wiring, current Casey SLAPS HIS CLIPBOARD and stops the build.' Saves forward-compatible (old saves default to legacy). Six new GUT tests prove weights sum to 1.0, all four archetypes map to real templates, and the random picker never returns garbage. 262 passing tests. Zero failing tests. WORKING RIVALS, Captains.
Casey kicked open the Route Info panel and pointed at a blank space between Fleet Management and Pricing. 'THIS, Captains, is where the cabin lives now.' He installed a toggle: 'Customize cabin for this route' — click it, and a full stepper interface unfolds. Four rows, one per class. Each row has a minus button, a seat count, a plus button, the fare multiplier, and — for locked classes — a PADLOCK with a tooltip explaining WHY (too small for First Class, doesn't unlock until 1992, aircraft not introduced yet). 'No guessing, Captains. The UI tells you EXACTLY why a class is greyed out. Nobody's left staring at a button, wondering.'
Then Casey painted a stacked bar across the top. 'Every class gets its own color block, scaled by ACTUAL cabin proportions. Economy takes ONE space unit per seat. Business takes ONE POINT SIX. First takes TWO POINT FIVE. Watch the bar fill up as you click +. Watch it empty as you click minus. The label below tells you how many space units and total seats you've got. It's like watching a load balancer in real time — because THAT IS WHAT IT IS, Captains.'
And Casey threw in a Template dropdown with six presets: All-Economy, Regional, Leisure, Balanced, Business, Premium. 'Don't want to click sixty times to configure a widebody? PICK A TEMPLATE. My code respects era gates — if Premium Economy isn't available yet, the template silently pushes those seats to Economy so you don't get surprised. Step sizes are CAPACITY-AWARE: tiny aircraft step by 1, mid-size step by 2, jumbos step by 4. So, configuring a 550-seat A380 doesn't require THREE HUNDRED AND EIGHTY CLICKS. Casey RESPECTS your mouse finger.'
Flip the override toggle OFF, and the route reverts to aircraft-type default (all-Economy at full capacity). Flip it ON, and a 'CUSTOM' badge appears next to the toggle, revenue recomputes through the Phase B per-class pipeline, and this route starts honoring the mix you set. 'This is where the seat class feature STARTS BEING REAL, Captains. Phase D teaches the AI rivals to use different cabin strategies. Phase E writes the tutorial. But RIGHT NOW, today, you can open a route, toggle override, pick Balanced, and watch your revenue climb on biz-heavy city pairs. GO. CONFIGURE. SOMETHING.'
Casey pulled out a calculator and a pie chart. 'Captains! Every city pair has TWO kinds of travelers: the suit-and-briefcase crowd heading to a merger meeting, and the flip-flop crowd heading to a beach. My new biz_share_for_cities() function looks at a city's economic_value versus tourist_appeal and tells me — between 15% and 65% — how suit-heavy the pair is. New York to London? Sixty-five percent suits. Miami to Nassau? Fifteen percent. Houston to Orlando? Somewhere between. REAL NUMBERS, Captains. REAL NUMBERS!'
Then Casey split the demand pool into four buckets using REAL carrier load ratios: 8% of business travelers want First (that's 4% of a balanced pair), 92% want Business, 12% of everyone wants Premium Economy, and Economy mops up the rest. The totals ALWAYS sum to exact demand — my seven new GUT tests prove it, including the edge cases. 'Zero demand in means zero demand out. Pure-business pair clamps at 0.65. Pure-leisure clamps at 0.15. Math that doesn't blow up on weird inputs, Captains.'
And here's the part Casey is proudest of: THE PER-CLASS REVENUE PIPELINE IS WIRED INTO get_monthly_profit() — BUT IT ONLY RUNS WHEN A ROUTE HAS AN EXPLICIT CABIN OVERRIDE. 'Every route today has NO override, Captains. So every route today runs the EXACT SAME REVENUE MATH as before. Zero regressions. Zero AI rival bankruptcies. Zero anything. But the moment Phase C ships the stepper UI, and you click Override on a route? BOOM. Class-aware revenue kicks in. I built the cannon. Phase C loads the ammo.'
Casey rolled in with a protractor and a stack of pitch measurements. 'Captains, before I let you CONFIGURE cabin classes, I first need to install the MATH that decides who fits where. ECONOMY: 1.0 space units per seat. PREMIUM ECONOMY: 1.5 — a little more legroom, a little more shoulder. BUSINESS: 1.6 — proper armrests, lie-flat on widebodies. FIRST: 2.5 — you could PARK A CAR in that footprint. These aren't numbers I made up, Captains. These are REAL pitch ratios. I measured them.'
Then Casey wired up the era gates. 'FIRST CLASS didn't exist until 1960. BUSINESS CLASS is a 1955 invention. PREMIUM ECONOMY? That's a NINETEEN-NINETY-TWO thing. And nobody — NOBODY — is putting a lie-flat in a nine-seat Cessna. My helper now REFUSES to mark a class available unless the year is right AND the aircraft is big enough. I built templates too: All-Economy, Regional, Leisure, Balanced, Business, Premium. Six preset configs that ship DEFAULT so players don't stare at a blank stepper wondering where to start.'
And every Route now has a cabin_override slot. 'Empty by default, Captains. When Phase C lands the UI, you'll tick a box and customize ONE route differently from the rest of your fleet. Until then? The slot exists. The math works. Saves load forwards and backwards.' Sixteen new unit tests prove it: space budgets, era boundaries, template validity, aircraft-type defaults, override round-trips. 'Zero behavior change in this patch, Captains. Zero. But the SCAFFOLDING is up. Phase B splits demand into business vs. leisure pools. Phase C gives you the stepper panel. Phase E teaches it all.'
Casey slammed a clipboard on the counter. 'Captains, how are you supposed to PICK an aircraft when you can't even READ its stats?! You want to know the range on a 737? You open the SHOP. You want to know the same range when you're in the hangar? You CLICK AROUND like a tourist at a museum gift shop!' So Casey built the Aircraft Info Panel — a reusable spec sheet that opens from anywhere you see an aircraft name. Click a row in the Aircraft Timeline and every stat is right there: capacity, range, cruise speed, era label, purchase price, and monthly lease rate. 'ONE panel, Captains. Readable from ONE click. From ANYWHERE.'
Then Casey slapped four little chips onto the bottom of the panel — Economy, Premium Economy, Business, First — showing which cabin classes THIS aircraft can eventually carry and what YEAR they unlock. 'First class didn't exist yet in 1938, Captains. Premium economy didn't exist until 1992. And a nine-seat Cessna is Economy-only no matter WHAT year it is, because you physically cannot fit a lie-flat seat in a bush plane. My chips say so. The locked ones have PADLOCKS. The tooltip tells you when to come back.'
And the panel auto-reflows for Steam Deck. 'ONE thousand four hundred pixel threshold, Captains. Below that, the two-column spec grid collapses to one column, so nothing clips off your handheld. I tested it. I re-tested it. I made a SPREADSHEET.' A 'Cabin Configuration' placeholder section is wired up too — currently shows 'Economy at full capacity' for every plane, but the interactive editor lands in a future patch. For now, you click the plane, you get the paperwork. That's how captains pick aircraft.
Casey audited Phase 26e and came back furious. 'Captains, I wrapped every tutorial line with tr() and patted myself on the back — but then I cracked open the German PO file and guess what? ZERO of my dialogue was in there! The Godot POT scanner only reads .gd files, and my 135 chapter titles, 135 Casey monologues, and 135 skip reasons ALL LIVE IN A JSON! They were ghosts! Translatable in theory, invisible in practice!' He taught tools/generate_pot.py a new trick — walk data/tutorial_steps.json, pull every title/casey_text/skip_reason plus chapter names, and inject them into messages.pot with proper source refs. POT size jumped from 1,715 → 2,120 strings. 'Four hundred and five lines of aviation-themed sass, Captains. Now Weblate gets to see them ALL.'
Then Casey wrapped the remaining stragglers. Chapter names in Settings → Tutorial Chapters dropdown now route through tr(), so French captains see 'Ch 3: Votre première ligne' instead of English leaking into a translated UI. 'A dropdown that's HALF in English and HALF in Spanish is WORSE than no translation at all, Captains. Casey does NOT do half-measures.'
And because the roadmap asked for it, Casey tucked a multiplayer_version field into tutorial_progress.json. 'Reserved. Zero for now — singleplayer only. But when Co-op lands someday, we don't have to migrate six save formats across twelve regions. Pre-flight the schema, Captains. Future-you will thank past-you.'
Casey stared at the first weather pass and slapped the map. 'CAPTAINS. This looks like a PAINT-BY-NUMBERS book. A KINDERGARTNER would not accept this as a radar return!' He ripped the grid-of-rectangles approach out of the precipitation layer and baked every storm into a noise-textured ImageTexture using Perlin fBm — two octaves, elongated along a comma-head axis for extratropical lows, kept round for tropical cyclones with a proper eye hole at the center. 'SMOOTH ORGANIC GRADIENTS, Captains. Like actual RADAR. Not MINECRAFT.'
Then Casey found the storm's TELEPORTING. 'The entire map BLINKS at midnight every game-day?! That's not weather, that's a SLIDESHOW!' He built a lifecycle system: every storm has an age, a lifespan, and a smootherstep (quintic, Captains — six-t-to-the-fifth, fifteen-t-to-the-fourth, ten-t-cubed) envelope for fade-in and fade-out so transitions have zero first AND second derivatives at the boundaries. 'Math nerds will appreciate this. Everyone else: the fades just LOOK RIGHT now.'
And Casey refused to let the storms sit still. 'Real weather MOVES.' Every tick, each storm drifts by its local wind vector filtered through a 10% low-pass, so storms develop INERTIA and curve instead of jitter. Mid-latitude systems get a prevailing-westerly eastward bias plus a slight poleward curl (polar-front behavior); tropical systems get a westward trade-easterly bias. 'North Atlantic lows now curve toward ICELAND. Tropical waves drift WEST across the Pacific. The sky HAS RULES now.'
Then Casey caught the framerate hemorrhaging. 'Each storm spawn was generating a NINE-THOUSAND-PIXEL TEXTURE on the HOT PATH?! On the STEAM DECK?! Captains, you cannot do NINE THOUSAND anythings in a single frame and expect sixty.' He throttled storm spawning to one every two seconds and dropped the lifecycle tick from 60Hz to 20Hz (storms move slowly — no human eye can tell). 'Sixty solid frames, Captains. Casey negotiates with the GPU so you don't have to.'
Also: isobars and cloud-cover grids default OFF now (they were adding noise without carrying their weight), the field grid dropped 144x72 → 72x36 (four times fewer cells with bilinear interpolation keeping the smoothness), pressure extrema cache per-month so fronts + H/L labels stop rescanning 1.2 million comparisons per redraw, and map-pan redraws are capped at 10Hz so fast scrolling no longer guns the CPU. 'Weather that LOOKS like weather, MOVES like weather, and FLIES like weather, Captains. Everybody stays at altitude.'
Casey ripped out the stylized storm blobs. 'THAT was supposed to be a hurricane? It looked like a FINGER PAINTING from a KINDERGARTEN ART CLASS!' He installed a proper aviation weather chart: ISOBARS (those curly equal-pressure lines with H and L labels), fronts with real symbology (cold fronts in blue with triangular barbs pointing where the cold air is shoving, warm fronts in red with little semicircle bumps), JET STREAM flow arrows that meander seasonally across each hemisphere, cloud cover overlays, and precipitation radar driven by actual climatology rather than painted splats. 'My map looks like an FAA sectional now, Captains. Because it IS.'
Then Casey lit up the hubs with METAR CHIPS. 'Every major airport gets a COLORED DOT next to its label. GREEN is Visual Flight Rules — clear, flyable, textbook day. BLUE is Marginal — some cloud, some haze. RED is Instrument-only — expect DELAYS. MAGENTA is Low IFR — NOBODY is flying, not even the pigeons.' Chips come with shape cues too — a ring, a dash, a cross — so colorblind captains can read them at a glance without squinting at hue. All routed through AccessibilityPalette, all translation-ready.
And the weather is no longer DECORATIVE. Casey wired it into the economy. Jet stream gives eastbound flights a tailwind speed boost; westbound flights pay the tax. Hurricanes CLOSE airports within 200 km of the eye. Volcanic ash plumes from the 1883 Krakatoa, 1980 Mount St. Helens, and 2010 Eyjafjallajökull — all real, all baked from Smithsonian data — shut down entire regions for weeks. Fog-prone hubs (SFO, LHR, ORD) roll climatological fog days that delay operations. Monsoon season clips up to 10% of demand on routes crossing S/SE Asia and W Africa, June through September, the S hemisphere, December through February. 'Weather is a CAPTAIN'S PROBLEM now, not a COSMETIC SUGGESTION.'
Casey added Tutorial Chapter 16: 'Reading the Weather Map' — ten steps walking captains through every symbol, every color, every gameplay consequence. Because nobody is flying into a Category 5 without knowing what that cone on the map MEANS. The new overlay only activates once you've run the dev-only harvest pipeline to bake the climatology data — until then, the legacy system keeps flying, so no existing save is affected. 'ONE system at a time, Captains. Casey does NOT do forklift upgrades mid-flight.'