/
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/
/* Dynamic Structure header file */
// 2-char identifier: ds

#ifndef __DSTRUCT_H__
#define __DSTRUCT_H__

/* structure types */
#define DS_STYPE_NONE         0
#define DS_STYPE_EXIT         1
#define DS_STYPE_EXTRA        2
#define DS_STYPE_PROPERTY     3
#define DS_STYPE_AREADETAIL   4
#define DS_STYPE_RESET        5
#define DS_STYPE_LIST         6 /* ALL list sub-types must come AFTER this type!! */
#define DS_STYPE_AREA         7
#define DS_STYPE_WORLD        8
#define DS_STYPE_MOBILE       9
#define DS_STYPE_OBJECT      10

/* Network states */
#define DS_NS_NONE        0 /* data does not exist */
#define DS_NS_NOTAVAIL    1 /* data exists but hasn't been fetched yet */
#define DS_NS_PENDING     2 /* data exists and a request has been sent - awaiting return */
#define DS_NS_AVAIL       3 /* data exists and is available presently */

/* Flags */
#define DS_FLAG_WINOPEN   (1<<0) /* 'open' in the hierarchy window */

/* constants */
#define DS_FTL_NAMELEN 50
#define DS_OBJECT_MAX_APPLY 4 /* This must correspond to the server */

/* FLAG Macros */
#define DSBITSET(flag,bit)    (flag)|=(bit)
#define DSBITCLEAR(flag,bit)  (flag)=((flag)|(bit))^(bit)
#define DSBITFLIP(flag,bit)   (flag)^=(bit)
#define DSISBITSET(flag,bit)  ((flag)&(bit))

/* Structure pre-definitions */
struct DSREFtag;
struct DSSTRtag;
struct DSSTRUCTtag;
struct DSSLISTtag;

/***** Master structures *****/

/* types compatible with server */
#ifdef WIN32
typedef unsigned char   DSBYTE;
typedef char            DSSBYTE;
typedef short           DSWORD;
typedef unsigned short  DSUWORD;
typedef int             DSLWORD;
typedef unsigned int    DSULWORD;
typedef unsigned int    DSFLAG;
#else
typedef unsigned char   DSBYTE;
typedef char            DSSBYTE;
typedef int             DSWORD;
typedef unsigned int    DSUWORD;
typedef long            DSLWORD;
typedef unsigned long   DSULWORD;
typedef unsigned long   DSFLAG;
#endif

/* reference structure - all references pieces of data are done through this */
typedef struct DSREFtag {
  int rState;
  unsigned long rLoadTime; /* time structure was received from host */
  unsigned long rFlag; /* flags */
  struct DSSTRUCTtag *rList; /* list of data objects */
  HWND rEditWindow; /* used by some editing functions (ie: reset )*/
} DSREF;

/* String structure */
typedef struct DSSTRtag {
  char *sData; /* pointer to data buffer */
  HGLOBAL sMemory; /* memory handle for structure */
} DSSTR;

/* flag/type List structure */
typedef struct DSFTLtag { /* I called it this to avoid confusion with DSSLIST */
  char fName[DS_FTL_NAMELEN];
  HGLOBAL fMemory;
  struct DSFTLtag *fNext,*fDown;
  int fType;
  int fList;
} DSFTL;

/* generic structure type */
typedef struct DSSTRUCTtag {
  int sType;       /* type of structure */
  int sState;      /* network state */
  unsigned long sLoadTime; /* time structure was received from host */
  HWND sEditWindow; /* window currently open to edit this structure */
  HGLOBAL sMemory; /* memory handle for this structure */
  struct DSSTRUCTtag *sPrevious,*sNext; /* links to prev, next, and "up" structures */
  struct DSREFtag *sUpRef; /* reference to upper reference */
} DSSTRUCT;

typedef struct DSSEXTRAtag {
  DSSTRUCT  eStruct;
  DSSTR     eKey;
  DSSTR     eDesc;
} DSSEXTRA;

typedef struct DSSPROPERTYtag {
  DSSTRUCT  pStruct;
  DSSTR     pKey;
  DSSTR     pDesc;
} DSSPROPERTY;

typedef struct DSSEXITtag {
  DSSTRUCT  eStruct;
  DSSTR             eKey;
  DSSTR             eDesc;
  DSLWORD           eKeyObj;
  DSFLAG            eFlag;
  DSLWORD           eWorld; /* virtual # of the destination world */
  DSBYTE            eDir;
} DSSEXIT;

/* holds all area details / settings */
typedef struct DSSAREADETAILtag {
  DSSTRUCT aStruct;
  DSSTR                  aEditor;
  DSSTR                  aDesc;
  DSFLAG                 aResetFlag;
  DSWORD                 aResetDelay;
  DSREF                  aProperty;   /* from aResetThing, reset scripts */
} DSSAREADETAIL;

/* holds RST data */
typedef struct DSSRESETtag {
  DSSTRUCT               rStruct;
  DSBYTE                 rCmd;
  DSWORD                 rIf;

  DSLWORD                rArg1;
  DSLWORD                rArg2;
  DSLWORD                rArg3;
  DSLWORD                rArg4;
} DSSRESET;

/***** Special DSS sub-structures *****/
/* DSSLIST is for character string lists: */
/* Area list
 * WLD lists
 * OBJ lists
 * MOB lists
 * etc. */
