Add chapter 4.
[ibg.git] / chapters / 04.rst
1 ======================
2  Reviewing the basics
3 ======================
4
5 .. epigraph::
6
7    | *G was a gamester, who had but ill-luck;*
8    | *H was a hunter, and hunted a buck.*
9
10 Going through the design of our first game in the previous chapter has
11 introduced all sorts of Inform concepts, often without giving you much
12 detail about what's been happening.  So let's review some of what we've
13 learnt so far, in a slightly more organised fashion.  We'll talk about
14 "Constants and variables" on page 49, "Object definitions" on page 50,
15 "Object relationships -- the object tree" on page 52, "Things in quotes" on
16 page 55, and "Routines and statements" on page 56.
17
18 Constants and variables
19 =======================
20
21 Superficially similar, constants and variables are actually very different
22 beasts.
23
24 .. rubric:: Constants
25
26 A **constant** is a name to which a value is given once and once only; you
27 can't later use that name to stand for a different value.  Think of it as a
28 stone tablet on which you carve a number: a carving can't be undone, so
29 that you see the same number every time you look at the stone.
30
31 So far, we've seen a ``Constant`` being set up with its value as a string
32 of characters::
33
34     Constant Story "Heidi";
35
36 and as a number::
37
38     Constant MAX_CARRIED 1;
39
40 Those two examples represent the most common ways in which constants are
41 used in Inform.
42
43 .. rubric:: Variables
44
45 A **variable** is a name to which a value is given, but that value can be
46 changed to a different one at any time.  Think of it as a blackboard on
47 which you mark a number in chalk: whenever you need to, just wipe the board
48 and write up a new number.
49
50 We haven't set up any variables of our own yet, though we've used a couple
51 which the library created like this::
52
53     Global location;
54     Global deadflag;
55
56 The value of a **global variable** created in this way is initially 0, but
57 you can change it at any time.  For example, we used the statement::
58
59      location = before_cottage;
60
61 to reset the value of the location variable to the ``before_cottage``
62 object, and we wrote::
63
64      if (nest in branch) deadflag = 2;
65
66 to reset the value of the ``deadflag`` variable to 2.
67
68 Later, we'll talk about the **local variable** (see "Routines" on page 179)
69 and about using object properties as variables (see "Objects" on page 177).
70
71 Object definitions
72 ==================
73
74 The most important information you should have gleaned from the previous
75 chapter is that your entire game is defined as a series of objects.  Each
76 room is an object, each item that the player sees and touches is an object;
77 indeed the player herself is also an object (one that's automatically
78 defined by the library).
79
80 The general model of an **object** definition looks like this::
81
82         Object      obj_id   "external_name"   parent_obj_id
83            with     property    value ,
84                     property    value ,
85                     ...
86                     property    value ,
87            has      attribute    attribute   ... attribute
88            ;
89
90 The definition starts with the word ``Object`` and ends with a semicolon;
91 in between are three major blocks of information:
92
93 * immediately after the word ``Object`` is the header information;
94 * the word ``with`` introduces the object's **properties**;
95 * the word ``has`` introduces the object's **attributes**.
96
97 .. rubric:: Object headers
98
99 An object header comprises up to three items, all optional:
100
101 * An internal ``obj_id`` by which other objects refer to this object.  It's
102   a single word (though it can contain digits and underscores) of up to
103   thirty-two characters, and it must be unique within the game.  You can
104   omit the ``obj_id`` if this object isn't referred to by any other
105   objects.
106
107   For example: ``bird``, ``tree``, ``top_of_tree``.
108
109 * An ``external_name``, in double quotes, which is what the interpreter
110   uses when referring to the object.  It can be one or more words, and need
111   not be unique (for instance, you might have several ``"Somewhere in the
112   desert"`` rooms).  Although not mandatory, it's best to give *every*
113   object an ``external_name``.  For example: ``"baby bird"``, ``"tall
114   sycamore tree"``, ``"At the top of the tree"``.
115
116 * The internal ``obj_id`` of another object which is the initial location
117   of this object (its "parent" -- see the next section) at the start of the
118   game.  This is omitted from objects which have no initial parent; it's
119   *always* omitted from a room.
120
121   For example: the definition of the ``bird`` starts like this, specifying
122   that at the start of the game, it can be found in the ``forest`` room
123   (though later the player character will pick it up and move it around)::
124
125       Object   bird "baby bird" forest
126       ...
127
128   The ``tree`` starts like this; the only real difference is that, because
129   the player character can't move a ``scenery`` object, it's always going
130   to be in the ``clearing``::
131
132       Object   tree "tall sycamore tree" clearing
133       ...
134
135   .. note::
136
137      There's an alternative method for defining an object's initial
138      location, using "arrows" rather than the parent's internal ``obj_id``.
139      For example, the definition of the bird could have started like this::
140
141          Object   -> bird "baby bird"
142          ...
143
144      We don't use the arrows method in this guide, though we do describe
145      how it works in "Setting up the object tree" on page 185.
146
147 .. rubric:: Object properties
148
149 An object's property definitions are introduced by the ``with`` keyword.
150 An object can have any number of properties, and they can be defined in any
151 order.  Each definition has two parts: a name, and a value; there's a space
152 between the two parts, and a comma at the end.
153
154 Think of each property as a variable which is specifically associated with
155 that object.  The variable's initial setting is the supplied value; if
156 necessary, it can be reset to other values during play (though in fact most
157 property values don't change in this way).
158
159 Here are examples of the properties that we've come across so far::
160
161     description "The nest is carefully woven of twigs and moss.",
162     e_to forest,
163     name 'baby' 'bird' 'nestling',
164     each_turn [; if (nest in branch) deadflag = 2; ],
165
166 By happy coincidence, those examples also demonstrate most of the different
167 types of value which can be assigned to a property.  The value associated
168 with the ``description`` property in this particular example is a string of
169 characters in double quotes; the value associated with this ``e_to``
170 property is the internal identity of an object; the ``name`` property is a
171 bit unusual -- its value is a list of dictionary words, each in single
172 quotes; the ``each_turn`` property has a value which is an **embedded
173 routine** (see "Embedded routines" on page 58).  The only other type of
174 value which is commonly found is a simple number; for example::
175
176      capacity 10,
177
178 In all, the library defines around forty-eight standard properties -- like
179 ``name`` and ``each_turn`` -- which you can associate with your objects;
180 there's a complete list in "Object properties" on page 266.  And in
181 "William Tell: in his prime" on page 91 we show you how to invent your own
182 property variables.
183
184 .. rubric:: Object attributes
185
186 An object's attribute list is introduced by the ``has`` keyword.  An object
187 can have any number of attributes, and they can be listed in any order,
188 with a space between each.
189
190 As with properties, you can think of each attribute as a variable which is
191 specifically associated with that object.  However, an attribute is a much
192 more limited form of variable, since it can have only two possible states:
193 present, and absent (also known as set/clear, on/off, or true/false;
194 incidentally, a two-state variable like this is often called a **flag**).
195 Initially, an attribute is either present (if you mention its name in the
196 list) or absent (otherwise); if necessary, its state can change during play
197 (and this is relatively common).  We often say that a certain object
198 currently *has* a certain attribute, or that conversely it *hasn't* got it.
199
200 The attributes that we've come across so far are::
201
202      container light open scenery static supporter
203
204 Each of those answers a question: Is this object a container?  Does it
205 provide light?  and so on.  If the attribute is present then the answer is
206 Yes; if the attribute isn't present, the answer is No.
207
208 The library defines around thirty standard attributes, listed in "Object
209 attributes" on page 269.  Although you *can* devise additional attributes
210 -- see "Common properties and attributes" on page 185 -- in practice you
211 seldom need to.
212
213 Object relationships -- the object tree
214 =======================================
215
216 Not only is your game composed entirely of objects, but also Inform takes
217 great care to keep track of the relationships between those objects.  By
218 "relationship" we don't mean that Walter is Wilhelm's son, while Helga and
219 Wilhelm are just good friends; it's a much more comprehensive exercise in
220 recording exactly where each object is located, relative to the other
221 objects in the game.
222
223 Despite what we just said, Inform relationships *are* managed in terms of
224 **parent** and **child** objects, though in a much broader sense than
225 Wilhelm and Walter.  When the player character is in a particular room --
226 for example the forest -- we can say that:
227
228 * the forest object is *the* parent of the player object, or alternatively
229 * the player object is *a* child of the forest object.
230
231 Also, if the player is carrying an object -- for example the nest -- we say
232 that:
233
234 * the player object is *the* parent of the nest object, or that
235 * the nest object is *a* child of the player object.
236
237 Note the emphasis there: an object has exactly *one* parent (or no parent
238 at all), but can have *any number* of child objects (including none).
239
240 For an example of an object having more than one child, think about the way
241 we defined the nest and tree objects::
242
243     Object   nest "bird's nest" clearing
244     ...
245
246     Object   tree "tall sycamore tree" clearing
247     ...
248
249 We used the third of the header items to say that the clearing was the
250 parent of the nest, and also that the clearing was the parent of the tree;
251 that is, both nest and tree are child objects of the clearing.
252
253 .. note::
254
255    A "room" isn't anything magical; it's just an object which *never* has a
256    parent, and which *may* from time to time have the player object as a
257    child.
258
259 When we defined the bird, we placed it in the forest, like so::
260
261     Object   bird "baby bird" forest
262     ...
263
264 We didn't place any other objects in that room, so at the start of the game
265 the forest was the parent of the bird (and the bird was the only child of
266 the forest).  But what happens when the player character, initially in the
267 ``before_cottage`` room, goes EAST to the forest?  Answer: the player's
268 parent is now the forest, and the forest has two children -- the bird *and*
269 the player.  This is a key principle of the way Inform manages its objects:
270 the parent--child relationships between objects change continuously, often
271 dramatically, as the game progresses.
272
273 Another example of this: suppose the player character picks up the bird.
274 This causes another change in the relationships.  The bird is now a child
275 of the player (and *not* of the forest), and the player is both a parent
276 (of the bird) and a child (of the forest).
277
278 In this diagram, we show how the object relationships change during the
279 course of the game.  The straight lines represent parent--child
280 relationships, with the parent object at the top of the line, and the child
281 object at the bottom.
282
283 .. list-table::
284    :widths: 1 3 5
285
286    * - 1.
287      - At the start of the game:
288      - .. image:: /images/heidiobj1.*
289
290    * - 2.
291      - The player types: ``GO EAST``
292      - .. image:: /images/heidiobj2.*
293
294    * - 3.
295      - The player types: ``TAKE THE BIRD``
296      - .. image:: /images/heidiobj3.*
297
298    * - 4.
299      - The player types: ``GO NORTHEAST``
300      - .. image:: /images/heidiobj4.*
301
302    * - 5.
303      - The player types: ``PUT BIRD IN NEST``
304      - .. image:: /images/heidiobj5.*
305
306    * - 6.
307      - The player types: ``TAKE NEST``
308      - .. image:: /images/heidiobj6.*
309
310    * - 7.
311      - The player types: ``UP``
312      - .. image:: /images/heidiobj7.*
313
314    * - 8.
315      - The player types: ``PUT NEST ON BRANCH``
316      - .. image:: /images/heidiobj8.*
317
318 In this short example, we've taken a lot of time and space to spell out
319 exactly how the objects relationship patterns -- generally known as the
320 **object tree** -- appear at each stage.  Normally you wouldn't bother with
321 this much detail (a) because the interpreter does most of the work for you,
322 and (b) because in a real game there are usually too many objects for you
323 to keep track of.  What's important is that you understand the basic
324 principles: at any moment in time an object either has no parent (which
325 probably means either that it's a room, or that it's floating in hyperspace
326 and not currently part of the game) or exactly one parent -- the object
327 that it's "in" or "on" or "a part of".  However, there's no restriction on
328 the number of children that an object can have.
329
330 There's a practical use for these relationships, covered in detail further
331 on.  As a designer, you can refer to the current parent or children of any
332 given object with the ``parent``, ``child`` and ``children`` routines, and
333 this is one feature that you will be using frequently.  There are also
334 other routines associated with the object tree, to help you keep track of
335 the objects or move them around.  We'll see them one by one in the next
336 chapters.  For a quick summary, see "Objects" on page 177.
337
338 Things in quotes
339 ================
340
341 Inform makes careful distinction between double and single quotes.
342
343 .. rubric:: Double quotes
344
345 Double quotes "..." surround a **string** -- a letter, a word, a paragraph,
346 or almost any number of characters -- which you want the interpreter to
347 display while the game is being played.  You can use the tilde ``~`` to
348 represent a double quote inside the string, and the circumflex ``^`` to
349 represent a newline (line break) character.  Upper-case and lower-case
350 letters are treated as different.
351
352 A long string can be split over several lines; Inform transforms each line
353 break (and any spaces around it) into a single space (extra spaces not at a
354 line break are preserved, though).  These two strings are equivalent::
355
356     "This is a      string of characters."
357
358     "This
359       is
360             a    string
361                        of characters."
362
363 When the interpreter displays a long character string -- for example, while
364 describing a feature-packed room -- it employs automatic word-wrapping to
365 fit the text to the player's screen.  This is where you might insert ``^``
366 characters to force line breaks to appear, thus presenting the text as a
367 series of paragraphs.  So far, we've seen strings used as the value of a
368 ``Constant``::
369
370     Constant Headline
371           "^A simple Inform example
372            ^by Roger Firth and Sonja Kesserich.^";
373
374 which could equally have been defined thus::
375
376     Constant Headline
377           "^A simple Inform example^by Roger Firth and Sonja Kesserich.^";
378
379 and as the value of an object description property::
380
381     description "Too young to fly, the nestling tweets helplessly.",
382
383 Later, you'll find that they're also very common in ``print`` statements.
384
385 .. rubric:: Single quotes
386
387 Single quotes '...' surround a **dictionary word**.  This has to be a
388 single word -- no spaces -- and generally contains only letters (and
389 occasionally numbers and hyphens), though you can use ``^`` to represent an
390 apostrophe inside the word.  Upper-case and lower-case letters are treated
391 as identical; also, the interpreter normally looks only at the first nine
392 characters of each word that the player types.
393
394 When the player types a command, the interpreter divides what was typed
395 into individual words, which it then looks up in the dictionary.  If it
396 finds all the words, and they seem to represent a sensible course of
397 action, that's what happens next.
398
399 So far, we've seen dictionary words used as the values of an object
400 ``name`` property::
401
402      name 'bird^s' 'nest' 'twigs' 'moss',
403
404 and indeed that's just about the only place where they commonly occur.
405 You'll save yourself a lot of confusion by remembering the distinction:
406 Double quotes for Output, Single quotes for Input (DOSI).
407
408 Routines and statements
409 =======================
410
411 A routine is a collection of statements, which are performed (or we often
412 say "are executed") at run-time by the interpreter.  There are two types of
413 routine, and about two dozen types of statement (there's a complete list in
414 "Statements" on page 174; see also "Inform language" on page 257).
415
416 .. rubric:: Statements
417
418 A **statement** is an instruction telling the interpreter to perform a
419 particular task -- to "do something" -- while the game is being played.  A
420 real game usually has lots and lots of statements, but so far we've
421 encountered only a few.  We saw::
422
423      location = before_cottage;
424
425 which is an example of an **assignment** statement, so-called because the
426 equals sign ``=`` assigns a new value (the internal ID of our
427 ``before_cottage`` room) to a variable (the global variable ``location``
428 which is part of the library).  Later we saw::
429
430      if (nest in branch) deadflag = 2;
431
432 which is actually *two* statements: an assignment, preceded by an ``if``
433 statement::
434
435      if (nest in branch) ...
436
437 The ``if`` statement tests a particular condition; if the condition is
438 true, the interpreter executes whatever statement comes next; if it isn't
439 true, the interpreter ignores the next statement.  In this example, the
440 interpreter is testing whether the ``nest`` object is "in" or "on" (which
441 we now know means "is a child of") the ``branch`` object.  For most of the
442 game, that condition is not true, and so the interpreter ignores the
443 following statement.  Eventually, when the condition becomes true, the
444 interpreter executes that statement: it performs an assignment::
445
446     deadflag = 2;
447
448 which changes the value of the library variable ``deadflag`` from its
449 current value to 2.  Incidentally, if statements are often written on two
450 lines, with the "controlled" statement indented.  This makes it easier to
451 read, but doesn't change the way that it works::
452
453     if (nest in branch)
454         deadflag = 2;
455
456 The thing that's being controlled by the ``if`` statement doesn't have to
457 be an assignment; it can be any kind of statement.  In fact, you can have
458 lots of statements, not just one, controlled by an ``if`` statement.  We'll
459 talk about these other possibilities later.  For now, just remember that
460 the only place where you'll find statements are within standalone routines
461 and embedded routines.
462
463 .. rubric:: Standalone routines
464
465 A **standalone routine** is a series of statements, collected together and
466 given a name.  When the routine is "called" -- by its given name -- those
467 statements are executed.  Here's the one that we've defined::
468
469     [ Initialise; location = before_cottage; ];
470
471 Because it's such a tiny routine, we placed it all on a single line.  Let's
472 rewrite it to use several lines (as with the ``if`` statement, this improves
473 the readability, but doesn't affect how it works)::
474
475     [ Initialise;
476         location = before_cottage;
477     ];
478
479 The ``[ Initialise;`` is the start of the routine, and defines the name by
480 which it can be "called".  The ``];`` is the end of the routine.  In
481 between are the statements -- sometimes known as the body of the routine --
482 which are executed when the routine is called.  And how is that done?  By a
483 statement like this::
484
485     Initialise();
486
487 That single statement, the routine's name followed by opening and closing
488 parentheses, is all that it takes to call a routine.  When it comes across
489 a line like this, the interpreter executes the statements -- in this
490 example there's only one, but there may be ten, twenty, even a hundred of
491 them -- in the body of the routine.  Having done that, the interpreter
492 resumes what it was doing, on the line following the ``Initialise();``
493 call.
494
495 .. note::
496
497    You may have noticed that, although we've defined a routine named
498    ``Initialise``, we've never actually called it.  Don't worry -- the
499    routine is called, by the Inform library, right at the start of a game.
500
501 .. rubric:: Embedded routines
502
503 An **embedded routine** is much like a standalone routine, though it
504 doesn't have a name and doesn't end in a semicolon.  This is the one that
505 we defined::
506
507      [; if (nest in branch) deadflag = 2; ]
508
509 except that we didn't write it in isolation like that: instead, we defined
510 it to be the value of an object property::
511
512      each_turn [; if (nest in branch) deadflag = 2; ],
513
514 which would have worked just the same if we'd written it like this::
515
516      each_turn [;
517          if (nest in branch)
518              deadflag = 2;
519      ],
520
521 All embedded routines are defined in this manner: as the value of an object
522 property.  That's where they're embedded -- inside an object.  The
523 introductory characters ``[;`` maybe look a little odd, but it's really
524 only the same syntax as for a standalone routine, only without a name
525 between the ``[`` and ``;``.
526
527 For calling an embedded routine, thus causing the statements it contains to
528 be executed, the method that we described for a standalone routine won't
529 work.  An embedded routine has no name, and needs none; it's
530 *automatically* called by the library at appropriate moments, which are
531 determined by the role of the property for which it is the value.  In our
532 example, that's at the end of every turn in which the player character is
533 in the same room as the branch.  Later, we'll see other examples of
534 embedded routines, each designed to perform a task which is appropriate for
535 the property whose value it is; we'll also see that it is possible to call
536 an embedded routine yourself, using an ``obj_id.property()`` syntax -- in
537 this example, we could call the routine by writing ``branch.each_turn()``.
538 There's more about these topics in "Routines and arguments" on page 67, "A
539 diversion: working with routines" on page 104 and in "Routines" on
540 page 179.
541
542 That ends our review of the ground covered in our first game.  We'll have
543 more to say about most of this later, but we're trying not to overload you
544 with facts at this early stage.  What we'd like you to do is to look back
545 at the source of the game, and ensure that you can recognise all the
546 elements which this chapter has described.  Then, we'll move on to fix a
547 few of the game's more important defects.