home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / games / tinymud2.zip / DB.H < prev    next >
C/C++ Source or Header  |  1990-09-02  |  6KB  |  177 lines

  1. #include "copyright.h"
  2.  
  3. #ifndef __DB_H
  4. #define __DB_H
  5. #include <stdio.h>
  6.  
  7. extern void *malloc(unsigned long);
  8. extern void *realloc(void *, unsigned long);
  9. extern void free(void *);
  10.  
  11. #ifdef TEST_MALLOC
  12. extern int malloc_count;
  13. #define malloc(x) (malloc_count++, malloc(x))
  14. #define free(x) (malloc_count--, free(x))
  15. #endif /* TEST_MALLOC */
  16.  
  17. typedef int dbref;        /* offset into db */
  18.  
  19. #define TYPE_ROOM     0x0
  20. #define TYPE_THING     0x1
  21. #define TYPE_EXIT     0x2
  22. #define TYPE_PLAYER     0x3
  23. #define NOTYPE        0x7    /* no particular type */
  24. #define TYPE_MASK     0x7    /* room for expansion */
  25. #define ANTILOCK    0x8    /* negates key (*OBSOLETE*) */
  26. #define WIZARD        0x10    /* gets automatic control */
  27. #define LINK_OK        0x20    /* anybody can link exits to this room */
  28. #define DARK        0x40    /* contents of room are not printed */
  29. #define TEMPLE        0x80    /* objects dropped in this room go home */
  30. #define STICKY        0x100    /* this object goes home when dropped */
  31.  
  32. #ifdef RESTRICTED_BUILDING
  33. #define BUILDER        0x200    /* this player can use construction commands */
  34. #endif /* RESTRICTED_BUILDING */
  35.  
  36. #define HAVEN           0x400   /* this room prohibits killing */
  37. #define ABODE           0x800   /* can link objects or players here */
  38.  
  39. #ifdef GENDER
  40. #define GENDER_MASK    0x3000    /* 2 bits of gender */
  41. #define GENDER_SHIFT    12    /* 0x1000 is 12 bits over (for shifting) */
  42. #define GENDER_UNASSIGNED    0x0    /* unassigned - the default */
  43. #define GENDER_NEUTER    0x1    /* neuter */
  44. #define GENDER_FEMALE    0x2    /* for women */
  45. #define GENDER_MALE    0x3    /* for men */
  46.  
  47. #ifdef ROBOT_MODE
  48. #define ROBOT        0x4000  /* Can set OUTPUTPREFIX */
  49. #endif ROBOT_MODE
  50.  
  51. #define UNWANTED        0x8000  /* can be chowned */
  52.  
  53. #define TABULAR_WHO     0x10000
  54. #define REVERSED_WHO    0x20000
  55.  
  56. #define Genderof(x) ((db[(x)].flags & GENDER_MASK) >> GENDER_SHIFT)
  57. #endif /* GENDER */
  58.  
  59. typedef int object_flag_type;
  60.  
  61. #define Flag(x,f) ((db[(x)].flags & (f)) != 0)
  62.  
  63. #define Typeof(x) (db[(x)].flags & TYPE_MASK)
  64. #define Wizard(x) ((db[(x)].flags & WIZARD) != 0)
  65. #ifdef ROBOT_MODE
  66. #define Robot(x) ((db[(x)].flags & ROBOT) != 0)
  67. #endif ROBOT_MODE
  68. #define Dark(x) ((db[(x)].flags & DARK) != 0)
  69. #ifdef GOD_PRIV
  70. #define GOD ((dbref)1)
  71. #define    God(x) ((x)==GOD)
  72. #endif GOD_PRIV
  73.  
  74. #ifdef RECYCLE
  75. #define RECYCLER "Recycler"
  76. #endif
  77.  
  78. #ifdef RESTRICTED_BUILDING
  79. #define Builder(x) ((db[(x)].flags & (WIZARD|BUILDER)) != 0)
  80. #endif /* RESTRICTED_BUILDING */
  81.  
  82. /* Boolean expressions, for locks */
  83. typedef char boolexp_type;
  84.  
  85. #define BOOLEXP_AND 0
  86. #define BOOLEXP_OR 1
  87. #define BOOLEXP_NOT 2
  88. #define BOOLEXP_CONST 3
  89.  
  90. struct boolexp {
  91.   boolexp_type type;
  92.   struct boolexp *sub1;
  93.   struct boolexp *sub2;
  94.   dbref thing;
  95. };
  96.  
  97. #define TRUE_BOOLEXP ((struct boolexp *) 0)
  98.  
  99. /* special dbref's */
  100. #define NOTHING (-1)        /* null dbref */
  101. #define AMBIGUOUS (-2)        /* multiple possibilities, for matchers */
  102. #define HOME (-3)        /* virtual room, represents mover's home */
  103.  
  104. struct object {
  105.     const char *name;            
  106.     const char *description;        
  107.     dbref location;        /* pointer to container */
  108.                 /* for exits, pointer to destination */
  109.     dbref contents;        /* pointer to first item */
  110.     dbref exits;        /* pointer to first exit for rooms */
  111.                     /* pointer to home for things and players */
  112.     dbref next;            /* pointer to next in contents/exits chain */
  113.  
  114.     /* the following are used for pickups for things, entry for exits */
  115.     struct boolexp *key;    /* if not NOTHING, must have this to do op */
  116.     const char *fail_message;        /* what you see if op fails */
  117.     const char *succ_message;        /* what you see if op succeeds */
  118.     /* other messages get your name prepended, so if your name is "Foo", */
  119.     /* and osuccess = "disappears in a blast of gamma radiation." */
  120.     /* then others see "Foo disappears in a blast of gamma radiation." */
  121.     /* (At some point I may put in Maven-style %-substitutions.) */
  122.     const char *ofail;        /* what others see if op fails */
  123.     const char *osuccess;    /* what others see if op succeeds */
  124.  
  125.     dbref owner;        /* who controls this object */
  126.     int pennies;        /* number of pennies object contains */
  127.     object_flag_type flags;
  128.     const char *password;    /* password for players */
  129. };
  130.  
  131. extern struct object *db;
  132. extern dbref db_top;
  133.  
  134. extern const char *alloc_string(const char *s);
  135.  
  136. extern dbref new_object();    /* return a new object */
  137.  
  138. extern dbref getref (FILE *);   /* Read a database reference from a file. */
  139.  
  140. extern void putref (FILE *, dbref); /* Write one ref to the file */
  141.  
  142. extern struct boolexp *getboolexp(FILE *); /* get a boolexp */
  143. extern void putboolexp(FILE *, struct boolexp *); /* put a boolexp */
  144.  
  145. extern int db_write_object(FILE *, dbref); /* write one object to file */
  146.  
  147. extern dbref db_write(FILE *f);    /* write db to file, return # of objects */
  148.  
  149. extern dbref db_read(FILE *f);    /* read db from file, return # of objects */
  150.                 /* Warning: destroys existing db contents! */
  151.  
  152. extern void free_boolexp(struct boolexp *);
  153. extern void db_free(void);
  154.  
  155. extern dbref parse_dbref(const char *);    /* parse a dbref */
  156.  
  157. #define DOLIST(var, first) \
  158.   for((var) = (first); (var) != NOTHING; (var) = db[(var)].next)
  159. #define PUSH(thing, locative) \
  160.     ((db[(thing)].next = (locative)), (locative) = (thing))
  161. #define getloc(thing) (db[thing].location)
  162.  
  163. /*
  164.   Usage guidelines:
  165.  
  166.   To refer to objects use db[object_ref].  Pointers to objects may 
  167.   become invalid after a call to new_object().
  168.  
  169.   The programmer is responsible for managing storage for string
  170.   components of entries; db_read will produce malloc'd strings.  The
  171.   alloc_string routine is provided for generating malloc'd strings
  172.   duplicates of other strings.  Note that db_free and db_read will
  173.   attempt to free any non-NULL string that exists in db when they are
  174.   invoked.  
  175. */
  176. #endif /* __DB_H */
  177.