Annotation of 42BSD/games/ddl/doc/doc.ms, revision 1.1

1.1     ! root        1: .RS
        !             2: .ds CF "\(co 1981 UCLA Computer Club
        !             3: .TL
        !             4: A Brief Description of UCLA
        !             5: Dungeon Definition Language (DDL)
        !             6: .AU
        !             7: Bruce Adler
        !             8: Chris Kostanick
        !             9: Michael Stein
        !            10: Michael Urban
        !            11: .AI
        !            12: University of California
        !            13: Los Angeles, CA 90024
        !            14: .AB
        !            15: This document describes Dungeon Definition Language, a meta-adventure
        !            16: specification language.  It is designed primarily for the programmer
        !            17: who wishes to create a 
        !            18: \s-2DDL\s+2 
        !            19: "world", and secondarily for the programmer
        !            20: attempting to implement 
        !            21: \s-2DDL\s+2 
        !            22: on a new host machine.  
        !            23: .AE
        !            24: .bp 1
        !            25: .ds CF "\(co 1981 UCLA Computer Club
        !            26: .NH 
        !            27: Introduction.
        !            28: .PP
        !            29: \s-2DDL\s+2
        !            30: is a system of notation for the specification of "worlds".  Using
        !            31: \s-2DDL\s+2,
        !            32: a programmer may create Objects, Verbs to act upon those objects,
        !            33: and Routines to describe the behavior of Objects and Verbs.  The user
        !            34: of a 
        !            35: \s-2DDL\s+2
        !            36: program, known as the Player, types these verbs and the names of
        !            37: objects to manipulate those objects at a high level.  Thus, a Player's
        !            38: dialogue with a 
        !            39: \s-2DDL\s+2
        !            40: program will appear something like:
        !            41: .IP
        !            42: .DS
        !            43: .SM
        !            44: 
        !            45:   You are standing outside the north entrance of a large
        !            46:   brick building.  Inscribed above the doorway, appear the
        !            47:   text: 'AARDVARK'S MUSEUM -- GATEWAY TO ADVENTURELAND'.
        !            48:   There is a coil of rope here.
        !            49:   There is a shovel here.
        !            50:   There is a carbide-flame lamp here.
        !            51:   There is a copy of a newspaper here.
        !            52:  >take rope
        !            53:   OK
        !            54:  >south
        !            55:   You are in a large rotunda of an old museum.  Doors lead
        !            56:   to the north, south, east, and west, and a narrow stairway
        !            57:   in the north-east corner of the room leads down.
        !            58:   There is a ball-point pen here.
        !            59:   There is a slip of paper here.
        !            60:  >take paper
        !            61:   OK
        !            62:  >take pen
        !            63:   OK
        !            64:  >e
        !            65:   You are in a dimly lit room containing an empty display case.
        !            66:   A portion of a vandalized sign above the case reads:
        !            67:   'ARTIFACTS OF ANCIENT INDIA -- Several of these items,
        !            68:   including the sacred rhinoceros horn, the deadly ...'.
        !            69:   The rest of the sign is unreadable.
        !            70:   To the west, you can look through a large door into the rotunda
        !            71:   of the museum. On the east wall of the hall there is an outline
        !            72:   of an arch.
        !            73:  >sign paper
        !            74:   In a blinding flash of light, a stone archway appears in the east wall!
        !            75: .NL
        !            76: .DE
        !            77: .PP
        !            78: This sort of behavior will be familiar to users of the celebrated programs,
        !            79: .I "Adventure" 
        !            80: and 
        !            81: .I "Dungeon" 
        !            82: (AKA 
        !            83: .I "Zork"
        !            84: ), of Crowther, Woods, Anderson
        !            85: and Blank.
        !            86: While not as sophisticated in many ways as some of these programs,
        !            87: the primary function of 
        !            88: \s-2DDL\s+2 
        !            89: is to allow a number of interesting
        !            90: puzzles and games to be exchanged among users of disparate machines
        !            91: with a minimum of portability problem.
        !            92: .NH
        !            93: General Flow of Execution.
        !            94: .PP
        !            95: When the 
        !            96: \s-2DDL\s+2
        !            97: program begins execution, a special routine which has been
        !            98: coded by the 
        !            99: \s-2DDL\s+2
        !           100: programmer is executed.  This routine must be given the
        !           101: name START.  START will normally initialize demons and set certain initial
        !           102: values.  Execution then proceeds in the cyclic fashion described below.
        !           103: .PP
        !           104: When a 
        !           105: \s-2DDL\s+2
        !           106: scenario is running,
        !           107: execution proceeds in a series of cycles known as "turns".  On
        !           108: each turn, a number of actions takes place.
        !           109: .IP "(1) Demons: " 10
        !           110: Each of the Demon routines currently active is run in order
        !           111: of activation.
        !           112: Demon routines are specified and activated by the 
        !           113: \s-2DDL\s+2
        !           114: program by executing
        !           115: the $sdem function.
        !           116: .B Note: 
        !           117: The normal action of Looking (executing description routines) which
        !           118: one expects to occur on each turn must be coded by the 
        !           119: \s-2DDL\s+2
        !           120: programmer
        !           121: as a Demon.
        !           122: .IP "(2) Fuses: " 10
        !           123: All active Fuse routines are checked to see if they
        !           124: are to be executed on this turn.  Those Fuses which have thus "burned down"
        !           125: are then executed (in reverse order of activation) and removed.
        !           126: .IP "(3) Parse: " 10
        !           127: The player types a line of input,
        !           128: and an attempt is made to resolve that input into a Verb, an Indirect Object,
        !           129: and a Direct Object, by means of attendant Prepositions, Articles,
        !           130: and Adjectives.  Unambiguous abbreviations for words are recognized
        !           131: by the parser.
        !           132: If an input Noun is ambiguous (because of two objects distinguished by only
        !           133: adjectives), 
        !           134: \s-2DDL\s+2
        !           135: routines called DWIMD and DWIMI are used to disambiguate
        !           136: direct and indirect objects respectively.  DWIMD and DWIMI each return
        !           137: nonzero if the direct or indirect object is "possibly the one he means"
        !           138: (e.g. if it is in the room, etc)); only if exactly one such object
        !           139: exists with the given Noun name can the parse complete successfuly.
        !           140: any of the input components are found to be missing, the value zero is
        !           141: assumed for that object (and no associated routines are executed).
        !           142: .PP
        !           143: If a syntax error or unknown word is detected, a hopefully informative
        !           144: error message is printed.  In addition, unknown words encountered
        !           145: in the input
        !           146: may be saved in a file for perusal by the DDL programmer.
        !           147: .PP
        !           148: The direct object may be enclosed in double-quotes by the Player.
        !           149: Such a direct object is returned as a String to the program.  Strings
        !           150: may be detected by the program as having "numeric values" less than
        !           151: zero.  Strings may be operated on with the $eqst, $subs, and $leng
        !           152: functions, and the $say procedure.
        !           153: .IP "(4) Pre-action: " 10
        !           154: The PREACT routine (if any)
        !           155: that the 
        !           156: \s-2DDL\s+2
        !           157: programmer has associated
        !           158: with the input Verb is executed.  These routines typically will check
        !           159: for the availability of the object in question, and so on.
        !           160: .IP "(5) Indirect Object: " 10
        !           161: The ACTION routine associated with the Indirect Object
        !           162: that the Player typed (if any) is executed.
        !           163: .IP "(6) Direct Object: " 10
        !           164: The ACTION routine associated with the Direct Object
        !           165: that the Player typed (if any) is executed.
        !           166: For most specialized actions (like "rub lamp") the particular code
        !           167: is frequently attached to the object.
        !           168: If the Direct Object is a String, the ACTION routine (if any)
        !           169: associated with the object STRING (if such is defined by the
        !           170: programmer) is executed.
        !           171: .IP "(7) Room Action: " 10
        !           172: The ACTION routine associated with the room the Player is
        !           173: in (actually, the LOC of .ME) is executed.  Normally, this will be
        !           174: a "transition" routine which will check if the verb is "north", and so on.
        !           175: .B Note:
        !           176: This is the ONLY aspect of "built-in" action which depends in ANY
        !           177: WAY upon the actual state of variables within the "dungeon" itself.
        !           178: .IP "(8)  Verb: " 10
        !           179: The ACTION routine associated with the input Verb (if any)
        !           180: is executed.  ACTION routines for most Verbs will often be
        !           181: default routines.  For example the Action routine for the Verb "rub"
        !           182: might print "Rubbing that object is not useful."
        !           183: .LP
        !           184: If any of these routines terminates with an ($exit 1), the remainder of
        !           185: the current turn is skipped.  Furthermore, the 
        !           186: \s-2DDL\s+2
        !           187: programmer is responsible
        !           188: for incrementing the Turn Counter (normally in a Demon routine) if Fuses
        !           189: are to be used.
        !           190: .NH
        !           191: Data types.
        !           192: .NH 2
        !           193: Objects.
        !           194: .PP
        !           195: Player machinations are in terms of Objects.  All Objects are nodes in
        !           196: a tree, the root node of which is labelled ".ALL".  A second special
        !           197: object, ".ME" is considered to represent the Player.  Objects will
        !           198: normally be treated either as rooms or portable-type objects, but 
        !           199: \s-2DDL\s+2
        !           200: itself
        !           201: does not distinguish these functions; all objects are stored and treated
        !           202: uniformly.  It is therefore possible, in principal, to write a 
        !           203: \s-2DDL\s+2
        !           204: scenario in which the Player may pick up a room, carry it, and
        !           205: later enter it.  Each object possesses the following attributes.  If
        !           206: any of these is not specified, it is given the default value of zero.
        !           207: .IP "LOC: " 6
        !           208: The object ID of the parent (location) of the object.
        !           209: .IP "CONT: " 6
        !           210: The object ID of the first child (contents) of the object.
        !           211: .IP "LINK: " 6
        !           212: The object ID of the next sibling (others in the same place) of the
        !           213: object
        !           214: .IP "ADJ: " 6
        !           215: The Adjective ID which uniquely distinguishes this object from others
        !           216: of the same name (if any).
        !           217: .IP "OTHERS: " 6
        !           218: The Object ID of another object with the same name as this object,
        !           219: though with a different adjective.
        !           220: .IP "NAME: " 6
        !           221: The unqualified Noun by which the Player names the object.
        !           222: .IP "PROPS: " 6
        !           223: Up to
        !           224: 25
        !           225: numeric values can be arbitrarily associated with an object by the 
        !           226: \s-2DDL\s+2
        !           227: programmer.  Properties
        !           228: 1-16
        !           229: may only possess the values 0 or 1.  The others may range in value from
        !           230: -32768 to +32767.
        !           231: The last three of these properties have special usages.  Their indices
        !           232: are predefined by the compiler.
        !           233: .IP "LDESC (23)" 6
        !           234: The Routine ID of a "Long Description" routine
        !           235: .IP "SDESC (24)" 6
        !           236: The Routine ID of a "Short Description" routine
        !           237: .IP "ACTION (25)" 6
        !           238: The Routine ID of a "Action" routine, to be called if the Player
        !           239: either attempts to do something with that object (specifies it as a
        !           240: Direct or Indirect Object), or while inside that object.
        !           241: .NH 2
        !           242: Verbs.
        !           243: .PP
        !           244: The "commands" typed by the Player must name Verbs which have been
        !           245: defined by the 
        !           246: \s-2DDL\s+2
        !           247: programmer.  Each Verb is associated with two Routine
        !           248: ID's:
        !           249: .IP "PREACT: " 6
        !           250: The Routine ID of a routine to execute when the verb has been
        !           251: recognized and the remaining input identified, but before any "Action"
        !           252: routines associated with the Objects in that input have been executed.
        !           253: For example, the PREACT routine of "take" might check to see if
        !           254: the direct object is in the room.
        !           255: .IP "ACTION: " 6
        !           256: The Routine ID of a routine to execute after all input object action
        !           257: routines have been called.
        !           258: Our experience has been that such routines end up being "default" routines
        !           259: that typically only say things like "Rubbing that object does nothing."
        !           260: .NH 2
        !           261: Strings.
        !           262: .PP
        !           263: Simple strings may be defined by the 
        !           264: \s-2DDL\s+2
        !           265: programmer to be printed.  Strings
        !           266: may be up to 255 bytes in length, delimited by double-quote marks.
        !           267: Carriage returns may be embedded in strings freely, or the sequence \\n
        !           268: may be used to represent a carriage return at any point.
        !           269: .NH 2
        !           270: Numbers.
        !           271: .PP
        !           272: \s-2DDL\s+2
        !           273: programers may only specify nonnegative integers up to 32767.
        !           274: However, a routine may compute any integer value from -32768 to +32767.
        !           275: .NH 2
        !           276: Adjectives.
        !           277: .PP
        !           278: Adjectives possess no data, but are uniquely numbered by the 
        !           279: \s-2DDL\s+2
        !           280: compiler
        !           281: so as to have unique internal IDs (which begin at the value 1).
        !           282: Adjectives are normally only used to distinguish various objects which
        !           283: have the same Noun name (eg the "red book" and the "blue book").
        !           284: .NH 2
        !           285: Routines
        !           286: .PP
        !           287: Routines represent the actual logical behavior of the Dungeon.  A routine
        !           288: consists of one or more calls to builtin or user-defined functions.
        !           289: Internally, a routine may be stored as an interpretive program for a
        !           290: very simple stack machine.  The internal representation is up to the
        !           291: implementer.
        !           292: Routines may call one another, and a single
        !           293: routine may call itself recursively.
        !           294: .NH 2
        !           295: Globals
        !           296: .PP
        !           297: 50
        !           298: globals (numbered
        !           299: 0-49)
        !           300: are available to the 
        !           301: \s-2DDL\s+2
        !           302: programmer and may contain any integer value.  They are named by
        !           303: numeric constants.  Such constants are conveniently assigned
        !           304: symbolic names by means of the VAR declaration described below.
        !           305: The last three globals are set each turn to contain the Indirect
        !           306: Object, Direct Object, and Verb typed by the player.  The constants
        !           307: Iobj, Dobj, and Verb are predefined by the compiler to refer to those
        !           308: globals.
        !           309: .NH
        !           310: \s-2DDL\s+2
        !           311: Programs
        !           312: .PP
        !           313: .B Note:
        !           314: In the syntactic descriptions below, metavariables such as
        !           315: .I varname
        !           316: refer to user-defined identifiers.  These identifiers consist
        !           317: of a string of alphameric characters of arbitrary length.
        !           318: A 
        !           319: \s-2DDL\s+2
        !           320: specification consists of one or more 
        !           321: \s-2DDL\s+2 
        !           322: statements, each terminated
        !           323: by a semicolon.  The following statements exist:
        !           324: .sp
        !           325: .IP "VAR \fIvarname, varname\fR,..." 8
        !           326: .PP
        !           327: Declares each 
        !           328: .I varname
        !           329: as a new symbol.  The symbol
        !           330: is defined as a constant with a value different from each
        !           331: previously declared <varname>.  <varname> must not
        !           332: be previously declared.
        !           333: .PP
        !           334: .B "Example:  "
        !           335: VAR strength, intell, wisdom;
        !           336: .sp
        !           337: .IP "VERB \fIverbname, verbname\fR,..." 8
        !           338: .PP
        !           339: Declares each 
        !           340: .I verbname 
        !           341: as a new verb.  
        !           342: .I verbname
        !           343: must
        !           344: not be previously assigned.
        !           345: .PP
        !           346: .B "Example:  "
        !           347: VERB north,south,east,west;
        !           348: .sp
        !           349: .IP "ADJEC \fIadjectivename, adjectivename\fR,..." 8
        !           350: .PP
        !           351: Creates a new adjective with name 
        !           352: .I adjectivename,
        !           353: which must not be previously assigned.
        !           354: .PP
        !           355: .B Example: 
        !           356: ADJEC red,green,blue;
        !           357: .sp
        !           358: .IP "NOUN \fInoun\fR[(\fIcontainer\fR)]" 8
        !           359: .PP
        !           360: Creates a new object named 
        !           361: .I noun
        !           362: whose
        !           363: initial location is 
        !           364: .I 
        !           365: container.  noun 
        !           366: .R
        !           367: may not
        !           368: be previously assigned; 
        !           369: .I container
        !           370: must be of
        !           371: type NOUN.  If the (\fIcontainer\fR) clause is omitted,
        !           372: the new object is placed in object .ALL .
        !           373: the 
        !           374: .I noun
        !           375: may actually be a adjective-noun pair.
        !           376: .PP
        !           377: .B Examples: 
        !           378: .DS
        !           379: NOUN red book, blue book;
        !           380: NOUN worm(red book);
        !           381: .DE
        !           382: .sp
        !           383: .IP "ROUTINE \fIroutinename, routinename, ...\fR" 8
        !           384: Declares that the \fIroutinename\fRs listed will be used
        !           385: for Routines later in the program.  This is to allow \s-2DDL\s+2,
        !           386: which is intended to be easily implementable, to deal with
        !           387: recursive routines (which have not yet been declared at the
        !           388: time of their definitions).  Only routines which are used
        !           389: before being defined need to be declared with this statement.
        !           390: .sp
        !           391: .IP "ARTICLE \fIarticle, article,\fR..." 8
        !           392: .PP
        !           393: Creates each \fIarticle\fR as an article.  Articles are recognized
        !           394: by the run-time parser, but are basically "noise" words.
        !           395: .PP
        !           396: .B Example: 
        !           397: ARTICLE the;
        !           398: .IP "PREP \fIprep, prep\fR,..." 8
        !           399: .PP
        !           400: Creates each 
        !           401: .I prep
        !           402: as a preposition.  Prepositions are basically
        !           403: noise words, but are used by the parser to recognize the presence of
        !           404: indirect objects in the Player's input.
        !           405: .PP
        !           406: .B Example: 
        !           407: PREP into,on,using,to,at;
        !           408: .sp
        !           409: .IP "\fInoun\fR (\fInumexp\fR) = \fIexp2\fR" 8
        !           410: .PP
        !           411: Property \fInumexp\fR of \fInoun\fR is set to the
        !           412: value of \fIexp2\fR.
        !           413: .I exp2
        !           414: may be a number, a string, a routine name, or a new routine;
        !           415: the numeric value or ID of
        !           416: .I exp2
        !           417: is always placed into the specified property.
        !           418: .PP
        !           419: .B Examples: 
        !           420: .DS
        !           421: gem(11)=0;             { 11 == Luminous }
        !           422: gem(LDESC) = ($say "There is a bright gem here!");
        !           423: gem(SDESC) = ($say "a bright gem");
        !           424: gem(ACTION) = GmAct;
        !           425: .DE
        !           426: .sp
        !           427: .IP "\fIverb\fR (PREACT | ACTION) = \fIroutine\fR" 8
        !           428: .PP
        !           429: Assigns \fIroutine\fR as the pre-object action or default action of
        !           430: the given \fIverb\fR.  The routine may be a predefined routine name or
        !           431: an actual routine.
        !           432: .PP
        !           433: .B Example: 
        !           434: .DS
        !           435: rub(ACTION) =  ($say "Rubbing ")
        !           436:                ($sdisc ($dobj))
        !           437:                ($say " seems silly.\\n");
        !           438: .DE
        !           439: .sp
        !           440: .IP "\fIname\fR = \fInumber\fR" 8
        !           441: .PP
        !           442: Assigns \fIname\fR as equivalent to \fInumber\fR.  \fIname\fR
        !           443: must not be previously assigned.
        !           444: .PP
        !           445: .B Example: 
        !           446: OPEN=11; TRUE=1;
        !           447: .IP "\fIname1\fR = \fIname2\fR" 8
        !           448: .PP
        !           449: Assigns 
        !           450: .I name1
        !           451: as a synonym for 
        !           452: .I name2.
        !           453: .PP
        !           454: .B Example: 
        !           455: n=north;s=south;se=southeast;
        !           456: .IP "(\fInumexp\fR) = \fInumexp2\fR" 8
        !           457: .PP
        !           458: Assigns the global (or VAR) named by \fInumexp\fR to the value
        !           459: given by \fInumexp2\fR.
        !           460: .PP
        !           461: .B Example: 
        !           462: (Maxpt)=450;
        !           463: .IP "\fIname\fR = "
        !           464: "\fIstring\fR"
        !           465: .PP
        !           466: Assigns 
        !           467: .I name
        !           468: as equivalent to "\fIstring\fR".
        !           469: .B Note:
        !           470: This seems to be rarely, if ever, used.  Usually it's just
        !           471: as easy to assign a routine to Say the given string.
        !           472: However, there are other string functions, such as $eqst
        !           473: and $substr, for which it may be useful to predefine strings.
        !           474: .PP
        !           475: .B Example: 
        !           476: err="Nothing happens.\\n";
        !           477: MagicWord = "ShaZam";
        !           478: .IP "\fIname\fR = \fIroutine\fR" 8
        !           479: .PP
        !           480: Assigns 
        !           481: .I name
        !           482: as equivalent to 
        !           483: .I routine
        !           484: .PP
        !           485: .B Example: 
        !           486: sayer=($say "Nothing happens.\\n");
        !           487: .IP "INCLUDE ""\fIfilename\fR""" 8
        !           488: .PP
        !           489: .B
        !           490: (\s-2UNIX\s+2 implementation only)
        !           491: .R
        !           492: Causes input to be read from the named file.
        !           493: .RE
        !           494: .NH 
        !           495: Routines
        !           496: .PP
        !           497: A routine is a list of one or more "forms".  Forms are of three types:
        !           498: .RS
        !           499: .IP "(\fIform1\fB : \fIform, form\fR ... [: \fIelseform, elseform\fR ...])" 8
        !           500: .PP
        !           501: Conditional expression.  If 
        !           502: .I form1
        !           503: evaluates to
        !           504: nonzero, the subsequent \fIform\fRs are executed in
        !           505: sequence.  Otherwise, the list of \fIelseform\fRs is executed in sequence.
        !           506: .B Note:
        !           507: The second colon, and the subsequent \fIelseform\fRs, are optional.
        !           508: .PP
        !           509: .B Example: 
        !           510: .PP
        !           511: .DS
        !           512: (TRUE : ($say "Always do me") : ($say "Never do me"))
        !           513: .DE
        !           514: .IP "(WHILE \fIform1\fR : \fIform, form ... \fR)" 8
        !           515: .PP
        !           516: Simple looping construct.  If \fIform1\fR evaluates
        !           517: to nonzero, the subsequent \fIform\fRs are evaluated
        !           518: in sequence.  This process is repeated until such
        !           519: a time as \fIform1\fR is found to evaluate to zero.
        !           520: .PP
        !           521: .B Example:
        !           522: .PP
        !           523: .DS
        !           524: (WHILE ($eq ($loc .ME) JewlRoom) : (TRYmv .ME Prison))
        !           525: .DE
        !           526: .IP "(\fIfunction arg1 arg2\fR ...)" 8
        !           527: .PP
        !           528: Function call (note that all builtin functions
        !           529: begin with the character $).  The \fIfunction\fR is applied
        !           530: to the \fIarg\fRs.  An argument may be a number,
        !           531: string, declared name, or another form.  However, the function must
        !           532: be a simple identifier, or a form which evaluates to a function
        !           533: identifier (
        !           534: .I 
        !           535: e.g.
        !           536: .R
        !           537: ($ldisc xxx)).
        !           538: In addition, three special argument types are recognized:
        !           539: .PP
        !           540: An argument such as "@\fInumber\fR" is interpreted as 
        !           541: "contents of global \fInumber\fR".
        !           542: .PP
        !           543: An argument such as "%\fInumber\R" is interpreted as "the value of the \fInumber\R
        !           544: argument to this function".
        !           545: .PP
        !           546: An argument such as "[\fIadj noun\fR]" must be used if the programmer wishes to
        !           547: refer to an object with an associated adjective.
        !           548: .RE
        !           549: .PP
        !           550: .B Examples:
        !           551: .DS
        !           552: .SM
        !           553: VERB north,south,east,west,ne,nw,se,sw,up,down;
        !           554: n=north; s=south; e=east; w=west; u=up; d=down;
        !           555: 
        !           556: NOUN rm001,rm002,rm003,rm004,rm005,rm006;
        !           557: NOUN .ME(rm001);
        !           558: 
        !           559: ADJECTIVE red,blue;
        !           560: NOUN red ball(rm002),blue ball(rm003);
        !           561: 
        !           562: red ball(LDESC) = ($say "There is a red ball here.");
        !           563: red ball(SDESC) = ($say "Red ball.");
        !           564: 
        !           565: VAR score;
        !           566: (score) = 0;
        !           567: 
        !           568: TAKBT = 16;
        !           569: TRUE = 1; FALSE=0;
        !           570: red ball(TAKBT) = TRUE;
        !           571: 
        !           572: ROUTINE takeR;                 { Declared later }
        !           573: 
        !           574: VERB take;
        !           575: take(ACTION) =         ( ($and ($prop ($dobj) TAKBT)
        !           576:                        ($eq ($loc .ME)($loc ($dobj)))):
        !           577:                                (takeR ($dobj))
        !           578:                );
        !           579: takeR =        ($move %1 .ME)
        !           580:                (($eq %1 [red ball]):
        !           581:                        ($say "The ball is glowing!")
        !           582:                        ($setg score ($plus 10 @score)));
        !           583: .NL
        !           584: .DE

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.