├── .gitattributes ├── .gitignore ├── .gitmodules ├── PrismCatalogDownloader.sln └── PrismCatalogDownloader ├── CatalogBinaryParser.cs ├── CatalogManifest.cs ├── HashUtils.cs ├── PrismCatalogDownloader.csproj ├── PrismDefinitions.cs ├── Program.cs └── Properties └── launchSettings.json /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Mono auto generated files 17 | mono_crash.* 18 | 19 | # Build results 20 | [Dd]ebug/ 21 | [Dd]ebugPublic/ 22 | [Rr]elease/ 23 | [Rr]eleases/ 24 | x64/ 25 | x86/ 26 | [Ww][Ii][Nn]32/ 27 | [Aa][Rr][Mm]/ 28 | [Aa][Rr][Mm]64/ 29 | bld/ 30 | [Bb]in/ 31 | [Oo]bj/ 32 | [Oo]ut/ 33 | [Ll]og/ 34 | [Ll]ogs/ 35 | 36 | # Visual Studio 2015/2017 cache/options directory 37 | .vs/ 38 | # Uncomment if you have tasks that create the project's static files in wwwroot 39 | #wwwroot/ 40 | 41 | # Visual Studio 2017 auto generated files 42 | Generated\ Files/ 43 | 44 | # MSTest test Results 45 | [Tt]est[Rr]esult*/ 46 | [Bb]uild[Ll]og.* 47 | 48 | # NUnit 49 | *.VisualState.xml 50 | TestResult.xml 51 | nunit-*.xml 52 | 53 | # Build Results of an ATL Project 54 | [Dd]ebugPS/ 55 | [Rr]eleasePS/ 56 | dlldata.c 57 | 58 | # Benchmark Results 59 | BenchmarkDotNet.Artifacts/ 60 | 61 | # .NET Core 62 | project.lock.json 63 | project.fragment.lock.json 64 | artifacts/ 65 | 66 | # ASP.NET Scaffolding 67 | ScaffoldingReadMe.txt 68 | 69 | # StyleCop 70 | StyleCopReport.xml 71 | 72 | # Files built by Visual Studio 73 | *_i.c 74 | *_p.c 75 | *_h.h 76 | *.ilk 77 | *.meta 78 | *.obj 79 | *.iobj 80 | *.pch 81 | *.pdb 82 | *.ipdb 83 | *.pgc 84 | *.pgd 85 | *.rsp 86 | *.sbr 87 | *.tlb 88 | *.tli 89 | *.tlh 90 | *.tmp 91 | *.tmp_proj 92 | *_wpftmp.csproj 93 | *.log 94 | *.vspscc 95 | *.vssscc 96 | .builds 97 | *.pidb 98 | *.svclog 99 | *.scc 100 | 101 | # Chutzpah Test files 102 | _Chutzpah* 103 | 104 | # Visual C++ cache files 105 | ipch/ 106 | *.aps 107 | *.ncb 108 | *.opendb 109 | *.opensdf 110 | *.sdf 111 | *.cachefile 112 | *.VC.db 113 | *.VC.VC.opendb 114 | 115 | # Visual Studio profiler 116 | *.psess 117 | *.vsp 118 | *.vspx 119 | *.sap 120 | 121 | # Visual Studio Trace Files 122 | *.e2e 123 | 124 | # TFS 2012 Local Workspace 125 | $tf/ 126 | 127 | # Guidance Automation Toolkit 128 | *.gpState 129 | 130 | # ReSharper is a .NET coding add-in 131 | _ReSharper*/ 132 | *.[Rr]e[Ss]harper 133 | *.DotSettings.user 134 | 135 | # TeamCity is a build add-in 136 | _TeamCity* 137 | 138 | # DotCover is a Code Coverage Tool 139 | *.dotCover 140 | 141 | # AxoCover is a Code Coverage Tool 142 | .axoCover/* 143 | !.axoCover/settings.json 144 | 145 | # Coverlet is a free, cross platform Code Coverage Tool 146 | coverage*.json 147 | coverage*.xml 148 | coverage*.info 149 | 150 | # Visual Studio code coverage results 151 | *.coverage 152 | *.coveragexml 153 | 154 | # NCrunch 155 | _NCrunch_* 156 | .*crunch*.local.xml 157 | nCrunchTemp_* 158 | 159 | # MightyMoose 160 | *.mm.* 161 | AutoTest.Net/ 162 | 163 | # Web workbench (sass) 164 | .sass-cache/ 165 | 166 | # Installshield output folder 167 | [Ee]xpress/ 168 | 169 | # DocProject is a documentation generator add-in 170 | DocProject/buildhelp/ 171 | DocProject/Help/*.HxT 172 | DocProject/Help/*.HxC 173 | DocProject/Help/*.hhc 174 | DocProject/Help/*.hhk 175 | DocProject/Help/*.hhp 176 | DocProject/Help/Html2 177 | DocProject/Help/html 178 | 179 | # Click-Once directory 180 | publish/ 181 | 182 | # Publish Web Output 183 | *.[Pp]ublish.xml 184 | *.azurePubxml 185 | # Note: Comment the next line if you want to checkin your web deploy settings, 186 | # but database connection strings (with potential passwords) will be unencrypted 187 | *.pubxml 188 | *.publishproj 189 | 190 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 191 | # checkin your Azure Web App publish settings, but sensitive information contained 192 | # in these scripts will be unencrypted 193 | PublishScripts/ 194 | 195 | # NuGet Packages 196 | *.nupkg 197 | # NuGet Symbol Packages 198 | *.snupkg 199 | # The packages folder can be ignored because of Package Restore 200 | **/[Pp]ackages/* 201 | # except build/, which is used as an MSBuild target. 202 | !**/[Pp]ackages/build/ 203 | # Uncomment if necessary however generally it will be regenerated when needed 204 | #!**/[Pp]ackages/repositories.config 205 | # NuGet v3's project.json files produces more ignorable files 206 | *.nuget.props 207 | *.nuget.targets 208 | 209 | # Microsoft Azure Build Output 210 | csx/ 211 | *.build.csdef 212 | 213 | # Microsoft Azure Emulator 214 | ecf/ 215 | rcf/ 216 | 217 | # Windows Store app package directories and files 218 | AppPackages/ 219 | BundleArtifacts/ 220 | Package.StoreAssociation.xml 221 | _pkginfo.txt 222 | *.appx 223 | *.appxbundle 224 | *.appxupload 225 | 226 | # Visual Studio cache files 227 | # files ending in .cache can be ignored 228 | *.[Cc]ache 229 | # but keep track of directories ending in .cache 230 | !?*.[Cc]ache/ 231 | 232 | # Others 233 | ClientBin/ 234 | ~$* 235 | *~ 236 | *.dbmdl 237 | *.dbproj.schemaview 238 | *.jfm 239 | *.pfx 240 | *.publishsettings 241 | orleans.codegen.cs 242 | 243 | # Including strong name files can present a security risk 244 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 245 | #*.snk 246 | 247 | # Since there are multiple workflows, uncomment next line to ignore bower_components 248 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 249 | #bower_components/ 250 | 251 | # RIA/Silverlight projects 252 | Generated_Code/ 253 | 254 | # Backup & report files from converting an old project file 255 | # to a newer Visual Studio version. Backup files are not needed, 256 | # because we have git ;-) 257 | _UpgradeReport_Files/ 258 | Backup*/ 259 | UpgradeLog*.XML 260 | UpgradeLog*.htm 261 | ServiceFabricBackup/ 262 | *.rptproj.bak 263 | 264 | # SQL Server files 265 | *.mdf 266 | *.ldf 267 | *.ndf 268 | 269 | # Business Intelligence projects 270 | *.rdl.data 271 | *.bim.layout 272 | *.bim_*.settings 273 | *.rptproj.rsuser 274 | *- [Bb]ackup.rdl 275 | *- [Bb]ackup ([0-9]).rdl 276 | *- [Bb]ackup ([0-9][0-9]).rdl 277 | 278 | # Microsoft Fakes 279 | FakesAssemblies/ 280 | 281 | # GhostDoc plugin setting file 282 | *.GhostDoc.xml 283 | 284 | # Node.js Tools for Visual Studio 285 | .ntvs_analysis.dat 286 | node_modules/ 287 | 288 | # Visual Studio 6 build log 289 | *.plg 290 | 291 | # Visual Studio 6 workspace options file 292 | *.opt 293 | 294 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 295 | *.vbw 296 | 297 | # Visual Studio LightSwitch build output 298 | **/*.HTMLClient/GeneratedArtifacts 299 | **/*.DesktopClient/GeneratedArtifacts 300 | **/*.DesktopClient/ModelManifest.xml 301 | **/*.Server/GeneratedArtifacts 302 | **/*.Server/ModelManifest.xml 303 | _Pvt_Extensions 304 | 305 | # Paket dependency manager 306 | .paket/paket.exe 307 | paket-files/ 308 | 309 | # FAKE - F# Make 310 | .fake/ 311 | 312 | # CodeRush personal settings 313 | .cr/personal 314 | 315 | # Python Tools for Visual Studio (PTVS) 316 | __pycache__/ 317 | *.pyc 318 | 319 | # Cake - Uncomment if you are using it 320 | # tools/** 321 | # !tools/packages.config 322 | 323 | # Tabs Studio 324 | *.tss 325 | 326 | # Telerik's JustMock configuration file 327 | *.jmconfig 328 | 329 | # BizTalk build output 330 | *.btp.cs 331 | *.btm.cs 332 | *.odx.cs 333 | *.xsd.cs 334 | 335 | # OpenCover UI analysis results 336 | OpenCover/ 337 | 338 | # Azure Stream Analytics local run output 339 | ASALocalRun/ 340 | 341 | # MSBuild Binary and Structured Log 342 | *.binlog 343 | 344 | # NVidia Nsight GPU debugger configuration file 345 | *.nvuser 346 | 347 | # MFractors (Xamarin productivity tool) working folder 348 | .mfractor/ 349 | 350 | # Local History for Visual Studio 351 | .localhistory/ 352 | 353 | # BeatPulse healthcheck temp database 354 | healthchecksdb 355 | 356 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 357 | MigrationBackup/ 358 | 359 | # Ionide (cross platform F# VS Code tools) working folder 360 | .ionide/ 361 | 362 | # Fody - auto-generated XML schema 363 | FodyWeavers.xsd -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "LukeFZ.Shared"] 2 | path = LukeFZ.Shared 3 | url = https://github.com/LukeFZ/LukeFZ.Shared 4 | -------------------------------------------------------------------------------- /PrismCatalogDownloader.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.8.34227.203 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PrismCatalogDownloader", "PrismCatalogDownloader\PrismCatalogDownloader.csproj", "{F3C25834-E049-476F-A88C-739A6D948E21}" 7 | EndProject 8 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LukeFZ.Shared", "LukeFZ.Shared\LukeFZ.Shared\LukeFZ.Shared.csproj", "{C6A24CDF-6A0D-4A01-9F9F-CC24A8771F7B}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|Any CPU = Debug|Any CPU 13 | Release|Any CPU = Release|Any CPU 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {F3C25834-E049-476F-A88C-739A6D948E21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 17 | {F3C25834-E049-476F-A88C-739A6D948E21}.Debug|Any CPU.Build.0 = Debug|Any CPU 18 | {F3C25834-E049-476F-A88C-739A6D948E21}.Release|Any CPU.ActiveCfg = Release|Any CPU 19 | {F3C25834-E049-476F-A88C-739A6D948E21}.Release|Any CPU.Build.0 = Release|Any CPU 20 | {C6A24CDF-6A0D-4A01-9F9F-CC24A8771F7B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 21 | {C6A24CDF-6A0D-4A01-9F9F-CC24A8771F7B}.Debug|Any CPU.Build.0 = Debug|Any CPU 22 | {C6A24CDF-6A0D-4A01-9F9F-CC24A8771F7B}.Release|Any CPU.ActiveCfg = Release|Any CPU 23 | {C6A24CDF-6A0D-4A01-9F9F-CC24A8771F7B}.Release|Any CPU.Build.0 = Release|Any CPU 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {36DCCDCA-B3F8-4A17-A712-920EDB34F7E4} 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /PrismCatalogDownloader/CatalogBinaryParser.cs: -------------------------------------------------------------------------------- 1 | using System.Diagnostics; 2 | using System.Security.Cryptography; 3 | using System.Text; 4 | using LukeFZ.Shared; 5 | 6 | namespace PrismCatalogDownloader; 7 | 8 | public static class CatalogBinaryParser 9 | { 10 | private static readonly byte[] EncodedTempBuffer = new byte[8 + 8 + 10 + 16]; 11 | 12 | public static CatalogBinary ParseEncoded(CatalogManifest manifest, byte[] data) 13 | { 14 | var writer = SpanWriter.BigEndian(EncodedTempBuffer); 15 | writer.WriteBytes(Convert.FromHexString("E040926FB42EBD50886A8849E5545924")); 16 | writer.WriteUInt64(manifest.Seed); 17 | writer.WriteUInt64(manifest.LabelCrc); 18 | writer.WriteVarUInt64(manifest.Size); 19 | 20 | var hash = SHA1.HashData(EncodedTempBuffer.AsSpan(0, writer.Offset)); 21 | 22 | var key = hash[..16]; 23 | var iv = hash[4..20]; 24 | 25 | var span = data.AsSpan(); 26 | AesCtr.Decrypt(span, key, iv); 27 | return ParseCompressed(span); 28 | } 29 | 30 | public static CatalogBinary ParseCompressed(ReadOnlySpan data) 31 | { 32 | return Parse(Lz4.DecompressFrame(data)); 33 | } 34 | 35 | public static CatalogBinary Parse(ReadOnlySpan data) 36 | { 37 | var reader = new SpanReader(data, littleEndian: false); 38 | var ascii = Encoding.ASCII; 39 | 40 | var magic = reader.ReadUInt16(); 41 | if (magic != 0xbc10) 42 | throw new InvalidDataException("Invalid Magic."); 43 | 44 | var entryCount = reader.ReadVarUInt32(); 45 | var typeCount = reader.ReadVarUInt32(); 46 | var groupCount = reader.ReadVarUInt32(); 47 | 48 | var types = new Dictionary(); 49 | for (int i = 0; i < typeCount; i++) 50 | { 51 | types[i] = reader.ReadNullTerminatedString(); 52 | } 53 | 54 | var groupStrings = new Dictionary(); 55 | var groups = new Dictionary(); 56 | for (int i = 0; i < groupCount; i++) 57 | { 58 | groupStrings[i] = reader.ReadNullTerminatedString(); 59 | groups[i] = HashUtils.Crc32(ascii.GetBytes(groupStrings[i])); 60 | } 61 | 62 | var entries = new CatalogBinaryEntry[entryCount]; 63 | 64 | var groupRelations = new Dictionary>(); 65 | var revMap = new Dictionary(); 66 | 67 | // Loading Structure of Arrays 68 | for (int i = 0; i < entryCount; i++) 69 | { 70 | entries[i].Priority = reader.ReadVarInt32(); 71 | } 72 | 73 | for (int i = 0; i < entryCount; i++) 74 | { 75 | entries[i].ResourceType = (ResourceType)reader.ReadVarInt32(); 76 | } 77 | 78 | for (int i = 0; i < entryCount; i++) 79 | { 80 | entries[i].NumDeps = reader.ReadVarInt32(); 81 | } 82 | 83 | for (int i = 0; i < entryCount; i++) 84 | { 85 | entries[i].NumContents = reader.ReadVarInt32(); 86 | } 87 | 88 | for (int i = 0; i < entryCount; i++) 89 | { 90 | entries[i].NumGroups = reader.ReadVarInt32(); 91 | } 92 | 93 | for (int i = 0; i < entryCount; i++) 94 | { 95 | entries[i].Size = reader.ReadVarUInt64(); 96 | } 97 | 98 | for (int i = 0; i < entryCount; i++) 99 | { 100 | entries[i].TypeIdx = reader.ReadVarInt32(); 101 | } 102 | 103 | for (int i = 0; i < entryCount; i++) 104 | { 105 | entries[i].ContentTypes = new string[entries[i].NumContents]; 106 | 107 | for (int j = 0; j < entries[i].NumContents; j++) 108 | { 109 | entries[i].ContentTypes[j] = types[reader.ReadVarInt32()]; 110 | } 111 | } 112 | 113 | for (int i = 0; i < entryCount; i++) 114 | { 115 | var arr = new byte[4 * entries[i].NumGroups]; 116 | var writer = SpanWriter.BigEndian(arr); 117 | 118 | for (int j = 0; j < entries[i].NumGroups; j++) 119 | { 120 | var groupId = groups[reader.ReadVarInt32()]; 121 | writer.WriteUInt32(groupId); 122 | 123 | if (!groupRelations.TryGetValue(groupId, out var list)) 124 | { 125 | list = []; 126 | groupRelations[groupId] = list; 127 | } 128 | 129 | list.Add(i); 130 | } 131 | 132 | entries[i].GroupsChecksum = HashUtils.Crc32(arr); 133 | } 134 | 135 | for (int i = 0; i < entryCount; i++) 136 | { 137 | var label = reader.ReadNullTerminatedString(); 138 | 139 | var crc = HashUtils.Crc64(ascii.GetBytes(label)); 140 | crc = HashUtils.Crc64("."u8, crc); 141 | crc = HashUtils.Crc64(ascii.GetBytes(types[entries[i].TypeIdx]), crc); 142 | 143 | entries[i].Label = label; 144 | entries[i].LabelCrc = crc; 145 | 146 | // This is also actually the CRC but I use the label 147 | revMap[entries[i].Label] = i; 148 | } 149 | 150 | for (int i = 0; i < entryCount; i++) 151 | { 152 | entries[i].ContentAddressCrcs = new byte[8 * entries[i].NumContents]; 153 | var writer = SpanWriter.BigEndian(entries[i].ContentAddressCrcs); 154 | //entries[i].ContentAddressCrcs = new string[entries[i].NumContents]; 155 | for (int j = 0; j < entries[i].NumContents; j++) 156 | { 157 | var address = reader.ReadNullTerminatedString(); 158 | 159 | var crc = HashUtils.Crc64(ascii.GetBytes(address)); 160 | crc = HashUtils.Crc64("."u8, crc); 161 | crc = HashUtils.Crc64(ascii.GetBytes(entries[i].ContentTypes[j]), crc); 162 | writer.WriteUInt64(crc); 163 | //entries[i].ContentAddressCrcs[j] = reader.ReadNullTerminatedString(); 164 | } 165 | } 166 | 167 | for (int i = 0; i < entryCount; i++) 168 | { 169 | entries[i].DepCrcs = new byte[8 * entries[i].NumDeps]; 170 | var writer = SpanWriter.BigEndian(entries[i].DepCrcs); 171 | //entries[i].DepCrcs = new string[entries[i].NumDeps]; 172 | for (int j = 0; j < entries[i].NumDeps; j++) 173 | { 174 | var dep = reader.ReadNullTerminatedString(); 175 | var crc = HashUtils.Crc64(ascii.GetBytes(dep)); 176 | writer.WriteUInt64(crc); 177 | } 178 | 179 | entries[i].NumRecDepCrcs = entries[i].NumDeps; 180 | entries[i].RecDepCrcs = entries[i].DepCrcs; 181 | } 182 | 183 | for (int i = 0; i < entryCount; i++) 184 | { 185 | entries[i].Checksum = reader.ReadUInt64(); 186 | } 187 | 188 | for (int i = 0; i < entryCount; i++) 189 | { 190 | entries[i].Seed = (reader.Peek & 0x80) != 0 ? reader.ReadUInt64() : reader.ReadByte(); 191 | } 192 | 193 | Debug.Assert(reader.Offset == data.Length); 194 | 195 | return new CatalogBinary(types, groups, entries); 196 | } 197 | } 198 | 199 | public record CatalogBinary( 200 | Dictionary Types, 201 | Dictionary Groups, 202 | CatalogBinaryEntry[] Entries); 203 | 204 | public record struct CatalogBinaryEntry 205 | { 206 | public int Priority { get; set; } // 0x0 207 | public ResourceType ResourceType { get; set; } // 0x4 208 | public int NumDeps { get; set; } // 0x8 209 | public int NumContents { get; set; } // 0xc 210 | public int NumGroups { get; set; } // 0x10 211 | public ulong Size { get; set; } // 0x18 212 | public string Label { get; set; } // 0x20 213 | public int TypeIdx { get; set; } // 0x30 214 | public uint GroupsChecksum { get; set; } // 0x34 215 | public ulong LabelCrc { get; set; } // 0x38 216 | public byte[] ContentAddressCrcs { get; set; } // 0x40 // 64-bit CRC per Content 217 | public byte[] DepCrcs { get; set; } // 0x48 // 64-bit CRC per Dep 218 | public byte[] RecDepCrcs { get; set; } // 0x50 219 | public int NumRecDepCrcs { get; set; } // 0x58 220 | public ulong Checksum { get; set; } // 0x60 221 | public ulong Seed { get; set; } // 0x68 222 | public string[] ContentTypes { get; set; } // 0x70 223 | 224 | public readonly CatalogManifest AsManifest() 225 | => new(LabelCrc, Size, Checksum, Seed); 226 | } 227 | 228 | public enum ResourceType 229 | { 230 | BundlePlain = 0, 231 | BundlePaddedStart, 232 | RawPlain = 64, 233 | RawLz4Compressed, // Pack1 234 | RawEncrypted // Pack2 235 | } -------------------------------------------------------------------------------- /PrismCatalogDownloader/CatalogManifest.cs: -------------------------------------------------------------------------------- 1 | using System.Security.Cryptography; 2 | using LukeFZ.Shared; 3 | 4 | namespace PrismCatalogDownloader; 5 | 6 | public record CatalogManifest(ulong LabelCrc, ulong Size, ulong Checksum, ulong Seed) 7 | { 8 | public string GetRealName() 9 | { 10 | var data = (stackalloc byte[8 + 10 + 8]); 11 | var writer = SpanWriter.BigEndian(data); 12 | writer.WriteUInt64(Checksum); 13 | writer.WriteVarUInt64(Size); 14 | writer.WriteUInt64(LabelCrc); 15 | 16 | var hash = MD5.HashData(data[..writer.Offset]); 17 | return Base32.FromBytes(hash); 18 | } 19 | 20 | public static CatalogManifest FromCatalogInfo(string encodedInfo, ulong rootNameHash) 21 | { 22 | var info = Convert.FromBase64String(encodedInfo); 23 | var reader = new SpanReader(info, littleEndian: false); 24 | 25 | var checksum = reader.ReadUInt64(); 26 | var size = reader.ReadVarUInt64(); 27 | var seed = reader.ReadUInt64(); 28 | 29 | return new CatalogManifest(rootNameHash, size, checksum, seed); 30 | } 31 | } -------------------------------------------------------------------------------- /PrismCatalogDownloader/HashUtils.cs: -------------------------------------------------------------------------------- 1 | namespace PrismCatalogDownloader; 2 | 3 | public static class HashUtils 4 | { 5 | private static readonly ulong[] Crc64Table = new ulong[256]; 6 | private static readonly uint[] Crc32Table = new uint[256]; 7 | 8 | static HashUtils() 9 | { 10 | for (var i = 0uL; i < 256u; i++) 11 | { 12 | const ulong top = 1uL << 63; 13 | 14 | var val = i << 56; 15 | 16 | for (int j = 0; j < 8; j++) 17 | { 18 | if ((val & top) != 0) 19 | val = (val << 1) ^ 0x42F0E1EBA9EA3693uL; 20 | else 21 | val <<= 1; 22 | } 23 | 24 | Crc64Table[i] = val; 25 | } 26 | 27 | for (var i = 0u; i < 256u; i++) 28 | { 29 | var val = i; 30 | 31 | for (int j = 0; j < 8; j++) 32 | { 33 | if ((val & 1) != 0) 34 | val = (val >> 1) ^ 0xEDB88320; 35 | else 36 | val >>= 1; 37 | } 38 | 39 | Crc32Table[i] = val; 40 | } 41 | } 42 | 43 | public static ulong Crc64(ReadOnlySpan source, ulong crc = 0) 44 | { 45 | for (var i = 0; i < source.Length; i++) 46 | crc = Crc64Table[source[i] ^ (crc >> 56)] ^ (crc << 8); 47 | 48 | return crc; 49 | } 50 | 51 | public static ulong Crc64(ReadOnlySpan source, ulong crc = 0) 52 | { 53 | for (var i = 0; i < source.Length; i++) 54 | crc = Crc64Table[source[i] ^ (crc >> 56)] ^ (crc << 8); 55 | 56 | return crc; 57 | } 58 | 59 | public static uint Crc32(ReadOnlySpan source, uint crc = 0xffffffff) 60 | { 61 | for (var i = 0; i < source.Length; i++) 62 | crc = Crc32Table[(source[i] ^ crc) & 0xff] ^ (crc >> 8); 63 | 64 | return crc; 65 | } 66 | 67 | public static uint Crc32(ReadOnlySpan source, uint crc = 0xffffffff) 68 | { 69 | for (var i = 0; i < source.Length; i++) 70 | crc = Crc32Table[(source[i] ^ crc) & 0xff] ^ (crc >> 8); 71 | 72 | return ~crc; 73 | } 74 | } -------------------------------------------------------------------------------- /PrismCatalogDownloader/PrismCatalogDownloader.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Exe 5 | net8.0 6 | enable 7 | enable 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /PrismCatalogDownloader/PrismDefinitions.cs: -------------------------------------------------------------------------------- 1 |  2 | 3 | using System.Numerics; 4 | using System.Text.Json.Serialization; 5 | using MemoryPack; 6 | using PrismCatalogDownloader; 7 | 8 | namespace PRISM.Definitions 9 | { 10 | public enum AlbumType // TypeDefIndex: 24440 11 | { 12 | ProduceIdol = 0, 13 | SupportCharacter = 1 14 | } 15 | 16 | public static class AppReviewEnum // TypeDefIndex: 24434 17 | { 18 | // Nested types 19 | public enum ReViewType // TypeDefIndex: 24433 20 | { 21 | Gasha = 0 22 | } 23 | } 24 | 25 | public static class BirthdayCharacterId // TypeDefIndex: 24435 26 | { 27 | // Fields 28 | public const int AmanaCharactorId = 14; // Metadata: 0x00C3A6E3 29 | public const int TenkaCharactorId = 15; // Metadata: 0x00C3A6E4 30 | public const int HadukiCharactorId = 90; // Metadata: 0x00C3A6E5 31 | public const int ProducerCharactorId = 91; // Metadata: 0x00C3A6E7 32 | } 33 | 34 | public static class BirthdayEnum // TypeDefIndex: 24437 35 | { 36 | // Nested types 37 | public enum BirthdayPresentPhase // TypeDefIndex: 24436 38 | { 39 | First = 0, 40 | KeyWait = 1, 41 | Second = 2 42 | } 43 | } 44 | 45 | public enum ButtonBadgeType // TypeDefIndex: 24453 46 | { 47 | Chara = 0, 48 | Story = 1, 49 | Produce = 2, 50 | Live = 3, 51 | Gasha = 4, 52 | Mobile = 5, 53 | News = 6, 54 | Mission = 7, 55 | Present = 8, 56 | SeasonMission = 9, 57 | SpecialMission = 10, 58 | DirectMessage = 11, 59 | Item = 12, 60 | Shop = 13, 61 | Exchange = 14, 62 | Producer = 15, 63 | Friend = 16, 64 | Event = 17, 65 | EventStory = 18, 66 | EventMission = 19, 67 | EventMedalGasha = 20, 68 | Num = 21 69 | } 70 | 71 | public enum CategoryElementGridCellViewType // TypeDefIndex: 24441 72 | { 73 | Category = 0, 74 | Element = 1 75 | } 76 | 77 | public static class ChallengeTourConst // TypeDefIndex: 24656 78 | { 79 | // Fields 80 | public const string TopResourceTagName = "ChallengeTourTop"; // Metadata: 0x00C3A8CB 81 | public const string DetailResourceTagName = "ChallengeTourDetail"; // Metadata: 0x00C3A8DC 82 | public const string UnitEditResourceTagName = "ChallengeTourUnitEdit"; // Metadata: 0x00C3A8F0 83 | public const string ResultResourceTagName = "ChallengeTourResult"; // Metadata: 0x00C3A906 84 | public const string FilterTitle = "\u7D5E\u308A\u8FBC\u307F"; // Metadata: 0x00C3A91A 85 | public const string ResultAnimGet = "get"; // Metadata: 0x00C3A927 86 | public const string ResultAnimStar = "star"; // Metadata: 0x00C3A92B 87 | public static readonly Vector2[][] ShilhouettePosition; // 0x00 88 | 89 | // Constructors 90 | static ChallengeTourConst() { } // 0x0615A9F8-0x0615ACA0 91 | } 92 | 93 | public static class ChallengeTourEnum // TypeDefIndex: 24660 94 | { 95 | // Nested types 96 | public enum StageType // TypeDefIndex: 24657 97 | { 98 | None = 0, 99 | Normal = 1, 100 | Boss = 2 101 | } 102 | 103 | public enum StageFilterType // TypeDefIndex: 24658 104 | { 105 | NonStar = 0, 106 | Star1 = 1, 107 | Star2 = 2 108 | } 109 | 110 | public enum PIdilUnitDetailTabType // TypeDefIndex: 24659 111 | { 112 | ProduceIdol = 0, 113 | ProduceCard = 1 114 | } 115 | } 116 | 117 | public static class CharacterConst // TypeDefIndex: 24438 118 | { 119 | // Fields 120 | public const int Hazuki = 90; // Metadata: 0x00C3A6EC 121 | public const int FesIdolLimit = 500; // Metadata: 0x00C3A6EE 122 | public const int FesIdolTransferLimit = 15; // Metadata: 0x00C3A6F0 123 | public const int FesUnitLimit = 100; // Metadata: 0x00C3A6F1 124 | public const int FesUnitTransferLimit = 5; // Metadata: 0x00C3A6F3 125 | public const int MaxUnitMemberCount = 5; // Metadata: 0x00C3A6F4 126 | public const int LiveUnitMaxCount = 20; // Metadata: 0x00C3A6F5 127 | public const int UnitNameMaxLength = 10; // Metadata: 0x00C3A6F6 128 | public const int MaxPieceSelectedNum = 10; // Metadata: 0x00C3A6F7 129 | public const int PieceChangeRate = 1; // Metadata: 0x00C3A6F8 130 | public static readonly Dictionary SupportEffectFilterSchedule; // 0x00 131 | public static readonly Dictionary> SupportEffectFilterScheduleDetail; // 0x08 132 | public static readonly HashSet ProducePassiveEffectTypeIdNotRefersToSchedule; // 0x10 133 | public static readonly HashSet ProducePassiveEffectTypeIdRefersToScheduleDetail; // 0x18 134 | public static readonly HashSet ProducePassiveEffectTypeIdRefersToSchedule; // 0x20 135 | public static readonly Dictionary> ScheduleDetailTypeBelongingToScheduleType; // 0x28 136 | public const int RequiredItemsNumByGroup = 3; // Metadata: 0x00C3A6F9 137 | public const float FUnitLabelBlinkDuration = 2f; // Metadata: 0x00C3A6FA 138 | public const float TrainingTicketConsumptionMoneyFactor = 0.25f; // Metadata: 0x00C3A6FE 139 | 140 | // Constructors 141 | static CharacterConst() { } // 0x0612274C-0x06123464 142 | } 143 | 144 | public enum CostumePartType // TypeDefIndex: 24448 145 | { 146 | Costume = 0, 147 | HairStyle = 1, 148 | Accessory = 2 149 | } 150 | 151 | public class ExchangeConst // TypeDefIndex: 24468 152 | { 153 | // Fields 154 | public const int ExchangeIdolPiecePaddingHead = 16; // Metadata: 0x00C3A7FA 155 | public const int ExchangePaddingHead = 60; // Metadata: 0x00C3A7FB 156 | 157 | // Nested types 158 | public enum ExchangeViewType // TypeDefIndex: 24465 159 | { 160 | None = 0, 161 | Money = 1, 162 | IdolPiece = 2, 163 | CharacterPiece = 3, 164 | StarFragment = 4, 165 | SeasonMedal = 5, 166 | SelectionTicket = 6, 167 | CostumeTicket = 7 168 | } 169 | 170 | public enum ExchangeTabType // TypeDefIndex: 24466 171 | { 172 | None = 0, 173 | Money = 1, 174 | IdolPiece = 2, 175 | StarFragment = 3, 176 | SeasonMedal = 4, 177 | SelectionTicket = 5, 178 | CostumeTicket = 6 179 | } 180 | 181 | public enum ExchangeClosedReasonType // TypeDefIndex: 24467 182 | { 183 | None = 0, 184 | Jump = 1 185 | } 186 | 187 | // Constructors 188 | public ExchangeConst() { } // 0x0612346C-0x06123474 189 | } 190 | 191 | public static class FrameRateConstants // TypeDefIndex: 24454 192 | { 193 | // Fields 194 | public const int Shared = 60; // Metadata: 0x00C3A744 195 | public const int WhenPaused = 30; // Metadata: 0x00C3A745 196 | public const int ProduceIngame = 30; // Metadata: 0x00C3A746 197 | public const int DefaultRenderFPS = 60; // Metadata: 0x00C3A747 198 | public const int PowerSavingRenderFPS = 30; // Metadata: 0x00C3A748 199 | } 200 | 201 | public static class FriendConst // TypeDefIndex: 24470 202 | { 203 | // Fields 204 | public const string ResourceTagName = "Friend"; // Metadata: 0x00C3A80D 205 | } 206 | 207 | public static class FriendEnum // TypeDefIndex: 24474 208 | { 209 | // Nested types 210 | public enum CategoryType // TypeDefIndex: 24471 211 | { 212 | Follow = 0, 213 | Follower = 1, 214 | Recommend = 2 215 | } 216 | 217 | public enum SortCategory // TypeDefIndex: 24472 218 | { 219 | LoginDate = 0, 220 | Friend = 1, 221 | Follow = 2 222 | } 223 | 224 | public enum SortOrder // TypeDefIndex: 24473 225 | { 226 | Ascending = 0, 227 | Descending = 1 228 | } 229 | } 230 | 231 | public static class FullSizeOverlayEnum // TypeDefIndex: 24456 232 | { 233 | // Nested types 234 | public enum FullSizeOverlayType // TypeDefIndex: 24455 235 | { 236 | GlobalMenu = 0, 237 | Shop = 1, 238 | SeasonMission = 2, 239 | Friend = 3 240 | } 241 | } 242 | 243 | public enum GalleryContents // TypeDefIndex: 24439 244 | { 245 | Album = 0, 246 | Costume = 1, 247 | Voice = 2, 248 | Movie = 3 249 | } 250 | 251 | public static class GashaEnum // TypeDefIndex: 24477 252 | { 253 | // Nested types 254 | public enum SGashaPhase1FinishAnimationName // TypeDefIndex: 24475 255 | { 256 | Mot_Gasha_S1_SMP_Finish_R = 0, 257 | Mot_Gasha_S1_SMP_Finish_SR = 1, 258 | Mot_Gasha_S1_SMP_Finish_SSR = 2 259 | } 260 | 261 | public enum GashaResultItemAnimationName // TypeDefIndex: 24476 262 | { 263 | In_Normal = 0, 264 | In_PickUP = 1 265 | } 266 | } 267 | 268 | public static class GlobalMenuEnum // TypeDefIndex: 24479 269 | { 270 | // Nested types 271 | public enum MenuType // TypeDefIndex: 24478 272 | { 273 | Item = 0, 274 | Producer = 1, 275 | Friend = 2, 276 | Account = 3, 277 | ProduceSettings = 4, 278 | LiveSetting = 5, 279 | SystemSetting = 6, 280 | DM = 7, 281 | Help = 8, 282 | Inquiry = 9, 283 | Others = 10, 284 | Title = 11 285 | } 286 | } 287 | 288 | public enum HelpListCellType // TypeDefIndex: 24457 289 | { 290 | Large = 0, 291 | Small = 1 292 | } 293 | 294 | public static class HomeConst // TypeDefIndex: 24480 295 | { 296 | // Fields 297 | public const string HomeMainResourceTagName = "HomeMain"; // Metadata: 0x00C3A82D 298 | public const string HomeRemindItemResourceTagName = "HomeRemind"; // Metadata: 0x00C3A836 299 | public const string HomeSettingsResourceTagName = "HomeSettings"; // Metadata: 0x00C3A841 300 | public const string HomeLoginBonusResourceTagName = "HomeLoginBonus"; // Metadata: 0x00C3A84E 301 | public const string ChallengeTourStageDetailTagName = "ChallengeTourStageDetail"; // Metadata: 0x00C3A85D 302 | public const string HomeMotionPathFormat = "Animations/Character/ScenarioMode/{0}"; // Metadata: 0x00C3A876 303 | public const int CacheTime = 10; // Metadata: 0x00C3A89C 304 | public const float CharaMessageOpenMinTime = 10f; // Metadata: 0x00C3A89D 305 | public const float CharaMessageOpenMaxTime = 20f; // Metadata: 0x00C3A8A1 306 | public const float CharaMessageCloseTime = 1f; // Metadata: 0x00C3A8A5 307 | public const float CharaMessageLeaveActionTime = 60f; // Metadata: 0x00C3A8A9 308 | public const float FirstCharaMessageOpenTime = 1f; // Metadata: 0x00C3A8AD 309 | } 310 | 311 | public static class HomeEnum // TypeDefIndex: 24485 312 | { 313 | // Nested types 314 | public enum LoginBonusViewType // TypeDefIndex: 24481 315 | { 316 | Daily = 0, 317 | Special = 1, 318 | Single = 2 319 | } 320 | 321 | public enum Home3DViewType // TypeDefIndex: 24482 322 | { 323 | Producer = 0, 324 | CutScene = 1, 325 | LoginBonus = 2 326 | } 327 | 328 | public enum FadeType // TypeDefIndex: 24483 329 | { 330 | In = 0, 331 | Out = 1 332 | } 333 | 334 | public enum LoginBonusSkipType // TypeDefIndex: 24484 335 | { 336 | None = 0, 337 | First = 1, 338 | Second = 2 339 | } 340 | } 341 | 342 | public interface ICostume // TypeDefIndex: 24486 343 | { 344 | // Properties 345 | int Id { get; } 346 | LocalizationKey Name { get; } 347 | LocalizationKey Description { get; } 348 | LocalizationKey UnlockPremise { get; } 349 | MstCharacterInfo CharacterInfo { get; } 350 | int CostumeType { get; } 351 | } 352 | 353 | public enum IdolListFooterType // TypeDefIndex: 24451 354 | { 355 | Normal = 0, 356 | Favorite = 1, 357 | Transfer = 2 358 | } 359 | 360 | public enum IdolListTabType // TypeDefIndex: 24450 361 | { 362 | PI = 0, 363 | SC = 1, 364 | FU = 2, 365 | FI = 3 366 | } 367 | 368 | public enum IdolVoicePlayListCategory // TypeDefIndex: 24445 369 | { 370 | IdolCommon = 0, 371 | IdolCasualCostume = 1, 372 | ProduceIdol = 2, 373 | SupportCharacter = 3 374 | } 375 | 376 | public static class IListExtensions // TypeDefIndex: 24469 377 | { 378 | // Extension methods 379 | public static void Deconstruct(this IList list, out T value0, out T value1) 380 | { 381 | value0 = default; 382 | value1 = default; 383 | } 384 | } 385 | 386 | public readonly struct LocalizationKey // TypeDefIndex: 24487 387 | { 388 | // Fields 389 | public readonly string Category; // 0x00 390 | public readonly int Id; // 0x08 391 | 392 | // Constructors 393 | public LocalizationKey(string category, int id) 394 | { 395 | Category = default; 396 | Id = default; 397 | } // 0x06123474-0x0612349C 398 | } 399 | 400 | [MemoryPackable()] 401 | public partial class MasterData // TypeDefIndex: 24490 402 | { 403 | // Properties 404 | public Dictionary CharacterInfos { get; private set; } // 0x0612349C-0x061234A4 0x061234A4-0x061234AC 405 | public Dictionary Idols { get; private set; } // 0x061234AC-0x061234B4 0x061234B4-0x061234BC 406 | public Dictionary IdolStandingPositions { get; private set; } // 0x061234BC-0x061234C4 0x061234C4-0x061234CC 407 | public Dictionary CostumeSets { get; private set; } // 0x061234CC-0x061234D4 0x061234D4-0x061234DC 408 | public Dictionary Costumes { get; private set; } // 0x061234DC-0x061234E4 0x061234E4-0x061234EC 409 | public Dictionary CostumeResources { get; private set; } // 0x061234EC-0x061234F4 0x061234F4-0x061234FC 410 | public Dictionary Hairstyles { get; private set; } // 0x061234FC-0x06123504 0x06123504-0x0612350C 411 | [JsonConverter(typeof(ValueTupleDictionaryConverter))] 412 | public Dictionary<(int MstCharacterInfoId, int StyleType), MstHairstyleResource> HairstyleResources { get; private set; } // 0x0612350C-0x06123514 0x06123514-0x0612351C 413 | public Dictionary Accessories { get; private set; } // 0x0612351C-0x06123524 0x06123524-0x0612352C 414 | public Dictionary AccessoryResources { get; private set; } // 0x0612352C-0x06123534 0x06123534-0x0612353C 415 | public MstFavoriteMark[] FavoriteMarks { get; private set; } // 0x0612353C-0x06123544 0x06123544-0x0612354C 416 | public Dictionary ProductTypes { get; private set; } // 0x0612354C-0x06123554 0x06123554-0x0612355C 417 | public Dictionary ProduceIdolLimitBreakRecipes { get; private set; } // 0x0612355C-0x06123564 0x06123564-0x0612356C 418 | public Dictionary ProduceIdolEvolutionRecipes { get; private set; } // 0x0612356C-0x06123574 0x06123574-0x0612357C 419 | public Dictionary SupportCharacterLevelExps { get; private set; } // 0x0612357C-0x06123584 0x06123584-0x0612358C 420 | public Dictionary SupportCharacterLimitBreakRecipes { get; private set; } // 0x0612358C-0x06123594 0x06123594-0x0612359C 421 | public Dictionary OutgameVoiceMotions { get; private set; } // 0x0612359C-0x061235A4 0x061235A4-0x061235AC 422 | public Dictionary Units { get; private set; } // 0x061235AC-0x061235B4 0x061235B4-0x061235BC 423 | public MstItemProvider[] ItemProviders { get; private set; } // 0x061235BC-0x061235C4 0x061235C4-0x061235CC 424 | public Dictionary TrainingTickets { get; private set; } // 0x061235CC-0x061235D4 0x061235D4-0x061235DC 425 | public MstProduceActionEffectDisplay[] ProduceActionEffectDisplays { get; private set; } // 0x061235DC-0x061235E4 0x061235E4-0x061235EC 426 | public Dictionary VoiceResources { get; private set; } // 0x061235EC-0x061235F4 0x061235F4-0x061235FC 427 | public Dictionary SupportEffects { get; private set; } // 0x061235FC-0x06123604 0x06123604-0x0612360C 428 | public Dictionary ProducePassiveEffects { get; private set; } // 0x0612360C-0x06123614 0x06123614-0x0612361C 429 | public MstSupportCharacterLimitBreakBonus[] SupportCharacterLimitBreakBonuses { get; private set; } // 0x0612361C-0x06123624 0x06123624-0x0612362C 430 | public MstTips[] Tips { get; private set; } // 0x0612362C-0x06123634 0x06123634-0x0612363C 431 | public Dictionary TipsCategory { get; private set; } // 0x0612363C-0x06123644 0x06123644-0x0612364C 432 | public MstExchangeProductFilter[] ExchangeProductFilters { get; private set; } // 0x0612364C-0x06123654 0x06123654-0x0612365C 433 | public MstPotentialLiveSkill[] PotentialLiveSkills { get; private set; } // 0x0612365C-0x06123664 0x06123664-0x0612366C 434 | public Dictionary PotentialLiveSkillLevels { get; private set; } // 0x0612366C-0x06123674 0x06123674-0x0612367C 435 | public Dictionary LiveSkillEffects { get; private set; } // 0x0612367C-0x06123684 0x06123684-0x06123694 436 | public Dictionary ChainGroups { get; private set; } // 0x06123694-0x0612369C 0x0612369C-0x061236AC 437 | public Dictionary PhoneUsers { get; private set; } // 0x061236AC-0x061236B4 0x061236B4-0x061236C4 438 | public Dictionary PotentialSupportSkills { get; private set; } // 0x061236C4-0x061236CC 0x061236CC-0x061236DC 439 | public MstHelp[] Helps { get; private set; } // 0x061236DC-0x061236E4 0x061236E4-0x061236F4 440 | public MstBirthdayVoice[] BirthdayVoice { get; private set; } // 0x061236F4-0x061236FC 0x061236FC-0x0612370C 441 | public MstHelpGroup[] HelpGroups { get; private set; } // 0x0612370C-0x06123714 0x06123714-0x06123724 442 | public Dictionary IdolStories { get; private set; } // 0x06123724-0x0612372C 0x0612372C-0x0612373C 443 | public MstTitleImage[] TitleImages { get; private set; } // 0x0612373C-0x06123744 0x06123744-0x06123754 444 | public Dictionary Songs { get; private set; } // 0x06123754-0x0612375C 0x0612375C-0x0612376C 445 | public MstAdvInfo[] AdvInfos { get; private set; } // 0x0612376C-0x06123774 0x06123774-0x06123784 446 | public Dictionary TwestaUsers { get; private set; } // 0x06123784-0x0612378C 0x0612378C-0x0612379C 447 | public Dictionary ChainUsers { get; private set; } // 0x0612379C-0x061237A4 0x061237A4-0x061237B4 448 | public Dictionary BannerGenre { get; private set; } // 0x061237B4-0x061237BC 0x061237BC-0x061237CC 449 | public Dictionary Achievement { get; private set; } // 0x061237CC-0x061237D4 0x061237D4-0x061237E4 450 | public Dictionary EventIcon { get; private set; } // 0x061237E4-0x061237EC 0x061237EC-0x061237FC 451 | public Dictionary LoginBonus { get; private set; } // 0x061237FC-0x06123804 0x06123804-0x06123814 452 | public Dictionary LoginBonusGraffiti { get; private set; } // 0x06123814-0x0612381C 0x0612381C-0x0612382C 453 | public MstEpisode[] Episodes { get; private set; } // 0x0612382C-0x06123834 0x06123834-0x06123844 454 | public MstProduceCardContentGroup[] ProduceCardContentGroups { get; private set; } // 0x06123844-0x0612384C 0x0612384C-0x0612385C 455 | public MstProduceActionEffect[] ProduceActionEffects { get; private set; } // 0x0612385C-0x06123864 0x06123864-0x06123874 456 | public Dictionary Events { get; private set; } // 0x06123874-0x0612387C 0x0612387C-0x0612388C 457 | public Dictionary ProduceIdols { get; private set; } // 0x0612388C-0x06123894 0x06123894-0x061238A4 458 | public Dictionary TwestaArticles { get; private set; } // 0x061238A4-0x061238AC 0x061238AC-0x061238BC 459 | public Dictionary SupportCharacters { get; private set; } // 0x061238BC-0x061238C4 0x061238C4-0x061238D4 460 | public MstGeneralItem[] GeneralItems { get; private set; } // 0x061238D4-0x061238DC 0x061238DC-0x061238EC 461 | public Dictionary RecoveryDrinks { get; private set; } // 0x061238EC-0x061238F4 0x061238F4-0x06123904 462 | public Dictionary EpisodeEventMissionBanners { get; private set; } // 0x06123904-0x0612390C 0x0612390C-0x0612391C 463 | public Dictionary MainStoryChapters { get; private set; } // 0x0612391C-0x06123924 0x06123924-0x06123934 464 | public Dictionary MainStories { get; private set; } // 0x06123934-0x0612393C 0x0612393C-0x0612394C 465 | public Dictionary ExtraStoryCategories { get; private set; } // 0x0612394C-0x06123954 0x06123954-0x06123964 466 | public Dictionary ExtraStorySubCategories { get; private set; } // 0x06123964-0x0612396C 0x0612396C-0x0612397C 467 | public Dictionary ExtraStories { get; private set; } // 0x0612397C-0x06123984 0x06123984-0x06123994 468 | public Dictionary EventStories { get; private set; } // 0x06123994-0x0612399C 0x0612399C-0x061239AC 469 | public Dictionary ChallengeTourStages { get; private set; } // 0x061239AC-0x061239B4 0x061239B4-0x061239C4 470 | public Dictionary ChallengeTourMissions { get; private set; } // 0x061239C4-0x061239CC 0x061239CC-0x061239DC 471 | public Dictionary ChallengeTours { get; private set; } // 0x061239DC-0x061239E4 0x061239E4-0x061239F4 472 | public MstChallengeTourRival[] ChallengeTourRivals { get; private set; } // 0x061239F4-0x061239FC 0x061239FC-0x06123A0C 473 | public Dictionary SeasonMissions { get; private set; } // 0x06123A0C-0x06123A14 0x06123A14-0x06123A24 474 | public Dictionary GashaResources { get; private set; } // 0x06123A24-0x06123A2C 0x06123A2C-0x06123A3C 475 | public Dictionary PhoneCalls { get; private set; } // 0x06123A3C-0x06123A44 0x06123A44-0x06123A54 476 | public Dictionary GashaTickets { get; private set; } // 0x06123A54-0x06123A5C 0x06123A5C-0x06123A6C 477 | public Dictionary GashaCompensationTickets { get; private set; } // 0x06123A6C-0x06123A74 0x06123A74-0x06123A84 478 | public Dictionary GashaTokens { get; private set; } // 0x06123A84-0x06123A8C 0x06123A8C-0x06123A9C 479 | public Dictionary SelectionTickets { get; private set; } // 0x06123A9C-0x06123AA4 0x06123AA4-0x06123AB4 480 | public Dictionary CostumeTickets { get; private set; } // 0x06123AB4-0x06123ABC 0x06123ABC-0x06123ACC 481 | public MstProduceStrategyType[] ProduceStrategyTypes { get; private set; } // 0x06123ACC-0x06123AD4 0x06123AD4-0x06123AE4 482 | public Dictionary ChainTalkTexts { get; private set; } // 0x06123AE4-0x06123AEC 0x06123AEC-0x06123AFC 483 | [MemoryPackIgnore] 484 | public int[] FavoriteMarkIds { get; private set; } // 0x06123AFC-0x06123B04 0x06123B04-0x06123B14 485 | 486 | } 487 | 488 | public enum MovieCategory // TypeDefIndex: 24443 489 | { 490 | ProduceIdol = 0, 491 | SupportCharacter = 1 492 | } 493 | 494 | [MemoryPackable()] 495 | public partial class MstAccessory : ICostume, IMemoryPackable // TypeDefIndex: 24492 496 | { 497 | // Properties 498 | [PrimaryKey] 499 | public int Id { get; private set; } // 0x0612D190-0x0612D198 0x0612D198-0x0612D1A0 500 | [MemoryPackIgnore] 501 | public LocalizationKey Name { get => default; } // 0x0612D1A0-0x0612D204 502 | [MemoryPackIgnore] 503 | public LocalizationKey Description { get => default; } // 0x0612D204-0x0612D268 504 | [MemoryPackIgnore] 505 | public LocalizationKey UnlockPremise { get => default; } // 0x0612D268-0x0612D2CC 506 | public int MstCharacterInfoId { get; private set; } // 0x0612D2CC-0x0612D2D4 0x0612D2D4-0x0612D2DC 507 | public int CostumeType { get; private set; } // 0x0612D2DC-0x0612D2E4 0x0612D2E4-0x0612D2EC 508 | public int AccessoryType { get; private set; } // 0x0612D2EC-0x0612D2F4 0x0612D2F4-0x0612D2FC 509 | public int ResourceId { get; private set; } // 0x0612D2FC-0x0612D304 0x0612D304-0x0612D30C 510 | public int SortId { get; private set; } // 0x0612D30C-0x0612D314 0x0612D314-0x0612D31C 511 | [MemoryPackIgnore] 512 | public MstCharacterInfo CharacterInfo { get; private set; } // 0x0612D31C-0x0612D324 0x0612D324-0x0612D32C 513 | [MemoryPackIgnore] 514 | public MstAccessoryResource Resource { get; private set; } // 0x0612D32C-0x0612D334 0x0612D334-0x0612D33C 515 | 516 | } 517 | 518 | [MemoryPackable()] 519 | public partial class MstAccessoryResource // TypeDefIndex: 24494 520 | { 521 | // Properties 522 | [PrimaryKey] 523 | public int Id { get; private set; } // 0x0612D9C4-0x0612D9CC 0x0612D9CC-0x0612D9D4 524 | public string PrefabName { get; private set; } // 0x0612D9D4-0x0612D9DC 0x0612D9DC-0x0612D9E4 525 | } 526 | 527 | [MemoryPackable()] 528 | public partial class MstAchievement // TypeDefIndex: 24496 529 | { 530 | // Properties 531 | [PrimaryKey] 532 | public int Id { get; private set; } // 0x0612E084-0x0612E08C 0x0612E08C-0x0612E094 533 | [MemoryPackIgnore] 534 | public LocalizationKey Name { get => default; } // 0x0612E094-0x0612E0F8 535 | [MemoryPackIgnore] 536 | public LocalizationKey Description { get => default; } // 0x0612E0F8-0x0612E15C 537 | [MemoryPackIgnore] 538 | public LocalizationKey Condition { get => default; } // 0x0612E15C-0x0612E1C0 539 | public int AchievementType { get; private set; } // 0x0612E1C0-0x0612E1C8 0x0612E1C8-0x0612E1D0 540 | public int AchievementCategory { get; private set; } // 0x0612E1D0-0x0612E1D8 0x0612E1D8-0x0612E1E0 541 | [MemoryPackIgnore] 542 | public string ImagePath { get => default; } // 0x0612E1E0-0x0612E268 543 | } 544 | 545 | [MemoryPackable()] 546 | public partial class MstAdvInfo // TypeDefIndex: 24498 547 | { 548 | // Properties 549 | public string Id { get; private set; } // 0x0612E800-0x0612E808 0x0612E808-0x0612E810 550 | } 551 | 552 | [MemoryPackable()] 553 | public partial class MstBannerGenre // TypeDefIndex: 24500 554 | { 555 | // Properties 556 | [PrimaryKey] 557 | public int Id { get; private set; } // 0x0612ED5C-0x0612ED64 0x0612ED64-0x0612ED6C 558 | public string ResourceId { get; private set; } // 0x0612ED6C-0x0612ED74 0x0612ED74-0x0612ED7C 559 | [MemoryPackIgnore] 560 | public string ImagePath { get => default; } // 0x0612ED7C-0x0612EE04 561 | } 562 | 563 | [MemoryPackable()] 564 | public partial class MstBirthdayVoice // TypeDefIndex: 24502 565 | { 566 | // Properties 567 | [PrimaryKey] 568 | public int Id { get; private set; } // 0x0612F4A4-0x0612F4AC 0x0612F4AC-0x0612F4B4 569 | public int MstVoiceResourceId { get; private set; } // 0x0612F4B4-0x0612F4BC 0x0612F4BC-0x0612F4C4 570 | public System.DateTime ReleaseDate { get; private set; } // 0x0612F4C4-0x0612F4CC 0x0612F4CC-0x0612F4D4 571 | } 572 | 573 | [MemoryPackable()] 574 | public partial class MstChainGroup // TypeDefIndex: 24504 575 | { 576 | // Properties 577 | [PrimaryKey] 578 | public int Id { get; private set; } // 0x0612FA98-0x0612FAA0 0x0612FAA0-0x0612FAA8 579 | [MemoryPackIgnore] 580 | public LocalizationKey Name { get => default; } // 0x0612FAA8-0x0612FB0C 581 | public int GroupType { get; private set; } // 0x0612FB0C-0x0612FB14 0x0612FB14-0x0612FB1C 582 | public int[] MstChainUserId { get; private set; } // 0x0612FB1C-0x0612FB24 0x0612FB24-0x0612FB2C 583 | } 584 | 585 | [MemoryPackable()] 586 | public partial class MstChainTalkText // TypeDefIndex: 24506 587 | { 588 | // Properties 589 | [PrimaryKey] 590 | public int Id { get; private set; } // 0x0613025C-0x06130264 0x06130264-0x0613026C 591 | public int MstChainTalkId { get; private set; } // 0x0613026C-0x06130274 0x06130274-0x0613027C 592 | public int MstChainUserId { get; private set; } // 0x0613027C-0x06130284 0x06130284-0x0613028C 593 | public int TextType { get; private set; } // 0x0613028C-0x06130294 0x06130294-0x0613029C 594 | [MemoryPackIgnore] 595 | public LocalizationKey Body { get => default; } // 0x0613029C-0x06130300 596 | public int StampId { get; private set; } // 0x06130300-0x06130308 0x06130308-0x06130310 597 | public int ThumbnailId { get; private set; } // 0x06130310-0x06130318 0x06130318-0x06130320 598 | public int[] NextId { get; private set; } // 0x06130320-0x06130328 0x06130328-0x06130330 599 | public int ThinkingRate { get; private set; } // 0x06130330-0x06130338 0x06130338-0x06130340 600 | public int TypingRate { get; private set; } // 0x06130340-0x06130348 0x06130348-0x06130350 601 | [MemoryPackIgnore] 602 | public string StampPath { get => default; } // 0x06130350-0x061303D8 603 | [MemoryPackIgnore] 604 | public string ThumbnailPath { get => default; } // 0x061303D8-0x06130460 605 | } 606 | 607 | [MemoryPackable()] 608 | public partial class MstChainUser // TypeDefIndex: 24508 609 | { 610 | // Properties 611 | [PrimaryKey] 612 | public int Id { get; private set; } // 0x06130DD0-0x06130DD8 0x06130DD8-0x06130DE0 613 | public int MstUnitId { get; private set; } // 0x06130DE0-0x06130DE8 0x06130DE8-0x06130DF0 614 | [MemoryPackIgnore] 615 | public LocalizationKey Name { get => default; } // 0x06130DF0-0x06130E54 616 | [MemoryPackIgnore] 617 | public LocalizationKey Profile { get => default; } // 0x06130E54-0x06130EB8 618 | public int MstCharacterInfoId { get; private set; } // 0x06130EB8-0x06130EC0 0x06130EC0-0x06130EC8 619 | } 620 | 621 | [MemoryPackable()] 622 | public partial class MstChallengeTour // TypeDefIndex: 24510 623 | { 624 | // Properties 625 | [PrimaryKey] 626 | public int Id { get; private set; } // 0x06131460-0x06131468 0x06131468-0x06131470 627 | public int MstUnitId { get; private set; } // 0x06131470-0x06131478 0x06131478-0x06131480 628 | public bool IsDefault { get; private set; } // 0x06131480-0x06131488 0x06131488-0x06131494 629 | [MemoryPackIgnore] 630 | public string UnitCharaImagePath { get => default; } // 0x06131494-0x0613151C 631 | } 632 | 633 | [MemoryPackable()] 634 | public partial class MstChallengeTourMission // TypeDefIndex: 24512 635 | { 636 | // Properties 637 | [PrimaryKey] 638 | public int Id { get; private set; } // 0x06131AE0-0x06131AE8 0x06131AE8-0x06131AF0 639 | public int MissionType { get; private set; } // 0x06131AF0-0x06131AF8 0x06131AF8-0x06131B00 640 | [MemoryPackIgnore] 641 | public LocalizationKey Text { get => default; } // 0x06131B00-0x06131B64 642 | } 643 | 644 | [MemoryPackable()] 645 | public partial class MstChallengeTourRival // TypeDefIndex: 24514 646 | { 647 | // Properties 648 | public int SilhouetteId { get; private set; } // 0x061320AC-0x061320B4 0x061320B4-0x061320BC 649 | [MemoryPackIgnore] 650 | public string IconImagePath { get => default; } // 0x061320BC-0x06132144 651 | [MemoryPackIgnore] 652 | public string SilhouettePrefabPath { get => default; } // 0x06132144-0x061321CC 653 | } 654 | 655 | [MemoryPackable()] 656 | public partial class MstChallengeTourStage // TypeDefIndex: 24516 657 | { 658 | // Properties 659 | [PrimaryKey] 660 | public int Id { get; private set; } // 0x06132694-0x0613269C 0x0613269C-0x061326A4 661 | public int MstChallengeTourId { get; private set; } // 0x061326A4-0x061326AC 0x061326AC-0x061326B4 662 | public int StageNumber { get; private set; } // 0x061326B4-0x061326BC 0x061326BC-0x061326C4 663 | public int StageType { get; private set; } // 0x061326C4-0x061326CC 0x061326CC-0x061326D4 664 | public int MstRivalUnitId { get; private set; } // 0x061326D4-0x061326DC 0x061326DC-0x061326E4 665 | [MemoryPackIgnore] 666 | public LocalizationKey Description { get => default; } // 0x061326E4-0x06132748 667 | } 668 | 669 | [MemoryPackable()] 670 | public partial class MstCharacterInfo // TypeDefIndex: 24518 671 | { 672 | // Properties 673 | [PrimaryKey] 674 | public int Id { get; private set; } // 0x06132D80-0x06132D88 0x06132D88-0x06132D90 675 | public int MstUnitId { get; private set; } // 0x06132D90-0x06132D98 0x06132D98-0x06132DA0 676 | [MemoryPackIgnore] 677 | public LocalizationKey Name { get => default; } // 0x06132DA0-0x06132E04 678 | [MemoryPackIgnore] 679 | public LocalizationKey FirstName { get => default; } // 0x06132E04-0x06132E68 680 | [MemoryPackIgnore] 681 | public LocalizationKey LastName { get => default; } // 0x06132E68-0x06132ECC 682 | public string FirstNameRoma { get; private set; } // 0x06132ECC-0x06132ED4 0x06132ED4-0x06132EDC 683 | public string LastNameRoma { get; private set; } // 0x06132EDC-0x06132EE4 0x06132EE4-0x06132EEC 684 | public string FirstNameKana { get; private set; } // 0x06132EEC-0x06132EF4 0x06132EF4-0x06132EFC 685 | public string LastNameKana { get; private set; } // 0x06132EFC-0x06132F04 0x06132F04-0x06132F0C 686 | [MemoryPackIgnore] 687 | public LocalizationKey Cv { get => default; } // 0x06132F0C-0x06132F70 688 | public int Age { get; private set; } // 0x06132F70-0x06132F78 0x06132F78-0x06132F80 689 | public string BloodType { get; private set; } // 0x06132F80-0x06132F88 0x06132F88-0x06132F90 690 | public string Birthday { get; private set; } // 0x06132F90-0x06132F98 0x06132F98-0x06132FA0 691 | public string ZodiacSign { get; private set; } // 0x06132FA0-0x06132FA8 0x06132FA8-0x06132FB0 692 | public string DominantHand { get; private set; } // 0x06132FB0-0x06132FB8 0x06132FB8-0x06132FC0 693 | public string Birthplace { get; private set; } // 0x06132FC0-0x06132FC8 0x06132FC8-0x06132FD0 694 | public string Height { get; private set; } // 0x06132FD0-0x06132FD8 0x06132FD8-0x06132FE0 695 | public string Weight { get; private set; } // 0x06132FE0-0x06132FE8 0x06132FE8-0x06132FF0 696 | public string ThreeSizes { get; private set; } // 0x06132FF0-0x06132FF8 0x06132FF8-0x06133000 697 | public string Hobby { get; private set; } // 0x06133000-0x06133008 0x06133008-0x06133010 698 | public string SpecialAbility { get; private set; } // 0x06133010-0x06133018 0x06133018-0x06133020 699 | public string Description { get; private set; } // 0x06133020-0x06133028 0x06133028-0x06133030 700 | public string ColorCode { get; private set; } // 0x06133030-0x06133038 0x06133038-0x06133040 701 | public int MstDefaultCasualCostumeSetId { get; private set; } // 0x06133040-0x06133048 0x06133048-0x06133050 702 | public int MstTracksuitLifeSizeCostumeSetId { get; private set; } // 0x06133050-0x06133058 0x06133058-0x06133060 703 | public int MstTracksuitCbCostumeSetId { get; private set; } // 0x06133060-0x06133068 0x06133068-0x06133070 704 | public float Shape { get; private set; } // 0x06133070-0x06133078 0x06133078-0x06133080 705 | public float HeadShape { get; private set; } // 0x06133080-0x06133088 0x06133088-0x06133090 706 | public int MotionType { get; private set; } // 0x06133090-0x06133098 0x06133098-0x061330A0 707 | public string LightColorCode { get; private set; } // 0x061330A0-0x061330A8 0x061330A8-0x061330B0 708 | [MemoryPackIgnore] 709 | public string TipsCharacterImagePath { get => default; } // 0x061330B0-0x06133138 710 | [MemoryPackIgnore] 711 | public string CharacterBaseButtonPrefabPath { get => default; } // 0x06133138-0x061331C0 712 | [MemoryPackIgnore] 713 | public string BirthdayBackgroundPrefabPath { get => default; } // 0x061331C0-0x06133248 714 | [MemoryPackIgnore] 715 | public string BirthdayRibbonPath { get => default; } // 0x06133248-0x061332D0 716 | [MemoryPackIgnore] 717 | public string BirthdayCharacterNamePath { get => default; } // 0x061332D0-0x06133358 718 | [MemoryPackIgnore] 719 | public string SDIconPath { get => default; } // 0x06133358-0x061333E0 720 | [MemoryPackIgnore] 721 | public MstCostumeSet DefaultCasualCostumeSet { get; private set; } // 0x061333E0-0x061333E8 0x061333E8-0x061333F0 722 | [MemoryPackIgnore] 723 | public MstCostumeSet TracksuitLifeSizeCostumeSet { get; private set; } // 0x061333F0-0x061333F8 0x061333F8-0x06133400 724 | [MemoryPackIgnore] 725 | public MstCostumeSet TracksuitCbCostumeSet { get; private set; } // 0x06133400-0x06133408 0x06133408-0x06133410 726 | 727 | } 728 | 729 | [MemoryPackable()] 730 | public partial class MstCostume : ICostume // TypeDefIndex: 24520 731 | { 732 | // Properties 733 | [PrimaryKey] 734 | public int Id { get; private set; } // 0x06135804-0x0613580C 0x0613580C-0x06135814 735 | [MemoryPackIgnore] 736 | public LocalizationKey Name { get => default; } // 0x06135814-0x06135878 737 | [MemoryPackIgnore] 738 | public LocalizationKey Description { get => default; } // 0x06135878-0x061358DC 739 | [MemoryPackIgnore] 740 | public LocalizationKey UnlockPremise { get => default; } // 0x061358DC-0x06135940 741 | public int MstCharacterInfoId { get; private set; } // 0x06135940-0x06135948 0x06135948-0x06135950 742 | public int CostumeType { get; private set; } // 0x06135950-0x06135958 0x06135958-0x06135960 743 | public int ResourceId { get; private set; } // 0x06135960-0x06135968 0x06135968-0x06135970 744 | public int SortId { get; private set; } // 0x06135970-0x06135978 0x06135978-0x06135980 745 | [MemoryPackIgnore] 746 | public MstCharacterInfo CharacterInfo { get; private set; } // 0x06135980-0x06135988 0x06135988-0x06135990 747 | [MemoryPackIgnore] 748 | public MstCostumeResource Resource { get; private set; } // 0x06135990-0x06135998 0x06135998-0x061359A0 749 | 750 | } 751 | 752 | [MemoryPackable()] 753 | public partial class MstCostumeResource // TypeDefIndex: 24522 754 | { 755 | // Properties 756 | [PrimaryKey] 757 | public int Id { get; private set; } // 0x06135FD8-0x06135FE0 0x06135FE0-0x06135FE8 758 | public string PrefabName { get; private set; } // 0x06135FE8-0x06135FF0 0x06135FF0-0x06135FF8 759 | } 760 | 761 | [MemoryPackable()] 762 | public partial class MstCostumeSet // TypeDefIndex: 24526 763 | { 764 | // Properties 765 | [PrimaryKey] 766 | public int Id { get; private set; } // 0x06136698-0x061366A0 0x061366A0-0x061366A8 767 | [MemoryPackIgnore] 768 | public LocalizationKey Name { get => default; } // 0x061366A8-0x0613670C 769 | [MemoryPackIgnore] 770 | public LocalizationKey Description { get => default; } // 0x0613670C-0x06136770 771 | [MemoryPackIgnore] 772 | public LocalizationKey UnlockPremise { get => default; } // 0x06136770-0x061367D4 773 | public int CostumeType { get; private set; } // 0x061367D4-0x061367DC 0x061367DC-0x061367E4 774 | public int MstCostumeId { get; private set; } // 0x061367E4-0x061367EC 0x061367EC-0x061367F4 775 | public int MstHairstyleId { get; private set; } // 0x061367F4-0x061367FC 0x061367FC-0x06136804 776 | public int[] MstAccessoryIdList { get; private set; } // 0x06136804-0x0613680C 0x0613680C-0x06136814 777 | public int SortId { get; private set; } // 0x06136814-0x0613681C 0x0613681C-0x06136824 778 | [MemoryPackIgnore] 779 | public MstCostume Costume { get; private set; } // 0x06136824-0x0613682C 0x0613682C-0x06136834 780 | [MemoryPackIgnore] 781 | public MstHairstyle Hairstyle { get; private set; } // 0x06136834-0x0613683C 0x0613683C-0x06136844 782 | [MemoryPackIgnore] 783 | public MstAccessory[] Accessories { get; private set; } // 0x06136844-0x0613684C 0x0613684C-0x06136854 784 | 785 | // Constructors 786 | } 787 | 788 | [MemoryPackable()] 789 | public partial class MstCostumeTicket // TypeDefIndex: 24528 790 | { 791 | // Properties 792 | [PrimaryKey] 793 | public int Id { get; private set; } // 0x061372CC-0x061372D4 0x061372D4-0x061372DC 794 | } 795 | 796 | [MemoryPackable()] 797 | public partial class MstEpisode // TypeDefIndex: 24530 798 | { 799 | // Properties 800 | public int Id { get; private set; } // 0x061377A4-0x061377AC 0x061377AC-0x061377B4 801 | public int MstUnitId { get; private set; } // 0x061377B4-0x061377BC 0x061377BC-0x061377C4 802 | public int Chapter { get; private set; } // 0x061377C4-0x061377CC 0x061377CC-0x061377D4 803 | [MemoryPackIgnore] 804 | public LocalizationKey MvName { get => default; } // 0x061377D4-0x06137838 805 | [MemoryPackIgnore] 806 | public string CircleThumbnailPath { get => default; } // 0x06137838-0x061378CC 807 | [MemoryPackIgnore] 808 | public string RectThumbnailPath { get => default; } // 0x061378CC-0x06137960 809 | } 810 | 811 | [MemoryPackable()] 812 | public partial class MstEpisodeEventMissionBanner // TypeDefIndex: 24532 813 | { 814 | // Properties 815 | [PrimaryKey] 816 | public int Id { get; private set; } // 0x06137EF8-0x06137F00 0x06137F00-0x06137F08 817 | public int MstEpisodeId { get; private set; } // 0x06137F08-0x06137F10 0x06137F10-0x06137F18 818 | public int MstMissionGroupId { get; private set; } // 0x06137F18-0x06137F20 0x06137F20-0x06137F28 819 | [MemoryPackIgnore] 820 | public string BannerPath { get => default; } // 0x06137F28-0x06137FB0 821 | } 822 | 823 | [MemoryPackable()] 824 | public partial class MstEvent // TypeDefIndex: 24534 825 | { 826 | // Properties 827 | [PrimaryKey] 828 | public int Id { get; private set; } // 0x06138548-0x06138550 0x06138550-0x06138558 829 | public int EventType { get; private set; } // 0x06138558-0x06138560 0x06138560-0x06138568 830 | public int MstUnitId { get; private set; } // 0x06138568-0x06138570 0x06138570-0x06138578 831 | [MemoryPackIgnore] 832 | public string LiveEventLogoPath { get => default; } // 0x06138578-0x06138600 833 | [MemoryPackIgnore] 834 | public string CharacterPrefabPath { get => default; } // 0x06138600-0x06138688 835 | [MemoryPackIgnore] 836 | public string CharacterImagePath { get => default; } // 0x06138688-0x06138710 837 | [MemoryPackIgnore] 838 | public string BannerPath { get => default; } // 0x06138710-0x06138798 839 | [MemoryPackIgnore] 840 | public string BackgroundPath { get => default; } // 0x06138798-0x06138820 841 | [MemoryPackIgnore] 842 | public string MoviePath { get => default; } // 0x06138820-0x061388A8 843 | [MemoryPackIgnore] 844 | public string BgmName { get => default; } // 0x061388A8-0x06138930 845 | [MemoryPackIgnore] 846 | public string EventStoryCategoryThumbnailPath { get => default; } // 0x06138930-0x061389B8 847 | [MemoryPackIgnore] 848 | public string EventStoryBackgroundPath { get => default; } // 0x061389B8-0x06138A40 849 | } 850 | 851 | [MemoryPackable()] 852 | public partial class MstEventIcon // TypeDefIndex: 24536 853 | { 854 | // Properties 855 | [PrimaryKey] 856 | public int Id { get; private set; } // 0x06138FD8-0x06138FE0 0x06138FE0-0x06138FE8 857 | public int Place { get; private set; } // 0x06138FE8-0x06138FF0 0x06138FF0-0x06138FF8 858 | public string ImageResourceId { get; private set; } // 0x06138FF8-0x06139000 0x06139000-0x06139008 859 | public string Text { get; private set; } // 0x06139008-0x06139010 0x06139010-0x06139018 860 | public int DisplayCondition { get; private set; } // 0x06139018-0x06139020 0x06139020-0x06139028 861 | public int Priority { get; private set; } // 0x06139028-0x06139030 0x06139030-0x06139038 862 | [MemoryPackIgnore] 863 | public string ImagePath { get => default; } // 0x06139038-0x061390C0 864 | } 865 | 866 | [MemoryPackable()] 867 | public partial class MstEventStory // TypeDefIndex: 24538 868 | { 869 | // Properties 870 | [PrimaryKey] 871 | public int Id { get; private set; } // 0x06139A14-0x06139A1C 0x06139A1C-0x06139A24 872 | [MemoryPackIgnore] 873 | public LocalizationKey Title { get => default; } // 0x06139A24-0x06139A88 874 | [MemoryPackIgnore] 875 | public LocalizationKey Episode { get => default; } // 0x06139A88-0x06139AEC 876 | public int ScenarioNumber { get; private set; } // 0x06139AEC-0x06139AF4 0x06139AF4-0x06139AFC 877 | public int MstEventId { get; private set; } // 0x06139AFC-0x06139B04 0x06139B04-0x06139B0C 878 | public int EpisodeType { get; private set; } // 0x06139B0C-0x06139B14 0x06139B14-0x06139B1C 879 | public int SortId { get; private set; } // 0x06139B1C-0x06139B24 0x06139B24-0x06139B2C 880 | public int[] MstCharacterInfoIdList { get; private set; } // 0x06139B2C-0x06139B34 0x06139B34-0x06139B3C 881 | public int UnlockPremiseMstEventStoryId { get; private set; } // 0x06139B3C-0x06139B44 0x06139B44-0x06139B4C 882 | public int UnlockPremiseEventPoint { get; private set; } // 0x06139B4C-0x06139B54 0x06139B54-0x06139B5C 883 | public System.DateTime ReleaseDate { get; private set; } // 0x06139B5C-0x06139B64 0x06139B64-0x06139B6C 884 | public int PreviousMstEventStoryId { get; private set; } // 0x06139B6C-0x06139B74 0x06139B74-0x06139B7C 885 | [MemoryPackIgnore] 886 | public string ThumbnailPath { get => default; } // 0x06139B7C-0x06139C04 887 | } 888 | 889 | [MemoryPackable()] 890 | public partial class MstExchangeProductFilter // TypeDefIndex: 24540 891 | { 892 | // Properties 893 | public int Id { get; private set; } // 0x0613A5F0-0x0613A5F8 0x0613A5F8-0x0613A600 894 | [MemoryPackIgnore] 895 | public LocalizationKey Name { get => default; } // 0x0613A600-0x0613A664 896 | } 897 | 898 | [MemoryPackable()] 899 | public partial class MstExtraStory // TypeDefIndex: 24542 900 | { 901 | // Properties 902 | [PrimaryKey] 903 | public int Id { get; private set; } // 0x0613C248-0x0613C250 0x0613C250-0x0613C258 904 | [MemoryPackIgnore] 905 | public LocalizationKey Title { get => default; } // 0x0613C258-0x0613C2BC 906 | public int ExtraStoryType { get; private set; } // 0x0613C2BC-0x0613C2C4 0x0613C2C4-0x0613C2CC 907 | [MemoryPackIgnore] 908 | public LocalizationKey Episode { get => default; } // 0x0613C2CC-0x0613C330 909 | public int MstExtraStorySubCategoryId { get; private set; } // 0x0613C330-0x0613C338 0x0613C338-0x0613C340 910 | public int SortId { get; private set; } // 0x0613C340-0x0613C348 0x0613C348-0x0613C350 911 | public string ScenarioId { get; private set; } // 0x0613C350-0x0613C358 0x0613C358-0x0613C360 912 | public int[] MstCharacterInfoIdList { get; private set; } // 0x0613C360-0x0613C368 0x0613C368-0x0613C370 913 | public int UnlockPremiseMstExtraStoryId { get; private set; } // 0x0613C370-0x0613C378 0x0613C378-0x0613C380 914 | public System.DateTime ReleaseDate { get; private set; } // 0x0613C380-0x0613C388 0x0613C388-0x0613C390 915 | public int PreviousMstExtraStoryId { get; private set; } // 0x0613C390-0x0613C398 0x0613C398-0x0613C3A0 916 | [MemoryPackIgnore] 917 | public string ThumbnailPath { get => default; } // 0x0613C3A0-0x0613C428 918 | } 919 | 920 | [MemoryPackable()] 921 | public partial class MstExtraStoryCategory // TypeDefIndex: 24544 922 | { 923 | // Properties 924 | [PrimaryKey] 925 | public int Id { get; private set; } // 0x0613CF14-0x0613CF1C 0x0613CF1C-0x0613CF24 926 | [MemoryPackIgnore] 927 | public LocalizationKey Title { get => default; } // 0x0613CF24-0x0613CF88 928 | public System.DateTime ReleaseDate { get; private set; } // 0x0613CF88-0x0613CF90 0x0613CF90-0x0613CF98 929 | [MemoryPackIgnore] 930 | public string ThumbnailPath { get => default; } // 0x0613CF98-0x0613D020 931 | } 932 | 933 | [MemoryPackable()] 934 | public partial class MstExtraStorySubCategory // TypeDefIndex: 24546 935 | { 936 | // Properties 937 | [PrimaryKey] 938 | public int Id { get; private set; } // 0x0613D684-0x0613D68C 0x0613D68C-0x0613D694 939 | [MemoryPackIgnore] 940 | public LocalizationKey Title { get => default; } // 0x0613D694-0x0613D6F8 941 | public int MstExtraStoryCategoryId { get; private set; } // 0x0613D6F8-0x0613D700 0x0613D700-0x0613D708 942 | public System.DateTime ReleaseDate { get; private set; } // 0x0613D708-0x0613D710 0x0613D710-0x0613D718 943 | [MemoryPackIgnore] 944 | public string ThumbnailPath { get => default; } // 0x0613D718-0x0613D7A0 945 | [MemoryPackIgnore] 946 | public string ExtraStoryBackgroundPath { get => default; } // 0x0613D7A0-0x0613D828 947 | } 948 | 949 | [MemoryPackable()] 950 | public partial class MstFavoriteMark // TypeDefIndex: 24548 951 | { 952 | // Properties 953 | public int Id { get; private set; } // 0x0613DDEC-0x0613DDF4 0x0613DDF4-0x0613DDFC 954 | } 955 | 956 | [MemoryPackable()] 957 | public partial class MstGashaCompensationTicket // TypeDefIndex: 24550 958 | { 959 | // Properties 960 | [PrimaryKey] 961 | public int Id { get; private set; } // 0x0613E2C4-0x0613E2CC 0x0613E2CC-0x0613E2D4 962 | public int SortId { get; private set; } // 0x0613E2D4-0x0613E2DC 0x0613E2DC-0x0613E2E4 963 | public string[] GashaResourceIdList { get; private set; } // 0x0613E2E4-0x0613E2EC 0x0613E2EC-0x0613E2F4 964 | } 965 | 966 | [MemoryPackable()] 967 | public partial class MstGashaResource // TypeDefIndex: 24552 968 | { 969 | // Properties 970 | [PrimaryKey] 971 | public string Id { get; private set; } // 0x0613E9E4-0x0613E9EC 0x0613E9EC-0x0613E9F4 972 | public string[] MovieList { get; private set; } // 0x0613E9F4-0x0613E9FC 0x0613E9FC-0x0613EA04 973 | public string[] MovieValueList { get; private set; } // 0x0613EA04-0x0613EA0C 0x0613EA0C-0x0613EA14 974 | public string[] ImageList { get; private set; } // 0x0613EA14-0x0613EA1C 0x0613EA1C-0x0613EA24 975 | public string StepCatchphraseImage { get; private set; } // 0x0613EA24-0x0613EA2C 0x0613EA2C-0x0613EA34 976 | } 977 | 978 | [MemoryPackable()] 979 | public partial class MstGashaTicket // TypeDefIndex: 24554 980 | { 981 | // Properties 982 | [PrimaryKey] 983 | public int Id { get; private set; } // 0x0613F584-0x0613F58C 0x0613F58C-0x0613F594 984 | public int SortId { get; private set; } // 0x0613F594-0x0613F59C 0x0613F59C-0x0613F5A4 985 | public string[] GashaResourceIdList { get; private set; } // 0x0613F5A4-0x0613F5AC 0x0613F5AC-0x0613F5B4 986 | } 987 | 988 | [MemoryPackable()] 989 | public partial class MstGashaToken // TypeDefIndex: 24556 990 | { 991 | // Properties 992 | [PrimaryKey] 993 | public int Id { get; private set; } // 0x0613FCA4-0x0613FCAC 0x0613FCAC-0x0613FCB4 994 | public int SortId { get; private set; } // 0x0613FCB4-0x0613FCBC 0x0613FCBC-0x0613FCC4 995 | } 996 | 997 | [MemoryPackable()] 998 | public partial class MstGeneralItem // TypeDefIndex: 24558 999 | { 1000 | // Properties 1001 | public int ProductType { get; private set; } // 0x0614020C-0x06140214 0x06140214-0x0614021C 1002 | public int Id { get; private set; } // 0x0614021C-0x06140224 0x06140224-0x0614022C 1003 | } 1004 | 1005 | [MemoryPackable()] 1006 | public partial class MstHairstyle : ICostume, IMemoryPackable // TypeDefIndex: 24562 1007 | { 1008 | // Properties 1009 | [PrimaryKey] 1010 | public int Id { get; private set; } // 0x06140774-0x0614077C 0x0614077C-0x06140784 1011 | [MemoryPackIgnore] 1012 | public LocalizationKey Name { get => default; } // 0x06140784-0x061407E8 1013 | [MemoryPackIgnore] 1014 | public LocalizationKey Description { get => default; } // 0x061407E8-0x0614084C 1015 | [MemoryPackIgnore] 1016 | public LocalizationKey UnlockPremise { get => default; } // 0x0614084C-0x061408B0 1017 | public int MstCharacterInfoId { get; private set; } // 0x061408B0-0x061408B8 0x061408B8-0x061408C0 1018 | public int CostumeType { get; private set; } // 0x061408C0-0x061408C8 0x061408C8-0x061408D0 1019 | public int HairResourceIdForClient { get; private set; } // 0x061408D0-0x061408D8 0x061408D8-0x061408E0 1020 | public int[] HairAccessoryResourceIdListForClient { get; private set; } // 0x061408E0-0x061408E8 0x061408E8-0x061408F0 1021 | public int SortId { get; private set; } // 0x061408F0-0x061408F8 0x061408F8-0x06140900 1022 | [MemoryPackIgnore] 1023 | public MstCharacterInfo CharacterInfo { get; private set; } // 0x06140900-0x06140908 0x06140908-0x06140910 1024 | [MemoryPackIgnore] 1025 | public MstHairstyleResource HairResource { get; private set; } // 0x06140910-0x06140918 0x06140918-0x06140920 1026 | [MemoryPackIgnore] 1027 | public MstAccessoryResource[] HairAccessoryResources { get; private set; } // 0x06140920-0x06140928 0x06140928-0x06140930 1028 | 1029 | } 1030 | 1031 | [MemoryPackable()] 1032 | public partial class MstHairstyleResource // TypeDefIndex: 24564 1033 | { 1034 | // Properties 1035 | [PrimaryKey] 1036 | public int MstCharacterInfoId { get; private set; } // 0x0614153C-0x06141544 0x06141544-0x0614154C 1037 | [PrimaryKey] 1038 | public int StyleType { get; private set; } // 0x0614154C-0x06141554 0x06141554-0x0614155C 1039 | public int HairId { get; private set; } // 0x0614155C-0x06141564 0x06141564-0x0614156C 1040 | public int HeadWearId { get; private set; } // 0x0614156C-0x06141574 0x06141574-0x0614157C 1041 | } 1042 | 1043 | [MemoryPackable()] 1044 | public partial class MstHelp // TypeDefIndex: 24566 1045 | { 1046 | // Properties 1047 | public int Id { get; private set; } // 0x06141B68-0x06141B70 0x06141B70-0x06141B78 1048 | public int SortId { get; private set; } // 0x06141B78-0x06141B80 0x06141B80-0x06141B88 1049 | public int MstHelpGroupId { get; private set; } // 0x06141B88-0x06141B90 0x06141B90-0x06141B98 1050 | [MemoryPackIgnore] 1051 | public LocalizationKey HelpTitle { get => default; } // 0x06141B98-0x06141BFC 1052 | [MemoryPackIgnore] 1053 | public LocalizationKey HelpBody { get => default; } // 0x06141BFC-0x06141C60 1054 | public bool IsMobile { get; private set; } // 0x06141C60-0x06141C68 0x06141C68-0x06141C74 1055 | public bool IsGpg { get; private set; } // 0x06141C74-0x06141C7C 0x06141C7C-0x06141C88 1056 | public bool IsDmm { get; private set; } // 0x06141C88-0x06141C90 0x06141C90-0x06141C9C 1057 | public System.DateTime BeginDate { get; private set; } // 0x06141C9C-0x06141CA4 0x06141CA4-0x06141CAC 1058 | public System.DateTime EndDate { get; private set; } // 0x06141CAC-0x06141CB4 0x06141CB4-0x06141CBC 1059 | } 1060 | 1061 | [MemoryPackable()] 1062 | public partial class MstHelpGroup // TypeDefIndex: 24568 1063 | { 1064 | // Properties 1065 | public int Id { get; private set; } // 0x06142458-0x06142460 0x06142460-0x06142468 1066 | public int SortId { get; private set; } // 0x06142468-0x06142470 0x06142470-0x06142478 1067 | [MemoryPackIgnore] 1068 | public LocalizationKey HelpGroupTitle { get => default; } // 0x06142478-0x061424DC 1069 | public int HelpType { get; private set; } // 0x061424DC-0x061424E4 0x061424E4-0x061424EC 1070 | public System.DateTime BeginDate { get; private set; } // 0x061424EC-0x061424F4 0x061424F4-0x061424FC 1071 | public System.DateTime EndDate { get; private set; } // 0x061424FC-0x06142504 0x06142504-0x0614250C 1072 | } 1073 | 1074 | [MemoryPackable()] 1075 | public partial class MstIdol // TypeDefIndex: 24570 1076 | { 1077 | // Properties 1078 | [PrimaryKey] 1079 | public int Id { get; private set; } // 0x06142B68-0x06142B70 0x06142B70-0x06142B78 1080 | public int MstDefaultLiveCostumeSetId { get; private set; } // 0x06142B78-0x06142B80 0x06142B80-0x06142B88 1081 | [MemoryPackIgnore] 1082 | public MstCostumeSet DefaultLiveCostumeSet { get; private set; } // 0x06142B88-0x06142B90 0x06142B90-0x06142B98 1083 | 1084 | } 1085 | 1086 | [MemoryPackable()] 1087 | public partial class MstIdolStandingPosition // TypeDefIndex: 24572 1088 | { 1089 | // Properties 1090 | [PrimaryKey] 1091 | public int MstUnitId { get; private set; } // 0x06143148-0x06143150 0x06143150-0x06143158 1092 | public int[] Order { get; private set; } // 0x06143158-0x06143160 0x06143160-0x06143168 1093 | } 1094 | 1095 | [MemoryPackable()] 1096 | public partial class MstIdolStory // TypeDefIndex: 24574 1097 | { 1098 | // Properties 1099 | [PrimaryKey] 1100 | public int Id { get; private set; } // 0x0614384C-0x06143854 0x06143854-0x0614385C 1101 | [MemoryPackIgnore] 1102 | public LocalizationKey Title { get => default; } // 0x0614385C-0x061438C0 1103 | [MemoryPackIgnore] 1104 | public LocalizationKey Episode { get => default; } // 0x061438C0-0x06143924 1105 | public int MstIdolId { get; private set; } // 0x06143924-0x0614392C 0x0614392C-0x06143934 1106 | public int SortId { get; private set; } // 0x06143934-0x0614393C 0x0614393C-0x06143944 1107 | public int[] MstCharacterInfoIdList { get; private set; } // 0x06143944-0x0614394C 0x0614394C-0x06143954 1108 | public int UnlockPremiseMstIdolStoryId { get; private set; } // 0x06143954-0x0614395C 0x0614395C-0x06143964 1109 | public int UnlockPremiseIdolBaseDearness { get; private set; } // 0x06143964-0x0614396C 0x0614396C-0x06143974 1110 | public string[] RewardProductList { get; private set; } // 0x06143974-0x0614397C 0x0614397C-0x06143984 1111 | public System.DateTime ReleaseDate { get; private set; } // 0x06143984-0x0614398C 0x0614398C-0x06143994 1112 | public int PreviousMstIdolStoryId { get; private set; } // 0x06143994-0x0614399C 0x0614399C-0x061439A4 1113 | [MemoryPackIgnore] 1114 | public string ThumbnailPath { get => default; } // 0x061439A4-0x06143A2C 1115 | } 1116 | 1117 | [MemoryPackable()] 1118 | public partial class MstItemProvider // TypeDefIndex: 24576 1119 | { 1120 | // Properties 1121 | public int Id { get; private set; } // 0x06144560-0x06144568 0x06144568-0x06144570 1122 | public string ProductId { get; private set; } // 0x06144570-0x06144578 0x06144578-0x06144580 1123 | public int ProviderType { get; private set; } // 0x06144580-0x06144588 0x06144588-0x06144590 1124 | public string ProviderParameter { get; private set; } // 0x06144590-0x06144598 0x06144598-0x061445A0 1125 | [MemoryPackIgnore] 1126 | public LocalizationKey ScreenTitle { get => default; } // 0x061445A0-0x06144604 1127 | [MemoryPackIgnore] 1128 | public LocalizationKey ScreenTab { get => default; } // 0x06144604-0x06144668 1129 | public System.DateTime BeginDate { get; private set; } // 0x06144668-0x06144670 0x06144670-0x06144678 1130 | public System.DateTime EndDate { get; private set; } // 0x06144678-0x06144680 0x06144680-0x06144688 1131 | } 1132 | 1133 | [MemoryPackable()] 1134 | public partial class MstLiveSkillEffect // TypeDefIndex: 24578 1135 | { 1136 | // Properties 1137 | [PrimaryKey] 1138 | public int Id { get; private set; } // 0x06145124-0x0614512C 0x0614512C-0x06145134 1139 | public int LiveSkillType { get; private set; } // 0x06145134-0x0614513C 0x0614513C-0x06145144 1140 | public int EffectValue { get; private set; } // 0x06145144-0x0614514C 0x0614514C-0x06145154 1141 | public int EffectValue2 { get; private set; } // 0x06145154-0x0614515C 0x0614515C-0x06145164 1142 | public int EffectValue3 { get; private set; } // 0x06145164-0x0614516C 0x0614516C-0x06145174 1143 | public int EffectValue4 { get; private set; } // 0x06145174-0x0614517C 0x0614517C-0x06145184 1144 | public int EffectTime { get; private set; } // 0x06145184-0x0614518C 0x0614518C-0x06145194 1145 | } 1146 | 1147 | [MemoryPackable()] 1148 | public partial class MstLoginBonus // TypeDefIndex: 24580 1149 | { 1150 | // Properties 1151 | [PrimaryKey] 1152 | public int Id { get; private set; } // 0x06145870-0x06145878 0x06145878-0x06145880 1153 | public string Title { get; private set; } // 0x06145880-0x06145888 0x06145888-0x06145890 1154 | public int LoginBonusType { get; private set; } // 0x06145890-0x06145898 0x06145898-0x061458A0 1155 | public int DisplayPriority { get; private set; } // 0x061458A0-0x061458A8 0x061458A8-0x061458B0 1156 | [MemoryPackIgnore] 1157 | public string TitleImagePath { get => default; } // 0x061458B0-0x06145938 1158 | [MemoryPackIgnore] 1159 | public string BgImagePath { get => default; } // 0x06145938-0x061459C0 1160 | } 1161 | 1162 | [MemoryPackable()] 1163 | public partial class MstLoginBonusGraffiti // TypeDefIndex: 24582 1164 | { 1165 | // Properties 1166 | [PrimaryKey] 1167 | public int Id { get; private set; } // 0x06146144-0x0614614C 0x0614614C-0x06146154 1168 | public int MstLoginBonusId { get; private set; } // 0x06146154-0x0614615C 0x0614615C-0x06146164 1169 | public string[] ResourceIdList { get; private set; } // 0x06146164-0x0614616C 0x0614616C-0x06146174 1170 | } 1171 | 1172 | [MemoryPackable()] 1173 | public partial class MstMainStory // TypeDefIndex: 24584 1174 | { 1175 | // Properties 1176 | [PrimaryKey] 1177 | public int Id { get; private set; } // 0x06146864-0x0614686C 0x0614686C-0x06146874 1178 | [MemoryPackIgnore] 1179 | public LocalizationKey Title { get => default; } // 0x06146874-0x061468D8 1180 | [MemoryPackIgnore] 1181 | public LocalizationKey Episode { get => default; } // 0x061468D8-0x0614693C 1182 | public int MstMainStoryChapterId { get; private set; } // 0x0614693C-0x06146944 0x06146944-0x0614694C 1183 | public int SortId { get; private set; } // 0x0614694C-0x06146954 0x06146954-0x0614695C 1184 | public int[] MstCharacterInfoIdList { get; private set; } // 0x0614695C-0x06146964 0x06146964-0x0614696C 1185 | public int UnlockPremiseMstMainStoryId { get; private set; } // 0x0614696C-0x06146974 0x06146974-0x0614697C 1186 | public string[] RewardProductList { get; private set; } // 0x0614697C-0x06146984 0x06146984-0x0614698C 1187 | public System.DateTime ReleaseDate { get; private set; } // 0x0614698C-0x06146994 0x06146994-0x0614699C 1188 | public int PreviousMstMainStoryId { get; private set; } // 0x0614699C-0x061469A4 0x061469A4-0x061469AC 1189 | [MemoryPackIgnore] 1190 | public string ThumbnailPath { get => default; } // 0x061469AC-0x06146A34 1191 | } 1192 | 1193 | [MemoryPackable()] 1194 | public partial class MstMainStoryChapter // TypeDefIndex: 24586 1195 | { 1196 | // Properties 1197 | [PrimaryKey] 1198 | public int Id { get; private set; } // 0x0614751C-0x06147524 0x06147524-0x0614752C 1199 | [MemoryPackIgnore] 1200 | public LocalizationKey Title { get => default; } // 0x0614752C-0x06147590 1201 | public int MstUnitId { get; private set; } // 0x06147590-0x06147598 0x06147598-0x061475A0 1202 | public System.DateTime ReleaseDate { get; private set; } // 0x061475A0-0x061475A8 0x061475A8-0x061475B0 1203 | [MemoryPackIgnore] 1204 | public string ThumbnailPath { get => default; } // 0x061475B0-0x06147638 1205 | [MemoryPackIgnore] 1206 | public string MainStoryBackgroundPath { get => default; } // 0x06147638-0x061476C0 1207 | } 1208 | 1209 | [MemoryPackable()] 1210 | public partial class MstOutgameVoiceMotion // TypeDefIndex: 24588 1211 | { 1212 | // Properties 1213 | [PrimaryKey] 1214 | public int Id { get; private set; } // 0x06147C84-0x06147C8C 0x06147C8C-0x06147C94 1215 | public int MstCharacterInfoId { get; private set; } // 0x06147C94-0x06147C9C 0x06147C9C-0x06147CA4 1216 | public int ScreenType { get; private set; } // 0x06147CA4-0x06147CAC 0x06147CAC-0x06147CB4 1217 | public int MstProduceIdolId { get; private set; } // 0x06147CB4-0x06147CBC 0x06147CBC-0x06147CC4 1218 | public int MstSupportCharacterId { get; private set; } // 0x06147CC4-0x06147CCC 0x06147CCC-0x06147CD4 1219 | public bool ReachedGrowthLimit { get; private set; } // 0x06147CD4-0x06147CDC 0x06147CDC-0x06147CE8 1220 | public int MstVoiceResourceId { get; private set; } // 0x06147CE8-0x06147CF0 0x06147CF0-0x06147CF8 1221 | public System.DateTime ReleaseDate { get; private set; } // 0x06147CF8-0x06147D00 0x06147D00-0x06147D08 1222 | [MemoryPackIgnore] 1223 | public MstVoiceResource Voice { get; private set; } // 0x06147D08-0x06147D10 0x06147D10-0x06147D18 1224 | 1225 | } 1226 | 1227 | [MemoryPackable()] 1228 | public partial class MstPhoneCall // TypeDefIndex: 24590 1229 | { 1230 | // Properties 1231 | [PrimaryKey] 1232 | public int Id { get; private set; } // 0x06148510-0x06148518 0x06148518-0x06148520 1233 | public int MstPhoneUserId { get; private set; } // 0x06148520-0x06148528 0x06148528-0x06148530 1234 | [MemoryPackIgnore] 1235 | public LocalizationKey Title { get => default; } // 0x06148530-0x06148594 1236 | public int TypeId { get; private set; } // 0x06148594-0x0614859C 0x0614859C-0x061485A4 1237 | public int ScenarioId { get; private set; } // 0x061485A4-0x061485AC 0x061485AC-0x061485B4 1238 | public int ScenarioNumber { get; private set; } // 0x061485B4-0x061485BC 0x061485BC-0x061485C4 1239 | [MemoryPackIgnore] 1240 | public string CueSheetName { get => default; } // 0x061485C4-0x0614866C 1241 | } 1242 | 1243 | [MemoryPackable()] 1244 | public partial class MstPhoneUser // TypeDefIndex: 24592 1245 | { 1246 | // Properties 1247 | [PrimaryKey] 1248 | public int Id { get; private set; } // 0x06148CA4-0x06148CAC 0x06148CAC-0x06148CB4 1249 | [MemoryPackIgnore] 1250 | public LocalizationKey Name { get => default; } // 0x06148CB4-0x06148D18 1251 | public int MstCharacterInfoId { get; private set; } // 0x06148D18-0x06148D20 0x06148D20-0x06148D28 1252 | } 1253 | 1254 | public static class MstPhoneUserExtensions // TypeDefIndex: 24654 1255 | { 1256 | // Extension methods 1257 | public static bool IsProducer(this MstPhoneUser mstPhoneUser) => default; // 0x0615A9D8-0x0615A9F8 1258 | } 1259 | 1260 | [MemoryPackable()] 1261 | public partial class MstPotentialLiveSkill // TypeDefIndex: 24594 1262 | { 1263 | // Properties 1264 | public int Id { get; private set; } // 0x06149270-0x06149278 0x06149278-0x06149280 1265 | [MemoryPackIgnore] 1266 | public LocalizationKey Title { get => default; } // 0x06149280-0x061492E4 1267 | } 1268 | 1269 | [MemoryPackable()] 1270 | public partial class MstPotentialLiveSkillLevel // TypeDefIndex: 24596 1271 | { 1272 | // Properties 1273 | [PrimaryKey] 1274 | public int Id { get; private set; } // 0x061497AC-0x061497B4 0x061497B4-0x061497BC 1275 | public int MstPotentialLiveSkillId { get; private set; } // 0x061497BC-0x061497C4 0x061497C4-0x061497CC 1276 | public int Level { get; private set; } // 0x061497CC-0x061497D4 0x061497D4-0x061497DC 1277 | [MemoryPackIgnore] 1278 | public LocalizationKey Description { get => default; } // 0x061497DC-0x06149840 1279 | public int[] MstLiveSkillEffectIdList { get; private set; } // 0x06149840-0x06149848 0x06149848-0x06149850 1280 | } 1281 | 1282 | [MemoryPackable()] 1283 | public partial class MstPotentialSupportSkill // TypeDefIndex: 24598 1284 | { 1285 | // Properties 1286 | [PrimaryKey] 1287 | public int Id { get; private set; } // 0x06149FD8-0x06149FE0 0x06149FE0-0x06149FE8 1288 | [MemoryPackIgnore] 1289 | public LocalizationKey Name { get => default; } // 0x06149FE8-0x0614A04C 1290 | [MemoryPackIgnore] 1291 | public LocalizationKey Description { get => default; } // 0x0614A04C-0x0614A0B0 1292 | public int MstSupportSkillTypeId { get; private set; } // 0x0614A0B0-0x0614A0B8 0x0614A0B8-0x0614A0C0 1293 | public int[] ValueList { get; private set; } // 0x0614A0C0-0x0614A0C8 0x0614A0C8-0x0614A0D0 1294 | public int MstSkillBufferDisplayId { get; private set; } // 0x0614A0D0-0x0614A0D8 0x0614A0D8-0x0614A0E0 1295 | public int EntrustAppealType { get; private set; } // 0x0614A0E0-0x0614A0E8 0x0614A0E8-0x0614A0F0 1296 | public int EntrustScore { get; private set; } // 0x0614A0F0-0x0614A0F8 0x0614A0F8-0x0614A100 1297 | [MemoryPackIgnore] 1298 | public string SupportSkillIconImagePath { get => default; } // 0x0614A100-0x0614A188 1299 | } 1300 | 1301 | [MemoryPackable()] 1302 | public partial class MstProduceActionEffect // TypeDefIndex: 24600 1303 | { 1304 | // Properties 1305 | public int IconId { get; private set; } // 0x0614AA10-0x0614AA18 0x0614AA18-0x0614AA20 1306 | [MemoryPackIgnore] 1307 | public string IconImagePath { get => default; } // 0x0614AA20-0x0614AAA8 1308 | } 1309 | 1310 | [MemoryPackable()] 1311 | public partial class MstProduceActionEffectDisplay // TypeDefIndex: 24602 1312 | { 1313 | // Properties 1314 | public int Id { get; private set; } // 0x0614AF70-0x0614AF78 0x0614AF78-0x0614AF80 1315 | } 1316 | 1317 | [MemoryPackable()] 1318 | public partial class MstProduceCardContentGroup // TypeDefIndex: 24604 1319 | { 1320 | // Properties 1321 | public int MstProduceCardId { get; private set; } // 0x0614B448-0x0614B450 0x0614B450-0x0614B458 1322 | public int MstProduceCardContentGroupTypeId { get; private set; } // 0x0614B458-0x0614B460 0x0614B460-0x0614B468 1323 | [MemoryPackIgnore] 1324 | public string CardImagePath { get => default; } // 0x0614B468-0x0614B4F0 1325 | [MemoryPackIgnore] 1326 | public string Phase1CardImagePath { get => default; } // 0x0614B4F0-0x0614B578 1327 | [MemoryPackIgnore] 1328 | public string Phase2CardImagePath { get => default; } // 0x0614B578-0x0614B600 1329 | } 1330 | 1331 | [MemoryPackable()] 1332 | public partial class MstProduceIdol // TypeDefIndex: 24606 1333 | { 1334 | // Properties 1335 | [PrimaryKey] 1336 | public int Id { get; private set; } // 0x0614BB48-0x0614BB50 0x0614BB50-0x0614BB58 1337 | public int MstIdolId { get; private set; } // 0x0614BB58-0x0614BB60 0x0614BB60-0x0614BB68 1338 | [MemoryPackIgnore] 1339 | public LocalizationKey Name { get => default; } // 0x0614BB68-0x0614BBCC 1340 | public int InitialStar { get; private set; } // 0x0614BBCC-0x0614BBD4 0x0614BBD4-0x0614BBDC 1341 | public int CardId { get; private set; } // 0x0614BBDC-0x0614BBE4 0x0614BBE4-0x0614BBEC 1342 | public int InitialVocal { get; private set; } // 0x0614BBEC-0x0614BBF4 0x0614BBF4-0x0614BBFC 1343 | public int InitialDance { get; private set; } // 0x0614BBFC-0x0614BC04 0x0614BC04-0x0614BC0C 1344 | public int InitialVisual { get; private set; } // 0x0614BC0C-0x0614BC14 0x0614BC14-0x0614BC1C 1345 | public int InitialMental { get; private set; } // 0x0614BC1C-0x0614BC24 0x0614BC24-0x0614BC2C 1346 | public int LimitVocal { get; private set; } // 0x0614BC2C-0x0614BC34 0x0614BC34-0x0614BC3C 1347 | public int LimitDance { get; private set; } // 0x0614BC3C-0x0614BC44 0x0614BC44-0x0614BC4C 1348 | public int LimitVisual { get; private set; } // 0x0614BC4C-0x0614BC54 0x0614BC54-0x0614BC5C 1349 | public int LimitMental { get; private set; } // 0x0614BC5C-0x0614BC64 0x0614BC64-0x0614BC6C 1350 | public int MstStarGrowthId { get; private set; } // 0x0614BC6C-0x0614BC74 0x0614BC74-0x0614BC7C 1351 | public int Cost { get; private set; } // 0x0614BC7C-0x0614BC84 0x0614BC84-0x0614BC8C 1352 | public int[] MstIdolSkillIdList { get; private set; } // 0x0614BC8C-0x0614BC94 0x0614BC94-0x0614BC9C 1353 | public int[] IdolSkillPremiseEvolutionLevelList { get; private set; } // 0x0614BC9C-0x0614BCA4 0x0614BCA4-0x0614BCAC 1354 | public int[] MstPotentialLiveSkillIdList { get; private set; } // 0x0614BCAC-0x0614BCB4 0x0614BCB4-0x0614BCBC 1355 | public int[] PotentialLiveSkillPremiseStarList { get; private set; } // 0x0614BCBC-0x0614BCC4 0x0614BCC4-0x0614BCCC 1356 | public int[] CostumeSetIdList { get; private set; } // 0x0614BCCC-0x0614BCD4 0x0614BCD4-0x0614BCDC 1357 | public int[] CostumeSetPremiseStarList { get; private set; } // 0x0614BCDC-0x0614BCE4 0x0614BCE4-0x0614BCEC 1358 | public System.DateTime ReleaseDate { get; private set; } // 0x0614BCEC-0x0614BCF4 0x0614BCF4-0x0614BCFC 1359 | public string LimitBreakRecipeProductId { get; private set; } // 0x0614BCFC-0x0614BD04 0x0614BD04-0x0614BD0C 1360 | public int EvolutionRecipeGroupId { get; private set; } // 0x0614BD0C-0x0614BD14 0x0614BD14-0x0614BD1C 1361 | public string[] MstIdolSkillForMstProduceIdolList { get; private set; } // 0x0614BD1C-0x0614BD24 0x0614BD24-0x0614BD2C 1362 | public string[] MstPotentialLiveSkillForMstProduceIdolList { get; private set; } // 0x0614BD2C-0x0614BD34 0x0614BD34-0x0614BD3C 1363 | public string[] MstDressSetForMstProduceIdolList { get; private set; } // 0x0614BD3C-0x0614BD44 0x0614BD44-0x0614BD4C 1364 | public int GashaVoiceMstVoiceResourceId { get; private set; } // 0x0614BD4C-0x0614BD54 0x0614BD54-0x0614BD5C 1365 | public int GashaSeMstVoiceResourceId { get; private set; } // 0x0614BD5C-0x0614BD64 0x0614BD64-0x0614BD6C 1366 | [MemoryPackIgnore] 1367 | public string AlignedFacePrefabPath { get => default; } // 0x0614BD6C-0x0614BDF4 1368 | [MemoryPackIgnore] 1369 | public string StandingImagePath { get => default; } // 0x0614BDF4-0x0614BE7C 1370 | [MemoryPackIgnore] 1371 | public string IconRectImagePath { get => default; } // 0x0614BE7C-0x0614BF04 1372 | [MemoryPackIgnore] 1373 | public string IconSqImagePath { get => default; } // 0x0614BF04-0x0614BF8C 1374 | [MemoryPackIgnore] 1375 | public string SkillCutInImagePath { get => default; } // 0x0614BF8C-0x0614C014 1376 | [MemoryPackIgnore] 1377 | public MstCharacterInfo CharacterInfo { get; private set; } // 0x0614C014-0x0614C01C 0x0614C01C-0x0614C024 1378 | 1379 | } 1380 | 1381 | [MemoryPackable()] 1382 | public partial class MstProduceIdolEvolutionRecipe // TypeDefIndex: 24608 1383 | { 1384 | // Properties 1385 | [PrimaryKey] 1386 | public int Id { get; private set; } // 0x0614D6AC-0x0614D6B4 0x0614D6B4-0x0614D6BC 1387 | public int GroupId { get; private set; } // 0x0614D6BC-0x0614D6C4 0x0614D6C4-0x0614D6CC 1388 | public int EvolutionLevel { get; private set; } // 0x0614D6CC-0x0614D6D4 0x0614D6D4-0x0614D6DC 1389 | public string[] ProductIdWithAmountList { get; private set; } // 0x0614D6DC-0x0614D6E4 0x0614D6E4-0x0614D6EC 1390 | public int Money { get; private set; } // 0x0614D6EC-0x0614D6F4 0x0614D6F4-0x0614D6FC 1391 | } 1392 | 1393 | [MemoryPackable()] 1394 | public partial class MstProduceIdolLimitBreakRecipe // TypeDefIndex: 24610 1395 | { 1396 | // Properties 1397 | [PrimaryKey] 1398 | public int Id { get; private set; } // 0x0614DED8-0x0614DEE0 0x0614DEE0-0x0614DEE8 1399 | public int Star { get; private set; } // 0x0614DEE8-0x0614DEF0 0x0614DEF0-0x0614DEF8 1400 | public int Amount { get; private set; } // 0x0614DEF8-0x0614DF00 0x0614DF00-0x0614DF08 1401 | } 1402 | 1403 | [MemoryPackable()] 1404 | public partial class MstProducePassiveEffect // TypeDefIndex: 24612 1405 | { 1406 | // Properties 1407 | [PrimaryKey] 1408 | public int Id { get; private set; } // 0x0614E4A0-0x0614E4A8 0x0614E4A8-0x0614E4B0 1409 | public int MstProducePassiveEffectTypeId { get; private set; } // 0x0614E4B0-0x0614E4B8 0x0614E4B8-0x0614E4C0 1410 | public int[] ValueList { get; private set; } // 0x0614E4C0-0x0614E4C8 0x0614E4C8-0x0614E4D0 1411 | } 1412 | 1413 | [MemoryPackable()] 1414 | public partial class MstProduceStrategyType // TypeDefIndex: 24614 1415 | { 1416 | // Properties 1417 | public int Id { get; private set; } // 0x0614EC00-0x0614EC08 0x0614EC08-0x0614EC10 1418 | [MemoryPackIgnore] 1419 | public string PolicySelectIconPath { get => default; } // 0x0614EC10-0x0614EC68 1420 | 1421 | } 1422 | 1423 | [MemoryPackable()] 1424 | public partial class MstProductType // TypeDefIndex: 24616 1425 | { 1426 | // Properties 1427 | [PrimaryKey] 1428 | public int Id { get; private set; } // 0x0614F1B4-0x0614F1BC 0x0614F1BC-0x0614F1C4 1429 | public bool UseCategoricalIcon { get; private set; } // 0x0614F1C4-0x0614F1CC 0x0614F1CC-0x0614F1D8 1430 | public bool VisibleItem { get; private set; } // 0x0614F1D8-0x0614F1E0 0x0614F1E0-0x0614F1EC 1431 | } 1432 | 1433 | [MemoryPackable()] 1434 | public partial class MstRecoveryDrink // TypeDefIndex: 24618 1435 | { 1436 | // Properties 1437 | [PrimaryKey] 1438 | public int Id { get; private set; } // 0x0614F7C4-0x0614F7CC 0x0614F7CC-0x0614F7D4 1439 | public int StaminaType { get; private set; } // 0x0614F7D4-0x0614F7DC 0x0614F7DC-0x0614F7E4 1440 | public int Value { get; private set; } // 0x0614F7E4-0x0614F7EC 0x0614F7EC-0x0614F7F4 1441 | } 1442 | 1443 | [MemoryPackable()] 1444 | public partial class MstSeasonMission // TypeDefIndex: 24620 1445 | { 1446 | // Properties 1447 | [PrimaryKey] 1448 | public int Id { get; private set; } // 0x0614FD8C-0x0614FD94 0x0614FD94-0x0614FD9C 1449 | [MemoryPackIgnore] 1450 | public LocalizationKey Name { get => default; } // 0x0614FD9C-0x0614FE00 1451 | [MemoryPackIgnore] 1452 | public string LogoPath { get => default; } // 0x0614FE00-0x0614FE88 1453 | } 1454 | 1455 | [MemoryPackable()] 1456 | public partial class MstSelectionTicket // TypeDefIndex: 24622 1457 | { 1458 | // Properties 1459 | [PrimaryKey] 1460 | public int Id { get; private set; } // 0x06150350-0x06150358 0x06150358-0x06150360 1461 | } 1462 | 1463 | [MemoryPackable()] 1464 | public partial class MstSelectionTicketProduct // TypeDefIndex: 24624 1465 | { 1466 | // Properties 1467 | public int Id { get; private set; } // 0x06150828-0x06150830 0x06150830-0x06150838 1468 | public int MstExchangeGroupId { get; private set; } // 0x06150838-0x06150840 0x06150840-0x06150848 1469 | public int SortId { get; private set; } // 0x06150848-0x06150850 0x06150850-0x06150858 1470 | } 1471 | 1472 | [MemoryPackable()] 1473 | public partial class MstSong // TypeDefIndex: 24626 1474 | { 1475 | // Properties 1476 | [PrimaryKey] 1477 | public int Id { get; private set; } // 0x06150DF0-0x06150DF8 0x06150DF8-0x06150E00 1478 | [MemoryPackIgnore] 1479 | public LocalizationKey Name { get => default; } // 0x06150E00-0x06150E64 1480 | [MemoryPackIgnore] 1481 | public LocalizationKey Description { get => default; } // 0x06150E64-0x06150EC8 1482 | [MemoryPackIgnore] 1483 | public LocalizationKey ReadName { get => default; } // 0x06150EC8-0x06150F2C 1484 | [MemoryPackIgnore] 1485 | public LocalizationKey Artist { get => default; } // 0x06150F2C-0x06150F90 1486 | [MemoryPackIgnore] 1487 | public LocalizationKey Lyricist { get => default; } // 0x06150F90-0x06150FF4 1488 | [MemoryPackIgnore] 1489 | public LocalizationKey Composer { get => default; } // 0x06150FF4-0x06151058 1490 | [MemoryPackIgnore] 1491 | public LocalizationKey Arranger { get => default; } // 0x06151058-0x061510BC 1492 | [MemoryPackIgnore] 1493 | public LocalizationKey CueSheet { get => default; } // 0x061510BC-0x06151120 1494 | [MemoryPackIgnore] 1495 | public LocalizationKey MvScene { get => default; } // 0x06151120-0x06151184 1496 | public int MstSongTypeId { get; private set; } // 0x06151184-0x0615118C 0x0615118C-0x06151194 1497 | public int MstUnitId { get; private set; } // 0x06151194-0x0615119C 0x0615119C-0x061511A4 1498 | public int MstSongPositionId { get; private set; } // 0x061511A4-0x061511AC 0x061511AC-0x061511B4 1499 | public int SortId { get; private set; } // 0x061511B4-0x061511BC 0x061511BC-0x061511C4 1500 | public int Bpm { get; private set; } // 0x061511C4-0x061511CC 0x061511CC-0x061511D4 1501 | public bool IsAdvanceDownload { get; private set; } // 0x061511D4-0x061511DC 0x061511DC-0x061511E8 1502 | public bool IsSongParts { get; private set; } // 0x061511E8-0x061511F0 0x061511F0-0x061511FC 1503 | public bool IsFocusCamera { get; private set; } // 0x061511FC-0x06151204 0x06151204-0x06151210 1504 | public bool Is3D { get; private set; } // 0x06151210-0x06151218 0x06151218-0x06151224 1505 | public bool Is2D { get; private set; } // 0x06151224-0x0615122C 0x0615122C-0x06151238 1506 | public string PurchaseLink { get; private set; } // 0x06151238-0x06151240 0x06151240-0x06151248 1507 | public System.DateTime PurchaseLinkActiveDate { get; private set; } // 0x06151248-0x06151250 0x06151250-0x06151258 1508 | public bool IsDefault { get; private set; } // 0x06151258-0x06151260 0x06151260-0x0615126C 1509 | public System.DateTime BeginDate { get; private set; } // 0x0615126C-0x06151274 0x06151274-0x0615127C 1510 | [MemoryPackIgnore] 1511 | public string JacketImagePath { get => default; } // 0x0615127C-0x06151304 1512 | [MemoryPackIgnore] 1513 | public string BackgroundImagePath { get => default; } // 0x06151304-0x0615138C 1514 | } 1515 | 1516 | [MemoryPackable()] 1517 | public partial class MstSupportCharacter // TypeDefIndex: 24628 1518 | { 1519 | // Properties 1520 | [PrimaryKey] 1521 | public int Id { get; private set; } // 0x06151F2C-0x06151F34 0x06151F34-0x06151F3C 1522 | public int MstCharacterId { get; private set; } // 0x06151F3C-0x06151F44 0x06151F44-0x06151F4C 1523 | [MemoryPackIgnore] 1524 | public LocalizationKey Name { get => default; } // 0x06151F4C-0x06151FB0 1525 | public int Rarity { get; private set; } // 0x06151FB0-0x06151FB8 0x06151FB8-0x06151FC0 1526 | public int CardId { get; private set; } // 0x06151FC0-0x06151FC8 0x06151FC8-0x06151FD0 1527 | public int GoodScheduleDetailType { get; private set; } // 0x06151FD0-0x06151FD8 0x06151FD8-0x06151FE0 1528 | public int[] MstPotentialSupportSkillIdList { get; private set; } // 0x06151FE0-0x06151FE8 0x06151FE8-0x06151FF0 1529 | public int[] MstSupportCharacterEventIdList { get; private set; } // 0x06151FF0-0x06151FF8 0x06151FF8-0x06152000 1530 | public int[] MstSupportEffectIdList { get; private set; } // 0x06152000-0x06152008 0x06152008-0x06152010 1531 | public int[] UnlockPremiseLevelList { get; private set; } // 0x06152010-0x06152018 0x06152018-0x06152020 1532 | public System.DateTime ReleaseDate { get; private set; } // 0x06152020-0x06152028 0x06152028-0x06152030 1533 | public string LimitBreakRecipeProductId { get; private set; } // 0x06152030-0x06152038 0x06152038-0x06152040 1534 | [MemoryPackIgnore] 1535 | public string ADVStillImagePath { get => default; } // 0x06152040-0x061520C8 1536 | [MemoryPackIgnore] 1537 | public string IconRectImagePath { get => default; } // 0x061520C8-0x06152150 1538 | [MemoryPackIgnore] 1539 | public string IconSqImagePath { get => default; } // 0x06152150-0x061521D8 1540 | [MemoryPackIgnore] 1541 | public MstCharacterInfo CharacterInfo { get; private set; } // 0x061521D8-0x061521E0 0x061521E0-0x061521E8 1542 | 1543 | } 1544 | 1545 | [MemoryPackable()] 1546 | public partial class MstSupportCharacterLevelExp // TypeDefIndex: 24630 1547 | { 1548 | // Properties 1549 | [PrimaryKey] 1550 | public int Id { get; private set; } // 0x06152F58-0x06152F60 0x06152F60-0x06152F68 1551 | public int Rarity { get; private set; } // 0x06152F68-0x06152F70 0x06152F70-0x06152F78 1552 | public int Level { get; private set; } // 0x06152F78-0x06152F80 0x06152F80-0x06152F88 1553 | public int Exp { get; private set; } // 0x06152F88-0x06152F90 0x06152F90-0x06152F98 1554 | } 1555 | 1556 | [MemoryPackable()] 1557 | public partial class MstSupportCharacterLimitBreakBonus // TypeDefIndex: 24632 1558 | { 1559 | // Properties 1560 | public int Rarity { get; private set; } // 0x06153584-0x0615358C 0x0615358C-0x06153594 1561 | public int Diamond { get; private set; } // 0x06153594-0x0615359C 0x0615359C-0x061535A4 1562 | public int SkillSlot { get; private set; } // 0x061535A4-0x061535AC 0x061535AC-0x061535B4 1563 | public int LimitLv { get; private set; } // 0x061535B4-0x061535BC 0x061535BC-0x061535C4 1564 | } 1565 | 1566 | [MemoryPackable()] 1567 | public partial class MstSupportCharacterLimitBreakRecipe // TypeDefIndex: 24634 1568 | { 1569 | // Properties 1570 | [PrimaryKey] 1571 | public int Id { get; private set; } // 0x06153BB0-0x06153BB8 0x06153BB8-0x06153BC0 1572 | public int Rarity { get; private set; } // 0x06153BC0-0x06153BC8 0x06153BC8-0x06153BD0 1573 | public int Diamond { get; private set; } // 0x06153BD0-0x06153BD8 0x06153BD8-0x06153BE0 1574 | public int Amount { get; private set; } // 0x06153BE0-0x06153BE8 0x06153BE8-0x06153BF0 1575 | } 1576 | 1577 | [MemoryPackable()] 1578 | public partial class MstSupportEffect // TypeDefIndex: 24636 1579 | { 1580 | // Properties 1581 | [PrimaryKey] 1582 | public int Id { get; private set; } // 0x06156010-0x06156018 0x06156018-0x06156020 1583 | public int EffectId { get; private set; } // 0x06156020-0x06156028 0x06156028-0x06156030 1584 | [MemoryPackIgnore] 1585 | public LocalizationKey Name { get => default; } // 0x06156030-0x06156094 1586 | [MemoryPackIgnore] 1587 | public LocalizationKey Description { get => default; } // 0x06156094-0x061560F8 1588 | public int[] MstProducePassiveEffectIdList { get; private set; } // 0x061560F8-0x06156100 0x06156100-0x06156108 1589 | public int EntrustAppealType { get; private set; } // 0x06156108-0x06156110 0x06156110-0x06156118 1590 | public int EntrustScore { get; private set; } // 0x06156118-0x06156120 0x06156120-0x06156128 1591 | public int ChoiceWeight { get; private set; } // 0x06156128-0x06156130 0x06156130-0x06156138 1592 | } 1593 | 1594 | [MemoryPackable()] 1595 | public partial class MstTips // TypeDefIndex: 24638 1596 | { 1597 | // Properties 1598 | public int Id { get; private set; } // 0x061569C0-0x061569C8 0x061569C8-0x061569D0 1599 | public int MstTipsCategoryId { get; private set; } // 0x061569D0-0x061569D8 0x061569D8-0x061569E0 1600 | [MemoryPackIgnore] 1601 | public LocalizationKey Title { get => default; } // 0x061569E0-0x06156A44 1602 | [MemoryPackIgnore] 1603 | public LocalizationKey Description { get => default; } // 0x06156A44-0x06156AA8 1604 | public int Weight { get; private set; } // 0x06156AA8-0x06156AB0 0x06156AB0-0x06156AB8 1605 | } 1606 | 1607 | [MemoryPackable()] 1608 | public partial class MstTipsCategory // TypeDefIndex: 24640 1609 | { 1610 | // Properties 1611 | [PrimaryKey] 1612 | public int Id { get; private set; } // 0x06157050-0x06157058 0x06157058-0x06157060 1613 | [MemoryPackIgnore] 1614 | public LocalizationKey Title { get => default; } // 0x06157060-0x061570C4 1615 | public string Color { get; private set; } // 0x061570C4-0x061570CC 0x061570CC-0x061570D4 1616 | } 1617 | 1618 | [MemoryPackable()] 1619 | public partial class MstTitleImage // TypeDefIndex: 24642 1620 | { 1621 | // Properties 1622 | public int Id { get; private set; } // 0x06157774-0x0615777C 0x0615777C-0x06157784 1623 | public string ImageKey { get; private set; } // 0x06157784-0x0615778C 0x0615778C-0x06157794 1624 | public System.DateTime BeginDate { get; private set; } // 0x06157794-0x0615779C 0x0615779C-0x061577A4 1625 | public System.DateTime EndDate { get; private set; } // 0x061577A4-0x061577AC 0x061577AC-0x061577B4 1626 | } 1627 | 1628 | [MemoryPackable()] 1629 | public partial class MstTrainingTicket // TypeDefIndex: 24644 1630 | { 1631 | // Properties 1632 | [PrimaryKey] 1633 | public int Id { get; private set; } // 0x0615803C-0x06158044 0x06158044-0x0615804C 1634 | public int ProductType { get; private set; } // 0x0615804C-0x06158054 0x06158054-0x0615805C 1635 | [MemoryPackIgnore] 1636 | public LocalizationKey Name { get => default; } // 0x0615805C-0x061580C0 1637 | [MemoryPackIgnore] 1638 | public LocalizationKey Description { get => default; } // 0x061580C0-0x06158124 1639 | public int Exp { get; private set; } // 0x06158124-0x0615812C 0x0615812C-0x06158134 1640 | public int PresentFilterType { get; private set; } // 0x06158134-0x0615813C 0x0615813C-0x06158144 1641 | public int ItemNaviType { get; private set; } // 0x06158144-0x0615814C 0x0615814C-0x06158154 1642 | public int SortId { get; private set; } // 0x06158154-0x0615815C 0x0615815C-0x06158164 1643 | public System.DateTime ReleaseDate { get; private set; } // 0x06158164-0x0615816C 0x0615816C-0x06158174 1644 | } 1645 | 1646 | [MemoryPackable()] 1647 | public partial class MstTwestaArticle // TypeDefIndex: 24646 1648 | { 1649 | // Properties 1650 | [PrimaryKey] 1651 | public int Id { get; private set; } // 0x06158880-0x06158888 0x06158888-0x06158890 1652 | [MemoryPackIgnore] 1653 | public LocalizationKey Name { get => default; } // 0x06158890-0x061588F4 1654 | public int MstTwestaUserId { get; private set; } // 0x061588F4-0x061588FC 0x061588FC-0x06158904 1655 | [MemoryPackIgnore] 1656 | public LocalizationKey Body { get => default; } // 0x06158904-0x06158968 1657 | public int Thumbnail { get; private set; } // 0x06158968-0x06158970 0x06158970-0x06158978 1658 | public bool IsDefault { get; private set; } // 0x06158978-0x06158980 0x06158980-0x0615898C 1659 | [MemoryPackIgnore] 1660 | public string TwestaThumbnailPath { get => default; } // 0x0615898C-0x06158A14 1661 | } 1662 | 1663 | [MemoryPackable()] 1664 | public partial class MstTwestaUser // TypeDefIndex: 24648 1665 | { 1666 | // Properties 1667 | [PrimaryKey] 1668 | public int Id { get; private set; } // 0x06159030-0x06159038 0x06159038-0x06159040 1669 | [MemoryPackIgnore] 1670 | public LocalizationKey Name { get => default; } // 0x06159040-0x061590A4 1671 | [MemoryPackIgnore] 1672 | public LocalizationKey Profile { get => default; } // 0x061590A4-0x06159108 1673 | public int MstCharacterInfoId { get; private set; } // 0x06159108-0x06159110 0x06159110-0x06159118 1674 | } 1675 | 1676 | [MemoryPackable()] 1677 | public partial class MstUnit // TypeDefIndex: 24650 1678 | { 1679 | // Properties 1680 | [PrimaryKey] 1681 | public int Id { get; private set; } // 0x06159660-0x06159668 0x06159668-0x06159670 1682 | [MemoryPackIgnore] 1683 | public LocalizationKey Name { get => default; } // 0x06159670-0x061596D4 1684 | public string ColorCode { get; private set; } // 0x061596D4-0x061596DC 0x061596DC-0x061596E4 1685 | [MemoryPackIgnore] 1686 | public string SymbolImagePath { get => default; } // 0x061596E4-0x0615976C 1687 | [MemoryPackIgnore] 1688 | public string LogoLargeImagePath { get => default; } // 0x0615976C-0x061597F4 1689 | [MemoryPackIgnore] 1690 | public string IconImagePath { get => default; } // 0x061597F4-0x0615987C 1691 | [MemoryPackIgnore] 1692 | public string IconWithOutlineImagePath { get => default; } // 0x0615987C-0x06159904 1693 | [MemoryPackIgnore] 1694 | public string IconSmallImagePath { get => default; } // 0x06159904-0x0615995C 1695 | [MemoryPackIgnore] 1696 | public string IconExtraLargeImagePath { get => default; } // 0x061599E0-0x06159A68 1697 | 1698 | } 1699 | 1700 | [MemoryPackable()] 1701 | public partial class MstVoiceResource // TypeDefIndex: 24652 1702 | { 1703 | // Properties 1704 | [PrimaryKey] 1705 | public int Id { get; private set; } // 0x0615A108-0x0615A110 0x0615A110-0x0615A118 1706 | [MemoryPackIgnore] 1707 | public LocalizationKey Text { get => default; } // 0x0615A118-0x0615A17C 1708 | public string CueSheetName { get; private set; } // 0x0615A17C-0x0615A184 0x0615A184-0x0615A18C 1709 | public string CueName { get; private set; } // 0x0615A18C-0x0615A194 0x0615A194-0x0615A19C 1710 | } 1711 | 1712 | public enum PIdolDetailType // TypeDefIndex: 24446 1713 | { 1714 | Default = 0, 1715 | Other = 1, 1716 | InLive = 2, 1717 | InProduce = 3 1718 | } 1719 | 1720 | public enum PieceArchiveTabType // TypeDefIndex: 24452 1721 | { 1722 | PI = 0, 1723 | SC = 1 1724 | } 1725 | 1726 | public static class PopupConst // TypeDefIndex: 24458 1727 | { 1728 | // Fields 1729 | public const string TextKeyOK = "mlPublicText_CommonPopup_00000"; // Metadata: 0x00C3A74F 1730 | public const string TextKeyClose = "mlPublicText_CommonPopup_00001"; // Metadata: 0x00C3A76E 1731 | public const string TextKeyCancel = "mlPublicText_CommonPopup_00002"; // Metadata: 0x00C3A78D 1732 | public const string TextKeyNo = "mlPublicText_CommonPopup_00003"; // Metadata: 0x00C3A7AC 1733 | public const string TextKeyYes = "mlPublicText_CommonPopup_00004"; // Metadata: 0x00C3A7CB 1734 | } 1735 | 1736 | public static class PopupEnum // TypeDefIndex: 24462 1737 | { 1738 | // Nested types 1739 | public enum PopupSizeType // TypeDefIndex: 24459 1740 | { 1741 | Small = 0, 1742 | Middle = 1, 1743 | Large = 2, 1744 | ExtraLarge = 3, 1745 | Square = 4, 1746 | Tall = 5 1747 | } 1748 | 1749 | public enum PopupMarkType // TypeDefIndex: 24460 1750 | { 1751 | None = 0, 1752 | Alert = 1, 1753 | Clear = 2 1754 | } 1755 | 1756 | public enum PopupButtonType // TypeDefIndex: 24461 1757 | { 1758 | Normal = 0, 1759 | Positive = 1, 1760 | Warning = 2, 1761 | Function = 3, 1762 | Purchase = 4 1763 | } 1764 | } 1765 | 1766 | public static class PresentBoxConst // TypeDefIndex: 24655 1767 | { 1768 | // Fields 1769 | public const int OnceMaxItems = 100; // Metadata: 0x00C3A8BC 1770 | public const int HistoryMasItems = 500; // Metadata: 0x00C3A8BE 1771 | public const string ResourceTagName = "PresentBox"; // Metadata: 0x00C3A8C0 1772 | } 1773 | 1774 | [AttributeUsage(AttributeTargets.Property)] 1775 | public class PrimaryKeyAttribute : System.Attribute // TypeDefIndex: 24653 1776 | { 1777 | // Constructors 1778 | public PrimaryKeyAttribute() { } // 0x0615A9D0-0x0615A9D8 1779 | } 1780 | 1781 | public static class ProduceConst // TypeDefIndex: 24661 1782 | { 1783 | // Fields 1784 | public const int TutorialEpisodeId = 1000; // Metadata: 0x00C3A938 1785 | public const string RestScenarioIDSuffix = "010025_00"; // Metadata: 0x00C3A93A 1786 | public const string AdviceScenarioIDSuffix = "010026_00"; // Metadata: 0x00C3A944 1787 | } 1788 | 1789 | public class ProduceEnum // TypeDefIndex: 24663 1790 | { 1791 | // Nested types 1792 | public enum LogItemType // TypeDefIndex: 24662 1793 | { 1794 | None = 0, 1795 | ProducePolicy = 1, 1796 | MainScenario = 2, 1797 | MainIdleScenario = 3, 1798 | UnitCommunicationScenario = 4, 1799 | ProduceIdleScenario = 5, 1800 | SupportCharacterScenario = 6, 1801 | NormalLimitEventScenario = 7, 1802 | SubSeasonEventScenario = 8, 1803 | SubSeasonEventIdleScenario = 9, 1804 | RecommendScenario = 10, 1805 | SupportCooperationEvent = 13, 1806 | Lesson = 14, 1807 | SpecialLesson = 15, 1808 | Working = 16, 1809 | Training = 17, 1810 | Outing = 18, 1811 | Shopping = 19, 1812 | Rest = 20, 1813 | Advice = 21, 1814 | Audition = 22, 1815 | InheritanceSkill = 23, 1816 | VoiceScenarioRest = 24, 1817 | VoiceScenarioAdvice = 25, 1818 | AdvReward = 26, 1819 | MiniLive = 27, 1820 | TalkShow = 28 1821 | } 1822 | 1823 | // Constructors 1824 | public ProduceEnum() { } // 0x0615ACA0-0x0615ACA8 1825 | } 1826 | 1827 | public static class ProfileConst // TypeDefIndex: 24664 1828 | { 1829 | // Fields 1830 | public const string FesUnitRankResourceTagName = "ProfileFesUnitRank"; // Metadata: 0x00C3A969 1831 | } 1832 | 1833 | public enum SCharaDetailType // TypeDefIndex: 24447 1834 | { 1835 | Default = 0, 1836 | Other = 1, 1837 | InProduce = 2 1838 | } 1839 | 1840 | public static class SeasonMissionConst // TypeDefIndex: 24665 1841 | { 1842 | // Fields 1843 | public const int RankCountMax = 50; // Metadata: 0x00C3A97C 1844 | } 1845 | 1846 | public class SeasonMissionEnum // TypeDefIndex: 24668 1847 | { 1848 | // Nested types 1849 | public enum AchivedFilter // TypeDefIndex: 24666 1850 | { 1851 | NotAchieved = 0, 1852 | Achieved = 1 1853 | } 1854 | 1855 | public enum CategoryFilter // TypeDefIndex: 24667 1856 | { 1857 | Character = 0, 1858 | Live = 1, 1859 | Produce = 2, 1860 | Story = 3, 1861 | Other = 4 1862 | } 1863 | 1864 | // Constructors 1865 | public SeasonMissionEnum() { } // 0x0615ACA8-0x0615ACB0 1866 | } 1867 | 1868 | public enum SelectFavoriteMarkPopupType // TypeDefIndex: 24449 1869 | { 1870 | ProduceIdol = 0, 1871 | SupportChara = 1, 1872 | FesIdol = 2, 1873 | FesUnit = 3 1874 | } 1875 | 1876 | public static class ShopConst // TypeDefIndex: 24671 1877 | { 1878 | // Fields 1879 | public const int ChargeLimitUnder16 = 5000; // Metadata: 0x00C3A984 1880 | public const int ChargeLimitUnder18 = 20000; // Metadata: 0x00C3A986 1881 | public const int AgeLimit16 = 16; // Metadata: 0x00C3A98A 1882 | public const int AgeLimit18 = 18; // Metadata: 0x00C3A98B 1883 | public const int MaxPurchaseCount = 99; // Metadata: 0x00C3A98C 1884 | public const int ProductNameLengthPerLine = 16; // Metadata: 0x00C3A98E 1885 | public const int MaxBirthDayStringLength = 8; // Metadata: 0x00C3A98F 1886 | public const int LoginPassValidDays = 29; // Metadata: 0x00C3A990 1887 | public const int HistoryShowDays = 7; // Metadata: 0x00C3A991 1888 | public static readonly int[] ElapsedDaysArrayToPeriodEnd; // 0x00 1889 | 1890 | // Nested types 1891 | public enum GroupType // TypeDefIndex: 24669 1892 | { 1893 | None = 0, 1894 | Jewel = 1, 1895 | Item = 2, 1896 | SeasonPass = 3, 1897 | LoginPass = 4, 1898 | Costume = 5 1899 | } 1900 | 1901 | public enum CostumeCategoryType // TypeDefIndex: 24670 1902 | { 1903 | None = 0, 1904 | Private = 1, 1905 | Event = 2 1906 | } 1907 | 1908 | // Constructors 1909 | static ShopConst() { } // 0x0615ACB0-0x0615AD50 1910 | } 1911 | 1912 | public class SpecialMissionEnum // TypeDefIndex: 24673 1913 | { 1914 | // Nested types 1915 | public enum MissionMstId // TypeDefIndex: 24672 1916 | { 1917 | BeginnerMission = 1 1918 | } 1919 | 1920 | // Constructors 1921 | public SpecialMissionEnum() { } // 0x0615AD50-0x0615AD58 1922 | } 1923 | 1924 | public class ViewEnum // TypeDefIndex: 24464 1925 | { 1926 | // Nested types 1927 | public enum Type // TypeDefIndex: 24463 1928 | { 1929 | Invalid = 0, 1930 | Home = 1 1931 | } 1932 | 1933 | // Constructors 1934 | public ViewEnum() { } // 0x06123464-0x0612346C 1935 | } 1936 | 1937 | public enum VoiceCategory // TypeDefIndex: 24442 1938 | { 1939 | Idol = 0, 1940 | ProduceIdol = 1, 1941 | SupportCharacter = 2 1942 | } 1943 | 1944 | public enum VoicePlayTab // TypeDefIndex: 24444 1945 | { 1946 | Home = 0, 1947 | Produce = 1, 1948 | Live = 2, 1949 | Other = 3 1950 | } 1951 | 1952 | public static class WeightedRandomPicker // TypeDefIndex: 24677 1953 | { 1954 | // Methods 1955 | public static T Pick(T[] data, Func weightSelector) => default; 1956 | } 1957 | } 1958 | -------------------------------------------------------------------------------- /PrismCatalogDownloader/Program.cs: -------------------------------------------------------------------------------- 1 | using System.Diagnostics; 2 | using System.Security.Cryptography; 3 | using System.Text.Json; 4 | using System.Text.Json.Serialization; 5 | using LukeFZ.Shared; 6 | using MemoryPack; 7 | using PRISM.Definitions; 8 | 9 | namespace PrismCatalogDownloader; 10 | 11 | internal class ValueTupleDictionaryConverter : JsonConverter, MstHairstyleResource>> 12 | { 13 | public override Dictionary<(int, int), MstHairstyleResource> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) 14 | { 15 | var baseDict = 16 | JsonSerializer.Deserialize>(ref reader, options)!; 17 | 18 | var actualDict = new Dictionary, MstHairstyleResource>(); 19 | 20 | foreach (var (key, value) in baseDict) 21 | { 22 | var vals = key.Split("/"); 23 | actualDict[(int.Parse(vals[0]), int.Parse(vals[1]))] = value; 24 | } 25 | 26 | return actualDict; 27 | } 28 | 29 | public override void Write(Utf8JsonWriter writer, Dictionary<(int, int), MstHairstyleResource> value, JsonSerializerOptions options) 30 | { 31 | var dict = new Dictionary(value.Count); 32 | 33 | foreach (var (key, val) in value) 34 | { 35 | dict[$"{key.Item1}/{key.Item2}"] = val; 36 | } 37 | 38 | JsonSerializer.Serialize(writer, dict, options); 39 | } 40 | } 41 | 42 | internal class Program 43 | { 44 | private static readonly HttpClient Client = new(); 45 | 46 | private static readonly JsonSerializerOptions Options = new() 47 | { 48 | Converters = {new JsonStringEnumConverter(), new ValueTupleDictionaryConverter()} 49 | }; 50 | 51 | private static async Task Main(string[] args) 52 | { 53 | if (2 > args.Length) 54 | { 55 | Console.WriteLine("Usage: PrismCatalogDownloader.exe [OutputPath]"); 56 | Console.WriteLine("Example: PrismCatalogDownloader.exe 1.0.4 10000300@3PYTsQ2KhKxntVCcPFAlFV8= assets"); 57 | return; 58 | } 59 | 60 | var bundleVersion = args[0]; 61 | var resourceVersion = args[1]; 62 | 63 | if (!resourceVersion.Contains('@')) 64 | { 65 | Console.WriteLine("Invalid resource version provided."); 66 | return; 67 | } 68 | 69 | var parts = resourceVersion.Split("@"); 70 | var simpleVersion = parts[0]; 71 | var catalogInfoEncoded = parts[1]; 72 | 73 | //var paddingVal = catalogInfoEncoded.Length % 4; 74 | //if (paddingVal != 0) 75 | // for (int i = 0; i < 4 - paddingVal; i++) 76 | // catalogInfoEncoded += "="; 77 | 78 | var outputPath = Path.GetFullPath( 79 | args.Length > 2 80 | ? args[2] 81 | : $"output_{bundleVersion}_{resourceVersion.Replace('@', '_')}"); 82 | 83 | Directory.CreateDirectory(outputPath); 84 | 85 | var rootHash = HashUtils.Crc64($"{bundleVersion}:{simpleVersion}"); 86 | var manifest = CatalogManifest.FromCatalogInfo(catalogInfoEncoded, rootHash); 87 | 88 | var list = new Dictionary>(); 89 | await DumpAndParseCatalog(outputPath, "root", manifest, list); 90 | 91 | await File.WriteAllTextAsync(Path.Join(outputPath, "assetinfo.json"), JsonSerializer.Serialize(list, Options)); 92 | 93 | var rawFolder = Path.Join(outputPath, "root", "raw"); 94 | var localizeText = Path.Join(rawFolder, "localizetext.bytes"); 95 | if (File.Exists(localizeText)) 96 | { 97 | var bytes = await File.ReadAllBytesAsync(localizeText); 98 | var dict = MemoryPackSerializer.Deserialize>>(bytes, 99 | MemoryPackSerializerOptions.Utf16); 100 | 101 | await File.WriteAllTextAsync(Path.Join(rawFolder, "localizetext.json"), JsonSerializer.Serialize(dict)); 102 | } 103 | 104 | var masterData = Path.Join(rawFolder, "masterdata.bytes"); 105 | if (File.Exists(masterData)) 106 | { 107 | var bytes = await File.ReadAllBytesAsync(masterData); 108 | var dict = MemoryPackSerializer.Deserialize(bytes, 109 | MemoryPackSerializerOptions.Utf16); 110 | 111 | await File.WriteAllTextAsync(Path.Join(rawFolder, "masterdata.json"), JsonSerializer.Serialize(dict)); 112 | } 113 | } 114 | 115 | private static async Task DumpAndParseCatalog(string outputDirectory, string label, CatalogManifest manifest, Dictionary> catalogs) 116 | { 117 | var encodedCatalog = await DownloadFile(manifest.GetRealName()); 118 | if (encodedCatalog == null) 119 | return; 120 | 121 | var subOutputDirectory = Path.Join(outputDirectory, label); 122 | Directory.CreateDirectory(subOutputDirectory); 123 | 124 | var catalogCatalog = CatalogBinaryParser.ParseEncoded(manifest, encodedCatalog); 125 | catalogs[label] = DumpCatalog(subOutputDirectory, catalogCatalog); 126 | 127 | foreach (var entry in catalogCatalog.Entries) 128 | { 129 | if (catalogCatalog.Types[entry.TypeIdx] == "catalog") 130 | { 131 | Console.WriteLine($"Dumping catalog {entry.Label}."); 132 | await DumpAndParseCatalog(subOutputDirectory, entry.Label, entry.AsManifest(), catalogs); 133 | } 134 | } 135 | } 136 | 137 | private static List DumpCatalog(string outputDirectory, CatalogBinary catalog) 138 | { 139 | List entries = []; 140 | 141 | foreach (var info in catalog.Entries) 142 | { 143 | var name = $"{info.Label}.{catalog.Types[info.TypeIdx]}"; 144 | var url = info.AsManifest().GetRealName(); 145 | 146 | entries.Add(new ReadableCatalogEntry(name, url, info.ResourceType)); 147 | 148 | if (catalog.Types[info.TypeIdx] == "catalog") 149 | continue; 150 | 151 | Console.WriteLine($"Downloading {name}..."); 152 | if (name.Contains('/')) 153 | Directory.CreateDirectory(Path.Join(outputDirectory, Path.GetDirectoryName(name))); 154 | 155 | DownloadAsset(Path.Join(outputDirectory, name), info); 156 | //foreach (var contents in info.ContentAddressCrcs) 157 | //{ 158 | // Console.WriteLine($"\tContains: {contents}"); 159 | //} 160 | } 161 | 162 | return entries; 163 | } 164 | 165 | private static void DownloadAsset(string outputPath, CatalogBinaryEntry entry) 166 | { 167 | var fileData = DownloadFile(entry.AsManifest().GetRealName()).Result; 168 | if (fileData == null) 169 | return; 170 | 171 | var actualFileData = entry.ResourceType switch 172 | { 173 | ResourceType.BundlePlain => fileData, 174 | ResourceType.RawPlain => fileData, 175 | ResourceType.BundlePaddedStart => fileData.AsSpan(4), 176 | ResourceType.RawLz4Compressed => Lz4.DecompressFrame(fileData), 177 | ResourceType.RawEncrypted => Decrypt(fileData), 178 | _ => throw new UnreachableException() 179 | }; 180 | 181 | using var fs = File.OpenWrite(outputPath); 182 | fs.Write(actualFileData); 183 | return; 184 | 185 | ReadOnlySpan Decrypt(byte[] encrypted) 186 | { 187 | var keyMaterial = (stackalloc byte[24]); 188 | var writer = SpanWriter.BigEndian(keyMaterial); 189 | writer.WriteUInt64(entry.Seed); 190 | writer.WriteUInt64(entry.LabelCrc); 191 | writer.WriteUInt64(entry.Size); 192 | 193 | var hash = SHA1.HashData(keyMaterial); 194 | var key = hash[..16]; 195 | var iv = hash[4..20]; 196 | 197 | var data = encrypted.AsSpan(); 198 | AesCtr.Decrypt(data, key, iv); 199 | return Lz4.DecompressFrame(data); 200 | } 201 | } 202 | 203 | private static string ToUrl(string realName) 204 | => $"https://asset.imassc.song4.prism.bn765.com/r/{realName[..2]}/{realName}"; 205 | 206 | private static async Task DownloadFile(string realName) 207 | { 208 | var req = new HttpRequestMessage(HttpMethod.Get, ToUrl(realName)); 209 | var resp = await Client.SendAsync(req); 210 | if (!resp.IsSuccessStatusCode) 211 | { 212 | Console.WriteLine($"The file {realName} does not exist on the remote server."); 213 | return null; 214 | } 215 | 216 | return await resp.Content.ReadAsByteArrayAsync(); 217 | } 218 | 219 | private record ReadableCatalogEntry(string Name, string Path, ResourceType Type); 220 | } -------------------------------------------------------------------------------- /PrismCatalogDownloader/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "profiles": { 3 | "PrismCatalogDownloader": { 4 | "commandName": "Project", 5 | "commandLineArgs": "1.0.4 10000300@jqWxJ9wcJQVnmMwPYKbgEDA= assets" 6 | } 7 | } 8 | } --------------------------------------------------------------------------------