January 2000
- JavaWorld: Build an object database J C Lawrence
- Muq update Cynbe ru Taren
- New link support J C Lawrence
- OS Inspiration Phillip Lenhardt
- OS Inspiration Greg Miller
- Chomsky's recursive theory of grammar J C Lawrence
- concerning tokenization, compilation, performance, and other fun stuff. Nate Cain
- concerning tokenization, compilation, performance, and other fun stuff. cg@ami-cg.GraySage.Edmonton.AB.CA
- concerning tokenization, compilation, performance, and other fun stuff. Joel Dillon
- concerning tokenization, compilation, performance, and other fun stuff. Ola Fosheim Grøstad
- Library submission notification and updates J C Lawrence
- EQ packet sniffer J C Lawrence
- Catalog of Compiler Construction Tools J C Lawrence
- Microthreads for Python J C Lawrence
- For those interested in parsers and compilers J C Lawrence
- EQ packet analyzer is gone? Sellers, Michael
- EQ packet analyzer is gone? J C Lawrence
- EQ packet analyzer is gone? J C Lawrence
- RFC: Worldforge project Scott Clitheroe
- ScryMUD 2.0.9 released (compiles on Windows (cygwin)) Ben Greear
- Clay Shirky's "Playfulness in 3-D Spaces" J C Lawrence
- Clay Shirky's "Playfulness in 3-D Spaces" Raph & Kristen Koster
- Clay Shirky's "Playfulness in 3-D Spaces" Sellers, Michael
- Clay Shirky's "Playfulness in 3-D Spaces" Nick Shaffner
- Clay Shirky's "Playfulness in 3-D Spaces" Sellers, Michael
- Clay Shirky's "Playfulness in 3-D Spaces" Jeremy Music "Sterling"
- Clay Shirky's "Playfulness in 3-D Spaces" msew
- ShowEQ Ashran
- Hello! F. Randall Farmer
- Hello! Cynbe ru Taren
- Y2K archives J C Lawrence
- An introduction... Geoffrey A. MacDougall
- An introduction... Lovecraft
- Laws website moves Raph & Kristen Koster
- Ok, got some brand new core dumps. J C Lawrence
- player politics (was An introduction...) Sellers, Michael
- player politics (was An introduction...) Ola Fosheim Grøstad
- player politics (was An introduction...) Sellers, Michael
- player politics (was An introduction...) Ola Fosheim Grøstad
- player politics (was An introduction...) J C Lawrence
- player politics (was An introduction...) Sellers, Michael
- A quick business question... Geoffrey A. MacDougall
- A quick business question... Matthew Mihaly
- A quick business question... Darrin Hyrup
- Question about multithreaded servers Fabian Lemke
- Question about multithreaded servers AR Schleicher
- Question about multithreaded servers Nick Shaffner
- Question about multithreaded servers Ola Fosheim Grøstad
- Question about multithreaded servers Fabian
- Question about multithreaded servers Jon A. Lambert
- Question about multithreaded servers J C Lawrence
- Question about multithreaded servers Greg Underwood
- Question about multithreaded servers cg@ami-cg.GraySage.Edmonton.AB.CA
- Question about multithreaded servers J C Lawrence
- Question about multithreaded servers Greg Underwood
- Question about multithreaded servers J C Lawrence
- Question about multithreaded servers Emil Eifrém
- Question about multithreaded servers J C Lawrence
- Community Relations Dundee
- Community Relations Christopher Allen
- Community Relations Matthew Mihaly
- Community Relations Greg Miller
- Community Relations Darrin Hyrup
- Community Relations Dundee
- Community Relations Ola Fosheim Grøstad
- Community Relations Dundee
- Community Relations Ola Fosheim Grøstad
- Community Relations Dundee
- Community Relations Marian Griffith
- Community Relations Koster, Raph
- Community Relations Jon A. Lambert
- Community Relations Matthew Mihaly
- Community Relations Ola Fosheim Grøstad
- Community Relations Matthew Mihaly
- Community Relations Ola Fosheim Grøstad
- Community Relations Matthew Mihaly
- Community Relations Marc Bowden
- Community Relations Eli Stevens {Grey}
- Community Relations Matthew Mihaly
- Community Relations Raph & Kristen Koster
- Community Relations Matthew Mihaly
- Community Relations Koster, Raph
- Community Relations Travis Casey
- Community Relations Ola Fosheim Grøstad
- Community Relations Travis Casey
- Community Relations Ola Fosheim Grøstad
- Community Relations Matthew Mihaly
- Community Relations Rahul Sinha
- Community Relations Matthew Mihaly
- Community Relations Matthew Mihaly
- Community Relations Ola Fosheim Grøstad
- Community Relations Koster, Raph
- Community Relations Matthew Mihaly
- Community Relations Geoffrey A. MacDougall
- Community Relations Jon A. Lambert
- Community Relations Matthew Mihaly
- Community Relations Ola Fosheim Grøstad
- Community Relations Travis S. Casey
- Community Relations Douglas Couch
- Community Relations Dundee
- Community Relations Marian Griffith
- Community Relations Jon A. Lambert
- Community Relations Matthew Mihaly
- Community Relations Jon A. Lambert
- Community Relations Matthew Mihaly
- Community Relations Geoffrey A. MacDougall
- Community Relations Matthew Mihaly
- Community Relations Lovecraft
- Community Relations Geoffrey A. MacDougall
- Community Relations Lovecraft
- Community Relations Marian Griffith
- Community Relations Matthew Mihaly
- Community Relations Sellers, Michael
- Community Relations Lovecraft
- Community Relations J C Lawrence
- Community Relations Lovecraft
- Community Relations J C Lawrence
- Community Relations Koster, Raph
- Community Relations Jon A. Lambert
- Community Relations Ola Fosheim Grøstad
- Community Relations Lovecraft
- Community Relations Jon A. Lambert
- Community Relations Lovecraft
- Community Relations Jon A. Lambert
- Community Relations Jon A. Lambert
- Community Relations J C Lawrence
- Community Relations Wes Connell
- Community Relations Marc Bowden
- Community Relations Dundee
- Community Relations J C Lawrence
- Community Relations J C Lawrence
- Community Relations F. Randall Farmer
- Community Relations Dr. Cat
- Community Relations J C Lawrence
- Community Relations Koster, Raph
- Community Relations Geoffrey A. MacDougall
- Community Relations Matthew Mihaly
- Commercial-use Restrictions on Code Bases (was: help me find 100% fre (fwd) J C Lawrence
- Commercial-use Restrictions on Code Bases (was: help me find 100% fre (fwd) J C Lawrence
- Databases (was Commercial-use Restrictions on Code Bases) Charles Hughes
- Databases (was Commercial-use Restrictions on Code Bases) cg@ami-cg.GraySage.Edmonton.AB.CA
- Databases (was Commercial-use Restrictions on Code Bases) Jon A. Lambert
- Databases (was Commercial-use Restrictions on Code Bases) Jon A. Lambert
- Databases (was Commercial-use Restrictions on Code Bases) J C Lawrence
- Mud-Dev FAQ part I Marian Griffith
- Mud-Dev FAQ part II Marian Griffith
- META: List goals (was OS Inspiration) J C Lawrence
- Valhalla license? CFrancy@aol.com
- Valhalla license? Matthew Mihaly
- Valhalla license? Richard Woolcock
- Planet/Solar System Generation Wes Connell
- Planet/Solar System Generation icecube@ihug.co.nz
- Planet/Solar System Generation Christopher Allen
- Planet/Solar System Generation J C Lawrence
- Planet/Solar System Generation Nolan Darilek
- Planet/Solar System Generation Wes Connell
- Planet/Solar System Generation Richard Woolcock
- How to handle/display partial language skill Joe Kingry
- How to handle/display partial language skill Greg Underwood
- How to handle/display partial language skill Wes Connell
- How to handle/display partial language skill Matt Chatterley
- Signing off... IronWolf
- Simulated Populations phlUID
- Simulated Populations Charles Hughes
- Simulated Populations Vladimir Prelovac
- Simulated Populations phlUID
- Simulated Populations Dundee
- Simulated Populations Wes Connell
- Simulated Populations Nicolai Hansen
- Simulated Populations J C Lawrence
- Simulated Populations J C Lawrence
- Business Licenses CFrancy@aol.com
- Business Licenses Bruce
- Business Licenses J C Lawrence
- [adv-mud] What good is a hero when nobody knows? (fwd) J C Lawrence
- [adv-mud] What good is a hero when nobody knows? (fwd) Matthew Mihaly
- [adv-mud] What good is a hero when nobody knows? (fwd) Wes Connell
- [adv-mud] What good is a hero when nobody knows? (fwd) Matthew Mihaly
- [adv-mud] What good is a hero when nobody knows? (fwd) Erik Jarvi
- Multiply oriented interactive worlds... Justin Rogers
- [adv-mud] What good is a hero when nobody knows? J C Lawrence
- [adv-mud] Topic list repost (fwd) J C Lawrence
- [adv-mud] Spellbound Hierarchy and Keys (fwd) J C Lawrence
------- Forwarded Message
From: "phlUID" <phluid@mindless.com>
To: "Advanced Mud Listserv" <adv-mud@egroups.com>
Date: Thu, 20 Jan 2000 22:31:48 -0500
I would like to share something small I've been working on
and see if anyone has any opinions on perhaps a better way to
go about doing this:
On Spellbound, every object in the game is given it's own
database number. Help files, races, spells, objects, rooms,
mobiles, exits, worlds, areas, classes, populations, etc.
There are generically two types of database numbers: Pure,
which is just a simple unique number given to every object,
and Hybrid, which is used in the case of Object's and
Mobs. For example, a room is object #43, while the sword
in my inventory is #45:1 and the same type of sword in
my friend's inventory is #45:2. The second number is
referred to as an Entity ID because they refer to specific
Entity's instead of Entries. There is an Entry class for
#45 called ObjectEntry, and there is an associated Entity
class for ObjectEntry called Object. This concept is the
same as DIKU's use of OBJ_INDEX_DATA and OBJ_DATA.
Both Entities and Entries are inheriting from the Savable
class. Everything in the game is Savable more or less,
allowing for the game to remain persistent even across
reboots. Anything that is Savable can be editted in OLC
by using the special attribute manipulation commands built
into the server. Every savable has Attributes, such as
Name, Size, Weight, Owner, and these attributes have
a table of rules that define valid ranges for setting the
actual variables underneath.
The overall hierarchy looks something like this:
Streamable
| |
HIERARCHY OF SPELLBOUND | +---------------------+
(Inheritence Relationships) | Eventable |
| | | | |
Savable------------- | +----------+ | +----+ |
| \| | System | |
+--Entry--+ +--Entity-+ | |
| | | | | | | | | | | Descriptor
+--+ | | | | +---*Room----+ | | | +--+
| | | | +-----*Area------+ | | |
| +--+ | +-------*Exit--------+ +--+ |
| | +------------+ | |
| +-*ObjectEntry | #Object---+ |
+---*CharacterEntry | #Character---+
| |
* - Perminent +-----*Player
# - Persistent
The Streamable class is how general communication is done
between objects, such as sending text to a player or echoing
text to a room. The code just does something like this:
PlayerBob << "{RDon't Panic{x\n\r" << flushl;
The flushl is detected and a subsequent flush( ) is called
on the Streamable class, which flushes the stream buffer.
The actual flush( ) must be defined to make Streamable no
longer an abstract class. The flush( ) for player's empies
out the text to their descriptors (any entity may have
multiple descriptors, ala MUSH.)
I've been using this hierarchy for quite a while, and I've
never had any problems with it.
Anyways.
One day I was coding and thinking about a generic MUD coding
problem:
Currently, Spellbound uses pointers directly to objects
like normal DIKU mud. A room has pointers to the people
that are in the room. An event has a pointer to it's
target. A descriptor has a pointer to it's Incarnation
(Entity). What started to irk me was the fact that these
pointers require a lot of messy cleanup procedures for
when you are destroying the object that they are all
pointing too. This is made worse by the object orientness
of C++, so I began to think of alternate ways of storing
pointers.
The first thing that I wanted to be able to do is validate
pointers. This way I can leave it up to the code that
references these pointers to deal with invalid objects.
Example time.
Bob is in a room. Joe is attacking bob, and has a pointer
to him as a victim. Fred is casting 'Poop Breath' on
Bob. There is an event in the room that is about to make
Bob explode. There is also three mobs using pathfinding
throughout the world to find Bob and hunt him down. However,
Bob somehow upset the admins and they suddenly decide to
@nuke him (destroy him). Now, it is possible for the code
to inform the ENTIRE game that Bob is no longer in existence,
but this would be the most bloatedly laggy thing I can think
of, expessially when we are dealing with objects that are
very temporary, such as Spell Affects.
To give a little more backround, my database saving routine
has a method of converting pointer's into their Database
Numbers and optional Entity IDs so that loading and saving
does not become a problem. The database saving/loading
mechanism also has 4 stages, in which it loads plaintext
data first, pointer data next, entity plaintext data, and
then entity pointer data. This is so that the world can
be reassembled without worrying about object's that don't
exist when you are trying to get pointers to them.
This started my thinking into the idea that it would be
possible to replicate this system to make sure that what
I am referencing is actually there. My database uses
a regular array to return pointer's to DB numbers, so
there is no CPU time involved looking through tables or
linked lists. If I want object #43, I just call
Database.getEntry( 43 ) and it returns a pointer to
that entry.
At this point I made the Key object. A Key is a very
small class that stores 3 number's about the pointer we
want to save. Instead of using a raw pointer to what
I need, I just store the database number, the entity ID,
and a unique identifier. Every savable in the game needs
to have a unique identifier to make sure that we are
actually talking about the right object. This identifier
consists of a count of exactly how many nano or milliseconds
from the epoch. Assuming that no two object's can be created
at the exact same time, this gives each object ever created
a unique identifier.
Lets say I am Fred and I'm attacking Bob. Now, instead of
having a pointer directly to Bob, I have a Key which is
holding Bob's database number, entity ID, and time identifier.
Lets say this is #23, 0, and 48942809324932723. Whenever I
need to get the pointer to Bob to send a message or do
damage, I just ask the database to get me Entity #23:0. I
then need to compare my time identifier with his, because
it is possible that #23 was destroyed and then recreated
as a Fruit Cake, and I'll suddenly be attacking a Fruit Cake
instead of Bob. After a quick validation that our time
identifiers are still the same, I know that my pointer is
valid and I can safely attack Bob.
If the database couldn't find #23, entity 0, or the time
identifier was wrong, I would end up with a NULL pointer,
which will just stop my action and inform Fred that Bob
is no longer there. Simple, effecient error control.
The neat thing about this is that it is also very simple.
The only real question that I had is if anyone can see
ways to improve this process. On the technical side, I
need a way of grabbing the time( ) in an extremely
precise manner, so that even if I create 100 object's in
the same cpu cycle I will end up with unique identifiers
for every object ever created.
Amos Wetherbee,
The Spellbound Project
------- End of Forwarded Message - [adv-mud] Spellbound Hierarchy and Keys (fwd) J C Lawrence
- [adv-mud] Better Grammer Detection J C Lawrence
- [adv-mud] MUD-Dev vs. adv-mud J C Lawrence
- MUD-Dev vs. adv-mud phlUID
- [adv-mud] What good is a hero when nobody knows? phlUID
- (fwd) Avatarism and Role-Playing Game Design claw@kanga.nu
- Starlane test Joel Kelso
- hoho Matthew Mihaly
- Current Status of Middle Earth Online Geoffrey A. MacDougall
- ScryMUD 2.0.10 released. Ben Greear
- [adv-mud] What good is a hero when nobody knows? J C Lawrence
- [adv-mud] What good is a hero when nobody knows? Ben Greear
- [adv-mud] What good is a hero when nobody knows? J C Lawrence
- [adv-mud] What good is a hero when nobody knows? Wes Connell
- [adv-mud] What good is a hero when nobody knows? J C Lawrence
- Some new Library references J C Lawrence