@@ -22,7 +22,22 @@ struct DigimonPara
2222 uint8_t padding;
2323};
2424
25+ struct DigimonParaPAL
26+ {
27+ int32_t boneCount;
28+ int16_t radius;
29+ int16_t height;
30+ uint8_t type;
31+ uint8_t level;
32+ uint8_t special[3 ];
33+ uint8_t dropItem;
34+ uint8_t dropChance;
35+ int8_t moves[16 ];
36+ uint8_t padding;
37+ };
38+
2539static_assert (sizeof (DigimonPara) == 52 );
40+ static_assert (sizeof (DigimonParaPAL) == 32 );
2641
2742struct VersionData
2843{
@@ -31,6 +46,7 @@ struct VersionData
3146 uint32_t nameOffset;
3247 uint32_t paraOffset;
3348 uint32_t skelOffset;
49+ bool isPAL;
3450};
3551
3652struct MMDTexture
@@ -41,7 +57,6 @@ struct MMDTexture
4157struct Entry
4258{
4359 std::string filename;
44- DigimonPara para;
4560 std::vector<NodeEntry> skeleton;
4661 std::vector<uint8_t > texture;
4762};
@@ -67,6 +82,7 @@ constexpr VersionData SLUS_DATA = {
6782 .nameOffset = PSEXE_OFFSET (0x133b44 ),
6883 .paraOffset = PSEXE_OFFSET (0x12ceb4 ),
6984 .skelOffset = PSEXE_OFFSET (0x11ce60 ),
85+ .isPAL = false ,
7086};
7187
7288constexpr VersionData SLPS_11_DATA = {
@@ -75,6 +91,7 @@ constexpr VersionData SLPS_11_DATA = {
7591 .nameOffset = PSEXE_OFFSET (0x13d844 ),
7692 .paraOffset = PSEXE_OFFSET (0x13b344 ),
7793 .skelOffset = PSEXE_OFFSET (0x123780 ),
94+ .isPAL = false ,
7895};
7996
8097constexpr VersionData SLPS_10_DATA = {
@@ -83,6 +100,7 @@ constexpr VersionData SLPS_10_DATA = {
83100 .nameOffset = PSEXE_OFFSET (0x13ce24 ),
84101 .paraOffset = PSEXE_OFFSET (0x13a924 ),
85102 .skelOffset = PSEXE_OFFSET (0x122e68 ),
103+ .isPAL = false ,
86104};
87105
88106constexpr VersionData SLPM_DATA = {
@@ -91,6 +109,7 @@ constexpr VersionData SLPM_DATA = {
91109 .nameOffset = PSEXE_OFFSET (0x13e874 ),
92110 .paraOffset = PSEXE_OFFSET (0x13c32c ),
93111 .skelOffset = PSEXE_OFFSET (0x124728 ),
112+ .isPAL = false ,
94113};
95114
96115constexpr VersionData SLES02914_DATA = {
@@ -99,6 +118,7 @@ constexpr VersionData SLES02914_DATA = {
99118 .nameOffset = PSEXE_OFFSET (0x13ac0c ),
100119 .paraOffset = PSEXE_OFFSET (0x138b5c ),
101120 .skelOffset = PSEXE_OFFSET (0x122dd4 ),
121+ .isPAL = true ,
102122};
103123
104124constexpr VersionData SLES03434_DATA = {
@@ -107,6 +127,7 @@ constexpr VersionData SLES03434_DATA = {
107127 .nameOffset = PSEXE_OFFSET (0x13ae00 ),
108128 .paraOffset = PSEXE_OFFSET (0x138d50 ),
109129 .skelOffset = PSEXE_OFFSET (0x122de4 ),
130+ .isPAL = true ,
110131};
111132
112133constexpr VersionData SLES03435_DATA = {
@@ -115,6 +136,7 @@ constexpr VersionData SLES03435_DATA = {
115136 .nameOffset = PSEXE_OFFSET (0x13add8 ),
116137 .paraOffset = PSEXE_OFFSET (0x138d28 ),
117138 .skelOffset = PSEXE_OFFSET (0x122d6c ),
139+ .isPAL = true ,
118140};
119141
120142constexpr VersionData SLES03436_DATA = {
@@ -123,6 +145,7 @@ constexpr VersionData SLES03436_DATA = {
123145 .nameOffset = PSEXE_OFFSET (0x13b7e4 ),
124146 .paraOffset = PSEXE_OFFSET (0x139734 ),
125147 .skelOffset = PSEXE_OFFSET (0x122da0 ),
148+ .isPAL = true ,
126149};
127150
128151constexpr VersionData SLES03437_DATA = {
@@ -131,6 +154,7 @@ constexpr VersionData SLES03437_DATA = {
131154 .nameOffset = PSEXE_OFFSET (0x13b314 ),
132155 .paraOffset = PSEXE_OFFSET (0x139264 ),
133156 .skelOffset = PSEXE_OFFSET (0x122da0 ),
157+ .isPAL = true ,
134158};
135159
136160constexpr VersionData VERSION_DATA[] = { SLUS_DATA, SLPS_11_DATA, SLPS_10_DATA, SLPM_DATA, SLES02914_DATA,
@@ -177,17 +201,18 @@ std::vector<Entry> loadDigimonEntries(std::filesystem::path parentPath)
177201 std::vector<MMDTexture> textureData = readFileAsVector<MMDTexture>(parentPath / version.alltimPath );
178202 DigimonFileName* names = reinterpret_cast <DigimonFileName*>(data.data () + version.nameOffset );
179203 DigimonPara* para = reinterpret_cast <DigimonPara*>(data.data () + version.paraOffset );
204+ DigimonParaPAL* paraPAL = reinterpret_cast <DigimonParaPAL*>(data.data () + version.paraOffset );
180205 uint32_t * skelOffset = reinterpret_cast <uint32_t *>(data.data () + version.skelOffset );
181206
182207 for (int i = 0 ; i < 180 ; i++)
183208 {
184209 NodeEntry* skeletonOffset = reinterpret_cast <NodeEntry*>(data.data () + skelOffset[i] - 0x80090000 );
210+ int32_t boneCount = version.isPAL ? paraPAL[i].boneCount : para[i].boneCount ;
185211
186212 Entry entry;
187213 entry.filename = std::string (names[i]);
188- entry.para = para[i];
189214
190- for (int32_t j = 0 ; j < entry. para . boneCount ; j++)
215+ for (int32_t j = 0 ; j < boneCount; j++)
191216 entry.skeleton .push_back (skeletonOffset[j]);
192217
193218 std::copy (textureData[i].buffer , textureData[i].buffer + sizeof (MMDTexture), std::back_inserter (entry.texture ));
0 commit comments