This file contains information on what's changed since the DDL document people have seen. Date: 25 Apr 1980 1546-PST (Friday) From: mike at UCLA Computer Science VAX (Mike Urban) Subject: ATTN: DDL Implementors To: cc (UCLA Computer Club) I would like the following changes made in DDL: 1) Friendlier Parsing. You should be able to say give troll the knife and get away with it (with "knife" as Dobj and "troll" as Iobj). You should get messages like "I don't know how to tke" in the event of a bad verb, and "I think 'north' is a verb" in the event of a weird parse like "push north wall". You should be able to say things like "e.s.s.take thing. eat thing. look" and have the parser treat the "." as equivalent to and end-of-line. /* ACCOMPLISHED 6/13/80. Syntax errors are now of the form "I don't know how to xxx" if an unknown word is encountered (the whole word, not just 5 letters is printed); "I don't know the word 'xxxxxx'" for other unknown words; and "I don't understand, because I think 'xxxxxx' is a [noun/verb/adjective/etc]" for other syntax errors. The separator was already built into the lexer, but it's a comma, not a period. And VERB IOBJ DOBJ is a legal syntax now, but VERB PREP IOBJ DOBJ isn't (tho it's easy to add) */ MAYBE (if it isn't hard), you should be able to say "take this, that, the other" and have a more sophisticated control loop which causes it to act like "take this. take that. take the other" with the EXCEPTION that no daemon/fuse processing is performed (no turn increment) and that the whole thing can be short-circuited by an appropriate Exit code. 2) Generalized routine and object handling. The routines associated with objects should be properties of that object just like the others. The constants that tell WHICH property is, say, the Action property should be predefined. So ($setp room1 LDESC Rubbl) would set the long description of room1 to the routine Rubbl (which describes the rubble left by the explosion you just triggered...). /*** ACCOMPLISHED 6/6/80 ***/ 3) Improved global handling. The programmer shouldn't have to know the "address" of his globals. Instead, a construct like VAR score would be the equivalent of saying "score = xxx" where xxx is one less than the last VAR done. /*** ACCOMPLISHED 5/29/80 ***/ 4) Improved grammeme access. There should be predefined VARs which contain the values of ($verb) ($dobj) and ($iobj). You should be able to re-assign these. SO, you should be able to say turn off lamp and the PreVerb routine for "turn" might contain something like (($eq @Iobj off): ($setg Verb douse) ($setg Iobj 0) ) /*** Accomplished 6/12/80; Only change in ddlrun is #defines for verbtodo, etc */ /*** 6/81 added Prep global to ddlcomp and ddlrun to give access to preposition ***/ Because verbs don't have properties, we may wish for functions to access their preverb and action routines as well. 5) String handling: It'd sure be nice to have someone type incant "abra ca dabra" and be able to talk about ($subs Dobj @var 1) or ($indx @Dobj "abra") or whatever. I don't know exactly how to implement it yet. /*** Accomplished 7/28/80; STRINGs are negative-valued objects. If the lexer gets a string, it puts it into a temporary string area (that is flushed every turn) and returns an index (not pointer) into that are as a negative number. The parser knows about these and can handle verb string and verb string prep iobj sentences. (the latter being for "Incant "rise" over seed".) If the dobj or iobj of an input is a string, the dobj and iobj routines called are the ones associated with the object STRING (if such is defined by the DDL programmer). At present, the functions $substr, $length and $eqst are defined. $substr returns a negative pointer into the temp string area; this can be stored in a global, for example. A permanent string area is available, but I haven't written the function ($sets glbl string) which would move the string to the permanent area and put its index therein into glbl. Mike ***/ /*** On 8/20/80, I added a new function (which, mirable dictu, will allow coding of the "echo" room!), ($read), which pauses, gets a line of input, and returns the line as a string! Gee, if we code up ($pars str verb dobj iobj)... The implementation is kludgy and nonintuitive. But then, so's a lot of DDL 6) Ctrl-D should terminate the program. Ctrl-C should interrupt whatever is happening and begin a new turn. Note that this may leave things in a bad state. 7) New language construct: (WHILE condexp : formlist) is essentially equivalent to (condexp : formlist ($____ formlist+condexp)) where "($____ formlist+condexp)" is a new operator, JUMPB (jump back), which is just like the current $.... jump forward instruction, but (obviously) negative, and unconditional. It goes back exactly to the beginning of the test. /*** ACCOMPLISHED 8/18/80 --Mike ***/ 8) New routine ($rand n) produces a somewhat random number in the range 1..n . /*** ACCOMPLISHED 8/18/80 ***/ 9) DDLRUN sources should be reorganized so as to enable recompilation of less than the entire program if some less global change (such as the addition of a new routine, or a bug fix in the parser) is made. /*** Somewhat accomplished 10/80. Still needs work. In particular, changes in extvars.c must be reflected in extvars.h ***/ 10) The symbol table, and the hash routine, are simple-minded. The 5-character limitation on names is a real pain for some people. For example, you can't even fake the Zork puzzle room by allowing someone to say "push northern wall". These changes don't have to go together. /*** ACCOMPLISHED(!!) 11/80. Identifiers are pretty much as long as you like. The symbol table, now alphabetized, contains indices (not pointers) into a pool of identifiers that starts at sbrk(0). A binary search algorithm is used. This will enable a future version to respond correctly to unambiguous abbreviations for things at runtime (like news for the aard newspaper, for a cogent example). This hasn't been tested for portability to a PDP-11 under V7, so beware. As of 11/18, the symbol table is still unencrypted ***/ /*** The runtime parser recognizes unambiguous abbreviations. The symbol table is still unencrypted. 1/81 ***/ The building of the symbol table is simple-minded. Oh well. 11) It should be available on a micro. /* Not yet. But the thinking has begun! */ /* This will necessitate some rearchitecture especially wrt buffering of routines/strings */ /* Object table caching required */ 12) The ACTION routine for verbs should execute AFTER the action routine for your room; this enables east(ACTION) to correctly default to ($say "Can't go that way.") and allow one to generally live without $hit and $miss, crocky routines that they are. See ../sample (espec. transit.ddl) for a specimen of how this works. /* 11/80 */ 13) Routines that get the action and preaction routines for verbs should be made available. 14) Fuses and daemons aren't QUITE right (fuses go off after your daemon has typed a prompt, for a real-world example). Maybe they shd be on a homogenized priority queue? 15) It should be frozen real soon. /* As of 1/81, we're STILL thinking in terms of "just this ONE more feature..." Damn. */ 16) 3/82: Modern versions of Unix permit various forms of interprocess communication and commutators of some variety or another. Mpx channels in 32/V and 4.1bsd, UCB's future IPC mechanism for 4.2bsd, named pipes (?) in 3.0, etc, etc. One wonders how much work it would be to turn DDL into MUD-DL (multi-user dungeon definition language)! Example of changes: The single variable .ME now has some cousins, .ME1 thru .ME8. The parser sees not only the input, but who's responsible, and sets .ME to the appropriate .ME[n]. Then you just go through the turn normally. Routines like "$say" implicitly go to the .ME[x] currently associated with .ME (thus, to talk to someone else, temporarily reassign .ME; since .ME is an object, not a global, this means that you add $setme and $whoami. Also, a string-valued function for $myname) Globals 1-100 are as always, but globals 101-125 are implicitly local to the current .ME who's doing something. This is the easy part. The hard part is figuring out how to say "Tell everyone in the room that a Troll has entered", or "Tell everyone in the room but .ME that .ME got fried by the dragon". Worse, how do you handle it when two or more people are required to push on a door to open it? How do daemons, fuses and turn counters work? It's nice do have names for the various .MEs; but this requires dynamically fudging their SDESCs. Chris Kostanick has thought about multiplayer games in general; Mike Urban has played Essex MUD. We've both matured since DDL was written, so maybe now's the time! Mike