skylib_fluffos_v3/
skylib_fluffos_v3/bin/
skylib_fluffos_v3/bin/db/
skylib_fluffos_v3/fluffos-2.9-ds2.04/
skylib_fluffos_v3/fluffos-2.9-ds2.04/ChangeLog.old/
skylib_fluffos_v3/fluffos-2.9-ds2.04/Win32/
skylib_fluffos_v3/fluffos-2.9-ds2.04/compat/
skylib_fluffos_v3/fluffos-2.9-ds2.04/compat/simuls/
skylib_fluffos_v3/fluffos-2.9-ds2.04/include/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/clone/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/command/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/data/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/etc/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/include/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/inherit/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/inherit/master/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/log/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/tests/compiler/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/tests/efuns/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/tests/operators/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/u/
skylib_fluffos_v3/fluffos-2.9-ds2.04/tmp/
skylib_fluffos_v3/fluffos-2.9-ds2.04/windows/
skylib_fluffos_v3/mudlib/
skylib_fluffos_v3/mudlib/cmds/
skylib_fluffos_v3/mudlib/cmds/admin/
skylib_fluffos_v3/mudlib/cmds/guild-race/
skylib_fluffos_v3/mudlib/cmds/living/broken/
skylib_fluffos_v3/mudlib/cmds/player/group_cmds/
skylib_fluffos_v3/mudlib/cmds/playtester/
skylib_fluffos_v3/mudlib/d/admin/
skylib_fluffos_v3/mudlib/d/admin/room/
skylib_fluffos_v3/mudlib/d/admin/room/we_care/
skylib_fluffos_v3/mudlib/d/admin/save/
skylib_fluffos_v3/mudlib/d/admin/text/
skylib_fluffos_v3/mudlib/d/learning/TinyTown/buildings/
skylib_fluffos_v3/mudlib/d/learning/TinyTown/map/
skylib_fluffos_v3/mudlib/d/learning/TinyTown/roads/
skylib_fluffos_v3/mudlib/d/learning/chars/
skylib_fluffos_v3/mudlib/d/learning/functions/
skylib_fluffos_v3/mudlib/d/learning/handlers/
skylib_fluffos_v3/mudlib/d/learning/help_topics/
skylib_fluffos_v3/mudlib/d/learning/help_topics/npcs/
skylib_fluffos_v3/mudlib/d/learning/help_topics/objects/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rcs_demo/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rcs_demo/RCS/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rooms/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rooms/crowd/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rooms/situations/
skylib_fluffos_v3/mudlib/d/learning/save/
skylib_fluffos_v3/mudlib/d/learning/school/
skylib_fluffos_v3/mudlib/d/learning/school/add_sc/
skylib_fluffos_v3/mudlib/d/learning/school/characters/
skylib_fluffos_v3/mudlib/d/learning/school/general/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/basic_commands/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/edtutor/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/unix_tutor/
skylib_fluffos_v3/mudlib/d/learning/school/items/
skylib_fluffos_v3/mudlib/d/learning/school/npc_school/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/room_basic/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/situations/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/terrain_tutor/
skylib_fluffos_v3/mudlib/d/learning/text/
skylib_fluffos_v3/mudlib/d/liaison/
skylib_fluffos_v3/mudlib/d/mudlib/
skylib_fluffos_v3/mudlib/d/mudlib/changes/
skylib_fluffos_v3/mudlib/d/playtesters/
skylib_fluffos_v3/mudlib/d/playtesters/effects/
skylib_fluffos_v3/mudlib/d/playtesters/handlers/
skylib_fluffos_v3/mudlib/d/playtesters/items/
skylib_fluffos_v3/mudlib/d/sage/
skylib_fluffos_v3/mudlib/doc/
skylib_fluffos_v3/mudlib/doc/creator/
skylib_fluffos_v3/mudlib/doc/driver/
skylib_fluffos_v3/mudlib/doc/driver/efuns/arrays/
skylib_fluffos_v3/mudlib/doc/driver/efuns/buffers/
skylib_fluffos_v3/mudlib/doc/driver/efuns/calls/
skylib_fluffos_v3/mudlib/doc/driver/efuns/compile/
skylib_fluffos_v3/mudlib/doc/driver/efuns/filesystem/
skylib_fluffos_v3/mudlib/doc/driver/efuns/floats/
skylib_fluffos_v3/mudlib/doc/driver/efuns/functions/
skylib_fluffos_v3/mudlib/doc/driver/efuns/general/
skylib_fluffos_v3/mudlib/doc/driver/efuns/mappings/
skylib_fluffos_v3/mudlib/doc/driver/efuns/mixed/
skylib_fluffos_v3/mudlib/doc/driver/efuns/mudlib/
skylib_fluffos_v3/mudlib/doc/driver/efuns/numbers/
skylib_fluffos_v3/mudlib/doc/driver/efuns/parsing/
skylib_fluffos_v3/mudlib/doc/login/
skylib_fluffos_v3/mudlib/doc/lpc/basic_manual/
skylib_fluffos_v3/mudlib/doc/lpc/intermediate/
skylib_fluffos_v3/mudlib/doc/new/add_command/
skylib_fluffos_v3/mudlib/doc/new/events/
skylib_fluffos_v3/mudlib/doc/new/handlers/
skylib_fluffos_v3/mudlib/doc/new/living/race/
skylib_fluffos_v3/mudlib/doc/new/living/spells/
skylib_fluffos_v3/mudlib/doc/new/object/
skylib_fluffos_v3/mudlib/doc/new/player/
skylib_fluffos_v3/mudlib/doc/new/room/guild/
skylib_fluffos_v3/mudlib/doc/new/room/outside/
skylib_fluffos_v3/mudlib/doc/new/room/storeroom/
skylib_fluffos_v3/mudlib/doc/object/
skylib_fluffos_v3/mudlib/doc/playtesters/
skylib_fluffos_v3/mudlib/doc/policy/
skylib_fluffos_v3/mudlib/doc/weapons/
skylib_fluffos_v3/mudlib/global/
skylib_fluffos_v3/mudlib/global/creator/
skylib_fluffos_v3/mudlib/handlers/
skylib_fluffos_v3/mudlib/include/casino/
skylib_fluffos_v3/mudlib/include/cmds/
skylib_fluffos_v3/mudlib/include/effects/
skylib_fluffos_v3/mudlib/include/npc/
skylib_fluffos_v3/mudlib/include/room/
skylib_fluffos_v3/mudlib/include/shops/
skylib_fluffos_v3/mudlib/net/daemon/
skylib_fluffos_v3/mudlib/net/daemon/chars/
skylib_fluffos_v3/mudlib/net/inherit/
skylib_fluffos_v3/mudlib/net/obj/
skylib_fluffos_v3/mudlib/net/obj/BACKUPS/
skylib_fluffos_v3/mudlib/obj/amulets/
skylib_fluffos_v3/mudlib/obj/armours/plate/
skylib_fluffos_v3/mudlib/obj/b_day/
skylib_fluffos_v3/mudlib/obj/clothes/transport/horse/
skylib_fluffos_v3/mudlib/obj/faith/symbols/
skylib_fluffos_v3/mudlib/obj/fungi/
skylib_fluffos_v3/mudlib/obj/gatherables/
skylib_fluffos_v3/mudlib/obj/instruments/
skylib_fluffos_v3/mudlib/obj/media/
skylib_fluffos_v3/mudlib/obj/misc/player_shop/
skylib_fluffos_v3/mudlib/obj/monster/godmother/
skylib_fluffos_v3/mudlib/obj/monster/transport/
skylib_fluffos_v3/mudlib/obj/rings/
skylib_fluffos_v3/mudlib/obj/scabbards/
skylib_fluffos_v3/mudlib/obj/spells/
skylib_fluffos_v3/mudlib/obj/stationery/
skylib_fluffos_v3/mudlib/obj/stationery/envelopes/
skylib_fluffos_v3/mudlib/obj/toys/
skylib_fluffos_v3/mudlib/obj/vessels/
skylib_fluffos_v3/mudlib/obj/weapons/axes/
skylib_fluffos_v3/mudlib/obj/weapons/chains/
skylib_fluffos_v3/mudlib/obj/weapons/maces/BACKUPS/
skylib_fluffos_v3/mudlib/save/autodoc/
skylib_fluffos_v3/mudlib/save/book_handler/
skylib_fluffos_v3/mudlib/save/books/history/calarien/
skylib_fluffos_v3/mudlib/save/mail/
skylib_fluffos_v3/mudlib/save/new_soul/data/
skylib_fluffos_v3/mudlib/save/parcels/
skylib_fluffos_v3/mudlib/save/playerinfo/
skylib_fluffos_v3/mudlib/save/players/d/
skylib_fluffos_v3/mudlib/save/players/s/
skylib_fluffos_v3/mudlib/save/random_names/
skylib_fluffos_v3/mudlib/save/random_names/data/
skylib_fluffos_v3/mudlib/save/terrains/
skylib_fluffos_v3/mudlib/save/terrains/tutorial_desert/
skylib_fluffos_v3/mudlib/save/terrains/tutorial_grassy_field/
skylib_fluffos_v3/mudlib/save/terrains/tutorial_mountain/
skylib_fluffos_v3/mudlib/save/todo_lists/
skylib_fluffos_v3/mudlib/secure/
skylib_fluffos_v3/mudlib/secure/cmds/admin/
skylib_fluffos_v3/mudlib/secure/cmds/lord/
skylib_fluffos_v3/mudlib/secure/config/
skylib_fluffos_v3/mudlib/secure/handlers/autodoc/
skylib_fluffos_v3/mudlib/secure/handlers/intermud/
skylib_fluffos_v3/mudlib/secure/include/global/
skylib_fluffos_v3/mudlib/secure/save/
skylib_fluffos_v3/mudlib/secure/save/handlers/
skylib_fluffos_v3/mudlib/secure/std/
skylib_fluffos_v3/mudlib/secure/std/classes/
skylib_fluffos_v3/mudlib/secure/std/modules/
skylib_fluffos_v3/mudlib/std/creator/
skylib_fluffos_v3/mudlib/std/dom/
skylib_fluffos_v3/mudlib/std/effects/
skylib_fluffos_v3/mudlib/std/effects/external/
skylib_fluffos_v3/mudlib/std/effects/fighting/
skylib_fluffos_v3/mudlib/std/effects/magic/
skylib_fluffos_v3/mudlib/std/effects/magic/BACKUPS/
skylib_fluffos_v3/mudlib/std/effects/other/BACKUPS/
skylib_fluffos_v3/mudlib/std/effects/priest/
skylib_fluffos_v3/mudlib/std/effects/room/
skylib_fluffos_v3/mudlib/std/environ/
skylib_fluffos_v3/mudlib/std/guilds/
skylib_fluffos_v3/mudlib/std/guilds/old/
skylib_fluffos_v3/mudlib/std/languages/
skylib_fluffos_v3/mudlib/std/liquids/
skylib_fluffos_v3/mudlib/std/npc/
skylib_fluffos_v3/mudlib/std/npc/goals/
skylib_fluffos_v3/mudlib/std/npc/goals/basic/
skylib_fluffos_v3/mudlib/std/npc/goals/misc/
skylib_fluffos_v3/mudlib/std/npc/plans/
skylib_fluffos_v3/mudlib/std/npc/plans/basic/
skylib_fluffos_v3/mudlib/std/npc/types/
skylib_fluffos_v3/mudlib/std/npc/types/helper/
skylib_fluffos_v3/mudlib/std/npcs/
skylib_fluffos_v3/mudlib/std/outsides/
skylib_fluffos_v3/mudlib/std/races/shadows/
skylib_fluffos_v3/mudlib/std/room/basic/BACKUPS/
skylib_fluffos_v3/mudlib/std/room/basic/topography/
skylib_fluffos_v3/mudlib/std/room/controller/
skylib_fluffos_v3/mudlib/std/room/inherit/topography/
skylib_fluffos_v3/mudlib/std/room/topography/area/
skylib_fluffos_v3/mudlib/std/room/topography/iroom/
skylib_fluffos_v3/mudlib/std/room/topography/milestone/
skylib_fluffos_v3/mudlib/std/shadows/curses/
skylib_fluffos_v3/mudlib/std/shadows/disease/
skylib_fluffos_v3/mudlib/std/shadows/fighting/
skylib_fluffos_v3/mudlib/std/shadows/healing/
skylib_fluffos_v3/mudlib/std/shadows/magic/
skylib_fluffos_v3/mudlib/std/shadows/poison/
skylib_fluffos_v3/mudlib/std/shadows/room/
skylib_fluffos_v3/mudlib/std/shops/controllers/
skylib_fluffos_v3/mudlib/std/shops/objs/
skylib_fluffos_v3/mudlib/std/shops/player_shop/
skylib_fluffos_v3/mudlib/std/socket/
skylib_fluffos_v3/mudlib/std/soul/d/
skylib_fluffos_v3/mudlib/std/soul/e/
skylib_fluffos_v3/mudlib/std/soul/i/
skylib_fluffos_v3/mudlib/std/soul/j/
skylib_fluffos_v3/mudlib/std/soul/k/
skylib_fluffos_v3/mudlib/std/soul/l/
skylib_fluffos_v3/mudlib/std/soul/n/
skylib_fluffos_v3/mudlib/std/soul/o/
skylib_fluffos_v3/mudlib/std/soul/q/
skylib_fluffos_v3/mudlib/std/soul/r/
skylib_fluffos_v3/mudlib/std/soul/u/
skylib_fluffos_v3/mudlib/std/soul/v/
skylib_fluffos_v3/mudlib/std/soul/y/
skylib_fluffos_v3/mudlib/std/soul/z/
skylib_fluffos_v3/mudlib/std/stationery/
skylib_fluffos_v3/mudlib/w/
skylib_fluffos_v3/mudlib/w/default/
skylib_fluffos_v3/mudlib/w/default/armour/
skylib_fluffos_v3/mudlib/w/default/clothes/
skylib_fluffos_v3/mudlib/w/default/item/
skylib_fluffos_v3/mudlib/w/default/npc/
skylib_fluffos_v3/mudlib/w/default/room/
skylib_fluffos_v3/mudlib/w/default/weapon/
skylib_fluffos_v3/mudlib/www/
skylib_fluffos_v3/mudlib/www/java/
skylib_fluffos_v3/mudlib/www/secure/
skylib_fluffos_v3/mudlib/www/secure/lpc/advanced/
skylib_fluffos_v3/mudlib/www/secure/lpc/intermediate/
skylib_fluffos_v3/win32/
<h3>Chapter 1 - Introduction</h3>