typedef struct DSSLISTtag {
  DSSTRUCT  lStruct;
  DSSTR    lName;
  long int lVNum,lVNum2; /* general purpose virtual number storage */
} DSSLIST;


/***** Standard DSS sub-structures *****/
typedef struct DSSAREAtag {
  DSSLIST aList;
  unsigned long aFlag; /* flags */
  DSREF aOBJ,aMOB,aWLD,aRST,aDetail; /* area lists */
} DSSAREA;

/* holds WLD data */
typedef struct DSSWORLDtag {
  DSSLIST wList;

//  DSSTR                  wSDesc; /* lName */
  DSSTR                  wDesc;
  DSREF                  wExit,wExtra,wProperty;

  DSFLAG                 wFlag;
  DSWORD                 wType;

} DSSWORLD;

/* holds MOB data */
typedef struct DSSMOBILEtag {
  DSSLIST mList;
  /* NOTE: mSDesc, the mob's name, is stored in the lName str */
  /* and the mVirtual is stored in the lVNum field.           */
  /* The following are copied directly from the server's code.*/

  /* special (alloc-able) parts */
  DSSTR                  mKey;
//  DSSTR                  mSDesc; /* lName */
  DSSTR                  mLDesc;
  DSSTR                  mDesc;
  DSREF                  mExtra,mProperty;

  /* normal parts */
  DSFLAG                 mAct;
  DSFLAG                 mAffect;
  DSWORD                 mAura;
  DSWORD                 mLevel;
  DSWORD                 mHitBonus;
  DSWORD                 mArmor;
  DSWORD                 mHPDiceNum;
  DSWORD                 mHPDiceSize;
  DSWORD                 mHPBonus;
  DSWORD                 mDamDiceNum; /* unarmed damage */
  DSWORD                 mDamDiceSize;
  DSWORD                 mDamBonus;
  DSLWORD                mMoney;
  DSLWORD                mExp;
  DSBYTE                 mPos; /* Position default */
  DSBYTE                 mType;/* Type information ie monster race */
  DSBYTE                 mSex;

  DSWORD                 mWeight;
} DSSMOBILE;

/* holds OBJ data */
typedef struct DSSOBJECTtag {
  DSSLIST oList;

  DSSTR                  oKey;
//  DSSTR                  oSDesc; /* lName */
  DSSTR                  oLDesc;
  DSSTR                  oDesc;
  DSREF                  oExtra,oProperty;

  DSBYTE                 oType;
  DSFLAG                 oAct;
  DSBYTE                 oWear;
  DSWORD                 oWeight;
  DSLWORD                oValue;
  DSLWORD                oRent;

  /* Details */
  DSLWORD                oDetail[16];

  /* Apply Information */
  DSBYTE                 oApplyType[DS_OBJECT_MAX_APPLY];
  DSSBYTE                oApplyValue[DS_OBJECT_MAX_APPLY];

} DSSOBJECT;

/* Structure type-casting macros */
#define DSStruct(x) ((DSSTRUCT *)(x))
#define DSSList(x) ((DSSLIST *)(x))
#define DSSArea(x) ((DSSAREA *)(x))
#define DSSAreaDetail(x) ((DSSAREADETAIL *)(x))
#define DSSMobile(x) ((DSSMOBILE *)(x))
#define DSSObject(x) ((DSSOBJECT *)(x))
#define DSSWorld(x) ((DSSWORLD *)(x))
#define DSSReset(x) ((DSSRESET *)(x))
#define DSSExtra(x) ((DSSEXTRA *)(x))
#define DSSProperty(x) ((DSSPROPERTY *)(x))
#define DSSExit(x) ((DSSEXIT *)(x))
#define DSStr(x) ((DSSTR *)(x))
#define DSRef(x) ((DSREF *)(x))

void dsRefFree(DSREF *p_ref);
void dsRefClear(DSREF *p_ref);
void dsStrFree(DSSTR *p_str);
void dsStrClear(DSSTR *p_str);
unsigned long dsStrAlloc(DSSTR *p_str,unsigned long p_len);
void dsStrCopy(DSSTR *p_src,DSSTR *p_dst);
unsigned long dsStrReplicate(DSSTR *p_src,DSSTR *p_dst);
void dsStructFree(DSSTRUCT *p_struct);
DSSTRUCT *dsStructAlloc(int p_type);
void dsStructExtract(DSSTRUCT *p_struct);
void dsStructInsert(DSREF *p_upref, DSSTRUCT *p_prev, DSSTRUCT *p_struct);
void dsStructInsertList(DSREF *p_upref, DSSTRUCT *p_struct);
void dsStructCopy(DSSTRUCT *p_src,DSSTRUCT *p_dst);
DSSTRUCT *dsChangeListType(DSSTRUCT *p_old, int p_newtype);
unsigned long dsStrCreate(DSSTR *p_str,char *p_data);
DSFTL *dsFTLAlloc(char *p_name);
void dsFTLFree(DSFTL **p_FTList);
void dsFTLAppendNext(DSFTL **p_FTList,DSFTL *p_newEntry);
void dsFTLAppendDown(DSFTL **p_FTList,DSFTL *p_newEntry);
DSFTL *dsFTLOf(DSFTL **p_FTList,int p_FTLNum);

#endif /* __DSTRUCT_H__ */