// 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)