Slice Tilt: a pinball pizza with four tables and no teleport
· 5 min read · game-dev, three.js, webgpu, physics, game-design
Slice Tilt is a free pinball game for the browser where the table is a round pizza cut into four slices. Each slice is a complete table with its own theme, rules and music: an archery camp in a forest, a factory, a castle and a town. Only the slice that faces you is alive. When you complete its objective and send the ball into the oven in the middle of the pizza, the whole pizza turns 90 degrees and the ball comes out of the next table.
It builds on my previous pinball, Graveyard Pinball, and was made from October 6 to October 9. This post is about the design problem that decided everything else: how do you make four pinball tables out of one pizza?

A slice is the wrong shape #
A pinball table is tall and narrow, about 1 to 2. A 90 degree slice of a round pizza is the opposite: the base is about 1.41 times the radius and the length from the tip to the crust is the radius, so the slice is wider than it is long, about 1.4 to 1. Cut off the tip and it gets even shorter.
The slices also have to be identical, so a turn of 90 degrees always brings the same outline to the front. That rules out oval pizzas and cuts that miss the center.
What works is a table shaped like a house: the top follows the two 45 degree cuts of the slice from the tip, and under the "knee" the side walls are vertical, followed by the funnel to the flippers. Around the walls, between the table and the cuts and crust, there is room for scenery: stalls, trees and rocks. The playable area stays pinball-shaped, and the decor takes the rest of the pizza.
The hub is the rotation axis #
You could imagine a teleport between tables. The geometry gives a better answer for free: the hub is the rotation axis. When the ball falls into the hole in the center of the pizza it is already on the axis, so nothing has to move it. The pizza turns around the ball, and the ball comes out of the next slice's oven.
In code, the hand-over has four steps:
- The ball goes into the oven of the front slice, only if the gate is open, meaning the objective is done. The simulation hides the ball for a hold time.
- The pizza starts turning toward the next slice and takes a little less than the hold, so the next table is already in place when the ball is handed over.
- When the hold ends, the simulation does not eject the ball, it hands it over: the old table is put away and its objectives start over, the new table becomes the front one and receives the ball at the mouth of its oven.
- Score and balls are global. If you lose a ball, the next one waits on the plunger of the slice you are on.
One physics world per slice #
Each slice has its own Rapier2D world, and only the front one is simulated, as in Graveyard Pinball: the simulation is 2D and Three.js only draws it. The three dormant slices are dark and "covered", with no collisions, no lights and no score running.
The tables are not drawn by hand. Each slice has a layout file that returns three things: the physics description (walls, slingshots, flippers, portal), overrides for the simulation, and the visual description (props, lamps, glows, particles). A script turns the layouts into the simulation's JSON, the painted boards are built by script too so the art always lines up with the colliders, and a check fails the build if a committed JSON is out of date.

A bot as a level designer #
I could not tell by playing whether a table was fair, so I made a bot play it, with human-like sloppiness, and measured it. The first layout of the forest looked fine:
| Change | Mean ball life | Where balls drained |
|---|---|---|
| first layout | 8 s | 82% down the right outlane |
| boulders on the side walls, slingshots sloping inward | 71 s | right outlane 30% |
| flipper pivots 0.34 to 0.38 (gap 0.20 to 0.28) | 50 s | middle 60%, right 26% |
The first number is the useful one. An 8 second ball means the launched ball rolled down the right wall straight into the outlane, which is the kind of problem you do not notice until you play many times. For reference, the Graveyard Pinball table averages about 42 seconds with the same bot.
The castle had the same problem in a different shape: its first layout lost 89% of the balls down the left outlane in 14 seconds. The wall with the doors had nothing to slide a ball riding the wall back to the middle, and a second wedge, a fallen tower under the doors, is what made the table work, at 56 seconds. The town started from the castle's two-wedge layout and needed no second pass.

The objective moves #
The first time around the pizza is the gentle start: two big objectives per table. On the second lap each table asks for three of the same size, and after that they get farther apart and smaller. Each slice is rebuilt just before it comes into view. Closing the first round pays a 500,000 point jackpot, once per game.
Two small details keep the oven from becoming a trap. The ball leaves the oven on alternating sides and leans away from the middle, so it does not drop back onto the center bumper and the closed gate. And the center bumper retracts while the gate is open.
Play it #
Slice Tilt is free at slice-tilt.vercel.app, and the project page here has the video: Slice Tilt. The 3D kits for the four slices are by Kenney (CC0).
The lesson I take from this one is that a constraint you find in the first hour, here "a slice is the wrong shape", is worth more than the idea you had before it. The oven in the middle is the best part of the game and it came from the geometry.
Related projects
- Slice Tilt — Free pinball on a four-slice pizza