From 70db6ca2aa16b795309d4c9dcf1dcb53022c2047 Mon Sep 17 00:00:00 2001 From: Asuro Date: Mon, 19 May 2025 18:20:05 +0200 Subject: [PATCH] solved status ui --- src/game/Instance.h | 8 +-- src/game/Level.cpp | 20 +++++- src/game/Level.h | 1 + src/game/Puzzle.cpp | 2 +- src/game/Tools.cpp | 11 ++- src/game/data/puzzles/0.pzl | 4 +- src/game/data/static/puzzle.dat | Bin 17316 -> 19020 bytes src/game/data/static/uiconfig.dat | Bin 8433 -> 9384 bytes src/game/mini.def | 7 ++ src/gen/Generated.cpp | 110 ++++++++++++++++++++++++++++++ src/gen/Generated.h | 24 +++++-- 11 files changed, 166 insertions(+), 21 deletions(-) diff --git a/src/game/Instance.h b/src/game/Instance.h index 283edcd..3c1316d 100644 --- a/src/game/Instance.h +++ b/src/game/Instance.h @@ -32,12 +32,6 @@ namespace Game int64_t StartTime = 0; }; - // TODO: move to generated data and save - struct SavedPlayerConfig - { - Gen::SavedEntityRenderData TabletRenderData; - }; - struct PlayerData { Gen::Transform PlayerCamTransform; @@ -53,7 +47,7 @@ namespace Game InteractionMode InteractionM = InteractionMode::Walk; float MouseSensitivity = 1.0f; float MovementSpeed = 10.0f; - SavedPlayerConfig Config; + Gen::SavedPlayerConfig Config; }; struct InstanceDebugData diff --git a/src/game/Level.cpp b/src/game/Level.cpp index 3fd2a77..499e297 100644 --- a/src/game/Level.cpp +++ b/src/game/Level.cpp @@ -195,7 +195,7 @@ namespace Game { Deserializer d; d.Init("game/data/static/uiconfig.dat", "UICO"); - d.ReadT(GetInstance().Player.Config.TabletRenderData); + d.ReadT(GetInstance().Player.Config); d.Finish(); } } @@ -271,7 +271,7 @@ namespace Game if (IsValid(TabletHandle)) { auto& tablet = UIQuads.Get(TabletHandle); - tablet.EData.LoadFromSaved(player.Config.TabletRenderData); + tablet.EData.LoadFromSaved(player.Config.TabletBackgroundRenderData); UpdateMatrix(player.PlayerCamTransform); tablet.EData.Transform.Rotation = player.PlayerCamTransform.Rotation; Rotate(tablet.EData.Transform, {0.5f * bx::kPi, 0.0f, 0.0f}); @@ -382,6 +382,7 @@ namespace Game quad.EData.MaterialHandle = EMaterial::UI; quad.EData.ModelH = GameRendering::Get().GetModelHandleFromPath("models/plane.glb"); } + SolvedQuad = level.UIQuads.New(); IsSetup = true; LOG("finished setup!"); } @@ -450,6 +451,21 @@ namespace Game Vec3 mousePosWorld = GetMousePosWorld(); + Puzzle::PuzzleSolver solver; + EntityRenderData solvedData; + solvedData.LoadFromSaved(GetInstance().Player.Config.TabletStatusRenderData); + auto& solvedQuad = level.UIQuads.Get(SolvedQuad); + solvedQuad.EData = solvedData; + solvedQuad.EData.Visible = IsActive; + solvedQuad.EData.TextureHandle = solver.IsPuzzleSolved(Data) + ? GetInstance().Player.Config.TabletStatusSolvedTexture + : solvedData.TextureHandle; + solvedQuad.EData.Transform.Position = tileOriginTransform.Position; + solvedQuad.EData.Transform.Rotation = camTransform.Rotation; + solvedQuad.EData.Transform.Scale = solvedData.Transform.Scale; + TranslateLocal(solvedQuad.EData.Transform, solvedData.Transform.Position); + Rotate(solvedQuad.EData.Transform, Vec3{bx::kPi * 0.5f, 0.0f, (1.0f - 0 * 0.5f) * bx::kPi}); + // Available Cards for (int32_t i = 0; i < Puzzle::Config::MaxAvailableStacks; ++i) { diff --git a/src/game/Level.h b/src/game/Level.h index 6405550..854269d 100644 --- a/src/game/Level.h +++ b/src/game/Level.h @@ -157,6 +157,7 @@ namespace Game PuzzleTileCoverHandle CoverHandles[Puzzle::Config::MaxCardsInPuzzle * Puzzle::Config::MaxCoversInTile]; UIQuadEntityHandle UIPlacedCards[Puzzle::Config::MaxCardsInPuzzle]; UIQuadEntityHandle UIAvailableCards[Puzzle::Config::MaxAvailableStacks * UIAvailableCardMaxStackPreview]; + UIQuadEntityHandle SolvedQuad; Gen::PuzPos DraggedCard{-1, -1}; uint16_t DraggedAvailableCardIdx = UINT16_MAX; bool IsSetup = false; diff --git a/src/game/Puzzle.cpp b/src/game/Puzzle.cpp index 37324c0..b1f3fd0 100644 --- a/src/game/Puzzle.cpp +++ b/src/game/Puzzle.cpp @@ -240,7 +240,7 @@ namespace Puzzle return from == PuzzleElementType::ElectricIn || from == PuzzleElementType::ElectricGoal || from == PuzzleElementType::None; } - assert(false); + // assert(false); return false; } bool PuzzleSolver::IsValidSource(PuzzleElementType::Enum sourceType, PuzzleElementType::Enum goalType) diff --git a/src/game/Tools.cpp b/src/game/Tools.cpp index 33871e3..700df18 100644 --- a/src/game/Tools.cpp +++ b/src/game/Tools.cpp @@ -39,6 +39,7 @@ namespace Tools bool EntityDataSettings(Gen::SavedEntityRenderData& data) { + ImGui::PushID(&data); bool changed = false; changed |= ModelDropdown(data.Model); changed |= MaterialDropdown(data.Material); @@ -47,6 +48,7 @@ namespace Tools changed |= ImGui::Checkbox("Visible", &data.Visible); changed |= ImGui::ColorEdit4("Color 1", &data.BaseColor.x); changed |= ImGui::ColorEdit4("Color 2", &data.HighlightColor.x); + ImGui::PopID(); return changed; } @@ -299,11 +301,16 @@ namespace Tools ImGui::Separator(); ImGui::Text("Game Tablet"); - if (Tools::EntityDataSettings(player.Config.TabletRenderData)) + bool bTabletChanged = false; + bTabletChanged |= Tools::EntityDataSettings(player.Config.TabletBackgroundRenderData); + ImGui::Text("Status"); + bTabletChanged |= Tools::EntityDataSettings(player.Config.TabletStatusRenderData); + bTabletChanged |= Tools::TextureDropdown(player.Config.TabletStatusSolvedTexture); + if (bTabletChanged) { Serializer s; s.Init("game/data/static/uiconfig.dat", "UICO"); - s.WriteT(player.Config.TabletRenderData); + s.WriteT(player.Config); s.Finish(); } diff --git a/src/game/data/puzzles/0.pzl b/src/game/data/puzzles/0.pzl index 78cb6c9..cc24f96 100644 --- a/src/game/data/puzzles/0.pzl +++ b/src/game/data/puzzles/0.pzl @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:deda5ca16e6d732fb41bbdc7cec4dd2932389f3d66b8c9f69d93771a3972b22e -size 10312 +oid sha256:dd485b73222de5ad4237a1307f9bb210c691253d0550e583a41b7512fae2af80 +size 10404 diff --git a/src/game/data/static/puzzle.dat b/src/game/data/static/puzzle.dat index bcea19f15e1bab7527a49c9fd42d654a3573c02c..7108a9c94fc88bb6f532e592fef898240ce9b3af 100644 GIT binary patch literal 19020 zcmWFz2#sQ7U}RumQ1msQ%fP_LprOFP;K#(kU}Fyv3oc14$xIF?t*XjNbxABqWFQeR zF)%VPk*J5d${na{9Lc8fFtRcTGP0AbZ}@2V!@$5`{(@ftIW0LS7NwBtLrw-}1{OGE zWng1qBh?5B)w3Y!7eHduiy6bf!H~kh&rr-Dz|hRV&oGHWfMF2>Kf^`_c7`1cLJX%E zgy`jz0kX%2fq_Bum02gGL<-9+E=|k{PAw_P%u6pO#Yrp->QOvY(h?2gy~^n;DJJz$Vj7E85kMZ7#JDY85kKjz~e6?Ed)SyoYgiP znXuGkV@mwaJi=2F0|RJ;jhTUwfn`LdBT(7_jW2@Qi=~EUAnqt04FR%405rm9pWZv$ zvA8(3gzVN50|O%iFWGJw9vYPyn1_c)$o2(jd z6=c10eolT7h~tu90%4~Xm$+mWCnn{jrhvw2Lo)M9Ky)!=O0qa8H4Vh|O{{P%OU%px zsdLUR%_|8lPE7$bpbF4K%(K`BG~%1$=>nOR@=MH34bMy|$pBei?2($8o>2m3B8*Ke zf|!URQXG(zm<(}Ru~TAlc6w2MX44$NAxQ;-F~ferSdM`n6P4#+w%FT~9^ zu_U!9GcgAmMBo4n%Ph`J%1I3Yd9MUvO;BoHN@@{kxd=oCH1S_rj9oN1Kc_4e7Ve-# z#mund`R3IBcmV@MmTnZ(ItFHDUWNy=t(YKuOp=LV$)((r3{Z-Z!B0(l83UApsHTOJ z*%|gk`Is>?Ff(&A wXs!UKgwb394h9IpvhuiHOr8fAgK|h*ccA^$oIiFT4B{hWfq+yy7zT+00Ee}EZU6uP literal 17316 zcmWFz2#sQ7U}RumxLvHn$iTqMa7UJb;S(bRgN;5!EVv}GBr`dnw5lp6)g`eck%2_O z#K6eFM4}$*DtDl+aU`4elYy1t9|Jqd`i75&Jq!#C!cKf8$Z5$ru_%R9A96AvQ6sGbE$zW@@OUQAC04u(Jmeue}F0fqtweujDm0fv4CeujAr>MuT$-2@oLW+nnU`Knij!Cv*csRvI7V>3Jj1}taFcb<+3H#b7kl50+CZfaghNM%7PEi4-~b6AG}2Ll7c?3yEj zzWFJsIUb35DLLe&A|?h-2CiWpQiMFG#=ya#$G}QR*)Wy|rKLSy2hM}qNWuBZ*{LPu zd6tm@xxGT38ADr_%ZN@#ptu92rG>{M6GKufN=l1T$u5~j%Ozt5E(Y5Xot{8##M_w_ zQ^Qh|O+aajT+G724Ta>IFx2(2GB7f*F)%W)GcYo6fX82kx{pY8KMw-~gVi=0nXuGk zV^Z}Zt7jhJDT#prG{VNr0IKUj{Tbx287XYg_#&viSZZiCQoKCsPa1^)sKsob-aFf| zxHz?h?A8(k10w^dgrkuohlH`p49r8qowRc#C@pa^FfgPU8_~{^QIkhR2!PTOXttwt zG%byY_@<>ND=I50t12q1%6)x(eLVy6i!)0y^Yeo8K~uf?dBMqvIjNp072uIf&y)&q zO$Z%6fN>)t!LraH^J1sO;#9Bzq{8&eFDl7!&M!+Xg794vi%XEW!TF^q(&4FS(x4Hq zVz7BoYazxs&d4t!)D+M_T1aMI z35YI+%o!C2rKW+nzKIo%Wr>+NAa&09rFkWx#i=P^22=rh@OT#cfQIB!JY68u27ZaT zso|L^B^e;gi#<{^(=$rIOoXwCMGzBFM2Z7)5|bfLD|Sju&Q34NFU?B<>vYdg%z;@8 zb_%ipIIzJ!^vF!l$N^ag=7qTVCYGcYWhUl8g9sdeVVT95NsysvW`-TlH>ds|1b~@= znSqz#!E7rgT#jL4SaK=%B!pyS@Ke)X1|e~&Cr_M}VNa9~xXVDEep=`P<$GF~OP-md zuE8B{qhT`|Hn>9ox6Ej|84VlUA%I(EG~JAb4ek)YEi;;KM#Bbo2;i0(O*f-qgF6Ip z%Z#R*(XhcC0=Q*H)6Hnu;0^)YGNb8cG;DB(0B)JlbTb+@xI+N9%xJn94IA7cfLmrX z-He6}?hwE&Gn#Hj!v=Q<;FcLpH=|*LI|OjcjHa8>u)!SyxMfDu4eqdES$W(pCeH(m bLE#kF9cVu_=Z_r-gZRi;ARyHahC$*0%@A*T diff --git a/src/game/data/static/uiconfig.dat b/src/game/data/static/uiconfig.dat index b3328906c6467e9fbda991c62c9d7d082cc6ee31..c8c989c159b2097959e15f94e8c64d84638ed034 100644 GIT binary patch delta 502 zcmez9xWdyo)YI9Yk%5tcfkF0eR zEi-*$p*}k^14t9oWI^`d+^kGe4Dw8345mzylLgtoPn7cFWoBSzU}0coU}9inV4qm{ zS^6R)C&Mj9K86>JObo9WIT$`MvNQZ-WM%lr$Ud>~`D8CnugOfTza|E-ZJxr##5g&P z$%~zf0SqS#vj5z?f!T+VlbeB?fd_;^wru{x8pJ$#7PlKr-vb^$=FLLl)0h}}CkwLw z-@HPKjd8P)z$7L{u8D>9n_Yy@FtWl7{JmK~jEQmcD(R_A!p`}5d8x@InfZAxnMDxB zW_!7njF};cNja${PKn9c=|%aac_~4uc`2zyE{P?H5SieT#FElt?4rT>Ic2FSA*mH5 zrA4U>3=Q_k*wrrE9)>~UlM58oChI92mH}}Pn1SI6-)}n@p4^}yHaSm0WAZr#p2>a+ xRvcW{m2G#(wc5fZ^c2{X&z?DB3&Wr|WoEEO!^p|O zz`?)?!jlW!Mm8B-ftEf%>ptKSI963i= diff --git a/src/game/mini.def b/src/game/mini.def index b876714..c5cb55f 100644 --- a/src/game/mini.def +++ b/src/game/mini.def @@ -165,3 +165,10 @@ type SavedEntityRenderData ModelHandle Model b Visible } + +type SavedPlayerConfig +{ + SavedEntityRenderData TabletBackgroundRenderData + SavedEntityRenderData TabletStatusRenderData + TextureHandle TabletStatusSolvedTexture +} diff --git a/src/gen/Generated.cpp b/src/gen/Generated.cpp index 2761ee2..b92bd25 100644 --- a/src/gen/Generated.cpp +++ b/src/gen/Generated.cpp @@ -2445,4 +2445,114 @@ namespace Gen assert(isOk); return isOk; } + bool Save(const SavedPlayerConfig* obj, uint32_t count, Serializer& serializer) + { + bool isOk = true; + for (uint32_t i = 0; i < count; ++i) + { + isOk = Save(&obj[i].TabletBackgroundRenderData, 1, serializer) && isOk; + isOk = Save(&obj[i].TabletStatusRenderData, 1, serializer) && isOk; + isOk = Save(&obj[i].TabletStatusSolvedTexture, 1, serializer) && isOk; + } + return isOk; + } + bool Load(SavedPlayerConfig* obj, uint32_t count, Deserializer& serializer) + { + const char* typeName = Meta::Metadata.TypeDefinitions[SavedPlayerConfig::TypeIdx].Name; + + // Quick match + int32_t matchedHashIdx = + serializer.TypeBuf.FindHash(Meta::Metadata.TypeDefinitions[SavedPlayerConfig::TypeIdx].Hash); + if (matchedHashIdx >= 0) + { + assert(bx::strCmp(serializer.TypeBuf.Defs[matchedHashIdx].Name, typeName) == 0); + bool isOk = true; + for (uint32_t i = 0; i < count; ++i) + { + isOk = Load(&obj[i].TabletBackgroundRenderData, 1, serializer) && isOk; + isOk = Load(&obj[i].TabletStatusRenderData, 1, serializer) && isOk; + isOk = Load(&obj[i].TabletStatusSolvedTexture, 1, serializer) && isOk; + } + // if we're not ok here, something went really wrong + assert(isOk); + return isOk; + } + + // Failed to resolve hash, the type definition chaned since the file was saved! try to match by name. + int32_t nameMatchIdx = serializer.TypeBuf.FindDefByName(typeName); + if (nameMatchIdx < 0) + { + // Name match failed, caller has to handle this and potentially skip some bytes + return false; + } + + // Successfully matched name, but we need to follow the definition of the file now! + const Meta::TypeDef& matchedDef = serializer.TypeBuf.Defs[nameMatchIdx]; + + // Figure out new member mapping + uint64_t WriteDestinations[64]; + for (int32_t i = 0; i < BX_COUNTOF(WriteDestinations); ++i) + { + WriteDestinations[i] = UINT64_MAX; + } + for (uint32_t i = 0; i < matchedDef.ChildCount; ++i) + { + const bx::StringView memberName = {&serializer.MemberNameBuf[matchedDef.MemberNameIndices[i].Offset], matchedDef.MemberNameIndices[i].Size}; + const char* memberTypeName = serializer.TypeBuf.Defs[matchedDef.ChildIndices[i]].Name; + if (bx::strCmp(memberName, "TabletBackgroundRenderData") == 0 && bx::strCmp(memberTypeName, "SavedEntityRenderData") == 0) + { + WriteDestinations[i] = offsetof(SavedPlayerConfig, TabletBackgroundRenderData); + } + if (bx::strCmp(memberName, "TabletStatusRenderData") == 0 && bx::strCmp(memberTypeName, "SavedEntityRenderData") == 0) + { + WriteDestinations[i] = offsetof(SavedPlayerConfig, TabletStatusRenderData); + } + if (bx::strCmp(memberName, "TabletStatusSolvedTexture") == 0 && bx::strCmp(memberTypeName, "TextureHandle") == 0) + { + WriteDestinations[i] = offsetof(SavedPlayerConfig, TabletStatusSolvedTexture); + } + } + + // Start reading in file order, skipping things that we don't know by name and type + bool isOk = true; + for (uint32_t i = 0; i < count; ++i) + { + uint8_t* objBasePtr = reinterpret_cast(&obj[i]); + + for (uint32_t j = 0; j < matchedDef.ChildCount; ++j) + { + const Meta::TypeDef& childDef = serializer.TypeBuf.Defs[matchedDef.ChildIndices[j]]; + const bx::StringView memberName = {&serializer.MemberNameBuf[matchedDef.MemberNameIndices[j].Offset], matchedDef.MemberNameIndices[j].Size}; + if (WriteDestinations[j] == UINT64_MAX) + { + // Unknown member name or type changed + uint16_t count = bx::max(1, matchedDef.ChildArraySizes[matchedDef.ChildIndices[j]]); + serializer.Skip(childDef.Size * count); + continue; + } + + if (bx::strCmp(memberName, "TabletBackgroundRenderData") == 0) + { + auto* fieldPtr = reinterpret_cast(objBasePtr + WriteDestinations[j]); + isOk = Load(fieldPtr, 1, serializer) && isOk; + continue; + } + if (bx::strCmp(memberName, "TabletStatusRenderData") == 0) + { + auto* fieldPtr = reinterpret_cast(objBasePtr + WriteDestinations[j]); + isOk = Load(fieldPtr, 1, serializer) && isOk; + continue; + } + if (bx::strCmp(memberName, "TabletStatusSolvedTexture") == 0) + { + auto* fieldPtr = reinterpret_cast(objBasePtr + WriteDestinations[j]); + isOk = Load(fieldPtr, 1, serializer) && isOk; + continue; + } + assert(false); + } + } + assert(isOk); + return isOk; + } } diff --git a/src/gen/Generated.h b/src/gen/Generated.h index 155c407..5b6452a 100644 --- a/src/gen/Generated.h +++ b/src/gen/Generated.h @@ -7,7 +7,7 @@ namespace Gen struct Deserializer; struct PuzzleElementType { - static constexpr uint16_t TypeIdx = 31; + static constexpr uint16_t TypeIdx = 32; static constexpr int32_t EntryCount = 8; enum Enum : uint8_t { @@ -56,7 +56,7 @@ namespace Gen }; struct EMaterial { - static constexpr uint16_t TypeIdx = 32; + static constexpr uint16_t TypeIdx = 33; static constexpr int32_t EntryCount = 2; enum Enum : int32_t { @@ -219,6 +219,13 @@ namespace Gen ModelHandle Model = {}; bool Visible = {}; }; + struct SavedPlayerConfig + { + static constexpr uint16_t TypeIdx = 31; + SavedEntityRenderData TabletBackgroundRenderData = {}; + SavedEntityRenderData TabletStatusRenderData = {}; + TextureHandle TabletStatusSolvedTexture = {}; + }; bool Save(const PuzzleElementType::Enum* obj, uint32_t count, Serializer& serializer); bool Load(PuzzleElementType::Enum* obj, uint32_t count, Deserializer& serializer); bool Save(const EMaterial::Enum* obj, uint32_t count, Serializer& serializer); @@ -285,6 +292,8 @@ namespace Gen bool Load(PuzzleData* obj, uint32_t count, Deserializer& serializer); bool Save(const SavedEntityRenderData* obj, uint32_t count, Serializer& serializer); bool Load(SavedEntityRenderData* obj, uint32_t count, Deserializer& serializer); + bool Save(const SavedPlayerConfig* obj, uint32_t count, Serializer& serializer); + bool Load(SavedPlayerConfig* obj, uint32_t count, Deserializer& serializer); namespace Meta { constexpr uint16_t CurrentMetaVersion = 1; @@ -308,7 +317,7 @@ namespace Gen struct MetadataTable { - TypeDef TypeDefinitions[33] + TypeDef TypeDefinitions[34] { TypeDef{sizeof(int8_t), 0, "i8", 0, {}, {}, {}}, TypeDef{sizeof(int16_t), 1, "i16", 0, {}, {}, {}}, @@ -333,18 +342,19 @@ namespace Gen TypeDef{sizeof(TextureHandle), 1633273761, "TextureHandle", 2, {5, 18}, {0, 0}, {{51, 10}, {61, 5}}}, TypeDef{sizeof(PuzPos), 1834398141, "PuzPos", 2, {0, 0}, {0, 0}, {{66, 1}, {67, 1}}}, TypeDef{sizeof(CardSocket), 2168907571, "CardSocket", 2, {19, 4}, {0, 0}, {{68, 5}, {73, 19}}}, - TypeDef{sizeof(StaticPuzzleCard), 537913399, "StaticPuzzleCard", 9, {31, 19, 19, 19, 19, 19, 22, 20, 20}, {4, 0, 0, 0, 0, 0, 16, 0, 0}, {{92, 8}, {100, 15}, {115, 16}, {131, 15}, {146, 16}, {162, 15}, {177, 7}, {184, 18}, {202, 18}}}, + TypeDef{sizeof(StaticPuzzleCard), 537913399, "StaticPuzzleCard", 9, {32, 19, 19, 19, 19, 19, 22, 20, 20}, {4, 0, 0, 0, 0, 0, 16, 0, 0}, {{92, 8}, {100, 15}, {115, 16}, {131, 15}, {146, 16}, {162, 15}, {177, 7}, {184, 18}, {202, 18}}}, TypeDef{sizeof(StaticPuzzleCardHandle), 1742502768, "StaticPuzzleCardHandle", 1, {5}, {0}, {{220, 3}}}, TypeDef{sizeof(PuzzleVisualSettings), 2302077481, "PuzzleVisualSettings", 4, {14, 14, 13, 14}, {0, 0, 0, 0}, {{223, 13}, {236, 12}, {248, 4}, {252, 16}}}, TypeDef{sizeof(StaticPuzzleData), 2637647137, "StaticPuzzleData", 2, {23, 25}, {64, 0}, {{268, 5}, {273, 7}}}, TypeDef{sizeof(PuzzleCardStack), 53538532, "PuzzleCardStack", 3, {24, 4, 4}, {0, 0, 0}, {{280, 7}, {287, 17}, {304, 9}}}, TypeDef{sizeof(PlacedPuzzleCard), 3555575973, "PlacedPuzzleCard", 4, {24, 21, 4, 8}, {0, 0, 0, 0}, {{313, 7}, {320, 8}, {328, 8}, {336, 8}}}, - TypeDef{sizeof(PuzzleData), 3349686056, "PuzzleData", 10, {5, 11, 4, 4, 6, 27, 28, 31, 6, 21}, {0, 64, 0, 0, 0, 16, 256, 1024, 0, 16}, {{344, 2}, {346, 10}, {356, 10}, {366, 11}, {377, 18}, {395, 14}, {409, 11}, {420, 15}, {435, 17}, {452, 13}}}, - TypeDef{sizeof(SavedEntityRenderData), 3172756855, "SavedEntityRenderData", 7, {14, 14, 17, 32, 20, 19, 8}, {0, 0, 0, 0, 0, 0, 0}, {{465, 9}, {474, 14}, {488, 2}, {490, 8}, {498, 7}, {505, 5}, {510, 7}}}, + TypeDef{sizeof(PuzzleData), 3349686056, "PuzzleData", 10, {5, 11, 4, 4, 6, 27, 28, 32, 6, 21}, {0, 64, 0, 0, 0, 16, 256, 1024, 0, 16}, {{344, 2}, {346, 10}, {356, 10}, {366, 11}, {377, 18}, {395, 14}, {409, 11}, {420, 15}, {435, 17}, {452, 13}}}, + TypeDef{sizeof(SavedEntityRenderData), 3172756855, "SavedEntityRenderData", 7, {14, 14, 17, 33, 20, 19, 8}, {0, 0, 0, 0, 0, 0, 0}, {{465, 9}, {474, 14}, {488, 2}, {490, 8}, {498, 7}, {505, 5}, {510, 7}}}, + TypeDef{sizeof(SavedPlayerConfig), 692059165, "SavedPlayerConfig", 3, {30, 30, 20}, {0, 0, 0}, {{517, 26}, {543, 22}, {565, 25}}}, TypeDef{sizeof(PuzzleElementType::Enum), 2983807453, "PuzzleElementType", 0, {}, {}, {}}, TypeDef{sizeof(EMaterial::Enum), 2024002654, "EMaterial", 0, {}, {}, {}}, }; - char MemberNameBuffer[64*64*64]{"xyxyzxyzwMMMMIPositionRotationScaleIdxModelIdxAssetTextureIdxAssetXYModelConnectionDirectionElementsBaseModelHandleNorthCoverHandleEastCoverHandleSouthCoverHandleWestCoverHandleSocketsModelTextureHandleBoardTextureHandleIdxTileBaseColorTileDotColorTestDisabledCardTintCardsVisualsRefCardMaxAvailableCountUsedCountRefCardPositionRotationIsLockedIDPuzzleNameWidthTilesHeightTilesAvailableCardCountAvailableCardsPlacedCardsBackgroundTilesGoalPositionCountGoalPositionsBaseColorHighlightColorTFMaterialTextureModelVisible"}; + char MemberNameBuffer[64*64*64]{"xyxyzxyzwMMMMIPositionRotationScaleIdxModelIdxAssetTextureIdxAssetXYModelConnectionDirectionElementsBaseModelHandleNorthCoverHandleEastCoverHandleSouthCoverHandleWestCoverHandleSocketsModelTextureHandleBoardTextureHandleIdxTileBaseColorTileDotColorTestDisabledCardTintCardsVisualsRefCardMaxAvailableCountUsedCountRefCardPositionRotationIsLockedIDPuzzleNameWidthTilesHeightTilesAvailableCardCountAvailableCardsPlacedCardsBackgroundTilesGoalPositionCountGoalPositionsBaseColorHighlightColorTFMaterialTextureModelVisibleTabletBackgroundRenderDataTabletStatusRenderDataTabletStatusSolvedTexture"}; }; constexpr MetadataTable Metadata;