<hr size="1">
<a name="1.1"><p><strong>1.1 What else is there?</strong></p></a>
<p>
If you are ready for this textbook, then you have probably answered this
question for yourself. You should know well the material in <i>LPC Basics</i>
and <i>Intermediate LPC</i> and have practical experience with building areas
on real LPMuds and seeing them put into real LPMud games. This textbook is designed
to take you from winging solutions to more global mudlib problems to being able
to design and implement your own MUD.
</p>
<p>
Like the other two textbooks which came before it, <i>Advanced LPC</i> is not
designed for picking apart which sections you want to read now.  It is a
step-by-step textbook designed to take you from being an experienced area
coder to being a knowledgeable MUD builder.  The topic is basically mudlib
analysis, design, and implementation.  Implementation is the only part of
that which relates specifically to LPC.
</p>
<p>
To the question, "What else is there?", this book tries to address the
issue of starting your own MUD and/or administrating a MUD either of your
own or with someone else.  Even if you have no intention of doing such a thing,
however, you should find much of what is said in this textbook to be valuable.
</p>
<hr size="1">
<a name="1.2"><p><strong>1.2 Starting your own MUD</strong></p></a>
<p>
Few MUDs last more than a few weeks or a month.  Of those MUDs
on any given mudlist, only a few are active and have been around as long as
a year. Only less than a dozen have been around since year one of LPMuds.
People often find out that just one month is not nearly enough time for
building a MUD.
</p>
<p>
The short answer to the question "How do I start my own MUD?" is ftp a
driver and mudlib, install them, and there you are.  This answer does a serious
disservice to those few MUDs who have managed to create a lasting and
enjoyable game for people to play.  If it were that easy, we would see many
more long-term MUDs, and others would not shut down before they have
even attracted their first player.
</p>
<p>
What do you do with the MUD after you have installed it?  No matter how
complete the mudlib, none comes with a complete set of areas which makes a
MUD unique, and none comes with players ready to play.  Only LPMud 2.4.5
can be played by players straight out of the box, and that owes much to
its simplicity.  Just because you can play it out of the box does not mean
anyone would want to.
</p>
<p>
There are 5 steps to building a successful MUD:
</p>
<DL>
  <DT><A HREF="#1.3">Define your team</A>
  <DD>Too often, an individual starts a MUD just because they want to run their
    own MUD. No matter which mudlib you use, building a MUD is a cooperative job
    which takes a lot of work.
  <DT><A HREF="#1.4">Analyze the situation</A>
  <DD>You need to determine what talents you have in your team, and what the
    goals you all have in building the MUD. The questions start as simple as "Do
    you want to build a fantasy or sci-fi MUD?" to as complicated as "Who decides
    when to banish a site?".
  <DT><A HREF="#1.5">Design the MUD</A>
  <DD>Three steps in, and you have not yet touched any code. Once you have a
    team and something to build, you need to design the how the pieces of the
    puzzle will fit together.
  <DT><A HREF="#1.6">Implementing the design</A>
  <DD>Now it is time to code, but only for the main development team. By this
    time you have a base mudlib chosen and a clear goal of what you need to code.
  <DT><A HREF="#recruiting">Recruit creators to build areas</A>
  <DD>You don't need to finish step 4 before getting people involved, but the
    actual objects coders will use in building areas need to be fairly stable.
