Files
kq4-decompile/rooms/kq4-012-haunted-forest.md
2026-02-20 10:16:03 -08:00

102 lines
5.2 KiB
Markdown

# Room 12: Haunted Forest
This is the eastern section of the Haunted Forest in King's Quest IV, featuring a bizarre group of scary, human-like trees. The room continues the dangerous tree-grabbing mechanic from room 11, with multiple animated tree props (views 690-696) positioned throughout the forest that can capture Rosella when she gets too close to their reaching branches. Steep mountains block the eastern exit. The room connects to other forest areas and serves as a hazard area with tree-grabbing traps.
## Look Description
"You have come upon a bizarre group of scary, human-like trees. A thick forest of pine trees surrounds this strange group. Steep mountains block your way to the east."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look room` / `look[<at][/forest,forest]` | "You have come upon a bizarre group of scary, human-like trees. A thick forest of pine trees surrounds this strange group. Steep mountains block your way to the east." (Print 12 0) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | grabbed | Player touches control areas (bitmasks $0010, $0020, $0040, $0080, $2000, $1000, $0800, $0400, $0200, $0100, $0004, $0008) anywhere in the room | Stops walking music, plays caught music, animates a tree grabbing the ego (using newProp_6 array based on control area), displays random tree-themed death message (wooden/limb/leaf/sap/root puns), sets global127=1 (game over state). Multiple control areas correspond to different tree props that grab the player. |
| TODO | Background | treeAnimation | Continuous when room loaded | Trees (newProp_6 1-12) are static props with cycleSpeed=1 but stopUpd called, except animated elements (newProp through newProp_5) have setCycle:Fwd for continuous animation |
## Technical Notes
- **Room Number**: 12
- **Picture**: 12
- **Region**: 509 (Forest Region), 511 (referenced but not found)
- **Exits**: North→6, South→18, West→11
- **Music**: Walking music (sound 64), Caught music (sound 65)
### Objects
| Object | View | Loop | Description |
|--------|------|------|-------------|
| newProp | 688 | 0 | Animated element at 265,97 - cel 3 |
| newProp_2 | 688 | 1 | Animated element at 12,59 - cel 4 |
| newProp_3 | 688 | 2 | Animated element at 210,64 - cel 1 |
| newProp_4 | 688 | 3 | Animated element at 154,86 - cel 4 |
| newProp_5 | 688 | 4 | Animated element at 98,107 - cel 4 |
| newProp_6[1] | 695 | 0 | Tree at 29,53 |
| newProp_6[2] | 695 | 1 | Tree at 57,61 |
| newProp_6[3] | 695 | 2 | Tree at 77,60 |
| newProp_6[4] | 695 | 3 | Tree at 147,85 |
| newProp_6[5] | 695 | 4 | Tree at 161,87 |
| newProp_6[6] | 692 | 4 | Tree at 121,69 |
| newProp_6[7] | 696 | 0 | Tree at 206,75 |
| newProp_6[8] | 696 | 1 | Tree at 21,63 |
| newProp_6[9] | 696 | 2 | Tree at 98,124 |
| newProp_6[10] | 694 | 1 | Tree at 231,82 |
| newProp_6[11] | 693 | 2 | Tree at 6,85 |
| newProp_6[12] | 690 | 0 | Tree at 222,93 |
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | `0` | Set to 0 on room init |
| `global100` | `true`, `false` | When true, overlay picture 112 is displayed |
| `global112` | `true`, `false` | When true, tree grabbing is disabled (can walk safely) |
| `global127` | `0`, `1` | Set to 1 when player is caught by trees (game over state) |
| `local13` | `1-3` | Animation cel parameter for grabbing animation |
| `local14` | `1-12` | Tracks which tree prop grabbed the player |
### Control Areas
The room uses multiple control areas (bitmasks) to detect when player touches different tree zones:
| Bitmask | local14 | local13 | Tree Triggered |
|---------|---------|---------|----------------|
| $0080 | 2 | 1 | newProp_6[2] grabbing |
| $2000 | 3 | 1 | newProp_6[3] grabbing |
| $0040 | 6 | 1 | newProp_6[6] grabbing |
| $0020 | 5 | 1 | newProp_6[5] grabbing |
| $0100 | 1 | 2 | newProp_6[1] grabbing |
| $1000 | 4 | 2 | newProp_6[4] grabbing |
| $0010 | 7 | 2 | newProp_6[7] grabbing |
| $0200 | 8 | 2 | newProp_6[8] grabbing |
| $0800 | 9 | 2 | newProp_6[9] grabbing |
| $0004 | 10 | 2 | newProp_6[10] grabbing |
| $0400 | 11 | 2 | newProp_6[11] grabbing |
| $0008 | 12 | 3 | newProp_6[12] grabbing |
### Death Messages
When caught, one of these messages displays (Print 12 1-6):
1. "Wooden you know it. You've been caught!"
2. "You've really gotten yourself out on a limb this time, Rosella!"
3. "Talk about being torn limb from limb!"
4. "Time to 'leaf' this mortal world!"
5. "You've been a real sap this time, Rosella!"
6. "It seems you'll discover your roots, Rosella!"
### Additional Technical Details
- Entry from west (room 11): Player positioned at x=1, y=max(horizon+2, egoY)
- Entry from north (room 6): Player positioned at x=max(egoX, 211), y=horizon+2
- Entry from south (room 18): Player y=188, x clamped between 32-189
- Entry from new game (0): Player positioned at x=290, y=160
- Blocks defined: newBlk (194,115,230,118), newBlk_2 (170,106,183,110) that ego observes
- Walking music (64) plays on room entry
- Caught music (65) pre-loaded for grab sequence
- Overlay 112 shown if global100 is true