/
Crimson2/alias/
Crimson2/area.tmp/
Crimson2/area.tmp/AnomalySpaceDock/
Crimson2/area.tmp/AnomalyStation/
Crimson2/area.tmp/AntHill/
Crimson2/area.tmp/ArcticTerrarium/
Crimson2/area.tmp/BuilderCity/
Crimson2/area.tmp/Dungeon/
Crimson2/area.tmp/MiningDock/
Crimson2/area.tmp/PipeSystem/
Crimson2/area.tmp/RattArea/
Crimson2/area.tmp/RobotFactory/
Crimson2/area.tmp/SilverDale/
Crimson2/area.tmp/StarshipFearless/
Crimson2/area.tmp/StationConduits/
Crimson2/area.tmp/TerrariumAlpha/
Crimson2/area.tmp/TerrariumBeta/
Crimson2/area.tmp/TestArea/
Crimson2/area.tmp/Void/
Crimson2/area/
Crimson2/area/AnomalySpaceDock/
Crimson2/area/AnomalyStation/
Crimson2/area/MiningDock/
Crimson2/area/PipeSystem/
Crimson2/area/SilverDale/
Crimson2/area/StationConduits/
Crimson2/area/Void/
Crimson2/board/
Crimson2/clone/
Crimson2/lib/
Crimson2/mole/
Crimson2/mole/mole_src/HELP/
Crimson2/player/
Crimson2/util/
Crimson2/wldedit/
Crimson2/wldedit/res/
/* Crimson2 Mud Server
 * All source written/copyright Ryan Haksi 1995 *
 * (yes *ALL* code was written by me from scratch! any similarities to other
 *  muds is strictly coincidence)
 *
 * This source code is proprietary, if you are using it without my express
 * permission you are violating the copyright act and can potentially be
 * sued.
 * That said, if you would like to use it, I'm not an ogre, gimme a call
 * and maybe we can work something out.
 * (NOTE: File formats are mostly diku compatible so migrating to crimson2
 *  from your current diku flavour should prove reasonably easy!)
 * (and by the way it MURDERS dikumud servers in every respect *GRIN*!)
 *
 * Current email address: cryogen@unix.infoserve.net
 * Phone number: (604) 591-9746
 * snail mail:
 * 14095 57A Ave
 * Surrey, BC
 * V3X 2W2
 * Canada
 */

/* "object" hierarchy:

  THING
   |____________________________
   |                            |
  WLD                          BASE
                                |__________
                                |          |
                               CHR        OBJ
                               _|_____
                              |       |
                             PLR     MOB

NOTE: the 3 letter "leaf" entries are stored in files of the same extension,
ie WLD structures are stored in <filename>.wld files etc etc

I'm still not entirely sold on this being the best way to do this, since things
like worldList and objectList are now of type WLD/OBJ rather than something more
intuitive like WORLDLIST and OBJECTLIST.... oh well just remember that "things"
in the game have 3 letter types and you should be okay
*/

#define TTYPE_UNDEF     0
#define TTYPE_WLD       1

#define TTYPE_BASE      2 /* everything greater than this is a base type */
#define TTYPE_OBJ       2

#define TTYPE_CHARACTER 3 /* so far everything greater than this is a character */
#define TTYPE_MOB       3
#define TTYPE_PLR       4

/* for everything */
struct ThingType {
  BYTE                  tType;

  STR                  *tSDesc;   /* name/short string ie Kobold/A Dagger/PName */
  STR                  *tDesc;    /* paragraph or so description, what you see when you look <key> */

  EXTRA                *tExtra;   /* if we have any extras associated, player/mob/obj desc is an extra */
  LWORD                 tWait;    /* control for how soon next action takes place */
  LWORD                 tIdleWait;/* control for how soon next @IDLE event takes place */
  PROPERTY             *tProperty;/* property list - including attached scripts/special procs */
  FLAG                  tFlag;    /* system flags */

