
#pragma pack(1)
#pragma warning(disable:4200)

#include "resourcefile.h"

extern CWADFile *mainwad;

struct CVertex
{
	short x;
	short y;
};


struct CThing
{
   short xpos;      /* x position */
   short ypos;      /* y position */
   short angle;     /* facing angle */
   short type;      /* thing type */
   short when;      /* appears when? */
};



/*
   this data structure contains the information about the LINEDEFS
*/
struct CLineDef
{
   unsigned short start;     /* from this vertex ... */
   unsigned short end;       /* ... to this vertex */
   short flags;     /* see NAMES.C for more info */
   short type;      /* see NAMES.C for more info */
   short tag;       /* crossing this linedef activates the sector wi*/
   short sidedef1;  /* sidedef */
   short sidedef2;  /* only if this line adjoins 2 sectors */
};



/*
   this data structure contains the information about the SIDEDEFS
*/
struct CSideDef
{
   short xoff;      /* X offset for texture */
   short yoff;      /* Y offset for texture */
   char texUpper[8];  /* texture name for the part above */
   char texLower[8];  /* texture name for the part below */
   char texNormal[8];  /* texture name for the regular part */
   short sector;    /* adjacent sector */
};


struct CSector
{
   short floorh;
   short ceilh;
   char floort[8];
   char ceilt[8];
   short light;
   short special;
   short tag;
};


struct CWadFileHeader
{
	char id[4];
	long numEntries;
	long DirOffset;
};

struct CWadFileEntry
{
	long FileOffset;
	long EntryLength;
	char name[8];
};

struct CWad3FileEntry
{
	long FileOffset;
	long EntryLength;
	long EntryLength2;
	long type;
	char name[16];
};

struct WadItemList;

struct CLevelInfo
{
	CThing * pThings;
	CLineDef * pLineDefs;
	CSideDef * pSideDefs;
	CVertex * pVertexes;
	CSector * pSectors;

	char * pNodes;
	char * pSegs;
	char * pSSector;

	char * pBlockmap;
	char * pReject;

	char * pBehavior;
	char * pScript;

	int nThings;
	int nLineDefs;
	int nSideDefs;
	int nVertexes;
	int nSectors;

	int nNodes;
	int nSegs;
	int nSSectors;

	int cReject;
	int cBlockmap;
	int cBehavior;
	int cScript;

	char * pGLVerts;
	char * pGLSegs;
	char * pGLSSectors;
	char * pGLNodes;

	int nGLVertexes;
	int nGLNodes;
	int nGLSegs;
	int nGLSSectors;

	int NameTag;

	CLevelInfo()
	{
		NameTag=0;
	}

	void Release();

	~CLevelInfo() 
	{
		Release();
	}

	bool HasBehavior()
	{
		return pBehavior!=NULL;
	}
	bool HasScript()
	{
		return pBehavior!=NULL;
	}
};



/*
struct WadInfo
{
	HANDLE hFile;
	HANDLE hMapping;
	CWadFileHeader * pwAddr;
	union
	{
		CWadFileEntry  * pwDir;
		CWad3FileEntry * pw3Dir;
	};
	int wtype;
	char filename[256];
};


struct WadList
{
	WadInfo * pwInfo;
	WadList * pNext;
};

struct WadItemList
{
	CWadFileEntry * pwInfo;
	int type;

	WadInfo * pwWad;
	WadItemList * pSuccessor;	// the overloaded entry
	WadItemList * pNext;

	WadItemList * Next() { return pNext; }
	void* PackedAddress() const { return (void*)(((char*)pwWad->pwAddr)+pwInfo->FileOffset); }

	bool isPacked() const
	{
		return false;
	}

	char * Address() 
	{
		return (char *)PackedAddress();
	}

	int Length() const 
	{ 
		return pwInfo->EntryLength; 
	}

	void Release()
	{
	}
	char * Name() const { return pwInfo->name; }
	char * WadFileName() { return pwWad->filename; }

	WadItemList() { }
	~WadItemList() { }
};
*/

struct ImportInf
{
	char name[9];
	int insX,insY;
	int transparentCol;
};

//extern WadItemList * GlobalDirectory;



//void CloseWadFile(WadInfo * wi);
void OpenMainWad(char * filename);
void ClosePatchWad(const char * filename);
void * GetWadItem(char * name,int * pLength);
void FreeWadItem(char * name,char * blockstart=NULL);
void NameError(char * level,char * section);
bool GetLevelInfo(char * name,CLevelInfo * pLi);
//int  GetLevelFileInfo(char * fn,CLevelInfo * pli,WadInfo **pp=NULL);


inline void CLevelInfo::Release()
{
	NameTag=-1;
}

