#ifndef _SCMDPLUGIN
#define _SCMDPLUGIN
//#ifdef LKJLKJDFLKJDFLKJFE

#include "SCMDGlobal.h"
#include "CKMPQ.h"
#include "CSCmdraftEngine.h"
#include "SI_MiscClasses.h"

#ifndef CHUNKSTRUCT
#define CHUNKSTRUCT
typedef struct _CChunkData {
	DWORD			ChunkSize;
	BYTE*			ChunkData;
} CChunkData;
#endif

#define PLUGINVERSION		0x00000002

typedef struct _TEngineData {
	WORD	Size;
	SI_CStringList*		StatTxt;
	SI_CStringList*		MapStrings;
	SI_CStringList*		MapInternalStrings;	//	Currently NULL
	LocationNode*		MapLocations;
	DWORD*				WavStringIndexii;
	CSI_TextDisplay*	ActionLog;			//	Also NULL
	WORD				ActionLogLevel;
	CMPQ*				DataInterface;		//	Also NULL, until virtual class is implemented
	int*				CurSelLocation;
	int*				UnitCustomNames;	//	0 == none, everything else is off by 1, 228 entries
	int*				ForceNames;			//	0 == none, everything else is off by 1, 4 entries
	char**				UnitNames;			//	char*[228] with non identical unit names
} TEngineData;

/*
bit 0 - Starcraft 100
bit 1 - Starcraft hybrid
bit 2 - starcraft broodwar
bit 3 - memgraft hybrid
bit 4 - memgraft broodwar
1 == not compatible, 0 == compatible
*/



typedef void*	AllocRam(DWORD Size);
typedef void	DeAllocRam(void*	Ram);
typedef void*	ReAllocRam(void*	Ram, DWORD Size);

typedef DWORD	(WINAPI *PluginGetVersion)		(void);
typedef BOOL	(WINAPI *PluginInitPlugin)		(HWND MainWindow, HINSTANCE MainInstance, AllocRam AllocMem, DeAllocRam DeleteMem, ReAllocRam ResizeMem, DWORD* RequestedSections);
													//	Handle to main scmdraft window
													//	Instance of the program
													//	Functions to manage persistent memory
													//	DWORD[8] with sections the plugin wants a menu entry for


//	Gets the menu text for a specific section that the plugin stated it wants to edit
typedef BOOL	(WINAPI *PluginGetMenuString)	(DWORD Section, CHAR*	MenuStr,		WORD StrLen);


//	Starts the plugin

typedef BOOL	(WINAPI *PluginRunPlugin)		(	TEngineData*	EngineData,		//	Struct containing engine data
													DWORD CurSection,				//	Section plugin is being run for (Currently either triggers or mission briefing)
													CChunkData*	Triggers,			//	Pointer to trigger datachunk
													CChunkData*	MissionBriefing,	//	Pointer to mission briefing datachunk
													CChunkData*	SwitchRenaming,		//	Pointer to switch renaming datachunk
													CChunkData*	UnitProperties,		//	Pointer to unit properties datachunk
													CChunkData*	UnitPropUsage	);	//	Pointer to unit property usage datachunk



//	Trigedit only
typedef BOOL	(WINAPI *PluginParseStrings)	(	TEngineData*	EngineData,		//	Struct containing engine data
													DWORD CurSection,				//	Section plugin is being run for (Currently either triggers or mission briefing)
													CChunkData*	Triggers,			//	Pointer to trigger datachunk
													CChunkData*	MissionBriefing,	//	Pointer to mission briefing datachunk
													CChunkData*	SwitchRenaming,		//	Pointer to switch renaming datachunk
													CChunkData*	UnitProperties,		//	Pointer to unit properties datachunk
													CChunkData*	UnitPropUsage	);	//	Pointer to unit property usage datachunk


//	Fills in the instances of BW unit usage, most likely also trigedit only
typedef int		(WINAPI *PluginQueryMapType)	(	TEngineData*	EngineData,		//	Struct containing engine data
													DWORD CurSection,				//	Section plugin is being run for (Currently either triggers or mission briefing)
													CChunkData*	Triggers,			//	Pointer to trigger datachunk
													CChunkData*	MissionBriefing,	//	Pointer to mission briefing datachunk
													CChunkData*	SwitchRenaming,		//	Pointer to switch renaming datachunk
													CChunkData*	UnitProperties,		//	Pointer to unit properties datachunk
													CChunkData*	UnitPropUsage,		//	Pointer to unit property usage datachunk
													HWND ItemList);					//	Handle to a listbox where entries need to be added
	
//#endif
#endif