</DL>

<hr size="1">
<a name="1.3"><p><strong>1.3 Team Building</strong></p></a>
<p>
No matter how good you think you are, you cannot possibly accomplish the
tremendous task of opening a MUD on your own.  It simply requires too many
diverse types of talent, types often in opposition to each other, and the
whole big picture is simply too overwhelming.  Certain aspects of MUD
building require great architectural skills, which often are in direct
contrast to the detail skills other parts of MUD building require.  Building
a MUD thus needs to be a team effort; and since everyone is generally doing
this for the sake of a good time, they must each feel a sense of ownership
in the MUD.
</p>
<p>
A common attitude among people out to start a MUD is the "I want to run MY
own MUD" attitude.  Any new MUD, however,  needs to start as a group of people
with a well defined power structure working together to create a well-defined
virtual reality.  If you are out to build YOUR MUD, then you will fail.  No
one else wants to code your vision of what a MUD should be.  And that
feeling in others will be compounded if you cannot command the respect
in experience and MUD knowledge which would fit the position you are
trying to draw for yourself.
</p>
<p>
Sometimes MUDs start up as a reaction to political problems with other MUDs.
These MUDs tend to have exactly the opposite problem in that they
attempt to create a completely egalitarian society run by committee.
</p>
<p>
Each individual needs to have a sense of ownership in the MUD, something that
they can point to and say "I did that".  Other need to know where the buck
stops when a problem is encountered.  Committee leadership fosters none of the
above.  You therefore need clear accountability in an individual for given
types of decisions, and those individuals need the security of knowing the
other administrators will stand by their decisions publically.
</p>
<p>
Who should be in your team?  Your team should be almost entirely people you
trust.  You must be able to deal with disagreeing with them and having their
decision be law.  If you are constantly second-guessing any person, then
they will not be happy with you, and you will be almost as bad off as if
you were trying to do the whole thing alone.  Look around on the MUDs you
currently create on.  Find others who have topped out at the experience they
can gain from building on their current MUDs.  Avoid strange people who are
creators on 10 different MUDs. Every single person on the team should
have some experience in having built an area on some other MUD (remember,
we are not talking about area builders here, we are talking about your
core administrative team).
</p>
<p>
And you yourself should have built an area on another MUD.  Having played
a MUD or done complex programming for Windows does not qualify you to
build a MUD.  Certainly you better had played a MUD before you ever
became a creator on one, but it takes someone who has both had the
experience coding in LPC <i>and</i> the experience of having seen what
happens when that code is put into a real game.
</p>
<p>
What if you have not been a creator on a MUD before?  You are best off
finding a MUD which will allow you to be a creator and get that experience.
Many people argue that they do not wnat to play all those levels just to get
to code an area, but the fact is that most MUDs these days will allow
people to code without making any certain level.  If you have no MUD
coding experience, then any attempt to start a MUD will fail.
</p>

