|
|
1.1 ! root 1: .NH ! 2: Built-in Functions ! 3: .PP ! 4: The following functions are built-in functions available to the ! 5: \s-2DDL\s+2 ! 6: programmer. These functions are the heart of the ! 7: \s-2DDL\s+2 ! 8: system and are ! 9: the means whereby the ! 10: \s-2DDL\s+2 ! 11: routines manipulate all system data. Thus, ! 12: these functions completely describe the facilities of the ! 13: \s-2DDL\s+2 ! 14: system. ! 15: .NH 2 ! 16: Functions on objects ! 17: .IP "\fB$loc \fR" 8 ! 18: ($loc \fIobj\fR) \(-> The container of \fIobj\fR. ! 19: .IP "\fB$cont \fR" 8 ! 20: ($cont \fIobj\fR) \(-> First item contained in \fIobj\fR. ! 21: .IP "\fB$link \fR" 8 ! 22: ($link \fIobj\fR) \(-> The next object in the same node as \fIobj\fR. ! 23: .IP "\fB$ldisc \fR" 8 ! 24: ($ldisc \fIobj\fR) \(-> The routine ID for the long description of \fIobj\fR. ! 25: .IP "\fB$sdisc \fR" 8 ! 26: ($sdisc \fIobj\fR) \(-> The routine ID for the short description of \fIobj\fR. ! 27: .IP "\fB$rtn \fR" 8 ! 28: ($rtn \fIobj\fR) \(-> The ACTION routine for \fIobj\fR. ! 29: .IP "\fB$prop \fR" 8 ! 30: ($prop \fIobj\fR \fIpropnum\fR) \(-> returns the value of the \fIpropnum\fR'th property ! 31: of \fIobj\fR. ! 32: .NH 2 ! 33: Arithmetic Funcions ! 34: .IP "\fB$plus \fR" 8 ! 35: ($plus \fIarg1\fR \fIarg2\fR) \(-> \fIarg1\fR+\fIarg2\fR ! 36: .IP "\fB$minus \fR" 8 ! 37: ($minus \fIarg1\fR \fIarg2\fR) \(-> \fIarg1\fR-\fIarg2\fR ! 38: .IP "\fB$times \fR" 8 ! 39: ($times \fIarg1\fR \fIarg2\fR) \(-> \fIarg1\fR*\fIarg2\fR ! 40: .IP "\fB$quotient \fR" 8 ! 41: ($quotient \fInum den\fR) \(-> [\fInum\fR/\fIden\fR] ! 42: .IP "\fB$remainder \fR" 8 ! 43: ($remainder \fInum den\fR) \(-> \fInum\fB mod \fIden\fR ! 44: .IP "\fB$rand \fR" 8 ! 45: ($rand \fIarg\fR) \(-> Random integer between 1 and \fIarg\fR inclusive ! 46: .NH 2 ! 47: Boolean Functions ! 48: .IP "\fB$and \fR" 8 ! 49: ($and \fIa b\fR) \(-> \fIa\fB (bitwise AND) \fIb\fR ! 50: .IP "\fB$or \fR" 8 ! 51: ($or \fIa b\fR) \(-> \fIa\fB (bitwise OR) \fIb\fR ! 52: .IP "\fB$not \fR" 8 ! 53: ($not \fIx\fR) \(-> \s-2IF\s+2 \fIx\fR nonzero \s-2THEN\s+2 zero \s-2ELSE\s+2 one. ! 54: .IP "\fB$yorn \fR" 8 ! 55: ($yorn) \(-> Waits for the Player to type a line of input. Returns ! 56: one if the Player types "yes" or "y" and zero otherwise. ! 57: .IP "\fB$pct \fR" 8 ! 58: ($pct \fIprob\fR) \(-> Returns one, \fIprob\fR% of the time, zero otherwise. ! 59: .IP "\fB$eq \fR" 8 ! 60: ($eq \fIarg1\fR \fIarg2\fR) \(-> 1 if \fIarg1\fR equals \fIarg2\fR, zero otherwise. ! 61: .IP "\fB$ne \fR" 8 ! 62: ($ne \fIarg1\fR \fIarg2\fR) \(-> IF \fIarg1\fR ~= \fIarg2\fR THEN one ELSE zero. ! 63: .IP "\fB$lt \fR" 8 ! 64: ($lt \fIarg1\fR \fIarg2\fR) \(-> 1 if \fIarg1\fR < \fIarg2\fR, zero otherwise. ! 65: .IP "\fB$gt \fR" 8 ! 66: ($gt \fIarg1\fR \fIarg2\fR) \(-> 1 if \fIarg1\fR > \fIarg2\fR, zero otherwise. ! 67: .IP "\fB$le \fR" 8 ! 68: ($le \fIarg1\fR \fIarg2\fR) \(-> 1 if \fIarg1\fR <= \fIarg2\fR, zero otherwise. ! 69: .IP "\fB$ge \fR" 8 ! 70: ($ge \fIarg1\fR \fIarg2\fR) \(-> 1 if \fIarg1\fR >= \fIarg2\fR, zero otherwise. ! 71: .NH 2 ! 72: Builtin Procedures (no return value) ! 73: .IP "\fB$setg \fR" 8 ! 74: ($setg \fIglobalnumber value\fR) \(-> No return value. Sets the ! 75: contents of global #\fIglobalnumber\fR to \fIvalue\fR. ! 76: .IP "\fB$setp \fR" 8 ! 77: ($setp \fIobj propnum value\fR) \(-> No return value. Sets the \fIpropnum\fR'th ! 78: property of \fIobj\fR to \fIvalue\fR. Note that properties 1-16 may only contain 0 or 1. ! 79: .IP "\fB$move \fR" 8 ! 80: ($move \fIobj dest\fR) \(-> No return value. Causes \fIobj\fR to be placed ! 81: inside \fIdest\fR, and adjusts pointers accordingly. \fBDanger\fR: No checking is ! 82: performed to verify that $move is not being used to violate the tree structure ! 83: of the object list (eg ($move obj obj)). ! 84: Bad results are likely if this occurs. ! 85: .IP "\fB$say \fR" 8 ! 86: ($say \fImsg\fR) \(-> No return value. Types \fImsg\fR. ! 87: .IP "\fB$name \fR" 8 ! 88: ($name \fIobj\fR) \(-> No return value. Types the (5-letter) name of \fIobj\fR. ! 89: .IP "\fB$num \fR" 8 ! 90: ($num \fIx\fR) \(-> No return value. Types the number \fIx\fR. ! 91: .IP "\fB$exit \fR" 8 ! 92: ($exit \fIn\fR) \(-> Leave present routine. ($exit 1) causes the current ! 93: "turn" to be prematurely terminated and the next turn to be initiated ! 94: at the Demon phase. ($exit 0) returns to the driver to begin the next phase. ! 95: .IP "\fB$rtrn \fR" 8 ! 96: ($rtrn \fIn\fR) \(-> Exits to the calling routine, returning value '\fIn\fR' TO ! 97: THE CALLING FUNCTION. ! 98: .IP "\fB$spec \fR" 8 ! 99: ($spec \fIcode arg1 arg2 arg3 arg4\fR) \(-> Performs a special function as ! 100: follows: ! 101: .TS ! 102: center box; ! 103: c | c. ! 104: code function ! 105: = ! 106: 3 Terminate this run of DDL ! 107: _ ! 108: 4 Save a game ! 109: _ ! 110: 5 Restore a game ! 111: _ ! 112: 7 Preserve unknown words in file \fIarg1\fR ! 113: .TE ! 114: .PP ! 115: Functions 4 and 5 prompt for a file name in which the saved game is ! 116: kept. Function 7 causes any unknown words encountered by the parser ! 117: to be preserved in a file for later perusal by the ! 118: \s-2DDL\s+2 ! 119: programmer. It ! 120: would be used to learn about things players have tried unsuccessfully ! 121: that should be dealt with. The file must already exist, and must ! 122: be specified as a string. ! 123: .PP ! 124: ALL arguments must be specified, even if zero. ! 125: .NH 2 ! 126: Global-value functions ! 127: .IP "\fB$glob \fR" 8 ! 128: ($glob \fIn\fR) \(-> Value of global \fIn\fR. Equivalent to @\fIn\fR. ! 129: .IP "\fB$verb \fR" 8 ! 130: ($verb) \(-> The ID of the verb returned by the parser (zero if none). ! 131: Typically used in comparisons, it is equivalent to @Verb. ! 132: .IP "\fB$dobj \fR" 8 ! 133: ($dobj) \(-> The ID of the direct object returned by the parser ! 134: (zero if none). Equivalent to @Dobj. ! 135: .IP "\fB$iobj \fR" 8 ! 136: ($dobj) \(-> The ID of the indirect object returned by the parser ! 137: (zero if none). Equivalent to @Iobj. ! 138: .NH 2 ! 139: Transition Procedures ! 140: .IP "\fB$setv \fR" 8 ! 141: ($setv \fIv1 v2 v3 v4 v5 v6 v7 v8 v9 v10\fR) \(-> sets the values in ! 142: the internal vector VECVERB to the values \fIv1\fR thru \fIv10\fR. These are ! 143: used by routines $hit and $miss. ! 144: .IP "\fB$hit \fR" 8 ! 145: ($hit \fImover d1 d2 d3 d4 d5 d6 d7 d8 d9 d10\fR) \(-> No return value. ! 146: Compares ($verb) with the values in builtin vector VECVERB. When ($verb) ! 147: is found to match the nth entry in VECVERB, ($move \fImover d[n]\fR) is executed. ! 148: Note that \fImover\fR is what gets moved to d[n]; this argument is naturally ! 149: absent from $setv and $miss. ! 150: .IP "\fB$miss \fR" 8 ! 151: ($miss \fIr1 r2 r3 r4 r5 r6 r7 r8 r9 r10\fR) \(-> no return value. ! 152: Compares ($verb) to VECVERB as $hit does. When a match to the nth ! 153: entry in VECVERB is found, routine \fIr\fR[n] is called. An attempt to ! 154: call routine 0 does nothing. ! 155: .NH 2 ! 156: String Functions ! 157: .PP ! 158: There are two varieties of strings. Constant strings defined ! 159: by the DDL programmer are permanent, and have a numeric "value" ! 160: greater than zero (which is in fact a table index). Strings ! 161: typed by the Player as a direct object, and strings produced ! 162: by the functions $eqst and $read are temporary, have a numeric ! 163: "value" less than zero (which allows the programmer to determine ! 164: if the direct object is in fact a string), and are purged by ! 165: having their index values recycled at the beginning of every turn. ! 166: No more than 200 such strings may be generated on a given turn. ! 167: .IP "\fB$eqst\fR" 8 ! 168: ($eqst \fIarg1 arg2\fR) \)-> 1 iff the strings specified by the ! 169: two \fIarg\fRs are equal, zero otherwise. ! 170: .IP "\fB$subs\fR" 8 ! 171: ($subs \fIstr index length\fR) \)-> a string consisting of the ! 172: substring of \fIstr\fR, starting at character \fIindex\fR ! 173: (with an origin of Zero for the beginning of the string), for ! 174: the specified \fIlength\fR. A \fIlength\fR of zero causes ! 175: all the remaining characters starting at \fIindex\fR to be ! 176: taken. ! 177: .IP "\fB$leng\fR" 8 ! 178: ($leng \fIstr\fR) \)-> The length of string \fIstr\fR. ! 179: .IP "\fB$read\fR" 8 ! 180: ($read) \)-> Causes \s-2DDL\s+2 to pause and wait for input from ! 181: the Player. Returns the string the player typed, without the ! 182: trailing newline. ! 183: .NH 2 ! 184: Demons and Fuses ! 185: .IP "\fB$sdem \fR" 8 ! 186: ($sdem n) \(-> Activates routine n as a Demon, to be executed every ! 187: turn. At least one such Demon should exist, to Look at the Player's ! 188: current location, and to increment the turn counter ! 189: .IP "\fB$ddem \fR" 8 ! 190: ($ddem n) \(-> Removes routine n from the active Demon list. For ! 191: example, ($ddem Kount) undoes the action of ($sdem Kount). ! 192: .IP "\fB$sfus \fR" 8 ! 193: ($sfus rout n) \(-> Causes routine "rout" to be executed (one ! 194: time only) after n turns. Such a routine is called a Fuse. ! 195: .IP "\fB$dfus \fR" 8 ! 196: ($dfus rout) \(-> Causes routine rout to be taken off the ! 197: pending fuse list. ! 198: .IP "\fB$itun \fR" 8 ! 199: ($itun) \(-> Increments the turn counter. This is a builtin function ! 200: because fuses depend upon the turn counter. The ! 201: \s-2DDL\s+2 ! 202: programmer has the ! 203: option to "slow time" by refraining from incrementing the turn counter. ! 204: .IP "\fB$gtun \fR" 8 ! 205: ($gtun) \(-> Returns the current turn counter value.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.