Intermediate scope for inheritance ā like OpenLaszlo's
Intermediate scopes that provide inheritance without being navigable rooms.
Containers are directories that define shared properties for their children, without themselves being places you can "go to."
In OpenLaszlo (Don Hopkins' earlier work!), <node> was a fundamental building block:
<!-- OpenLaszlo: <node> provides inheritance without visual layout -->
<node name="mazeDefaults">
<attribute name="isDark" value="true"/>
<attribute name="hasDanger" value="true"/>
</node>
<view extends="mazeDefaults">
<!-- Inherits isDark, hasDanger -->
</view>
MOOLLM's CONTAINER.yml does the same for adventure directories:
# maze/CONTAINER.yml
container:
name: "The Twisty Maze"
inherits:
is_dark: true
is_dangerous: true
grue_rules:
can_appear: true
All rooms inside maze/ automatically inherit these properties!
| Type | File | Navigable? | Inherits to children? |
|---|---|---|---|
| Room | ROOM.yml |
ā Yes | ā No |
| Container | CONTAINER.yml |
ā No | ā Yes |
| Meta | .meta.yml |
ā No | ā No (just metadata) |
Use Container when:
Use Room when:
Use .meta.yml when:
Properties in inherits: flow to ALL descendants:
maze/
āāā CONTAINER.yml # inherits: { is_dark: true }
āāā room-a/
ā āāā ROOM.yml # Inherits is_dark: true
āāā room-b/
ā āāā ROOM.yml # Inherits is_dark: true
āāā deep/
āāā CONTAINER.yml # Can add MORE inherits
āāā room-c/
āāā ROOM.yml # Inherits from BOTH containers!
Children can override inherited values:
# maze/room-f/ROOM.yml
room:
name: "The Treasure Chamber"
is_dark: false # Override! This room has magical light
For objects and arrays, inheritance MERGES:
# maze/CONTAINER.yml
container:
inherits:
rules:
- "Grues patrol in darkness"
# maze/room-g/ROOM.yml
room:
rules:
- "This room has a pit trap" # ADDS to inherited rules
Result: room-g has BOTH rules.
| Field | Purpose |
|---|---|
inherits |
Properties that children GET automatically |
defaults |
Values to use IF a child doesn't define them |
container:
# Every child room IS dark (forced)
inherits:
is_dark: true
# If a room doesn't define atmosphere, use this
defaults:
room:
atmosphere: "damp and musty"
# maze/CONTAINER.yml
container:
name: "The Twisty Maze"
description: "Passages all alike... or are they?"
inherits:
is_dark: true
is_dangerous: true
grue_rules:
can_appear: true
safe_with_light: true
rules:
- "No teleportation"
- "Breadcrumbs disappear after 3 turns"
- "Echoes alert nearby rooms"
ambient:
sound: "dripping water"
smell: "wet stone"
temperature: cold
# characters/animals/CONTAINER.yml
container:
name: "Animal Characters"
description: "Non-human beings with souls"
inherits:
type: animal
has_instincts: true
defaults:
character:
can_speak_human: false
pet_able: true
diet: omnivore
# kitchen/appliances/CONTAINER.yml
container:
name: "Kitchen Appliances"
inherits:
type: appliance
requires_power: true
defaults:
object:
breakable: true
fixable_with: "wrench"
When looking up a property:
CONTAINER.yml in parent dirADVENTURE.yml defaultsmaze/deep/room-c/ROOM.yml
ā inherits from
maze/deep/CONTAINER.yml
ā inherits from
maze/CONTAINER.yml
ā inherits from
ADVENTURE.yml (if it has defaults)
ā inherits from
skills/room/ROOM.yml.tmpl
The linter recognizes CONTAINER.yml:
š Phase 1: Discovery
Found: 36 rooms, 54 objects, 6 characters
Found: 2 containers # NEW!
Containers suppress the "missing type declaration" warning:
# Before: maze/ triggers warning
ā ļø Directory has room children but no ROOM.yml
# After: maze/CONTAINER.yml exists
ā
maze/ is a container (not a room)
<node> element as non-visual scope