§7.15. Goal-Seeking Characters
Goal-seeking characters are the most advanced IF life-form: they want to achieve specific outcomes, and they are able to work out plans of approach in order to bring these things about. They walk to rooms, open containers to search for things, use keys and tools, and ask leading questions in conversation.
A really advanced implementation of goal-seeking behavior is beyond the scope of our examples (though extensions exist that treat the problem more thoroughly). We can accomplish a surprising amount without heavy customization, though, if we keep in mind three points of technique:
First: it helps to think abstractly and to create broadly-defined actions as a first step to more specific tasks. For instance, a character's goal might be to eat some dinner. He'd be equally satisfied with spaghetti carbonara or with braised lamb shanks, but he needs to figure out which is available. So we might have our every turn rule (or whatever we're using to activate the character) say something like
Every turn when Clark is hungry:
try Clark dining.
Dining would then be an action we've defined specially, which looks around Clark's environment for suitable food; if it finds food, it issues a
try Clark eating the suitable food;
command; but if not, it sends Clark off to look for something likely. The Man of Steel demonstrates the use of this.
Second: though it doesn't actually contribute to the goal-seeking per se, lively reporting brings characters' generated behavior to life.
Clark eats a donut.
doesn't characterize Clark very much, even though the eating may be part of a subtle, intelligent plan to seduce Lois Lane. We'll do better if we replace a lot of the character reporting rules: to that end, see the example The Man of Steel Excuses Himself.
Third: goal-seeking characters notice when something is in the way of the action they want to perform. When that happens, they form a plan about how to remove the obstacle. We've already seen this kind of implementation on the player's behalf: the player will pick up items before eating them, say. We can use Before rules to do similar things for other characters, as in
Before Clark eating the wrapped candy:
try Clark unwrapping the candy;
if the candy is wrapped, stop the action.
Here we've set things up so that if Clark tries to eat the wrapped candy, he'll be interrupted by this other command; and if his unwrapping-the-candy attempt fails, he won't go on and eat the thing. IQ Test demonstrates a character who shows this kind of planning intelligence.
Because before-rules chain neatly, we can trigger whole plans of behavior if we have a sensible set, as in
Before someone entering a closed container: try the person asked opening the noun.
Before someone opening a locked container: try the person asked unlocking the noun.
Before someone unlocking a locked container: ...
We must exercise a little bit of care if it is possible for the chain of actions to produce an endless loop - e.g., the character trying to take a key that is inside the transparent, locked box that it opens might repeatedly try to open the box, first unlocking the box, first taking the key, first opening the box, ... Boston Cream is a fully-worked scenario that deals with such a set of conundra.
See Traveling Characters for characters who plan routes to locations and travel towards them
See Event Scheduling for characters who follow a pre-written schedule of activities
See Plot Management for having a central function direct all the characters in order to further the plot
| ExampleIQ Test Introducing Ogg, a person who will unlock and open a container when the player tells him to get something inside.
|
|
|  ExampleThe Man of Steel An escaping action which means "go to any room you can reach from here", and is only useful to non-player characters.
|
|
"Boston Cream"
Use scoring.
The Donut Shop is a room. "Vibrantly decorated in donut colors: pink, brown, and cream."
Ogg is a man in the Donut Shop. "Ogg is slumped in the corner[if Ogg carries something] with [a list of things carried by Ogg][end if]. He wears a nametag which says 'HELLO MY NAME IS OG.'" Understand "og" as Ogg. Ogg wears a nametag. The description of the nametag is "Very neatly written."
The Donut Shop contains a transparent closed openable locked lockable enterable container called a case. The case is fixed in place. The case contains some cake donuts, some jelly donuts, and some apple fritters. "The [if unopenable]damaged[otherwise]gleaming[end if] donut case [if something is in the case]contains [a list of things in the case][otherwise]has been stripped of its contents[end if]." The cake donuts, the jelly donuts, and the apple fritters are edible.
The matching key of the case is a silver key. The silver key is in a mesh basket. The mesh basket is closed, transparent, and openable. It is in the Donut Shop.
Before someone taking something which is carried by the player:
if the person asked cannot touch the player:
say "Ogg looks with a fixed frown at [the noun].";
continue the action;
say "[The person asked] comes up and shakes your arm until you drop [the noun].";
say line break;
silently try dropping the noun;
stop the action.
Before someone unlocking a locked thing with something which is not carried by the person asked:
try the person asked taking the second noun;
stop the action.
Before someone opening a locked thing (called the sealed chest):
if the person asked can see the matching key of the sealed chest:
if the matching key of the sealed chest is enclosed by the sealed chest:
say "Seeing the paradoxical location of [the matching key of the sealed chest], [the person asked] gives a howl of rage.";
increment the score;
end the story finally saying "You have thwarted Ogg";
otherwise:
try the person asked unlocking the sealed chest with the matching key of the sealed chest;
stop the action.
Before someone taking something which is in a closed container (called the shut chest):
try the person asked opening the shut chest;
stop the action.
Ogg has a number called hunger. The hunger of Ogg is 0.
Every turn:
increment the hunger of Ogg;
if the hunger of Ogg is 2 and Ogg is visible, say "Ogg's stomach growls.";
if the hunger of Ogg is 3 and Ogg is visible:
if Ogg can see an edible thing (called the target):
say "Ogg eyes [the target] with obvious intent.";
otherwise:
say "Ogg glances at you in a disturbingly shifty way.";
if the hunger of Ogg is greater than 3:
if Ogg carries an edible thing (called the target):
try Ogg eating the target;
otherwise:
let new target be a random edible thing which can be seen by Ogg;
if the new target is a thing:
try Ogg taking the new target;
otherwise:
if Ogg can touch the player, end the story saying "Ogg is gnawing your ankle";
otherwise try Ogg taking the player.
The crumbs are a thing. "Crumbs of [the list of edible things which cannot be seen by the player] lie scattered over the whole floor."
Instead of asking Ogg to try doing something when Ogg cannot touch the player:
say "Ogg tilts his head and shrugs, unable to hear your instruction clearly."
Instead of asking Ogg to try eating something:
say "It's not as though Ogg really needs any encouragement in that department, is it?"
Definition: Ogg is hungry if the hunger of Ogg is greater than 2.
Persuasion rule for asking Ogg to try doing something: if Ogg is hungry, persuasion fails; persuasion succeeds.
Persuasion rule for asking Ogg to try giving something edible to the player:
persuasion fails.
Unsuccessful attempt by Ogg doing something:
if the reason the action failed is a failing listed in the Table of Ogg Retorts:
say "[reply entry][paragraph break]";
otherwise:
say "Ogg looks adorably confused."
Table of Ogg Retorts
failing | reply |
can't take people's possessions rule | "'Ogg too polite.'" |
can't take other people rule | "'Ogg not that greedy.'" |
can't take scenery rule | "'[The noun] very very heavy.'" |
can't take what's fixed in place rule | "'[The noun] very heavy." |
can't drop what's not held rule | "'Hunh?'" |
Carry out Ogg eating an edible thing:
move the crumbs to the holder of Ogg;
now the hunger of Ogg is 0.
Report Ogg unlocking something with something:
say "Ogg struggles a bit with [the second noun] in the lock of [the noun], but does eventually succeed. 'Hunh!' says Ogg.";
stop the action.
Carry out Ogg opening the case when the case has been open:
now the case is unopenable.
Instead of closing the unopenable case:
say "The glass panels are no longer properly seated in their tracks, and the case cannot be closed ever again."
Report Ogg opening the unopenable case:
say "Ogg forces [the case] so hard that it does break.";
stop the action.
Report Ogg opening the case:
say "Ogg yanks [the noun] open with such force that you fear for its structural integrity.";
stop the action.
Report Ogg taking something edible:
say "Ogg acquires [the noun] with a look of tender affection.";
stop the action.
Report Ogg eating something:
say "Ogg chows down on [the noun], scattering crumbs in all directions.";
stop the action.
Report Ogg eating something when the number of visible edible things is 1:
say "Ogg eats [the noun] in his trademark style. You can no longer bear to watch.";
stop the action.
After entering the case:
say "You climb inside the case, folding yourself up uncomfortably."
After locking the case with something when the player is in the case:
say "You turn the key firmly in the lock -- amazing it locks from within, but it does -- and settle yourself for a long wait, hoping this thing is not air-tight."
The maximum score is 1.
Test me with "open mesh / get key / unlock case / open case / enter case / close case / lock case / wait / wait".
|    ExampleBoston Cream A fuller implementation of Ogg, giving him a motivation of his own and allowing him to react to the situation created by the player.
|
"Boston Cream"
Use scoring.
The Donut Shop is a room. "Vibrantly decorated in donut colors: pink, brown, and cream."
Ogg is a man in the Donut Shop. "Ogg is slumped in the corner[if Ogg carries something] with [a list of things carried by Ogg][end if]. He wears a nametag which says 'HELLO MY NAME IS OG.'" Understand "og" as Ogg. Ogg wears a nametag. The description of the nametag is "Very neatly written."
The Donut Shop contains a transparent closed openable locked lockable enterable container called a case. The case is fixed in place. The case contains some cake donuts, some jelly donuts, and some apple fritters. "The [if unopenable]damaged[otherwise]gleaming[end if] donut case [if something is in the case]contains [a list of things in the case][otherwise]has been stripped of its contents[end if]." The cake donuts, the jelly donuts, and the apple fritters are edible.
The matching key of the case is a silver key. The silver key is in a mesh basket. The mesh basket is closed, transparent, and openable. It is in the Donut Shop.
Before someone taking something which is carried by the player:
if the person asked cannot touch the player:
say "Ogg looks with a fixed frown at [the noun].";
continue the action;
say "[The person asked] comes up and shakes your arm until you drop [the noun].";
say line break;
silently try dropping the noun;
stop the action.
Before someone unlocking a locked thing with something which is not carried by the person asked:
try the person asked taking the second noun;
stop the action.
Before someone opening a locked thing (called the sealed chest):
if the person asked can see the matching key of the sealed chest:
if the matching key of the sealed chest is enclosed by the sealed chest:
say "Seeing the paradoxical location of [the matching key of the sealed chest], [the person asked] gives a howl of rage.";
increment the score;
end the story finally saying "You have thwarted Ogg";
otherwise:
try the person asked unlocking the sealed chest with the matching key of the sealed chest;
stop the action.
Before someone taking something which is in a closed container (called the shut chest):
try the person asked opening the shut chest;
stop the action.
Ogg has a number called hunger. The hunger of Ogg is 0.
Every turn:
increment the hunger of Ogg;
if the hunger of Ogg is 2 and Ogg is visible, say "Ogg's stomach growls.";
if the hunger of Ogg is 3 and Ogg is visible:
if Ogg can see an edible thing (called the target):
say "Ogg eyes [the target] with obvious intent.";
otherwise:
say "Ogg glances at you in a disturbingly shifty way.";
if the hunger of Ogg is greater than 3:
if Ogg carries an edible thing (called the target):
try Ogg eating the target;
otherwise:
let new target be a random edible thing which can be seen by Ogg;
if the new target is a thing:
try Ogg taking the new target;
otherwise:
if Ogg can touch the player, end the story saying "Ogg is gnawing your ankle";
otherwise try Ogg taking the player.
The crumbs are a thing. "Crumbs of [the list of edible things which cannot be seen by the player] lie scattered over the whole floor."
Instead of asking Ogg to try doing something when Ogg cannot touch the player:
say "Ogg tilts his head and shrugs, unable to hear your instruction clearly."
Instead of asking Ogg to try eating something:
say "It's not as though Ogg really needs any encouragement in that department, is it?"
Definition: Ogg is hungry if the hunger of Ogg is greater than 2.
Persuasion rule for asking Ogg to try doing something: if Ogg is hungry, persuasion fails; persuasion succeeds.
Persuasion rule for asking Ogg to try giving something edible to the player:
persuasion fails.
Unsuccessful attempt by Ogg doing something:
if the reason the action failed is a failing listed in the Table of Ogg Retorts:
say "[reply entry][paragraph break]";
otherwise:
say "Ogg looks adorably confused."
Table of Ogg Retorts
failing | reply |
can't take people's possessions rule | "'Ogg too polite.'" |
can't take other people rule | "'Ogg not that greedy.'" |
can't take scenery rule | "'[The noun] very very heavy.'" |
can't take what's fixed in place rule | "'[The noun] very heavy." |
can't drop what's not held rule | "'Hunh?'" |
Carry out Ogg eating an edible thing:
move the crumbs to the holder of Ogg;
now the hunger of Ogg is 0.
Report Ogg unlocking something with something:
say "Ogg struggles a bit with [the second noun] in the lock of [the noun], but does eventually succeed. 'Hunh!' says Ogg.";
stop the action.
Carry out Ogg opening the case when the case has been open:
now the case is unopenable.
Instead of closing the unopenable case:
say "The glass panels are no longer properly seated in their tracks, and the case cannot be closed ever again."
Report Ogg opening the unopenable case:
say "Ogg forces [the case] so hard that it does break.";
stop the action.
Report Ogg opening the case:
say "Ogg yanks [the noun] open with such force that you fear for its structural integrity.";
stop the action.
Report Ogg taking something edible:
say "Ogg acquires [the noun] with a look of tender affection.";
stop the action.
Report Ogg eating something:
say "Ogg chows down on [the noun], scattering crumbs in all directions.";
stop the action.
Report Ogg eating something when the number of visible edible things is 1:
say "Ogg eats [the noun] in his trademark style. You can no longer bear to watch.";
stop the action.
After entering the case:
say "You climb inside the case, folding yourself up uncomfortably."
After locking the case with something when the player is in the case:
say "You turn the key firmly in the lock -- amazing it locks from within, but it does -- and settle yourself for a long wait, hoping this thing is not air-tight."
The maximum score is 1.
Test me with "open mesh / get key / unlock case / open case / enter case / close case / lock case / wait / wait".
|