4.3BSD/usr/src/games/ddl/doc/wishlist
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