/* db.h */
/* $Id: db.h,v 1.18 1993/10/18 01:11:48 nils Exp $ */
#include "config.h"
/* Warning some comments maybe out of date read with caution :) */
#ifndef __DB_H
#define __DB_H
#include <stdio.h>
#ifndef XENIX
extern void *malloc();
extern void *realloc();
extern void free();
#endif /* XENIX */
extern int depth;
#ifdef TEST_MALLOC
extern int malloc_count;
#define malloc(x) (malloc_count++, malloc(x))
#define free(x) (malloc_count--, free(x))
#endif /* TEST_MALLOC */
typedef int dbref; /* offset into db */
#define IS(thing,type,flag) ((Typeof(thing)==type) &&\
(db[thing].flags & flag))
extern dbref first_free; /* pointer to free list */
#define FIX fix_free_list()
typedef long object_flag_type;
/* flag definitions */
#define TYPE_MASK 0xF /* room for expansion */
#define TYPE_ROOM 0x0
#define TYPE_THING 0x1
#define TYPE_EXIT 0x2
#define NOTYPE 0x7 /* no particular type */
#define TYPE_PLAYER 0x8
#define NUM_OBJ_TYPES 0x9 /* number of object types */
#define CHOWN_OK 0x20
#define DARK 0x40 /* contents of room are not printed */
#define STICKY 0x100 /* this object goes home when dropped */
#define HAVEN 0x400 /* object can't execute commands */
#define INHERIT_POWERS 0x2000 /* gives object powers of its owner */
#define GOING 0x4000 /* object is available for recycling */
#define ACCESSED 0x8000 /* object has been accessed recently */
#define MARKED 0x10000
#define PUPPET 0x20000
#define LINK_OK 0x40000 /* anybody can link to this room */
#define ENTER_OK 0x80000
#define SEE_OK 0x100000
#define OPAQUE 0x800000
#define QUIET 0x1000000
#define BEARING 0x8000000
/* type specific flags */
/* Thing flags */
#define THING_KEY 0x10
#define THING_LIGHT 0x80
#define THING_DEST_OK 0x200
#define THING_SACROK 0x1000
/* Exit flags */
#define EXIT_LIGHT 0x10
/* Player flags */
#define PLAYER_NEWBIE 0x10
#define PLAYER_SLAVE 0x80
#define PLAYER_CONNECT 0x200
#define PLAYER_MORTAL 0x800
#define PLAYER_TERSE 0x400000
#define PLAYER_NO_WALLS 0x2000000
/* #define PLAYER_GROUPED 0x4000000 */
/* Room flags */
#ifdef USE_SPACE
#define ROOM_ZEROG 0x10
#endif
#define ROOM_TEMPLE 0x80
#define ROOM_JUMP_OK 0x200
#define ROOM_AUDITORIUM 0x800
#define ROOM_FLOATING 0x1000
/* end of flags */
/* macro to make set string easier to use */
#define SET(astr,bstr) do { \
char **__a, *__b; __a=(&(astr)); __b=(bstr); \
if (*__a) free(*__a); \
if (!__b || !*__b) *__a=NULL; \
else { \
*__a = malloc(strlen(__b)+1); \
strcpy(*__a,__b); \
} \
} while(0)
/* set macro for compressed strings */
#ifdef COMPRESS
#define SETC(a,b) SET(a,compress(b))
#else
#define SETC(a,b) SET(a,b)
#endif
/* Updates an objects age */
#define Access(x) (db[(x)].flags|=ACCESSED)
/*#define RLevel(x) (db[(x)].flags & TYPE_MASK)*/
#define Robot(x) ((Typeof(x) == TYPE_PLAYER) && ((x) != db[(x)].owner))
#define Guest(x) ((Typeof(x)==TYPE_PLAYER && *db[x].pows == CLASS_GUEST))
#define Dark(x) (((db[(x)].flags & DARK) != 0) && \
(Typeof(x)!=TYPE_PLAYER) && !(db[(x)].flags & PUPPET))
#define Alive(x) ((Typeof(x)==TYPE_PLAYER) || \
((Typeof(x)==TYPE_THING) && (db[x].flags & PUPPET)))
#define Builder(x) ((db[db[(x)].owner].flags & PLAYER_BUILD) || \
(Typeof(x) == TYPE_PLAYER && *db[x].pows == CLASS_DIR) \
|| Wizard(x))
char *atr_get();
typedef struct attr ATTR;
struct attr {
/* name of attribute */
char *name;
int flags;
dbref obj; /* object where this is defined. NOTHING for
* builtin. */
int refcount; /* number of things that reference us. */
};
/* Attribute flags */
#define AF_OSEE 1 /* players other than owner can see it */
#define AF_DARK 2 /* No one can see it */
#define AF_WIZARD 4 /* only wizards can change it */
#define AF_UNIMP 8 /* not important -- don't save it in the db */
#define AF_NOMOD 16 /* not even wizards can't modify this */
#define AF_DATE 32 /* date stored in universal longint form */
#define AF_INHERIT 64 /* value inherited by childern */
#define AF_LOCK 128 /* interpreted as a boolean expression */
#define AF_FUNC 256 /* this is a user defined function */
#ifdef USE_SPACE /* Atrib Flag added by Michael Majere */
#define AF_SPACE 512 /* used with space() */
#endif
#define DOATTR(var, name, flags, num) extern ATTR *var;
#define DECLARE_ATTR
#include "attrib.h"
#undef DECLARE_ATTR
#undef DOATTR
/*
extern ATTR *A_OSUCC;
extern ATTR *A_OFAIL;
extern ATTR *A_FAIL;
extern ATTR *A_SUCC;
extern ATTR *A_PASS;
extern ATTR *A_DESC;
extern ATTR *A_SEX;
extern ATTR *A_ODROP;
extern ATTR *A_DROP;
extern ATTR *A_OKILL;
extern ATTR *A_KILL;
extern ATTR *A_ASUCC;
extern ATTR *A_AFAIL;
extern ATTR *A_ADROP;
extern ATTR *A_AKILL;
extern ATTR *A_USE;
extern ATTR *A_OUSE;
extern ATTR *A_AUSE;
extern ATTR *A_CHARGES;
extern ATTR *A_RUNOUT;
extern ATTR *A_STARTUP;
extern ATTR *A_ACLONE;
extern ATTR *A_APAY;
extern ATTR *A_OPAY;
extern ATTR *A_PAY;
extern ATTR *A_COST;
extern ATTR *A_RAND;
extern ATTR *A_LISTEN;
extern ATTR *A_AAHEAR;
extern ATTR *A_AMHEAR;
extern ATTR *A_AHEAR;
extern ATTR *A_LAST;
extern ATTR *A_QUEUE;
extern ATTR *A_IDESC;
extern ATTR *A_ENTER;
extern ATTR *A_OENTER;
extern ATTR *A_AENTER;
extern ATTR *A_ADESC;
extern ATTR *A_ODESC;
extern ATTR *A_RQUOTA;
extern ATTR *A_IDLE;
extern ATTR *A_AWAY;
extern ATTR *A_MAILK;
extern ATTR *A_ALIAS;
extern ATTR *A_EFAIL;
extern ATTR *A_OEFAIL;
extern ATTR *A_AEFAIL;
extern ATTR *A_IT;
extern ATTR *A_LEAVE;
extern ATTR *A_OLEAVE;
extern ATTR *A_ALEAVE;
extern ATTR *A_CHANNEL;
extern ATTR *A_QUOTA;
extern ATTR *A_PENNIES;
extern ATTR *A_HUHTO;
extern ATTR *A_HAVEN;
#ifdef EMAIL_CREATE
extern ATTR *A_EMAIL;
#endif
extern ATTR *A_TZ;
extern ATTR *A_DOOMSDAY;
extern ATTR *A_MOVE;
extern ATTR *A_AMOVE;
extern ATTR *A_OMOVE;
extern ATTR *A_LOCK;
extern ATTR *A_ELOCK;
extern ATTR *A_ULOCK;
extern ATTR *A_UFAIL;
extern ATTR *A_OUFAIL;
extern ATTR *A_AUFAIL;
extern ATTR *A_OCONN;
extern ATTR *A_ACONN;
extern ATTR *A_ODISC;
extern ATTR *A_ADISC;
extern ATTR *A_COLUMNS;
extern ATTR *A_WHOFLAGS;
extern ATTR *A_WHONAMES;
extern ATTR *A_APAGE;
extern ATTR *A_APEMIT;
extern ATTR *A_AWHISPER;
extern ATTR *A_LLOCK;
extern ATTR *A_LFAIL;
extern ATTR *A_OLFAIL;
extern ATTR *A_ALFAIL;
extern ATTR *A_SLOCK;
extern ATTR *A_SFAIL;
extern ATTR *A_OSFAIL;
extern ATTR *A_ASFAIL;
extern ATTR *A_USERS;
extern ATTR *A_DEFOWN;
#ifdef USE_SPACE
extern ATTR *A_ASHIP;
extern ATTR *A_SECTOR;
extern ATTR *A_MASS;
extern ATTR *A_RADIUS;
extern ATTR *A_THRUST;
extern ATTR *A_RATING;
extern ATTR *A_EFFICIENCY;
extern ATTR *A_FUEL;
extern ATTR *A_ACCELERATION;
extern ATTR *A_VISMULT;
extern ATTR *A_PWRGEN;
extern ATTR *A_PWRFUEL;
extern ATTR *A_SPRSTR;
extern ATTR *A_HULL;
extern ATTR *A_RECOVER;
extern ATTR *A_TYPE;
extern ATTR *A_ENERGY;
extern ATTR *A_LINPOSX;
extern ATTR *A_LINPOSY;
extern ATTR *A_LINPOSZ;
extern ATTR *A_LINVELX;
extern ATTR *A_LINVELY;
extern ATTR *A_LINVELZ;
extern ATTR *A_LINACCX;
extern ATTR *A_LINACCY;
extern ATTR *A_LINACCZ;
extern ATTR *A_ANGPOSX;
extern ATTR *A_ANGPOSY;
extern ATTR *A_ANGPOSZ;
extern ATTR *A_ANGVELX;
extern ATTR *A_ANGVELY;
extern ATTR *A_ANGVELZ;
extern ATTR *A_ANGACCX;
extern ATTR *A_ANGACCY;
extern ATTR *A_ANGACCZ;
extern ATTR *A_S0;
extern ATTR *A_S1;
extern ATTR *A_S2;
extern ATTR *A_S3;
extern ATTR *A_S4;
extern ATTR *A_S5;
extern ATTR *A_S6;
extern ATTR *A_S7;
extern ATTR *A_S8;
extern ATTR *A_S9;
#endif
extern ATTR *A_TALENT;
extern ATTR *A_DOING;
extern ATTR *A_RACE;
extern ATTR *A_LHIDE;
extern ATTR *A_LPAGE;
extern ATTR *A_WARNINGS;
extern ATTR *A_WINHIBIT;
extern ATTR *A_ANEWS;
*/
/* attribute access macros */
#define Osucc(thing) atr_get(thing,A_OSUCC)
#define Ofail(thing) atr_get(thing,A_OFAIL)
#define Fail(thing) atr_get(thing,A_FAIL)
#define Succ(thing) atr_get(thing,A_SUCC)
#define Pass(thing) atr_get(thing,A_PASS)
#define Desc(thing) atr_get(thing,A_DESC)
#define Idle(thing) atr_get(thing,A_IDLE)
#define Away(thing) atr_get(thing,A_AWAY)
#define Pennies(thing) atoi(atr_get(thing,A_PENNIES))
#define Home(thing) (db[thing].exits)
#define Exits(thing) (db[thing].exits)
#define s_Osucc(thing,s) atr_add(thing,A_OSUCC,s)
#define s_Ofail(thing,s) atr_add(thing,A_OFAIL,s)
#define s_Fail(thing,s) atr_add(thing,A_FAIL,s)
#define s_Succ(thing,s) atr_add(thing,A_SUCC,s)
#define s_Pass(thing,s) atr_add(thing,A_PASS,s)
#define s_Desc(thing,s) atr_add(thing,A_DESC,s)
#define s_Pennies(thing,pp) ((pp>10000)?(atr_add(thing,A_PENNIES,"9900"),1):(atr_add(thing,A_PENNIES,int_to_str(pp)),1))
#define s_Exits(thing,pp) (db[thing].exits=(pp))
#define s_Home(thing,pp) (db[thing].exits=(pp))
extern char *int_to_str();
#define Astr(alist) ((char *)(&((alist)[1])))
#ifdef SMALL
typedef struct alist ALIST;
/* This may seem very contorted but prior to these changes this structure
contained most of the uneeded overhead in the mud */
struct alist {
/* note!!! this is only a character type for now it may change in the
future if/when more types are needed */
/* if high bit set 1 byte follows giving negative relative offset
to next attribute */
/* if not set sizeof(ALIST *) bytes follow giving absolute offset */
/* Note: Alist is not word aligned these must be copied into a valid
pointer */
unsigned char al_type;
};
/* macros to deal with ALIST structure, without knowing how yucky it is:) */
/*#define Astr(alist) ((unsigned char *)(&((alist)[1])))*/
/* get type */
#define AL_TYPE(alist) ((alist)->al_type & 127)
/* get string associated with */
#define AL_STR(alist) (((alist)->al_type & 128) ? (Astr(alist)+1) :\
(Astr(alist)+sizeof(ALIST *)))
/* get next pointer */
ALIST *AL_GETPTR();
#define AL_NEXT(alist) ((alist)->al_type & 128) ? \
/* first case this is a relative offset */\
((ALIST *)(((char *)(alist))-*Astr(alist))):\
/* otherwise pointer follows */\
AL_GETPTR(alist)
/* dispose of attribute (set type==0) */
#define AL_DISPOSE(alist) ((alist)->al_type&=128)
#endif
#ifndef SMALL
typedef struct alist ALIST;
typedef short atr_flag_t;
struct alist {
ALIST *next;
ATTR *AL_type;
};
#define AL_TYPE(alist) ((alist)->AL_type)
#define AL_STR(alist) (Astr(alist))
#define AL_NEXT(alist) ((alist)->next)
#define AL_DISPOSE(alist) ((alist)->AL_type=0)
#endif
/* special dbref's */
#define NOTHING (-1) /* null dbref */
#define AMBIGUOUS (-2) /* multiple possibilities, for matchers */
#define HOME (-3) /* virtual room, represents mover's home */
typedef char ptype;
typedef struct atrdef ATRDEF;
struct atrdef {
ATTR a;
ATRDEF *next;
};
struct object {
char *name;
dbref location; /* pointer to container */
/* for exits, pointer to destination */
dbref zone; /* zone reference for object */
dbref contents; /* pointer to first item */
dbref exits; /* pointer to first exit for rooms */
dbref link; /* pointer to home/destination */
dbref next; /* pointer to next in contents/exits chain */
ptype *pows;
/* the following are used for pickups for things, entry for exits */
dbref owner; /* who controls this object */
object_flag_type flags;
ALIST *list;
#ifdef DO_AGE
dbref num1,num2; /* space used to sort by access time */
#endif
struct atrdef *atrdefs;
dbref *parents;
dbref *children;
long mod_time, create_time;
};
extern struct object *db;
extern dbref db_top;
extern char *alloc_string();
extern dbref new_object(); /* return a new object */
extern dbref getref (); /* Read a database reference from a file. */
extern void putref (); /* Write one ref to the file */
extern int db_write_object(); /* write one object to file */
extern dbref db_write(); /* write db to file, return # of objects */
extern dbref db_read(); /* read db from file, return # of objects */
/* Warning: destroys existing db contents! */
extern void db_free();
extern dbref parse_dbref(); /* parse a dbref */
extern int dozonetemp;
#define DOZONE(var, first) \
for (dozonetemp=0,var=get_zone_first(first); var!=NOTHING && dozonetemp<10; var=get_zone_next(var), dozonetemp++)
#define DOLIST(var, first) \
for((var) = (first); (var) != NOTHING; (var) = db[(var)].next)
#define PUSH(thing, locative) \
((db[(thing)].next = (locative)), (locative) = (thing))
#define getloc(thing) (db[thing].location)
#include "powers.h"
#define Typeof(x) (db[x].flags&TYPE_MASK)
#define God(x) ((x) == GOD)
/* stuff for doomsday */
#define IS_DOOMED(x) ((*atr_get((x),A_DOOMSDAY))&&(db[x].flags&GOING)&&(atoi(atr_get((x),A_DOOMSDAY))>0))
#define IS_GONE(x) ((db[(x)].flags&GOING)&&!*atr_get((x),A_DOOMSDAY))
#define PUSH_L(list,value) (push_list(&(list),(value)))
#define REMOVE_FIRST_L(list, value) (remove_first_list(&(list),(value)))
struct all_atr_list {
ATTR *type;
char *value;
int numinherit;
struct all_atr_list *next;
};
#define unref_atr(foo) do { if((foo)) if(0==--(foo)->refcount) { if((foo)->name) free((foo)->name); free((foo)); } } while(0)
#define ref_atr(foo) do { ((foo)->refcount++); } while(0)
#endif /* __DB_H */