Suppose we want to let the player build a fishing pole out of three parts: a hook, a string, and a stick.
There are several things we must account for here. One is that our combination verb should be insensitive to ordering: it shouldn't matter whether the player types COMBINE STICK WITH STRING or COMBINE STRING WITH STICK.
Second, we need to make sure that our implementation handles intervening stages of assembly gracefully. The player should be able to combine string and hook first, or string and stick first, and be able to complete the assembly in either case.
Our implementation here uses a table of lists to determine which combinations of inputs should produce which result object. Because we sort our lists before comparing them, we guarantee that the player's ordering doesn't matter: COMBINE STICK WITH STRING will have the same effect as COMBINE STRING WITH STICK.
What's more, our implementation could be expanded to account for many other assemblages, if we wanted object-building to be a running theme of puzzles in our game.
"What Makes You Tick"
Understand "combine [something] with [something]" as combining it with. Combining it with is an action applying to two carried things. Understand the command "connect" as "combine".
Understand the command "attach" as something new. Understand "attach [something] to [something]" as combining it with.
The combining it with action has an object called the item built.
Setting action variables for combining something with something:
let X be a list of objects;
add the noun to X;
add the second noun to X;
sort X;
repeat through the Table of Outcome Objects:
let Y be the component list entry;
sort Y;
if X is Y:
now the item built is the result entry.
Check combining it with:
if the item built is nothing or the item built is not in limbo,
say "You can't combine [the noun] and [the second noun] into anything useful." instead.
Carry out combining it with:
move the item built to the holder of the noun;
now the noun is nowhere;
now the second noun is nowhere.
Report combining it with:
say "You now have [an item built]."
Limbo is a container. Limbo contains a hookless fishing pole, a hooked line, and a complete fishing pole.
Streamside is a room. The player carries a stick, a wire hook, and a string.
Table of Outcome Objects
component list
|
result
|
{stick, string}
|
hookless fishing pole
|
{wire hook, string}
|
hooked line
|
{hooked line, stick}
|
complete fishing pole
|
{hookless fishing pole, wire hook}
|
complete fishing pole
|
Test me with "combine stick with string / i / combine pole with hook / i".
This kind of implementation makes sense if we don't intend the player to take the fishing pole apart again, or to refer to any of its component parts once it is built. For an alternate approach that does allow assembled objects to be taken apart again, see "Some Assembly Required".
Suppose we have an item that produces an interesting result the first time the player lifts it -- a rock with dangerous ants revealed underneath. The effect of the surprise is a little weakened, though, if the player sees that response as the result of a TAKE ALL, when it might be printed like this:
>[3] get all
tent peg: Taken.
water flask: Taken.
trading permit: Taken.
innocent-looking rock: You reach for the rock and turn it over to reveal a thriving colony of flesh-eating ants. Needless to say, you drop the rock and jump back with a decidedly effeminate scream. They can probably hear you all the way back in the base camp.
rusty nail: Taken.
[Your score has just gone down by two points.]
The calm response to "rusty nail" looks odd now, and the score change is disconnected from the event that caused it.
To manage this, we might institute a system so that interesting objects are handled last in their list, like so:
"Formicidae"
Use scoring.
Section 1 - Procedure
The magic rule is listed before the generate action rule in the turn sequence rules.
A thing has a number called dramatic potential.
This is the magic rule:
let L be the multiple object list;
if the number of entries in L is greater than 1:
sort L in dramatic potential order;
alter the multiple object list to L.
Section 2 - Scenario
The Foothills is a room. "The land has become hilly; though the soil is still mostly coarse yellow sand, clumps of grass are able to grow in the shadier places. Deep wagon ruts running from the southwest towards the mountains in the northeast show where generations of caravans have already passed."
The water flask, the tent peg, and the trading permit are things in Foothills.
The rock is a thing in Foothills. Before printing the name of the rock when the rock is not handled: say "innocent-looking ". The dramatic potential of the rock is 10.
The rusty nail is a thing in Foothills.
The ant colony is a fixed in place thing. "A busy group of ants are crawling to and fro in the unaccustomed sun." Rule for deciding whether all includes the ant colony while taking: it does not.
Instead of taking the rock when the rock is handled:
say "It might still have a stray ant or two on it."
After taking the rock:
now the rock is handled;
move ant colony to the location;
move the rock to the location;
say "You reach for the rock and turn it over to reveal a thriving colony of flesh-eating ants. Needless to say, you drop the rock and jump back with a decidedly effeminate scream. They can probably hear you all the way back in the base camp.";
decrease score by 2.
Test me with "get peg / drop peg / get all / get rock".
Note that while one could also manipulate the object list to add or remove items at this stage, there's a simpler way to control what Inform considers "ALL" to mean in commands: see the activity "Deciding whether all includes" in the activities chapter.