phantasmal_dgd_v1/
phantasmal_dgd_v1/bin/
phantasmal_dgd_v1/doc/
phantasmal_dgd_v1/mud/doc/
phantasmal_dgd_v1/mud/doc/api/
phantasmal_dgd_v1/mud/doc/kernel/
phantasmal_dgd_v1/mud/doc/kernel/hook/
phantasmal_dgd_v1/mud/doc/kernel/lfun/
phantasmal_dgd_v1/mud/include/
phantasmal_dgd_v1/mud/include/kernel/
phantasmal_dgd_v1/mud/kernel/lib/
phantasmal_dgd_v1/mud/kernel/lib/api/
phantasmal_dgd_v1/mud/kernel/obj/
phantasmal_dgd_v1/mud/kernel/sys/
phantasmal_dgd_v1/mud/tmp/
phantasmal_dgd_v1/mud/usr/System/
phantasmal_dgd_v1/mud/usr/System/keys/
phantasmal_dgd_v1/mud/usr/System/obj/
phantasmal_dgd_v1/mud/usr/System/open/lib/
phantasmal_dgd_v1/mud/usr/common/data/
phantasmal_dgd_v1/mud/usr/common/lib/parsed/
phantasmal_dgd_v1/mud/usr/common/obj/telopt/
phantasmal_dgd_v1/mud/usr/common/obj/ustate/
phantasmal_dgd_v1/mud/usr/game/
phantasmal_dgd_v1/mud/usr/game/include/
phantasmal_dgd_v1/mud/usr/game/obj/
phantasmal_dgd_v1/mud/usr/game/object/
phantasmal_dgd_v1/mud/usr/game/object/stuff/
phantasmal_dgd_v1/mud/usr/game/sys/
phantasmal_dgd_v1/mud/usr/game/text/
phantasmal_dgd_v1/mud/usr/game/users/
phantasmal_dgd_v1/src/host/
phantasmal_dgd_v1/src/host/beos/
phantasmal_dgd_v1/src/host/mac/
phantasmal_dgd_v1/src/host/unix/
phantasmal_dgd_v1/src/host/win32/res/
phantasmal_dgd_v1/src/kfun/
phantasmal_dgd_v1/src/lpc/
phantasmal_dgd_v1/src/parser/
Note:  this file, while useful, tends to run a little out of date.

------------------------------------------------------------------

                    ALTERING PHANTASMAL

                      INTRODUCTION

If you're serious about building your own MUDlib, you should realize
that Phantasmal builds on the Kernel Library for a reason -- you may
wish to do so instead of using this, and simply treat Phantasmal as
one more example MUDLib.  At a minimum you'll want to read up on the
Kernel Library.

You can find more stuff about developing based on Phantasmal at the
following URL: "http://phantasmal.sourceforge.net/Developing.html".

You can find more stuff about developing based on the Kernel Library
at "http://phantasmal.sourceforge.net/DGD/Kernel/".


                 OVERALL ORGANIZATION

Phantasmal does its best to conform to the spirit, not just the
letter, of the Kernel Library's restrictions and recommendations.  It
puts its libraries in /usr/XXX/lib, its clonable objects in
/usr/XXX/obj, and its daemons (objects that are instantiable, but that
keep only a single copy of their data and provide services) in
/usr/common/sys/ or /usr/System/sys.  All current lightweight objects
are in /usr/common/data, though that's not as fully spelled out by
the Kernel Library.

Code security is established by checking the previous_program(), among
other ways.  Security against non-admin players is quite good even
now, and we hope to keep it that way.  Scripts are in their infancy,
but they'll be a fine way to allow builders to do some coding without
letting them mess too much up.


                    SPECIFIC TASKS

To add a new locale (for instance Polish, Hungarian or Tengwar) you'll
want to change at least /include/phrase.h, /usr/System/sys/phrased.c
and the cmd_locales function in /usr/System/obj/user.c.  Phrased's
create() function sets up a lot of data structures -- make sure you
understand them and how to change them.  Eventually we may alter these
structures to be more dynamic.  That should make adding locales
easier.  But that will involve many objects (phrases, helpd, phrase
repositories, rooms, etc) being notified of a change in locales or
detecting it lazily.  In any case, unicode is not yet supported so
beware if you're dealing with a non-ASCII language like Chinese.
Planned Phantasmal changes, when completed, should allow better
terminal support, which will allow unicode support for some terminal
types.

You may want to have a look at /usr/common/sys/helpd.c and change the
exclude_path function.  It determines what directories will not be
checked during recursive descent to see if they contain helpfiles.
Particularly if you use a source-control system not based on RCS, CVS
or SCCS, you're likely to want to add to this (and submit the changes
back to me, please!).  You can also override the HelpD's operation by
registering help files one by one instead of directory by directory.
You'll need to override the upgraded() behavior as well, though.

