A benchmark in which language models design roller coasters that RollerCoaster Tycoon 2 builds, tests, and rates.
I'll start by reviewing the piece catalog geometry to plan an original layout that can beat the previous 6.80 excitement.
{"dir":2}{"deltas":[{"bank_out":0,"dir_out":2,"dx_tiles":1,"dy_tiles":0,"dz":0,"piece":"flat","slope_out":0},{"bank_out":0,"dir_out":2,"dx_tiles":1,"dy_tiles":0,"dz":0,"piece":"end_station","slope_out":0},{"bank_out":0,"dir_out":2,"dx_tiles":1,"dy_tiles":0,"dz":0,"piece":"begin_station","slope_out":0},{"bank_out":0,"dir_out":2,"dx_tiles":1,"dy_tiles":0,"dz":0,"piece":"middle_station","slope_out":0},{"bank_out":0,"dir_out":2,"dx_tiles":1,"dy_tiles":0,"dz":16,"piece":"up_25","slope_out":2},{"bank_out":0,"dir_out":2,"dx_tiles":1,"dy_tiles":0,"dz":64,"piece":"up_60","slope_out":4},{"bank_out":0,"dir_out":2,"dx_tiles":1,"dy_tiles":0,"dz":8,"piece":"flat_to_up_25","slope_out":2},{"bank_out":0,"dir_out":2,"dx_tiles":1,"dy_tiles":0,"dz":32,"piece":"up_25_to_up_60","slope_out":4},{"bank_out":0,"dir_out":2,"dx_tiles":1,"dy_tiles":0,"dz":32,"piece":"up_60_to_up_25","slope_out":2},{"bank_out":0,"dir_out":2,"dx_tiles":1,"dy_tiles":0,"dz":8,"piece":"up_25_to_flat","slope_out":0},{"bank_out":0,"dir_out":2,"dx_tiles":1,"dy_tiles":0,"dz":-16,"piece":"down_25","slope_out":6},{"bank_out":0,"dir_out":2,"dx_tiles":1,"dy_tiles":0,"dz":-64,"piece":"down_60","slope_out":8},{"bank_out":0,"dir_out":2,"dx_tiles":1,"d… (7346 chars)
{"dir":0}{"deltas":[{"bank_out":0,"dir_out":0,"dx_tiles":-1,"dy_tiles":0,"dz":0,"piece":"flat","slope_out":0},{"bank_out":0,"dir_out":0,"dx_tiles":-1,"dy_tiles":0,"dz":0,"piece":"end_station","slope_out":0},{"bank_out":0,"dir_out":0,"dx_tiles":-1,"dy_tiles":0,"dz":0,"piece":"begin_station","slope_out":0},{"bank_out":0,"dir_out":0,"dx_tiles":-1,"dy_tiles":0,"dz":0,"piece":"middle_station","slope_out":0},{"bank_out":0,"dir_out":0,"dx_tiles":-1,"dy_tiles":0,"dz":16,"piece":"up_25","slope_out":2},{"bank_out":0,"dir_out":0,"dx_tiles":-1,"dy_tiles":0,"dz":64,"piece":"up_60","slope_out":4},{"bank_out":0,"dir_out":0,"dx_tiles":-1,"dy_tiles":0,"dz":8,"piece":"flat_to_up_25","slope_out":2},{"bank_out":0,"dir_out":0,"dx_tiles":-1,"dy_tiles":0,"dz":32,"piece":"up_25_to_up_60","slope_out":4},{"bank_out":0,"dir_out":0,"dx_tiles":-1,"dy_tiles":0,"dz":32,"piece":"up_60_to_up_25","slope_out":2},{"bank_out":0,"dir_out":0,"dx_tiles":-1,"dy_tiles":0,"dz":8,"piece":"up_25_to_flat","slope_out":0},{"bank_out":0,"dir_out":0,"dx_tiles":-1,"dy_tiles":0,"dz":-16,"piece":"down_25","slope_out":6},{"bank_out":0,"dir_out":0,"dx_tiles":-1,"dy_tiles":0,"dz":-64,"piece":"down_60","slope_out":8},{"bank_out":0,"dir_out":0,"dx… (7397 chars)
{"dir":1}{"deltas":[{"bank_out":0,"dir_out":1,"dx_tiles":0,"dy_tiles":1,"dz":0,"piece":"flat","slope_out":0},{"bank_out":0,"dir_out":1,"dx_tiles":0,"dy_tiles":1,"dz":0,"piece":"end_station","slope_out":0},{"bank_out":0,"dir_out":1,"dx_tiles":0,"dy_tiles":1,"dz":0,"piece":"begin_station","slope_out":0},{"bank_out":0,"dir_out":1,"dx_tiles":0,"dy_tiles":1,"dz":0,"piece":"middle_station","slope_out":0},{"bank_out":0,"dir_out":1,"dx_tiles":0,"dy_tiles":1,"dz":16,"piece":"up_25","slope_out":2},{"bank_out":0,"dir_out":1,"dx_tiles":0,"dy_tiles":1,"dz":64,"piece":"up_60","slope_out":4},{"bank_out":0,"dir_out":1,"dx_tiles":0,"dy_tiles":1,"dz":8,"piece":"flat_to_up_25","slope_out":2},{"bank_out":0,"dir_out":1,"dx_tiles":0,"dy_tiles":1,"dz":32,"piece":"up_25_to_up_60","slope_out":4},{"bank_out":0,"dir_out":1,"dx_tiles":0,"dy_tiles":1,"dz":32,"piece":"up_60_to_up_25","slope_out":2},{"bank_out":0,"dir_out":1,"dx_tiles":0,"dy_tiles":1,"dz":8,"piece":"up_25_to_flat","slope_out":0},{"bank_out":0,"dir_out":1,"dx_tiles":0,"dy_tiles":1,"dz":-16,"piece":"down_25","slope_out":6},{"bank_out":0,"dir_out":1,"dx_tiles":0,"dy_tiles":1,"dz":-64,"piece":"down_60","slope_out":8},{"bank_out":0,"dir_out":1,"dx_tiles":0,"d… (7346 chars)
Now let me get the geometry for the other three facings so I can plan a complete closed circuit on paper.
{"dir":3}{"deltas":[{"bank_out":0,"dir_out":3,"dx_tiles":0,"dy_tiles":-1,"dz":0,"piece":"flat","slope_out":0},{"bank_out":0,"dir_out":3,"dx_tiles":0,"dy_tiles":-1,"dz":0,"piece":"end_station","slope_out":0},{"bank_out":0,"dir_out":3,"dx_tiles":0,"dy_tiles":-1,"dz":0,"piece":"begin_station","slope_out":0},{"bank_out":0,"dir_out":3,"dx_tiles":0,"dy_tiles":-1,"dz":0,"piece":"middle_station","slope_out":0},{"bank_out":0,"dir_out":3,"dx_tiles":0,"dy_tiles":-1,"dz":16,"piece":"up_25","slope_out":2},{"bank_out":0,"dir_out":3,"dx_tiles":0,"dy_tiles":-1,"dz":64,"piece":"up_60","slope_out":4},{"bank_out":0,"dir_out":3,"dx_tiles":0,"dy_tiles":-1,"dz":8,"piece":"flat_to_up_25","slope_out":2},{"bank_out":0,"dir_out":3,"dx_tiles":0,"dy_tiles":-1,"dz":32,"piece":"up_25_to_up_60","slope_out":4},{"bank_out":0,"dir_out":3,"dx_tiles":0,"dy_tiles":-1,"dz":32,"piece":"up_60_to_up_25","slope_out":2},{"bank_out":0,"dir_out":3,"dx_tiles":0,"dy_tiles":-1,"dz":8,"piece":"up_25_to_flat","slope_out":0},{"bank_out":0,"dir_out":3,"dx_tiles":0,"dy_tiles":-1,"dz":-16,"piece":"down_25","slope_out":6},{"bank_out":0,"dir_out":3,"dx_tiles":0,"dy_tiles":-1,"dz":-64,"piece":"down_60","slope_out":8},{"bank_out":0,"dir_out":3,"dx… (7397 chars)
{"dir":2,"ride_type":51,"x":40,"y":50}{"cursor":{"bank":0,"dir":2,"slope":0,"x":40,"y":50,"z":112},"ride_id":0}
I have the full catalog. Now I'll execute my plan: an original out-and-back twister with a tall chain lift, 224-unit drop, **two half-loop pairs**, 2 vertical loops, 5 corkscrew pairs, airtime hills, and banked 180° turnarounds — 16 inversions, staying north of the lake (y 45–52). **Key planning points:** - Start (40,50) facing +x; station z=112; lift to z=336 (13 chained up_25s) - Half loops need a pre-lift so the track never dips below grade (z≥112) and z nets to 0 at the end - Return leg at z=112 with loops/corkscrews/hills, closing back at (40,50) facing +x Starting the ride and building the station + lift + drop:
{"pieces":["begin_station","middle_station","end_station",{"chain":true,"piece":"flat_to_up_25"},{"chain":true,"piece":"up_25"},{"chain":true,"piece":"up_25"},{"chain":true,"piece":"up_25"},{"chain":true,"piece":"up_25"},{"chain":true,"piece":"up_25"},{"chain":true,"piece":"up_25"},{"chain":true,"piece":"up_25"},{"chain":true,"piece":"up_25"},{"chain":true,"piece":"up_25"},{"chain":true,"piece":"up_25"},{"chain":true,"piece":"up_25"},{"chain":true,"piece":"up_25"},{"chain":true,"piece":"up_25"},{"chain":true,"piece":"up_25_to_flat"},"flat_to_down_60","down_60","down_60","down_60_to_down_25","down_25","down_25","down_25_to_flat"]}{"circuit_closed":false,"cursor":{"bank":0,"dir":2,"slope":0,"x":65,"y":50,"z":112},"placed_this_call":25,"total_placed":25}
Station, lift, and drop placed cleanly. Now the half-loop pairs, loop, corkscrews, and first turnaround:
{"pieces":["flat_to_up_25","up_25_to_flat","half_loop_up","half_loop_down","down_25_to_flat","flat_to_up_25","up_25_to_flat","half_loop_up","half_loop_down","down_25_to_flat","flat_to_down_25","down_25_to_flat","flat_to_up_25","left_vertical_loop","down_25_to_flat","right_corkscrew_up","left_corkscrew_down","left_corkscrew_up","right_corkscrew_down","flat_to_right_bank","banked_right_turn_5","banked_right_turn_5","right_bank_to_flat"]}{"circuit_closed":false,"cursor":{"bank":0,"dir":2,"slope":0,"x":67,"y":50,"z":128},"placed_this_call":2,"rejection":{"error":"piece enters at 25-up slope but the track here is flat; add a slope transition piece first","index":2,"piece":"half_loop_up"},"total_placed":27}
{"cursor":{"bank":0,"dir":2,"slope":2,"x":66,"y":50,"z":120},"pieces_placed":26,"removed":"up_25_to_flat"}
The half loop needs an up-25 slope entry — that actually simplifies the z-budget (each half-loop pair now nets 0). Undoing the two transition pieces and rebuilding with the corrected pattern:
{"cursor":{"bank":0,"dir":2,"slope":0,"x":65,"y":50,"z":112},"pieces_placed":25,"removed":"flat_to_up_25"}
{"pieces":["flat_to_up_25","half_loop_up","half_loop_down","down_25_to_flat","flat_to_up_25","half_loop_up","half_loop_down","down_25_to_flat","flat_to_up_25","left_vertical_loop","down_25_to_flat","right_corkscrew_up","left_corkscrew_down","left_corkscrew_up","right_corkscrew_down","flat_to_right_bank","banked_right_turn_5","banked_right_turn_5","right_bank_to_flat"]}{"circuit_closed":false,"cursor":{"bank":15,"dir":0,"slope":0,"x":66,"y":50,"z":272},"placed_this_call":2,"rejection":{"error":"Twister Roller Coaster 1 in the way","index":2,"piece":"half_loop_down"},"total_placed":27}
Collision issue with the half-loop-down. Let me ask the game what's valid at this inverted top position:
{"cursor":{"bank":15,"dir":0,"slope":0,"x":66,"y":50,"z":272},"valid_pieces":["left_corkscrew_down","right_corkscrew_down"]}
Interesting — at the inverted top, only corkscrew-downs are valid. So `half_loop_up + corkscrew_down` forms an Immelmann element. I'll embrace it as a unique signature element, then dive down and bend back east:
{"pieces":["left_corkscrew_down","flat_to_down_60","down_60_to_down_25","down_25","down_25_to_flat","flat_to_left_bank","banked_left_turn_5","left_bank_to_flat"]}{"circuit_closed":false,"cursor":{"bank":0,"dir":2,"slope":0,"x":69,"y":41,"z":112},"placed_this_call":8,"total_placed":35}
Cursor is at (69,41) heading +x — the turn deltas ran slightly different than tabulated, so I'll verify cursor after each chunk. Adding the vertical loop and two corkscrew pairs:
{"pieces":["flat_to_up_25","left_vertical_loop","down_25_to_flat","left_corkscrew_up","right_corkscrew_down","right_corkscrew_up","left_corkscrew_down"]}{"circuit_closed":false,"cursor":{"bank":0,"dir":2,"slope":0,"x":79,"y":42,"z":112},"placed_this_call":7,"total_placed":42}
{"pieces":["flat_to_right_bank","banked_right_turn_5","banked_right_turn_5","right_bank_to_flat"]}{"circuit_closed":false,"cursor":{"bank":0,"dir":0,"slope":0,"x":78,"y":37,"z":112},"placed_this_call":4,"total_placed":46}
Turnaround 1 landed exactly as planned at (78,37) facing -x. Building the return leg — hills, second loop, corkscrew pairs:
{"pieces":["flat_to_up_25","up_25_to_flat","flat_to_down_25","down_25_to_flat","flat_to_up_25","right_vertical_loop","down_25_to_flat","left_corkscrew_up","right_corkscrew_down","right_corkscrew_up","left_corkscrew_down","flat_to_up_25","up_25_to_flat","flat_to_down_25","down_25_to_flat"]}{"circuit_closed":false,"cursor":{"bank":0,"dir":0,"slope":0,"x":60,"y":38,"z":112},"placed_this_call":15,"total_placed":61}
Now the rest of the return leg plus positioning for the final turnaround:
{"pieces":["s_bend_right","s_bend_right","left_corkscrew_up","right_corkscrew_down","flat_to_up_25","up_25_to_flat","flat_to_down_25","down_25_to_flat","s_bend_right","s_bend_right","s_bend_right","s_bend_right","s_bend_right","flat","flat"]}{"circuit_closed":false,"cursor":{"bank":0,"dir":0,"slope":0,"x":30,"y":42,"z":112},"placed_this_call":15,"total_placed":76}
Cursor at (30,42). Final turnaround plus three S-bends will land exactly back at the station start (40,50):
{"pieces":["flat_to_right_bank","banked_right_turn_5","banked_right_turn_5","right_bank_to_flat","s_bend_left","s_bend_left","s_bend_left"]}{"circuit_closed":true,"cursor":{"bank":0,"dir":2,"slope":0,"x":40,"y":50,"z":112},"placed_this_call":7,"total_placed":83}
**Circuit closed!** Testing immediately to bank a score:
{"bounds":{"max_tile_x":82,"max_tile_y":50,"max_z":360,"min_tile_x":27,"min_tile_y":35,"min_z":112},"placed_pieces":["begin_station","middle_station","end_station","flat_to_up_25","up_25","up_25","up_25","up_25","up_25","up_25","up_25","up_25","up_25","up_25","up_25","up_25","up_25","up_25_to_flat","flat_to_down_60","down_60","down_60","down_60_to_down_25","down_25","down_25","down_25_to_flat","flat_to_up_25","half_loop_up","left_corkscrew_down","flat_to_down_60","down_60_to_down_25","down_25","down_25_to_flat","flat_to_left_bank","banked_left_turn_5","left_bank_to_flat","flat_to_up_25","left_vertical_loop","down_25_to_flat","left_corkscrew_up","right_corkscrew_down","right_corkscrew_up","left_corkscrew_down","flat_to_right_bank","banked_right_turn_5","banked_right_turn_5","right_bank_to_flat","flat_to_up_25","up_25_to_flat","flat_to_down_25","down_25_to_flat","flat_to_up_25","right_vertical_loop","down_25_to_flat","left_corkscrew_up","right_corkscrew_down","right_corkscrew_up","left_corkscrew_down","flat_to_up_25","up_25_to_flat","flat_to_down_25","down_25_to_flat","s_bend_right","s_bend_right","left_corkscrew_up","right_corkscrew_down","flat_to_up_25","up_25_to_flat","flat_to_dow… (2114 chars)
← openrouter_moonshotai_kimi-k3 · 20260724-kimi-k3-twister · all runs