Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Group 4: the last three puzzles

Reached from Shade Tree (camp2Clicked button 1 → scene 16). Chained: The Lion's Lair → Mirror Machine → Bubblewonder Abyss → Zoombiniville.

The Lion's Lair (scene 16)

📷 Screenshot: lion-overview The lair: the lion's paw over the golden stepping stones across the chasm, with Zoombinis at the left. Capture: from Shade Tree, set out.

📷 Screenshot: lion-places Zoombinis standing on stones that match the feature the lion wants. Capture: drag Zoombinis onto the stones.

Scene / module / archive16 / decomp/roster.cpp / CAVES (Caves.MHK)
Group listcaveGroups → cavesClicked
LevelcavesLevel

The module is named for its strings, since it also holds the saved-game code; Caves.MHK is the lion's lair.

FunctionAddressRole
openCaves0x41c09cloads the state, scripts and sounds, the views for 20 places (the party's, and the cave's rows), the roster's resources and a line by the level
cavesFrame0x41ca44per-frame; leaving goes to scene 17
cavesClicked0x41d3f4buttons; dragging; a click on a feature glyph (changeCaveFeature)
setUpCaves0x41e0e3picks the roster's features and lays out the places for them
layOutCaves, pickCaveFeatures, countByCaveFeatures0x41e5e1, 0x41e273which places want which values
pickCave0x41e771the place for the Zoombini of a view: n if it's free and wants the Zoombini's values of the roster's features, else a free one that does, at random; 1 if none
changeCaveFeature0x41e920changes the roster's first feature (the second moves on if they'd be the same), lays the places out again and walks the Zoombinis that had places to their new ones
sendToCaves, walkToSpots, walkNext0x41eb43, 0x41ec69walking Zoombinis to places
drawGlyph, drawGlyphs, drawFeatureTable, placeGlyphsthe feature glyphs and the table

Mirror Machine (scene 17)

📷 Screenshot: mirror-overview The mine: a boulder wedged overhead, wooden trestles and a rail track, with two rows of Zoombinis facing each other. Capture: complete the Lion's Lair.

📷 Screenshot: mirror-grid The hex grid of Zoombinis filling in, neighbours sharing features. Capture: at higher levels.

Scene / module / archive17 / decomp/game.cpp (with WinMain) / SMOKE (Smoke.MHK)
Group listsmokeGroups → smokeClicked
LevelsmokeLevel (1-4): levels 1-2 take the features of one Zoombini picked at random, levels 3-4 two of the party
FunctionAddressRole
openSmoke0x44e494resets state, picks the level and scripts, opens Smoke.MHK, adds views and the Zoombinis', takes the features of the Zoombini (or two) that the puzzle is built from, sets the last two of the party walking in, starts the opening scripts
smokeFrame0x44f25dper-frame; leaving goes to scene 18
smokeClicked0x44fa57buttons; drags to cells and the "deal" button
startRound0x4507e0empties the slot views and deals new Zoombinis for the level
dealFeatures, dealRandomFeatures, giveSlotFeatures0x45222d, 0x452258deals features to four Zoombinis
recordSlotFeatures, applySlotFeatures0x4513acthe left and right feature slots
startNextCrossing, startNextMove0x45162e, 0x4514f6the crossing and the movers' scripts
startGrid, growGrid, settleCells, fillFreeCells0x44cc51, 0x44ce56, 0x44d127, 0x44d5f5the hex grid at higher levels: puts the first Zoombini on it (the next one alike), then grows it
shareFeature, placeAlike, markSharedFeature0x44cd71, 0x44d3b8whether two Zoombinis share a feature, and placing the alike ones side by side
dragSnoidToSpot0x453e8cdragging a Zoombini to a cell

Things to know: several views are named after their ids (view11036, view11019…) because their purpose isn't known yet; the dealer button's lit/pressed/dim states are lightDealButton, pressDealButton, dimDealButton.

Bubblewonder Abyss (scene 18)

📷 Screenshot: bubble-overview The dark chasm with the Zoombinis' bubbles rising over it. Capture: complete the Mirror Machine.

📷 Screenshot: bubble-lines The squares and lines the sequence is set on. Capture: at higher levels.

Scene / module / archive18 / decomp/maze.cpp / MAZE2 (Maze2.MHK)
Group listmazeGroups → mazeButtonClicked
LevelmazeLevel (0-4; level 3 with fewer than five Zoombinis plays as 4)
FunctionAddressRole
openMaze0x433510resets state, loads images, scripts and tables, picks the level and layout (loadHotSpotTable), adds the views of the layout's pieces and lines, sets the puzzle up, brings the Zoombinis in
mazeFrame0x43490eper-frame; the last puzzle sends the party to Zoombiniville (sceneDue = 6) and sets bits in gameState+0x51
mazeButtonClicked0x435264buttons and dragging
setUpMaze0x436abfsets the maze up for a level: the squares' kinds, the lines' values shuffled, a sequence of values by one of five ways for the level, and the Zoombinis' views
chooseSequence1-50x438396…0x439190the five ways of choosing the sequence from the chosen Zoombinis' features
takeRarestValue, takeCommonestValue, takeRareRow0x43780d, 0x437b7bpicks the value with the fewest/most counts
addMazeSnoids, moveSnoidToSquare, mazeSnoidNotify0x436c71, 0x43596d, 0x43638bthe Zoombinis in the maze
countValuesPresent, valueCount, indexOfLargestExcept0x437390counting the party's values

Things to know: this is the last puzzle; finishing it records a completed journey in the roster (recordParty, the town's monuments).