Stage 7: Puzzle Room & Finish Line
Make sure you've finished Stage 6: Kinetic KillWall. This is the last building stage — after this, your obby is done!
a button puzzle, a finish line, and a fireworks party room
how sequences create game logic and how a finale rewards the player
a complete, finished obby ready to publish

Preview the final button puzzle, fireworks finish, and celebration party room.
Build this stage belowThe big idea
For six stages every challenge has been reflex — jump, time, dodge, look. Today's finale is a puzzle: the player has to think. A wall blocks the exit until they press buttons in the right order. The lesson is clues and consequences: a puzzle without a clue is guessing, but a puzzle with a clue is solving.
Then you finish the obby for real — a finish line, fireworks, and a party room where players land and feel like winners. This is the last shot of your video, so make it count. By the end of today, your game is complete and ready to publish.
Build it
Step 1 — Build the puzzle room
A floor, two side walls, and a back wall the puzzle removes. The front is open so the player walks in from the Stage 10 checkpoint.

Build this partPuzzleFloor
BlockOpen recipe
PuzzleFloor
Block- Size
- 12 × 1 × 12
- Color
- Dark stone grey
- Material
- Concrete
- Anchored
- ✓ Yes
- Place
- Right in front of the Stage 10 checkpoint, stretching forward 12 studs
Build this partPuzzleWall_Left
BlockOpen recipe
PuzzleWall_Left
Block- Size
- 1 × 8 × 12
- Color
- Brick yellow
- Material
- Brick
- Anchored
- ✓ Yes
- Place
- Along the left edge of PuzzleFloor
Build this partPuzzleWall_Right
BlockOpen recipe
PuzzleWall_Right
Block- Size
- 1 × 8 × 12
- Color
- Brick yellow
- Material
- Brick
- Anchored
- ✓ Yes
- Place
- Along the right edge of PuzzleFloor (mirror of the left wall)
Build this partPuzzleWall_Back
BlockOpen recipe
PuzzleWall_Back
Block- Size
- 12 × 8 × 1
- Color
- Really red
- Material
- Neon
- Anchored
- ✓ Yes
- Place
- At the FAR end of the room (opposite the open front)
Solid red so players know 'this is the goal wall.' The script finds it by name — leave it named exactly `PuzzleWall_Back`.
Step 2 — Build the three buttons
Three colored buttons on the floor: Green, Red, Blue. Each is a flat cylinder.
Build this partButton_Green
CylinderOpen recipe
Button_Green
Cylinder- Size
- 1 × 2 × 2
- Color
- Lime green
- Material
- Neon
- Anchored
- ✓ Yes
- Place
- On PuzzleFloor, leftmost of three buttons
Cylinder with X = 1 looks like a flat disc — like a real arcade button.
Build this partButton_Red
CylinderOpen recipe
Button_Red
Cylinder- Size
- 1 × 2 × 2
- Color
- Really red
- Material
- Neon
- Anchored
- ✓ Yes
- Place
- On PuzzleFloor, middle of three buttons
Build this partButton_Blue
CylinderOpen recipe
Button_Blue
Cylinder- Size
- 1 × 2 × 2
- Color
- Bright blue
- Material
- Neon
- Anchored
- ✓ Yes
- Place
- On PuzzleFloor, rightmost of three buttons
Step 3 — Make each button clickable
A button can't be clicked unless it has a ClickDetector inside it. No script — just a built-in object.
- Right-click Button_Green → Insert Object → ClickDetector.
- Do the same for Button_Red and Button_Blue.
Step 4 — Add the script that runs the puzzle
The script lives in PuzzleWall_Back — the wall it eventually destroys. Right-click PuzzleWall_Back → Insert Object → Script. Delete the placeholder.
PuzzleWall_Back
The Script goes inside PuzzleWall_Back. The buttons MUST be named exactly Button_Green, Button_Red, and Button_Blue.
local wall = script.Parent
local greenButton = workspace:WaitForChild("Button_Green")
local redButton = workspace:WaitForChild("Button_Red")
local blueButton = workspace:WaitForChild("Button_Blue")
-- The correct sequence: press these in this order to win
local correctOrder = {"Green", "Red", "Blue"}
local currentIndex = 1
local function handleButton(buttonName)
local expected = correctOrder[currentIndex]
print(buttonName, "pressed. Expected:", expected)
if buttonName == expected then
currentIndex = currentIndex + 1
if currentIndex > #correctOrder then
print("PUZZLE SOLVED!")
wall:Destroy()
end
else
print("Wrong! Resetting sequence.")
currentIndex = 1
end
end
greenButton.ClickDetector.MouseClick:Connect(function()
handleButton("Green")
end)
redButton.ClickDetector.MouseClick:Connect(function()
handleButton("Red")
end)
blueButton.ClickDetector.MouseClick:Connect(function()
handleButton("Blue")
end)
Press ▶ Play. Click Green, Red, Blue in that order — the back wall disappears. Wrong order resets the puzzle.
Change correctOrder = {"Green", "Red", "Blue"} to set a different answer. You can even repeat colors: {"Green", "Red", "Green"} is a whole new puzzle.
Step 5 — Write the clue on a side wall
Without a clue, the puzzle is a guessing game. On one side wall, place three small flat parts in the answer order — green first, red second, blue third — using the same colors as the buttons. Players who notice the wall get the answer.
- Green → 2. Red → 3. Blue
Step 6 — Add the finish-line checkpoint
This is the last checkpoint — it marks the end of the obby. Place it just past the back wall so it only appears after the puzzle is solved.
6.1 Add a SpawnLocation
Right-click Workspace → Insert Object → SpawnLocation.
6.2 Set its properties
- BrickColor → a celebration color! Gold, rainbow, whatever feels like a finish line.
- AllowTeamChangeOnTouch → checked. Neutral → unchecked. TeamColor → matches.
6.3 Tag it with its stage number
In Attributes, add a StageNumber attribute (number type) and set its value to 11. We use 11 for the finish pad so future scripts know "this is the win pad, past Stage 10."
6.4 Add a Team
Insert a Team named Finished, uncheck AutoAssignable, match its TeamColor, and place the SpawnLocation behind where the back wall stood.