/* db.h */
/*
* Basic structs and stuff for TeenyMUD
*/
struct dsc; /* Forward */
struct obj_data {
/* The usual ints and dbref-ish ints */
int pennies;
dbref loc;
dbref contents;
dbref exits;
dbref rooms;
long timestamp; /* This will be in minutes into the epoch */
/* This is an array of ints */
int *lock;
int *elock;
int *destinations;
/* These are the usual zero terminated strings. */
char *suc;
char *osuc;
char *fail;
char *ofail;
char *drop;
char *odrop;
char *desc;
char *enter;
char *oenter;
char *leave;
char *oleave;
char *idesc;
char *odesc;
char *site;
char *kill;
char *okill;
char *password;
char *otel;
char *oxtel;
char *oxent;
char *oxlea;
char *efail;
char *oefail;
/* for use by the caching system */
struct dsc *descriptor;
struct obj_data *fwd;
struct obj_data *back;
/* on disk size */
long size;
};
/*
* A typical memory resident descriptor. If it describes an actual object, it
* will be referenced by the main object index array, and the name field of
* the ptr union will be meaningful. If it describes a free chunk, the next
* field will be. We do it this way so objects can conveniently be destroyed.
*
*/
struct dsc {
long flags;
dbref owner;
dbref home_dropto; /* Also destination for exits */
int size; /* Size on disk. */
int list_next; /* Used for exits/contents lists */
dbref obj_number; /* real-world object number. not saved */
union {
char *name; /* If describing real data, or.. */
struct dsc *next; /* .. a free chunk/descriptor */
} ptr;
struct obj_data *data;
struct dsc *next; /* free descriptor list */
};
/*
* For reaching in to a descriptor.
*/
#define GodP(a) ((a)->flags & GOD)
#define StickyP(a) ((a)->flags & STICKY)
#define WizP(a) ((a)->flags & WIZARD)
#define RobotP(a) ((a)->flags & ROBOT)
#define LinkOkP(a) ((a)->flags & LINK_OK)
#define HavenP(a) ((a)->flags & HAVEN)
#define JumpOkP(a) ((a)->flags & JUMP_OK)
#define AbodeP(a) ((a)->flags & ABODE)
#define ResidentP(a) ((a)->flags & IN_MEMORY)
#define DirtyP(a) ((a)->flags & DIRTY)
#define PlayerP(a) (((a)->flags & TYPE_MASK) == TYP_PLAYER)
#define ThingP(a) (((a)->flags & TYPE_MASK) == TYP_THING)
#define RoomP(a) (((a)->flags & TYPE_MASK) == TYP_ROOM)
#define ExitP(a) (((a)->flags & TYPE_MASK) == TYP_EXIT)
#define DSC_NAME(a) (((a)->ptr).name)
#define DSC_DATA(a) ((a)->data)
#define DSC_SIZE(a) ((a)->size)
#define DSC_FLAGS(a) ((a)->flags)
#define DSC_OWNER(a) ((a)->owner)
#define DSC_NUMBER(a) ((a)->obj_number)
#define DSC_HOME(a) ((a)->home_dropto)
#define DSC_DROPTO(a) ((a)->home_dropto)
#define DSC_DESTINATION(a) ((a)->home_dropto)
#define DSC_NEXT(a) ((a)->list_next)
/*
* Initial size of an object (a *total* grey box). One int each for: pennies,
* location, exits, contents, One int for a blank lock (a -1 on disk), A \0
* on disk for each of the empty strings suc, osuc, fail, ofail, desc, etc.
*
*/
#define INITIAL_SIZE (9 * sizeof(int)) + 23
/*
* Tuning variables -- how much to grow the index by when you run out of
* space for more entries, and how much slack space to start with when you
* bring up an existing database. Ideally, SLACK is the number of objects
* that will be created between start time, and when you bring it down, so
* you never actually run out of index space.
*/
#define GROWTH_INCREMENT 1024
#define SLACK 512
#define DSC_SLACK 32