Add glossary references in the correct places.
[ibg.git] / chapters / 03.rst
1 ==============================
2  Heidi: our first Inform game
3 ==============================
4
5 .. epigraph::
6
7    | *E was an esquire, with pride on his brow;*
8    | *F was a farmer, and followed the plough.*
9
10 .. only:: html
11
12   .. image:: /images/picE.png
13      :align: left
14
15 .. raw:: latex
16
17     \dropcap{e}
18
19 ach of the three games in this guide is created step by step; you'll get
20 most benefit (especially to begin with) if you take an active part, typing
21 in the source code on your computer.  Our first game, described in this
22 chapter and the two which follow, tells this sentimental little story:
23
24     "Heidi lives in a tiny cottage deep in the forest.  One sunny day,
25     standing before the cottage, she hears the frenzied tweeting of baby
26     bird; its nest has fallen from the tall tree in the clearing!  Heidi
27     puts the bird into the nest, and then climbs the tree to place the nest
28     back on its branch."
29
30 It's a very simple tale, but even so we'll cover quite a lot of ground
31 before we have a finished Inform game.  We'll get there in stages, first
32 making a very rough approximation of the story, and then successively
33 refining the details until it's good enough for an initial attempt (there's
34 time later for more advanced stuff).
35
36 Creating a basic source file
37 ============================
38
39 The first task is to create an Inform source file template.  Every game
40 that we design will start out like this.  Follow these steps:
41
42 #. Create an ``Inform\Games\Heidi`` folder (maybe by copying ``Inform\Games\MyGame1``).
43
44    .. note::
45
46       In this guide, we use the PC convention of placing a backslash
47       between folder names.  On a Macintosh, use a regular slash:
48       ``Inform/Games/Heidi``.
49
50 #. In that folder, use your text editor to create this source file
51    ``Heidi.inf``:
52
53    .. code-block:: inform
54
55       !% -SD
56       !============================================================================
57       Constant Story "Heidi";
58       Constant Headline
59                   "^A simple Inform example
60                    ^by Roger Firth and Sonja Kesserich.^";
61
62       Include "Parser";
63       Include "VerbLib";
64
65       !============================================================================
66       ! The game objects
67
68       !============================================================================
69       ! Entry point routines
70
71       [ Initialise; ];
72
73       !============================================================================
74       ! Standard and extended grammar
75
76       Include "Grammar";
77
78       !============================================================================
79
80    Soon, we'll explain what this means.  For now, just type it all in,
81    paying particular attention to those seven semicolons, and ensuring that
82    the double quotes "..." always come in pairs.  The first line beginning
83    with "``!%``" is special, and we'll talk about it in a moment; the
84    remaining exclamation mark lines, on the other hand, are purely
85    decorative; they just make the file's structure a little easier to
86    understand.
87
88    Ensure the file is named ``Heidi.inf``, rather than ``Heidi.txt`` or
89    ``Heidi.inf.txt``.
90
91    Remember that, throughout this guide, we place the "``TYPE``" symbol
92    alongside pieces of code that we recommend you to type into your own
93    game files as you read through the examples (which, conversely, means
94    that you *don't* need to type the unmarked pieces of code).  You'll 
95    learn Inform more quickly by trying it for yourself, rather than just 
96    taking our word for how things work.
97
98    .. todo::
99
100       Again, revisit the TYPE symbol.  Maybe a standard indicator above
101       each snippet?
102
103 #. In the same folder, use your text editor to create the compilation
104    support file ``Heidi.bat`` (on a PC)::
105
106        ..\..\Lib\Base\Inform Heidi
107                    +include_path=.\,..\..\Lib\Base,..\..\Lib\Contrib | more
108
109        pause "at end of compilation"
110
111    or ``Heidi.command`` (on a Macintosh)::
112
113        cd ~/Inform/Games/Heidi/
114
115        ../../Lib/Base/inform30_macosx Heidi
116                        +include_path=./,../../Lib/Base,../../Lib/Contrib
117
118    Remember that there's just one space between "``Heidi``" and
119    "``+include_path``".
120
121    Type in the file from scratch, or copy and edit ``MyGame1.bat`` (or
122    ``MyGame1.command``).  At this point, you should have a ``Heidi`` folder
123    containing two files: ``Heidi.inf`` and either ``Heidi.bat`` or
124    ``Heidi.command``.
125
126 #. Compile the source file ``Heidi.inf``; refer back to "Inform on an IBM
127    PC (running Microsoft Windows)" on page 19 or "Inform on an Apple
128    Macintosh (running OS X)" on page 24 for guidance.  If the compilation
129    works, a story file ``Heidi.z5`` appears in the folder.  If the
130    compilation *doesn't* work, you've probably made a typing mistake; check
131    everything until you find it.
132
133 #. You can run the story file in your Inform interpreter; you should see
134    this (except that the Serial number will be different -- it's based on
135    the date):
136
137    .. code-block:: transcript
138
139       Heidi
140       A simple Inform example
141       by Roger Firth and Sonja Kesserich.
142       Release 1 / Serial number 040804 / Inform v6.30 Library 6/11 SD
143
144       Darkness
145       It is pitch dark, and you can't see a thing.
146
147       >
148
149 When you get that far, your template source file is correct.  Let's explain
150 what it contains.
151
152 Understanding the source file
153 =============================
154
155 Although we've got a certain amount of freedom of expression, source files
156 tend to conform to a standard overall structure: these lines at the start,
157 that material next, those pieces coming at the end, and so on.  What we're
158 doing here is mapping out a structure that suits us, giving ourselves a
159 clear framework onto which the elements of the game can be fitted.  Having
160 a clear (albeit sparse) map at the start will help us to keep things
161 organised as the game evolves.  We can infer several Inform rules just by
162 looking at the source file.
163
164 * If the *very first line* (or lines) of the source file begin with the
165   characters "``!%``", then the compiler treats what follows on those lines
166   as control instructions to itself rather than as part of the game's
167   source.  The instructions most commonly placed here are compiler
168   switches, a way of controlling detailed aspects of how the compiler
169   operates.  These particular switches, two of many, are turning on
170   :term:`Strict mode`, which makes the game less likely to misbehave when
171   being played, and :term:`Debug mode`, which provides some extra commands
172   which can be helpful when tracking down problems.
173
174   .. note::
175
176      Actually, the ``-S`` is redundant, since Strict mode is already on by
177      default.  We include it here as a reminder that (a) to turn Strict
178      mode *off*, you change this setting to ``-~S``, and (b) alphabetic
179      case matters here: ``-s`` causes a display of compiler statistics (and
180      ``-~s`` does nothing at all).
181
182 * Otherwise, when the compiler comes across an exclamation mark, it ignores
183   the rest of the line.  If the ``!`` is at the start of a line, the whole
184   line is ignored; if the ``!`` is halfway along a line, the compiler takes
185   note of the first half, and then ignores the exclamation mark and
186   everything after it on that line.  We call material following an
187   exclamation mark, not seen by anybody else, a :term:`comment`; it's often
188   a remark that we write to remind ourselves of how something works or why
189   we tackled a problem in a particular way.  There's nothing special about
190   those equals signs: they just produce clear lines across the page.
191
192   It's always a good idea to comment code as you write it, for later it
193   will help you to understand what was going on at a particular spot.
194   Although it all seems clear in your head when you first write it, in a
195   few months you may suspect that a totally alien mind must have produced
196   that senseless gibberish.
197
198   By the way, the compiler *doesn't* give special treatment to exclamation
199   marks in quoted text: ``!`` within quotes "..." is treated as a normal
200   character.  On this line, the first ``!`` is part of the sequence (or
201   :term:`string`) of characters to be displayed:
202
203   .. code-block:: inform
204
205      print "Hello world!";         ! <- is the start of this comment
206
207 * The compiler ignores blank lines, and treats lots of space like a single
208   space (except when the spaces are part of a character string).  So, these
209   two rules tell us that we *could* have typed the source file like this:
210
211   .. code-block:: inform
212
213      Constant Story "Heidi";
214      Constant Headline
215      "^A simple Inform example^by Roger Firth and Sonja Kesserich.^";
216      Include "Parser";Include "VerbLib";
217      [ Initialise; ];
218      Include "Grammar";
219
220   We didn't type it that way because, though shorter, it's much harder to
221   read.  When designing a game, you'll spend a lot of time studying what
222   you've typed, so it's worthwhile taking a bit of care to make it as
223   readable as possible.
224
225 * Every game should have the :term:`constant` definitions for ``Story``
226   (the game's name) and ``Headline`` (typically, information on the game's
227   theme, copyright, authorship and so on).  These two :term:`string`
228   values, along with a release number and date, and details of the
229   compiler, compose the :term:`banner` which is displayed at the start of
230   each game.
231
232 * Every game needs the three lines which ``Include`` the standard library
233   files -- that is, they merge those files' contents into your source file:
234
235   .. code-block:: inform
236
237      Include "Parser";
238      Include "VerbLib";
239      ...
240      Include "Grammar";
241
242   They always have to be in this order, with ``Parser`` and ``VerbLib``
243   near the start of the file, and ``Grammar`` near the end.
244
245 * Every game needs to define an ``Initialise`` routine (note the British
246   spelling):
247
248   .. code-block:: inform
249
250      [ Initialise; ];
251
252   The :term:`routine` that we've defined here doesn't do anything useful,
253   but it still needs to be present.  Later, we'll come back to
254   ``Initialise`` and explain what a routine is and why we need this one.
255
256 * You'll notice that each of the items mentioned in the previous three
257   rules ends with a semicolon.  Inform is very fussy about its punctuation,
258   and gets really upset if you forget a terminating semicolon.  In fact,
259   the compiler just keeps reading your source file until it finds one;
260   that's why we were able to take three lines to define the ``Headline``
261   constant
262
263   .. code-block:: inform
264
265      Constant Headline
266            "^A simple Inform example
267             ^by Roger Firth and Sonja Kesserich.^";
268
269 Just to repeat what we said earlier: every game that you design will start
270 out from a basic source file like this (in fact, it might be sensible to
271 keep a copy of this template file in a safe place, as a starting point for
272 future games).  Think of this stuff as the basic preparation which you'll
273 quickly come to take for granted, much as a landscape artist always begins
274 by sizing the canvas before starting to paint.  So, now that we've taken a
275 quick tour of Inform's general needs, we can start thinking about what this
276 particular game requires.
277
278 Defining the game's locations
279 =============================
280
281 A good starting point in any game is to think about the locations which are
282 involved: this sketch map shows the four that we'll use:
283
284 .. image:: /images/heidi1.*
285    :align: center
286
287 In IF, we talk about each of these locations as a :term:`room`, even though
288 in this example none of them has four walls.  So let's use Inform to define
289 those rooms.  Here's a first attempt:
290
291 .. code-block:: inform
292
293    Object   "In front of a cottage"
294      with   description
295                 "You stand outside a cottage. The forest stretches east.",
296       has   light;
297
298    Object   "Deep in the forest"
299      with   description
300                "Through the dense foliage, you glimpse a building to the west.
301                 A track heads to the northeast.",
302       has   light;
303
304    Object   "A forest clearing"
305      with   description
306                "A tall sycamore stands in the middle of this clearing.
307                 The path winds southwest through the trees.",
308       has   light;
309
310    Object   "At the top of the tree"
311      with   description "You cling precariously to the trunk.",
312       has   light;
313
314 Again, we can infer some general principles from these four examples:
315
316 * A room definition starts with the word ``Object`` and ends, about four
317   lines later, with a semicolon.  Each of the components that appears in
318   your game -- not only the rooms, but also the people, the things that you
319   see and touch, intangibles like a sound, a smell, a gust of wind -- is
320   defined in this way; think of an "object" simply as the general term for
321   the myriad thingies which together comprise the model world which your
322   game inhabits.
323
324 * The phrase in double quotes following the word ``Object`` is the name
325   that the interpreter uses to provide the player character with a list of
326   the objects around her: where she is, what she can see, what she's
327   holding, and so on.
328
329   .. note::
330
331      We're using the word "player" to mean both the person who is playing
332      the game, and the principal protagonist (often known as the player
333      character) within the game itself.  Since the latter -- Heidi -- is
334      female, we'll refer to the player as "she" while discussing this game.
335
336 * A keyword ``with`` follows, which simply tells the compiler what to
337   expect next.
338
339 * The word ``description``, introducing another piece of text which gives
340   more detail about the object: in the case of a room, it's the appearance
341   of the surrounding environment when the player character is in that room.
342   The textual description is given in double quotes, and is followed by a
343   comma.
344
345 * Near the end, the keyword ``has`` appears, which again tells the compiler
346   to expect a certain kind of information.
347
348 * The word ``light`` says that this object is a source of illumination, and
349   that therefore the player character can see what's happening here.  There
350   has to be at least one light source in every room (unless you want the
351   player to be told that "It's pitch dark and you can't see a thing"); most
352   commonly, that light source is the room itself.
353
354 A smidgeon of background may help set this into context (there's more in
355 the next chapter).  An object can have both :term:`properties` (introduced
356 by the keyword ``with``) and :term:`attributes` (written after the word
357 ``has``).  A property has both a name (like ``description``) and a value
358 (like the character string "``You stand outside a cottage.  The forest
359 stretches east.``"); an attribute has merely a name.
360
361 In a little while, when you play this game, you'll observe that it starts
362 like this:
363
364 .. code-block:: transcript
365
366    In front of a cottage
367    You stand outside a cottage. The forest stretches east.
368
369 And here you can see how the room's name (``In front of a cottage``) and
370 description (``You stand outside a cottage.  The forest stretches east.``)
371 are used.
372
373 Joining up the rooms
374 ====================
375
376 We said that this was a first attempt at defining the rooms; it's fine as
377 far as it goes, but a few bits of information are missing.  If you look at
378 the game's sketch map, you can see how the rooms are intended to be
379 connected; from "Deep in the forest", for example, the player character
380 should be able to move west towards the cottage, or northeast to the
381 clearing.  Now, although our descriptions mention or imply these available
382 routes, we also need to explicitly add them to the room definitions in a
383 form that the game itself can make sense of.  Like this:
384
385 .. code-block:: inform
386
387    Object   before_cottage "In front of a cottage"
388      with   description
389                 "You stand outside a cottage. The forest stretches east.",
390             e_to forest,
391      has    light;
392
393    Object   forest "Deep in the forest"
394      with   description
395                 "Through the dense foliage, you glimpse a building to the west.
396                  A track heads to the northeast.",
397             w_to before_cottage,
398             ne_to clearing,
399      has    light;
400
401    Object   clearing "A forest clearing"
402      with   description
403                 "A tall sycamore stands in the middle of this clearing.
404                  The path winds southwest through the trees.",
405             sw_to forest,
406             u_to top_of_tree,
407      has    light;
408
409    Object   top_of_tree "At the top of the tree"
410      with   description "You cling precariously to the trunk.",
411             d_to clearing,
412      has    light;
413
414 We've made two changes to the room objects.
415
416 * First, between the word ``Object`` and the object's name in double
417   quotes, we've inserted a different type of name: a private, internal
418   identification, never seen by the player; one that we can use *within*
419   the source file when one object needs to refer to another object.  For
420   example, the first room is identified as ``before_cottage``, and the
421   second as ``forest``.
422
423   Unlike the external name contained in double quotes, the internal
424   identifier has to be a single word -- that is, without spaces.  To aid
425   readability, we often use an underscore character to act as sort of
426   pseudo-space: ``before_cottage`` is a bit clearer than ``beforecottage``.
427
428 * Second, we've added lines after the object descriptions which use those
429   internal identifiers to show how the rooms are connected; one line for
430   each connection.  The ``before_cottage`` object has this additional
431   line::
432
433      e_to forest,
434
435   This means that a player standing in front of the cottage can type GO
436   EAST (or EAST, or just E), and the game will transport her to the room
437   whose internal identification is ``forest``.  If she tries to move in any
438   other direction from this room, she'll be told "You can't go that way".
439
440   What we've just defined is a *one-way* easterly connection:
441   ``before_cottage`` â†’ ``forest``.  The forest object has two additional
442   lines::
443
444      w_to before_cottage,
445      ne_to clearing,
446
447   The first line defines a westerly connection ``forest`` â†’
448   ``before_cottage`` (thus enabling the player character to return to the
449   cottage), and the second defines a connection ``forest`` â†’ ``clearing``
450   which heads off to the northeast.
451
452   Inform provides for eight "horizontal" connections (``n_to``, ``ne_to``,
453   ``e_to``, ``se_to``, ``s_to``, ``sw_to``, ``w_to``, ``nw_to``) two
454   "vertical" ones (``u_to``, ``d_to``) and two specials ``in_to``, and
455   ``out_to``.  You'll see some of these used for the remaining inter-room
456   connections.
457
458 There's one last detail to attend to before we can test what we've done.
459 You'll recollect that our story begins with Heidi standing in front of her
460 cottage.  We need to tell the interpreter that ``before_cottage`` is the room
461 where the game starts, and we do this in the ``Initialise`` routine::
462
463     [ Initialise; location = before_cottage; ];
464
465 ``location`` is a :term:`variable`, part of the library, which tells the
466 interpreter in which room the player character currently is.  Here, we're
467 saying that, at the start of the game, the player character is in the
468 ``before_cottage`` room.
469
470 Now we can add what we've done to the ``Heidi.inf`` source file template.
471 At this stage, you should study the four room definitions, comparing them
472 with the sketch map until you're comfortable that you understand how to
473 create simple rooms and define the connections between them.
474
475 .. code-block:: inform
476
477    !============================================================================
478    Constant Story "Heidi";
479    Constant Headline
480                "^A simple Inform example
481                 ^by Roger Firth and Sonja Kesserich.^";
482
483    Include "Parser";
484    Include "VerbLib";
485
486    !============================================================================
487    ! The game objects
488
489    Object   before_cottage "In front of a cottage"
490      with   description
491                 "You stand outside a cottage. The forest stretches east.",
492             e_to forest,
493      has    light;
494
495    Object   forest "Deep in the forest"
496      with   description
497                 "Through the dense foliage, you glimpse a building to the west.
498                  A track heads to the northeast.",
499             w_to before_cottage,
500             ne_to clearing,
501      has    light;
502
503    Object   clearing "A forest clearing"
504      with   description
505                 "A tall sycamore stands in the middle of this clearing.
506                  The path winds southwest through the trees.",
507             sw_to forest,
508             u_to top_of_tree,
509      has    light;
510
511    Object   top_of_tree "At the top of the tree"
512      with   description "You cling precariously to the trunk.",
513             d_to clearing,
514      has    light;
515
516    !============================================================================
517    ! Entry point routines
518
519    [ Initialise; location = before_cottage; ];
520
521    !============================================================================
522    ! Standard and extended grammar
523
524    Include "Grammar";
525
526    !============================================================================
527
528 Type this in, as always taking great care with the punctuation -- watch
529 those commas and semicolons.  Compile it, and fix any mistakes which the
530 compiler reports.  You can then play the game in its current state.
531 Admittedly, you can't do very much, but you should be able to move freely
532 among the four rooms that you've defined.
533
534 .. note::
535
536    In order to minimise the amount of typing that you have to do, the
537    descriptive text in this game has been kept as short as possible.  In a
538    real game, you would typically provide more interesting descriptions
539    than these.
540
541 Adding the bird and the nest
542 ============================
543
544 Given what we said earlier, you won't be surprised to hear that both the
545 bird and its nest are Inform objects.  We'll start their definitions like
546 this:
547
548 .. code-block:: inform
549
550    Object  bird "baby bird"
551      with  description "Too young to fly, the nestling tweets helplessly.",
552       has  ;
553
554    Object  nest "bird's nest"
555      with  description "The nest is carefully woven of twigs and moss.",
556       has  ;
557
558 You can see that these definitions have exactly the same format as the
559 rooms we defined previously: a one-word internal identifier (``bird``,
560 ``nest``), and a word or phrase naming the object for the player's benefit
561 (``baby bird``, ``bird's nest``).  They both have some descriptive detail:
562 for a room this is printed when the player first enters, or when she types
563 LOOK; for other objects it's printed when she EXAMINEs that object.  What
564 they *don't* have are connections (``e_to``, ``w_to``, etc.  apply only to
565 rooms) or ``light`` (it's not necessary -- the rooms ensure that light is
566 available).
567
568 When the game is running, the player will want to refer to these two
569 objects, saying for instance EXAMINE THE BABY BIRD or PICK UP THE NEST.
570 For this to work reliably, we need to specify the word (or words) which
571 relate to each object.  Our aim here is flexibility: providing a choice of
572 relevant vocabulary so that the player can use whatever term seems
573 appropriate to her, with a good chance of it being understood.  We add a
574 line to each definition:
575
576 .. code-block:: inform
577
578    Object  bird "baby bird"
579      with  description "Too young to fly, the nestling tweets helplessly.",
580            name 'baby' 'bird' 'nestling',
581       has  ;
582
583    Object  nest "bird's nest"
584      with  description "The nest is carefully woven of twigs and moss.",
585            name 'bird^s' 'nest' 'twigs' 'moss',
586       has  ;
587
588 The ``name`` introduces a list in single quotes '...'.  We call each of
589 those quoted things a :term:`dictionary word`, and we do mean "word", not
590 "phrase" (``'baby'``\ ``'bird'`` rather than ``'baby bird'``); you can't
591 uses spaces, commas or periods *in* dictionary words, though there's a
592 space *between* each one, and the whole list ends with a comma.  The idea
593 is that the interpreter decides which object a player is talking about by
594 matching what she types against the full set of all dictionary words.  If
595 the player mentions BIRD, or BABY BIRD, or NESTLING, it's the ``baby bird``
596 that she means; if she mentions NEST, BIRD'S NEST or MOSS, it's the
597 ``bird's nest``. And if she types NEST BABY or BIRD TWIGS, the interpreter
598 will politely say that it doesn't understand what on earth she's talking
599 about.
600
601 .. note::
602
603    You'll notice the use of ``'bird^s'`` to define the dictionary word
604    BIRD'S; this oddity is necessary because the compiler expects the single
605    quotes in the list always to come in pairs -- one at the start of the
606    dictionary word, and one at the end.  If we had typed ``'bird's'`` then
607    the compiler would find the opening quote, the four letters ``b``,
608    ``i``, ``r`` and ``d``, and what looks like the closing quote.  So far
609    so good; it's read the word BIRD and now expects a space before the next
610    opening quote... but instead finds ``s'`` which makes no sense.  In
611    cases like this we must use the circumflex ``^`` to *represent* the
612    apostrophe, and the compiler then treats ``bird's`` as a dictionary
613    word.
614
615 You may be wondering why we need a list of ``name`` words for the bird and
616 its nest, yet we didn't when we defined the rooms?  It's because the player
617 can't interact with a room in the same way as with other objects; for
618 example, she doesn't need to say EXAMINE THE FOREST -- just being there and
619 typing LOOK is sufficient.
620
621 The bird's definition is complete, but there's an additional complexity
622 with the nest: we need to be able to put the bird into it.  We do this by
623 labelling the nest as a ``container`` -- able to hold other objects -- so
624 that the player can type PUT (or INSERT) BIRD IN (or INTO) NEST.
625 Furthermore, we label it as ``open``; this prevents the interpreter from
626 asking us to open it before putting in the bird.
627
628 .. code-block:: inform
629
630    Object   nest "bird's nest"
631      with   description "The nest is carefully woven of twigs and moss.",
632             name 'bird^s' 'nest' 'twigs' 'moss',
633      has    container open;
634
635 Both objects are now defined, and we can incorporate them into the game.
636 To do this, we need to choose the locations where the player will find
637 them.  Let's say that the bird is found in the forest, while the nest is in
638 the clearing.  This is how we set this up:
639
640 .. code-block:: inform
641
642    Object   bird "baby bird" forest
643      with   description "Too young to fly, the nestling tweets helplessly.",
644             name 'baby' 'bird' 'nestling',
645      has    ;
646
647    Object   nest "bird's nest" clearing
648      with   description "The nest is carefully woven of twigs and moss.",
649             name 'bird^s' 'nest' 'twigs' 'moss',
650      has    container open;
651
652 Read that first line as: "Here's the definition of an object which is
653 identified within this file as ``bird``, which is known to the player as
654 ``baby bird``, and which is initially located inside the object identified
655 within this file as ``forest``."
656
657 Where in the source file do these new objects fit?  Well, anywhere really,
658 but you'll find it convenient to insert them following the rooms where
659 they're found.  This means adding the bird just after the forest, and the
660 nest just after the clearing.  Here's the middle piece of the source file:
661
662 .. code-block:: inform
663
664    !============================================================================
665    ! The game objects
666
667    Object  before_cottage "In front of a cottage"
668      with  description
669                 "You stand outside a cottage. The forest stretches east.",
670            e_to forest,
671       has  light;
672
673    Object  forest "Deep in the forest"
674      with  description
675                 "Through the dense foliage, you glimpse a building to the west.
676                  A track heads to the northeast.",
677            w_to before_cottage,
678            ne_to clearing,
679       has  light;
680
681    Object  bird "baby bird" forest
682      with  description "Too young to fly, the nestling tweets helplessly.",
683            name 'baby' 'bird' 'nestling',
684       has  ;
685
686    Object  clearing "A forest clearing"
687      with  description
688                 "A tall sycamore stands in the middle of this clearing.
689                  The path winds southwest through the trees.",
690            sw_to forest,
691            u_to top_of_tree,
692       has  light;
693
694    Object  nest "bird's nest" clearing
695      with  description "The nest is carefully woven of twigs and moss.",
696            name 'bird^s' 'nest' 'twigs' 'moss',
697       has  container open;
698
699    Object  top_of_tree "At the top of the tree"
700      with  description "You cling precariously to the trunk.",
701            d_to clearing,
702       has  light;
703
704    !============================================================================
705
706 Make those changes, recompile the game, play it and you'll see this:
707
708 .. code-block:: transcript
709
710    Deep in the forest
711    Through the dense foliage, you glimpse a building to the west. A track heads
712    to the northeast.
713
714    You can see a baby bird here.
715
716    >
717
718 Adding the tree and the branch
719 ==============================
720
721 The description of the clearing mentions a tall sycamore tree, up which the
722 player character supposedly "climbs".  We'd better define it:
723
724 .. code-block:: inform
725
726    Object   tree "tall sycamore tree" clearing
727      with   description
728                 "Standing proud in the middle of the clearing,
729                  the stout tree looks easy to climb.",
730             name 'tall' 'sycamore' 'tree' 'stout' 'proud',
731      has    scenery;
732
733 Everything there should be familiar, apart from that ``scenery`` at the
734 end. We've already mentioned the tree in the description of the forest
735 clearing, so we don't want the interpreter adding "You can see a tall
736 sycamore tree here" afterwards, as it does for the bird and the nest.  By
737 labelling the tree as ``scenery`` we suppress that, and also prevent it
738 from being picked up by the player character.  One final object: the branch
739 at the top of the tree.  Again, not many surprises in this definition:
740
741 .. code-block:: inform
742
743    Object   branch "wide firm bough" top_of_tree
744      with   description "It's flat enough to support a small object.",
745             name 'wide' 'firm' 'flat' 'bough' 'branch',
746      has    static supporter;
747
748 The only new things are those two labels.  ``static`` is similar to 
749 ``scenery``: it prevents the branch from being picked up by the player 
750 character, but *doesn't* suppress mention of it when describing the 
751 setting.  And ``supporter`` is rather like the ``container`` that we 
752 used for the nest, except that this time the player character can put 
753 other objects *onto* the branch.  (In passing, we'll mention that an 
754 object can't normally be both a ``container`` *and* a ``supporter``.)  
755 And so here are our objects again:
756
757 .. code-block:: inform
758
759    !============================================================================
760    ! The game objects
761
762    Object   before_cottage "In front of a cottage"
763      with   description
764                 "You stand outside a cottage. The forest stretches east.",
765             e_to forest,
766      has    light;
767
768    Object   forest "Deep in the forest"
769      with   description
770                 "Through the dense foliage, you glimpse a building to the west.
771                  A track heads to the northeast.",
772             w_to before_cottage,
773             ne_to clearing,
774      has    light;
775
776    Object   bird "baby bird" forest
777      with   description "Too young to fly, the nestling tweets helplessly.",
778             name 'baby' 'bird' 'nestling',
779      has    ;
780
781    Object   clearing "A forest clearing"
782      with   description
783                 "A tall sycamore stands in the middle of this clearing.
784                  The path winds southwest through the trees.",
785             sw_to forest,
786             u_to top_of_tree,
787      has    light;
788
789    Object   nest "bird's nest" clearing
790      with   description "The nest is carefully woven of twigs and moss.",
791             name 'bird^s' 'nest' 'twigs' 'moss',
792       has   container open;
793
794    Object   tree "tall sycamore tree" clearing
795      with   description
796                 "Standing proud in the middle of the clearing,
797                  the stout tree looks easy to climb.",
798             name 'tall' 'sycamore' 'tree' 'stout' 'proud',
799       has   scenery;
800
801    Object   top_of_tree "At the top of the tree"
802      with   description "You cling precariously to the trunk.",
803             d_to clearing,
804       has   light;
805
806    Object   branch "wide firm bough" top_of_tree
807      with   description "It's flat enough to support a small object.",
808             name 'wide' 'firm' 'flat' 'bough' 'branch',
809       has   static supporter;
810
811    !============================================================================
812
813 Once again, make the changes, recompile, and investigate what you can do in
814 your model world.
815
816 Finishing touches
817 =================
818
819 Our first pass at the game is nearly done; just two more changes to
820 describe.  The first is easy: Heidi wouldn't be able to climb the tree
821 carrying the bird and the nest separately: we want the player character to
822 put the bird into the nest first.  One easy way to enforce this is by
823 adding a line near the top of the file:
824
825 .. code-block:: inform
826
827    !============================================================================
828    Constant Story "Heidi";
829    Constant Headline
830                "^A simple Inform example
831                 ^by Roger Firth and Sonja Kesserich.^";
832
833    Constant MAX_CARRIED 1;
834
835 The value of ``MAX_CARRIED`` limits the number of objects that the player
836 character can be holding at any one time; by setting it to 1, we're saying
837 that she can carry the bird or the nest, but not both.  However, the limit
838 ignores the contents of ``container`` or ``supporter`` objects, so the nest
839 with the bird inside it is still counted as one object.
840
841 The other change is slightly more complex and more important: there's
842 currently no way to "win" the game!  The goal is for the player character
843 to put the bird in the nest, take the nest to the top of the tree, and
844 place it on the branch; when that happens, the game should be over.  This
845 is one way of making it happen:
846
847 .. code-block:: inform
848
849    Object  branch "wide firm bough" top_of_tree
850      with  description "It's flat enough to support a small object.",
851            name 'wide' 'firm' 'flat' 'bough' 'branch',
852            each_turn [; if (nest in branch) deadflag = 2; ],
853       has  static supporter;
854
855 .. note::
856
857    Here's an explanation of what's going on.  If you find this difficult to
858    grasp, don't worry.  It's the hardest bit so far, and it introduces
859    several new concepts all at once.  Later in the guide, we'll explain
860    those concepts more clearly, so you can just skip this bit if you want.
861
862    The variable ``deadflag``, part of the library, is normally 0.  If you set
863    its value to 2, the interpreter notices and ends the game with "You have
864    won".  The statement::
865
866          if (nest in branch) deadflag = 2;
867
868    should be read as: "Test whether the ``nest`` is currently in the
869    ``branch`` (if the branch is a ``container``) or on it (if the
870    ``branch`` is a supporter); if it is, set the value of ``deadflag`` to
871    2; if it isn't, do nothing."  The surrounding part::
872
873          each_turn [; ... ],
874
875    should be read as: "At the end of each turn (when the player is in the
876    same room as the branch), do whatever is written inside the square
877    brackets".  So, putting that all together:
878
879    * At the end of each turn (after the player has typed something and
880      pressed the Enter key, and the interpreter has done whatever was
881      requested) the interpreter checks whether the player and the
882      ``branch`` are in the same room.  If not, nothing happens.  If they're
883      together, it looks to see where the nest is.  Initially it's in the
884      ``clearing``, so nothing happens.
885
886    * Also at the end of each turn, the interpreter checks the value of
887      ``deadflag``.  Usually it's 0, so nothing happens.
888
889    * Finally the player character puts the ``nest`` on the ``branch``.
890      "Aha!"  says the interpreter (to itself, of course), and sets the
891      value of ``deadflag`` to 2.
892
893    * Immediately afterwards, (another part of) the interpreter checks and
894      finds that the value of ``deadflag`` has changed to 2, which means
895      that the game is successfully completed; so, it says to the player,
896      "you've won!"
897
898 That's as far as we'll take this example for now.  Make those final
899 changes, recompile, and test what you've achieved.  You'll probably find a
900 few things that could be done better -- even on a simple game like this
901 there's considerable scope for improvement -- so we'll revisit Heidi in her
902 forest shortly.  First, though, we'll recap what we've learnt so far.