<hr size="1">
<a name="1.4"><p><strong>1.4 Analysis</strong></p></a>
<p>
Do not jump in and code right away.  Too many people, including myself, have
made the mistake of running off and coding before event figuring out what it
is they want to code.  Analysis involves first deciding what exactly you want
to build.  Do you want to build a sci-fi MUD?  Or are you instead
building a fantasy MUD?  Once you have determined the context of your
problem, you then need to move on to deciding what the pieces of that
problem are.
</p>
<p>
Forget that you know anything about LPC.  Forget anything you know about
coding MUDs in general.  Instead, go back to being a player.  If your
team is physically in the same area, the best thing to do is find a big white
board and some markers.  In the absence of physical co-location, gather
together and make sure you write down somewhere what you discuss.  You will
need to define all the things which exist in your MUD.
</p>
<p>
The proper term for "things" here is "object".  Of course, since you know
LPC, you know that LPC has a data type called object.  In this discussion,
however, you need to forget about the LPC object and think just about things.
What sort of things are there?  Well, in your fantasy MUD, you have swords,
firebreathers, shop keepers, Leo the Archwizard, bridges, rooms, doors,
players, monsters, creators, etc.  The list really can go on and on.  And one
thing to remember is that if it is a thing and you think of it at this point,
then write it down.  There are no wrong answers at this point.  You will
eliminate trivial objects later.  At this point, however, what might seem
prima facie to be a trivial object may in fact turn out to be key. Keep
in mind also that object here does not necessarily equal object in LPC.
</p>
<p>
In addition to looking around and defining what objects make up your world,
you need to define the roles your team will have.  As I discussed in the
previous section, you must have well-defined realms of responsibility.  There
is no one correct power structure for a MUD.  The one that works is simply
one where each team member knows their responsibility and can feel comfortable
than any decision they make in that realm will not be turned over by another
team member.  An example of how <i>Nightmare</i> implements this:
</p>
<DL>
  <DT>Approval Department
  <DD>The head arch of approval is in charge of all decisions regarding who becomes
    a creator on <I>Nightmare</I> and whose code is placed into the game. The
    responsibilities of this department thus involve interviewing and approving
    creator candidates and reviewing, bug-testing, and approving newly created
    areas.
  <DT>Driver Department
  <DD>The head arch of this department makes certain that <I>Nightmare</I> always
    has a current, bug free version of the LPC driver. In addition, this department
    works with mudlib on ways in which to improve game efficiency.
  <DT>Law Department
  <DD>The head arch of this department makes certain that the rules of <I>Nightmare</I>
    are obeyed by players and creators. The main duty is to watch out for cheaters
    and harassers.
  <DT>Mudlib department
  <DD>The head arch of this department oversees the development of new mudlib
    code. In coordination with approval, this departments sees that all new code
    is thoroughly tested and a clear migration path is defined for existing creator
    code.
