Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Letting Go of Control: Building a Game with My ...

Letting Go of Control: Building a Game with My Kids and AI

I’m a freelance developer who wanted to combine making games with spending time with my children. Naturally, I added AI to make things simpler. That went about as smoothly as you’d expect.

This talk follows the experiments, failed attempts and changes of direction behind Don’t Go To Bed, a game we built together for Android and iOS using Kotlin and Compose Multiplatform.

I share where AI helped, where it created more work, how playable prototypes changed our decisions, and what happened when I stopped treating my children’s ideas like requirements I could quietly rewrite.

For developers curious about AI-assisted development, side projects and getting useful feedback before building too much.

These slides accompany a live talk. Videos and animations appear as still images in this PDF.

Game and project links: https://jamescullimore.dev/dontgotobed/

Avatar for James Cullimore

James Cullimore

October 12, 2026

More Decks by James Cullimore

Other Decks in Programming

Transcript

  1. THE OLD DREAM Eventually, I built it. Elchem · Droidcon

    London, 2025 No engine. No budget. No clue. Watch last year’s talk jamescullimore.dev/elchem/ 05
  2. THE BOYS INVENT A GAME 02 The boys take over.

    Their imagination. Our next adventure. 09
  3. THE BOYS INVENT A GAME Leo grabs the scrapbook. The

    first design document. NO TICKETS REQUIRED 13
  4. THE BOYS INVENT A GAME Three halves of a game.

    ½ ½ ½ Minecraft Stunt Car Extreme Mario Kart Ambition: excellent. Maths: negotiable. 14
  5. THE BOYS INVENT A GAME MULTIPLAYER They wanted to play

    together. I started thinking about servers. 15
  6. THE BOYS INVENT A GAME Meet the development team. LEO

    IAN DADDY Ideas + drumsticks Chaos + rabbit Implementation + fists 17
  7. THE BOYS INVENT A GAME Find Mammy. Before bed. Ian

    wanted Mammy. That became the story. THE ADVENTURE US FIND MAMMY 18
  8. THE BOYS INVENT A GAME And then the ideas kept

    coming. Original scrapbook ideas 01 02 03 Drum-kit powers A giant cat Berserker Leo Ian Daddy Plus bosses. Biomes. Crafting. Treasure. Multiplayer. 19
  9. THE ORIGINAL PLAN FAILS 03 Let's build it. The obvious

    plan lasted about ten minutes. 20
  10. THE ORIGINAL PLAN FAILS They wanted to create. I started

    coding. I needed to give them something to do. 22
  11. THE ORIGINAL PLAN FAILS Make something they can see. Now

    we all had something to look at. Try a look. Change a detail. An opinion becomes a visible change. 23
  12. AI AND ANDROID One more problem. iPads. The devices they

    actually use. ? How do we get there? Android → iPad 29
  13. AI AND ANDROID Three unknowns at once. The first KMP

    + Junie attempt did not go well. ? ? ? KMP / CMP The agent Me New platform work New way of building New things to learn 30
  14. AI AND ANDROID Back to Android. Back on a platform

    I knew. 01 02 03 Android Junie A playable game Familiar platform New workflow Something to test 31
  15. AI AND ANDROID Jump. Land. Play. One small mechanic was

    enough to change the mood. var v = 1980f val g = -3000f val frameMs = 16L val dt = frameMs / 1000f v += g * dt heightPx += v * dt fdbaae2 · MainActivity.kt · selected lines; comments and surrounding control flow omitted 32
  16. REALITY CATCHES UP The comment isn't the behaviour. THE COMMENT

    “With g = -3000 px/s^2, choose v0 ≈ 620 px/s for peak height ~64 px (≈1.6 tiles),” var v = 1000f // px/s upward val g = -3000f // px/s^2 Read what it does. Not just what it says. 11a1962 · MainActivity.kt · verbatim comment line and code 36
  17. REALITY CATCHES UP Describe the behaviour you want. var v

    = 1000f ↓ val targetJumpHeightPx = unitPx * 4f var v = sqrt(2f * -g * targetJumpHeightPx) A more explicit target — with a different intended jump height. 11a1962 · MainActivity.kt → 6f37070 · GameScreen.kt · inline comment omitted 37
  18. REALITY CATCHES UP Connected isn't the same as shared. Two

    phones need the same meaning for “here”. BEFORE · MIXED UNITS fun sendPos( AFTER · GRID + FACING fun sendPos( xDp: Float, col: Int, row: Int, heightPx: Float facingRight: Boolean ) ) 29bfd5f versus its parent · MultiplayerManager.kt · signatures reflowed; bodies omitted 38
  19. REALITY CATCHES UP “Go to the shop and get some

    bread, and if they have eggs, get six.” They had eggs. So: six loaves. Ambiguous instructions. A very literal result. 41
  20. TRY AGAIN The tools changed. So did I. 01 02

    03 Frameworks Agents Experience Another attempt A different workflow Fewer unknowns 44
  21. TRY AGAIN Same game. Different device. Shared Kotlin + Compose

    World · game rules · rendering · UI Android iOS Entry point + transport Entry point + transport 45
  22. HOW WE WORK NOW One idea. A small attempt. Play

    it. Record → choose → build → check → play Then decide what to change. 48
  23. WHAT LETTING GO MEANT 07 It was always our game.

    We all had something to do. 49
  24. WHAT LETTING GO MEANT Their game. Their friends. Their T-shirts.

    Leo wanted to support other indie developers. Free gameplay. Optional tips added for Shipaton. Released on Android and iOS. 51
  25. WHAT LETTING GO MEANT There are more stupid ideas. Next:

    a workbench and a few recipes. Then see what they actually do with it. 52
  26. TAKE IT WITH YOU Links, code and the slides. Don’t

    Go To Bed — Android + iOS jamescullimore.dev/dontgotobed/ Open-source code github.com/LethalMaus/DontGoToBed Get the game Elchem jamescullimore.dev/elchem/ Last year’s Droidcon talk Building a Mobile Game Without an Engine, a Budget, or a Clue Android iPhone / iPad Watch the previous talk This deck will be available on Speaker Deck. 53