9 | |CENTER| *G was a gamester, who had but ill-luck;*
10 | |CENTER| *H was a hunter, and hunted a buck.*
14 .. image:: /images/picG.png
17 |G|\oing through the design of our first game in the previous chapter has
18 introduced all sorts of Inform concepts, often without giving you much
19 detail about what's been happening. So let's review some of what we've
20 learnt so far, in a slightly more organised fashion. We'll talk about
21 :ref:`const-var`, :ref:`object-defs`, :ref:`object-tree`,
22 :ref:`things-in-quotes` and :ref:`routines-statements`.
26 Constants and variables
27 =======================
29 Superficially similar, constants and variables are actually very different
35 A :term:`constant` is a name to which a value is given once and once only;
36 you can't later use that name to stand for a different value. Think of it
37 as a stone tablet on which you carve a number: a carving can't be undone,
38 so that you see the same number every time you look at the stone.
40 So far, we've seen a ``Constant`` being set up with its value as a string
43 Constant Story "Heidi";
47 Constant MAX_CARRIED 1;
49 Those two examples represent the most common ways in which constants are
55 A :term:`variable` is a name to which a value is given, but that value can
56 be changed to a different one at any time. Think of it as a blackboard on
57 which you mark a number in chalk: whenever you need to, just wipe the board
58 and write up a new number.
60 We haven't set up any variables of our own yet, though we've used a couple
61 which the library created like this::
66 The value of a :term:`global variable` created in this way is initially 0,
67 but you can change it at any time. For example, we used the statement::
69 location = before_cottage;
71 to reset the value of the ``location`` variable to the
72 ``before_cottage`` object, and we wrote::
74 if (nest in branch) deadflag = 2;
76 to reset the value of the ``deadflag`` variable to 2.
78 Later, we'll talk about the :term:`local variable` (see :ref:`routines`)
79 and about using object properties as variables (see :ref:`objects`).
86 The most important information you should have gleaned from the previous
87 chapter is that your entire game is defined as a series of objects. Each
88 room is an object, each item that the player sees and touches is an object;
89 indeed the player herself is also an object (one that's automatically
90 defined by the library).
94 The set-off below needs to be tweaked or perhaps a custom lexer
95 created to get italics in the right places.
97 The general model of an :term:`object` definition looks like this::
99 Object obj_id "external_name" parent_obj_id
100 with property value ,
104 has attribute attribute ... attribute
107 The definition starts with the word ``Object`` and ends with a semicolon;
108 in between are three major blocks of information:
110 * immediately after the word ``Object`` is the header information;
111 * the word ``with`` introduces the object's :term:`properties`;
112 * the word ``has`` introduces the object's :term:`attributes`.
117 An object header comprises up to three items, all optional:
119 * An internal ``obj_id`` by which other objects refer to this object. It's
120 a single word (though it can contain digits and underscores) of up to
121 thirty-two characters, and it must be unique within the game. You can
122 omit the ``obj_id`` if this object isn't referred to by any other
125 For example: ``bird``, ``tree``, ``top_of_tree``.
127 * An ``external_name``, in double quotes, which is what the interpreter
128 uses when referring to the object. It can be one or more words, and need
129 not be unique (for instance, you might have several ``"Somewhere in the
130 desert"`` rooms). Although not mandatory, it's best to give *every*
131 object an ``external_name``. For example: ``"baby bird"``, ``"tall
132 sycamore tree"``, ``"At the top of the tree"``.
134 * The internal ``obj_id`` of another object which is the initial location
135 of this object (its "parent" -- see the next section) at the start of the
136 game. This is omitted from objects which have no initial parent; it's
137 *always* omitted from a room.
139 For example: the definition of the ``bird`` starts like this, specifying
140 that at the start of the game, it can be found in the ``forest`` room
141 (though later the player character will pick it up and move it around)::
143 Object bird "baby bird" forest
146 The ``tree`` starts like this; the only real difference is that, because
147 the player character can't move a ``scenery`` object, it's always going
148 to be in the ``clearing``::
150 Object tree "tall sycamore tree" clearing
155 There's an alternative method for defining an object's initial
156 location, using "arrows" rather than the parent's internal ``obj_id``.
157 For example, the definition of the bird could have started like this::
159 Object -> bird "baby bird"
162 We don't use the arrows method in this guide, though we do describe
163 how it works in :ref:`setting-up-tree`.
168 An object's property definitions are introduced by the ``with`` keyword.
169 An object can have any number of properties, and they can be defined in any
170 order. Each definition has two parts: a name, and a value; there's a space
171 between the two parts, and a comma at the end.
173 Think of each property as a variable which is specifically associated with
174 that object. The variable's initial setting is the supplied value; if
175 necessary, it can be reset to other values during play (though in fact most
176 property values don't change in this way).
178 Here are examples of the properties that we've come across so far::
180 description "The nest is carefully woven of twigs and moss.",
182 name 'baby' 'bird' 'nestling',
183 each_turn [; if (nest in branch) deadflag = 2; ],
185 By happy coincidence, those examples also demonstrate most of the different
186 types of value which can be assigned to a property. The value associated
187 with the ``description`` property in this particular example is a string of
188 characters in double quotes; the value associated with this ``e_to``
189 property is the internal identity of an object; the ``name`` property is a
190 bit unusual -- its value is a list of dictionary words, each in single
191 quotes; the ``each_turn`` property has a value which is an :term:`embedded
192 routine` (see :ref:`embedded-routines`). The only other type of value
193 which is commonly found is a simple number; for example::
197 In all, the library defines around forty-eight standard properties -- like
198 ``name`` and ``each_turn`` -- which you can associate with your objects;
199 there's a complete list in :ref:`object-props`. And in :doc:`08` we show
200 you how to invent your own property variables.
205 An object's attribute list is introduced by the ``has`` keyword. An object
206 can have any number of attributes, and they can be listed in any order,
207 with a space between each.
209 As with properties, you can think of each attribute as a variable which is
210 specifically associated with that object. However, an attribute is a much
211 more limited form of variable, since it can have only two possible states:
212 present, and absent (also known as set/clear, on/off, or true/false;
213 incidentally, a two-state variable like this is often called a
214 :term:`flag`). Initially, an attribute is either present (if you mention
215 its name in the list) or absent (otherwise); if necessary, its state can
216 change during play (and this is relatively common). We often say that a
217 certain object currently *has* a certain attribute, or that conversely it
220 The attributes that we've come across so far are::
222 container light open scenery static supporter
224 Each of those answers a question: Is this object a container? Does it
225 provide light? and so on. If the attribute is present then the answer is
226 Yes; if the attribute isn't present, the answer is No.
228 The library defines around thirty standard attributes, listed in
229 :ref:`object-attrs`. Although you *can* devise additional attributes --
230 see :ref:`common-props` -- in practice you seldom need to.
234 Object relationships -- the object tree
235 =======================================
237 Not only is your game composed entirely of objects, but also Inform takes
238 great care to keep track of the relationships between those objects. By
239 "relationship" we don't mean that Walter is Wilhelm's son, while Helga and
240 Wilhelm are just good friends; it's a much more comprehensive exercise in
241 recording exactly where each object is located, relative to the other
244 Despite what we just said, Inform relationships *are* managed in terms of
245 :term:`parent` and :term:`child` objects, though in a much broader sense
246 than Wilhelm and Walter. When the player character is in a particular room
247 -- for example the forest -- we can say that:
249 * the forest object is *the* parent of the player object, or alternatively
250 * the player object is *a* child of the forest object.
252 Also, if the player is carrying an object -- for example the nest -- we say
255 * the player object is *the* parent of the nest object, or that
256 * the nest object is *a* child of the player object.
258 Note the emphasis there: an object has exactly *one* parent (or no parent
259 at all), but can have *any number* of child objects (including none).
261 For an example of an object having more than one child, think about the way
262 we defined the nest and tree objects::
264 Object nest "bird's nest" clearing
267 Object tree "tall sycamore tree" clearing
270 We used the third of the header items to say that the clearing was the
271 parent of the nest, and also that the clearing was the parent of the tree;
272 that is, both nest and tree are child objects of the clearing.
276 A "room" isn't anything magical; it's just an object which *never* has a
277 parent, and which *may* from time to time have the player object as a
280 When we defined the bird, we placed it in the forest, like so::
282 Object bird "baby bird" forest
285 We didn't place any other objects in that room, so at the start of the game
286 the forest was the parent of the bird (and the bird was the only child of
287 the forest). But what happens when the player character, initially in the
288 ``before_cottage`` room, goes EAST to the forest? Answer: the player's
289 parent is now the forest, and the forest has two children -- the bird *and*
290 the player. This is a key principle of the way Inform manages its objects:
291 the parent--child relationships between objects change continuously, often
292 dramatically, as the game progresses.
294 Another example of this: suppose the player character picks up the bird.
295 This causes another change in the relationships. The bird is now a child
296 of the player (and *not* of the forest), and the player is both a parent
297 (of the bird) and a child (of the forest).
299 Here we show how the object relationships change during the course of the
300 game. The straight lines represent parent--child relationships, with the
301 parent object at the top of the line, and the child object at the bottom.
303 1. At the start of the game:
305 .. blockdiag:: /figures/heidiobj1.diag
309 2. The player types: ``GO EAST``
311 .. blockdiag:: /figures/heidiobj2.diag
315 3. The player types: ``TAKE THE BIRD``
317 .. blockdiag:: /figures/heidiobj3.diag
321 4. The player types: ``GO NORTHEAST``
323 .. blockdiag:: /figures/heidiobj4.diag
327 5. The player types: ``PUT BIRD IN NEST``
329 .. blockdiag:: /figures/heidiobj5.diag
333 6. The player types: ``TAKE NEST``
335 .. blockdiag:: /figures/heidiobj6.diag
339 7. The player types: ``UP``
341 .. blockdiag:: /figures/heidiobj7.diag
345 8. The player types: ``PUT NEST ON BRANCH``
347 .. blockdiag:: /figures/heidiobj8.diag
351 In this short example, we've taken a lot of time and space to spell out
352 exactly how the objects relationship patterns -- generally known as the
353 :term:`object tree` -- appear at each stage. Normally you wouldn't bother
354 with this much detail (a) because the interpreter does most of the work for
355 you, and (b) because in a real game there are usually too many objects for
356 you to keep track of. What's important is that you understand the basic
357 principles: at any moment in time an object either has no parent (which
358 probably means either that it's a room, or that it's floating in hyperspace
359 and not currently part of the game) or exactly one parent -- the object
360 that it's "in" or "on" or "a part of". However, there's no restriction on
361 the number of children that an object can have.
363 There's a practical use for these relationships, covered in detail further
364 on. As a designer, you can refer to the current parent or children of any
365 given object with the ``parent``, ``child`` and ``children`` routines, and
366 this is one feature that you will be using frequently. There are also
367 other routines associated with the object tree, to help you keep track of
368 the objects or move them around. We'll see them one by one in the next
369 chapters. For a quick summary, see :ref:`objects`.
371 .. _things-in-quotes:
376 Inform makes careful distinction between double and single quotes.
381 Double quotes ``"..."`` surround a :term:`string` -- a letter, a word, a
382 paragraph, or almost any number of characters -- which you want the
383 interpreter to display while the game is being played. You can use the
384 tilde ``~`` to represent a double quote inside the string, and the
385 circumflex ``^`` to represent a newline (line break) character. Upper-case
386 and lower-case letters are treated as different.
388 A long string can be split over several lines; Inform transforms each
389 line break (and any spaces around it) into a single space (extra spaces
390 *not* at a line break are preserved, though). These two strings are
393 "This is a string of characters."
400 When the interpreter displays a long character string -- for example, while
401 describing a feature-packed room -- it employs automatic word-wrapping to
402 fit the text to the player's screen. This is where you might insert ``^``
403 characters to force line breaks to appear, thus presenting the text as a
404 series of paragraphs. So far, we've seen strings used as the value of a
408 "^A simple Inform example
409 ^by Roger Firth and Sonja Kesserich.^";
411 which could equally have been defined thus::
414 "^A simple Inform example^by Roger Firth and Sonja Kesserich.^";
416 and as the value of an object ``description`` property::
418 description "Too young to fly, the nestling tweets helplessly.",
420 Later, you'll find that they're also very common in ``print`` statements.
425 Single quotes ``'...'`` surround a :term:`dictionary word`. This has to be
426 a single word -- no spaces -- and generally contains only letters (and
427 occasionally numbers and hyphens), though you can use ``^`` to represent an
428 apostrophe inside the word. Upper-case and lower-case letters are treated
429 as identical; also, the interpreter normally looks only at the first nine
430 characters of each word that the player types.
432 When the player types a command, the interpreter divides what was typed
433 into individual words, which it then looks up in the dictionary. If it
434 finds all the words, and they seem to represent a sensible course of
435 action, that's what happens next.
437 So far, we've seen dictionary words used as the values of an object
440 name 'bird^s' 'nest' 'twigs' 'moss',
442 and indeed that's just about the only place where they commonly occur.
443 You'll save yourself a lot of confusion by remembering the distinction:
444 Double quotes for Output, Single quotes for Input (DOSI).
446 .. _routines-statements:
448 Routines and statements
449 =======================
451 A routine is a collection of statements, which are performed (or we often
452 say "are executed") at run-time by the interpreter. There are two types of
453 routine, and about two dozen types of statement (there's a complete list in
454 :ref:`statements`; see also :doc:`/appendices/e`).
459 A :term:`statement` is an instruction telling the interpreter to perform a
460 particular task -- to "do something" -- while the game is being played. A
461 real game usually has lots and lots of statements, but so far we've
462 encountered only a few. We saw::
464 location = before_cottage;
466 which is an example of an :term:`assignment` statement, so-called because
467 the equals sign ``=`` assigns a new value (the internal ID of our
468 ``before_cottage`` room) to a variable (the global variable ``location``
469 which is part of the library). Later we saw::
471 if (nest in branch) deadflag = 2;
473 which is actually *two* statements: an assignment, preceded by an ``if``
476 if (nest in branch) ...
478 The ``if`` statement tests a particular condition; if the condition is
479 true, the interpreter executes whatever statement comes next; if it isn't
480 true, the interpreter ignores the next statement. In this example, the
481 interpreter is testing whether the ``nest`` object is "in" or "on" (which
482 we now know means "is a child of") the ``branch`` object. For most of the
483 game, that condition is not true, and so the interpreter ignores the
484 following statement. Eventually, when the condition becomes true, the
485 interpreter executes that statement: it performs an assignment::
489 which changes the value of the library variable ``deadflag`` from its
490 current value to 2. Incidentally, ``if`` statements are often written
491 on two lines, with the "controlled" statement indented. This makes it
492 easier to read, but doesn't change the way that it works::
497 The thing that's being controlled by the ``if`` statement doesn't have to
498 be an assignment; it can be any kind of statement. In fact, you can have
499 lots of statements, not just one, controlled by an ``if`` statement. We'll
500 talk about these other possibilities later. For now, just remember that
501 the only place where you'll find statements are within standalone routines
502 and embedded routines.
504 .. _standalone-routines:
509 A :term:`standalone routine` is a series of statements, collected together
510 and given a name. When the routine is "called" -- by its given name --
511 those statements are executed. Here's the one that we've defined::
513 [ Initialise; location = before_cottage; ];
515 Because it's such a tiny routine, we placed it all on a single line. Let's
516 rewrite it to use several lines (as with the ``if`` statement, this improves
517 the readability, but doesn't affect how it works)::
520 location = before_cottage;
523 The ``[ Initialise;`` is the start of the routine, and defines the name by
524 which it can be "called". The ``];`` is the end of the routine. In
525 between are the statements -- sometimes known as the body of the routine --
526 which are executed when the routine is called. And how is that done? By a
527 statement like this::
531 That single statement, the routine's name followed by opening and closing
532 parentheses, is all that it takes to call a routine. When it comes across
533 a line like this, the interpreter executes the statements -- in this
534 example there's only one, but there may be ten, twenty, even a hundred of
535 them -- in the body of the routine. Having done that, the interpreter
536 resumes what it was doing, on the line following the ``Initialise();``
541 You may have noticed that, although we've defined a routine named
542 ``Initialise``, we've never actually called it. Don't worry -- the
543 routine *is* called, by the Inform library, right at the start of a
546 .. _embedded-routines:
551 An :term:`embedded routine` is much like a standalone routine, though it
552 doesn't have a name and doesn't end in a semicolon. This is the one that
555 [; if (nest in branch) deadflag = 2; ]
557 except that we didn't write it in isolation like that: instead, we defined
558 it to be the value of an object property::
560 each_turn [; if (nest in branch) deadflag = 2; ],
562 which would have worked just the same if we'd written it like this::
569 All embedded routines are defined in this manner: as the value of an object
570 property. That's where they're embedded -- inside an object. The
571 introductory characters ``[;`` maybe look a little odd, but it's really
572 only the same syntax as for a standalone routine, only without a name
573 between the ``[`` and ``;``.
575 For calling an embedded routine, thus causing the statements it contains to
576 be executed, the method that we described for a standalone routine won't
577 work. An embedded routine has no name, and needs none; it's
578 *automatically* called by the library at appropriate moments, which are
579 determined by the role of the property for which it is the value. In our
580 example, that's at the end of every turn in which the player character is
581 in the same room as the branch. Later, we'll see other examples of
582 embedded routines, each designed to perform a task which is appropriate for
583 the property whose value it is; we'll also see that it is possible to call
584 an embedded routine yourself, using an ``obj_id.property()`` syntax -- in
585 this example, we could call the routine by writing ``branch.each_turn()``.
586 There's more about these topics in :ref:`routines-args`,
587 :ref:`working-with-routines` and in :ref:`routines`.
589 That ends our review of the ground covered in our first game. We'll have
590 more to say about most of this later, but we're trying not to overload you
591 with facts at this early stage. What we'd like you to do is to look back
592 at the source of the game, and ensure that you can recognise all the
593 elements which this chapter has described. Then, we'll move on to fix a
594 few of the game's more important defects.