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