/* DoomData.h */

/*
   all external data is defined here
   most of the data is loaded into different structures at run time
 */

#ifndef __DOOMDATA__
#define __DOOMDATA__

#ifndef __BYTEBOOL__
#define __BYTEBOOL__
typedef enum
	{
	false, true
	}
boolean;
typedef unsigned char byte;

#endif

/*
   ===============================================================================

   map level types

   ===============================================================================
 */

/* lump order in a map wad */
enum
	{
	ML_LABEL, ML_THINGS, ML_LINEDEFS, ML_SIDEDEFS, ML_VERTEXES, ML_SEGS,
	ML_SSECTORS, ML_NODES, ML_SECTORS, ML_REJECT, ML_BLOCKMAP
	};


typedef struct
	{
	short               x,
	                    y;
	}
mapvertex_t;

typedef struct
	{
	short               textureoffset;
	short               rowoffset;
	char                toptexture[8],
	                    bottomtexture[8],
	                    midtexture[8];
	short               sector;	/* on viewers side */
	}
mapsidedef_t;

typedef struct
	{
	short               v1,
	                    v2;
	short               flags;
	short               special,
	                    tag;
	short               sidenum[2];		/* sidenum[1] will be -1 if one sided */
	}
maplinedef_t;

#define	ML_BLOCKING			1
#define	ML_BLOCKMONSTERS	2
#define	ML_TWOSIDED			4		   /* backside will not be present at all */
														/* if not two sided */

/*
   if a texture is pegged, the texture will have the end exposed to air held
   constant at the top or bottom of the texture (stairs or pulled down things)
   and will move with a height change of one of the neighbor sectors
   Unpegged textures allways have the first row of the texture at the top
   pixel of the line for both top and bottom textures (windows)
 */

#define	ML_DONTPEGTOP		8
#define	ML_DONTPEGBOTTOM	16

#define ML_SECRET				32	   /* dont map as two sided: ITS A SECRET! */
#define ML_SOUNDBLOCK		64		   /* dont let sound cross two of these      */
#define	ML_DONTDRAW			128		   /* dont draw on the automap                           */
#define	ML_MAPPED				256	   /* set if allready drawn in automap           */


typedef struct
	{
	short               floorheight,
	                    ceilingheight;
	char                floorpic[8],
	                    ceilingpic[8];
	short               lightlevel;
	short               special,
	                    tag;
	}
mapsector_t;

typedef struct
	{
	short               numsegs;
	short               firstseg;	/* segs are stored sequentially */
	}
mapsubsector_t;

typedef struct
	{
	short               v1,
	                    v2;
	short               angle;
	short               linedef,
	                    side;
	short               offset;
	}
mapseg_t;

enum
	{
	BOXTOP, BOXBOTTOM, BOXLEFT, BOXRIGHT
	};							/* bbox coordinates */

#define	NF_SUBSECTOR	0x8000
typedef struct
	{
	short               x,
	                    y,
	                    dx,
	                    dy;		/* partition line */
	short               bbox[2][4];		/* bounding box for each child */
	unsigned short      children[2];	/* if NF_SUBSECTOR its a subsector */
	}
mapnode_t;

typedef struct
	{
	short               x,
	                    y;
	short               angle;
	short               type;
	short               options;
	}
mapthing_t;

#define	MTF_EASY		1
#define	MTF_NORMAL		2
#define	MTF_HARD		4
#define	MTF_AMBUSH		8

/*
   ===============================================================================

   texture definition

   ===============================================================================
 */

typedef struct
	{
	short               originx;
	short               originy;
	short               patch;
	short               stepdir;
	short               colormap;
	}
mappatch_t;

typedef struct
	{
	char                name[8];
	boolean             masked;
	short               width;
	short               height;
	void              **columndirectory;	/* OBSOLETE */
	short               patchcount;
	mappatch_t          patches[1];
	}
maptexture_t;


/*
   ===============================================================================

   graphics

   ===============================================================================
 */

/*  posts are runs of non masked source pixels */
typedef struct
	{
	byte                topdelta;	/* -1 is the last post in a column */
	byte                length;
/* length data bytes follows */
	}
post_t;

/* column_t is a list of 0 or more post_t, (byte)-1 terminated */
typedef post_t      column_t;

/* a patch holds one or more columns */
/* patches are used for sprites and all masked pictures */
typedef struct
	{
	short               width;	/*  bounding box size */
	short               height;
	short               leftoffset;		/*pixels to the left of origin */
	short               topoffset;	/* pixels below the origin */
	int                 columnofs[8];	/* only [width] used;  the [0] is &columnofs[width] */
	}
patch_t;

/*
   a pic is an unmasked block of pixels
 */

typedef struct
	{
	byte                width,
	                    height;
	byte                data;
	}
pic_t;




/*
   ===============================================================================

   status

   ===============================================================================
 */
#endif /* __DOOMDATA__ */