  THING                *tNext;
  THING                *tContain; /* any Thing can contain other Things - ie players can carry other players! */
};

#define TF_COMPILE            1<<0 /* thing contains uncompiled code, only used for WLD's */
#define TF_TRAVERSED          1<<1 /* to prevent Track routine from circling, only used for WLD's */

#define TF_IDLECODE           1<<2
#define TF_FIGHTINGCODE       1<<3
#define TF_COMMANDCODE        1<<4
#define TF_ENTRYCODE          1<<5
#define TF_DEATHCODE          1<<6
#define TF_EXITCODE           1<<7
#define TF_FLEECODE           1<<8
#define TF_RESETCODE          1<<9
#define TF_DAMAGECODE         1<<10
#define TF_USECODE            1<<11
#define TF_AFTERFIGHTINGCODE  1<<12
#define TF_AFTERCOMMANDCODE   1<<13
#define TF_AFTERENTRYCODE     1<<14
#define TF_AFTERDEATHCODE     1<<15
#define TF_AFTEREXITCODE      1<<16
#define TF_AFTERFLEECODE      1<<17
#define TF_AFTERRESETCODE     1<<18
#define TF_AFTERDAMAGECODE    1<<19
#define TF_AFTERUSECODE       1<<20
#define TF_CODETHING          1<<21
#define TF_AFTERATTACKCODE    1<<22

extern INDEX  eventThingIndex;
extern BYTE  *tFlagList[];

extern void   ThingInit(void);
extern void   ThingFrom(THING *thing);
extern void   ThingTo(THING *thing, THING *destThing);
extern void   ThingExtract(THING *thing);
extern THING *ThingFree(THING *thing);

#define TF_CONTINUE     1<<0 /* continue last search */
#define TF_PLR          1<<1 /* find a plr in searches contain field */
#define TF_OBJ          1<<2 /* find an obj in searches contain field */
#define TF_MOB          1<<3 /* find a mob in searches contain field */
#define TF_PLR_ANYWHERE 1<<4 /* any plr in game, people inside NULL *DONT* count */
#define TF_MOB_ANYWHERE 1<<5 /* any mob in game, NOTE: wont search "search" twice */
#define TF_OBJ_ANYWHERE 1<<6 /* any obj in game */
#define TF_PLR_WLD      1<<7 /* any plr inside a wld structure */
#define TF_MOB_WLD      1<<8 /* any mob inside a wld structure */
#define TF_OBJ_WLD      1<<9 /* any obj inside a wld structure (ie not carried) */
#define TF_WLD          1<<10 /* find a wld structure treat name as a keylist */
#define TF_OBJINV       1<<11 /* find an inv obj in searches contain field */
#define TF_OBJEQUIP     1<<12 /* find an equiped obj in searches contain field */

#define TF_ALLMATCH     -1

extern THING *ThingFind(BYTE *key, LWORD virtual, THING *search, FLAG findFlag, LWORD *offset);
extern EXIT  *ThingTrack(THING *thing, THING *track, LWORD maxHop);
extern EXIT  *ThingTrackStr(THING *thing, BYTE *key, LWORD maxHop);

#define TCS_CANTSEE     0
#define TCS_SEEPARTIAL  1
#define TCS_SEENORMAL   2

extern LWORD  ThingCanSee(THING *thing, THING *show);
extern LWORD  ThingCanHear(THING *thing, THING *hear);
extern THING *ThingShow(THING *show, THING *thing);
extern void   ThingShowDetail(THING *show, THING *thing, BYTE showDesc);
extern THING *ThingFindFlag(THING *thing, FLAG flag);
extern void   ThingClearEvent();
extern BYTE   ThingIsEvent(void *thing);
extern void   ThingSetEvent(void *thing);
extern void   ThingClearEvent();
extern void   ThingDeleteEvent(void *thing);

#define THINGFREE(thing) (thing=ThingFree(thing))
#define Thing(x) ((THING*)(x))