From 6f82fb60105d91976e913575efb51145fa13dce2 Mon Sep 17 00:00:00 2001 From: Parnic Date: Mon, 9 May 2022 13:24:01 -0500 Subject: [PATCH] WIP gameprogress parser --- .gitignore | 3 ++ GAMEPROGRESS.broke.BLOB | Bin 0 -> 6189 bytes LegoSkywalkerGameProgressParser.csproj | 10 ++++ LegoSkywalkerGameProgressParser.sln | 25 ++++++++++ Program.cs | 64 +++++++++++++++++++++++++ 5 files changed, 102 insertions(+) create mode 100644 .gitignore create mode 100644 GAMEPROGRESS.broke.BLOB create mode 100644 LegoSkywalkerGameProgressParser.csproj create mode 100644 LegoSkywalkerGameProgressParser.sln create mode 100644 Program.cs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e66a6e6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/bin/ +/obj/ +/.vs/ diff --git a/GAMEPROGRESS.broke.BLOB b/GAMEPROGRESS.broke.BLOB new file mode 100644 index 0000000000000000000000000000000000000000..20239b092c49e6a4c0381273a28bc2a9b19a4fff GIT binary patch literal 6189 zcmd5=TXW;K6{efCO}lN{rkCwCVP=|_WE$DBWqb3|m9+BO8{1MOt#|XpKolgQra%rz z`SQ>iJ@qGn8eji9(EKL!4i5OxahwPEbrK`R_(Tsv zXBV$q__6%wJC5@MJiE7%JXLYx{1z|#eK%{gmHJ2+tMa?$p6}tMGYU=Oz=-pk<*s+} za-tK5&zufA_V=9kin@-1P^4PFUpDuBykG%J51s#^{9(C|cIsgePRy?JBh=mHPOkiX za@>ieuSDSd6tB6(T}VIGEb7^_I=Qu-B{$Av7|V6E5@T2PF*@fEa$5C3#BsCt7wIR? zA>RMEEbx=N0&O|4GPwyIi(p{E&hz=x z<*NzELm%gsn-QdJ3Hd(g^g~Elmsrx%Q*Dr#VAxiNLq8Q`*)rkK$T;qZD`_$Q1v*H% z3u$5%YSgBGewe9p6UFIvBl4WdOy6yXlLVc=Mq5^D^Ii%^mJcAv0HaANBgg7?^bpCt`ajF)KOKemIT-naKVt6sXLJ zH?`}();fhh!0$w>1bZ&7xEoC~E1bv4K&W4Etj(Fg$wVs@3T#@$82ROCt4yI6|Rh8Tv^o^b%hPk3KdRByXF-P z{=F%2i1;fb)8FqBhvU49A6?53FZ=|Ar!Nq;7G*lCQkGM`kR#;>GLtNdVbtJeIz~i_ zED@4$IE0GS>o+aUGnS>tqPmi9m%{Ej$-zT1D^orRR9?Y4D^)nor16-tYLUg0Vd03O z6=8v~HJ(HubR55eRy?7WRUnS+17P*tK_Jp31S0b?o7+cdS=L(&)}B$+W{IESX;~hZI=+!o$E8N3Vg$f?c3gZO`%+7V7ub^BJoF)$T#9TxHB^@+J;c3K2&_M&ywDn)-4KK?2wBD z$O6gq*!g+dN|S(aEOfs!QV|;M44J8A0Pi?kTW=5I+iSia{xaY%ufSj45PpKv?5P(* zd(UKFeW{7PMLly$OZ3Gxde6hUh~)g#qwun`Y#Nelw64fwZu10r<(0ikO(aPmn}hC1 zQo8{6@|)vsUH68FTb(3VZma2aRB$ED zsT^9gsrAfbNU?Z(ol7+sSX=qlH5}(<1zzxWy-HPA8GLo3e0dVrLZb^H-+gn)zokgC z2l)5y!XNEz06&Ap1EMgwlxY;P$Lb5&AId7gKtPBs+B^;0vL^$t#w1kqWqYDE+{7zn z+VS!Qufc1ewl@Pny|;?k&oQ-%;f*%G;FrV>5VSH zQiIboj=g>C@Og|r8AsCKrss7=6Gqt_>}$gFEL^}C!g39_GwsVZGBDiE`UPn3-&?c~ zfcC)(+6Nn=O|rG+t#^TidmSH{s~#c_*zXo2dEFDfFD%q#{23#N)@m|75`iCT4{01P z=0FYK^oXDL@|t18>bGVol+EcH(LpPW6L8l0kaR;S^u)}Bone(-od?v z`Vdebu0Vab0n|*pN$ew~wO2PnCHB713h}jPEDfNvY<~vE<4XnaAGO-yTWB!s(08Y* zCrzTXEcVY9WfuP7eXS84qM?G?YM42^x88UJZ#-J@#-k0qF*_$o{01yk>h`Kyle&X1 zyxwyy%os6X2IdjIJ*#Ab&o4~rR>|%iRLTd)C5jVoUTc|@V35X*9EL#wz>fg%c`C>2 z2ky3|7NU_%;!;;6A@1+8bQP04X^Qk7RFvf#euwCs@}PK@cNv61F)X}j!ZbN Y3uFOWIN$DQn27U_2cLb2Wv1l%KVQ0p1^@s6 literal 0 HcmV?d00001 diff --git a/LegoSkywalkerGameProgressParser.csproj b/LegoSkywalkerGameProgressParser.csproj new file mode 100644 index 0000000..74abf5c --- /dev/null +++ b/LegoSkywalkerGameProgressParser.csproj @@ -0,0 +1,10 @@ + + + + Exe + net6.0 + enable + enable + + + diff --git a/LegoSkywalkerGameProgressParser.sln b/LegoSkywalkerGameProgressParser.sln new file mode 100644 index 0000000..a56c388 --- /dev/null +++ b/LegoSkywalkerGameProgressParser.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32112.339 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LegoSkywalkerGameProgressParser", "LegoSkywalkerGameProgressParser.csproj", "{176F7D27-DFB9-4C4D-97E5-B4A3F5813977}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {176F7D27-DFB9-4C4D-97E5-B4A3F5813977}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {176F7D27-DFB9-4C4D-97E5-B4A3F5813977}.Debug|Any CPU.Build.0 = Debug|Any CPU + {176F7D27-DFB9-4C4D-97E5-B4A3F5813977}.Release|Any CPU.ActiveCfg = Release|Any CPU + {176F7D27-DFB9-4C4D-97E5-B4A3F5813977}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {5F843E48-2491-49DE-8D63-3603791F3954} + EndGlobalSection +EndGlobal diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..7d8c361 --- /dev/null +++ b/Program.cs @@ -0,0 +1,64 @@ +using System.Diagnostics; + +string readString(BinaryReader reader) +{ + var len = reader.ReadInt32(); + var strBytes = reader.ReadBytes(len); + return System.Text.Encoding.UTF8.GetString(strBytes).TrimEnd('\0'); +} + +void readTypes(BinaryReader reader) +{ + var typeLenPos = reader.BaseStream.Position; + var typeLen = reader.ReadInt32(); + var typeListHeader = readString(reader); + var numTypes = reader.ReadInt32(); + var numTypes2 = reader.ReadInt32(); + List<(string, string)> types = new(); + for (int i = 0; i < numTypes; i++) + { + var key = readString(reader); + var val = readString(reader); + types.Add((key, val)); + + var typeBuf1 = reader.ReadInt32(); + if (types.Count < numTypes) + { + var typeBuf2 = reader.ReadInt32(); + } + } + + Debug.Assert(reader.BaseStream.Position == typeLenPos + typeLen); +} + +using var file = File.OpenRead(@"C:\Users\chris\AppData\Roaming\Warner Bros. Interactive Entertainment\LEGO Star Wars - The Skywalker Saga\SAVEDGAMES\STEAM\21492523\SLOT1\GAMEPROGRESS.BLOB"); +using BinaryReader reader = new(file); +var header = reader.ReadInt32(); +var str1 = readString(reader); +var val1 = reader.ReadInt32(); +var buf1 = reader.ReadInt32(); +var buf2 = reader.ReadInt32(); +readTypes(reader); + +var classListLenPos = reader.BaseStream.Position; +var classListLen = reader.ReadInt32(); +var classListHeader = readString(reader); +var numClasses = reader.ReadInt32(); +for (int i = 0; i < numClasses; i++) +{ + var classLen = reader.ReadInt32(); + var classStr = readString(reader); + var className = readString(reader); + var numProps = reader.ReadInt32(); + + for (int j = 0; j < numProps; j++) + { + var propName = readString(reader); + // this ain't right. figure out how to parse property values + var propBuf1 = reader.ReadInt16(); + var propVal = reader.ReadInt32(); + var propBuf2 = reader.ReadInt16(); + } +} + +Console.WriteLine("done"); \ No newline at end of file