CommonLibSSE (powerof3)
TESFile.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "RE/B/BSString.h"
4 #include "RE/B/BSTList.h"
5 #include "RE/F/FORM.h"
6 #include "RE/F/FormTypes.h"
7 #include "RE/N/NiFile.h"
8 
9 #include "REX/W32/KERNEL32.h"
10 
11 namespace RE
12 {
13  class BSFile;
14  struct TESBitArrayFile;
15 
16  class TESFile
17  {
18  public:
19  enum class Error
20  {
21  kNone = 0,
22  kNotFound = 1,
23  kNoFile = 2,
24  kNoForm = 3,
25  kNoChunk = 4,
26  kNoID = 5,
27  kBadFile = 6,
28  kBadID = 7,
29  kFormOpen = 8,
30  kFileOpen = 9,
31  kWriteFailure = 10,
32  kInvalidFile = 11,
33  kFileInUse = 12,
34  kCreateFailure = 13
35  };
36 
37  enum class RecordFlag
38  {
39  kNone = 0,
40  kMaster = 1 << 0,
41  kAltered = 1 << 1,
42  kChecked = 1 << 2,
43  kActive = 1 << 3,
44  kOptimizedFile = 1 << 4,
45  kTempIDOwner = 1 << 5,
46  kDelocalized = 1 << 7,
47  kPrecalcDataOnly = 1 << 8,
48  kSmallFile = 1 << 9
49  };
50 
51  bool CloseTES(bool a_force);
52  TESFile* Duplicate(std::uint32_t a_cacheSize = 0x4000);
53  [[nodiscard]] std::uint32_t GetCombinedIndex() const noexcept { return static_cast<std::uint32_t>(compileIndex + smallFileCompileIndex); }
54  [[nodiscard]] std::uint8_t GetCompileIndex() const noexcept { return compileIndex; }
55  std::uint32_t GetCurrentSubRecordType();
56  [[nodiscard]] constexpr std::uint32_t GetCurrentSubRecordSize() const noexcept { return actualChunkSize; }
57  [[nodiscard]] constexpr std::uint32_t GetCurrentChunkID() const noexcept { return currentchunkID; }
58  [[nodiscard]] std::string_view GetFilename() const noexcept { return { fileName }; }
60  [[nodiscard]] std::uint16_t GetSmallFileCompileIndex() const noexcept { return smallFileCompileIndex; }
61  [[nodiscard]] constexpr std::uint32_t GetPartialIndex() const noexcept { return !IsLight() ? compileIndex : (0xFE000 | smallFileCompileIndex); };
62  [[nodiscard]] bool IsFormInMod(FormID a_formID) const;
63  [[nodiscard]] constexpr bool IsLight() const noexcept { return recordFlags.all(RecordFlag::kSmallFile); };
64  [[nodiscard]] constexpr bool IsLocalized() const noexcept { return recordFlags.all(RecordFlag::kDelocalized); }
65  bool OpenTES(NiFile::OpenMode a_accessMode, bool a_lock);
66  bool ReadData(void* a_buf, std::uint32_t a_size);
67  bool Seek(std::uint32_t a_offset);
68  bool SeekNextForm(bool a_skipIgnored);
70 
71  // members
73  std::uint32_t pad004; // 004
75  void* threadSafeFileMap; // 010 - NiTPointerMap<std::uint32_t, TESFile*>* - size == 0x20
76  std::uint64_t unk018; // 018
77  std::uint64_t unk020; // 020
78  std::uint8_t unk028; // 028
79  std::uint8_t unk029; // 029
80  std::uint16_t pad02A; // 02A
81  std::uint32_t pad02C; // 02C
82  BSFile* lockedFile; // 030
83  BSFile* file; // 038
84  TESBitArrayFile* formUserDataBitArray; // 040
85  TESBitArrayFile* formVersionBitArray; // 048
86  TESBitArrayFile* formIDBitArray; // 050
88  char path[REX::W32::MAX_PATH]; // 15C
89  char* buffer; // 260
90  std::uint32_t bufferAllocSize; // 268
91  std::uint32_t firstCellOffset; // 26C
92  std::uint32_t currCellOffset; // 270
93  std::uint32_t unk274; // 274
95  std::uint32_t currRefOffset; // 280
96  FORM currentform; // 284
97  std::uint32_t currentchunkID; // 29C
98  std::uint32_t actualChunkSize; // 2A0
99  std::uint32_t filesize; // 2A4
100  std::uint32_t fileOffset; // 2A8
101  std::uint32_t formoffset; // 2AC
102  std::uint32_t chunkoffset; // 2B0
103  FORM saveform; // 2B4
104  std::uint32_t saveFormOffset; // 2CC
105  std::uint64_t saveChunkOffset; // 2D0
106  std::uint64_t unk2D8; // 2D8
107  std::uint64_t unk2E0; // 2E0
108  std::uint8_t unk2E8; // 2E8
109  bool isBigEndian; // 2E9
110  std::uint8_t unk2EA; // 2EA
111  std::uint8_t pad2EB; // 2EB
113  float unk42C; // 42C
114  std::uint32_t unk430; // 430
115  std::uint32_t flags; // 434
117  std::uint32_t pad43C; // 43C
120  std::uint32_t masterCount; // 460
121  std::uint32_t pad464; // 464
122  TESFile** masterPtrs; // 468
124  std::uint8_t compileIndex; // 478
125  std::uint8_t pad479; // 479
126  std::uint16_t smallFileCompileIndex; // 47A
127  std::uint32_t pad47C; // 47C
131  std::uint32_t decompressedFormBufferSize; // 4A8
132  std::uint32_t pad4AC; // 4AC
134  std::uint32_t reservedDecompressionBufferSize; // 4B8
135  std::uint32_t pad4BC; // 4BC
136  void* unk4C0; // 4C0
137  };
138  static_assert(sizeof(TESFile) == 0x4C8);
139 }
constexpr bool all(Args... a_args) const noexcept requires(std
Definition: EnumSet.h:99
Definition: BSFile.h:10
OpenMode
Definition: NiFile.h:14
Definition: TESFile.h:17
bool SeekNextForm(bool a_skipIgnored)
std::uint64_t unk020
Definition: TESFile.h:77
char path[REX::W32::MAX_PATH]
Definition: TESFile.h:88
constexpr std::uint32_t GetCurrentChunkID() const noexcept
Definition: TESFile.h:57
std::uint32_t GetCombinedIndex() const noexcept
Definition: TESFile.h:53
void * reservedDecompressionBuffer
Definition: TESFile.h:133
std::uint64_t unk2D8
Definition: TESFile.h:106
std::uint8_t unk028
Definition: TESFile.h:78
TESBitArrayFile * formIDBitArray
Definition: TESFile.h:86
REX::EnumSet< Error, std::uint32_t > lastError
Definition: TESFile.h:72
std::uint32_t currentchunkID
Definition: TESFile.h:97
RecordFlag
Definition: TESFile.h:38
std::uint32_t pad02C
Definition: TESFile.h:81
bool SeekNextSubrecord()
constexpr bool IsLight() const noexcept
Definition: TESFile.h:63
void * unk4C0
Definition: TESFile.h:136
std::uint32_t pad004
Definition: TESFile.h:73
TESBitArrayFile * formUserDataBitArray
Definition: TESFile.h:84
std::uint32_t unk430
Definition: TESFile.h:114
constexpr bool IsLocalized() const noexcept
Definition: TESFile.h:64
BSFile * file
Definition: TESFile.h:83
char fileName[REX::W32::MAX_PATH]
Definition: TESFile.h:87
BSString summary
Definition: TESFile.h:129
BSFile * lockedFile
Definition: TESFile.h:82
FORM saveform
Definition: TESFile.h:103
FormType GetFormType()
std::uint32_t flags
Definition: TESFile.h:115
bool ReadData(void *a_buf, std::uint32_t a_size)
std::uint32_t fileOffset
Definition: TESFile.h:100
std::string_view GetFilename() const noexcept
Definition: TESFile.h:58
std::uint32_t decompressedFormBufferSize
Definition: TESFile.h:131
std::uint32_t pad464
Definition: TESFile.h:121
BSSimpleList< const char * > masters
Definition: TESFile.h:118
REX::EnumSet< RecordFlag, std::uint32_t > recordFlags
Definition: TESFile.h:116
bool isBigEndian
Definition: TESFile.h:109
FORM currentform
Definition: TESFile.h:96
std::uint64_t unk018
Definition: TESFile.h:76
constexpr std::uint32_t GetPartialIndex() const noexcept
Definition: TESFile.h:61
std::uint64_t saveChunkOffset
Definition: TESFile.h:105
std::uint32_t formoffset
Definition: TESFile.h:101
std::uint32_t pad4BC
Definition: TESFile.h:135
std::uint16_t pad02A
Definition: TESFile.h:80
Error
Definition: TESFile.h:20
bool CloseTES(bool a_force)
std::uint32_t currRefOffset
Definition: TESFile.h:95
std::uint32_t firstCellOffset
Definition: TESFile.h:91
constexpr std::uint32_t GetCurrentSubRecordSize() const noexcept
Definition: TESFile.h:56
TESFile * threadSafeParent
Definition: TESFile.h:74
TESObjectCELL * currCell
Definition: TESFile.h:94
std::uint8_t unk029
Definition: TESFile.h:79
std::uint32_t pad4AC
Definition: TESFile.h:132
bool IsFormInMod(FormID a_formID) const
std::uint32_t saveFormOffset
Definition: TESFile.h:104
char * decompressedFormBuffer
Definition: TESFile.h:130
std::uint8_t pad2EB
Definition: TESFile.h:111
std::uint8_t GetCompileIndex() const noexcept
Definition: TESFile.h:54
std::uint32_t bufferAllocSize
Definition: TESFile.h:90
std::uint32_t pad43C
Definition: TESFile.h:117
BSString createdBy
Definition: TESFile.h:128
char * buffer
Definition: TESFile.h:89
void * threadSafeFileMap
Definition: TESFile.h:75
std::uint32_t reservedDecompressionBufferSize
Definition: TESFile.h:134
std::uint8_t compileIndex
Definition: TESFile.h:124
std::uint32_t masterCount
Definition: TESFile.h:120
std::uint32_t actualChunkSize
Definition: TESFile.h:98
std::uint16_t GetSmallFileCompileIndex() const noexcept
Definition: TESFile.h:60
std::uint32_t pad47C
Definition: TESFile.h:127
std::uint64_t unk2E0
Definition: TESFile.h:107
std::uint8_t pad479
Definition: TESFile.h:125
std::uint32_t GetCurrentSubRecordType()
std::uint32_t currCellOffset
Definition: TESFile.h:92
bool OpenTES(NiFile::OpenMode a_accessMode, bool a_lock)
TESFile ** masterPtrs
Definition: TESFile.h:122
float unk42C
Definition: TESFile.h:113
std::uint16_t smallFileCompileIndex
Definition: TESFile.h:126
REX::W32::FILETIME deletedFormTime
Definition: TESFile.h:123
BSSimpleList< std::uint64_t * > mastersData
Definition: TESFile.h:119
TESBitArrayFile * formVersionBitArray
Definition: TESFile.h:85
std::uint8_t unk2E8
Definition: TESFile.h:108
std::uint32_t unk274
Definition: TESFile.h:93
std::uint8_t unk2EA
Definition: TESFile.h:110
REX::W32::WIN32_FIND_DATAA fileData
Definition: TESFile.h:112
bool Seek(std::uint32_t a_offset)
TESFile * Duplicate(std::uint32_t a_cacheSize=0x4000)
std::uint32_t filesize
Definition: TESFile.h:99
std::uint32_t chunkoffset
Definition: TESFile.h:102
Definition: TESObjectCELL.h:115
constexpr auto MAX_PATH
Definition: BASE.h:35
Definition: AbsorbEffect.h:6
FormType
Definition: FormTypes.h:139
std::uint32_t FormID
Definition: BSCoreTypes.h:5
Definition: BASE.h:41
Definition: KERNEL32.h:391
Definition: FORM.h:6