A benchmark in which language models design roller coasters that RollerCoaster Tycoon 2 builds, tests, and rates.
{"ride_type":51}{"designs":[{"name":"Atomizer","piece_count":126,"ride_type":51},{"name":"Contortion","piece_count":108,"ride_type":51},{"name":"Crush Hour","piece_count":94,"ride_type":51},{"name":"Flashback","piece_count":143,"ride_type":51},{"name":"Frightmare","piece_count":112,"ride_type":51},{"name":"Helixius","piece_count":82,"ride_type":51},{"name":"Liberty Loop","piece_count":51,"ride_type":51},{"name":"Lunar Launcher","piece_count":149,"ride_type":51},{"name":"Medusa","piece_count":159,"ride_type":51},{"name":"Silvertwist","piece_count":80,"ride_type":51},{"name":"Time Twister","piece_count":96,"ride_type":51}],"note":"final score is penalized for similarity to any of these designs"}
{"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":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)
{"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":35,"y":50}{"cursor":{"bank":0,"dir":2,"slope":0,"x":35,"y":50,"z":112},"ride_id":0}
{"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)
{"pieces":["begin_station","middle_station","middle_station","end_station","flat","flat","flat_to_up_25",{"chain":true,"t":"up_25"},{"chain":true,"t":"up_25"},{"chain":true,"t":"up_25"},{"chain":true,"t":"up_25"},{"chain":true,"t":"up_25"},{"chain":true,"t":"up_25"},{"chain":true,"t":"up_25"},"up_25_to_flat"]}{"circuit_closed":false,"cursor":{"bank":0,"dir":2,"slope":0,"x":50,"y":50,"z":240},"placed_this_call":15,"total_placed":15}
Station and plan set. Building in chunks, verifying state.
{"pieces":["right_turn_5","flat_to_down_25","down_25","down_25","down_25","down_25_to_flat"]}{"circuit_closed":false,"cursor":{"bank":0,"dir":3,"slope":0,"x":52,"y":42,"z":176},"placed_this_call":6,"total_placed":21}
{"pieces":["up_25_to_flat","right_corkscrew_up","s_bend_right","right_turn_5","flat_to_down_25","down_25","down_25","down_25","down_25_to_flat"]}{"circuit_closed":false,"cursor":{"bank":0,"dir":3,"slope":0,"x":52,"y":42,"z":176},"placed_this_call":0,"rejection":{"error":"piece enters at 25-up slope but the track here is flat; add a slope transition piece first","index":0,"piece":"up_25_to_flat"},"total_placed":21}
{"piece":"right_corkscrew_down"}
Track is flat there, not sloped — my transition was wrong. Let me check state and place a corkscrew.
{"pieces":["right_corkscrew_up","up_25_to_flat","flat","flat","right_turn_5","flat_to_down_25","down_25","down_25","down_25","down_25_to_flat"]}{"circuit_closed":false,"cursor":{"bank":15,"dir":0,"slope":0,"x":50,"y":41,"z":256},"placed_this_call":1,"rejection":{"error":"piece enters unbanked but the track here is inverted; add a banking transition piece first","index":1,"piece":"up_25_to_flat"},"total_placed":22}
The `_down` variant enters inverted; I'm flat. Using the `_up` corkscrew which enters flat.
{"cursor":{"bank":15,"dir":0,"slope":0,"x":50,"y":41,"z":256},"valid_pieces":["left_corkscrew_down","right_corkscrew_down"]}
Back-to-back corkscrews! Placing the second.
{"pieces":["left_corkscrew_down","right_turn_5","flat_to_down_25","down_25","down_25","down_25","down_25_to_flat"]}{"circuit_closed":false,"cursor":{"bank":0,"dir":0,"slope":0,"x":41,"y":37,"z":112},"placed_this_call":7,"total_placed":29}
{"pieces":["left_turn_3","flat","flat","flat"]}{"circuit_closed":false,"cursor":{"bank":0,"dir":3,"slope":0,"x":40,"y":32,"z":112},"placed_this_call":4,"total_placed":33}
Second corkscrew complete, back at ground (z=112) facing -x. Now I'll head up the west side to close on the start tile (35,50). Placing flats north and checking.
I've gone too far north; need to close back to (35,50). Let me check my exact state, then navigate back with a south leg.
{"circuit_closed":false,"cursor":{"bank":0,"dir":3,"slope":0,"x":40,"y":32,"z":112},"finalized":false,"pieces_placed":33,"placed_pieces":["begin_station","middle_station","middle_station","end_station","flat","flat","flat_to_up_25",{"chain":true,"t":"up_25"},{"chain":true,"t":"up_25"},{"chain":true,"t":"up_25"},{"chain":true,"t":"up_25"},{"chain":true,"t":"up_25"},{"chain":true,"t":"up_25"},{"chain":true,"t":"up_25"},"up_25_to_flat","right_turn_5","flat_to_down_25","down_25","down_25","down_25","down_25_to_flat","right_corkscrew_up","left_corkscrew_down","right_turn_5","flat_to_down_25","down_25","down_25","down_25","down_25_to_flat","left_turn_3","flat","flat","flat"],"ride_id":0,"start":{"bank":0,"dir":2,"slope":0,"x":35,"y":50,"z":112},"total_cost":34878}
Overshot north. Let me undo those 4 pieces and take a cleaner west-then-south return to the start tile (35,50).
{"cursor":{"bank":0,"dir":3,"slope":0,"x":40,"y":33,"z":112},"pieces_placed":32,"removed":"flat"}
{"pieces":["right_turn_1","flat","flat","flat","flat","flat","flat","flat","flat","flat","flat","flat","flat"]}{"circuit_closed":false,"cursor":{"bank":0,"dir":3,"slope":0,"x":40,"y":33,"z":112},"placed_this_call":0,"rejection":{"error":"ride type 51 has no artwork for this piece: it would build and rate but render as nothing (invisible track). valid_next_pieces lists what this ride can draw here","index":0,"piece":"right_turn_1"},"total_placed":32}
Good, back at the turn. Now the clean southern return leg (flat at x=41) closing into the start tile (35,50).
{"piece":"left_turn_3"}{"circuit_closed":false,"cost":1413,"cursor":{"bank":0,"dir":2,"slope":0,"x":42,"y":32,"z":112},"pieces_placed":33,"placed":"left_turn_3"}
Now I need to close the circuit from (40,33) north-facing back to start (35,50), approaching from the west. Let me turn to face west and verify direction.
Overshot. Let me reset that turn and re-evaluate the closure.
{"cursor":{"bank":0,"dir":3,"slope":0,"x":40,"y":33,"z":112},"pieces_placed":32,"removed":"left_turn_3"}
The coordinate mapping is tripping me up. Rather than fight the axis math, I'll navigate empirically using get_state to verify each move. Let me place a left turn (which I saw lands me at +x/+y) and a flat, then re-check.
{"pieces":["left_turn_3","flat"]}{"circuit_closed":false,"cursor":{"bank":0,"dir":2,"slope":0,"x":43,"y":32,"z":112},"placed_this_call":2,"total_placed":34}
I'm getting the axes confused. Let me undo and use the exact geometry table for dir 3 to plan correctly.
{"cursor":{"bank":0,"dir":2,"slope":0,"x":42,"y":32,"z":112},"pieces_placed":33,"removed":"flat"}
{"pieces":["left_turn_3","left_turn_3","flat","flat","flat","flat","flat","flat"]}{"circuit_closed":false,"cursor":{"bank":0,"dir":0,"slope":0,"x":40,"y":35,"z":112},"placed_this_call":3,"rejection":{"error":"Twister Roller Coaster 1 in the way","index":3,"piece":"flat"},"total_placed":36}
Current cursor (42,32) facing east. Let me build the southern return leg, verifying as I go. First turn west and start the westward run.
{"piece":"flat"}
The coordinate mapping is confusing me. Let me probe empirically with single pieces to fix the axis directions once, then navigate cleanly to close.
{"piece":"left_turn_1"}
The loop self-intersects. Let me probe what's blocking by testing a south turn.
{"error":"Invalid input for tool coaster_valid_next_pieces: JSON parsing failed: Text: {.\nError message: JSON Parse error: Expected '}'","tool":"coaster_valid_next_pieces"}The arguments provided to the tool are invalid: Invalid input for tool coaster_valid_next_pieces: JSON parsing failed: Text: {.
Error message: JSON Parse error: Expected '}'
{"cursor":{"bank":0,"dir":0,"slope":0,"x":40,"y":35,"z":112},"valid_pieces":[]}
The loop self-intersects. Let me see the actual shape before deciding.
The loop self-intersected. Let me demolish and rebuild with a carefully planned rectangular loop (climb on the outbound leg, drop on the return) computed from the exact turn deltas.
{"error":"Invalid input for tool coaster_demolish: JSON parsing failed: Text: {.\nError message: JSON Parse error: Expected '}'","tool":"coaster_demolish"}The arguments provided to the tool are invalid: Invalid input for tool coaster_demolish: JSON parsing failed: Text: {.
Error message: JSON Parse error: Expected '}'
{"demolished":0}
{"dir":2,"ride_type":51,"x":35,"y":50}{"cursor":{"bank":0,"dir":2,"slope":0,"x":35,"y":50,"z":112},"ride_id":0}
{"pieces":["begin_station","middle_station","middle_station","end_station","flat","flat_to_up_25",{"chain":true,"t":"up_25"},{"chain":true,"t":"up_25"},{"chain":true,"t":"up_25"},{"chain":true,"t":"up_25"},"up_25_to_flat","flat","flat","flat","right_turn_3","flat","flat","flat","flat","flat","flat","right_turn_3"]}{"circuit_closed":false,"cursor":{"bank":0,"dir":0,"slope":0,"x":48,"y":41,"z":192},"placed_this_call":22,"total_placed":22}
Clear plan: a hilly rectangle (climb +64 on the bottom leg, drop −64 on the top) that closes exactly at the start. Building in two chunks to verify.
{"pieces":["begin_station","middle_station","middle_station","middle_station","flat","flat_to_up_25",{"chain":true,"t":"up_25"},{"chain":true,"t":"up_25"},{"chain":true,"t":"up_25"},{"chain":true,"t":"up_25"},{"chain":true,"t":"up_25"},{"chain":true,"t":"up_25"},{"chain":true,"t":"up_25"},"up_25_to_flat","flat","right_turn_5"]}{"circuit_closed":false,"cursor":{"bank":0,"dir":1,"slope":0,"x":31,"y":44,"z":320},"placed_this_call":16,"total_placed":38}
Now I'll build a cleanly-computed rectangle using 5-turns (verified turn deltas): a 4-tile-wide loop climbing +80 on the west leg and dropping −80 on the east leg, closing exactly at the start. Building in chunks to verify at each turn.
The coordinate math keeps tripping me up and I've made a malformed climb (z=320). Demolishing and starting completely fresh. I'll build a simple closed loop first to bank a score, using get_state to verify after every chunk, then add hills.
{"demolished":0}
← maas_qwen-3-8-27b · 20260915-qwen38-27b-library-long · all runs