Skip to content

Commit 33f5978

Browse files
committed
Partial fixes for MH stories 3
1 parent dcbe163 commit 33f5978

File tree

7 files changed

+1265
-1
lines changed

7 files changed

+1265
-1
lines changed

CMakeLists.txt

Lines changed: 1026 additions & 0 deletions
Large diffs are not rendered by default.

cmake.toml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ REF_BUILD_MHRISE_SDK = false
4949
REF_BUILD_SF6_SDK = false
5050
REF_BUILD_DD2_SDK = false
5151
REF_BUILD_MHWILDS_SDK = false
52+
REF_BUILD_MHSTORIES3_SDK = false
5253
REF_BUILD_PRAGMATA_SDK = false
5354
REF_BUILD_FRAMEWORK = { value = true }
5455
REF_BUILD_DEPENDENCIES = { value = true }
@@ -69,6 +70,7 @@ build-mhrise-sdk = "REF_BUILD_MHRISE_SDK OR REF_BUILD_FRAMEWORK"
6970
build-sf6-sdk = "REF_BUILD_SF6_SDK OR REF_BUILD_FRAMEWORK"
7071
build-dd2-sdk = "REF_BUILD_DD2_SDK OR REF_BUILD_FRAMEWORK"
7172
build-mhwilds-sdk = "REF_BUILD_MHWILDS_SDK OR REF_BUILD_FRAMEWORK"
73+
build-mhstories3-sdk = "REF_BUILD_MHSTORIES3_SDK OR REF_BUILD_FRAMEWORK"
7274
build-pragmata-sdk = "REF_BUILD_PRAGMATA_SDK OR REF_BUILD_FRAMEWORK"
7375
build-framework-dependencies = "REF_BUILD_DEPENDENCIES AND CMAKE_SIZEOF_VOID_P EQUAL 8"
7476

@@ -380,6 +382,14 @@ condition = "build-mhwilds-sdk"
380382
[target.MHWILDS]
381383
type = "game"
382384

385+
[target.MHSTORIES3SDK]
386+
type = "sdk"
387+
compile-definitions = ["MHSTORIES3", "REENGINE_PACKED", "REENGINE_AT"]
388+
condition = "build-mhstories3-sdk"
389+
390+
[target.MHSTORIES3]
391+
type = "game"
392+
383393
[target.PRAGMATASDK]
384394
type = "sdk"
385395
compile-definitions = ["PRAGMATA", "REENGINE_PACKED", "REENGINE_AT"]

shared/sdk/RETypeDB.hpp

Lines changed: 179 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ struct TDB {
125125
int32_t devEntry;
126126
int32_t appEntry;
127127

128-
uint32_t unkNum; // added in Pragmata (TDB 84)
128+
uint32_t unkNum; // added in TDB 82 (mhstories 3)
129129

130130
uint32_t numStringPool;
131131
uint32_t numBytePool;
@@ -266,6 +266,184 @@ struct GenericListData {
266266
};
267267
}
268268

