From 87ce032833f4afb52dc44daccf39594f753d468e Mon Sep 17 00:00:00 2001 From: Till W Date: Mon, 26 May 2025 18:04:51 +0200 Subject: [PATCH] wip --- src/game/Level.cpp | 15 ++++++----- src/game/Puzzle.cpp | 41 ++++++++++++++++++++++++++++++ src/game/UI.cpp | 37 ++++++++++++++++++--------- src/game/data/puzzles/0.pzl | 2 +- src/game/data/static/uiconfig.dat | Bin 9704 -> 9719 bytes 5 files changed, 75 insertions(+), 20 deletions(-) diff --git a/src/game/Level.cpp b/src/game/Level.cpp index 1ec3dd0..7ee610d 100644 --- a/src/game/Level.cpp +++ b/src/game/Level.cpp @@ -180,6 +180,13 @@ namespace Game Cubes.Get(PlayerOutsideViewCube).Setup(); } + { + Deserializer d; + d.Init("game/data/static/uiconfig.dat", "UICO"); + d.ReadT(GetInstance().Player.Config); + d.Finish(); + } + UIQuads.Count = 0; PuzzleTiles.Count = 0; PuzzleTileCovers.Count = 0; @@ -190,16 +197,10 @@ namespace Game Puzzles[i].Setup(); } } + PuzzleUI.Setup(); TabletHandle = UIQuads.New(); UpdatePlayerInputMode(); - - { - Deserializer d; - d.Init("game/data/static/uiconfig.dat", "UICO"); - d.ReadT(GetInstance().Player.Config); - d.Finish(); - } } void Level::Update() diff --git a/src/game/Puzzle.cpp b/src/game/Puzzle.cpp index 9655807..1567340 100644 --- a/src/game/Puzzle.cpp +++ b/src/game/Puzzle.cpp @@ -377,6 +377,45 @@ namespace Puzzle return true; } + void RecalculateInitialAvailable(PuzzleData& obj) + { + for (int32_t i = 0; i < obj.AvailableCardCount; ++i) + { + obj.AvailableCards[i].UsedCount = obj.AvailableCards[i].MaxAvailableCount; + } + + for (int32_t y = 0; y < obj.HeightTiles; ++y) + { + for (int32_t x = 0; x < obj.WidthTiles; ++x) + { + auto& placedCard = obj.PlacedCards[y * Puzzle::Config::MaxPuzzleSizeCards + x]; + if (Puzzle::IsValid(placedCard.RefCard)) + { + bool found = false; + for (int32_t i = 0; i < obj.AvailableCardCount; ++i) + { + if (obj.AvailableCards[i].RefCard.Idx == placedCard.RefCard.Idx) + { + found = true; + obj.AvailableCards[i].MaxAvailableCount++; + } + } + if (!found) + { + if (obj.AvailableCardCount == Puzzle::Config::MaxAvailableStacks) + { + LOG_ERROR("Read limit of available card stacks!"); + break; + } + obj.AvailableCards[obj.AvailableCardCount] = {}; + obj.AvailableCards[obj.AvailableCardCount].RefCard = placedCard.RefCard; + obj.AvailableCards[obj.AvailableCardCount].MaxAvailableCount = 1; + } + } + } + } + } + bool RenderDebugUI(PuzzleData& obj) { bool isVisible = true; @@ -485,6 +524,7 @@ namespace Puzzle { placedCard.Flags = (PlacedPuzzleCardFlags::Enum)(placedCard.Flags ^ PlacedPuzzleCardFlags::Locked); + RecalculateInitialAvailable(obj); } } if (!isLocked && IsValid(placedCard.RefCard)) @@ -506,6 +546,7 @@ namespace Puzzle placedCard.Position = cardPos; placedCard.Flags = (PlacedPuzzleCardFlags::Enum)SetFlags(placedCard.Flags, PlacedPuzzleCardFlags::Locked); + RecalculateInitialAvailable(obj); } ImGui::EndDragDropTarget(); } diff --git a/src/game/UI.cpp b/src/game/UI.cpp index 7aa0379..7fce876 100644 --- a/src/game/UI.cpp +++ b/src/game/UI.cpp @@ -112,36 +112,39 @@ namespace Game Vec3 quadPlaneIntersectPos; Vec3 mousePosWorld = GetMousePosWorld(); - for (int32_t i = 0; i < Puzzle::Config::MaxAvailableStacks; ++i) + for (int32_t stackIdx = 0; stackIdx < Puzzle::Config::MaxAvailableStacks; ++stackIdx) { - auto& card = Data.AvailableCards[i]; - for (int32_t j = 0; j < UIAvailableCardMaxStackPreview; j++) + auto& card = Data.AvailableCards[stackIdx]; + for (int32_t cardIdx = 0; cardIdx < UIAvailableCardMaxStackPreview; cardIdx++) { - auto h = UIAvailableCards[i * UIAvailableCardMaxStackPreview + j]; + auto h = UIAvailableCards[stackIdx * UIAvailableCardMaxStackPreview + cardIdx]; auto& quad = level.UIQuads.Get(h); int32_t remaining = (int32_t)card.MaxAvailableCount - (int32_t)card.UsedCount; - if (i < Data.AvailableCardCount && j < remaining) + if (stackIdx < Data.AvailableCardCount && cardIdx < remaining) { - quad.UIPos = Vec3{j * 0.05f + i * 1.2f, 4.2f + (j % 2 == 0 ? 0.02f : 0.0f), j * 0.001f} * + quad.UIPos = Vec3{cardIdx * 0.05f + stackIdx * 1.2f, + 4.2f + (cardIdx % 2 == 0 ? 0.02f : 0.0f), + cardIdx * 0.001f} * UICardOffset * UICardScale; UpdateQuad(level.UIQuads, h); quad.EData.Visible = true; - quad.EData.TextureHandle = Puzzle::IsValid(Data.AvailableCards[i].RefCard) - ? staticCards[Data.AvailableCards[i].RefCard.Idx].BoardTextureHandle - : Gen::TextureHandle{}; + quad.EData.TextureHandle = Puzzle::IsValid(card.RefCard) + ? staticCards[card.RefCard.Idx].BoardTextureHandle + : Gen::TextureHandle{0}; + quad.EData.TextureHandle = {4}; quad.EData.Transform.Scale = {UICardScale, UICardScale, UICardScale}; quad.EData.DotColor = {1.0f, 1.0f, 1.0f, 1.0f}; quad.EData.BaseColor = {1.0f, 1.0f, 1.0f, 1.0f}; - if (j == 0) + if (cardIdx == 0) { if (IsQuadHovered(quad.EData.Transform, mousePosWorld, quadPlaneIntersectPos) && DraggedAvailableCardIdx == UINT16_MAX && DraggedCard.X == -1 && GetMouseButtonPressedNow(MouseButton::Left)) { - DraggedAvailableCardIdx = i; + DraggedAvailableCardIdx = stackIdx; } - if (DraggedAvailableCardIdx == i) + if (DraggedAvailableCardIdx == stackIdx) { Vec3 dragPos = quadPlaneIntersectPos; dragPos += StaticData.ZAxis * -0.01f; @@ -180,6 +183,7 @@ namespace Game Vec3 CalcBoardOffset(const Gen::PuzzleData& puzData) { + return {}; return Vec3{ (float)(puzData.WidthTiles) / (2.0f * Puzzle::Config::CardSize), (float)(puzData.HeightTiles) / (2.0f * Puzzle::Config::CardSize), @@ -244,6 +248,15 @@ namespace Game Vec3 boardTilePos = boardPos / UICardOffset; int32_t xPos = (int32_t)bx::round(boardTilePos.x); int32_t yPos = (int32_t)bx::round(boardTilePos.y); + LOG("boardPos: %f %f %f, offset: %f %f %f, xy: %i %i", + boardPos.x, + boardPos.y, + boardPos.z, + boardOffset.x, + boardOffset.y, + boardOffset.z, + xPos, + yPos); Gen::PuzPos srcCardPos = {(int8_t)DraggedCard.X, (int8_t)DraggedCard.Y}; Gen::PlacedPuzzleCard& srcCard = Data.PlacedCards[srcCardPos.Y * Puzzle::Config::MaxPuzzleSizeCards + srcCardPos.X]; diff --git a/src/game/data/puzzles/0.pzl b/src/game/data/puzzles/0.pzl index 88b8829..37a50cc 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:8ecd11f17c4239e26afe510f994a9957182a26bd7f8b007dc11617973478ec3a +oid sha256:46c1b936610d5d90fa7138d2ed06835a2deaf41fec7f16359953560cd56aafa0 size 11416 diff --git a/src/game/data/static/uiconfig.dat b/src/game/data/static/uiconfig.dat index fdb8cdd253d090aa00368104ed5bfdb3505a1943..257ceea206db40cb22e0121383127c48289e94dd 100644 GIT binary patch delta 99 zcmaFi{oQ+l7-Qc?abHGZ5hf`HJti>*7bY2o1SUy_N+!{Xh3_|~F?lgcKVal!c*)4e z@STx~;U^;p10xeV0|yf;11}T%#KPyBH?cgBVRg$%OfQ~1OVNkjGcU6wGcjlLZAD%d E0N#xnp#T5? delta 94 zcmezF{la^K7-RiLabHGZRwgM1c_uLiQzjXPKqg6sEGE&3h3_|~F?lgcUu5KDxW&lF z@Pd(v;T0nX!zV^|hM$bA4F4F}Cl)^6you$342Ng2PkwTCYRcs4iawjaDl)ME0G4$d AIsgCw