From 472c703fd201355f2d1f28ce848b9e0a54959b58 Mon Sep 17 00:00:00 2001 From: David Griffith Date: Thu, 21 Apr 2016 19:37:07 -0700 Subject: [PATCH] Added chapter 15. --- chapters/15.rst | 365 ++++++++++++++++++++++++++++++++++++++++++++ images/includes.png | Bin 0 -> 5495 bytes images/picA.png | Bin 0 -> 3891 bytes 3 files changed, 365 insertions(+) create mode 100644 chapters/15.rst create mode 100644 images/includes.png create mode 100644 images/picA.png diff --git a/chapters/15.rst b/chapters/15.rst new file mode 100644 index 0000000..c46931c --- /dev/null +++ b/chapters/15.rst @@ -0,0 +1,365 @@ +=================== +Compiling your game +=================== + +.. only:: html + + .. image:: /images/picA.png + :align: left + +.. raw:: latex + + \dropcap{a} + +lmost as rarely as an alchemist producing gold from base metal, the +compilation process turns your source file into a story file (though the +more usual outcome is a reproachful explanation of why -- *again* -- +that hasn't happened). The magic is performed by the compiler program, +which takes your more or less comprehensible code and translates it into +a binary file: a collection of numbers following a specific format +understood only by Z-code interpreters. + +On the surface, compilation is a very simple trick. You just run the +compiler program, indicating which is the source file from which you +wish to generate a game and presto! The magic is done. + +However, the ingredients for the spell must be carefully prepared. The +compiler "reads" your source code, but not as flexibly as a human would. +It needs the syntax to follow some very precise rules, or it will +complain that it cannot do its job under these conditions. The compiler +cares little for meaning, and a lot about orthography, like a most +inflexible teacher; no moist Bambi eyes are going to save you here. + +Although the spell made by the compiler is always the same one, you can +indicate up to a point how you want the magic to happen. There are a few +options to affect the process of compilation; some you define in the +source code, some with ``switches`` and certain commands when you run +the program. The compiler will work with some default options if you +don’t define any, but you may change these if you need to. Many of these +options are provided "just in case" special conditions apply; others are +meant for use of experienced designers with advanced and complex +requirements, and are best left (for now) to those proficient in the +lore. + +Ingredients +=========== + +If the source file is not written correctly the compiler will protest, +issuing either a *warning* message or an *error* message. Warnings are +there to tell you that there may be a mistake that could affect the +behaviour of the game at run-time; that won't stop the compiler from +finishing the process and producing a story file. Errors, on the other +hand, reflect mistakes that make it impossible for the compiler to +output such a file. Of these, *fatal* errors stop compilation +immediately, while *non-fatal* errors allow the compiler to continue +reading the source file. (As you’ll see in a minute, this is perhaps a +mixed blessing: while it can be useful to have the compiler tell you +about as many non-fatal errors as it can, you'll often find that many of +them are caused by the one simple slip-up.) + +.. rubric:: Fatal errors + +It's difficult – but not impossible – to cause a fatal error. If you +indicate the wrong +file name as source file, the compiler won’t even be able to start, +telling you: + + :samp:`Couldn't open source file {filename}` + +If the compiler detects a large number of non-fatal errors, it may +abandon the whole process with: + + :samp:`Too many errors: giving up` + +Otherwise, fatal errors most commonly occur when the compiler runs out +of memory or disk space; with today's computers, that's pretty unusual. +However, you may hit problems if the story file, which must fit within +the fairly limited resources specified by the Z-machine, becomes too +large. Normally, Inform compiles your source code into a Version 5 file +(that’s what the ``.z5`` extension you see in the output file +indicates), with a maximum size of 256 Kbytes. If your game is larger +than this, you’ll have to compile into Version 8 file (``.z8``), which +can grow up to 512 Kbytes (and you do this very simply by setting the +``-v8`` switch; more on that in a minute). It takes a surprising amount +of code to exceed these limits; you won’t have to worry about game size +for the next few months, if ever. + + +.. rubric:: Non-fatal errors + +Non-fatal errors are much more common. You'll learn to be friends with: + + :samp:`Expected {something} but found {something else}` + +This is the standard way of reporting a punctuation or syntax mistake. +If you type a comma instead of a semicolon, Inform will be looking for +something in vain. The good news is that you are pointed to the +offending line of code: + +.. code-block:: transcript + + Tell.inf(76): Error: Expected directive, '[' or class name but found found_in + > found_in + Compiled with 1 error (no output) + +You see the line number (76) and what was found there, so you run to the +source file and take a look; any decent editor will display numbers +alongside your lines if you wish, and will usually let you jump to a +given line number. In this case, the error was caused by a semicolon +after the description string, instead of a comma: + +.. code-block:: inform6 + + Prop "assorted stalls" + with name 'assorted' 'stalls', + description "Food, clothing, mountain gear; the usual stuff."; + found_in street below_square, + pluralname; + +Here's a rather misleading message which maybe suggests that things in +our source file are in the wrong order, or that some expected +punctuation is missing: + +.. code-block:: transcript + + Fate.inf(459): Error: Expected name for new object or its textual short name + but found door + > Object door + Compiled with 1 error (no output) + +In fact, there's nothing wrong with the ordering or punctuation. The +problem is actually that we've tried to define a new object with an +internal ID of ``door`` -- reasonably enough, you might think, since the +object *is* a door -- but Inform already knows the word (it's the name +of a library attribute). Unfortunately, the error message provides only +the vaguest hint that you just need to choose another name: we used +``toilet_door`` instead. + +Once the compiler is off track and can't find what was expected, it's +common for the following lines to be misinterpreted, even if there's +nothing wrong with them. Imagine a metronome ticking away in time with a +playing record. If the record has a scratch and the stylus jumps, it may +seem that the rest of the song is out of sync, when it's merely a bit +"displaced" because of that single incident. This also happens with +Inform, which at times will give you an enormous list of things Expected +but not Found. The rule here is: correct the first mistake on the list +and recompile. It may be that the rest of the song was perfect. + +It would be pointless for us to provide a comprehensive list of errors, +because mistakes are numerous and, anyhow, the explanatory text usually +indicates what was amiss. You'll get errors if you forget a comma or a +semicolon. You'll get errors if your quotes or brackets don't pair up +properly. You'll get errors if you use the same name for two things. +You'll get errors -- for many reasons. Just read the message, go to the +line it mentions (and maybe check those just before and after it as +well), and make whatever seems a sensible correction. + +.. rubric:: Warnings + +Warnings are not immediately catastrophic, but you should get rid of +them to ensure a good start at finding run-time mistakes (see "Debugging +your game" on page 197). You may declare a variable and then not use it; +you may mistake assignment and arithmetic operators (``=`` instead of +``==``); you may forget the comma that separates properties, etc. For +all these and many other warnings, Inform has found something which is +legal but doubtful. + +One common incident is to return in the middle of a statement block, +before the rest of statements can be reached. This is not always as +evident as it looks, for instance in a case like this: + +.. code-block:: inform6 + + if (steel_door has open) { + print_ret "The breeze blows out your lit match."; + give match ~light; + } + +In the above example, the ``print_ret`` statement returns true after the +string has been printed, and the ``give match ~light`` line will never +happen. Inform detects the fault and warns you. Probably the designer's +intention was: + + +Compiling *à la carte* +====================== + + +One of the advantages of Inform is its portability between different +systems and machines. Specific usage of the compiler varies accordingly, +but some features should be in all environments. To obtain precise +information about any particular version, run the compiler with the +``-h1`` switch -- see "Switches" on page 193. + +Often the compiler is run with the name of your source file as its only +parameter. This tells the compiler to "read this file using Strict mode +and from it generate a Version 5 story file of the same name". The +source file is mostly full of statements which define how the game is to +behave at run-time, but will also include compile-time instructions +directed at the compiler itself (although such an instruction looks a +lot like a **statement**, it's actually quite different in what it does, +and is known as a **directive**). We have already seen the ``Include`` +directive: + + :samp:`Include "{filename}";` + +When the compiler reaches a line like this, it looks for +:samp:`{filename}` -- another file also containing Inform code -- and +processes it as if the statements and directives included in +:samp:`{filename}` were in that precise spot where the ``Include`` +directive is. + +.. image:: /images/includes.png + +In every Inform game we Include the library files ``Parser``, +``VerbLib`` and ``Grammar``, but we may Include other files. For +example, this is the way to incorporate library extensions contributed +by other people, as you saw when we incorporated ``pname.h`` into our +"Captain Fate" game. + +.. note:: + + on some machines, a library file is actually called -- for example -- + ``Parser.h``, on others just ``Parser``. The compiler automatically + deals with such differences; you can *always* type simply ``Include + "Parser";`` in your source file. + +As you grow experienced in Inform, and your games become more complex, +you may find that the source file becomes unmanageably large. One useful +technique is then to divide it into a number of sections, each stored in +a separate file, which you Include into a short master game file. For +example: + +.. code-block:: inform6 + + !============================================================================ + Constant Story "War and Peace"; + Constant Headline + "^An extended Inform example + ^by me and Leo Tolstoy.^"; + + Include "Parser"; + Include "VerbLib"; + + Include "1805"; + Include "1806-11"; + Include "1812A"; + Include "1812B"; + Include "1813-20"; + + Include "Grammar"; + + Include "Verbski"; + + !============================================================================ + + +Switches +======== + +When you run the compiler you can set some optional controls; these are +called *switches* because most of them are either on or off (although a +few accept a numeric value 0–9). Switches affect compilation in a +variety of ways, often just by changing the information displayed by the +compiler when it’s running. A typical command line (although this may +vary between machines) would be: + + :samp:`inform {source_file story_file switches}` + +where "``inform``" is the name of the compiler, the +:samp:`{story_file}` is optional (so that you can specify a different +name from the +:samp:`{source_file}`) and the switches are also optional. Note that +switches must be preceded by a hyphen ``-``; if you want to set, for +instance, Strict mode, you'd write ``-S`` , while if you want to +deactivate it, you’d write ``-~S``. The tilde sign can, as elsewhere, be +understood as "not". If you wish to set many switches, just write them +one after another separated by spaces and each with its own hyphen, or +merge them with one hyphen and no spaces: + + :samp:`inform MyGame.inf -S -s -X` + + :samp:`inform MyGame.inf -Ssx` + +Although there's nothing wrong with this method, it isn't awfully +convenient should you need to change the switch settings. A more +flexible method is to define the switches at the very start of your +source file, again in either format: + + :samp:`!% -S -s -X` + + :samp:`!% -Ssx` + +Normally, all switches are off by default, except Strict mode (``-S``), +which is on and checks the code for additional mistakes. It's well worth +adding Debug mode (``-D``), thus making the debugging verbs available at +run time. This is the ideal setting while coding, but you should turn +Debug mode off (just remove the ``-D``) when you release your game to +the public. This is fortunately very easy to check, since the game +banner ends with the letter "D" if the game was compiled in Debug mode: + +.. code-block:: inform6 + + Captain Fate + A simple Inform example + by Roger Firth and Sonja Kesserich. + Release 3 / Serial number 040804 / Inform v6.30 Library 6/11 SD + +Switches are case sensitive, so you get different effects from ``-x`` +and ``-X``. Some of the more useful switches are: + +:samp:`-~S` + + Set compiler Strict mode off. This deactivates some additional error + checking features when it reads your source file. Strict mode is on by + default. + +:samp:`-v5 -v8` + + Compile to this version of story file. Versions 5 (on by default) and + 8 are the only ones you should ever care about; they produce, + respectively, story files with the extensions .z5 and .z8 . Version 5 + was the Advanced Infocom design, and is the default produced by + Inform. This is the version you'll normally be using, which allows + file sizes up to 256 Kbytes. If your game grows beyond that size, + you'll need to compile to the Version 8 story file, which is very + similar to Version 5 but allows a 512 Kbytes file size. + +:samp:`-D -X` + + Include respectively the debugging verbs and the Infix debugger in the + story file (see "Debugging your game" on page 197). + +:samp:`-h1 -h2` + + Display help information about the compiler. ``-h1`` produces + information about file naming, and ``-h2`` about the available + switches. + +:samp:`-n -j` + + ``-n`` displays the number of declared attributes, properties and + actions. ``-j`` lists objects as they are being read and constructed + in the story file. + +:samp:`-s` + + Offer game statistics. This provides a lot of information about your + game, including the number of objects, verbs, dictionary entries, + memory usage, etc., while at the same time indicating the maximum + allowed for each entry. This can be useful to check whether you are + nearing the limits of Inform. + +:samp:`-r` + + Record all the text of the game into a temporary file, useful to check + all your descriptions and messages by running them through a spelling + checker. + +If you run the compiler with the ``-h2`` switch, you’ll find that there +are many more switches than these, offering mostly advanced or obscure +features which we consider to be of little interest to beginners. +However, feel free to try whatever switches catch your eye; nothing you +try here will affect your source file, which is strictly read-only as +far as the compiler is concerned. + diff --git a/images/includes.png b/images/includes.png new file mode 100644 index 0000000000000000000000000000000000000000..b6b9a7e3ae8b0a156b7ec417978383c5850e40c3 GIT binary patch literal 5495 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 literal 0 HcmV?d00001 diff --git a/images/picA.png b/images/picA.png new file mode 100644 index 0000000000000000000000000000000000000000..9e914259683c314123bb844ff15ebdca719fc92e GIT binary patch literal 3891 zcmV-356tk1P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 zVoOIv0063uBQgL000(qQO+^Rb1P}-%5%XE$&;S4qJ4r-ARA}DiS}PQ-xDJi1tgNj> zR$?oWNNgn%iLFE;YmrDK7Kub+kw_#jX(@;Ex${12)|kg#v+g|yPIr^+>?CF2{HHGX z|3ligA774k|9g>^LQ8=B>-&}e`0{^3ng?rL=W2kYss&7+_cH+K{syEY2fBCyAnN_x zzWIYl&s!O*p#T0wCcynfYT>@VqmC}RudkSN z0P5S)9sXp~;+Ij~QFBiIeNU(2g(SZ`rGW9TFMIftO%r*hESpRXiI|9iPuFtHv;jot(D}#q5?R@hXHu!2ilkNj45b^^F7ZHiZRN01wq-6yKw@hS_Z}u&FQ!;7< zP9G{v!Xl*ndLspmdP6#h1Xbg;&auv~Dbg}J4^7!3Gs5K^XT714laDldstq<6pNZ&C zHhv;)nGZEDI<=A*oc@=P#af7*6PIj6PUyp%L->W2JB4sWJ@fLByTFl1-WSp?q&so6UslOyr;K28E&L4eF;s<07*`(AZv3avWw!q zin^LyPgXvD2Pn7|I@I;sOb){Z9;P)1|Aicz9wq z-hI3!0A=VV31+aRxmD{zy1EC9M1bQAk=3yhceS**FGb|qS#oXcSr7-Gws}fxD@BB* za0c3A?oDqlP$~B}qy(N9 zbpmq>OjvMsq+FZGjEGzZ?5Dnq|$l`QPjcax?g%u;L>B-rnu*v>NY;?Zy=H<`8Hih zq2w3|KQGxUh}C1e`>!SL#K*ZIsa@E1CZ2pN{ulB$NQ7E0B*`xVFi!P5hk{8;FpgK` z^JPnZyCb`9Q1~si&tewUsU&TOko*>yC#y@M_Xlqb;?alB`5 z;=e^=YnPal6DCCA+&tdQZA5CYIB@JiuN+~(v|c>XO)fQVo=?`Z^&l~cRXtiuyXMG# zTb1dV5t5upQ#w-p#8Z8XNIfo=WS}3xDeihlf6J!yPo@Jd5gUc>;l2``J7kWXhO!|W zPbVq$IwJYzGbA7hc)Mur62XgUbVayVPnW}YtgDx1p7P~Bi`(9l9yUYyQ*}L#Dw49U zBEHQxlA~FsG)3`_xLh2F0jY*vskOgbi%4`@2$SK=dng2X**Z(z?(W;ggJ(}Icl?9e z>29xf8N=ZwkRX^hH`!He^dr%UjRnFN6BJ(OYHJrD+G+gMu;qcYm+S+nkF|63?hzW! zW6CvFG2MN-kJ#w2rW@b3yHtC4!o+6eZg5L{58M}omJ{| z6>%7&SRf->4pM;^zM_suq1I6MdggMH#17{jXD^dZ%isF?3F?p9F`PX+U5<}SY;cOQ zS$tj#EBU$k*71duFmjz_PL|k5Nc7Xe4NVt2X#;alq*KOzBDS*`3Ajs0Wf;fgPG(2d zM=+Er>k|_mkNZjqqcogxY*(mP;X!K_DBefwD)x(8%#QWsL&rmxu<=3;PElVclkuQr z-UCu-8ahMGt(ck8l%#E-q*v}D`or#Wihl2nOdB?2uQ@B zMApsOqxBsyK|NR!Y^}~^>p}8q-rtboL>p&pe%Q(?ve05T(wM&TUzZYz-JRuyo~6=TsY*%+7UZHYFTyP8oI$ z3CC6{&3+xyG{Dw(MMu)5K3{MNXY&pycTH7jV$J^QVGVN4B%$8omU3VJ`a+!x)BFbz zHlg*0Q5JMfy%i=+Ys*Q{_qAzi?D}O?SOirhk}@c*$TE*8_Ew_Kvg#A3J&t0$iN0MS zR7%&_#{o7?B<9kgz?EifFfWUUg!B{(l?k+IBfpv817wOtN-v*CRkF;*T|4eFRp^>} zEJP}8g-8k$OS&Gr?e={2uxQ^>q3wz1Hnv{EPpAS@>v6)dp&2XIu7rH(U8evTx#0u-Irr5O5@At7?RXicoZ864{_}@(x7cHczi0-Poj$hrP~0; zC$r_4+QO5nw}prbOJ}G^GL?n;TKV%FV9e4U6o1OloTAI>;y{1z+uiv^F==eZ476lZ zJLQ@7wWyQg)$d_X)1JuuFw*a#=x~bT#@-HhhZE)Pz&Ne7Zt%H_=&?+3V}braRga@h zNX;eGVIqq8#D_C8@kBIs+^Ltf@`GXD{qTJ+Y?-SHmrb;XZ*ljay*RB)RcMU~2 zFu9OWPiHhjT#h0gX2F%s^B8nLkG*YDIiD?eqr{#rGUX~$5@%2h4U_fSPTY6j2{~{k;I)7s%Qq%EEs+L+FPhBRSh`m7iKNiF1D*BosER5!J*k7 z>g)r|K8}w^#mssh6)Tad_<&`$)vuGXi|G6;SzU6gS9@krFwiP#Z>{nUdRk|Sg`N1 zI}3E5(_H~~cXl5%FvWT{v8}Y}T}hc^`*q^Qx)g3Y6F124x0e7FZGOujQ}d>#9jl65 zIN26OF;@9%K#>?=w#jR#a8;P3bnd4$xwnn)LO4 zEsi*9hZ-NM=1&^CX!bTZ%n;Ynr0OSvQhAQ&n1fn-tad z7$(Xk#^LKt&88v6K(%SfYhwpd6$ZQTyspZdIZ-EEJtWOo-bbhgJBrRD;kZb8;<iy7*@ zDWGHZRW;m=RQk!R43GZ0I)$UZfqGHtVR28*nfc?ft9`mBM0MiO6+R?T`Q!vTN%Pa` z>FX3hD0q8|^?prUj*}{P?058bj6>d0e4;qtXH0`F20Lip$uk-7l7t(&y5JMaSBJqwPd8A~yfpC!BPzEF2SbHMXT) zKhY?&PMxjuq|O<3+qj>hI|T;**nE6E`_?ViL(-X?-yfi)bJ&SmhB{ZaB(GH~76eW& zjn;E(UFW(SGE