#pragma once #include "Serial.h" #include #include #include "../../gen/Generated.h" namespace Puzzle { using namespace Generated; constexpr const char* PuzzleFileDir = "game/data/puzzles/"; struct Config { static constexpr uint32_t CardSize = 2; static constexpr uint32_t NodesPerCard = CardSize * CardSize; static constexpr uint32_t MaxElementsPerTile = 4; static constexpr uint32_t MaxPuzzleSizeCards = 16; static constexpr uint32_t MaxCardsInPuzzle = MaxPuzzleSizeCards * MaxPuzzleSizeCards; static constexpr uint32_t MaxPuzzleSizeTiles = 16 * CardSize; static constexpr uint32_t MaxTilesInPuzzle = MaxPuzzleSizeTiles * MaxPuzzleSizeTiles; static constexpr uint32_t MaxAvailableStacks = 16; static constexpr uint32_t MaxGoalPositions = 16; }; void Setup(); StaticPuzzleData& GetStaticPuzzleData(); void LoadStaticPuzzleData(); void SaveStaticPuzzleData(); const StaticPuzzleCard& GetCard(StaticPuzzleCardHandle H); bool IsValid(StaticPuzzleCardHandle h); uint8_t GetRemainingCount(const PuzzleCardStack& stack); PuzzleElementType::Enum GetNodeAt(const PuzzleData& puz, PuzPos pos); PuzzleElementType::Enum GetCardNodeAt(const StaticPuzzleCard& card, uint8_t rotation, int8_t x, int8_t y); PuzzleElementType::Enum& EditCardNodeAt(StaticPuzzleCard& card, uint8_t rotation, int8_t x, int8_t y); void DrawCard(const StaticPuzzleCard& card, uint8_t rotation, ImVec2 pos); struct PuzzleSolver { bool IsPuzzleSolved(const Generated::PuzzleData& puzzle); bool IsExitSatisfied(const Generated::PuzzleData& puzzle, PuzPos pos); // This assumes flowFrom is already verified to be connected. bool IsValidGoalConnection(const Generated::PuzzleData& puzzle, PuzPos flowFrom, PuzPos flowTo, PuzzleElementType::Enum goalType); bool IsValidSource(PuzzleElementType::Enum sourceType, PuzzleElementType::Enum goalType); }; bool RenderDebugUI(PuzzleData& obj); } // namespace Puzzle namespace Generated { PuzPos operator+=(PuzPos lhs, const PuzPos& rhs); PuzPos operator+(PuzPos lhs, const PuzPos& rhs); } // namespace Generated