@@ -48,6 +48,18 @@ struct Entry
4848};
4949
5050// data
51+ /*
52+ * name para skel
53+ * SLUS_010.32 0x133B44 0x12CEB4 0x11ce60
54+ * SLPS_017.97 0x13d844 0x13b344 0x123780 (1.1)
55+ * SLPS_017.97 0x13CE24 0x13A924 0x122E68 (1.0)
56+ * SLPM_804.02 0x13e874 0x13c32c 0x124728
57+ * SLES_029.14 0x13AC0C 0x138B5C 0x122DD4
58+ * SLES_034.34 0x13AE00 0x138D50 0x122DE4
59+ * SLES_034.35 0x13ADD8 0x138D28 0x122D6C
60+ * SLES_034.36 0x13B7E4 0x139734 0x122DA0
61+ * SLES_034.37 0x13B314 0x139264 0x122DA0
62+ */
5163constexpr uint32_t PSEXE_OFFSET (uint32_t offset) { return offset - 0x90000 ; }
5264
5365constexpr VersionData SLUS_DATA = {
@@ -58,14 +70,72 @@ constexpr VersionData SLUS_DATA = {
5870 .skelOffset = PSEXE_OFFSET (0x11ce60 ),
5971};
6072
61- constexpr VersionData SLPS_DATA = {
73+ constexpr VersionData SLPS_11_DATA = {
6274 .psexePath = " SLPS_017.97" ,
6375 .alltimPath = " CHDAT/ALLTIM.TIM" ,
6476 .nameOffset = PSEXE_OFFSET (0x13d844 ),
6577 .paraOffset = PSEXE_OFFSET (0x13b344 ),
6678 .skelOffset = PSEXE_OFFSET (0x123780 ),
6779};
6880
81+ constexpr VersionData SLPS_10_DATA = {
82+ .psexePath = " SLPS_017.97" ,
83+ .alltimPath = " CHDAT/ALLTIM.TIM" ,
84+ .nameOffset = PSEXE_OFFSET (0x13ce24 ),
85+ .paraOffset = PSEXE_OFFSET (0x13a924 ),
86+ .skelOffset = PSEXE_OFFSET (0x122e68 ),
87+ };
88+
89+ constexpr VersionData SLPM_DATA = {
90+ .psexePath = " SLPM_804.02" ,
91+ .alltimPath = " CHDAT/ALLTIM.TIM" ,
92+ .nameOffset = PSEXE_OFFSET (0x13e874 ),
93+ .paraOffset = PSEXE_OFFSET (0x13c32c ),
94+ .skelOffset = PSEXE_OFFSET (0x124728 ),
95+ };
96+
97+ constexpr VersionData SLES02914_DATA = {
98+ .psexePath = " SLES_029.14" ,
99+ .alltimPath = " CHDAT/ALLTIM.TIM" ,
100+ .nameOffset = PSEXE_OFFSET (0x13ac0c ),
101+ .paraOffset = PSEXE_OFFSET (0x138b5c ),
102+ .skelOffset = PSEXE_OFFSET (0x122dd4 ),
103+ };
104+
105+ constexpr VersionData SLES03434_DATA = {
106+ .psexePath = " SLES_034.34" ,
107+ .alltimPath = " CHDAT/ALLTIM.TIM" ,
108+ .nameOffset = PSEXE_OFFSET (0x13ae00 ),
109+ .paraOffset = PSEXE_OFFSET (0x138d50 ),
110+ .skelOffset = PSEXE_OFFSET (0x122de4 ),
111+ };
112+
113+ constexpr VersionData SLES03435_DATA = {
114+ .psexePath = " SLES_034.35" ,
115+ .alltimPath = " CHDAT/ALLTIM.TIM" ,
116+ .nameOffset = PSEXE_OFFSET (0x13add8 ),
117+ .paraOffset = PSEXE_OFFSET (0x138d28 ),
118+ .skelOffset = PSEXE_OFFSET (0x122d6c ),
119+ };
120+
121+ constexpr VersionData SLES03436_DATA = {
122+ .psexePath = " SLES_034.36" ,
123+ .alltimPath = " CHDAT/ALLTIM.TIM" ,
124+ .nameOffset = PSEXE_OFFSET (0x13b7e4 ),
125+ .paraOffset = PSEXE_OFFSET (0x139734 ),
126+ .skelOffset = PSEXE_OFFSET (0x122da0 ),
127+ };
128+
129+ constexpr VersionData SLES03437_DATA = {
130+ .psexePath = " SLES_034.37" ,
131+ .alltimPath = " CHDAT/ALLTIM.TIM" ,
132+ .nameOffset = PSEXE_OFFSET (0x13b314 ),
133+ .paraOffset = PSEXE_OFFSET (0x139264 ),
134+ .skelOffset = PSEXE_OFFSET (0x122da0 ),
135+ };
136+
137+ constexpr VersionData VERSION_DATA[] = { SLUS_DATA, SLPS_11_DATA, SLPS_10_DATA, SLPM_DATA, SLES02914_DATA,
138+ SLES03434_DATA, SLES03435_DATA, SLES03436_DATA, SLES03437_DATA };
69139// functions
70140
71141template <typename T> std::vector<T> readFileAsVector (std::filesystem::path path)
@@ -78,19 +148,32 @@ template<typename T> std::vector<T> readFileAsVector(std::filesystem::path path)
78148 return data;
79149}
80150
151+ VersionData getVersion (std::filesystem::path parentPath)
152+ {
153+ VersionData version;
154+
155+ if (std::filesystem::exists (parentPath / SLPS_10_DATA.psexePath ))
156+ {
157+ auto size = std::filesystem::file_size (parentPath / SLPS_10_DATA.psexePath );
158+
159+ if (size == 0xAF000 )
160+ return SLPS_11_DATA;
161+ else if (size == 0xAE000 )
162+ return SLPS_10_DATA;
163+ }
164+
165+ for (VersionData v : VERSION_DATA)
166+ if (std::filesystem::exists (parentPath / v.psexePath )) return v;
167+
168+ return SLUS_DATA;
169+ }
170+
81171std::vector<Entry> loadDigimonEntries (std::filesystem::path parentPath)
82172{
83173 using DigimonFileName = char [8 ];
84174
85- VersionData version;
86- if (std::filesystem::exists (parentPath / SLUS_DATA.psexePath ))
87- version = SLUS_DATA;
88- else if (std::filesystem::exists (parentPath / SLPS_DATA.psexePath ))
89- version = SLPS_DATA;
90- else
91- return {};
92-
93175 std::vector<Entry> digimonEntries;
176+ VersionData version = getVersion (parentPath);
94177 std::vector<uint8_t > data = readFileAsVector<uint8_t >(parentPath / version.psexePath );
95178 std::vector<MMDTexture> textureData = readFileAsVector<MMDTexture>(parentPath / version.alltimPath );
96179 DigimonFileName* names = reinterpret_cast <DigimonFileName*>(data.data () + version.nameOffset );
0 commit comments