An AI Art Department in a Python Folder

Every character in Roadie Wars 5 is drawn by Gemini — kept on-model by a pipeline that treats prompts like a legal document and chroma-keys like it's 1998.

The original Roadie Wars had hand-me-down art. The iPhone game needed a full cast — seven playable roadies, bosses, zombie groupies, VIPs — each with portraits, big comic-panel versions, and a seven-pose action set (idle, kick, hold, shoot, hurt, climb, dead). That's hundreds of images. I am one person. Enter the robot art department: Google's Gemini image models, wrapped in a small Python pipeline that lives in the repo at tools/gen/.

The cast gets drawn once, then redrawn in every pose

The interesting part isn't "we used AI art." It's what it takes to make an image model behave like an art department — same character, same wardrobe, same camera, four hundred images in a row.

Prompts are ordered like a contract. Our prompt builder assembles five blocks — LOCKED, PRIORITY, TASK, STYLE, AVOID — in that order, because the model weights what it reads first. Non-negotiables go on top. The AVOID block ends up being where the war stories live: it specifically forbids defaulting to red hair, because given any ambiguity, the model would quietly give everyone red hair.

References beat descriptions. There's no seed parameter and no "same character" API. What works is attaching the previous image and telling the model, at length and in capitals, that this is the same person and deviation is forbidden. Politeness does nothing. The shouty block works.

Chain off idle, anchor to the portrait. Poses are generated as a chain — each new pose references the previous one, which is already in the right crop and light. But a chain of copies drifts, so every frame also gets the original portrait attached as a second reference: "these are two views of one person." One image says where the camera is; the other says who they are.

The costume is an itemised checklist. When our stage manager Cole came back from a redraw in a red hoodie, the fix wasn't a better adjective — it was a COSTUME block listing headwear, outer layer, under layer, work kit and markings, sent with every single frame. At 112 pixels tall, the beanie is the character.

Old-school chroma key, new-school key colour. Everything is generated on green and keyed out in Python. One frame came back on a green that was 1 point off our threshold and the whole backdrop survived into the sprite. Lowering the tolerance would have started eating Cole's green beanie. The fix: sample the border of each image and key against the green that image actually used. Twenty-five years of VFX wisdom, rediscovered one afternoon at a kitchen table.

The pipeline's output: 419 art files and counting, all waist-up (the game draws legs in code), all on-model enough that players assume there's an illustrator. There is. It just runs on an API key.


This is part 2 of a five-part series on building Roadie Wars 5 : Stage Climb:

  1. Why our first iPhone game starts at 5
  2. An AI art department in a Python folder
  3. The whole tour is a JSON file
  4. Comic cutscenes and a localhost editor
  5. Shipping an iPhone game with a robot on the mixing desk

Roadie Wars 5 : Stage Climb is heading to the App Store — climb the rig, save the tour.