</DL>
<p>
Credit for this structure goes back as far at least to <i>IgorMUD</i> on which
I was first an arch.  I do not know where they got this structure from.
</p>

<hr size="1">

<a name="1.5"><p><strong>1.5 Design</strong></p></a>
<p>
Design is perhaps where your MUD will most succeed or fail.  Of course,
you cannot get to design if you have not determined what your game will
be or what objects will be involved in that game.  In design, you determine
how all of those objects you defined in analysis interact together.  What
does a monster do?  What does a firebreather do?  Do players and monsters
have anything in common?  Can we abstract those commonalities into a more
general object?
</p>
<p>
When looking at any one object, you need to identify its characteristics
and behaviours.  Characteristics for a monster might be that it is a goblin,
it is level 10, it is drunk, etc.  Things that make it stand out from other
monsters.  Behaviours, on the other hand, are things that objects of the same
type do.  A player can kill things, and a player can die.  A player can take
damage, or a player can issue a command.  In object-oriented terminology,
the characteristics are attributes, and the behaviours are methods.  In
LPC terminology, your characteristics become global variables, and your
behaviours become functions.
</p>
<p>
So far, this has all been rather esoteric.  Let's look at a fantasy MUD.  You
have identified that you have monsters of various races, players, creators,
rooms, bars, barkeeps, swords, knives, and drinks.  You have defined the
ways in which each of these behave with respect to other objects through
simple English (or whatever your native tongue is):
</p>

