Clone of PhatAC @ https://github.com/floaterxk/PhatAC

DATDisk.h 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. #pragma once
  2. #ifdef PRE_TOD_DATA_FILES
  3. #define DAT_HEADER_OFFSET 0x12C
  4. #else
  5. #define DAT_HEADER_OFFSET 0x140
  6. #endif
  7. #ifdef PRE_TOD_DATA_FILES
  8. struct DATHeader
  9. {
  10. DWORD FileType; // 0x00 'TB' !
  11. DWORD BlockSize; // 0x04 0x400 for PORTAL : 0x100 for CELL
  12. DWORD FileSize; // 0x08 Should match file size.
  13. DWORD Iteration; // 0x0C Version iteration.
  14. DWORD FreeHead; // 0x10
  15. DWORD FreeTail; // 0x14
  16. DWORD FreeCount; // 0x18
  17. DWORD BTree; // 0x1C BTree offset
  18. DWORD Unknown0; // 0x20
  19. DWORD Unknown1; // 0x24
  20. DWORD Unknown2; // 0x28
  21. };
  22. #else
  23. #pragma pack(push, 4)
  24. struct DATHeader
  25. {
  26. DWORD FileType;
  27. DWORD BlockSize;
  28. DWORD FileSize;
  29. DWORD DataSet; // 1 = portal
  30. DWORD DataSubset;
  31. DWORD FreeHead;
  32. DWORD FreeTail;
  33. DWORD FreeCount;
  34. DWORD BTree;
  35. DWORD NewLRU; // 0
  36. DWORD OldLRU; // 0
  37. bool bUseLRU; // False
  38. DWORD MasterMapID;
  39. DWORD EnginePackVersion;
  40. DWORD GamePackVersion; // 0
  41. BYTE VersionMajor[16];
  42. DWORD VersionMinor;
  43. };
  44. #pragma pack(pop)
  45. #endif
  46. #ifdef PRE_TOD_DATA_FILES
  47. struct BTreeEntry
  48. {
  49. DWORD ID;
  50. DWORD BlockHead;
  51. DWORD Length;
  52. };
  53. #else
  54. struct BTreeEntry
  55. {
  56. DWORD Unknown00;
  57. DWORD ID;
  58. DWORD BlockHead;
  59. DWORD Length;
  60. DWORD Timestamp;
  61. DWORD Unknown14;
  62. };
  63. #endif
  64. struct BTreeData
  65. {
  66. DWORD BlockSpacer;
  67. DWORD Branches[0x3E];
  68. DWORD EntryCount;
  69. BTreeEntry Entries[0x3D];
  70. };
  71. class BlockLoader;
  72. class BTreeNode
  73. {
  74. public:
  75. BTreeNode(BlockLoader *pBlockLoader);
  76. virtual ~BTreeNode();
  77. BOOL LoadData(DWORD BlockHead);
  78. void LoadChildren();
  79. void LoadChildrenRecursive();
  80. void SetFileCallback(void(*)(void *, DWORD, BTreeEntry *));
  81. void SetProgressCallback(void(*)(void *, float));
  82. void SetCallbackArg(void *);
  83. BOOL Lookup(DWORD ID, BTreeEntry *pEntry);
  84. void FindEntryIDsWithinRange(DWORD Min, DWORD Max, float Progress, float ProgressDelta);
  85. protected:
  86. DWORD GetBranchCount() const;
  87. BTreeNode *GetBranch(DWORD index);
  88. // Using this design, you can't run 2 scans at the same time.
  89. static void(*m_pfnFileCallback)(void *, DWORD, BTreeEntry *);
  90. static void(*m_pfnProgressCallback)(void *, float);
  91. static void *m_pCallbackArg;
  92. BlockLoader *m_pBlockLoader;
  93. BTreeData m_TreeData;
  94. BTreeNode* m_Branches[0x3E];
  95. BOOL m_bLeaf;
  96. };
  97. class BTree : public BTreeNode
  98. {
  99. public:
  100. BTree(BlockLoader *pBlockLoader);
  101. virtual ~BTree();
  102. BOOL Init();
  103. };
  104. class DiskDev
  105. {
  106. public:
  107. DiskDev();
  108. ~DiskDev();
  109. BOOL OpenFile(const char* Path, DATHeader *pHeader);
  110. void CloseFile();
  111. BOOL SyncRead(void *pBuffer, DWORD dwLength, DWORD dwPosition);
  112. BOOL SyncWrite(void *pBuffer, DWORD dwLength, DWORD dwPosition);
  113. private:
  114. HANDLE m_hFile;
  115. };
  116. class BlockLoader
  117. {
  118. public:
  119. BlockLoader();
  120. ~BlockLoader();
  121. BOOL Init(const char *Path, DATHeader *pHeader);
  122. DWORD GetTreeOrigin();
  123. BOOL LoadData(DWORD HeadBlock, void *pBuffer, DWORD Length);
  124. private:
  125. DATHeader *m_pHeader;
  126. DiskDev m_DiskDev;
  127. };
  128. struct DATEntry
  129. {
  130. DWORD ID;
  131. BYTE* Data;
  132. DWORD Length;
  133. };
  134. class DATDisk
  135. {
  136. public:
  137. static BOOL OpenDisks(const char *portalPath, const char *cellPath);
  138. static void CloseDisks();
  139. static DATDisk *pPortal;
  140. static DATDisk *pCell;
  141. DATDisk(const char *Path);
  142. ~DATDisk();
  143. BOOL Open();
  144. BOOL GetData(DWORD ID, DATEntry *pEntry);
  145. BOOL GetDataEx(DWORD BlockHead, void *Data, DWORD Length);
  146. void FindFileIDsWithinRange(DWORD Min, DWORD Max, void(*FileCallback)(void *, DWORD, BTreeEntry *), void(*ProgressCallback)(void *, float), void *CallbackArg);
  147. const DATHeader *GetHeader();
  148. private:
  149. char *m_FilePath;
  150. DATHeader m_DATHeader;
  151. BlockLoader m_BlockLoader;
  152. BTree m_BTree;
  153. };