Currently new Phantasmal-level commands go into
/usr/System/open/lib/userlib.c or /usr/System/lib/wiztoollib.c,
usually at the end of the file.  These commands run at that file's
full privilege level so you shouldn't allow anyone without absolute
full trust to write new commands.  There are a couple of sub-libraries
of wiztoollib, also in "/usr/System/lib/".  Some commands are better
added there.  Obviously, you can also add the commands to
/usr/game/obj/user.c or its equivalent.

You'll also need to add a user-visible name for the commands in
/usr/System/obj/wiztool.c for admin commands and in the user object
for player commands.


                   SPECIFIC LOCATIONS

If you're serious about making a real MUD happen, look through and
change absolutely every helpfile entry -- they're all found under
"/usr/game/help" and "/usr/game/help/admin" if you work based on
testgame.  Nothing says "unprofessional" (plus "lame", "sloppy",
and so on) like leaving stock MUDLib stuff unchanged in your MUD,
especially when it's wrong.  The help files contain a lot of contact
information, MUD policies and other stuff that's quite specific to
my personal server.  Look through and change it or you'll be
unpleasantly surprised by the contents.  And I mean it -- look
through and change *every* help file.  Add new ones as you add stuff,
too.  This is very, very important.  Have I said it enough times yet?

There's a system log under the "/log/" directory.  Make sure you know
what it is, how to use it, and what goes into it.  If you're not sure
where a particular entry comes from, find it in the code.  Grep is
your friend, or your editor's "find" feature if you're not using a
Unix variant or Cygwin.  You can alter what gets logged with
"/data/system/logd_channels.unq".  Figure out how it works.

Managers such as stringd.c, phrased.c, logd.c, userd.c and so on live
in either "/usr/common/sys" or "/usr/System/sys/".  Pretty much any
manager that can be removed from "/usr/System/sys/" already has been.
Understand why.  Hint: think security.


                   GENERAL GUIDELINES

Phantasmal allows for a serious amount of localization.  That means
the MUD allows reasonable translation to other languages.  At the
moment there's no unicode or other non-ASCII support, but it's at
least strongly possible in the infrastructure.  This is unusually good
by current (lousy) free MUD standards.  If you want to run a
Phantasmal-based MUD in a foreign language, let me know.  I'd be very
happy to get the localization stuff happening better, but I need test
cases before it feels like it's got a point.

You can take advantage of this.  Make sure that all your descriptions,
help files and all other text are localized to multiple languages.
Make sure that anything you add to the MUD is too.  Using the UNQ
parser and the UNQ phrase format is the easiest way to do this.  See
the help files in "/usr/game/help/" for examples.  More messages will
become localizable as time goes on.

Phantasmal provides an excellent help system -- at least by those same
lousy free-MUD standards.  It allows multiple names to link to the
same help entry and also does phonetic matching to see if what you
typed resembles a known help entry.  The current phonetic matching is
English-only, which will make sense if you think about it a bit --
phonetic matching is seriously different in languages with non-English
consonants, for instance, or languages not based on the Roman alphabet
(not that we have any yet).  Additional suggestions for how to improve
the help system are welcomed.

Understand the difference between objects that are instantiated
directly from LPC files and objects that are created from big data
files.  The Void, a room, is the former.  Help files are the latter.
If you can't find code for a given object, it may be because it has no
explicit, spelled-out LPC code at all, and is instead created based on
a simple template and a data file.  See simple_room for an example of
code that supports this.

There's a full binding system for associating UNQ templates with room
code.  You can find the binder files in "/data/system/".  Look for
files like "room_binder.unq" and "mobile_binder.unq".  From there,
look through the code until you understand what they do.

Know the Kernel Library.  Phantasmal does my humble best to conform to
its requirements, and may do even better in the future.  Understand
how its resource management works and how that interacts with having
administrative privileges of various kinds.  This is more subtle than
it sounds.

The wiztool is where an admin or builder gets his or her power.  You'd
better know what's in it and how to add more, hadn't you?  You'd also
better know why it has the security checks it has, and make sure you
add the right checks to anything you put in that file.  Ditto for
other locations where security matters like user.c and every system
manager in "/usr/System/sys/".  Again, you know why it matters that
it's in that directory, right?  I knew you did -- I'm just being
difficult.  When adding these checks, remember you're not really
defending against end-users except for actual commands.  You're
defending against untrusted admins, admins you've given a little
power.  They'll naturally try hard to poke big holes in your MUD by
calling your functions in ways you didn't intend.  Lucky you're ready
for them, hey?