<ul>
  <li>Players kill monsters.</li>
  <li>Monsters kill players.</li>
  <li>Players drink drinks.</li>
  <li>Barkeeps sell drinks.</li>
  <li>Bars contain barkeeps.</li>
  <li>Bars are rooms.</li>
  <li>Players wield swords.</li>
  <li>Players wield knives.</li>
</ul>

<p>
The first special kind of relationship that should always jump out at you are
"is a" relationships.  Above, we have "Bars are rooms".  You can be pretty
certain here that your bar object will somehow be inheriting your room object
when it comes time to do LPC.
</p>
<p>
The next thing you might notice is that players have exactly the same
relationship to swords that they have to knives.  This should raise a flag
that says there might be some "is a" relationship lurking under the covers.
In this case, the real relationship is "players wield weapons", with the
proper "is a" relationship being "a knife is a weapon" and "a sword is a
weapon".
</p>
<p>
The next relationship type you want to note is the "contains" relationship.
In the above example, it is not all that interesting, except it is a specific
case of the more general "rooms contain monsters". In this case, you have a
specific type of room containing a specific type of monster. What makes this
room different than other rooms is that the kind of monster it contains is a
monster. You want to beware, however, of mistaking "is a" relationships for
"contains" (which are also called "has a") relationships. In practice, in LPC,
"contains" relationships are sometimes implemented as "is a" relationships.
For example, in the <I>Nightmare Object Library</I>, living things are implemented
as being body objects which contain limb objects (note that here is an example
of where design object is not equal to LPC object as limb objects are really
mappings), though perhaps the more proper object-oriented design is that living
objects.
</p>