269+
270+
namespace tdb82 {
271+
struct REMethodDefinition;
272+
struct REMethodImpl;
273+
struct REField;
274+
struct REFieldImpl;
275+
struct REProperty;
276+
struct RETypeImpl;
277+
struct REPropertyImpl;
278+
struct REParameterDef;
279+
struct REModule;
280+
281+
struct TDB {
282+
uint32_t magic;
283+
uint32_t version;
284+
uint32_t numTypes;
285+
uint32_t typesStartOfGenericsProbably; // I think this is the index of the start of the generics list in the types array (or start of something else)
286+
287+
uint32_t unk_int_tdb74;
288+
289+
uint32_t numMethods;
290+
uint32_t numFields;
291+
uint32_t numTypeImpl;
292+
uint32_t numFieldImpl;
293+
uint32_t numMethodImpl;
294+
uint32_t numPropertyImpl;
295+
uint32_t numProperties;
296+
uint32_t numEvents;
297+
298+
uint32_t numParams;
299+
uint32_t numAttributes;
300+
int32_t numInitData;
301+
uint32_t numAttributes2;
302+
uint32_t numInternStrings;
303+
uint32_t numModules;
304+
int32_t devEntry;
305+
int32_t appEntry;
306+
307+
uint32_t unkNum; // added in TDB 82 (mhstories 3)
308+
309+
uint32_t numStringPool;
310+
uint32_t numBytePool;
311+
312+
sdk::REModule* modules;
313+
sdk::RETypeDefinition (*types)[93788];
314+
sdk::RETypeImpl (*typesImpl)[256];
315+
sdk::REMethodDefinition (*methods)[703558];
316+
sdk::REMethodImpl (*methodsImpl)[56756];
317+
sdk::REField (*fields)[1];
318+
sdk::REFieldImpl (*fieldsImpl)[1];
319+
sdk::REProperty (*properties)[256];
320+
sdk::REPropertyImpl (*propertiesImpl)[1];
321+
void* events;
322+
sdk::REParameterDef (*params)[10000];
323+
class ::REAttributeDef (*attributes)[2000];
324+
int32_t (*initData)[19890];
325+
void* unk;
326+
int32_t (*attributes2)[256];
327+
char (*stringPool)[1];
328+
uint8_t (*bytePool)[256];
329+
int32_t (*internStrings)[14154];
330+
};
331+
332+
struct REModule {
333+
uint32_t guid[4];
334+
int32_t unk1;
335+
uint32_t unk2;
336+
uint16_t major;
337+
uint16_t minor;
338+
uint16_t build;
339+
uint16_t revision;
340+
uint32_t flags;
341+
int32_t assembly_name_offset; // string
342+
int32_t location_offset; // string
343+
uint32_t unk3;
344+
uint32_t module_name_offset; // string
345+
uint32_t unk4;
346+
int32_t types_count;
347+
int32_t types_start;
348+
int32_t methods_count;
349+
int32_t methods_start;
350+
int32_t method_instantiations_count;
351+
int32_t method_instantiations_start;
352+
int32_t member_references_count;
353+
int32_t member_references_start;
354+
};
355+
static_assert(sizeof(REModule) == 0x58);
356+
357+
#pragma pack(push, 4)
358+
struct REParameterDef {
359+
uint16_t attributes_id;
360+
uint16_t init_data_index;
361+
uint32_t name_offset : 30;
362+
uint32_t modifier : 2;
363+
uint32_t type_id : TYPE_INDEX_BITS;
364+
uint32_t flags : (32 - TYPE_INDEX_BITS);
365+
};
366+
367+
struct REMethodDefinition {
368+
uint32_t declaring_typeid : TYPE_INDEX_BITS;
369+
uint32_t params_lo : 13;
370+
uint32_t impl_id : 19;
371+
uint32_t params_hi : 13;
372+
int32_t encoded_offset;
373+
};
374+
static_assert(sizeof(REMethodDefinition) == 0xC);
375+
376+
struct REMethodImpl {
377+
uint16_t attributes_id;
378+
int16_t vtable_index;
379+
uint16_t flags;
380+
uint16_t impl_flags;
381+
uint32_t name_offset;
382+
};
383+
384+
struct RETypeImpl {
385+
int32_t name_offset; // 0x0
386+
int32_t namespace_offset; // 0x4
387+
int32_t field_size; // 0x8
388+
int32_t static_field_size; // 0xc
389+
uint64_t unk_pad : 33; // 0x10
390+
uint64_t num_member_fields : 24; // 0x10
391+
uint64_t unk_pad_2 : 7; // 0x10
392+
uint16_t num_member_methods; // 0x18
393+
int16_t num_native_vtable; // 0x1a
394+
int16_t interface_id; // 0x1c
395+
char pad_1e[0x12];
396+
};
397+
#if TDB_VER >= 71
398+
static_assert(sizeof(RETypeImpl) == 0x30);
399+
static_assert(offsetof(RETypeImpl, num_member_methods) == 0x18);
400+
#endif
401+
402+
struct REProperty {
403+
uint64_t impl_id : 20;
404+
uint64_t getter : 22;
405+
uint64_t setter : 22;
406+
};
407+
408+
struct REPropertyImpl {
409+
uint16_t flags;
410+
uint16_t attributes_id;
411+
int32_t name_offset;
412+
};
413+
#pragma pack(pop)
414+
415+
struct ParamList {
416+
uint16_t numParams; //0x0000
417+
uint16_t invokeID; //0x0002
418+
uint32_t returnType; //0x0004
419+
uint32_t params[1]; //0x0008
420+
};
421+
422+
struct REField {
423+
uint64_t declaring_typeid : TYPE_INDEX_BITS;
424+
uint64_t impl_id : TYPE_INDEX_BITS;
425+
uint64_t field_typeid : TYPE_INDEX_BITS;
426+
uint64_t init_data_hi : 6;
427+
uint64_t rest2 : 1;
428+
};
429+
430+
struct REFieldImpl {
431+
uint16_t attributes_id;
432+
uint16_t unk : 1;
433+
uint16_t flags : 15;
434+
uint32_t offset : 26;
435+
uint32_t init_data_lo : 6;
436+
uint32_t name_offset : 28;
437+
uint32_t init_data_mid : 4;
438+
};
439+
440+
struct GenericListData {
441+
uint32_t definition_typeid : TYPE_INDEX_BITS;
442+
uint32_t num : (32 - TYPE_INDEX_BITS);
443+
uint32_t types[1];
444+
};
445+
}
446+
269447
namespace tdb74 {
270448
struct REMethodDefinition;
271449
struct REMethodImpl;

shared/sdk/RETypeDefinition.hpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,45 @@ static_assert(sizeof(RETypeDefVersion84) == 0x50, "RETypeDefVersion84 has wrong
6565
static_assert(offsetof(RETypeDefVersion84, type_crc) == 0x1C);
6666
#endif
6767

68+
struct RETypeDefVersion82 {
69+
uint64_t index : TYPE_INDEX_BITS;
70+
uint64_t parent_typeid : TYPE_INDEX_BITS;
71+
uint64_t declaring_typeid : TYPE_INDEX_BITS;
72+
uint64_t underlying_typeid : 7;
73+
74+
uint64_t array_typeid_TBD : TYPE_INDEX_BITS;
75+
uint64_t element_typeid_TBD : TYPE_INDEX_BITS;
76+
77+
uint64_t impl_index : 18;
78+
uint64_t system_typeid : 7;
79+
80+
uint32_t type_flags;
81+
uint32_t size;
82+
uint32_t fqn_hash;
83+
uint32_t type_crc;
84+
uint64_t default_ctor : 22;
85+
uint64_t member_method : 22;
86+
uint64_t member_field : FIELD_BITS;
87+
uint32_t num_member_prop : 12;
88+
uint32_t member_prop : TYPE_INDEX_BITS;
89+
90+
uint32_t unk_data : 26;
91+
uint32_t object_type : 3;
92+
93+
int64_t unk_data_before_generics : 26;
94+
int64_t generics : 26;
95+
int64_t interfaces : 12;
96+
struct sdk::RETypeCLR* type;
97+
class ::REObjectInfo* managed_vt;
98+
99+
uint64_t unk_new_tdb74_uint64; // Adds 8 bytes
100+
};
101+
102+
#if TDB_VER >= 82
103+
static_assert(sizeof(RETypeDefVersion82) == 0x50, "RETypeDefVersion82 has wrong size");
104+
static_assert(offsetof(RETypeDefVersion82, type_crc) == 0x1C);
105+
#endif
106+
68107
struct RETypeDefVersion74 {
69108
uint64_t index : TYPE_INDEX_BITS;
70109
uint64_t parent_typeid : TYPE_INDEX_BITS;

shared/sdk/ReClass.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
#include "ReClass_Internal_PRAGMATA.hpp"
1313
#elif defined(MHWILDS)
1414
#include "ReClass_Internal_MHWILDS.hpp" // Copy of DD2 (for now)
15+
#elif defined(MHSTORIES3)
16+
#include "ReClass_Internal_MHSTORIES3.hpp" // Copy of MHWILDS (for now)
1517
#elif defined(DD2)
1618
#include "ReClass_Internal_DD2.hpp" // Copy of SF6
1719
#elif defined(SF6)

shared/sdk/TDBVer.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#define TDB_VER 67
55
#elif defined(PRAGMATA)
66
#define TDB_VER 84
7+
#elif defined(MHSTORIES3)
8+
#define TDB_VER 82
79
#elif defined(MHWILDS)
810
#define TDB_VER 74
911
#elif defined(DD2)
@@ -42,6 +44,7 @@
4244

4345
namespace sdk {
4446
struct RETypeDefVersion84;
47+
struct RETypeDefVersion82;
4548
struct RETypeDefVersion74;
4649
struct RETypeDefVersion71;
4750
struct RETypeDefVersion69;
@@ -58,6 +61,10 @@ struct RETypeDefinition;
5861
#define TYPE_INDEX_BITS 19
5962
#define FIELD_BITS 20
6063
using RETypeDefinition_ = sdk::RETypeDefVersion84;
64+
#elif defined(MHSTORIES3)
65+
#define TYPE_INDEX_BITS 19
66+
#define FIELD_BITS 20
67+
using RETypeDefinition_ = sdk::RETypeDefVersion82;
6168
#elif defined(MHWILDS)
6269
#define TYPE_INDEX_BITS 19
6370
#define FIELD_BITS 20

src/REFramework.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ class REFramework {
129129
return "dd2";
130130
#elif defined(MHWILDS)
131131
return "mhwilds";
132+
#elif defined(MHSTORIES3)
133+
return "mhstories3";
132134
#elif defined(PRAGMATA)
133135
return "pragmata";
134136
#else

0 commit comments

Comments
 (0)