Inform 7 Home Page / Documentation
§13.7. Relations in groups
Finally, there is a kind of relation which binds even more strongly.
This is a kind of relation which divides people up: we might wish to have all the Icelandic people related to each other, all the Peruvians to each other, and so on. If there were a Pacific island called Informia with one inhabitant, then that person would be related only to himself. As time goes by, we could imagine people emigrating, and so on, so that these groupings would switch: perhaps everyone would leave Belgium and, for a while, there would be no Belgian nationals at all.
The testing command RELATIONS prints out the current state of all the relations created in the source code. For instance:
>relations
Overlooking relates various rooms to various rooms:
The Pub >=> the Garden
The Garden >=> the Shrubbery
The Shrubbery >=> the Sundial Plot
Friendship relates people to each other:
Mr Wickham <=> Sophie
Charlotte <=> Sophie
Marriage relates one person to another:
Mr Wickham == Sophie
That can produce a lot of output. To see only a single relation, or to see it at some intermediate point in a calculation, there's also a testing phrase:
show relation (relation of values to values)
This phrase is for testing purposes only. It shows the current state of the named relation, that is, it shows which values relate to which other ones, where it's possible to do this in any sensible way.
But this is a phrase - not a typed command.
Start of Chapter 13: Relations | |
Back to §13.6. Making reciprocal relations | |
Onward to §13.8. The built-in verbs and their meanings |
ExampleTransmutations |
Suppose we want to have a machine in our game that can transmute one item into another, similar object with different properties: a bag of jelly beans into a bag of jewels, for instance. Thus each item will be associated with some number of equivalents -- the other objects it can turn into. This is a handy use for group relations:
Transmutation relates things to each other in groups. The verb to become means the transmutation relation.
Definition: a thing is transmutable if it becomes more than one thing. [* It always becomes itself.]
A thing can be valuable. Something valuable called a bag of jewels is carried by the player. It becomes the bag of gunpowder and the bag of jelly beans.
A thing can be dangerous. The bag of gunpowder is a dangerous thing.
The can't insert into what's not a container rule does nothing when inserting something into the machine.
Check inserting something which is not transmutable into the machine:
instead say "You can't transmute that."
To decide which thing is new form of (obj - edible thing): decide on a random valuable thing which becomes obj.
To decide which thing is new form of (obj - dangerous thing): decide on a random edible thing which becomes obj.
To decide which thing is new form of (obj - valuable thing): decide on a random dangerous thing which becomes obj.
Carry out inserting something into the machine:
now the noun is nowhere;
now the player carries the new form of the noun.
Report inserting something edible into the machine:
say "The machine clicks, whirrs, and spits out [a new form of the noun]. You're rich!";
rule succeeds.
Report inserting something dangerous into the machine:
say "The machine clicks, whirrs, and in a shower of flavor crystals, spits out [a new form of the noun].";
rule succeeds.
Report inserting something valuable into the machine:
say "The machine clicks, whirrs, and with a violent roar, spits out [a new form of the noun].";
rule succeeds.
Test me with "i / put jewels in machine / i / put gunpowder in machine / i / put beans in machine".
In this example we have only defined a single set of transmutable objects, but we could easily expand to include other groups.
(Thanks to Jesse McGrew for proposing this example.)
ExampleOtranto |
The range of things one might want to do with a rope in a work of interactive fiction is fairly overwhelming. One might, in theory, swing from ropes; use them to tie containers shut; cut them up into smaller ropes; tie them together into longer ropes; employ them as fuses; bind other characters with them, or the player character.
Our rope implementation is, by these lights, reasonably simple, but it does account for the possibility of tying and untying both ends; using ropes to descend into lower rooms; pulling objects tied to the far end of the rope; and dragging objects from place to place.
We start by coming up with a rope.
Definition: a thing is nonrope if it is not a rope. [The perfect idiocy of this statement notwithstanding, having a shortcut will come in very handy later]
Attachment relates things to each other in groups. The verb to be stuck to means the attachment relation.
Definition: a thing is tied if the number of things stuck to it is greater than 1.
Definition: a rope is free if the number of nonrope things stuck to it is less than 2.
Definition: a thing is hindering if it is stuck to the noun and it is not within the location.
A thing can be round or unevenly shaped. A thing is usually round.
Definition: something is anchored if it is fixed in place or it is scenery or it is part of an anchored thing.
Definition: something is draggable if it is not had by the player and it is not the player and it is not anchored.
Now, we want a rope to be described in terms of the way it is tied, when it's described in a room description.
Rule for writing a paragraph about a rope (called the coil):
if the coil is stuck to something which is in a room (called the next room) which is not the location:
let the way be the best route from the location to the next room;
if the way is up or the way is down:
say "[The coil] runs [way] into [the next room].";
otherwise:
say "[The coil] snakes across the floor [way] towards [the next room].";
otherwise:
say "There is [a coil] here[if the coil is stuck to a visible nonrope thing], tied to [the list of nonrope visible things which are stuck to the coil][end if]."
To decide what room is the home of (item - a thing):
if item is a door:
let front cut be the number of moves from the location to the front side of the item;
let back cut be the number of moves from the location to the back side of the item;
if front cut is -1, let front cut be 999;
if back cut is -1, let back cut be 999;
if the location encloses the item, decide on the location;
if front cut is greater than back cut, decide on the back side of the item;
decide on the front side of the item;
decide on the location of the item.
Rule for writing a paragraph about a nonrope thing (called the anchor) which is stuck to a rope (called the coil):
if the coil is in an adjacent room:
let the next room be the home of the coil;
let the way be the best route from the location to the next room;
if the way is up or the way is down:
say "[The coil] runs [way] from [the anchor] into [the next room].";
otherwise:
say "From [the anchor] runs [a coil], heading off toward [the way].";
otherwise:
if the coil is stuck to something which is not visible,
say "[The coil] is tied to [the anchor][if the coil is stuck to something in an adjacent room (called the next room)], and from there runs off towards [the next room][end if]."
We need a way to account for it when it's being carried, as well.
After printing the name of a rope (called the tied object) while taking inventory:
if something nonrope is stuck to the tied object:
say " (attached to [the list of nonrope things which are stuck to the tied object])";
otherwise:
say " (with both ends free)".
And, indeed, whenever the player examines a rope, we should see what's connected.
Instead of examining a rope (called the cord) when something is stuck to the cord:
say "[The noun] is tied to [the list of secondary things which are stuck to the noun]."
Similarly, any time the player looks at something tied to a rope.
After examining the player when the player is stuck to something which is not the player:
say "You're currently lashed to [the list of secondary things stuck to the noun]."
After examining something which is stuck to something secondary:
say "[The noun] is currently attached to [the list of secondary things stuck to the noun]."
We also need to make sure that the rope can be interacted with properly even when it's partly in the next room.
After deciding the scope of the player:
if something stuck to a rope (called the coil) is in the location, place the coil in scope.
A reaching inside rule:
if the noun is a rope:
let the anchor be a random visible thing stuck to the noun;
if the anchor is not the noun:
if the anchor is touchable, allow access.
Now tying:
Before tying something to a rope:
if the noun is stuck to the second noun, say "[The noun] and [the second noun] are already tied together." instead;
if the second noun is not free, say "[The second noun] has no ends free." instead;
if the noun is round, say "You can't realistically tie anything to [the noun]." instead.
Instead of tying a rope to something:
try tying the second noun to the noun.
Instead of tying something to a rope:
now the noun is stuck to the second noun;
say "You loop [the second noun] around [the noun] and knot firmly."
Instead of tying something to a nonrope tied thing:
let the coil be a random rope stuck to the second noun;
try tying the noun to the coil.
Instead of tying a nonrope tied thing to something:
let the coil be a random rope stuck to the noun;
try tying the second noun to the coil.
Instead of tying a free nonrope thing to a free nonrope thing:
if the player carries a free rope (called the coil):
try tying the noun to the coil;
if the noun is stuck to the coil and the coil is free:
try tying the second noun to the coil;
otherwise:
say "You lack the requisite spare rope."
Understand "untie [something] from [something]" as untying it from. Understand "untie [something]" as untying it from.
Rule for supplying a missing second noun while untying something from:
if the number of secondary things stuck to the noun is 0, say "[The noun] is already entirely free." instead;
if the noun is a rope:
if the number of touchable nonrope things which are stuck to the noun > 1:
say "You'll have to say which thing you want to untie [the noun] from.";
rule fails;
otherwise:
if the number of touchable nonrope things stuck to the noun is 0, say "You can't reach [the random nonrope thing stuck to the noun]." instead;
let the tied object be a random touchable nonrope thing which is stuck to the noun;
say "(from [the tied object])[line break]";
now the second noun is the tied object;
otherwise:
if the noun is stuck to a rope (called the tied object):
say "(from [the tied object])[line break]";
now the second noun is the tied object.
Before untying a rope from something: try untying the second noun from the noun instead.
Before untying something from a rope:
if the second noun is not held:
say "(first picking up [the second noun])[line break]";
try taking the second noun.
Check untying it from:
unless the noun is stuck to the second noun or the second noun is stuck to the noun,
say "[The noun] and [the second noun] are already not tied together." instead.
Carry out untying it from:
now the noun is not stuck to the second noun.
Another part of the fun of a rope is that you can drag things from another room:
Before pulling something anchored: say "[The noun] is firmly anchored." instead.
Instead of pulling something tied:
if the noun is unmentioned:
say "The impulse is transmitted to [the list of pullable things stuck to the noun].";
repeat with item running through pullable things stuck to the noun:
say "[item]: [run paragraph on]";
try pulling the item;
if the noun is a rope and the noun is not within the location:
if the number of nonrope hindering things is 0, move the noun to the location;
otherwise:
continue the action.
Before pulling something which is not visible:
if the noun is anchored:
say "[The noun] resists, for whatever reason." instead;
otherwise:
let space be the holder of the noun;
let way be the best route from the space to the location;
if the way is a direction:
move the noun to the location;
say "[The noun] [if the way is up]rises[otherwise]slides[end if] into view." instead;
otherwise:
move the noun to the location;
say "[The noun] slides into view." instead.
Definition: a thing is secondary if it is not the noun. Definition: a thing is pullable if it is not the noun and it is not the player.
A player who is tied to things should also have some restrictions on his ability to move.
Before going a direction (called the way) when the player has something (called the link) which is stuck to something anchored (called the anchor):
let the next room be the home of the anchor;
if the next room is not a room, continue the action;
if the next room is the location:
if the link is stuck to at least two anchored things,
say "You can't go far while you're carrying [the link] tied to [the list of anchored things stuck to the link]." instead;
otherwise:
let the safe way be the best route from the location to the next room;
if the safe way is the way:
if the player is not stuck to the anchor, say "(coiling up your rope again as you go...)";
otherwise:
if the safe way is a direction,
say "While you have [the link] you can't really head any direction but [best route from the location to the next room]." instead;
otherwise say "You're tied up here." instead.
Before going a direction (called the way) when the player is stuck to something anchored (called the anchor):
let the next room be the home of the anchor;
if the next room is not a room, continue the action;
if the next room is the location:
if the player is stuck to at least two anchored things,
say "You can't go far while you're tied to [the list of anchored things stuck to the player]." instead;
otherwise:
if the best route from the location to the next room is the way:
say "(coiling up your rope again as you go...)";
otherwise:
say "Your attachments prevent you going any way but [best route from the location to the next room]." instead.
Sometimes, if the player is tied to a movable object, the moved object will move with him.
After going somewhere when the player has something (called the link) which is stuck to something draggable:
if the player is not stuck to the link:
say "You drag along behind you [the list of draggable things which are stuck to the link].";
now every draggable thing which is stuck to the link is in the location;
continue the action.
Report going somewhere when the player is stuck to something draggable:
say "You drag along behind you [the list of draggable things which are stuck to the player].";
now every draggable thing which is stuck to the player is in the location.
And now the actual game and puzzles.
The Fallow Field is a room. "The very land is gloomy, the earth plowed into untended rows that yield no fruit, shadowed by the castle to the north. A chasm, no doubt the product of some upheaval of the earth, opens before your feet.". An oak stump is fixed in place in the Field. "From an oak stump, a few hopeful shoots grow." A hempen rope is a rope in the field. It is stuck to the oak stump and the wooden chest. The stump is unevenly shaped.
The Chasm is below the Field. "Your person is most uncomfortably pressed on every side by the closeness of the walls; to which you may add as a further inconvenience, that the irregularity of the floor making it difficult to walk upright." An iron key is in the Chasm. "An iron key nestles in the cleft of earth, its age indicated by its implausibly great size."
The wooden chest is a unevenly shaped closed openable container in the Chasm. The description of the wooden chest is "A handsome, solid case not long committed to its dank enclosure, or it would long since have rotted." Rule for printing the name of the wooden chest when the chest is not handled: say "deadweight". Understand "dead" or "weight" or "deadweight" as the chest. Before pulling the wooden chest: now the chest is handled.
In the chest is a heavy dagger. The description of the dagger is "Set with red jewels and of a wicked aspect."
Before going down from the Field when the player is not stuck to something anchored:
say "You don't quite dare simply leap into the darkness without some anchor." instead.
Before going down from the Field:
let anchor be a random anchored thing which is stuck to the player;
say "You lower yourself gingerly, hoping that [the anchor] holds your weight..."
Before going up from the Chasm:
if the player cannot touch a rope which is stuck to an anchored thing which is in the Field, say "And how, precisely, do you mean to do that?" instead.
The Castle Hall is north of the Field. "All is desolate: the great hall has no roof, nor is there any glass in the windows. A staircase without banister ascends inside the wall to a musician's gallery without song."
The Musician's Gallery is above the Castle Hall. "Of its former cheery aspect only this remains to the Gallery: that chevrons of red and yellow are painted on the wall. But as these are streaked with rain and grime, the banister pulled away, the roof open to the sky, and the corners made a nesting place for birds, the consolation thereby afforded is but slight."
The pointed door is north of the Musician's Gallery and south of the Sinister Attic. It is a closed locked openable door. "A pointed door of particularly grim and uninviting aspect leads north." The pointed door is lockable and unevenly shaped. The description of the pointed door is "A door coming to a gothic point and fitted with iron fittings of great strength. The handle looks particularly well-attached." The iron key unlocks the pointed door.
A rule for reaching inside the Musician's Gallery:
allow access.
A rule for reaching inside the Sinister Attic:
allow access.
Instead of opening the pointed door for the first time:
say "When you rattle at the door, there arises from beyond a terrible shrill noise as though something beyond exults in its imminent release."
After opening the trapped pointed door when the player can see the pointed door:
say "Thousands of bats fly from the pointed door, attacking you!";
end the story.
After opening the pointed door when the player cannot see the pointed door: now the pointed door is untrapped; continue the action.
The pointed door can be trapped or untrapped. The pointed door is trapped.
Before pulling the pointed door: try opening the pointed door instead.
After going to the sinister attic:
say "You have arrived at the goal of your quest!";
end the story finally.
Test me with "x rope / pull rope / get chest / untie rope from chest / tie rope to me / down / get key / up / untie rope from stump / north / up / unlock pointed door with key / open it / tie rope to door / down / pull rope / up / north".
Test death with "x rope / pull rope / get chest / untie rope from chest / tie rope to me / down / get key / up / untie rope from stump / north / up / unlock pointed door with key / open it / g"