// GXT related stuff
// NOTE: этот файл должен иметь возможность компилироваться отдельно от основного проекта 
//		для использования, например, в составе GXT editor
// NOTE: описанные здесь объекты и функции, хотя и копируют общую структуру работы с GXT,
//		не являются точной их копией (опять же, чтобы обеспечить нормальное использование 
//		этого файла в будущем)

#pragma pack(push, 1)	// TODO: если этот файл используется отдельно, это не нужно
// CText - обработка локализованных строк
class CText {
public:

	CText ();

	// >> 6A0140
	~CText () {
		tkeyMain.clear ();
		tdatMain.clear ();
		tkeyMission.clear ();
		tdatMission.clear ();
	}

	char * locate (char * key);		// >> 6A0050
	void load (bool noMpack);		// >> 6A01A0
	void loadMission (char * name);	// >> 69FBF0
	void clear ();					// >> 69FF20
	
	void getMissionName (char * dst) { // >> 69FBD0
		strcpy_s (dst, 8, missionName);
	}

protected:

	void loadMpack (); // >> 69F9A0

	// каталог файла
	struct TablEntry {
		char	name[8];
		DWORD	offset;
	};

	// ссылка на текстовую строку
	struct TKeyEntry {
		char * ptr;
		DWORD hash;
	};

	// каталог миссий
	struct Tabl {
		TablEntry	data[200];
		WORD		size;
		WORD		__pad;		

		// >> 69F670
		void read (DWORD len, BYTE * ptr) {
			size = (WORD)(len/sizeof (TablEntry));
			if (size > 200)
				size = 200;
			memcpy (data, ptr, size * sizeof (TablEntry));	
		}

	};

	// индекс 
	struct TKey {
		TKeyEntry * data;
		DWORD		size;

		void clear () {
			if (data)
				delete data;
			data = NULL;
			size = 0;
		}

		// >> 69F490
		void read (DWORD len, BYTE * ptr) {
			size = len/sizeof (TKeyEntry);
			data = new TKeyEntry[size];
			memcpy (data, ptr, size*sizeof (TKeyEntry));
		}

		char * locate (char * key, bool * found);	// >> 6A0000		
	};

	// текстовые данные
	struct TDat {
		char *	text;	// TODO2: unicode
		DWORD	length;

		void clear () {
			if (text)
				delete text;
			text = NULL;
			length = 0;
		}

		// >> 69F5D0
		void read (DWORD len, BYTE * ptr) {
			length = len;
			text = new char[len];
			memcpy (text, ptr, len);
		}
	};

	// собственно данные объекта
	TKey	tkeyMain;
	TDat	tdatMain;
	TKey	tkeyMission;
	TDat	tdatMission;
	BYTE	f20;
	BYTE	haveTabl;	// TODO: заменить проверкой (tablData != NULL)
	BYTE	cderrorInitialized;
	BYTE	missionLoaded;
	char	missionName[8];
	char	cderrorText[256];
	Tabl	tabl;	

	// в оригинале этого не было.
	// TODO: в какой-то момент, работа с файлами должна быть отрефакторена, 
	//		в частности, здесь должен использоваться объект CMemoryMappedFile
	bool	mapFile (TCHAR * name);
	void	unmapFile ();
	HANDLE	hFile;
	HANDLE	hMmap;
	DWORD	fileLength;
	BYTE *	filePtr;
};
#pragma pack(pop)
