Stadium Escape: building a ballpark with my son
My son has been asking what I do at work since he could talk, and the answer I gave him was always true and useless. So we built a Roblox chase game set in an homage to a very recognizable Phoenix ballpark. The premise came from two kids in the back seat on the way to Ace Hardware.
- project
- Stadium Escape
- published
- 2026-07-28
- updated
- 2026-08-10
"Dad, what do you do at your job?"
Austin is 11, and he has been asking me that question for years, almost always under the same circumstances. I would be packing a bag to fly out to a customer for a few days, and he and his sister Hannah, who is 9, would be unhappy about it in the particular way kids are unhappy when something has already been decided. What softened it every time was telling them where I was going and why it mattered, which worked well enough that it became the routine before every trip.
The answer I gave about the job itself was true and completely useless. I find problems and I build solutions to them, usually in software and sometimes in hardware, and then I would tell them that dad has to go make money, and that is where it always ended. He would nod, because there is nothing else to do with a sentence like that. None of it is visible to a kid.
I had just left Axon and taken some time off to figure out what came next, and two unrelated things were sitting on my mind at the same time. The first was that I wanted to drop myself into a domain I had no business being in and find out how far AI could actually carry me. That is a more interesting question than whether it can write a function I already know how to write. The second was Austin, and baseball already covers a great deal of ground between us, since he plays it and watches it and talks about it constantly, but it does not cover the half of my life he has never seen. He is also close enough to being a teenager that I am not naive about what that usually does to the distance between a father and a son. I would rather build something with him now than negotiate for the time later.
The idea of making a Roblox game came up a few weeks before any of this started, on a family trip, and I was the one who brought it up. It genuinely surprised him that the two of us could actually pull it off, because he has spent years watching videos of Roblox builders without ever learning to code, which made those people a different species. I was in the same position from the other side, having never once opened Roblox Studio and not even owning an account.
The car ride to Ace Hardware
The idea sat there for a couple of weeks until a Saturday when Austin and his best friend Christian were playing whiffle ball in the yard. Christian is 13, lives in the neighborhood, plays travel ball, and is every bit as baseball-obsessed as Austin is. I needed a bottle of Simple Green to clean the pool filters, so I asked whether they wanted to ride to Ace with me. That is a question they always say yes to, and never because of the hardware. Ace carries packs of baseball cards and whiffle ball bats, and the two of them buy the bats to wrap in electrical tape and turn into custom ones for their friends.
Somewhere between the driveway and the store the game came up again, and Christian threw out the seed that became the whole thing: what if you play as a streaker trying to get away from security?
That single image is the entire game compressed down to one sentence. It hands you the objective (run), the antagonists (guards), the tone (slapstick, never violence), and a built-in reason that forty thousand people are on their feet watching you. All three of us loved it immediately, and that idea is what moved this from something I was thinking about into something I was going to build.
The two things ChatGPT talked me out of
ChatGPT is my brainstorming partner and my first stop for most questions, so I took the streaker premise to it, and it pushed back on two things I did not particularly want to hear.
The first was that leaning hard into the streaker would shrink our audience for no real gain, so we toned it down, and our streaker is fully dressed. The joke survives the edit, which is the tell that it was a good joke rather than just a shocking one, and the chase was always the funny part anyway. Nothing stops us from selling a streaker skin later.
The second was that recreating a real ballpark, which was my original plan, is a trademark problem waiting to happen, and that we should take cues from a real place instead of copying it. That became the rule we wrote down and have kept since: homage, not replica, meaning real proportions and iconic features with zero real branding anywhere in the park.
Choosing which ballpark took no thought at all, because we have Diamondbacks season tickets and that is where we go together. So the first map is an architectural homage to a certain downtown Phoenix stadium, the one with a swimming pool in right-center and a roof that slides open sideways. The theory is that a kid who has sat in those seats should look at the gray-box version and say the name out loud before anyone tells him.
The boring part is dad's job
I took a day and did all of the setup by myself, on purpose. That meant accounts and parental controls, Roblox Studio, a git repository, Rojo so that code on my Mac syncs live into Studio, and the AI tooling. Then came a first rough build with Claude that produced a gray-box stadium and just enough chase mechanics to press Play. I deliberately did not push far on how the gameplay felt, because I do not play Roblox and have no instinct for what good feels like there, and that was never going to be my half of this project.
I did all of that alone because an 11-year-old's enthusiasm has a half-life. If his first hour of game development is spent installing tools and untangling merge conflicts, then I have spent his excitement on the least interesting part of the work and I will not get it back. I wanted the kitchen finished before he started cooking.
Two days went into a written decision log before any of that, which felt wrong while I was doing it and was clearly right afterward. Its real job is not recording what we chose, it is stopping a future session, human or AI, from quietly relitigating a decision at 11pm because the decision looks like a mistake once its reasoning has been stripped off. Four entries carry most of the weight, starting with the rule that gameplay beats architectural accuracy every time, and that we gray-box first to prove the chase is fun with ugly blocks before anything gets pretty. Mobile is a hard requirement rather than a nice to have, because his friends all play on phones, and the game is slapstick, never violent.
That last rule has a specific shape to it, which is that the guards carry tasers firing a slow, dodgeable projectile that ends in sparks and a pratfall. It is a nod to my Axon years and it is also the reason nothing in this game ever draws blood. It is one of the few places where the answer to "what does dad do" is sitting right there in the game where he can see it.
Every number that controls how the game feels lives in a single Config.luau file, and the comments in it are written to him rather than to a compiler:
The nine-inning escalation table in that same file is labeled "THE difficulty dial," with one row per inning annotated from -- 1: learn the loop through -- 9: controlled chaos. When he decides the guards should be scarier in the sixth, he changes one number and presses Play without asking me for anything.
Then I turned it loose overnight
The next step was the experiment I actually wanted to run, which was to find out how far a long, unattended AI build gets on its own with nobody watching it.
I gave Fable everything I knew about the ballpark from memory, then had it go research the place itself to pull out the elements that make you recognize it within the first two seconds of looking at it, and then let it run overnight. What came back was 594 parts of stadium, all generated in code, with the full nine-inning game loop underneath it. The outfield wall came back correctly as straight segments rather than a curve, and asymmetric at 330 feet down the left line against 334 down the right. Keeping that asymmetry is the right call, because symmetric numbers read as generic and a four-foot difference is exactly the kind of detail that makes a place feel like a real place. Above it sat four seating tiers, a 360-degree concourse chase ring, the elevated pool suite, and an eight-panel telescoping roof.
Since an overnight session cannot press Play, it built itself eyes first. That meant a headless harness running the real stadium generator and a 53-check validator entirely outside of Roblox Studio, twice in a row, to prove that a rebuild replaces the world rather than quietly duplicating it. Then an adversarial review went hunting for player-shaped failures, with a skeptic verifying every claim before it counted, and it confirmed 22 real bugs and zero false alarms.
The good ones were the ones a validator was never going to catch. The pool, which is the entire win condition of the game, was unreachable, because an access ramp ran underneath a walkway slab. The whole pool suite had shipped mirrored front to back from a single flipped coordinate frame. There was a wedge-shaped hole behind home plate that dropped you out of the world, and dying while the clock was still running opened up a reset-spam exploit that let you clear innings without playing them.
Every one of those 53 checks passed while the stairs ended at a wall, which is the difference between a building that passes inspection on the blueprints and a building somebody has actually walked through. Generation plus validation gets you remarkably far, and only an adversary thinking like a player finds that particular class of bug. What came out the other side was not perfect, but it was something more useful than perfect, which was a real, walkable ballpark I could put in front of my kid and tell him was ours.
"Wait, AI can do that?"
Then I had Austin play it, and he got about a minute in before he stopped and said, "Wait, you don't have to do it in Roblox builder. AI can do that? This is crazy," and I told him yep, that it is like having an engineer working for us, and that our job is to come up with the ideas and test them. That was the answer to the question he had been asking me since he was little, and it landed in about four seconds, because it was not a description of my job, it was a demonstration of it.
He started calling out bugs and gameplay changes almost immediately, the way kids do, all at once and with no ranking whatsoever. So we did the actual work of taking the whole list, talking through which parts mattered most, and scoping it down to changes small enough to finish that night. Then we wrote the prompt together, Claude made the changes, Rojo pushed them straight into the running game, and he was testing them a few minutes later. That is the part that got him, and it was never the stadium.
The bug I could not fix and he could
The slide tackle was Austin's idea in the first place, which was that you should be able to slide into security and bowl them over, and I built it, and it did not work. He would slide into a guard, the guard would go down, and he would lose a life anyway, every single time.
The first two attempts were straightforward mistakes of mine. The tackle only fired once, at the instant the slide began, and it checked for guards near where he had been standing rather than where he was sliding to. It was looking in the wrong place at the wrong moment, and finding nobody. On top of that the guards updated before the tackle did, so the guard he was tackling could still catch him in the same frame he flattened it. I fixed both, and he still lost a life.
After a third miss by inspection I stopped guessing and had the game instrument itself, printing one line per slide with every guard's distance and whether the tackle had landed. The log came back looking perfect: one guard floored at 7.8 studs, the callout firing, and a life lost anyway. Inning one has two guards, so he was flattening one of them while the other picked him up as he got back to his feet, which is why I gave a landed tackle a 1.25 second grace window. He still lost a life.
At that point the logs were telling me everything worked and the game was telling me otherwise, and I was out of ideas. Austin, who had by then played the same six seconds something like thirty times in a row, told me what was actually happening. He was not getting caught at all, he was getting tased while he was standing up.
That turned out to be the whole thing, because leaning the body past roughly 60 degrees makes Roblox's humanoid decide you have FALLEN OVER, which flips it into FallingDown and then GettingUp and plays a multi-second stand-up animation you cannot cancel. So a slide lasting six tenths of a second was leaving him on the grass for several seconds afterward as a stationary target, and a taser guard picked him off every time. I had written that lean myself a few hours earlier for the sole purpose of making the slide look real, which means my realism was the bug. Extending invulnerability had been treating a symptom of a problem that should never have existed, because he should never have been on the floor in the first place.
The fix disables FallingDown for the duration of the slide, so the tilt reads as a pose instead of a tumble. It then forces him upright and running the moment the slide ends, so there is no animation to sit through. A slide also makes you untouchable while it lasts, which turns ducking under a taser shot into a real move, and he capped it at three slides per inning himself so that it does not become free immunity. The whole hunt ran about ninety minutes across thirteen commits. I wrote all of the code and he found the bug, by playing the game thirty times while I read logs, and having spent my career around engineers I can tell you that is exactly how it goes.
What's next
Rattler Park is built, but it is not yet fun, which is a different and considerably harder problem, and closing that gap is the next real stretch of work. The surprise so far has been Hannah, who I assumed would have no interest in any of this and who has turned into one of our better testers. She genuinely likes the game, so what started as a way to show one kid what I do has quietly become a way to spend time with both of them on something that is not baseball.
After the tuning comes co-op, which is Austin's design: a spawn island out in front of the stadium with a pad you stand on together to start a shared run. Then we publish it in a limited state and get Christian and the rest of the boys in to break it, which is the only test that has ever mattered here. Not whether it validates, but whether a pack of middle schoolers wants a second run.
