[MUD-Dev] Object Architecture [Longish]

Draymoor a Vin il'Rogina draymoor at cloud9.net
Tue Jun 11 20:44:31 CEST 2002


Ben Chambers wrote:

> How do you implement your MUD?  Which objects do you use?  How do
> they interact?  If on Java, how do you divide your projects?  I'm
> wondering because I'm at the beginning phase of design of my own
> MUD, and was wondering how other systems have implemented these
> things.  Any other information about the arrangement of your
> objects within your MUD would be interesting as well.

I'm going with a largely OOP approach to my mud. C++ with windows
c-style multithreading, c-style function pointers (I'm looking for a
better way, though), and Windows SDK Winsock 2.

One of my main goals in my implementation is to isolate the usage of
pointers as much as possible to within the basic classes that have
to work with them to avoid null pointer crashes. I'm not using java
because at the start of the project I didn't know java, I still
don't have a good enough knowledge of the language, I don't have a
suitable IDE for a large-scale project, and, most importantly, I'm
not willing to start over until I finish what I started. That said,
here're the objects.

  Basic Types:

   Fifo - File Input/Output

   fString - Formatted string

   UniversalObject - An object with an enumerated type
  
     Derivitives of UniversalObject:

      System - Main game driver

      Database - Virtually Linked Hash Table

      ListObject - Object that goes on the database
  
     Derivitives of Database:

      Socket - A socket capable of accepting connections

      Interp - Command Interpreter

      PlayerDB - Database to handle players, hashed by 18-character
      unique names

      ChannelDB - Database to handle logged in-game communication
      and notification channels.

      NSMLParser - Nirvana Standard Markup Language, rather than
      learning XML, I decided to make my own. I recognise this as a
      mistake ;)

      FuncServ - Interp and NSMLParser load their commands/tags from
      file, the file stores the name of the function to be looked up
      on the FuncServ, which holds a static list of all function
      pointers, accessable by name. Allows dynamic modification of
      commands. Is there a better way to do this?
  
     Derivitives of ListObject:

      DescriptData - Connection to a socket, with input/output

      PlayerData - All the data on a player, but not an in-game
      character

      Channel - Stores a dynamicly modifiable channel format, and
      allows for sending messages to all players with that channel
      set to on.

      NSMLTag - A tag stored in the NSMLParser

      CommandEntry - A command stored in the Interp

      Function - function name + pointer, used for lookup in
      FuncServ
  
I have not yet started the actual world code. I'm trying to figure
out how to handle the NSML currently. Any comments/input here would
be appreciated.  Especially criticism :)

As for arrangment, The main loop declares an instance of Socket and
System.  System loads the settings from a file, and socket opens the
port that system defines. Theoreticly, you could run 2 different
ports with totally seperate connections but on the same world/system
settings, vice versa, or just two independant muds on the same
program. I'm not planning on doing that, though ;)

System stores accessable instances of Interp, PlayerDB, ChannelDB,
and NSMLParser, all save the PlayerDB are loaded from file. The
PlayerDB is empty until people login to PCs or start the creation
process. All databases (and derivitives) store a pointer to the
System object, accessable by an alias returning function. All
ListObjects (and derivitives) store a pointer to their database,
accessable by an alias returning function. That way, any object can
link back to the System and access the different subsystems (like
channels). PlayerData also stores a pointer to the descriptor,
accessable just like all the others.

Otherwise, I moderate access between ListObjects by use of their IDs
(__int64) and the databases. This way, if I have a null object, I
don't crash, but rather get a bug-report on the bug channel. When
the world code comes in, I'll be further buffering access by putting
in an event list handler of some kind.

As I said, comments and criticism would be greatly appreciated. I
hope this helped ^_^


| Philip Loguinov
| Draymoor a Vin il'Rogina
| Head Coder/Admin: Nirvana Project
| http://drayworks.dhs.org



_______________________________________________
MUD-Dev mailing list
MUD-Dev at kanga.nu
https://www.kanga.nu/lists/listinfo/mud-dev



More information about the mud-dev-archive mailing list