documentation progress

This commit is contained in:
2026-02-20 10:16:03 -08:00
parent 929b6a0d80
commit d59cf82ab3
398 changed files with 16186 additions and 0 deletions

View File

@@ -0,0 +1,326 @@
---
name: kq4-room-documenter
description: Generate comprehensive documentation for King's Quest IV rooms from decompiled SCI source code. Creates formatted markdown files following a standardized template with high-level summaries, look descriptions, interactions tables, scripts tables, and technical notes.
---
# KQ4 Room Documenter
Generate comprehensive documentation for King's Quest IV rooms from decompiled SCI source code.
## When to Use
Use this skill when:
- Documenting a new room from the KQ4 decompiled source
- Converting rm##.sc files to human-readable documentation
- Extracting interactions, scripts, and game logic from Sierra Script files
- Creating standardized room documentation for the remake project
## Default Configuration
**Model Provider**: Local
**Model**: MiniMax-M2.5
## Documentation Format
Generate documentation following this exact structure:
### 1. Header
Format: `# Room ##: [Room Name]`
**Filename**: `kq4-##-human-readable-name.md`
### 2. High-Level Summary
A paragraph describing the room's purpose, key features, NPCs, and gameplay significance.
### 3. Look Description Section
```markdown
## Look Description
"[The room's primary description text when player looks around]"
```
### 4. Interactions Table
```markdown
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| Documented | [Look/Get/Action/Talk/Inventory] | `[command]` | "[Response text]" |
```
**Status Options:**
- `Documented` - Interaction fully documented with response text
- `Partial` - Interaction exists but response text not extracted
- `Unverified` - Interaction referenced but not confirmed in code
**Behavior Types:**
- `Look` - Visual examination commands (look, examine)
- `Get` - Item acquisition attempts (take, get, pick up)
- `Action` - Physical interactions (open, close, use, climb, kill, etc.)
- `Talk` - Dialogue commands (talk, ask, tell)
- `Inventory` - Item usage commands (use, give, deliver)
**Command Format:**
- Use backticks around commands
- Show alternative phrasings with `/` separator
- Include optional words in brackets: `[<around>]`
- Show synonyms where applicable
- Document unusual/unexpected command words (e.g., `dennis crown` instead of `use crown`)
**Response Format:**
- Include full text in quotes
- Reference message file: `(Print ## #)`
### 5. Scripts Table
```markdown
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| Documented | [Interaction/Background] | [ScriptName] | [Trigger condition] | [Behavior description] |
```
**Behavior Types:**
- `Interaction` - Player-triggered scripts (entry, exits, dialogue, cutscenes)
- `Background` - Automatic/continuous scripts (animations, AI, environmental effects)
**Name:** The script class name from source (e.g., `SendOut`, `Tripped`, `Watch`)
**Trigger:** When the script activates (e.g., "Entering room when `dwarf_state = DWARF_STATE.HOSTILE`")
**Behavior:** What the script does, described clearly
### 6. Technical Notes Section
```markdown
## Technical Notes
- **Room Number**: ##
- **Picture**: ###
- **Region**: ### ([Region Name]) - if applicable
- **Exits**: [Direction→Room, ...]
- **Music**: [Sound number/name] - if applicable
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `[variable_name]` | `[values]` | [Description] |
```
**Variable Naming:**
- Convert `global###` to descriptive names
- Use enums where applicable: `dwarf_state = DWARF_STATE.FRIENDLY`
- Use boolean names: `diamonds_visible`, `room_visited`
### Additional Technical Details
- List synonyms defined in room: `[word] = [synonym]`
- List region synonyms if applicable
- Note special mechanics or behaviors
- Document entry points and conditions
- List all applied regions when multiple exist: `setRegions: ### ### ###`
- Document inventory item requirements: `(gEgo has: ##)` → map to item names
- Document view-based state detection (see Player State Patterns below)
## Workflow
### Step 1: Locate Source Files
1. Find the room script: `KQ4_v1.006.004_int0.000.502_SRC_(6)/src/rm##.sc`
2. Find the text file: `strings/text_###.txt`
3. Find the region script if applicable: `KQ4_v1.006.004_int0.000.502_SRC_(6)/src/rg###.sc`
### Step 2: Read Source Files
1. Read the room script to understand:
- Room properties (picture, style, exits)
- Init method (objects, NPCs, initial state)
- HandleEvent method (interactions)
- Scripts (instances of Script class)
- State variables and conditions
2. Read the text file to extract:
- Message text referenced by `Print` commands
- Index numbers correspond to second parameter of Print
3. Read region script if room uses `setRegions:` to understand:
- Shared interactions
- Shared state
- Additional commands
### Step 3: Extract Interactions
From `handleEvent` method:
1. Identify all `Said` patterns
2. Map them to corresponding `Print` commands
3. Look up message text in strings/text_###.txt
4. Categorize by behavior type (Look, Get, Action, Talk, Inventory)
5. Format commands with proper syntax showing alternatives
### Step 4: Extract Scripts
From Script instances:
1. Identify each Script class instance
2. Determine if Interaction or Background type
3. Document trigger conditions
4. Describe behavior in detail
5. Note any state changes
### Step 5: Identify State Variables
From local variables and global references:
1. Convert `global###` to descriptive names
2. Identify boolean flags
3. Identify enum states
4. Document their purpose and values
### Step 6: Write Documentation
Follow the format exactly:
1. Header with room name
2. High-level summary
3. Look description
4. Interactions table
5. Scripts table
6. Technical notes with state variables
### Step 7: Save File
Save to: `rooms/kq4-###-human-readable-name.md`
### Step 8: Update README.md
After saving the room documentation:
1. Read the current README.md to find the Progress section
2. Find the row for this room number
3. Update the Status to `[DONE](./rooms/kq4-###-human-readable-name.md)`
4. Fill in the Room Description with a human-readable name (e.g., "Beach", "Fountain Pool", "Cave Entrance")
## Example Reference
See `rooms/055-seven-dwarfs-diamond-mine.md` for a complete example following this format.
## Command Reference
### SCI Script Patterns
**Room Definition:**
```
(instance Room## of Rm
(properties
picture ##
style $0010
east ##
...
)
```
**Edge Behavior:**
- `(gEgo edgeHit: 0)` - Reset edge detection
- `(= horizon ##)` - Set walkable area boundary
- Entry positioning uses `switch gPrevRoomNum` with cases for each direction
**HandleEvent Pattern:**
```
(method (handleEvent pEvent)
(cond
((Said 'look>')
(cond
((Said '/object') (Print ## #))
...
)
)
)
)
```
**Script Pattern:**
```
(instance ScriptName of Script
(method (changeState newState)
(switch (= state newState)
(0 ...)
(1 ...)
)
)
)
```
**State Checks:**
- `(if global### ...)` - Boolean flag check
- `(if (== global### #) ...)` - Equality check (use for enums)
- `(if (> (gEgo x?) ###) ...)` - Position check
### Text File Format
Text files use format: `[####] Message text`
- Index corresponds to second parameter of Print command
- Print 55 2 → Look for [0002] in strings/text_055.txt
### Player State Patterns
Player form/state is often determined by view number:
- `view: 2` - Normal form (on land)
- `view: 8` - Swimming form
- `view: 370, 371, 377` - Frog transformation forms
- `view: 44` - Falling/tripping
- Check current view: `(gEgo view?)` in conditions
Document state variables like:
```markdown
| `is_frog_form` | `true`, `false` | Player is in frog transformation (views 370-377) |
| `in_water` | `true`, `false` | Player is swimming (view 8) or in water |
```
### Inventory Item Reference
Items referenced by index in `gEgo has: ##` or `gInv has: ##`:
- `10` - Crown
- `17` - Fishing pole
- Map other numbers to item names when identified
### Control Areas
Walkable/control areas use hex bitmasks:
- `$0010` - Control area (e.g., waterfall zone)
- `$0001` - Terrain type (e.g., shallow water)
- `(gEgo onControl: 0)` - Check control under player
- `(gEgo onControl: 1)` - Check control at player's feet
### Score Tracking
Score changes use: `(gGame changeScore: ##)`
- Always paired with a flag to prevent re-awarding
- Example: `(if (== global200 0) (gGame changeScore: 5) (= global200 1))`
- Document as: `transformation_score_awarded` flag
### Viewer System
Background player scripts use the viewer system:
- Set viewer: `(gEgo viewer: ScriptName)`
- Remove viewer: `(gEgo viewer: 0)`
- Runs continuously (like a Background script on the player)
- Example: `frogViewer` monitors terrain and changes view accordingly
- Viewer doit method typically checks `(gEgo onControl: 1)` to determine terrain
- Switch views based on terrain: `(gEgo view: 371)` for shallow, `(gEgo view: 377)` for deep
### Multiple Regions
Rooms can apply multiple region scripts:
```
(self setRegions: 501 512 511 508)
```
Document all applied regions and check each for additional interactions.
## Output Requirements
- Use descriptive Status values: "Documented", "Partial", or "Unverified" (NOT "TODO")
- Use clear, descriptive variable names
- Include full message text in quotes
- Organize interactions logically by type
- Be thorough but concise in descriptions
- Filename must be: `kq4-##-human-readable-name.md` (e.g., `kq4-024-waterfall-and-pool.md`)
- After completing the documentation, update README.md with the room description and link

345
README.md Normal file
View File

@@ -0,0 +1,345 @@
# King's Quest IV: The Perils of Rosella - Interaction Documentation
A comprehensive documentation of all game interactions extracted from the decompiled SCI (Sierra's Creative Interpreter) source code. This project documents the logic, conditions, state changes, and dependencies for recreating King's Quest IV as a modern point-and-click adventure.
## Repository Structure
```
/
├── rooms/ # Room-specific interaction documentation
│ ├── kq4-001.md # Beach (starting room)
│ ├── kq4-002.md # Beach continuation
│ ├── kq4-007.md # Fisherman's shack exterior
│ ├── kq4-042.md # Fisherman's cottage interior
│ └── ... # One file per room
├── KQ4_v1.006.004_int0.000.502_SRC_(6)/
│ └── src/ # Decompiled SCI scripts
│ ├── Main.sc # Game engine & global handlers
│ ├── Game.sc # Core game classes
│ ├── Feature.sc # Object interaction framework
│ ├── InvI.sc # Inventory system
│ ├── rm1.sc - rm99.sc # Room scripts
│ └── *.sc # Various utility scripts
└── README.md # This file
```
## Source Code Overview
### File Types
- **`.sc` files**: Sierra Script source code (main logic)
- **`.sco` files**: Compiled script object files (not human-readable)
- **`game.sh`**: Header file with game constants and defines
### Key Source Files
| File | Purpose |
|------|---------|
| `Main.sc` | Global game state, inventory, death handlers, sound management |
| `Game.sc` | Core Game class, save/load system, event handling |
| `Feature.sc` | Base classes for interactive objects (Feature, View, Actor) |
| `InvI.sc` | Inventory item definitions and display logic |
| `Class_255_0.sc` | Low-level system procedures and kernel functions |
| `rm##.sc` | Individual room scripts (rooms 1-99) |
| `*Reg.sc` | Region scripts (shared logic for multiple rooms) |
### Room Script Anatomy
Each room script (`rm##.sc`) typically contains:
```
Room## of Rm # Room class definition
├── Properties
│ └── picture # Background image number
├── Methods
│ ├── init() # Room initialization
│ │ ├── north/south/east/west # Exit directions
│ │ ├── horizon # Walkable area boundary
│ │ ├── setRegions: # Apply shared region logic
│ │ ├── Props/Actors/Views # Interactive objects
│ │ └── gEgo positioning # Player start position
│ ├── doit() # Per-frame logic (rarely used)
│ ├── handleEvent() # Text parser input handling
│ └── dispose() # Cleanup when leaving room
└── Instances
├── Scripts # Multi-step sequences
├── Props # Animated objects
├── Views # Static scenery
└── Sounds # Audio effects
```
## Game Systems
### Parser Commands
The original game uses a text parser with verb-noun structure:
- **`Said 'look/grass'`** - Player typed "look at grass"
- **`Said 'use/key'`** - Player typed "use key"
- **`Said 'take/diamond'`** - Player typed "take diamond"
- **`Said '[<around][/room]'`** - "look around" or "look room"
### State Management
Global variables track game state:
| Variable | Purpose |
|----------|---------|
| `gEgo` | Player character object |
| `gRoom` | Current room instance |
| `gPrevRoomNum` | Previous room number |
| `gInv` | Inventory collection |
| `global100` | Unknown flag (weather/time?) |
| `global101` | Room has been visited |
| `global116` | Story progression state |
| `global105` | Multi-path room state |
### Inventory System
Items referenced by index in `gInv at: ##`:
| Index | Item |
|-------|------|
| 1 | Diamonds |
| 17 | Fishing pole |
| ... | (others documented per-room) |
### Message System
Text displayed via `Print scriptNum messageNum`:
- `Print 1 0` = Message 0 from script 1
- Messages stored separately in RESOURCE files
- To be extracted and added to room documentation
### Looking Up Text in the Strings Directory
Message text is extracted and stored in the `strings/` directory:
| File Pattern | Contents |
|--------------|----------|
| `strings/script_XXX_strings.txt` | Script-specific strings (room names, object names) |
| `strings/text_XXX.txt` | In-game dialog and message text |
**To look up a message:**
1. Identify the script number from the `Print` command (e.g., `Print 2 1` = script 2, message 1)
2. Open `strings/text_XXX.txt` where XXX matches the script number
3. Find the entry with the matching message number (e.g., `[0001]`)
**Example:**
```
Print 2 1 → Look in strings/text_002.txt, line [0001]
Result: "You see a river in the distance to the north."
```
**Note:** Message numbers in the code start from 0 and are displayed in brackets (e.g., `[0001]` = message 1).
## Room Documentation Format
Each room file follows this structure:
```markdown
# Room ##: [Room Name]
## Overview
- **Room Number**: ##
- **Picture**: ###
- **Region**: [Beach/Forest/Castle/etc.]
- **Exits**: North→#, South→#, East→#, West→#
## Objects
### [Object Name]
- **Type**: Prop/View/Actor
- **Position**: (x, y)
- **View**: ### (sprite/animation resource)
- **States**: [list of possible states]
#### Interactions
**Look**:
- Condition: [when visible]
- Text: "Message from game"
- Logic: [simplified state check]
**Use [Item]**:
- Condition: [inventory check]
- Effect: [what happens]
- State Change: [global or local variable changes]
## NPCs
### [Character Name]
- **Type**: Actor
- **Behavior**: [wandering, stationary, scripted]
#### Dialogue
- **Greeting**: [initial interaction]
- **Topics**: [what player can ask about]
- **Conditions**: [when available]
## Scripts
### [Script Name]
- **Trigger**: [what starts it]
- **Steps**: [sequence of actions]
- **State Changes**: [what it modifies]
## Walkthrough Integration
- **Critical Path**: [essential interactions]
- **Optional**: [side content]
- **Deaths**: [ways to die in this room]
```
## Conversion Notes for Point-and-Click
When adapting to a KQ5-style interface (walk, look, hand, talk, inventory):
1. **Walk**: Automated - player clicks destination, character walks there
2. **Look**: Maps to `Said 'look/object'` commands
3. **Hand**: Maps to `Said 'use/object'`, `Said 'take/object'`, `Said 'open/object'`
4. **Talk**: Maps to `Said 'talk/person'` or `Said 'ask/person/about'`
5. **Inventory**: Click item, then click target (replaces `Said 'use/item/on/target'`)
### Simplifications Made
- **Auto-walking**: No manual positioning needed
- **Context-sensitive**: Combine look/take/use based on object type
- **Smart defaults**: Auto-select appropriate verb for known object types
- **Inventory drag**: Drag item to target instead of typing commands
## Message Extraction Status
| Status | Description |
|--------|-------------|
| ⏳ Pending | Text resources not yet extracted from RESOURCE.### files |
| 📝 Documented | Text added to room files |
Text messages referenced as `Print scriptNum messageNum` will be extracted from the game's RESOURCE files and added to each room's documentation.
## Contributing
When adding room documentation:
1. Read the corresponding `rm##.sc` file
2. Document all `handleEvent` interactions
3. Note all Props, Views, and Actors
4. Track state dependencies (global variables)
5. Include original text when available
6. Describe simplified logic for point-and-click adaptation
## Progress
| Room Number | Room Description | Status |
|-------------|------------------|--------|
| 001 | Beach | [DONE](./rooms/kq4-001-beach.md) |
| 002 | Meadow (with Satyr/Pan) | [DONE](./rooms/kq4-002-meadow.md) |
| 003 | Fountain Pool | [DONE](./rooms/kq4-003-fountain-pool.md) |
| 004 | Ogre's Cottage Exterior | [DONE](./rooms/kq4-004-ogres-cottage.md) |
| 005 | Forest Grove | [DONE](./rooms/kq4-005-forest-grove.md) |
| 006 | Cave Entrance | [DONE](./rooms/kq4-006-cave-entrance.md) |
| 007 | Fisherman's Shack Exterior | [DONE](./rooms/kq4-007-fishermans-shack.md) |
| 008 | Back of Fisherman's Shack | [DONE](./rooms/kq4-008-back-of-fishermans-shack.md) |
| 009 | Shady Wooded Area | [DONE](./rooms/kq4-009-shady-wooded-area.md) |
| 010 | Forest Path | [DONE](./rooms/kq4-010-forest-path.md) |
| 011 | Enchanted Grove | [DONE](./rooms/kq4-011-enchanted-grove.md) |
| 012 | Haunted Forest | [DONE](./rooms/kq4-012-haunted-forest.md) |
| 013 | Beach | [DONE](./rooms/kq4-013-beach.md) |
| 014 | Green Meadow | [DONE](./rooms/kq4-014-green-meadow.md) |
| 015 | The Frog Pond | [DONE](./rooms/kq4-015-frog-pond.md) |
| 016 | Graveyard | [DONE](./rooms/kq4-016-graveyard.md) |
| 017 | Spooky House Exterior | [DONE](./rooms/kq4-017-spooky-house-exterior.md) |
| 018 | Cemetery | [DONE](./rooms/kq4-018-cemetery.md) |
| 019 | Coastal Cliffs | [DONE](./rooms/kq4-019-coastal-cliffs.md) |
| 020 | Meadow | [DONE](./rooms/kq4-020-meadow.md) |
| 021 | Bridge Over Stream | [DONE](./rooms/kq4-021-bridge-over-stream.md) |
| 022 | Gnome's Cottage | [DONE](./rooms/kq4-022-gnomes-cottage.md) |
| 023 | Forest Path with Cottage | [DONE](./rooms/kq4-023-forest-path-with-cottage.md) |
| 024 | Waterfall and Pool | [DONE](./rooms/kq4-024-waterfall-and-pool.md) |
| 025 | Beach at River Delta | [DONE](./rooms/kq4-025-beach-at-river-delta.md) |
| 026 | River Meadow | [DONE](./rooms/kq4-026-river-meadow.md) |
| 027 | Forest Path | [DONE](./rooms/kq4-027-forest-path.md) |
| 028 | Mine Entrance | [DONE](./rooms/kq4-028-mine-entrance.md) |
| 029 | Dense Forest | [DONE](./rooms/kq4-029-dense-forest.md) |
| 030 | Mountain Pass | [DONE](./rooms/kq4-030-mountain-pass.md) |
| 031 | Open Ocean | [DONE](./rooms/kq4-031-open-ocean.md) |
| 032 | Ocean Near Island | [DONE](./rooms/kq4-032-ocean-near-island.md) |
| 033 | Enchanted Island Beach | [DONE](./rooms/kq4-033-enchanted-island-beach.md) |
| 034 | Island Beach | [DONE](./rooms/kq4-034-island-beach.md) |
| 035 | Island Beach | [DONE](./rooms/kq4-035-island-beach.md) |
| 036 | Island Garden Pond | [DONE](./rooms/kq4-036-island-garden-pond.md) |
| 037 | Fairy Island | [DONE](./rooms/kq4-037-fairy-island.md) |
| 038 | Island Garden | [DONE](./rooms/kq4-038-island-garden.md) |
| 039 | Island Beach | [DONE](./rooms/kq4-039-island-beach.md) |
| 040 | Island Beach (East) | [DONE](./rooms/kq4-040-island-beach-east.md) |
| 041 | Island Shore | [DONE](./rooms/kq4-041-island-shore.md) |
| 042 | Fisherman's Cottage Interior | [DONE](./rooms/kq4-042-fishermans-shack-inside.md) |
| 043 | Desert Island | [DONE](./rooms/kq4-043-desert-island.md) |
| 044 | Inside Whale | [DONE](./rooms/kq4-044-inside-whale.md) |
| 045 | Genesta's Bed Chamber | [DONE](./rooms/kq4-045-genestas-bed-chamber.md) |
| 046 | Tower Stairway | [DONE](./rooms/kq4-046-tower-stairway.md) |
| 047 | Genesta's Palace Entry Hall | [DONE](./rooms/kq4-047-genestas-palace-entry-hall.md) |
| 048 | Ogre's Bedroom | [DONE](./rooms/kq4-048-ogres-bedroom.md) |
| 049 | Ogre's Cottage | [DONE](./rooms/kq4-049-ogres-cottage.md) |
| 050 | Ogress's Kitchen | [DONE](./rooms/kq4-050-ogress-kitchen.md) |
| 051 | Ogre's Closet | [DONE](./rooms/kq4-051-ogres-closet.md) |
| 052 | | N/A (doesn't exist) |
| 053 | Seven Dwarfs' Bedroom | [DONE](./rooms/kq4-053-seven-dwarfs-bedroom.md) |
| 054 | Seven Dwarfs' Cottage | [DONE](./rooms/kq4-054-seven-dwarfs-cottage.md) |
| 055 | Seven Dwarfs Diamond Mine | [DONE](./rooms/kq4-055-seven-dwarfs-diamond-mine.md) |
| 056 | Seven Dwarfs' Diamond Mine (West) | [DONE](./rooms/kq4-056-seven-dwarfs-diamond-mine-west.md) |
| 057 | Witches' Cave | [DONE](./rooms/kq4-057-witches-cave.md) |
| 058 | Tower Organ Room | [DONE](./rooms/kq4-058-tower-organ-room.md) |
| 059 | Baby Nursery | [DONE](./rooms/kq4-059-baby-nursery.md) |
| 060 | Bedroom | [DONE](./rooms/kq4-060-bedroom.md) |
| 061 | Tower Stairs | [DONE](./rooms/kq4-061-tower-stairs.md) |
| 062 | Bedroom | [DONE](./rooms/kq4-062-bedroom.md) |
| 063 | Attic | [DONE](./rooms/kq4-063-attic.md) |
| 064 | Old Dining Room | [DONE](./rooms/kq4-064-old-dining-room.md) |
| 065 | Old Kitchen | [DONE](./rooms/kq4-065-old-kitchen.md) |
| 066 | Secret Tower | [DONE](./rooms/kq4-066-secret-tower.md) |
| 067 | The Parlor | [DONE](./rooms/kq4-067-the-parlor.md) |
| 068 | The Foyer | [DONE](./rooms/kq4-068-the-foyer.md) |
| 069 | The Crypt | [DONE](./rooms/kq4-069-the-crypt.md) |
| 070 | Waterfall Cave | [DONE](./rooms/kq4-070-waterfall-cave.md) |
| 071 | Cave Entrance | [DONE](./rooms/kq4-071-cave-entrance.md) |
| 072 | Dark Cave Passage | [DONE](./rooms/kq4-072-dark-cave-passage.md) |
| 073 | Cave Exit | [DONE](./rooms/kq4-073-cave-exit.md) |
| 074 | Troll Cave | [DONE](./rooms/kq4-074-troll-cave.md) |
| 075 | Troll Cave Passage | [DONE](./rooms/kq4-075-troll-cave-passage.md) |
| 076 | Dark Chasm | [DONE](./rooms/kq4-076-dark-chasm.md) |
| 077 | Swamp | [DONE](./rooms/kq4-077-swamp.md) |
| 078 | Swamp Island | [DONE](./rooms/kq4-078-swamp-island.md) |
| 079 | Mountain Path to Dark Castle | [DONE](./rooms/kq4-079-mountain-path-to-dark-castle.md) |
| 080 | Lolotte's Castle Entrance | [DONE](./rooms/kq4-080-lolottes-castle-entrance.md) |
| 081 | Edgar's Tower Bedroom | [DONE](./rooms/kq4-081-edgars-tower-bedroom.md) |
| 082 | Lolotte's Tower Bedroom | [DONE](./rooms/kq4-082-lolottes-tower-bedroom.md) |
| 083 | Castle Dungeon Cell | [DONE](./rooms/kq4-083-castle-dungeon-cell.md) |
| 084 | Cottage Front | [DONE](./rooms/kq4-084-cottage-front.md) |
| 085 | Dark Tower Stairs | [DONE](./rooms/kq4-085-dark-tower-stairs.md) |
| 086 | Dim Hallway (West End) | [DONE](./rooms/kq4-086-dim-hallway-west-end.md) |
| 087 | East End of Hallway | [DONE](./rooms/kq4-087-east-end-of-hallway.md) |
| 088 | Stone Tower Stairs | [DONE](./rooms/kq4-088-stone-tower-stairs.md) |
| 089 | Castle Kitchen | [DONE](./rooms/kq4-089-castle-kitchen.md) |
| 090 | West Tower Bottom | [DONE](./rooms/kq4-090-west-tower-bottom.md) |
| 091 | Castle Dining Room | [DONE](./rooms/kq4-091-castle-dining-room.md) |
| 092 | Lolotte's Throne Room | [DONE](./rooms/kq4-092-lolottes-throne-room.md) |
| 093 | Bottom of East Tower | [DONE](./rooms/kq4-093-bottom-of-east-tower.md) |
| 094 | Unicorn Stable | [DONE](./rooms/kq4-094-unicorn-stable.md) |
| 095 | Fisherman's Pier | [DONE](./rooms/kq4-095-fishermans-pier.md) |
| 096 | | N/A (doesn't exist) |
| 097 | | N/A (doesn't exist) |
| 098 | Transitional Room | [DONE](./rooms/kq4-098-transitional-room.md) |
| 099 | Transitional Room | [DONE](./rooms/kq4-099-transitional-room.md) |
## Credits
- **Original Game**: Sierra On-Line (1988)
- **Decompilation**: Unknown decompiler tools
- **Source Code**: King's Quest IV v1.006.004
- **Documentation**: Created for remake project
## License
This documentation is for educational and preservation purposes. King's Quest IV is a trademark of Sierra On-Line/Activision.

1
SCICompanion Submodule

Submodule SCICompanion added at f1a603b48b

635
extract_sci_text.py Normal file
View File

@@ -0,0 +1,635 @@
#!/usr/bin/env python3
"""
SCI Resource Text Extractor
Extracts text strings from Sierra's Creative Interpreter (SCI) resource files.
Supports SCI0 format (King's Quest IV) with LZW decompression.
"""
import os
import struct
import sys
from pathlib import Path
from typing import List, Dict, Tuple, Optional
class TextEntry:
"""Represents a single text entry from a message resource."""
def __init__(self):
self.noun: int = 0
self.verb: int = 0
self.condition: int = 0
self.sequence: int = 0
self.talker: int = 0
self.style: int = 0
self.text: str = ""
def __repr__(self):
return f"TextEntry(noun={self.noun}, verb={self.verb}, cond={self.condition}, seq={self.sequence}, talker={self.talker}, text={self.text[:50]!r}...)"
def decompress_lzw(src: bytes, length: int) -> bytes:
"""
Decompress LZW compressed data (SCI0 method 1).
Uses 9-12 bit LZW encoding.
"""
dest = bytearray(length)
bitlen = 9 # no. of bits to read (max. 12)
bitmask = 0x01ff
bitctr = 0 # current bit position
bytectr = 0 # current byte position
tokenlist = [0] * 4096 # pointers to dest[]
tokenlengthlist = [0] * 4096 # char length of each token
tokenctr = 0x102 # no. of registered tokens (starts here)
maxtoken = 0x200 # The biggest token
tokenlastlength = 0
destctr = 0
complength = len(src)
while bytectr < complength:
# Read next token from bit stream
if bytectr >= complength:
break
tokenmaker = src[bytectr] >> bitctr
if bytectr + 1 < complength:
tokenmaker |= (src[bytectr + 1] << (8 - bitctr))
if bytectr + 2 < complength:
tokenmaker |= (src[bytectr + 2] << (16 - bitctr))
token = int(tokenmaker & bitmask)
bitctr += bitlen - 8
while bitctr >= 8:
bitctr -= 8
bytectr += 1
bytectr += 1
if token == 0x101: # terminator
break
if token == 0x100: # reset command
maxtoken = 0x200
bitlen = 9
bitmask = 0x01ff
tokenctr = 0x0102
else:
if token > 0xff:
if token < tokenctr:
tokenlastlength = tokenlengthlist[token] + 1
if destctr + tokenlastlength > length:
# Overflow protection
i = 0
while destctr < length and i < tokenlastlength:
dest[destctr] = dest[tokenlist[token] + i]
destctr += 1
i += 1
else:
for i in range(tokenlastlength):
dest[destctr] = dest[tokenlist[token] + i]
destctr += 1
else:
tokenlastlength = 1
if destctr < length:
dest[destctr] = token
destctr += 1
# Register new token
if tokenctr == maxtoken:
if bitlen < 12:
bitlen += 1
bitmask = (bitmask << 1) | 1
maxtoken <<= 1
if tokenctr < 4096:
tokenlist[tokenctr] = destctr - tokenlastlength
tokenlengthlist[tokenctr] = tokenlastlength
tokenctr += 1
return bytes(dest)
def decompress_huffman(src: bytes, length: int) -> bytes:
"""
Decompress Huffman compressed data (SCI0 method 2).
"""
if len(src) < 2:
return src
dest = bytearray(length)
destctr = 0
numnodes = src[0]
terminator = src[1]
bytectr = 2 + (numnodes << 1)
bitctr = 0
nodes = src[2:2 + (numnodes << 1)]
while bytectr < len(src) and destctr < length:
node_idx = 0
while nodes[node_idx * 2 + 1] != 0:
if bytectr >= len(src):
break
value = (src[bytectr] << bitctr) & 0xFF
bitctr += 1
if bitctr == 8:
bitctr = 0
bytectr += 1
if value & 0x80:
next_node = nodes[node_idx * 2 + 1] & 0x0f
if next_node == 0:
if bytectr >= len(src):
break
result = (src[bytectr] << bitctr) & 0xFF
bytectr += 1
if bytectr < len(src):
result |= src[bytectr] >> (8 - bitctr)
result &= 0x0ff
if result == terminator:
break
if destctr < length:
dest[destctr] = result
destctr += 1
break
else:
next_node = nodes[node_idx * 2 + 1] >> 4
node_idx += next_node
if nodes[node_idx * 2 + 1] == 0:
value = nodes[node_idx * 2] | (nodes[node_idx * 2 + 1] << 8)
if value == (0x100 | terminator):
break
if destctr < length:
dest[destctr] = value & 0xFF
destctr += 1
return bytes(dest)
class SCIResourceExtractor:
"""Extracts text resources from SCI game files."""
# Resource types
RESOURCE_TYPES = {
0: "View",
1: "Pic",
2: "Script",
3: "Text",
4: "Sound",
5: "Memory",
6: "Vocab",
7: "Font",
8: "Cursor",
9: "Patch"
}
# Compression methods
COMPRESSION_METHODS = {
0: "None",
1: "LZW",
2: "Huffman",
3: "LZW+Huffman"
}
def __init__(self, game_dir: str):
self.game_dir = Path(game_dir)
self.map_file = self.game_dir / "RESOURCE.MAP"
self.resource_files = sorted(self.game_dir.glob("RESOURCE.0*"))
self.resources = []
def read_resource_map(self) -> List[Dict]:
"""Read the RESOURCE.MAP file and return list of resource entries."""
resources = []
with open(self.map_file, 'rb') as f:
data = f.read()
# SCI0 format: 6 bytes per entry
# - 2 bytes: resource number (11 bits) + type (5 bits)
# - 4 bytes: offset (26 bits) + package number (6 bits)
entry_size = 6
for i in range(0, len(data), entry_size):
if i + entry_size > len(data):
break
entry = data[i:i+entry_size]
# Unpack SCI0 entry
word = struct.unpack('<H', entry[0:2])[0]
res_number = word & 0x7FF # 11 bits
res_type = (word >> 11) & 0x1F # 5 bits
# Check for terminator (all 1s)
if word == 0xFFFF:
dword = struct.unpack('<I', entry[2:6])[0]
if dword == 0xFFFFFFFF:
break
dword = struct.unpack('<I', entry[2:6])[0]
offset = dword & 0x3FFFFFF # 26 bits
package = (dword >> 26) & 0x3F # 6 bits
resources.append({
'number': res_number,
'type': res_type,
'type_name': self.RESOURCE_TYPES.get(res_type, f"Unknown({res_type})"),
'offset': offset,
'package': package
})
return resources
def read_resource_header(self, package: int, offset: int) -> Optional[Dict]:
"""Read the header of a resource in a package file."""
resource_file = self.game_dir / f"RESOURCE.{package:03d}"
if not resource_file.exists():
return None
with open(resource_file, 'rb') as f:
f.seek(offset)
header_data = f.read(8)
if len(header_data) < 8:
return None
# SCI0 header format
word1 = struct.unpack('<H', header_data[0:2])[0]
res_number = word1 & 0x7FF
res_type = (word1 >> 11) & 0x1F
compressed_size = struct.unpack('<H', header_data[2:4])[0]
decompressed_size = struct.unpack('<H', header_data[4:6])[0]
method = struct.unpack('<H', header_data[6:8])[0]
return {
'number': res_number,
'type': res_type,
'type_name': self.RESOURCE_TYPES.get(res_type, f"Unknown({res_type})"),
'compressed_size': compressed_size,
'decompressed_size': decompressed_size,
'method': method,
'method_name': self.COMPRESSION_METHODS.get(method, f"Unknown({method})")
}
def extract_resource_data(self, package: int, offset: int, compressed_size: int,
decompressed_size: int, method: int) -> Optional[bytes]:
"""Extract and decompress resource data."""
resource_file = self.game_dir / f"RESOURCE.{package:03d}"
if not resource_file.exists():
return None
with open(resource_file, 'rb') as f:
f.seek(offset + 8) # Skip header
# For SCI0, compressed_size includes the 4 bytes for cbDecompressed and iMethod
data = f.read(compressed_size - 4)
if method == 0:
# No compression
return data[:decompressed_size]
elif method == 1:
# LZW compression
return decompress_lzw(data, decompressed_size)
elif method == 2:
# Huffman compression
return decompress_huffman(data, decompressed_size)
else:
print(f"Warning: Unsupported compression method {method}")
return None
def parse_text_resource(self, data: bytes) -> List[str]:
"""Parse a simple text resource (type 3)."""
strings = []
i = 0
while i < len(data):
# Find null-terminated string
start = i
while i < len(data) and data[i] != 0:
i += 1
if i > start:
try:
text = data[start:i].decode('latin-1')
strings.append(text)
except:
pass
i += 1 # Skip null terminator
return strings
def parse_message_resource(self, data: bytes) -> List[TextEntry]:
"""Parse a message resource (type 10 or embedded text in scripts)."""
entries = []
if len(data) < 2:
return entries
# Check for version indicator
msg_version = struct.unpack('<H', data[0:2])[0]
if msg_version <= 0x835: # 2101
# Version 2102 format
entries = self._parse_message_v2102(data)
elif msg_version <= 0xd53: # 3411
# Version 3411 format
entries = self._parse_message_v3411(data)
else:
# Version 4000+ format
entries = self._parse_message_v4000(data)
return entries
def _parse_message_v2102(self, data: bytes) -> List[TextEntry]:
"""Parse message resource version 2102 (SCI0/early SCI1)."""
entries = []
if len(data) < 4:
return entries
msg_version = struct.unpack('<H', data[0:2])[0]
# Skip version and unknown word
pos = 4
if len(data) < pos + 2:
return entries
message_count = struct.unpack('<H', data[pos:pos+2])[0]
pos += 2
for i in range(message_count):
if pos + 6 > len(data):
break
entry = TextEntry()
entry.noun = data[pos]
entry.verb = data[pos + 1]
pos += 2
text_offset = struct.unpack('<H', data[pos:pos+2])[0]
pos += 4 # Skip text offset and 2 unknown bytes
# Read text at offset
if text_offset < len(data):
text_end = text_offset
while text_end < len(data) and data[text_end] != 0:
text_end += 1
try:
entry.text = data[text_offset:text_end].decode('latin-1')
except:
entry.text = "<decode error>"
entries.append(entry)
return entries
def _parse_message_v3411(self, data: bytes) -> List[TextEntry]:
"""Parse message resource version 3411."""
entries = []
if len(data) < 6:
return entries
# Skip first 2 bytes (ptr to end of text data)
pos = 2
message_count = struct.unpack('<H', data[pos:pos+2])[0]
pos += 2
for i in range(message_count):
if pos + 11 > len(data):
break
entry = TextEntry()
entry.noun = data[pos]
entry.verb = data[pos + 1]
entry.condition = data[pos + 2]
entry.sequence = data[pos + 3]
entry.talker = data[pos + 4]
pos += 5
text_offset = struct.unpack('<H', data[pos:pos+2])[0]
pos += 5 # Skip text offset + 3 unknown bytes
# Read text at offset
if text_offset < len(data):
text_end = text_offset
while text_end < len(data) and data[text_end] != 0:
text_end += 1
try:
entry.text = data[text_offset:text_end].decode('latin-1')
except:
entry.text = "<decode error>"
entries.append(entry)
return entries
def _parse_message_v4000(self, data: bytes) -> List[TextEntry]:
"""Parse message resource version 4000+ (SCI1.1+)."""
entries = []
if len(data) < 6:
return entries
# Skip offset to end and mystery number
pos = 4
message_count = struct.unpack('<H', data[pos:pos+2])[0]
pos += 2
for i in range(message_count):
if pos + 14 > len(data):
break
entry = TextEntry()
entry.noun = data[pos]
entry.verb = data[pos + 1]
entry.condition = data[pos + 2]
entry.sequence = data[pos + 3]
entry.talker = data[pos + 4]
pos += 5
text_offset = struct.unpack('<H', data[pos:pos+2])[0]
pos += 2
entry.style = struct.unpack('<I', data[pos:pos+4])[0]
pos += 4
# Read text at offset
if text_offset < len(data):
text_end = text_offset
while text_end < len(data) and data[text_end] != 0:
text_end += 1
try:
entry.text = data[text_offset:text_end].decode('latin-1')
except:
entry.text = "<decode error>"
entries.append(entry)
return entries
def extract_all_text(self, output_dir: str):
"""Extract all text resources and save to output directory."""
output_path = Path(output_dir)
output_path.mkdir(parents=True, exist_ok=True)
# Read resource map
resources = self.read_resource_map()
print(f"Found {len(resources)} resources in RESOURCE.MAP")
# Group by type
text_resources = [r for r in resources if r['type'] == 3] # Text type
message_resources = [r for r in resources if r['type'] == 10] # Message type (if exists)
script_resources = [r for r in resources if r['type'] == 2] # Scripts
print(f"Found {len(text_resources)} text resources")
print(f"Found {len(message_resources)} message resources")
print(f"Found {len(script_resources)} script resources")
total_strings = 0
# Process text resources
for res in text_resources:
header = self.read_resource_header(res['package'], res['offset'])
if not header:
continue
print(f"Processing Text resource {res['number']} (package {res['package']}, offset {res['offset']}, method {header['method_name']})")
data = self.extract_resource_data(
res['package'],
res['offset'],
header['compressed_size'],
header['decompressed_size'],
header['method']
)
if data:
strings = self.parse_text_resource(data)
total_strings += len(strings)
# Write to file
output_file = output_path / f"text_{res['number']:03d}.txt"
with open(output_file, 'w', encoding='utf-8') as f:
for i, s in enumerate(strings):
f.write(f"[{i:04d}] {s}\n")
print(f" Extracted {len(strings)} strings to {output_file}")
# Process script resources for embedded text
print(f"\nScanning {len(script_resources)} script resources for embedded text...")
for res in script_resources:
header = self.read_resource_header(res['package'], res['offset'])
if not header:
continue
data = self.extract_resource_data(
res['package'],
res['offset'],
header['compressed_size'],
header['decompressed_size'],
header['method']
)
if data:
# Try to extract readable strings from script
strings = self._extract_strings_from_binary(data, min_length=5)
if strings:
total_strings += len(strings)
output_file = output_path / f"script_{res['number']:03d}_strings.txt"
with open(output_file, 'w', encoding='utf-8') as f:
for i, s in enumerate(strings):
f.write(f"[{i:04d}] {s}\n")
print(f"\nTotal strings extracted: {total_strings}")
# Create a master index
index_file = output_path / "_index.txt"
with open(index_file, 'w', encoding='utf-8') as f:
f.write("SCI Resource Text Extraction Index\n")
f.write("=" * 50 + "\n\n")
f.write(f"Game directory: {self.game_dir}\n")
f.write(f"Total resources: {len(resources)}\n")
f.write(f"Text resources: {len(text_resources)}\n")
f.write(f"Script resources: {len(script_resources)}\n")
f.write(f"Total strings extracted: {total_strings}\n\n")
f.write("Resource List:\n")
f.write("-" * 50 + "\n")
for r in resources:
f.write(f"{r['type_name']:12s} #{r['number']:03d} -> Package {r['package']}, Offset {r['offset']}\n")
print(f"\nIndex written to {index_file}")
def _extract_strings_from_binary(self, data: bytes, min_length: int = 5) -> List[str]:
"""Extract readable strings from binary data."""
strings = []
i = 0
while i < len(data):
# Look for printable ASCII sequences
if 32 <= data[i] <= 126:
start = i
while i < len(data) and 32 <= data[i] <= 126:
i += 1
if i - start >= min_length:
try:
s = data[start:i].decode('ascii')
strings.append(s)
except:
pass
else:
i += 1
return strings
def main():
"""Main entry point."""
# Find the game directory
game_dirs = [
"King's Quest IV - The Perils of Rosella (1988)/KQ4",
"King's Quest IV - The Perils of Rosella (1988)",
]
game_dir = None
for d in game_dirs:
if os.path.exists(d):
game_dir = d
break
if not game_dir:
print("Error: Could not find game directory")
sys.exit(1)
print(f"Extracting text from: {game_dir}")
extractor = SCIResourceExtractor(game_dir)
extractor.extract_all_text("strings")
print("\nExtraction complete!")
if __name__ == "__main__":
main()

239
rooms/001-beach.md Normal file
View File

@@ -0,0 +1,239 @@
# Room 001: Beach (Starting Area)
## Overview
- **Room Number**: 1
- **Script**: `rm1.sc`
- **Picture**: 1 (with overlay 101 if `global100` is set)
- **Region**: Beach
- **Regions Applied**: 503 (BeachReg), 501, 504, 506
### Exits
- **North**: Room 25
- **South**: Room 7 (Fisherman's shack exterior)
- **East**: Room 2
- **West**: Room 31
- **Horizon**: 100 (player cannot walk above this Y coordinate)
### State Dependencies
- `global105`: Controls dolphin riding state and player positioning
- `0`: Normal beach access from various rooms
- `1-4`: Different horizontal positions when entering from north/south
- `14`: Dolphin ride arrival (special entrance)
- `global100`: If set, overlays picture 101 (alternate weather/time?)
- `global205`: Cleared when dolphin ride completes
## Visual Elements
### Animated Waves (Background Effects)
Three animated wave Props cycle continuously using `waveActions` script.
#### wave1
- **Type**: Prop
- **Position**: (203, 75)
- **View**: 665
- **Loop**: 0
- **Animation**: Cycles through frames, then hides, cycles next wave
- **Priority**: 0 (background layer)
- **Behavior**: Creates continuous wave animation effect
#### wave2
- **Type**: Prop
- **Position**: (191, 115)
- **View**: 665
- **Loop**: 1
- **Animation**: Cycles through frames
- **Priority**: 0
#### wave3
- **Type**: Prop
- **Position**: (191, 188)
- **View**: 665
- **Loop**: 2
- **Animation**: Cycles through frames
- **Priority**: 0
### Sea Spray / Mist
- **Type**: Prop (`newProp`)
- **Position**: (69, 61)
- **View**: 650
- **Loop**: 1
- **Cel**: 1
- **Animation**: Forward cycle (continuous)
- **Purpose**: Ambient atmospheric effect
## Player Positioning Logic
The room uses complex positioning based on `global105` state and `gPrevRoomNum`:
### Default State (global105 = 0)
- **From South (Room 7)**:
- If x > 128: Position at (300, 187)
- Else: Position at (225, 187)
- **From North (Room 25)**: Position at x=225, y=horizon+yStep+1
- **New Game (Room 0)**: Position at (220, 135)
- **From East (Room 2)**:
- If y ≤ horizon: x=318, y=horizon+yStep+1
- Else: x=318, keep current y
### Dolphin State (global105 = 14)
- Special arrival from dolphin ride
- Sets `global205 = 0`
- Changes player view to 312 (dolphin riding animation)
- Initiates `rideDolphin` script
## Interactions
### Look Commands (Parser)
#### Look at grass
- **Command**: `look grass` / `look at grass`
- **Text**: `Print 1 0` (message resource pending extraction)
- **Logic**: Direct text display, no conditions
#### Look at brook
- **Command**: `look brook` / `look at brook`
- **Text**: `Print 1 1` (message resource pending extraction)
- **Logic**: Direct text display, no conditions
#### Look around room
- **Command**: `look` / `look around` / `look room`
- **Text**: `Print 1 2` (message resource pending extraction)
- **Logic**: General room description
### Region-Based Interactions (via BeachReg - Script 503)
The following interactions are inherited from the BeachReg region:
#### Look at ocean/water
- **Command**: `look ocean` / `look water`
- **Conditions**:
- If `gEgo view != 2` (not swimming): Shows one message
- If `gEgo view == 2` (swimming): Shows different message
- **Text**: `Print 503 2` or context-specific messages
#### Look at fish
- **Command**: `look fish`
- **Conditions**:
- If player has item 24 (fish in inventory): Shows fish item
- Else: Shows default message
- **Text**: `Print 503 3` or item display
#### Drink water
- **Command**: `drink` / `get drink`
- **Conditions**:
- Must be in swim view (view 2)
- Must be near water (control color check)
- **Effect**: Plays drinking animation (view 21)
- **Script**: `drinking` - 4-state animation sequence
#### Bathe/Dive/Wade in ocean
- **Command**: `bathe ocean` / `dive ocean` / `wade ocean`
- **Conditions**:
- Only available when `global105 == 4` (dolphin accessible)
- **Response**: Context-aware messaging
## Scripts
### rideDolphin
**Purpose**: Handles player arrival via dolphin ride
**Trigger**: `global105 == 14` on room entry
**Sequence**:
1. State 1: Disable input (`proc0_8`), move player to (66, 136)
2. State 2:
- Create dolphin Actor
- Set `global105 = 4`
- Restore player viewer
- Position dolphin at player position minus 5 pixels Y
- Set dolphin view 311, loop 2
- Wait 4 seconds
3. State 3:
- Accelerate dolphin (xStep 4, yStep 3)
- Change to loop 5
- Move dolphin off-screen to (-10, 100)
- Re-enable input (`proc0_9`)
- Clear `global205`
4. State 4:
- Dispose dolphin Actor
- Clear player script
**State Changes**:
- Sets `global105 = 4`
- Clears `global205 = 0`
### waveActions
**Purpose**: Manages continuous wave animation cycle
**Sequence**:
1. State 0: Initialize - Create static wave Views from wave Prop positions, add to picture
2. State 1: Show next wave Prop, animate to end
3. State 2: Hide wave, advance to next wave in list, loop back to State 1
**Behavior**: Infinite loop cycling through wave1 → wave2 → wave3 → wave1...
## Point-and-Click Adaptation Notes
### Automated Behaviors
- **Walking**: Player clicks anywhere on walkable area, character auto-walks
- **Horizon**: Enforced automatically; player cannot walk above y=100
- **Exits**: Walking off screen edges transitions to connected rooms
### Cursor Mappings
| Original Command | Point-and-Click Equivalent |
|------------------|---------------------------|
| `look grass` | Eye cursor on grass patch |
| `look brook` | Eye cursor on water/brook area |
| `look around` | Eye cursor on background/scenery |
| `drink water` | Hand cursor on water (when near) |
| `bathe ocean` | Hand cursor on ocean (when dolphin available) |
### Context-Sensitive Actions
- **Dolphin interaction**: Only show "ride" cursor when `global105 == 4`
- **Swim view**: Automatically switch to swimming animation (view 2) when entering water
### Visual Feedback
- Waves animate continuously (no player interaction needed)
- Sea spray provides ambient movement
- Dolphin arrival is a scripted sequence (no player input during animation)
## Unresolved Questions
1. What is `global100`? (Appears to be weather or time of day flag)
2. What are regions 501, 504, 506? (Need to examine those scripts)
3. What do messages 1 0, 1 1, 1 2 say? (Need text resource extraction)
4. What triggers `global105 = 14` state? (Dolphin ride must be initiated elsewhere)
## Dependencies
### Global Variables Used
- `global100`: Weather/time flag
- `global101`: Room visited flag (set to 0)
- `global105`: Beach state / dolphin access
- `global205`: Cleared on dolphin arrival
### Inventory Items Referenced
- Item 17: Fishing pole (via region)
- Item 24: Fish (via region)
### Views Referenced
- View 311: Dolphin animation
- View 312: Player on dolphin
- View 665: Wave animations
- View 650: Sea spray
### Rooms Connected
- North: 25
- South: 7
- East: 2
- West: 31
## Critical Path Notes
This room is part of the starting beach area. It serves as:
1. **Entry point** from various directions
2. **Dolphin transportation hub** (when `global105 == 4`)
3. **Transition zone** between beach, forest, and fisherman's shack
The dolphin ride appears to be a significant transportation mechanic connecting distant areas of the game.

View File

@@ -0,0 +1,67 @@
# Room 24: Waterfall and Pool
This room features a magnificent waterfall cascading into a deep pool that flows westward as a rushing river. The area is surrounded by dense forest. The room contains the solution to the frog puzzle - players can use the crown here to transform into a frog and access the underwater cave (Room 70). The waterfall also creates a hazard that can sweep players away if they're not careful.
## Look Description
"You see a beautiful waterfall cascading down the mountain into a deep blue pool. From the pool, a river courses westward. Around you, a dense forest closes in."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look in falls` | "You can't see through the waterfall." |
| TODO | Look | `look under pool` / `look under water` / `look under falls` | "You can't make out many details from here." (if not in water) or "You look under the water, but can see nothing." (if in water) |
| TODO | Look | `look in water` / `look in pool` | "You look into the water, but see nothing of interest." |
| TODO | Look | `look behind falls` | "You think you see something behind the waterfall, but you're not sure what it is." |
| TODO | Look | `look falls` | "This is a magnificent waterfall! It tumbles into a deep pool, which then flows westward as a rushing river." |
| TODO | Look | `look in pool` | "You peer into the pool of water, but cannot see anything of importance." |
| TODO | Look | `look pool` | "You see a deep pool below the waterfall." |
| TODO | Look | `look around` / `look room` | "You see a beautiful waterfall cascading down the mountain into a deep blue pool. From the pool, a river courses westward. Around you, a dense forest closes in." |
| TODO | Action | `enter behind falls` | "The force of the water is too strong for you to be able to do that." |
| TODO | Action | `bathe under pool` / `bathe under water` / `bathe under falls` / `dive under pool` / `dive under water` / `dive under falls` | "You're not strong enough. The current forces you back!" (if in frog form), "The water isn't deep enough here." (if not in swimming/frog form), "You'd have to be in the water to do that." (otherwise) |
| TODO | Action | `bathe` / `dive` / `wade` | "Just enter the water." (if on land), "You are already swimming." (if swimming), "You are already in the water." (if in water) |
| TODO | Inventory | `dennis crown` / `place crown` | Transforms player into frog form if crown is in inventory and player is on land; "Not while you're IN the water." (if in water) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | egoFrogActions | Using `dennis crown` or `place crown` command while on land and having crown in inventory | Plays poof sound effect, creates transformation animation, changes player view to frog (370), enables frog viewer script, moves player to water's edge, hides player, sets `frog_transformation_used = true`, awards 5 points on first use, transports to Room 70 |
| TODO | Background | frogViewer | Continuous while player is in frog form (`viewer` is set to frogViewer) | Monitors player terrain control - switches view to 371 (shallow water) or 377 (deep water) based on terrain type |
| TODO | Interaction | swept | Walking near waterfall while in swimming form (view 8) and not already in a script | Player is pushed back by waterfall current, displays message "The force of the water pushes you back." |
## Technical Notes
- **Room Number**: 24
- **Picture**: 24
- **Region**: 501, 512, 511, 508 (Forest/Nature regions)
- **Exits**: North→18, South→30, West→23, East→70 (via frog transformation)
- **Horizon**: 85 (walkable area boundary)
- **Sound**: Poof sound effect (59) played during frog transformation
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `is_night` | `true`, `false` | Controls whether night overlay (picture 124) is displayed |
| `room_visited` | `true`, `false` | Tracks if player has entered this room before |
| `frog_transformation_used` | `true`, `false` | Set when player transforms into frog; controls access to Room 70 |
| `transformation_score_awarded` | `true`, `false` | Tracks if 5-point score bonus has been awarded for frog transformation |
| `firefly_phase` | `0`, `1`, `2` | Controls display of firefly/firefly-like props; phase 2 shows additional animated effects |
| `in_water` | `true`, `false` | Player state - determined by view (view 8 = swimming, view 2 = normal, view 370/371/377 = frog) |
| `is_frog_form` | `true`, `false` | Player is in frog transformation form |
### Additional Technical Details
- Room uses Regions 501, 512, 511, and 508 for shared forest/nature logic
- Synonyms defined: `pool` = `lake`
- Multiple animated props (views 651, 653) create environmental effects (fireflies/lights)
- Player entry positioning varies by previous room:
- From North: positioned at x=47, just below horizon
- From West: positioned at x=1, respects horizon boundary
- From South: positioned at y=188, x capped at 214
- From East: positioned at (207, 159) with view 8 (swimming)
- Frog transformation requires crown (inventory item 10)
- Frog form uses different views for shallow water (371) vs deep water (377)
- Waterfall hazard triggers when player in swimming form (view 8) touches control area $0010

View File

@@ -0,0 +1,73 @@
# Room 55: Seven Dwarfs' Diamond Mine
This is the interior of the Seven Dwarfs' diamond mine. The room contains glittering diamonds embedded in the walls, a narrow hazardous path, and the dwarfs themselves who may be either peacefully working or hostile depending on the game state. Players can look at various features but cannot take the diamonds. If the dwarfs are hostile, the player will be forcefully removed from the mine.
## Look Description
"Diamonds glitter and sparkle from the earthen walls of the Seven Dwarfs' diamond mine. Within it, you see the little men busily at work."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look door` | "It is a ramshackle wooden door." |
| TODO | Look | `look out` / `look out door` / `look out mine` | "You look out the open door of the diamond mine, but notice nothing." |
| TODO | Look | `look around` / `look room` / `look mine` | "Diamonds glitter and sparkle from the earthen walls of the Seven Dwarfs' diamond mine. Within it, you see the little men busily at work." |
| TODO | Look | `look dwarf` | "You see the Seven Dwarfs toiling away with their picks and shovels, extracting the plentiful diamonds from their underground mine." |
| TODO | Look | `look mine` / `look diamond mine` | "This underground diamond mine belongs to the Seven Dwarfs." |
| TODO | Look | `look boulder` / `look gray boulder` | "Chunks of rock litter the floor of the diamond mine." |
| TODO | Look | `look down dirt` / `look down mine` | "Numerous rock and diamond chunks lie scattered on the mine floor." |
| TODO | Look | `look passageway` / `look mine passageway` | "The passageway of the diamond mine is but a short distance underground." |
| TODO | Look | `look path` | "Be careful on these narrow paths." |
| TODO | Look | `look wall` | "Sparkling diamonds flash and gleam from the mine walls." |
| TODO | Look | `look bucket` | "The bucket is brimming with sparkling diamonds." |
| TODO | Look | `look diamond` | "Sparkling diamonds gleam from the walls and litter the mine floor." |
| TODO | Get | `get boulder` | "You are not interested in the rocks." |
| TODO | Get | `get diamond` | "These diamonds do not belong to you." |
| TODO | Get | `get dwarf` | "You couldn't get the Seven Dwarfs." |
| TODO | Action | `rob diamond` | "You were raised better than that!" |
| TODO | Action | `climb boulder` | "There are no rocks to climb here." |
| TODO | Talk | `talk dwarf` / `talk` | "You endeavor to engage in conversation with the small men, but they are too busy to reply." |
| TODO | Action | `kill dwarf` | "You are NOT a murderous girl, Rosella!" |
| TODO | Action | `kiss dwarf` / `kiss` | "They are working awfully hard. That might distract them." |
| TODO | Action | `hit dwarf` | "You don't want to do that!" |
| TODO | Action | `help dwarf` | "They don't need help." |
| TODO | Inventory | `deliver [item]` / `return [item]` (if owned) | "The dwarfs have everything they need." |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | SendOut | Entering room when `dwarf_state = DWARF_STATE.HOSTILE` | Display hostile encounter message, dwarf approaches player, player is marched to door, sets `player_kicked_out = true`, transport to Room 28 |
| TODO | Interaction | Tripped | Walking on hazardous areas while `dwarf_state = DWARF_STATE.FRIENDLY` | Player falls animation sequence, lands and recovers, returns to normal walking state, sets `on_narrow_path = true` |
| TODO | Background | WalkPath | Continuous while player is on narrow paths | Adjusts player display priority while on path, monitors for tripping hazards, resets state when player leaves path |
| TODO | Background | Watch | Continuous while `dwarf_state = DWARF_STATE.FRIENDLY` | Dwarf plays "watching" animation, pauses between cycles, continuous loop |
| TODO | Background | sparkle | Continuous while `diamonds_visible = true` | Randomly selects one of 4 diamond locations, plays sparkle animation, repeats continuously |
## Technical Notes
- **Room Number**: 55
- **Picture**: 55
- **Region**: 600 (Diamond Mine)
- **Exits**: East→56, West→28 (via door/mine exit)
- **Music**: Dwarf theme (sound #30, looping)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `dwarf_state` | `DWARF_STATE.FRIENDLY`, `DWARF_STATE.HOSTILE` | Controls dwarf behavior and presence |
| `diamonds_visible` | `true`, `false` | Whether diamond sparkles are visible on walls |
| `room_visited` | `true`, `false` | Set to true when player first enters |
| `player_kicked_out` | `true`, `false` | Set when dwarfs force player to leave |
| `dwarf_music_playing` | `true`, `false` | Background music state |
| `on_narrow_path` | `true`, `false` | Whether player is on hazardous path |
### Additional Technical Details
- Room uses Region 600 for shared diamond mine logic
- Synonyms defined: `path` = `ledge`
- Region synonyms: `dwarf` = `ass` = `dwarf` = `man` = `person`
- Entry from Room 28 uses different starting position than entry from Room 56
- Player must navigate narrow paths with risk of tripping
- The `SendOut` script forces the player to leave if `dwarf_state = DWARF_STATE.HOSTILE`

100
rooms/056-diamond-mine.md Normal file
View File

@@ -0,0 +1,100 @@
# Room 56: Diamond Mine
Room 56 is the Seven Dwarfs' underground diamond mine, accessible from the cavern entrance in room 55. The room features multiple animated dwarves working at the mine, with one dwarf standing by a bucket full of diamonds who serves as the primary NPC interaction. The player can return lost diamonds to the dwarves in exchange for a lantern, which is required for exploring other dark areas of the game.
## Look Description
"You see the busy little dwarfs hard at work within the diamond mine. The diamonds flash and sparkle from the earthen walls."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look[<around]` / `look/room` / `look/mine[<diamond]` | "You see the busy little dwarfs hard at work within the diamond mine. The diamonds flash and sparkle from the earthen walls." (Print 56 2) |
| TODO | Look | `look/dwarf` | "One dwarf appears to be idling by the diamond bucket." (Print 56 3) |
| TODO | Look | `look/bucket` | "You see a bucket brim full of sparkling diamonds." (Print 56 4) |
| TODO | Look | `look/dwarf` (region) | "You see the Seven Dwarfs toiling away with their picks and shovels, extracting the plentiful diamonds from their underground mine." (Print 600 0) |
| TODO | Look | `look/mine[<diamond]` (region) | "This underground diamond mine belongs to the Seven Dwarfs." (Print 600 1) |
| TODO | Look | `look/boulder[<gray]` (region) | "Chunks of rock litter the floor of the diamond mine." (Print 600 2) |
| TODO | Look | `look/dirt[<mine]` (region) | "Numerous rock and diamond chunks lie scattered on the mine floor." (Print 600 3) |
| TODO | Look | `look/passageway[<mine]` (region) | "The passageway of the diamond mine is but a short distance underground." (Print 600 4) |
| TODO | Look | `look/path` (region) | "Be careful on these narrow paths." (Print 600 5) |
| TODO | Look | `look/wall` (region) | "Sparkling diamonds flash and gleam from the mine walls." (Print 600 6) |
| TODO | Look | `look/bucket` (region) | "The bucket is brimming with sparkling diamonds." (Print 600 7) |
| TODO | Look | `look/diamond` (region) | "Sparkling diamonds gleam from the walls and litter the mine floor." (Print 600 8) |
| TODO | Talk | `converse/dwarf` (when close to dwarf at bucket) | Triggers dialogue if player has pouch but not lantern |
| TODO | Talk | `converse/dwarf` (region) | "You endeavor to engage in conversation with the small men, but they are too busy to reply." (Print 600 14) |
| TODO | Talk | `converse[/!*]` (when close) | Triggers dialogue if player has pouch but not lantern |
| TODO | Talk | `converse[/!*]` (region) | "You endeavor to engage in conversation with the small men, but they are too busy to reply." (Print 600 14) |
| TODO | Action | `kiss/dwarf` / `kiss[/!*]` (when close) | "You attempt to kiss the dwarf, but he seems embarrassed by it." (Print 56 6) |
| TODO | Action | `kiss/dwarf` (region) | "They are working awfully hard. That might distract them." (Print 600 16) |
| TODO | Action | `kill/dwarf` (region) | "You are NOT a murderous girl, Rosella!" (Print 600 15) |
| TODO | Action | `hit/dwarf` (region) | "You are NOT a murderous girl, Rosella!" (Print 600 17) |
| TODO | Action | `help/dwarf` (region) | "They don't need help." (Print 600 18) |
| TODO | Action | `get,rob/bucket` | "The bucket is not yours, Rosella!" (Print 56 7) |
| TODO | Action | `rob/lantern` | "You were raised better than that!" (Print 56 8) |
| TODO | Get | `get/boulder` (region) | "You are not interested in the rocks." (Print 600 9) |
| TODO | Get | `get/diamond` (region) | "These diamonds do not belong to you." (Print 600 10) |
| TODO | Get | `get/dwarf` (region) | "You couldn't get the Seven Dwarfs." (Print 600 11) |
| TODO | Get | `rob/diamond` (region) | "These diamonds do not belong to you." (Print 600 12) |
| TODO | Get | `climb/boulder` (region) | "There are no rocks to climb here." (Print 600 13) |
| TODO | Inventory | `deliver,return/pouch,diamond[/dwarf]` / `deliver,return/dwarf/pouch,diamond` | Returns diamonds to dwarf if player has pouch and doesn't have lantern; triggers handOff script to receive lantern |
| TODO | Inventory | `deliver,return` (region) | "The dwarfs have everything they need." (Print 600 19) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|---------|
| TODO | Background | `dwarvesMove` | Auto-started on room init | Controls dwarf animations - randomly selects from 6 different movement/animation patterns, looping continuously |
| TODO | Background | `sparkle` | Triggered when global223 is true (time-based) | Randomly animates one of 4 sparkle props to simulate diamonds glittering |
| TODO | Interaction | `answer1` | Player talks to dwarf (converse/dwarf) when close and has pouch but not lantern | Multi-state dialogue: dwarf first greets player, then expresses concern, then becomes perturbed |
| TODO | Interaction | `handOff` | Player delivers pouch/diamonds to dwarf at correct position | Triggers sequence: dwarves stop moving, sparkle stops, dwarf animation changes, player receives lantern (item 3), score increases by 3, dwarf gives dialogue about taking lantern and leaving |
## Technical Notes
- **Room Number**: 56
- **Picture**: 56
- **Region**: 600 (Diamond Mine Region)
- **Exits**: West → Room 55 (entrance cavern)
- **Music**: Sound 30 (dwarfMusic) - plays when in room
- **Style**: $0010 (default)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `gEgo has: 1` | true/false | Player has the diamond pouch (obtained from room 54) |
| `gEgo has: 3` | true/false | Player has the lantern (obtained from dwarf in this room) |
| `global223` | true/false | Time-based flag controlling diamond sparkle animations (true during certain game periods) |
| `global101` | 1 | Set to 1 on room init |
### Room-Specific Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `newAct_4` | Actor/View | Main dwarf by the diamond bucket |
| `newAct_5` | Actor | Secondary dwarf animation (moves above bucket dwarf) |
| `newAct`, `newAct_2`, `newAct_3` | Actors | Additional dwarf animations in the mine |
| `newProp`, `newProp_2`, `newProp_3`, `newProp_4` | Props | Sparkle effects for diamonds |
| `newView` | View | Extra element shown when player doesn't have lantern (item 3) |
### Inventory Item Requirements
- **Item 1**: Diamond pouch (pouch containing diamonds)
- **Item 3**: Lantern (reward for returning diamonds)
### Entry Conditions
- Player enters from room 55 (west)
- Position reset to x=65, y=139 on entry
- Dwarves animate differently based on whether player has the pouch (item 1)
- Sparkle props only appear when global223 is true
### Region Synonyms
The following synonyms are defined in region 600:
- `dwarf` = `ass dwarf man person`
### Control Areas
- Edge detection: If player moves to x position with control area $0040, automatically returns to room 55

88
rooms/058-organ-room.md Normal file
View File

@@ -0,0 +1,88 @@
# Room 58: Organ Room
A dusty, old pipe organ sits in the center of the tower room. This puzzle room challenges Rosella to play the organ correctly to reveal a hidden drawer containing a skeleton key.
## Look Description
"A dusty, old pipe organ sits in the center of the tower room."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look room` / `look tower` | "A dusty, old pipe organ sits in the center of the tower room." (Print 58 0) |
| TODO | Look | `look down` / `look stair` / `look stairs` | "The tower stairs spiral steeply downward." (Print 58 1) |
| TODO | Look | `look behind organ` | "There is nothing but dust behind the old organ." (Print 58 2) |
| TODO | Look | `look in organ` | "You see nothing in the organ." (Print 58 3) |
| TODO | Look | `look organ` | "Dust and cobwebs cover the old organ." (Print 58 4) |
| TODO | Look | `look bench` | "There is a bench in front of the old organ." (Print 58 5) |
| TODO | Look | `look wall` | "There is nothing of importance on the walls." (Print 58 6) |
| TODO | Look | `look dirt` / `look down` | "There is nothing of interest on the floor." (Print 58 7) |
| TODO | Look | `look drawer` (drawer found) | "You see a skeleton key in the drawer." (Print 58 8) if key present, "You see an empty drawer." (Print 58 9) if key taken |
| TODO | Look | `look drawer` (drawer not found) | "What drawer?" (Print 58 10) |
| TODO | Action | `move bench` | "There's no need to move the bench." (Print 58 11) |
| TODO | Inventory | `play organ with sheet music` / `use sheet music on organ` | If at organ and has sheet music: "You find it difficult to read the old sheet music, but you attempt it anyway." (Print 58 12) + triggers drawer opening sequence |
| TODO | Inventory | `play organ with sheet music` / `use sheet music on organ` | If not at organ but has sheet music: "What music?" (Print 58 14) |
| TODO | Inventory | `play organ with sheet music` / `use sheet music on organ` | If no sheet music: "What music?" (Print 58 13) |
| TODO | Action | `play organ` / `use organ` / `play music` | If at organ: "You can only remember one 'oldie, but goodie.'" (Print 58 15) |
| TODO | Action | `play organ` / `use organ` / `play music` | If not at organ: "You're not sitting at the organ." (Print 58 16) |
| TODO | Action | `sit` / `sit on organ` / `sit on bench` | If already at organ: "You are already." (Print 58 17) |
| TODO | Action | `sit` / `sit on organ` / `sit on bench` | If in organ area (129-195, 121-126): Triggers sitOrgan script |
| TODO | Action | `sit` / `sit on organ` / `sit on bench` | If on bench area (122-211, 126-137): "It would be better to move to the inside of the bench." (Print 58 18) |
| TODO | Action | `stand` / `stand up` / `get up` / `exit organ` / `exit bench` | If at organ: Triggers standOrgan script |
| TODO | Action | `stand` / `stand up` / `get up` / `exit organ` / `exit bench` | If not at organ: "You are already standing." (Print 58 19) |
| TODO | Inventory | `get key` / `take key` | If drawer found and key present: "You take the skeleton key from the drawer." (Print 58 20), adds key to inventory, awards 2 points |
| TODO | Inventory | `get key` / `take key` | If drawer found but key already taken: Trays "proc0_14" (key already taken message) |
| TODO | Inventory | `get key` / `take key` | If drawer not found: "What key?" (Print 58 21) |
| TODO | Action | `close drawer` | If drawer found: "There's no need to close the drawer." (Print 58 22) |
| TODO | Action | `close drawer` | If drawer not found: "You don't see a drawer." (Print 58 23) |
| TODO | Action | `open drawer` | If drawer found: "The drawer is already open." (Print 58 24) |
| TODO | Action | `open drawer` | If drawer not found: "You don't see a drawer." (Print 58 23) |
| TODO | Action | `open bench` | "The bench doesn't open." (Print 58 25) |
| TODO | Action | `find drawer` / `look for drawer` | If drawer found: "You already found it." (Print 58 26) |
| TODO | Action | `find drawer` / `look for drawer` | If drawer not found: "Drawer? What drawer?" (Print 58 27) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | playOrgan | Player types `play organ with sheet music` at organ | Plays organ music, and if first time with sheet music, opens hidden drawer in organ, awards 4 points |
| TODO | Interaction | sitOrgan | Player types `sit` while in organ area (inRect 129-195, 121-126) | Animates Rosella sitting at organ bench, changes ego view to 58 |
| TODO | Interaction | standOrgan | Player types `stand` while sitting at organ | Animates Rosella standing up from organ, returns to normal view |
| TODO | Background | fallHole | Player walks into hole (onControl $0004) | Triggers falling animation sequence through hole, leads to room 61 (catacombs), sets global127 to 1 |
## Technical Notes
- **Room Number**: 58
- **Picture**: 58
- **Region**: 603 (organ room region)
- **Exits**: Down spiral stairs (room 61 - leads to catacombs when falling through hole)
- **Music**: Sound 57 (organ with sheet music), Sound 56 (organ basic), Sound 51 (falling scream), Sound 52 (falling sounds)
- **Views**: View 58 (sitting at organ), View 42 (landed in catacombs), View 44 (falling animation), View 521 (organ parts)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `local1` | 0, 1 | Drawer found state - set to 1 when drawer is opened for the first time |
| `local3` | 0, 1 | Key in drawer - 1 = key still present, 0 = key taken |
| `global193` | 0, 1+ | Organ played counter - incremented each time organ is played with sheet music |
| `global182` | 0, 1 | Key taken flag - set to 1 when player takes key from drawer |
| `global127` | 0, 1 | Fell in hole flag - set to 1 after falling through hole to room 61 |
### Key Mechanics
- The hidden drawer in the organ only opens when Rosella sits at the organ and plays with the sheet music (item 26)
- The skeleton key (item 20) is in the drawer - awards 2 points when taken
- Playing the organ with sheet music awards 4 points (first time only, tracked by global193)
- Walking into the hole in the floor triggers the fallHole script which leads to room 61 (catacombs)
- The player must be in view 58 (sitting at organ) to properly play the organ
- The organ area is defined by inRect: 129-195, 121-126
- The bench area is defined by inRect: 122-211, 126-137
- Control area $0040 triggers room change to 61 (hole)
- Control area $0004 triggers falling animation
### Inventory Items
- Item 20 = Skeleton Key
- Item 26 = Sheet Music

View File

@@ -0,0 +1,80 @@
# Room 70: Waterfall Cave
This is the scenic area behind the waterfall, accessible by walking through the falls. The room features a dramatic waterfall, cave entrance, steep cliff, and a pool of water. Players can swim in the pool, drink from the water, collect a board, and be swept out by strong currents in specific areas. The room supports both land and swimming forms.
## Look Description
"What's this?! Why, it's a cave behind the waterfall! You see an old board lying by the cave entrance."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look waterfall` / `look falls` | "Waterfalls sure look different when you're underneath them!" |
| TODO | Look | `look cliff` / `look mountain` | "The mountain, above the waterfall, rises steeply to the east." |
| TODO | Look | `look cave` | "It sure is dark in there!" |
| TODO | Look | `look boulder` | "You see rocks all around you." |
| TODO | Look | `look flora` / `look moss` | "You see only moss growing on the rocks." |
| TODO | Look | `look dirt` / `look ground` (board present) | "You see a board lying on the ground." |
| TODO | Look | `look dirt` / `look ground` (no board) | "You see nothing interesting on the ground." |
| TODO | Look | `look under water` / `look under pool` (on land) | "You're not in the water." |
| TODO | Look | `look under water` / `look under pool` (in water) | "You look under the water, and see nothing but...more water." |
| TODO | Look | `look in water` / `look in pool` | "You look into the water, but see nothing of interest." |
| TODO | Look | `look waterfall` | "It's difficult to see much of anything through a waterfall." |
| TODO | Look | `look in pool` / `look in water` | "You peer into the pool of water, but cannot see anything of importance." |
| TODO | Look | `look pool` / `look water` | "You see a deep pool below the waterfall." |
| TODO | Look | `look around` / `look room` | "What's this?! Why, it's a cave behind the waterfall! %s" (conditionally includes board text) |
| TODO | Action | `climb cliff` / `climb mountain` | "The mountain is too steep to climb." |
| TODO | Action | `climb boulder` / `climb rock` | "You don't like to climb rocks." |
| TODO | Get | `get board` (if present, close enough) | Picks up board, +2 score, sets `board_collected = true` |
| TODO | Get | `get board` (if present, too far) | "You can't get that from here." (Print 800 1) |
| TODO | Get | `get board` (not present) | "You already have it." |
| TODO | Action | `drink` / `get drink` (in water, valid terrain) | Triggers drinking animation sequence |
| TODO | Action | `drink` / `get drink` (on land or invalid terrain) | "You have no reason to carry water." |
| TODO | Get | `get water` | "You have no reason to carry water." |
| TODO | Action | `dive` / `bathe[<enter]` (on land) | "Just enter the water." |
| TODO | Action | `dive` / `bathe[<enter]` (in water) | "You're already in the water." |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | swimIn | Entering from Room 24 (swimming entry) | Swimming animation sequence: enters from pool, transforms to swimming view (377→378), plays poof sound, transforms back to normal form at shore, prints "It sure feels good to be yourself again!" |
| TODO | Interaction | boardActions | Using `get board` command | Rosella bends down to pick up board, board is removed from room, added to inventory (item 22), +2 score awarded |
| TODO | Interaction | drinking | Using `drink` command in valid water | Rosella kneels and drinks from pool, displays message, animation completes, returns to walking |
| TODO | Interaction | sweptOut | Player enters specific rectangles (142-166, 110-125 or 49-111, 117-128) | Player is swept away by current: plays swept animation (view 10), transported to Room 24 |
## Technical Notes
- **Room Number**: 70
- **Picture**: 70
- **Exits**: South→71 (via control area $0040), Room 24 (when swept out via `sweptOut` script)
- Entry from Room 24 triggers `swimIn` script for swimming entrance animation
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | `1` | Room initialization flag |
| `global105` | `0`, `3`, `4` | Current terrain type (0=land, 3=shallow water, 4=deep water) |
| `global182` | `0`, `1` | Board collected flag (set to 1 when board is picked up) |
| `global205` | `0`, `1` | Swept out state (set to 1 when player is being swept away) |
| `board_in_room` | `true`, `false` | Whether board item (22) is present in room |
### Terrain Detection
| Control Area | View | Description |
|--------------|------|-------------|
| $0001 | 2 | Land (normal walking) |
| $0800 | 7 | Shallow water (kneeling) |
| $0002 | 8 | Deep water (swimming) |
### Additional Technical Details
- No region scripts applied (no `setRegions` call)
- Board appears in room only when inventory item 22 is owned by room 70
- Player can be swept out in two specific rectangular zones: 142-166 x 110-125 and 49-111 x 117-128
- When entering from Room 24, player starts at position (158, 119) in swimming form
- When entering from land, player starts at position (224, 114)
- View 668 is used for animated waterfall effects (7 animated props with different loops/cels)
- Valid drinking terrain checked via bitmask: $0008 (shallow), $0800 (shallow), $0002 (deep), $0200 (shallow)

107
rooms/57-witch-cave.md Normal file
View File

@@ -0,0 +1,107 @@
# Room 57: Witch Cave (filename: `57-witch-cave.md`)
This room is a dismal cave inhabited by three one-eyed old witches. The room features a central cauldron bubbling over a fire, various jars and bottles on shelves, and a human skull. The witches are a significant puzzle in the game - they possess a glass eye (item 6) that enables them to see, and players can interact with them in multiple ways including stealing or returning the eye, collecting a scarab beetle (item 7), and avoiding being transformed.
## Look Description
"This is a dismal and dreary cave. In the center of the cave, over a hot fire, boils a foul-smelling brew inside a large black cauldron."
When `global109 >= 3`: "Within it, reside three one-eyed old witches."
If scarab is on floor: "You see a black scarab on the cave floor."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `/bottle` | "You don't want them." (Print 57 16) |
| TODO | Look | `/caldron` | "A greenish, foul brew boils ominously within the cauldron." (Print 57 18) |
| TODO | Look | `/brew` | "The green brew looks disgusting...and smells that way, too!" (Print 57 19) |
| TODO | Look | `/fire` | "A hot fire burns under a large cauldron filled with bubbling brew." (Print 57 20) |
| TODO | Look | `<out/cave` | "Outside the cave, you see the terrible grabbing trees." (Print 57 21) |
| TODO | Look | `/dirt` or `<down` | If `global207` (scarab present): "You see a black scarab on the cave floor." (Print 57 22) / Else: "There is nothing of interest on the cave floor." (Print 57 23) |
| TODO | Look | `/wall` | "There is nothing of interest on the rough cave walls." (Print 57 24) |
| TODO | Look | `/shelf` | "You see bottles and jars of disgusting-looking stuff. None of it interests you, though." (Print 57 25) |
| TODO | Look | `/skull` | "You shiver at the sight of a human skull on the shelf." (Print 57 26) |
| TODO | Look | `[<around,in][/room,cave]` or `[/!*]` | Dynamic description combining cave appearance and witch/scarab presence (Print 57 17) |
| TODO | Look | `/eye` | "The blind, one-eyed hags peer at you through a glass eye." (Print 57 3) - Only if eye owned by room 57 |
| TODO | Look | `/hag` | Varies based on whether player has eye, local10 state, or if eye is owned by -1 (Print 57 4/5/6) |
| TODO | Get | `/bottle` | "You don't want any of them." (Print 57 27) |
| TODO | Get | `/skull` | "You don't need it." (Print 57 28) |
| TODO | Get | `/brew` | "You wouldn't want it!" (Print 57 29) |
| TODO | Get | `/caldron` | "It's too heavy to carry." (Print 57 31) |
| TODO | Action | `chew,drink/brew` | "You gag at the thought!" (Print 57 30) |
| TODO | Talk | `converse` | Different responses based on eye ownership: (answer1/answer2/answer3 scripts) |
| TODO | Inventory | `rob,get/charm` | If has scarab: "You already have the scarab." (Print 800 0) / If no scarab and !global207: "What scarab?" (Print 57 7) / If far from scarab: "You can't get that." (Print 800 1) / Else: triggers pickUp script |
| TODO | Inventory | `get,rob/eye` | If doesn't have eye and eye owned by room 57: Must be in rect 119-129 x 122-136 to pick up (+3 score, sets global182) (Print 57 8/9) |
| TODO | Inventory | `deliver,return,fling/eye` | If has eye: various responses based on local10 state, triggers witchMoan script (Print 57 10/11) |
| TODO | Action | `/hag kill` | "You couldn't do it." (Print 57 12) |
| TODO | Action | `/hag get` | "You wouldn't want them." (Print 57 13) |
| TODO | Action | `/hag kiss` | "YUCK!!" (Print 57 14) |
| TODO | Action | `/hag deliver` | "The witches don't want it." (Print 57 15) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | rm57Script | Entry (when `global109 >= 3` and has eye but not scarab) | Throws scarab to player, then pleads for eye return |
| TODO | Interaction | pickUp | Player uses `get charm` with scarab present | Animates picking up scarab (+2 score, sets global207) |
| TODO | Interaction | answer1 | Player talks to witches with eye owned by room | Prints dialogue sequence about witches (Print 57 34-36) |
| TODO | Interaction | answer2 | Player talks to witches with eye in inventory | Random dialogue about witches begging for eye (Print 57 37-40) |
| TODO | Interaction | answer3 | Player talks to witches without eye | Dialogue enticing player closer (Print 57 41-43) |
| TODO | Background | witchEye | Continuous when witches active | Animates witch eyes looking around, switches between witches |
| TODO | Background | witchChase | Player gets close to witches without eye (distance < 30) | Witches chase and transform player into newt/creature |
| TODO | Background | witchMoan | Triggered when eye delivered or after transformation | Witches react to receiving eye, eventually release player |
| TODO | Background | scarabToss | Scarab present in room | Animates scarab moving/jumping |
| TODO | Background | ouchness | Player touches control area $0004 (hot zone) | Prints "Ouch!" (Print 57 0) |
## Technical Notes
- **Room Number**: 57
- **Picture**: 57
- **Style**: $0010 (DISPATCH style)
- **Exits**: South → Room 6
- **Music**: Sound 12 (witchMusic) - plays during witch encounter
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global109` | 0-3+ | Game progress - witches appear when >= 3 |
| `global182` | 0, 1 | Glass eye collected flag (score awarded) |
| `global207` | 0, 1 | Scarab present in room (collected or not) |
| `global189` | 0, 1 | Room initialization flag |
| `global101` | 1 | Set to 1 in init |
| `global228` | string | Format buffer for room description |
| `local10` | 0, 1 | Eye delivered state (0 = not delivered, 1 = delivered) |
| `local12` | 0, 1 | Transformation/cutscene active flag |
| `local13` | 0, 1 | Ouch sound cooldown flag |
| `newAct` | instance | Scarab actor instance |
| `newAct_2` | instance | Witch actor instance |
| `newProp_4` | instance | Witch eye prop (visible when witch looking) |
| `newProp_5` | instance | Left witch prop |
| `newProp_6` | instance | Right witch prop |
| `newProp_7` | instance | Left witch full prop |
| `newProp_8` | instance | Right witch full prop |
### Inventory Items Referenced
| Item Index | Item Name |
|------------|-----------|
| 6 | Glass Eye (charm) |
| 7 | Black Scarab |
### Synonyms
- `dirt` = `dirt`
- `hag` = `fishwife`
### Key Mechanics
1. **Witch Transformation**: When approaching the witches without the glass eye, they chase and transform the player into a creature (view 184 or 186 depending on position). This is triggered when `distanceTo(newAct_2) < 30` and player doesn't have item 6.
2. **Glass Eye Puzzle**: The eye can be stolen from the witches (requires standing in specific rect), returned to them, or flung. Returning the eye unlocks the scarab throw and allows further interaction.
3. **Scarab Collection**: After returning the eye, witches throw a scarab to the player. The scarab can then be picked up for +2 score.
4. **Hot Zone**: The area over the fire (control area $0004) causes "Ouch!" message when touched.

98
rooms/kq4-002-meadow.md Normal file
View File

@@ -0,0 +1,98 @@
# Room 2: Meadow (with Satyr/Pan)
Room 2 is a transitionary meadow area connecting the beach (Room 1) to the forest interior (Room 3). The room features a beautiful wildflower-filled meadow with views of a river to the north. The room serves as an introduction area where the player may encounter Pan, a friendly satyr who wanders the meadow playing his flute. Pan appears randomly based on game state and can be interacted with if the player possesses the lute.
## Look Description
"You are surrounded by beautiful wildflowers in this luscious green meadowland."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look room` | "You are surrounded by beautiful wildflowers in this luscious green meadowland." (Print 2 0) |
| TODO | Look | `look brook` / `look river` | "You see a river in the distance to the north." (Print 2 1) |
### Region Interactions (MeadReg - Script 506)
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look bush` | "Small, low bushes dot the pretty meadow. Wildflowers grow among them." (Print 506 0) |
| TODO | Look | `look boulder` / `look rock` | "Scattered rocks lie among the wildflowers of the meadow." (Print 506 1) |
| TODO | Look | `look down` / `look dirt,down` | "You look at the ground and see nothing but green grass and wildflowers." (Print 506 2) |
| TODO | Look | `look grass` | "Green grass carpets this lovely meadowland." (Print 506 3) |
| TODO | Look | `look flora` / `look flower` / `look blossom` | "Colorful wildflowers grow among the small rocks and bushes of the meadowland." (Print 506 4) |
| TODO | Look | `look forest` | "You see very few trees." (Print 506 5) |
| TODO | Action | `climb forest` / `climb tree` | "It is difficult to climb trees while wearing that dress!" (Print 506 6) |
| TODO | Action | `climb boulder` / `climb rock` | "You don't like to climb rocks." (Print 506 7) |
| TODO | Get | `get flora` / `get flower` / `get blossom` | "It would waste your precious time to stop and pick flowers." (Print 506 8) |
### Region Interactions (regPan - Script 514)
Pan the satyr appears conditionally (40% chance when player owns the flute - item 0). He wanders the meadow playing his flute.
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Action | `play lute` (with lute, when Pan is view 157) | Triggers playLute script - Pan dances to lute |
| TODO | Action | `play lute` (with lute, when Pan not present) | "You've already attracted Pan's attention." (Print 514 0) |
| TODO | Action | `play flute` | Plays flute if player has item 0 (flute), otherwise need item message |
| TODO | Action | `hum` | "You hum along with Pan, but he doesn't pay any attention." (Print 514 2) |
| TODO | Action | `kill pan` / `kill satyr` | "You are NOT a murderous girl, Rosella!" (Print 514 3) |
| TODO | Action | `play with pan` | "You'd like to...but how do you play with a satyr?" (Print 514 4) |
| TODO | Action | `dance` | "You couldn't keep up with him, Rosella." (Print 514 5) |
| TODO | Get | `get pan` / `get satyr` | "You can't get a satyr!" (Print 514 6) |
| TODO | Action | `capture pan` | "You can't catch a satyr!" (Print 514 7) |
| TODO | Inventory | `deliver lute` / `give lute` (when Pan is wild - view 157, lute nearby) | Pan accepts lute, gives flute, +3 score, Pan becomes tame (view 158) (Print 514 8) |
| TODO | Inventory | `deliver lute` (when Pan already tamed) | "He isn't paying any attention to you." (Print 514 9) |
| TODO | Inventory | `deliver [item]` (other items) | "Pan would not be interested in it." (Print 514 10) |
| TODO | Inventory | `deliver [item not owned]` | "You can't give that." (Print 514 11) |
| TODO | Talk | `kiss` / `kiss pan` | "He's too strange to kiss." (Print 514 12) |
| TODO | Look | `look pan` / `look satyr` (when view 157 - wild) | "You see a lively creature who is, at the same time, both man and goat. He is a satyr, and his name is Pan. He seems to be greatly enjoying his flute music." (Print 514 13) |
| TODO | Talk | `talk pan` / `converse pan` (when view 157 - wild) | "You attempt to speak to Pan, but he pays you no mind; he's too wrapped up in his flute music." (Print 514 14) |
| TODO | Get | `get flute` / `rob flute` (when view 157 - wild) | "You can't. Pan won't give it to you." (Print 514 15) |
| TODO | Action | `rob flute` (when view 157 - wild) | "It's not nice to steal." (Print 514 16) |
| TODO | Get | `get lute` / `rob lute` (when view 158 - tamed) | "You gave it to Pan. It belongs to him." (Print 514 17) |
| TODO | Look | `look pan` (when view 158 - tamed) | "Pan seems to be quite happy with his new lute. As he plays it, he dances and frolics to the music." (Print 514 18) |
| TODO | Talk | `talk pan` / `converse pan` (when view 158 - tamed) | "You try to speak to Pan, but he pays no attention to you; he's too involved with his lute music." (Print 514 19) |
| TODO | Talk | `talk pan` (when view 150 - dancing with player) | "You speak to Pan, but he doesn't respond; he only stares at you expectantly." (Print 514 20) |
| TODO | Look | `look pan` (when view 150 - dancing) | "Pan has ceased his dancing and now looks at you, and the lute, curiously." (Print 514 21) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | panActions | Continuous when Pan (gNewAct_5) is present | Script controls Pan's wandering behavior, makes him ignore cage after 25 seconds |
| TODO | Background | Panther/Satyr AI | Continuous when Pan is present | Positions sound bubble prop (view 888) near Pan, removes Pan if he leaves screen bounds |
| TODO | Interaction | playLute | Player types `play lute` with lute in inventory, Pan is wild (view 157) | Triggers sequence where player plays lute, Pan changes to dancing view (150), follows player, eventually accepts lute |
## Technical Notes
- **Room Number**: 2
- **Picture**: 2 (overlay 102 if `global100` is set)
- **Region**: Meadow (via MeadReg 506), Panther/Satyr area (via regPan 514)
- **Regions Applied**: 506 (MeadReg), 514 (regPan)
- **Exits**: North→26, South→8, East→3, West→1 (Beach)
- **Horizon**: 68
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | `0`, `non-zero` | If set, overlays picture 102 (alternate weather) |
| `global101` | `0` | Room visited flag (initialized to 0) |
| `global160`, `global159` | Coordinates | Current position of Pan (saved when leaving room) |
| `global211`, `global212` | Coordinates | Previous position of Pan (restored when re-entering) |
| `local0` (regPan) | `157`, `158` | Pan's view: 157=wild flute-playing, 158=tamed lute-playing |
| `local2` (regPan) | `0`, `1` | Whether Pan has been given the lute (tamed) |
### Additional Technical Details
- Room uses Region 506 (MeadReg) for meadow interactions
- Room uses Region 514 (regPan) for Pan the satyr encounters
- Synonyms defined in MeadReg: `flora` = `flora` = `blossom`
- Synonyms defined in regPan: `pan` = `pan` = `man` = `person` = `animal`
- Pan appears with 40% probability when player has the flute (item 0)
- Pan uses views 157 (wild), 158 (tamed), and 150 (dancing with player)
- When player gives lute to Pan, Pan gives flute in return, +3 score points
- Panther region initializes with lute music (sound 54) when tamed
- Sound bubble prop (view 888) follows Pan during interactions

View File

@@ -0,0 +1,88 @@
# Room 3: Fountain Pool
## High-Level Summary
Room 3 is an outdoor forest clearing featuring a beautiful marble-lined pool with columns. The room serves as a transitional area connecting to rooms 2 (west), 4 (east), 9 (south), and 27 (north). The primary interactive elements include the pool itself (which can be entered for swimming/drinking), marble columns, and steps. Most notably, Cupid randomly appears in this room carrying a golden bow and arrows, which can be obtained through interaction. The room uses region 507 and features a script that handles player falling into the water based on control areas.
## Look Description
"The beautiful pool, with its elegant marble columns, has a wonderful setting in these woods. The water looks so cool and inviting; you're almost tempted to jump in."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look/room`, `look/around`, `look[<around][/!*]` | "The beautiful pool, with its elegant marble columns, has a wonderful setting in these woods. The water looks so cool and inviting; you're almost tempted to jump in." (Print 3 3) or "The beautiful pool, with its elegant marble columns, has a wonderful setting in these woods." (Print 3 4) - varies by player view |
| TODO | Look | `look/pool`, `look/water` | "The beautiful pool is lined with tall marble columns. Its crystal clear water looks very inviting." (Print 3 1) or "The beautiful pool is lined with tall marble columns." (Print 3 2) - varies by player view |
| TODO | Look | `look<under,in/water` | "You see nothing of interest in the water." (Print 3 0) |
| TODO | Look | `look/column` | "The marble columns flank the lovely pool." (Print 3 6) |
| TODO | Look | `look/stair` | "There are steps at the north end of the pool." (Print 3 10) |
| TODO | Look | `look/dirt` | "You see a little golden bow, and two golden arrows, on the ground by the pool." (Print 3 20) if Cupid has arrows, otherwise "You see nothing of importance on the ground." (Print 3 21) |
| TODO | Look | `look/cupid` | Various responses based on Cupid's state (local1): 0="Baby Cupid beats his little wings furiously as he flies through the air. In his chubby hands, he carries a golden bow, and two golden arrows." (Print 3 22), 4="Cupid happily splashes and frolics in the clear water of the pool." (Print 3 23), 1/2="Baby Cupid beats his little wings furiously as he flies through the air." (Print 3 24), 3="Oh, oh! You've startled Cupid! He quickly jumps out of the pool and flies away in fear." (Print 3 25), 5="Cupid appears to be getting ready to go swimming." (Print 3 26) |
| TODO | Action | `enter/bathe`, `bathe,dive` | "Just enter the water." (Print 3 8) or "The water is too shallow to swim." (Print 3 9) - varies by player view |
| TODO | Action | `hop,dive/pool,water` | "Just do that yourself." (Print 3 12) |
| TODO | Action | `exit,(climb,get<out)` | "You're not in the pool." (Print 3 11) or "There are steps at the north end of the pool." (Print 3 10) - varies by player view |
| TODO | Action | `drink`, `get/drink` | "You drink some of the pool water, it quenches your thirst." (Print 3 13) or default message (Print 800 1) - only when in normal form (view 2) |
| TODO | Get | `get/water` | "You have no reason to carry water." (Print 3 7) |
| TODO | Get | `get/arrow,arrow` | Various responses based on Cupid's state and proximity - can obtain bow and arrows from Cupid |
| TODO | Get | `rob/arrow` | "You were taught never to steal!" (Print 3 19) |
| TODO | Get | `get/cupid` | "You couldn't get Cupid." (Print 3 29) |
| TODO | Talk | `talk/cupid`, `converse` | Various responses based on Cupid's state and proximity |
| TODO | Talk | `play/cupid` | "You might frighten Cupid if you come too close." (Print 3 28) |
| TODO | Talk | `kiss` | "You can't get close enough to do that." (Print 3 30) |
| TODO | Inventory | `deliver` (give item to Cupid) | "Cupid would not be interested in anything of yours." (Print 3 34) |
| TODO | Action | `fish<enter`, `capture/fish`, `cast/pole` | "You don't see any fish here." (Print 3 5) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | `fall` | When player walks into water control area ($0004) while in normal form (view 2) | Triggers falling animation into the pool. Changes player view to 17 (falling), plays fallSound (51), then transitions to swimming view (19). Resets after 2 seconds and returns to normal walking. |
| TODO | Background | `doCupid` | When player has bow/arrows (item 14 owned by room 202) and random chance (33%) on room entry | Manages Cupid's appearance and behavior. Cupid enters from left, may shoot arrows, wanders near pool, can be startled by player proximity causing him to flee. Handles giving bow/arrows to player. |
| TODO | Interaction | `egoActions` | Player triggers get arrow action or drinks from pool | State 1: Handles player obtaining bow/arrows from Cupid. State 10-13: Handles player drinking from pool animation and text display. |
## Technical Notes
- **Room Number**: 3
- **Picture**: 3
- **Region**: 507
- **Exits**: North→27, South→9, East→4, West→2
- **Music**: 9 (theme sound)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `local1` (cupid_state) | 0, 1, 2, 3, 4, 5 | Cupid's current behavior state: 0=arriving, 1=fleeing away from pool, 2=fleeing toward pool, 3=shooting/fleeing from water, 4=wandering in pool, 5=leaving |
| `local3` (falling) | 0, 1 | Whether player is currently falling into water |
| `local4` (drank_water) | 0, 1 | Whether player has drunk from the pool in current session |
| `local5` | Timer | Timer for fall animation sequence |
| `local6` | Timer | Timer for Cupid wandering behavior |
| `global100` | 0, 1 | Overlay state (triggers room overlay 103 if true) |
| `global101` | 0 | Initialized to 0, purpose unclear |
| `global182` | 0, 1 | Flag set after obtaining arrows |
### Synonyms
- `cupid` = cupid, man, animal, boy, baby
- `kiss` = kiss, embrace
### Inventory Items
- Item 14: Golden bow and arrows (owned by player after obtaining from Cupid)
### Control Areas
- $0004: Water area (triggers fall script when entering in normal form)
- $0008: Shallow water (changes player view to 7)
- $0010: Special terrain/feature near water
- $0200: Another terrain type (changes player view to 6)
- $0800: Another terrain type (changes player view to 5)
### Entry Points
- From room 2 (west): Player enters at x=1, positioned based on horizon
- From room 4 (east): Player enters at x=318, positioned based on horizon
- From room 9 (south): Player enters at y=187
- From room 27 (north): Player enters at x position preserved, y near horizon+2
- New game: Player starts at x=98, y=176

View File

@@ -0,0 +1,82 @@
# Room 04: Ogre's Cottage
This is the exterior of a large, thatched-roof cottage in the forest. The cottage belongs to the ogre and ogress, dangerous antagonists that may appear and chase the player. The room features a door that leads inside (Room 49), windows, and various interactive objects. Players must be cautious as either the ogress or ogre can appear and capture them if caught.
## Look Description
"You see a large, thatched-roof house surrounded by forest; and it looks very formidable. It might be wise to use caution here."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look cottage` / `look house` | "This is a large, crudely-built, thatched-roof house. It makes you feel uneasy." (Print 4 1) |
| TODO | Look | `look door` | "This is a heavy, wooden door." (Print 4 2) |
| TODO | Look | `look bucket` / `look pail` | "There is nothing in the pail." (Print 4 3) |
| TODO | Look | `look buck` | "Poor thing!" (Print 4 4) - only if ogress is present |
| TODO | Look | `look window` (when near) | "You peek through the window, but can make out no details." (Print 4 5) |
| TODO | Look | `look window` (when far) | "You're not close enough." (Print 800 1) |
| TODO | Look | `look giantess` / `look ogress` (when present) | View 246: "This is a mean-looking lady! The ogress is returning home after having caught a poor deer in the surrounding forest." (Print 4 6) / View 245: "The ogress sees you! Maybe she'd rather have YOU for dinner instead of the deer!" (Print 4 7) |
| TODO | Look | `look giantess` / `look ogress` (not present) | "You can't see one here." (Print 4 8) |
| TODO | Look | `look around` / `look room` | "You see a large, thatched-roof house surrounded by forest; and it looks very formidable. It might be wise to use caution here." (Print 4 9) |
| TODO | Look | `look giant` / `look ogre` | "The ogre looks MEAN!! Better get out of there...FAST!!" (Print 517 0) - only when ogre is present |
| TODO | Talk | `talk giantess` / `talk ogress` / `talk giant` / `talk ogre` | "This is no time for conversation!" (Print 517 1) |
| TODO | Action | `get/capture buck` | Various responses based on presence of ogress or deer |
| TODO | Action | `get/capture giantess` / `get/capture ogress` | "That's ridiculous!" (Print 4 16) |
| TODO | Action | `kill giant` / `kill ogre` | "You have no way of killing a giant ogre!" (Print 517 2) |
| TODO | Action | `get/capture giant` / `get/capture ogre` | "That's ridiculous!" (Print 517 3) |
| TODO | Action | `kiss` | "He wouldn't like it, and neither would you!" (Print 517 4) |
| TODO | Action | `deliver [item]` (when ogre present) | "You don't want to get that close to the ogre!" (Print 517 5) or "You don't have it." (Print 517 6) |
| TODO | Action | `open door` (when near door) | Multiple conditions: if ogre/ogress present "You don't have the time for that now!" (Print 4 17), if key not obtained "You can't. It's locked and you don't have the key." (Print 4 18), if key obtained: opens door |
| TODO | Action | `bang` (on door) | Multiple conditions based on who's present and door state |
| TODO | Action | `unlatch` / `unlock` | "You can't. It's locked and you don't have the key." (Print 4 18) if no key, or "The door is already unlocked." (Print 4 23) if key already used |
| TODO | Action | `break window` | "That's vandalism!" (Print 4 24) |
| TODO | Action | `break door` | "You could never do that." (Print 4 25) |
| TODO | Action | `open window` | "The windows do not open." (Print 4 26) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | ogressActions | Ogress appears (global109 = 2 and global163 = 0) | Ogress walks from left side to door, opens it, enters cottage, and closes door behind her |
| TODO | Interaction | ogressActions | Player talks to ogress or gets too close | Ogress becomes hostile, displays "deer" prop, chases and catches player (game over) |
| TODO | Interaction | ogressActions | Player uses `bang` on door when ogress not present | Ogress appears and enters cottage |
| TODO | Interaction | ogreActions | Ogre appears (random 35% chance on entry if no other actor present) | Ogre walks in from edge, chases player, catches player (game over) |
| TODO | Interaction | ogreActions | Entering from Room 10 with actor | Ogre is already present and chases player |
| TODO | Interaction | killOgre | Timer expires after ogre leaves | Sets global127 = 1 (player death flag) |
| TODO | Background | PriorityCheck | Continuous | Adjusts player and NPC priority based on position in room |
## Technical Notes
- **Room Number**: 4
- **Picture**: 4
- **Region**: 508 (Woods Region), 517 (Ogre's Region)
- **Exits**: North→28, South→10, East→5, West→3, Door→49 (inside cottage)
- **Music**: Ogre theme (sound #5), Ogress theme (sound #10)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global109` | Quest stage value | When equals 2, ogress appears |
| `global163` | `0`, `1` | Ogress has appeared flag |
| `global165` | Value | Ogre attack state (4 = ogre attack triggered) |
| `global179` | `1` | Special flag preventing actor spawn |
| `global189` | `0`, `1` | Room active flag |
| `global127` | `1` | Player death flag |
| `local3` | `0`, `1`, `2`, `3` | Ogress state: 0=not active, 1=watching, 2=hostile, 3=entered cottage |
| `local2` | `0`, `1` | Ogre state flag |
| `newAct` | Actor or `0` | Ogress actor instance |
| `gNewAct` | Actor or `0` | Ogre actor instance |
### Additional Technical Details
- Synonyms defined: `giantess` = `giantess` = `fishwife` (all map to giantess)
- Region synonyms: `giant` = `giant` / `man`, `kiss` = `kiss` = `embrace`
- Door has special states: cel 0 = closed, cel > 0 = open
- Player needs key (item 33) to open door
- Control area $4000 triggers entry to Room 49 when door is open
- Ogress uses view 246 (returning with deer) or 245 (hostile)
- Ogre uses view 250 (walking), 78 (eating), 79 (walking after eating)
- Door controls player movement: when closed, players observe control area 16384
- If global100 is set, overlay picture 104 is displayed

View File

@@ -0,0 +1,81 @@
# Room 5: Forest Grove
This is the exterior of the Dwarf Cottage, a creepy forest grove with ominous trees surrounding a large thatched-roof house. The room features multiple animated trees (views 690, 691) that act as a hazard - walking into certain areas triggers a "grabbed" sequence where the trees catch the player. There are also firefly/sparkle effects (view 689) adding atmosphere. The room connects to the cottage interior (room 11) and leads to other forest areas.
## Look Description
"This is a creepy place! You have found a grove of very odd, (and scary-looking), trees. A thick forest surrounds the grove."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look/room` / `look/around` / `look[<around]` | "This is a creepy place! You have found a grove of very odd, (and scary-looking), trees. A thick forest surrounds the grove." (Print 5 0) |
| TODO | Look | `look/cottage` | "You see the back of a large, thatched-roof house." (Print 5 1) |
| TODO | Look | `look/door` | "The door is at the front of the house." (Print 5 2) |
| TODO | Look | `look/window` (when in rect 0 130 32 138) | "You look through the window, but can make out no details." (Print 5 3) |
| TODO | Look | `look/window` (not close enough) | "You're not close enough." (Print 5 4) |
| TODO | Action | `break/window` | "That's vandalism!" (Print 5 5) |
| TODO | Action | `open/window` | "The windows do not open." (Print 5 6) |
| TODO | Look | `look/boulder` (region 509) | "The rocks are insignificant here." (Print 509 0) |
| TODO | Look | `look/dirt` (region 509) | "You see nothing of importance on the ground." (Print 509 1) |
| TODO | Look | `look/bush` (region 509) | "You don't see many shrubs here." (Print 509 2) |
| TODO | Look | `look/sky` / `look/up` (region 509, daytime) | "Despite this awful forest, the sky is quite nice and blue." (Print 509 3) |
| TODO | Look | `look/sky` / `look/up` (region 509, night) | "It's easy to see by the light of a full moon." (Print 509 4) |
| TODO | Look | `look/grass` (region 509) | "There is little grass here." (Print 509 5) |
| TODO | Look | `look/flora` (region 509) | "All you see are these awful trees!" (Print 509 6) |
| TODO | Look | `look/blossom` (region 509) | "There are not many flowers here." (Print 509 7) |
| TODO | Look | `look/forest` (region 509) | "These are vicious looking trees, aren't they? Best to stay clear of them!" (Print 509 8) |
| TODO | Look | `look/eye` (region 509) | "You'd swear that these trees were LOOKING at you...! But that's impossible." (Print 509 9) |
| TODO | Get | `get/blossom` (region 509) | "There are no flowers here!" (Print 509 10) |
| TODO | Action | `climb/boulder` (region 509) | "You don't like to climb rocks." (Print 509 11) |
| TODO | Action | `climb/forest` (region 509) | "You've GOT to be KIDDING!!" (Print 509 12) |
| TODO | Action | `kill/forest` (region 509) | "That would be impossible for you to do." (Print 509 13) |
| TODO | Action | `break/hit/chop/branch` (region 509, no axe) | "How would you go about doing that?" (Print 509 15) |
| TODO | Action | `break/hit/chop/branch` (region 509, has axe) | Triggers chop script - trees tremble, score +4, trees won't bother further |
| TODO | Action | `conceal/forest` (region 509) | "Go ahead, try it." (Print 509 16) |
| TODO | Talk | `converse` (region 509) | "These trees do not have the capability to talk." (Print 509 17) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | grabbed | Walking into control areas ($0040, $0020, $0010, $0004, $0400, $0200, $0002) when no room script running and global112 is false | Stops walking music, plays grab music, plays tree animation (one of 7 trees based on location), disposes ego, continues tree animation, displays random tree pun death message (1 of 6), waits 5 seconds, sets global127 to 1 |
| TODO | Background | tree1-tree7 | Continuous | Static tree props at various positions with stopUpd (not animated by default) |
| TODO | Background | sparkle1-sparkle2 | Continuous | Firefly/sparkle animations using view 689 with Fwd cycle |
## Technical Notes
- **Room Number**: 5
- **Picture**: 5
- **Region**: 509 (Forest Region)
- **Exits**: North→29, South→11, East→6, West→4
- **Music**: Walking music (sound 64), Grabbed music (sound 65)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | `0` | Set to 0 on init (unknown purpose) |
| `global112` | `0`, `1` | Whether player has chopped down trees with axe |
| `global100` | `0`, `1` | Night time flag - if true, overlay 105 is shown |
| `global127` | `0`, `1` | Set to 1 when grabbed by trees (death/respawn trigger) |
| `local9` | `1-7` | Which tree prop to animate when grabbed |
| `local11` | `1-3` | Cel value for tree animation when grabbed |
### Additional Technical Details
- Synonyms: `branch` = `arm` (region 509)
- Trees use control area bitmasks to detect player position:
- $0040, $0020, $0010 - trigger tree animation cel 3 (local9 = 1-3)
- $0004, $0400, $0200 - trigger tree animation cel 1 (local9 = 4, 5, 7)
- $0002 - trigger tree animation cel 2 (local9 = 6)
- Entry from Room 4 (west): Position at x=1, y=120 or y unchanged if y > 135
- Entry from Room 6 (east): Position at x=318, y=133 or y unchanged if y >= 133
- Entry from Room 11 (south): Position at x=207, y=187 or x unchanged if x <= 207
- Entry from Room 29 (north): Position at x=x, y=horizon+yStep, clamp x to 258 if x > 272
- Entry from new game (0): Start at x=290, y=161
- Trees are static Props with ignoreActors, some at different priorities
- Firefly props use isExtra flag with cycling animations
- The grabbed script ends with global127=1 (likely triggers death/respawn)
- Tree pun death messages: "Wooden you know it!", "out on a limb", "torn limb from limb", "leaf this mortal world", "real sap", "discover your roots"

View File

@@ -0,0 +1,63 @@
# Room 6: Cave Entrance
The player begins in a dark, ominous area surrounded by craggy mountains and vicious-looking trees. A cave bearing a skull-like resemblance juts from the mountainside, with large boulders blocking the northern exit. This room serves as an entrance area connecting to the forest and mountain regions.
## Look Description
"A cave, bearing a slight resemblance to a skull, juts out from the craggy mountainside. Huge rocks block your exit to the north, and you're completely surrounded by those grabby trees! Nice situation, huh?"
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look[<in]/cave,skull` | "You try to peer into the dark cave, but can make out no details." (Print 6 0) |
| TODO | Look | `look/room` `look/around` `look[<around]` | "A cave, bearing a slight resemblance to a skull, juts out from the craggy mountainside. Huge rocks block your exit to the north, and you're completely surrounded by those grabby trees! Nice situation, huh?" (Print 6 1) |
| TODO | Look | `look/cave` `look/skull` | "The rocky skull cave juts out from the base of the steep mountainside. Smoke rises lazily from a large crack in the cave's (forehead?)." (Print 6 2) |
| TODO | Look | `look/grass` | "Even grass doesn't grow here." (Print 6 3) |
| TODO | Look | `look/bush` | "There are not many bushes or shrubs here." (Print 6 4) |
| TODO | Look | `look/flora` `look/plant` | "Not many plants grow here; only those awful trees!" (Print 6 5) |
| TODO | Look | `look/blossom` `look/flower` | "There are no flowers here." (Print 6 6) |
| TODO | Look | `look/forest` `look/tree` | "Those are vicious-looking trees, aren't they?" (Print 6 7) |
| TODO | Look | `look/boulder` `look/rock` | "There are large rocks all around you." (Print 6 8) |
| TODO | Look | `look/sky` `look[<up]` (when `global100 = 0`) | "In spite of these dreary surroundings, the sky is quite nice and blue." (Print 6 9) |
| TODO | Look | `look/sky` `look[<up]` (when `global100 = 1`) | "It's easy to see by the light of a full moon." (Print 6 10) |
| TODO | Get | `get/blossom` `get/flower` | "There are no flowers here." (Print 6 6) |
| TODO | Action | `climb/boulder` `climb/rock` | "The rocks are too large to climb." (Print 6 11) |
| TODO | Action | `look/boulder` `look/rock` | "Large boulders block your way to the north." (Print 6 12) |
| TODO | Look | `look/dirt` `look/ground` | "You see nothing interesting on the ground." (Print 6 13) |
| TODO | Action | `climb/forest` `climb/tree` | "You've GOT to be KIDDING!" (Print 6 14) |
| TODO | Action | `kill/forest` `kill/tree` `cut/forest` | "That would be impossible." (Print 6 15) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | Prop (view 628) | Room initialization | Animated prop with loop 1, cel 0, positioned at x:247 y:34. Cycles forward with speed 2, priority 15. Likely a smoke or atmospheric effect from the cave. |
## Technical Notes
- **Room Number**: 6
- **Picture**: 6
- **Region**: 508 (Forest Region), 511 (Mountain Region)
- **Exits**: west → 5, south → 12
- **Horizon**: 80
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | 0, 1 | Unknown - controls sky description (day/night) |
| `global101` | 0 | Unknown - set to 0 on room init |
| `local0` | varies | Used for onControl check |
| `gNewRoomNumber_2` | 57, 0 | Set when entering cave control area, triggers room change to 57 |
### Special Mechanics
- **Cave Entry**: The `doit` method checks if the player is on control area `$0040`. If true, sets `gNewRoomNumber_2` to 57, which likely transitions to the cave interior.
- **Entry Positions**:
- From west: Position adjusted based on Y coordinate (y >= 160 → x:1 y:160, y <= 84 → x:2 y:84, else x:1)
- From south: Positioned at y:187 with x based on position (x >= 265 → x:265, x <= 100 → x:100, else maintain x)
- From room 57: Loop 1, x:200 y:152
- New game: x:180 y:160
- **Prop Animation**: A prop with view 628 creates an animated effect at the cave entrance.
- **Global100 Overlay**: If global100 is true, room overlay 106 is applied (nighttime variant).

View File

@@ -0,0 +1,110 @@
# Room 7: Fisherman's Shack
This room is the fisherman's shack area on the coastline. It features a weather-beaten cottage with a pier extending out into the ocean. The player can interact with the fisherman NPC, enter the cottage through a door, and walk on various terrain types (shore, pier, water edge). The room includes several animated wave effects and a fisherman who arrives via the pier at specific times.
## Look Description
"A poor fisherman's shanty adorns this part of the coastline. A pier stretches, from the house, out into the ocean to the west. You see a pretty meadowland off to the east."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look/room` `look/around` `look[<around]` | "A poor fisherman's shanty adorns this part of the coastline. A pier stretches, from the house, out into the ocean to the west. You see a pretty meadowland off to the east." (Print 7 10) |
| TODO | Look | `look/anchor` | "An old, rusted anchor leans against the wall of the house." (Print 7 11) |
| TODO | Look | `look/cottage` `look/shack` | "The fisherman's shack looks badly in need of repair, as the sun, wind, and salt spray have taken their toll. From the house, an old pier leads out into the ocean." (Print 7 12) |
| TODO | Look | `look[<under]/dock` `look[<under]/pier` | "There is only ocean under the old pier." (Print 7 13) |
| TODO | Look | `look/door` | "This is a plain wooden door." (Print 7 14) |
| TODO | Look | `look/window` (when in position to see through) | "You peek through the window, but can make out no details." (Print 7 15) |
| TODO | Look | `look/window` (when not in position) | "(Print 800 1) - Default response |
| TODO | Look | `look/dock` `look/pier` | "The old, worn pier juts out into the ocean from the weather-beaten house." (Print 7 16) |
| TODO | Look | `look/fisherman` (when `global116 = 2`) | "You see a grizzled old fisherman on the pier. Apparently, he isn't having any luck today." (Print 7 17) |
| TODO | Look | `look/fisherman` (when not `global116 = 2`) | "You don't see one here." (Print 7 3) |
| TODO | Look | `look/grass` | "A pretty meadow leads eastward from here." (Print 7 18) |
| TODO | Get | `get/fisherman` (when `global116 = 2`) | "You couldn't get the fisherman." (Print 7 0) |
| TODO | Get | `get/fisherman` (when not `global116 = 2`) | "What fisherman?" (Print 7 1) |
| TODO | Get | `get/pole` (when fisherman present) | "It's his, Rosella!" (Print 7 2) |
| TODO | Get | `get/pole` (when fisherman not present) | "You don't see one here." (Print 7 3) |
| TODO | Get | `rob/pole` (when fisherman present) | "You're not a thief, Rosella!" (Print 7 4) |
| TODO | Get | `rob/pole` (when fisherman not present) | "You don't see one here." (Print 7 3) |
| TODO | Get | `get/anchor` | "It's too heavy for you to move." (Print 7 19) |
| TODO | Action | `kiss` (when `global116 = 2`) | "You think, for a moment, that it might help, but then change your mind." (Print 7 5) |
| TODO | Action | `kiss` (when not `global116 = 2`) | "Who?" (Print 7 6) |
| TODO | Action | `break/window` | "That's vandalism!" (Print 7 20) |
| TODO | Action | `break/door` | "You could never do that." (Print 7 21) |
| TODO | Action | `open/window` | "The windows do not open." (Print 7 22) |
| TODO | Action | `close/door` | "The door is already closed." (Print 7 23) |
| TODO | Action | `unlatch/door` (when `global100 = 0`) | "The door is already unlocked." (Print 7 25) |
| TODO | Action | `unlatch/door` (when `global100 = 1`) | "You can't. It's locked and you don't have the key." (Print 7 26) |
| TODO | Action | `bang/door` (when at door and `global100 = 0`) | "You knock loudly on the shanty door. A woman's voice answers, 'Jest come on in!'" (Print 7 27) |
| TODO | Action | `bang/door` (when at door and `global100 = 1`) | "You knock loudly on the shanty door. From inside, a man's voice calls out, 'D'ya know what TIME it is?! GO AWAY!!'" (Print 7 28) |
| TODO | Action | `bang/door` (when not at door) | "(Print 800 1) - Default response |
| TODO | Action | `open/door` (when door already open) | "Try waiting until it closes." (Print 7 29) |
| TODO | Action | `open/door` (when at door and `global100 = 0`) | Opens door, plays door sound, transitions to room 42 |
| TODO | Action | `open/door` (when at door and `global100 = 1`) | "You can't. It's locked and you don't have the key." (Print 7 26) |
| TODO | Action | `open/door` (when not at door) | "(Print 800 1) - Default response |
| TODO | Talk | `talk/fisherman` `converse/fisherman` (when `global116 = 2`) | "You say a few words to the old fisherman. However, he must have other things on his mind as he seems to ignore you." (Print 7 24) |
| TODO | Talk | `talk/fisherman` (when not `global116 = 2`) | "What fisherman?" (Print 7 1) |
| TODO | Inventory | `deliver` (when `global116 = 2`) | "The fisherman ignores you." (Print 7 7) |
| TODO | Inventory | `deliver` (when not `global116 = 2`) | "To whom?" (Print 7 8) |
| TODO | Action | `help/fisherman` | "How can you do that, Rosella?" (Print 7 9) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | water | Continuous | Detects terrain under player and switches view accordingly: control 1=shore (view 2), 2048=shallow (view 5), 512=more shallow (view 6), 8=more shallow (view 7), 2=water (view 8 - swimming). Sets global105 based on terrain type. |
| TODO | Interaction | fallSouth | Player heading south in waterfall area (control $0010) | Plays fall sound, switches to view 17, animates falling south, then returns to swimming view |
| TODO | Interaction | fallNorth | Player heading north in waterfall area (control $0004) | Plays fall sound, switches to view 17, animates falling north, then returns to swimming view |
| TODO | Interaction | fallRocks | Heading toward rocks in shore area (control $1000, global105=0) | Player trips on rocks, plays fall sound, shows dizzy animation (view 18) for 5 seconds |
| TODO | Interaction | fishWalkHouse | Fisherman NPC arrives (global116=2, time < 40 seconds since last) | Fisherman walks from pier position into cottage. Opens door, enters, closes door. Sets global116 to 3 after entering. |
| TODO | Background | waveActions | Room initialization | Animates three wave props (wave1, wave2, wave3) in sequence - cycles each wave cel then hides it |
| TODO | Background | Prop (view 625) | Room initialization | Animated cloud/sky prop at x:200 y:19 with forward cycling |
## Technical Notes
- **Room Number**: 7
- **Picture**: 7
- **Region**: 503, 504 (setRegions)
- **Exits**: north → 1, south → 13, east → 8, west → 95
- **Horizon**: 86
- **Music**: Sound 80 (dizzy), Sound 51 (fall), Sound 300 (door)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | 0, 1 | Unknown - controls door lock state (0=unlocked, 1=locked) |
| `global101` | 0 | Unknown - set to 0 on room init |
| `global105` | 0, 1, 2, 3, 4 | Terrain type state (0=shore, 1=shallow, 2=more shallow, 3=shallowest, 4=swimming) |
| `global107` | 0, 9 | Water/underwater state - 9 when in waterfall area |
| `global116` | 0, 2, 3 | Fisherman state - 2=present on pier, 3=entered cottage, 0=not present |
| `global160` | varies | Hour from system time (used for fisherman arrival) |
| `global159` | varies | Minute from system time |
| `global158` | varies | Second from system time |
| `global199` | varies | Hour when fisherman last state change |
| `global197` | varies | Minute when fisherman last state change |
| `global198` | varies | Second when fisherman last state change |
| `local0` | varies | Previous onControl state for water script |
| `local1` | varies | Current onControl state for water script |
| `local12` | varies | Time elapsed since fisherman state change (in seconds) |
| `local13` | varies | Fisherman X position based on time elapsed |
### Special Mechanics
- **Terrain-Based View Switching**: The `water` viewer script monitors control areas under the player and switches the ego view to match terrain (shore, shallow water, swimming).
- **Waterfall Areas**: Control areas $0010 (south waterfall) and $0004 (north waterfall) trigger falling animations when global107=9.
- **Rock Tripping**: Control area $1000 (rocks) triggers the fallRocks script when player is in shore mode (global105=0).
- **Fisherman NPC**: Appears based on system time. If time since last appearance < 40 seconds, fisherman walks from pier into cottage. Arrival position depends on elapsed time (40s→x:40, 12-20s→x:120, >20s→x:166).
- **Door Interaction**: Can only open door when in position (rect 204-233, 129-148) and when global100=0 (unlocked). Opening door transitions to room 42.
- **Entry Positions**: Various positioning based on previous room and global105 (terrain state).
- **Window Peeking**: Can only look through window when in specific position rects near the cottage.
- **Synonyms**: fisherman = man (for NPC reference)
### Props
- **wave1, wave2, wave3**: Animated ocean waves at different positions
- **newProp, newProp_2, newProp_3**: Additional animated water effects
- **newProp_4**: Animated sky/cloud element
- **door**: Cottage door with open/close animation
- **fisherCage**: Collision detection area for fisherman NPC

View File

@@ -0,0 +1,53 @@
# Room 8: Back of Fisherman's Shack
This room is located behind the fisherman's shack (room 7). It is a peaceful meadow area with wildflowers. The player can view the back of the cottage, interact with windows (look through, try to open or break), and access other areas (north to room 2, south to room 14, east to room 9, west to room 7).
## Look Description
"A beautiful green meadow, dotted with wildflowers, serves as the fisherman's spacious back yard. The flowers' sweet scent fills the air." (Print 8 5)
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look[<around]/room` `look[<around]` | "A beautiful green meadow, dotted with wildflowers, serves as the fisherman's spacious back yard. The flowers' sweet scent fills the air." (Print 8 5) |
| TODO | Look | `look/cottage` | "You see the back of an old shack." (Print 8 4) |
| TODO | Look | `look/door` | "You can't see the door from here." (Print 8 0) |
| TODO | Look | `look/window` (when in position to see through) | "You peek through the window, but can make out no details." (Print 8 3) |
| TODO | Look | `look/window` (when not in position) | "You're not close enough." (Print 800 1) |
| TODO | Action | `open/window` | "The windows do not open." (Print 8 1) |
| TODO | Action | `break/window` | "That's vandalism!" (Print 8 2) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | Region 506 | Continuous | Unknown region interaction - additional interactions may be defined in region script |
| TODO | Background | Region 514 | Continuous | Unknown region interaction - additional interactions may be defined in region script |
## Technical Notes
- **Room Number**: 8
- **Picture**: 8
- **Region**: 506, 514 (setRegions)
- **Exits**: north → 2, south → 14, east → 9, west → 7
- **Horizon**: 68
- **Overlay**: 108 (applied when global100 = 1)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | 0 | Unknown - set to 0 on room init |
| `global100` | 0, 1 | Door lock state from previous room - controls overlay 108 |
| `global160` | varies | Hour from system time (used in newRoom for actor position transfer) |
| `global159` | varies | Minute from system time |
| `global211` | varies | Transferred to global160 when leaving room |
| `global212` | varies | Transferred to global159 when leaving room |
### Special Mechanics
- **Window Interaction**: Can only look through window when in position (rect 10-57, 134-140).
- **Door Visibility**: Door is not visible from this side of the cottage.
- **Overlay System**: Room uses overlay 108 when global100 = 1 (likely indicating the door is locked).
- **Actor Transfer**: When leaving room (if gNewAct_5 exists in cast), global160 and global159 are transferred to global211 and global212 for use in the destination room.

View File

@@ -0,0 +1,48 @@
# Room 9: Shady Wooded Area
A transitional room in the wooded region, featuring a clearing with a large boulder, scattered flowers, and a distant pool to the north. Random birds may be visible in the trees depending on player state.
## Look Description
"You have entered a shady wooded area, with birds calling from the many trees. You notice a pool in the distance to the north." (Print 9 4)
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look/look around/look [at][/room]` | "You have entered a shady wooded area, with birds calling from the many trees. You notice a pool in the distance to the north." (Print 9 4) |
| TODO | Look | `look/pool/water` | "It's too far in the distance to see it clearly." (Print 9 1) |
| TODO | Look | `look/boulder/rock` | "A large rock dominates the clearing." (Print 9 2) |
| TODO | Look | `look/blossom/flower/flowers` | "There are flowers here and there." (Print 9 3) |
| TODO | Action | `climb/boulder/climb/rock` | "It's too difficult to climb while wearing that dress." (Print 9 0) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | `bird1Actions` | Random 50% chance on room entry (when `is_fairy_form = false`) | Creates animated bird prop at position (283, 17) with view 342, loop 5. Cycles forward, waits 1-12 seconds, returns to cel 0, waits 1-8 seconds, repeats. |
| TODO | Background | `bird2Actions` | Random 50% chance on room entry (when `is_fairy_form = false`) | Creates animated bird prop at position (58, 30) with view 342, loop 4. Cycles forward, waits 1-12 seconds, returns to cel 0, waits 1-8 seconds, repeats. |
## Technical Notes
- **Room Number**: 9
- **Picture**: 9
- **Region**: 507, 514 (region scripts not found)
- **Exits**: North→3, South→15, East→10, West→8
- **Music**: Not specified
- **Horizon**: 75
- **Synonyms**: `water` = `pool`
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | `0` | Room state flag (set to 0 in this room) |
| `global100` (is_fairy_form) | `0` (false), `1` (true) | Player is in fairy form. When true, overlay 109 is shown and birds do not appear. |
### Entry Conditions
- Player y-position constrained to below horizon+1 (y > 76)
- Player x-position constrained to minimum 93
- Overlay 109 applied when `global100 = 1` (fairy form)
- Two bird props spawn with 50% probability each when `global100 = 0`

View File

@@ -0,0 +1,77 @@
# Room 10: Forest Path
This is a forest path room in King's Quest IV connecting multiple areas of the game world. The room features a dense pine forest surrounding the player, with a cottage visible in the distance to the north. An ogre may randomly appear and chase the player, representing a dangerous encounter. Birds fly in the sky overhead. The room serves as a transit hub connecting the eastern and western regions of the game map.
## Look Description
"A thick forest of pine trees surrounds you. You see a house in the distance to the north."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look cottage` | "It's too far in the distance to see it clearly." |
| TODO | Look | `look around` / `look room` | "A thick forest of pine trees surrounds you. You see a house in the distance to the north." |
| TODO | Look | `look /boulder` | "There are rocks here and there." (from Region 508) |
| TODO | Look | `look /dirt` / `look down` | "You see nothing of importance on the ground." (from Region 508) |
| TODO | Look | `look /grass` | "Pine needles, among the grass, crunch beneath your feet as you walk through the forest." (from Region 508) |
| TODO | Look | `look /bush` | "You don't see many shrubs here." (from Region 508) |
| TODO | Look | `look /flora` | "Mostly, you see pine trees." (from Region 508) |
| TODO | Look | `look /blossom` | "You don't notice many flowers here." (from Region 508) |
| TODO | Look | `look /forest` | "A forest of pine trees encircles you." (from Region 508) |
| TODO | Look | `look /crow` / `look /bird` | If raven present: "The raven doesn't look to be a friendly bird at all!" / If not: "You see small birds here and there." (from Region 508) |
| TODO | Action | `climb /boulder` | "You don't like to climb rocks." (from Region 508) |
| TODO | Get | `get /blossom` | "There aren't many flowers to pick!" (from Region 508) |
| TODO | Action | `climb /forest` | "It is difficult to climb trees while wearing that dress!" (from Region 508) |
| TODO | Talk | `converse /crow` | If raven present: "Caw, caw!" / If not: "Cheep, cheep!" (from Region 508) |
| TODO | Action | `get/capture /crow` / `get/capture /bird` | If raven present: "You wouldn't want it even if you COULD get it!" / If not: "Cheep, cheep!" (from Region 508) |
| TODO | Action | `kiss /crow` / `kiss /bird` | If raven present: "Not this bird!" / If not: "Cheep, cheep!" (from Region 508) |
| TODO | Look | `look /giant` (when ogre present) | "The ogre looks MEAN!! Better get out of there...FAST!!" (from Region 517) |
| TODO | Talk | `converse` (when ogre present) | "This is no time for conversation!" (from Region 517) |
| TODO | Action | `kill /giant` (when ogre present) | "You have no way of killing a giant ogre!" (from Region 517) |
| TODO | Action | `get/capture /giant` (when ogre present) | "That's ridiculous!" (from Region 517) |
| TODO | Action | `kiss` (when ogre present) | "He wouldn't like it, and neither would you!" (from Region 517) |
| TODO | Inventory | `deliver [item]` (when ogre present and item owned) | "You don't want to get that close to the ogre!" (from Region 517) |
| TODO | Inventory | `deliver [item]` (when ogre present and item not owned) | "You don't have it." (from Region 517) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | ogreActions | Random chance on room entry OR entering from room 4 without item 33 | Creates ogre actor that chases player; plays ogre theme music; ogre catches player and displays death message; sets game over state |
| TODO | Background | bird1Actions | Random chance (50%) on room entry when global100 is false | Creates animated bird in sky (view 342, loop 5), cycles between animation frames with random delays |
| TODO | Background | bird2Actions | Random chance (50%) on room entry when global100 is false | Creates second animated bird in sky (view 342, loop 4), cycles between animation frames with random delays |
| TODO | Background | ravenActions (from Region 508) | Random chance (20%) on room init | Creates raven actor that flies across screen, disposes after reaching destination |
## Technical Notes
- **Room Number**: 10
- **Picture**: 10
- **Region**: 508 (Forest Region), 517 (Ogre's Region)
- **Exits**: North→4, South→16, East→11, West→9
- **Music**: Ogre theme (sound #5, looping when ogre present)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | `0` | Set to 0 on room init |
| `global189` | `0`, `1` | Ogre encounter state flag (set to 1 during chase) |
| `global165` | `4`, `5` | Ogre state tracking - 4 triggers new encounter, 5 prevents immediate re-encounter |
| `global100` | `true`, `false` | Whether overlay picture 110 is active (birds suppressed when true) |
| `local2` | `0`, `1` | Ogre encounter initialized flag |
| `ogre_present` | `true`, `false` | Whether gNewAct (ogre) exists in the cast |
### Additional Technical Details
- Synonyms defined in Ogre's Region: `kiss` = `embrace`, `giant` = `giant` = `giant` = `giant` = `man` = `giant`
- Entry from room 16 (south) positions player at y=187 with x constrained to minimum 63
- Entry from room 4 (north) positions player at horizon+2 (y=74) with x constrained to minimum 200
- Ogre uses view 250 for walking, view 78 for catching animation, view 79 for departing
- Ogre has custom movement: xStep 6, yStep 2 with Walk cycle and Avoid for pathfinding
- Random ogre spawn: 40% chance if not arriving from room 4 and no current ogre
- Guaranteed ogre spawn: 100% when arriving from room 4 without item 33
- Birds only spawn when global100 is false (overlay not active)
- Bird 1 uses view 342 loop 5, Bird 2 uses view 342 loop 4
- Room clears timers with dispose: 84 on exit
- When ogre catches player: ego is hidden, ogre plays catch animation, plays scream sound (#6), game over triggered (global127 = 1)

View File

@@ -0,0 +1,99 @@
# Room 11: Enchanted Grove
This is a dangerous forest grove in King's Quest IV where sentient trees lurk, ready to grab unwary travelers. The room features multiple animated trees (views 692 and 693) positioned throughout the grove that can capture Rosella when she wanders too close to their reaching branches. The room serves as a hazard area with tree-grabbing traps triggered by walking on specific control areas. It connects to other forest areas in multiple directions.
## Look Description
"This place gives you the willies! The trees around here are very strange; almost human-like. A dense forest surrounds this odd grove of trees."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look around` / `look room` / `look[<around]` | "This place gives you the willies! The trees around here are very strange; almost human-like. A dense forest surrounds this odd grove of trees." (Print 11 0) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | grabbed | Player touches control areas (bitmasks $0002, $0004, $0008, $0010, $0020, $0040, $0200, $0400, $0800, $1000, $2000) anywhere in the room | Stops walking music, plays caught music, animates a tree grabbing the ego (using newProp 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 1-11) are static props with cycleSpeed=1 but stopUpd called, except animated elements (newProp_2 through newProp_6) have setCycle:Fwd for continuous animation |
## Technical Notes
- **Room Number**: 11
- **Picture**: 11
- **Region**: 509 (Forest Region - referenced but region script not found)
- **Exits**: North→5, South→17, East→12, West→10
- **Music**: Walking music (sound 64), Caught music (sound 65)
### Objects
| Object | View | Loop | Description |
|--------|------|------|-------------|
| newProp 1 | 692 | 0 | Tree at position 145,76 |
| newProp 2 | 692 | 1 | Tree at position 152,83 |
| newProp 3 | 692 | 2 | Tree at position 167,83 |
| newProp 4 | 692 | 3 | Tree at position 196,70 |
| newProp 5 | 692 | 4 | Tree at position 213,66 |
| newProp 6 | 692 | 5 | Tree at position 258,76 |
| newProp 7 | 692 | 6 | Tree at position 305,70 |
| newProp 8 | 693 | 0 | Element at position 81,105 |
| newProp 9 | 693 | 1 | Element at position 242,86 |
| newProp 10 | 693 | 2 | Element at position 256,85 |
| newProp 11 | 694 | 0 | Element at position 281,65 |
| newProp_2 | 689 | 2 | Animated element (cel 2) at 105,62 - extra animation |
| newProp_3 | 689 | 3 | Animated element (cel 3) at 160,83 - extra animation |
| newProp_4 | 689 | 4 | Animated element (cel 2) at 249,83 - extra animation |
| newProp_5 | 689 | 5 | Animated element (cel 3) at 280,52 - extra animation |
| newProp_6 | 689 | 6 | Animated element (cel 0) at 314,48 - extra animation |
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | `0` | Set to 0 on room init |
| `global100` | `true`, `false` | When true, overlay picture 111 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) |
| `local12` | `1-11` | Tracks which tree prop grabbed the player |
| `local13` | `1-3` | Animation cel parameter for grabbing animation |
### Control Areas
The room uses multiple control areas (bitmasks) to detect when player touches different tree zones:
| Bitmask | local12 | local13 | Tree Triggered |
|---------|---------|---------|----------------|
| $0002 | 8 | 3 | newProp 8 grabbing |
| $0004 | 1 | 1 | newProp 1 grabbing |
| $0008 | 2 | 2 | newProp 2 grabbing + another grab |
| $0010 | 3 | 1 | newProp 3 grabbing |
| $0020 | 4 | 1 | newProp 4 grabbing |
| $0040 | 5 | 1 | newProp 5 grabbing |
| $0200 | 9 | 1 | newProp 9 grabbing |
| $2000 | 6 | 2 | newProp 6 grabbing |
| $0400 | 10 | 2 | newProp 10 grabbing |
| $1000 | 11 | 3 | newProp 11 grabbing |
| $0800 | 7 | 2 | newProp 7 grabbing |
### Death Messages
When caught, one of these messages displays (Print 11 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 10): Player positioned at x=1, y=max(horizon+2, egoY)
- Entry from east (room 12): Player positioned at x=318, y=egoY
- Entry from south (room 17): Player y=188, x clamped between 103-277
- Entry from north (room 5): Player positioned at x=148, y=horizon+2
- Block defined at left=212, top=103, right=224, bottom=106 that ego observes
- Walking music (64) plays on room entry
- Caught music (65) pre-loaded for grab sequence
- Overlay 111 shown if global100 is true

View File

@@ -0,0 +1,101 @@
# 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

57
rooms/kq4-013-beach.md Normal file
View File

@@ -0,0 +1,57 @@
# Room 13: Beach
This is a coastal beach area featuring a sandy shoreline, an ocean with animated waves, and a pier/dock. A fisherman NPC may be present on the dock depending on game state. A cottage is visible in the distance. The player can look at various features of the beach, meadow, dock, and cottage, but cannot interact with most objects. The room connects to the village area to the north, the ocean to the south, a meadow to the east, and another coastal area to the west.
## Look Description
"A sparkling, white-sand beach edges a vast blue ocean. Turning to the east, you see a lush flowery meadow."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look around` / `look room` / `look beach` | "A sparkling, white-sand beach edges a vast blue ocean. Turning to the east, you see a lush flowery meadow." (Print 13 5) |
| TODO | Look | `look grass` / `look meadow` | "A green meadowland, dotted with clumps of wildflowers, leads eastward." (Print 13 0) |
| TODO | Look | `look dock` / `look pier` (when fisherman present) | "You see someone sitting on the end of the pier." (Print 13 1) |
| TODO | Look | `look dock` / `look pier` (when no fisherman) | "You see a shabby little house, with a pier, in the distance." (Print 13 2) |
| TODO | Look | `look cottage` / `look house` | "You see a shabby little house, with a pier, in the distance." (Print 13 2) |
| TODO | Look | `look fisherman` / `look man` / `look fishwife` / `look person` (fisherman present) | "You can't make out who it is." (Print 13 3) |
| TODO | Look | `look fisherman` / `look man` (no fisherman) | "You don't see anyone at the moment." (Print 13 4) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | waveActions | Continuous on room load | Animates three wave Props (wave1, wave2, wave3) with cycling cel animations to create ocean wave effect |
| TODO | Background | fisherman (gNewAct_2) | When global116=1 and random check passes | Displays fisherman on dock as Act with view 174, loop 2, observes blocking area minBlock |
## Technical Notes
- **Room Number**: 13
- **Picture**: 13
- **Style**: Standard (no special style flags set)
- **Exits**: North→7, South→19, East→14, West→31
- **Horizon**: 80
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | `0` | Room-specific flag, initialized to 0 |
| `global100` | Various | Controls room overlay (picture 113) |
| `global105` | `0-4` | Entry position state - determines player spawn location based on previous room and sub-state |
| `global116` | `0`, `1` | Time of day / fisherman presence flag - when 1, fisherman appears on dock and cottage is visible |
| `global118` | Random (1-30) | Random delay timer for fisherman appearance, divided by 10 when conditions met |
| `fisherman_present` | `true`, `false` | Whether fisherman NPC (gNewAct_2) is currently in the cast |
### Additional Technical Details
- Room uses regions: 501, 516, 503, 504, 506 (coastal/beach area shared logic)
- Three wave Props (view 665) create animated ocean waves
- Bird/creature Prop (view 625) at position (173, 29) - likely seagull
- Cottage (view 534) appears when global116=1 and global100 is false
- Fisherman uses minBlock (rect: 262,115 to 266,121) as blocking area
- Time tracking: saves global160/global159 to global213/global214 when fisherman is present
- Fisherman appears based on time elapsed (local3 calculation) and random chance when player has item 9
- Entry from Room 14 (east) positions player at far right edge
- Entry from Room 31 (west) positions player at left edge when coming from below horizon

View File

@@ -0,0 +1,95 @@
# Room 14: Green Meadow
Room 14 is a beautiful green meadow connecting multiple areas of the game world. The room features a prominent tree stump in the center and connects to the beach area to the west, the forest to the east, and other meadow areas to the north and south. The meadow contains wildflowers and scattered rocks typical of the meadow region. Most notably, a wandering minstrel may appear in this location when certain conditions are met (when global118 = 2), offering opportunities for interaction and trading items.
## Look Description
"The scent of wildflowers fills the air in the lovely green meadow."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look room` | "The scent of wildflowers fills the air in the lovely green meadow." (Print 14 0) |
| TODO | Look | `look/stump` | "Yes, there's a tree stump in the middle of the meadow." (Print 14 1) |
| TODO | Look | `smell/blossom` | "The scent of wildflowers fills the air in the lovely green meadow." (Print 14 0) |
### Region Interactions (MeadReg - Script 506)
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look/bush` | "Small, low bushes dot the pretty meadow. Wildflowers grow among them." (Print 506 0) |
| TODO | Look | `look/boulder` / `look/rock` | "Scattered rocks lie among the wildflowers of the meadow." (Print 506 1) |
| TODO | Look | `look/down` / `look/dirt,down` | "You look at the ground and see nothing but green grass and wildflowers." (Print 506 2) |
| TODO | Look | `look/grass` | "Green grass carpets this lovely meadowland." (Print 506 3) |
| TODO | Look | `look/flora` / `look/flower` / `look/blossom` | "Colorful wildflowers grow among the small rocks and bushes of the meadowland." (Print 506 4) |
| TODO | Look | `look/forest` | "You see very few trees." (Print 506 5) |
| TODO | Action | `climb/forest` / `climb/tree` | "It is difficult to climb trees while wearing that dress!" (Print 506 6) |
| TODO | Action | `climb/boulder` / `climb/rock` | "You don't like to climb rocks." (Print 506 7) |
| TODO | Get | `get/flora` / `get/flower` / `get/blossom` | "It would waste your precious time to stop and pick flowers." (Print 506 8) |
### Region Interactions (Notes - Script 516)
These interactions apply when the minstrel (gNewAct_2) is present in the room (when global118 = 2).
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Get | `get/man` | "You couldn't get the minstrel." (Print 516 0) |
| TODO | Action | `kiss` | "That could get you in more trouble than it's worth!" (Print 516 1) |
| TODO | Inventory | `deliver/book` / `give/book` (when not close enough) | "You're not close enough." (Print 516 2) |
| TODO | Inventory | `deliver/book` (with Shakespeare book in inventory, close enough) | "You hand the Shakespeare book to the minstrel. Curiously, he opens it and begins to read aloud; first hesitantly, then with increased forcefulness as he begins to get into it." (Print 516 3) |
| TODO | Inventory | `deliver/[other item]` | "The minstrel looks at your offering with mild interest, but politely declines." (Print 516 5) |
| TODO | Action | `rob/lute` / `steal/lute` | "You are not a thief, Rosella!" (Print 516 6) |
| TODO | Look | `look/man` (when player has lute) | "Well, it looks like our minstrel has turned into a Thespian. He seems much happier now." (Print 516 7) |
| TODO | Look | `look/man` (when minstrel present) | "You see a rather jaunty-looking fellow who appears to be a wandering minstrel. He seems to be a lute player." (Print 516 5) |
| TODO | Look | `look/man` (when minstrel not present) | "Well, it looks like our minstrel has turned into a Thespian. He seems much happier now." (Print 516 7) |
| TODO | Look | `look/man` (when player doesn't have lute) | "You see a rather jaunty-looking fellow who appears to be a wandering minstrel. He seems to be a lute player." (Print 516 5) |
| TODO | Talk | `converse/man` / `talk/man` (when player has lute) | Triggers minstrel dialogue sequence, plays random song (Print 516 8-12) |
| TODO | Talk | `converse/man` / `talk/man` (when minstrel present but no lute) | "The minstrel seems quite pleased that you appreciate his music so much. He obviously loves the attention as he goes into an out-of-tune version of 'Greensleeves.'" (Print 516 13) |
| TODO | Get | `get/lute` (when player has lute) | "You already have it." (Print 516 17) |
| TODO | Get | `get/lute` (when player doesn't have lute) | "The minstrel is not going to give you his sole means of livelihood!" (Print 516 16) |
| TODO | Action | `hum` | "Your lilting voice contrasts terribly with the bad lute playing of the minstrel." (Print 516 18) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | minstrelActions | Continuous when minstrel (gNewAct_2) is present | Script controls minstrel's animation cycles and behavior; shows notes bubble, handles minstrel leaving after receiving book |
| TODO | Interaction | Minstrel trade | Player gives Shakespeare book to minstrel (state 10) | Minstrel reads book, transforms into actor (view 173), gives lute to player, leaves room (state 11), awards 3 score points |
## Technical Notes
- **Room Number**: 14
- **Picture**: 14 (overlay 114 if `global100` is set)
- **Region**: Meadow (via MeadReg 506), Minstrel encounters (via Notes 516)
- **Regions Applied**: 506 (MeadReg), 516 (Notes)
- **Exits**: North→8, South→20, East→15, West→13
- **Horizon**: 68
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | `0`, `non-zero` | If set, overlays picture 114 (alternate view) |
| `global101` | `0` | Room visited flag (initialized to 0) |
| `global118` | `0`, `1`, `2`, `3` | Minstrel spawn state: 2 = appears in room 14 |
| `global160`, `global159` | Coordinates | Current position of minstrel (saved when leaving room) |
| `global213`, `global214` | Coordinates | Previous position of minstrel (restored when re-entering) |
| `global118` | `-1` | Set after minstrel receives book and leaves |
| `global182` | `0`, `1` | Set to 1 after minstrel trade completed ( lute received flag) |
| `global184` | Number | Counter for minstrel conversation次数 |
| `local0` | Number | Computed time value for minstrel spawn condition |
### Additional Technical Details
- Room uses Region 506 (MeadReg) for meadow interactions
- Room uses Region 516 (Notes) for minstrel encounters
- Synonyms defined in MeadReg: `flora` = `flora` = `blossom`
- Synonyms defined in Notes: `man` = `man` = `boy` = `person` = `bard`, `kiss` = `kiss` = `embrace`
- Minstrel appears in room 14 when global118 = 2
- Minstrel is created as gNewAct_2 with view 174, loop 2 (lute-playing animation)
- Minstrel spawns with 1% chance per game minute when player has item 9 (lute), after at least 3 minutes have passed
- When player gives Shakespeare book (item 18) to minstrel, minstrel transforms into actor (view 173) and gives lute (item 9) to player
- Minstrel trade awards 3 score points
- Minstrel plays various songs (sounds 15-19) during conversation
- Notes bubble (view 888) appears above minstrel during interactions

View File

@@ -0,0 +1,93 @@
# Room 15: The Frog Pond
Room 15 is the Frog Pond, a tranquil woodland pond where Rosella encounters the famous fairy tale frog. The room features a pond with lily pads where a large frog wearing a golden crown resides. This room is central to the Frog Prince questline - the player can interact with the frog using the golden ball (item 5) to earn its trust, then kiss it to transform it into a prince (item 10 - crown). The transformation sequence awards score points and provides the crown needed for the witch's potion in the endgame.
## Look Description
"Atop one of the bigger lily pads, you notice a rather large frog...wearing a little gold crown!"
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look/room` | "Atop one of the bigger lily pads, you notice a rather large frog...wearing a little gold crown!" (Print 15 19) |
| TODO | Look | `look/lake` / `look/water` | Dynamic text: "This is a very pretty little pond. Floating upon it are many beautiful water lilies. %s" with frog description if frog present (Print 15 11) |
| TODO | Look | `look/frog` | Different responses based on frog state: "The large frog stares back at you with big bulging eyes." (global110=0 or 3), "The water is too murky to see anything." (global110=1), "The frog appears to be retrieving your gold ball." (global110=2), "The frog sits calmly in the palm of your hand. Its big eyes stare into yours. A little gold crown rests upon its head." (global110=4) (Print 15 6-10) |
| TODO | Look | `look/lilies` / `look/pad` | Dynamic text: "Many water lilies float upon this little pond. %s" with frog description if frog present (Print 15 16) |
| TODO | Look | `look/crown` | If frog in hand (global110=4): "It's a nice little gold crown." (Print 15 17), otherwise shows crown from inventory (Print 800 1) |
| TODO | Look | `look/dirt` / `look/down` | Various responses based on ball location and frog state: "The frog is sitting with the gold ball at the east edge of the pond." (ball present, frog present), "Your golden ball is lying by the east edge of the pond." (ball present), "The frog is sitting on the ground near the edge of the pond." (frog present), "There is nothing of interest on the ground." (default) (Print 15 12-15) |
| TODO | Look | `look/blossom` | "You see flowers here and there." (Print 15 18) |
| TODO | Look | `look/under` / `look/in/water` | "The water is too murky to see anything." (Print 15 7) |
| TODO | Look | `look/prince` | If transformed (global110=5): "This prince may be handsome, but he's also obnoxiously conceited." (Print 15 0), otherwise "You can't see a prince here." (Print 15 4) |
| TODO | Get | `get/frog` / `capture/frog` | Various responses: can't see (global110=4), too far (global110=1), not here (global110=5), no frog (global110≠3), not while in pond (view=6), success if close enough with ball: "Squinching up your nose in disgust, you catch the large frog and hold it in your hand. It stares at you with its big bulgy eyes, and wobbles its throat." (Print 15 25-30) |
| TODO | Get | `get/ball` | Must be in normal form (view=2). If already have ball (global110=7): pick up. If ball in room ((Inv at: 5) ownedBy: 15): if close enough, pick up; else "You're not close enough." (Print 800 1). If don't have ball: "You don't see one here." (Print 15 43) |
| TODO | Get | `get/crown` | If already have crown: "You don't have it." (Print 800 0). If frog in hand (global110=4): take crown, transform frog to prince, award 2 points, set global110=6, trigger frogActions state 70 (Print 15 46) |
| TODO | Get | `get/blossom` / `get/flower` | "It would waste your precious time to stop and pick flowers." (Print 15 20) |
| TODO | Get | `get/lilies` / `get/pad` | "You have no need for a lily pad." (Print 15 33) |
| TODO | Get | `get/drink` / `drink/water` | If in normal form and near water: trigger drinking script (Print 15 24). If in water (view=6): "Well, it's not wonderful, but it satisfies your thirst." (Print 15 23). Else: "You can't do that now." (Print 15 24) |
| TODO | Talk | `converse/frog` / `talk/frog` | If frog present or in hand (global110=0,3,4): "Ribbit! Ribbit!" (Print 15 32), then "Well, what else did you expect from a frog?" (Print 15 33). Otherwise: "Well, what else did you expect from a frog?" (Print 15 34) |
| TODO | Talk | `converse/prince` / `talk/prince` | If transformed (global110=5) and prince present: "The prince does not answer you." (Print 15 1). Otherwise: "You can't see a prince here." (Print 15 4) |
| TODO | Inventory | `use/ball` / `fling/ball` / `drop/ball` / `place/ball` / `deliver/ball` | Must have ball (item 5). If frog present (global110=0): If have crown ((Inv at: 10) ownedBy: 200) and near water: frog dives and retrieves ball, set global110=2, trigger frogActions state 3; else "Try another spot." (Print 15 36); If no crown: "There's no one nearby." (Print 15 37). If not in normal form: "That's not necessary any more." (Print 15 38). Else: "Not here." (Print 15 39). If no ball: "Not now." (Print 15 40) |
| TODO | Inventory | `deliver/[item]` | If prince present: "He is not interested." (Print 15 45). Otherwise: "There's no one here to give anything to." (Print 15 46) |
| TODO | Action | `kiss/frog` / `kiss` | If frog in hand (global110=4): "You look at the frog's green lips. Mmmmm. Good. You feel silly doing this, as you slowly put your mouth against the frog's." (Print 15 41), trigger frogActions state 50, set global110=5, award 3 points. Otherwise: "You can't do that now." (Print 15 42) |
| TODO | Action | `fish` / `enter/fish` / `capture/fish` / `cast/pole` | "You can't see any fish here." (Print 15 5) |
| TODO | Action | `bathe` / `dive` | "The water is too shallow." (Print 15 21) |
| TODO | Action | `wade` | "Just do that yourself." (Print 15 22) |
| TODO | Get | `get/prince` | If transformed (global110=5): "You couldn't get the prince." (Print 15 2) |
| TODO | Action | `kiss/prince` | If transformed: "He's too conceited. You wouldn't want to." (Print 15 3) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | frogActions | Player enters water area (onControl=512) while frog visible (global110=0) | Frog jumps away from player, sets global110=1 |
| TODO | Interaction | frogActions | Player uses ball near frog (global110=0, has crown, in normal form) | Frog dives and retrieves ball, returns to lily pad, sets global110=2 |
| TODO | Interaction | frogActions | Player catches frog (global110=3, has ball, close enough) | Frog is captured, player holds frog in hand, sets global110=4, shows frog in hand view |
| TODO | Interaction | frogActions | Player kisses frog while holding (global110=4) | Transformation sequence: poof effect, frog becomes prince (view 225), awards 3 points, prince dialogue, prince leaves and tosses crown to player |
| TODO | Interaction | frogActions | Player takes crown from frog in hand (global110=4) | Crown removed, frog transforms to prince (view 378), prince walks away, awards 2 points |
| TODO | Interaction | frogActions | Player moves while holding frog (global110=4, movement detected) | Frog escapes back to pond, resets to wild state (global110=7 → 3) |
| TODO | Interaction | ballActions | Player picks up golden ball from ground ((Inv at: 5) ownedBy: 15) | Ball picked up, if frog present (global110=3 or 4), frog returns to pond |
| TODO | Interaction | drinking | Player drinks from pond (get/drink command) | Player bends down to drink, animation plays for 5 seconds, restores thirst |
## Technical Notes
- **Room Number**: 15
- **Picture**: 15 (overlay 115 if `global100` is set)
- **Region**: 507 (Frog Pond region)
- **Exits**: North→9, South→21, East→16, West→14
- **Horizon**: 75
- **Music**: Sound 28 (frogTheme) plays when frog appears
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | `0`, `non-zero` | If set, overlays picture 115 (alternate view with different lily pad) |
| `global101` | `0` | Room initialization flag (set to 0) |
| `global105` | `0`, `2` | Player terrain state: 0 = on land (view 2), 2 = in water (view 6) |
| `global110` | `0`, `1`, `2`, `3`, `4`, `5`, `6`, `7` | Frog transformation state: 0 = frog with crown on lily pad, 1 = frog fled from player, 2 = frog retrieved ball, 3 = frog in pond (capturable), 4 = frog in player's hand, 5 = transformed to prince, 6 = crown taken from frog, 7 = ball taken from frog |
| `global182` | `0`, `1` | Crown obtained flag (set to 1 after receiving/taking crown) |
| `local0` | Number | Current onControl value for terrain detection |
| `local1` | Number | Previous onControl value for terrain change detection |
| `newAct` | Actor | The frog/prince actor instance |
| `newView` | View | The golden ball view (when on ground in room 15) |
### Additional Technical Details
- Synonyms: `lake` = `lake`, `prince` = `prince` = `man`
- Room uses Region 507 for pond interactions
- Frog appears on lily pad when player has crown (item 10 owned by room 15) in inventory
- Golden ball (item 5) appears at east edge of pond when owned by room 15
- Frog behavior changes based on global110 state:
- State 0: Visible on lily pad with crown
- State 1: Jumped away from player into water
- State 2: Has retrieved ball, waiting on lily pad
- State 3: In water, can be captured with ball
- State 4: In player's hand (can kiss or take crown)
- State 5: Transformed to prince (interactive)
- State 6: Crown taken, prince leaving
- State 7: Ball taken, frog returning to wild
- Player automatically switches view between land (2) and water (6) based on onControl terrain
- Score changes: +3 for kissing frog to transform, +2 for taking crown from transformed prince
- Frog uses multiple views: 370 (default), 372 (swimming), 373 (jumping), 377 (returning with ball), 378 (prince)
- Prince uses views: 225 (transformation), 226 (walking), 227 (leaving)

View File

@@ -0,0 +1,63 @@
# Room 16: Graveyard
This is a dark, run-down cemetery located in the forest. The room features multiple gravestones with epitaphs, an old rotting tree, a cross marking one grave, and a mysterious hole in the forest. At night (when global100 is set), three zombies emerge from the ground and chase the player if they don't have the obsidian scarab (item 7). Players can use the shovel (item 15) to dig at graves and potentially find treasure (gold coins at the miser's grave, silver baby rattle at the baby's grave, or Medal of Honor at the lord's grave).
## Look Description
"This run-down, gloomy cemetery gives you the creeps! Many of the old tombstones have fallen over, and the entire place is overgrown with grass and weeds."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look gravestone` | "Each tombstone has an epitaph written on it." |
| TODO | Look | `look/read epitaph` / `look/read gravestone` / `look/read boulder` | Displays epitaph text based on control area (various humorous epitaphs for different graves) |
| TODO | Look | `look in/forest` / `look forest<hole` | "There is nothing of importance in the old tree." (when in forest rectangle) |
| TODO | Look | `look cross` | "One of the graves is marked by a cross." |
| TODO | Look | `look forest` | "An old, rotting tree adds appropriate charm to the decrepit cemetery." |
| TODO | Look | `look hole` | "The hole is empty." (if hole exists) or "There is nothing of importance in the old tree." (if near hole in forest area) |
| TODO | Look | `look around` / `look room` | "This run-down, gloomy cemetery gives you the creeps! Many of the old tombstones have fallen over, and the entire place is overgrown with grass and weeds." |
| TODO | Action | `dig/grave` / `dig/hole` | Digs a grave with shovel (if has shovel and shovel is not already used), finds treasure based on grave location |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | z1Actions | At night (global100=1), after 4 seconds | First zombie emerges from ground, chases player if global105=0 (normal), otherwise wanders. If player has scarab (item 7), zombie retreats. If player doesn't have scarab, triggers death sequence (sets global105=17, plays death animation, game over). |
| TODO | Interaction | z2Actions | At night (global100=1), after 10 seconds | Second zombie emerges from ground, same behavior as z1Actions |
| TODO | Interaction | z3Actions | At night (global100=1), after 15 seconds | Third zombie emerges from ground, same behavior as z1Actions |
| TODO | Interaction | digging | Player uses `dig` command with shovel | Player enters digging animation, creates hole, checks control area for treasure. Finds bag of gold coins (miser's grave), silver baby rattle (baby's grave), or Medal of Honor (lord's grave). Awarded 3 points for each find. |
| TODO | Interaction | getItems | After finding treasure during dig | Plays pickup animation, displays found item message |
| TODO | Background | holeActions | Continuous | Animates the hole in the ground (cycles through cel values) |
## Technical Notes
- **Room Number**: 16
- **Picture**: 16
- **Region**: 510 (Cemetery region)
- **Exits**: North→10, South→22, East→17, West→15
- **Music**: Zombie theme (sound #20, looping)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `is_night` | `true` (global100=1), `false` (global100=0) | Whether it's nighttime (zombies appear when true) |
| `player_state` | `0` (normal), `17` (dead/captured) | Tracks player state - set to 17 when caught by zombie |
| `holes_dug` | `0-5+` (global113) | Number of holes dug in cemetery |
| `grave_type` | `1`, `2`, `4`, `5` (global134) | Which grave contains treasure (1=baby, 2=miser, 4=lord, 5=ghost) |
| `zombie_active_count` | `0-3` (global186) | Number of zombies currently active |
| `zombie_engaged` | `0`, `1` (global189) | Whether player has engaged with zombies |
| `shovel_broken` | `true`, `false` | Whether shovel has been used (loop? = 1) |
### Additional Technical Details
- Synonyms defined: `kiss` = `kiss` = `embrace`, `ghoul` = `ghoul` = `ghoul` = `man` = `ghoul` = `ghoul`
- Three zombies (newAct, newAct_2, newAct_3) spawn at positions 250,116, 70,123, and 103,172 respectively
- Zombies use views 260/261, 262/263, 264/265 for hidden/visible states
- Player needs obsidian scarab (item 7) to repel zombies
- Can dig up to 5 holes before shovel breaks
- Found items: item 12 (silver baby rattle), item 13 (bag of gold coins), item 29 (Medal of Honor)
- Score +3 awarded for each treasure found
- Holes are stored in gNewPropX array with room number and coordinates
- Control areas ($0008, $0020, $0100, $0200, $0004, $0002, $0080, $0040, $0010, $0400, $1000) determine which epitaph displays and which treasure is at each grave location

View File

@@ -0,0 +1,67 @@
# Room 17: Spooky House Exterior
This is the exterior of a spooky old house located in a cemetery. The room features a cottage with windows and a door, stone steps, a surrounding stone wall, overgrown bushes, and a cemetery with graves. A ghoul (animated figure) appears if the player has not collected a specific item, triggering an encounter sequence that results in the player being transported to the underworld (Room 68). The primary interaction is opening the front door to enter the house.
## Look Description
"Indeed, this is a spooky old house! It looks as if no one has lived here for many years. Flanking the old house on both sides is a run-down cemetery. A thick forest looms all around."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look around` / `look room` / `look[<around>]` | "Indeed, this is a spooky old house! It looks as if no one has lived here for many years. Flanking the old house on both sides is a run-down cemetery. A thick forest looms all around." (Print 17 0) |
| TODO | Look | `look grave` / `look gravestone` | "The graves are in the cemetery." (Print 17 1) |
| TODO | Look | `look fence` / `look wall` | "An old, crumbling stone wall surrounds the neglected cemetery." (Print 17 2) |
| TODO | Look | `look cottage` | "This is not a pleasant house; in fact, it's downright scary! It looks old and abandoned, and badly in need of tender-loving-care. To make matters worse, it sits right in the middle of an old cemetery!" (Print 17 3) |
| TODO | Look | `look cemetery` | "A decrepit and over-grown cemetery surrounds the old house." (Print 17 4) |
| TODO | Look | `look door` | "This is a finely-carved, wooden door." (Print 17 5) |
| TODO | Look | `look window` (close to window) | "You peek through the window, but can make out no details." (Print 17 6) |
| TODO | Look | `look window` (in bushes) | "The bushes are too tall! Go up by the door." (Print 17 7) |
| TODO | Look | `look window` (elsewhere) | "You're not close enough." (Print 800 1) |
| TODO | Look | `look stair` | "Wide stone steps lead up to the front door of the spooky old house." (Print 17 8) |
| TODO | Look | `look bush` | "Overgrown shrubs front the old house." (Print 17 9) |
| TODO | Action | `break window` | "It looks like many of the windows are already broken!" (Print 17 10) |
| TODO | Action | `break door` | "You could never do that." (Print 17 11) |
| TODO | Action | `open door` (at door) | Opens the door with animation and sound, then transitions to Room 68 |
| TODO | Action | `open door` (not at door) | "You're not close enough." (Print 800 1) |
| TODO | Action | `close door` | "The door is closed." (Print 17 12) |
| TODO | Action | `open window` | "The windows do not open." (Print 17 13) |
| TODO | Action | `unlatch door` | "The door is already unlocked." (Print 17 14) |
| TODO | Action | `bang door` (at door) | "With trepidation, you rap on the door. Not surprisingly, nobody answers." (Print 17 15) |
| TODO | Action | `bang door` (not at door) | "You're not close enough." (Print 800 1) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | z6Actions | Player enters the door zone (rect 141,146 to 175,149) while ghoul encounter is active | Triggers ghoul encounter sequence: ghoul appears, theme plays, player transforms through multiple views, then is transported to Room 68 (underworld). Sets `ghoul_encounter_completed = true` when finished. |
## Technical Notes
- **Room Number**: 17
- **Picture**: 17
- **Region**: 508 (cemetery)
- **Exits**: North→11, South→23, East→18, West→16, Door→68 (spooky house interior)
- **Music**: Sound 21 (zTheme)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | `true`, `false` | Ghoul encounter flag - when true, ghoul appears |
| `global101` | `0` | Room-specific flag, initialized to 0 |
| `global120` | message pointer | Stores the "wander forever" message pointer |
| `global127` | `0`, `1` | Ghoul encounter completion flag - set to 1 after encounter ends |
### Additional Technical Details
- Synonyms defined: `kiss` = `embrace`, `ghoul` = `ghoul man`
- The ghoul appears when `global100 = true` and player does not have inventory item 7
- Item 7 (not yet mapped) is required to prevent the ghoul encounter
- The door zone is defined as rectangle 141,146 to 175,149
- Opening the door requires player to be in rect 139,140 to 173,153
- Window visibility checks use multiple rect zones to determine proximity
- If player views is not 2 (normal form) when exiting, the room change is blocked
- Entry from Room 68 positions player at the door (loop:2, x:161, y:151)
- The overlay picture 117 is shown if `global100` is true

97
rooms/kq4-018-cemetery.md Normal file
View File

@@ -0,0 +1,97 @@
# Room 18: Cemetery
## Look Description
"This is a scary old cemetery! Many of the tombstones are crumbling or falling over, and the entire place is overgrown with weeds. A mountain range looms to the east, and all around a forest encroaches."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `/boulder` | "There are rocks here and there." |
| TODO | Look | `/grass` | "Tufts of grass and weeds sprout around the old tombstones." |
| TODO | Look | `/crypt` | "The stone crypt is built into the mountainside!" |
| TODO | Look | `/cliff` | "A stone crypt is built into the mountainside." |
| TODO | Look | `/gravestone` | "Each tombstone has an epitaph written on it." |
| TODO | Look | `/monument,lion` | "An interesting statue of a lion is mounted above the crypt door." |
| TODO | Look | `/door` (closed) | "The crypt door is closed." |
| TODO | Look | `/door` (open) | "The crypt door is open." |
| TODO | Look | `/hole` (has hole nearby) | "The hole is empty." |
| TODO | Look | `/hole` (no holes) | "You don't see it here." |
| TODO | Look | `[<around][/room]` | "This is a scary old cemetery! Many of the tombstones are crumbling or falling over, and the entire place is overgrown with weeds. A mountain range looms to the east, and all around a forest encroaches." + "How odd! You see a crypt door built right into the mountainside!" |
| TODO | Action | `climb/boulder` | "You're not interested in climbing rocks." |
| TODO | Action | `open,enter/crypt` (open) | "The door is open; just enter it." |
| TODO | Action | `open,enter/crypt` (closed) | "Try opening the crypt door." |
| TODO | Action | `/door break` | "You could never do that." |
| TODO | Action | `/door bang` | "You pound on the door and hear your knocks echo from within. There is no answer." |
| TODO | Action | `/door open` (locked) | "The door is locked." |
| TODO | Action | `/door open` (unlocked) | Opens the crypt door |
| TODO | Action | `/door open` (already open) | "The crypt door is already open." |
| TODO | Action | `/door close` (open) | "The door is closed." (and closes door) |
| TODO | Action | `/door close` (closed) | "The door is closed." (no action) |
| TODO | Action | `/door latch` (no key) | "You don't have the right key to lock this door." |
| TODO | Action | `/door latch` (closed & unlocked, has key) | Locks the door with skeleton key |
| TODO | Action | `/door latch` (already locked) | "The door is already locked." |
| TODO | Action | `/door latch` (open) | "First you need to close the door." |
| TODO | Action | `/door unlatch` (locked) | Unlocks the door |
| TODO | Action | `/door unlatch` (already unlocked) | "The door is already unlocked." |
| TODO | Action | `/door unlatch` (open) | "The door is already open." |
| TODO | Action | `/door unlatch` (no key) | "You don't have the key to unlock this door." |
| TODO | Action | `dig[/hole,grave]` (has shovel) | Digs a hole at the current location |
| TODO | Action | `dig[/hole,grave]` (no shovel) | "You have nothing to dig with." |
| TODO | Action | `dig[/hole,grave]` (no dig target) | "You don't know what to dig for...yet." |
| TODO | Action | `dig[/hole,grave]` (wrong location) | "Try somewhere else. The ground is too hard here." |
| TODO | Talk | `read,look/epitaph,gravestone,boulder` | Reads epitaph based on player position |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | `z1Actions` | Timer (10 seconds) when `global100` is set | Spawns zombie #1 at position (25, 156). Zombie chases player if `global105 = 0`. If player has scarab (item 7), zombie retreats. Otherwise, player is captured (game over). |
| TODO | Interaction | `z4Actions` | Timer (4 seconds) when `global100` is set | Spawns zombie #2 at position (109, 131). Same behavior as z1Actions. |
| TODO | Interaction | `z5Actions` | Timer (8 seconds) when `global100` is set | Spawns zombie #3 at position (220, 165). Same behavior as z1Actions. |
| TODO | Interaction | `digging` | Player uses dig command with shovel | Animates digging. If player digs in correct location with proper quest state, reveals items (toy horse or locket). |
| TODO | Interaction | `getItems` | Triggered after finding an item while digging | Plays pickup animation and adds item to inventory |
## Technical Notes
- **Room Number**: 18
- **Picture**: 18
- **Region**: 510, 511 (cemetery regions)
- **Exits**: North→12, South→24, West→17, East→69 (crypt interior - via door)
- **Music**: Sound 20 (zombie theme)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global174` | 0, 1, 2 | Door state: 0=locked, 1=closed/unlocked, 2=open |
| `global105` | 0, 17 | Zombie chase state: 0=zombies chase player, 17=player escaped |
| `global186` | number | Count of active zombies |
| `global187` | 0, 1 | Score flag for unlocking door |
| `global113` | number | Number of holes dug in cemetery |
| `global134` | number | Quest state for digging (determines which item is found) |
| `global100` | boolean | Whether overlay 118 is active (nighttime/zombie event) |
| `global101` | 0 | Reset to 0 on room entry |
### Synonyms
- `kiss` = kiss, embrace
- `ghoul` = ghoul, man, ghoul
### Inventory Items Referenced
- Item 7: Obsidian scarab (protects against zombies)
- Item 15: Shovel (for digging)
- Item 20: Skeleton key (for locking/unlocking door)
- Item 28: Locket (found by digging)
- Item 30: Toy horse (found by digging)
### Special Mechanics
- The crypt door can be locked/unlocked with the skeleton key (item 20)
- Three zombies spawn at intervals when `global100` is set (nighttime event)
- Zombies chase the player unless they have the obsidian scarab (item 7)
- Digging with a shovel can reveal hidden items at specific grave locations
- Player can read epitaphs on tombstones based on their position in the room
- Entering room 69 (crypt) changes player movement parameters

View File

@@ -0,0 +1,67 @@
# Room 19: Coastal Cliffs
This is a coastal cliff area overlooking the ocean. The room features animated waves in the background and dangerous cliff edges where the player can fall if they venture too close to the edge. A floating entity (genie) may appear under certain conditions related to a magic item and time elapsed. The player can navigate between a meadow to the east, the beach to the south, a cave to the north, and another area to the west.
## Look Description
"Wistfully, you stare out over the ocean, wishing you could go home and see your family again. Unfortunately, reality sets in, and you remember your difficult situation. Turning your head, you look eastward toward a meadowland covered with wildflowers, and heave a big sigh of sadness."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look /grass` | "A pretty meadow leads eastward." (Print 19 0) |
| TODO | Look | `look /cliff` | "Better be careful around the cliffs!" (Print 19 1) |
| TODO | Look | `look [around][/room]` | "Wistfully, you stare out over the ocean, wishing you could go home and see your family again. Unfortunately, reality sets in, and you remember your difficult situation. Turning your head, you look eastward toward a meadowland covered with wildflowers, and heave a big sigh of sadness." (Print 19 2) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | waveActions | Continuous (room init) | Animates three wave props (wave1, wave2, wave3) cycling through their cells to create ocean wave animation |
| TODO | Interaction | fallLmagenta | Walking on magenta control area ($2000) while `global107 = 11` | Player falls from edge, moves to position (gEgo x, gEgo y + 40), plays falling animation, shakes screen, displays "You really should be more careful, Rosella!" message, sets `global127 = 1` |
| TODO | Interaction | fallLred | Walking on red control area ($1000) while `global107 = 11` | Player falls, moves to position (222, 170), plays falling animation, shakes screen, displays "That last step was a doozy!" message, sets `global127 = 1` |
| TODO | Interaction | fallGrey | Walking on grey control area ($0100) while `global107 = 11` | Player falls, moves to position (263, 173), plays falling animation, shakes screen, displays "Watch where you're going, Rosella!" message, sets `global127 = 1` |
| TODO | Interaction | fallLgrey | Walking on light grey control area ($0080) while `global107 = 11` | Player falls, moves to position (270, 173), plays falling animation, shakes screen, displays "That last step was a doozy!" message, sets `global127 = 1` |
| TODO | Interaction | fallRed | Walking on red control area ($0010) while `global107 = 11` | Player falls straight down, moves to position (gEgo x, 178), plays falling animation, shakes screen, displays "That last step was a doozy!" message, sets `global127 = 1` |
| TODO | Interaction | fallBrown | Walking on brown control area ($0040) while `global107 = 11` | Player falls, moves to position (239, 187), plays falling animation, shakes screen with 3 seconds, displays "That last step was a real doozy!" message, sets `global127 = 1` |
| TODO | Interaction | fallGreen | Walking on green control area ($0004) while `global107 = 11` | Player falls, moves to position (240, 219), plays falling animation, shakes screen, displays "Oops, you slipped!" message, sets `global127 = 1` |
| TODO | Background | doFall | Triggered when player is about to fall | Stops all sounds, plays fall sound (sound 51), stops any floating entity animation |
## Technical Notes
- **Room Number**: 19
- **Picture**: 19
- **Regions**: 516, 503, 501, 504
- **Exits**: North→13, South→25, East→20, West→31
- **Horizon**: 104
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | 0 | Reset to 0 on room entry |
| `global105` | 0-4 | Player entry state/position index (determines starting position) |
| `global107` | 0, 11 | Edge zone indicator: 11 when player is on cliff edge, 0 otherwise |
| `global118` | number | Random value (1-30 divided by 10) when genie conditions met |
| `global127` | 0, 1 | Fall state: set to 1 after player falls |
| `global100` | boolean | Overlay flag - if set, overlay 119 is displayed |
| `local2` | number | Time calculation: (global160 - global213) * 60 + (global159 - global214) |
### Additional Technical Details
- Room uses setRegions: 516 503 501 504 (multiple region scripts applied)
- Three wave Prop instances (wave1, wave2, wave3) with view 666 create animated ocean effect
- Control areas determine fall behavior:
- $2000: magenta area - fall to (x, y+40)
- $1000: red area - fall to (222, 170)
- $0100: grey area - fall to (263, 173)
- $0080: light grey area - fall to (270, 173)
- $0010: red area - fall straight down
- $0040: brown area - fall to (239, 187)
- $0004: green area - fall to (240, 219)
- Floating entity (gNewAct_2) appears conditionally when player has item 9 (magic lamp) and local2 >= 3, displays view 174 loop 2 cel 0
- When falling, player view changes to 17 (falling animation), then to 33 (lying down)
- Sound 51 plays during fall sequence
- Player priority adjusts based on position (setPri: 12, 13, 14)
- The room checks `gEgo inRect:` for priority zone between x:254-316 and y:104-115

42
rooms/kq4-020-meadow.md Normal file
View File

@@ -0,0 +1,42 @@
# Room 20: Meadow
This is a green meadowland transitional area filled with beautiful wildflowers. The room serves as a connector between the coastal cliffs to the west and other areas to the north, south, and east. It is a simple passage room with no interactive objects, NPCs, or special scripts - players simply pass through while traveling between locations.
## Look Description
"A green meadowland, filled with beautiful wildflowers, surrounds you."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look/room` / `look[<around>]` / `look` | "A green meadowland, filled with beautiful wildflowers, surrounds you." |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | Overlay | Init when `global100` is set | Displays overlay picture 120 over the base room |
## Technical Notes
- **Room Number**: 20
- **Picture**: 20
- **Regions**: 506, 518
- **Exits**: North→14, South→26, East→21, West→19
- **Horizon**: 68
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | 0 | Reset to 0 on room entry |
| `global100` | boolean | Overlay flag - if set, overlay 120 is displayed |
### Additional Technical Details
- Room uses setRegions: 506 518 (region scripts applied)
- Player enters in normal form (view 2)
- When global100 is set, overlay 120 is displayed on top of the base picture
- This is a simple transitional room with no interactive elements
- Horizon is set at y=68, defining the upper walkable boundary

View File

@@ -0,0 +1,64 @@
# Room 21: Bridge Over Stream
This is a peaceful woodland clearing with a rustic stone bridge crossing a gentle stream. The room serves as a transitional area connecting the meadow (room 20) to the west, the beach/cliffs to the south (room 27), the forest to the east (room 22), and higher ground to the north (room 15). The key feature is the bridge - players can look under it to discover a hidden golden ball. There are animated water/stream elements and the room has multiple region influences.
## Look Description
"A gentle stream meanders its way through the trees. A rustic stone bridge crosses its path."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look/room` / `look[<around>]` / `look` | "A gentle stream meanders its way through the trees. A rustic stone bridge crosses its path." |
| TODO | Look | `look bridge` | "A rustic stone bridge adds a bit of charm to this part of the woods." |
| TODO | Look | `look under/bridge` (when not in bridge zone) | "You peek under the bridge, but do not see anything of importance from where you're standing." (Print 21 0) |
| TODO | Look | `look under/bridge` (when in bridge zone) | Triggers script to walk under bridge |
| TODO | Look | `look under/bridge` (when in water zones) | "You can't do that." (Print 800 1) |
| TODO | Action | `look under/bridge` (in correct position) | Script triggers: player walks under bridge, kneels, finds golden ball |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | egoActions | Player uses `look under/bridge` while in the rectangular zone (120-195 x, 130-139 y) | Player walks under bridge, kneels down, discovers golden ball (if not already taken), picks it up, stands back up and resumes normal form |
| TODO | Background | newProp | Init (always running) | Animated element (view 657, loop 2) at position 295,118 - likely water/stream animation |
| TODO | Background | newProp_2 | Init (always running) | Animated element (view 657, loop 1) at position 122,154 - likely water/stream animation |
| TODO | Background | newProp_3 | Init (always running) | Animated element (view 657, loop 2) at position 13,181 - likely water/stream animation |
## Technical Notes
- **Room Number**: 21
- **Picture**: 21
- **Regions**: 507, 501, 512
- **Exits**: North→15, South→27, East→22, West→20
- **Horizon**: 68
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | 0 | Reset to 0 on room entry |
| `global100` | boolean | Overlay flag - if set, overlay 121 is displayed |
| `global182` | 0, 1 | Golden ball taken flag - set to 1 when player picks up the golden ball |
### Additional Technical Details
- Room uses setRegions: 507 501 512 (region scripts applied)
- Player enters in normal form (view 2)
- When global100 is set, overlay 121 is displayed on top of the base picture
- Golden ball (inventory item 5) is placed in room at position (164, 129) if owned by room 21
- The `egoActions` script handles the full sequence of looking under the bridge:
1. Player walks to position 141, 133
2. Player kneels (view 21, loop 0)
3. Player looks under (view 23)
4. If golden ball present: ball is disposed, score +2, item moved to ego, message shown
5. Player stands back up (view 21, then view 2)
6. Viewer is restored if player had one
- Bridge zones:
- Primary bridge zone: 120-195 x, 130-139 y - triggers full sequence
- Water zones (cannot look under): 70-254 x, 115-169 y OR 189-318 x, 93-139 y
- Entry from room 26 (south) has special positioning based on player view and x position
- Entry from room 22 (east) has special positioning based on player view and y position
- Entry from room 20 (west) has special positioning based on y position
- Special exit to room 26 if player is in lower-left corner (x < 20, y > 166)

View File

@@ -0,0 +1,94 @@
# Room 22: Gnome's Cottage
This is a charming woodland scene featuring a cozy cottage built into a massive ancient tree. The room serves as a key location with the gnome's cottage - players can interact with the door, window, water wheel, and flowers. The cottage door is lockable and leads to room 54 (inside the cottage). The room features multiple animated elements (birds/bats in the sky) and is adjacent to the stream (room 21), the forest path (room 23), and higher ground (room 16).
## Look Description
"You have come upon a cute little house, built right into a huge tree! An old water wheel, attached to the house, goes unused beside the little river that flows gently before the house."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look/cottage` / `look/house` | "The roots of this great tree envelop a little, snug house. Smoke lazily curls from its chimney, and an old rustic water wheel rests beside the river." |
| TODO | Look | `look/window` (when near window) | "You peek through the window, but can make out no details." (Print 22 1) |
| TODO | Look | `look/window` (when not near window) | "You can't do that." (Print 800 1) |
| TODO | Look | `look/blossom` / `look/flower` | "There are flowers here and there." (Print 22 2) |
| TODO | Get | `get/blossom` / `get/flower` | "It would waste your precious time to stop and pick flowers." (Print 22 3) |
| TODO | Look | `look/door` | "It's a small wooden door." (Print 22 4) |
| TODO | Action | `break/window` | "That's vandalism!" (Print 22 5) |
| TODO | Action | `break/door` | "You could never do that." (Print 22 6) |
| TODO | Action | `open/window` | "The windows do not open." (Print 22 7) |
| TODO | Action | `open/door` (when near door) | Multiple responses based on door state - see table below |
| TODO | Action | `open/door` (when not near door) | "You can't do that." (Print 800 1) |
| TODO | Action | `unlatch/door` (when near door, door locked) | "The door is already unlocked." (Print 22 10) |
| TODO | Action | `unlatch/door` (when near door, door unlocked) | "You can't. You don't have the key." (Print 22 11) |
| TODO | Action | `bang/door` / `knock/door` (when door unlocked) | "Go away!" (Print 22 12) |
| TODO | Action | `bang/door` / `knock/door` (when has key) | "You knock loudly on the small door and hear a shuffling from inside. A sleepy voice calls out, 'We're all asleep here! Come back tomorrow!'" (Print 22 13) |
| TODO | Action | `bang/door` / `knock/door` (when no key) | "You knock loudly on the small door. No answer." (Print 22 14) |
| TODO | Look | `look/wheel` / `look/water wheel` | "The water wheel appears run-down, and is currently not in use." (Print 22 15) |
| TODO | Look | `look/room` / `look[<around>]` / `look` | "You have come upon a cute little house, built right into a huge tree! An old water wheel, attached to the house, goes unused beside the little river that flows gently before the house." |
### Door State Responses
When using `open/door` near the door:
| Door State | Response |
|------------|----------|
| `local0 = 1` (door unlocked) | "That would not be a good idea right now." (Print 22 8) |
| `global100 = 0` (no key) | Door opens with animation, leads to room 54 |
| `global100 = 1` (has key) | "You can't. It's locked and you don't have the key." (Print 22 9) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | doorActions | Entry from room 53 or 54 when global102 = 2 | Door is opened from the other side - plays door animation from closed (cel 0) to open, displays message "...and STAY OUT!" |
| TODO | Background | door | Init (always running) | Door prop (view 612) at position 179,111 - cel 0 closed, cel 1+ open animation |
| TODO | Background | newProp | Init (always running) | Animated element (view 627, loop 0) at position 158,25 - cel 3, likely sky element (bird/bat) |
| TODO | Background | newProp_2 | Init (always running) | Animated element (view 656, loop 0) at position 23,110 |
| TODO | Background | newProp_3 | Init (always running) | Animated element (view 656, loop 1) at position 309,156 |
| TODO | Background | newProp_4 | Init (always running) | Animated element (view 656, loop 2) at position 226,168 |
| TODO | Background | newProp_5 | Init (always running) | Animated element (view 656, loop 3) at position 41,125 |
## Technical Notes
- **Room Number**: 22
- **Picture**: 22
- **Regions**: 501 (WaterReg), 512 (RiverReg), 508 (Forest Region)
- **Exits**: North→16, South→28, East→23, West→21
- **Horizon**: 75
### Region Interactions
The room applies three region scripts:
1. **WaterReg (501)**: Handles terrain-based ego view changes when walking on different surfaces
2. **RiverReg (512)**: River-related interactions (look in/at brook, fish, bathe, drink, wade)
3. **Forest Region (508)**: Forest interactions (look at boulder, grass, bush, flora, blossoms, forest, crow)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | 0 | Reset to 0 on room entry |
| `global100` | boolean | Door key flag - if set, player has the key (door can be opened) |
| `global102` | 2 | Set to 2 when entering from rooms 53 or 54 |
| `local0` | 0, 1 | Door state - 1 = door has been opened/unlatched from inside |
### Additional Technical Details
- Room uses setRegions: 501 512 508
- Door position zone: 170-202 x, 112-120 y (used for door interactions)
- Window position zones: 140-170 x, 112-124 y OR 170-202 x, 112-120 y
- Priority zone: 167-201 x, 140-149 y - player gets elevated priority (setPri: 11) when in this area (in front of door)
- Player enters in normal form (view 2)
- When global100 is set, overlay 122 is displayed on top of the base picture
- When global100 is set, door starts in open state (loop: 1) instead of closed (loop: 0)
- Entry from room 53 or 54 with global102 = 2 triggers doorActions script (door opened from inside)
- Entry from room 16 (north) positions ego at horizon + yStep + 1
- Entry from room 21 (west) has special y-position handling based on horizon
- Entry from room 23 (east) positions ego at far right edge (x: 317)
- Entry from room 28 (south) positions ego at bottom (x: 171, y: 188)
- Sound 300 plays when door is opened
- Door animation cycles from cel 0 (closed) to end cel (open), then triggers room change to 54

View File

@@ -0,0 +1,64 @@
# Room 23: Forest Path with Cottage
This is an outdoor forest scene with a river flowing westward and a cottage visible in the distance. The room features a robin bird that appears when the player has the magic berry (item 19). The bird can be observed pulling an earthworm from the ground, then flying away and leaving the worm behind. The player can pick up the earthworm after the bird departs. The room also contains hazard zones that trigger falling animations when the player walks on them.
## Look Description
"You are walking through a forest thick with pine trees. A nearby river rushes westward from the distant mountain range. In the distance, you see a large house."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look room` | "You are walking through a forest thick with pine trees. A nearby river rushes westward from the distant mountain range. In the distance, you see a large house." |
| TODO | Look | `look cottage` / `look house` | "It's too far in the distance to see it clearly." |
| TODO | Look | `look robin` / `look bird` | (If bird present and in state 0: "A pretty robin pulls hungrily at a long earthworm." Otherwise: "You see a bird flying away.") |
| TODO | Look | `look crow` | (Unhandled - returns unclaimed) |
| TODO | Look | `look earthworm` | (If bird present and has berry and in state 0: "A pretty robin pulls hungrily at a long earthworm." If worm already taken: "You see a fat worm wiggling on the ground." If player has worm: Shows worm inventory. Otherwise: "You don't see one here.") |
| TODO | Look | `look dirt` | (If worm taken: "You see a fat worm wiggling on the ground." If bird present and in state 0: "A pretty robin pulls hungrily at a long earthworm." Otherwise: "You see nothing of importance.") |
| TODO | Talk | `talk robin` / `talk bird` | (If in state 0: "Cheep, cheep!" Otherwise: "Not now.") |
| TODO | Action | `kill robin` / `kill bird` | "Not a little robin!" |
| TODO | Action | `capture robin` / `capture bird` / `get robin` / `get bird` / `kiss robin` / `kiss bird` | (If bird present: "You're not close enough." Otherwise: "You don't see one here.") |
| TODO | Action | `help robin` / `help bird` | "How can you do that, Rosella?" |
| TODO | Inventory | `deliver` (when bird present) | "The robin can't understand." |
| TODO | Inventory | `deliver` (when no bird) | "There's no one here." |
| TODO | Action | `capture earthworm` / `get earthworm` | (If worm present and close enough: Picks up worm, worm disappears from ground. Otherwise: "You can't do that now.") |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | fallSouth | Walking on south control zone ($0004) | Plays fall sound, animates player falling south, plays dizzy sequence, returns player to normal |
| TODO | Background | fallRed | Walking on red control zone ($0010) | Plays fall sound, animates player falling, plays dizzy sequence, returns player to normal |
| TODO | Background | shortFall | Walking on short fall zone ($1000) | Plays fall sound, shorter fall animation sequence, dizzy, returns to normal |
| TODO | Interaction | birdActions | Bird present and player within 30 pixels while bird in loop 2 | Bird switches to flying animation, spawns worm prop on ground, flies away to the north and exits screen |
| TODO | Interaction | wormActions | Triggered by birdActions when bird leaves | After delay, worm moves to player's inventory. Player receives worm and 2 score points |
## Technical Notes
- **Room Number**: 23
- **Picture**: 23
- **Exits**: North→17, East→24, South→29, West→22
- **Music**: Not specified
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | `0` | Reset on room entry |
| `global100` | Any | If true, room uses overlay picture 123 |
| `global182` | `0`, `1` | Set to 1 when worm is obtained |
| `birdActions.state` | `0`, `1`, `2`, `3`, `4` | Bird behavior state: 0=present with worm, 1-3=flying away, 4=disposed |
| `worm_in_inventory` | `true`, `false` | Whether player has picked up the worm (item 19 moves between room 23 and ego) |
### Additional Technical Details
- Regions applied: 508, 501, 512
- Item 19 is the earthworm (starts with player if owned by 206, can be moved to room 23 when bird drops it, then to ego when picked up)
- Robin appears 50% of the time when player has the magic berry (item 19 owned by player)
- Worm appears in room after bird flies away (state 2)
- Bird spawns at position (275, 158), flies to (182, 51), then exits to (20, -6)
- Worm spawns at bird position minus offset when bird starts flying
- Fall triggers use control zone bitmasks: $0010 (red), $0004 (south), $1000 (short)
- Horizon is set to 74
- Sound 51 = fall sound, Sound 80 = dizzy sound

View File

@@ -0,0 +1,53 @@
# Room 25: Beach at River Delta
This is a coastal scene where a river from the east meets the blue ocean. The room features animated water effects showing waves near the river's mouth and along the beach. Players can look at the brook, grass, and surrounding area. The primary interactive element is drinking from the river, which triggers a swimming animation sequence when the player is in normal form and positioned correctly near the water. Entry positions vary based on the player's current transformation state.
## Look Description
"A river, coming from the east, spills into the blue ocean before you. A lonely beach edges the ocean. From atop the bluff, a lovely meadow stretches eastward."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look /brook` | "The cold water of the river contrasts sharply with the warmer ocean water as the two converge." |
| TODO | Look | `look /grass` | "Eastward, you see a pretty green meadow." |
| TODO | Look | `look [around]` / `look [room]` / `look [beach]` | "A river, coming from the east, spills into the blue ocean before you. A lonely beach edges the ocean. From atop the bluff, a lovely meadow stretches eastward." |
| TODO | Action | `drink [water]` / `get drink` | (If in water zone in normal form: "Ahhh! It tastes good!" with swimming animation. If not in normal form: "You're not close enough." If in water zone but not normal form: "You're not close enough.") |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | riverActions | Player types `drink water` while in water zone and in normal form | Plays drinking animation: player switches to swimming view (21), pauses with message "Ahhh! It tastes good!", plays recovery animation, returns to normal walking view. If player is not in normal form (global105 != 0), prints "You're not close enough." |
| TODO | Background | waveActions | Continuous on room entry | Animates wave props (wave1, wave2) in sequence: cycles through cel frames, hides and shows waves in loop for continuous water effect |
## Technical Notes
- **Room Number**: 25
- **Picture**: 25
- **Region**: 504, 501, 503, 506 (applied via setRegions)
- **Exits**: North→19 (bluff/meadow), South→1, East→26, West→31
- **Music**: (Sound 25 - if applicable)
- **Overlay**: Picture 125 shown when global100 is true
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | `true`, `false` | Controls whether overlay picture 125 is displayed |
| `global105` | `0`, `1`, `2`, `3`, `4` | Player transformation state (0 = normal form, 1-4 = various transformed states like swimming, frog, etc.) |
| `global106` | Various | Secondary transformation tracking variable |
| `gEgoViewer` | Script or `0` | Stores player's current viewer script before entering water |
| `local1` | Bitmask | Control area detection for water zone |
### Additional Technical Details
- Synonyms defined: `brook` = `brook` = `brook`
- Wave Props: wave1 (position 177, 74), wave2 (position 164, 116) - animated water effects at river mouth
- Additional Props: newProp (position 254, 182), newProp_2 (position 226, 164) - extra water animations
- Player entry positions are adjusted based on global105 (transformation state) and gPrevRoomNum
- Player must be in normal form (global105 = 0) to drink from the river
- Player must be within coordinates 185-319 (x) and 150-180 (y) to interact with water
- The riverActions script saves the current player script (gGEgoScript), sets a temporary script, performs the drinking animation, then restores the original script and viewer
- Control area bits checked: $0008, $0800, $0002, $0200 - various water/terrain detection flags

View File

@@ -0,0 +1,56 @@
# Room 26: River Meadow
A tranquil riverside meadow with animated water and flower features. The cold river carves through a lush floral landscape. Players can look at the surroundings but have limited interaction options in this transitional room.
## Look Description
"A cold river carves its way through this lush flowery meadow."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look around` / `look room` / `look[<around]` | "A cold river carves its way through this lush flowery meadow." |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | newProp | Continuous | Animated prop at position 171,85 with view 658, loop 6 (water animation) |
| TODO | Background | newProp_2 | Continuous | Animated prop at position 184,118 with view 658, loop 2 (flower animation) |
| TODO | Background | newProp_3 | Continuous | Animated prop at position 117,169 with view 658, loop 5 (flower animation) |
| TODO | Background | newProp_4 | Continuous | Animated prop at position 68,181 with view 658, loop 7 (flower animation) |
| TODO | Background | newProp_5 | Continuous | Animated prop at position 159,159 with view 658, loop 4 (flower animation) |
| TODO | Background | newProp_6 | Continuous | Animated prop at position 125,137 with view 658, loop 3 (flower animation) |
## Technical Notes
- **Room Number**: 26
- **Picture**: 26
- **Region**: 501, 512, 506, 518 (various region scripts)
- **Exits**: North→20, South→2, East→27, West→25
- **Horizon**: 75
- **Music**: Unknown
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | `0` | Room-specific state flag (initialized to 0) |
| `global100` | Any | Overlay flag - if set, overlays picture 126 |
| `local0` | Various | Local temporary variable |
| `newProp` through `newProp_6` | Prop instances | Animated feature props (water, flowers) |
### Additional Technical Details
- Room uses overlay system: if `global100` is set, picture 126 is overlaid on the room
- Six animated props using view 658 with different loops for water and flower animations
- Edge behavior: If player exits north past x>202, they're transported to Room 21 instead of 20
- Entry positions vary based on previous room:
- From Room 2 (south): Position at y=188, x between 80-251
- From Room 20 (north): Position at horizon + yStep, x based on current position
- From Room 25 (west): Position at x=1
- From Room 27 (east): Position at x=318
- Default (new game): Position at 150, 149
- All props have `isExtra: 1` and `ignoreActors: 1` for background animation
- Props cycle forward continuously with cycleSpeed 1

View File

@@ -0,0 +1,41 @@
# Room 27: Forest Path
This is a transitional forest area connecting multiple locations in the game world. The room features thick woods with trees and birds (when certain conditions are met). It's a simple passage room with no NPCs or interactive objects - players simply pass through heading to adjacent rooms.
## Look Description
"You are wandering through a thick wood. You hear birds chirping from the many trees."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look around` / `look room` / `look[<around][/!*]` | "You are wandering through a thick wood. You hear birds chirping from the many trees." (Print 27 0) |
## Scripts
No scripts defined in this room. Interactions are handled by regions 507 (Woods) and 518 (Unicorn Meadow).
## Technical Notes
- **Room Number**: 27
- **Picture**: 27
- **Region**: 507 (Woods), 518 (Unicorn Meadow)
- **Exits**: North→21, South→3, East→28, West→26
- **Music**: Not specified
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | `0` | Local room state flag (initialized to 0) |
| `global100` | `0`/`1` | Controls whether overlay 127 is displayed (event state) |
### Additional Technical Details
- Room uses Region 507 for woods-related interactions (rocks, grass, bushes, trees, birds, flowers)
- Room uses Region 518 for unicorn meadow interactions (unicorn, bridle)
- When `global100` is set (non-zero), the overlay picture 127 is displayed over the base room
- The look description dynamically changes based on `global100` - birds are mentioned only when `global100` is false (0)
- Player enters in normal view (view: 2) with standard walking parameters (xStep: 3, yStep: 2)
- Horizon is set at y-coordinate 75

View File

@@ -0,0 +1,60 @@
# Room 28: Mine Entrance
This is the entrance to the dwarf diamond mine, featuring a crude mine shaft carved into a small hill with a wooden door. The room has two distinct states depending on whether the mine door is open or closed/padlocked (controlled by global100). Players can enter the mine, approach the door, or fall into a pit in the southwestern area. The room connects to the diamond mine (room 55) when entering the mine shaft.
## Look Description
"You see a crude mine shaft in the midst of this forest of pine trees."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look door` | "The door is wide open." (Print 28 0) - When door is open (global100=0) |
| TODO | Look | `look in/mine` | "You look inside, but can make out no details." (Print 28 1) - When in proximity to mine entrance |
| TODO | Look | `look mine/hill` | "The crude mine is carved into a small hill. Its solid, wooden door is propped open." (Print 28 2) - When door is open |
| TODO | Look | `look around` / `look room` | "You see a crude mine shaft in the midst of this forest of pine trees." (Print 28 3) |
| TODO | Action | `close door` | "You shouldn't close it." (Print 28 4) - When door is open |
| TODO | Action | `open door` | "The door is already open." (Print 28 5) - When door is already open |
| TODO | Look | `look door` | "The door is closed and padlocked." (Print 28 10) - When door is closed (global100=1) |
| TODO | Look | `look mine/hill` | "The crude mine is carved into a small hill. Its solid, wooden door is closed and padlocked." (Print 28 11) - When door is closed |
| TODO | Action | `break door` | "You could never do that." (Print 28 6) - When door is closed |
| TODO | Action | `bang door` | "You knock on the door, but receive no answer." (Print 28 7) - When in proximity to closed door |
| TODO | Action | `open door` | "You can't. It's closed and padlocked." (Print 28 8) - When door is closed |
| TODO | Action | `unlatch door` / `detach door` / `get door` | "You can't. You don't have the key." (Print 28 9) - When door is closed |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | fallSouth | Player walks into control area $0004 in the southwest | Triggers falling animation into pit, plays fall sound (sound 51), animates ego falling with view 17, then transitions to lying down animation (view 21), then resets player to standing |
| TODO | Background | Room exit | Player enters control area $0040 | Automatically transitions to room 55 (diamond mine) |
## Technical Notes
- **Room Number**: 28
- **Picture**: 28
- **Region**: 508 (Forest Region)
- **Exits**: North→22, South→4, East→29, West→27, Mine entrance→55 (via control area)
- **Music**: Not specified
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | `0`, `1` | Event state - controls mine door state (0=open, 1=closed/padlocked) |
| `global101` | `0` | Local room state flag (initialized to 0) |
| `door_open` | `true`, `false` | Derived from global100 - mine door is open or closed/padlocked |
### Additional Technical Details
- When global100 is set (door closed), overlay picture 128 is displayed
- A View object (view 600) is displayed at the mine entrance - loop 0 when door is closed, loop 1 when open
- Player cannot close the door (message: "You shouldn't close it")
- The fallSouth script uses local variables local1 and local2 for positioning calculations
- When falling, player movement is disabled (illegalBits: 0) and special views are used (17 for falling, 21 for lying)
- After falling, player is reset to normal view (view: 2) with standard walking
- Control area $0004 triggers the fall, control area $0040 triggers exit to diamond mine
- Player enters in normal view (view: 2) with standard walking parameters (xStep: 3, yStep: 2)
- Horizon is set at y-coordinate 126
- Views 17 and 21 are preloaded for the falling animation sequence

View File

@@ -0,0 +1,59 @@
# Room 29: Dense Forest
A forest clearing where a robin bird may appear with an earthworm. The player can obtain the earthworm by watching the bird and catching it when it drops the worm. Features a dangerous pit on the west side that causes the player to fall.
## Look Description
"You are roaming through a dense forest."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look/around`, `look/room`, `look[<around][/!*]` | "You are roaming through a dense forest." (Print 29 0) |
| TODO | Get | `capture,get/earthworm` | If worm exists and close enough: catches worm. If worm not present: "You see a fat worm wiggling on the ground." (Print 29 11). If not close enough: "You're not close enough." (Print 800 1) |
| TODO | Look | `look/crow`, `look/crow` | Unhandled (allows crow interaction from other rooms) |
| TODO | Look | `look/robin`, `look/bird`, `look/robin,bird` | If bird present and state 0: "A pretty robin pulls hungrily at a long earthworm." (Print 29 2). If bird present and state > 0: "You see a bird flying away." (Print 29 3). If no bird: "You don't see one here." (Print 29 4) |
| TODO | Talk | `converse/robin`, `converse/bird`, `converse/robin,bird` | If bird state 0: "Cheep, cheep!" (Print 29 5). If bird state > 0: "Not now." (Print 29 6) |
| TODO | Action | `kill/robin`, `kill/bird`, `kill/robin,bird` | "Not a little robin!" (Print 29 7) |
| TODO | Get | `capture,get,kiss/robin`, `capture,get,kiss/bird` | If bird present: "You're not close enough." (Print 800 1). If no bird: "You don't see one here." (Print 29 4) |
| TODO | Action | `help/robin`, `help/bird`, `help/robin,bird` | "How can you do that, Rosella?" (Print 29 8) |
| TODO | Inventory | `deliver` (to robin) | If bird present: "The robin can't understand." (Print 29 9). If no bird: "There's no one here." (Print 29 10) |
| TODO | Look | `look/earthworm` | If bird present and has worm and bird state 0: "A pretty robin pulls hungrily at a long earthworm." (Print 29 2). If worm on ground: "You see a fat worm wiggling on the ground." (Print 29 11). If player has worm: shows worm inventory. Otherwise: "You don't see one here." (Print 29 4) |
| TODO | Look | `look/dirt` | If worm on ground: "You see a fat worm wiggling on the ground." (Print 29 11). If bird present with worm: "A pretty robin pulls hungrily at a long earthworm." (Print 29 2). Otherwise: "You see nothing of importance." (Print 29 12) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | fallSouth | Player walks west into pit area (control area $0004) | Triggers fall animation using view 17, plays fall sound (51), then transitions to swimming view (21) and moves to room 28 |
| TODO | Background | birdActions | Robin bird spawned (50% chance when player has worm); triggers when player gets within 30 pixels of bird | Bird drops worm (creates earthworm prop), flies away to upper left, then disposes |
| TODO | Background | wormActions | Runs continuously on room init; also triggered when player captures worm | Spawns earthworm on ground (moves item 19 to room); when player captures, disposes worm, gives worm to player, awards 2 points, sets global182 to 1 |
## Technical Notes
- **Room Number**: 29
- **Picture**: 29
- **Region**: 508
- **Exits**: North→23, South→5, East→30, West→28
- **Music**: Sound 51 (fall sound)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | 0, 1 | Controls whether room overlay (129) is shown |
| `global101` | 0 | Unknown, set to 0 in init |
| `global182` | 0, 1 | Worm collected score flag - set to 1 after player obtains worm |
| `newAct` | 0, object | Robin bird actor instance (spawned randomly 50% chance) |
| `newProp` | 0, object | Earthworm prop instance (spawned when bird drops it) |
| `worm_owned` | true, false | Whether player has earthworm in inventory (item 19 owned by 206=player, 29=room) |
### Special Mechanics
- Bird (50% spawn chance): Only appears when player has the earthworm in inventory (item 19 owned by 206)
- Worm spawning: Worm appears on ground in room when wormActions initializes
- Worm capture: Player must get close to worm (within 15 pixels) and use capture/get command
- Fall hazard: West exit has a pit - walking into control area $0004 triggers fall sequence
- Fall sequence: Player falls using view 17 animation, then transitions to swimming view (21) and is moved to room 28
- Score: 2 points awarded when worm is collected (global182 prevents re-awarding)

View File

@@ -0,0 +1,72 @@
# Room 30: Mountain Pass
A mountain pass connecting the dense forest to the east with the highlands. Features dangerous cliff edges that can cause the player to fall. Lolotte's flying goons may appear when entering from the east, performing a dramatic fly-in sequence.
## Look Description
"A mountain range rises to the east from the forest. A narrow path winds steeply up the side of it."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Action | `climb/boulder` | "You don't have the time to climb rocks." (Print 30 0) |
| TODO | Look | `look/path` | "The narrow path dangerously winds its way up the steep mountains." (Print 30 1) |
| TODO | Look | `look/boulder` | "There are rocks here and there." (Print 30 2) |
| TODO | Look | `look/goon,man,person` | If goon present: "Lolotte's goons are not appealing at all! Besides having an unnatural pallor to their skin, the goons are creepy little creatures who fly upon wings that resemble those of bats." (Print 30 3). If no goon: "You don't seen one here." (Print 30 4) |
| TODO | Look | `look`, `look/around`, `look/room` | "A mountain range rises to the east from the forest. A narrow path winds steeply up the side of it." (Print 30 5) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | shortFall | Player walks into control area $0010 (shallow fall zone) | Triggers short fall sequence - plays fall sound (51), plays cuckoo sound, player falls with view 17 animation, transitions to swimming view (21), then returns to normal walking |
| TODO | Interaction | deadFall | Player walks into control area $0004 (deep pit/death zone) | Triggers deadly fall sequence - plays fall sound (51), player falls with view 17 animation, transitions to view 33 (death), shakes screen, prints warning message (Print 30 6), sets global127 to 1 (player death flag) |
| TODO | Interaction | deadMagenta | Player walks into control area $0020 (magenta death zone) | Triggers deadly fall sequence - identical to deadFall but uses different control area check |
| TODO | Interaction | henchFlyIn | Entering room 30 from room 92 or 79 while in flying form (view 80) | Flying cutscene - henchman flies in from above with theme music (29), creates two goon actors (newAct, newAct_2) with bat-like wings, they fly to positions and leave |
| TODO | Background | h1Actions | Triggered by henchFlyIn script | Controls first goon's movement - flies from entry point to position 145,40, then flies off-screen upward and disposes |
| TODO | Background | h2Actions | Triggered by henchFlyIn script | Controls second goon's movement - flies from entry point to position 175,40, then flies off-screen upward and disposes |
## Technical Notes
- **Room Number**: 30
- **Picture**: 30
- **Region**: 508, 511
- **Exits**: North→24, East→79, West→29
- **Music**: Sound 29 (henchFlyIn theme), Sound 51 (fall sound), Sound 80 (cuckoo sound)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | 0, 1 | Controls whether room overlay (130) is shown |
| `global101` | 0 | Unknown, set to 0 in init |
| `global127` | 0, 1 | Player death flag - set to 1 when player dies from falling |
| `gEgoOnControl` | bitmask | Current control area under player |
| `theGEgoOnControl` | bitmask | Previous control area under player (for change detection) |
| `newAct` | 0, object | First goon actor instance (created during henchFlyIn) |
| `newAct_2` | 0, object | Second goon actor instance (created during henchFlyIn) |
| `local4` | 0, 1 | Flag indicating henchman 1 has left the area |
| `local5` | 146, 154, 165 | Target Y position for fall animation based on X position |
### Special Mechanics
- Control areas: Room has three distinct control areas that trigger different fall behaviors
- $0010 (shallow): Triggers shortFall - non-lethal fall
- $0004 (deep pit): Triggers deadFall - deadly fall
- $0020 (magenta): Triggers deadMagenta - deadly fall
- Henchman fly-in: Only triggers when entering from room 92 or 79 while in flying form (view 80)
- Death handling: Both deadly fall scripts set global127 to 1, which likely triggers game over
- Entry positioning: Player starts at different positions based on previous room
- Horizon handling: When entering via henchFlyIn, horizon is set to -1000 to allow flying entry
### Entry Points
| From Room | Entry Condition | Player Position/State |
|-----------|----------------|----------------------|
| West (29) | Normal | x: 2 |
| North (24) | Normal | x: 112, y: horizon+2 |
| 0 (new game) | Normal | x: 183, y: 123 |
| 92 | Flying (view 80) | Flying in from above with henchFlyIn script |
| 79 | Flying (view 80) | Flying in from east with henchFlyIn script |
| 79 | Not flying | x: 318, y: 100 |

View File

@@ -0,0 +1,79 @@
# Room 31: Open Ocean
This room represents the vast open ocean surrounding the Isle of the Dead. Players swim through the waters encountering various marine life including dolphins (which can be mounted for transportation), schools of fish, whales, and dangerous sharks. The room features dynamic wildlife spawning, drowning mechanics when swimming too far from land, and special whale riding sequences that transport the player to other locations.
## Look Description
"You are swimming in a great ocean. Playful fish leap about you as you swim."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look[<around>][/room,ocean,ocean,water]` (at island) | "You can see an island in the distance." (Print 31 0) |
| TODO | Look | `look[<around>][/room,ocean,ocean,water]` (night mode) | "You are swimming in a great ocean." (Print 31 1) |
| TODO | Look | `look[<around>][/room,ocean,ocean,water]` (on dolphin) | "You are riding a dolphin in a great ocean." (Print 31 2) |
| TODO | Look | `look[<around>][/room,ocean,ocean,water]` (default) | "You are swimming in a great ocean. Playful fish leap about you as you swim." (Print 31 3) |
| TODO | Look | `look[<around>]` (shark present) | "There is a hungry shark approaching!!" (Print 31 4) |
| TODO | Look | `look/shark` | "Just get out of there...fast!!" (Print 31 7) |
| TODO | Look | `look/shark` (no shark present) | "You don't see one here." (Print 31 6) |
| TODO | Look | `look/island` (at island position) | "It's too far in the distance to see it clearly." (Print 31 8) |
| TODO | Look | `look/island` (default) | "What island?" (Print 31 9) |
| TODO | Look | `mount/dolphin` (already riding) | "You ARE riding the dolphin." (Print 31 5) |
| TODO | Look | `mount/dolphin` (not riding) | "You don't see one here." (Print 31 6) |
| TODO | Look | `look/dolphin` (while riding) | "You can feel the dolphin's strong muscles working, as it swims through the ocean with you on its back." (Print 31 10) |
| TODO | Action | `kiss/dolphin` | "There is no need for that." (Print 31 11) |
| TODO | Inventory | `deliver[*]/fish` (to dolphin) | "The fish don't want it." (Print 31 12) |
| TODO | Inventory | `deliver[*]/bird,gull` (to dolphin) | "The seagulls have no interest in it." (Print 31 13) |
| TODO | Inventory | `deliver[*]/dolphin` (item to dolphin) | "The dolphin doesn't want anything." (Print 31 14) |
| TODO | Talk | `converse[/dolphin]` | "You speak to the dolphin, and it chatters back." (Print 31 15) |
| TODO | Action | `pat/dolphin` | "The dolphin's skin feels smooth and slippery as you pet it." (Print 31 16) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | fish3Actions | Random 9% chance per frame when not in night mode and no room script running | Spawns a fish (view 300) at random position that swims across screen |
| TODO | Background | fishActions | Random 10% chance per frame when not in night mode and no room script running | Spawns a fish (view 301) at random position that swims across screen |
| TODO | Interaction | drown | Player exceeds edge hit threshold (local3 >= local12 = 4) and is not on dolphin or in whale | Player drowns - displays drowning animation, shows death message, sets game over flag |
| TODO | Interaction | whaleActions | Random 40% chance when not already in whale/dolphin sequence and entering from room 43 or randomly | Plays whale animation, allows player to ride whale to room 44 |
| TODO | Interaction | whaleActions | Entering from room 44 | Performs whale riding entrance sequence - shows whale, positions player, displays message about riding |
| TODO | Interaction | sharkActions | Various random conditions based on position and edge proximity | Spawns shark (view 887) that chases player - triggers death sequence if caught |
## Technical Notes
- **Room Number**: 31
- **Picture**: 31 (day), 131 (night - global100)
- **Region**: 519, 504
- **Exits**: North→1, North→13, Northeast→19, East→25, Northwest→32, North-northwest→41, Northwest→39, Southwest→35, West-southwest→34, West→33, South→43 (whale), Southeast→95
- **Music**: Sound 36 (whaleMusic), Sound 78 (sharkMusic loop)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | 0, 1 | Night mode flag - when set, uses alternate picture 131 and prevents random fish spawning |
| `global101` | 0 | Reset to 0 in init |
| `global105` | Room number | Current room - checked for value 14 ( dolphin room) |
| `global109` | 0, 1 | Whale encounter enabled flag |
| `global183` | 0 | Whale state flag - 0 allows whale to appear |
| `global223` | 0, 1 | Dolphin available flag - when set, creates dolphin prop |
| `local1` | 0-5, 100 | Y-position tracking for exit determination |
| `local2` | 0-4, 99, 100 | X-position tracking for exit determination |
| `local3` | 0+ | Edge hit counter - increments on each edge hit |
| `local12` | 4 | Drowning threshold - player drowns when local3 reaches this value |
| `local13` | varies | Stores initial local2 value on room entry |
### Player View States
| View | Meaning |
|------|---------|
| 8 | Swimming (normal ocean swimming) |
| 10 | Drowning/shark attack death animation |
| 312 | Riding dolphin |
| 84 | Whale riding animation |
### Synonyms
- `ocean` = `water`
- `room` = `ocean` (in look commands)

View File

@@ -0,0 +1,68 @@
# Room 32: Ocean Near Island
## High-Level Summary
Room 32 is a swimming area in the ocean near the island containing Tamir's palace. This transitional room connects the main ocean (room 31) to the beach area (room 40). The player encounters this room when swimming toward the island from the southern approach. The room displays a scenic view of the enchanted white palace on the island and contains animated aquatic creatures (likely fish or flamingos) swimming in the water.
## Look Description
"As you swim, you notice a splendid white palace on a small island to the north."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `/tamir` | "You see Tamir in the distance." |
| TODO | Look | `/island` | "The small island contains a beautiful white palace. Lush vegetation encircles it." |
| TODO | Look | `/castle` | "The white palace is quite enchanting! (Maybe it IS enchanted). With its tall slender towers, lovely arched windows, and beautiful island setting, the palace radiates goodness, peace, and serenity." |
| TODO | Look | `/fish` | "You don't see any here." |
| TODO | Look | `[<around>][/room]` | "As you swim, you notice a splendid white palace on a small island to the north." |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | Prop animations (newProp, newProp_2, newProp_3, newProp_4) | Room initialization | Four animated props using view 660 with forward cycling at varying positions create swimming creature effects in the water |
| TODO | Background | Palace view (newView) | Room initialization | Static view 613 loop 2 cel 0 positioned at 163,62 displays the white palace on the island |
| TODO | Interaction | Edge handling | Player reaches screen edge | Handles screen wrapping (x: 0↔319) and directional exit determination based on player position |
## Technical Notes
- **Room Number**: 32
- **Picture**: 32
- **Region**: 504 (Gull Region), 519 (Ocean Region)
- **Exits**: North→40 (beach), West→31 (ocean), East→31 (ocean), South→31 (ocean)
- **Horizon**: 114
- **View**: 613 (palace view)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | `0`, `1` | Nighttime flag - when true, changes picture to 132 |
| `gPrevRoomNum` | `39`, `40`, `41` | Previous room number - determines entry position |
### Entry Points
| From Room | Entry Position |
|-----------|---------------|
| 40 (north) | x:164, y:115 |
| 39 (west) | x:100, y:115 |
| 41 (east) | x:226, y:115 |
### Objects
| Object | View | Loop | Cel | Position | Description |
|--------|------|------|-----|----------|-------------|
| newView | 613 | 2 | 0 | 163, 62 | Palace/island scenery |
| newProp | 660 | 0 | 1 | 79, 81 | Animated aquatic creature |
| newProp_2 | 660 | 1 | 2 | 118, 92 | Animated aquatic creature |
| newProp_3 | 660 | 2 | 0 | 214, 93 | Animated aquatic creature |
| newProp_4 | 660 | 3 | 3 | 266, 86 | Animated aquatic creature |
### Exit Logic
When player hits north edge (edgeHit = 1):
- If x < 115: exit to room 39 (west beach)
- If x > 198: exit to room 41 (east beach)
- Otherwise: exit to room 40 (north beach)

View File

@@ -0,0 +1,56 @@
# Room 33: Enchanted Island Beach
This is the beach of a beautiful enchanted island. The room serves as a transitional area connecting to the sea (Room 39), the palace grounds to the east (Room 34), and returns to the mainland via the south or west. The room features two animated background elements and handles entry positioning based on how the player arrives (swimming from the sea vs. walking from other rooms).
## Look Description
"You see the beach of a beautiful enchanted island. Behind you, an ivory palace rises majestically. A luxuriant garden encircles the magnificent palace."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look around` / `look/room` / `look/island` | "You see the beach of a beautiful enchanted island. Behind you, an ivory palace rises majestically. A luxuriant garden encircles the magnificent palace." |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | newProp | Continuous | Animated prop at position 139,184 with view 661, loop 0, cel 1 - plays forward animation cycle continuously |
| TODO | Background | newProp_2 | Continuous | Animated prop at position 227,132 with view 661, loop 1, cel 3 - plays forward animation cycle continuously |
## Technical Notes
- **Room Number**: 33
- **Picture**: 33
- **Exits**: North→31 (at horizon), South→36 (y ≥ 189, x < 160), South→39 (y ≥ 189, x ≥ 160), East→34 (x ≥ 319), West→31 (x ≤ 0)
### Entry Points
| From Room | Condition | Position |
|-----------|-----------|----------|
| 36 | Any | x: 246, y: 186 |
| 34 | Any | x: 317, y: (current y) |
| 31 | y < horizon | x: (current x), y: horizon + 2 |
| 31 | y ≥ horizon | x: 2, y: (current y) |
| 39 | view = 2 (land) | x: 138, y: 187 |
| 39 | view = 5 | x: 113, y: 187 |
| 39 | view = 6 | x: 84, y: 187 |
| 39 | view = 7 | x: 58, y: 187 |
| 39 | Other | x: 20, y: 188 |
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | `0` | Horizon tracking - initialized to 0 |
| `gHorizon` | `80` | Global horizon value for room |
### Additional Technical Details
- Regions applied: 505, 501, 503, 504 (region source files not available)
- Player step speed: xStep 3, yStep 2
- Edge detection reset on room entry
- Automatic room transitions handled in doit method based on player position
- When entering from Room 39 (sea), player position varies based on their current transformation/view state
- The room handles transitions to Room 39 (sea entrance) when player goes south from the right side of the beach (x ≥ 160)

View File

@@ -0,0 +1,88 @@
# Room 34: Island Beach
## High-Level Summary
Room 34 is the beach area of the magical island with the ivory palace. This scenic location features the azure ocean stretching before the player, with a beautiful garden and splendid palace rising behind. The room connects to the palace to the north (room 31), another beach area to the west (room 33), and the eastern side of the island (room 35). The room features animated ocean waves and applies multiple regional scripts for beach interactions, water/swimming mechanics, garden features, and seagull wildlife.
## Look Description
"You see the azure ocean stretching in front of you as you stand on the beach of this marvelous island. Behind you, set amidst a beautiful garden, rises a splendid ivory palace."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look[<around][/room,island]` | "You see the azure ocean stretching in front of you as you stand on the beach of this marvelous island. Behind you, set amidst a beautiful garden, rises a splendid ivory palace." (Print 34 0) |
| TODO | Look | `look/beach` | "The ocean water laps gently upon the sandy beach of the island." / "Something catches your eye! Why, it's a beautiful peacock feather!" (Print 505 0/1) |
| TODO | Look | `look/feather` | "You see a beautiful peacock feather lying upon the beach." (Print 505 2) |
| TODO | Look | `look/tamir` | "You see Tamir in the distance." (Print 505 4) |
| TODO | Look | `look[<in,under]/ocean,water` | "You look under the water, and see nothing but...more water!" / "You're not in the water." (Print 505 5/6 or Print 503 0/1) |
| TODO | Look | `look/ocean,water` | "The wide blue ocean surrounds this island. Off to the east, you can barely see the mainland of Tamir." (Print 505 7) |
| TODO | Look | `look[<down]/dirt` | "You see nothing but sandy soil." (Print 505 9 or Print 503 7) |
| TODO | Look | `look/boulder` | "You don't see many rocks." (Print 505 10 or Print 503 8) |
| TODO | Look | `look/forest` | "There are many beautiful trees in this garden setting." (Print 505 11 or Print 503 9) |
| TODO | Look | `look/grass` | "Lush green grass carpets this magical island." (Print 505 12 or Print 503 10) |
| TODO | Look | `look/bush` | "A low hedge borders the lovely garden." (Print 505 13 or Print 503 11) |
| TODO | Look | `look/flora` | "The foliage is lush and green." (Print 505 14 or Print 503 12) |
| TODO | Look | `look/blossom` | "Beautiful flowers seem to flourish here." (Print 505 15 or Print 503 12) |
| TODO | Look | `look/garden` | "A splendid garden surrounds the magnificent ivory palace." (Print 505 16) |
| TODO | Look | `look/castle` | "An enchanting ivory palace, encircled by a luxuriant garden, rises from the center of this secluded island." (Print 505 17) |
| TODO | Look | `look/peacock` | "A majestic peacock, with a beautiful tail, struts by." / "You don't see one." (Print 505 18/19) |
| TODO | Look | `look/fish` | "You don't see any fish right now." (Print 503 3) |
| TODO | Look | `look[<up]/sky` | "The bright, blue sky seems to merge as one with the vast ocean before you." / "It's easy to see by the light of a full moon." (Print 503 5/6) |
| TODO | Look | `look/gull,gull,bird` | "You see many seagulls gliding through the air in their never-ending quest for food." (Print 504 0) |
| TODO | Action | `climb/forest` | "It is difficult to climb trees while wearing that dress!" (Print 505 20) |
| TODO | Talk | `converse/peacock` | "Peacocks don't talk!" (Print 505 21) |
| TODO | Talk | `converse/gull,bird` | "Seagulls don't talk." (Print 504 1) |
| TODO | Get | `get/feather` | Picks up feather if nearby (Print 505 2, 800 1) |
| TODO | Get | `get/blossom` | "It would waste your precious time to stop and pick flowers." (Print 505 23 or Print 503 13) |
| TODO | Get | `get/flora,blossom` | "It would waste your precious time to stop and pick flowers." (Print 503 13) |
| TODO | Get | `get/water` | "You have no reason to carry water." (Print 503 14) |
| TODO | Action | `get,capture/peacock` | "You don't need the peacock." (Print 505 24) |
| TODO | Action | `get,capture/gull,bird` | "You can't catch a seagull." (Print 504 2) |
| TODO | Action | `get,capture/bird,parrot` | "That wouldn't accomplish anything." (Print 505 25) |
| TODO | Action | `drink` / `get/drink` | "YUCK!! This water's too salty!" (Print 503 15, 503 22) |
| TODO | Action | `bathe,dive,wade[<enter][/ocean]` | "Just enter the water." / "The water is much too deep here." / "You are already swimming." (Print 503 16/17/18) |
| TODO | Action | `capture,get/fish` | "You cannot catch fish while swimming." / "This would not be a good spot to fish." / "You have no way of catching any fish." (Print 503 19/20/21) |
| TODO | Action | `fish[<enter]` | Same as capture fish (Print 503 19/20/21) |
| TODO | Action | `kiss/peacock` | "There's no need for that." (Print 505 26) |
| TODO | Action | `kiss/gull,bird` | "You can't kiss a seagull." (Print 504 3) |
| TODO | Action | `feed/gull,bird` | "The seagulls are not interested." (Print 504 4) |
| TODO | Inventory | `deliver/*/gull` | "You can't give that." / "The seagull has no interest in it." (Print 504 5/6) |
| TODO | Inventory | `fling/*` | "You can't throw that." / "That would accomplish nothing." (Print 504 7/8) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | `waveActions` | Automatic on room init | Animates three wave props (wave1, wave2, wave3) in a looping cycle. Creates View objects for each wave, cycles through cels, then hides and advances to the next wave. |
| TODO | Background | `water` (via waterReg) | Continuous | Monitors player's onControl state and switches player view based on terrain: normal land (view 2), shallow water (view 5), more shallow water (view 6), more water (view 7), deep swimming (view 8). Sets appropriate global105 state values. |
| TODO | Background | `peacockActions` (via gfReg) | Random 40% chance on room init | Creates a peacock actor that wanders around the beach area. Cycles through display and movement states. |
| TODO | Interaction | `getFeather` (via gfReg) | Player uses get/feather command | Plays animation of player picking up the peacock feather, awards 2 points, sets global182 flag, and removes the feather from the ground. |
| TODO | Interaction | `drinking` (via beachReg) | Player uses drink command while on appropriate terrain | Plays drinking animation, displays message about salty water, then returns player to normal state. |
| TODO | Background | `Gull_Region` init | Automatic when global100 is false | Spawns 2 seagull actors that wander within the upper portion of beach rooms. |
## Technical Notes
- **Room Number**: 34
- **Picture**: 34 (134 if global100 is set - nighttime variant)
- **Region**: Beach/Garden Island
- **Exits**: North→31 (Palace), East→35 (Island east), West→33 (Beach west)
- **Music**: Unknown
- **Regions Applied**: 505 (gfReg - Garden/Feather), 501 (waterReg - Water/Swimming), 503 (beachReg - Beach interactions), 504 (Gull Region - Seagulls)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | `0`, `1` | Nighttime flag - changes room picture and sky descriptions |
| `global101` | `0` | Room-specific state (set to 0 in init) |
| `global105` | `0-4` | Water/terrain state: 0=land, 1=shallow, 2=shallow, 3=more water, 4=swimming |
| `global182` | `0`, `1` | Feather collected flag - set to 1 after picking up feather |
| `global204` | `0`, `1` | Drinking in progress flag |
| `global223` | `0`, `1` | Seagulls spawn flag - enables gull actors when true |
### Synonyms
- `ocean` = `seawater` = `ocean` (from gfReg and beachReg)
- Island garden area with palace visible from beach

View File

@@ -0,0 +1,45 @@
# Room 35: Island Beach
This is the sandy beach of a secluded island. The room serves as a transition area connecting to the palace grounds to the north (Room 31), the main land to the west (Room 34), and extends east toward another part of the island (Room 38). The south edge leads into the ocean (Room 41). Animated ocean waves lap at the shore, creating atmosphere. The room offers views of the ivory palace that towers from the island's center.
## Look Description
"You stare out at the ocean and the white sand beach of this secluded island. From the middle of the island, a majestic ivory palace towers, surrounded by a lovely manicured garden."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look room` / `look island` | "You stare out at the ocean and the white sand beach of this secluded island. From the middle of the island, a majestic ivory palace towers, surrounded by a lovely manicured garden." |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | waveActions | Continuous (automatic on init) | Animates three ocean wave props (wave1, wave2, wave3) in sequence. Creates looping wave animation by cycling cel and hiding/showing wave views. Runs continuously while in room. |
## Technical Notes
- **Room Number**: 35
- **Picture**: 35 (or 135 if `island_visited = true`)
- **Region**: Multiple (505, 501, 503, 504 - likely beach/palace island regions)
- **Exits**: North→31 (palace interior), South→38 (east side of island) / 41 (ocean), West→34 (mainland beach), East→38
- **Horizon**: 80
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | `0`, `1` | If set, uses picture 135 instead of 35 (room visited state) |
| `global101` | `0` | Initialized to 0, appears to track some room state |
### Additional Technical Details
- Entry from Room 38 (south/east): Positions player at x=93, y=187
- Entry from Room 41: Different positioning based on player's current view (swimming, walking, etc.) - calls viewer doit method to adjust position
- Entry from Room 31 (north): Checks if ego is above horizon, positions accordingly
- Entry from Room 34 (west): Places player at x=1 (left edge)
- Wave animations use three separate Props (wave1, wave2, wave3) with view 662, each on different loops
- The waveActions script manages a continuous cycling animation through the wave list
- Room uses regions 505, 501, 503, 504 for shared island/palace logic
- Player edge detection: south edge triggers room 38 or 41 depending on x position; east edge triggers room 31; west edge triggers room 34; north edge (horizon) triggers room 31

View File

@@ -0,0 +1,91 @@
# Room 36: Island Garden Pond
## High-Level Summary
Room 36 is the enchanted island garden location in King's Quest IV, featuring a serene pond with a swan, an arched bridge, and the ivory palace nearby. The room contains multiple animated background elements including water features and birds. Players can interact with various garden elements, observe wildlife (swan, parrots), and drink from the pond. The room serves as a transitional area connecting to other locations (north to room 33, south to room 39, east to room 37).
## Look Description
"You are standing in the lovely garden of this enchanted island. Beside you, rises a grand ivory palace. Within this garden, a bridge, emblazoned with the figures of swans, arches over a little pond. A beautiful white swan floats serenely upon it."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Action | `enter/capture/fish`, `fish[/!*]`, `cast/pole` | "You don't see any fish here." |
| TODO | Look | `look [<in]/lake,water` | "You peer down into the pond, but do not see anything of interest." |
| TODO | Look | `look [<under]/bridge` | "There is nothing of interest under the bridge." |
| TODO | Look | `look /beach` | "You can see the beach in the distance." |
| TODO | Look | `look /bush` | "A lovely hedge surrounds this island garden." |
| TODO | Look | `look /dirt` | "You see nothing but grass on the ground." |
| TODO | Look | `look /grass` | "The grass looks well-tended and manicured." |
| TODO | Look | `look /flora` | "The foliage grows luxuriantly here." |
| TODO | Look | `look /blossom` | "You see lovely beds of well-tended flowers." |
| TODO | Look | `look /forest` | "You see many unusual and lovely trees on this island." |
| TODO | Look | `look /garden` | "The beautiful garden gives you a sense of peaceful serenity." |
| TODO | Look | `look /lake,water` | "A lovely bridge is reflected in the mirror-like, little pond. A majestic white swan floats upon it." |
| TODO | Look | `look /bridge` | "The swan-carved bridge arches elegantly over the little pond." |
| TODO | Look | `look /path` | "A nice flagstone path circles the pond." |
| TODO | Look | `look /bench` | "A garden bench rests near the small pond." |
| TODO | Look | `look /castle` | "The lovely ivory palace rises majestically beside you." |
| TODO | Look | `look /ocean` | "You can see the ocean in the distance." |
| TODO | Look | `look /swan` | "A beautiful white swan floats gracefully upon the little pond." |
| TODO | Look | `look /parrot,bird,cockatoo` | "There are many exotic birds on this island." |
| TODO | Look | `look [<around][/room,island]` | "You are standing in the lovely garden of this enchanted island. Beside you, rises a grand ivory palace. Within this garden, a bridge, emblazoned with the figures of swans, arches over a little pond. A beautiful white swan floats serenely upon it." |
| TODO | Get | `get,capture/bird,parrot,cockatoo` | "That wouldn't accomplish anything." |
| TODO | Talk | `converse/bird,parrot,cockatoo` | "Polly want a cracker?" |
| TODO | Get | `get/blossom` | "It would waste your precious time to stop and pick flowers." |
| TODO | Action | `wade,bathe,dive` | "You don't want to disturb the serenity of the pond." |
| TODO | Get | `get/water` | "There's no reason to carry water." |
| TODO | Action | `drink`, `get/drink` | Triggers drinking animation and message: "You bend over and take a drink of the pond water. Yuck! It may look pretty, but it doesn't taste very good!" |
| TODO | Action | `sit` | "Not now! You have too many things to do." |
| TODO | Talk | `converse/swan` | "You can't talk to a swan!" |
| TODO | Talk | `converse/parrot,bird,cockatoo` | "Polly want a cracker!" |
| TODO | Get | `get,capture/swan` | "You don't need the swan." |
| TODO | Action | `kiss` | "There's no need for that." |
| TODO | Inventory | `deliver` (with any item) | "That wouldn't accomplish anything." |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | Ego_drinking_water | Player commands "drink" or "get drink" near water | Plays drinking animation (view 21), displays message about pond water taste, then returns ego to normal state |
## Technical Notes
- **Room Number**: 36
- **Picture**: 36 (or 136 if global100 is set - likely night variant)
- **Region**: 505
- **Exits**: north→33, south→39, east→37
- **Horizon**: 82
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | 0 | Local room state flag |
| `global100` | 0, non-zero | If set, changes picture to 136 (night variant) |
| `gPrevRoomNum` | 33, 39 | Previous room number - determines ego entry position |
### Animation Objects
| Object | View | Loop | Cel | Description |
|--------|------|------|-----|-------------|
| newProp | 663 | 0 | 1 | Animated water feature at position 114,68 |
| newProp_2 | 663 | 1 | 1 | Animated water feature at position 23,81 |
| newProp_3 | 663 | 2 | 3 | Animated water feature at position 12,93 |
| newProp_4 | 650 | 5 | 0 | Animated vegetation at position 156,118 |
| newProp_5 | 650 | 6 | 3 | Animated vegetation at position 218,130 |
| newProp_6 | 341 | 4 | 2 | Animated bird at position 84,30 |
| newAct | 345 | - | - | Wandering actor (parrot) with Wander motion |
### Synonyms
- lake = pool = lake
### Special Mechanics
- Water proximity check: `proc0_2` checks if ego is near water (returns $0002 bit when near water)
- Entry script: `Ego_drinking_water` runs on room init to handle automatic drinking behavior
- Picture variant: If global100 is set, picture changes from 36 to 136 (night-time version)
- Actor movement: Parrot (newAct) wanders randomly using `Wander` motion

View File

@@ -0,0 +1,76 @@
# Room 37: Fairy Island
This is the exterior entrance to Genesta's palace on the island. The room features a small island garden surrounded by ocean, with a palace door leading north to the palace interior (Room 47). Two small fairies hover near the palace door, guarding it. The player enters from the west (Room 36), east (Room 38), or south (Room 40). Looking around reveals the island's features: a hedge garden, flagstone path to the door, ocean views, and the ivory palace.
## Look Description
"Genesta's tiny fairies guard the palace door."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look bush` | "A lovely hedge surrounds this island garden." (Print 37 1) |
| TODO | Look | `look dirt` | "You see nothing but grass on the ground." (Print 37 2) |
| TODO | Look | `look grass` | "The grass looks well-tended and manicured." (Print 37 3) |
| TODO | Look | `look flora` / `look foliage` | "The foliage grows luxuriantly here." (Print 37 4) |
| TODO | Look | `look blossom` / `look flower` | "You see lovely beds of well-tended flowers." (Print 37 5) |
| TODO | Look | `look forest` / `look tree` | "You see many unusual and lovely trees on this island." (Print 37 6) |
| TODO | Look | `look garden` | "The beautiful garden gives you a sense of peaceful serenity." (Print 37 7) |
| TODO | Look | `look castle` / `look palace` | "The lovely ivory palace rises majestically before you." (Print 37 8) |
| TODO | Look | `look beach` | "You can see the beach in the distance." (Print 37 9) |
| TODO | Look | `look ocean` / `look water` | "You can see the ocean in the distance." (Print 37 10) |
| TODO | Look | `look door` | "It's an elegant door." (Print 37 11) |
| TODO | Look | `look fairy` / `look fairies` | "Two small fairies hover protectively above the palace door." (Print 37 12) |
| TODO | Look | `look bird` | "There are many exotic birds on this island." (Print 37 13) |
| TODO | Look | `look path` | "A nice flagstone path leads to the palace door." (Print 37 14) |
| TODO | Look | `look` / `look around` / `look room` / `look island` | "Before you, the palace door beckons, flanked on both sides by lilac shrubs." (Print 37 15) |
| TODO | Get | `get blossom` / `get flower` | "It would waste your precious time to stop and pick flowers." (Print 37 16) |
| TODO | Action | `open door` (when in range) | Opens door, plays door sound, transitions to Room 47 |
| TODO | Action | `open door` (when not in range) | "You can't get close enough." (Print 37 17) |
| TODO | Action | `kiss` / `kiss fairy` / `kiss fairies` | "You can't get close enough." (Print 37 17) |
| TODO | Talk | `converse` / `converse fairy` / `converse fairies` | "You speak to the little fairies, but they do not respond. Perhaps, they cannot talk." (Print 37 18) |
| TODO | Action | `bang` (when in range) | "The tiny fairies watch you closely." (Print 37 19) |
| TODO | Action | `bang` (when not in range) | "You're not close enough." (Print 37 20) |
| TODO | Action | `get fairy` / `capture fairy` / `get fairies` / `capture fairies` | "It is impossible to obtain a fairy." (Print 37 21) |
| TODO | Inventory | `deliver [item]` (if player has item) | "The small fairies don't need anything." (Print 37 22) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | door | Player opens door in range (x: 140-180, y: 93-103) | Plays door sound, animates door opening, transitions to Room 47 |
| TODO | Background | newAct | Continuous | Fairy 1 (view 110) wanders around the palace door area |
| TODO | Background | newAct_2 | Continuous | Fairy 2 (view 114) wanders around the palace door area |
## Technical Notes
- **Room Number**: 37
- **Picture**: 37 (137 if dark mode/global100 is set)
- **Region**: 505 (Genesta's Palace Fairy)
- **Exits**: North→47 (Palace Interior), South→40, East→38, West→36
- **Music**: Fairie theme (sound #33, looping)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | `0`, `1` | Night mode flag - changes room picture to 137 when set |
| `global101` | `0` | Reset to 0 on room entry |
### Entry Points
| From Room | Position | Notes |
|-----------|----------|-------|
| Room 47 (north) | x:159, y:95+ | At palace door |
| Room 36 (west) | x:1, maintain y | From left side of island |
| Room 38 (east) | x:317, maintain y | From right side of island |
| Room 40 (south) | x:157, y:188 | From beach/south entrance |
### Objects
| Object | View | Description |
|--------|------|-------------|
| door | 613 | Palace door (animated, leads to Room 47) |
| newAct (fairy 1) | 110 | Wandering fairy near door |
| newAct_2 (fairy 2) | 114 | Wandering fairy near door |

View File

@@ -0,0 +1,72 @@
# Room 38: Island Garden
This is an exterior garden area on a tropical island near the ivory palace. The room features decorative animated elements (possibly fountain or statue elements), birds that wander the garden, well-maintained grass and flora, a flagstone path, and a statue with dolphins. The player can explore various features of the garden but cannot interact with the birds or pick flowers.
## Look Description
"You are roaming through the wonderful island garden. Towering beside you is an enchanting ivory palace. You see an interesting statue within this part of the garden."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look /bush` | "A lovely hedge surrounds this island garden." (Print 38 0) |
| TODO | Look | `look /beach` | "You can see the beach in the distance." (Print 38 1) |
| TODO | Look | `look /dirt` | "You see nothing but grass on the ground." (Print 38 2) |
| TODO | Look | `look /grass` | "The grass looks well-tended and manicured." (Print 38 3) |
| TODO | Look | `look /flora` | "The foliage grows luxuriantly here." (Print 38 4) |
| TODO | Look | `look /blossom` | "You see lovely beds of well-tended flowers." (Print 38 5) |
| TODO | Look | `look /forest` | "You see many unusual and lovely trees on this island." (Print 38 6) |
| TODO | Look | `look /garden` | "The beautiful garden gives you a sense of peaceful serenity." (Print 38 7) |
| TODO | Look | `look /path` | "A nice flagstone path circles the statue." (Print 38 8) |
| TODO | Look | `look /castle` | "The lovely ivory palace rises majestically beside you." (Print 38 9) |
| TODO | Look | `look /ocean` | "You can see the ocean in the distance." (Print 38 10) |
| TODO | Look | `look /bird` | "There are many exotic birds on this island." (Print 38 11) |
| TODO | Look | `look /monument` / `look /dolphin` | "Depicted in the statue: a pair of dolphins leap gracefully from a wave." (Print 38 12) |
| TODO | Look | `look [around]` / `look [/island]` / `look [/room]` | "You are roaming through the wonderful island garden. Towering beside you is an enchanting ivory palace. You see an interesting statue within this part of the garden." (Print 38 13) |
| TODO | Talk | `converse /bird` | "Cheep, cheep!" (Print 38 14) |
| TODO | Get | `capture /bird` / `get /bird` | "You can't catch the birds." (Print 38 15) |
| TODO | Action | `kiss /bird` | "You'd have to catch the bird first." (Print 38 16) |
| TODO | Get | `get /blossom` | "It would waste your precious time to stop and pick flowers." (Print 38 17) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | (unnamed Prop 1) | Continuous | Animated prop with view 662, loop 3, at position 199, 74 - cycles forward continuously |
| TODO | Background | (unnamed Prop 2) | Continuous | Animated prop with view 662, loop 4, at position 303, 98 - cycles forward continuously |
| TODO | Background | (unnamed Extra 1) | Continuous | Extra bird animation with view 341, loop 2, at position 243, 37 - random pause cycling |
| TODO | Background | (unnamed Extra 2) | Continuous | Extra bird animation with view 341, loop 3, at position 214, 26 - random pause cycling |
## Technical Notes
- **Room Number**: 38
- **Picture**: 38 (or 138 if `global100` is set)
- **Region**: 505 (Island Garden)
- **Exits**: North→35, South→41, West→37
- **Horizon**: 74
- **Music**: None specified
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | 0 | Room-specific state (initialized to 0) |
| `global100` | 0, non-zero | If set, room uses alternate picture 138 |
### Entry Points
| Direction | Position | Condition |
|-----------|-----------|-----------|
| From North (Room 35) | x: 196, y: 78 | Player enters from north |
| From South (Room 41) | x: 159, y: 187 | Player enters from south |
### Additional Technical Details
- Room sets `global101` to 0 on init
- Room uses Region 505 for shared island/palace logic
- Two Extra objects provide bird animations with random cycling behavior
- Two Prop objects provide continuous decorative animations
- Player starts with view 2, xStep 3, yStep 2 (normal walking)
- If entering from room 35, player positioned at x:196 y:78
- If entering from room 41, player positioned at x:159 y:187

View File

@@ -0,0 +1,80 @@
# Room 39: Island Beach
This is the beach of an exotic island where a magnificent ivory palace rises in the center, surrounded by a beautiful garden. The room features animated ocean waves and serves as the main entrance to the island. Players can look at the beach, ocean, and palace from here. The room provides access to the island interior (rooms 33/36), the beach to the west (room 31), the beach to the east (room 32), and a dock area to the east (room 40).
## Look Description
"You see a sparkling, sand beach of an exotic island. Before you, in the center of the island, a wonderful ivory palace rises. A lovely garden surrounds the palace."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look room` / `look` / `look island` | "You see a sparkling, sand beach of an exotic island. Before you, in the center of the island, a wonderful ivory palace rises. A lovely garden surrounds the palace." (Print 39 0) |
| TODO | Look | `look beach` | From Region 505: "The ocean water laps gently upon the sandy beach of the island." (Print 505 1) or "Something catches your eye! Why, it's a beautiful peacock feather!" (Print 505 0) if feather present |
| TODO | Look | `look ocean` / `look water` | From Region 503: "The wide, blue ocean disappears into the horizon to the west." (Print 503 2) |
| TODO | Look | `look under/ocean` / `look under/water` | From Region 503: "You look under the water, and see nothing but...more water!" (Print 503 0) |
| TODO | Look | `look sky` / `look up` | From Region 503: "The bright, blue sky seems to merge as one with the vast ocean before you." (Print 503 5) or "It's easy to see by the light of a full moon." (Print 503 6) at night |
| TODO | Look | `look dirt` / `look down` | From Region 503: "You see nothing but sandy soil." (Print 503 7) |
| TODO | Look | `look palace` / `look castle` | From Region 505: "An enchanting ivory palace, encircled by a luxuriant garden, rises from the center of this secluded island." (Print 505 18) |
| TODO | Look | `look garden` | From Region 505: "A splendid garden surrounds the magnificent ivory palace." (Print 505 17) |
| TODO | Look | `look grass` | From Region 505: "Lush green grass carpets this magical island." (Print 505 14) |
| TODO | Look | `look blossom` / `look flower` | From Region 505: "Beautiful flowers seem to flourish here." (Print 505 16) |
| TODO | Look | `look bush` / `look hedge` | From Region 505: "A low hedge borders the lovely garden." (Print 505 15) |
| TODO | Look | `look tree` / `look forest` | From Region 505: "There are many beautiful trees in this garden setting." (Print 505 13) |
| TODO | Look | `look boulder` | From Region 505: "You don't see many rocks." (Print 505 12) |
| TODO | Look | `look peacock` | From Region 505: "A majestic peacock, with a beautiful tail, struts by." (Print 505 19) if peacock present |
| TODO | Look | `look feather` | From Region 505: "You see a beautiful peacock feather lying upon the beach." (Print 505 2) if feather present, or "You don't see one here." (Print 505 3) |
| TODO | Look | `look gull` / `look bird` | From Region 504: "You see many seagulls gliding through the air in their never-ending quest for food." (Print 504 0) |
| TODO | Look | `look fish` | From Region 503: "You don't see any fish right now." (Print 503 3) or fish item description if player has fish |
| TODO | Get | `get feather` | From Region 505: Player can pick up peacock feather if near it (Print 505 0) |
| TODO | Get | `get blossom` / `get flower` | From Region 505: "It would waste your precious time to stop and pick flowers." (Print 505 24) |
| TODO | Get | `get water` | From Region 503: "You have no reason to carry water." (Print 503 14) |
| TODO | Get | `get gull` / `get bird` | From Region 504: "You can't catch a seagull." (Print 504 2) |
| TODO | Action | `converse/peacock` | From Region 505: "Peacocks don't talk!" (Print 505 22) |
| TODO | Action | `talk/gull` / `talk/bird` | From Region 504: "Seagulls don't talk." (Print 504 1) |
| TODO | Action | `kiss/gull` / `kiss/bird` | From Region 504: "You can't kiss a seagull." (Print 504 3) |
| TODO | Action | `feed/gull` / `feed/bird` | From Region 504: "The seagulls are not interested." (Print 504 4) |
| TODO | Action | `climb/tree` | From Region 505: "It is difficult to climb trees while wearing that dress!" (Print 505 21) |
| TODO | Action | `capture/peacock` | From Region 505: "You don't need the peacock." (Print 505 25) |
| TODO | Action | `capture/gull` / `capture/bird` | From Region 504: "You can't catch a seagull." (Print 504 2) |
| TODO | Action | `drink` | From Region 503: Player can drink water if in water (swimming) - "YUCK!! This water's too salty!" (Print 503 15) or drinking animation |
| TODO | Action | `bathe` / `dive` / `wade` | From Region 503: Player enters swimming mode if in water |
| TODO | Action | `fish` | From Region 503: Requires fishing pole (item 17) to fish |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | waveActions | Continuous | Animates three wave props (wave1, wave2, wave3) cycling through their cels to create wave motion effect |
| TODO | Interaction | getFeather | Player uses `get feather` command near peacock feather | Player performs picking up animation, feather is added to inventory, score increases by 2, feather view is removed from beach |
| TODO | Background | peacockActions | Continuous when peacock is present | Controls peacock wandering behavior - displays view, cycles through animations, uses wandering motion |
## Technical Notes
- **Room Number**: 39
- **Picture**: 39
- **Region**: Island/Garden (505), Beach (503), Water (501), Gull (504)
- **Exits**: North→33 (if x ≤ 292) or 36 (if x > 292), South→32, East→40, West→31
- **Music**: None specified
- **Horizon**: 94
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | `0` | Room-specific state (initialized to 0) |
| `global105` | `0-4` | Player terrain state: 0=land, 1=shallow, 2=medium, 3=deep, 4=swimming |
| `global182` | `0`, `1` | Feather collected flag - set to 1 after player collects peacock feather |
| `global100` | `0`, `1` | Night time flag - affects sky description and gull visibility |
| `global120` | various | Timer/dialog reference for drinking animation |
### Additional Technical Details
- Room applies regions: 505 (gfReg), 501 (WaterReg), 503 (BeachReg), 504 (Gull Region)
- Three wave props (wave1, wave2, wave3) with view 663 create animated ocean waves
- Peacock may spawn in this room (40% chance) with view 336/337
- Peacock feather may be present on beach if player hasn't collected it (moves to room when owned by 888)
- Player entry position varies based on previous room and player view (swimming vs land)
- Water region (501) automatically changes player view based on terrain: view 2=land, 5=shallow, 6=medium, 7=deep, 8=swimming
- Region synonyms: `ocean` = `seawater`

View File

@@ -0,0 +1,78 @@
# Room 40: Island Beach (East)
This is the eastern beach of an exotic island where a magnificent ivory palace rises in the center, surrounded by a beautiful garden. The room features animated ocean waves and provides access to the beach to the west (room 39), the dock area to the east (room 41), the beach to the south (room 32), and the island interior to the north (room 37).
## Look Description
"You have found yourself upon a most beautiful and exotic island. In the center of this island, a wondrous ivory palace towers. Behind you, the azure ocean washes gently upon the island's sparkling beach."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look room` / `look` / `look island` / `look[<around][/room,island]` | "You have found yourself upon a most beautiful and exotic island. In the center of this island, a wondrous ivory palace towers. Behind you, the azure ocean washes gently upon the island's sparkling beach." (Print 40 0) |
| TODO | Look | `look beach` | From Region 505: "The ocean water laps gently upon the sandy beach of the island." (Print 505 1) |
| TODO | Look | `look ocean` / `look water` | From Region 503: "The wide, blue ocean disappears into the horizon to the east." (Print 503 2) |
| TODO | Look | `look under/ocean` / `look under/water` | From Region 503: "You look under the water, and see nothing but...more water!" (Print 503 0) |
| TODO | Look | `look sky` / `look up` | From Region 503: "The bright, blue sky seems to merge as one with the vast ocean before you." (Print 503 5) or "It's easy to see by the light of a full moon." (Print 503 6) at night |
| TODO | Look | `look dirt` / `look down` | From Region 503: "You see nothing but sandy soil." (Print 503 7) |
| TODO | Look | `look palace` / `look castle` | From Region 505: "An enchanting ivory palace, encircled by a luxuriant garden, rises from the center of this secluded island." (Print 505 18) |
| TODO | Look | `look garden` | From Region 505: "A splendid garden surrounds the magnificent ivory palace." (Print 505 17) |
| TODO | Look | `look grass` | From Region 505: "Lush green grass carpets this magical island." (Print 505 14) |
| TODO | Look | `look blossom` / `look flower` | From Region 505: "Beautiful flowers seem to flourish here." (Print 505 16) |
| TODO | Look | `look bush` / `look hedge` | From Region 505: "A low hedge borders the lovely garden." (Print 505 15) |
| TODO | Look | `look tree` / `look forest` | From Region 505: "There are many beautiful trees in this garden setting." (Print 505 13) |
| TODO | Look | `look boulder` | From Region 505: "You don't see many rocks." (Print 505 12) |
| TODO | Look | `look gull` / `look bird` | From Region 504: "You see many seagulls gliding through the air in their never-ending quest for food." (Print 504 0) |
| TODO | Look | `look fish` | From Region 503: "You don't see any fish right now." (Print 503 3) |
| TODO | Get | `get feather` | From Region 505: "You don't see one here." (Print 505 3) - feather only in room 39 |
| TODO | Get | `get blossom` / `get flower` | From Region 505: "It would waste your precious time to stop and pick flowers." (Print 505 24) |
| TODO | Get | `get water` | From Region 503: "You have no reason to carry water." (Print 503 14) |
| TODO | Get | `get gull` / `get bird` | From Region 504: "You can't catch a seagull." (Print 504 2) |
| TODO | Action | `talk/gull` / `talk/bird` | From Region 504: "Seagulls don't talk." (Print 504 1) |
| TODO | Action | `kiss/gull` / `kiss/bird` | From Region 504: "You can't kiss a seagull." (Print 504 3) |
| TODO | Action | `feed/gull` / `feed/bird` | From Region 504: "The seagulls are not interested." (Print 504 4) |
| TODO | Action | `climb/tree` | From Region 505: "It is difficult to climb trees while wearing that dress!" (Print 505 21) |
| TODO | Action | `capture/gull` / `capture/bird` | From Region 504: "You can't catch a seagull." (Print 504 2) |
| TODO | Action | `drink` | From Region 503: Player can drink water if in water (swimming) - "YUCK!! This water's too salty!" (Print 503 15) |
| TODO | Action | `bathe` / `dive` / `wade` | From Region 503: Player enters swimming mode if in water |
| TODO | Action | `fish` | From Region 503: Requires fishing pole (item 17) to fish |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | waveActions | Continuous | Animates two wave props (wave1, wave2) cycling through their cels to create wave motion effect. Uses a list to manage wave objects. When global223 is set, skips initial addToPic and cycles through cels continuously. |
## Technical Notes
- **Room Number**: 40
- **Picture**: 40
- **Region**: Island/Garden (505), Beach (503), Water (501), Gull (504)
- **Exits**: North→37, South→32, East→41, West→39
- **Music**: None specified
- **Horizon**: 98
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | `0` | Room-specific state (initialized to 0 in this room) |
| `global105` | `0-4` | Player terrain state: 0=land, 1=shallow, 2=medium, 3=deep, 4=swimming |
| `global100` | `0`, `1` | Night time flag - affects sky description and gull visibility |
| `global223` | `0`, `1` | Wave animation control - when set, skips initial addToPic and runs continuous animation |
### Additional Technical Details
- Room applies regions: 505 (gfReg), 501 (WaterReg), 503 (BeachReg), 504 (Gull Region)
- Two wave props (wave1, wave2) with view 664 create animated ocean waves at positions (40,177) and (280,177)
- Extra prop (newProp) at position (61,84) with view 650, loop 2, cel 2 - appears to be some decorative element
- View object (newView) at position (156,77) with view 613, loop 1, cel 0 - likely a tree or palm on the beach
- Player entry position varies based on previous room:
- From room 32 (south): x=160, y=188
- From room 39 (west): x=1, y=player y
- From room 41 (east): x=318, y=player y
- From room 37 (north): x=158, y=horizon + yStep + 1
- Water region (501) automatically changes player view based on terrain: view 2=land, 5=shallow, 6=medium, 7=deep, 8=swimming
- Region synonyms: `ocean` = `seawater`
- global101 is set to 0 on room init

View File

@@ -0,0 +1,67 @@
# Room 41: Island Shore
The island shore serves as the gateway to the magical island. This coastal room features gentle wave animations along the shoreline and connects to multiple destinations: the ivory palace to the north (room 35), the dock area to the east (room 31), another beach area to the west (room 40), and a southern coastal area (room 32). The dominant feature visible from this room is the splendid ivory palace that dominates the island's center.
## Look Description
"The beautiful blue ocean washes gently upon the shore of the magical island. Dominating the center of this island is a splendid ivory palace."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look/island` | "The beautiful blue ocean washes gently upon the shore of the magical island. Dominating the center of this island is a splendid ivory palace." (Print 41 0) |
| TODO | Look | `look/around` | "The beautiful blue ocean washes gently upon the shore of the magical island. Dominating the center of this island is a splendid ivory palace." (Print 41 0) |
| TODO | Look | `look/room` | "The beautiful blue ocean washes gently upon the shore of the magical island. Dominating the center of this island is a splendid ivory palace." (Print 41 0) |
| TODO | Look | `look[<around>][!*]` | "The beautiful blue ocean washes gently upon the shore of the magical island. Dominating the center of this island is a splendid ivory palace." (Print 41 0) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | waveActions_a | Continuous on room init | Initializes wave animation by adding wave props to picture, then cycles through each wave sequentially, showing and hiding cels to create gentle wave motion effect |
| TODO | Background | waveActions_b | Continuous (alternate animation) | Similar to waveActions_a but conditionally runs based on global223 flag - when global223 is true, cycles through wave animation; otherwise adds waves to picture statically |
| TODO | Background | Room doit | Continuous | Checks player position on control areas - if heading north (0-90 or 270-360 degrees) and on control area $0040, transitions to room 35; if on control area $0010, transitions to room 38 |
## Technical Notes
- **Room Number**: 41
- **Picture**: 41
- **Region**: 505, 501, 503, 504
- **Exits**: North→35 (palace), South→32, East→31 (dock), West→40
- **Horizon**: 80
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global223` | `0`, `1` | Time-based flag controlling wave animation behavior - alternate script uses this to determine whether to cycle animations or display static waves |
| `gEgoOnControl` | bitmask | Control area detection under player position |
| `local1` | number | Wave animation counter used to iterate through wave list |
### Entry Points
| Source Room | Condition | Position |
|-------------|-----------|----------|
| 38 | default | x: 19 y: 99 |
| 35 | view = 2 (normal) | posn: 182 112 |
| 35 | view = 5 | posn: 186 112 |
| 35 | view = 6 | posn: 186 112 |
| 35 | view = 7 | posn: 201 112 |
| 35 | view = 8 (swimming) | posn: 237 112 |
| 31 | default | x: 318 y: 110 |
| 32 | default | x: 138 y: 188 |
| 40 | default | x: 1 (preserve y) |
### Control Areas
- `$0040` - North transition zone: triggers room 35 (palace entrance)
- `$0010` - Water zone: triggers room 38 (waterfall/water area)
### Wave Objects
| Name | View | Loop | Initial Cel | Position |
|------|------|------|-------------|----------|
| wave1 | 664 | 0 | 3 | 150, 125 |
| wave2 | 664 | 1 | 2 | 112, 165 |
| wave3 | 664 | 2 | 3 | 37, 175 |

View File

@@ -0,0 +1,109 @@
# Room 42: Fisherman's Shack (Inside)
This is the interior of the fisherman's cottage, a small, shabby room containing the old fisherman and his wife. The room serves as a key location for obtaining the fishing pole, which is required to complete the game. The player can interact with both NPCs, give them the pouch of diamonds (rewarded for completing the diamond mine puzzle), and receive the fishing pole in return. The room's state changes based on whether the diamonds have been given, whether the fisherman is present, and whether the player has already received the pole.
## Look Description
"The inside of the fisherman's shack looks almost as shabby as the outside."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look[<around][/room,room,place]` | "The inside of the fisherman's shack looks almost as shabby as the outside." (text_042.txt:1) |
| TODO | Look | `look/person` (when fisherman present) | "Both a man and a woman are here. Be more specific." (text_042.txt:2) |
| TODO | Look | `look/people` | Returns either "There is only one person here." (text_042.txt:2) or fisherman description based on state |
| TODO | Look | `look/fishwife,person` | Various responses based on state (diamonds given, pole owned) - text_042.txt:3-7 |
| TODO | Look | `look/dough[<bread]` | "It just looks like plain old bread dough." (text_042.txt:8) |
| TODO | Look | `look<under/table` | "There is nothing of interest under the table." (text_042.txt:9) |
| TODO | Look | `look/table` | "It looks like an old worn table." (text_042.txt:10) |
| TODO | Look | `look/chair` | "Yep, those are chairs, all right!" (text_042.txt:11) |
| TODO | Look | `look<under/bed` | "There is nothing under the bed." (text_042.txt:12) |
| TODO | Look | `look/bed` | "The lumpy bed looks old and uninviting." (text_042.txt:13) |
| TODO | Look | `look/stove` | "At least the stove keeps it warm in here." (text_042.txt:14) |
| TODO | Look | `look/window` | "You see the ocean out the window." or "You see the meadow out the window." based on position (text_042.txt:15-16) |
| TODO | Look | `look/door` | "This is a plain wooden door." (text_042.txt:17) |
| TODO | Look | `look/wall` | "There is nothing of importance on the walls." (text_042.txt:18) |
| TODO | Look | `look/dirt` or `look<down` | "There is nothing of interest on the floor." (text_042.txt:19) |
| TODO | Look | `look/pole` | "Yep. It's there, all right!" or "What pole?" based on state (text_042.txt:20-21) |
| TODO | Look | `look/fisherman` | Various responses based on state (text_042.txt:22-25) |
| TODO | Look | `look/caldron,kettle,coffee` | "The smell of hot coffee fills the room." (text_042.txt:26) |
| TODO | Look | `look/fish` | "You see a large fish hanging on the wall." or allows get if not owned (text_042.txt:27) |
| TODO | Look | `look/shelf` | "You see a cupboard filled with canned goods." (text_042.txt:28) |
| TODO | Look | `look/can` | "These poor people can only afford a few cheap cans of food." (text_042.txt:29) |
| TODO | Look | `look/knitting` | "You're not interested in the knitting." or "What knitting?" based on state (text_042.txt:30-31) |
| TODO | Action | `chew/dough` | "You don't like it." (text_042.txt:32) |
| TODO | Action | `rob/pole` | "You are not a thief, Rosella!" or other responses based on pole location (text_042.txt:33-34) |
| TODO | Action | `kiss[/!*]` | "Please be more specific as to whom you want to kiss!" or responses based on fisherman presence (text_042.txt:34-37) |
| TODO | Action | `kiss/fisherman` | "You think, for a moment, that it might help, but then change your mind." or "There ain't no fisherman here!" (text_042.txt:37-38) |
| TODO | Action | `help` | "How can you do that, Rosella?!" (text_042.txt:39) |
| TODO | Talk | `converse/fishwife,person` or `converse[/!*]` (near wife) | Triggers wife dialogue scripts based on state |
| TODO | Talk | `converse/fisherman` or `converse[/!*]` (near fisherman) | Triggers fisherman dialogue if present |
| TODO | Talk | `converse[/!*]` (general) | Routes to appropriate dialogue based on NPCs present |
| TODO | Action | `close,open/door` | "There's no need for that." (text_042.txt:41) |
| TODO | Action | `sit` | "You don't have time for that!" (text_042.txt:42) |
| TODO | Action | `lay,sleep[<down,on,in]` or `get<in,on,in/bed` | "The lumpy bed looks old and uninviting." (text_042.txt:13) |
| TODO | Action | `drink,get/coffee,cup` | "You don't like coffee." (text_042.txt:43) |
| TODO | Inventory | `deliver` (give item) | Handles giving diamonds to wife or fisherman, triggers pole exchange |
| TODO | Get | `get,rob/knitting` | "No. It's not yours." (text_042.txt:49) |
| TODO | Get | `get,rob/pole` | "You can't take their fishing pole, as that's their only means of survival!" or "You already have the pole." (text_042.txt:50-51) |
| TODO | Get | `get,rob/dough` | "You have no need for bread dough." (text_042.txt:52) |
| TODO | Get | `get,rob/fishwife,person` | "You couldn't get the fisherman's wife." (text_042.txt:53) |
| TODO | Get | `get,rob/fisherman` | "You couldn't get the fisherman." (text_042.txt:54) |
| TODO | Get | `get,rob/caldron` | "You don't need it." (text_042.txt:55) |
| TODO | Get | `get,rob/can` | "You can't." (text_042.txt:56) |
| TODO | Get | `get,rob/fish` | "It's firmly attached to the wall." (text_042.txt:57) |
| TODO | Action | `create/bed` | "You don't have time for that." (text_042.txt:58) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | `doBread` | Running when wife is kneading bread (local9=1) | Cycles through bread kneading animation loops |
| TODO | Interaction | `givePole` | When player gives diamonds (item 1) to fisherman's wife | Animation of wife giving fishing pole to player, awards 3 points |
| TODO | Background | `wifeTalk` | Continuous when wife NPC is present | Cycles through wife animation (knitting or kneading) |
| TODO | Background | `fishermanSit` | Continuous when fisherman NPC is present | Cycles fisherman sitting animation |
| TODO | Interaction | `wifeTacoDoco` | Talking to wife when fisherman not present | Initial dialogue with tired wife |
| TODO | Interaction | `wifeTacoDoco1` | Talking to wife when fisherman IS present | Wife dialogue when fisherman is home |
| TODO | Interaction | `wifeTacoDoco2` | Talking to wife after giving diamonds | Grateful dialogue after receiving diamonds |
| TODO | Interaction | `fishermanTacoDoco1` | Talking to fisherman after giving diamonds | Grateful fisherman dialogue |
| TODO | Interaction | `fishermanTacoDoco2` | Talking to fisherman before giving diamonds | Fisherman complains about fishing luck |
## Technical Notes
- **Room Number**: 42
- **Picture**: 42
- **Region**: No specific region set
- **Exits**: South (edge hit) → Room 7 (outside cottage)
- **Music**: Not specified
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `local9` | `0`, `1` | Player has diamonds (item 1) - used to determine wife state (kneading bread vs knitting) |
| `global116` | `3` | Fisherman is home/present in cottage |
| `global182` | `0`, `1` | Fishing pole received flag - prevents re-awarding score |
| `global206` | Various | Conversation tracking for NPC dialogues |
### Inventory Items
- Item 1 (index 1): Pouch of diamonds - given to NPCs for fishing pole
- Item 17 (index 17): Fishing pole - obtained from fisherman after giving diamonds
- Item 24 (index 24): Fish - decorative item on wall (cannot be taken)
### Synonyms
- room = cottage
- shelf = cabinet
- fisherman = man
- fishwife = fishwife
### Special Mechanics
- Room automatically loads view 513 (cottage interior) on init
- If player has diamonds (item 1), loads additional views (240-243) for animated NPCs
- Edge detection at control area $0040 triggers exit to room 7 (south)
- When giving diamonds to wife, she walks to get pole and gives it to player
- Score change: +3 points when receiving fishing pole
- Chair block prevents player from walking behind the table area

View File

@@ -0,0 +1,107 @@
# Room 43: Desert Island
## Look Description
"You have found yourself stranded upon a desert island. Also, it seems, have others before you. Now, what are you going to do, Rosella?!"
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look[<around][/room]` | "You look in all directions, but can see no sign of land." (Print 43 14) |
| TODO | Look | `look/ocean,water` | "The blue ocean surrounds this small island. You look in all directions, but can see no sign of land." (Print 43 14) |
| TODO | Look | `look/beach` | "In this case, the beach and the island are one and the same!" (Print 43 15) |
| TODO | Look | `look/island` | "The small island is nothing more than a sand bar, decorated with two lonely palm trees...and various shipwrecks." (Print 43 11) |
| TODO | Look | `look/forest,flora,palm` | "Only one lonely palm grows here." (Print 43 19) |
| TODO | Look | `look/coconut` | "You don't see any coconuts." (Print 43 20) |
| TODO | Look | `look/boat,shipwreck` | Dynamic - shows glint if bridle is in room (Print 43 21) |
| TODO | Look | `look/dolphin` | Various responses based on dolphin presence and player state (Print 43 8/9/10) |
| TODO | Look | `look/pelican,bird` | Response varies based on pelican state (Print 43 22/23) |
| TODO | Look | `look/tamir` | "You can't see it from here." (Print 43 7) |
| TODO | Look | `look/fish` | Shows fish if in inventory, otherwise "You don't see any fish here." (Print 43 6) |
| TODO | Look | `look[<under]/water,ocean` | Response varies based on player swimming (Print 43 12/13) |
| TODO | Look | `look/dirt` / `look<down` / `look/in/boat,shipwreck` | Various responses about ground/shipwreck (Print 43 16/17/18) |
| TODO | Action | `bathe` | Response varies based on player view/state (Print 43 1/2/3/4) |
| TODO | Action | `get,drink/water` | Triggers drinking script if near water (Print 43 5 or 800 1) |
| TODO | Action | `fish` | "You don't see any fish here." (Print 43 6) |
| TODO | Action | `get,capture/fish` | "You don't see any fish here." (Print 43 6) |
| TODO | Action | `climb/forest,palm` | "It is difficult to climb trees while wearing that dress!" (Print 43 24) |
| TODO | Action | `deliver,fling,feed/fish` | Triggers pelican feeding sequence if conditions met (Print 43 25/26/27/28/29) |
| TODO | Action | `get,whistle/whistle` | Picks up whistle if close enough (Print 43 30 or 800 1) |
| TODO | Action | `mount/dolphin` | Mounts dolphin if close enough (Print 43 31 or 800 1) |
| TODO | Action | `play,whistle,blow/whistle` | Plays whistle and summons dolphin (Print 43 32/33) |
| TODO | Action | `get,capture/dolphin` | Various responses about dolphin (Print 43 44/45/10) |
| TODO | Action | `pat/dolphin` | Pets dolphin if close enough (Print 43 48 or 800 1) |
| TODO | Action | `kiss` | Response varies based on pelican/dolphin presence (Print 43 39/40) |
| TODO | Talk | `converse/pelican,bird` | "You feel silly trying to talk to a pelican!" (Print 43 34) |
| TODO | Talk | `converse/dolphin` | "You speak to the dolphin, and it chatters back." (Print 43 35) |
| TODO | Talk | `converse/bird,gull,gull` | No response (unhandled) |
| TODO | Talk | `converse` | "To whom?" (Print 43 36) |
| TODO | Talk | `feed/pelican,bird` | "You would have to catch the pelican first." (Print 43 37) |
| TODO | Inventory | `deliver/fish` to pelican | "The pelican has no interest in it." (Print 43 41) |
| TODO | Inventory | `deliver` to dolphin | "The dolphin has no interest in it." (Print 43 42) |
| TODO | Inventory | `deliver` (general) | "Please be more specific." (Print 43 43) |
| TODO | Inventory | `get/pelican,bird` | "You can try." (Print 43 38) |
| TODO | Inventory | `capture/pelican,bird` | "You would have to catch the pelican first." (Print 43 39) |
| TODO | Inventory | `deliver` (item not held) | "You don't have that." (Print 43 47) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | `waveScript` | Automatic, cyclic | Animates ocean waves at multiple positions around the island using view 670 |
| TODO | Interaction | `bridleActions` | Looking at shipwreck ground with bridle present | Player picks up the bridle, plays animation, scores points |
| TODO | Interaction | `pelActions` | Player has fish (item 24) | Manages pelican behavior - flying in, accepting fish, dropping whistle |
| TODO | Background | `pelMovement` | Pelican is in state 1 | Controls pelican idle movement animation |
| TODO | Interaction | `whistleActions` | After feeding pelican fish | Animates whistle appearing on ground |
| TODO | Interaction | `dolphActions` | Player plays whistle | Spawns dolphin, plays theme music, allows mounting |
| TODO | Background | `deathTimer` | Player in certain water zones | Kills player if they stay in "dangerous" water too long (quicksand/hazards) |
| TODO | Interaction | `drinking` | Player tries to drink water | Plays drinking animation, allows player to drink |
## Technical Notes
- **Room Number**: 43
- **Picture**: 43 (or 143 if global100 is set)
- **Region**: 501, 504
- **Exits**: North→31, South→31, East→31, West→31
- **Music**: Sound 35 (dolphinTheme), Sound 76 (whistle sound)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `local1` | 0-4 | Pelican state: 0=not present, 1=on island, 2=flying away, 3=eating fish, 4=fed |
| `local2` | Number | Count of pelican landing attempts |
| `local11` | 0, 1 | Whether player has whistle or fish in inventory |
| `local12` | 0, 1 | Death timer active flag |
| `newAct` | Object | Pelican actor (view 320) |
| `newAct_2` | Object | Whistle actor (view 524) |
| `newAct_3` | Object | Dolphin actor (view 310/311) |
| `gEgoViewer` | Object | Saved ego viewer for restoration |
### Inventory Item Reference
- `24` - Fish
- `27` - Whistle
- `21` - Bridle
### Player State Patterns
- `view: 2` - Normal land form
- `view: 8` - Swimming form
- `view: 312` - Riding dolphin form
- `view: 15` - Holding fish (feeding animation)
- `view: 21` - Drinking/dressed form
### Synonyms
- `dolphin` = dolphin
### Special Mechanics
- Player enters swimming (view: 8) automatically
- Death timer activates in specific water rectangles (likely quicksand hazards)
- Pelican appears if player has fish in inventory
- Whistle appears on ground after feeding pelican
- Dolphin can be summoned with whistle and ridden
- Bridle can be found by looking in shipwreck areas

View File

@@ -0,0 +1,104 @@
# Room 044: Inside Whale
This room takes place inside the belly of a giant whale. The player has been swallowed and must find a way to escape before succumbing to the noxious fumes. The room contains a skeleton of an unlucky sailor named "James" resting on boat wreckage, floating debris, and various whale anatomy features. The player must use the peacock feather to tickle the whale's throat to trigger a sneeze and escape back to the ocean.
## Look Description
"Horrors! You have been swallowed by a huge whale!"
"PHEW!! This place stinks!"
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look[<up,around,at][/room,whale]` | "Horrors! You have been swallowed by a huge whale!" + "PHEW!! This place stinks!" (Print 44 0, 1) |
| TODO | Look | `look/skeleton,james,man,person` | "The skeleton of an unlucky man (let's call him James), rests atop the wreckage of a small boat." (Print 44 17) |
| TODO | Look | `look/fish` | "Bits and pieces of fish are everywhere." (Print 44 10) |
| TODO | Look | `look/boat` | "There's nothing in the old boat. It didn't help 'James' and it won't help you." (Print 44 11, 13) |
| TODO | Look | `look[<under]/water` | "There is nothing of interest under the seawater." (Print 44 12) |
| TODO | Look | `look/water` (bottle present) | "You notice a bottle floating in the seawater of the whale's stomach." (Print 44 18) |
| TODO | Look | `look/water` (bottle taken) | "Seawater floats in the whale's stomach." (Print 44 19) |
| TODO | Look | `look/belly` | "This is a disgusting place to be! Seawater, dead fish, junk...you name it...float around in here. Hopefully, your fate will not be the same as poor 'James' lying over there." (Print 44 13) |
| TODO | Look | `look/tongue` | "This is the biggest tongue you have ever seen! It's also extremely slippery, slimy, and bumpy. Ugh!" (Print 44 14) |
| TODO | Look | `look/esophagus,lips,molar` | "The whale's throat and mouth are enormous! Huge teeth, a great tongue, and yes...even a large uvula. What's that?, you say. Well, suffice it to say, it looks like a big punching bag and hangs down from the top of the throat. See, you learn something new every day!" (Print 44 15) |
| TODO | Look | `look/uvula` | "Yes, that's a big uvula, all right!" (Print 44 16) |
| TODO | Get | `get,look<in/skeleton,man,person,james` | "There is nothing of importance with the skeleton." (Print 44 2) |
| TODO | Get | `get,capture/fish` or `fish` | "Not here." (Print 44 3) |
| TODO | Get | `get,drink[/drink,water]` | "NO!!" (Print 44 4) |
| TODO | Get | `get/boat` | "This old boat won't help you." (Print 44 5) |
| TODO | Get | `get/bottle` (bottle present, close enough) | "Ok." (Print 44 6) - bottle picked up, global182 set |
| TODO | Get | `get/bottle` (bottle present, too far) | "You can't get that yet." (Print 800 1) |
| TODO | Get | `get/bottle` (already has bottle) | "You already have it." (Print 44 7) |
| TODO | Get | `get/bottle` (no bottle present) | "What bottle?" (Print 44 8) |
| TODO | Action | `light,ignite,create,begin/fire` or `light/fire` | "You couldn't start a fire in here as it's too wet." (Print 44 9) |
| TODO | Action | `hit/molar` (y < 82) | "You strike the whale's teeth...but nothing happens." (Print 44 20) |
| TODO | Action | `hit/molar` (y >= 82) | "You can't get that yet." (Print 800 1) |
| TODO | Action | `hit/tongue` | "You strike the whale's tongue...but nothing happens." (Print 44 21) |
| TODO | Action | `hit/uvula,esophagus` (in rect 140,71 to 178,86) | "You strike the large uvula (punching bag-looking thing)...but nothing happens." (Print 44 22) |
| TODO | Action | `hit/uvula,esophagus` (outside rect) | "You can't get that yet." (Print 800 1) |
| TODO | Action | `climb` | "Go ahead. Try it." (Print 44 23) |
| TODO | Action | `open,force/lips` | "You're not strong enough to do that." (Print 44 27) |
| TODO | Action | `tickle` (has peacock feather, in correct position) | Triggers escape sequence - whale sneezes player out to room 31 (Print 44 30) |
| TODO | Action | `tickle` (has peacock feather, wrong position) | "Not here!" (Print 44 28) |
| TODO | Action | `tickle` (no peacock feather) | "With what?" (Print 44 29) |
| TODO | Talk | `call,help` or `save/me` | "You scream, holler, and shout for help until your throat is hoarse; but to no avail." (Print 44 24) |
| TODO | Talk | `escape` | "How could you open the whale's mouth?" (Print 44 25) |
| TODO | Action | `bathe` | "You really want to swim here?!" (Print 44 26) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | deadTimer | On room entry - timer starts immediately | Counts down and triggers player death from noxious whale fumes. If player has peacock feather (item 8), timer is 4 seconds; otherwise 2 seconds. After timer expires, player dies with message about fumes (Print 44 31) |
| TODO | Background | inWhale | Continuous - attached as viewer to ego | Monitors player position and terrain type to switch views: view 8 (shallow water), view 7 (medium depth), view 6 (deep water), view 53 (exit zone - triggers escape sequence). Handles transitions between swimming states |
| TODO | Interaction | slide | Player enters exit zone (control area $0004) while no script running and timer not active and inWhale state <= 0 | Plays falling animation sequence, transitions player back to whale's mouth (view 52, 19) then re-enables inWhale viewer |
| TODO | Interaction | tickle | Player uses tickle command with peacock feather in correct position (rect 140,71 to 178,86) | Plays tickle animation with feather, displays escape message, awards 5 score points, sets global189 to 0, and transports player to room 31 |
## Technical Notes
- **Room Number**: 44
- **Picture**: 44
- **Style**: $0008
- **Exits**: Room 31 (back to ocean) - achieved via tickle escape sequence
- **Music**: Sound 51 (fallSound)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | 1 | Room initialization flag - set to 1 on entry |
| `global183` | 1 | Whale interior flag - set to 1 to indicate player is inside whale |
| `global189` | 0, 1 | Escape state flag - 1 = still in whale, 0 = escaped |
| `global182` | 0, 1 | Bottle collected flag - set to 1 when bottle is picked up |
| `global127` | 1 | Death flag - set to 1 when player dies from whale fumes |
| `local3` | 0+ | Dead timer tick counter |
### Player View States
| View | Meaning |
|------|---------|
| 8 | Swimming in shallow water |
| 7 | Swimming in medium depth |
| 6 | Swimming in deep water |
| 53 | Near exit/escape zone |
| 52 | Falling animation |
| 19 | Ejected from whale |
| 51 | Tickle animation |
| 73 | Death animation |
### Control Areas
| Hex Value | Meaning |
|-----------|---------|
| $0004 | Exit zone - triggers slide/return sequence |
| $0200 | Shallow water |
| $0008 | Medium depth water |
| $0800 | Deep water |
| $0001 | Exit/escape zone |
### Inventory Items
| Item # | Name | Purpose |
|--------|------|---------|
| 8 | Peacock feather | Used to tickle whale's throat to escape |
| 31 | Bottle | Collectible item in whale's stomach |

View File

@@ -0,0 +1,99 @@
# Room 45: Genesta's Bed Chamber
## Look Description
"Genesta's bed chamber is very beautiful and serene. Genesta lies very still upon the seashell bed; her concerned fairy helpers hovering near, and her pet snow leopard lying close by."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look [at/on/in]/bed` | "Genesta is very ill. She lies, unmoving, in her shell bed." (Print 45 0) |
| TODO | Look | `look <under/bed` | "There is nothing under the bed." (Print 45 1) |
| TODO | Look | `look/wand[<magic]` | "Genesta's magic wand lies upon the bed." (Print 45 2) |
| TODO | Look | `look/window` (when near window) | "You see the ocean out the window." (Print 45 3) |
| TODO | Look | `look/window` (when far from window) | "You can't see out the window from here." (Print 45 4) |
| TODO | Look | `look/blossom,flora` | "Gorgeous flowers surround Genesta as she lies, ill, on her bed." (Print 45 5) |
| TODO | Look | `look/stair` | "Wide steps lead down from Genesta's bed chamber." (Print 45 6) |
| TODO | Look | `look/chest,dresser,drawer` (when looking inside) | "No. It's private." (Print 45 7) |
| TODO | Look | `look/chest,dresser,drawer` (when looking at) | "It must hold Genesta's clothes." (Print 45 8) |
| TODO | Look | `look/wall` | "There is nothing of importance on the walls." (Print 45 9) |
| TODO | Look | `look [<down]/dirt` | "There is nothing interesting on the floor." (Print 45 10) |
| TODO | Look | `look/genesta` | "The lovely fairy is visibly fading...fast. Within hours, if she doesn't get her magic talisman back, she'll be dead." (Print 45 11) |
| TODO | Look | `look/leopard[<snow,white]` | "A white, spotted snow leopard lies on the floor of Genesta's bed chamber. It lies quite still, but for an occasional twitch of its tail." (Print 45 12) |
| TODO | Look | `look [<around][/room,tower,bedroom,chamber[<bed]]` | "Genesta's bed chamber is very beautiful and serene. Genesta lies very still upon the seashell bed; her concerned fairy helpers hovering near, and her pet snow leopard lying close by." (Print 45 13) |
| TODO | Look | `look[/fairies[<little]]` | "Genesta's constant companions are small fairies with fluttering wings and brightly-colored gowns. They utter not a word." (Print 45 23) |
| TODO | Action | `deliver,return/amulet[/genesta]` | Gives magic talisman to Genesta, triggers ending sequence (Print 45 14) |
| TODO | Action | `(lay<down,on,in),(sleep<in,on),(get<in,on)[/bed]` or `sleep` | "Not with Genesta in it!" (Print 45 15) |
| TODO | Get | `get/blossom` | "No. They belong to Genesta." (Print 45 16) |
| TODO | Get | `get,get,rob/wand` | "That belongs to Genesta." (Print 45 17) |
| TODO | Action | `open/dresser,drawer,chest` | "No. It's private." (Print 45 7) |
| TODO | Talk | `converse/genesta` or `converse` | "As you attempt to speak to the gravely ill Genesta, her small fairy helpers flutter madly about, trying to prevent you from disturbing her." (Print 45 18) |
| TODO | Action | `kill/genesta` | "THAT is DEFINITELY NOT the thing to do!" (Print 45 19) |
| TODO | Get | `get/genesta` | "You cannot get Genesta." (Print 45 20) |
| TODO | Action | `kiss/genesta` or `kiss` | "She needs her talisman, not a kiss!" (Print 45 21) |
| TODO | Action | `help,save/genesta` | "You can start by helping to get her talisman back from Lolotte." (Print 45 22) |
| TODO | Talk | `converse[/fairies]` | "You speak to the little fairies, but they do not respond. Perhaps, they cannot talk." (Print 45 24) |
| TODO | Action | `kill[/fairies]` | "You are NOT a murderous girl, Rosella!" (Print 45 25) |
| TODO | Get | `get/fairies` or `capture/fairies` | "It's impossible to obtain a fairy." (Print 45 26) |
| TODO | Action | `kiss/fairies` | "The little fairies do not need kissing." (Print 45 27) |
| TODO | Action | `help/fairies` | "The little fairies don't need your help; Genesta does." (Print 45 28) |
| TODO | Talk | `converse/leopard[<snow,white]` | "Snow leopards do not talk!" (Print 45 29) |
| TODO | Action | `kill/leopard[<snow,white]` | "Oh, yeah. You're going to kill a big snow leopard with your bare hands!" (Print 45 30) |
| TODO | Get | `get,capture/leopard[<snow,white]` | "Not this cat!" (Print 45 31) |
| TODO | Action | `kiss,pat/leopard[<snow,white]` | "That's probably not a good idea." (Print 45 32) |
| TODO | Inventory | `deliver/*/leopard` | "The snow leopard doesn't want it." (Print 45 33) |
| TODO | Inventory | `deliver/fairies/*` or `deliver/*/fairies` | "The small fairies don't need anything." (Print 45 34) |
| TODO | Inventory | `deliver/genesta,fairies/*` or `deliver/*[/genesta,fairies]` | "Genesta only needs her talisman." (Print 45 35) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | `ChaseEgo` | Player enters center zone (rect 93,116 to 223,151) and is to the left of center | Fairy chases and moves toward player, print message about fairies trying to keep player away (Print 45 36) |
| TODO | Interaction | `ChaseEgoWhenTalk` | Player tries to talk to Genesta | Fairy moves toward player, then returns to wandering after 4 seconds |
| TODO | Background | `Flutter3` | Default script for left fairy (view 112) | Fairy moves to position 103,60 then wanders randomly |
| TODO | Background | `Flutter6` | Default script for right fairy (view 115) | Fairy moves to position 220,60 then wanders randomly |
| TODO | Background | `catMove` | global223 is set (leopard released) | Snow leopard cycles through animation frames, occasionally plays meow animation |
| TODO | Interaction | `closer` | Player delivers amulet to Genesta | End game sequence: Genesta recovers, thanks player, transforms Rosella, exits to room 690 (the ending) |
## Technical Notes
- **Room Number**: 45
- **Picture**: 45
- **Style**: $0010 (dpOPEN_CENTEREDGE)
- **Exits**: East → Room 46 (right edge, control area $0040)
- **Music**: Sound 34 (fairyMusic)
### Objects
| Object | View | Description |
|--------|------|-------------|
| Bed | 101 | Genesta's seashell bed with loop 0 (ill state), loop 1 (awake), loop 2 (sitting up), loop 3 (waving) |
| Left Fairy | 112 | Small fairy helper that flutters around the left side |
| Right Fairy | 115 | Small fairy helper that flutters around the right side |
| Snow Leopard | 365 | Genesta's pet leopard (only visible when global223 is set) |
| Candle Props | 632 | Animated candles on either side of the bed (loops 1) |
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global205` | 0, 1 | Room completion flag - set to 1 after delivering amulet |
| `global223` | 0, 1 | Snow leopard released flag - when set, leopard is visible and animated |
| `global224` | 0, 1 | Amulet delivered flag - set when player gives amulet to Genesta |
| `global160` | 30 | Used to track the current room for Genesta conversation |
| `global159` | 0, 1 | Genesta conversation state |
| `global204` | 0 | Temporary flag during ending sequence |
| `global169` | 0, 1 | Used in Genesta look description for conditional text |
| `global228` | string | Format buffer for Genesta look description |
### Synonyms
- `room` = castle
- `leopard` = cat
### Entry Position
- Player enters at position (225, 174) - from the west
- Entry position controlled by `gPrevRoomNum` in caller (not shown in this room)

View File

@@ -0,0 +1,68 @@
# Room 46: Tower Stairway
This is the tower stairway of Genesta's ivory palace. The room features a winding staircase connecting the upper tower to the entry hall below. Two small fairies flutter about as Genesta's constant companions. The player can look out windows to see the ocean, examine the tapestry-covered walls, or interact with the fairies. Walking on the stairs triggers an automatic movement script.
## Look Description
"You are on a tower stairway of the island's ivory palace."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look up` | "Where do the stairs lead?" |
| TODO | Look | `look down` | "The stairs lead down to the entry hall." |
| TODO | Look | `look stair` / `look stairs` / `look stair tower` | "From here, the tower stairs both go upward, and downward." |
| TODO | Look | `look out` / `look out window` (if near window) | "You see the ocean out the window." |
| TODO | Look | `look out window` (if not near window) | "You're not close enough to the window." |
| TODO | Look | `look wall` | "There is nothing of importance on the walls." |
| TODO | Look | `look down dirt` / `look down floor` | "There is nothing interesting on the floor." |
| TODO | Look | `look painting` / `look tapestries` | "A beautifully embroidered tapestry hangs on the gleaming wall." |
| TODO | Look | `look flora` / `look blossom` / `look flower` | "Genesta must love beautiful plants and flowers." |
| TODO | Look | `look fairy` / `look fairies` / `look little fairy` | "Genesta's constant companions are small fairies with fluttering wings and brightly-colored gowns. They utter not a word." |
| TODO | Look | `look around` / `look room` / `look tower` | "You are on a tower stairway of the island's ivory palace." |
| TODO | Talk | `talk fairy` / `talk fairies` / `talk little fairy` | "You speak to the little fairies, but they do not respond. Perhaps, they cannot talk." |
| TODO | Talk | `talk` | "You speak to the little fairies, but they do not respond. Perhaps, they cannot talk." |
| TODO | Action | `kill fairy` / `kill fairies` / `kill little fairy` | "You are NOT a murderous girl, Rosella!" |
| TODO | Get | `get fairy` / `get fairies` / `get little fairy` | "It's impossible to obtain a fairy." |
| TODO | Action | `capture fairy` / `capture fairies` / `capture little fairy` | "It's impossible to obtain a fairy." |
| TODO | Action | `kiss fairy` / `kiss fairies` / `kiss` | "The little fairies do not need kissing." |
| TODO | Action | `help fairy` / `help fairies` / `help little fairy` | "The little fairies don't need your help; Genesta does." |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | moveOnTheStairs | Walking on stair control areas (hex $0800 or $0400) when not already on stairs (`global105 != 18`) | Sets `global105 = 18` to mark player on stairs, ignores stair collision blocks, initiates automatic movement along stairs either up or down depending on player position, continues until reaching destination floor |
| TODO | Background | newAct (Fairy 1) | Continuous | First fairy actor (view 111) wanders randomly within the room, playing wandering animation |
| TODO | Background | newAct_2 (Fairy 2) | Continuous | Second fairy actor (view 113) wanders randomly within the room, playing wandering animation |
## Technical Notes
- **Room Number**: 46
- **Picture**: 46
- **Region**: None specified
- **Exits**: North→47 (up the tower), South→45 (down to entry hall)
- **Music**: Sound 33 (looping)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global105` | `0`, `18` | Tracks whether player is on the stairs (18 = on stairs, 0 = not on stairs) |
| `global204` | `0`, `1` | Set to 0 when starting stair movement, used for movement state |
| `global205` | `0`, `1` | Set to 1 when player is moving on stairs |
### Additional Technical Details
- Synonyms defined: `room` = `castle`, `room` = `tower`
- Two fairy actors are placed in the room: newAct (position 231, 65) and newAct_2 (position 132, 144)
- Fairies use views 111 and 113 with Wander motion and Fwd cycle
- Stair movement uses control area hex $0800 (upstairs area) and $0400 (downstairs area)
- Four stairBlock collision blocks prevent player from walking through certain stair areas
- Entry from room 45 positions player at the top of stairs (y=23)
- Entry from room 47 or starting position positions player at bottom of stairs (y=164)
- The `moveOnTheStairs` script has two paths: state 1/2 for going down, state 10/11 for going up
- proc0_9 is called when exiting the stairs to reset player state
- proc0_8 is called to set player on stairs state
- Window look command checks if player is in rect (33, 81, 67, 112) to determine if close enough

View File

@@ -0,0 +1,80 @@
# Room 47: Genesta's Palace Entry Hall
This is the entry hall of the enchanted ivory palace, home of the fairy queen Genesta. The room features two locked doors (presumably leading to other areas of the palace) and an open left doorway. Two small fairies wander throughout the hall as constant companions to Genesta. The room serves as the main entrance to the palace and connects to the exterior (room 37) and another palace area (room 46).
## Look Description
"This is the entry hall of the enchanted ivory palace. Two of the doors are closed, and presumably, off-limits to uninvited visitors. The left doorway, however, is open."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look[<around]` / `look/room` / `look/room,room,hall,entry` | "This is the entry hall of the enchanted ivory palace. Two of the doors are closed, and presumably, off-limits to uninvited visitors. The left doorway, however, is open." (Print 47 0) |
| TODO | Look | `look/door` | "Two of the doors are closed, locked, and off-limits to uninvited visitors; but, the left doorway is open. The main palace door is behind you." (Print 47 1) |
| TODO | Look | `look/flora` / `look/blossom` | "An unusual vine clings to the back wall of the palace entry hall." (Print 47 2) |
| TODO | Look | `look/wall` | "There is nothing of importance on the walls." (Print 47 3) |
| TODO | Look | `look[<down]/dirt` | "There is nothing interesting on the floor." (Print 47 4) |
| TODO | Look | `look/fairies[<little]` | "Genesta's constant companions are small fairies with fluttering wings and brightly-colored gowns. They utter not a word." (Print 47 5) |
| TODO | Action | `open/door` | "You can't. The door is locked." (Print 47 6) |
| TODO | Action | `unlatch/door` (with key) | "You don't have the right key." (Print 47 7) |
| TODO | Action | `unlatch/door` (without key) | "You can't. It's locked and you don't have the key." (Print 47 8) |
| TODO | Action | `bang/door` | "There's no answer." (Print 47 9) |
| TODO | Action | `break/door` | "You could never do that." (Print 47 10) |
| TODO | Inventory | `use/key` (with key 20 or 32) | "You don't have the key to unlock this door." (Print 47 11) |
| TODO | Inventory | `use/key` (without key) | "You don't have any keys!" (Print 47 12) |
| TODO | Inventory | `use/key` (not near door) | "There is nothing within reach to use it on." (Print 47 13) |
| TODO | Talk | `converse/fairies[<little]` / `converse[/!*]` | "You speak to the little fairies, but they do not respond. Perhaps, they cannot talk." (Print 47 14) |
| TODO | Action | `kill/fairies[<little]` | "You are NOT a murderous girl, Rosella!" (Print 47 15) |
| TODO | Get | `get/fairies[<little]` / `capture/fairies[<little]` | "It's impossible to obtain a fairy." (Print 47 16) |
| TODO | Action | `kiss/fairies[<little]` / `kiss[/!*]` | "The little fairies do not need kissing." (Print 47 17) |
| TODO | Action | `help/fairies[<little]` | "The little fairies don't need your help; Genesta does." (Print 47 18) |
| TODO | Inventory | `deliver/*/fairies` | "The small fairies don't need anything." (Print 47 19) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | Fairy1 (newAct_3) | Room initialization | Wanders around the room with view 111, small fairy that moves with xStep 1 yStep 3 |
| TODO | Background | Fairy2 (newAct_4) | Room initialization | Wanders around the room with view 113, small fairy that moves with xStep 1 yStep 3 |
| TODO | Background | Room exit detection | Control area trigger | Auto-transitions to room 37 when player enters south control area ($0040) |
| TODO | Background | Room exit detection | Control area trigger | Auto-transitions to room 46 when player enters east control area ($0020) |
## Technical Notes
- **Room Number**: 47
- **Picture**: 47
- **Region**: None explicitly set
- **Exits**: South→37 (exterior), East→46 (palace interior)
- **Music**: Sound 33
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global205` | 0 | Local flag, initialized to 0 on room entry |
### Objects
| Object | View | Loop/Cel | Description |
|--------|------|----------|-------------|
| newAct | 632 | loop 0, cel 3 | Decorative element at position 38, 105 |
| newAct_2 | 632 | loop 0, cel 4 | Decorative element at position 281, 106 |
| newAct | 632 | loop 2, cel 2 | Animated element at 41, 97 |
| newAct_2 | 632 | loop 2, cel 2 | Animated element at 278, 98 |
| newAct_3 (Fairy1) | 111 | - | Wandering fairy, starts at 250, 79 |
| newAct_4 (Fairy2) | 113 | - | Wandering fairy, starts at 65, 74 |
### Door Interaction Areas
- Left door area: `gEgo inRect: 146 127 176 131`
- Right door area: `gEgo inRect: 238 141 260 153`
### Required Keys
- Key 20: Skeleton key
- Key 32: Palace key (presumed)
### Synonyms
- room = castle

View File

@@ -0,0 +1,80 @@
# Room 48: Ogres' Bedroom
This is the ogres' upstairs bedroom in the cottage. The room features a large bed that dominates the space, a locked door leading to the hallway, windows looking out to the forest, a mirror, and various furniture. The player can find an axe leaning against the right wall. Most significantly, this room contains the ogress (giantess) who will chase and capture the player if they linger too long. The bed animation differs based on whether both ogres are present. Players must grab the axe and escape quickly before the ogress catches them.
## Look Description
"You have entered the ogres' upstairs bedroom where a huge bed dominates the place. In the left wall, you notice a closed door. %s"
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look under bed` / `look <under/bed` | "There is nothing under the bed." |
| TODO | Look | `look bed` | "The large bed occupies most of the room." |
| TODO | Look | `look in chest` / `look in dresser` / `look in drawer` / `look <in/chest,dresser,drawer` | "No. It's private." |
| TODO | Look | `look chest` / `look dresser` / `look drawer` | "It must hold the ogre's and ogress' clothes." |
| TODO | Look | `look carpet` | "A bear rug lies on the floor by the bed." |
| TODO | Look | `look window` (when in position) | "You see the forest out the window." |
| TODO | Look | `look stair` / `look stairs` | "The stairs lead downward." |
| TODO | Look | `look barrel` | "There is nothing of importance in the barrel." |
| TODO | Look | `look mirror` (when in position) | "You look in the mirror and see the reflection of a poor, but beautiful, peasant girl." |
| TODO | Look | `look door` (when key owned) | "The door is closed. From behind it, you hear a soft clucking sound." |
| TODO | Look | `look door` (when key not owned) | "You see a solid, wooden door." |
| TODO | Look | `look wall` | "There is nothing of importance on the walls." |
| TODO | Look | `look dirt` / `look down` / `look <down` | "There is nothing of interest on the floor." |
| TODO | Look | `look around` / `look room` / `look bedroom` / `look cottage` / `look [<around,at][/room,bedroom,cottage]` | "You have entered the ogres' upstairs bedroom where a huge bed dominates the place. In the left wall, you notice a closed door." |
| TODO | Get | `get ax` / `get axe` | Picks up axe if in room and player is close enough, awards 2 points |
| TODO | Get | `get ax` (already have it) | "You already have it." |
| TODO | Action | `sleep` / `lay in bed` / `lay on bed` / `get in bed` / `lay [<in,on,down][/bed]` | "You don't have time for that!" |
| TODO | Action | `open chest` / `open dresser` / `open drawer` | "No. It's private." |
| TODO | Action | `open window` (when in position) | "The windows don't open." |
| TODO | Action | `open door` (when in position) | "You can't. The door is locked." |
| TODO | Action | `unlatch door` (when in position) | "You can't. It's locked and you don't have the key." |
| TODO | Action | `break door` (when in position) | "You could never do that." |
| TODO | Action | `bang door` (when in position and key owned) | "You knock on the door, but receive no answer. You hear a soft, clucking from behind the door." |
| TODO | Action | `bang door` (when in position and key not owned) | "You knock on the door, but receive no answer." |
| TODO | Look | `look giantess` / `look ogress` (when chase active) | "You don't want to mess with this ogress. You'd better get out of here!" |
| TODO | Talk | `converse giantess` / `converse ogress` / `talk giantess` / `talk ogress` (when chase active) | "This is no time for conversation!" |
| TODO | Action | `kill giantess` / `kill ogress` (when chase active) | "You have no way of killing a giant ogress!" |
| TODO | Get | `get giantess` / `get ogress` / `capture giantess` / `capture ogress` (when chase active) | "That's ridiculous!" |
| TODO | Inventory | `deliver` / `give` (when chase active) | "You don't want to get that close to the ogress!" |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | ogressChase | Automatic on room entry (delayed based on time of day) | Ogress enters from left, announces she sees player, begins chasing. If caught, displays death message and sets game over flag |
| TODO | Background | playMusic | Called by ogressChase state changes | Controls chase music (sound 10) and catch music (sound 11) based on chase phase |
## Technical Notes
- **Room Number**: 48
- **Picture**: 48
- **Region**: 602
- **Exits**: East→49 (via control area $0040)
- **Music**: Ogress chase theme (sound 10), Ogress catch theme (sound 11)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `ogress_chase_started` | `true`, `false` | Set to true when ogress chase begins (global204 = 1) |
| `ogress_caught_player` | `true`, `false` | Set to true when ogress catches player (global127 = 1) |
| `axe_taken` | `true`, `false` | Set to true when player picks up axe (global182 = 1) |
| `both_ogres_present` | `true`, `false` | Controls bed animation - true if both ogres in bed (global100) |
| `has_key` | `true`, `false` | Whether player has the key (item 33) |
| `has_axe` | `true`, `false` | Whether player has the axe (item 16) |
### Additional Technical Details
- Room uses region 602 for shared logic
- Axe (item 16) is positioned at 243,124 when in room
- Door requires key (item 33) to unlock
- Ogress enters from position 0,0 and moves to 64,138 before chasing
- If player is at position x < 135 and y > 128, ogress takes alternate path
- Ogress uses view 245 when chasing, view 48 when catching
- Player is hidden and game over is triggered when caught
- Death message appears in dialog with special formatting (67 -1 10 parameters)
- The bed shows different cel (animated vs static) based on global100 flag
- Two windows at different positions player can look out of

View File

@@ -0,0 +1,94 @@
# Room 49: Ogre's Cottage
The Ogre's Cottage living room where the player must navigate past a sleeping ogre and an aggressive bulldog. This room contains multiple hazards including the ogre (who can be in various states of alertness), a fierce bulldog that chases or guards a bone, and a chicken that can be stolen for points. The room features multiple exits, interactive furniture, and a closet with a secret passage.
## Look Description
"This isn't the most cozy-looking living room you've ever seen. In fact, the ogres' house looks almost...frightening!"
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look <under/table` | "There is nothing of interest under the table." (Print 49 0) |
| TODO | Look | `look /table` | "The terrible ogre is asleep at the table, snoring loudly." (Print 49 1) if ogre present, else "It's a large wooden table." (Print 49 2) |
| TODO | Look | `look /chair` | "There are two chairs at the table." (Print 49 3) |
| TODO | Look | `look /carpet,carpet` | "A worn rug lies on the floor." (Print 49 4) |
| TODO | Look | `look /stair` | "The stairway goes upwards." (Print 49 5) |
| TODO | Look | `look /window` | "You see the forest out the window." (Print 49 6) |
| TODO | Look | `look /door` | "The front door leads outside. There is an open doorway to the right, and a closet door under the stairs." (Print 49 7) |
| TODO | Look | `look /wall` | "There is nothing of importance on the walls." (Print 49 8) |
| TODO | Look | `look /dirt`, `look <down` | "There is nothing interesting on the floor." (Print 49 9) |
| TODO | Look | `look /giant` | Varies by ogre state: asleep (Print 49 1), awake hostile (Print 49 10), not present (Print 49 11) |
| TODO | Look | `look /bulldog` | If chewing bone: "The big dog is totally engrossed in its bone." (Print 49 12), else: "This is definitely not your basic cute pooch. This dog means business." (Print 49 13) |
| TODO | Look | `look [<around][/room,cottage]` | "This isn't the most cozy-looking living room you've ever seen. In fact, the ogres' house looks almost...frightening!" (Print 49 14) |
| TODO | Action | `blow/whistle` | If has whistle (27) and ogre present: varies by state (Print 49 15 or 16), else ignored |
| TODO | Talk | `converse/bulldog` | If chewing bone: "The dog is too interested in its bone to listen to you." (Print 49 17), else: "Soothing words will not placate this dog." (Print 49 18) |
| TODO | Action | `kill/bulldog` | "You couldn't kill that big dog." (Print 49 19) |
| TODO | Action | `pat/bulldog` | "Not this dog!" (Print 49 20) |
| TODO | Action | `calm/bulldog` | "This dog will not be gentled." (Print 49 21) |
| TODO | Get | `get,capture/bulldog` | "You woudln't want this dog, even if you COULD get it." (Print 49 22) |
| TODO | Action | `sit>` | "You don't have time for that!" (Print 49 23) |
| TODO | Talk | `converse,awaken[/giant]` | If ogre present and sleeping (state 3): close enough triggers (Print 49 24), far away (Print 49 25), else awake (Print 49 26), else no ogre (Print 49 27) |
| TODO | Action | `open/closet`, `open/door<closet` | Checks position, if open (Print 49 28), if ogre/ogress present (Print 49 29), if has chicken (Print 49 10), else opens closet |
| TODO | Action | `open/door` | Context-sensitive: front door (lines 428-440), side door under stairs (lines 441-468), else (Print 49 31) |
| TODO | Action | `close/door` | Context-sensitive close for front door or side door |
| TODO | Get | `get/egg[<gold]` | If ogre present and close enough: get golden egg (33), else too far |
| TODO | Get | `get,rob/chicken` | If chicken present and in correct position: steals chicken for +4 points |
| TODO | Action | `kill/giant` | "You have no way of killing a giant ogre!" (Print 49 36) |
| TODO | Action | `kiss/giant`, `kiss/bulldog`, `kiss[/!*]` | "That's REALLY not a good idea!" (Print 49 37) |
| TODO | Action | `fling,deliver,feed/bone` | If has bone (23) and dog is far enough: throws bone to dog, +4 points |
| TODO | Get | `get,rob/bone` | If bone already in room: "That's ridiculous." (Print 49 40), else "What bone?" (Print 49 41) |
| TODO | Get | `get,capture/giant` | "You don't want to get that close to the ogre." (Print 49 42) |
| TODO | Inventory | `deliver> [item]` | If ogre present: "The dog would not be interested in it." (Print 49 43), else: "You don't have that." (Print 49 45) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | `ogreStuff` | Player in room with ogre (global165 = 1,2,3) and enters certain areas | Handles ogre encounter sequences based on ogre state - can lead to death or escape |
| TODO | Background | `ogreAwake` | Ogre present and player approaches or disturbs | Controls ogre waking animation and chase sequence - leads to death if caught |
| TODO | Interaction | `ogressChase` | Entering from room 0 or 4 when ogress (global167) present | Ogress chases and catches player - leads to death |
| TODO | Interaction | `henPecked` | Chicken (33) owned by room 49 | Chicken wanders around room near the rug |
| TODO | Interaction | `chaseEgo` | Player enters without bone (23) and dog is present | Bulldog chases and catches player - leads to death |
| TODO | Interaction | `chewBone` | Player has bone (23) and bone is in room with dog | Dog settles down to chew bone, allowing safe passage |
| TODO | Interaction | `catchBone` | Player throws bone to dog using `fling` command | Bone animation sequence where dog catches bone |
| TODO | Interaction | `doorOpen` | Player opens closet door | Opens closet door and transitions to room 51 |
| TODO | Interaction | `moveOnTheStairs` | Player touches stairs control area ($0400) | Moves player up or down stairs |
## Technical Notes
- **Room Number**: 49
- **Picture**: 49
- **Style**: $0010
- **Region**: 602 (applied via setRegions)
- **Exits**: North→0/4 (forest), East→48 (cottage exterior), South→50 (kitchen), West→51 (closet), Stairs (varies by position)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global165` | 0=none, 1=ogre present, 2=ogre sleeping, 3=ogre awake, 4=ogre chasing, 5=ogress present | Ogre state in room |
| `global167` | 0/1 | Ogress present flag (from room 0/4) |
| `global210` | 0/1 | Side door (closet) open state |
| `global100` | 0/1 | Front door view state (view 616 loop 1) |
| `global105` | 0=normal, 18=on stairs | Current player location state |
| `global182` | 0/1 | Chicken stolen flag |
| `local1` | 0/1 | Entry condition from certain rooms |
| `local9` | 0/1 | Script blocking flag (prevents room changes during events) |
| `local11` | 0/1 | Ogre conversation attempt flag |
### Inventory Items
- Item 23: Bone (can be given to bulldog)
- Item 27: Whistle (can blow to affect ogre)
- Item 33: Golden egg/chicken (can be stolen from room)
### Key Mechanics
- The bulldog will chase and kill the player unless given the bone
- The ogre can be in multiple states: absent, sleeping, or awake/chasing
- Opening the side door (under stairs) leads to room 51 (closet)
- Stairs allow passage between floors (controlled by global105)
- Player can steal the chicken for +4 points if positioned correctly
- The ogre responds to the whistle based on its current state

View File

@@ -0,0 +1,66 @@
# Room 50: Ogress's Kitchen
This is the interior of the ogress's kitchen cottage. The room contains a carving table, a stove with a cooking pot, a window looking out to the forest, and an ogress NPC who patrols the area. A deer is being cooked in a caldron. The player must be careful not to attract the ogress's attention or get too close, or they will be chased and caught. The room connects to the forest to the west.
## Look Description
"You smell something HORRIBLE cooking on the stove in the ogre's kitchen! As a matter of fact, you get the feeling that this is NOT a safe place to be!"
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look under table` | "There is nothing of interest under the table." |
| TODO | Look | `look table` | "That is the carving table." |
| TODO | Look | `look stove` | "Something TERRIBLE is cooking on the stove! You have NO desire to know what it is!" |
| TODO | Look | `look window` | "You see the forest out the window." |
| TODO | Look | `look buck` / `look deer` | "Poor thing!" |
| TODO | Look | `look caldron` / `look pot` | "Whatever's in the pot smells AWFUL!" |
| TODO | Look | `look wall` | "There is nothing of importance on the walls." |
| TODO | Look | `look dirt` / `look down` | "There is nothing interesting on the floor." |
| TODO | Look | `look giantess` / `look ogress` | "You don't want to mess with this ogress. You'd better get out of here!" |
| TODO | Look | `look [around,at] room` / `look cottage` / `look kitchen` | "You smell something HORRIBLE cooking on the stove in the ogre's kitchen! As a matter of fact, you get the feeling that this is NOT a safe place to be!" |
| TODO | Talk | `talk giantess` / `talk ogress` / `talk` (state 0) | "Now you blew it! You foolishly spoke to the ogress, and drew her attention toward you. Now she's headed your way!" |
| TODO | Talk | `talk giantess` / `talk ogress` / `talk` (other states) | "This is no time for conversation!" |
| TODO | Get | `get buck` / `get deer` / `rob buck` | "You are not interested in the deer." |
| TODO | Action | `kill giantess` / `kill ogress` | "You have no way of killing a giant ogress!" |
| TODO | Action | `get giantess` / `capture giantess` | "That's ridiculous." |
| TODO | Action | `help buck` / `save buck` | "It's too late. You can't help the deer now." |
| TODO | Inventory | `deliver [item]` (if owned) | "You don't want to get that close to the ogress!" |
| TODO | Inventory | `deliver [item]` (if not owned) | "It's not yours to give." |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | ogressChase | Player gets within 25 pixels of ogress while in state 0 | Ogress notices player, chase music plays, ogress pursues player using Avoid pathfinding, catches player, displays catch message, sets `ogress_caught_player = true` |
| TODO | Background | ogressChase | Continuous monitoring in state 0 | Checks distance between player and ogress, triggers chase when player gets too close |
| TODO | Background | ogressChaseMusic | Playing during ogress encounter | Plays sound #10 (ogress chase theme) |
| TODO | Background | ogressCatchMusic | Playing when ogress catches player | Plays sound #11 (ogress catch theme) |
## Technical Notes
- **Room Number**: 50
- **Picture**: 50
- **Region**: 602 (Ogress's Cottage)
- **Exits**: West→49 (forest)
- **Music**: Ogress chase theme (sound #10), Ogress catch theme (sound #11)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `ogressChase.state` | `0`, `1`, `2`, `3`, `4`, `5` | Script state machine: 0=patrol, 1=notice player, 2=start chase, 3=catch player, 4=display catch message, 5=caught |
| `global167` | `0`, `1` | Set to 1 when ogress notices player (starts chase) |
| `global127` | `0`, `1` | Set to 1 when player is caught by ogress |
| `global100` | `0`, `1` | Controls visibility of a view element (line 45 in source) |
### Additional Technical Details
- Room uses Region 602 for shared ogress logic
- Player starts at position (77, 132) facing west
- Ogress starts at position (173, 121) when not chasing
- Exit to west is controlled by control area $0040
- If player speaks to ogress in state 0, triggers state change to 2 (chase)
- Multiple animated props in room: view 540 with three animated elements (cel 1 and two loop 2 elements)
- Ogress uses view 247 when patrolling, view 245 when chasing, view 48 when catching

View File

@@ -0,0 +1,57 @@
# Room 51: Ogre's Closet
This room is the interior of the ogre's small closet. The room features a closet door with a keyhole mechanism that triggers a complex animation sequence involving the ogre and his wife in the adjacent kitchen. Players can examine the keyhole, open the closet door to escape to the kitchen (Room 49), or attempt to use the keyhole with or without the magic hen to witness the ogres' routine.
## Look Description
"You have found yourself inside the ogres' small closet. For a closet, it's surprisingly empty. You notice a large keyhole under the doorknob of the closet door."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look keyhole` | "There is a large keyhole under the doorknob of the closet door." (Print 51 2) |
| TODO | Look | `look door` | "There is a large keyhole under the doorknob of the closet door." (Print 51 2) |
| TODO | Look | `look wall` | "There is nothing of importance on the walls." (Print 51 3) |
| TODO | Look | `look dirt` / `look down` | "There is nothing of importance on the floor." (Print 51 4) |
| TODO | Look | `look around` / `look room` / `look closet` / `look cottage` | "You have found yourself inside the ogres' small closet. For a closet, it's surprisingly empty. You notice a large keyhole under the doorknob of the closet door." (Print 51 5) |
| TODO | Action | `open door` / `open closet` | Opens closet door if keyhole not in use, else "It's already open." (Print 51 7) |
| TODO | Action | `close door` | Closes closet door if open, else "It's already closed." (Print 51 8) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | theKeyhole | Looking at keyhole with crown (item 33) when ogre state > 0 and < 5 | Plays full keyhole animation sequence: Rosella shrinks and enters keyhole, watches ogre and ogress dialogue, sees hen lay golden egg, ogre falls asleep, returns to closet with hen moved to Room 49, sets `ogre_state = 3` then later to `5` |
| TODO | Interaction | emptyHole | Looking at keyhole without crown or when ogre state is 0 or 5 | Plays shortened sequence: Rosella shrinks and enters keyhole, sees ogre sleeping (if state = 3), returns to closet |
| TODO | Interaction | doorOpen | Opening closet door | Opens door animation, reveals kitchen (Room 49), moves player to Room 49. Shows different views behind door based on ogre state (1-4) |
## Technical Notes
- **Room Number**: 51
- **Picture**: 51
- **Region**: 602 (Ogre House Closet)
- **Exits**: East→49 (through closet door)
- **Music**: Keyhole music (sound #61)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | `1` | Entering room flag, set on init |
| `global165` | `0`, `1`, `2`, `3`, `4`, `5` | Ogre/hen sequence state - tracks progression of getting the hen from ogre |
| `global166` | `0`, `1` | Keyhole used flag - set to 1 when entering keyhole sequence |
| `global189` | `1`, `0` | Music state flag - set to 1 on room init, 0 on dispose |
| `global100` | `true`, `false` | Genie/defeated state - affects visuals in keyhole sequence |
### Additional Technical Details
- Room uses Region 602 for shared ogre house logic
- The closet door is actually a keyhole that Rosella shrinks into to steal the magic hen
- Item 33 is the "magic hen" that lays golden eggs
- Entry from Room 49 or new game places player at position (156, 139)
- The keyhole view cel 0 indicates closed keyhole; cel > 0 indicates open
- When opening door, different views shown based on ogre state (global165):
- State 1-4: Shows ogress with different expressions based on state
- State 0 or 5: Door shown empty
- The door opens into Room 49 (the ogre's kitchen)

View File

@@ -0,0 +1,71 @@
# Room 53: Seven Dwarfs' Bedroom
## High-Level Summary
Room 53 is the upstairs bedroom in the Seven Dwarfs' cottage. This room contains seven small beds, one for each dwarf, along with various furniture including a chest of drawers, mirror, and window. The room initially contains significant clutter (dirty clothes and mess) that can be cleaned by the player. A dwarf patrols the room and will chase the player out if they linger too long. The room connects to the main floor via stairs leading to room 54.
## Look Description
"You have entered the small upstairs bedroom of the Seven Dwarfs."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `/bed` | "There are seven little beds." (Print 53 1) |
| TODO | Look | `/stair` | "The narrow stairs lead downward." (Print 53 2) |
| TODO | Look | `<under/bed` | "There is nothing under the beds." (Print 53 3) |
| TODO | Look | `/window` | "You see the forest out the window." (Print 53 4) - only if player in rect 211,125,271,146 |
| TODO | Look | `<in/chest,dresser,drawer` | "No. It's private." (Print 53 5) |
| TODO | Look | `/chest,dresser` | "The dwarfs share one chest of drawers." (Print 53 6) |
| TODO | Look | `/mirror` | "You look in the mirror and see the reflection of a poor, but beautiful, peasant girl." (Print 53 7) - only if player in rect 217,142,295,161 |
| TODO | Look | `/shelf` | "Quit being a snoop, Rosella!" (Print 53 8) |
| TODO | Look | `/wall` | "There is nothing of importance on the walls." (Print 53 9) |
| TODO | Look | `/dirt` or `<down` | "There is nothing interesting on the floor." (Print 53 10) |
| TODO | Look | `/carpet,carpet` | "A nice braided rug lies on the floor." (Print 53 11) |
| TODO | Look | `look[<around][/room]` | Dynamic: "My goodness, these dwarfs are sloppy!" if not cleaned, empty if cleaned (Print 53 12) |
| TODO | Action | `clean/room` or `clean[/!*]` | Triggers cleanBedroom script if room not clean, else "The house is nice and clean now." (Print 53 0) |
| TODO | Action | `create/bed` or `dust,sweep[/room,dirt,furniture]` | "The house needs more than that!" (Print 53 13) if room clean, otherwise "The house needs more than that!" |
| TODO | Action | `close,close/drawer,dresser,chest` | "You can't. It's too full of dirty, messy, dwarf clothes." (Print 53 14) |
| TODO | Action | `open/chest,dresser,drawer` | "No. It's private." (Print 53 5) |
| TODO | Action | `get<in,on/bed` or `sleep,lay[<down,on,in]` | "You have better things to do." (Print 53 15) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | `cleanBedroom` | Player enters "clean room" command | Player animates through a choreographed cleaning sequence, walking to each area and using a cleaning view (63) to remove clutter items (newView_6 through newView_24). Progresses through 19 states disposing of different clutter objects. Sets global115 when complete. |
| TODO | Background | `chaseEgo` | Player remains in room for 60+ seconds (state 0) | Dwarf (newAct using view 290) approaches player if they linger in the center area (rect 95,127,241,145). Prints "Oh, oh! You've been caught trespassing!" (Print 53 16) and forces player to room 54. |
## Technical Notes
- **Room Number**: 53
- **Picture**: 53
- **Region**: 601 (DwarfHouse)
- **Exits**: East→54 (edge trigger at control area $0040)
- **Music**: Sound 62 (dwarf house ambient, played via region 601)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global102` | `0`, `1` | Room cleanliness state - 0 = dirty/messy, 1 = cleaned |
| `global115` | `0`, `1` | Cleaning in progress flag - 1 when cleanBedroom script is running |
| `global122` | `0`, `1` | Dwarf chase triggered - prevents re-triggering during chase sequence |
| `global189` | `0`, `1` | Region 601 initialization flag |
| `global204` | `0`, `1` | Script state tracking for cleanBedroom |
| `global205` | `0`, `1` | Script state tracking for chaseEgo |
| `global228` | string | Message buffer for dynamic look description |
### Clutter Objects
The room contains numerous dirt/mess view objects (views 675, 676) that are disposed of during the cleaning sequence:
- newView_6 through newView_17: Loop 0-2 of view 676 (various floor clutter)
- newView_18 through newView_24: Loop 0 of view 675 (bedroom items)
- newView: View 676 loop 0 cel 0
- newView_2 through newView_5: Additional clutter items
### Entry Conditions
- Player enters from room 54 or new game (gPrevRoomNum = 54 or 0): Positioned at 72,131 with view 4
- Edge trigger at east side (control $0040) transitions to room 54

View File

@@ -0,0 +1,99 @@
# Room 54: Seven Dwarfs' Cottage
The Seven Dwarfs' cottage kitchen is the main living area of the dwarfs' tree house. The room features a large wooden table, sink, cabinets, fireplace with mantel, closet with broom, and stairs leading up to the bedroom. A diamond pouch can be found on the table. The player can interact with various objects, clean the room (a multi-stage quest), and must avoid being caught by the dwarf who patrols the area.
## Look Description
"This is the main room of the Seven Dwarfs' cozy tree house. What a mess it is!" (Print 54 50)
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `[!][around][/cottage,kitchen]` | "This is the main room of the Seven Dwarfs' cozy tree house." (Print 54 50) + "What a mess it is!" (Print 54 51) if dishes unwashed |
| TODO | Look | `/window` | "You can see the forest out the window." (Print 54 22) - only when in rect 124 117 197 130 |
| TODO | Look | `/mantel,mantel` | "Clean soup bowls are set on the mantel above the fireplace." (Print 54 23) if mantel has bowls, otherwise "There is nothing on top of the mantel." (Print 54 24) |
| TODO | Look | `<under/table` | "There is nothing of interest under the table." (Print 54 25) |
| TODO | Look | `/table` | "You see a long, wooden table." (Print 54 26) + "You also notice a blue pouch." (Print 54 27) if pouch on table, or "You see a long, wooden table. Empty soup bowls are left on it." (Print 54 28) if dishes on table |
| TODO | Look | `/stair` | "The narrow stairs lead up to the bedroom." (Print 54 29) |
| TODO | Look | `/cabinet` | "You see many cupboards." (Print 54 30) |
| TODO | Look | `<in/cabinet` | "There is nothing to interest you in the cupboards." (Print 54 1) |
| TODO | Look | `/wall` | "There is nothing of importance on the walls." (Print 54 31) |
| TODO | Look | `/dirt` or `<down` | "There is nothing interesting on the floor." (Print 54 32) |
| TODO | Look | `/bowl` | "Clean soup bowls are set on the mantle above the fireplace." (Print 54 33) if cleaned, otherwise "Empty soup bowls are left on the table." (Print 54 34) |
| TODO | Look | `/caldron,soup` | "You see a pot of soup bubbling over a cheery fire." (Print 54 35) |
| TODO | Look | `/fire,fireplace` | "A cheery fire heats a bubbling pot of soup in the fireplace." (Print 54 36) |
| TODO | Look | `/carpet` | "A rag rug covers the floor." (Print 54 37) |
| TODO | Look | `/sink` | "The sink is clean and empty." (Print 54 38) if cleaned, otherwise "There are dirty dishes in the sink." (Print 54 39) |
| TODO | Look | `/dish[<dirty]` | "The dishes are dirty." (Print 54 40) if dishes dirty, otherwise "The dishes have been washed and put away." (Print 54 41) |
| TODO | Look | `/clock[<cuckoo]` | "This clock has seen better days. The cuckoo has flown away." (Print 54 42) |
| TODO | Look | `/time` | "This clock is broken." (Print 54 43) |
| TODO | Look | `<in/closet` | "The closet contains only an old broom." (Print 54 44) if near closet, or "The closet is closed." (Print 54 45) if door closed |
| TODO | Look | `/closet` | "There's nothing much in the closet except for an old broom." (Print 54 46) if near closet, otherwise "You see a closet door." (Print 54 47) |
| TODO | Look | `/broom` | "You see an old broom." (Print 54 48) if near closet, otherwise "You can't see any brooms from here." (Print 54 49) |
| TODO | Look | `/pouch,diamond` | "There is a blue pouch in the center of the table." (Print 54 21) if pouch in room |
| TODO | Look | `/soup` | "The soup is delicious!" (Print 54 20) if soup drunk |
| TODO | Action | `open,(look<in)/cabinet` | "There is nothing to interest you in the cupboards." (Print 54 1) |
| TODO | Action | `close/cabinet` | "This house needs more than that!" (Print 54 2) if dishes unwashed, otherwise "It is already closed." (Print 54 3) |
| TODO | Action | `open/door,closet,pantry` | "It is already open." (Print 54 4) if open, or opens closet door if player in rect 40 137 70 150 |
| TODO | Action | `close/door,closet,pantry` | "It is already closed." (Print 54 3) if closed, or closes closet door if player in rect |
| TODO | Action | `sit` | "Not now." (Print 54 5) |
| TODO | Action | `clean[/cottage]` | Cleans house if conditions met (starts cleaning quest) |
| TODO | Action | `clean,scrub/table,dish` | Cleans table if conditions met |
| TODO | Action | `clean,do,scrub,sweep,dust[/dish,dirt,furniture]` | "The room is nice and clean now." (Print 54 9) if cleaned, otherwise "This house needs more than that!" (Print 54 2) |
| TODO | Action | `chew,drink,chew/soup` | "Not now." (Print 54 5) if soup not available, otherwise "The soup is delicious!" (Print 54 10) |
| TODO | Get | `/dish[<dirty]` | "You don't want dirty dishes!" (Print 54 11) or "You don't need them." (Print 54 12) |
| TODO | Get | `/broom` | "You don't need the broom." (Print 54 13) if near, otherwise "What broom?" (Print 54 14) |
| TODO | Get | `/caldron` | "The pot doesn't belong to you." (Print 54 15) |
| TODO | Get | `/bowl` | "You don't need the soup bowls." (Print 54 16) |
| TODO | Get | `/soup` | "You're not hungry now." (Print 54 17) if soup drunk, otherwise "The soup doesn't belong to you." (Print 54 18) |
| TODO | Get | `/pouch,diamond` | Picks up pouch if conditions met, awards 2 points |
| TODO | Look | `is<how<time` or `[!*]/time` | "The clock is broken." (Print 54 0) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | `startClean` | Player types "clean" in cottage with unwashed dishes and sink has dishes | Initiates cleaning sequence: moves player through kitchen, leads to room 53 |
| TODO | Interaction | `cleanKitchen` | Player returns to room after dishes washed (global115=1) | Full cleaning animation: washes remaining dishes, sweeps floor, updates state, awards 5 points, moves to room 654 |
| TODO | Interaction | `cleanTable` | Player types "clean table" or "scrub dish" with dishes washed but table dirty | Cleans table in stages, disposes of dirty bowl views, updates global177 flag |
| TODO | Interaction | `doorOpen` | Player opens closet door | Moves player to door, plays open animation |
| TODO | Interaction | `doorClose` | Player closes closet door | Moves player to door, plays close animation |
| TODO | Interaction | `useSteps` | Player uses control area near stairs | Moves player up or down stairs to bedroom (room 53) |
| TODO | Background | `bounceBitchScript` | Runs continuously on dwarf NPC | Monitors player position; if player is alone in room (not cleaning, dwarf not hostile), triggers dwarf to chase and eject player |
| TODO | Background | `dishDust` | Created during dish cleaning animation | Displays dust particles following player during washing |
| TODO | Background | `sweepDust` | Created during floor sweeping animation | Displays dust particles following player during sweeping |
## Technical Notes
- **Room Number**: 54
- **Picture**: 54
- **Region**: 601 (Dwarf cottage region)
- **Exits**: North→53 (via stairs or control area), East→22 (via control area), South→53 (via control area), West→654 (after cleaning)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | 1 | Room initialization flag |
| `global102` | 0, 1, 2 | Kitchen cleaned state: 0=dishes unwashed, 1=cleaned, 2=dwarf ejected player |
| `global115` | 0, 1 | Cleaning in progress flag |
| `global122` | 0, 1 | Dwarf is hostile/chasing player |
| `global176` | 0, 1 | Player has drunk soup |
| `global177` | 0, 1 | Table cleaned (dirty bowls removed) |
| `global182` | 0, 1 | Diamond collected |
| `global189` | 0, 1 | Room completion flag |
| `global204` | 0, 1 | Script running flag |
| `global205` | 0, 1 | Script running flag |
| `local25` | 0, 1 | Player movement blocked during scripts |
| `newProp_2 cel` | 0, >0 | Closet door state: 0=closed, >0=open |
### Synonyms
- `sink` = `counter`
- `cottage` = `room`
### Inventory Items Referenced
- Item 1: Pouch/Diamond
- Item at 1: Crown (referenced in code but not used in room 54)

View File

@@ -0,0 +1,63 @@
# Room 56: Seven Dwarfs' Diamond Mine (West)
This is the western section of the Seven Dwarfs' diamond mine. The room contains working dwarfs, a bucket full of diamonds, and a dwarf who will give the player a lantern in exchange for returning a lost pouch of diamonds. The room has different visual states depending on whether the player has found the pouch and whether they've returned it to receive the lantern.
## Look Description
"One dwarf appears to be idling by the diamond bucket."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look room` / `look mine` / `look diamond mine` | "One dwarf appears to be idling by the diamond bucket." |
| TODO | Look | `look dwarf` | "You see the busy little dwarfs hard at work within the diamond mine. The diamonds flash and sparkle from the earthen walls." |
| TODO | Look | `look bucket` | "You see a bucket brim full of sparkling diamonds." |
| TODO | Talk | `talk dwarf` / `converse dwarf` (near dwarf, has pouch, no lantern) | Triggers answer1 script with dialogue sequence |
| TODO | Talk | `talk dwarf` / `converse dwarf` (not near dwarf or no pouch) | "You attempt to talk with the dwarf by the bucket again, but he only ignores you. You get the message." |
| TODO | Action | `kiss dwarf` / `kiss` (near dwarf) | "You attempt to kiss the dwarf, but he seems embarrassed by it." |
| TODO | Action | `deliver pouch` / `return pouch` / `deliver diamond` / `return diamond` (has pouch, no lantern, near dwarf) | Triggers handOff script - dwarf accepts pouch, gives lantern, awards 3 points |
| TODO | Action | `deliver pouch` / `return pouch` / `deliver diamond` / `return diamond` (not near dwarf) | "The dwarf is not interested." |
| TODO | Action | `deliver pouch` / `return pouch` / `deliver diamond` / `return diamond` (doesn't have pouch) | "The dwarf is not interested." |
| TODO | Get | `get bucket` / `rob bucket` | "The bucket is not yours, Rosella!" |
| TODO | Get | `get lantern` / `rob lantern` | "You were raised better than that!" |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | dwarvesMove | Continuous | Controls dwarf character animations - randomly selects from 6 different movement/animation sequences for the working dwarfs |
| TODO | Background | sparkle | Continuous when `diamonds_visible = true` | Randomly selects one of 4 diamond sparkle props, plays sparkle animation cycle, repeats continuously |
| TODO | Interaction | answer1 | Talking to dwarf with pouch but no lantern | Displays multi-line dialogue sequence where dwarf explains player shouldn't be in mine, then offers lantern in exchange for pouch |
| TODO | Interaction | handOff | Delivering pouch to dwarf while near bucket | Stops dwarf animations, hides sparkle effects, shows dwarf accepting pouch animation, awards 3 points, gives player lantern (item 3), then resumes dwarf work animations |
## Technical Notes
- **Room Number**: 56
- **Picture**: 56
- **Style**: $0010
- **Region**: 600 (Diamond Mine)
- **Exits**: West→55
- **Music**: Dwarf theme (sound #30, looping via region)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `diamonds_visible` | `true`, `false` | Whether diamond sparkles are visible (global223) |
| `has_pouch` | `true`, `false` | Player has pouch of diamonds (item 1) |
| `has_lantern` | `true`, `false` | Player has received lantern from dwarf (item 3) |
| `pouch_returned` | `true`, `false` | Player has returned pouch to dwarf (controls room visuals and available interactions) |
### Additional Technical Details
- Room uses Region 600 for shared diamond mine interactions
- Room has different visuals based on inventory state:
- With pouch (item 1): Dwarf by bucket appears with different animation
- Without pouch: Different dwarf positions, no pouch on dwarf
- With lantern (item 3): Lantern visible on dwarf
- Without lantern: No lantern shown on dwarf
- When delivering pouch to dwarf, player receives lantern and 3 points are awarded
- Player enters at position (65, 139) from east (Room 55)
- Edge detection returns player to Room 55 if they go too far east (onControl $0040)
- Global101 is set to 1 on room entry (purpose unclear - may be initialization flag)

View File

@@ -0,0 +1,84 @@
# Room 57: Witches' Cave
This is the interior of a dismal cave inhabited by three one-eyed old witches who share a single glass eye. The cave contains a cauldron bubbling with foul brew over a fire, various bottles and jars, a human skull on a shelf, and optionally a black scarab. The witches can be in different states depending on whether the player has taken their glass eye or returned it. Players can interact with the witches, retrieve the glass eye or scarab, and return items to the witches.
## Look Description
"This is a dismal and dreary cave. In the center of the cave, over a hot fire, boils a foul-smelling brew inside a large black cauldron."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look /eye` | "The blind, one-eyed hags peer at you through a glass eye." (if owned by room 57) |
| TODO | Look | `look /hag` / `look /fishwife` | "Three, old one-eyed crones inhabit this dreary cave. They possess a glass eye, which they pass from one to another, that enables them to see. Through the glass eye, they each in turn peer at you with a frightening mixture of curiosity and malice." |
| TODO | Look | `look /bottle` | "You see bottles and jars of disgusting-looking stuff. None of it interests you, though." |
| TODO | Look | `look /caldron` | "A greenish, foul brew boils ominously within the cauldron." |
| TODO | Look | `look /brew` | "The green brew looks disgusting...and smells that way, too!" |
| TODO | Look | `look /fire` | "A hot fire burns under a large cauldron filled with bubbling brew." |
| TODO | Look | `look out /cave` | "Outside the cave, you see the terrible grabbing trees." |
| TODO | Look | `look /dirt` / `look down` | "You see a black scarab on the cave floor." (if scarab present) / "There is nothing of interest on the cave floor." |
| TODO | Look | `look /wall` | "There is nothing of interest on the rough cave walls." |
| TODO | Look | `look /shelf` | "You see bottles and jars of disgusting-looking stuff. None of it interests you, though." |
| TODO | Look | `look /skull` | "You shiver at the sight of a human skull on the shelf." |
| TODO | Look | `look around` / `look room` / `look` | "This is a dismal and dreary cave. [Witches description if global109 >= 3] [Scarab description if scarab present]" |
| TODO | Get | `get /bottle` | "You don't want any of them." |
| TODO | Get | `get /skull` | "You don't need it." |
| TODO | Get | `get /brew` | "You wouldn't want it!" |
| TODO | Get | `get /caldron` | "It's too heavy to carry." |
| TODO | Get | `get /eye` / `rob /eye` | "You just manage to snatch the glass eye from the grasp of the old witches! Now they are totally blind and helpless." (if in correct position and not already owned) |
| TODO | Get | `rob /charm` / `get /charm` | Picks up the black scarab (if present and player has empty hand) |
| TODO | Action | `chew /brew` / `drink /brew` | "You gag at the thought!" |
| TODO | Action | `kill /hag` | "You couldn't do it." |
| TODO | Action | `get /hag` | "You wouldn't want them." |
| TODO | Action | `kiss /hag` | "YUCK!!" |
| TODO | Action | `deliver [item] /hag` | "The witches don't want it." |
| TODO | Talk | `talk /hag` / `converse` | Various dialogue responses depending on glass eye state |
| TODO | Inventory | `deliver /eye` / `return /eye` / `fling /eye` | Returns the glass eye to the witches, triggers different responses based on whether witches are in moan state |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | rm57Script | Entering room | Displays entry messages, triggers scarab toss if applicable |
| TODO | Interaction | witchEye | Continuous when witches are in normal state | Controls witch eye animation and tracking |
| TODO | Interaction | witchChase | Player approaches witches without glass eye | Witches chase and catch player, triggers transformation |
| TODO | Interaction | witchMoan | Player returns glass eye to witches | Witches moan and plead, transition through animations |
| TODO | Interaction | answer1 | Talking to witches when eye is in room | First dialogue sequence with witches |
| TODO | Interaction | answer2 | Talking to witches when player has eye | Dialogue with random responses about returning eye |
| TODO | Interaction | answer3 | Talking to witches when player has no eye | Dialogue with random responses |
| TODO | Interaction | pickUp | Player attempts to take scarab | Player picks up scarab, animation plays, score awarded |
| TODO | Interaction | scarabToss | Room init (if scarab present) or after giving eye | Scarab tosses toward player or animates in room |
| TODO | Interaction | ouchness | Player touches hazard area (control code $0004) | Plays "Ouch!" response |
| TODO | Background | witchEye | Continuous when `global109 > 2` | Witch eye follows player, manages eye passing animation between three witches |
| TODO | Background | witchChase | Continuous when player near witches without eye | Witches pursue player around cave |
## Technical Notes
- **Room Number**: 57
- **Picture**: 57
- **Exits**: South→6
- **Music**: Witch music (sound #12)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global109` | `< 3`, `>= 3` | Whether witches are visible (depends on game progress) |
| `global207` | `0`, `1` | Whether scarab is on ground (1 = present) |
| `local10` | `0`, `1` | Whether player has returned eye to witches (1 = returned) |
| `local12` | `0`, `1` | Whether player has been caught by witches (1 = caught) |
| `local13` | `0`, `1` | Hazard touch cooldown flag |
| `global182` | `0`, `1` | Score flag for eye/scarring pickup |
| `global127` | `0`, `1` | Player caught state flag |
### Additional Technical Details
- Synonyms defined: `dirt` = `dirt`, `hag` = `fishwife`
- Three witches share one glass eye (inventory item #6)
- Witches can see through the glass eye, without it they are blind
- Player can steal the glass eye for +3 score
- Player can pick up black scarab (charm, inventory item #7) for +2 score
- If player approaches witches without glass eye and gets too close, witches chase and transform player
- Player has different dialogue options depending on whether they possess the glass eye
- Hazard zone in cave triggers pain response (control area $0004)

View File

@@ -0,0 +1,81 @@
# Room 58: Tower Organ Room
This is the interior of a dusty tower containing a large pipe organ. The room features spiral stairs descending downward, a bench in front of the organ, and a hidden drawer within the organ that contains a skeleton key. Players can sit at the organ and play it using sheet music, which triggers a special event that reveals the hidden drawer. There is also a hole in the floor that leads to the staircase below (Room 61), and players can fall through the floor if they step on a weak area.
## Look Description
"A dusty, old pipe organ sits in the center of the tower room."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look room` / `look tower` | "A dusty, old pipe organ sits in the center of the tower room." |
| TODO | Look | `look <down` / `look stair` | "The tower stairs spiral steeply downward." |
| TODO | Look | `look behind organ` | "There is nothing but dust behind the old organ." |
| TODO | Look | `look in organ` | "You see nothing in the organ." |
| TODO | Look | `look organ` | "Dust and cobwebs cover the old organ." |
| TODO | Look | `look bench` | "There is a bench in front of the old organ." |
| TODO | Look | `look wall` | "There is nothing of importance on the walls." |
| TODO | Look | `look dirt` / `look <down` | "There is nothing of interest on the floor." |
| TODO | Look | `look drawer` | [varies based on state - see Technical Notes] |
| TODO | Action | `move bench` | "There's no need to move the bench." |
| TODO | Inventory | `play/use music<sheet` (at organ with sheet music) | "You find it difficult to read the old sheet music, but you attempt it anyway." (Print 58 12) |
| TODO | Inventory | `play/use music<sheet` (not at organ) | "What music?" (Print 58 13) |
| TODO | Inventory | `play/use music<sheet` (at organ without sheet music) | "You are not sitting at the organ." (Print 58 14) |
| TODO | Action | `play/use organ` / `play/use music` / `play` (at organ with sheet music) | "You can only remember one 'oldie, but goodie.'" (Print 58 15) |
| TODO | Action | `play/use organ` / `play/use music` / `play` (not at organ) | "You're not sitting at the organ." (Print 58 16) |
| TODO | Action | `sit` / `sit organ` / `sit bench` (at organ) | "You are already." (Print 58 17) |
| TODO | Action | `sit` / `sit organ` / `sit bench` (on bench) | "It would be better to move to the inside of the bench." (Print 58 18) |
| TODO | Action | `sit` / `sit organ` / `sit bench` (elsewhere) | "That won't work." (Print 800 1) |
| TODO | Action | `get<up` / `stand` / `stand<up` / `exit organ` / `exit bench` (when seated at organ) | Stand up from organ |
| TODO | Action | `get<up` / `stand` / `stand<up` / `exit organ` / `exit bench` (when not seated) | "You are already standing." (Print 58 19) |
| TODO | Inventory | `get/key` (drawer open, key present) | "You take the skeleton key from the drawer." (Print 58 20) |
| TODO | Inventory | `get/key` (drawer open, key already taken) | "What key?" (Print 58 21) |
| TODO | Inventory | `get/key` (drawer closed) | "What key?" (Print 58 21) |
| TODO | Action | `close drawer` (drawer open) | "There's no need to close the drawer." (Print 58 22) |
| TODO | Action | `close drawer` (drawer closed) | "You don't see a drawer." (Print 58 23) |
| TODO | Action | `open drawer` (drawer open) | "The drawer is already open." (Print 58 24) |
| TODO | Action | `open drawer` (drawer closed) | "You don't see a drawer." (Print 58 23) |
| TODO | Action | `open bench` | "The bench doesn't open." (Print 58 25) |
| TODO | Action | `find drawer` (drawer open) | "You already found it." (Print 58 26) |
| TODO | Action | `find drawer` (drawer closed) | "Drawer? What drawer?" (Print 58 27) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | playOrgan | Playing sheet music at organ | Plays organ music (sound 56), then reveals hidden drawer in organ, awards 4 points, shows drawer animation |
| TODO | Interaction | sitOrgan | Player types `sit` while near organ | Player moves to organ, sits down at organ bench, switches to view 58 (sitting animation) |
| TODO | Interaction | standOrgan | Player types `stand`/`get up` while seated | Player stands up from organ, returns to normal view (view 4) |
| TODO | Background | fallHole | Player steps on weak floor area (control $0004) | Player falls through floor with animation sequence, passes through room 61, ends up in Room 66 (dungeon cell) |
## Technical Notes
- **Room Number**: 58
- **Picture**: 58
- **Region**: 603 (shared tower region)
- **Exits**: Down→61 (via stairs or falling through hole)
- **Music**: Organ music (sound 57, plays when revealing drawer)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global193` | `0`, `non-zero` | Tracks whether organ drawer has been opened (0 = closed, 1+ = open) |
| `local1` | `0`, `1` | Local copy of drawer state (derived from global193) |
| `local3` | `0`, `1` | Tracks whether skeleton key is in drawer (1 = key present, 0 = key taken) |
| `global182` | `0`, `1` | Tracks whether player has obtained skeleton key |
| `global127` | `0`, `1` | Set after falling through hole (triggers special death sequence in Room 66) |
### Additional Technical Details
- Inventory item 20 is the skeleton key
- Inventory item 26 is the sheet music
- The organ drawer is hidden and only revealed when the player plays the organ with sheet music
- Player must sit at the organ (in rect 129,121 to 195,126) to play it
- The hole in the floor (control $0040) leads to Room 61 (staircase below)
- Falling through weak floor (control $0004) triggers the fallHole script which eventually leads to Room 66
- Player view 58 is used when sitting at the organ
- View 44 is used for falling animation, view 42 for the dungeon sequence
- The drawer look response varies: "You see a skeleton key in the drawer" (key present), "You see an empty drawer" (key taken), or "What drawer?" (drawer not yet revealed)

View File

@@ -0,0 +1,85 @@
# Room 59: Baby Nursery
This is an old, neglected baby nursery in the haunted house. The room features a rocking cradle, chest of drawers, rocking horse, and window looking out to the cemetery. The main puzzle involves a ghostly baby that cries continuously until given the silver baby rattle (item 12). The ghost only appears at night (when global100 is set), and the rattle must be delivered to the cradle to quiet the baby and complete this side quest.
## Look Description
"This old baby nursery must have once been a cheery place. Now, through neglect, cobwebs decorate the corners, wallpaper peels from the walls, and dust covers the nursery furniture."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` `look/room` `look/bedroom` `look/nursery` | "This old baby nursery must have once been a cheery place. Now, through neglect, cobwebs decorate the corners, wallpaper peels from the walls, and dust covers the nursery furniture." (Print 59 0) |
| TODO | Look | `look<in/chest` `look<in/dresser` `look<in/drawer` | "The chest of drawers is empty." (Print 59 1) |
| TODO | Look | `look/chest` `look/dresser` | "The chest of drawers looks old and neglected." (Print 59 2) |
| TODO | Look | `look/chair` `look/rocker` | "You imagine the mother who must have rocked her baby in this rocking chair." (Print 59 3) |
| TODO | Look | `look/window` (when in rect 76-109, 125-147) | "You see the cemetery out the window." (Print 59 4) |
| TODO | Look | `look/window` (elsewhere) | "You can't see that from here." (Print 800 1) |
| TODO | Look | `look<in/cradle` `look/ghost` (when near cradle and global134 != 1) | "The baby cradle is empty." (Print 59 5) |
| TODO | Look | `look<in/cradle` `look/ghost` (when near cradle and global134 = 1) | "With trepidation, you peek into the rocking cradle and see nothing. Tentatively you reach your hand into it. There is nothing there!!" (Print 59 6) |
| TODO | Look | `look/cradle` (when global134 != 1) | "You see an empty cradle here." (Print 59 7) |
| TODO | Look | `look/cradle` (when global134 = 1) | "The baby cradle rocks to and fro as a baby's voice wails from within." (Print 59 8) |
| TODO | Look | `look/wall` | "There is nothing of importance on the walls." (Print 59 9) |
| TODO | Look | `look/dirt` `look<down` | "There is nothing of interest on the floor." (Print 59 10) |
| TODO | Look | `look/horse` `look/toy` | "There is an old rocking horse here." (Print 59 11) |
| TODO | Look | `look/carpet` | "A worn pink rug adorns the floor." (Print 59 12) |
| TODO | Action | `sit` | "That would waste your precious time." (Print 59 13) |
| TODO | Action | `bounce/rock/cradle` (when global134 = 1) | "The cradle is already rocking!" (Print 59 14) |
| TODO | Action | `bounce/rock/cradle` (when near cradle and global134 != 1) | Triggers rocking animation and baby sound |
| TODO | Action | `bounce/rock/cradle` (when not near cradle) | "You can't see that from here." (Print 800 1) |
| TODO | Action | `sit/on/mount/play/horse` `sit/on/mount/play/toy` | "You're too big for it." (Print 59 15) |
| TODO | Get | `get/horse` `get/toy` | "You don't need it." (Print 59 16) |
| TODO | Talk | `converse/calm` (when global134 = 1) | "You speak in a soft trembly voice to the fretful baby ghost. Unfortunately, the poor little thing continues its pathetic crying." (Print 59 17) |
| TODO | Talk | `kiss` (when global134 = 1) | "You'd like to, but you can't see it, or touch it." (Print 59 18) |
| TODO | Talk | `talk/ghost` (when global134 = 1 and said 'get') | "You reach your hand into the rocking cradle and feel around. There is nothing there but a strange coldness! A shiver runs down your spine as the unseen baby continues its incessant crying." (Print 59 19) |
| TODO | Talk | `kill/ghost` (when global134 = 1) | "How can you kill something that is already dead?" (Print 59 20) |
| TODO | Talk | `help/save/ghost` (when global134 = 1) | "You'd like to help the poor baby ghost, but how can you do that?" (Print 59 21) |
| TODO | Talk | `feed/ghost` (when global134 = 1) | "This baby doesn't eat!" (Print 59 22) |
| TODO | Talk | `hum/lullaby` (when global134 = 1) | "While trembling, you attempt to sing a lullaby to the whimpering baby ghost. It doesn't work. The poor thing continues its pitiful crying." (Print 59 23) |
| TODO | Inventory | `give/deliver/fling/place/drop` (not rattle, when global134 = 1) | "Obviously, as the crying continues, the baby ghost isn't interested in it." (Print 59 24) |
| TODO | Inventory | `give/deliver/fling/place/drop` (rattle, when near cradle and global134 = 1) | "You drop the silver rattle into the baby cradle. As you do so, the crying of the baby ghost and the rocking of the cradle cease. You breathe a big sigh of relief." (Print 59 25) - Awards 2 points, removes rattle from inventory |
| TODO | Inventory | `give/deliver/fling/place/drop` (rattle, when far from cradle and global134 = 1) | "You can't do that yet." (proc0_13) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | `rockMeBaby` | Called by rockAgain script | Animates the cradle (prop newProp) with rocking motion. Cycles forward, moves brTop up 2 pixels. |
| TODO | Background | `rockAgain` | Triggered by player command `bounce/rock/cradle` | Plays baby sound (sound 22), triggers rockMeBaby animation. Continues looping if global134 = 1. |
| TODO | Interaction | `rm59Script` | Entering room | After 5 seconds, prints "The crying baby seems to be in here." (Print 59 26) |
## Technical Notes
- **Room Number**: 59
- **Picture**: 59 (style $0010)
- **Region**: 603
- **Exits**: East→Room 62 (when in control area $0040 - window area)
- **Music**: Unknown
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | `0`, `non-zero` | Night flag - when set, ghost view (648) and animated cradle (536) are displayed |
| `global134` | `1`, `non-1` | Quest state - if 1, rattle has been delivered to cradle; ghost is active |
| `global133` | number | Previous room number - if player returns from room 59 with rattle delivered, continues rocking |
| `newProp` | object | The cradle prop (view 527) |
| `rattle_delivered` | `true` (global134=1), `false` (global134!=1) | Whether silver baby rattle (item 12) has been placed in cradle |
### Synonyms
- `ghost` = `baby` (from synonyms definition)
### Special Mechanics
- The ghost is only visible when global100 is set (nighttime). View 648 (ghost figure) is added to the scene at night.
- The cradle animation (view 536) only plays when global100 is set.
- The cradle prop (view 527) is always present but stationary.
- When returning to the room after delivering the rattle (global133=59 and global134=1), the rocking continues.
- Distance check of 15 pixels from cradle required to interact with cradle/ghost.
- Distance check of 10 pixels from cradle required to trigger rocking.
- Player must be within 17 pixels of cradle to deliver the rattle.
- The rattle (item 12) must be in inventory to deliver it.
- Score change: +2 points when rattle is delivered.
- Region 603 is triggered with event 2 when rattle is delivered (proc0_10 603 2).

99
rooms/kq4-060-bedroom.md Normal file
View File

@@ -0,0 +1,99 @@
# Room 60: Bedroom
This is the player's bedroom in the haunted castle tower. The room features a bed, window with view, fireplace, carpet, chest/dresser, chandelier, and a ladder leading up to an attic (room 63). A ghost/fishwife NPC appears in the room under specific quest conditions. The player can climb the ladder to reach the attic or exit through the window area to room 68.
## Look Description
"You are in a small but comfortable bedroom. Through the window you can see the castle grounds. A bed occupies one corner, and a ladder leads up through a trapdoor in the ceiling."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look room` | "[Look room description]" (Print 60 0) |
| TODO | Look | `look` (when ghost present) | "[Ghost description]" (Print 60 1, conditional on global134==3) |
| TODO | Look | `look under bed` | "[Under bed description]" (Print 60 2) |
| TODO | Look | `look bed` | "[Bed description]" (Print 60 3) |
| TODO | Look | `look window` (when near window) | "[Window description]" (Print 60 4) |
| TODO | Look | `look window` (when far from window) | "[Not near window message]" (Print 800 1) |
| TODO | Look | `look fireplace` | "[Fireplace description]" (Print 60 5) |
| TODO | Look | `look carpet` | "[Carpet description]" (Print 60 6) |
| TODO | Look | `look in chest` / `look in dresser` / `look in drawer` | "[Container contents]" (Print 60 7) |
| TODO | Look | `look chandelier` | "[Chandelier description]" (Print 60 8) |
| TODO | Look | `look chest` / `look dresser` | "[Furniture description]" (Print 60 9) |
| TODO | Look | `look wall` | "[Wall description]" (Print 60 10) |
| TODO | Look | `look dirt` / `look down` | "[Floor description]" (Print 60 11) |
| TODO | Look | `look ceiling` (with ladder) | "[Ceiling with ladder]" (Print 60 12) |
| TODO | Look | `look ceiling` (without ladder) | "[Ceiling without ladder]" (Print 60 13) |
| TODO | Look | `look in trapdoor` / `look up trapdoor` (with ladder) | "[Trapdoor open]" (Print 60 14) |
| TODO | Look | `look in trapdoor` / `look up trapdoor` (without ladder) | "[Trapdoor closed]" (Print 60 15) |
| TODO | Look | `look up` (with ladder) | "[Looking up at open trapdoor]" (Print 60 16) |
| TODO | Look | `look up` (without ladder) | "[Nothing to look up at]" (proc0_15) |
| TODO | Look | `look ladder` (with ladder visible) | "[Ladder description]" (Print 60 17) |
| TODO | Look | `look ladder` (without ladder) | "[No ladder visible]" (Print 60 18) |
| TODO | Look | `look trapdoor` (with ladder) | "[Open trapdoor]" (Print 60 19) |
| TODO | Look | `look trapdoor` (without ladder) | "[Closed trapdoor]" (Print 60 20) |
| TODO | Action | `open trapdoor` (with ladder) | "[Already open]" (Print 60 21) |
| TODO | Action | `open trapdoor` (without ladder) | "[Opens trapdoor]" (Print 60 22) |
| TODO | Action | `close trapdoor` (with ladder) | "[Closes trapdoor]" (Print 60 23) |
| TODO | Action | `close trapdoor` (without ladder) | "[Already closed]" (Print 60 24) |
| TODO | Action | `open chest` / `open dresser` / `open drawer` | "[Container already open]" (Print 60 7) |
| TODO | Action | `lay in bed` / `sleep in bed` / `get in bed` | "[Cannot sleep now]" (Print 60 25) |
| TODO | Action | `climb ladder` (with ladder, near ladder, below top) | "[Climb ladder to attic]" (triggers climbLadder script) |
| TODO | Action | `climb ladder` (with ladder, not close enough) | "[Not near ladder]" (Print 800 1) |
| TODO | Action | `climb ladder` (with ladder, at top) | "[Already at top]" (Print 60 26) |
| TODO | Action | `climb ladder` (without ladder) | "[No ladder]" (Print 60 27) |
| TODO | Action | `climb` | "[Climb what?]" (Print 60 28) |
| TODO | Action | `move` | "[Cannot move that]" (Print 60 29) |
| TODO | Look | `look ghost` / `look fishwife` (when ghost present) | "[Ghost description]" (Print 60 1) |
| TODO | Look | `look chair` (when ghost present) | "[Chair description]" (Print 60 30) |
| TODO | Talk | `talk ghost` / `talk fishwife` / `talk` (when ghost present) | "[Ghost dialogue]" (Print 60 31) |
| TODO | Action | `get ghost` / `get fishwife` (when ghost present) | "[Cannot take ghost]" (Print 60 32) |
| TODO | Action | `get/capture ghost` / `get/capture fishwife` (when ghost present) | "[Cannot capture ghost]" (Print 60 33) |
| TODO | Action | `kill ghost` / `kill fishwife` (when ghost present) | "[Cannot kill ghost]" (Print 60 34) |
| TODO | Action | `kiss ghost` / `kiss fishwife` / `kiss` (when ghost present) | "[Ghost reaction]" (Print 60 35) |
| TODO | Action | `help ghost` / `help fishwife` (when ghost present) | "[Ghost help response]" (Print 60 36) |
| TODO | Inventory | `deliver [item]` (to ghost, when near and has item) | "[Gift accepted - wedding ring]" (Print 60 37, +2 score, clears ghost) |
| TODO | Inventory | `deliver [item]` (to ghost, wrong item) | "[Ghost rejects item]" (Print 60 38) |
| TODO | Inventory | `deliver [item]` (when not near ghost) | "[Not near ghost]" (Print 800 1) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | climbLadder | Player types `climb ladder` when ladder is visible and player is positioned below/at ladder | Disables actor collisions, moves ego to ladder position (161,140), plays climbing view animation (view 77, loop 0), moves ego up to position (161,48), sets climbing state (global204=0, global205=1), then transports to Room 63 (attic) |
| TODO | Interaction | climbDown | Entering room from Room 63 (attic) via `gPrevRoomNum == 68` check | Plays descending animation (view 77, loop 1 in reverse), moves ego from trapdoor position down to floor (161,140), restores normal view (view 4, loop 3), resets climbing state (global205=0), enables actor collisions |
## Technical Notes
- **Room Number**: 60
- **Picture**: 60
- **Region**: 603 (Haunted House - controls ghost appearance)
- **Exits**: East→68 (through window/control area), Up→63 (via ladder when visible)
- **Synonyms**: `room` = `bedroom`
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | `true`, `false` | Controls ghost/fishwife visibility in room |
| `global134` | Various values | Quest progression state - ladder appears when > 4; ghost appears when == 3 |
| `global133` | Room number | Current room number - compared to trigger ghost interactions |
| `global225` | `1` | Ghost quest active flag - when == 1 enables ghost interactions |
| `local1` | `0`, `1` | Ladder/trapdoor state - set to 1 when global134 > 4 (ladder visible) |
| `global204` | `0`, `1` | Climbing state - set to 0 when climbing up |
| `global205` | `0`, `1` | Climbing flag - set to 1 when ascending, 0 when on ground |
| `newView` | View object | Ladder upper portion (view 529, loop 1) |
| `newView_2` | View object | Ladder lower portion (view 529, loop 0) |
### Additional Technical Details
- Room applies Region 603 in init for haunted house logic
- When global100 is true: displays ghost visual elements (view 648, prop 536 with animation)
- When global134 > 4: loads and displays ladder views (529), sets local1 = 1
- Entry from Room 68 positions ego at (68,159) with view 4 (falling/descending)
- Entry from other rooms positions ego at (161,59) with view 77, triggers climbDown script
- Exit to Room 68 triggered by control area $0040 (window/door area)
- Ghost interactions only active when: global134==3 AND global225==1 AND global100==true
- Giving item 28 (wedding ring) to ghost: removes item, awards 2 points, calls proc0_10 to clear ghost
- Ladder climb checks: player must be within distance 10 of ladder and at or below ladder's Y position

View File

@@ -0,0 +1,49 @@
# Room 61: Tower Stairs
This is the interior spiral staircase of the stone tower in the old house. The room consists of narrow, steep steps that wind upward to the top of the tower and downward to the cellar. Players can look at the stairs, walls, and surrounding features, but there are no objects to interact with. Walking on the stairs triggers a dangerous falling sequence that transports the player to the cellar room.
## Look Description
"The steps spiral steeply up the stone tower of this old house."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look stair` / `look stairs` / `look step` / `look steps` | "The steps in this tower are steep and narrow. Be careful!" |
| TODO | Look | `look down` / `look <down` | "Don't look down!" |
| TODO | Look | `look wall` | "You don't see anything of interest on the walls." |
| TODO | Look | `look up` / `look <up` | "You're almost to the top!" |
| TODO | Look | `look around` / `look room` / `look tower` | "The steps spiral steeply up the stone tower of this old house." |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | fallStairs | Walking on control area $0004 (stair area) while no other script is running | Plays falling sound, changes player to falling view (44), animates player tumbling down the stairs, transitions to Room 66 (cellar), plays landing sequence with screen shake, sets `global127 = 1` to indicate fall occurred |
| TODO | Background | myLooper | Continuous when player is on control area $0200 (climbing area) | Adjusts player's loop direction based on heading: heading 335-25 (north/up) sets loop 2, heading 155-205 (south/down) sets loop 3, heading 26-154 (west) sets loop 0, other headings set loop 1 |
## Technical Notes
- **Room Number**: 61
- **Picture**: 61
- **Region**: 603 (Tower)
- **Exits**: Down→66 (Cellar), Up→58 (Top of Tower)
- **Music**: Sound 51 (fall sound)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | `1` | Set to 1 on room init |
| `global127` | `0`, `1` | Set to 1 when player completes the fallStairs script |
| `local0` | - | Stores return value from Print call in fallStairs state 0 |
### Additional Technical Details
- Room uses Region 603 for tower-related logic
- Entry from Room 66 positions player at coordinates (111, 171) with view 4, loop 0, xStep 2, yStep 1
- Entry from Room 58 positions player at coordinates (155, 44) with view 4, xStep 4, yStep 2
- When player y > 130 and not on fallStairs script, looper is disabled
- Control areas: $0040 = exit to room 66 (down), $0020 = exit to room 58 (up), $0004 = fall trigger area, $0200 = climbing area (enables looper)
- fallStairs script changes room picture to 66 during fall animation sequence

56
rooms/kq4-062-bedroom.md Normal file
View File

@@ -0,0 +1,56 @@
# Room 62: Bedroom
This is the interior of an abandoned bedroom in what appears to have been the master bedroom of a house. The room features a large bed, a dresser with a broken mirror, a chandelier (lamp), and a tattered carpet. The room has exits leading north and south. The chandeliers are only visible when global100 is set. The player can look at various objects but cannot interact with the bed meaningfully.
## Look Description
"It appears as if this was once the master bedroom. However, cobwebs hang everywhere, and dust covers the furniture."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look under bed` / `look <under/bed` | "There is nothing under the bed." |
| TODO | Look | `look bed` | "The old bed is massive and dominates the room." |
| TODO | Look | `look window` | "You don't see a window." |
| TODO | Look | `look in chest` / `look in dresser` / `look in drawer` / `look <in/chest,dresser,drawer` | "The drawers are empty." |
| TODO | Look | `look chest` / `look dresser` | (If x < 150): "You see a small dresser." / (If x >= 150): "A chest of drawers, sporting a broken mirror, sets against the wall." |
| TODO | Look | `look wall` | "There is nothing of importance on the walls." |
| TODO | Look | `look chandelier` / `look lamp` | "The lamp is old and dusty." |
| TODO | Look | `look dirt` / `look down` | "There is nothing of interest on the floor." |
| TODO | Look | `look mirror` | (If near mirror positions): "You look in the mirror and see the reflection of a poor, but beautiful, peasant girl." / (Otherwise): "You're not close enough to look in either mirror." |
| TODO | Look | `look carpet` / `look rug` | "A tattered oriental rug covers the floor at the foot of the bed." |
| TODO | Look | `look around` / `look room` / `look [<around][/room]` | "It appears as if this was once the master bedroom. However, cobwebs hang everywhere, and dust covers the furniture." |
| TODO | Action | `open chest` / `open dresser` / `open drawer` | "The drawers are empty." |
| TODO | Action | `get on bed` / `get in bed` / `lay on bed` / `lay in bed` / `sleep on bed` / `sleep in bed` | "You don't have time for that!" |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | Chandelier | Room init when `global100 != 0` | Creates two Prop objects with view 536, loops 1 and 2, at positions (114,77) and (205,77), with cel 0 and 1 respectively, set to priority 4 with forward cycling animation |
## Technical Notes
- **Room Number**: 62
- **Picture**: 62
- **Region**: 603 (GhostWander)
- **Exits**: North→68 (via control area $0040), South→59 (via control area $0020)
- **Synonyms**: `room` = `bedroom`
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | `0`, `non-zero` | Controls visibility of chandelier props (non-zero = visible) |
| `global133` | Room number | Current room number |
| `global134` | `0-254` | Used with region 603 for ghost wandering state |
### Additional Technical Details
- Entry from Room 59: Player positioned at (47, 129), view 4, xStep 4, yStep 2
- Entry from Room 68: Player positioned at (244, 157), view 4, xStep 4, yStep 2
- Two chandelier Props (view 536) created conditionally based on global100
- Mirror has position-specific responses - only works when player is in rect (19,148,80,168) or (191,133,271,162)
- Dresser response varies based on player's x position (< 150 vs >= 150)
- Uses region 603 for ghost NPC wandering behavior

85
rooms/kq4-063-attic.md Normal file
View File

@@ -0,0 +1,85 @@
# Room 63: Attic
The attic is a cramped, dusty space in the old haunted house. It features an open trapdoor with a ladder leading down to the bedroom below, an interesting wooden chest near the trapdoor, and various junk and boxes scattered throughout. The little boy ghost haunts this room, sitting on top of the chest. The player can interact with the chest to find sheet music, and can climb down the ladder to reach the bedroom below. There's also a window looking out toward the cemetery.
## Look Description
"After adjusting your eyes to the gloom, you soon see that you have stumbled upon the musty attic of the old house. The trapdoor in the floor is open, and from it, a ladder leads down to the room below. Useless junk and boxes clutter the room. There is an interesting chest near the open trapdoor."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look boxes` | "There is nothing of interest in the old boxes." |
| TODO | Look | `look birdcage` / `look in birdcage` | "It's just an old bird cage...nothing interesting there." |
| TODO | Look | `look in chest` | If chest closed: If ghost on chest (global134=5): "The top of the wooden chest is currently occupied by a naughty little ghost." / Otherwise: "The wooden chest is not open." If chest open: If has sheet music: "You peek into the open chest, and find...an old set of sheet music! You take the sheet music and carry it with you." / Otherwise: "You peek into the open chest, and find...nothing." |
| TODO | Look | `look chest` | If ghost on chest (global134=5): "The top of the wooden chest is currently occupied by a naughty little ghost." / Otherwise: "An interesting wooden chest catches your attention." |
| TODO | Look | `look in trapdoor` | If near trapdoor (in rect 135,138,182,148): "You can see into the room below. There's nothing there." / Otherwise: "You can't see from here." |
| TODO | Look | `look trapdoor` / `look down` | "The trapdoor in the attic floor is open. From it, a ladder leads to the room below." |
| TODO | Look | `look ladder` | "A ladder descends from the open trapdoor into the room below." |
| TODO | Look | `look window` | "You see the cemetery out the window." |
| TODO | Look | `look junk` | "The old junk is useless." |
| TODO | Look | `look wall` | "There is nothing of importance on the walls." |
| TODO | Look | `look dirt` / `look floor` | "There is nothing of interest on the floor." |
| TODO | Look | `look ghost` | If ghost in this room (global133=63): "The little boy ghost laughs, and refuses to budge from his seat on top of the chest. It might help if he had a toy to play with." / Otherwise: "What ghost?" |
| TODO | Look | `look around` / `look room` / `look [<around][/room]` | "After adjusting your eyes to the gloom, you soon see that you have stumbled upon the musty attic of the old house. The trapdoor in the floor is open, and from it, a ladder leads down to the room below. Useless junk and boxes clutter the room. There is an interesting chest near the open trapdoor." |
| TODO | Action | `play boy` / `play ghost` | If ghost in room (global133=63): "The boy ghost laughs and teases, and refuses to leave his spot on top of the chest." / Otherwise: "There is no need to do that." |
| TODO | Action | `climb ladder` / `climb down` | If in rect (131,138,205,159): Triggers climbDown script to go to room 60 / Otherwise: "You're not close enough." |
| TODO | Action | `close trapdoor` | "The trapdoor is already open." |
| TODO | Action | `open trapdoor` | "The trapdoor is already open." |
| TODO | Get | `get chest` | "The chest is too heavy. You cannot carry it." |
| TODO | Get | `get ghost` / `move ghost` / `detach ghost` | If ghost in room (global133=63): "You're afraid to get too near the ghost." / Otherwise: "What ghost?" |
| TODO | Action | `close chest` | If chest open: Closes chest, sets local0=0 / Otherwise: "The chest is already closed." |
| TODO | Action | `open chest` | If already open: "The chest is already open." / If ghost on chest (global134=5): "The top of the wooden chest is currently occupied by a naughty little ghost." / If in rect (141,120,193,129): Opens chest, sets local0=1 / Otherwise: "You're not close enough." |
| TODO | Inventory | `use toy` / `deliver toy/ghost` | If boy ghost in room 63 and has toy horse (item 30): Ghost accepts toy and disappears, player gets 2 points (handled by boyScript in region 603) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | climbDown | Player types `climb ladder` or `climb down` when in position | Stops player motion, changes view to descending animation (view 40, loop 1), then to climbing down (view 77, loop 2), and transitions to room 60 |
| TODO | Interaction | climbIn | Room initialization | Plays entry animation when entering room 63 from below - Rosella climbs up through trapdoor using ladder (view 77 loop 2, then view 40 loop 1), then returns to normal walking view |
| TODO | Interaction | fallDead | Player walks into control area $0004 (pit/hole) | Falls to death sequence - plays fall sound (52), shows falling animation (view 44), then death scene with screen shake and game over |
## Technical Notes
- **Room Number**: 63
- **Picture**: 63
- **Region**: 603 (GhostWander - Haunted House)
- **Exits**: Down→60 (via ladder at trapdoor position)
- **Music**: Sound 52 (falling sound)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `local0` | `0`, `1` | Chest state: 0 = closed, 1 = open |
| `global134` | `0-255` | Ghost type/state for region 603 (5 = boy ghost active) |
| `global133` | Room number | Current room where ghost is located |
| `global182` | `0`, `1` | Sheet music taken flag (1 = taken) |
| `global204` | `0`, `1` | Climbing state - down indicator |
| `global205` | `0`, `1` | Climbing state - up indicator |
| `global100` | `0`, `non-zero` | Controls visibility of certain props (e.g., candelabra when non-zero) |
### Additional Technical Details
- Entry from Room 60: Player climbs up ladder, triggers climbIn script
- Room loads picture 60 as background during fall/death sequence
- Player cannot fall into pit in this room - control area $0004 triggers death sequence
- Chest can only be opened when player is in rect (141,120,193,129) - near the chest position
- Trapdoor is always open in this room (open/close are no-ops)
- Ladder descent only works when player is in rect (131,138,205,159) - near the trapdoor
- The ghost boy (boyScript from region 603) sits on top of the chest when global134=5 and global133=63
- Player can get sheet music (item 26) from chest when it's open and they haven't taken it yet (+2 score)
- Uses region 603 for boy ghost NPC behavior and wandering
### Boy Ghost Interactions (from Region 603)
The boy ghost in this room responds to various commands through the GhostWander region (603):
- `deliver toy` / `give toy`: Gives toy horse (item 30) to ghost, triggers ghost to leave (+2 score)
- `talk` / `converse`: Ghost just giggles
- `look ghost`: Describes ghost sitting on chest
- `play ghost`: Ghost laughs and refuses to move
- `get ghost` / `capture ghost`: Cannot capture ghost
- `kill ghost`: Cannot kill already dead ghost
- `help ghost`: "You'd like to help the little boy ghost, but how can you do that?"

View File

@@ -0,0 +1,58 @@
# Room 64: Old Dining Room
This is an abandoned dining room in the witch's house. The room features a long table with crumbs, chairs, a window looking out to the cemetery, an empty hutch/cabinet, and a chandelier. When the witch has been defeated (global100 is set), lit candles appear on the table. The player can look at various features but cannot interact much with the room's contents.
## Look Description
"This old dining room has seen better days! The long table is littered with crumbs and dust, and against the wall, the empty hutch is covered with cobwebs."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look room` | "This old dining room has seen better days! The long table is littered with crumbs and dust, and against the wall, the empty hutch is covered with cobwebs." (Print 64 0) |
| TODO | Look | `look under table` / `look <under/table` | "There is nothing of interest under the table." (Print 64 1) |
| TODO | Look | `look table` | "The dusty old table is littered with crumbs." (Print 64 2) |
| TODO | Look | `look chair` | "The chairs seem to be falling apart." (Print 64 3) |
| TODO | Look | `look window` (when in position 231-278, 118-139) | "You see the cemetery out the window." (Print 64 4) |
| TODO | Look | `look window` (when not close enough) | "You're not close enough." (Print 800 1) |
| TODO | Look | `look cabinet` / `look hutch` | "There is nothing of interest in the hutch." (Print 64 5) |
| TODO | Look | `look chandelier` | "A tarnished chandelier hangs above the dining table." (Print 64 6) |
| TODO | Look | `look wall` | "There is nothing of importance on the walls." (Print 64 7) |
| TODO | Look | `look floor` / `look down` / `look dirt` | "There is nothing of interest on the floor." (Print 64 8) |
| TODO | Look | `look crumb` / `look crumbs` | "You see crumbs here." (Print 64 9) |
| TODO | Action | `sit` | "You don't have time for that!" (Print 64 10) |
| TODO | Get | `get crumb` / `get crumbs` | "You have no use for crumbs." (Print 64 11) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | CandleAnim | Continuous when `witch_defeated = true` | Three candle props (views 536/2, 536/1, 536/2 with different cels) animate with Fwd cycle on the table |
## Technical Notes
- **Room Number**: 64
- **Picture**: 64
- **Region**: 603 (no separate region script found)
- **Exits**: North→68 (top of room), South→65 (bottom of room)
- **Entry Points**: From Room 68: player positioned at (51, 130); From Room 65: player positioned at (210, 117)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `witch_defeated` | `true`, `false` | Set when the witch has been defeated (global100). When true, candles appear on the table |
| `global100` | Set when witch defeated | Controls candle visibility in the dining room |
| `global133` | Current room number | Checked to determine if player was last in this room |
| `global134` | Non-zero value | Used to track player position/state for the room region |
### Additional Technical Details
- Room applies Region 603 on entry (no separate script found)
- Exits use control areas: $0040 for north exit to room 68, $0020 for south exit to room 65
- When entering from room 65, player starts at position (210, 117) with view 4 (walking)
- When entering from room 68, player starts at position (51, 130) with view 4 (walking)
- Three static view elements (536, loop 3) show candle holders on the table
- When witch is defeated, additional props appear including two view 648 elements and three animated candle props with cycling animations
- Window can only be examined when player is within the rectangular area (231, 118) to (278, 139)

View File

@@ -0,0 +1,63 @@
# Room 65: Old Kitchen
This is the interior of the old kitchen in the haunted house. The room is dusty and bare, featuring a cold fireplace, empty pantry, caldron, butterchurn, barrel, shelves, chandelier, ladder, and a window looking out to the cemetery. The room has a haunted house ghost wandering script associated with it.
## Look Description
"The old kitchen is quite bare. The fireplace has been cold for years, and the dusty pantry is empty but for old crumbs."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look room` / `look kitchen` | "The old kitchen is quite bare. The fireplace has been cold for years, and the dusty pantry is empty but for old crumbs." |
| TODO | Look | `look pantry` | "The pantry is bare." |
| TODO | Look | `look fireplace` | "The fireplace is stone cold. An empty cooking pot sits in it." |
| TODO | Look | `look caldron` / `look pot` | "The cooking pot is empty and useless." |
| TODO | Look | `look butterchurn` | "The old butterchurn is empty and useless." |
| TODO | Look | `look window` (when near window at 229-277, 124-146) | "You see the cemetery out the window." |
| TODO | Look | `look window` (when not near window) | "You're not near the window." |
| TODO | Look | `look barrel` | "The barrel is empty. You can't use it." |
| TODO | Look | `look shelf` / `look cabinet` | "There is nothing that interests you on the kitchen shelves." |
| TODO | Look | `look chandelier` / `look lamp` | "The lamp is old and dusty." |
| TODO | Look | `look wall` | "There is nothing of importance on the walls." |
| TODO | Look | `look dirt` / `look down` / `look floor` | "There is nothing of interest on the floor." |
| TODO | Look | `look ladder` | "An old ladder sits in the middle of the floor." |
| TODO | Look | `look crumbs` | "You see crumbs here." |
| TODO | Look | `look bottle` (if player has bottle in inventory) | "[No message - unclaimed]" |
| TODO | Look | `look bottle` (if player does NOT have bottle) | "You don't have it." |
| TODO | Get | `get caldron` / `get pot` | "The cooking pot is empty and useless. You don't need it." |
| TODO | Get | `get butterchurn` | "The old butterchurn is empty and useless." |
| TODO | Get | `get barrel` | "The barrel is empty. You can't use it." |
| TODO | Get | `get crumbs` | "You have no use for crumbs." |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | boyGhost | Continuous when `ghost_state` = `BOY_GHOST` (state 5) and `gCurRoomNum = 65` | Boy ghost (Edgar) appears and walks to coordinates (240, 190), then transitions to room 64 |
## Technical Notes
- **Room Number**: 65
- **Picture**: 65
- **Region**: 603 (Haunted House)
- **Exits**: West→64 (via edge control area $0040)
- **Synonyms**: `caldron` = `caldron`, `shelf` = `cabinet`
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | `0`, `non-zero` | Whether the haunted house prologue event has occurred (daytime vs nighttime state) |
| `global133` | `gCurRoomNum` | Current room number (used by ghost AI) |
| `global134` | `0-255` | Ghost state in haunted house region: 1=baby, 2=miser, 3=lady, 4=lord, 5=boy, 255=completed |
### Additional Technical Details
- Room uses Region 603 for shared haunted house logic and ghost interactions
- If entering from Room 64 or as new game (Room 0), player starts at position (245, 162) with view 4
- Walking off the west edge (control area $0040) transports player to Room 64
- The caldron view is only visible when `global100` is set (haunted house activated)
- When `global100` is set, a fireplace flame animation plays (Prop with loop 1, Fwd cycle)
- The boy's ghost (Edgar) uses position (255, 148) when appearing in this room

View File

@@ -0,0 +1,62 @@
# Room 66: Secret Tower
## Look Description
"You have found a secret tower! Narrow steps spiral dizzily upward."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `/stair` | "The steps are narrow, steep, and spiral upwards." (Print 66 0) |
| TODO | Look | `/door` | "The secret door opens into the parlor." (Print 66 1) |
| TODO | Look | `/dirt` or `<down` | "You see nothing of interest on the floor." (Print 66 2) |
| TODO | Look | `/wall` | "You see nothing of interest on the walls." (Print 66 3) |
| TODO | Look | `/torch` | "A torch burns on the wall." (Print 66 4) |
| TODO | Look | `<up` | "The spiral stairs go way up!" (Print 66 5) |
| TODO | Look | `[<around][/room,tower]` | "You have found a secret tower! Narrow steps spiral dizzily upward." + conditional shovel text (Print 66 6) |
| TODO | Action | `*/stair` | "Just climb them." (Print 66 7) |
| TODO | Get | `/shovel` | Picks up shovel if present, +2 score (Print 66 8 if not present) |
| TODO | Get | `/torch` | "The torch is firmly attached to the wall." (Print 66 9) |
| TODO | Action | `close/door` | "You don't need to close it." (Print 66 10) |
| TODO | Action | `open/door` | "The secret door is already open." (Print 66 11) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | `stairTrip` | Player steps on control area $0004 (stair hazard zone) | Triggers falling animation (view 44), plays fall sound (51), jumps player to position 185 142. If player came from above (y < 90), triggers additional screen shake and sets different ending state. |
| TODO | Background | Priority调整 | Various position/control checks in `doit` | Adjusts player priority based on location: sets priority 12 when in stair area, priority 7 when near top of stairs, manages visibility behind foreground elements |
## Technical Notes
- **Room Number**: 66
- **Picture**: 66
- **Region**: 603
- **Exits**: West→61 (control area $0020), East→67 (control area $0040)
- **Music**: None specified
- **Sound**: 51 (fall sound)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `local1` | 0, 1 | Tracks player stair state - 1 when on ground level, 0 when coming from above |
| `local2` | 0, 1 | Set to 1 if player y < 90 when tripping - determines if player fell from above |
| `global182` | 0, 1 | Flag set to 1 when shovel is picked up |
| `global127` | 0, 1 | Flag set to 1 after completing stair trip fall sequence |
| `global228` | string | Formatted message buffer for look description |
### Objects
- **Torch**: Prop with view 512, loop 0, cel 0 at position (206, 64), setPri 3, cycling forward
- **Decorative View**: View at position (208, 79), setPri 4
- **Shovel**: View with view 512, loop 2 at position (194, 122) - only visible if inventory item 15 (shovel) owner is room 66
- **stair1 Block**: Blocking block at (147, 116) to (159, 117) - controls ground level stair access
- **stair2 Block**: Blocking block at (198, 149) to (151, 194) - lower stair area
### Entry Conditions
- Entering from room 67 or new game: Player spawns at (240, 127) with view 4, xStep 4, yStep 2
- Entering from room 61 (from above): Player spawns at (102, 37) with view 4, xStep 4, yStep 1, priority 7
- When entering from above, baseSetter is set to ScriptID 0 1 (likely climbing animation)

View File

@@ -0,0 +1,92 @@
# Room 67: The Parlor
A dusty, dilapidated parlor in the haunted cottage. The room contains a bookshelf with a single Shakespeare book, a painting above the fireplace that hides a secret latch, and various old furniture. This is where Rosella can discover the secret passage to the crypt.
## Look Description
"Considering the disarray of the rest of the house, the parlor looks in relatively good order. However, the fireplace is cold and unused, the bookshelves are almost bare, and the old furnishings are dusty."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look[<around>][/!*]` / `look/room,parlor` | "Considering the disarray of the rest of the house, the parlor looks in relatively good order. However, the fireplace is cold and unused, the bookshelves are almost bare, and the old furnishings are dusty." (Print 67 0) |
| TODO | Look | `look/book` (if has book in inventory) | Shows inventory book description |
| TODO | Look | `look/book,shelf,bookshelf` (if x > 160) | If book on shelf: "You examine the few remaining books on the bookshelves. Only one catches your attention; it is entitled 'The Compleat Works of William Shakespeare.'" (Print 67 1), else: "You examine the few remaining books on the bookshelves. None interest you." (Print 67 2) |
| TODO | Look | `look/book,shelf,bookshelf` (if x <= 160) | "You examine the books on this side of the room. None of these books are up the quality of reading you're used to..." (Print 67 3) |
| TODO | Look | `look<behind,under/painting` | "The portrait is firmly attached to the wall." (Print 67 4) |
| TODO | Look | `look/painting` | "An interesting portrait of a young girl hangs above the fireplace. You gaze at it intently, and notice that her eyes seem to stare at the left wall of the parlor." (Print 67 5) |
| TODO | Look | `look/wall<left` | If door open: "You see a secret door in the left wall." (Print 67 6), else if latch found: "You examine the left wall very closely and notice a little latch." (Print 67 7), else: "You see nothing special on the wall." (Print 67 8) |
| TODO | Look | `look/wall<right` | "You see the doorway to the foyer." (Print 67 9) |
| TODO | Look | `look/wall` | If door open: "You see a secret door in the left wall." (Print 67 6), else if latch found: "You examine the left wall very closely and notice a little latch." (Print 67 7), else: "You see a portrait hanging above the fireplace." (Print 67 10) |
| TODO | Look | `look/latch` | If door open: "You don't see it now." (Print 67 11), else if latch found and wall examined: If near latch zone: "You could try flipping the little latch in the left wall." (Print 67 12), else: "From there, you can barely see the latch in the wall." (Print 67 13), else: "You don't see a latch." (Print 67 14) |
| TODO | Look | `look<in/fireplace` | "The fireplace is empty." (Print 67 15) |
| TODO | Look | `look/fireplace` | "The fireplace hasn't been used in years." (Print 67 16) |
| TODO | Look | `look/chandelier` | "The lamp is old and dusty." (Print 67 17) |
| TODO | Look | `look/couch` | "The old divan is still in pretty good shape; a bit dusty, though." (Print 67 18) |
| TODO | Look | `look/door` | If secret door open: "You have discovered a secret door in the left wall!" (Print 67 19), else: "You see no special doors." (Print 67 20) |
| TODO | Look | `look/cabinet,cabinet` | "There is nothing of interest in the dusty old cabinet." (Print 67 21) |
| TODO | Look | `look/table,chair,chest,furniture` | "The furniture is old and dusty." (Print 67 22) |
| TODO | Look | `look/dirt,carpet,carpet` / `look<down` | "An old oriental carpet lies on the floor." (Print 67 23) |
| TODO | Action | `sit` | "You don't have time for that!" (Print 67 24) |
| TODO | Get | `get/book` / `get/shakespeare` (if in rect 83-127) | "There are no books here you need." (Print 67 25) |
| TODO | Get | `get/book` / `get/shakespeare` (if in control area) | If book not in room: "None of the other books interest you." (Print 67 26), else if already looked at bookshelf: "You remove the Shakespeare book from the shelf and carry it with you." (Print 67 27), else: "You examine the few remaining books on the bookshelves. Only one catches your attention; it is entitled 'The Compleat Works of William Shakespeare.' You remove it from the shelf and carry it with you." (Print 67 28) |
| TODO | Get | `get/book` / `get/shakespeare` (not in control area) | "You're not close enough." (Print 800 1) |
| TODO | Get | `get/painting` | "The portrait is firmly attached to the wall." (Print 67 4) |
| TODO | Action | `open/door` | If secret door open: "The secret door is already open." (Print 67 29), else: "You don't see a door to open." (Print 67 30) |
| TODO | Action | `open/cabinet,cabinet` | "There is nothing of interest in the dusty old cabinet." (Print 67 21) |
| TODO | Action | `close/door` | If secret door open: "You don't need to close the door." (Print 67 31), else: "There is no door to close!" (Print 67 32) |
| TODO | Action | `flip,move,lift/latch` | If latch found: If door open: "There's no need for that." (Print 67 33), else if near latch zone: "You flip the latch in the wall--and behold!--you have discovered a secret door!" (Print 67 34), else: "You're not close enough." (Print 800 1), else: "You don't see a latch." (Print 67 14) |
| TODO | Action | `find/door` | Same as look/door |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | Room initialization | Entering room | Sets global101=1, loads view 510, applies region 603, positions ego based on entry direction, displays book if in room, sets up priority based on night mode |
| TODO | Background | Edge detection | Walking to room edges | If player touches control area $0040 (right edge): move to room 68. If player touches control area $0004 (left edge) and door is open (global131): move to room 66 |
| TODO | Background | Priority handling | Walking in room | If player in control area $0020 and door is open: set ego priority to 8, else release priority |
| TODO | Interaction | Secret door | Flipping latch when near zone | Opens secret door by setting global131=1, plays animation, awards 4 points |
| TODO | Interaction | Book acquisition | Getting Shakespeare book | Adds book to inventory, awards 2 points if first time, sets global182 flag |
## Technical Notes
- **Room Number**: 67
- **Picture**: 67
- **Region**: 603 (Haunted House - GhostWander)
- **Exits**: West→68 (cottage exterior), East→66 (foyer) - east exit requires secret door open
- **Music**: None specified
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | `1` | Room initialized flag |
| `global100` | `0`, `1` | Night mode (1 = night) - controls ghost appearances |
| `global128` | `0`, `1` | Bookshelf examined flag |
| `global129` | `0`, `1` | Painting examined flag - triggers wall examination hints |
| `global130` | `0`, `1` | Wall/latch examined flag |
| `global131` | `0`, `1` | Secret door open state |
| `global182` | `0`, `1` | Shakespeare book taken flag |
| `gPrevRoomNum` | `66`, `68` | Previous room - determines ego entry position |
### Objects in Room
- **Bookshelf** (view 510, loop 0, cel 0): Displays Shakespeare book when present at position (207, 74)
- **Prop** (view 510, loop 2): Unknown prop at position (74, 101) - appears to be fireplace or furniture element
- **Ghost Prop** (view 536, loop 1): Displayed at (205, 129) when night mode (global100)
### Control Areas
- `$0040` (right edge): Triggers exit to room 68
- `$0004` (left edge): Triggers exit to room 66 (requires secret door open)
- `$0020` (secret door zone): Elevates player priority when door is open
- `$0010`: Bookshelf interaction zone
### Inventory Item
- Item 18: Shakespeare book - can be picked up from bookshelf for +2 score
### Synonyms
- `cottage` = `room` (from region 603)

View File

@@ -0,0 +1,78 @@
# Room 68: The Foyer
The entry foyer of the old haunted house. This is the main entrance room of the cottage, featuring a broken mirror on the wall, a grandfather clock, stairs leading up to the second floor, and several doorways leading to other rooms in the house. The room is dusty and cobwebbed, reflecting the dilapidated state of the haunted cottage.
## Look Description
"This is the entry room of the old house. Downstairs, you see two open doorways, and upstairs, you see an additional two doorways. The room is cobwebbed and dusty, with wallpaper peeling from the walls."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look[<around>][/!*]` / `look[<around>]/room` | "This is the entry room of the old house. Downstairs, you see two open doorways, and upstairs, you see an additional two doorways. The room is cobwebbed and dusty, with wallpaper peeling from the walls." (Print 68 0) |
| TODO | Look | `look/time` / `look[<is/how]<time` / `read/clock,time` | Displays current time using Tamir time format (Print 68 1 with format string) |
| TODO | Look | `look<behind/painting` | "There is nothing behind the portraits." (Print 68 2) |
| TODO | Look | `look/painting` | "You notice two interesting portraits above the downstairs doorways. One, of a middle-aged woman, and the other, of a young man. You wonder who they are." (Print 68 3) |
| TODO | Look | `look/mirror` (if in rect 161-195,154-189) | Sets ego to loop 3, then: "You look in the broken mirror and see the reflection of a poor, but beautiful, peasant girl." (Print 68 4) |
| TODO | Look | `look/mirror` (if not in rect) | "You can't do that here." (Print 800 1) |
| TODO | Look | `look/chandelier` / `look/lam` | "The lamp is old and dusty." (Print 68 5) |
| TODO | Look | `look/stair` | "The stairs lead up to the second story." (Print 68 6) |
| TODO | Look | `look<in/clock` / `open/clock` | "There is nothing of interest inside the grandfather clock." (Print 68 7) |
| TODO | Look | `look/clock` | "An old grandfather clock sits in the corner. With each swing of its pendulum, time relentlessly marches on..." (Print 68 8) |
| TODO | Look | `look/door` | "Doors lead in all directions." (Print 68 9) |
| TODO | Look | `look/wall` | "There is nothing of importance on the walls." (Print 68 10) |
| TODO | Look | `look/dirt` / `look<down` | "There is nothing of interest on the floor." (Print 68 11) |
| TODO | Look | `look/carpet` | "A tattered rug lies on the floor." (Print 68 12) |
| TODO | Look | `look/table` | "A once-beautiful, marble-topped table rests below the broken mirror." (Print 68 13) |
| TODO | Action | `wind/clock` | "You can't. You don't know how." (Print 68 14) |
| TODO | Get | `get/clock` | "It's too heavy to move." (Print 68 15) |
| TODO | Get | `get/carpet` | "You don't need it." (Print 68 16) |
| TODO | Get | `get/painting` | "The portraits are too high, you could never reach them. Besides, they're not important." (Print 68 17) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | Room initialization | Entering room | Sets global105=0, global101=1, loads views 533 and 536, applies region 603, creates mirror reflection prop, positions ego based on entry direction |
| TODO | Background | Mirror reflection | When ego enters mirror zone (161,154 to 195,191) | Shows mirror trick actor that mirrors ego's movement with cel/loop synchronized, positioned to create reflection effect |
| TODO | Background | Edge detection | Walking to room edges | Detects control areas: $0040→south (room 17), $0020→east (room 67), $0010→north (room 60), $0008→northwest (room 62), $0004→west (room 64), $0400→stairs trigger |
| TODO | Interaction | Stair climbing | Walking onto stair control area ($0400) | If global105 != 18: sets global105=18 and triggers moveOnTheStairs script to auto-walk ego up/down stairs |
## Technical Notes
- **Room Number**: 68
- **Picture**: 68
- **Region**: 603 (Haunted House)
- **Exits**: South→17 (cottage exterior), East→67 (parlor), North→60 (upstairs hallway), Northwest→62 (attic), West→64 (dining room), Up/Down via stairs
- **Music**: None specified
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | `0`, `1` | Night mode - if true (1), displays ghost prop in room |
| `global101` | `1` | Room initialized flag |
| `global105` | `0`, `18` | Stair state - 18 indicates on stairs |
| `global133` | Room number | Current room (used with region 603 for ghost tracking) |
| `global134` | Various values | Ghost state for region 603 - if 4 (lord), loads additional views 206/204 |
| `global159` | Hour value | Hour component of Tamir time |
| `global160` | Hour value (0-23) | Hour in 24-hour format |
| `global189` | `0`, `1` | Stair climbing state - set to 1 when climbing stairs |
| `gPrevRoomNum` | `17`, `60`, `62`, `64`, `67` | Previous room - determines ego entry position and animation |
### Objects in Room
- **Portrait view** (view 536, loop 7, cel 0): Portrait on wall at position (77, 109), priority 8
- **Ghost prop** (view 536, loop 4): Displayed at (79, 98), priority 11 when night mode (global100)
- **Reflection prop** (view 533, loop 0): Animated mirror reflection at (223, 131), priority 11
- **Mirror tricks actor** (mirrorTricks script): Invisible actor that mirrors ego when in mirror zone
### Control Areas
- `$0040` - South edge → room 17
- `$0020` - East edge → room 67
- `$0010` - North edge → room 60
- `$0008` - Northwest edge → room 62
- `$0004` - West edge → room 64
- `$0400` - Stair area → triggers stair climbing script

View File

@@ -0,0 +1,98 @@
# Room 69: The Crypt
This is the crypt room in King's Quest IV, featuring an upper platform with a rope ladder, a coffin containing a mummy, and Pandora's Box on the floor. The player must figure out how to lower the rope ladder to access the platform, avoid or defeat the mummy, and obtain Pandora's Box.
## Look Description
"What an incredible place! This looks like an ancient burial tomb, with hieroglyphics written on the walls, and an old coffin against the far wall. %s %s"
The description dynamically includes:
- If rope not lowered: "A pile of rope is at the edge of the upper platform."
- If Pandora's Box is in room: "You see an odd-looking, little chest here. It must be Pandora's Box."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look[<around][/!*]` / `look/room,crypt` | "What an incredible place! This looks like an ancient burial tomb, with hieroglyphics written on the walls, and an old coffin against the far wall." (Print 69 0) |
| TODO | Look | `look/epitaph` | "You cannot read the ancient hieroglyphics." (Print 69 1) |
| TODO | Look | `look<in/casket[<elderly]` (when close) | "You don't want to do that!" (Print 69 2) |
| TODO | Look | `look/casket` | "The lid of the coffin is decorated with hieroglyphics." (Print 69 3) |
| TODO | Look | `look/hemp,ladder` / `look/hemp[<heap]` | If rope not lowered: "You see a pile of rope on the end of the platform." (Print 69 4). If rope lowered: "A rope ladder extends from the platform down to the bottom of the crypt." (Print 69 5) |
| TODO | Look | `look/platform` | If rope not lowered: "You see a pile of rope on the end of the platform." (Print 69 4). If rope lowered: "The platform towers over the floor of the crypt." (Print 69 6) |
| TODO | Look | `look/wall` | "There are ancient hieroglyphics on the walls." (Print 69 7) |
| TODO | Look | `look/dirt` / `look<down` | If box in room: "Pandora's Box is on the floor of the crypt." (Print 69 8). If box not in room: "There is nothing of interest on the floor." (Print 69 9) |
| TODO | Look | `look/mummy` | If mummy active: "This mummy appears to be at least a thousand years old! Its' wrappings are loose and decayed...and it stinks!" (Print 69 10). If mummy not active: "There is no mummy here." (Print 69 11) |
| TODO | Look | `look/box[<pandora]` | If box in room: "Pandora's Box is on the floor of the crypt." (Print 69 8). If player has box: event not claimed (allows opening). If box not present: "There is no box here." (Print 69 12) |
| TODO | Action | `get,move,lower/hemp,ladder,heap` | If rope already lowered: "The rope is fine where it is." (Print 69 13). If too far: generic distance message. Otherwise: "You reach down and get the pile of rope. To your happy surprise, you find that the rope is actually a rope ladder attached to the end of the platform! Gladly, you throw the rope ladder over the edge of the platform, where it falls to the floor below." (Print 69 14) - awards 2 points |
| TODO | Action | `climb[/(hemp,ladder)]` | If rope not lowered: generic "can't do that" (Print 800 3). If climbing down or not on platform: descends ladder if close enough. If climbing up and on platform: climbs up to platform |
| TODO | Action | `get/box` | If not on platform: "Not from up here!" (Print 69 15). If already has box: "You already have it." (Print 69 16). If box not in room: "It's not here." (Print 69 17). If too far: generic distance message. Otherwise: triggers stoop script to pick up box |
| TODO | Action | `place,drop,return/box` | If doesn't have box: "You don't have it." (Print 69 18). If not on platform: "Not from up here!" (Print 69 15). Otherwise: triggers putBack script to place box back |
| TODO | Action | `open/box` | If doesn't have box: "You don't have it." (Print 69 18). If not on platform: "You can't do here." (Print 69 19). Otherwise: event not claimed (allows box opening) |
| TODO | Action | `read/(epitaph,wall,casket,lid)` | "You cannot read the ancient hieroglyphics." (Print 69 1) |
| TODO | Action | `get,rob,get,move/casket` | "It's too heavy to move." (Print 69 20) |
| TODO | Action | `bang[<on]/casket` | If close enough: "There's no answer." (Print 69 21). If too far: "You'll have to get a little closer, Rosella." (Print 69 22) |
| TODO | Action | `open/casket,lid` | If not on platform: triggers proc0_13 (likely generic response). If lid open: "It's already closed!" (Print 69 23). Otherwise: "You don't want to do that!" (Print 69 2) |
| TODO | Action | `get,move/casket` | If on platform: "The coffin is much too heavy for you to move." (Print 69 24). Otherwise: triggers proc0_13 |
| TODO | Talk | `converse` | If mummy active: "You attempt a conversation with the old mummy, and receive nothing but a low moan in reply." (Print 69 25). If no mummy: "There is no one here who you can talk to." (Print 69 26) |
| TODO | Talk | `/mummy` | If no mummy: "There is no mummy here." (Print 69 11) and claimed. If mummy active: various responses based on verb |
| TODO | Talk | `/mummy kill` | "How can you kill something that is already dead?" (Print 69 27) |
| TODO | Talk | `/mummy get,capture` | "Why would you want it?" (Print 69 28) |
| TODO | Talk | `/mummy kiss` | "What a horrible thought!" (Print 69 29) |
| TODO | Talk | `/mummy help,save` | "It's beyond help." (Print 69 30) |
| TODO | Inventory | `deliver/*/mummy` | If mummy active: "The mummy doesn't need anything." (Print 69 31). If no mummy: "There is no mummy here." (Print 69 11) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | `doMummy` | Player approaches too close to coffin (within 25 pixels) while not in safe zone (not in rect 138,110,192,125) | Mummy animation sequence: appears, walks toward player. If player has Scarab (item 7): mummy runs away in fear, player gains points. If no Scarab: mummy chases and kills player (sets global127 = 1) |
| TODO | Interaction | `DownLadder` | Player climbs up/down the rope ladder | Complex climbing animation sequence. When climbing up: requires player to be in ladder area (rect 99,142,120,158). Sets local7 to 1 when on platform. When on platform, triggers doMummy script |
| TODO | Interaction | `DropRope` | Player uses get/lower on rope | Player walks to rope, pulls rope, rope lowers to floor (sets global170 = 1). Awards 2 points |
| TODO | Background | `cryptFall` | Player steps on certain control area (onControl: 1 & $0004) while not already in a script | Player falls into pit with animation, screen shakes. Prints death message "You will be the next victim of the mummy!!" and sets global127 = 1 (death) |
| TODO | Interaction | `stoop` | Player uses get/box while on platform and box is present | Player performs stoop animation, picks up Pandora's Box, box is removed from room. Awards 4 points (or -2 if global169 = 0), sets global218 = 1, global182 = 1 |
| TODO | Interaction | `putBack` | Player uses place/drop/return/box while on platform and has box | Player places box back on floor at current position. If global169 = 0: stops all sounds, plays sound 50, awards 2 points. Creates new box actor at appropriate position |
## Technical Notes
- **Room Number**: 69
- **Picture**: 69
- **Style**: $0010 (DISPLAY_FADE)
- **Exits**:
- Falling through pit (control area $0040) → Room 18
- **Music**:
- Fall sound: 51 (fallMusic)
- Mummy music: 27 (mummyMusic)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `local7` | `0`, `1` | Player on ladder/platform flag (0 = on ground, 1 = on platform) |
| `local8` | `0`, `1` | Mummy active/visible flag (0 = not visible, 1 = mummy encountered) |
| `global170` | `0`, `1` | Rope lowered flag (0 = rope not lowered, 1 = rope ladder lowered to floor) |
| `global127` | `0`, `1` | Death flag (1 = player has died) |
| `global218` | `0`, `1` | Pandora's Box picked up flag (1 = box has been picked up from this room) |
| `global182` | `0`, `1` | Puzzle progress flag (set when box is picked up) |
| `global169` | `0`, `1` | Time-based flag (affects score adjustments when placing box) |
### Objects in Room
| Object | View | Description |
|--------|------|-------------|
| Platform | 520 (loop 2) | Upper platform with rope |
| Rope/Prop | 520 (loop 0) | Rope pile or ladder |
| Coffin | 522 (loop 3) | Decorative coffin |
| Coffin Lid | 522 (loop 2) | Animated lid |
| Mummy Actor | 195 | The mummy (view changes for animation) |
| Pandora's Box | 519 | Box actor (only if in room) |
### Control Areas
- `$0040` - Pitfall area (triggers cryptFall script, leads to room 18)
- `$0004` - Crypt floor trigger area (triggers fall if player walks on it incorrectly)
### Inventory Items Referenced
- Item 4: Pandora's Box
- Item 7: Scarab (needed to defeat mummy)

View File

@@ -0,0 +1,83 @@
# Room 71: Cave Entrance
## High-Level Summary
Room 71 is the cave entrance area in the Troll Cave region. It serves as a transitional room connecting the upper area (room 72) and the south entrance (room 74). The room features a dark cave environment with a waterfall visible outside, a pile of bones that can be collected, and dynamic lighting effects based on whether the player has the lantern. This room is notable for its darkness mechanic - without the lantern, the cave is extremely dark, and with the lantern, visibility is still limited.
## Look Description
"This is the darkest cave you've ever seen!" (varies based on lantern possession)
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look [at/around]`/`look/room/cave` | "This is the darkest cave you've ever seen! Even the lantern does little good." or "This is the darkest cave you've ever seen!" (with/without lantern). If no bone: "By the light of the cave entrance, you can see a pile of bones." |
| TODO | Look | `look/falls`/`look/out` | "Outside the cave, you see the waterfall." |
| TODO | Look | `look/heap` | "You see a pile of bones by the cave entrance." |
| TODO | Look | `look/bone`/`look/dirt`/`look/down` (no bone) | "You see a pile of bones by the cave entrance." |
| TODO | Get | `get/bone` | "You don't need another one." (if already have bone in inventory) |
| TODO | Get | `get/bone` | Gets the bone when near the pile, awards 2 points, triggers pickup animation |
| TODO | Get | `get/bone` | "You can't get that." (if not near the bone pile) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | `getDown` | Player picks up bone (item 23) | Plays a bending-down animation using view 940, temporarily stores ego's current view, cycles through cel animations for picking up the item, then restores the player's view |
## Technical Notes
- **Room Number**: 71
- **Picture**: 71
- **Style**: $0010 (hex)
- **Region**: 605 (Troll Cave)
- **Exits**:
- North → Room 72 (via control area $0020)
- South → Room 74 (standard exit)
- West → Room 70 (via control area $0040)
- **Music**: Not specified
- **Views Loaded**: 800, 511, 940
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | 1 | Room initialization flag (set to 1) |
| `global126` | 0, 1 | Darkness visibility flag |
| `global182` | 0, 1 | Bone collected flag (set to 1 after collection) |
| `global189` | 0, 1 | Troll region active flag |
| `global228` | string buffer | Format string buffer for dynamic text |
| `newView` | View object or 0 | Lantern view object (created when player has no lantern) |
| `newProp` | Prop object | Visible bone pile prop (view 511, cel 0) |
| `newProp_2` | Prop object or 0 | Hidden bone prop (view 511, cel 1) - only created if bone is in room |
### Inventory Items
- **Item 23**: Bone - Can be picked up from the cave entrance, awards 2 points when collected
### Control Areas
- `$0040`: Triggers exit to Room 70 (west)
- `$0020`: Triggers exit to Room 72 (north)
### Darkness Mechanic
The room uses `proc0_20` to check if player has the lantern (item 24). Without the lantern:
- The cave appears very dark
- A lantern view object (view 800) is created at position 108, 132
- global126 is set to 0
- Different look descriptions are shown based on lantern possession
### Bone Collection
The bone (inventory item 23) can be collected when:
1. The bone is in the room (owner is 71)
2. Player is within 15 pixels of the bone prop (newProp_2)
3. When collected: bone is added to inventory, getDown script plays animation, global182 is set to 1, score increases by 2
### Entry Points
- From Room 72 (north): Player positioned at 208, 104
- From Room 74 (south): Player positioned at 170, 183
- From other rooms: Player positioned at 78, 112, darkness initialized

View File

@@ -0,0 +1,76 @@
# Room 72: Dark Cave Passage
This is a transitional area within the Troll Cave region. The room serves as a connecting passage between room 75 (south) and room 71 (via a hidden control area to the east). The cave is extremely dark, and the player must have a lantern to see anything. The room has no local event handling - all interactions are managed by region 605 (Troll Cave). The player's view is changed to 904 (cave walking) while in this room.
## Look Description
"Passageways lead into the darkness of this frightening cave!"
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look room` | "Passageways lead into the darkness of this frightening cave!" (Print 605 5) |
| TODO | Look | `look` (without lantern) | "It's too dark to see!" (Print 605 1) |
| TODO | Look | `look` (with lantern, dim light) | "The lantern you are carrying does little good in helping you to see in this dark cave." (Print 605 3) |
| TODO | Look | `look out` | "You cannot look outside from here." (Print 605 2) |
| TODO | Look | `look floor` / `look ground` | "The earth floor of the cave is cold and hard." (Print 605 4) |
| TODO | Look | `look troll` | "You can't SEE the troll! It's too DARK in here!" (Print 605 6) |
| TODO | Look | `look` (darkness description) | "The cave is VERY dark. Try as you might, you cannot peer through the darkness." (Print 605 7) |
| TODO | Look | `look` (general darkness) | "It's difficult to see in here." (Print 605 8) |
| TODO | Talk | `talk` / `talk troll` | "Conversation is not recommended at this time!" (Print 605 9) |
| TODO | Action | `kill troll` / `kill` | "You have NO way of killing a vicious troll!" (Print 605 10) |
| TODO | Action | `kill` (other) | "BE SERIOUS!!" (Print 605 11) |
| TODO | Action | `help` | "Are you sure you're all right?" (Print 605 12) |
| TODO | Inventory | `give [item]` / `deliver [item]` | "Trying to give ANYTHING to this nasty troll is not a good idea!!" (Print 605 13) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | region_605 | Continuous | Region 605 handles all interactions including troll encounter logic, darkness mechanics, and lantern detection |
## Technical Notes
- **Room Number**: 72
- **Picture**: 72
- **Style**: $0010 (hex)
- **Region**: 605 (Troll Cave)
- **Exits**:
- South → Room 75 (standard exit)
- East → Room 71 (via control area $0040 in doit method)
- **Music**: Not specified
- **Views Loaded**: 904 (player cave walking view)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | `1` | Room initialization flag (set on init) |
| `global126` | `0`, `1` | Darkness visibility flag (controlled by region) |
| `global189` | `0`, `1` | Troll region active flag |
### Control Areas
- `$0040`: Triggers exit to Room 71 (east passage)
### Entry Points
- From Room 75 (south): Player positioned at 160, 172
- From other rooms: Player positioned at 85, 94
### Darkness Mechanic
The room relies on Region 605 for darkness mechanics:
- Without lantern: Cave is extremely dark, limited visibility
- With lantern: Dim light, limited effectiveness
- Player view changed to 904 for cave walking animation
### Additional Technical Details
- Room uses Region 605 for all interactive logic
- No local handleEvent method - all Said commands handled by region
- The `proc0_10 605 1` call initializes region 605 state
- Player xStep is 4 and yStep is 1 (unusual stepping for cave terrain)
- Priority is set based on Y coordinate using CoordPri

View File

@@ -0,0 +1,55 @@
# Room 73: Cave Exit
This is a transitional room representing the exit from a dark cave into the swamp region. The player enters from the cave (Room 76) and can exit to the swamp area (Room 77). The room handles special crawling mechanics when arriving from the swamp - the player transitions from a crawling animation in water to standing on dry land. The cave entrance visual is displayed or hidden based on the player's position. The room provides look commands to observe the outside world, including the swamp and sky (which changes based on time of day).
## Look Description
"After this dark cave, the outside world looks good."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Action | `crawl exit cave` / `crawl` | "You're not close enough." (only works when in water area) |
| TODO | Look | `look exit` / `look for exit` | "After this dark cave, the outside world looks good." |
| TODO | Look | `look out` | "Outside the cave, you see a large swamp." |
| TODO | Look | `look sky` / `look up` | "Outside, the night sky is lit by a full moon." (if night) or "Outside, the sky is very blue." (if day) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | crawl | Player enters from Room 77 or attempts to crawl in water | Handles transition from crawling in water (view 950) to standing on land (view 904). If heading > 180 (entering water), plays crawl exit animation and transitions to Room 77. If heading <= 180 (exiting water), plays stand-up animation and returns to normal walking. Sets global205=1 and global204=0 when exiting to room 77. |
| TODO | Background | localproc_0402 | Continuous in doit | Shows cave entrance view (view 800, loop 1) at position 108,132 when not in water (proc0_20 returns false). Hides the view when in water. |
## Technical Notes
- **Room Number**: 73
- **Picture**: 73
- **Region**: 605
- **Exits**: South→76 (cave entrance), Room 77 (swamp, via crawl script)
- **Music**: None specified
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | `1` | Set to 1 on room init |
| `global100` | `0`, `1` | Time of day flag (0=day, 1=night) |
| `global126` | `0` | Set when entering from Room 77 |
| `global189` | `0` | Set when exiting to Room 77 |
| `global205` | `1` | Set when exiting to Room 77 via crawl |
| `global204` | `0` | Set when exiting to Room 77 via crawl |
| `newView` | `0`, `View object` | Tracks cave entrance view visibility |
### Additional Technical Details
- Room uses Region 605 for shared logic
- Player enters from Room 76 (cave) at position 138, 179
- Player enters from Room 77 (swamp) at position 290, 163 with crawl script active
- When in water area (control area $0002), player uses view 950 (crawling) and cannot exit crawl mode
- When on dry land, player uses view 904 (normal walking)
- Cave entrance visual (view 800) is shown/hidden based on whether player is in water
- The `proc0_20` function appears to detect if player is in water
- The `proc0_8`, `proc0_9`, `proc0_10` are system procedures related to crawl mechanics
- global101=1 may indicate the room has been initialized or visited

View File

@@ -0,0 +1,78 @@
# Room 74: Troll Cave
A dark cave area within the troll caverns. This room serves as a transitional space connecting to the main troll cave areas. The player enters with a lantern (view 904) and must be careful not to let it go out, or they will be caught by the troll. The room has minimal local logic and relies entirely on region 605 (regTroll) for all interactions.
## Look Description
"Passageways lead into the darkness of this frightening cave!" (Print 605 5)
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` | "The cave is VERY dark. Try as you might, you cannot peer through the darkness." (Print 605 7) |
| TODO | Look | `look out` / `look out/cave` | "You cannot look outside from here." (Print 605 2) |
| TODO | Look | `look cave` | "The lantern you are carrying does little good in helping you to see in this dark cave." (Print 605 3) - requires lantern (item 3) |
| TODO | Look | `look dirt` / `look down` | "The earth floor of the cave is cold and hard." (Print 605 4) - requires lantern (item 3) |
| TODO | Look | `look passageway` | "Passageways lead into the darkness of this frightening cave!" (Print 605 5) - requires lantern (item 3) |
| TODO | Look | `look troll` | "You can't SEE the troll! It's too DARK in here!" (Print 605 6) |
| TODO | Action | `climb boulder` / `get boulder` | "It's difficult to see in here." (Print 605 8) |
| TODO | Action | `find troll` | "You can't SEE the troll! It's too DARK in here!" (Print 605 6) |
| TODO | Talk | `talk troll` / `converse/troll` | "Conversation is not recommended at this time!" (Print 605 9) |
| TODO | Action | `kill troll` | "You have NO way of killing a vicious troll!" (Print 605 10) |
| TODO | Action | `get troll` / `capture troll` | "BE SERIOUS!!" (Print 605 11) |
| TODO | Action | `kiss troll` / `kiss` | "Are you sure you're all right?" (Print 605 12) |
| TODO | Inventory | `give/deliver <item> to troll` | "Trying to give ANYTHING to this nasty troll is not a good idea!!" (Print 605 13) |
| TODO | Inventory | `extinguish lantern` / `turn off lantern` | Extinguishes the lantern |
| TODO | Inventory | `light lantern` / `ignite lantern` / `turn on lantern` | Lights the lantern |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | `trollScript` | When `global126 = 1` (troll is active) | Spawns the troll NPC (view 190) at position (73, 166) and initiates chase behavior |
| TODO | Background | `trollScript` | Random 50% chance on room entry (rooms 71, 72, 73, 74, 75) when troll not already present | 50% chance to spawn the troll in the room |
| TODO | Interaction | `gotchaScript` | When player extinguishes lantern in darkness | Triggers the troll capture sequence with death |
| TODO | Interaction | `gotchaScript` | When troll catches player (within 5 pixels) | Triggers the troll capture sequence |
| TODO | Background | `theLight` | Always when player has lantern lit | Follows player and provides light effect (view 967, loop 4) |
| TODO | Background | `doMusic` | On room entry | Plays troll cave ambient music (sound 66) |
## Technical Notes
- **Room Number**: 74
- **Picture**: 74
- **Region**: 605 (regTroll) - handles all troll-related interactions
- **Exits**: North→71, East→75
- **Music**: Sound 66 (trollCaveMusic) - ambient cave sound
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | 1 | Room initialization flag |
| `global126` | 0, 1 | Troll state: 0 = not spawned, 1 = troll is active |
| `global127` | 0, 1 | Player caught flag - set when troll catches player |
| `global189` | 0, 1 | Region initialized flag |
| `local1` | 0, 1 | Troll spawn attempt flag - prevents multiple spawn attempts |
| `local2` | 0, 1 | Hidden troll flag - for room 76 stealth sequences |
| `local3` | 0, 1 | Player caught sequence flag |
| `gEgo view` | 904, 967 | 904 = normal lantern view, 967 = lit lantern view |
### Synonyms
- `dirt` = dirt (region-level synonym)
- `kiss` = kiss, embrace (region-level synonym)
- `troll` = troll, man (region-level synonym)
### Entry Points
- From room 75 (east): Player positioned at (295, 167)
- From other directions: Player positioned at (109, 84)
### Special Mechanics
- Player uses view 904 (lantern) on entry - this is the cave/lantern view
- If player does not have lantern (item 3), they cannot see the troll or examine cave features
- Extinguishing the lantern in the dark area triggers the `gotchaScript` and results in death
- The troll can randomly spawn in this room (50% chance on entry)
- The troll uses view 190 with walk animation and chases the player

View File

@@ -0,0 +1,89 @@
# Room 75: Troll Cave Passage
This is a dark cave tunnel connecting multiple areas within the troll cave complex. The room serves as a transitional passage between rooms 72 (north), 74 (west), and 76 (east). The player enters with a lantern (view 904) to navigate the darkness. The room has no local interaction logic and relies entirely on region 605 (Troll Cave) for all gameplay interactions including the dangerous troll that roams these caves.
## Look Description
This room has no local look description. All cave descriptions come from region 605 (regTroll):
- "The cave is VERY dark. Try as you might, you cannot peer through the darkness."
- "Passageways lead into the darkness of this frightening cave!"
## Interactions
This room has no local interaction handlers. All interactions are inherited from region 605 (Troll Cave):
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` | "The cave is VERY dark. Try as you might, you cannot peer through the darkness." (Print 605 7) |
| TODO | Look | `look out` / `look out/cave` | "You cannot look outside from here." (Print 605 2) |
| TODO | Look | `look cave` | "The lantern you are carrying does little good in helping you to see in this dark cave." (Print 605 3) |
| TODO | Look | `look dirt` / `look down` | "The earth floor of the cave is cold and hard." (Print 605 4) |
| TODO | Look | `look passageway` | "Passageways lead into the darkness of this frightening cave!" (Print 605 5) |
| TODO | Look | `look troll` | "You can't SEE the troll! It's too DARK in here!" (Print 605 6) |
| TODO | Action | `climb boulder` / `get boulder` | "It's difficult to see in here." (Print 605 8) |
| TODO | Action | `find troll` | "You can't SEE the troll! It's too DARK in here!" (Print 605 6) |
| TODO | Talk | `talk troll` / `converse/troll` | "Conversation is not recommended at this time!" (Print 605 9) |
| TODO | Action | `kill troll` | "You have NO way of killing a vicious troll!" (Print 605 10) |
| TODO | Action | `get troll` / `capture troll` | "BE SERIOUS!!" (Print 605 11) |
| TODO | Action | `kiss troll` / `kiss` | "Are you sure you're all right?" (Print 605 12) |
| TODO | Inventory | `give/deliver <item> to troll` | "Trying to give ANYTHING to this nasty troll is not a good idea!!" (Print 605 13) |
| TODO | Inventory | `extinguish lantern` / `turn off lantern` | Extinguishes the lantern |
| TODO | Inventory | `light lantern` / `ignite lantern` / `turn on lantern` | Lights the lantern |
## Scripts
This room has no local scripts. All scripts are inherited from region 605 (Troll Cave):
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | `trollScript` | When `global126 = 1` (troll is active) | Spawns the troll NPC (view 190) and initiates chase behavior |
| TODO | Background | `trollScript` | Random 50% chance on room entry when troll not already present | 50% chance to spawn the troll in the room |
| TODO | Interaction | `gotchaScript` | When player extinguishes lantern in darkness | Triggers the troll capture sequence with death |
| TODO | Interaction | `gotchaScript` | When troll catches player (within 5 pixels) | Triggers the troll capture sequence |
| TODO | Background | `theLight` | Always when player has lantern lit | Follows player and provides light effect (view 967, loop 4) |
| TODO | Background | `doMusic` | On room entry | Plays troll cave ambient music (sound 66) |
## Technical Notes
- **Room Number**: 75
- **Picture**: 75
- **Region**: 605 (regTroll) - handles all troll-related interactions
- **Exits**: North→72, West→74, East→76
- **Music**: Sound 66 (trollCaveMusic) - ambient cave sound
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | 1 | Room initialization flag |
| `global126` | 0, 1 | Troll state: 0 = not spawned, 1 = troll is active |
| `global127` | 0, 1 | Player caught flag - set when troll catches player |
| `global189` | 0, 1 | Region initialized flag |
| `gEgo view` | 904, 967 | 904 = normal lantern view, 967 = lit lantern view |
### Entry Points
- From room 72 (north): Player enters at position (132, 83)
- From room 74 (west): Player enters at position (10, 167)
- From other directions (south/east entry): Player enters at position (307, 163)
### Player Movement
- Player view: 904 (lantern view for cave navigation)
- xStep: 4, yStep: 1 (special movement parameters for cave terrain)
- Horizon: 65
### Special Mechanics
- Player uses view 904 (lantern) on entry - this is the cave/lantern view
- If player does not have lantern (item 3), they cannot see the troll or examine cave features
- Extinguishing the lantern in the dark area triggers the `gotchaScript` and results in death
- The troll can randomly spawn in this room (50% chance on entry)
- The troll uses view 190 with walk animation and chases the player
### Synonyms
The room inherits synonyms from region 605 (regTroll):
- `dirt` = dirt
- `kiss` = kiss, embrace
- `troll` = troll, man

View File

@@ -0,0 +1,65 @@
# Room 76: Dark Chasm
This room is a dangerous dark cave with a deep chasm that the player must cross. The room requires the player to find and place a wooden board to safely traverse the crevice. Without the board, stepping on the chasm area causes the player to fall to their death. The room is part of the troll cave region, which adds additional danger from the troll that roams nearby caves.
## Look Description
"This is the darkest cave you've ever seen!"
"You see an opening in the distance."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look[<around][/room]` | "This is the darkest cave you've ever seen!" (Print 76 0) "You see an opening in the distance." (Print 76 1) |
| TODO | Look | `look/abyss` | "It's too dark to see it." (Print 76 2) when near chasm, "Where is it?!" (Print 76 3) when not near |
| TODO | Look | `look/exit,hole` | "It seems far away." (Print 76 4) |
| TODO | Action | `[place,lay][<down]/board` | "You don't have the board." (Print 76 5) if no board in inventory; message 67/10/25/5 shows coordinates if can't place; otherwise sets layBoard script |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | fallChasm | Player steps on control area $0004 without board placed | Plays falling animation (view 936), plays fall sound (52), shows "Oh, my goodness!!" message, then "A CHASM!!!" message, shakes screen, and sets global127 to 1 (player dies) |
| TODO | Interaction | layBoard | Player uses place/lay board command with board in inventory and near chasm | Displays board placed message, moves board to room, allows player to safely cross chasm. Awards 2 points on first placement. Tracks board state with local0 and global132 flags. |
## Technical Notes
- **Room Number**: 76
- **Picture**: 76
- **Region**: 605 (Troll Cave)
- **Exits**: North→73, West→75
- **Music**: Sound 52 (fall sound)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `local0` | `0`, `1` | Board placement state: 0 = not placed, 1 = board placed |
| `global132` | `0`, `1` | Board crossing completion flag - tracks if player has successfully crossed |
| `global192` | integer | Score tracking divided by 10 - used to prevent re-awarding points for board placement |
| `gEgoY` | integer | Player Y position at time of board placement - used to detect if player moves off board |
| `global101` | `1` | Room initialization flag |
| `global127` | `0`, `1` | Player death flag - set to 1 when player falls into chasm |
### Control Areas
- `$0040` - Exit zone to north (room 73)
- `$0004` - Chasm/fall zone - triggers fallChasm script when player steps here
- `$1000` - Safe zone near chasm where board can be placed
### Entry Points
- From room 73 (north): Player enters at position (189, 118)
- From room 75 (west): Player enters at position (20, 161)
### Inventory Item
- Item 22 - Board (wooden plank used to cross chasm)
### Synonyms
The room inherits synonyms from region 605 (regTroll):
- dirt = dirt
- kiss = kiss, embrace
- troll = troll, man

56
rooms/kq4-077-swamp.md Normal file
View File

@@ -0,0 +1,56 @@
# Room 77: Swamp
This is a muddy swamp area connecting the cave entrance (Room 73) to the open swamp marsh (Room 78). The player must crawl into the cave to reach Room 73 on the west side, or hop across the swamp tufts to reach Room 78 on the east side. The room features animated props in the background and uses a complex jump system to traverse the marshy terrain.
## Look Description
"From here, a huge muddy swamp spreads eastward. Large moss-covered swamp trees tower overhead, while grass tufts and reedy plants poke up from the mire. You can hear the many chirpings and croakings of unseen swamp creatures."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look room` / `look marsh` / `look[<around][/!*]` | "From here, a huge muddy swamp spreads eastward. Large moss-covered swamp trees tower overhead, while grass tufts and reedy plants poke up from the mire. You can hear the many chirpings and croakings of unseen swamp creatures." (Print 77 0) |
| TODO | Look | `look<in/cave` | "It sure is dark in there!" (Print 77 1) |
| TODO | Look | `look/cave` | "A small cave leads into the mountain." (Print 77 2) |
| TODO | Action | `crawl/` | If in rect (40,154,63,170): initiates crawl into cave script. Otherwise: "You're not close enough." (Print 77 3) |
| TODO | Action | `hop` / `hop,hop` | Initiates jump sequence across swamp tufts to Room 78 |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | egoCrawlOut | Entering room from west (Room 73) | Animation sequence of player crawling out of cave, transitioning from view 49 (crawling) to view 21 (crouching) to view 2 (standing). Sets `global105` to 12 when complete. |
| TODO | Interaction | egoCrawlIn | Player uses `crawl` command near cave entrance OR automatic trigger when facing cave at right position | Animation sequence of player crawling into cave: crouches down (view 21), transitions to crawling (view 49), moves to edge, then transports to Room 73. Sets `global105` to 0 during crawl, and `global205` to 1 on exit. |
| TODO | Background | jump | Player uses `hop` command | Complex multi-state jump sequence across swamp. Tracks jump progress via `local0` and `local1`. Uses `local2` array for jump waypoint coordinates. If player is in wrong position, shows "Not from here!" (Print 77 5). If `global105 = 13`, shows "Just Move." (Print 77 4) and resets. On successful jump to east edge with proper positioning, transports to Room 78. |
## Technical Notes
- **Room Number**: 77
- **Picture**: 77 (or 177 if global100 is set)
- **Region**: 513 (Swamp Region)
- **Exits**: East→78, West→73 (via crawl)
- **Music**: Not specified in room script
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global105` | `0`, `12`, `13` | Player crawl/jump state: 0 = default, 12 = crawled out (ready to crawl in), 13 = can't jump yet |
| `global205` | `0`, `1` | Jump enabled flag: 1 = jumping enabled (hop command works) |
| `global101` | `0` | Reset to 0 on room init |
| `local0` | Number | Jump progress counter (increments on successful jumps east) |
| `local1` | Number | Jump Y-position tracker for waypoint calculation |
| `local2` | Array | Jump waypoint coordinates (11 pairs of x,y positions for hop path) |
| `gEgoViewer` | Script/0 | Stores player's viewer script during jump sequence to restore after |
### Additional Technical Details
- Room uses Region 513 for shared swamp logic
- Two animated props (newProp, newProp_2) using view 650 for background atmosphere
- Player must be in specific position range (87-106, y 161-172) and facing east (loop 0) to jump successfully
- Automatic crawl-in trigger: player faces cave (heading 256-284), is in normal view (2), on control area $4000, and not already in a script
- The jump script disables player control (proc0_8) during animation and re-enables on completion (proc0_9)
- If player has special views (5, 6, 7 - likely different character forms), jump state is reset
- Entry from east (Room 78) starts player at position (301, 161) facing east
- Entry from west (Room 73) or default starts player crawling out of cave at position (32, 160)

View File

@@ -0,0 +1,104 @@
# Room 78: Swamp Island (Cobra/Fruit)
This is the swamp island where a HUGE cobra guards a magical fruit tree. The player must use the flute to hypnotize the cobra in order to retrieve the fruit needed to save their father. The room features a dangerous jump across grass tufts to reach the island, and a snake that blocks access to the fruit until mesmerized.
## Look Description
"You see a small island in the middle of the huge swamp. Upon this island grows a scrawny little tree. %s Unfortunately, a huge cobra protects it."
(Note: %s is replaced with fruit description when present: "A large, glistening fruit hangs from a small branch.")
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look cobra` / `look snake` | "A HUGE cobra protects the small tree that bears the wondrous fruit; the fruit that your father's life depends upon." (if fruit in room) / "A HUGE cobra protects the small island." (if fruit taken) |
| TODO | Look | `look forest` / `look tree` | "The tree is small and scrawny. It looks like it's taken almost every ounce of its strength to produce this one, wondrous fruit." (if fruit in room) / "The small tree looks bare and lonely without its marvelous fruit. Oh, well; in a mere hundred years it'll have another one." (if fruit taken) |
| TODO | Look | `look fruit` | "You see a single glistening fruit upon the scrawny tree." (if fruit in room and not owned) / "You don't see one here." (if not in room) / Shows fruit if already in inventory |
| TODO | Look | `look island` | "A tiny tree grows on this little swamp island. Hanging from a small branch is a large, glistening fruit." (if fruit in room) / "A tiny tree grows on this little swamp island." (if fruit taken) |
| TODO | Look | `look grass tuft` / `look grass` | "The grass tufts lead to the small island." |
| TODO | Look | `look around` / `look [room/marsh]` | "You see a small island the huge swamp. in the middle of Upon this island grows a scrawny little tree. %s Unfortunately, a huge cobra protects it." (with conditional fruit text) |
| TODO | Look | `look * [cobra]` | Various cobra-specific responses |
| TODO | Talk | `talk cobra` / `talk` | "Cobras don't usually talk." |
| TODO | Action | `kill cobra` / `kill snake` | "You have NO way of killing a big cobra." |
| TODO | Action | `get cobra` / `capture cobra` | "You wouldn't want the cobra!" |
| TODO | Action | `kiss cobra` / `kiss` | "That is NOT a good idea!" |
| TODO | Action | `hit cobra` / `hit snake` | "You couldn't get close enough. Besides, the cobra's too big!" |
| TODO | Action | `hop` | Triggers jump script if player is on left side of screen (x < 109) |
| TODO | Get | `get fruit` | Retrieves fruit if player is in correct position, has nothing, and snake is hypnotized or not in room. Awards 10 points. |
| TODO | Get | `get board` | Picks up board if in room and player is in correct position near board location |
| TODO | Action | `lay board` / `place board` | Places board as bridge if player has board and is in correct position |
| TODO | Inventory | `play flute` | Mesmerizes the cobra if player has flute (item 0) and snake is not already hypnotized. Awards 4 points. |
| TODO | Inventory | `deliver [item] to cobra` | "The snake does not require anything from you." |
| TODO | Inventory | `fling [item] to cobra` | "The snake would not be affected by that." |
### Swamp Region (513) Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look water` | "The mucky swamp spreads in all directions." |
| TODO | Look | `look forest` | "Large, moss-draped trees grow abundantly here." |
| TODO | Look | `look grass` / `look tuft` | "The ground is mostly covered with a swampy quagmire. You notice tufts of swamp grass poking up from the murky water." / "You notice some grass tufts leading eastward." |
| TODO | Look | `look dirt` | "The ground is mostly covered with a swampy quagmire." |
| TODO | Action | `drink` | "You kneel down and drink the mucky swamp water. Yech!! It tastes AWFUL!" (if in normal form) / "Yech!! It tastes AWFUL!" (if in frog form) |
| TODO | Action | `dennis crown` / `place crown` | Transforms player into frog if in the swamp area and has crown (item 10). Sets `global105 = 13` (frog form state). |
| TODO | Action | `detach crown` / `get off crown` | Reverts player from frog form if `global105 = 13`. Sets `global105 = 12` (normal state). |
| TODO | Action | `get water` | "You have no reason to carry water." |
| TODO | Action | `get blossom` | "You don't see many flowers in a swamp." |
| TODO | Action | `climb cliff` | "The mountain is too difficult to climb." |
| TODO | Action | `enter fish` / `cast pole` | "You don't see any fish here." |
| TODO | Action | `bathe` / `dive` / `wade` | "Just enter the swamp if you wish to try that." |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | jump | Player types 'hop' command | Handles jumping across the swamp. Checks player position and state, plays jump animation using view 69, moves player to target coordinates defined in local2 array. Awards 2 points on first jump. |
| TODO | Background | snakeActions | Continuous | Controls the cobra behavior. States: idle (1-2), hypnotized (20-21), attacking (10-13), and death sequence. Uses view 330 for snake animation. |
| TODO | Interaction | boardActions | Placing or picking up board | Handles board placement and pickup. State 1: laying board animation. State 2: board appears. State 3: board in place (tracks proximity with global132). State 10: picking up board animation. Awards 2 points for first board placement. |
| TODO | Background | fruitActions | Continuous (if fruit in room) | Animates the magical fruit with a blinking/cycling effect. Cycles between cel states. |
| TODO | Background | swamp | Continuous (region script) | Monitors player position in swamp. Handles terrain-based view changes (normal vs frog form). Controls player movement restrictions based on `global105` state (12 = normal, 13 = frog). Handles death in quicksand areas. |
| TODO | Interaction | drinking | Player attempts to drink swamp water | Animation of player drinking swamp water. Plays drinking sound, shows message. |
## Technical Notes
- **Room Number**: 78
- **Picture**: 78 (178 if `global100` is set - alternate picture variant)
- **Region**: 513 (Swamp Region)
- **Exits**: West→77 (mainland), East→78 (self/loopback)
- **Music**: Sound 50 (theme), Sound 39 (snake theme), Sound 40 (snake attack), Sound 55 (charm/magic)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global105` | `0`, `12`, `13` | Player form state: 12 = normal, 13 = frog transformation (crown used), 0 = in water/transformation |
| `global127` | `0`, `1` | Death flag - set to 1 when player dies (snake bite or quicksand) |
| `global132` | `0`, `1` | Board proximity flag - set to 1 when player is near placed board |
| `global155` | `0`, `1` | Flute score awarded flag - prevents re-awarding points for mesmerizing snake |
| `global201` | `0`, `1` | Board score awarded flag - prevents re-awarding points for placing board |
| `local0` | `-1` to `6` | Jump counter - tracks jump sequence progress |
| `local1` | number | Jump Y position tracker |
| `local22` | `0`, `1`, `2`, `3` | Snake state: 0 = initial, 1 = approached (player jumped to island), 2 = hypnotized, 3 = triggered (player too close after hypnotized) |
| `global100` | `0`, `1` | Alternate picture flag - if set, uses picture 178 |
| `global101` | `0` | Room initialization flag |
### Additional Technical Details
- Synonyms defined: `kiss` = `embrace`, `cobra` = `cobra`
- Region synonyms (513): `water` = `water` = `marsh`
- Player starts with view 2 (normal) on entering
- Jump requires player to be on left side (x < 109) of screen
- Board can only be placed when player x < 109 and on correct terrain (control area 1024 or local0 = 5)
- Fruit can only be picked up from position (171-195, 157-167)
- Snake hypnotization requires flute (item 0) and triggers state change in snakeActions script
- The board (item 22) must be placed to safely cross to island
- Region 513 handles frog transformation mechanics with crown (item 10)
- First jump awards 2 points (`global201`), first board placement awards 2 points (`global201`), first flute use awards 4 points (`global155`), fruit pickup awards 10 points
### Inventory Item Reference
- Item 0: Flute (required to hypnotize snake)
- Item 10: Crown (required for frog transformation)
- Item 22: Board (used to create bridge to island)
- Item 25: Magical Fruit (quest item to save father)

View File

@@ -0,0 +1,75 @@
# Room 79: Mountain Path to Dark Castle
This is the treacherous mountain path that winds around the craggy cliffs leading to Lolotte's dark castle. The room features two of Lolotte's winged henchmen (goons) that ambush the player when approaching from the south. The path is narrow and dangerous with various drop-offs that can cause the player to fall to their death. Players can look at the castle, path, goons, and surrounding landscape, but cannot interact with or capture the goons.
## Look Description
"The treacherous path winds narrowly around the craggy mountain. In the distance, perched upon a rocky ledge, you see a dark, unfriendly castle."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look room` / `look cliff` | "The treacherous path winds narrowly around the craggy mountain. In the distance, perched upon a rocky ledge, you see a dark, unfriendly castle." (Print 79 0) |
| TODO | Look | `look goon` (if goons present) | "Lolotte's goons are not appealing at all! Besides having an unnatural pallor to their skin, they are creepy little creatures who fly upon wings that resemble those of bats." (Print 79 1) |
| TODO | Look | `look goon` (if goons not present) | "You don't see one here." (Print 79 2) |
| TODO | Look | `look path` | "The mountain path is thin and dangerous. It seems to lead to the dark castle." (Print 79 3) |
| TODO | Look | `look castle` | "The dark castle looks very forbidding. It perches precariously upon an over-hanging, mountain ledge. The path, upon which you are now treading, seems to lead directly to the sinister castle." (Print 79 4) |
| TODO | Look | `look boulder` | "The whole mountain is rocky." (Print 79 5) |
| TODO | Look | `look down` / `look dirt` | "The ground is a long way down." (Print 79 6) |
| TODO | Look | `look forest` | "You see a forest of trees below you." (Print 79 7) |
| TODO | Action | `climb cliff` | "The craggy mountains are much too steep to climb." (Print 79 8) |
| TODO | Talk | `converse goon` / `converse` | "Lolotte's henchmen must not speak, as they only utter strange guttural sounds." (Print 79 9) |
| TODO | Action | `get goon` / `capture goon` | "Why would you want one?!" (Print 79 10) |
| TODO | Inventory | `deliver [item]` (if player has item) | "The henchmen are not interested in your offering." (Print 79 11) |
| TODO | Inventory | `deliver [item]` (if player doesn't have item) | "You can't give that." (Print 79 12) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | h1Actions | Entering from south or default entry | First henchman spawns at top of screen, plays theme music, walks down to chase player, transitions to attacking view, captures player |
| TODO | Interaction | h2Actions | Spawns alongside h1Actions when entering from south | Second henchman follows similar pattern to h1Actions, coordinates with first henchman to surround player, triggers capture sequence |
| TODO | Interaction | stopHench | Player falls into pit (any fall* script triggers) | Both henchmen stop chasing and exit screen to the left when player dies |
| TODO | Interaction | egoDead | Player steps on any control area marked as pit | Death sequence: screen shakes, message displayed, game over flag set, player dies |
| TODO | Background | fallBlue | Player on control area $0002 | Player falls and dies (blue pit) |
| TODO | Background | fallCyan | Player on control area $0008 | Player falls and dies (cyan pit) |
| TODO | Background | fallGreen | Player on control area $0004 | Player falls and dies (green pit) |
| TODO | Background | fallLgrey | Player on control area $0080 | Player falls and dies (light grey pit) |
| TODO | Background | fallGrey | Player on control area $0100 | Player falls and dies (grey pit) |
| TODO | Background | fallLblue | Player on control area $0200 | Player falls and dies (light blue pit) |
| TODO | Background | fallLgreen | Player on control area $0400 | Player falls and dies (light green pit) |
| TODO | Background | fallLcyan | Player on control area $0800 | Player falls and dies (light cyan pit) |
## Technical Notes
- **Room Number**: 79
- **Picture**: 79 (day) / 179 (night when `global100` is set)
- **Style**: $0008 (dissolve)
- **Exits**: North→80, South→30
- **Music**: Henchman theme (sound #29, looping)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | `0`, `1` | Night time flag - if set, room uses picture 179 |
| `global101` | number | Room state tracking |
| `global105` | `0`, `1`, `10` | Player state: 10 = falling/dying, 1 = captured by henchmen |
| `global109` | `1`, `2`, `3` | Unknown - checked during henchman capture sequence to determine outcome |
| `global169` | `true`, `false` | Henchmen presence flag - if true, henchmen spawn |
| `global189` | `0`, `1` | Room visited/active flag |
| `global204` | number | Unknown state variable |
### Additional Technical Details
- Synonyms defined: `goon` = `goon` = `man` = `animal`
- Two Act instances (newAct, newAct_2) created for the two henchmen
- Henchmen use views 142, 143, 144 for different animation states
- When captured (state 5 in h2Actions), checks global109 and inventory items (33, 4) to determine capture outcome
- Player falls to death if stepping on control areas with bitmasks $0002, $0004, $0008, $0080, $0100, $0200, $0400, $0800
- Control area $0010 triggers base setter (water effect)
- Control area $0040 triggers exit to room 80 (north edge)
- When player dies (egoDead), global127 is set to 1
- If player is captured by henchmen, transported to room 92
- If player falls but survives somehow, transported to room 30

View File

@@ -0,0 +1,60 @@
# Room 80: Lolotte's Castle Entrance
This is the exterior of Lolotte's dark castle, situated on a rocky ledge of a steep mountain. The player can see the castle, a stable, mountains, and a path leading down. There is a door that can be opened to enter the castle (leading to Room 92). Players must be careful near the cliff edge, as stepping too close will cause them to fall. There is also a hazard area that triggers a falling animation.
## Look Description
"You are standing before Lolotte's dark castle on the edge of the rocky mountain. There is a small stable next to it."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look room` / `look around` / `look` | "You are standing before Lolotte's dark castle on the edge of the rocky mountain. There is a small stable next to it." |
| TODO | Look | `look boulder` | "Lolotte's sinister castle is situated on a rocky ledge of the steep craggy mountain. A small stable is located beside it." |
| TODO | Look | `look castle` | "Lolotte's sinister castle is situated on a rocky ledge of the steep craggy mountain. A small stable is located beside it." |
| TODO | Look | `look barn` / `look stable` | "The crude thatch-roofed stable is located near the dark castle, on the edge of a cliff." |
| TODO | Look | `look cliff` / `look mountain` | "The mountains are rocky and steep. The castle perches precariously upon a large ledge." |
| TODO | Look | `look path` | "The narrow path leads down the mountain." |
| TODO | Look | `look door` | "The door has hideous carvings." |
| TODO | Action | `open door` (when close enough) | Opens door, plays animation, enters Room 92 |
| TODO | Action | `open door` (when not close enough) | "You're not close enough." |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | doDoor | Player opens door | Door opens with animation (603), plays door sound (300), then transports player to Room 92 |
| TODO | Background | falling | Player steps on control area $0004 | Player plays falling animation (view 17, loop 3), falls toward bottom of screen, screen shakes, sets `global127 = 1`, music plays during fall |
## Technical Notes
- **Room Number**: 80
- **Picture**: 80
- **Exits**:
- West→79 (via control area $1000)
- East/Cliff→94 (via control area $0010 - falls off cliff)
- Through door→92 (via doDoor script)
- **Music**: Falling music (sound #52)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global101` | `0` | Set to 0 in room init |
| `global127` | `0`, `1` | Set to 1 when player completes falling animation |
### Additional Technical Details
- Door prop (newProp) uses view 603 at position 288, 116
- Door can only be opened when player is within distance 25 of the door
- Entry positions vary by previous room:
- From Room 79 or start: position 279, 166
- From Room 92: position 266, 122
- From Room 94: position 185, 134
- Control areas:
- $0010 - Cliff edge (triggers fall to Room 94)
- $1000 - West exit to Room 79
- $0004 - Falling hazard zone
- When player falls, view changes to 17 (falling animation), steps change to 5,6, loop 3
- Door sound uses sound 300

View File

@@ -0,0 +1,89 @@
# Room 81: Edgar's Tower Bedroom
## High-Level Summary
Room 81 is Edgar's tower bedroom in the castle. The player enters this room after being captured by Edgar's henchmen. The room contains a four-poster bed, a chest/dresser with a mirror, windows looking out at the mountain, a carpet, stairs leading down, and a door. The key gameplay elements involve obtaining a red rose that has been pushed under the door, retrieving a gold key from the rose, and unlocking the door to escape. The room has two major scripted sequences: one for first-time entry (lockUp script) and one for returning after being caught (lockUpLast script).
## Look Description
"Normally, this is Edgar's tower bedroom. Actually, for being in such an awful castle, it looks quite comfortable; but you're in no mood to care."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look room` | "Normally, this is Edgar's tower bedroom. Actually, for being in such an awful castle, it looks quite comfortable; but you're in no mood to care." |
| TODO | Look | `look/bed` | "This is a most unusual, four-poster bed." |
| TODO | Look | `look<under/bed` | "There is nothing under the bed." |
| TODO | Look | `look/window` | "You see the mountain out the window." (when near window) / "That would not accomplish anything." (when not near window) |
| TODO | Look | `look/chest` / `look/dresser` | "You see a chest of drawers, with a mirror on top." |
| TODO | Look | `look<in/chest` / `look<in/dresser` / `look<in/drawer` | "It's private." |
| TODO | Look | `look/mirror` | "You look in the mirror and see the reflection of a poor, but beautiful, peasant girl." (when in rect) / "That would not accomplish anything." (when not in rect) |
| TODO | Look | `look/carpet` | "A small rug lies on the floor by the bed." |
| TODO | Look | `look/stair` | "The stone stairway leads down the tower." |
| TODO | Look | `look/door` | "It's just a plain wooden door." |
| TODO | Look | `look/wall` | "There is nothing of importance on the walls." |
| TODO | Look | `look/dirt` / `look<down` | "You see a beautiful rose lying by the door." (if rose owned by room) / "There is nothing of interest on the floor." (if rose not in room) |
| TODO | Look | `look/key` | "It is attached to the rose." (if has rose but not key) / (default, unhandled) |
| TODO | Action | `open/window` | "The windows do not open." |
| TODO | Action | `break/window` | "That would not accomplish anything." |
| TODO | Action | `open/chest` / `open/drawer` / `open/dresser` | "It's private." |
| TODO | Action | `open/door` | Opens the door if player is near door and door is closed/latched |
| TODO | Action | `close/door` | "You don't need to." (if closed) / "It already is open." (if open) |
| TODO | Action | `unlatch/door` | Unlocks the door with gold key if player has it |
| TODO | Action | `[use]/key<skeleton` | "The skeleton key does not fit the lock." / "The door is unlocked." |
| TODO | Action | `[use]/key<gold` / `gold` | Uses gold key to unlock door |
| TODO | Action | `get/rose` | Picks up rose if it is in the room (message 0) |
| TODO | Action | `get/untie/detach/key` | Takes gold key from rose if player has rose but not key |
| TODO | Action | `lay/sleep/get/bed` / `sleep` / `lay<down` | "You don't have time for that!" |
| TODO | Talk | `converse` | "You don't have time for that!" |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | `doDoor` | Called when door animation completes | Stops door animation, returns control to player |
| TODO | Interaction | `lockUp` | Entering from room 92 when global175 is false | Cutscene: Henchmen follow player to door, lock them in, Edgar enters via window, takes rose, and player is transported to room 692 |
| TODO | Interaction | `lockUpLast` | global175 is true (player was caught previously) | Similar cutscene but shorter: Player is led to mirror, all inventory moved to room 89, then transported to room 692 |
## Technical Notes
- **Room Number**: 81
- **Picture**: 81
- **Region**: 604 (Edgar's castle region)
- **Exits**: West→85 (through door)
- **Music**: Sound 43 (theMusic), Sound 300 (doorOpenMusic)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `local0` | varies | Used for message return value in lockUp script |
| `local7` | 0/1 | Flag for whether skeleton key was used |
| `local8` | 0/1 | Door unlocked state (0=locked, 1=unlocked) |
| `global175` | 0/1 | Player was caught by Edgar flag |
| `global182` | 0/1 | Rose/key related flag |
| `global204` | 0/1 | Used in lockUp script |
| `global205` | 0/1 | Used in lockUp script |
| `global100` | 0/1 | Daytime flag (affects candles) |
| `gPrevRoomNum` | varies | Previous room number |
### Inventory Items
| Item Number | Name |
|-------------|------|
| 34 | Red Rose |
| 32 | Gold Key |
| 20 | Skeleton Key |
### Special Behaviors
- Rose (item 34) can be pushed under the door when player enters from room 85 with the rose in inventory
- Gold key (item 32) is attached to the rose and must be detached/untied
- Door can only be opened when player is in rect 70,150 to 84,157
- Window look only works when player is in rect 201,117-238,126 or 79,113-116,123
- Mirror look only works when player is in rect 218,135-272,154
- Entry from room 85 or 0 positions player at bottom of stairs
- Entry from room 92 triggers lockUp cutscene
- If global175 is set, lockUpLast script runs instead
- Candles (view 646) only appear when global100 is true (daytime)

View File

@@ -0,0 +1,94 @@
# Room 82: Lolotte's Tower Bedroom
This is the interior of Lolotte's tower bedroom. The room contains a large bed where the evil fairy Lolotte sleeps, a mirror, windows looking out at the mountain, a locked door leading to the stairs, and Genesta's magic talisman around Lolotte's neck. The player can attempt to retrieve the talisman, wake or kill Lolotte using various items, or escape through the locked door.
## Look Description
"So, this is Lolotte's bed chamber. You question her taste in decorating as her furniture is a bit on the gaudy side."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look room` / `look castle` / `look tower` / `look bedroom` | "So, this is Lolotte's bed chamber. You question her taste in decorating as her furniture is a bit on the gaudy side." (Print 82 1) |
| TODO | Look | `look bed` | "The bed is huge and takes up most of the room." (Print 82 5) |
| TODO | Look | `look window` | "You see the mountain out the window." (Print 82 6) - only if in window area |
| TODO | Look | `look wall` | "There is nothing of importance on the walls." (Print 82 7) |
| TODO | Look | `look dirt` / `look floor` | "There is nothing of importance on the floor." (Print 82 8) |
| TODO | Look | `look carpet` / `look rug` | "A massive rug adorns the floor." (Print 82 9) |
| TODO | Look | `look mirror` | "You look in the mirror and see the reflection of a poor, but beautiful, peasant girl." (Print 82 10) - only if in mirror area |
| TODO | Look | `look stair` / `look stairs` | "The stone stairway leads down the tower." (Print 82 37) |
| TODO | Look | `look door` | "It's just a plain wooden door." (Print 82 38) |
| TODO | Look | `look under bed` | "There is nothing under the bed." (Print 82 4) |
| TODO | Look | `look lolotte` / `look fairies` | If alive: "The evil fairy sleeps soundly in her bed. She wears Genesta's magic talisman around her neck, and you see it gleaming upon her chest. As she sleeps, she makes very strange clicking sounds." (Print 82 13). If dead: "Lolotte is quite dead now." (Print 82 14) |
| TODO | Look | `look out` | "You see Lolotte's bedroom door, and a winding stairway leading down the tower." (Print 82 41) |
| TODO | Action | `bang` | If Lolotte alive: "That would be a bad idea!" (Print 82 2). If dead: "Why would you want to?" (Print 82 3) |
| TODO | Action | `open window` | "The windows do not open." (Print 82 39) |
| TODO | Action | `break window` | "That would not accomplish anything." (Print 82 40) |
| TODO | Action | `lay down` / `sleep` / `lay in bed` / `lay on bed` / `get in bed` / `get on bed` | "Not with Lolotte in it!!" (Print 82 28) |
| TODO | Action | `open door` | Opens door if unlocked and player is at door position |
| TODO | Action | `close door` | If door closed: "It already is." (Print 82 26). If door open: "It is already open." (Print 82 27) |
| TODO | Action | `unlock door` | Uses gold key (item 32) to unlock if player has it and is at door |
| TODO | Action | `launch` / `launch arrow` | "Shoot what?" (Print 82 32) |
| TODO | Action | `launch arrow at lolotte` / `launch arrow at fairies` | If has bow: If no arrows left: "Sorry, girl, you have no more arrows!" (Print 82 33). If Lolotte dead: "She already is dead." (Print 82 35). Otherwise: runs shootLolotte script |
| TODO | Action | `launch arrow at arrow` | "She already is dead." (Print 82 35) |
| TODO | Action | `kill lolotte` / `kill fairies` | If Lolotte dead: "She is already dead." (Print 82 29). If has bow: "She is dying." (Print 82 30). Otherwise: "You have no way of doing that." (Print 82 31) |
| TODO | Action | `launch` | "Shoot what?" (Print 82 32) |
| TODO | Talk | `help lolotte` / `help fairies` / `save lolotte` / `save fairies` | "That would be a bad idea!" (Print 82 15) |
| TODO | Talk | `kiss lolotte` / `kiss fairies` | If alive: "She's dead now. Are you sure this is a good idea?" (Print 82 16). If dead: "Why would you want to?" (Print 82 17) |
| TODO | Talk | `awaken lolotte` / `awaken fairies` | If alive: runs egoZapped script (Lolotte zaps player). If dead: "Waking the dead is a little more than even a princess can do!" (Print 82 19) |
| TODO | Talk | `talk lolotte` / `talk fairies` / `converse lolotte` / `converse fairies` | If alive: runs egoZapped script. If dead: "Lolotte is unable to talk, as she is now dead." (Print 82 21) |
| TODO | Talk | `blow whistle` | If alive: runs egoZapped script. Otherwise: no response |
| TODO | Talk | `get lolotte` / `get fairies` / `capture lolotte` / `capture fairies` | If alive: "You wouldn't want her." (Print 82 20). If dead: "Why would you want to?" (Print 82 17) |
| TODO | Talk | `deliver` | "Do you honestly think Lolotte needs anything from you?" (Print 82 18) |
| TODO | Inventory | `get amulet` / `take amulet` | If already has: "You're already carrying it." (Print 82 22). If not in room: "You don't see it here." (Print 82 23). If too far: "You'll have to get a little closer." (Print 82 24). If Lolotte alive: runs egoZapped script. Otherwise: "Ok." (Print 82 25), player gets amulet (item 2), score +5, sets amulet_taken flag |
| TODO | Inventory | `use gold key` / `use key` | If doesn't have gold key: "You don't have it." (Print 82 45). If not at door: no response. If already unlocked: "The door is already unlocked." (Print 82 46). If has skeleton key or local4: unlock door. Otherwise: "What do you want to do with the gold key?" (Print 82 47) |
| TODO | Inventory | `use skeleton key` | If has skeleton key and local4 and not unlocked: "The skeleton key does not fit the lock." (Print 82 42). Otherwise: "What do you want to do with the skeleton key?" (Print 82 48) |
| TODO | Inventory | `unlatch door` | Various responses based on key state and player position |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | doDoor | Opening the door | Sets door to open animation, sets door_open flag, enables player control |
| TODO | Interaction | lolotteDead | Shooting/killing Lolotte | Plays death music, shows Lolotte dying animation, displays death messages, awards 8 points, sets lolotte_alive to false, then runs edsHere script |
| TODO | Interaction | shootLolotte | Using bow/arrow on Lolotte | Player aims and fires golden arrow, triggers lolotteDead script |
| TODO | Interaction | egoZapped | Waking/talking to/attacking Lolotte while she's alive | Plays zap music, shows Lolotte's magic attack, transforms player (zap view), sets player_zapped flag, removes control |
| TODO | Interaction | edsHere | After Lolotte is dead | Edgar enters room, bows, gives player freedom message, then exits |
| TODO | Background | stopHeart | Triggered during lolotteDead | Cleans up heart animation |
## Technical Notes
- **Room Number**: 82
- **Picture**: 82
- **Region**: 604 (Lolotte's Tower)
- **Exits**: South→88 (balcony)
- **Music**: Sound 45 (while in room), Sound 46 (Lolotte death), Sound 43 (Edgar entrance)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `lolotte_alive` | `global169 = 1` (alive), `global169 = 0` (dead) | Whether Lolotte is currently alive |
| `candles_lit` | `global100 = 1` (lit), `global100 = 0` (unlit) | Whether candle props are visible/animated |
| `door_unlocked` | `global220 = 0` (unlocked), `global220 = 1` (locked) | Door lock state |
| `door_open` | `global227 = 1` (open), `global227 = 0` (closed) | Door open/closed state |
| `amulet_taken` | `global182 = 1` (taken), `global182 = 0` (not taken) | Whether player has collected Genesta's talisman |
| `skeleton_key_tried` | `local4 = 1` (tried) | Whether player tried skeleton key on door |
### Inventory Item Reference
- Item 2: Amulet (Genesta's magic talisman)
- Item 14: Bow (with arrows)
- Item 20: Skeleton key
- Item 32: Gold key
### Additional Technical Details
- Room uses region 604 for shared tower logic
- Candle props only appear when global100 is set (candle animation)
- Lolotte NPC uses view 122 when alive, view 123 when dead
- The talisman item is visible in room when ((gInv at: 2) owner?) == 82
- Player starts at position (233, 165) facing south
- Player automatically moves to room 88 if they walk into the control area at the south edge
- Various position checks for mirror (42-108, 123-144), windows (66-131, 196-240), and door (233-251, 155-162)

View File

@@ -0,0 +1,65 @@
# Room 83: Castle Dungeon Cell
This is the interior of a castle dungeon cell where Rosella is held captive. The room contains a skeleton (bones), a whip attached to the wall, chains securing the wall, an ominous machine, a high window, and a locked door. The room connects to the castle throne room (room 86). The cell has two states based on game progress: initially the door is locked (global109 < 5), but after progressing through the escape quest, the door becomes unlocked (global109 >= 5). When global109 equals 99, the player can escape through a secret passage. If entering the room for the first time (global109 = 0), the guard escorts Rosella back to her cell.
## Look Description
"You have found yourself in a HORRIBLE cell! It looks as if others have found their way here, too. Hopefully, you won't end up like them!"
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look room` / `look castle` | "You have found yourself in a HORRIBLE cell! It looks as if others have found their way here, too. Hopefully, you won't end up like them!" (Print 83 0) |
| TODO | Look | `look skeleton` / `look bone` | "At least two unfortunate individuals have met their end here." (Print 83 1) |
| TODO | Look | `look machine` | "An ominous machine lurks in the corner of this cell. As to its purpose; you don't want to know!" (Print 83 2) |
| TODO | Look | `look whip` | "A whip hangs on the wall." (Print 83 3) |
| TODO | Look | `look chain` | "The chains are securely attached to the wall." (Print 83 4) |
| TODO | Look | `look window` | "The window is too high." (Print 83 5) |
| TODO | Look | `look wall` | "There is nothing of importance on the walls." (Print 83 6) |
| TODO | Look | `look down` / `look dirt` | "There is nothing of interest on the floor." (Print 83 7) |
| TODO | Action | `use machine` / `turn on machine` / `turn/wheel` | "You don't know how to use this machine, and you don't EVER want to know!" (Print 83 8) |
| TODO | Get | `get whip` | "The whip is securely attached to the wall. Besides, you wouldn't want it." (Print 83 9) |
| TODO | Get | `get chain` | "The chains are securely attached to the wall." (Print 83 4) |
| TODO | Action | `open window` | "The windows do not open." (Print 83 10) |
| TODO | Action | `break window` | "That would not accomplish anything." (Print 83 11) |
| TODO | Action | `open door` (if global109 < 5) | "You can't. It's locked." (Print 83 12) |
| TODO | Action | `open door` (if global109 >= 5) | "Try just walking through the doorway." (Print 83 13) |
| TODO | Action | `unlatch door` (if global109 < 5) | "You can't. You don't have the key." (Print 83 14) |
| TODO | Action | `unlatch door` (if global109 >= 5) | "It's not locked. In fact, it's still open!" (Print 83 15) |
| TODO | Talk | `call` / `help` / `save` | "No one is going to save you." (Print 83 16) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | takeBack | Entering room from room 86 or 0 when `global109 = 0` | Player is escorted by a guard back to their cell. Sequence: 30-second timer, message "You hear the henchmen returning.", guard actor (view 141) approaches player, player is forced to follow guard to the cell door (position 150,160), guard leads player to cell (150,225), then player is transported to room 86. Sets `global109` to track prisoner state. |
| TODO | Background | room exit | Continuous when `global109 = 99` and player touches control area $0040 | Player escapes through secret passage to room 86 |
## Technical Notes
- **Room Number**: 83
- **Picture**: 83
- **Region**: 604 (Castle dungeon area)
- **Exits**: East→86 (throne room), Secret passage East→86 (when global109 = 99)
- **Synonyms**: `room` = `cell`
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | `0`, `1` | Time of day flag - when set, displays animated torches (view 512) and banner (view 649) |
| `global101` | `1` | Room initialization flag - set to 1 on init |
| `global109` | `0` | Prisoner state - 0 means player is being escorted back to cell by guard |
| `global109` | `1-4` | Prisoner state - door is locked |
| `global109` | `>= 5` | Prisoner state - door is unlocked |
| `global109` | `99` | Prisoner state - player can escape through secret passage |
### Additional Technical Details
- Two pillar/bar views (view 634) at positions (55,78) and (267,78) with priority 4
- Two animated torch props (view 512) at positions (57,66) and (267,66) with priority 3, visible only when global100 is set
- Banner/view (view 649) at position (162,64), visible only when global100 is set
- Player enters at position (156,159) when coming from room 86 or starting, with special movement settings (xStep: 4, yStep: 2)
- Secret escape trigger: control area $0040 when global109 = 99 transports player to room 86
- Guard escort script uses view 141 for the henchman actor

View File

@@ -0,0 +1,90 @@
# Room 84: Cottage Front
## High-Level Summary
Room 84 is the exterior front area of the witch's cottage. The player enters this area from the cottage interior (room 87). The scene features two small trees/bushes in the foreground, and when visited during daytime (global100), four birds fly in the sky with animated clouds. If Pandora's Box (item 4) or the chicken (item 33) have been left in this area, they appear as pickupable items. The chicken has an ambient pacing script and plays music. The room has a single exit back into the cottage to the east.
## Look Description
"The small yard in front of the cottage is covered with tall grass. There are two small trees here. A window looks out on the yard."
(Appended based on inventory state: box and chicken present / chicken only / box only / neither)
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look room` | Look description with conditional text based on items present |
| TODO | Look | `look/box` | "A Pandora's box. It has a strange aura about it." |
| TODO | Look | `look/barrel` | "It's just an empty barrel." |
| TODO | Look | `look/chest` | "A treasure chest, but it's empty." |
| TODO | Look | `look/shelf` | "A small shelf, but there's nothing on it." |
| TODO | Look | `look/bone` | "A bone. Looks like someone's dinner." |
| TODO | Look | `look/window` | "A window looking out on the yard." |
| TODO | Look | `look/wall` | "The cottage walls." |
| TODO | Look | `look/dirt` / `look<down` | "The ground is covered with tall grass." |
| TODO | Look | `look/chicken` | "A chicken. It looks like it might lay an egg soon." (if chicken in room) / "That's odd. I don't see a chicken here." (if chicken not in room) |
| TODO | Get | `get/box<pandora` | Picks up Pandora's Box if player is near and doesn't already have it |
| TODO | Get | `get/chicken` | Picks up chicken if player is near and doesn't already have it |
| TODO | Get | `get/box` | "A Pandora's box. It has a strange aura about it." |
| TODO | Get | `get/chest` | "A treasure chest, but it's empty." |
| TODO | Get | `get/bone` | "A bone. Looks like someone's dinner." |
| TODO | Action | `open/window` | "The window won't open." |
| TODO | Action | `break/window` | "That would be a waste of time." |
| TODO | Action | `open/box` | Handled by get command |
| TODO | Action | `open/barrel` | "It's just an empty barrel." |
| TODO | Action | `open/chest` | "A treasure chest, but it's empty." |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Background | `henPacing` | Always when chicken (item 33) is in room | Chicken paces back and forth near position 80,133, playing ambient music (sound 79) |
| TODO | Interaction | `egoPickUp` | When player picks up Pandora's Box or chicken | Plays pickup animation, awards 2 score points, prevents re-pickup |
## Technical Notes
- **Room Number**: 84
- **Picture**: 84
- **Region**: 604 (Edgar's castle region - shared with cottage interior)
- **Exits**: East→87 (into cottage interior)
- **Music**: Sound 79 (chicken music - plays when chicken is present)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global100` | 0/1 | Daytime flag - when true, shows birds (view 649) and animated clouds (view 512) |
| `global175` | 0/1 | Reset to 0 when entering from room 87 or 0 |
| `global182` | 0/1 | Set to 1 during item pickup animation |
| `newView` | View object | Pandora's Box view (519) when present in room |
| `newAct` | Actor object | Chicken actor (view 360) with henPacing script when present in room |
### Inventory Items
| Item Number | Name |
|-------------|------|
| 4 | Pandora's Box |
| 33 | Chicken |
### Special Behaviors
- Pandora's Box (item 4) appears at position 200,135 when owned by room 84
- Chicken (item 33) appears as an Actor at position 80,133 when owned by room 84
- Chicken has henPacing script that makes it walk between random x positions (67-85 or 90-120) at y=134
- Chicken music (sound 79) loops while chicken is in room
- Birds (view 649, 4 instances) and clouds (view 512, 2 animated props) only appear during daytime (global100 = true)
- Entry from room 87 or 0 positions player at 157,162 facing east
- Exit to room 87 triggered when player touches control area $0040 (right edge)
- Pickup of box or chicken awards 2 score points each
### View References
| View Number | Description |
|-------------|-------------|
| 360 | Chicken actor |
| 519 | Pandora's Box |
| 634 | Trees/bushes (loop 1) |
| 649 | Birds (shown when global100 is true) |
| 512 | Animated clouds (shown when global100 is true) |
| 40 | Ego pickup animation |

View File

@@ -0,0 +1,56 @@
# Room 85: Dark Tower Stairs
This is the interior of a dark stone tower with a spiral staircase. The room serves as a vertical passage connecting different levels of a tower. The player can navigate the stairs but must be careful not to fall. The stairs lead to Room 90 (above) and Room 81 (below). When the player enters from above or starts fresh, they begin at the bottom. When entering from below, they start at the top with special climbing parameters.
## Look Description
"These stone tower steps could be very treacherous!"
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look room` | "These stone tower steps could be very treacherous!" |
| TODO | Look | `look tower` / `look castle` | "These stone tower steps could be very treacherous!" |
| TODO | Look | `look dirt` / `look down` | "There is no floor here; only stone steps." |
| TODO | Look | `look sky` / `look up` | "You look up, but see nothing special." |
| TODO | Look | `look stair` | "The stone stairs spiral up the dark tower." / "Watch your step on these narrow stairs!" |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | fallStairs | Player steps on control area $0004 (hazardous stair area) | Plays falling animation, player slides down the stairs, screen shakes, player recovers at bottom and is returned to Room 90 |
| TODO | Background | myLooper | Continuous while player is in room | Adjusts player facing direction based on heading: north (2), south (3), east (0), west (1) |
## Technical Notes
- **Room Number**: 85
- **Picture**: 85
- **Region**: 604 (no region script found)
- **Exits**: Up→90 (control $0040), Down→81 (control $0020)
- **Music**: Fall music (sound #52)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global105` | 16 | Set during fall animation |
| `global127` | 1 | Set after fall sequence completes |
| `global169` | 0/1 | Checked during fall - displays additional element if true |
### Additional Technical Details
- Entry from Room 90 or game start: Player spawns at position (117, 169) at bottom of stairs
- Entry from Room 81: Player spawns at position (131, 35) at top of stairs, uses myLooper for climbing animation
- Player view changes to 4 (walking) when entering
- baseSetter ScriptID 0 1 is applied to customize ego movement
- Control areas:
- $0040: Exit to Room 90 (top of stairs)
- $0020: Exit to Room 81 (bottom of stairs)
- $0004: Triggers fallStairs script (hazard)
- When player heading is between 305-45 degrees (north), loop is set to 2
- When player heading is between 135-225 degrees (south), loop is set to 3
- When player heading is between 46-134 degrees (east), loop is set to 0
- When player heading is between 226-304 degrees (west), loop is set to 1
- Fall sequence: player enters view 44 (falling), plays animation, then transitions to view 42 at bottom

View File

@@ -0,0 +1,89 @@
# Room 86: Dim Hallway (West End)
This is the west end of a dim hallway in the castle dungeon area. The room serves as a connecting corridor between the dungeon (room 92), the throne room (room 83), and the east hallway (room 87). The room contains a cell door, a table with a candelabra, and a fancy chair. It features animated candle props and conditional entry behaviors based on the player's quest progress. If the player is being chased by a henchman (global175 is set), they will be pursued into this room from room 87.
## Look Description
"This is the west end of a dim hallway. There is an open door here."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` | "This is the west end of a dim hallway. There is an open door here." (Print 86 0) |
| TODO | Look | `look/door` | "It appears to be a cell door." (Print 86 1) |
| TODO | Look | `look/table` | "There is a candelabra on the table shedding dim candlelight." (Print 86 2) |
| TODO | Look | `look/candelabra` | "Candle light flickers from the candelabra." (Print 86 3) |
| TODO | Look | `look/chair` | "This is quite a fancy chair." (Print 86 4) |
| TODO | Look | `look/wall` | "There is nothing of importance on the walls." (Print 86 5) |
| TODO | Look | `look/down` | "There is nothing of importance on the floor." (Print 86 6) |
| TODO | Action | `bang/door` | "There's nobody there..." (Print 86 7) - if in rect 171 115 204 122 |
| TODO | Action | `bang/door` | "You're not close enough." (Print 800 1) - if not in rect |
| TODO | Action | `open/door` | "It is already open." (Print 86 8) - if in rect 171 115 204 122 |
| TODO | Action | `open/door` | "You're not close enough." (Print 800 1) - if not in rect |
| TODO | Action | `close/door` | "It already is closed." (Print 86 9) |
| TODO | Action | `unlatch/door` | "It is already open." (Print 86 8) - if in rect |
| TODO | Action | `unlatch/door` | "You're not close enough." (Print 800 1) - if not in rect |
| TODO | Action | `sit/chair` | "Why don't you just open it?" (Print 86 10) |
| TODO | Get | `get/candelabra` | "You don't have time for that!" (Print 86 11) |
## Region 604 Interactions (BFCastle)
The room applies region 604 (regBFCastle), which provides additional interactions for the castle area:
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Inventory | `blow/whistle` | "That is not a good idea now." (Print 604 0) - if has whistle (item 27) |
| TODO | Look | `look/wall` | "There is nothing of interest on the walls." (Print 604 1) |
| TODO | Talk | `converse/goon` | "You are not close enough." (Print 604 2) - if close enough to henchman |
| TODO | Talk | `converse/goon` | "Lolotte's henchmen must not speak, as you only hear them utter guttural sounds." (Print 604 3) - if henchman exists but not close |
| TODO | Look | `look/goon` | "You don't see one of Lolotte's henchmen here." (Print 604 4) - if henchman not in room |
| TODO | Look | `look/goon` | "The henchman is asleep." (Print 604 5) - if henchman exists and not hostile |
| TODO | Look | `look/goon` | "Lolotte's goons are not appealing at all! Besides having an unnatural pallor to their skin, they are creepy little creatures who fly upon wings that resemble those of bats." (Print 604 6) - if henchman hostile |
| TODO | Action | `awaken/goon` | Triggers henchman chase if henchman exists |
| TODO | Action | `get/capture/goon` | "Why would you want one?!" (Print 604 8) |
| TODO | Action | `kiss/goon` | "That's an AWFUL thought!" (Print 604 9) |
| TODO | Action | `deliver/goon` | "The henchmen are not interested in your offering." (Print 604 10) |
| TODO | Look | `look/raven` | "You don't see a raven here." (Print 604 11) - if raven not in room |
| TODO | Look | `look/raven` | "You see Lolotte's raven spying on you." (Print 604 12) - if raven in room |
| TODO | Talk | `converse/raven` | "Caw! Caw!" (Print 604 13) |
| TODO | Action | `get/capture/raven` | "You wouldn't want it even if you could get it." (Print 604 14) |
| TODO | Action | `kiss/raven` | "Not this bird!" (Print 604 15) |
| TODO | Action | `deliver/raven` | "The raven is not interested in anything you have." (Print 604 16) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | `openDoor` | Player opens door in room | Plays door animation, opens door, and transitions to room 83 (throne room) |
| TODO | Interaction | `intoDungeon` | Entering from room 92 | Triggers cutscene: ego walks to position, door opens, two actors (dwarves?) appear, ego descends into dungeon, then transitions to room 83 |
| TODO | Interaction | `toThrone` | Entering from room 83 when global109 = 0 | Ego walks to throne position, then transitions to room 92 |
| TODO | Interaction | `henchChase` | Entering from room 87/0 when global175 is set | Henchman actor spawns behind player and chases them. When caught, triggers game over (room 81) |
| TODO | Background | `newProp_2/3/4` | Always | Animated candle props with forward cycle |
## Technical Notes
- **Room Number**: 86
- **Picture**: 86
- **Region**: 604 (regBFCastle)
- **Exits**: East → 87 (hallway), Door → 83 (throne room), From 92 (dungeon entry)
- **Music**: 41 (henchman chase), 42 (henchman catch), 300 (door open)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global109` | 0, 1, 2, 3, 99 | Quest progress state (0 = not started, advances through game) |
| `global175` | 0, 1 | Henchman chase active flag (1 = being chased) |
| `global205` | 0, 1 | Event occurred flag (set when caught by henchman) |
| `newProp cel` | 0, 4 | Door state (0 = closed, 4 = open) |
### Entry Conditions
- **From room 87 or start**: Position at 303, 141. If global175 is set, spawns henchman that chases player
- **From room 83**: Position at 190, 120. If global109 = 0, runs toThrone script; otherwise just stands
- **From room 92**: Position at 293, 141, plays intoDungeon animation sequence
### Automatic Transitions
- Walking east into control area $0040 while global109 != 0 triggers transition to room 87

View File

@@ -0,0 +1,94 @@
# Room 87: East End of Hallway
## High-Level Summary
Room 87 is the east end of a hallway in Lolotte's castle. The room features a plain wooden door leading to the castle interior, a table with a candelabra, and three dancing goons (if not hostile) or one hostile henchman (if hostile state triggered). The room connects to rooms 86 (west), 84 (south), and 88 (north). The player can encounter Lolotte's henchmen here, who may chase the player if they get too close after the henchman has become hostile.
## Look Description
"This is the east end of the hallway."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look[<around>][/!*]` / `look[<around>]/room,castle,hall` | "This is the east end of the hallway." (Print 87 0) |
| TODO | Look | `look/goon` | "Lolotte's goons are not appealing at all! Besides having an unnatural pallor to their skin, they are creepy little creatures who fly upon wings that resemble those of bats." (Print 87 1) |
| TODO | Look | `look/door` | "It's a plain wooden door." (Print 87 2) |
| TODO | Look | `look/table` | "There is a candelabra on the table, from which dim candle light sheds." (Print 87 3) |
| TODO | Look | `look/candelabra` / `look/candle` | "Candle light flickers from the candelabra." (Print 87 4) |
| TODO | Look | `look/wall` | "There is nothing of importance on the walls." (Print 87 5) |
| TODO | Look | `look/dirt` / `look[<down]` | "There is nothing of importance on the floor." (Print 87 6) |
| TODO | Talk | `talk/goon` / `talk/man` | (If global169: "It's not for you." Print 87 7) / (Else: "There's nobody there..." Print 87 8) |
| TODO | Get | `get/candelabra` / `get/candle` | "It is already open." (Print 87 9) |
| TODO | Action | `bang/door` | (If in rect 111 118 140 123: "It already is." Print 87 10) / (Else: "You're not close enough." Print 800 1) |
| TODO | Action | `open/door` | (If door cel != 0: "It is already open." Print 87 11) / (If not in rect: "You're not close enough." Print 800 1) / (Else: animate door open, play door sound) |
| TODO | Action | `close/door` | "Why don't you just open it?" (Print 87 12) |
| TODO | Action | `unlatch/door` | (If in rect: "Why don't you just open it?" Print 87 13) / (Else: "You're not close enough." Print 800 1) |
| TODO | Talk | `converse/goon` / `converse/man` | "Lolotte's henchmen must not speak, as you only hear them utter guttural sounds." (Print 87 14) |
| TODO | Action | `get/goon` / `get/man` / `capture/goon` / `capture/man` | "Why would you want one?!" (Print 87 15) |
| TODO | Action | `kiss/goon` / `kiss/man` | "That's an AWFUL thought!" (Print 87 16) |
| TODO | Inventory | `deliver/goon` / `deliver/man` / `give/goon` / `give/man` | "The henchmen are not interested in your offering." (Print 87 17) |
## Region Interactions (regBFCastle - Region 604)
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Inventory | `blow/whistle` | (If has whistle (item 27): "That is not a good idea now." Print 604 0) / (Else: play default whistle sound) |
| TODO | Look | `look/wall` | "There is nothing of interest on the walls." (Print 604 1) |
| TODO | Talk | `converse/goon` / `converse/man` / `converse[/goon,man]` | (If henchman present and global169 and not global175: if close enough trigger chase, else "You are not close enough." Print 604 2) / (Else: "Lolotte's henchmen must not speak, as you only hear them utter guttural sounds." Print 604 3) |
| TODO | Look | `look/goon` / `look/man` | (If henchman present and global169 and not global175: "The henchman is asleep." Print 604 5) / (Else: "Lolotte's goons are not appealing at all! Besides having an unnatural pallor to their skin, they are creepy little creatures who fly upon wings that resemble those of bats." Print 604 6) |
| TODO | Action | `awaken/goon` / `awaken/man` | (If henchman present and global169 and not global175: if close enough trigger chase, else "You are not close enough." Print 604 2) / (Else: "They already are." Print 604 7) |
| TODO | Action | `get/goon` / `get/man` / `capture/goon` / `capture/man` | "Why would you want one?!" (Print 604 8) |
| TODO | Action | `kiss/goon` / `kiss/man` | "That's an AWFUL thought!" (Print 604 9) |
| TODO | Inventory | `deliver/goon` / `deliver/man` / `give/goon` / `give/man` | "The henchmen are not interested in your offering." (Print 604 10) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | `doDoor` | Player opens door (said 'open/door' when door cel = 0 and player in rect 111-118-140-123) | Stops door animation, transitions to room 84 |
| TODO | Interaction | `henchChase` | global169 is true (henchman hostile) and player enters room | Henchman walks toward player, plays chase music, catches player after 4 seconds, transitions to room 81 (game over) |
| TODO | Background | `circleJerk` | When global169 is false (goons not hostile) | Three goons perform a dancing/cycling animation in a circle pattern |
| TODO | Background | `henchChaseReg` | (Region 604) Henchman is hostile and player gets too close (< 20 distance) or random encounter in rooms 91/92 | Henchman chases player, triggers game over if caught |
## Technical Notes
- **Room Number**: 87
- **Picture**: 87
- **Region**: 604 (Black Forest Castle - regBFCastle)
- **Exits**:
- West → Room 86 (control area $0040)
- South → Room 84 (control area $0020)
- North → Room 88 (control area $0010)
- **Music**: Sound 41 (chase music), Sound 42 (catch music)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global169` | `0` (false), `1` (true) | Henchman hostile flag - if true, goons become hostile henchman that chases player |
| `global175` | `0` (false), `1` (true) | Henchman chase initiated flag - prevents re-triggering chase |
| `global205` | `0` (false), `1` (true) | Game over triggered by henchman capture |
| `newProp` | Prop instance | Door prop at position (140, 117) - cel indicates open/closed state |
| `newProp_2`, `newProp_3`, `newProp_4` | Prop instances | Animated candelabra candles |
| `newAct` | Actor instance | Either hostile henchman (view 145, loop 4) or dancing goon (view 147) |
| `newAct_2`, `newAct_3` | Actor instances | Additional dancing goons (only when not hostile) |
### Entry Points
- From Room 88 or starting game (room 0): Position at (261, 133), view 4
- From Room 86: Position at (25, 142), view 4
- From Room 84: Position at (131, 124), view 4
### Objects in Room
| Object | View | Position | Description |
|--------|------|----------|-------------|
| Door | 608 | (140, 117) | Plain wooden door - animated open/close |
| Candelabra candles | 633 | (24, 64), (32, 74), (42, 64) | Three animated candlechman/ flames |
| HenGoons | 145/147 | Various | Either hostile henchman (view 145) or three dancing goons (view 147) |
### Inventory Item Reference
- Item 27 = Whistle (used with 'blow/whistle' command in region 604)

View File

@@ -0,0 +1,59 @@
# Room 88: Stone Tower Stairs
This is the interior spiral staircase of the dark stone tower. The room features narrow stone steps spiraling upward, with open areas where the player can fall. There is a doorway leading somewhere (Room 87), and dangerous drop-offs on both sides. A guard may chase the player through this room depending on game state.
## Look Description
"These stone tower steps could be very treacherous!"
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look room` / `look castle` / `look tower` | "These stone tower steps could be very treacherous!" |
| TODO | Look | `look down` / `look dirt` | "There is no floor here, only stone steps." |
| TODO | Look | `look wall` | "You see nothing of interest on the walls." |
| TODO | Look | `look up` / `look sky` | "You look up, but see nothing special." |
| TODO | Look | `look stair` | "The stone stairs spiral up the dark tower." / "Watch your step on these narrow stairs!" |
| TODO | Look | `look door` | "There is an open doorway before you." |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | henchChase88 | Entering from Room 87 when `henchman_active = true` | Guard (view 141) chases player using Chase motion, plays music, disables player control, forces player to Room 81 |
| TODO | Background | fallStairs | Walking on control areas $0004 (stairs) or $1000 (upper area) | Player falls down stairs with animation sequence, screen shakes, player is transported to Room 93 |
## Technical Notes
- **Room Number**: 88
- **Picture**: 88
- **Region**: 604 (Stone Tower)
- **Exits**: North→93 (top of stairs fall), East→82 (side fall), West→87 (doorway)
- **Music**: Sound 52 (fall sound), Sound 41/42 (henchman chase)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `local1` | `0`, `1` | Tracks if player is in upper/safe area of stairs |
| `henchman_active` | `global175` | Whether the henchman guard is active and chasing |
| `player_fell` | `global127` | Set to 1 after falling down stairs |
| `fall_horizon` | `global105` | Set to 16 during fall animation |
### Additional Technical Details
- Room uses Region 604 for shared stone tower logic
- `myLooper` code object determines player animation loop based on heading direction
- Player starts at different positions depending on entry direction:
- From Room 93 or game start: Position 162,142 (bottom)
- From Room 87: Position 91,130 (doorway area)
- From Room 82: Position 211,62 (upper area)
- Control areas:
- $0040 - Triggers exit to Room 93 (top fall)
- $0020 - Triggers exit to Room 82 (side fall)
- $0010 - Triggers exit to Room 87 (doorway)
- $0004 - Triggers fallStairs script (stair hazard)
- $1000 - Triggers fallStairs script when in upper area
- If global169 is true when falling, a view 145 cel 4 is shown (possibly related to ogre/capture)
- After falling, player walks to position 150,140 in Room 93

View File

@@ -0,0 +1,76 @@
# Room 89: Castle Kitchen
## Look Description
"You have discovered the castle's kitchen. Not a very pleasant kitchen, but a kitchen nonetheless. Against the back wall, two cabinets flank a cold stone fireplace. You see a long table under the one small window."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look[<around>][/!*]` / `look/room,castle,kitchen` | "You have discovered the castle's kitchen. Not a very pleasant kitchen, but a kitchen nonetheless. Against the back wall, two cabinets flank a cold stone fireplace. You see a long table under the one small window." (Print 89 0) |
| TODO | Look | `look[<in]/cabinet` | "[If near right cabinet with items: 'Here are all of your possessions!']" / "[If near right cabinet empty: 'The cabinet is empty.']" / "[If near left cabinet: 'The cabinet is full of dishes.']" (Print 89 1/2/3) |
| TODO | Look | `look/cabinet` | "You see two cabinets; one on each side of the stone fireplace." (Print 89 4) |
| TODO | Look | `look[<under]/table` | "There's nothing under the table." (Print 89 5) |
| TODO | Look | `look/table` | "Nothing on the table interests you." (Print 89 6) |
| TODO | Look | `look/fireplace` | "The fireplace is unlit and cold." (Print 89 7) |
| TODO | Look | `look/caldron` | "An empty iron pot sits in it." (Print 89 8) / "The iron pot in the fireplace is empty." (Print 89 9) |
| TODO | Look | `look/barrel` | "There is nothing of interest in the barrel." (Print 89 10) |
| TODO | Look | `look/wall` | "There is nothing of importance on the walls." (Print 89 11) |
| TODO | Look | `look/dirt` / `look[<down]` | "There is nothing of importance on the floor." (Print 89 12) |
| TODO | Look | `look/window` | "[If in rect 220-282, 124-146: 'You see the mountain out the window.']" / "[If not in rect: 'You're not close enough.']" (Print 89 13 / 800 1) |
| TODO | Look | `look/door` | "You see an open doorway before you." (Print 89 14) |
| TODO | Action | `open/barrel` | "There is nothing in the barrel." (Print 89 15) |
| TODO | Action | `open/window` | "The windows do not open." (Print 89 16) |
| TODO | Action | `open/cabinet,door` | "[If near right cabinet closed: Opens cabinet, shows items if present or 'The cabinet is empty.']" / "[If near right cabinet open: 'It appears open already.']" / "[If near left cabinet closed: Opens cabinet, shows 'The cabinet is full of dishes.']" / "[If near left cabinet open: 'It appears open already.']" / "[If not near any: 'You're not close enough.']" (Print 89 17/18/3/18/800 1) |
| TODO | Action | `close/cabinet,door` | "[If near right cabinet open: Closes cabinet]" / "[If near right cabinet closed: 'It already is closed.']" / "[If near left cabinet open: Closes cabinet]" / "[If near left cabinet closed: 'It already is closed.']" / "[If not near any: 'You're not close enough.']" (Print 89 19/800 1) |
| TODO | Action | `break/window` | "That would not accomplish anything." (Print 89 20) |
| TODO | Get | `get/caldron` | "You don't need it." (Print 89 21) |
| TODO | Get | `get/dish` | "[If left cabinet open: 'You have no need of dishes.']" / "[If left cabinet closed: 'The cabinet is closed.']" (Print 89 22/23) |
| TODO | Get | `get/all,possessions,inventory` | "[If no items in cabinet: 'The cabinet is empty.']" / "[If items but not near right cabinet: 'You're not close enough.']" / "[If items and near right cabinet: Collects all items from cabinet, awards 4 points, sets global182=1]" (Print 89 2/24/800 1) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | `rightCabinet` | Opening right cabinet (cel=0) | Stops updating after cabinet animation completes (state -1) |
| TODO | Interaction | `leftCabinet` | Opening left cabinet (cel=0) | Stops updating after cabinet animation completes (state -1) |
## Technical Notes
- **Room Number**: 89
- **Picture**: 89
- **Region**: 604 (Castle area)
- **Exits**: Room 91 (south edge detected with control $0040)
- **Music**: Unknown
### Objects
| Object | View | Loop | Description |
|--------|------|------|-------------|
| newProp | 606 | 0 | Right cabinet (animated) |
| newProp_2 | 606 | 1 | Left cabinet (animated) |
| newView | 606 | 2 | Right cabinet items view |
| newView_2 | 606 | 2 | Left cabinet dishes view |
| Static feature | 634 | 1 | Stone fireplace/back wall element |
| (Conditional) | 512 | 0 | Lit element (when global100 is set) |
| (Conditional) | 649 | 2 | Additional element (when global100 is set) |
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `local7` | `0`, `1` | Whether cabinet contains items (checked via `localproc_000c` which scans inventory for items owned by room 89) |
| `global182` | `0`, `1` | Whether player has collected items from cabinet (score awarded flag) |
| `global175` | Any | Reset to 0 on room entry from room 91 or initial game |
| `global100` | `0`, `1` | Controls conditional objects (possibly night/candle state) |
### Entry Points
- **From Room 91**: Player enters at position (38, 151) with view 4, xStep 4, yStep 2
- **Initial game (room 0)**: Same entry as from Room 91
### Inventory Items
- Room 89 can contain inventory items (checked by `localproc_000c` which iterates through inventory to find items with `owner? == 89`)
- When player gets all items: awards 4 points, sets `global182 = 1`

View File

@@ -0,0 +1,64 @@
# Room 90: West Tower Bottom
## High-Level Summary
Room 90 is the bottom of the west tower in the game. It serves as a transitional area connecting to rooms 85 (above/north) and 91 (east). The room features a spiral staircase, stone walls, and a dangerous trapdoor area. Players entering from room 85 (the stairs above) must navigate carefully as there are falling hazards that can either result in injury or death depending on positioning.
## Look Description
"You are at the bottom of the west tower. A spiral of stone steps winds to the top."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `/dirt` or `[<down]` | "You see nothing of interest on the cold stone floor of the tower." (Print 90 1) |
| TODO | Look | `/wall` | "You see nothing of interest on the walls." (Print 90 2) |
| TODO | Look | `/sky` or `[<up]` | "You look up, but see nothing special." (Print 90 3) |
| TODO | Look | `/stair` | "The stairs spiral steeply up the stone tower." (Print 90 4) |
| TODO | Look | `/stair` | "The stone steps spiral dangerously upward." (Print 90 5) |
| TODO | Look | `/door` | "There is an open doorway before you." (Print 90 6) |
| TODO | Look | `/door` | "You glance quickly through the open doorway, but do not see anything of interest in the adjoining room." (Print 90 7) |
| TODO | Look | `[<around][/room]` or `/castle,tower` | "You are at the bottom of the west tower. A spiral of stone steps winds to the top." (Print 90 8) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | `fallingDown` | Player enters from room 85 (local0=1) and steps on control area $0004 (trapdoor) or $0100 | Player falls but survives. Changes ego to view 44 falling animation, plays fall music (sound 51), then returns to view 41 briefly, then restores normal view 4. Player regains control after fall. |
| TODO | Interaction | `fallingToDeath` | Player enters from room 85 (local0=1) and steps on control area $0004 (death trap) | Player falls to death. Sets global105 to 16, plays fall music, changes to view 42 (death), shakes screen, stops all sounds, sets global127 to 1 (death state), and ends game. |
## Technical Notes
- **Room Number**: 90
- **Picture**: 90
- **Region**: 604 (West Tower region)
- **Exits**: Control area $0040 → Room 91 (east), Control area $0020 → Room 85 (north/stairs above)
- **Music**: Sound 51 (falling music)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `local0` | 0, 1 | Safety flag: 0 = safe (entered from room 91), 1 = danger zone (entered from room 85, triggers falling hazards) |
| `global175` | 0, 1 | Flag indicating if player escaped Lolotte's henchman - triggers warning message on entry if set |
| `global105` | 16 (set during death) | Death sequence control variable |
| `global127` | 0, 1 | Death state flag - set to 1 when player dies in fallingToDeath script |
### Entry Conditions
- **From Room 91 (east)**: Player spawns at position 255, 134, safe mode (local0=0). If global175 is set, prints warning message about escaping henchman.
- **From Room 85 (north)**: Player spawns at position 104, 38, danger mode (local0=1). Player is on elevated stairs with falling hazard.
### Objects
- **View 634, loop 1, cel 1**: Background element at position (209, 77), priority 4
- **Prop 512, loop 0**: Animated prop at position (209, 65), priority 3, cycles forward (possibly torch or candle flame)
### Control Areas
- `$0040`: East exit zone (leads to room 91)
- `$0020`: North exit zone (leads to room 85)
- `$0004`: Death trap zone (triggers fallingToDeath when local0=1)
- `$0100`: Injury zone (triggers fallingDown when local0=1)
- `$0002`: Ladder/stairs detection zone (affects player positioning and baseSetter)

View File

@@ -0,0 +1,58 @@
# Room 91: Castle Dining Room
This is the interior of the castle's dining room, a cheerless space associated with the villain Lolotte. The room features a large dining table, tapestries on the walls, a chandelier, and three open doorways leading to other parts of the castle. A henchman may chase the player if certain conditions are met when entering from rooms 90 or 92.
## Look Description
"This is a rather cheerless dining room. Eating here would NOT be a pleasant experience."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look` / `look around` / `look room` / `look castle` | "This is a rather cheerless dining room. Eating here would NOT be a pleasant experience." |
| TODO | Look | `look under table` | "There is nothing under the table." |
| TODO | Look | `look table` | "The great dining table looks big enough to seat Lolotte and at least eight of her despicable henchmen." |
| TODO | Look | `look behind tapestry` / `look under tapestry` | "There is nothing but a wall behind the tapestry." |
| TODO | Look | `look tapestry` / `look painting` / `look tapestries` | "There's a most unusual tapestry hanging on the wall." |
| TODO | Look | `look chandelier` / `look candle` / `look candelabra` | "An interesting chandelier above the dining table casts flickering shadows around the room." |
| TODO | Look | `look door` | "You see three open doorways." |
| TODO | Look | `look wall` | "There is nothing of importance on the walls." |
| TODO | Look | `look dirt` / `look down` | "There is nothing of importance on the floor." |
| TODO | Action | `sit` | "You don't have time for that!" |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | henchChase | Entering from room 90 or 92 when `henchman_active = true` | Henchman (view 141) chases the player, plays chase music (sound 41), catches player after reaching them (sound 42), then transports player to room 81 (Lolotte's chamber) |
| TODO | Background | (animated prop) | Room initialization | Prop with view 636 animates continuously, positioned at upper part of room with priority 15 |
## Technical Notes
- **Room Number**: 91
- **Picture**: 91
- **Style**: $0010
- **Region**: 604 (set but no corresponding region script found)
- **Exits**: West→90 (control area $0040), East→92 (control area $0020), North→89 (control area $0010)
- **Music**: Chase music (sound 41, 42) when henchman is active
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global175` (henchman_active) | `0`, `1` | Flag indicating if henchman should chase player (set when player enters this room from 90 or 92 while henchman is active) |
| `global205` | `0`, `1` | Flag set when henchman catches player, disables player control |
| `gPrevRoomNum` | Various | Previous room number, determines player spawn position |
### Additional Technical Details
- Player enters at different positions based on previous room:
- From Room 92 or start (room 0): spawn at x=291, y=152
- From Room 89: spawn at x=253, y=123
- From Room 90: spawn at x=27, y=153
- When henchman chases (global175 = true), spawns NPC with view 141 that follows player
- Animated prop (view 636) runs on loop 0 with Fwd cycle at position (133, 60)
- Room 91 is part of the castle interior connected to rooms 89, 90, and 92
- If henchman is in chase mode (state >= 1) when leaving, player is forced to room 81 (Lolotte's chamber)
- Control areas determine room transitions: $0040 (west), $0020 (east), $0010 (north)

View File

@@ -0,0 +1,68 @@
# Room 92: Lolotte's Throne Room
The throne room serves as the centerpiece of Lolotte's evil castle, where the witch conducts her malevolent rule over the realm. This room is the primary location for all major story encounters with Lolotte, featuring her ornate gilded throne, animated torch props, and multiple dialog cutscenes that advance based on the player's progress in fetching quest items (unicorn, hen, Pandora's Box). The room features several scripted interactions that lead to different outcomes, culminating in the final marriage plotline.
## Look Description
"Lolotte's throne room is cold, dark, and ominous. From here, she rules her domain with an evil hand."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `/throne` | "Currently, Lolotte's ornate, gilded throne is empty." |
| TODO | Look | `/stair` | "The carpeted stairs lead to Lolotte's gilded throne." |
| TODO | Look | `<behind,under/tapestries,painting` | "There is nothing but wall behind the tapestry." |
| TODO | Look | `/tapestries,painting` | "Two strange-looking tapestries hang on the wall behind Lolotte's throne." |
| TODO | Look | `/door` | "You see two open doorways." |
| TODO | Look | `/wall` | "There is nothing of importance on the walls." |
| TODO | Look | `/dirt` or `<down` | "There is nothing of importance on the floor." |
| TODO | Look | `/carpet` | "The carpet leads to Lolotte's throne." |
| TODO | Look | `<around` or `/room` or `/castle` | "Lolotte's throne room is cold, dark, and ominous. From here, she rules her domain with an evil hand." |
| TODO | Action | `sit/throne` | "You don't have time for that." |
| TODO | Action | `open/door` | If global109=99 and global169=0: "Just go there." Otherwise: "OH, NO!! The door is locked!" and "What now, Rosella?!" |
| TODO | Action | `unlatch/door` | If global109=99 and global169=0: "It already is." Otherwise: "You don't have the key to unlock this door." |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | `walkIn` | Entering from rooms 79, 0, or 333 | Plays entry animation and transitions to appropriate lotTalk script based on global109 progress |
| TODO | Interaction | `lotTalk1` | global109=0 on entry | First encounter with Lolotte - she suspects player is a spy, sends to fetch unicorn (+7 score, sets global169=1) |
| TODO | Interaction | `lotTalk2` | Entering from room 86 | Alternate dialogue where Edgar believes player, sends to fetch unicorn (+7 score, sets global109=1) |
| TODO | Interaction | `lotTalk3` | global109=1 on entry | Second encounter after bringing unicorn (+7 score, sets global109=2), demands hen from ogre |
| TODO | Interaction | `lotTalk4` | global109=2 on entry | Third encounter after bringing hen (+7 score, sets global109=3), demands Pandora's Box |
| TODO | Interaction | `lotTalk5` | global109=3 on entry | Final encounter - asks name, reveals marriage to Edgar, takes all inventory, exits to room 81 (+7 score, sets global109=99) |
| TODO | Background | `lipLooper` | Continuous during dialogue | Manages lip synchronization animation for NPC speech |
| TODO | Interaction | `getShit` | Triggered in lotTalk5 | Animation of goons removing all inventory items from player |
## Technical Notes
- **Room Number**: 92
- **Picture**: 92
- **Region**: 604 (Lolotte/castle region)
- **Exits**: North→91, East→93, West→80 (with key and story progression)
- **Music**: Sound 44
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `global109` | 0, 1, 2, 3, 99 | Story progress: 0=first visit, 1=brought unicorn, 2=brought hen, 3=brought box, 99=completed |
| `global169` | 0, 1 | Flag set after first encounter (triggers different door behavior) |
| `global205` | 0, 1 | Control flag for cutscene state (1=cutscene active) |
| `local8` | 0, 1 | Script timing flag |
| `local9` | number | Lip sync counter for lipLooper script |
| `local10` | 0, 1 | Door message printed flag (prevents repeat) |
### Objects
| Object | Type | Position | Description |
|--------|------|----------|-------------|
| Left torch | View 634, loop 1, cel 0 | 32, 79 | Static torch graphic |
| Right torch | View 634, loop 1, cel 1 | 289, 80 | Static torch graphic |
| Left flame | Prop 512, loop 0 | 34, 67 | Animated flame |
| Right flame | Prop 512, loop 0 | 289, 68 | Animated flame |
| npcProp | Prop 121 | 162, 102 | NPC prop (lolotte?) |
| npcProp2 | Prop 132, loop 2 | 210, 94 | NPC prop (Edgar?) |
| goon | Act 141 | 350, 129 | Goon actor |

View File

@@ -0,0 +1,76 @@
# Room 93: Bottom of East Tower
This is the bottom of the east tower within Beast Fountain Castle. The room features a spiral stone staircase leading upward and serves as a chase sequence location where Lolotte's henchman may pursue the player. The room connects to room 92 (outside) and room 88 (top of tower). The player can fall on the steep stairs, and a henchman may appear and chase them if certain conditions are met.
## Look Description
"You are at the bottom of the east tower. A spiral of stone steps winds to the top."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look[<around>][/!*]` / `look/room` / `look/castle` / `look/tower` | "You are at the bottom of the east tower. A spiral of stone steps winds to the top." (Print 93 1) |
| TODO | Look | `look/stair` | "The stone steps spiral dangerously upward." (Print 93 2) |
| TODO | Look | `look/dirt` / `look[<down>]` | "You see nothing of interest on the cold stone floor of the tower." (Print 93 3) |
| TODO | Look | `look/sky` / `look[<up>]` | "Looking up, you see nothing special." (Print 93 4) |
| TODO | Look | `look/stair` | "The stairs spiral steeply up the stone tower." (Print 93 5) |
| TODO | Look | `look/door` | "There is an open doorway before you." (Print 93 6) |
| TODO | Look | `look/door` | "You glance quickly through the open doorway, but do not see anything of interest in the adjoining room." (Print 93 7) |
| TODO | Look | `look/wall` | "There is nothing of interest on the walls." (region 604, Print 604 1) |
| TODO | Talk | `blow/whistle` | "That is not a good idea now." (if has item 27 - whistle) (region 604, Print 604 0) |
| TODO | Talk | `converse/goon` / `converse/man` | Various responses about henchman (region 604, Print 604 2/3) |
| TODO | Action | `look/goon` / `look/man` | Responses about henchman appearance (region 604, Print 604 5/6) |
| TODO | Action | `awaken/goon` / `awaken/man` | Wakes or alerts henchman (region 604, Print 604 2/7) |
| TODO | Action | `get/goon` / `capture/goon` | "Why would you want one?!" (region 604, Print 604 8) |
| TODO | Action | `kiss/goon` / `kiss/man` | "That's an AWFUL thought!" (region 604, Print 604 9) |
| TODO | Inventory | `deliver` to goon | "The henchmen are not interested in your offering." (region 604, Print 604 10) |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | `falling` | When player steps on control area $0004 while `local0` is true and not already falling | Player falls down the stairs. Two fall sequences exist: (1) falling from higher position plays falling animation (view 44), then death sequence (view 41, 42), screen shake, and sets `global127` (death flag); (2) falling from lower position plays smaller fall animation and returns to normal |
| TODO | Interaction | `henchChase93` | When entering from room 92 and `global175` is set (player was seen by henchman) with 10% random chance, OR when talking to/awakening henchman within range | Henchman chases player with music (sound 41), then catches player (sound 42), sets `global205` (captured flag), and forces player to room 81 (dungeon) |
| TODO | Background | `initializeRoom` (region 604) | When entering rooms 90-93 after certain conditions | Spawns Lolotte's henchman (view 145) at position (124, 129) in room 93 if `global109 > 3` (game progress), `global169` is set |
| TODO | Background | `henchChaseReg` (region 604) | When henchman is in room and certain conditions met | Regional henchman chase script that can trigger in rooms 91-93 |
## Technical Notes
- **Room Number**: 93
- **Picture**: 93
- **Region**: 604 (Beast Fountain Castle)
- **Exits**:
- West → Room 92 (entering from left/bottom)
- Up → Room 88 (entering from above)
- **Music**: Sound 51 (falling), Sound 41/42 (henchman chase)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `local0` | `0`, `1` | Tracks whether player is on stairs (1) or on ground (0) |
| `global175` | `0`, `1` | Player was seen by henchman flag |
| `global169` | `0`, `1` | Henchman active flag |
| `global205` | `0`, `1` | Player captured by henchman flag |
| `global127` | `0`, `1` | Player death flag |
| `global109` | `0-5+` | Game progress counter (stage 4+ spawns henchman) |
| `global223` | `0`, `1` | Night time flag |
| `global105` | `16` | Special death state (set during fatal fall) |
### Control Areas
- `$0040` - Exit zone to room 92 (west)
- `$0020` - Exit zone to room 88 (up)
- `$0004` - Stair hazard zone (triggers falling script)
- `$0002` - Upper area check (determines if player should be on stairs)
### Entry Points
- Entering from room 92: Player spawns at position (73, 137) with view 4, observes stair blocks
- Entering from room 88: Player spawns at position (195, 25) with view 4, high priority, observes stair blocks
### Synonyms
- `goon` = `man` (henchman)
- `bird` = `crow` (raven)

View File

@@ -0,0 +1,64 @@
# Room 94: Unicorn Stable
This is the interior of Lolotte's stable where a magnificent wild unicorn is imprisoned. The room features two stable gates and contains the unicorn, which can be freed by opening the gate. When the unicorn is present, players can interact with it through various commands. Opening the gate while the unicorn is imprisoned triggers a cutscene where the unicorn escapes to freedom, rewarding the player with score points.
## Look Description
"You see two stable gates."
## Interactions
| Status | Behavior Type | Command | Response |
|--------|--------------|---------|----------|
| TODO | Look | `look gate` | "You see two stable gates." |
| TODO | Look | `look wall` | "You see nothing of importance on the walls." |
| TODO | Look | `look around` / `look room` / `look barn` | "You see two stable gates." |
| TODO | Look | `look around` / `look room` (with unicorn present) | "You see two stable gates." + "You have entered Lolotte's stable... and, it looks like an ordinary stable at that." |
| TODO | Action | `open gate` (already open) | "It's already open." |
| TODO | Action | `open gate` (not near gate) | "Rosella! You're standing in the way!" |
| TODO | Action | `open gate` (valid) | Opens gate, releases unicorn if present |
| TODO | Action | `close gate` (already closed) | "It's already closed." |
| TODO | Action | `close gate` (not near gate) | "Rosella! You're standing in the way!" |
| TODO | Action | `close gate` (valid) | Closes gate |
| TODO | Talk | `talk unicorn` / `talk horse` (no unicorn) | "The unicorn is not here." |
| TODO | Talk | `talk unicorn` / `talk horse` (unicorn present) | "The unicorn looks at you with sadness." |
| TODO | Talk | `converse unicorn` / `converse horse` (no unicorn) | "The unicorn is not here." |
| TODO | Talk | `converse unicorn` / `converse horse` (unicorn present) | "It needs to be free..." |
| TODO | Action | `kiss` (unicorn present) | "The unicorn rolls back its eyes. It obviously doesn't trust you any more." |
| TODO | Action | `kiss` (no unicorn) | "The unicorn doesn't want you to." |
| TODO | Action | `look unicorn` / `look horse` (no unicorn) | "The unicorn is not here." |
| TODO | Action | `look unicorn` / `look horse` (unicorn present) | "What unicorn?" + "The unicorn looks at you with sadness." |
| TODO | Action | `pat unicorn` / `pat horse` | "You reach out to pet the unicorn's nose, but it won't let you." |
| TODO | Action | `mount unicorn` / `mount horse` | "The unicorn doesn't trust you; it backs away." |
| TODO | Action | `get unicorn` / `capture unicorn` / `guide unicorn` | "You should free the unicorn." |
| TODO | Action | `free unicorn` / `help unicorn` | "The unicorn is not here." |
## Scripts
| Status | Behavior Type | Name | Trigger | Behavior |
|--------|--------------|------|---------|----------|
| TODO | Interaction | gateScript | Opening or closing the gate | Controls gate animation, stops updates when fully open, enables/disables block2 when unicorn is present |
| TODO | Background | uniStuff | Continuous when unicorn actor is in room | Animates unicorn, handles release sequence when gate opens with unicorn present, triggers cutscene where unicorn trots out to freedom |
## Technical Notes
- **Room Number**: 94
- **Picture**: 94
- **Style**: $0010 (slated)
- **Exits**: North→80 (when on control area $0040)
### State Variables
| Variable | Values | Description |
|----------|--------|-------------|
| `unicorn_state` | `99`, `999` | Tracks unicorn presence (99 = imprisoned, 999 = freed) |
| `room_visited` | `true`, `false` | Set to true when player enters (global101 = 1) |
| `gate_open` | `true`, `false` | Determined by newProp_2 cel value (0 = closed) |
### Additional Technical Details
- Two blocking areas (block1, block2) prevent player from walking through gate or walls
- Gate prop (newProp_2) has different loop for right gate
- Unicorn appears as actor (view 380) when global123 == 99
- When unicorn is released: player loses control, ego plays animation, score increases by 4, unicorn changes to view 386 and exits to room 150,230 (outside stable)
- global124 set to 27 when unicorn is freed (possibly flag for obtaining unicorn as companion)

Some files were not shown because too many files have changed in this diff Show More