Making character creation a surgery room in Godot
A new game now opens on a ceiling camera over four operating tables, with a scripted ending and race price multipliers. Stage one of four, on stand-in props.
A new game of Blobber no longer opens on a creation screen. It opens on a ceiling camera over a surgical room, and you pick four bodies at four operating tables while a scientist whistles at you. It’s only the first of four stages, so it’s all stand-in props and the pages still look like the old screen.
I wanted creation to be a scene in the game instead of a menu. You’re the AI watching Chief Scientist Carl make your bodies, from a camera over a room with four tables. Each table has a body tube on one side, like an old pneumatic mail chute, and a shredder in the floor on the other. The bodies are puppets and the class you give one is an imprinting. You pick a table, then a race, and the puppet slides out of the tube onto the table. Then you pick its imprinting and spread its points. If you change your mind about the race, the old puppet is tipped into the shredder and a new one drops.

The empty room from the ceiling camera. Four tables, each with a tube coming out of the wall and a shredder, and the juice vat in the corner.
How does the game get from a menu into a room?
The room is the Breakout Site’s birthing chamber, so the scene is built in the dungeon itself and not in a separate level. When a new game starts in a dungeon that content/creation.json has a block for, the vat-birth code hands over to a new script, CreationTheatre, which runs the whole thing as a state machine: waiting for the dungeon to finish building, the wide view, the race list, a body dropping, the imprinting, a paused state for the “leave?” question, the ending, black, and the party rising. Everything runs on the real clock, because no game time passes until the party stands up.
The JSON file has one block per dungeon. It holds where the four tables are (x, y, and a side of 1 or -1, where -1 is the station in a mirror), which wall each tube comes out of, the button and the door the cultist comes through, where the party wakes and which way it faces, and the lines Carl says. A line is a list that’s picked from in turn, and the race and imprinting lines have a set for each id plus a default. Every line is a placeholder for me to edit.
The camera is a Camera3D put 0.45 m under the ceiling at field of view 68. Picking a table, by number key, mouse or cursor, eases the camera to a close view, and Carl walks to the table by a route that goes around the others through the aisle. I had to move several things after watching it. The ceiling went from 4 m to 8 m for the camera’s sake. The tubes now turn at 3.2 m and run level to the wall, so the camera sees over them. The button first sat on the south wall, behind the camera, so it moved to the north wall, and the two tables in the east column are mirrored so all four shredders face one aisle.

A goblin drops while the elf it replaces goes into the shredder, with Carl’s comment.
What do the races do?
All ten races from my earlier list are in content/races.json, and five can be picked, because the other five have no body yet. Those show grayed out with “not yet available”. The five are human, elf, goblin, dwarf and lizard people.

The race list. Under the highlighted row is the race’s line and what it does to the growth curves.
I asked for race to change the stats, and said I thought it should be growth curve multipliers. So each race has a multiplier for each of the five stats (Muscle, Tendons, Fat, Grey Matter and Machine) on the XP a point of that stat costs. Under 1 is cheaper and over 1 is dearer. The class already had one, so the price is class times race: XpRules.stat_cost_as(cut, race, stat, value) takes the class’s curve with the class’s multiplier times the race’s. An elf’s Muscle is 1.15 and Tendons 0.85, and a dwarf’s Muscle is 0.9 and Tendons 1.25. The numbers are mine and I expect to change them.
A race changes no starting stat. A member has a new saved race field that defaults to human, so older saves load as before. A human has every multiplier at 1.0 and takes the old pricing path, so the default party didn’t get any more expensive. The test prints it: a default Brisket’s next point of Muscle at 20 costs 20 juice before the change and 20 after, 23 for an elf and 18 for a dwarf. The stats pane’s price breakdown gained a line for the race, like “x1.15, Elf’s Muscle”.
Why is the imprinting page the old screen?
I didn’t rewrite the creation rules. The old creation screen’s editor is kept and runs for one member at a time, which I call solo mode, and the theatre opens it for the table you chose. It’s drawn at 0.75 scale with its pivot at the right middle, so the table shows to its left.

The imprinting page for one puppet, the old creation screen’s rules, with the goblin lying on the table to its left.
That’s a stopgap. Its right edge is at about 1,260 pixels of a 1,280-wide window and I haven’t tried other sizes. The next stage is to rebuild creation as subpages in the inventory screen’s style, which is also what I asked for in the same spec, and that replaces this.
How is the ending built?
Pressing BEGIN plays one tween of timed callbacks, a table of beats in seconds. The cultist, Assayist Pell, comes in by the secret door at 1.4, stabs Carl at 3.6 and gets shot at 4.6. He stumbles to where his body lies in the dungeon and dies there. Carl crawls to the button, presses it at 13.2, and the puppets rise at 13.8. The blast is at 16.6 and black at 17.6, then 1.6 s of black and a 4 s rise from the floor into the party. Interact or a held key skips it.

The stab. The cultist shouts, Carl answers, and the four finished puppets lie on their tables.
The part I like is how little the ending has to undo. The after-scene is the room the dungeon’s sheet already builds: tables empty, Carl hunched by the chest where you talk to him, and Pell’s body where it lies. So the theatre hides the real Carl and the real Pell and plays two figures, along with the four puppets, under a SurgeryCast node that’s freed at black. A load or a wipe has nothing to replay. The furniture stays up for good. Each station is a table, a tube, a shredder, a lamp and a tag, and the button and the camera housing are children of one Surgery node.
Carl hunched is the existing tired idle, picked by a third word in his figure name.
The whistle is synthesized. A function bakes a note list into an AudioStreamWAV at 22,050 Hz with 0.19 s a beat and plays it at -13 dB. The puppets’ rise is the death clip played backwards for 2.4 s. A new game gets the surgery and a wiped party still climbs out of the vat, which is what I picked when asked.
What broke and what is left?
Every prop is a box or cylinder built in code, one function each (table(), tube(), shredder(), button() and camera_housing()), so each has exactly one place its model goes. The puppets come from a function in the theatre because the game’s figure code only knows humans.
Building it threw one error, a typed lambda over a body that had already been freed in the shredding code. In the full run, four tests that this broke needed fixing, the menu test, the machines test and two save tests, and one more fails on main as well. Three older films that drive the retired opening now hang if recorded, and I haven’t fixed them.
I checked it with 160 checks in the theatre test, 125 in the rewritten new-game test, which builds the default party both ways and finds none of 19 fields differing, and 26 in the price test. The film is 87 seconds.
I still need to do the creation pages in the inventory screen’s style, real models through the model pipeline for the table, tube, shredder, button and camera housing, and the clips and sounds for the surgery, the stab, the shot, the stumble, the rise and the whistle. Five races also have no body, and a member’s race only chooses its body at the table, so nothing else in the game draws it yet.