5P9i0s8y19Z 5P9i0s8y19Z id=1 nft=01;80000008;000B;00;Book Antiqua dt=RTF Hugo v2.5 0 {\rtf1\ansi\deff0\deftab850{\fonttbl{\f0\fnil\fcharset0 arial;}{\f1\fnil\fcharset0 Book Antiqua;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard{\tqc\tx4680 \qc\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs28\cf0\b Hugo v2.5\par {\brdrb\brdrs\brdrw20\brsp20\qc\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs28\cf0\i An Interactive Fiction Design System\par }}\qc\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qc\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par {\tqc\tx4680 \qc\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b PROGRAMMING MANUAL\par }\qc\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qc\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par {\tqc\tx4680 \qc\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 Copyright \'a9 1995-2000 by Kent Tessman\par \qc\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs20\cf0 TreePad transcription by Mike Arnaud \par \qc\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qc\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qc\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qc\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qc\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qc\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs20\cf0\i Revised February 2000\par \qc\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs20\cf0\i }} } 5P9i0s8y19Z id=2 nft=02;80000008;000A;00;Times New Roman dt=RTF I. INTRODUCTION 1 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 Book Antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0\b I.\tab INTRODUCTION\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Hugo is a system for designing, programming, and running sophisticated interactive fiction, or text \plain\f0\fs24\cf0 adventures. It is the result of an attempt to further extend the concepts developed in earlier, similar \plain\f0\fs24\cf0 systems in order to make interactive fiction programming less cryptic and more accessible to \plain\f0\fs24\cf0 designers. Hugo owes much to the original Infocom format (particularly with regard to its internal \plain\f0\fs24\cf0 data tables) as well as to Graham Nelson's publicly distributed Inform compiler (and its syntactic \plain\f0\fs24\cf0 interpretation of the Infocom format and straightforward grammar definition).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \ql\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The best advice to be given for learning Hugo is probably to print or otherwise have handy the source \plain\f0\fs24\cf0 listing of \plain\f1\fs24\cf0 SAMPLE.HUG\plain\f0\fs24\cf0 , and to refer to it throughout; examples of almost all of Hugo's features may \plain\f0\fs24\cf0 be found in the source of the sample game.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Author e-mail (The General Coffee Company Film Productions):\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \tab \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Hugo Home Page:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \tab http://www.generalcoffee.com\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i (As of this revision)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i }} } 5P9i0s8y19Z id=3 dt=RTF I.a. Legal Notes 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 Book Antiqua;}{\f1\fnil\fcharset2 symbol;}{\f2\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 I.a.\tab Legal Notes\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Programs created using the Hugo Compiler are the property of the individual author. The library \plain\f0\fs24\cf0 files are copyright by Kent Tessman, as is the Hugo Engine. The use of the Hugo library files and the \plain\f0\fs24\cf0 distribution of the Hugo Engine are authorized so long as all transactions are non-commercial and \plain\f0\fs24\cf0 free of charge (except in cases where any charge is to cover the cost of distribution), and that the \plain\f0\fs24\cf0 library files and engine are not distributed in a modified form.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 For those interested in the commercial distribution of a program created with the Hugo Compiler, \plain\f0\fs24\cf0 please contact Kent Tessman for permission.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: Since the Hugo Compiler and Engine are provided free of charge, there is no warranty for \plain\f0\fs24\cf0 their use.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=4 dt=RTF I.b. (Less Legal Notes) 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 Book Antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 I.b.\tab (Less Legal Notes)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 This supplementary, less-official section is meant to clarify my intentions as to legal usage of \plain\f0\fs24\cf0 Hugo, and what it means for users who may want to distribute their games. First off, let me say \plain\f0\fs24\cf0 that, I do want to be able to maintain some discretion over what is done with Hugo, and the above \plain\f0\fs24\cf0 phrasing is intended to reserve me that ability. Hugo is more than "just" a compiler-it's a complete \plain\f0\fs24\cf0 design and runtime environment, so distribution may involve more than just a simple \plain\f1\fs24\cf0 .HEX\plain\f0\fs24\cf0 file \plain\f0\fs24\cf0 (which, even though a large part of it may be the Hugo Library, isn't really a cause for concern on \plain\f0\fs24\cf0 my part).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Here's a quick informal overview of how I see the various types of distribution:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 1. \plain\f0\fs24\cf0\i Freeware.\plain\f0\fs24\cf0 I don't really have any concerns, even if the Hugo Engine is being distributed as part \plain\f0\fs24\cf0 of a free package. (Although it might be nice to know about this, just so far as wanting to help \plain\f0\fs24\cf0 ensure that proper instructions, updated information, etc. were included.) As far as using the \plain\f0\fs24\cf0 Hugo Library goes: I wrote it for this express purpose, so that people would use it in making their \plain\f0\fs24\cf0 own games. Freeware distribution is certainly something I fully encourage.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 2. \plain\f0\fs24\cf0\i Shareware.\plain\f0\fs24\cf0 Again, I don't think this really concerns me, either. (Although, again, I would like to \plain\f0\fs24\cf0 be aware of shareware distribution. My only real objection would be to something that is entirely \plain\f0\fs24\cf0 reprehensible-I probably don't need to go into details. In that case, I'd probably tell you to write \plain\f0\fs24\cf0 your own damned library and interpreter.) The shareware market for IF is unfortunately minor, \plain\f0\fs24\cf0 but writing a good game takes a lot of talent and hard work-and if Hugo authors wanted to try to \plain\f0\fs24\cf0 generate some shareware revenues, I would wish them luck.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 3. \plain\f0\fs24\cf0\i Commercial software.\plain\f0\fs24\cf0 This is about the only sticking point I can think of, and it's not much of one. \plain\f0\fs24\cf0 It's unfortunately pretty unlikely that someone could market a wildly successful piece of \plain\f0\fs24\cf0 commercial Interactive Fiction. On the other hand, I do believe that Hugo is capable of creating \plain\f0\fs24\cf0 some pretty eye- (and ear-) catching games. And on the other other hand, especially with \plain\f0\fs24\cf0 commercial software, what you'd be distributing would likely be more than half written by other \plain\f0\fs24\cf0 people (i.e., me, the library contributors, and any porter(s)). But even in a case like this, I would \plain\f0\fs24\cf0 expect any individual license to give the author the freedom to sell \plain\f0\fs24\cf0\i n\plain\f0\fs24\cf0 copies of the game without \plain\f0\fs24\cf0 involving me or anyone else in any (however minor) participation.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=5 dt=RTF I.c. Names and Acknowledgments 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 Book Antiqua;}{\f1\fnil\fcharset2 symbol;}{\f2\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 I.c.\tab Names and Acknowledgments\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Those who have taken upon themselves the (sometimes trying, I'm sure) task of porting Hugo to \plain\f0\fs24\cf0 various platforms-aside from the author's own 16-bit DOS, 32-bit DOS, Windows, and BeOS \plain\f0\fs24\cf0 ports-are:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li862\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Julian Arnold\tab \tab Acorn/RiscOS\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Gerald Bostock\tab \tab OS/2\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab David Kinder\tab \tab Amiga\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Bill Lash\tab \tab Original Unix/Linux port\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Andrew Plotkin\tab Macintosh (using Glk)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Colin Turnbull\tab \tab Original Acorn Archimedes\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The author is considerably indebted to them, for all their work as well as for their input on how to \plain\f0\fs24\cf0 improve the compiler and engine by way of criticisms both generous and deservedly direct.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 More than a few words of appreciation must be given to Volker Blasius who (now with help from \plain\f0\fs24\cf0 David Kinder) has had the substantial responsibility of maintaining the Interactive Fiction Archive \plain\f0\fs24\cf0 at \plain\f0\fs24\cf0\i ftp://ftp.gmd.de\plain\f0\fs24\cf0 -one of the key resources for Hugo programmers and a primary hub of material for \plain\f0\fs24\cf0 contributors to (and readers of) the newsgroups \plain\f0\fs24\cf0\i rec.arts.int-fiction\plain\f0\fs24\cf0 and \plain\f0\fs24\cf0\i rec.games.int-fiction\plain\f0\fs24\cf0 .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Thanks also to those whose comments and suggestions have contributed to making Hugo as useful \plain\f0\fs24\cf0 and usable as it is: Dr. Jeff Jenness, Vikram Ravindran, Jesse McGrew, Paolo Vece, Daniel \plain\f0\fs24\cf0 Cardenas, Cam Bowes, Mark Bijster, Jose Luis Cebrian, John Menichelli, Jerome Nichols, Jason \plain\f0\fs24\cf0 Dyer, Jason Brown, Gunther Schmidl, and Giacomo Pini. Acknowledgment and thanks are also \plain\f0\fs24\cf0 due Graham Nelson, whose Inform language helped give shape to Hugo's early syntax and \plain\f0\fs24\cf0 structure.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Special thanks to Julian Arnold and Jim Newland, members of the ad hoc Hugo What-If? \plain\f0\fs24\cf0 Committee. They've both made numerous valuable contributions to Hugo both in terms of \plain\f0\fs24\cf0 suggestions for the language itself and for user library improvements and extensions-to be more \plain\f0\fs24\cf0 specific would surely be to overlook something invaluable.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Finally, my brother Dean Tessman has been a well-used resource with his willingness to test-drive \plain\f0\fs24\cf0 multi-100K e-mail attachments of executables and to engage in ongoing back-and-forth discussions \plain\f0\fs24\cf0 on programming minutiae.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=6 dt=RTF I.d. Packing List 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 Book Antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 .d.\tab Packing List\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 A number of files are part of the basic Hugo package:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i (NOTE: Throughout this manual, the default naming convention is for MS-DOS/Windows. As Hugo \plain\f0\fs24\cf0\i becomes available for other systems, file naming conventions may vary, and any machine-specific \plain\f0\fs24\cf0\i documentation should document those variations.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 HC.EXE\plain\f0\fs24\cf0 \tab \tab Hugo Compiler\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 HE.EXE\plain\f0\fs24\cf0 \tab \tab Hugo Engine\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 HD.EXE\plain\f0\fs24\cf0 \tab \tab Hugo Debugger\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 HDHELP.HLP\tab \plain\f0\fs24\cf0 \tab Debugger help file\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 HUGOLIB.H\tab \plain\f0\fs24\cf0 \tab Library definitions and routines\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 VERBLIB.H\tab \tab \plain\f0\fs24\cf0 Standard verb routines\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 VERBLIB.G\plain\f0\fs24\cf0 \tab \tab Standard verb grammar definitions\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 OBJLIB.H\plain\f0\fs24\cf0 \tab \tab A library of useful object definitions\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab (included by \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 )\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 SAMPLE.HUG\plain\f0\fs24\cf0 \tab \tab Sample game source code\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 SHELL.HUG\plain\f0\fs24\cf0 \tab \tab Source code to build on\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 And two sets of files that, depending on user-specified settings, are optionally included by \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 VERBLIB.H\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 VERBLIB.G\plain\f0\fs24\cf0 :\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 HUGOFIX.H\tab \plain\f0\fs24\cf0 \tab Debugging routines\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 HUGOFIX.G\tab \plain\f0\fs24\cf0 \tab Debugging grammar\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 VERBSTUB.H\plain\f0\fs24\cf0 \tab \tab Additional verb routines\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 VERBSTUB.G\plain\f0\fs24\cf0 \tab \tab Additional verb grammar\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 An additional Hugo source file demonstrates the ability to create precompiled headers:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 HUGOLIB.HUG\plain\f0\fs24\cf0 \tab \tab To create a linkable version of \plain\f1\fs24\cf0 HUGOLIB.H\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The latest release of Hugo is available through anonymous FTP from \plain\f0\fs24\cf0\i ftp.gmd.de\plain\f0\fs24\cf0 in \plain\f1\fs24\cf0 if-archive/programming/hugo\plain\f0\fs24\cf0 . Distribution of any of the Hugo files is authorized only \plain\f0\fs24\cf0 with permission of the author as per \plain\f0\fs24\cf0\i Legal Notes\plain\f0\fs24\cf0 , above.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The \plain\f1\fs24\cf0 .HUG\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 .H\plain\f0\fs24\cf0 , and \plain\f1\fs24\cf0 .G\plain\f0\fs24\cf0 files are text files and must be downloaded as such; the executables are \plain\f0\fs24\cf0 binary files.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i (FORMATTING NOTE: The above files are properly formatted for a standard tab stop of 8 spaces; if the \plain\f0\fs24\cf0\i formatting appears incorrect, adjust the tab size on your editor.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=7 dt=RTF I.e. Manual Conventions 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 Book Antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 I.e.\tab Manual Conventions\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The following conventions are used in this manual:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 \tab \tab for required parameters\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 [parameter]\plain\f0\fs24\cf0 \tab \tab for optional parameters\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 FILE\plain\f0\fs24\cf0 \tab \tab \tab for specific filenames\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 FunctionName\plain\f0\fs24\cf0 \tab functions, etc.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 'token'\plain\f0\fs24\cf0 \tab \tab tokens, keywords\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ...\plain\f0\fs24\cf0 \tab \tab \tab for omissions\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=8 dt=RTF I.f. Getting Started 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 Book Antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 I.f.\tab Getting Started\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Type\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 hc\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 without any parameters to get a full listing of available compiler options and specifications.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The MS-DOS syntax for running the compiler is\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab hc [-switches] \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 It is not necessary to specify any switches, the name of the objectfile, or the sourcefile extension. \plain\f0\fs24\cf0 The bare-bones version of the compiler invocation is\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab hc \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 With no other parameters explicitly described, the compiler assumes an extension of \plain\f1\fs24\cf0 .HUG\plain\f0\fs24\cf0 . The \plain\f0\fs24\cf0 default object filename is \plain\f1\fs24\cf0 .HEX\plain\f0\fs24\cf0 .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Here's how to compile the sample game. With the compiler executable, library files, and sample \plain\f0\fs24\cf0 game source code all in the current directory, type\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab hc -ls sample.hug\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 or simply\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab hc -ls sample\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and after a few seconds (or more, or less, depending on your processor and configuration) a \plain\f0\fs24\cf0 screenful of statistical information will appear following the completed compilation (because of the \plain\f0\fs24\cf0 -s switch).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The new file \plain\f1\fs24\cf0 SAMPLE.HEX\plain\f0\fs24\cf0 will have appeared in current directory. As well, the -l switch wrote all \plain\f0\fs24\cf0 compile-time output (which would have included errors, had there been any) to the file \plain\f1\fs24\cf0 SAMPLE.LST\plain\f0\fs24\cf0 .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=9 dt=RTF I.g. Compiler Switches 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 Book Antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'02\'04);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'05);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'06);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'07);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'08);}{\levelnumbers\'01;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 I.g.\tab Compiler Switches\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 A number of switches may be selected via the invocation line. The available options are:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab -a\tab Abort compilation on any error\par \ql\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \plain\f0\fs24\cf0 -d\plain\f1\fs24\cf0 \tab compile as an .HDX debuggable executable\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab -e\tab Expanded error format\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab -f\tab Full object summaries\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab -h\tab compile in \plain\f1\fs24\cf0 .HLB\plain\f0\fs24\cf0 precompiled Header format\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab -i\tab display debugging Information\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab -l\tab print Listing to disk as \plain\f1\fs24\cf0 .LST\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab -o\tab display Object tree\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab -p\tab send output to standard Printer\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab -s\tab print compilation Statistics\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab -t\tab Text to listfile for spellchecking\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab -u\tab show memory Usage for objectfile\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab -v\tab Verbose compilation\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab -x\tab ignore switches in source code\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Most Hugo programming will probably make use of the -l switch in order to record compile-time \plain\f0\fs24\cf0 errors.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The -z switch may, on some configurations, increase compilation speed by inhibiting normal \plain\f0\fs24\cf0 messaging (i.e., "Compiling...lines of..." and "...percent complete").\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=10 dt=RTF I.h. Limit Settings 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 Book Antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'02\'04);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'05);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'06);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'07);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'08);}{\levelnumbers\'01;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 I.h.\tab Limit Settings\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Also included on the invocation line, after any switches and before the sourcefile, may be one or more \plain\f0\fs24\cf0 limit settings. These settings are for memory management, and limit the number of certain types of \plain\f0\fs24\cf0 program elements, such as objects and dictionary entries.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To list the settings, type:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab hc $list\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To change a non-static limit, type:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab hc $= ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 For example, to compile the sample game with the maximum number of dictionary entries doubled \plain\f0\fs24\cf0 from the default limit of 1024, and with the -l and -s switches set,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab hc -ls $MAXDICT=2048 sample\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 If a compile-time error is generated indicating that too many symbols of a particular type have been \plain\f0\fs24\cf0 declared, it is probably possible to overcome this simply by recompiling with a higher limit for that \plain\f0\fs24\cf0 setting specified in the invocation line.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 See \plain\f0\fs24\cf0{\field{\*\fldinst { HYPERLINK "idnode://75"}}{\fldrslt{\i Appendix C\plain\f0\fs24\cf0}}}\i \plain\f0\fs24\cf0 for a complete listing of valid limit settings.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=11 dt=RTF I.i. Directories 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 Book Antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 I.i.\tab Directories\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 It is possible to specify where the Hugo Compiler will look for different types of files. This can be \plain\f0\fs24\cf0 done in the command line via:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab hc @=\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 For example, to specify that the source files are to be taken from the directory \plain\f1\fs24\cf0 C:\\HUGO\\SOURCE\plain\f0\fs24\cf0 , \plain\f0\fs24\cf0 invoke the compiler with\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab hc @source=c:\\hugo\\source \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Valid directories are:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 source\tab \tab \plain\f0\fs24\cf0 Source files\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 object\tab \tab \plain\f0\fs24\cf0 Where the new \plain\f1\fs24\cf0 .HEX\plain\f0\fs24\cf0 file will be created\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 lib\tab \plain\f0\fs24\cf0 \tab \tab Library files\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 list\tab \plain\f0\fs24\cf0 \tab \tab \plain\f1\fs24\cf0 .LST\plain\f0\fs24\cf0 files\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 resource\plain\f0\fs24\cf0 \tab \tab Resources for a "\plain\f1\fs24\cf0 resource\plain\f0\fs24\cf0 " list\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 temp\tab \plain\f0\fs24\cf0 \tab \tab Temporary compilation files (if any)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Advanced users may take advantage of the ability to set default directories using environment \plain\f0\fs24\cf0 variables. (The method for setting an environment variable may vary from operating system to \plain\f0\fs24\cf0 operating system.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The \plain\f1\fs24\cf0 HUGO_\plain\f0\fs24\cf0 environment variable may be set to the \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 directory. For example, the \plain\f0\fs24\cf0 source directory may be set with the \plain\f1\fs24\cf0 HUGO_SOURCE\plain\f0\fs24\cf0 environment variable.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Command-line-specified directories take precedence over those set in environment variables. In \plain\f0\fs24\cf0 either case, if the file is not found in the specified directory, the current directory is searched.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=13 dt=RTF I.j. The Hugo Engine 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 Book Antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 I.j.\tab The Hugo Engine\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Having compiled the sample game, run it by invoking\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab he sample\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 at the command line. Again, it is not necessary to specify the extension. The engine assumes \plain\f1\fs24\cf0 .HEX\plain\f0\fs24\cf0 if \plain\f0\fs24\cf0 none is given.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i (NOTE: The environment variable \plain\f1\fs24\cf0 HUGO_OBJECT\plain\f0\fs24\cf0\i or \plain\f1\fs24\cf0 HUGO_GAMES\plain\f0\fs24\cf0\i may hold the directory that the Hugo \plain\f0\fs24\cf0\i Engine searches for the specified \plain\f1\fs24\cf0 .HEX\plain\f0\fs24\cf0\i file. The location for save files may be specified with \plain\f1\fs24\cf0 HUGO_SAVE\plain\f0\fs24\cf0\i . All of \plain\f0\fs24\cf0\i these are optional.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=14 nft=02;80000008;000A;00;Times New Roman dt=RTF II. A FIRST LOOK AT HUGO 1 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset2 symbol;}{\f2\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0\b II.\tab A FIRST LOOK AT HUGO\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 There are a couple of basic concepts to become oriented to in order to begin working with Hugo.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 First of all, most programming in Hugo will involve the creation of what are called "objects". Quite \plain\f0\fs24\cf0 literally, these represent the "objects" or elements of the game universe: people, places, and things.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The bulk of the rest of a Hugo program is comprised of "routines". These are the sections of code \plain\f0\fs24\cf0 made up of commands or statements that facilitate the actual behavior of the program at different \plain\f0\fs24\cf0 points in the story. Routines are less frequently (although more frequently in other languages) \plain\f0\fs24\cf0 called "functions"-they may be thought of as performing an operation or series of operations, and \plain\f0\fs24\cf0 then returning some kind of value as a result.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (The idea of return values is an important one and, while sometimes puzzling to novices, is \plain\f0\fs24\cf0 actually quite uncomplicated. Often a particular function will be referred to as "returning true" or \plain\f0\fs24\cf0 "returning false"-all this means is that it returns either a non-zero value (usually 1) or a zero value, \plain\f0\fs24\cf0 almost always to indicate success or failure. A program will constantly be checking the return \plain\f0\fs24\cf0 values of a variety of routines and commands to determine if a particular operation was successful \plain\f0\fs24\cf0 in order to decide what to do next. Of course, a return value can be any integer value; a routine \plain\f0\fs24\cf0 that adds together two supplied values, a and b, may return the sum a+b.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 For those familiar with the common programming languages C and BASIC, Hugo strongly \plain\f0\fs24\cf0 resembles a hybrid of the two. Individual objects and routines-as well as conditional blocks-are \plain\f0\fs24\cf0 enclosed in braces as in C, but unlike C (and like BASIC), a semicolon is not required at the end of \plain\f0\fs24\cf0 each line, and the language itself is considerably less cryptic. Keywords, variables, routine and \plain\f0\fs24\cf0 object names, and other tokens are not case-sensitive.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The goal in designing Hugo was to make programming as intuitive to facilitate both initial \plain\f0\fs24\cf0 development and subsequent debugging.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=15 dt=RTF II.a. Hello, Sailor! 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 II.a.\tab Hello, Sailor!\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The grand tradition of programming texts has an introduction to a new programming language \plain\f0\fs24\cf0 detailing how to print the optimistic phrase "Hello, world" as an example of the particular language's \plain\f0\fs24\cf0 form and substance.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 In the equally grand tradition of interactive fiction, we'll start with the rallying cry "Hello, Sailor!". \plain\f0\fs24\cf0 Don't worry too much about the syntax below; this is meant mainly as a familiarization with what \plain\f0\fs24\cf0 Hugo looks like.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab routine main\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print "Hello, Sailor!"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab return\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The entire program consists of one routine. (Two routines are normally required for any Hugo \plain\f0\fs24\cf0 program, the other being the \plain\f1\fs24\cf0 Init\plain\f0\fs24\cf0 routine, which is omitted in this example since there isn't much \plain\f0\fs24\cf0 required in the way of initialization.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The \plain\f1\fs24\cf0 Main\plain\f0\fs24\cf0 routine is automatically called by the engine. It from here that the central behavior of any \plain\f0\fs24\cf0 Hugo program is controlled. In this case the task at hand is the printing of "Hello, Sailor!", followed \plain\f0\fs24\cf0 by an order to return from the routine (i.e., exit it) so that we don't strand the program waiting for an \plain\f0\fs24\cf0 input, which is the normal order of Hugo business.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=16 dt=RTF II.b. Data Types 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 II.b.\tab Data Types\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 All data in Hugo is represented in terms of 16-bit integers, treated as signed (-32768 to 32767) or \plain\f0\fs24\cf0 unsigned (0 to 65535) as appropriate. The name of any individual data type may contain up to 32 \plain\f0\fs24\cf0 alphanumeric characters (as well as the underscore '_').\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 All of the following are valid data types:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Integer values\tab \tab \plain\f1\fs24\cf0 0, -10, 16800, -25005\par \qj\li720\fi-720\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \tab (constant values that appear in Hugo source code as numbers)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab ASCII characters\tab \tab \plain\f1\fs24\cf0 'A', 'z', '7'\par \qj\li720\fi-720\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \tab (constant values equal to the common ASCII value for a character; i.e., 65 for '\plain\f1\fs24\cf0\i A\plain\f0\fs24\cf0\i ')\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Objects\tab \tab \tab \plain\f1\fs24\cf0 suitcase, emptyroom, player\par }\qj\li720\fi-720\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \tab (constant values representing the object number of the given object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Variables\tab \tab \tab \plain\f1\fs24\cf0 a, b, score, TEXTCOLOR\par \qj\li720\fi-720\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \tab (changeable value-holders that may be set to equal another variable or constant value)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Constants\tab \tab \tab \plain\f1\fs24\cf0 true, false, BANNER\par \qj\li720\fi-720\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \tab (constant-obviously-values that are given a name similarly to a variable, but are non-modifiable)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Dictionary entries\tab \tab \plain\f1\fs24\cf0 "a", "the", "basketball"\par \qj\li720\fi-720\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \tab (The appearance of \plain\f1\fs24\cf0 "the"\plain\f0\fs24\cf0\i in a line of code actually refers to the location in the dictionary table where \plain\f1\fs24\cf0 "the"\plain\f0\fs24\cf0\i is stored.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Array elements\tab \tab \plain\f1\fs24\cf0 ranking[1]\par \qj\li720\fi-720\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \tab (a series of one or more changeable values that may be referenced from a common base point)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Array addresses\tab \tab \plain\f1\fs24\cf0 ranking\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \tab (the base point-see above)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Properties\tab \tab \tab \plain\f1\fs24\cf0 nouns, short_desc, found_in\par \qj\li720\fi-720\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \tab (variable attachments of data relating specifically to objects)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Attributes\tab \tab \tab \plain\f1\fs24\cf0 open, light, transparent\par \qj\li720\fi-720\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \tab (less complex attachments of data describing an object, which may be specified as either having or not \plain\f0\fs24\cf0\i having the given attribute)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Most of these types are relatively straightforward, representing in most cases a simple value. \plain\f0\fs24\cf0 Dictionary entries are addresses in the dictionary table, with the null string "" having the value 0. \plain\f0\fs24\cf0 Array addresses (as opposed to separate array elements) represent the address at which the array \plain\f0\fs24\cf0 begins in the array table. Properties and attributes treated as discrete values represent the number \plain\f0\fs24\cf0 of that property or attribute, assigned sequentially as the individual property or attribute is \plain\f0\fs24\cf0 defined.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 As mentioned, routines also return values, as do engine functions, so that\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab FindLight(room)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab parent(object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 are also valid integer data types.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Routine addresses are also stored as 16-bit integers. However, those versed in such calculations \plain\f0\fs24\cf0 will notice that if such a value was treated as an absolute address, then any addressable executable \plain\f0\fs24\cf0 code would be limited to 64K in size. Such is not the case, since the routine address is actually an \plain\f0\fs24\cf0 indexed representation of the absolute address.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: The 16-bit format of a routine address (or the address of a property routine, to be discussed \plain\f0\fs24\cf0 below), can obtained via the address operator '&', as in:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x = &Routine\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x = &object.property\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (where \plain\f1\fs24\cf0 x\plain\f0\fs24\cf0 is a variable).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=17 dt=RTF II.c. Multiple Lines 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 II.c.\tab Multiple Lines\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 If any single command is too long to fit on one line, it may be split across several lines by ending \plain\f0\fs24\cf0 all but the last with the control character '\\'.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab "This is an example string."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x = 5 + 6 * higher(a, b)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 are the same as\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab "This is an example \\\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab string."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x = 5 + 6 * \\\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab higher(a, b)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The space at the end of the first line is necessary because the compiler automatically trims leading \plain\f0\fs24\cf0 spaces from the second line.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 String constants, such as in the above print statement, are an exception in that they do not require \plain\f0\fs24\cf0 the '\\' character at the end of each line.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print "The engine will properly\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print this text, assuming a\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab single space at the end of each\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab line."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will result in:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \ql\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab The engine will properly print this text, assuming\par \ql\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab a single space at the end of each line.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Care must be taken, however, to ensure that the closing quotes are not left off the string constant. \plain\f0\fs24\cf0 Failing that, the compiler will likely generate a "Closing brace missing" error when it overruns the \plain\f0\fs24\cf0 object/routine/event boundary looking for a resolution to the odd number of quotation marks.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Also, most lines ending in a comma, '\plain\f1\fs24\cf0 and\plain\f0\fs24\cf0 '\plain\f1\fs24\cf0 ,\plain\f0\fs24\cf0 or '\plain\f1\fs24\cf0 or\plain\f0\fs24\cf0 ' will automatically fall through to the next line (if \plain\f0\fs24\cf0 they occur in a line of code). In other words,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \ql\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x[0] = 1, 2, 3,\tab ! array assignment x[0] through x[4]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab 4, 5\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if a = 5 and \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab b = "tall"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 translate into\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x[0] = 1, 2, 3, 4, 5\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if a = 5 and b = "tall"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 This is provided primarily so that lengthy lines and complex expressions do not have to run off the \plain\f0\fs24\cf0 right-hand side of the screen during editing, nor do they continually need to be extended using '\\' \plain\f0\fs24\cf0 and the end of each line.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (NOTE: Multiple lines that are not strictly code, such as property assignments in object \plain\f0\fs24\cf0 definitions-to be discussed-must still be joined with '\\', as in\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab nouns "plant", "flower", "marigold", \\\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab "fauna", "greenery"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and similar cases, even if they end in a comma.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 There is a complement to the '\plain\f1\fs24\cf0 \\\plain\f0\fs24\cf0 ' line-control character: the '\plain\f1\fs24\cf0 :\plain\f0\fs24\cf0 ' character allows multiple lines to be \plain\f0\fs24\cf0 put together on a single line, i.e.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x = 5 : y = 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 or\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if i = 1: print "Less than three."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Which the compiler translates to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x = 5\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab y = 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if i = 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{print "Less than three."\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (See sections below on code formatting to see exactly what these constructions represent.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=18 dt=RTF II.d. Comments 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 II.d.\tab Comments\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 There are two types of comments. Comments on a single line begin with a '!'. Anything following on \plain\f0\fs24\cf0 the line is ignored. Multiple-line comments are begun with '!\\' and ended with '\\!'.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab ! A comment on a single line\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab !\\ A multiple-line\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab comment \\!\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The '!\\' combination must come at the start of a line to be significant; it cannot be preceded by any \plain\f0\fs24\cf0 other statements or remarks. Similarly, the '\\!' combination must come at the end of a line.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=19 dt=RTF II.e. Compiler Errors 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 II.e.\tab Compiler Errors\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 A compiler error is generally of one of two types. A fatal error looks like this:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Fatal error: \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and halts compiler execution.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 A non-fatal error typically looks like:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab (): Error: \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Also, the compiler may issue warnings in the form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab (): Warning: \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Compilation will continue, but this is an indication that the compiler suspects a problem at \plain\f0\fs24\cf0 compile-time.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 If the -e switch has been set during invocation to generate expanded-format errors, error output \plain\f0\fs24\cf0 looks like:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab : \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab (Error-causing line)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab "ERROR: "\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 It prints the section of code that caused the error, followed by an explanation of the problem. \plain\f0\fs24\cf0 Compilation will generally continue unless the -a switch has been set.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i NOTE: The section of offending code may not be printed exactly as it appears in the source, since the compiler \plain\f0\fs24\cf0\i often paraphrases and rebuilds the source code into a more rigid format before building the line.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=20 dt=RTF II.f Compiler Directives 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 II.f.\tab Compiler Directives\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 A number of special commands may be used to determine a.) how the source code is read by the \plain\f0\fs24\cf0 compiler, or b.) what special output will be generated at compile time.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To set switches within the source code so that they do not have to be specified each time the \plain\f0\fs24\cf0 compiler is invoked for that particular program, the line\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #switches -\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will set the switches specified by \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 , where \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is a string of characters \plain\f0\fs24\cf0 representing valid switches, without any separators between characters.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Many programmers may find it useful to make\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #switches -ils\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 the first line in every new program, which will automatically print out debugging information, a \plain\f0\fs24\cf0 statistical summary, and any errors to the \plain\f1\fs24\cf0 .LST\plain\f0\fs24\cf0 list file.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Using\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #version [.]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 specifies that the file is to be used with version \plain\f1\fs24\cf0 .\plain\f0\fs24\cf0 of the compiler. If the \plain\f0\fs24\cf0 file and compiler version are mismatched, a warning will be issued.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To include the contents of another file at the specified point in the current file, use\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #include ""\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is the full path and name of the file to be read. When \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 has been \plain\f0\fs24\cf0 read completely, the compiler resumes with the statement immediately following the \plain\f1\fs24\cf0 #include\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 command.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (A file or set of files can be compiled into a precompiled header using the -h switch, and then \plain\f0\fs24\cf0 linked using \plain\f1\fs24\cf0 #link\plain\f0\fs24\cf0 instead of \plain\f1\fs24\cf0 #include\plain\f0\fs24\cf0 . See \plain\f0\fs24\cf0\i Appendix D\plain\f0\fs24\cf0 on \plain\f0\fs24\cf0\i Precompiled Headers\plain\f0\fs24\cf0 .)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 A useful tool for managing Hugo source code is the ability to use compiler flags for conditional \plain\f0\fs24\cf0 compilation. A compiler flag is simply a user-defined marker that can control which sections of the \plain\f0\fs24\cf0 source code are compiled. In this way, a programmer can develop add-ons to a program that can \plain\f0\fs24\cf0 be included or excluded at will. For example, the library files \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 VERBLIB.H\plain\f0\fs24\cf0 , and \plain\f1\fs24\cf0 VERBLIB.G\plain\f0\fs24\cf0 check to see if a flag called \plain\f1\fs24\cf0 DEBUG\plain\f0\fs24\cf0 has been set previously (as it is in \plain\f1\fs24\cf0 SAMPLE.HUG\plain\f0\fs24\cf0 ). \plain\f0\fs24\cf0 Only if it has do they include the \plain\f1\fs24\cf0 HUGOFIX.H\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 HUGOFIX.G\plain\f0\fs24\cf0 files.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To set and clear flags, use\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #set \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #clear \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 respectively.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Then, check to see if a flag is set or not (and include or exclude the specified block of source code) \plain\f0\fs24\cf0 by using\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #ifset \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \tab \tab ...conditional block of code...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #endif\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 or\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #ifclear \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f0\fs24\cf0\i ...conditional block of code...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #endif\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Conditional compilation constructions may be nested up to 32 levels deep.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \ql\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (Note also that compiler flags can be specified in the invocation line as \plain\f1\fs24\cf0 #\plain\f0\fs24\cf0 .)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 "\plain\f1\fs24\cf0 #if set\plain\f0\fs24\cf0 " and "\plain\f1\fs24\cf0 #if clear\plain\f0\fs24\cf0 " are the long form of "\plain\f1\fs24\cf0 #ifset\plain\f0\fs24\cf0 " and "\plain\f1\fs24\cf0 #ifclear\plain\f0\fs24\cf0 ", allowing usage of \plain\f0\fs24\cf0 "\plain\f1\fs24\cf0 #elseif\plain\f0\fs24\cf0 " for code such as:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #set THIS_FLAG\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #set THAT_FLAG\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #if clear THIS_FLAG\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #message "This will never be printed."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #elseif set THAT_FLAG\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #message "This will always be printed."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #else\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #message "But not this if THAT_FLAG is set."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #endif\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Use "\plain\f1\fs24\cf0 #if defined \plain\f0\fs24\cf0 " and "\plain\f1\fs24\cf0 #if undefined \plain\f0\fs24\cf0 " to test if objects, properties, \plain\f0\fs24\cf0 routines, etc. have previously been defined.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 As seen above, the \plain\f1\fs24\cf0 #message\plain\f0\fs24\cf0 directive can be used as\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #message ""\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 to output \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 when (or if) that statement is processed during the first compilation pass.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Including "\plain\f1\fs24\cf0 error\plain\f0\fs24\cf0 " or "\plain\f1\fs24\cf0 warning\plain\f0\fs24\cf0 " before "\plain\f1\fs24\cf0 \plain\f0\fs24\cf0 " as in\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #message error ""\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 or\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #message warning ""\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will force the compiler to issue an error or warning, respectively, as it prints "\plain\f1\fs24\cf0 \plain\f0\fs24\cf0 ".\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 It is also possible to include inline limit settings, such as\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab $=\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 in the same way as in the invocation line. However, an error will be issued if, for example, an \plain\f0\fs24\cf0 attempt is made to reset \plain\f1\fs24\cf0 MAXOBJECTS\plain\f0\fs24\cf0 if one or more objects have already been defined.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \keep\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=78 dt=RTF Example: Command-Line Compiling 3 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'02\'04);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'05);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'06);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'07);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'08);}{\levelnumbers\'01;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 Example: Command-Line Compiling\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 On the author's machine, running under MS-DOS, the compiler executable \plain\f1\fs24\cf0 HC.EXE\plain\f0\fs24\cf0 is in a directory \plain\f0\fs24\cf0 called \plain\f1\fs24\cf0 C:\\HUGO\plain\f0\fs24\cf0 . The library files are in \plain\f1\fs24\cf0 C:\\HUGO\\LIB\plain\f0\fs24\cf0 , and the source code for the game Spur is in \plain\f1\fs24\cf0 C:\\HUGO\\SPUR\plain\f0\fs24\cf0 .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 It's possible to call the compiler to compile Spur with a number of different options, including setting \plain\f0\fs24\cf0 compiler flags to include the HugoFix debugging library and verb stub routines (i.e., what could \plain\f0\fs24\cf0 otherwise be accomplished with "\plain\f1\fs24\cf0 #set DEBUG\plain\f0\fs24\cf0 " and "\plain\f1\fs24\cf0 #set VERBSTUBS\plain\f0\fs24\cf0 " in the source), and \plain\f0\fs24\cf0 printing all debugging information, the object tree, and statistics to a file. (Assume that the current \plain\f0\fs24\cf0 directory is \plain\f1\fs24\cf0 C:\\HUGO\plain\f0\fs24\cf0 and that none of the switches or compiler flags are set in the source.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab hc -iols #debug #verbstubs @source=spur @lib=lib spur\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 This makes use of all the possible command-line option types, including multiple switches, flag \plain\f0\fs24\cf0 settings, and directory specifications.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=21 nft=02;80000008;000A;00;Times New Roman dt=RTF III. OBJECTS 1 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0\b III.\tab OBJECTS\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Objects are the building blocks of any Hugo program. Anything that must be accessible to a player \plain\f0\fs24\cf0 during the game-including items, rooms, other characters, and even directions-must be defined as \plain\f0\fs24\cf0 an object.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The basic object definition looks like this:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab object "object name"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 As an example, a suitcase object might be defined as:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab object suitcase "suitcase"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The enclosing braces are needed even if the object definition has no body. The only data attached \plain\f0\fs24\cf0 to the suitcase object are-from right to left-a name, an identifier, and membership in the basic object \plain\f0\fs24\cf0 class.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The compiler assigns the object labeled \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 the next sequential object number. That \plain\f0\fs24\cf0 is, if the first-defined object is the "nothing" object (object 0), then the next-defined object, whatever \plain\f0\fs24\cf0 it is, is given the object number 1; the one after that is 2, etc. This is academic, however, as a \plain\f0\fs24\cf0 programmer need never know what object number a particular object is-except for certain \plain\f0\fs24\cf0 debugging situations-and can always refer to an object by its label \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 If no explicit "name" (or name property) is provided, the compiler automatically gives it the name \plain\f0\fs24\cf0 "\plain\f1\fs24\cf0 ()\plain\f0\fs24\cf0 ", i.e., \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 in parentheses.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (The compiler automatically creates an object called "display" as the last defined object. The \plain\f0\fs24\cf0 display object can be used to get information about the engine's output display. See the section on \plain\f0\fs24\cf0 the display object below under \plain\f0\fs24\cf0{\field{\*\fldinst { HYPERLINK "idnode://62"}}{\fldrslt{\i "Advanced Features"\plain\f0\fs24\cf0}}}\i \plain\f0\fs24\cf0 .) \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=22 dt=RTF III.a. The Object Tree 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 III.a. The Object Tree\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 In order for objects to have a position in the game, i.e., to be in a room or contained in another \plain\f0\fs24\cf0 object or beside another object, they must occupy a position in the object tree. The object tree is a \plain\f0\fs24\cf0 map which represents the relationships between all objects in the game. The total number of \plain\f0\fs24\cf0 objects is held in the global variable objects.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The nothing object is defined in the library as object 0. This is the root of the object tree, upon \plain\f0\fs24\cf0 which all other objects are based.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 When referring to object numbers, this manual is generally referring to the name given the object in \plain\f0\fs24\cf0 the source code: i.e., \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 . The compiler automatically assigns each object an object \plain\f0\fs24\cf0 number, and refers to it whenever a specified \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is encountered.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (NOTE: When using the standard library routines, ensure that no objects (or classes, to be \plain\f0\fs24\cf0 discussed later) are defined before \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 is included. Problems will arise if the first-defined \plain\f0\fs24\cf0 object-object 0-is not the "nothing" object.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Here is an example of an object tree:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 Nothing\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab |\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Room\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab |\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Table---Chair---Book---Player\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab | |\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Bowl Bookmark\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab |\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Spoon\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 A number of functions can be used to read the object tree.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab parent\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab sibling\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab child\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab youngest\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab elder\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 eldest\tab \plain\f0\fs24\cf0 (same as \plain\f1\fs24\cf0 child\plain\f0\fs24\cf0 )\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 younger\tab \plain\f0\fs24\cf0 (same as \plain\f1\fs24\cf0 sibling\plain\f0\fs24\cf0 )\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab children\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Each function takes a single object as its argument, so that\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab parent(Table)\tab = Room\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab parent(Bookmark) = Book\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab parent(Player)\tab = Room\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab child(Bowl)\tab \tab = Spoon\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab child(Room)\tab \tab = Table\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab child(Chair)\tab = 0 \plain\f0\fs24\cf0 (Nothing)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab sibling(Table)\tab = Chair\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab sibling(Player)\tab = 0 \plain\f0\fs24\cf0 (Nothing)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab youngest(Room)\tab = Player\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab youngest(Spoon)\tab = 0 \plain\f0\fs24\cf0 (Nothing)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab elder(Chair)\tab = Table\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab elder(Table)\tab = 0 \plain\f0\fs24\cf0 (Nothing)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab children(Room)\tab = 4\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab children(Table)\tab = 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab children(Chair)\tab = 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (In keeping with the above explanation of object numbers and \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 , the functions in the \plain\f0\fs24\cf0 first set actually return an integer number that refers to a particular \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 .)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To better understand how the object tree represents the physical world, the table, the chair, the \plain\f0\fs24\cf0 book, and the player are all in the room. The bookmark is in the book. The bowl is on the table, \plain\f0\fs24\cf0 and the spoon is on the bowl. The Hugo library will assume that the player object in the example \plain\f0\fs24\cf0 is standing; if the player were seated, the object tree might look like:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Nothing\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab |\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Room\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab |\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Table---Chair---Book\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab | | |\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab ... Player ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab child(Chair)\tab = Player\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab parent(Player)\tab = Chair\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab children(Chair)\tab = 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (Try compiling \plain\f1\fs24\cf0 SAMPLE.HUG\plain\f0\fs24\cf0 with the -o switch in order to see the object tree for the sample game. \plain\f0\fs24\cf0 Or, if the \plain\f1\fs24\cf0 DEBUG\plain\f0\fs24\cf0 flag was set during compilation, use the HugoFix command "$ot" or "$ot \plain\f0\fs24\cf0 " during play to view the current state of the object tree during play. Compiling with the \plain\f0\fs24\cf0 -d switch will generate a debuggable (\plain\f1\fs24\cf0 .HDX\plain\f0\fs24\cf0 ) version of the file-the object tree can then be viewed \plain\f0\fs24\cf0 directly from the debugger.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Logical tests can also be evaluated with regard to objects and children. The structure\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab [not] in \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will return true if \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is in \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 (or false if '\plain\f1\fs24\cf0 not\plain\f0\fs24\cf0 ' is used).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To initially place an object in the object tree, use\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab in \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 in the object definition, or, alternatively\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab nearby \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 or simply\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab nearby\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 to give the object the same parent as \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 or, if \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is not specified, the same parent \plain\f0\fs24\cf0 as the last-defined object.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 If no such specification is given, the parent object defaults to 0-the nothing object as defined in the \plain\f0\fs24\cf0 library. All normal room objects have 0 as their parent.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Therefore, the expanded basic case of an object definition is\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab object "object name"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab in \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (Ensure that the opening brace '\{' does not come on the same line as the '\plain\f1\fs24\cf0 object\plain\f0\fs24\cf0 ' specifier.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab object "object name" \{...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 is not permitted.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The table in the example presumably had a definition like\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab object table "Table"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab in room\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To put the suitcase object defined earlier into the empty room in \plain\f1\fs24\cf0 SHELL.HUG\plain\f0\fs24\cf0 :\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab object suitcase "suitcase"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab in emptyroom\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Objects can later be moved around the object tree using the '\plain\f1\fs24\cf0 move\plain\f0\fs24\cf0 ' command as in\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab move to \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Which, essentially, disengages \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 from its old parent, makes the sibling of \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 the \plain\f0\fs24\cf0 sibling of \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 's elder, and moves \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 (along with all its possessions) to the new \plain\f0\fs24\cf0 parent.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Therefore, in the original example, the command\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab move bowl to player\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 would result in altering the object tree to this:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Nothing\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab |\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Room\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab |\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Table---Chair---Book---Player\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab | |\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Bookmark Bowl\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab |\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Spoon\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 There is also a command to remove an object from its position in the tree:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab remove \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 which is the same as\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab move to 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The object may of course be moved to any position later.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=23 dt=RTF III.b. Attributes 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 III.b. Attributes\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Attributes are essentially qualities that every object either does or doesn't have. They are most \plain\f0\fs24\cf0 useful for qualifying or disqualifying objects for or from consideration in any given instance.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 An attribute is defined as\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab attribute \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Up to 128 attributes may be defined. Those defined in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 include:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 known\tab \tab \plain\f0\fs24\cf0 \tab if an object is known to the player\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 moved\tab \tab \plain\f0\fs24\cf0 \tab if an object has been moved\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 visited\tab \tab \plain\f0\fs24\cf0 if a room has been visited\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 static\tab \tab \plain\f0\fs24\cf0 if an object cannot be taken\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 plural\tab \tab \plain\f0\fs24\cf0 for plural objects (i.e., some hats)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 living\tab \tab \plain\f0\fs24\cf0 if an object is a character\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 female\tab \tab \plain\f0\fs24\cf0 if a character is female\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 unfriendly\tab \plain\f0\fs24\cf0 \tab if a character is unfriendly\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 openable\tab \tab \plain\f0\fs24\cf0 if an object can be opened\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 open\tab \tab \tab \plain\f0\fs24\cf0 if it is open\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 lockable\tab \tab \plain\f0\fs24\cf0 if an object can be locked\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 locked\tab \tab \plain\f0\fs24\cf0 if it is locked\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 light\tab \tab \plain\f0\fs24\cf0 \tab if an object is or provides light\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 readable\tab \tab \plain\f0\fs24\cf0 if an object can be read\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 switchable\tab \plain\f0\fs24\cf0 \tab if an object can be turned on or off\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 switchedon\tab \plain\f0\fs24\cf0 \tab if it is on\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 clothing\tab \tab \plain\f0\fs24\cf0 for objects that can be worn\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 worn\tab \tab \tab \plain\f0\fs24\cf0 if the object is being worn\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 mobile\tab \tab \plain\f0\fs24\cf0 if the object can be rolled, etc.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 enterable\tab \tab \plain\f0\fs24\cf0 if an object is enterable\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 container\tab \tab \plain\f0\fs24\cf0 if an object can hold other objects\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 platform\tab \tab \plain\f0\fs24\cf0 if other objects can be placed on it\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \tab \tab \tab \plain\f0\fs24\cf0 \plain\f0\fs24\cf0\i (NOTE: container and platform are\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \tab \plain\f1\fs24\cf0\i \tab \tab \tab \plain\f0\fs24\cf0\i mutually exclusive)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 hidden\tab \tab \plain\f0\fs24\cf0 if an object is not to be listed\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 quiet\tab \tab \plain\f0\fs24\cf0 \tab if container or platform is quiet (i.e., the\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \tab \tab \tab \plain\f0\fs24\cf0 initial listing of contents is suppressed)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 transparent\tab \plain\f0\fs24\cf0 if object is not opaque\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 already_listed \plain\f0\fs24\cf0 if object has been pre-listed (i.e., before\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \tab \tab \tab \plain\f0\fs24\cf0 a \plain\f1\fs24\cf0 WhatsIn \plain\f0\fs24\cf0 listing)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 workflag\tab \tab \plain\f0\fs24\cf0 for system use\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 special\tab \tab \plain\f0\fs24\cf0 for miscellaneous use\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Some of these attributes are actually the same attribute with different names. This is accomplished \plain\f0\fs24\cf0 via\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab attribute alias \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 has already been defined. For example, the library equates \plain\f1\fs24\cf0 visited\plain\f0\fs24\cf0 with \plain\f1\fs24\cf0 moved\plain\f0\fs24\cf0 (since, presumably, they will never apply to the same object), so:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab attribute visited alias moved\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 In this case, an object which is visited is also, by default, moved. It is expected that attributes \plain\f0\fs24\cf0 which are aliased will never both need to be checked under the same circumstances.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Attributes are given to an object during its definition as follows:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab object "object name"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab is [not] , [not] , ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: The '\plain\f1\fs24\cf0 not\plain\f0\fs24\cf0 ' keyword in the object definition is important when using a class instead of the \plain\f0\fs24\cf0 basic object definition, where the class may have predefined attributes that are undesirable for the \plain\f0\fs24\cf0 current object.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Even if an object was not given a particular attribute in its object definition, it may be given that \plain\f0\fs24\cf0 attribute at any later point in the program with the command\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab is [not] \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \ql\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where the '\plain\f1\fs24\cf0 not\plain\f0\fs24\cf0 ' keyword clears the attribute instead of setting it.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Attributes can also be read using the '\plain\f1\fs24\cf0 is\plain\f0\fs24\cf0 ' and '\plain\f1\fs24\cf0 is not\plain\f0\fs24\cf0 ' structures. As a function,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab is [not] \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 returns true (1) if \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is (or is not, if '\plain\f1\fs24\cf0 not\plain\f0\fs24\cf0 ' is specified) \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 . Otherwise, it returns \plain\f0\fs24\cf0 false (0).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To give the suitcase object the appropriate attributes, expand the object definition to include\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab object suitcase "suitcase"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab in emptyroom\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab is openable, not open\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Now, the following equations hold true:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab suitcase is openable\tab = 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab suitcase is open\tab \tab = 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab suitcase is locked\tab = 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 }} } 5P9i0s8y19Z id=24 dt=RTF III.c. Properties 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 III.c. Properties\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Properties are considerably more complex than attributes. First, not every object may have every \plain\f0\fs24\cf0 property; in order for an object to have a property, it must be specified in the object definition.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 As well, properties are not simple on/off flags. They are sets of valid data associated with an \plain\f0\fs24\cf0 object, where the values may represent almost anything, including object numbers, dictionary \plain\f0\fs24\cf0 addresses, integer values, and addresses of executable code. The maximum number of attached \plain\f0\fs24\cf0 values is undefined, but manageability and efficiency suggest eight or less.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 These are some valid properties as they would appear in an object definition (using property \plain\f0\fs24\cf0 names defined in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 ):\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab nouns "tree", "bush", "shrub", "plant"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab size 20\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab found_in livingroom, entrancehall\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab long_desc\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{"Exits lead north and west. A door is set\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab in the southeast wall."\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab short_desc\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab "There is a box here. It is ";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab if self is open\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab print "open";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab else\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab print "closed";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print "."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab before\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab object DoGet\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab if Acquire(player, self)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \{"You pick up ";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab print Art(self); "."\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab else\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab return false\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The nouns property contains 4 dictionary addresses; the \plain\f1\fs24\cf0 size\plain\f0\fs24\cf0 property is a single integer value; \plain\f0\fs24\cf0 the \plain\f1\fs24\cf0 found_in\plain\f0\fs24\cf0 property holds two object numbers; and the long and short description properties \plain\f0\fs24\cf0 are both single values representing the address of the attached routine.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The \plain\f1\fs24\cf0 before\plain\f0\fs24\cf0 property is a special case. This complex property is defined by the compiler and \plain\f0\fs24\cf0 handled differently by the engine than a normal property routine. In this case, the property value \plain\f0\fs24\cf0 representing the routine address is only returned if the \plain\f1\fs24\cf0 globals\plain\f0\fs24\cf0 \plain\f1\fs24\cf0 object\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 verbroutine\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 contain the object in question and the address of the \plain\f1\fs24\cf0 DoGet\plain\f0\fs24\cf0 routine, respectively. If there is a \plain\f0\fs24\cf0 match, the routine is executed before \plain\f1\fs24\cf0 DoGet\plain\f0\fs24\cf0 . (There is also an \plain\f1\fs24\cf0 after\plain\f0\fs24\cf0 routine, which is checked \plain\f0\fs24\cf0 after the verb routine has been called.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (Note for clarity: the \plain\f1\fs24\cf0 Art\plain\f0\fs24\cf0 routine from \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 prints the appropriate article, if any, followed \plain\f0\fs24\cf0 by the name of the object. The \plain\f1\fs24\cf0 Acquire\plain\f0\fs24\cf0 routine returns true only if the first object's \plain\f1\fs24\cf0 holding\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 property plus the \plain\f1\fs24\cf0 size\plain\f0\fs24\cf0 property of the second object does not exceed the \plain\f1\fs24\cf0 capacity\plain\f0\fs24\cf0 property of \plain\f0\fs24\cf0 the first object.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 All of this may be a little confusing for now. There will be more on property routines later. For \plain\f0\fs24\cf0 now, think of a property as simply containing a value (or set of values).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 A property is defined similiarly to an attribute as\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab property \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 A default value may be defined for the property using\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab property \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is a constant or dictionary word. For objects without a given property, \plain\f0\fs24\cf0 attempting to find that property will result in the default value. If no default is explicitly declared, \plain\f0\fs24\cf0 it is 0.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The list of properties defined in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 is:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 name\plain\f0\fs24\cf0 \tab \tab \tab the basic object name\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 before\plain\f0\fs24\cf0 \tab \tab pre-verb routines\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 after\plain\f0\fs24\cf0 \tab \tab \tab post-verb routines\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 noun\plain\f0\fs24\cf0 \tab \tab \tab noun(s) for referring to object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 adjective\plain\f0\fs24\cf0 \tab \tab adjective(s) for describing object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 article\plain\f0\fs24\cf0 \tab \tab "a", "an", "the", "some", etc.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 preposition\tab \plain\f0\fs24\cf0 \tab "in", "inside", "outside of", etc.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 pronoun\plain\f0\fs24\cf0 \tab \tab appropriate for the object in question\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 short\plain\f0\fs24\cf0 _desc\tab \tab basic "X is here" description\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 initial\plain\f0\fs24\cf0 _desc\tab \tab supersedes short_desc (or long_desc\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab for locations)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab long_desc\tab \tab detailed description\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 found\plain\f0\fs24\cf0 _in\tab \tab in case of multiple locations (virtual,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab NOT physical, parent objects)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 type\plain\f0\fs24\cf0 \tab \tab \tab to identify the type of object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab n_to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab ne_to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab e_to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab se_to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab s_to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 sw\plain\f0\fs24\cf0 _to\tab \tab \tab (for rooms only, where an exit leads)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab w_to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 nw\plain\f0\fs24\cf0 _to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab u_to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab d_to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab in_to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 out\plain\f0\fs24\cf0 _to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 cant\plain\f0\fs24\cf0 _go\tab \tab message if a direction is invalid\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 size\plain\f0\fs24\cf0 \tab \tab \tab for holding/inventory\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 capacity\plain\f0\fs24\cf0 \tab \tab " "\tab \tab "\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 holding\plain\f0\fs24\cf0 \tab \tab " "\tab \tab "\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 reach\plain\f0\fs24\cf0 \tab \tab \tab for limiting object accessibility\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 list\plain\f0\fs24\cf0 _contents\tab \tab for overriding normal listing\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 door\plain\f0\fs24\cf0 _to\tab \tab for handling "Enter "\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 key\plain\f0\fs24\cf0 _object\tab \tab if lockable, the proper key\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 when\plain\f0\fs24\cf0 _open\tab \tab supersedes short_desc\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 when\plain\f0\fs24\cf0 _closed\tab \tab " "\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ignore\plain\f0\fs24\cf0 _response\tab for characters\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 order\plain\f0\fs24\cf0 _response\tab " "\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 contains\plain\f0\fs24\cf0 _desc\tab instead of basic "inside X are..."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 inv\plain\f0\fs24\cf0 _desc\tab \tab for special inventory descriptions\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 desc\plain\f0\fs24\cf0 _detail\tab \tab parenthetical detail for object listing\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 parse\plain\f0\fs24\cf0 _rank\tab \tab for differentiating like-named objects\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 exclude\plain\f0\fs24\cf0 _from_all\tab for interpreting "all" in inputs\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 misc\plain\f0\fs24\cf0 \tab \tab \tab for miscellaneous use\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (For a detailed description of how each property is used, see \plain\f0\fs24\cf0\i Appendix B: The Library\plain\f0\fs24\cf0 .)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (The following properties are also defined and used exclusively by the display object:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 screenwidth\plain\f0\fs24\cf0 \tab \tab width of the display, in characters\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 screenheight\plain\f0\fs24\cf0 \tab height of the display, in characters\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 linelength\plain\f0\fs24\cf0 \tab \tab width of the current text window\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 windowlines\plain\f0\fs24\cf0 \tab \tab height of the current text window\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab cursor_\plain\f1\fs24\cf0 column\plain\f0\fs24\cf0 \tab \tab horizontal and vertical position of\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab cursor_\plain\f1\fs24\cf0 row\plain\f0\fs24\cf0 \tab \tab the cursor in the current text window\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 hasgraphics\plain\f0\fs24\cf0 \tab \tab true if the current display is graphics-\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab capable\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 title_caption\plain\f0\fs24\cf0 \tab dictionary entry giving the full proper\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab name of the program (optional)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 statusline\plain\f0\fs24\cf0 _height\tab of the last-printed status line\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Note that while some of these, namely \plain\f1\fs24\cf0 screenwidth\plain\f0\fs24\cf0 through \plain\f1\fs24\cf0 title_caption\plain\f0\fs24\cf0 , are defined as \plain\f0\fs24\cf0 constants in the library, they are still usable as property references, since both property numbers \plain\f0\fs24\cf0 and constants are simple integers.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Property names may again be aliased by\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab property alias \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 has already been defined.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The library aliases (among others) the following:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab nouns alias noun\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab adjectives alias adjective\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab prep alias preposition\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab pronouns alias pronoun\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 A property is expressed as\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The number of elements to a property with more than a single value can be found via\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab .#\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and a single element is expressed as\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab . #\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: "\plain\f1\fs24\cf0 .\plain\f0\fs24\cf0 " is simply the shortened version of \tab \plain\f0\fs24\cf0 "\plain\f1\fs24\cf0 . #1\plain\f0\fs24\cf0 ".\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To add some properties to the suitcase object, expand the object definition to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab object suitcase "big green suitcase"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab in emptyroom\tab \tab \tab ! done earlier\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab is openable, not open\tab !\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab nouns "suitcase", "case", "luggage"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab adjective "big", "green", "suit"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab article "a"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab size 25\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab capacity 100\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Based on the engine rules for object identification, the suitcase object may now be referred to by the \plain\f0\fs24\cf0 player as "big green suitcase", "big case", or "green suitcase" among other combinations. Even "big \plain\f0\fs24\cf0 green" and "suit" may be valid, provided that these don't also refer to other objects within valid \plain\f0\fs24\cf0 scope such as "a big green apple" or "your suit jacket".\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (NOTE: The basic form for identification by the parser is\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab ... \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where any subset of these elements is allowable. However, the noun must come last, and only one \plain\f0\fs24\cf0 noun is recognized, so that\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab and \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 as in \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab "luggage case" and "suitcase green"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 are not recognized.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 One occasional source of befuddling code that doesn't behave the way the programmer intended is \plain\f0\fs24\cf0 not allowing enough slots for a property on a given object. That is, if an object is originally defined \plain\f0\fs24\cf0 with the property\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab found_in kitchen\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and later, the program tries to set\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab .found_in #2 = livingroom\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 it will have no substantial effect. That is, there will be no space initialized in \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 's property \plain\f0\fs24\cf0 table for a second value under \plain\f1\fs24\cf0 found\plain\f0\fs24\cf0 _in. Trying to read \plain\f1\fs24\cf0 .found\plain\f0\fs24\cf0 _in\plain\f1\fs24\cf0 #2\plain\f0\fs24\cf0 will return a \plain\f0\fs24\cf0 value of 0-a non-existent property-not the number of the \plain\f1\fs24\cf0 livingroom\plain\f0\fs24\cf0 object. (Running the \plain\f0\fs24\cf0 debugger with runtime warnings enabled will help spot instances like this.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To overcome this, if it is known that eventually a second (or third, or fourth, or ninth) value is \plain\f0\fs24\cf0 going to be set-even if only one value is defined at the outset-use\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab found_in kitchen, 0[, 0, 0,...]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 in the object definition.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (A useful shortcut for initializing multiple zero values is to use\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab found_in #4\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 instead of\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab found_in 0, 0, 0, 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 in the object definition.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 As might be expected, combinations of properties are read left-to-right, so that\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab location.n_to.name\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 is understood as\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab (location.n_to).name\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v }} } 5P9i0s8y19Z id=25 dt=RTF III.d. Classes 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 III.d. Classes\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Classes are essentially objects that are specifically intended to be used as prototypes for one or \plain\f0\fs24\cf0 more similar objects. Here is how a class is defined:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab class [""]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 with the body of the definition being the same as that for an object definition, where the properties \plain\f0\fs24\cf0 and attributes defined are to be the same for all members of the class.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 For example:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab class box\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab noun "box"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab long_desc\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab "It looks like a regular old box."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab is openable, not open\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab box largebox "large box"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab article "a"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab adjectives "big", "large"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab is open\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab box greenbox "green box"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab article "a"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab adjective "green"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab long_desc\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab "It looks like a regular old box, only green."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (Beginning the \plain\f1\fs24\cf0 long_desc\plain\f0\fs24\cf0 property routine on the line below the property name is understood \plain\f0\fs24\cf0 by the compiler as:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab long_desc\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab "It looks like a regular old box, only green."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Since the property is only one line-a single printing command-the braces are unnecessary.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The definition of an object in a class is begun with the name of the prototype object instead of \plain\f0\fs24\cf0 "object". All properties and attributes of the class are inherited (except for its position in the object \plain\f0\fs24\cf0 tree), unless they have been explicitly defined in the new object.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 That is, although the box class is defined without the open attribute, the \plain\f1\fs24\cf0 largebox\plain\f0\fs24\cf0 object will \plain\f0\fs24\cf0 begin the game as open, since this is in the \plain\f1\fs24\cf0 largebox\plain\f0\fs24\cf0 definition. It will begin the game as \plain\f1\fs24\cf0 openable\plain\f0\fs24\cf0 , as well, as this is inherited from the \plain\f1\fs24\cf0 box\plain\f0\fs24\cf0 class.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 And while the \plain\f1\fs24\cf0 largebox\plain\f0\fs24\cf0 object will have the \plain\f1\fs24\cf0 long\plain\f0\fs24\cf0 _\plain\f1\fs24\cf0 desc\plain\f0\fs24\cf0 of the box class, the \plain\f1\fs24\cf0 greenbox\plain\f0\fs24\cf0 object \plain\f0\fs24\cf0 replaces the default property routine with a new description. (An exception to this is an \plain\f0\fs24\cf0 "\plain\f1\fs24\cf0 $additive\plain\f0\fs24\cf0 " property, to be discussed later, where new properties are added to those of \plain\f0\fs24\cf0 previous classes.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Since a class is basically an object, it is possible to define an object using a previous object as a class \plain\f0\fs24\cf0 even though the previous object was not explicitly defined as a class. Therefore,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab largebox largeredbox "large red box"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab adjectives "big", "large", "red"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 is perfectly valid.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Occasionally, it may be necessary to have an object or class inherit from more than one previously \plain\f0\fs24\cf0 defined class. This can be done using the "\plain\f1\fs24\cf0 inherits\plain\f0\fs24\cf0 " instruction.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab "name"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab inherits [, ,...]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 or even\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab object "name"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab inherits , [, ,...]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The precedence of inheritance is in the order of occurrence. In either example, the object inherits \plain\f0\fs24\cf0 first from \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 , then from \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 , and so on (or even \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 , etc.).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The Hugo Object Library (\plain\f1\fs24\cf0 OBJLIB.H\plain\f0\fs24\cf0 ) contains a number of useful class definitions for things like \plain\f0\fs24\cf0 rooms, characters, scenery, vehicles, etc. Sometimes, however, it may be desirable to use a different \plain\f0\fs24\cf0 definition for, say, the room class while keeping all the others in the Object Library.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Instead of actually editing the \plain\f1\fs24\cf0 OBJLIB.H\plain\f0\fs24\cf0 file, use:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab replace [""]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab (...completely new object definition...)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is the name of a previously defined object or class, such as "\plain\f1\fs24\cf0 room\plain\f0\fs24\cf0 ". All \plain\f0\fs24\cf0 subsequent references to \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 will use this object instead of the previously defined one. \plain\f0\fs24\cf0 (Note that this means that the replacement must come BEFORE any uses of the class for other \plain\f0\fs24\cf0 objects.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=26 nft=02;80000008;000A;00;Times New Roman dt=RTF IV. HUGO PROGRAMMING 1 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset2 symbol;}{\f2\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard{\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \keep\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0\b IV. HUGO PROGRAMMING}} } 5P9i0s8y19Z id=27 dt=RTF IV.a. Variables 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 IV.a. Variables\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Hugo supports two kinds of variables: global and local. Either type simply holds a 16-bit integer, \plain\f0\fs24\cf0 so a variable can hold a simple value, an object number, a dictionary address, a routine address, or \plain\f0\fs24\cf0 any other standard Hugo data type through an assignment such as:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab a = 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab nextobj = parent(obj)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab temp_word = "the"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Global variables are visible throughout the program. They must be defined similarly to properties \plain\f0\fs24\cf0 and attributes as\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab global [ = ]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Local variables, on the other hand, are recognized only within the routine in which they are \plain\f0\fs24\cf0 defined. They are defined using\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab local [ = ]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Global variables must of course have a unique name, different from that of any other data object; \plain\f0\fs24\cf0 local variables, on the other hand, may share the names of local variables in other routines.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 In either case, global or local, the default starting value is 0 if no other value is given. For example,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab global time_of_day = 1100\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 is equal to 1100 when the program is run, and is visible at any point in the program, by any object \plain\f0\fs24\cf0 or routine. On the other hand, the variables\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab local a, max = 100, t\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 are visible only within the block of code where they are defined, and are initialized to 0, 100, and 0, \plain\f0\fs24\cf0 respectively, each time that section of code (be it a routine, property routine, event, etc.) is run.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The compiler defines a set of engine globals: global variables that are referenced directly by the \plain\f0\fs24\cf0 engine, but which may otherwise be treated like any other global variables. These are:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 object\plain\f0\fs24\cf0 \tab \tab direct object of a verb action\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 xobject\plain\f0\fs24\cf0 \tab \tab indirect object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 self\plain\f0\fs24\cf0 \tab \tab \tab self-referential object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 words\plain\f0\fs24\cf0 \tab \tab \tab total number of words in command\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 player\plain\f0\fs24\cf0 \tab \tab the player object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 actor\plain\f0\fs24\cf0 \tab \tab \tab the player, or character obj. (for scripts)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 verbroutine\plain\f0\fs24\cf0 \tab \tab specified by the command\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 endflag\plain\f0\fs24\cf0 \tab \tab if not false (0), run \plain\f1\fs24\cf0 EndGame\plain\f0\fs24\cf0 routine\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 prompt\plain\f0\fs24\cf0 \tab \tab for input; default is ">"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 objects\plain\f0\fs24\cf0 \tab \tab the total number of objects\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 system_status\plain\f0\fs24\cf0 \tab after certain operations\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The \plain\f1\fs24\cf0 object\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 xobject\plain\f0\fs24\cf0 globals are set up by the engine depending on what command is \plain\f0\fs24\cf0 entered by the player. The \plain\f1\fs24\cf0 self\plain\f0\fs24\cf0 global is undefined except when an object is being referenced (as \plain\f0\fs24\cf0 in a property routine). In that case, it is set to the number of that object. The \plain\f1\fs24\cf0 player\plain\f0\fs24\cf0 variable \plain\f0\fs24\cf0 holds the number of the object that the player is controlling; the \plain\f1\fs24\cf0 verbroutine\plain\f0\fs24\cf0 variable holds the \plain\f0\fs24\cf0 address of the routine specified in the grammar table and corresponding to the entered command; \plain\f0\fs24\cf0 the \plain\f1\fs24\cf0 endflag\plain\f0\fs24\cf0 variable must be 0 unless something has occurred to end the game; and the \plain\f1\fs24\cf0 prompt\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 variable represents the dictionary word appearing at the start of an input line.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The \plain\f1\fs24\cf0 objects\plain\f0\fs24\cf0 variable can be set by the player, but to no useful effect. The engine will reset it to \plain\f0\fs24\cf0 the "real" value whenever referenced. (All object numbers range from 0 to the value of \plain\f1\fs24\cf0 objects\plain\f0\fs24\cf0 .) \plain\f0\fs24\cf0 The \plain\f1\fs24\cf0 system_status\plain\f0\fs24\cf0 variable may be read (after a resource operation or a '\plain\f1\fs24\cf0 system\plain\f0\fs24\cf0 ' call; see the \plain\f0\fs24\cf0 relevant sections for an explanation of these functions) to check for an error value. See the section \plain\f0\fs24\cf0 on \plain\f0\fs24\cf0\i "Resources"\plain\f0\fs24\cf0 for possible return values.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (NOTE: Setting \plain\f1\fs24\cf0 endflag\plain\f0\fs24\cf0 to a non-zero value forces an IMMEDIATE break from the game loop. \plain\f0\fs24\cf0 Statements following the \plain\f1\fs24\cf0 endflag\plain\f0\fs24\cf0 assignment even in the same function are not executed; control \plain\f0\fs24\cf0 is passed directly to the engine, which calls the \plain\f1\fs24\cf0 EndGame\plain\f0\fs24\cf0 routine.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=28 dt=RTF IV.b. Constants 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 IV.b. Constants\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Constants are simply labels that represent a non-modifiable value.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab constant FIRST_NAME "John"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab constant LAST_NAME "Smith"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 (Note the\plain\f0\fs24\cf0 lack of an '\plain\f1\fs24\cf0 =\plain\f0\fs24\cf0 ' sign between, for example, \plain\f1\fs24\cf0 FIRST_NAME\plain\f0\fs24\cf0 and "John".)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print LAST_NAME; ", "; FIRST_NAME\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 outputs:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Smith, John\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Constants can, like any other Hugo data type, be integers, dictionary entries, object numbers, etc.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (It is not absolutely necessary that a constant be given a definite value if the constant is to be used \plain\f0\fs24\cf0 as some sort of flag or marker, etc. Therefore,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab constant THIS_RESULT\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab constant THAT_RESULT\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will have unique values from each other, as well as from any other constant defined without a \plain\f0\fs24\cf0 definite value.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Sometimes it may be useful to enumerate a series of constants in sequence. Instead of defining \plain\f0\fs24\cf0 them all individually, it is possible to use:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab enumerate start = 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 giving:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab MONDAY = 1, TUESDAY = 2, WEDNESDAY = 3, THURSDAY = 4,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab FRIDAY = 5\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The start value is optional. If omitted, it is 0. Also, it is possible to change the current value at any \plain\f0\fs24\cf0 point (therefore also affecting all following values).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab enumerate\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab A, B, C = 5, D, E\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 gives: \plain\f1\fs24\cf0 A = 0, B = 1, C = 5, D = 6, E = 7\plain\f0\fs24\cf0 .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Finally, it is possible to alter the step value of the enumeration using the "step" keyword followed \plain\f0\fs24\cf0 by "+x", "-x", "*x", or "/x", where x is a constant integer value. To count by twos:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab enumerate step *2\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab A = 1, B, C, D\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 gives: \plain\f1\fs24\cf0 A = 1, B = 2, C = 4, D = 8\plain\f0\fs24\cf0 .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: Enumeration of global variables is also possible, using the '\plain\f1\fs24\cf0 globals\plain\f0\fs24\cf0 ' specifier, as in:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab enumerate globals\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab , ,...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Otherwise the specifier "\plain\f1\fs24\cf0 constants\plain\f0\fs24\cf0 " is implied as the default.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=29 dt=RTF IV.c. Printing Text 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 IV.c.\tab Printing Text\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Text can be printed using two different methods. The first is the basic '\plain\f1\fs24\cf0 print\plain\f0\fs24\cf0 ' command, the \plain\f0\fs24\cf0 simplest form of which is\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print ""\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 consists of a series of alphanumeric characters and punctuation.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The backslash control character ("\\") is handled specially. It modifies how the character following \plain\f0\fs24\cf0 it in a string is treated.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\"\plain\f0\fs24\cf0 \tab inserts quotation marks\par \ql\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \\\\\tab insert a literal backslash character\par {\tx720 \qj\li1440\fi-1440\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\_\plain\f0\fs24\cf0 \tab insert a forced space, overriding left-justification for the rest of the string\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\n\plain\f0\fs24\cf0 \tab insert a forced newline\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 As usual, a single "\\" at the end of a line signals that the line continues with the following line.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Examples:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print "\\"Hello!\\""\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab "Hello!"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print "Print a...\\n...newline"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab Print a...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab ...newline\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print "One\\\\two\\\\three"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab One\\two\\three\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print " Left-justified"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print "\\_ Not left-justified"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab Left-justified\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab Not left-justified\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print "This is a \\\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab single line."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab This is a single line.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (Although\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print "This is a\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab single line."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will produce the same result, since the line break occurs within quotation marks.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: These control-character combinations are valid for printing only; they are not treated as \plain\f0\fs24\cf0 literals, as in, for example, expressions involving dictionary entries.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 After each of the above print commands, a newline is printed. To avoid this, append a semicolon \plain\f0\fs24\cf0 ('\plain\f1\fs24\cf0 ;\plain\f0\fs24\cf0 ') to the end of the \plain\f1\fs24\cf0 print\plain\f0\fs24\cf0 statement.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print "This is a ";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print "single line."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab This is a single line.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Print statements may also contain data types, or a combination of data types and strings. The \plain\f0\fs24\cf0 command\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print "The "; object.name; " is closed."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will print the word located at the dictionary address specified by \plain\f1\fs24\cf0 object.name\plain\f0\fs24\cf0 , so that if \plain\f1\fs24\cf0 object.name\plain\f0\fs24\cf0 points to the word "box", the resulting output would be:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab The box is closed.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To capitalize the first letter of the specified word, use the '\plain\f1\fs24\cf0 capital\plain\f0\fs24\cf0 ' modifier.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print "The "; capital object.name; " is closed."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab The Box is closed.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To print the data type as a value instead of referencing the dictionary, use the '\plain\f1\fs24\cf0 number\plain\f0\fs24\cf0 ' modifier. \plain\f0\fs24\cf0 For example, if the variable \plain\f1\fs24\cf0 time\plain\f0\fs24\cf0 holds the value 5,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print "There are "; number time; " seconds remaining."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab There are 5 seconds remaining.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 If '\plain\f1\fs24\cf0 number\plain\f0\fs24\cf0 ' were not used, the engine would try to find a word at the dictionary address 5, and the \plain\f0\fs24\cf0 result will likely be garbage.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: Mainly for debugging purposes, the modifier '\plain\f1\fs24\cf0 hex\plain\f0\fs24\cf0 ' prints the data type as a hexadecimal \plain\f0\fs24\cf0 number instead of a decimal one. If the variable \plain\f1\fs24\cf0 val\plain\f0\fs24\cf0 equals 127,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print number val; " is "; hex val; " in hexadecimal."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 127 is 7F in hexadecimal.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The second way to print text is from the text bank, from which-if memory is in short \plain\f0\fs24\cf0 supply-sections are loaded from disk only when they are needed by the program. This method is \plain\f0\fs24\cf0 provided so that lengthy blocks of text-such as description and narration-do not take up valuable \plain\f0\fs24\cf0 space if memory is limited. The command consists simply of a quoted string without any \plain\f0\fs24\cf0 preceding statement.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab "This string would be written to disk."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab This string would be written to disk.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 or\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab "So would this one ";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab "and this one."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab So would this one and this one.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Notice that a semicolon at the end of the statement still overrides the newline. The in-string \plain\f0\fs24\cf0 control-character combinations are still usable with these print statements, but since each command \plain\f0\fs24\cf0 is a single line, data types and other modifiers may not be compounded. Because of that,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab "\\"Hello,\\"" he said."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will write\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab "Hello," he said.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 to the \plain\f1\fs24\cf0 .HEX\plain\f0\fs24\cf0 file text bank, but\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab "There are "; number time_left; " seconds remaining."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 is illegal.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The color of text may be changed using the '\plain\f1\fs24\cf0 color\plain\f0\fs24\cf0 ' command (also usable with the U.K. spelling \plain\f0\fs24\cf0 "colour"). The format is\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab color [, [, ]]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where the background color is not necessary. If no background color is specified, the current one is \plain\f0\fs24\cf0 assumed).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The input color is also not necessary-this refers to the color of player input.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The standard color set with corresponding values and constant labels is:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\brdrb\brdrs\brdrw20\brsp20{\tx720\tx2880\tx5760 \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab COLOR\tab CONSTANT VALUE\tab LABEL\par }}{\tx720\tx5760\tx3600 \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f0\fs24\cf0 Black\tab 0\tab \plain\f1\fs24\cf0 BLACK\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Blue\tab 1\tab \plain\f1\fs24\cf0 BLUE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Green\tab 2\tab \plain\f1\fs24\cf0 GREEN\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Cyan\tab 3\tab \plain\f1\fs24\cf0 CYAN\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Red\tab 4\tab \plain\f1\fs24\cf0 RED\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Magenta\tab 5\tab \plain\f1\fs24\cf0 MAGENTA\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Brown\tab 6\tab \plain\f1\fs24\cf0 BROWN\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab White\tab 7\tab \plain\f1\fs24\cf0 WHITE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Dark gray\tab 8\tab \plain\f1\fs24\cf0 DARK_GRAY\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Light blue\tab 9\tab \plain\f1\fs24\cf0 LIGHT_BLUE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Light green\tab 10\tab \plain\f1\fs24\cf0 LIGHT_GREEN\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Light cyan\tab 11\tab \plain\f1\fs24\cf0 LIGHT_CYAN\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Light red\tab 12\tab \plain\f1\fs24\cf0 LIGHT_RED\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Light magenta\tab 13\tab \plain\f1\fs24\cf0 LIGHT_MAGENTA\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Yellow\tab 14\tab \plain\f1\fs24\cf0 YELLOW\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Bright white\tab 15\tab \plain\f1\fs24\cf0 BRIGHT_WHITE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Default foreground\tab 16\tab \plain\f1\fs24\cf0 DEF_FOREGROUND\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Default background\tab 17\tab \plain\f1\fs24\cf0 DEF_BACKGROUND\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Default statusline (fore)\tab 18\tab \plain\f1\fs24\cf0 DEF_SL_FOREGROUND\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Default statusline (back)\tab 19\tab \plain\f1\fs24\cf0 DEF_SL_BACKGROUND\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \plain\f0\fs24\cf0 Match foreground\plain\f1\fs24\cf0 \tab 20\tab MATCH_FOREGROUND\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (The labels are defined in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 ; when using the library, it is never necessary to refer to a \plain\f0\fs24\cf0 color by its numerical value.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 It is expected that, regardless of the system, any color will print visibly on any other color. \plain\f0\fs24\cf0 However, it is suggested for practicality that white (and less frequently bright while) be used for \plain\f0\fs24\cf0 most text-printing. Blue and black are fairly standard background colors.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Magenta printing on a cyan background is accomplished by\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab color MAGENTA, CYAN\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 or\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab color 5, 3\tab \tab \tab ! if not using HUGOLIB.H\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 A current line can be filled-with blank spaces in the current color-to a specified column (essentially \plain\f0\fs24\cf0 a tab stop) using the "\plain\f1\fs24\cf0 print to...\plain\f0\fs24\cf0 " structure as follows:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print "Time:"; to 40; "Date:"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where the value following '\plain\f1\fs24\cf0 to\plain\f0\fs24\cf0 ' does not exceed the maximum line length in the engine global \plain\f1\fs24\cf0 linelength\plain\f0\fs24\cf0 .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The resulting output will be something like:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Time:\tab \tab \tab \tab \tab \tab Date:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Text can be specifically located using the '\plain\f1\fs24\cf0 locate'\plain\f0\fs24\cf0 command via\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab locate , \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab locate 1, 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 places text output at the top left corner of the current text window. Neither \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 nor \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 \plain\f0\fs24\cf0 may exceed the current window boundaries-the engine will automatically trim them as necessary.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=30 dt=RTF IV.d. More Control Characters 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 IV.d.\tab More Control Characters\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 As listed above, the following are valid control characters that may be embedded in printed strings:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\"\plain\f0\fs24\cf0 \tab quotation marks\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\\\\plain\f0\fs24\cf0 \tab a literal backslash character\par {\tx720 \qj\li1440\fi-1440\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\_\plain\f0\fs24\cf0 \tab a forced space, overriding left-justification for the rest of the string\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\n\tab \plain\f0\fs24\cf0 a newline\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The next set of control characters control the appearance of printed text by turning on and off \plain\f0\fs24\cf0 boldface, italic, proportional, and underlined printing. Not all computers and operating systems \plain\f0\fs24\cf0 are able to provide all types of printed output; however, the engine can be relied upon to properly \plain\f0\fs24\cf0 process any formatting-i.e., proportionally printed text will still look fine even on a system that has \plain\f0\fs24\cf0 only a fixed-width font, such as MS-DOS (although, of course, it won't be proportionally spaced).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\B\plain\f0\fs24\cf0 \tab boldface on\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\b\plain\f0\fs24\cf0 \tab boldface off\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\I\plain\f0\fs24\cf0 \tab italics on\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\i\plain\f0\fs24\cf0 \tab italics off\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\P\plain\f0\fs24\cf0 \tab proportional printing on\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\p\plain\f0\fs24\cf0 \tab proportional printing off\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\U\plain\f0\fs24\cf0 \tab underlining on\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\u\plain\f0\fs24\cf0 \tab underlining off\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (Print style can also be changed using the \plain\f1\fs24\cf0 Font\plain\f0\fs24\cf0 routine in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 . Font-change constants can \plain\f0\fs24\cf0 be combined as in:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Font(BOLD_ON | ITALICS_ON | PROP_OFF)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where the valid constants are \plain\f1\fs24\cf0 BOLD_ON\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 BOLD_OFF\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 ITALICS_ON\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 ITALICS_OFF\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 UNDERLINE_ON\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 UNDERLINE_OFF\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 PROP_ON\plain\f0\fs24\cf0 , and \plain\f1\fs24\cf0 PROP_OFF\plain\f0\fs24\cf0 .)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Special characters can also be printed via control characters. Note that these characters are \plain\f0\fs24\cf0 contained in the Latin-1 character set; if a particular system is incapable of displaying it, it will \plain\f0\fs24\cf0 display the normal-ASCII equivalent. (The following examples, appearing in parentheses, may not \plain\f0\fs24\cf0 display properly on all computers and printers.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li4320\fi-4320\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \\`\plain\f0\fs24\cf0 \tab \tab accent grave\tab \tab followed by a letter\par \qj\li4320\fi-4320\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab \tab e.g. "\\`a" will print an 'a' with an accent grave (\'e0)\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\'\plain\f0\fs24\cf0 \tab \tab accent acute\tab \tab followed by a letter\par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li4320\fi-4320\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab \tab e.g. "\\'E" will print an 'E' with an accent acute (\'c9)\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\~\plain\f0\fs24\cf0 \tab \tab tilde\tab \tab \tab followed by a letter\par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li4320\fi-4320\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab \tab e.g. "\\~n" will print an 'n' with a tilde (\'f1)\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\^\plain\f0\fs24\cf0 \tab \tab circumflex\tab \tab followed by a letter\par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li4320\fi-4320\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab \tab e.g. "\\^i" will print an 'i' with a circumflex (\'ee)\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\:\plain\f0\fs24\cf0 \tab \tab umlaut\tab \tab \tab followed by a letter\par \qj\li4320\fi-4320\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab e.g. "\\:u" will print a 'u' with an umlaut (\'fc)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\,\plain\f0\fs24\cf0 \tab \tab cedilla\tab \tab \tab followed by c or C\par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li4320\fi-4320\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab \tab e.g. "\\,c" will print a 'c' with a cedilla (\'e7)\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\<\plain\f0\fs24\cf0 or \plain\f1\fs24\cf0 \\>\plain\f0\fs24\cf0 \tab Spanish quotation marks \tab \tab \tab (\'ab \'bb)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\!\plain\f0\fs24\cf0 \tab \tab upside-down exclamation point\tab \tab (\'a1)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\?\plain\f0\fs24\cf0 \tab \tab upside-down question mark \tab \tab \tab (\'bf)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\ae\plain\f0\fs24\cf0 \tab \tab ae ligature\tab \tab \tab \tab \tab (\'e6)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\AE\plain\f0\fs24\cf0 \tab \tab AE ligature\tab \tab \tab \tab \tab (\'c6)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\c\plain\f0\fs24\cf0 \tab \tab cents symbol\tab \tab \tab \tab \tab (\'a2)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\L\plain\f0\fs24\cf0 \tab \tab British pound\tab \tab \tab \tab \tab (\'a3)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\Y\plain\f0\fs24\cf0 \tab \tab Japanese Yen\tab \tab \tab \tab \tab (\'a5)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\-\plain\f0\fs24\cf0 \tab \tab em dash\tab \tab \tab \tab \tab (-)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440 \qj\li2160\fi-2160\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \\#xxx\plain\f0\fs24\cf0 \tab any ASCII character where xxx represents the three-digit ASCII number of the \plain\f0\fs24\cf0 character to be printed\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab e.g. "\plain\f1\fs24\cf0 \\#065\plain\f0\fs24\cf0 " will print an 'A' (ASCII 65)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=34 dt=RTF Example: Mixing Text Styles 3 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}{\f4\fnil\fcharset0 Lucida Console;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 Example:\tab Mixing Text Styles\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab ! Sample routine to print various typefaces and colors:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #include "hugolib.h"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab routine PrintingSample\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print "Text may be printed in \\Bboldface\\b,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \\Iitalics\\i, \\Uunderlined\\u, or \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \\Pproportional\\p typefaces."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab color RED\tab \tab \tab \tab ! or color 4\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print "\\nGet ready. ";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab color YELLOW\tab \tab \tab ! color 14\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print "Get set. ";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab color GREEN\tab \tab \tab ! color 2\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print "Go!"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The output will be:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Text may be printed in boldface, italics, underlined, or\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab proportional typefaces.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Get ready. Get set. Go!\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 with \plain\f0\fs24\cf0\b "boldface"\plain\f0\fs24\cf0 , \plain\f0\fs24\cf0\i "italics"\plain\f0\fs24\cf0 , \plain\f0\fs24\cf0\ul "underlined"\plain\f0\fs24\cf0 , and \plain\f4\fs24\cf0 "proportional"\plain\f0\fs24\cf0 printed in their respective \plain\f0\fs24\cf0 typefaces. \plain\f0\fs24\cf1 "Get ready"\plain\f0\fs24\cf0 ,\plain\f0\fs24\cf4 "Get set"\plain\f0\fs24\cf0 , and \plain\f0\fs24\cf8 "Go!"\plain\f0\fs24\cf0 will all appear on the same line in three different colors.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Note that not all computers will be able to print all typefaces. The basic MS-DOS ports, for \plain\f0\fs24\cf0 example, uses color changes instead of actual typeface changes, and does not support proportional \plain\f0\fs24\cf0 printing.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=31 dt=RTF IV.e. Operators and Assignments 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 IV.e.\tab Operators and Assignments\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Hugo allows use of all standard math operators:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab +\tab addition\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab -\tab subtraction\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab *\tab multiplication\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab /\tab integer division\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Comparisons are also valid as operators, returning Boolean true or false (1 or 0) so that\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab 2 + (x = 1)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab 5 - (x > 1)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 evaluate respectively to 3 and 5 if x is 1, and 2 and 4 if x is 2 or greater.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Valid relational operators are\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab =\tab equal to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab ~=\tab not equal to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab <\tab less than\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab >\tab greater than\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab <=\tab less than or equal to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab >=\tab greater than or equal to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Logical operators ('\plain\f1\fs24\cf0 and\plain\f0\fs24\cf0 ', '\plain\f1\fs24\cf0 or\plain\f0\fs24\cf0 ', and '\plain\f1\fs24\cf0 not\plain\f0\fs24\cf0 ') are also allowed.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab (x and y) or (a and b)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab (j + 5) and not ObjectisLight(k)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Using '\plain\f1\fs24\cf0 and\plain\f0\fs24\cf0 ' results in true (1) if both values are non-zero. Using '\plain\f1\fs24\cf0 or\plain\f0\fs24\cf0 ' results in true if either is \plain\f0\fs24\cf0 non-zero. '\plain\f1\fs24\cf0 not\plain\f0\fs24\cf0 ' results in true only if the following value is zero.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab 1 and 1 = 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab 1 and 0 = 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab 5 and 3 = 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab 0 and 9 = 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab 0 and 169 and 1\tab = 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab 1 and 12 and 1233 = 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab 1 or 1 = 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab 35 or 0 = 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab 0 or 0 = 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab not 0 = 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab not 1 = 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab not 8 = 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab 1 and 7 or (14 and not 0) = 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab (0 or not 1) and 3 = 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Additionally, bitwise operators are provided:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 1 & 1 = 1\plain\f0\fs24\cf0 \tab \tab (Bitwise and)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab 1 & 0 = 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 1 | 0 = 1\plain\f0\fs24\cf0 \tab \tab (Bitwise or)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab 1 | 1 = 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ~0 = -1\plain\f0\fs24\cf0 \tab \tab (Bitwise not/inverse)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (A detailed explanation of bitwise operations is a little beyond the scope of this manual; \plain\f0\fs24\cf0 programmers may occasionally use the '\plain\f1\fs24\cf0 |\plain\f0\fs24\cf0 ' operator to combine bitmask-type parameters for certain \plain\f0\fs24\cf0 library functions such as fonts and list-formats, but only advanced users should have to worry \plain\f0\fs24\cf0 about employing bitwise operators to any great extent in practical programming.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Any Hugo data type can appear in an expression, including routines, attribute tests, properties, \plain\f0\fs24\cf0 constants, and variables. Standard mathematical rules for order of significance in evaluating an \plain\f0\fs24\cf0 expression apply, so that parenthetical sub-expressions are evaluated first, followed by \plain\f0\fs24\cf0 multiplication and division, followed by addition and subtraction.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Some sample combinations are:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab 10 + object.size\tab \tab ! integer constant and property\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab object is openable + 1\tab ! attribute test and constant\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab FindLight(location) + a\tab ! return value and variable\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab 1 and object is light\tab ! constant, logical test,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab \tab ! and attribute\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Expressions can be evaluated and assigned to either a variable or a property.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab = \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab . [#] = \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 In certain cases, the compiler may allow a statement where the left-hand side of the assignment is \plain\f0\fs24\cf0 non-modifiable. I.e.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Function() = \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 or\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab .# = \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 may be compiled, but such statements will force a run-time error from the Hugo Engine.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=32 dt=RTF IV.f. Efficient Operators 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'02\'04);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'05);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'06);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'07);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'08);}{\levelnumbers\'01;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 IV.f.\tab Efficient Operators\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Something like\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab number_of_items = number_of_items + 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if number_of_items > 10\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print "Too many items!"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 can be coded more simply as\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if ++number_of_items > 10\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print "Too many items!"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The '\plain\f1\fs24\cf0 ++\plain\f0\fs24\cf0 ' operator increases the following variable by one before returning the value of the variable. \plain\f0\fs24\cf0 Similarly, '\plain\f1\fs24\cf0 -\plain\f0\fs24\cf0 ' can precede a variable to decrease the value by one before returning it. Since these \plain\f0\fs24\cf0 operators act before the value is returned, they are called "pre-increment" and "pre-decrement".\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 If '\plain\f1\fs24\cf0 ++\plain\f0\fs24\cf0 ' or '\plain\f1\fs24\cf0 -\plain\f0\fs24\cf0 ' comes AFTER a variable, the value of the variable is returned and then the value is \plain\f0\fs24\cf0 increased or decreased, respectively. In these usages, the operators are called "post-increment" and \plain\f0\fs24\cf0 "post-decrement".\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 For example,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab while ++i < 5\tab \tab ! pre-increment\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print number i; " ";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will output:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab 1 2 3 4\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 But\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab while i++ < 5\tab \tab ! post-increment\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print number i; " ";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will output:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab 1 2 3 4 5\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Since in the second example, the variable is increased before getting the value, while in the second \plain\f0\fs24\cf0 example, it is increased after checking it.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 It is also possible to use the operators '\plain\f1\fs24\cf0 +=\plain\f0\fs24\cf0 ', '\plain\f1\fs24\cf0 -=\plain\f0\fs24\cf0 ', '\plain\f1\fs24\cf0 *=\plain\f0\fs24\cf0 ', '\plain\f1\fs24\cf0 /=\plain\f0\fs24\cf0 ', '\plain\f1\fs24\cf0 &=\plain\f0\fs24\cf0 ', and '\plain\f1\fs24\cf0 |=\plain\f0\fs24\cf0 '. These can also be used to \plain\f0\fs24\cf0 modify a variable at the same time its value is being checked. All of these, however, operate before \plain\f0\fs24\cf0 the value in question is returned.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x = 5\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab y = 10\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print "x = "; number x*=y; ", y = "; number y\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Result:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab x = 50, y = 10\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 When the compiler is processing any of the above lines, the efficient operator takes precedence \plain\f0\fs24\cf0 over a normal (i.e., single-character) operator.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 For example,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x = y + ++z\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 is actually compiled as\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x = y++ + z\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 since the '++' is parsed first. To properly code this line with a pre-increment on the z variable \plain\f0\fs24\cf0 instead of a post-increment on y:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x = y + (++z)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=33 dt=RTF IV.g. Arrays and Strings 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 IV.g.\tab Arrays and Strings\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Prior to this point, little has been said about arrays. Arrays are sets of values that share a common \plain\f0\fs24\cf0 name, and where the elements are referenced by number. Arrays are defined by\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab array []\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 must be a numerical constant.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 An array definition reserves a block of memory of \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 16-bit words, so that, for \plain\f0\fs24\cf0 example,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab array test_array[10]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 initializes ten 16-bit words for the array.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Keep in mind that \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 determines the size of the array, NOT the maximum element \plain\f0\fs24\cf0 number. Elements begin counting at 0, so that \plain\f1\fs24\cf0 test_array\plain\f0\fs24\cf0 , with 10 elements, has members \plain\f0\fs24\cf0 numbered from 0 to 9. Trying to access \plain\f1\fs24\cf0 test_array[10]\plain\f0\fs24\cf0 or higher would return a meaningless \plain\f0\fs24\cf0 value. (Trying to assign it by mistake would likely overwrite something important, like the \plain\f0\fs24\cf0 next-defined array.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To prevent such out-of-bounds array reading/writing, an array's length may be read via:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab array[]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where no element number is specified. Using the above example,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print number test_array[]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 would result in "10".\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Array elements can be assigned more than one at a time, as in\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab = , , ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 can be expressions or single values.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Elements need not be all of the same type, either, so that\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab test_array[0] = (10+5)*x, "Hello!", FindLight(location)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 is perfectly legal (although perhaps not perfectly useful). More common is a usage like\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab names[0] = "Ned", "Sue", "Bob", "Maria"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 or\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab test_array[2] = 5, 4, 3, 2, 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The array can then be accessed by\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print names[0]; " and "; names[3]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab Ned and Maria\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 or\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab b = test_array[3] + test_array[5]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 which would set the variable \plain\f1\fs24\cf0 b\plain\f0\fs24\cf0 to 4 + 2, or 6.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Because array space is statically allocated by the compiler, all arrays must be declared at the global \plain\f0\fs24\cf0 level. Local arrays are illegal, as are entire arrays passed as arguments. However, single elements \plain\f0\fs24\cf0 of arrays are valid arguments.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Significantly, it is possible to pass an array address as an argument, and the routine can then access \plain\f0\fs24\cf0 the elements of the array using the '\plain\f1\fs24\cf0 array\plain\f0\fs24\cf0 ' modifier. For example, if items is an array containing:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab items[0] = "apples"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab items[1] = "oranges"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab items[2] = "socks"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The following:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab routine Test(v)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print array v[2]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 can be called using\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Test(items)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 to produce the output "socks", even though \plain\f1\fs24\cf0 v\plain\f0\fs24\cf0 is an argument (i.e., local variable), and not an array. \plain\f0\fs24\cf0 The line "\plain\f1\fs24\cf0 print array v[2]\plain\f0\fs24\cf0 " tells the engine to treat \plain\f1\fs24\cf0 v\plain\f0\fs24\cf0 as an array address, not as a discrete \plain\f0\fs24\cf0 value.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Array strings are also possible, and Hugo provides a way to store a dictionary entry in an array as a \plain\f0\fs24\cf0 series of characters using the '\plain\f1\fs24\cf0 string\plain\f0\fs24\cf0 ' command:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab string(, , )\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (The \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 provision is required because the engine has no way of checking for array \plain\f0\fs24\cf0 boundaries.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 For example,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab string(a, word[1], 10)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will store up to 10 characters from \plain\f1\fs24\cf0 word[1]\plain\f0\fs24\cf0 into \plain\f1\fs24\cf0 a\plain\f0\fs24\cf0 .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: It is expected in the preceding example that a would have at least 11 elements, since \plain\f0\fs24\cf0 '\plain\f1\fs24\cf0 string\plain\f0\fs24\cf0 ' expects to store a terminating 0 or null character after the string itself.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 For example,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x = string(a, word[1], 10)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will store up to 10 characters of \plain\f1\fs24\cf0 word[1]\plain\f0\fs24\cf0 in the array \plain\f1\fs24\cf0 a\plain\f0\fs24\cf0 , and return the length of the stored string \plain\f0\fs24\cf0 to the variable \plain\f1\fs24\cf0 x\plain\f0\fs24\cf0 .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (The engine variables '\plain\f1\fs24\cf0 parse$\plain\f0\fs24\cf0 ' and '\plain\f1\fs24\cf0 serial$\plain\f0\fs24\cf0 ' may be used in place of the dictionary entry \plain\f0\fs24\cf0 address; see the section below on \plain\f0\fs24\cf0\i "Junction Routines: ParseError"\plain\f0\fs24\cf0 for a description.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The library defines the functions \plain\f1\fs24\cf0 StringCopy\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 StringEqual\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 StringLength\plain\f0\fs24\cf0 , and \plain\f1\fs24\cf0 StringPrint\plain\f0\fs24\cf0 , which are extremely useful when dealing with string arrays.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 StringCopy\plain\f0\fs24\cf0 copies one string array to another array.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab StringCopy(, [, ])\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 For example,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab StringCopy(a, b)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 copies the contents of \plain\f1\fs24\cf0 b\plain\f0\fs24\cf0 to \plain\f1\fs24\cf0 a\plain\f0\fs24\cf0 , while\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab StringCopy(a, b, 5)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 copies only up to 5 characters of \plain\f1\fs24\cf0 b\plain\f0\fs24\cf0 to \plain\f1\fs24\cf0 a\plain\f0\fs24\cf0 .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x = StringEqual(, )\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x = StringCompare(, )\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 StringEqual\plain\f0\fs24\cf0 returns true only if the two specified string arrays are identical. \plain\f1\fs24\cf0 StringCompare\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 returns 1 if \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is lexically greater than \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 , -1 if \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is lexically less \plain\f0\fs24\cf0 than \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 , and 0 if the two strings are identical.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 StringLength\plain\f0\fs24\cf0 returns the length of a string array, as in:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab len = StringLength(a)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 StringPrint\plain\f0\fs24\cf0 prints a string array (or part of it).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab StringPrint([, , ])\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 For example, if a contains "presto",\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab StringPrint(a)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will print "presto", but\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab StringPrint(a, 1, 4)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will print "res". (The \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 parameter in the first example defaults to 0, not 1-the first \plain\f0\fs24\cf0 numbered element in an array is 0.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 An interesting side-effect of being able to pass array addresses as arguments is that it is possible to \plain\f0\fs24\cf0 "cheat" the address, so that, for example,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab StringCopy(a, b+2)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will copy \plain\f1\fs24\cf0 b\plain\f0\fs24\cf0 to \plain\f1\fs24\cf0 a\plain\f0\fs24\cf0 , beginning with the third letter of \plain\f1\fs24\cf0 b\plain\f0\fs24\cf0 (since the first letter of \plain\f1\fs24\cf0 b\plain\f0\fs24\cf0 is \plain\f1\fs24\cf0 b[0]\plain\f0\fs24\cf0 ).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 It should also be kept in mind that string arrays and dictionary entries are two entirely separate \plain\f0\fs24\cf0 animals, and that comparing them directly is using \plain\f1\fs24\cf0 StringCompare\plain\f0\fs24\cf0 is not possible. That is, \plain\f0\fs24\cf0 while a dictionary entry is a simple value representing an address, a string array is a series of \plain\f0\fs24\cf0 values each representing a character in the string.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The library provides the following to overcome this:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab StringDictCompare(, )\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 which returns the same values (1, -1, 0) as \plain\f1\fs24\cf0 StringCompare\plain\f0\fs24\cf0 , depending on whether the string \plain\f0\fs24\cf0 array is lexically greater than, less than, or equal to the dictionary entry.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (There is a complement to the '\plain\f1\fs24\cf0 string\plain\f0\fs24\cf0 ' command, the '\plain\f1\fs24\cf0 dict\plain\f0\fs24\cf0 ' function, that dynamically creates a \plain\f0\fs24\cf0 new dictionary entry at runtime. Its syntax is:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x = dict(, )\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x = dict(parse$, )\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where the contents of \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 or \plain\f1\fs24\cf0 parse$\plain\f0\fs24\cf0 are written into the dictionary, to a maximum of \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 characters, and the address of the new word is returned.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 However, since this requires extending the actual length of the dictionary table in the game file, it is \plain\f0\fs24\cf0 necessary to provide for this during compilation. Inserting\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab $MAXDICTEXTEND=\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 at the start of the source file will write a buffer of empty bytes at the end of the \plain\f0\fs24\cf0 dictionary. (\plain\f1\fs24\cf0 MAXDICTEXTEND\plain\f0\fs24\cf0 is, by default, 0.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Dynamic dictionary extension is used primarily in situations where the player may be able to, for \plain\f0\fs24\cf0 example, name an object, then refer to that object by the new name. In this case, the new words will \plain\f0\fs24\cf0 have to exist in the dictionary, and must be written using '\plain\f1\fs24\cf0 dict\plain\f0\fs24\cf0 '. However, a guideline for \plain\f0\fs24\cf0 programmers is that there should be a limit to how many new words the player can cause to be \plain\f0\fs24\cf0 created, so that the total length of the new entries never exceeds \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 , keeping in mind that \plain\f0\fs24\cf0 the length of an entry is the number of characters plus one (the byte representing the actual length). \plain\f0\fs24\cf0 That is, the word "test" requires 5 bytes.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=35 dt=RTF Example: Managing Strings 3 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard{\brdrt\brdrs\brdrb\brdrs\brdrl\brdrs\brdrr\brdrs\brdrw20\brsp20\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 Example:\tab Managing Strings\par }}\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #include "hugolib.h"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab array s1[32]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab array s2[10]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab array s3[10]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab routine StringTests\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab local a, len\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab a = "This is a sample string."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab len = string(s1, a, 31)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab string(s2, "Apple", 9)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab string(s3, "Tomato", 9)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print "a = \\""; a; "\\""\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print "(Dictionary address: "; number a; ")"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print "s1 contains \\""; StringPrint(s1); "\\""\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print "(Array address: "; number s1;\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print ", length = "; number len; ")"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print "s2 is \\""; StringPrint(s2);\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print "\\", s3 is \\""; StringPrint(s3); "\\""\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab "\\nStringCompare(s1, s2) = ";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print number StringCompare(s1, s2)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab "StringCompare(s1, s3) = ";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print number StringCompare(s1, s3)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The output will be:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab a = "This is a sample string."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab (Dictionary address = 887)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab s1 contains "This is a sample string."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab (Array address = 1625, length = 24)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab s2 is "Apple", s3 is "Tomato"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab StringCompare(s1, s2) = 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab StringCompare(s1, s3) = -1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 As is evident above, a dictionary entry does not need to be a single word; any piece of text which \plain\f0\fs24\cf0 must be treated as a value gets entered into the dictionary table.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The argument 31 in the first call to the '\plain\f1\fs24\cf0 string\plain\f0\fs24\cf0 ' function allows up to 31 characters from a to be \plain\f0\fs24\cf0 copied to s1, but since the length of a is only 24 characters, only 25 values (including the \plain\f0\fs24\cf0 terminating 0) get copied, and the string length of s1 is returned in len.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Since "A(pple)" is lexically less than "T(his...)", comparing the two returns -1. As "To(mato)" is \plain\f0\fs24\cf0 lexically greater than "Th(is...)", \plain\f1\fs24\cf0 StringCompare\plain\f0\fs24\cf0 returns 1.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 } } 5P9i0s8y19Z id=36 dt=RTF IV.h. Conditional Expressions And Program Flow 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 IV.h.\tab Conditional Expressions And Program Flow\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Program flow can be controlled using a variety of constructions, each of which is built around an \plain\f0\fs24\cf0 expression that evaluates to false (zero) or non-false (non-zero).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The most basic of these is the '\plain\f1\fs24\cf0 if\plain\f0\fs24\cf0 ' statement.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{...conditional code block...\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: The enclosing braces are not necessary if the code block is a single line. Note also that the \plain\f0\fs24\cf0 conditional block may begin (and even end) on the same line as the '\plain\f1\fs24\cf0 if\plain\f0\fs24\cf0 ' statement provided that \plain\f0\fs24\cf0 braces are used.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...single line...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if \{...conditional code block...\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 If braces are not used for a single line, the compiler automatically inserts them, although special \plain\f0\fs24\cf0 care must be taken when constructing a block of code nesting several single-line conditionals.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 While\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab if \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab ...conditional code block...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 may be properly interpreted,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab for (......)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab if \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab ...conditional code block...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will not be.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (Technically speaking, the compiler will misunderstand the end of the '\plain\f1\fs24\cf0 for\plain\f0\fs24\cf0 ' loop construction \plain\f0\fs24\cf0 because the enclosing conditional code block expects to end with the '\plain\f1\fs24\cf0 for\plain\f0\fs24\cf0 ' expression. In turn the \plain\f0\fs24\cf0 '\plain\f1\fs24\cf0 for\plain\f0\fs24\cf0 ' expression does not properly differentiate the end of the conditional loop. The result would \plain\f0\fs24\cf0 likely be a stack overflow error in the engine because the engine will continually nest the execution \plain\f0\fs24\cf0 of recursive '\plain\f1\fs24\cf0 for\plain\f0\fs24\cf0 ' loops until it runs out of stack space.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The proper way to structure that same section of code would be:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab for (......)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab if \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab ...conditional code block...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: The best advice is to rely on braces to clarify code structure whenever using such complex \plain\f0\fs24\cf0 constructions. This applies particularly to mixing '\plain\f1\fs24\cf0 if\plain\f0\fs24\cf0 ', '\plain\f1\fs24\cf0 for\plain\f0\fs24\cf0 ', '\plain\f1\fs24\cf0 while\plain\f0\fs24\cf0 ' and "\plain\f1\fs24\cf0 do-while\plain\f0\fs24\cf0 " \plain\f0\fs24\cf0 expressions, especially when recursive function calls are involved. While the results may appear \plain\f0\fs24\cf0 as intended, the method to produce them is incorrect, and any long-running such construction is \plain\f0\fs24\cf0 almost guaranteed to crash the stack.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v Be especially cautious when nesting 'if' statements. An 'if' statement and the attached conditional statement/block are 'not' a single line as in C. Always use braces in these cases to avoid the compiler turningand should be coded as such.\plain\f0\fs24\cf0 More elaborate uses of '\plain\f1\fs24\cf0 if\plain\f0\fs24\cf0 ' involve the use of '\plain\f1\fs24\cf0 elseif\plain\f0\fs24\cf0 ' and '\plain\f1\fs24\cf0 else\plain\f0\fs24\cf0 '.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...first conditional code block...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab elseif \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...second conditional code block...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab elseif \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...third conditional code block...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab else\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...default code block...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 In this case, the engine evaluates each expression until it finds one that is true, and then executes it. \plain\f0\fs24\cf0 Control then passes to the next non-\plain\f1\fs24\cf0 if\plain\f0\fs24\cf0 /\plain\f1\fs24\cf0 elseif\plain\f0\fs24\cf0 /\plain\f1\fs24\cf0 else\plain\f0\fs24\cf0 statement following the conditional \plain\f0\fs24\cf0 construction. If no true expression is found, the default code block is executed. If, for example, \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 evaluates to a non-false value, then none of the following expressions are tested.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Of course, all three ('\plain\f1\fs24\cf0 if\plain\f0\fs24\cf0 ', '\plain\f1\fs24\cf0 elseif\plain\f0\fs24\cf0 ', and '\plain\f1\fs24\cf0 else\plain\f0\fs24\cf0 ') need not be used every time, and simple \plain\f0\fs24\cf0 "\plain\f1\fs24\cf0 if-elseif\plain\f0\fs24\cf0 " and "\plain\f1\fs24\cf0 if-else\plain\f0\fs24\cf0 " combinations are perfectly valid.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 In certain cases, the '\plain\f1\fs24\cf0 if\plain\f0\fs24\cf0 ' statement may not lend itself perfectly to clarity, and the "\plain\f1\fs24\cf0 select-case\plain\f0\fs24\cf0 " \plain\f0\fs24\cf0 construction may be more appropriate. The general form is:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab select \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab case [, , ...]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab ...first conditional code block...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab case [, , ...]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab ...second conditional code block...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab case else\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab ..default code block...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 In this case, the engine quickly performs an evaluation that is essentially\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if = [or = ...]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 There is no limit on the number of values (separated by commas) that can appear on a line \plain\f0\fs24\cf0 following '\plain\f1\fs24\cf0 case\plain\f0\fs24\cf0 '. The same rules for bracing multiple-line code blocks apply as with '\plain\f1\fs24\cf0 if\plain\f0\fs24\cf0 ' (as well \plain\f0\fs24\cf0 as for every other type of conditional block).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: Cases do not "fall through" to the following case. Think of cases following the first as being \plain\f0\fs24\cf0 '\plain\f1\fs24\cf0 elseif\plain\f0\fs24\cf0 ' statements rather than '\plain\f1\fs24\cf0 if\plain\f0\fs24\cf0 ' statements; once a true case has been found, subsequent cases \plain\f0\fs24\cf0 are ignored.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Basic loops may be coded using '\plain\f1\fs24\cf0 while\plain\f0\fs24\cf0 ' and "\plain\f1\fs24\cf0 do-while\plain\f0\fs24\cf0 ".\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab while \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...conditional code block...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab do\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...conditional code block...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab while \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Each of these executes the conditional code block as long as \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 holds true. It is \plain\f0\fs24\cf0 assumed that the code block somehow alters \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 so that at some point it will become \plain\f0\fs24\cf0 false; otherwise the loop will execute endlessly.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab while x <= 10\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{x = x + 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print "x is "; number x\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab do\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{x = x + 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print "x is "; number x\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab while x <= 10\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The only difference between the two is that if \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is false at the outset, the '\plain\f1\fs24\cf0 while\plain\f0\fs24\cf0 ' \plain\f0\fs24\cf0 code block will never run. The "\plain\f1\fs24\cf0 do-while\plain\f0\fs24\cf0 " code block will run at least once even if \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is false at the outset.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The most complex loop construction uses the '\plain\f1\fs24\cf0 for\plain\f0\fs24\cf0 ' statement.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab for (; ; )\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...conditional code block...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 For example:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab for (i=1; i<=15; i=i+1)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print "i is "; number i\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 First, the engine executes the assignment setting "\plain\f1\fs24\cf0 i = 1\plain\f0\fs24\cf0 ". Then, it executes the \plain\f1\fs24\cf0 print\plain\f0\fs24\cf0 statement. \plain\f0\fs24\cf0 Next, it checks to see if the expression holds true (if \plain\f1\fs24\cf0 i\plain\f0\fs24\cf0 is less than or equal to 15). If it does, it \plain\f0\fs24\cf0 executes the \plain\f1\fs24\cf0 print\plain\f0\fs24\cf0 statement and the modifying assignment that increments \plain\f1\fs24\cf0 i\plain\f0\fs24\cf0 . It continues the \plain\f0\fs24\cf0 loop until the expression tests false.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Not all elements of the '\plain\f1\fs24\cf0 for\plain\f0\fs24\cf0 ' construction are necessary. For example, the assignment may be \plain\f0\fs24\cf0 omitted, as in\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab for (; i<=15; i=i+1)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and the engine will simply use the existing value of \plain\f1\fs24\cf0 i\plain\f0\fs24\cf0 .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 With\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab for (i=1;;i=i+1)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The loop will execute endlessly, unless some other means of exit is provided.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The modifying expression does not have to be an expression. It may be a routine that modifies a \plain\f0\fs24\cf0 global variable, for example, which is then tested by the '\plain\f1\fs24\cf0 for\plain\f0\fs24\cf0 ' loop.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (A second form of the '\plain\f1\fs24\cf0 for\plain\f0\fs24\cf0 ' loop is:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab for in \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...conditional code block...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 which loops through all the children of \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 (if any), setting the variable \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 to the object \plain\f0\fs24\cf0 number of each child in sequence, so that\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab for i in suitcase\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print i.name\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will print the names of each object in the \plain\f1\fs24\cf0 suitcase\plain\f0\fs24\cf0 object.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The easiest way to picture the first form of a Hugo '\plain\f1\fs24\cf0 for\plain\f0\fs24\cf0 ' loop is that\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab for (; ; )\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...conditional code block...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 translates to the equivalent of\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab [while] \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...conditional code block...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 which in turn translates the equivalent of\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab :\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab [if] \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...conditional code block...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab jump \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (On the other hand, that isn't a particularly easy way to picture anything, and, in its awkwardness, \plain\f0\fs24\cf0 perhaps justifies the existence of non-threatening '\plain\f1\fs24\cf0 while\plain\f0\fs24\cf0 ', "\plain\f1\fs24\cf0 do-while\plain\f0\fs24\cf0 ", and '\plain\f1\fs24\cf0 for\plain\f0\fs24\cf0 ' loops.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The benefit in knowing how a Hugo loop breaks down into a slip knot of '\plain\f1\fs24\cf0 if\plain\f0\fs24\cf0 ' and '\plain\f1\fs24\cf0 jump\plain\f0\fs24\cf0 ' \plain\f0\fs24\cf0 statements is that it is easier to monitor program flow using the Hugo Debugger (see \plain\f0\fs24\cf0\i Appendix E\plain\f0\fs24\cf0 ).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 As is now obvious by the above (possibly confusing) illustration, Hugo supports '\plain\f1\fs24\cf0 jump\plain\f0\fs24\cf0 ' commands \plain\f0\fs24\cf0 and labels. A label is simply a user-specified token preceded by a colon (':') at the beginning of a \plain\f0\fs24\cf0 line. The label name must be a unique token in the program. (Care should also be taken with \plain\f0\fs24\cf0 using '\plain\f1\fs24\cf0 jump\plain\f0\fs24\cf0 '-it is generally far preferable to use alternatives, as there exists a potential for \plain\f0\fs24\cf0 overflowing the engine's stack when not using standard looping constructions.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 It is also important to recognize-with '\plain\f1\fs24\cf0 while\plain\f0\fs24\cf0 ' or "\plain\f1\fs24\cf0 do-while\plain\f0\fs24\cf0 " statements-that the expression is \plain\f0\fs24\cf0 tested each time the loop executes.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 One final keyword is important in program flow, and that is '\plain\f1\fs24\cf0 break\plain\f0\fs24\cf0 '. At any point during a loop, it \plain\f0\fs24\cf0 may be necessary to exit immediately (and probably prematurely). '\plain\f1\fs24\cf0 break\plain\f0\fs24\cf0 ' passes control to the \plain\f0\fs24\cf0 statement immediately following the current loop.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 In the example\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab do\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab while \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab if \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab break\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab while \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 the '\plain\f1\fs24\cf0 break\plain\f0\fs24\cf0 ' causes the immediately running '\plain\f1\fs24\cf0 while\plain\f0\fs24\cf0 ' \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 loop to terminate, even if \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is true. However, the external "\plain\f1\fs24\cf0 do-while\plain\f0\fs24\cf0 " \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 loop continues to \plain\f0\fs24\cf0 run.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 It has been previously stated that lines ending in '\plain\f1\fs24\cf0 and\plain\f0\fs24\cf0 ' or '\plain\f1\fs24\cf0 or\plain\f0\fs24\cf0 ' are continued onto the next line in the \plain\f0\fs24\cf0 case of long conditional expressions. A second useful provision is the ability to use a comma to \plain\f0\fs24\cf0 separate options within a conditional expression. As a result,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if word[1] = "one", "two", "three"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab while object is open, not locked\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if box not in livingroom, garage\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if a ~= 1, 2, 3\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 are translated into\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if word[1]="one" or word[1]="two" or word[1]="three"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab while object is open and object is not locked\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if box not in livingroom and box not in garage\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if a ~= 1 and a ~= 1 and a ~= 3\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 respectively.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Note that with an '\plain\f1\fs24\cf0 =\plain\f0\fs24\cf0 ' or '\plain\f1\fs24\cf0 in\plain\f0\fs24\cf0 ' comparison, a comma results in an '\plain\f1\fs24\cf0 or\plain\f0\fs24\cf0 ' comparison. With '\plain\f1\fs24\cf0 ~=\plain\f0\fs24\cf0 ' or an \plain\f0\fs24\cf0 attribute comparison, the result is an '\plain\f1\fs24\cf0 and\plain\f0\fs24\cf0 ' comparison.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=37 nft=02;80000008;000A;00;Times New Roman dt=RTF V. ROUTINES AND EVENTS 1 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset2 symbol;}{\f2\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0\b V.\tab ROUTINES AND EVENTS\par \qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0\b }} } 5P9i0s8y19Z id=38 dt=RTF V.a. Routines 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 V.a.\tab Routines\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Routines are blocks of code that may be called at any point in a program. A routine may or may \plain\f0\fs24\cf0 not return a value, and it may or may not require a list of parameters (or arguments). (A number of \plain\f0\fs24\cf0 routines have occurred in previous examples, but here is the formal explication.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 A routine is defined as\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab routine [(, , ...)]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 once again ensuring the the opening brace ('\plain\f1\fs24\cf0 \{\plain\f0\fs24\cf0 ') comes on a new line following the '\plain\f1\fs24\cf0 routine\plain\f0\fs24\cf0 ' \plain\f0\fs24\cf0 specifier.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (NOTE: To substitute a new routine for an existing one with the same name (such as in a library \plain\f0\fs24\cf0 file), define the new one using '\plain\f1\fs24\cf0 replace\plain\f0\fs24\cf0 ' instead of '\plain\f1\fs24\cf0 routine\plain\f0\fs24\cf0 '.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab replace [(, , ...)]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 For example,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab routine TestRoutine(obj)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print "The "; obj.name; " has a size of ";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print obj.size; "."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab return obj.size\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 takes a single value as an argument, assigns it to a local variable \plain\f1\fs24\cf0 obj\plain\f0\fs24\cf0 , executes a simple printing \plain\f0\fs24\cf0 sequence, and returns the property value: \plain\f1\fs24\cf0 obj.size\plain\f0\fs24\cf0 . The '\plain\f1\fs24\cf0 return\plain\f0\fs24\cf0 ' keyword exits the current \plain\f0\fs24\cf0 routine, and returns a value if specified.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Both\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab return\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab return \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 are valid. If no expression is given, the routine returns 0. If no '\plain\f1\fs24\cf0 return\plain\f0\fs24\cf0 ' statement at all is \plain\f0\fs24\cf0 encountered, the routine continues until the closing brace ('\plain\f1\fs24\cf0 \}\plain\f0\fs24\cf0 '), then returns 0.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 TestRoutine\plain\f0\fs24\cf0 can be called several ways:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab TestRoutine(suitcase)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will (assuming the \plain\f1\fs24\cf0 suitcase\plain\f0\fs24\cf0 object as been defined as previously illustrated) print\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab "The big green suitcase has a size of 25."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The return value will be ignored. On the other hand,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x = TestRoutine(suitcase)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will print the same output, but will assign the return value of \plain\f1\fs24\cf0 TestRoutine\plain\f0\fs24\cf0 to the variable \plain\f1\fs24\cf0 x\plain\f0\fs24\cf0 .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Now, unlike C and similar languages, Hugo does not require that routines follow a strict \plain\f0\fs24\cf0 prototype. Therefore, both\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab TestRoutine\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab TestRoutine(suitcase, 5)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 are valid calls for the above routine.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 In the first case, the argument \plain\f1\fs24\cf0 obj\plain\f0\fs24\cf0 defaults to 0, since no value is passed. The parentheses are not \plain\f0\fs24\cf0 necessary if no arguments are passed. In the second case, the value 5 is passed to \plain\f1\fs24\cf0 TestRoutine\plain\f0\fs24\cf0 , \plain\f0\fs24\cf0 but ignored.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Arguments are always passed by value, not by reference or address. A local variable in one \plain\f0\fs24\cf0 routine can never be altered by another routine. What this means is that, for example, in the \plain\f0\fs24\cf0 following routines:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab routine TestRoutine\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab local a\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab a = 5\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab Double(a)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print number a\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab routine Double(a)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab a = a * 2\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Calling \plain\f1\fs24\cf0 TestRoutine\plain\f0\fs24\cf0 would print "5" and not "10" because the local variable \plain\f1\fs24\cf0 a\plain\f0\fs24\cf0 in \plain\f1\fs24\cf0 Double\plain\f0\fs24\cf0 is only \plain\f0\fs24\cf0 a copy of the variable passed to it as an argument.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 These two routines would, on the other hand, print "10":\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab routine TestRoutine\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab local a\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab a = 5\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab a = Double(a)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print number a\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab routine Double(a)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab return a * 2\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The local \plain\f1\fs24\cf0 a\plain\f0\fs24\cf0 in \plain\f1\fs24\cf0 TestRoutine\plain\f0\fs24\cf0 is reassigned with the return value from \plain\f1\fs24\cf0 Double\plain\f0\fs24\cf0 .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 An interesting side-effect of a null (0) return value can be seen using the '\plain\f1\fs24\cf0 print\plain\f0\fs24\cf0 ' command. \plain\f0\fs24\cf0 Consider the The routine in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 , which prints an object's definite article (i.e., "the", if \plain\f0\fs24\cf0 appropriate), followed by the object's \plain\f1\fs24\cf0 name\plain\f0\fs24\cf0 property.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print "You open "; The(object); "."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 might result in\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab You open the suitcase.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Note that the above '\plain\f1\fs24\cf0 print\plain\f0\fs24\cf0 ' command itself really only prints\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab "You open "\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab "."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 It is the \plain\f1\fs24\cf0 The\plain\f0\fs24\cf0 routine that prints\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab the suitcase\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Since \plain\f1\fs24\cf0 The\plain\f0\fs24\cf0 returns 0 (the null string, or ""), the '\plain\f1\fs24\cf0 print\plain\f0\fs24\cf0 ' command is actually displaying\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab "You open ", "", and "."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where the null string ("") is preceded on the output line by \plain\f1\fs24\cf0 The\plain\f0\fs24\cf0 's printing of "the " and the object \plain\f0\fs24\cf0 name.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=39 dt=RTF V.b. Property Routines 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 V.b.\tab Property Routines\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Property routines are slightly more complex than those described so far, but follow the same basic \plain\f0\fs24\cf0 rules. Normally, a property routine runs when the program attempts to get the value of a property \plain\f0\fs24\cf0 that contains a routine.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 That is, instead of\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab size 10\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 an object may contain the property\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab size\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab return x + 5\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Trying to read \plain\f1\fs24\cf0 object.size\plain\f0\fs24\cf0 in either case will return an integer value.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Here's another example. Normally, if \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is the current room, then \plain\f1\fs24\cf0 .n_to\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 would contain the object number of the room to the north. The library checks \plain\f1\fs24\cf0 .n_to\plain\f0\fs24\cf0 to \plain\f0\fs24\cf0 see if a value exists for it; if none does, the move is invalid.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Consider this:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab n_to office\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab n_to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{"The office door is locked."\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 or\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab n_to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab "The office door is locked. ";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab return false\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 In the first case, an attempt on the part of the player to move north would result in \plain\f1\fs24\cf0 parent(player)\plain\f0\fs24\cf0 being changed to the \plain\f1\fs24\cf0 office\plain\f0\fs24\cf0 object. In the second case, a custom \plain\f0\fs24\cf0 invalid-move message would be displayed. In the third case, the custom invalid-move message \plain\f0\fs24\cf0 would be displayed, but then the library would continue as if it had not found a \plain\f1\fs24\cf0 n_to\plain\f0\fs24\cf0 property for \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 , and it would print the standard invalid-move message (without a newline, thanks to \plain\f0\fs24\cf0 the semicolon):\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab "The office door is locked. You can't go that way."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: While normal routines return false (or 0) by default, property routines return true (or 1) by \plain\f0\fs24\cf0 default.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (For those wondering why the true return value in the second case doesn't prompt a move to object \plain\f0\fs24\cf0 number 1, the library \plain\f1\fs24\cf0 DoGo\plain\f0\fs24\cf0 routine assumes that there will never be a room object numbered one.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Property routines may be run directly using the '\plain\f1\fs24\cf0 run\plain\f0\fs24\cf0 ' command:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab run .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 If \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 does not have \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 , or if \plain\f1\fs24\cf0 .\plain\f0\fs24\cf0 is not a routine, nothing \plain\f0\fs24\cf0 happens. Otherwise, the property routine executes. Property routines do not take arguments.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Remember that at any point in a program, an existing property may be changed using\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab . = \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 A property routine may be changed using\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab . =\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where the new routine must be enclosed in braces.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 It is entirely possible to change what was once a property routine into a simple value, or vice-versa, \plain\f0\fs24\cf0 providing that space for the routine (and the required number of elements) was allowed for in the \plain\f0\fs24\cf0 original object definition. Even if a property routine is to be assigned later in the program, the \plain\f0\fs24\cf0 property itself must still be defined at the outset in the original object definition. A simple\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 or\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{return false\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will suffice.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 There is, however, one drawback to this re-assignment of property values to routines and \plain\f0\fs24\cf0 vice-versa. A property routine is given a "length" of one 16-bit word, which is the property \plain\f0\fs24\cf0 address. When assigning a value or set of values to a property routine, the engine behaves as if the \plain\f0\fs24\cf0 property was originally defined for this object with only one word of data, since it has no way of \plain\f0\fs24\cf0 knowing the original length of the property data.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 For example, if the original property specification in the object definition was:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab found_in bedroom, livingroom, garage\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and at some point the following was executed:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab found_in = \{return basement\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 then the following would not subsequently work:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab found_in #3 = attic\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 because the engine now believes \plain\f1\fs24\cf0 .found_in\plain\f0\fs24\cf0 to have only one 16-bit word of data-a \plain\f0\fs24\cf0 routine address-attached to it.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Finally, keep in mind that whenever calling a property routine, the global variable \plain\f1\fs24\cf0 self\plain\f0\fs24\cf0 is \plain\f0\fs24\cf0 normally set to the object number. To avoid this, such as when "borrowing" a property from \plain\f0\fs24\cf0 another object from within a different object, reference the property via\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab ..\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 using '\plain\f1\fs24\cf0 ..\plain\f0\fs24\cf0 ' instead of the normal property operator.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=43 dt=RTF Example: “Borrowing” Property Routines 3 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 Example: "Borrowing" Property Routines\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Consider a situation where a class provides a particular property routine. Normally, that routine is \plain\f0\fs24\cf0 inherited by all objects defined using that class. But there may arise a situation where one of those \plain\f0\fs24\cf0 objects must have a variation or expansion on the original routine.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab class food\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab bites_left 5\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab eating\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab self.bites_left = self.bites_left - 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab if self.bites_left = 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab remove self\tab \tab ! all gone\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab food health_food\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab eating\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab actor.health = actor.health + 1\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab run food..eating\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (Assuming that \plain\f1\fs24\cf0 bites_left\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 eating\plain\f0\fs24\cf0 , and \plain\f1\fs24\cf0 health\plain\f0\fs24\cf0 are defined as properties, with \plain\f1\fs24\cf0 eating\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 being called whenever a \plain\f1\fs24\cf0 food\plain\f0\fs24\cf0 object is eaten.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 In this case, it would be inconvenient to have to retype the entire \plain\f1\fs24\cf0 food.eating\plain\f0\fs24\cf0 routine for the \plain\f1\fs24\cf0 health_food\plain\f0\fs24\cf0 object just because the latter must also increase \plain\f1\fs24\cf0 actor.health\plain\f0\fs24\cf0 . Using '\plain\f1\fs24\cf0 ..\plain\f0\fs24\cf0 ' calls \plain\f1\fs24\cf0 food.eating\plain\f0\fs24\cf0 with self set to \plain\f1\fs24\cf0 health_food\plain\f0\fs24\cf0 , not the \plain\f1\fs24\cf0 food\plain\f0\fs24\cf0 class, so that \plain\f1\fs24\cf0 food.eating\plain\f0\fs24\cf0 affects \plain\f1\fs24\cf0 health_food\plain\f0\fs24\cf0 . This also allows changes to be made to any property, attribute, or property \plain\f0\fs24\cf0 routine in a class, and that change will be reflected in all objects built from that class.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=40 dt=RTF V.c. Before and After Routines 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 V.c.\tab Before and After Routines\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The Hugo Compiler predefines two special properties: \plain\f1\fs24\cf0 before\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 after\plain\f0\fs24\cf0 . They are unique in \plain\f0\fs24\cf0 that not only are they always routines, but they are much more complex (and versatile) than a \plain\f0\fs24\cf0 standard property routine.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Complex properties like before and after are defined with\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab property $complex \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 as in:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab property before $complex\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab property after $complex\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Here is the syntax for the \plain\f1\fs24\cf0 before\plain\f0\fs24\cf0 property:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab before\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab [, ,...]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab [, ,...]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (The \plain\f1\fs24\cf0 after\plain\f0\fs24\cf0 property is the same, substituting '\plain\f1\fs24\cf0 after'\plain\f0\fs24\cf0 for '\plain\f1\fs24\cf0 before'\plain\f0\fs24\cf0 .)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 specifier is a value against which the specified object is matched. Most commonly, it \plain\f0\fs24\cf0 is "\plain\f1\fs24\cf0 object\plain\f0\fs24\cf0 ", "\plain\f1\fs24\cf0 xobject\plain\f0\fs24\cf0 ", "\plain\f1\fs24\cf0 location\plain\f0\fs24\cf0 ", "\plain\f1\fs24\cf0 acto\plain\f0\fs24\cf0 r", "\plain\f1\fs24\cf0 parent(object)\plain\f0\fs24\cf0 ", etc. The \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 \plain\f0\fs24\cf0 is the name of a verb routine to which the usage in question applies.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 If \plain\f1\fs24\cf0 .before\plain\f0\fs24\cf0 is checked, with the global \plain\f1\fs24\cf0 verbroutine\plain\f0\fs24\cf0 set to one of the specified \plain\f0\fs24\cf0 verbroutines in the before property, and \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 in that instance is "\plain\f1\fs24\cf0 object\plain\f0\fs24\cf0 ", then the following \plain\f0\fs24\cf0 block of code is executed. If no match is found, \plain\f1\fs24\cf0 .before\plain\f0\fs24\cf0 returns false.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Here is a clearer example using the \plain\f1\fs24\cf0 suitcase\plain\f0\fs24\cf0 object we have been developing:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab before\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab object DoEat\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab "You can't eat the suitcase!"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab after\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab object DoGet\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab "With a vigorous effort, you pick up\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab the suitcase."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab xobject DoPutIn\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab "You put ";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab The(object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab " into the suitcase."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Each of these examples will return true, thereby overriding the engine's default operation (see the \plain\f0\fs24\cf0 section on \plain\f0\fs24\cf0\i "The Game Loop"\plain\f0\fs24\cf0 ). In order to fool the engine into continuing normally, as if no \plain\f1\fs24\cf0 before\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 or \plain\f1\fs24\cf0 after\plain\f0\fs24\cf0 property has been found, return false from the property routine.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab after\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab object DoGet\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \{"Fine. ";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab return false\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will result in:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab >get suitcase\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Fine. Taken.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Since the after routine returns false, and the library's default response for a successful call to \plain\f1\fs24\cf0 DoGet\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 is "Taken."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 It is important to remember that, unlike other property routines, \plain\f1\fs24\cf0 before\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 after\plain\f0\fs24\cf0 routines are \plain\f0\fs24\cf0 additive; i.e., a \plain\f1\fs24\cf0 before\plain\f0\fs24\cf0 (or \plain\f1\fs24\cf0 after\plain\f0\fs24\cf0 ) routine defined in an inherited class or object is not overwritten \plain\f0\fs24\cf0 by a new property routine in the new object. Instead, the definition for the routine is-in \plain\f0\fs24\cf0 essence-added onto. An additive property is defined using the '\plain\f1\fs24\cf0 $additive\plain\f0\fs24\cf0 ' qualifier, as in:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab property $additive \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 All previously inherited \plain\f1\fs24\cf0 before\plain\f0\fs24\cf0 /\plain\f1\fs24\cf0 after\plain\f0\fs24\cf0 subroutines are carried over. However, the processing \plain\f0\fs24\cf0 of a \plain\f1\fs24\cf0 before\plain\f0\fs24\cf0 /\plain\f1\fs24\cf0 after\plain\f0\fs24\cf0 property begins with the present object, progressing backward through the \plain\f0\fs24\cf0 object's ancestry until a usage/verbroutine match is found; once a match is made, no further \plain\f0\fs24\cf0 preceding class inheritances are processed (unless the property routine in question returns false).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: To force a \plain\f1\fs24\cf0 before\plain\f0\fs24\cf0 or \plain\f1\fs24\cf0 after\plain\f0\fs24\cf0 property routine to apply to ANY verbroutine, do not specify \plain\f0\fs24\cf0 a verbroutine.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 For example,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab before\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab xobject\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The specified routine will be run whenever the object in question is the xobject of ANY valid input.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 If this non-specific block occurs before any block(s) specifying verbroutines, then the following \plain\f0\fs24\cf0 blocks, if matched, will run as well so long as the block does not return true. If the non-specific \plain\f0\fs24\cf0 block comes after any other blocks, then it will run only if no other object/verbroutine combination \plain\f0\fs24\cf0 is matched.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 A drawback of this non-specification is that all verbroutines are matched-both verbs and xverbs. \plain\f0\fs24\cf0 This can be particularly undesirable in the case of location \plain\f1\fs24\cf0 before\plain\f0\fs24\cf0 /\plain\f1\fs24\cf0 after\plain\f0\fs24\cf0 properties, where a \plain\f0\fs24\cf0 non-specific response will be triggered even for '\plain\f1\fs24\cf0 save\plain\f0\fs24\cf0 ', '\plain\f1\fs24\cf0 restore\plain\f0\fs24\cf0 ', etc.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To get around this, the library provides a function \plain\f1\fs24\cf0 AnyVerb\plain\f0\fs24\cf0 , which takes an object as its argument \plain\f0\fs24\cf0 and returns that object number if the current verbroutine is not within the group of xverbs; \plain\f0\fs24\cf0 otherwise it returns false. Therefore, it can be used via:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab before\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab AnyVerb(location)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 instead of\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab before\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab location\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The former will execute the conditional block of code whenever the location global matches the \plain\f0\fs24\cf0 current object and the current verbroutine is not an xverb. The latter (without using \plain\f1\fs24\cf0 AnyVerb\plain\f0\fs24\cf0 ), \plain\f0\fs24\cf0 will run for verbs and xverbs. (The reason for this, simply put, is that the \plain\f1\fs24\cf0 location\plain\f0\fs24\cf0 global always \plain\f0\fs24\cf0 equals the \plain\f1\fs24\cf0 location\plain\f0\fs24\cf0 global(!). But \plain\f1\fs24\cf0 AnyVerb(location)\plain\f0\fs24\cf0 will only equal the \plain\f1\fs24\cf0 location\plain\f0\fs24\cf0 global \plain\f0\fs24\cf0 if the verbroutine is not an xverb.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=44 dt=RTF Example: Building a Complex Object 3 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 Example: Building a Complex Object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 At this point, enough material has been covered to develop a comprehensive example of a \plain\f0\fs24\cf0 functional object that will serve as a summary of concepts introduced so far, as well as providing \plain\f0\fs24\cf0 instances of a number of common properties from \plain\f1\fs24\cf0 HUGOLIB\plain\f0\fs24\cf0 .H.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab object woodcabinet "wooden cabinet"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab in emptyroom\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab article "a"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab nouns "cabinet", "shelf", "shelves", \\\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab "furniture", "doors", "door"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab adjectives "wooden", "wood", "fine", "mahogany"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab short_desc\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab "A wooden cabinet sits along one wall."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab when_open\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab "An open wooden cabinet sits along one wall."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab long_desc\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab "The cabinet is made of fine mahogany wood,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab hand-crafted by a master cabinetmaker. In \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab front are two doors (presently ";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab if self is open\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab print "open";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab else: print "closed";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab print ")."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab contains_desc\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab "Behind the open doors of the cabinet you\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab can see";\tab \tab ! note semicolon-no line feed\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab key_object cabinetkey\tab ! a cabinetkey object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab \tab \tab ! must also be created\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab holding 0\tab \tab \tab \tab ! starts off empty\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab capacity 100\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab before\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab object DoLookUnder\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \{"Nothing there but dust."\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab object DoGet\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \{"The cabinet is far too heavy\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab to lift!"\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab after\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab object DoLock\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \{"With a twist of the key, you lock the\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab cabinet up tight."\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab is container, openable, not open\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab is lockable, static\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 And for a challenge: how could the cabinet be converted into, say, a secret passage into another \plain\f0\fs24\cf0 room?\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 ANSWER: Add a \plain\f1\fs24\cf0 door_to\plain\f0\fs24\cf0 property, such as:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab door_to secondroom\tab \tab ! a new room object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The cabinet can now be entered via: "go cabinet", "get into cabinet", "enter cabinet", etc.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=41 dt=RTF V.d. Init and Main 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 V.d.\tab Init and Main\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 At least two routines are typically part of every Hugo problem: "\plain\f1\fs24\cf0 Init\plain\f0\fs24\cf0 " and "\plain\f1\fs24\cf0 Main\plain\f0\fs24\cf0 ". (The latter is \plain\f0\fs24\cf0 required. The compiler will issue an error if no \plain\f1\fs24\cf0 Main\plain\f0\fs24\cf0 routine exists.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 Init\plain\f0\fs24\cf0 , if it exists, is called once at the start of the program (as well as during a '\plain\f1\fs24\cf0 restart\plain\f0\fs24\cf0 ' command). \plain\f0\fs24\cf0 The routine should configure all variables, objects, and arrays needed to begin the game.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 Main\plain\f0\fs24\cf0 is called every turn. It should take care of general game management such as moving ahead the \plain\f0\fs24\cf0 counter, as well as running events and scripts.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=42 dt=RTF V.e. Events 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'02\'04);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'05);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'06);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'07);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'08);}{\levelnumbers\'01;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 V.e.\tab Events\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Events are useful for bringing a game to life, so that little quirks, behaviors, and occurrences can be \plain\f0\fs24\cf0 provided for with little difficulty.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Events are also routines, but their special characteristic is that they may be attached to a particular \plain\f0\fs24\cf0 object, and they are run as a group by the '\plain\f1\fs24\cf0 runevents\plain\f0\fs24\cf0 ' command.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Events are defined as\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab event\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 for global events, and\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab event [in] \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 for events attached to a particular object. (The '\plain\f1\fs24\cf0 in\plain\f0\fs24\cf0 ' is optional, but may be useful for legibility.) If \plain\f0\fs24\cf0 an event is attached to an object, it is run only when that object has the same grandparent as the \plain\f0\fs24\cf0 player object (where grandparent refers to the last object before 0, the \plain\f1\fs24\cf0 nothing\plain\f0\fs24\cf0 object).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: If the event is not a global event, the \plain\f1\fs24\cf0 self\plain\f0\fs24\cf0 global is set to the number of the object to which \plain\f0\fs24\cf0 the event is attached.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \keep\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=45 dt=RTF Example: Building a Clock Event 3 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'02\'04);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'05);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'06);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'07);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'08);}{\levelnumbers\'01;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 Example: Building a Clock Event\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Suppose that there is a clock object in a room. Here is a possible routine:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab event in clock\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab local minutes, hours\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab hours = counter / 60\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab minutes = counter - (hours * 60)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab if minutes = 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab print "The clock chimes ";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab select hour\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab case 1: print "one";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab case 2: print "two";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab case 3: print "three";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab case 12: print "twelve";\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab print " o'clock."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Whenever the player and the clock are in the same room (when a \plain\f1\fs24\cf0 runevents\plain\f0\fs24\cf0 command is given), \plain\f0\fs24\cf0 the event will run.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Now, suppose the clock should be audible throughout the entire house-i.e., at any point in the \plain\f0\fs24\cf0 game map. Simply changing the event definition to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab event\tab \tab \tab \tab ! no object is given\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will make the event a global one. (In this case, the \plain\f1\fs24\cf0 self\plain\f0\fs24\cf0 global is not altered.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=46 nft=02;80000008;000A;00;Times New Roman dt=RTF VI. FUSES, DAEMONS, AND SCRIPTS 1 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0\b VI.\tab FUSES, DAEMONS, AND SCRIPTS\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 While all of the above mentioned elements of Hugo are programmed into the internal code of the \plain\f0\fs24\cf0 engine, the means of running fuses, daemons, and scripts are written entirely in Hugo itself and \plain\f0\fs24\cf0 contained in the library (\plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 ).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=47 dt=RTF VI.a. Fuses and Daemons 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 VI.a.\tab Fuses and Daemons\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 A daemon is the traditional name for a recurring activity. Hugo handles daemons as special events \plain\f0\fs24\cf0 attached to objects that may be activated or deactivated (i.e., moved in and out of the scope of \plain\f1\fs24\cf0 runevents\plain\f0\fs24\cf0 ).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Since the daemon class is defined in the library, define a daemon itself using\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab daemon \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The body of the daemon definition is empty. It is only needed to attach the daemon event to, so the \plain\f0\fs24\cf0 daemon definition must be followed by\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab event [in] \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Activate it by\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Activate()\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 which moves the specified daemon object into scope of the player. This way, whenever a \plain\f0\fs24\cf0 '\plain\f1\fs24\cf0 runevents'\plain\f0\fs24\cf0 command is given (as it should be in the \plain\f1\fs24\cf0 Main\plain\f0\fs24\cf0 routine), the event attached to \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 will run.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Deactivate the daemon using\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Deactivate()\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 which removes the daemon object from scope.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 It can be seen here that a daemon is actually a special type of object which is moved in and out of \plain\f0\fs24\cf0 the scope of '\plain\f1\fs24\cf0 runevents\plain\f0\fs24\cf0 ', and that it is the event attached to the daemon that actually contains the \plain\f0\fs24\cf0 code.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 A fuse is the traditional name for a timer-i.e., any event set to happen after a certain period of time. \plain\f0\fs24\cf0 The fuse itself is a slightly more complex version of a daemon object, containing two additional \plain\f0\fs24\cf0 properties as well as \plain\f1\fs24\cf0 in_scope\plain\f0\fs24\cf0 :\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440 \qj\li2160\fi-2160\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 timer\plain\f0\fs24\cf0 \tab - the number of turns before the fuse event runs\par \qj\li2160\fi-2160\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 tick\plain\f0\fs24\cf0 \tab \tab - a routine that decrements \plain\f1\fs24\cf0 timer\plain\f0\fs24\cf0 and returns the number of turns remaining (i.e., \plain\f0\fs24\cf0 the value of \plain\f1\fs24\cf0 timer\plain\f0\fs24\cf0 )\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Similarly to a daemon, define a fuse in two steps\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab fuse \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab event [in] \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab if not self.tick\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and turn it on or off by\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Activate(, )\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 or\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Deactivate()\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is the initial value of the \plain\f1\fs24\cf0 timer\plain\f0\fs24\cf0 property.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Note that it is up to the event itself to run the \plain\f1\fs24\cf0 timer\plain\f0\fs24\cf0 and check for its expiration. The line\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if not self.tick\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 runs the \plain\f1\fs24\cf0 tick\plain\f0\fs24\cf0 property-which decrements the timer-and executes the following conditional block \plain\f0\fs24\cf0 if s\plain\f1\fs24\cf0 elf.timer\plain\f0\fs24\cf0 is 0.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=50 dt=RTF Example: A Simple Daemon and a Simpler Fuse 3 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 Example: A Simple Daemon and a Simpler Fuse\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The most basic daemon would be something like a sleep counter, which measures how far a player \plain\f0\fs24\cf0 can go beginning from a certain rested state.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Assume that the player's amount of rest is kept in a property called \plain\f1\fs24\cf0 rest\plain\f0\fs24\cf0 , which decreases by 2 \plain\f0\fs24\cf0 each turn.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab daemon gettired\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab event in gettired\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab player.rest = player.rest - 2\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab if player.rest < 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab player.rest = 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab select player.rest\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab case 20\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab "You're getting quite tired."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab case 10\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab "You're getting \\Ivery\\i tired."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab case 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab "You fall asleep!"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Start and stop the daemon with \plain\f1\fs24\cf0 Activate(gettired)\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 Deactivate(gettired)\plain\f0\fs24\cf0 .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Now, as for a fuse, why not construct the most obvious example: that of a ticking bomb? (Assume \plain\f0\fs24\cf0 that there exists another physical \plain\f1\fs24\cf0 bomb\plain\f0\fs24\cf0 object; \plain\f1\fs24\cf0 tickingbomb\plain\f0\fs24\cf0 is only the countdown fuse.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab fuse tickingbomb\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab event in tickingbomb\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab if not self.tick\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab if Contains(location, bomb)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab "You vanish in a nifty KABOOM!"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab else\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab "You hear a distant KABOOM!"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab remove bomb\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Start it (with a countdown of 25 turns) and stop it with \plain\f1\fs24\cf0 Activate(tickingbomb, 25)\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 Deactivate(tickingbomb)\plain\f0\fs24\cf0 .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=48 dt=RTF VI.b. Scripts 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 VI.b.\tab Scripts\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Scripts are considerably more complex than fuses and daemons. The purpose of a script (also \plain\f0\fs24\cf0 called a character script) is to allow an object-usually a character-to follow a sequence of actions \plain\f0\fs24\cf0 turn-by-turn, independent of the player.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Up to 16 scripts may be running at once. It is up the programmer not to overflow this limit.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 A script is represented by two arrays: \plain\f1\fs24\cf0 scriptdata\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 setscript\plain\f0\fs24\cf0 . The latter was named for \plain\f0\fs24\cf0 programming clarity rather than for what it actually contains. Here's why:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To define a script, use the following notation:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab setscript[Script(, )] = &CharRoutine, obj,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab \tab \tab &CharRoutine, obj,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (remembering that a hanging comma at the end of a line of code is a signal to the compiler that the \plain\f0\fs24\cf0 line continues onto the next unbroken.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Notice that "\plain\f1\fs24\cf0 setscript\plain\f0\fs24\cf0 " is actually an array, taking its starting element from the return value of \plain\f0\fs24\cf0 the Script routine, which has \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 as its arguments.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Script returns a pointer within the large "\plain\f1\fs24\cf0 setscript\plain\f0\fs24\cf0 " array where the \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 steps of a script \plain\f0\fs24\cf0 for \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 may reside. A single script may have up to 32 steps. A step in a script consists of a \plain\f0\fs24\cf0 routine and an object-both are required, even if the routine does not require an object. (Use the \plain\f1\fs24\cf0 nothing\plain\f0\fs24\cf0 object (0); see the \plain\f1\fs24\cf0 CharWait\plain\f0\fs24\cf0 routine in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 for reference.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The custom in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 is that character script routines use the prefix "Char" although this is \plain\f0\fs24\cf0 not required. Currently, routines provided include:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 CharMove\plain\f0\fs24\cf0 \tab \tab (requiring a direction object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 CharWait\plain\f0\fs24\cf0 \tab \tab (using the \plain\f1\fs24\cf0 nothing\plain\f0\fs24\cf0 object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 CharGet\plain\f0\fs24\cf0 \tab \tab (requiring a takeable object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 CharDrop\plain\f0\fs24\cf0 \tab \tab (requiring an object held by the character)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 as well as the special routine\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 LoopScript\plain\f0\fs24\cf0 \tab (using the \plain\f1\fs24\cf0 nothing\plain\f0\fs24\cf0 object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 which indicates that a script will continually execute. (It is the responsibility of the programmer to \plain\f0\fs24\cf0 ensure that the ending position of the character or object is suitable to loop back to the beginning if \plain\f1\fs24\cf0 LoopScript\plain\f0\fs24\cf0 is used. That is, if the script consists of a complex series of directions, the character \plain\f0\fs24\cf0 should always return to the same starting point.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The sequence of routines and objects for each script is stored in the \plain\f1\fs24\cf0 setscript\plain\f0\fs24\cf0 array.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Scripts are run using the \plain\f1\fs24\cf0 RunScripts\plain\f0\fs24\cf0 routine, similar to \plain\f1\fs24\cf0 runevents\plain\f0\fs24\cf0 , the only difference being \plain\f0\fs24\cf0 that \plain\f1\fs24\cf0 runevents\plain\f0\fs24\cf0 is an engine command while \plain\f1\fs24\cf0 RunScripts\plain\f0\fs24\cf0 is contained entirely in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The line\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab RunScripts\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will run all active object/character scripts, one turn at a time, freeing the space used by each once it \plain\f0\fs24\cf0 has run its course.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Here is a sample script for a character named "Ned":\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab setscript[Script(ned, 4)] = \tab &CharMove, s_obj,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab \tab \tab &CharGet, cannonball,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab \tab \tab &CharMove, n_obj,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab \tab \tab &CharWait, 0,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab \tab \tab &CharDrop, cannonball\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Ned will go south, retrieve the cannonball object, bring it north, wait a turn, and drop it. (The \plain\f0\fs24\cf0 character script routines provided in the library are relatively basic; for example, \plain\f1\fs24\cf0 CharGet\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 assumes that the specified object will be there when the character comes to get it.)\tab \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Other script-management routines in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 include:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 CancelScript(obj)\plain\f0\fs24\cf0 \tab to immediately halt execution of the script for \plain\f1\fs24\cf0 \par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 PauseScript(obj)\plain\f0\fs24\cf0 \tab to temporarily pause execution of the script for \plain\f1\fs24\cf0 \par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ResumeScript(obj)\plain\f0\fs24\cf0 \tab to resume execution of a paused script\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 SkipScript(obj)\plain\f0\fs24\cf0 \tab skips the script for \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 during the next call to \plain\f1\fs24\cf0 RunScripts\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 only\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The \plain\f1\fs24\cf0 RunScripts\plain\f0\fs24\cf0 routine also checks for \plain\f1\fs24\cf0 before\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 after\plain\f0\fs24\cf0 properties. It continues with the \plain\f0\fs24\cf0 default action-i.e., the character action routine specified in the script-if it finds a false value.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To override a default character action routine, include a \plain\f1\fs24\cf0 before\plain\f0\fs24\cf0 property for the character object \plain\f0\fs24\cf0 using the following form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab before\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab actor CharRoutine\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where \plain\f1\fs24\cf0 CharRoutine\plain\f0\fs24\cf0 is \plain\f1\fs24\cf0 CharWait\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 CharMove\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 CharGet\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 CharDrop\plain\f0\fs24\cf0 , etc.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=49 dt=RTF VI.c. A Note About the event_flag Global 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 VI.c.\tab A Note About the \plain\f1\fs24\cf0 event_flag\plain\f0\fs24\cf0 Global\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The library routines -- particularly the \plain\f1\fs24\cf0 DoWait...\plain\f0\fs24\cf0 verb routines-expect the \plain\f1\fs24\cf0 event_flag\plain\f0\fs24\cf0 global \plain\f0\fs24\cf0 variable to be set to a non-false value if something happens (i.e., in an event or script) so that the \plain\f0\fs24\cf0 player may be notified and given the opportunity to quit waiting. For instance, the character script \plain\f0\fs24\cf0 routines in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 set \plain\f1\fs24\cf0 event_flag\plain\f0\fs24\cf0 whenever a character does something in the same location \plain\f0\fs24\cf0 as the player.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 If \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 is to be used, the convention of setting \plain\f1\fs24\cf0 event_flag\plain\f0\fs24\cf0 after every significant event \plain\f0\fs24\cf0 should be adhered to.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=51 nft=02;80000008;000A;00;Times New Roman dt=RTF VII. GRAMMAR AND PARSING 1 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset2 symbol;}{\f2\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0\b VII.\tab GRAMMAR AND PARSING}} } 5P9i0s8y19Z id=52 dt=RTF VII.a. Grammar Definition 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 VII.a.\tab Grammar Definition\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Every valid player command must specified. More precisely, each usage of a particular verb must \plain\f0\fs24\cf0 be detailed in full by the source code.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Grammar definitions must \plain\f0\fs24\cf0\i always \plain\f0\fs24\cf0 come at the start of a program, preceding any objects or \plain\f0\fs24\cf0 executable code. That is, if several additional grammar files are to be included, or new grammar is \plain\f0\fs24\cf0 to be explicitly defined in the source code, it must be done before any files containing executable \plain\f0\fs24\cf0 code are included, or any routines, objects, etc. are defined.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The syntax used is:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab [x]verb "" [, "", "",...]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * \tab \tab \tab \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * \tab \tab \tab \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Now, what does that mean? Here are some examples from the library grammar file \plain\f1\fs24\cf0 VERBLIB.G\plain\f0\fs24\cf0 :\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 verb "get"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * \tab \tab \tab \tab \tab \tab \tab DoVague\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * "up"/"out"/"off"\tab \tab \tab \tab DoExit\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * "outof"/"offof"/"off" object\tab \tab DoExit\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * "in"/"on" object\tab \tab \tab \tab DoEnter\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * multinotheld "from"/"off" parent\tab \tab DoGet\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * multinotheld "offof"/"outof" parent\tab DoGet\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * multinotheld\tab \tab \tab \tab \tab DoGet\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 verb "take"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab *\tab \tab \tab \tab \tab \tab \tab DoVague\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * "off" multiheld\tab \tab \tab \tab \tab DoTakeOff\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * multiheld "off"\tab \tab \tab \tab \tab DoTakeOff\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * multinotheld\tab \tab \tab \tab \tab DoGet\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * multinotheld "from"/"off" parent\tab \tab DoGet\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * multinotheld "offof"/"outof" parent\tab DoGet\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 xverb "save"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab *\tab \tab \tab \tab \tab \tab \tab DoSave\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * "game"\tab \tab \tab \tab \tab \tab DoSave\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 verb "read", "peruse"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * \tab \tab \tab \tab \tab \tab \tab DoVague\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * readable\tab \tab \tab \tab \tab \tab DoRead\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 verb "unlock"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab *\tab \tab \tab \tab \tab \tab \tab DoVague\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * lockable\tab \tab \tab \tab \tab \tab DoUnLock\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * lockable "with" held\tab \tab \tab \tab DoUnLock\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Each '\plain\f1\fs24\cf0 verb\plain\f0\fs24\cf0 ' or '\plain\f1\fs24\cf0 xverb\plain\f0\fs24\cf0 ' header begins a new verb definition. An '\plain\f1\fs24\cf0 xverb\plain\f0\fs24\cf0 ' is a special signifier that \plain\f0\fs24\cf0 indicates that the engine should not call the \plain\f1\fs24\cf0 Main\plain\f0\fs24\cf0 routine after successful completion of the action. \plain\f0\fs24\cf0 '\plain\f1\fs24\cf0 xverb\plain\f0\fs24\cf0 ' is typically used with non-action, housekeeping-type verbs such as saving, restoring, \plain\f0\fs24\cf0 quitting, and restarting.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Next in the header comes one or more verb words. Each of the specified words will share the \plain\f0\fs24\cf0 following verb grammar \plain\f0\fs24\cf0\i exactly\plain\f0\fs24\cf0 . This is why "get" and "take" in the above examples are defined \plain\f0\fs24\cf0 separately, instead of as\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab verb "get", "take"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 In this way, the commands\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab get up\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab take off hat\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 are allowable, while\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab take up\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab get off hat\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 won't make any sense.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Each line beginning with an asterisk ('\plain\f1\fs24\cf0 *\plain\f0\fs24\cf0 ') is a separate valid usage of the verb being defined. (Every \plain\f0\fs24\cf0 player input line must begin with a verb. Exceptions, where a command is directed to an object as \plain\f0\fs24\cf0 in\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Ned, get the ball\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will be dealt with later.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Up to two objects and any number of dictionary words may make up a syntax line. The objects \plain\f0\fs24\cf0 must be separated by at least one dictionary word.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Valid object specifications are:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 object\plain\f0\fs24\cf0 \tab \tab any visible object (the direct object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 xobject\plain\f0\fs24\cf0 \tab \tab the indirect object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 attribute\plain\f0\fs24\cf0 \tab \tab any visible object that is \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 parent\plain\f0\fs24\cf0 \tab \tab an xobject that is the parent of the object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 held\plain\f0\fs24\cf0 \tab \tab \tab any object possessed by the player object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 notheld\plain\f0\fs24\cf0 \tab \tab an object explicitly not held\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 anything\plain\f0\fs24\cf0 \tab \tab any object, held or not, visible or not\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 multi\plain\f0\fs24\cf0 \tab \tab \tab multiple visible objects\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 multiheld\plain\f0\fs24\cf0 \tab \tab multiple held objects\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 multinotheld\plain\f0\fs24\cf0 \tab multiple notheld objects\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 number\plain\f0\fs24\cf0 \tab \tab a positive integer number\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 word\plain\f0\fs24\cf0 \tab \tab \tab any dictionary word\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 string\plain\f0\fs24\cf0 \tab \tab a quoted string\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 (RoutineName)\tab \plain\f0\fs24\cf0 a routine name, in parentheses\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 (objectname)\tab \plain\f0\fs24\cf0 a single object name, in parentheses\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (If a number is specified in the grammar syntax, it will be passed to the verbroutine in the \plain\f1\fs24\cf0 object\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 global. If a string is specified, it will be passed in the engine's \plain\f1\fs24\cf0 parse$\plain\f0\fs24\cf0 variable, which can then be \plain\f0\fs24\cf0 turned into a string array using the '\plain\f1\fs24\cf0 string\plain\f0\fs24\cf0 ' function.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Dictionary words that may be used interchangeably are separated by a slash ('\plain\f1\fs24\cf0 /\plain\f0\fs24\cf0 ').\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Two or more dictionary words in sequence must be specified separately. That is, in the input line:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab take hat out of suitcase\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 the syntax line\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * object "out" "of" container\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will be matched, while\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * object "out of" container\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 would never be recognized, since the engine will automatically parse "out" and "of" as two \plain\f0\fs24\cf0 separate words; the parser will never find a match for "out of".\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Regarding object specification within the syntax line: Once the direct object has been found, the \plain\f0\fs24\cf0 remaining object in the input line will be stored as the xobject. That is, in the example immediately \plain\f0\fs24\cf0 above, a valid object in the input line with the attribute \plain\f1\fs24\cf0 container\plain\f0\fs24\cf0 will be treated as the indirect \plain\f0\fs24\cf0 object by the verb routine.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: An important point to remember when mixing dictionary words and objects within a \plain\f0\fs24\cf0 syntax line is that, unless directed differently, the parser may confuse a word-object combination \plain\f0\fs24\cf0 with an invalid object name. Consider the following:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab verb "pick"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab * object\tab \tab \tab \tab DoGet\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab * "up" object \tab \tab \tab DoGet\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 This definition will result in something like\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab >pick up box\par \qj\li720\fi-720\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab You haven't seen any "up box", nor are you likely to in the near future even if such a thing \plain\f0\fs24\cf0 exists.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (assuming that "up" has been defined elsewhere as part of a different object name, as in \plain\f1\fs24\cf0 OBJLIB.H\plain\f0\fs24\cf0 ), because the processor processes the syntax\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and determines that an invalid object name is being used; it never gets to \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * "up" object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The proper verb definition would be ordered like\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab verb "pick"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab * "up" object\tab \tab \tab DoGet\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab * object\tab \tab \tab \tab DoGet\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 so that both "pick " and "pick up " are valid player commands.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To define a new grammar condition that will take precedence over an existing one-such as in \plain\f1\fs24\cf0 VERBLIB.G\plain\f0\fs24\cf0 -simply define the new condition first (i.e., before including \plain\f1\fs24\cf0 VERBLIB.G\plain\f0\fs24\cf0 ).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: As a rule, unless you need to preempt the library's normal grammar processing, include \plain\f0\fs24\cf0 any new grammar \plain\f0\fs24\cf0\i after\plain\f0\fs24\cf0 the library files. (The reason for this is that the library grammar is fairly \plain\f0\fs24\cf0 carefully tuned to handle situations exactly like that described above.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 A single object may be specified as the only valid object for a particular syntax:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab verb "rub"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab * (magic_lamp)\tab \tab \tab DoRubMagicLamp\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will produce a "You can't do that with..." error for any object other than the \plain\f1\fs24\cf0 magic_lamp\plain\f0\fs24\cf0 object.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Using a routine name to specify an object is slightly more involved: the engine calls the given \plain\f0\fs24\cf0 routine with the object specified in the input line as its argument; if the routine returns true, the \plain\f0\fs24\cf0 object is valid-if not, a parsing error is expected to have been printed by the routine. If two routine \plain\f0\fs24\cf0 names are used in a particular syntax, such as\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * (FirstRoutine) "with" (SecondRoutine)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 then \plain\f1\fs24\cf0 FirstRoutine\plain\f0\fs24\cf0 validates the object and \plain\f1\fs24\cf0 SecondRoutine\plain\f0\fs24\cf0 validates the xobject.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=53 dt=RTF VII.b. The Parser 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'02\'04);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'05);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'06);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'07);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'08);}{\levelnumbers\'01;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 VII.b.\tab The Parser\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Immediately after an input line is received, the engine calls the parser, and the first step taken is to \plain\f0\fs24\cf0 identify any invalid words, i.e., words that are not in the dictionary table.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: One non-dictionary word or phrase is allowed in an input line, providing it is enclosed in \plain\f0\fs24\cf0 quotation marks (""). If the command is successfully parsed and matched, this string is passed to \plain\f1\fs24\cf0 parse$\plain\f0\fs24\cf0 . More than one non-dictionary word or phrase (even if the additional phrases are \plain\f0\fs24\cf0 enclosed in quotes) are not allowed.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The next step is to break the line down into individual words. Words are separated by spaces and \plain\f0\fs24\cf0 basic punctuation (including "!" and "?") which are removed. All characters in an input line are \plain\f0\fs24\cf0 converted to lower case.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The next step is to process the three types of special words which may be defined in the source \plain\f0\fs24\cf0 code.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 REMOVALS are the simplest. These are simply words that are to be automatically removed from \plain\f0\fs24\cf0 any input line, and are basically limited to words such as "a" and "the" which would, generally \plain\f0\fs24\cf0 speaking, only make grammar matching more complicated and difficult.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The syntax for defining a removal is:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab removal ""[, "", "word<3>",...]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 as in\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab removal "a", "an", "the"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 PUNCTUATION is similar to a removal, except it specifies the removal of individual characters \plain\f0\fs24\cf0 instead of whole words:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab punctuation "[...]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 as in\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab punctuation "$%"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 SYNONYMS are slightly more complex. These are words that will never be found in the parsed \plain\f0\fs24\cf0 input line; they are replaced by the specified word for which they are a synonym.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab synonym "" for ""\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 as in\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab synonym "myself" for "me"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The above example will replace every occurrence of "myself" in the input line with "me". Usage of \plain\f0\fs24\cf0 synonyms will likely not be extensive, since of course it is possible to, particularly in the case of \plain\f0\fs24\cf0 object nouns and adjectives specify synonymous words which are still treated as distinct.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 COMPOUNDS are the final type of special word, specified as:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab compound "", ""\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 as in\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab compound "out", "of"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 so that the input line\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab get hat out of suitcase\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 would be parsed to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab get hat outof suitcase\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Depending on the design of grammar tables for certain syntaxes, the use of compounds may make \plain\f0\fs24\cf0 grammar definition more straightforward, so that by using the above compound, \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab verb "get"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * multinotheld "outof"/"offof"/"from" parent\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 is possible, and likely more desirable to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab verb "get"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * multinotheld "out"/"off" "of" parent\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab * multinotheld "from" parent\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 When the parser has finished processing the input line, the result is a specially defined (by the \plain\f0\fs24\cf0 Hugo Engine) array called word, where the number of valid elements is held in the global variable \plain\f0\fs24\cf0 words.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Therefore, in\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab get the hat from the table\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 the parser -- using the removals defined in \plain\f1\fs24\cf0 HUGOLIB.H \plain\f0\fs24\cf0 -- will produce the following results:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab word[1] = "get"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab word[2] = "hat"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab word[3] = "from"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab word[4] = "table"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab words = 4\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: Multiple-command input lines are also allowed, provided that the individual commands \plain\f0\fs24\cf0 are separated by a period (".").\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab get hat. go n. go e.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 would become\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab word[1] = "get"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab word[2] = "hat"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab word[3] = ""\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab word[4] = "go"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab word[5] = "n"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab word[6] = ""\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab word[7] = "go"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab word[8] = "e"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab word[9] = ""\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab words = 9\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (See the Parse routine in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 for an example of how\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab get hat then go n\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 is translated into:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab word[1] = "get"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab word[2] = "hat"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab word[3] = ""\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab word[4] = "go"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab word[5] = "n")\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 A maximum of thirty-two words is allowed. The period is in each case converted to the null \plain\f0\fs24\cf0 dictionary entry ("", address = 0), which is a signal to the engine that processing of the current \plain\f0\fs24\cf0 command should end here.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: The parsing and grammar routines also recognize several system words, each in the format \plain\f0\fs24\cf0 "\plain\f1\fs24\cf0 ~word\plain\f0\fs24\cf0 ". These are:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ~and\plain\f0\fs24\cf0 \tab \tab referring to: multiple specific objects\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ~all\plain\f0\fs24\cf0 \tab \tab "\tab "\tab multiple objects in general\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ~any\plain\f0\fs24\cf0 \tab \tab " \tab " \tab any one of a list of objects\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ~except\plain\f0\fs24\cf0 \tab "\tab "\tab an excluded object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ~oops\plain\f0\fs24\cf0 \tab \tab to correct an error in the previous input line\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To allow an input line to access any of these system words, a synonym must be defined, such as\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab synonym "and" for "~and"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The library defines several such synonyms.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=54 nft=02;80000008;000A;00;Times New Roman dt=RTF VIII. JUNCTION ROUTINES 1 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0\b VIII.\tab JUNCTION ROUTINES\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Because, simply put, the engine is unaware of such things as attributes, properties, and objects in \plain\f0\fs24\cf0 anything but a technical sense, there are provided a number of routines to facilitate communication \plain\f0\fs24\cf0 between the engine and the program proper.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Along with these junction routines are certain global variables and properties that are pre-defined \plain\f0\fs24\cf0 by the compiler and accessed by the engine. They are:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 GLOBALS:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f1\fs24\cf0 object\plain\f0\fs24\cf0 \tab \tab the direct object of a verb\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f1\fs24\cf0 xobject\plain\f0\fs24\cf0 \tab \tab the indirect object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f1\fs24\cf0 self\plain\f0\fs24\cf0 \tab \tab \tab self-referential object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f1\fs24\cf0 words\plain\f0\fs24\cf0 \tab \tab \tab total number of words\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f1\fs24\cf0 player\plain\f0\fs24\cf0 \tab \tab the player object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f1\fs24\cf0 location\plain\f0\fs24\cf0 \tab \tab location of the player\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f1\fs24\cf0 verbroutine\plain\f0\fs24\cf0 \tab \tab the verb routine address\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f1\fs24\cf0 endflag\plain\f0\fs24\cf0 \tab \tab if not false (0), call \plain\f1\fs24\cf0 EndGame\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f1\fs24\cf0 prompt\plain\f0\fs24\cf0 \tab \tab for input line\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f1\fs24\cf0 objects\plain\f0\fs24\cf0 \tab \tab total number of objects\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f1\fs24\cf0 system_status\plain\f0\fs24\cf0 \tab after certain operations\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 PROPERTIES:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f1\fs24\cf0 name\plain\f0\fs24\cf0 \tab \tab \tab basic object name\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f1\fs24\cf0 before\plain\f0\fs24\cf0 \tab \tab pre-verb routines\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f1\fs24\cf0 after\plain\f0\fs24\cf0 \tab \tab \tab post-verb routines\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f1\fs24\cf0 noun\plain\f0\fs24\cf0 \tab \tab \tab noun(s) for referring to object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f1\fs24\cf0 adjective\plain\f0\fs24\cf0 \tab \tab adjective(s) for referring to object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f1\fs24\cf0 article\plain\f0\fs24\cf0 \tab \tab "a", "an", "the", "some", etc.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \par {\tx720 \qj\li1440\fi-1440\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab (As well as the aliases \plain\f1\fs24\cf0 nouns\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 adjectives\plain\f0\fs24\cf0 for \plain\f1\fs24\cf0 noun\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 adjective\plain\f0\fs24\cf0 , respectively, \plain\f0\fs24\cf0 are defined by the library.)\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Junction routines are not required. The engine has built-in default routines, although these will \plain\f0\fs24\cf0 likely not be satisfactory for most programmers. Therefore, \plain\f1\fs24\cf0 HUGOLIB.H \plain\f0\fs24\cf0 contains each of the \plain\f0\fs24\cf0 following routines which fully implement all the features of the library. If a different routine is \plain\f0\fs24\cf0 desired in place of a provided one, the routine should be substituted using '\plain\f1\fs24\cf0 replace\plain\f0\fs24\cf0 '. \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=55 dt=RTF VIII.a. Parse 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 VIII.a.\tab Parse\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The \plain\f1\fs24\cf0 Parse\plain\f0\fs24\cf0 routine, if one exists, is called by the engine parser. Here, the program itself may modify \plain\f0\fs24\cf0 the input line before grammar matching is attempted. What happens is:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab 1. The input line is split into words (by the engine).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab 2. The \plain\f1\fs24\cf0 Parse\plain\f0\fs24\cf0 routine, if it exists, is called.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab 3. Control returns to the engine for grammar matching.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 For example, the \plain\f1\fs24\cf0 Parse\plain\f0\fs24\cf0 routine in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 takes care of such things as pronouns ("he", "she", "it", \plain\f0\fs24\cf0 "them") and repeating the last legal command (with "again" or simply "g").\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Returning true from the \plain\f1\fs24\cf0 Parse\plain\f0\fs24\cf0 routine calls the engine parser again; returning false continues \plain\f0\fs24\cf0 normally. This is useful in case the \plain\f1\fs24\cf0 Parse\plain\f0\fs24\cf0 routine has changed the input line substantially, requiring \plain\f0\fs24\cf0 a reconfiguration of the already split words.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: Since the library's \plain\f1\fs24\cf0 Parse\plain\f0\fs24\cf0 routine is rather extensive, a provision is made for a \plain\f1\fs24\cf0 PreParse\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 routine-which in the library is defined as being empty-which may more easily be replaced for \plain\f0\fs24\cf0 additional parsing.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=56 dt=RTF VIII.b. ParseError 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 VIII.b.\tab ParseError\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The \plain\f1\fs24\cf0 ParseError\plain\f0\fs24\cf0 routine is called whenever a command is invalid. \plain\f1\fs24\cf0 ParseError\plain\f0\fs24\cf0 is called in the \plain\f0\fs24\cf0 form\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab ParseError(, )\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is the object number (if any) of the object involved in the error.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: The engine also sets up a special variable called '\plain\f1\fs24\cf0 parse$\plain\f0\fs24\cf0 ', usable only in a \plain\f1\fs24\cf0 print\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 statement (or in conjunction with '\plain\f1\fs24\cf0 string\plain\f0\fs24\cf0 '), which represents the illegal component of an input \plain\f0\fs24\cf0 line, whether it is the verb itself, an object name, a partial object name, or any other word \plain\f0\fs24\cf0 combination. For example:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab print "The illegal word was: "; parse$; "."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The default responses provided by the engine parse error routine are:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\brdrb\brdrs\brdrw10\brsp20\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab ERROR NUMBER\tab RESPONSE\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 0\tab \tab "What?"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 1\tab \tab "You can't use the word ."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 2\tab \tab "Better start with a verb."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 3\tab \tab "You can't multiple objects."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 4\tab \tab "Can't do that."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 5\tab \tab \tab "You haven't seen any , nor are you likely to in the near \tab \plain\f0\fs24\cf0 \tab future even if such a thing exists."\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 6\tab \tab "That doesn't make any sense."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 7\tab \tab "You can't use multiple objects like that."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 8\tab \tab "Which do you mean,...?"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 9\tab \tab "Nothing to ."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 10\tab \tab "You haven't seen anything like that."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 11\tab \tab "You don't see that."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 12\tab \tab "You can't do that with the ."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 13\tab \tab "You'll have to be a little more specific."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 14\tab \tab "You don't see that there."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 15\tab \tab "You don't have that."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 16\tab \tab "You'll have to make a mistake first."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 17\tab \tab "You can only correct one word at a time."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The \plain\f1\fs24\cf0 ParseError\plain\f0\fs24\cf0 routine in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 provides customized responses that take into account \plain\f0\fs24\cf0 such things as, for example, whether the player is first or second-person, whether or not an object is \plain\f0\fs24\cf0 a character or not, and if so, if it is male or female, etc.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 If the \plain\f1\fs24\cf0 ParseError\plain\f0\fs24\cf0 routine does not provide a response for a particular \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 , it \plain\f0\fs24\cf0 should return false. Returning false is a signal that the engine should continue with the default \plain\f0\fs24\cf0 message. Returning 2 is a signal to reparse the entire existing line (useful in cases where a peculiar \plain\f0\fs24\cf0 syntax is trapped as an error, changed, and must then be reparsed).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: If custom error messages are desired for user parsing routines, replace the routine \plain\f1\fs24\cf0 CustomError\plain\f0\fs24\cf0 with a new routine (called with the same parameters as \plain\f1\fs24\cf0 ParseError\plain\f0\fs24\cf0 ), providing \plain\f0\fs24\cf0 that \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is greater than or equal to 100.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=57 dt=RTF VIII.c. EndGame 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 VIII.c.\tab EndGame\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The \plain\f1\fs24\cf0 EndGame\plain\f0\fs24\cf0 routine is called immediately whenever the global variable \plain\f1\fs24\cf0 endflag\plain\f0\fs24\cf0 is non-zero, \plain\f0\fs24\cf0 regardless of whether or not the current function has not yet been terminated.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 's \plain\f1\fs24\cf0 EndGame\plain\f0\fs24\cf0 routine behaves according to the value to which \plain\f1\fs24\cf0 endflag\plain\f0\fs24\cf0 is set:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\brdrb\brdrs\brdrw10\brsp20\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 endflag\plain\f0\fs24\cf0 \tab RESULT\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab 1\tab \tab Player wins\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab 2\tab \tab Player's demise\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440 \qj\li2160\fi-2160\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab (3\tab \tab Other ending-not provided for by default \plain\f1\fs24\cf0 PrintEndGame\plain\f0\fs24\cf0 routine)\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Returning false from \plain\f1\fs24\cf0 Endgame\plain\f0\fs24\cf0 terminates the game completely; returning non-false restarts.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: To modify only the message displayed at the end of the game (defaults: "*** YOU'VE WON \plain\f0\fs24\cf0 THE GAME! ***" and "*** YOU ARE DEAD ***"), replace the \plain\f1\fs24\cf0 PrintEndGame\plain\f0\fs24\cf0 routine. Other than \plain\f0\fs24\cf0 being non-false, the various values of \plain\f1\fs24\cf0 endflag\plain\f0\fs24\cf0 are insignificant except to \plain\f1\fs24\cf0 PrintEndGame\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=58 dt=RTF VIII.d. FindObject 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 VIII.d.\tab FindObject\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The \plain\f1\fs24\cf0 FindObject\plain\f0\fs24\cf0 routine takes into account all the relevant properties, attributes, and object \plain\f0\fs24\cf0 hierarchy to determine whether or not a particular object is available. For example, the child of a \plain\f0\fs24\cf0 parent object may be available if the parent is a platform, but unavailable if the parent is a \plain\f0\fs24\cf0 container (and closed)-although internally, the object hierarchy is the same.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 FindObject\plain\f0\fs24\cf0 is called via:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab FindObject(, )\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is the object in question, and \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is the object where its availability is \plain\f0\fs24\cf0 being tested. (Usually \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is a room, unless a different parent has been specified in the \plain\f0\fs24\cf0 input line.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 FindObject\plain\f0\fs24\cf0 returns true (1) if the object is available, false (0) if unavailable. It returns 2 if the \plain\f0\fs24\cf0 object is visible but not physically accessible.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The \plain\f1\fs24\cf0 FindObject\plain\f0\fs24\cf0 routine in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 considers not only the location of \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 in the \plain\f0\fs24\cf0 object tree, but also tests the attributes of the parent to see if it is open or closed. As well, it checks \plain\f0\fs24\cf0 the \plain\f1\fs24\cf0 found_in\plain\f0\fs24\cf0 property, in case \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 has been assigned multiple locations instead of an \plain\f0\fs24\cf0 explicit parent, and then scans the \plain\f1\fs24\cf0 in_scope\plain\f0\fs24\cf0 property of the object (if one exists).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Finally, the default behavior of the library's \plain\f1\fs24\cf0 FindObject\plain\f0\fs24\cf0 requires that a player have encountered \plain\f0\fs24\cf0 an object for it to be valid in an action, i.e., it must have the known attribute set. To override this, \plain\f0\fs24\cf0 replace the routine \plain\f1\fs24\cf0 ObjectisKnown\plain\f0\fs24\cf0 with a routine that returns an unconditional true value.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 There is one special case in which the engine expects the \plain\f1\fs24\cf0 FindObject\plain\f0\fs24\cf0 routine to be especially \plain\f0\fs24\cf0 helpful: that is if the routine is called with \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 equal to 0. This occurs whenever the \plain\f0\fs24\cf0 engine needs to determine if an object is available \plain\f0\fs24\cf0\i at all\plain\f0\fs24\cf0 -regardless of any rules normally governing \plain\f0\fs24\cf0 object availability-such as when an '\plain\f1\fs24\cf0 anything\plain\f0\fs24\cf0 ' grammar token is encountered, or the engine needs \plain\f0\fs24\cf0 to disambiguate two or more seemingly identical objects.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (Also, \plain\f1\fs24\cf0 FindObject\plain\f0\fs24\cf0 may be called by the engine with both \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 equal to \plain\f0\fs24\cf0 0 to reset any library-based object disambiguation.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=59 dt=RTF VIII.e. SpeakTo 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 VIII.e.\tab SpeakTo\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The \plain\f1\fs24\cf0 SpeakTo\plain\f0\fs24\cf0 routine is called whenever an input line begins with a valid object name instead of a \plain\f0\fs24\cf0 verb. This is so the player may direct commands to (usually) characters in the game. For example:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Professor Plum, drop the lead pipe\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 It is up to the \plain\f1\fs24\cf0 SpeakTo\plain\f0\fs24\cf0 routine to properly interpret the instruction.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 SpeakTo\plain\f0\fs24\cf0 is called via:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab SpeakTo()\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 in the above example would be the Professor Plum object.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The globals \plain\f1\fs24\cf0 object\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 xobject\plain\f0\fs24\cf0 , and \plain\f1\fs24\cf0 verbroutine\plain\f0\fs24\cf0 are all set up as normal. For the above \plain\f0\fs24\cf0 example, then, these would be\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab object\tab \tab leadpipe\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab xobject\tab \tab nothing\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab verbroutine \tab &DoDrop\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 when \plain\f1\fs24\cf0 SpeakTo\plain\f0\fs24\cf0 is called.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 's \plain\f1\fs24\cf0 SpeakTo\plain\f0\fs24\cf0 routine provides basic interpretation of questions, so that\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Professor Plum, what about the lead pipe?\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 may be directed to the proper verb routine, as if the player had typed:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab ask Professor Plum about the lead pipe\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Imperative commands are, such as\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab Colonel Mustard, stand up\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 are first directed to the \plain\f1\fs24\cf0 order_response \plain\f0\fs24\cf0 property of the character object in question. It is \plain\f0\fs24\cf0 subsequently up to \plain\f1\fs24\cf0 .order_response\plain\f0\fs24\cf0 to analyze \plain\f1\fs24\cf0 verbroutine\plain\f0\fs24\cf0 (as well as \plain\f1\fs24\cf0 object\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 xobject\plain\f0\fs24\cf0 , if applicable) to see if the request is a valid one. If no response is \plain\f0\fs24\cf0 provided, \plain\f1\fs24\cf0 order_response\plain\f0\fs24\cf0 should return false.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab order_response\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab if verbroutine = &DoGet\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab "I would, but my back is too sore."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab else\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab return false\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=60 dt=RTF VIII.f. Perform 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 VIII.f.\tab Perform\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The \plain\f1\fs24\cf0 Perform\plain\f0\fs24\cf0 routine is what is called by the engine in order to execute the appropriate \plain\f0\fs24\cf0 verbroutine with the given object(s) and/or indirect object, if either or both are applicable. It is the \plain\f0\fs24\cf0 responsibility of \plain\f1\fs24\cf0 Perform\plain\f0\fs24\cf0 to do the appropriate checking of \plain\f1\fs24\cf0 before\plain\f0\fs24\cf0 routines to determine if \plain\f0\fs24\cf0 execution actually gets to the verbroutine.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 Perform\plain\f0\fs24\cf0 is called as:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Perform(, , , )\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The first three arguments represent the match verb (always), object (if given), and indirect object, \plain\f0\fs24\cf0 i.e., the xobject (if given). The \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is 0 unless the verbroutine is being called more than once \plain\f0\fs24\cf0 for multiple objects. (As a special case, \plain\f1\fs24\cf0 \plain\f0\fs24\cf0 is -1 if \plain\f1\fs24\cf0 object\plain\f0\fs24\cf0 or \plain\f1\fs24\cf0 xobject\plain\f0\fs24\cf0 is a number \plain\f0\fs24\cf0 supplied in the input as one or more digits, in order to signal \plain\f1\fs24\cf0 Perform\plain\f0\fs24\cf0 not to do normal \plain\f1\fs24\cf0 before\plain\f0\fs24\cf0 /\plain\f1\fs24\cf0 after\plain\f0\fs24\cf0 routine calling.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 For example, the various player commands might (approximately, depending on verbroutine and \plain\f0\fs24\cf0 object names) result in the routine calls:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab >i\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab Perform(&DoInventory, 0, 0, 0)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab >get key\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab Perform(&DoGet, key_object, 0, 0)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab >put the key on the table\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab Perform(&DoGet, key_object, 0, 0)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab >turn the dial to 127\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab Perform(&DoTurn, dial, 127, -1)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab >get key and banana\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab Perform(&DoGet, key_object, 0, 1)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab Perform(&DoGet, banana, 0, 2)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (If no \plain\f1\fs24\cf0 Perform\plain\f0\fs24\cf0 routine exists, the engine performs a default calling of \plain\f1\fs24\cf0 player.before\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 location.before\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 xobject.before\plain\f0\fs24\cf0 , and \plain\f1\fs24\cf0 object.before\plain\f0\fs24\cf0 , then finally \plain\f1\fs24\cf0 verbroutine\plain\f0\fs24\cf0 if \plain\f0\fs24\cf0 none of those returns true.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=61 nft=02;80000008;000A;00;Times New Roman dt=RTF IX. THE GAME LOOP 1 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0\b XI.\tab THE GAME LOOP\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 This the paradigm that the Hugo Engine follows during program execution. (Also mentioned are \plain\f0\fs24\cf0 the calling of \plain\f1\fs24\cf0 before\plain\f0\fs24\cf0 routines and the \plain\f1\fs24\cf0 verbroutine\plain\f0\fs24\cf0 by \plain\f1\fs24\cf0 Perform\plain\f0\fs24\cf0 in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 . While not \plain\f0\fs24\cf0 necessarily part of the game loop-since they may or may not be included in a program-they are \plain\f0\fs24\cf0 mentioned here because they are relevant to any Hugo program that uses the standard Hugo \plain\f0\fs24\cf0 Library.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720 \qj\li1440\fi-1440\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (INIT:\tab \tab The \plain\f1\fs24\cf0 Init\plain\f0\fs24\cf0 routine is called only when the program is first run, or when a '\plain\f1\fs24\cf0 restart\plain\f0\fs24\cf0 ' \plain\f0\fs24\cf0 command is issued.)\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720 \qj\li1440\fi-1440\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 MAIN:\tab At the start of the game loop, the engine calls the \plain\f1\fs24\cf0 Main\plain\f0\fs24\cf0 routine. The routine \plain\f0\fs24\cf0 should-as in the provided sample programs-take care of advancing the turn counter, \plain\f0\fs24\cf0 executing the '\plain\f1\fs24\cf0 runevents\plain\f0\fs24\cf0 ' command, and calling such library routines as \plain\f1\fs24\cf0 RunScripts\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 PrintStatusLine\plain\f0\fs24\cf0 .\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720 \qj\li1440\fi-1440\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 INPUT:\tab Keyboard input is received.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720 \qj\li1440\fi-1440\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 PARSING:\tab The input line is checked for validity, synonyms and other special words are checked, \plain\f0\fs24\cf0 and the user \plain\f1\fs24\cf0 Parse\plain\f0\fs24\cf0 routine (if any) is called.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 GRAMMAR MATCHING:\par {\tx720 \qj\li1440\fi-1440\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab The engine attempts to match the input line with a valid verb and syntax in the grammar \plain\f0\fs24\cf0 table. If no match is found, the engine loops back to INPUT.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720 \qj\li1440\fi-1440\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab Otherwise, a successful grammar match results in at least the \plain\f1\fs24\cf0 verbroutine\plain\f0\fs24\cf0 global being \plain\f0\fs24\cf0 set, as well as potentially \plain\f1\fs24\cf0 object\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 xobject\plain\f0\fs24\cf0 .\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab BEFORE ROUTINES (as called by \plain\f1\fs24\cf0 Perform\plain\f0\fs24\cf0 in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 ):\par {\tx720\tx1440 \qj\li2160\fi-2160\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab If any objects were specified in the input line, their \plain\f1\fs24\cf0 before\plain\f0\fs24\cf0 properties are checked \plain\f0\fs24\cf0 in the following order, for each object:\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \plain\f1\fs24\cf0 player.before\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \plain\f1\fs24\cf0 location.before\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \plain\f1\fs24\cf0 xobject.before\plain\f0\fs24\cf0 \tab \tab (if applicable)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \plain\f1\fs24\cf0 object.before\plain\f0\fs24\cf0 \tab \tab (if applicable)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440 \qj\li2160\fi-2160\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab If any of these property routines returns true, the engine skips the verb routine.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab VERB ROUTINE (as called by \plain\f1\fs24\cf0 Perform\plain\f0\fs24\cf0 in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 ):\par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab If no before property routine returns true, the verb routine is run.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab If an action is successfully completed, the verb routine should return true. \plain\f0\fs24\cf0 Returning false negates any remaining commands in the input line.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \plain\f1\fs24\cf0 Perform\plain\f0\fs24\cf0 does not run any \plain\f1\fs24\cf0 after\plain\f0\fs24\cf0 property routines for \plain\f1\fs24\cf0 object\plain\f0\fs24\cf0 or \plain\f1\fs24\cf0 xobject\plain\f0\fs24\cf0 ; that is up to the verb routine. It does run both \plain\f1\fs24\cf0 player.after\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 location.after\plain\f0\fs24\cf0 if the verbroutine returns true.\par \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab (Control returns from the library \plain\f1\fs24\cf0 Perform\plain\f0\fs24\cf0 routine to the engine)\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 When finished, the engine loops back to MAIN, calling the \plain\f1\fs24\cf0 Main\plain\f0\fs24\cf0 routine only if the last verb \plain\f0\fs24\cf0 matched was not an xverb.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Setting the global endflag at any point to a non-zero value will terminate the game loop and run the \plain\f1\fs24\cf0 EndGame\plain\f0\fs24\cf0 junction routine.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: Undo information recalled by 'undo' is saved each turn only during the \plain\f1\fs24\cf0 Main\plain\f0\fs24\cf0 routine \plain\f0\fs24\cf0 (including any commands or functions called within, such as events, fuses and daemons, or \plain\f0\fs24\cf0 character scripts) and verb routines (unless the verb was an xverb). It is therefore recommended \plain\f0\fs24\cf0 that no other routines change any significant game data, because it will not be recoverable with \plain\f0\fs24\cf0 'undo'.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=62 nft=02;80000008;000A;00;Times New Roman dt=RTF X. ADVANCED FEATURES 1 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset2 symbol;}{\f2\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard{\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \keep\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0\b X.\tab ADVANCED FEATURES}} } 5P9i0s8y19Z id=63 dt=RTF X.a. The Display Object 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 X.a.\tab The Display Object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The engine provides access to the following read-only properties (although the names themselves \plain\f0\fs24\cf0 are defined in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 ):\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 screenwidth\plain\f0\fs24\cf0 \tab \tab width of the display, in characters\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 screenheight\plain\f0\fs24\cf0 \tab height of the display, in characters\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 linelength\plain\f0\fs24\cf0 \tab \tab width of the current text window\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 windowlines\plain\f0\fs24\cf0 \tab \tab height of the current text window\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 cursor_column\plain\f0\fs24\cf0 \tab horizontal and vertical position of\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 cursor_row\plain\f0\fs24\cf0 \tab \tab the cursor in the current text window\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The Hugo Library also defines the normal read/writable:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 statusline_height\plain\f0\fs24\cf0 \tab of the last-printed status line\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 In order for the engine to properly identify the display object, it selects the object (if any) with the \plain\f0\fs24\cf0 textual name "(display)", i.e., an object that is defined as\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab object display\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 with no explicit textual name. This is how the Hugo Library defines the display object, so that the \plain\f0\fs24\cf0 various display object properties are readable as \plain\f1\fs24\cf0 display.screenheight\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 display.cursor_column\plain\f0\fs24\cf0 , etc.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } 5P9i0s8y19Z id=64 dt=RTF X.b. Windows 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 X.b.\tab Windows\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 It is possible to create an enclosing window within the full-screen display for text output. Cursor \plain\f0\fs24\cf0 position, line-wrapping, etc. are trimmed to the boundaries of the current window. Cursor \plain\f0\fs24\cf0 positioning and window boundaries are always calculated in fixed-width character dimensions. \plain\f0\fs24\cf0 Various syntaxes for the 'window' statement are:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 window 0\plain\f0\fs24\cf0 \tab \tab \tab Restores full-screen output\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 window n\plain\f0\fs24\cf0 \tab \tab \tab Creates a window of \plain\f1\fs24\cf0 n\plain\f0\fs24\cf0 lines, bordering\par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \{...\}\plain\f0\fs24\cf0 \tab \tab \tab on the top edge and sides of the full-screen\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 window l, t, r, b\plain\f0\fs24\cf0 \tab Creates a window with the top-left\par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \{...\}\plain\f0\fs24\cf0 \tab \tab \tab corner (\plain\f1\fs24\cf0 l\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 t\plain\f0\fs24\cf0 ) and the bottom-right corner (\plain\f1\fs24\cf0 r\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 b\plain\f0\fs24\cf0 ), where these \plain\f0\fs24\cf0 coordinates are character coordinates on the full-screen\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 window\plain\f0\fs24\cf0 \tab \tab Redraws the last-defined window\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 \{...\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Each of these usages except "\plain\f1\fs24\cf0 window 0\plain\f0\fs24\cf0 " is followed by a block of code during which, normally, \plain\f0\fs24\cf0 text is output to the window.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The window (i.e., its boundaries) exists for the duration of the "\plain\f1\fs24\cf0 \{...\}\plain\f0\fs24\cf0 " block. After it finishes, the \plain\f0\fs24\cf0 top of the main text window is redefined as being immediately below the lowest-drawn window. \plain\f0\fs24\cf0 To clear the record of any window and restore the main text window to the full-screen, use \plain\f0\fs24\cf0 "\plain\f1\fs24\cf0 window 0\plain\f0\fs24\cf0 ".\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 An windowing library file exists called \plain\f1\fs24\cf0 WINDOW.H\plain\f0\fs24\cf0 which defines a \plain\f1\fs24\cf0 window_class\plain\f0\fs24\cf0 and the \plain\f0\fs24\cf0 associate properties so a window object can be created via:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab window_class "title"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab win_position , \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab win_size , \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab win_textcolor \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab win_backcolor \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab win_titlecolor \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab win_titleback <title background>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The \plain\f1\fs24\cf0 window_class\plain\f0\fs24\cf0 also incorporates the property routines \plain\f1\fs24\cf0 win_init\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 win_clear\plain\f0\fs24\cf0 , and \plain\f1\fs24\cf0 win_end\plain\f0\fs24\cf0 .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: It may be important to keep in mind that measures such as \plain\f1\fs24\cf0 display.screenwidth\plain\f0\fs24\cf0 may \plain\f0\fs24\cf0 change during execution, particularly in a graphical user interface windowing environment which \plain\f0\fs24\cf0 allows resizing of the Hugo program window. For this reason, it is wise to resample \plain\f1\fs24\cf0 display.<property>\plain\f0\fs24\cf0 whenever a window is to be drawn instead of basing the coordinates on, \plain\f0\fs24\cf0 for example, a set of boundaries calculated during program initialization.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } <end node> 5P9i0s8y19Z id=65 dt=RTF <node> X.c. Reading and Writing Files 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 X.c.\tab Reading and Writing Files\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 There may be times when it will be useful to store data in a file for later recovery. The most basic \plain\f0\fs24\cf0 way of doing this involves\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x = save\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x = restore\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where the '\plain\f1\fs24\cf0 save\plain\f0\fs24\cf0 ' and '\plain\f1\fs24\cf0 restore\plain\f0\fs24\cf0 ' functions return a true value to \plain\f1\fs24\cf0 x\plain\f0\fs24\cf0 if successful, or a false value if \plain\f0\fs24\cf0 for some reason they fail. In either case, the entire set of game data-including object locations, \plain\f0\fs24\cf0 variable values, arrays, attributes, etc.-is saved or restored, respectively.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Other times, it may be desirable to save only certain values. For example, a particular game may \plain\f0\fs24\cf0 allow a player to create certain player characteristics or other "remembered data" that can be \plain\f0\fs24\cf0 restored in the same game or in different games.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To accomplish this, use the '\plain\f1\fs24\cf0 writefile\plain\f0\fs24\cf0 ' and '\plain\f1\fs24\cf0 readfile\plain\f0\fs24\cf0 ' operations.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The structure\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab writefile <filename>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will, at the start of the \plain\f1\fs24\cf0 writefile\plain\f0\fs24\cf0 block, open \plain\f1\fs24\cf0 <filename>\plain\f0\fs24\cf0 for writing and position \plain\f1\fs24\cf0 <filename>\plain\f0\fs24\cf0 to the start of the (empty) file. (If the file exists, it will be cleared/erased.) At the \plain\f0\fs24\cf0 conclusion of the block, the file will be closed again.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Within a \plain\f1\fs24\cf0 writefile\plain\f0\fs24\cf0 block, write individual values using\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab writeval <value1>[, <value2>, ...]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 where one or more values can be specified.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To read the file, use the structure\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab readfile <filename>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 which will contain the assignment\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x = readval\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 for each value to be read, where \plain\f1\fs24\cf0 x\plain\f0\fs24\cf0 can be any storage type such as a variable, property, etc.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 For example,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab local count, test\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab count = 10\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab writefile "testfile"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab writeval count, "telephone", 10\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab test = FILE_CHECK\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab writeval test\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if test ~= FILE_CHECK\tab ! an error has occurred\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print "An error has occurred."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 will write the variable count, the dictionary entry "telephone", and the value 10 to "testfile". Then,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab local a, b, c, test\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab readfile "testfile"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab a = readval\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab b = readval\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab c = readval\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab test = readval\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if test ~= FILE_CHECK\tab ! an error has occurred\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print "Error reading file."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 If the \plain\f1\fs24\cf0 readfile\plain\f0\fs24\cf0 block executes successfully, \plain\f1\fs24\cf0 a\plain\f0\fs24\cf0 will be equal to the former value \plain\f1\fs24\cf0 count\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 b\plain\f0\fs24\cf0 will be \plain\f0\fs24\cf0 "telephone", and \plain\f1\fs24\cf0 c\plain\f0\fs24\cf0 will be 10.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The constant \plain\f1\fs24\cf0 FILE_CHECK\plain\f0\fs24\cf0 , defined in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 , is useful because \plain\f1\fs24\cf0 writefile\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 readfile\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 provide no explicit error return to indicate failure. \plain\f1\fs24\cf0 FILE_CHECK\plain\f0\fs24\cf0 is a unique two-byte sequence \plain\f0\fs24\cf0 that can be used to test for success.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 In the \plain\f1\fs24\cf0 writefile\plain\f0\fs24\cf0 block, if the block is exited prematurely due to an error, \plain\f1\fs24\cf0 test\plain\f0\fs24\cf0 will never be set \plain\f0\fs24\cf0 to \plain\f1\fs24\cf0 FILE_CHECK\plain\f0\fs24\cf0 . The '\plain\f1\fs24\cf0 if\plain\f0\fs24\cf0 ' statement following the block tests for this.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 In the \plain\f1\fs24\cf0 readfile\plain\f0\fs24\cf0 block, \plain\f1\fs24\cf0 test\plain\f0\fs24\cf0 will only be set to \plain\f1\fs24\cf0 FILE_CHECK\plain\f0\fs24\cf0 if the sequence of \plain\f1\fs24\cf0 readval\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 functions finds the expected number of values in "testfile". If there are too many or too few values \plain\f0\fs24\cf0 in "testfile", or if an error forces an early exit from the r\plain\f1\fs24\cf0 eadfile\plain\f0\fs24\cf0 block, \plain\f1\fs24\cf0 test\plain\f0\fs24\cf0 will equal a value \plain\f0\fs24\cf0 other than \plain\f1\fs24\cf0 FILE_CHECK\plain\f0\fs24\cf0 .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } <end node> 5P9i0s8y19Z id=66 nft=02;80000008;000A;00;Times New Roman dt=RTF <node> XI.RESOURCES 1 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0\b XI.\tab RESOURCES\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The engine allows a Hugo program to access external data (called resources) compiled into a \plain\f0\fs24\cf0 specially formatted file called a resourcefile. A resourcefile is created using:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab resource "<resourcefile>"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab "<resource1>"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab "<resource2>"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The \plain\f1\fs24\cf0 <resourcefile>\plain\f0\fs24\cf0 name must be 8 or fewer alphanumeric characters which will \plain\f0\fs24\cf0 automatically be converted to all-uppercase. (The reason for this is to maximize portability across \plain\f0\fs24\cf0 different platforms and filenaming systems-unfortunately not everyone adheres to the same \plain\f0\fs24\cf0 conventions, so this restriction is intended to reduce filenaming to the lowest common \plain\f0\fs24\cf0 denominator.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Currently v2.5 supports JPEG graphic files, RIFF/WAV audio samples, and MOD/S3M/XM music \plain\f0\fs24\cf0 modules as resources.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 For example, here is an imaginary example resourcefile compiled on a Windows 95/NT platform:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab resource "gameres1"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab "c:\\hugo\\graphics\\logo.jpg"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab "h:\\data\\scenic panorama.jpg"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab "h:\\data\\background.jpg"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab "c:\\music\\intro_theme.s3m"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab "c:\\music\\theme2.xm"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab "c:\\sounds\\sample1.wav"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab "c:\\sounds\\sample2.wav"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 It doesn't matter that the nomenclature within a resource definition is non-portable. In the above \plain\f0\fs24\cf0 "\plain\f1\fs24\cf0 gameres1\plain\f0\fs24\cf0 ", for example, the filenaming is specific to Windows 95/NT, since that's where the \plain\f0\fs24\cf0 original files will be found. The resources, however, are accessed only by their filenames as entries \plain\f0\fs24\cf0 in the resourcefile index. Therefore, after "\plain\f1\fs24\cf0 gameres1\plain\f0\fs24\cf0 " is created, the three pictures are referred to \plain\f0\fs24\cf0 as "logo", "scenic panorama" and "background" within the resourcefile "\plain\f1\fs24\cf0 gameres1\plain\f0\fs24\cf0 ". (Note that any \plain\f0\fs24\cf0 drive/path or extension specification is removed and not included in the index. As a result, two \plain\f0\fs24\cf0 resources with the same name but different paths/extensions cannot be written into the same \plain\f0\fs24\cf0 resourcefile.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Because of the relative non-portability of resourcefiles (plus the additional time it may take on \plain\f0\fs24\cf0 slower machines to index and consolidate potentially hundreds of kilobytes of data), it is \plain\f0\fs24\cf0 recommended that resources be compiled from separate source files than the rest of a Hugo game.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The library extension \plain\f1\fs24\cf0 RESOURCE.H\plain\f0\fs24\cf0 provides useful routines for managing resources in a Hugo \plain\f0\fs24\cf0 program.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 It also defines the following potential values for \plain\f1\fs24\cf0 system_status\plain\f0\fs24\cf0 , which may be tested after a \plain\f0\fs24\cf0 resource operation. If \plain\f1\fs24\cf0 system_status\plain\f0\fs24\cf0 is non-zero (signifying normal status), it will contain one \plain\f0\fs24\cf0 of the following values:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab -1\tab \tab STAT_UNAVAILABLE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab 101\tab \tab STAT_NOFILE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab 102\tab \tab STAT_NORESOURCE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab 103\tab \tab STAT_LOADERROR\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } <end node> 5P9i0s8y19Z id=67 dt=RTF <node> XI.a. Pictures 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 XI.a.\tab Pictures\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 A picture is displayed as a resource in a resourcefile using:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab picture "<resourcefile>", "<picture>"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 For example,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab picture "gameres1", "logo"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (It is also possible to enter the path of a picture directly, such as\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab picture "c:\\hugo\\graphics\\logo.jpg"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 but since this path/filename is obviously operating-system-specific, it should be used for testing \plain\f0\fs24\cf0 only. If the named picture is not found in the given resourcefile, the engine will similarly try to \plain\f0\fs24\cf0 load the picture as an independent file from the current search path(s).)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The picture will be displayed in the currently defined text window. If the picture is smaller than \plain\f0\fs24\cf0 the current window, it will be centered. If larger, it will be shrunk to fit. If the particular version of \plain\f0\fs24\cf0 the Hugo Engine being used is not graphics-enabled, '\plain\f1\fs24\cf0 picture\plain\f0\fs24\cf0 ' will have no effect.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 If the picture is not found or a recoverable error occurs during loading, normal engine execution \plain\f0\fs24\cf0 continues uninterrupted.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 RESOURCE.H\plain\f0\fs24\cf0 provides a couple of useful routines for managing graphics:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab LoadPicture("resourcefile", "picture")\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab LoadPicture("picture")\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab PictureinText("file", "pic", width, height, preserve)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab PictureinText("picture", width, height, preserve)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 LoadPicture\plain\f0\fs24\cf0 is essentially a simple wrapper for the '\plain\f1\fs24\cf0 picture\plain\f0\fs24\cf0 ' statement, providing the \plain\f0\fs24\cf0 additional service of checking \plain\f1\fs24\cf0 display.hasgraphics\plain\f0\fs24\cf0 to ensure that graphics display is \plain\f0\fs24\cf0 available.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 PictureinText\plain\f0\fs24\cf0 is slightly more complex. It allows a picture to be displayed in the normal flow \plain\f0\fs24\cf0 of text in the main window. The \plain\f1\fs24\cf0 <width>\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 <height>\plain\f0\fs24\cf0 arguments give the fixed-width \plain\f0\fs24\cf0 character dimensions of the display area. (Because displays differ in their character dimensions, it \plain\f0\fs24\cf0 is recommended to calculate these based on \plain\f1\fs24\cf0 display.screenwidth\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 display.screenheight\plain\f0\fs24\cf0 instead of passing absolute values.) The \plain\f1\fs24\cf0 <preserve>\plain\f0\fs24\cf0 parameter, if \plain\f0\fs24\cf0 given, ensures that one or more lines at the top of the screen are protected from scrolling off.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (Either \plain\f1\fs24\cf0 LoadPicture\plain\f0\fs24\cf0 or \plain\f1\fs24\cf0 PictureinText\plain\f0\fs24\cf0 can be called with only a picture, i.e., with no \plain\f0\fs24\cf0 resourcefile named. In this case, \plain\f1\fs24\cf0 RESOURCE.H\plain\f0\fs24\cf0 will attempt to find the resource in the last used \plain\f0\fs24\cf0 resourcefile, stored in the \plain\f1\fs24\cf0 last_resource_file\plain\f0\fs24\cf0 global. Because of the potential inaccuracy of \plain\f0\fs24\cf0 this method, it is generally recommended to always specify the resourcefile name.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } <end node> 5P9i0s8y19Z id=68 dt=RTF <node> XI.b. Sound and Music 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 XI.b.\tab Sound and Music\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Sounds and music are played using the Hugo statements:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab sound [repeat] <resourcefile>, <resource>[, <vol>]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab music [repeat] <resourcefile>, <resource>[, <vol>]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The \plain\f1\fs24\cf0 repeat\plain\f0\fs24\cf0 keyword is optional; if supplied, it forces the engine to repeatedly play the \plain\f0\fs24\cf0 sound/music resource until further notice (i.e., until it is stopped or a new sound/music resource \plain\f0\fs24\cf0 is played). The \plain\f1\fs24\cf0 <vol>\plain\f0\fs24\cf0 argument is optional. If given, it gives a volume percentage (0-100) for \plain\f0\fs24\cf0 playback.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Currently playing sound or music can be stopped using:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab sound 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab music 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 RESOURCE.H\plain\f0\fs24\cf0 provides a pair of wrapper functions to manage playing of audio resources:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab PlaySound(resourcefile, sample, loop, force)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab PlayMusic(resourcefile, song, loop, force)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 In either case, if \plain\f1\fs24\cf0 <loop>\plain\f0\fs24\cf0 is true, it has the same effect as using the repeat token after '\plain\f1\fs24\cf0 sound\plain\f0\fs24\cf0 ' or \plain\f0\fs24\cf0 '\plain\f1\fs24\cf0 music\plain\f0\fs24\cf0 '. If \plain\f1\fs24\cf0 <force>\plain\f0\fs24\cf0 is true, the sample or song is restarted even if that same sample or song is \plain\f0\fs24\cf0 already playing (otherwise the \plain\f1\fs24\cf0 PlaySound\plain\f0\fs24\cf0 or \plain\f1\fs24\cf0 PlayMusic\plain\f0\fs24\cf0 call will have essentially no effect).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To stop a sample or song from playing via the library interface, use:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab PlaySound(SOUND_STOP)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab PlayMusic(MUSIC_STOP)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (where \plain\f1\fs24\cf0 SOUND_STOP\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 MUSIC_STOP\plain\f0\fs24\cf0 are constants defined in \plain\f1\fs24\cf0 RESOURCE.H\plain\f0\fs24\cf0 ).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } <end node> 5P9i0s8y19Z id=69 nft=02;80000008;000A;00;Times New Roman dt=RTF <node> APPENDIX A: SUMMARY OF KEYWORDS AND COMMANDS 1 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0\b APPENDIX A: SUMMARY OF KEYWORDS AND COMMANDS\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b AND\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Logical and.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX: \tab \plain\f1\fs24\cf0 x = <value1> and <value2>\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab RESULT:\tab \plain\f1\fs24\cf0 x\plain\f0\fs24\cf0 will be true if \plain\f1\fs24\cf0 <value1>\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 <value2>\plain\f0\fs24\cf0 are both non-zero, false if one \plain\f0\fs24\cf0 or both is zero.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b ANYTHING\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Object specifier in grammar syntax line, indicating that any \plain\f0\fs24\cf0 nameable object in the object tree is valid.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b ARRAY\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab When used as a data type modifier, specifies that the following \plain\f0\fs24\cf0 value is to be treated as an array address.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab EXAMPLE:\tab \plain\f1\fs24\cf0 <var1> = array <var2>[5]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab The variable \plain\f1\fs24\cf0 <var2>\plain\f0\fs24\cf0 will be treated as an array address.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b BREAK\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Terminates the immediate enclosing loop.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab EXAMPLE:\tab \plain\f1\fs24\cf0 while <expression1>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \{\par \qj\li720\fi-720\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab while <expression2>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab \tab if <expression3>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab \tab \tab break\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab The \plain\f1\fs24\cf0 break\plain\f0\fs24\cf0 statement, if encountered, will terminate the innermost loop.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b CALL\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Calls a routine indirectly, i.e., when the routine address has been \plain\f0\fs24\cf0 stored in a variable, object property, etc.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 call <value>[(<arg1>, <arg2>,...)]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab or\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab x = call <value>(...)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab where \plain\f1\fs24\cf0 <value>\plain\f0\fs24\cf0 is a valid data type holding the routine address.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab VALUE:\tab When used as a function, returns the value returned by the specified \plain\f0\fs24\cf0 routine.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b CAPITAL\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Print statement modifier, indicating that the next word should be \plain\f0\fs24\cf0 printed with the first letter capitalized.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 print capital <address>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab where \plain\f1\fs24\cf0 <address>\plain\f0\fs24\cf0 is any dictionary word, such as, for example, an \plain\f1\fs24\cf0 object.name\plain\f0\fs24\cf0 property.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b CASE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Specifies a conditional case in a '\plain\f1\fs24\cf0 select\plain\f0\fs24\cf0 ' structure.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 select <val>\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab case <case1>[, <case2>,...]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab case <case3>[, <case4>,...]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab where \plain\f1\fs24\cf0 <val>\plain\f0\fs24\cf0 is value such as a variable, routine return value, object \plain\f0\fs24\cf0 property, array element, etc., and each \plain\f1\fs24\cf0 <case>\plain\f0\fs24\cf0 is a single value for \plain\f0\fs24\cf0 comparison (not an expression).\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b CHILD\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 x = child(<parent>)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab RETURN VALUE:\tab The object number of the immediate child object of \plain\f1\fs24\cf0 <parent>\plain\f0\fs24\cf0 , or \plain\f0\fs24\cf0 0 if \plain\f1\fs24\cf0 <parent>\plain\f0\fs24\cf0 has no children.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b CHILDREN\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 x = children(<parent>)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab RETURN VALUE:\tab The number of child objects possessed by \plain\f1\fs24\cf0 <parent>\plain\f0\fs24\cf0 .\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b CLS\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Clears the current text window repositions the output coordinates \plain\f0\fs24\cf0 at the bottom left of the text window.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 cls\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b COLOR (or COLOUR)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Sets the display colors for text output.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 color <foreground>[, <background>]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab where \plain\f1\fs24\cf0 <background>\plain\f0\fs24\cf0 is optional\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab PARAMETERS:\tab Standard color values for \plain\f1\fs24\cf0 <foreground>\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 <background>\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 (from \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 ) are:\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab 0\tab Black\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab 1\tab Blue\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab 2\tab Green\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab 3\tab Cyan\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab 4\tab Red\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab 5\tab Magenta\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab 6\tab Brown\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab 7\tab White\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab 8\tab Dark gray\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab 9\tab Light blue\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab 10\tab Light green\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab 11\tab Light cyan\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab 12\tab Light red\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab 13\tab Light magenta\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab 14\tab Light yellow\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab 15\tab Bright white\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b DICT\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Dynamically creates a new dictionary entry at runtime.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 x = dict(<array>, <maxlen>)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab x = dict(parse$, <maxlen>)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab where \plain\f1\fs24\cf0 <array>\plain\f0\fs24\cf0 or \plain\f1\fs24\cf0 parse$\plain\f0\fs24\cf0 holds the string to be written into the \plain\f0\fs24\cf0 dictionary, and \plain\f1\fs24\cf0 <maxlen\plain\f0\fs24\cf0 > represents the maximum number of \plain\f0\fs24\cf0 characters to be written. Returns the new dictionary address. (NOTE: \plain\f0\fs24\cf0 Space should be reserved for any dictionary entries to be created at \plain\f0\fs24\cf0 runtime using the \plain\f1\fs24\cf0 $MAXDICTEXTEND\plain\f0\fs24\cf0 setting during compilation.)\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b DO\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Marks the starting point of a \plain\f1\fs24\cf0 do-while\plain\f0\fs24\cf0 loop.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 do\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab while <expr>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab The loop will continue to run as long as \plain\f1\fs24\cf0 <expr>\plain\f0\fs24\cf0 holds true.\tab \par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b ELDER\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 x = elder(<object>)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab RETURN VALUE:\tab The object number of the object preceding \plain\f1\fs24\cf0 <object>\plain\f0\fs24\cf0 on the same \plain\f0\fs24\cf0 branch in the object tree. The reverse of '\plain\f1\fs24\cf0 sibling\plain\f0\fs24\cf0 '.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b ELDEST\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab Same as '\plain\f1\fs24\cf0 child\plain\f0\fs24\cf0 '.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b ELSE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab In an \plain\f1\fs24\cf0 if-elseif-else\plain\f0\fs24\cf0 conditional block, indicates the default \plain\f0\fs24\cf0 operation if no previous condition has been met.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 if <condition>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab else\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b ELSEIF\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab In an \plain\f1\fs24\cf0 if-elseif-else\plain\f0\fs24\cf0 conditional block, indicates a condition \plain\f0\fs24\cf0 that will be checked only if no preceding condition has been met.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 if <condition1>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab elseif <condition2>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab elseif <condition3>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b FALSE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab A predefined constant value: 0.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b FOR\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Loop construction.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 for (<initial>; <test>; <mod>)\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab for <var> in <object>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab For the first form, where \plain\f1\fs24\cf0 <initial>\plain\f0\fs24\cf0 is the initial assignment expression \plain\f0\fs24\cf0 (e.g. \plain\f1\fs24\cf0 a = 1\plain\f0\fs24\cf0 ), \plain\f1\fs24\cf0 <test>\plain\f0\fs24\cf0 is the test expression (e.g. \plain\f1\fs24\cf0 a < 10\plain\f0\fs24\cf0 ), and \plain\f1\fs24\cf0 <mod>\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 is the modifying expression (e.g. \plain\f1\fs24\cf0 a = a + 1\plain\f0\fs24\cf0 ). The loop will execute as \plain\f0\fs24\cf0 long as \plain\f1\fs24\cf0 <test>\plain\f0\fs24\cf0 holds true.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab The second form loops through all the children of \plain\f1\fs24\cf0 <object>\plain\f0\fs24\cf0 (if any), \plain\f0\fs24\cf0 setting \plain\f1\fs24\cf0 <var>\plain\f0\fs24\cf0 to each child object in sequence.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b HELD\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Object specifier in grammar syntax line, indicating that any single \plain\f0\fs24\cf0 object possessed by the player object is valid.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b HEX\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Print statement modifier signifying that the following value is not a \plain\f0\fs24\cf0 dictionary address, but should be printed as a hexadecimal \plain\f0\fs24\cf0 number.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 print hex <var>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab where, for example, \plain\f1\fs24\cf0 <var>\plain\f0\fs24\cf0 is equal to 26, will print "1A".\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b IF\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab A conditional expression.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 if <condition>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab where \plain\f1\fs24\cf0 <condition>\plain\f0\fs24\cf0 is an expression or value, will run the following \plain\f0\fs24\cf0 statement block only if \plain\f1\fs24\cf0 <condition>\plain\f0\fs24\cf0 is true.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b IN\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab When used in an object definition, places the object in the object \plain\f0\fs24\cf0 tree as a possession of the specified parent. When used in an \plain\f0\fs24\cf0 expression, returns true if the object is in the specified parent.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 in <parent>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab or, for example:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \plain\f1\fs24\cf0 if <object> [not] in <parent>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b INPUT\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Receive input from keyboard, storing the dictionary addresses of \plain\f0\fs24\cf0 the individual words in the word array. Unrecognized words are \plain\f0\fs24\cf0 given a value of 0.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 input\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b IS\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Attribute assignment/testing.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 <object> is [not] <attribute>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab USAGE:\tab When used as an assignment on its own, will set (or clear, if '\plain\f1\fs24\cf0 not\plain\f0\fs24\cf0 ' is used) \plain\f0\fs24\cf0 the specified attribute for the given object. May also be used in an \plain\f0\fs24\cf0 expression.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab RETURN VALUE:\tab When used in an expression, returns true if \plain\f1\fs24\cf0 <object>\plain\f0\fs24\cf0 has the \plain\f0\fs24\cf0 specified attribute set (or cleared, if '\plain\f1\fs24\cf0 not\plain\f0\fs24\cf0 ' is used). Otherwise, it \plain\f0\fs24\cf0 returns false.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b JUMP\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Jumps to a specified label.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 jump <label>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab where a unique \plain\f1\fs24\cf0 <label>\plain\f0\fs24\cf0 exists on a separate line somewhere in the \plain\f0\fs24\cf0 program, in the form:\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \plain\f1\fs24\cf0 :<label>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b LOCAL\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Defines one or more variables local to the current routine.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 local <var1>[, <var2>, <var3>,...]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b LOCATE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Sets the cursor position within the current text window.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 locate(<row>, <column>)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab NOTE:\tab The maximum horizontal/vertical cursor position is constrained by the \plain\f0\fs24\cf0 boundaries of the current text window. The cursor position is \plain\f0\fs24\cf0 calculated in fixed-width character coordinates.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b MOVE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Moves an object with all its possessions to a new parent.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 move <object> to <new parent>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b MULTI\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Object specifier in grammar syntax line, indicating that multiple \plain\f0\fs24\cf0 available objects are valid.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b MULTIHELD\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Object specifier in grammar syntax line, indicating that multiple \plain\f0\fs24\cf0 objects possessed by the player object are valid.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b MULTINOTHELD\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Object specifier in grammar syntax line, indicating that multiple \plain\f0\fs24\cf0 objects explicitly not held by the player object are valid.\par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b MUSIC\par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Load and play a song (if audio output is available).\par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 music [repeat] "file", "song"[, vol]\par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab music 0\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab where \plain\f1\fs24\cf0 <file>\plain\f0\fs24\cf0 is a compiled Hugo resourcefile, \plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 <song>\plain\f0\fs24\cf0 is a music module in MOD, S3M, or XM format. The \plain\f0\fs24\cf0 optional \plain\f1\fs24\cf0 <vol>\plain\f0\fs24\cf0 argument, if given, ranges from 0 to 100 and gives a \plain\f0\fs24\cf0 percentage of volume for playback. If the '\plain\f1\fs24\cf0 repeat\plain\f0\fs24\cf0 ' token is used, the \plain\f0\fs24\cf0 song continues to loop until either a new song is played, or the current \plain\f0\fs24\cf0 song is stopped (using "\plain\f1\fs24\cf0 music 0\plain\f0\fs24\cf0 ").\par \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b NEARBY\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Used in an object definition to place the object in the specified \plain\f0\fs24\cf0 position in the object tree.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 nearby <object>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab Gives the current object the same parent as \plain\f1\fs24\cf0 <object>\plain\f0\fs24\cf0 .\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \plain\f1\fs24\cf0 nearby\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab Gives the current object the same parent as the last-defined object.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b NEWLINE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Print statement modifier, indicating that a line feed and carriage \plain\f0\fs24\cf0 return should be issued if the current output position is not \plain\f0\fs24\cf0 already at the start of a blank line.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 print newline\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b NOT\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Logical not.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX: \tab \plain\f1\fs24\cf0 x = not <value>\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab <object> is not <attribute>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab RESULT:\tab In the first example, \plain\f1\fs24\cf0 x\plain\f0\fs24\cf0 will be true if \plain\f1\fs24\cf0 <value>\plain\f0\fs24\cf0 is false, or false if \plain\f1\fs24\cf0 <value>\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 is true.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab In the second, the specified attribute will be cleared for \plain\f1\fs24\cf0 <object>\plain\f0\fs24\cf0 when \plain\f0\fs24\cf0 used alone as an assignment. As part of an expression, it will return \plain\f0\fs24\cf0 true only if \plain\f1\fs24\cf0 <object>\plain\f0\fs24\cf0 does not have \plain\f1\fs24\cf0 <attribute>\plain\f0\fs24\cf0 set.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b NOTHELD\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Object specifier in grammar syntax line, indicating that a single \plain\f0\fs24\cf0 object explicitly not held by the player object is valid.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b NUMBER\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab When used in a grammar syntax line, indicates that a single \plain\f0\fs24\cf0 positive integer number is valid.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab When used as a \plain\f1\fs24\cf0 print\plain\f0\fs24\cf0 statement modifier, indicates that the \plain\f0\fs24\cf0 following value is not a dictionary address, but should be \plain\f0\fs24\cf0 printed as a positive integer number.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab (for usage as a \plain\f1\fs24\cf0 print\plain\f0\fs24\cf0 statement modifier)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \plain\f1\fs24\cf0 print number <val>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab where, for example, \plain\f1\fs24\cf0 <val>\plain\f0\fs24\cf0 is equal to 100, will print "100" instead of the \plain\f0\fs24\cf0 word beginning at the address 100 in the dictionary table.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b OBJECT\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Global variable holding the object number of the direct object, if \plain\f0\fs24\cf0 any, specified in the input line.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab When used in a grammar syntax line, indicates that a single \plain\f0\fs24\cf0 available object is valid.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b OR\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Logical or.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX: \tab \plain\f1\fs24\cf0 x = <value1> or <value2>\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab RESULT:\tab \plain\f1\fs24\cf0 x\plain\f0\fs24\cf0 will be true if either \plain\f1\fs24\cf0 <value1\plain\f0\fs24\cf0 > or \plain\f1\fs24\cf0 <value2>\plain\f0\fs24\cf0 is non-false, or false if both \plain\f0\fs24\cf0 are false.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b PARENT\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab (Usage 1)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab x\plain\f1\fs24\cf0 = parent(<object>)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab RETURN VALUE:\tab The object number of \plain\f1\fs24\cf0 <object>\plain\f0\fs24\cf0 's parent object.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab (Usage 2)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab When used in a grammar syntax line, indicates that the domain for \plain\f0\fs24\cf0 validating the availability of the specified direct object should be \plain\f0\fs24\cf0 set to the parent object specified in the input line.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b PARSE$\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Read-only engine variable that contains either the offending \plain\f0\fs24\cf0 portion of an invalid input line or any section of the input line \plain\f0\fs24\cf0 enclosed in quotes.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b PAUSE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Pauses until a key is pressed. The ASCII value of the key is stored \plain\f0\fs24\cf0 in \plain\f1\fs24\cf0 word[0]\plain\f0\fs24\cf0 .\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b PICTURE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Load and display a picture in the current text window (if graphics \plain\f0\fs24\cf0 are available).\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 picture "<resourcefile>", "<picture>"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab picture "<picturefile>"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab where, while \plain\f1\fs24\cf0 <resourcefile>\plain\f0\fs24\cf0 is optional, it is very highly \plain\f0\fs24\cf0 recommended (otherwise, \plain\f1\fs24\cf0 <picturefile>\plain\f0\fs24\cf0 will likely not be named in \plain\f0\fs24\cf0 a cross-platform portable format).\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b PLAYBACK\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Plays back recorded commands from a file in place of keyboard \plain\f0\fs24\cf0 input.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 x = playback\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab RETURN VALUE:\tab True if successful, false if not.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b PRINT\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Print text output.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 print <output>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab where \plain\f1\fs24\cf0 <output>\plain\f0\fs24\cf0 can consist of both test strings enclosed in quotation \plain\f0\fs24\cf0 marks ("..."), and values representing dictionary addresses, such as \plain\f0\fs24\cf0 object names. Separate components of \plain\f1\fs24\cf0 <output>\plain\f0\fs24\cf0 are separated by a \plain\f0\fs24\cf0 semicolon ('\plain\f1\fs24\cf0 ;\plain\f0\fs24\cf0 '). Each component may also be preceded by a modifier \plain\f0\fs24\cf0 such as '\plain\f1\fs24\cf0 capital\plain\f0\fs24\cf0 ', '\plain\f1\fs24\cf0 hex\plain\f0\fs24\cf0 ', or '\plain\f1\fs24\cf0 number\plain\f0\fs24\cf0 '.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b PRINTCHAR\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Prints a character or series of characters at the current cursor \plain\f0\fs24\cf0 position. No newline is printed.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 printchar <val1>[, <val2>,...]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b QUIT\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Terminates the game loop.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 quit\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b RANDOM\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Engine function which generates a random number.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 x = random(<val>)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab RETURN VALUE:\tab Where \plain\f1\fs24\cf0 <val>\plain\f0\fs24\cf0 is a positive integer number, will return a random \plain\f0\fs24\cf0 number between 1 and \plain\f1\fs24\cf0 <val>\plain\f0\fs24\cf0 , inclusively.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b READFILE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab A structure that allows values to be read from a file written using \plain\f1\fs24\cf0 writefile\plain\f0\fs24\cf0 .\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 readfile <filename>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab The file is opened and positioned to the start at the beginning of the \plain\f1\fs24\cf0 readfile\plain\f0\fs24\cf0 block, and closed at the end.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b READVAL\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Reads a value in a \plain\f1\fs24\cf0 readfile\plain\f0\fs24\cf0 block.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 x = readval\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab VALUE:\tab The value read, or 0 in the case of an error. Use the \plain\f1\fs24\cf0 FILE_CHECK\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 constant defined in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 to determine if a \plain\f1\fs24\cf0 readfile\plain\f0\fs24\cf0 block has \plain\f0\fs24\cf0 been executed successfully. See the section above on \plain\f0\fs24\cf0\i "Reading and \plain\f0\fs24\cf0\i Writing Files"\plain\f0\fs24\cf0 .\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b RECORDOFF\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Ends recording commands to a file.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 x = recordoff\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab VALUE: True if successful, false if not.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b RECORDON\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Begins recording commands to a file.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 x = recordon\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab VALUE:\tab True if successful, false if not.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b REMOVE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Removes an object from the object tree.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab r\plain\f1\fs24\cf0 emove <object>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab (The same as: \plain\f1\fs24\cf0 move <object> to 0\plain\f0\fs24\cf0 )\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b RESTART\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Reloads the initial game data and calls the \plain\f1\fs24\cf0 Init\plain\f0\fs24\cf0 routine.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 x = restart\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab NOTE:\tab '\plain\f1\fs24\cf0 Restart\plain\f0\fs24\cf0 ' does not technically restart the engine; the game loop continues \plain\f0\fs24\cf0 uninterrupted after \plain\f1\fs24\cf0 Init\plain\f0\fs24\cf0 is called, only with the game data restored to \plain\f0\fs24\cf0 its initial state.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab VALUE:\tab True if successful, false if not.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b RESTORE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Restores a saved game's state data by calling the engine's restore \plain\f0\fs24\cf0 routine.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 x = restore\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab VALUE:\tab True if successful, false if not.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b RETURN\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Returns from a called routine.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 return [<expression>]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab RETURN VALUE:\tab Returns \plain\f1\fs24\cf0 <expression>\plain\f0\fs24\cf0 if provided, otherwise returns false.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b RUN\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Runs an object property routine if one exists.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 run <object>.<property>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab RETURN VALUE:\tab None; any value returned by the property routine is discarded.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b RUNEVENTS\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Calls all events which are either global or currently within the \plain\f0\fs24\cf0 event scope of the player object.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 runevents\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b SAVE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Saves the current game state by calling the engine's save routine.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 x = save\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab VALUE:\tab True if successful, false if not.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b SCRIPTOFF\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Turns transcription off.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 x = scriptoff\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab VALUE:\tab True if successful, false if not.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b SCRIPTON\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Turns transcription (i.e., recording output to a file or to a printer) \plain\f0\fs24\cf0 on by calling the engine's transcription routine.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 x = scripton\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab VALUE:\tab True if successful, false if not.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b SELECT\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Specifies the value for comparison in a \plain\f1\fs24\cf0 select-case\plain\f0\fs24\cf0 conditional \plain\f0\fs24\cf0 structure.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 select <val>\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab case <case1>[, <case2>,...]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab case <case3>[, <case4>,...]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab where \plain\f1\fs24\cf0 <val>\plain\f0\fs24\cf0 is value such as a variable, routine return value, object \plain\f0\fs24\cf0 property, array element, etc., and each \plain\f1\fs24\cf0 <case>\plain\f0\fs24\cf0 is a single value for \plain\f0\fs24\cf0 comparison (not an expression).\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b SERIAL$\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Read-only engine variable that contains the serial number as \plain\f0\fs24\cf0 written by the compiler.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b SIBLING\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 x = sibling(<object>)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab RETURN VALUE:\tab The number of the object next to \plain\f1\fs24\cf0 <object>\plain\f0\fs24\cf0 on the same branch of \plain\f0\fs24\cf0 the object tree.\par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b SOUND\par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Load and and play an audio sample (if waveform audio output is \plain\f0\fs24\cf0 available).\par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab sound\plain\f1\fs24\cf0 [repeat] "file", "sample"[, vol]\par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab sound 0\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab where \plain\f1\fs24\cf0 <file>\plain\f0\fs24\cf0 is a compiled Hugo resourcefile, \plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 <sample>\plain\f0\fs24\cf0 is a waveform sample in RIFF/WAV format. The \plain\f0\fs24\cf0 optional \plain\f1\fs24\cf0 <vol>\plain\f0\fs24\cf0 argument, if given, ranges from 0 to 100 and gives a \plain\f0\fs24\cf0 percentage of volume for playback. If the '\plain\f1\fs24\cf0 repeat\plain\f0\fs24\cf0 ' token is used, the \plain\f0\fs24\cf0 sample continues to loop until either a new sample is played, or the \plain\f0\fs24\cf0 current sample is stopped (using "\plain\f1\fs24\cf0 sound 0\plain\f0\fs24\cf0 ").\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b STRING\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab When used in a grammar syntax line, indicates that a string array \plain\f0\fs24\cf0 enclosed in quotation marks is valid.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab When used as a function, stores a dictionary entry in a string array.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 x = string(<array>, <dict>, <maxlen>)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab x = string(<array>, parse$, <maxlen>)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab where \plain\f1\fs24\cf0 <array>\plain\f0\fs24\cf0 is an array address, stores the either the dictionary entry \plain\f0\fs24\cf0 given by <\plain\f1\fs24\cf0 dict>\plain\f0\fs24\cf0 or the contents of \plain\f1\fs24\cf0 parse$\plain\f0\fs24\cf0 as a series of characters, to \plain\f0\fs24\cf0 a maximum of \plain\f1\fs24\cf0 <maxlen\plain\f0\fs24\cf0 > characters. Returns the length of the string \plain\f0\fs24\cf0 stored in \plain\f1\fs24\cf0 <array>\plain\f0\fs24\cf0 .\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b SYSTEM\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Built-in function to call low-level system \plain\f0\fs24\cf0 functions.\par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \tab \plain\f1\fs24\cf0 system(<function>)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f0\fs24\cf0\ul Function\tab Label\tab \tab \tab Description\tab \tab \tab \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 11\tab \tab READ_KEY\tab \tab Read keypress (key value)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 21\tab \tab NORMALIZE_RANDOM\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab \tab \tab Make random values predictable\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 22\tab \tab INIT_RANDOM\tab Restore "random" random values\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 31\tab \tab PAUSE_SECOND\tab Pause for one second\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab 32\tab \tab PAUSE_100TH_SECOND\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab \tab \tab Pause for 1/100th of a second\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab (Labels are defined as a constants in \plain\f1\fs24\cf0 SYSTEM.H\plain\f0\fs24\cf0 .)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li1440\fi-1440\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab If \plain\f1\fs24\cf0 <function>\plain\f0\fs24\cf0 is unavailable, the engine may set \plain\f1\fs24\cf0 system_status\plain\f0\fs24\cf0 to -1 \plain\f0\fs24\cf0 (STAT_UNAVAILABLE).\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v SYSTEM\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \plain\par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab DESCRIPTION:\tab Allows changes to certain engine settings. Settings are not changed by RESTART.\plain\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab SYNTAX: system <val>\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab PARAMETERS:\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab <val>\tab Operation\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 1\tab \tab Code tracing on\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 2\tab \tab " " off\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 3\tab \tab Expression tracing on\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 4\tab \tab " " off\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 5\tab \tab Attribute setting monitor on\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 6\tab \tab " " " off\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 7\tab \tab Attribute testing monitor on\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 8\tab \tab " " " off\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 9\tab \tab Property setting monitor on\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 10\tab \tab " " " off\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 11\tab \tab Property testing monitor on\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 12\tab \tab " " " off\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 13\tab \tab Variable setting monitor on\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 14\tab \tab " " " off\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 15\tab \tab Array setting monitor on\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 16\tab \tab " " " off\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 17\tab \tab Event monitor on\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 18\tab \tab " " off\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 19\tab \tab Object movement monitor on\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 20\tab \tab " " " off\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 21\tab \tab Limited code tracing on\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \tab \tab \tab 22\tab \tab " " " off\plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\v \plain\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b TEXT\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f1\fs24\cf0 text to <val>\plain\f0\fs24\cf0 \tab Sends text to the array table, beginning at address \plain\f1\fs24\cf0 <val>\plain\f0\fs24\cf0 .\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f1\fs24\cf0 text to 0\plain\f0\fs24\cf0 \tab \tab Restores normal printing.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b TO\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab In a \plain\f1\fs24\cf0 print\plain\f0\fs24\cf0 statement, prints blank spaces in the current \plain\f0\fs24\cf0 background color to the specified position.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 print to <val>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab where \plain\f1\fs24\cf0 <val>\plain\f0\fs24\cf0 is a positive integer less than or equal to the maximum \plain\f0\fs24\cf0 column position\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b TRUE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Predefined constant: 1.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b UNDO\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Attempts to recover the state of the game data before the last player \plain\f0\fs24\cf0 command.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 x = undo\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab VALUE:\tab True if successful, false if not.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b VERB\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Begins definition of a regular verb. Upon returning true from the \plain\f0\fs24\cf0 verb routine, \plain\f1\fs24\cf0 Main\plain\f0\fs24\cf0 is called.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 verb "<word1>"[, "<word2>",...]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b WHILE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Component of \plain\f1\fs24\cf0 while\plain\f0\fs24\cf0 or \plain\f1\fs24\cf0 do-while\plain\f0\fs24\cf0 loop construct.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 while <expr>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab (or)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \plain\f1\fs24\cf0 do\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab while <expr>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab where the loop will run as long as \plain\f1\fs24\cf0 <expr>\plain\f0\fs24\cf0 holds true.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b WINDOW\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Switches output to the status window.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 window a[, b, c, d]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \{...\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab or\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \plain\f1\fs24\cf0 window\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \{...\}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab or\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \plain\f1\fs24\cf0 window 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab If only a single value \plain\f1\fs24\cf0 <a>\plain\f0\fs24\cf0 is given, a window of \plain\f1\fs24\cf0 <a>\plain\f0\fs24\cf0 lines from the top of \plain\f0\fs24\cf0 the screen is created. If more values are given, a window from top-left \plain\f0\fs24\cf0 (\plain\f1\fs24\cf0 a\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 b\plain\f0\fs24\cf0 ) to bottom-right (\plain\f1\fs24\cf0 c\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 d\plain\f0\fs24\cf0 ) is created. If no values are given, the \plain\f0\fs24\cf0 last-defined window is recreated. The new boundaries apply for the \plain\f0\fs24\cf0 length of the following "\plain\f1\fs24\cf0 \{...\}\plain\f0\fs24\cf0 " code block.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab "\plain\f1\fs24\cf0 window 0\plain\f0\fs24\cf0 " restores full-screen display. There is no following code \plain\f0\fs24\cf0 block.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b WRITEFILE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab A structure that writes values to a file that may be read using \plain\f1\fs24\cf0 readfile\plain\f0\fs24\cf0 .\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 writefile <filename>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \{\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \}\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab The file is opened and positioned to the start at the beginning of the \plain\f1\fs24\cf0 writefile\plain\f0\fs24\cf0 block, and closed at the end.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b WRITEVAL\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION: \tab Writes one or more values in a \plain\f1\fs24\cf0 writefile\plain\f0\fs24\cf0 block.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 writefile value1[, value2, ...]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b XOBJECT\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Global variable holding the object number of the indirect object, if \plain\f0\fs24\cf0 any, specified in the input line.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab When used in a grammar syntax line, indicates that a single \plain\f0\fs24\cf0 available object is valid.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b XVERB\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab DESCRIPTION:\tab Begins definition of non-action verb. Upon returning from the verb \plain\f0\fs24\cf0 routine, \plain\f1\fs24\cf0 Main\plain\f0\fs24\cf0 is not called.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 xverb "<word1>"[,"<word2>",...]\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b YOUNGER\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab Same as '\plain\f1\fs24\cf0 sibling\plain\f0\fs24\cf0 '.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0\b YOUNGEST\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab SYNTAX:\tab \plain\f1\fs24\cf0 x = youngest(<parent>)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab RETURN VALUE:\tab The number of the object most recently added to parent \plain\f1\fs24\cf0 <parent>\plain\f0\fs24\cf0 .\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } <end node> 5P9i0s8y19Z id=70 nft=02;80000008;000A;00;Times New Roman dt=RTF <node> APPENDIX B: THE LIBRARY (HUGOLIB.H) 1 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset2 symbol;}{\f2\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0\b APPENDIX B: THE LIBRARY (HUGOLIB.H)}} } <end node> 5P9i0s8y19Z id=71 dt=RTF <node> ATTRIBUTES 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 ATTRIBUTES\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 known\plain\f0\fs24\cf0 \tab \tab if an object is known to the player\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 moved\plain\f0\fs24\cf0 \tab \tab if an object has been moved\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 visited\plain\f0\fs24\cf0 \tab if a room has been visited\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 static\plain\f0\fs24\cf0 \tab if an object cannot be taken\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 plural\plain\f0\fs24\cf0 \tab for plural objects (i.e., some hats)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 living\plain\f0\fs24\cf0 \tab if an object is a character\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 female\plain\f0\fs24\cf0 \tab if a character is female\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 unfriendly\plain\f0\fs24\cf0 \tab if a character is unfriendly\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 openable\plain\f0\fs24\cf0 \tab if an object can be opened\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 open\plain\f0\fs24\cf0 \tab \tab if it is open\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 lockable\plain\f0\fs24\cf0 \tab if an object can be locked\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 locked\plain\f0\fs24\cf0 \tab if it is locked\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 light\plain\f0\fs24\cf0 \tab \tab if an object is or provides light\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 readable\plain\f0\fs24\cf0 \tab if an object can be read\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 switchable\plain\f0\fs24\cf0 \tab if an object can be turned on or off\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 switchedon\plain\f0\fs24\cf0 \tab if it is on\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 clothing\plain\f0\fs24\cf0 \tab for objects that can be worn\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 worn\plain\f0\fs24\cf0 \tab \tab if the object is being worn\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 mobile\plain\f0\fs24\cf0 \tab if the object can be rolled, etc.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 enterable\plain\f0\fs24\cf0 \tab if an object is enterable\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 container\plain\f0\fs24\cf0 \tab if an object can hold other objects\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 platform\plain\f0\fs24\cf0 \tab if other objects can be placed on it\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \plain\f0\fs24\cf0\i (NOTE: \plain\f1\fs24\cf0 container\plain\f0\fs24\cf0\i and \plain\f1\fs24\cf0 platform\plain\f0\fs24\cf0\i are\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \tab \tab \tab mutually exclusive)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 hidden\plain\f0\fs24\cf0 \tab if an object is not to be listed\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 quiet\plain\f0\fs24\cf0 \tab \tab if container or platform is quiet (i.e., the\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab initial listing of contents is suppressed)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 transparent\plain\f0\fs24\cf0 \tab if object is not opaque\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 already_listed\plain\f0\fs24\cf0 \tab if object has been pre-listed (i.e., before,\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab for example, a \plain\f1\fs24\cf0 WhatsIn\plain\f0\fs24\cf0 listing)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 workflag\plain\f0\fs24\cf0 \tab for system use\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 special\plain\f0\fs24\cf0 \tab for miscellaneous use\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } <end node> 5P9i0s8y19Z id=72 dt=RTF <node> GLOBALS, CONSTANTS, AND ARRAYS 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 GLOBALS, CONSTANTS, AND ARRAYS\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\b GLOBALS:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i The first 10 globals are pre-defined by the compiler:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab o\plain\f1\fs24\cf0 bject\plain\f0\fs24\cf0 \tab \tab direct object of a verb action\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 xobject\plain\f0\fs24\cf0 \tab \tab indirect object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 self\plain\f0\fs24\cf0 \tab \tab \tab self-referential object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 words\plain\f0\fs24\cf0 \tab \tab \tab total number of words\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 player\plain\f0\fs24\cf0 \tab \tab the player object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 actor\plain\f0\fs24\cf0 \tab \tab \tab player, or another char. (for scripts)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 location\plain\f0\fs24\cf0 \tab \tab location of the player object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 verbroutine\plain\f0\fs24\cf0 \tab \tab the verb routine\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 endflag\plain\f0\fs24\cf0 \tab \tab if not false (0), run \plain\f1\fs24\cf0 EndGame\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 prompt\plain\f0\fs24\cf0 \tab \tab for input line\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 objects\plain\f0\fs24\cf0 \tab \tab the total number of objects\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 player_person\plain\f0\fs24\cf0 \tab first (1), second (2), or third (3)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MAX_SCORE\plain\f0\fs24\cf0 \tab \tab total possible score\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MAX_RANK\tab \plain\f0\fs24\cf0 \tab up to \plain\f1\fs24\cf0 x\plain\f0\fs24\cf0 levels of player ranking\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 FORMAT\plain\f0\fs24\cf0 \tab \tab specifies text-printing format\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 DEFAULT_FONT\plain\f0\fs24\cf0 \tab initially 0; could be, for example, \plain\f1\fs24\cf0 PROP_ON\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 STATUSTYPE\tab \plain\f0\fs24\cf0 \tab 0=none, 1=score/turns, 2=time\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 TEXTCOLOR\plain\f0\fs24\cf0 \tab \tab normal text color\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 BGCOLOR\plain\f0\fs24\cf0 \tab \tab normal background color\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 BOLDCOLOR\plain\f0\fs24\cf0 \tab \tab color for boldface printing\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 SL_TEXTCOLOR\plain\f0\fs24\cf0 \tab statusline text color\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 SL_BGCOLOR\tab \plain\f0\fs24\cf0 \tab statusline background color\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 INDENT_SIZE\plain\f0\fs24\cf0 \tab \tab for paragraph indenting\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 AFTER_PERIOD\plain\f0\fs24\cf0 \tab string of spaces following a full-stop\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 counter\plain\f0\fs24\cf0 \tab \tab elapsed turns (or time, as desired)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 score\plain\f0\fs24\cf0 \tab \tab \tab accumulated score\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 verbosity\plain\f0\fs24\cf0 \tab \tab for room descriptions\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 list_nest\plain\f0\fs24\cf0 \tab \tab used by \plain\f1\fs24\cf0 ListObjects\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 light_source\plain\f0\fs24\cf0 \tab in location\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 event_flag\plain\f0\fs24\cf0 \tab \tab set when something happens\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 speaking\plain\f0\fs24\cf0 \tab \tab if the player is talking to a char.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab o\plain\f1\fs24\cf0 ld_location\plain\f0\fs24\cf0 \tab whenever location changes\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 last_object\plain\f0\fs24\cf0 \tab \tab set by \plain\f1\fs24\cf0 Perform\plain\f0\fs24\cf0 to value of \plain\f1\fs24\cf0 object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 obstacle\plain\f0\fs24\cf0 \tab \tab if something is stopping the player\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 best_parse_rank\tab \plain\f0\fs24\cf0 for differentiating like-named objects\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 customerror_flag\tab t\plain\f0\fs24\cf0 rue once \plain\f1\fs24\cf0 CustomError\plain\f0\fs24\cf0 is called\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 need_newline\tab \plain\f0\fs24\cf0 true when newline should be printed\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 override_indent\tab \plain\f0\fs24\cf0 true if no indent should be printed\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 number_scripts\tab \plain\f0\fs24\cf0 number of active character scripts\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 it_obj\tab \tab \plain\f0\fs24\cf0 to reference objects via pronouns\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 them_obj\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 him_obj\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 her_obj\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 general\plain\f0\fs24\cf0 \tab \tab for general use\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\b ARRAYS:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 replace_pronoun[4]\plain\f0\fs24\cf0 \tab for it_obj, him_obj, etc.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 oldword[MAX_WORDS]\plain\f0\fs24\cf0 \tab for "again" command\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 scriptdata[48]\plain\f0\fs24\cf0 \tab \tab for object scripts\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 array setscript[1024]\plain\f0\fs24\cf0 \tab the actual scripts\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 array ranking[10]\plain\f0\fs24\cf0 \tab \tab in tandem with scoring\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\b CONSTANTS:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 BANNER\plain\f0\fs24\cf0 \tab \tab \tab should be printed in every game header\tab \par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MAX_SCRIPTS\plain\f0\fs24\cf0 \tab \tab that may be active at one time\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MAX_WORDS\plain\f0\fs24\cf0 \tab \tab in a parsed input line\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f0\fs24\cf0\i Color constants:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab BLACK\tab \tab DARK GRAY\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab BLUE\tab \tab LIGHT_BLUE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab GREEN\tab \tab LIGHT_GREEN\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab CYAN\tab \tab LIGHT_CYAN\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab RED\tab \tab LIGHT_RED\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab MAGENTA\tab LIGHT_MAGENTA\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab BROWN\tab \tab YELLOW\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab WHITE\tab \tab BRIGHT_WHITE\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab DEF_FOREGROUND\tab \tab DEF_BACKGROUND\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab DEF_SL_FOREGROUND\tab \tab DEF_SL_BACKGROUND\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab MATCH_FOREGROUND\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f0\fs24\cf0\i Printing format masks (for setting \plain\f1\fs24\cf0 FORMAT\plain\f0\fs24\cf0\i global):\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 LIST_F\plain\f0\fs24\cf0 \tab \tab print itemized lists, not sentences\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 NORECURSE_F\plain\f0\fs24\cf0 \tab \tab do not recurse object contents\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 NOINDENT_F\plain\f0\fs24\cf0 \tab \tab do not indent listings\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 DESCFORM_F\plain\f0\fs24\cf0 \tab \tab alternate room description formatting\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 GROUPPLURALS_F\plain\f0\fs24\cf0 \tab list plurals together where possible\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f0\fs24\cf0\i Font style masks (for use with the \plain\f1\fs24\cf0 Font\plain\f0\fs24\cf0\i routine):\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 BOLD_ON\tab \tab BOLD_OFF\plain\f0\fs24\cf0 \tab \tab boldface\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ITALIC_ON\tab \tab ITALIC_OFF\tab \plain\f0\fs24\cf0 \tab italics\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 UNDERLINE_ON\tab UNDERLINE_OFF\plain\f0\fs24\cf0 \tab underline\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 PROP_ON\tab \tab PROP_OFF\plain\f0\fs24\cf0 \tab \tab proportional printing\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f0\fs24\cf0\i Additional constants:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 UP_ARROW\tab \tab LEFT_ARROW\plain\f0\fs24\cf0 \tab \tab for reading keystrokes\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 DOWN_ARROW\tab \tab ENTER_KEY\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab RIGHT_ARROW\tab \tab ESCAPE_KEY\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab MOUSE_CLICK\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 AND_WORD\plain\f0\fs24\cf0 \tab ("and")\tab \plain\f1\fs24\cf0 IN_WORD\plain\f0\fs24\cf0 \tab ("in")\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ARE_WORD\plain\f0\fs24\cf0 \tab ("are")\tab \plain\f1\fs24\cf0 IS_WORD\plain\f0\fs24\cf0 \tab ("is")\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 HERE_WORD\plain\f0\fs24\cf0 \tab ("here")\tab \plain\f1\fs24\cf0 ON_WORD\plain\f0\fs24\cf0 \tab ("on")\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 FILE_CHECK\plain\f0\fs24\cf0 \tab \tab for verifying \plain\f1\fs24\cf0 writefile\plain\f0\fs24\cf0 /\plain\f1\fs24\cf0 readfile\plain\f0\fs24\cf0 operations\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (\plain\f0\fs24\cf0\i The following are used only by specific routines:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\b ARRAYS:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 _temp_array[256]\plain\f0\fs24\cf0 \tab used by string manipulation functions\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 menuitem[11]\plain\f0\fs24\cf0 \tab required by the \plain\f1\fs24\cf0 Menu\plain\f0\fs24\cf0 function\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\b GLOBALS:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MENU_TEXTCOLOR\plain\f0\fs24\cf0 \tab \tab normal menu text color\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MENU_BGCOLOR\plain\f0\fs24\cf0 \tab \tab normal menu background color\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MENU_SELECTCOLOR\plain\f0\fs24\cf0 \tab \tab menu highlight color\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MENU_SELECTBGCOLOR\plain\f0\fs24\cf0 \tab menu highlight background color\plain\f0\fs24\cf0\i )\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } <end node> 5P9i0s8y19Z id=73 dt=RTF <node> PROPERTIES 2 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0 PROPERTIES\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i The first 6 properties are pre-defined by the compiler:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 name\plain\f0\fs24\cf0 \tab \tab \tab basic object name\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 before\plain\f0\fs24\cf0 \tab pre-verb routines\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 after\plain\f0\fs24\cf0 \tab post-verb routines\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 noun (nouns)\plain\f0\fs24\cf0 \tab noun(s) for referring to object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 adjective (adjectives)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab adjective(s) describing object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 article\plain\f0\fs24\cf0 \tab \tab "a", "an", "the", "some", etc.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li4320\fi-4320\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 preposition (prep)\par \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab "in", "inside", "outside of", etc., used generally for room objects in order \plain\f0\fs24\cf0 to give a grammatically correct description if necessary; also for \plain\f0\fs24\cf0 containers and platforms\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 pronoun\plain\f0\fs24\cf0 \tab \tab "he", "him", "his" or equivalent, so that an object is properly referred to\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li4320\fi-4320\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 short_desc\plain\f0\fs24\cf0 routine; basic "X is here" description\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 initial_desc\tab \plain\f0\fs24\cf0 routine; same as above, but if object has not been moved and an \plain\f1\fs24\cf0 initial_desc\plain\f0\fs24\cf0 exists, it is called in place of \plain\f1\fs24\cf0 short_desc\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 long_desc\plain\f0\fs24\cf0 \tab routine; detailed description\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 found_in\plain\f0\fs24\cf0 \tab \tab in case of multiple virtual (not "physical") parents, \plain\f1\fs24\cf0 found_in\plain\f0\fs24\cf0 may hold \plain\f0\fs24\cf0 one or more object numbers; in this case, an "\plain\f1\fs24\cf0 in <object>\plain\f0\fs24\cf0 " specifier \plain\f0\fs24\cf0 should not be included in the object definition, since \plain\f1\fs24\cf0 found_in\plain\f0\fs24\cf0 values \plain\f0\fs24\cf0 are unrelated to "object in parent" relationships\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 type\plain\f0\fs24\cf0 \tab \tab \tab to identify the type of object, used primarily by class definitions in \plain\f1\fs24\cf0 OBJLIB.H\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 size\plain\f0\fs24\cf0 \tab \tab \tab for holding/inventory purposes, contains a value representing the size \plain\f0\fs24\cf0 of an individual object\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 capacity\plain\f0\fs24\cf0 \tab \tab contains a value representing the capacity of a \plain\f1\fs24\cf0 container\plain\f0\fs24\cf0 or \plain\f1\fs24\cf0 platform\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 holding\plain\f0\fs24\cf0 \tab contains a value representing the current encumbrance of a \plain\f1\fs24\cf0 container\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 or \plain\f1\fs24\cf0 platform\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 reach\plain\f0\fs24\cf0 \tab \tab for enterable objects such as chairs, vehicles, etc., if the accessibility of \plain\f0\fs24\cf0 objects outside the object in question is limited, reach contains a list of \plain\f0\fs24\cf0 the objects which may be accessed; if access is limited to the object in \plain\f0\fs24\cf0 question only, reach must still contain at least one non-false value (i.e., \plain\f0\fs24\cf0 the parent object itself)\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 list_contents\plain\f0\fs24\cf0 \tab a routine that overrides the normal contents listing for a room or object; \plain\f0\fs24\cf0 normal listing is only carried out if it returns false\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 in_scope\plain\f0\fs24\cf0 \tab \tab contains a list of actors or objects to which the object is accessible \plain\f0\fs24\cf0 beyond the use of the object tree or the found_in property; generally \plain\f0\fs24\cf0 contains either the player object (or, less commonly, another character) \plain\f0\fs24\cf0 and is set or cleared using \plain\f1\fs24\cf0 PutInScope\plain\f0\fs24\cf0 or \plain\f1\fs24\cf0 RemoveFromScope\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 parse_rank\tab \plain\f0\fs24\cf0 when there is ambiguity between similarly named objects, the parser \plain\f0\fs24\cf0 will choose the one with a higher \plain\f1\fs24\cf0 parse_rank\plain\f0\fs24\cf0 over one with a lower \plain\f0\fs24\cf0 (or non-existant) value-used when \plain\f1\fs24\cf0 FindObject(<obj>, 0)\plain\f0\fs24\cf0 is called\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li4320\fi-4320\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 exclude_from_all\par \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \plain\f0\fs24\cf0 \tab \tab returns true if the object should be excluded from actions such as "get \plain\f0\fs24\cf0 all"\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 misc\plain\f0\fs24\cf0 \tab \tab miscellaneous use\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i For room objects only:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 n_to\tab \tab \plain\f0\fs24\cf0 \tab \tab If a player can move to another\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ne_to\plain\f0\fs24\cf0 \tab \tab \tab \tab room object in direction X, then\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 e_to\plain\f0\fs24\cf0 \tab \tab \tab \tab \plain\f1\fs24\cf0 x_to \plain\f0\fs24\cf0 holds the new room object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 se_to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab s_to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab sw_to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab w_to \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab nw_to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab u_to \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab d_to \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab in_to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab out_to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab cant_go\tab \tab \tab routine; message instead of default "You can't go that way."\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i For non-room objects only:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 door_to\plain\f0\fs24\cf0 \tab \tab \tab for handling "Enter <object>", holds the object number of the \plain\f0\fs24\cf0 object to which an object enters (where the latter behaves as a \plain\f0\fs24\cf0 door or portal)\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 key_object\plain\f0\fs24\cf0 \tab \tab if \plain\f1\fs24\cf0 lockable\plain\f0\fs24\cf0 , contains the object number of the key\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab when_open\plain\f0\fs24\cf0 \tab \tab routines; short descriptions for \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li4320\fi-4320\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 when_closed\plain\f0\fs24\cf0 \tab \tab \plain\f1\fs24\cf0 openable\plain\f0\fs24\cf0 objects\par \qj\li4320\fi-4320\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab \tab \par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab If they exist, the appropriate \plain\f1\fs24\cf0 when_open\plain\f0\fs24\cf0 or \plain\f1\fs24\cf0 when_closed\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 routine is called instead of \plain\f1\fs24\cf0 short_desc\plain\f0\fs24\cf0 (if an \plain\f1\fs24\cf0 initial_desc\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 does not exist, or if the object has been moved)\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ignore_response\plain\f0\fs24\cf0 \tab for characters, a routine that runs if the character ignores a \plain\f0\fs24\cf0 player's question, request, etc., instead of the default "X ignores \plain\f0\fs24\cf0 you."\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 order_response\plain\f0\fs24\cf0 \tab \tab also for characters, a routine that processes an imperative \plain\f0\fs24\cf0 command addressed to the character by the player; it should \plain\f0\fs24\cf0 return false if no response is provided\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 contains_desc\plain\f0\fs24\cf0 \tab \tab a routine that prints the introduction to a list of child objects, \plain\f0\fs24\cf0 instead of the default "Inside <object> are..." or "<character> \plain\f0\fs24\cf0 has..."; \plain\f1\fs24\cf0 contains_desc\plain\f0\fs24\cf0 should always conclude with a \plain\f0\fs24\cf0 semicolon ('\plain\f1\fs24\cf0 ;\plain\f0\fs24\cf0 ') instead of a new line\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 inv_desc\plain\f0\fs24\cf0 \tab \tab \tab a routine that prints a special description when the object is listed \plain\f0\fs24\cf0 as part of the player's inventory; \plain\f1\fs24\cf0 inv_desc \plain\f0\fs24\cf0 should conclude \plain\f0\fs24\cf0 with a semicolon ('\plain\f1\fs24\cf0 ;\plain\f0\fs24\cf0 ')\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880\tx3600 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 desc_detai\plain\f0\fs24\cf0 l\tab \tab a routine that prints a parenthetical detail following an object \plain\f0\fs24\cf0 listing, such as: " (which is open)"; the leading space is expected, \plain\f0\fs24\cf0 as are the parentheses, and the print statement should conclude \plain\f0\fs24\cf0 with a semicolon ('\plain\f1\fs24\cf0 ;\plain\f0\fs24\cf0 ')\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: It is recommended for property routines that print a description-such as \plain\f1\fs24\cf0 short_desc\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 initial_desc\plain\f0\fs24\cf0 , etc.-that the routine not simply return true without printing anything as a means \plain\f0\fs24\cf0 of "hiding" the object; such a method may throw text formatting into disarray. The proper means of \plain\f0\fs24\cf0 omitting an object from a list is to set the \plain\f1\fs24\cf0 hidden\plain\f0\fs24\cf0 attribute.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 For the display object only:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f0\fs24\cf0\i Read-only:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 screenwidth\plain\f0\fs24\cf0 \tab \tab width of the display, in characters\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 screenheight\plain\f0\fs24\cf0 \tab height of the display, in characters\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 linelength\plain\f0\fs24\cf0 \tab \tab width of the current text window\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 windowlines\plain\f0\fs24\cf0 \tab \tab height of the current text window\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 cursor_column\plain\f0\fs24\cf0 \tab horizontal and vertical position of\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 cursor_row\plain\f0\fs24\cf0 \tab \tab the cursor in the current text window\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 hasgraphics\plain\f0\fs24\cf0 \tab \tab true if the current display is graphics-\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab capable\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \tab Read/writable:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 title_caption\plain\f0\fs24\cf0 \tab dictionary entry giving the full proper\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab name of the program (optional)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f0\fs24\cf0\i Defined in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0\i :\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 statusline_height\plain\f0\fs24\cf0 \tab of the last-printed status line\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (While \plain\f1\fs24\cf0 screenwidth\plain\f0\fs24\cf0 through \plain\f1\fs24\cf0 title_caption\plain\f0\fs24\cf0 are technically defined by \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 as \plain\f0\fs24\cf0 constants, they are used as property numbers to reference data on the display object.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } <end node> 5P9i0s8y19Z id=74 dt=Text <node> ROUTINES 2 <end node> 5P9i0s8y19Z id=79 dt=RTF <node> Verb Routines 3 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard{\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\b VERB ROUTINES:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 VERBLIB.H\plain\f0\fs24\cf0 (included by \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 ) contains a fairly extensive set of basic actions, each of \plain\f0\fs24\cf0 which takes the form \plain\f1\fs24\cf0 Do<verb>\plain\f0\fs24\cf0 , so that the action for taking an object is \plain\f1\fs24\cf0 DoGet\plain\f0\fs24\cf0 , the action for \plain\f0\fs24\cf0 basic player movement is \plain\f1\fs24\cf0 DoGo\plain\f0\fs24\cf0 , etc.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Each is called by the engine when a grammar syntax line specifying the particular verb routine is \plain\f0\fs24\cf0 matched. Globals \plain\f1\fs24\cf0 object\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 xobject\plain\f0\fs24\cf0 are set up by the engine, and the routine is called with \plain\f0\fs24\cf0 no parameters.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Here is a list of the provided verb routines for action verbs:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \ql\li720\fi-720\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 DoAsk, DoAskQuestion, DoClose, DoDrop, DoEat, DoEnter, DoExit, \plain\f1\fs24\cf0 DoGet, DoGive, DoGo, DoHit, DoInventory, DoListen, DoLock, DoLook, \plain\f1\fs24\cf0 DoLookAround, DoLookIn, DoLookThrough, DoLookUnder, DoMove, \plain\f1\fs24\cf0 DoOpen, DoPutIn, DoShow, DoSwitchOff, DoSwitchOn, DoTakeOff, \plain\f1\fs24\cf0 DoTalk, DoTell, DoUnlock, DoVague, DoWait, DoWaitforChar, \plain\f1\fs24\cf0 DoWaitUntil, DoWear\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Here are the non-action verb routines:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \ql\li720\fi-720\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 DoBrief, DoQuit, DoRestart, DoRestore, DoSave, DoScore, \plain\f1\fs24\cf0 DoScriptOnOff, DoSuperbrief, DoVerbose\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (NOTE: A set of verb stub routines is also available, including the actions:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \ql\li720\fi-720\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 DoBurn, DoClimb, DoCut, DoDig, DoFollow, DoHelp, DoJump, DoKiss, \plain\f1\fs24\cf0 DoNo, DoPull, DoPush, DoSearch, DoSleep, DoSmell, DoSorry, DoSwim, \plain\f1\fs24\cf0 DoThrowAt, DoTie, DoTouch, DoUntie, DoUse, DoWake, \plain\f1\fs24\cf0 DoWakeCharacter, DoWave, DoWaveHands, DoYell, DoYe\plain\f0\fs24\cf0 s\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The default response for each of these stub routines is a more colorful variation of "Try something \plain\f0\fs24\cf0 else." Any more meaningful response must be incorporated into before property routines.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To use these verbs, set the \plain\f1\fs24\cf0 VERBSTUBS\plain\f0\fs24\cf0 flag before compiling \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 . \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } <end node> 5P9i0s8y19Z id=80 dt=RTF <node> Utility Routines, Etc. 3 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard{\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\b UTILITY ROUTINES, ETC.:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Routines may be treated as procedures or functions, given the idea that procedures are more like \plain\f0\fs24\cf0 commands, while functions are expected to return a value, as in:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab Procedure(a, b)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab x = Function(y)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab if Function()...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Library routines that do not return a value are generally meant to be treated as procedures; those \plain\f0\fs24\cf0 that do return a value may be treated as either functions or procedures.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 First, the junction routines:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 EndGame\plain\f0\fs24\cf0 \tab \tab called by the engine via:\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab EndGame(end_type)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab If \plain\f1\fs24\cf0 end_type\plain\f0\fs24\cf0 = 1, the game is won; if 2, the game is lost. (Since \plain\f1\fs24\cf0 endflag\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 may be any value, a value of, for example, 3 will still call \plain\f1\fs24\cf0 EndGame\plain\f0\fs24\cf0 , but \plain\f0\fs24\cf0 with no additional effects via the default \plain\f1\fs24\cf0 PrintEndGame\plain\f0\fs24\cf0 routine.) The \plain\f0\fs24\cf0 global \plain\f1\fs24\cf0 endflag\plain\f0\fs24\cf0 is cleared upon calling. Returning false from \plain\f1\fs24\cf0 EndGame\plain\f0\fs24\cf0 terminates the Hugo Engine.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab Also calls: \plain\f1\fs24\cf0 PrintEndGame\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 PrintScore\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 FindObject\plain\f0\fs24\cf0 \tab called by the engine via:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab FindObject(object, location)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab Returns true (1) if the specified object is available in the specified location, \plain\f0\fs24\cf0 or false (0) if it is not. Returns 2 if the object is visible but not physically \plain\f0\fs24\cf0 accessible.\par \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab The \plain\f1\fs24\cf0 <location>\plain\f0\fs24\cf0 argument is 0 during object disambiguation performed \plain\f0\fs24\cf0 by the engine.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab Also calls: \plain\f1\fs24\cf0 ObjectisKnown\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 ExcludeFromAll\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 Parse\plain\f0\fs24\cf0 \tab \tab called by the engine via:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab Parse()\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab Returning true forces the engine to re-parse the modified input line.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab Also calls: \plain\f1\fs24\cf0 PreParse\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 AssignPronoun\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 SetObjWord\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ParseError\plain\f0\fs24\cf0 \tab called by the engine via:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab ParseError(errornumber, object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab Returning false signals the engine to print the default error message. \plain\f0\fs24\cf0 Return 2 to force the existing line to be reparsed as is.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab May also call: \plain\f1\fs24\cf0 CustomError\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 SpeakTo\plain\f0\fs24\cf0 \tab \tab called by the engine via:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab SpeakTo(character)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab Globals \plain\f1\fs24\cf0 object\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 xobject\plain\f0\fs24\cf0 , and \plain\f1\fs24\cf0 verbroutine\plain\f0\fs24\cf0 are set up as in a normal \plain\f0\fs24\cf0 verb routine call.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab Also calls: \plain\f1\fs24\cf0 AssignPronoun\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 And the routines for grammatically-correct printing:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 The\plain\f0\fs24\cf0 \tab \tab \tab calling form: \plain\f1\fs24\cf0 The(object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab Prints the definite article form of the object name, e.g. "the apple"\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 Art\plain\f0\fs24\cf0 \tab \tab \tab calling form: \plain\f1\fs24\cf0 Art(object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab Prints the indefinite article form of the object name, e.g. "an apple"\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 CThe\plain\f0\fs24\cf0 \tab \tab \tab calling form: \plain\f1\fs24\cf0 CThe(object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab Prints the capitalized definite article form of the object name, e.g. "The \plain\f0\fs24\cf0 apple"\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 CArt\plain\f0\fs24\cf0 \tab \tab \tab calling form: \plain\f1\fs24\cf0 CArt(object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab Prints the capitalized indefinite article form of the object name, e.g. "An \plain\f0\fs24\cf0 apple"\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li720\fi-720\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 IsorAre\plain\f0\fs24\cf0 \tab \tab calling form: \plain\f1\fs24\cf0 IsorAre(object[, formal])\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab where the parameter \plain\f1\fs24\cf0 formal\plain\f0\fs24\cf0 is optional\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab Depending on whether or not the specified object is \plain\f1\fs24\cf0 plural\plain\f0\fs24\cf0 or singular, \plain\f0\fs24\cf0 prints "'re" or "'s", respectively (or " are" or " is" if the formal parameter is \plain\f0\fs24\cf0 specified as true).\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MatchPlural\plain\f0\fs24\cf0 \tab calling form: \plain\f1\fs24\cf0 MatchPlural(object, w1, w2)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab Prints the dictionary entry given by \plain\f1\fs24\cf0 w1\plain\f0\fs24\cf0 if the supplied object is not \plain\f1\fs24\cf0 plural\plain\f0\fs24\cf0 , or \plain\f1\fs24\cf0 w2\plain\f0\fs24\cf0 if it is.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MatchSubject\plain\f0\fs24\cf0 \tab calling form: \plain\f1\fs24\cf0 MatchSubject(object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160 \qj\li2880\fi-2880\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab Matches a verb to the given subject \plain\f1\fs24\cf0 <object>\plain\f0\fs24\cf0 . If the object is \plain\f1\fs24\cf0 plural\plain\f0\fs24\cf0 , \plain\f0\fs24\cf0 nothing is printed; if the object is singular, an "s" is printed.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li720\fi-720\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab NOTE: None of the above printing routines prints a carriage return, and all return 0 (the \plain\f0\fs24\cf0 null string). Therefore, either of the following usages are valid:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab CThe(apple)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print " is here."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab or\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab print CThe(apple); " is here."\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Other routines:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 Acquire\plain\f0\fs24\cf0 \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab Acquire(parent, object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Checks to see if \plain\f1\fs24\cf0 parent.capacity\plain\f0\fs24\cf0 is greater than or equal to \plain\f1\fs24\cf0 parent.holding\plain\f0\fs24\cf0 plus \plain\f1\fs24\cf0 object.size\plain\f0\fs24\cf0 . If so, it moves \plain\f1\fs24\cf0 object\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 to the specified parent, and returns true. If the object cannot be \plain\f0\fs24\cf0 moved, \plain\f1\fs24\cf0 Acquire\plain\f0\fs24\cf0 returns false.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Also calls: \plain\f1\fs24\cf0 CalculateHolding\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 AnyVerb\plain\f0\fs24\cf0 \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab AnyVerb(object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Returns object if the current verbroutine is not an xverb; otherwise \plain\f0\fs24\cf0 it returns false. \par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 AssignPronoun\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab AssignPronoun(object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Sets the appropriate global \plain\f1\fs24\cf0 it_obj\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 them_obj\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 him_obj\plain\f0\fs24\cf0 , or \plain\f1\fs24\cf0 her_obj\plain\f0\fs24\cf0 to the specified object.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 CalculateHolding\plain\f0\fs24\cf0 \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab CalculateHolding(object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Properly recalculates \plain\f1\fs24\cf0 object.holding\plain\f0\fs24\cf0 based on the sizes of all \plain\f0\fs24\cf0 held objects.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 CenterTitle\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab CenterTitle(text[, lines])\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Clears the screen and centers the text given by the specified \plain\f0\fs24\cf0 dictionary entry in the top window. The default height of the title \plain\f0\fs24\cf0 (i.e., one line) can be overridden with a second argument given \plain\f0\fs24\cf0 the number of lines.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 CheckReach\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab CheckReach(object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Checks to see if the specified object is within reach of the player \plain\f0\fs24\cf0 object. Returns true if accessible; returns false-and prints an \plain\f0\fs24\cf0 appropriate message-if not.\tab \par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 Contains\plain\f0\fs24\cf0 \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab Contains(parent, object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Returns \plain\f1\fs24\cf0 <object>\plain\f0\fs24\cf0 if the specified object is present as a \plain\f0\fs24\cf0 possession of the specified parent, even as a grandchild, \plain\f0\fs24\cf0 otherwise returns false.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 CustomError\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab CustomError(errornumber, object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Replace if custom error messages are desired. Is called by \plain\f1\fs24\cf0 ParseError\plain\f0\fs24\cf0 whenever \plain\f1\fs24\cf0 errornumber\plain\f0\fs24\cf0 is greater than or equal \plain\f0\fs24\cf0 to 100, specifying a user parser error. Should return false if no \plain\f0\fs24\cf0 user message is found.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 DarkWarning\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab DarkWarning\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Is called by \plain\f1\fs24\cf0 MovePlayer\plain\f0\fs24\cf0 whenever the player object is moved \plain\f0\fs24\cf0 into a location without a light source. The default library routine \plain\f0\fs24\cf0 simply prints a message; for a more sinister response or action, \plain\f0\fs24\cf0 such as the death of the player, replace the default with a new \plain\f1\fs24\cf0 DarkWarning\plain\f0\fs24\cf0 routine.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 DeleteWord\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab DeleteWord(wordnumber[, number])\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Deletes the number of words given by the second argument-or \plain\f0\fs24\cf0 only one word if no second argument is given-starting with \plain\f1\fs24\cf0 word[wordnumber]\plain\f0\fs24\cf0 . Returns the number of words deleted.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 DescribePlace\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab DescribePlace(location[, long])\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Prints the location \plain\f1\fs24\cf0 name\plain\f0\fs24\cf0 and, when appropriate, a location \plain\f0\fs24\cf0 description (i.e., its \plain\f1\fs24\cf0 long_desc\plain\f0\fs24\cf0 ). Including a non-false long \plain\f0\fs24\cf0 parameter will always force a location description.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ExcludeFromAll\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ExcludeFromAll(object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Returns true if, based on the current circumstances (verbroutine, \plain\f0\fs24\cf0 etc.), the supplied object should be excluded from actions using \plain\f0\fs24\cf0 "all"-such as \plain\f1\fs24\cf0 multi\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 multiheld\plain\f0\fs24\cf0 , and \plain\f1\fs24\cf0 multinotheld\plain\f0\fs24\cf0 grammar \plain\f0\fs24\cf0 tokens.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 FindLight\plain\f0\fs24\cf0 \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab FindLight(location)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Checks to see if a light source is available in the player's location; if \plain\f0\fs24\cf0 so, it sets the global \plain\f1\fs24\cf0 light_source\plain\f0\fs24\cf0 to the object number of the \plain\f0\fs24\cf0 source and returns that value.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Also calls: \plain\f1\fs24\cf0 ObjectIsLight\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 Font\plain\f0\fs24\cf0 \tab \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab Font(bitmask)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Sets the current font attributes as specified by \plain\f1\fs24\cf0 bitmask\plain\f0\fs24\cf0 , where \plain\f1\fs24\cf0 bitmask\plain\f0\fs24\cf0 is one or more font-style constants (see library \plain\f0\fs24\cf0 constants, above) combined with '\plain\f1\fs24\cf0 |\plain\f0\fs24\cf0 ' or '\plain\f1\fs24\cf0 +\plain\f0\fs24\cf0 '.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 GetInput\plain\f0\fs24\cf0 \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab GetInput([prompt string])\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Receives input from the keyboard, storing individual words in the \plain\f1\fs24\cf0 word\plain\f0\fs24\cf0 array; unknown words-i.e., those that are not in the \plain\f0\fs24\cf0 dictionary-are assigned the null string, 0 or "". If an argument is \plain\f0\fs24\cf0 passed, it is assumed to be a dictionary address for the \plain\f1\fs24\cf0 prompt\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 string. If no argument is passed, no prompt is printed.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 HoursMinutes\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab HoursMinutes(counter[, military])\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Prints the time in hh:mm format given that the global \plain\f1\fs24\cf0 counter\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 represents the time in minutes from 12:00 a.m. If the optional \plain\f1\fs24\cf0 military\plain\f0\fs24\cf0 value is given as a true value, time is in 24-hour \plain\f0\fs24\cf0 "military" format.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 Indent\plain\f0\fs24\cf0 \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab Indent\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab If the \plain\f1\fs24\cf0 NOINDENT_F\plain\f0\fs24\cf0 bit is not set in the \plain\f1\fs24\cf0 FORMAT\plain\f0\fs24\cf0 mask, \plain\f1\fs24\cf0 Indent\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 prints two spaces without printing a newline\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 InList\plain\f0\fs24\cf0 \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab InList(object, property, value)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab If \plain\f1\fs24\cf0 <value>\plain\f0\fs24\cf0 is in the list of values held in \plain\f1\fs24\cf0 <object>.<property>\plain\f0\fs24\cf0 , returns the element number of the \plain\f0\fs24\cf0 (first) property element equal to \plain\f1\fs24\cf0 <value>\plain\f0\fs24\cf0 ; otherwise returns 0.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 InsertWord\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab InsertWord(wordnumber[, number])\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Makes space for either the number of words given by the \plain\f1\fs24\cf0 number\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 argument-or one word if no second argument is given-if possible, \plain\f0\fs24\cf0 at \plain\f1\fs24\cf0 word[wordnumber]\plain\f0\fs24\cf0 , shifting upward all words from that \plain\f0\fs24\cf0 point to the end of the input line. Returns the number of words \plain\f0\fs24\cf0 inserted.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ListObjects\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ListObjects(object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Lists all the possessions of the specified object in the appropriate \plain\f0\fs24\cf0 form (according to the global \plain\f1\fs24\cf0 FORMAT\plain\f0\fs24\cf0 ). Possessions of \plain\f0\fs24\cf0 possessions are listed recursively if \plain\f1\fs24\cf0 FORMAT\plain\f0\fs24\cf0 does not contain the \plain\f1\fs24\cf0 NORECURSE_F\plain\f0\fs24\cf0 bit. Format masks are combined, as in:\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab FORMAT = LIST_F | NORECURSE_F | ...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Also calls: \plain\f1\fs24\cf0 WhatsIn\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 Menu\plain\f0\fs24\cf0 \tab \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab Menu(number, [width[, selection]])\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Prints a menu, given that the possible choices (up to 10) are \plain\f0\fs24\cf0 contained in the \plain\f1\fs24\cf0 menuitem\plain\f0\fs24\cf0 array, with \plain\f1\fs24\cf0 menuitem[0]\plain\f0\fs24\cf0 is the title \plain\f0\fs24\cf0 of the menu. A starting \plain\f1\fs24\cf0 selection\plain\f0\fs24\cf0 number is optional. \plain\f0\fs24\cf0 Returns the number of the item selected, or 0 if none is chosen.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Also calls: \plain\f1\fs24\cf0 CenterTitle\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 Message\plain\f0\fs24\cf0 \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab Message(&routine, num, a, b)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Used by most routines in \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 for text output, so that the \plain\f0\fs24\cf0 bulk of the library text is centralized in one location. Message \plain\f0\fs24\cf0 number \plain\f1\fs24\cf0 num\plain\f0\fs24\cf0 for the specified routine is printed; \plain\f1\fs24\cf0 a\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 b\plain\f0\fs24\cf0 are \plain\f0\fs24\cf0 optional parameters that may represent objects, dictionary \plain\f0\fs24\cf0 entries, or any other value.\par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab (NOTE: Similar routines are provided in \plain\f1\fs24\cf0 VMessage\plain\f0\fs24\cf0 in \plain\f1\fs24\cf0 VERBLIB.H\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 OMessage\plain\f0\fs24\cf0 in \plain\f1\fs24\cf0 OBJLIB.H\plain\f0\fs24\cf0 .)\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MovePlayer\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab MovePlayer(loc[, silent[, none]])\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab MovePlayer(dir[, silent[, none]])\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Moves the player to the new location, properly setting all relevant \plain\f0\fs24\cf0 variables and attributes. If \plain\f1\fs24\cf0 <silent>\plain\f0\fs24\cf0 is specified (as a true \plain\f0\fs24\cf0 value), no room description is printed following the move.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab A direction object (i.e., \plain\f1\fs24\cf0 n_obj\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 d_obj\plain\f0\fs24\cf0 ) may be specified instead of \plain\f0\fs24\cf0 a location; in this instance, \plain\f1\fs24\cf0 MovePlayer\plain\f0\fs24\cf0 moves in that direction \plain\f0\fs24\cf0 from the player object's present location.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab If \plain\f1\fs24\cf0 <none>\plain\f0\fs24\cf0 is true, \plain\f1\fs24\cf0 before\plain\f0\fs24\cf0 /\plain\f1\fs24\cf0 after\plain\f0\fs24\cf0 routines are not run.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Can be checked in a location's \plain\f1\fs24\cf0 before\plain\f0\fs24\cf0 or \plain\f1\fs24\cf0 after\plain\f0\fs24\cf0 property as \plain\f0\fs24\cf0 "\plain\f1\fs24\cf0 location MovePlayer\plain\f0\fs24\cf0 " to catch a player's exit from or \plain\f0\fs24\cf0 entrance to a location.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Returns the object number of the player object's new parent.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab NOTE: \plain\f1\fs24\cf0 MovePlayer\plain\f0\fs24\cf0 does not check to see if a move is valid; that \plain\f0\fs24\cf0 must be done before calling the routine.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab May also call: \plain\f1\fs24\cf0 DarkWarning\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 NumberWord\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab NumberWord(number[, true])\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Prints a number in non-numerical word format, where \plain\f1\fs24\cf0 <number>\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 is between -32768 to 32767. Always returns 0 (the null string). If a \plain\f0\fs24\cf0 second (true) argument is supplied, the word is capitalized.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ObjectIs\plain\f0\fs24\cf0 \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ObjectIs(object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Lists certain attributes, such as providing \plain\f1\fs24\cf0 light\plain\f0\fs24\cf0 or being \plain\f1\fs24\cf0 worn\plain\f0\fs24\cf0 , of \plain\f0\fs24\cf0 the given object in parenthetical form.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ObjectisKnown\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ObjectisKnown(object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Returns true if the object is \plain\f1\fs24\cf0 known\plain\f0\fs24\cf0 to the player.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ObjectisLight\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ObjectisLight(object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Returns true if the object or one of its visible possessions is \plain\f0\fs24\cf0 providing \plain\f1\fs24\cf0 light\plain\f0\fs24\cf0 . If so, it also sets the global \plain\f1\fs24\cf0 light_source\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 the object number of the source.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ObjWord\plain\f0\fs24\cf0 \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ObjWord(word, object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Returns either adjective or noun (i.e., the property number) if the \plain\f0\fs24\cf0 given is either an adjective or noun of the specified object.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 PreParse\plain\f0\fs24\cf0 \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab PreParse\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Provided so that, if needed, this routine may be replaced instead of \plain\f0\fs24\cf0 the more extensive library \plain\f1\fs24\cf0 Parse\plain\f0\fs24\cf0 routine. The default routine \plain\f0\fs24\cf0 defined in the library is empty.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 PrintEndGame\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab PrintEndGame(end_type)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Depending on whether \plain\f1\fs24\cf0 end_type\plain\f0\fs24\cf0 is 1 or 2, prints "*** YOU'VE \plain\f0\fs24\cf0 WON THE GAME! ***" or "*** YOU ARE DEAD ***".\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 PrintScore\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab PrintScore(end_of_game)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Prints the \plain\f1\fs24\cf0 score\plain\f0\fs24\cf0 in the appropriate form, depending on whether \plain\f0\fs24\cf0 or not \plain\f1\fs24\cf0 end_of_game\plain\f0\fs24\cf0 is true.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 PrintStatusLine\plain\f0\fs24\cf0 \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab PrintStatusLine\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Prints the statusline in the appropriate format, according to the \plain\f0\fs24\cf0 global \plain\f1\fs24\cf0 STATUSTYPE\plain\f0\fs24\cf0 .\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 PropertyList\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab PropertyList(obj, property)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Lists the objects held in \plain\f1\fs24\cf0 obj.property\plain\f0\fs24\cf0 (if any), returning the \plain\f0\fs24\cf0 number of objects listed.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 PutInScope\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab PutInScope(object, actor)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Makes \plain\f1\fs24\cf0 <object>\plain\f0\fs24\cf0 accessible to \plain\f1\fs24\cf0 <actor>\plain\f0\fs24\cf0 , regardless of their \plain\f0\fs24\cf0 respective locations, and providing that the \plain\f1\fs24\cf0 in_scope\plain\f0\fs24\cf0 property \plain\f0\fs24\cf0 of \plain\f1\fs24\cf0 <object>\plain\f0\fs24\cf0 has at least one empty slot-i.e., one that equals 0. \plain\f0\fs24\cf0 Returns true if successful.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 RemoveFromScope\plain\f0\fs24\cf0 \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab RemoveFromScope(object, actor)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Removes \plain\f1\fs24\cf0 <object>\plain\f0\fs24\cf0 from the scope of \plain\f1\fs24\cf0 <actor>\plain\f0\fs24\cf0 . Returns true if \plain\f0\fs24\cf0 successful, or false if \plain\f1\fs24\cf0 <object>\plain\f0\fs24\cf0 was never in scope of \plain\f1\fs24\cf0 <actor>\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 to begin with.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 SetObjWord\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab SetObjWord(position, object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Inserts the specified object in the \plain\f1\fs24\cf0 word\plain\f0\fs24\cf0 array in the format:\par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab "adjective1 adjective2...noun"\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ShortDescribe\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ShortDescribe(object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Prints the short description (\plain\f1\fs24\cf0 short_desc\plain\f0\fs24\cf0 ) of the given object, first \plain\f0\fs24\cf0 checking to see if it should run \plain\f1\fs24\cf0 initial_desc\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 when_open\plain\f0\fs24\cf0 , or \plain\f1\fs24\cf0 when_closed\plain\f0\fs24\cf0 , as appropriate. Then, if no \plain\f1\fs24\cf0 short_desc\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 property exists, it prints a default "X is here."\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Also calls: \plain\f1\fs24\cf0 WhatsIn\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 SpecialDesc\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab SpecialDesc(object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Checks each child object of \plain\f1\fs24\cf0 <object>\plain\f0\fs24\cf0 , running any appropriate \plain\f1\fs24\cf0 initial_desc\plain\f0\fs24\cf0 or \plain\f1\fs24\cf0 inv_desc\plain\f0\fs24\cf0 property routines (depending on \plain\f0\fs24\cf0 the calling situation). Sets the global variable \plain\f1\fs24\cf0 list_coun\plain\f0\fs24\cf0 t to the \plain\f0\fs24\cf0 number of remaining (i.e., non-listed) objects.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 WhatsIn\plain\f0\fs24\cf0 \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab WhatsIn(parent)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Lists the possessions of the specified parent, according the form \plain\f0\fs24\cf0 given by the global \plain\f1\fs24\cf0 FORMAT\plain\f0\fs24\cf0 . Returns the number of objects \plain\f0\fs24\cf0 listed.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Also calls: \plain\f1\fs24\cf0 SpecialDesc\plain\f0\fs24\cf0 , \plain\f1\fs24\cf0 ListObjects\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 YesorNo\plain\f0\fs24\cf0 \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab YesorNo\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Checks to see if the just-received input is "yes", "y", "no", or "n". If \plain\f0\fs24\cf0 none of the above, it prompts for a yes or no answer. Once a \plain\f0\fs24\cf0 valid answer is received, it returns true (if yes) or false (if no).\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } <end node> 5P9i0s8y19Z id=81 dt=RTF <node> Auxiliary Math Routines 3 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard{\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\b AUXILIARY MATH ROUTINES:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 abs\plain\f0\fs24\cf0 \tab \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab abs(a)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Returns the absolute value of \plain\f1\fs24\cf0 <a>\plain\f0\fs24\cf0 .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 higher\plain\f0\fs24\cf0 \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab higher(a, b)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Returns the higher number of \plain\f1\fs24\cf0 <a>\plain\f0\fs24\cf0 or \plain\f1\fs24\cf0 <b>\plain\f0\fs24\cf0 .\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 lower\plain\f0\fs24\cf0 \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab lower(a, b)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Returns the lower number of \plain\f1\fs24\cf0 <a>\plain\f0\fs24\cf0 or \plain\f1\fs24\cf0 <b>\plain\f0\fs24\cf0 .\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 mod\plain\f0\fs24\cf0 \tab \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab mod(a, b)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Returns the remainder of \plain\f1\fs24\cf0 <a>\plain\f0\fs24\cf0 divided by \plain\f1\fs24\cf0 <b>\plain\f0\fs24\cf0 .\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 pow\plain\f0\fs24\cf0 \tab \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab pow(a, b)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Returns \plain\f1\fs24\cf0 <a>\plain\f0\fs24\cf0 to the power of \plain\f1\fs24\cf0 <b>\plain\f0\fs24\cf0 . (The return value is \plain\f0\fs24\cf0 unpredictable if the result is outside the boundary of -32768 to \plain\f0\fs24\cf0 32767.)\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } <end node> 5P9i0s8y19Z id=82 dt=RTF <node> String Array Routines 3 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard{\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\b STRING ARRAY ROUTINES:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 StringCompare\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab StringCompare(array1, array2)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Returns 1 if \plain\f1\fs24\cf0 <array1>\plain\f0\fs24\cf0 is lexically greater than \plain\f1\fs24\cf0 <array2>\plain\f0\fs24\cf0 , -1 if \plain\f1\fs24\cf0 <array1>\plain\f0\fs24\cf0 is lexically less than \plain\f1\fs24\cf0 <array2>\plain\f0\fs24\cf0 , and 0 if the strings \plain\f0\fs24\cf0 are identical.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 StringCopy\plain\f0\fs24\cf0 \tab \tab calling form:\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab StringCopy(new, old[, len])\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Copies the contents of the array at the address given by \plain\f1\fs24\cf0 <old>\plain\f0\fs24\cf0 to \plain\f0\fs24\cf0 the array at \plain\f1\fs24\cf0 <new>\plain\f0\fs24\cf0 , to a maximum of \plain\f1\fs24\cf0 <len>\plain\f0\fs24\cf0 characters if \plain\f1\fs24\cf0 <len>\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 is given, or the length of \plain\f1\fs24\cf0 <old>\plain\f0\fs24\cf0 if it isn't.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 StringDictCompare\plain\f0\fs24\cf0 \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab StringDictCompare(array, dictentry)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Performs a \plain\f1\fs24\cf0 StringCompare\plain\f0\fs24\cf0 -like comparison of a string array \plain\f0\fs24\cf0 given by \plain\f1\fs24\cf0 <array>\plain\f0\fs24\cf0 and the dictionary entry \plain\f1\fs24\cf0 <dictentry>\plain\f0\fs24\cf0 , \plain\f0\fs24\cf0 returning 1, -1, or 0 if \plain\f1\fs24\cf0 <array>\plain\f0\fs24\cf0 is lexically greater than, less than, \plain\f0\fs24\cf0 or equal to \plain\f1\fs24\cf0 <dictentry>\plain\f0\fs24\cf0 , respectively.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 StringEqual\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab StringEqual(array1, array2)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Returns true only if \plain\f1\fs24\cf0 <array1>\plain\f0\fs24\cf0 and \plain\f1\fs24\cf0 <array2>\plain\f0\fs24\cf0 are identical.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 StringLength\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab StringLength(array)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Returns the length of the string stored as \plain\f1\fs24\cf0 <array>\plain\f0\fs24\cf0 .\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 StringPrint\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab StringPrint(array[, start, end])\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Prints the string stored as \plain\f1\fs24\cf0 <array>\plain\f0\fs24\cf0 , beginning with \plain\f1\fs24\cf0 <start>\plain\f0\fs24\cf0 and \plain\f0\fs24\cf0 ending with \plain\f1\fs24\cf0 <end>\plain\f0\fs24\cf0 if given.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } <end node> 5P9i0s8y19Z id=83 dt=RTF <node> Fuse/Daemon Routines 3 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard{\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\b FUSE/DAEMON ROUTINES:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li720\fi-720\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f0\fs24\cf0\i (See the earlier section on fuses and daemons for more information.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 Activate\plain\f0\fs24\cf0 \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab Activate(object[, setting])\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Activates the specified \plain\f1\fs24\cf0 fuse\plain\f0\fs24\cf0 or \plain\f1\fs24\cf0 daemon\plain\f0\fs24\cf0 object. The setting value is \plain\f0\fs24\cf0 only specified for fuses, where it represents the initial value of the \plain\f0\fs24\cf0 timer property.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 Deactivate\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab Deactivate(object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Deactivates the specified \plain\f1\fs24\cf0 fuse\plain\f0\fs24\cf0 or \plain\f1\fs24\cf0 daemon\plain\f0\fs24\cf0 object.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } <end node> 5P9i0s8y19Z id=84 dt=RTF <node> Character Script Routines 3 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard{\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\b CHARACTER SCRIPT ROUTINES:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li720\fi-720\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f0\fs24\cf0\i (See the earlier section on character scripts for more information.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 CancelScript\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab CancelScript(character)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Immediately cancels the character script associated with the object \plain\f1\fs24\cf0 <character>\plain\f0\fs24\cf0 . Returns true if successful, i.e., if a script for \plain\f1\fs24\cf0 <character>\plain\f0\fs24\cf0 is found.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 PauseScript\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab PauseScript(character)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Temporarily pauses the character script associated with the object \plain\f1\fs24\cf0 <character>\plain\f0\fs24\cf0 . Returns true if successful.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 ResumeScript\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab ResumeScript(character)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Resumes execution of a paused script. Returns true if successful.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 SkipScript\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab SkipScript(character)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Skips execution of the script for \plain\f1\fs24\cf0 <character>\plain\f0\fs24\cf0 during the next call \plain\f0\fs24\cf0 to \plain\f1\fs24\cf0 RunScripts\plain\f0\fs24\cf0 only.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 Script\plain\f0\fs24\cf0 \tab \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab Script(character, steps)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Initializes space for the requested number of steps in the \plain\f1\fs24\cf0 setscript\plain\f0\fs24\cf0 array, sets up the data for the script in the \plain\f1\fs24\cf0 scriptdata\plain\f0\fs24\cf0 array, and returns the location of the script in \plain\f1\fs24\cf0 setscript\plain\f0\fs24\cf0 . Returns -1 if \plain\f1\fs24\cf0 MAX_SCRIPTS\plain\f0\fs24\cf0 is exceeded.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 RunScripts\plain\f0\fs24\cf0 \tab \tab calling form:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab RunScripts\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab Runs all active scripts, calling them in the form:\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \tab \tab \tab \tab \tab CharRoutine(character, object)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } <end node> 5P9i0s8y19Z id=85 dt=RTF <node> Character Action Routines 3 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard{\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\b CHARACTER ACTION ROUTINES:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 As a starting point, the library also provides a limited number of routines for character objects to use \plain\f0\fs24\cf0 in scripts. They are:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 &CharWait, 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 &CharMove, direction_object\plain\f0\fs24\cf0 (requires \plain\f1\fs24\cf0 OBJLIB.H\plain\f0\fs24\cf0 )\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab &CharGet, object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab &CharDrop, object\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 and\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab &LoopScript, 0\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } <end node> 5P9i0s8y19Z id=86 dt=RTF <node> Conditional Compilation 3 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard{\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\b CONDITIONAL COMPILATION:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 A number of compiler flags may be set which exclude certain portions of \plain\f1\fs24\cf0 HUGOLIB.H \plain\f0\fs24\cf0 from \plain\f0\fs24\cf0 compilation if these functions or objects are not required.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab FLAG:\tab \tab \tab \tab EXCLUDES:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 NO_AUX_MATH\plain\f0\fs24\cf0 \tab \tab Auxiliary math routines\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 NO_FUSES\plain\f0\fs24\cf0 \tab \tab \tab Fuses and daemons\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 NO_MENUS\plain\f0\fs24\cf0 \tab \tab \tab Use of the \plain\f1\fs24\cf0 Menu\plain\f0\fs24\cf0 function\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 NO_OBJLIB\plain\f0\fs24\cf0 \tab \tab \tab \plain\f1\fs24\cf0 OBJLIB.H\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 NO_RECORDING\plain\f0\fs24\cf0 \tab \tab Command recording functions\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 NO_SCRIPTS\plain\f0\fs24\cf0 \tab \tab Character scripting routines\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 NO_STRING_ARRAYS\plain\f0\fs24\cf0 \tab String array functions\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 NO_VERBS\plain\f0\fs24\cf0 \tab \tab \tab All action verbs\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 NO_XVERBS\plain\f0\fs24\cf0 \tab \tab \tab All non-action verbs\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } <end node> 5P9i0s8y19Z id=75 nft=02;80000008;000A;00;Times New Roman dt=RTF <node> APPENDIX C: LIMIT SETTINGS 1 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0\b APPENDIX C: LIMIT SETTINGS\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: The default settings for the complete set of limits may be obtained by invoking the \plain\f0\fs24\cf0 compiler via:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab hc $list\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (The following limits are static and non-modifiable, since they reflect the internal configuration of \plain\f0\fs24\cf0 the Hugo Engine:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MAXATTRIBUTES\plain\f0\fs24\cf0 \tab \tab The maximum number of definable attributes, not counting aliases\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MAXGLOBALS\plain\f0\fs24\cf0 \tab \tab The maximum number of definable global variables\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MAXLOCALS\plain\f0\fs24\cf0 \tab \tab \tab The maximum number of local variables allowed in a routine, \plain\f0\fs24\cf0 including arguments passed to the routine)\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The following are the modifiable settings, which may be setting using:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab $<setting>=<new limit>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 either in the invocation line or in the source code.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MAXALIASES\plain\f0\fs24\cf0 \tab \tab The maximum number of aliases that may be defined for attributes \plain\f0\fs24\cf0 and/or properties\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MAXARRAYS\plain\f0\fs24\cf0 \tab \tab \tab The maximum number of arrays that may be defined (not the total \plain\f0\fs24\cf0 array space, which is automatically reserved)\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MAXCONSTANTS\plain\f0\fs24\cf0 \tab \tab The maximum number of constants\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MAXDICT\plain\f0\fs24\cf0 \tab \tab \tab The maximum number of entries that the compiler can enter into \plain\f0\fs24\cf0 the dictionary table\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MAXDICTEXTEND\plain\f0\fs24\cf0 \tab \tab The total number of bytes (not the total number of entries) \plain\f0\fs24\cf0 available for dynamic dictionary extension during runtime\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MAXEVENTS\plain\f0\fs24\cf0 \tab \tab \tab The maximum number of global or object-linked events\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MAXFLAGS\plain\f0\fs24\cf0 \tab \tab \tab The maximum number of compiler flags that may be set at one \plain\f0\fs24\cf0 time to control conditional compilation\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MAXLABELS\plain\f0\fs24\cf0 \tab \tab \tab The maximum number of labels that may be defined in an entire \plain\f0\fs24\cf0 program\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MAXOBJECTS\plain\f0\fs24\cf0 \tab \tab The maximum number of objects and/or classes that may be \plain\f0\fs24\cf0 created\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MAXPROPERTIES\plain\f0\fs24\cf0 \tab \tab The maximum number of properties that may be defined\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440\tx2160\tx2880 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f1\fs24\cf0 MAXROUTINES\plain\f0\fs24\cf0 \tab \tab The maximum number of stand-alone routines (not property \plain\f0\fs24\cf0 routines) that may be defined\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } <end node> 5P9i0s8y19Z id=76 nft=02;80000008;000A;00;Times New Roman dt=RTF <node> APPENDIX D: PRECOMPILED HEADERS 1 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0\b APPENDIX D: PRECOMPILED HEADERS\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 It is possible to compile files that would normally be included using the \plain\f1\fs24\cf0 #include\plain\f0\fs24\cf0 directive into \plain\f0\fs24\cf0 a precompiled header file that may be linked using \plain\f1\fs24\cf0 #link\plain\f0\fs24\cf0 , as in:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #link "<filename.HLB>"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The advantage of doing this is primarily one of faster compilation speed; files that are used over \plain\f0\fs24\cf0 and over again without alteration (such as \plain\f1\fs24\cf0 HUGOLIB.H\plain\f0\fs24\cf0 ) may be precompiled so that they are not \plain\f0\fs24\cf0 recompiled every time.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The \plain\f1\fs24\cf0 #link\plain\f0\fs24\cf0 directive must come after any grammar, but before any definitions of attributes, \plain\f0\fs24\cf0 properties, globals, objects, synonyms, etc. Grammar is illegal in a precompiled header.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 To create a precompiled header, use the -h directive when invoking the Hugo Compiler. The file \plain\f1\fs24\cf0 HUGOLIB.HUG\plain\f0\fs24\cf0 serves as a good example. Compile it via\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab hc -h hugolib.hug\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 in order to generate \plain\f1\fs24\cf0 HUGOLIB.HLB\plain\f0\fs24\cf0 .\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Next, change occurrences of\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #include "hugolib.h"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 in Hugo programs to \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab #link "hugolib.hlb"\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Change the definition for the main routine from\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab routine main\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 to\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab replace main\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab \{...\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 since \plain\f1\fs24\cf0 HUGOLIB.HUG\plain\f0\fs24\cf0 contains a temporary main routine.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 NOTE: Any conditional compilation flags set in the Hugo program will have no effect on the \plain\f0\fs24\cf0 compiled code in \plain\f1\fs24\cf0 HUGOLIB.HLB\plain\f0\fs24\cf0 , since the routines included in or excluded from \plain\f1\fs24\cf0 HUGOLIB.HLB\plain\f0\fs24\cf0 \plain\f0\fs24\cf0 are determined by the flags set in \plain\f1\fs24\cf0 HUGOLIB.HUG\plain\f0\fs24\cf0 . It is recommended that a Hugo user using \plain\f0\fs24\cf0 precompiled headers compile a version of \plain\f1\fs24\cf0 HUGOLIB.HUG\plain\f0\fs24\cf0 that includes \plain\f1\fs24\cf0 HUGOFIX.H\plain\f0\fs24\cf0 and/or \plain\f1\fs24\cf0 VERBSTUB.H\plain\f0\fs24\cf0 as desired.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 It is generally not possible to include multiple precompiled \plain\f1\fs24\cf0 .HLB\plain\f0\fs24\cf0 headers compiled in separate \plain\f0\fs24\cf0 passes via subsequent \plain\f1\fs24\cf0 #link\plain\f0\fs24\cf0 s in the same source file. Because of the absolute references assigned \plain\f0\fs24\cf0 to data such as dictionary addresses, attribute numbers, etc., such an attempt will produce an \plain\f0\fs24\cf0 "Incompatible precompiled headers" error.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 However, for games that are composed of separate sections that can be combined into distinct files, \plain\f0\fs24\cf0 it may make sense to precompile one \plain\f1\fs24\cf0 .HUG\plain\f0\fs24\cf0 file containing all the common elements that will be \plain\f0\fs24\cf0 used by the separate sections-such as the player object, etc.-and which \plain\f1\fs24\cf0 #include\plain\f0\fs24\cf0 s or \plain\f1\fs24\cf0 #link\plain\f0\fs24\cf0 s the \plain\f0\fs24\cf0 library in it. Then, this new \plain\f1\fs24\cf0 .HLB\plain\f0\fs24\cf0 file can be \plain\f1\fs24\cf0 #link\plain\f0\fs24\cf0 ed in each of the separate sections during \plain\f0\fs24\cf0 development and testing. Of course, each of the separate sections will have to be \plain\f1\fs24\cf0 #include\plain\f0\fs24\cf0 d in a \plain\f0\fs24\cf0 single master file for building the full release version.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 Finally, it is advisable that precompiled headers be used only in building \plain\f1\fs24\cf0 .HEX\plain\f0\fs24\cf0 files during the \plain\f0\fs24\cf0 design/testing stage in order to facilitate faster development. The reason is that the linker does not \plain\f0\fs24\cf0 selectively include routine calls; the entire \plain\f1\fs24\cf0 .HLB\plain\f0\fs24\cf0 file is loaded during the link phase. As a result, \plain\f0\fs24\cf0 Hugo files produced using precompiled headers-especially if existing routines in the \plain\f1\fs24\cf0 .HLB\plain\f0\fs24\cf0 file are \plain\f0\fs24\cf0 replaced in the source-tend to be larger and therefore less economical in their memory usage. For \plain\f0\fs24\cf0 this reason, it is recommended that \plain\f1\fs24\cf0 #include\plain\f0\fs24\cf0 be used for building release versions instead of \plain\f1\fs24\cf0 #link\plain\f0\fs24\cf0 ing the corresponding precompiled header.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } <end node> 5P9i0s8y19Z id=77 nft=02;80000008;000A;00;Times New Roman dt=RTF <node> APPENDIX E: THE HUGO DEBUGGER 1 {\rtf1\ansi\deff0\deftab862{\fonttbl{\f0\fnil\fcharset0 book antiqua;}{\f1\fnil\fcharset0 Courier New;}{\f2\fnil\fcharset2 symbol;}{\f3\fnil\fcharset2 WingDings;}}{\colortbl\red0\green0\blue0;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red255\green255\blue0;\red255\green0\blue255;\red128\green0\blue128;\red128\green0\blue0;\red0\green255\blue0;\red0\green255\blue255;\red0\green128\blue128;\red0\green0\blue128;\red255\green255\blue255;\red192\green192\blue192;\red128\green128\blue128;\red0\green0\blue0;}\wpprheadfoot0\paperw12240\paperh15840\margl1880\margr1880\margt1440\margb1440\margh720\margf720{\*\listtable{\list\listtemplateid19690212{\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc1{\leveltext\'02\'00.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc3{\leveltext\'02\'01.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'02\'02.;}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'02\'03);}{\levelnumbers\'01;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc2{\leveltext\'03(\'04);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc4{\leveltext\'03(\'05);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'06);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'07);}{\levelnumbers\'02;}} {\listlevel\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent360\levelnfc0{\leveltext\'03(\'08);}{\levelnumbers\'02;}} \listid1194737}}{\*\listoverridetable{\listoverride\listid1194737\listoverridecount0\ls1}}\endnhere\sectdefaultcl{\pard\keep{\qj\li0\fi0\ri0\sb0\sl\sa240 \plain\f0\fs24\cf0\b APPENDIX E: THE HUGO DEBUGGER\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The Hugo Debugger is a valuable part of the Hugo design system. It allows a programmer to \plain\f0\fs24\cf0 monitor all aspects of program execution, including watching expressions, modifying values, \plain\f0\fs24\cf0 moving objects, etc.-all things expected of a modern source-level debugger.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The Hugo Debugger is not technically a source-level debugger, however. During its development, \plain\f0\fs24\cf0 its author has referred to it as a source(ish) level debugger-what the debugger does, in effect, is to \plain\f0\fs24\cf0 "decompile" compiled code into the tokens and symbols that comprise each line of code. The \plain\f0\fs24\cf0 result is a nearly exact approximation of the original source code.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 In order to be used with the debugger, a Hugo program must be compiled using the -d switch in \plain\f0\fs24\cf0 order to create an .\plain\f1\fs24\cf0 HDX\plain\f0\fs24\cf0 debuggable file with additional data such as names for objects, variables, \plain\f0\fs24\cf0 properties, etc.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 (Note that \plain\f1\fs24\cf0 .HDX\plain\f0\fs24\cf0 files can be run by the engine, but \plain\f1\fs24\cf0 .HEX\plain\f0\fs24\cf0 files cannot be run by the debugger \plain\f0\fs24\cf0 because of the additional data required.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The MS-DOS convention for running the debugger is:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f1\fs24\cf0 \tab hd <filename>\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The debugger will begin on the debugging screen. Switch back-and-forth from the actual game \plain\f0\fs24\cf0 screen by pressing Tab.\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 At this point, it is probably best to select "Shortcut Keys" from the Help menu, since the actual \plain\f0\fs24\cf0 keystrokes for running the debugger may vary from system to system. (It is possible to operate the \plain\f0\fs24\cf0 debugger entirely through menus, but this soon becomes tedious for operations like stepping \plain\f0\fs24\cf0 line-by-line.)\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 The file \plain\f1\fs24\cf0 HDHELP.HLP\plain\f0\fs24\cf0 should be in the same directory as \plain\f1\fs24\cf0 HD.EXE\plain\f0\fs24\cf0 -this is the online help file for the \plain\f0\fs24\cf0 debugger, containing information on such things as:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f0\fs24\cf0\b Printing\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\b \tab Windows and Views, including:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f0\fs24\cf0\i Code Window\tab \plain\f0\fs24\cf0 - Showing the current program exactly as executed, in (almost) \plain\f0\fs24\cf0 source-level format\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f0\fs24\cf0\i Watch Window\plain\f0\fs24\cf0 \tab - Allowing any variable expression to be watched/evaluated at any \plain\f0\fs24\cf0 time during execution\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f0\fs24\cf0\i Calls\tab \plain\f0\fs24\cf0 \tab - Giving the sequence of nested routine calls at any given point\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440 \qj\li4320\fi-4320\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f0\fs24\cf0\i Breakpoints\plain\f0\fs24\cf0 \tab - Listing all active breakpoints\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f0\fs24\cf0\i Local Variables\plain\f0\fs24\cf0 \tab - Listing all local variables, as values, objects, dictionary entries, \plain\f0\fs24\cf0 etc.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f0\fs24\cf0\i Property/Attribute Aliases\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \tab \tab Auxiliary Window\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \tab \tab Output\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\b \tab Running a program, including:\par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f0\fs24\cf0\i Finish Routine\plain\f0\fs24\cf0 \tab - While stepping, continues execution without stepping to the end \plain\f0\fs24\cf0 of the current routine\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f0\fs24\cf0\i Stepping Through Code\par {\tx720\tx1440 \qj\li4320\fi-4320\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab - Allows line-by-line execution\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f0\fs24\cf0\i Skipping Over Code\par \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0\i \tab \tab \tab \tab \plain\f0\fs24\cf0 \tab - Allows the next statement to be passed over without executing\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \plain\f0\fs24\cf0\i Stepping Backward\plain\f0\fs24\cf0 \tab - Allows retracing of code execution, possibly after values are \plain\f0\fs24\cf0 changed, etc.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f0\fs24\cf0\b Searching Code\plain\f0\fs24\cf0 \tab - Searches the record of executed code for any given string\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f0\fs24\cf0\b Watch Expressions\tab \plain\f0\fs24\cf0 - Allows watching multiple variable values or expressions, and to \plain\f0\fs24\cf0 set a breakpoint should a desired value/expression evaluate \plain\f0\fs24\cf0 non-false\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f0\fs24\cf0\b Setting or Modifying Values\par {\tx720\tx1440 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \tab \tab \tab \tab - Any variable, property, array value, or object attribute can be set \plain\f0\fs24\cf0 or reset to a valid value at any point during execution\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f0\fs24\cf0\b Breakpoints\plain\f0\fs24\cf0 \tab \tab - A code address, routine, or property routine can be given-control \plain\f0\fs24\cf0 is then passed to the debugger on encountering a breakpoint\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f0\fs24\cf0\b Object Tree\plain\f0\fs24\cf0 \tab \tab - At any point, the entire object tree (or just a branch of it) may be \plain\f0\fs24\cf0 displayed\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f0\fs24\cf0\b Moving Objects\plain\f0\fs24\cf0 \tab - It is possible to dynamically move objects around the object tree\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f0\fs24\cf0\b Runtime Warnings\tab \plain\f0\fs24\cf0 - Optional runtime warnings instruct the debugger to alert the user \plain\f0\fs24\cf0 to common causes of problem code which, while syntactically \plain\f0\fs24\cf0 valid and therefore acceptable to the compiler, is in context \plain\f0\fs24\cf0 probably not what was intended.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par {\tx720\tx1440 \qj\li3600\fi-3600\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \tab \plain\f0\fs24\cf0\b Setup\plain\f0\fs24\cf0 \tab \tab \tab - Allowing changes in color scheme (if applicable), printer, etc.\par }\qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 \par \qj\li0\fi0\ri0\sb0\sl\sa0 \plain\f0\fs24\cf0 }} } <end node> 5P9i0s8y19Z