#pragma once class PuzzleSerializer { public: PuzzleSerializer(const std::shared_ptr& memory); Puzzle ReadPuzzle(int id); void WritePuzzle(const Puzzle& p, int id); private: // @Bug: Blue and orange are swapped? enum Flags { IS_ENDPOINT = 0x1, IS_STARTPOINT = 0x2, HAS_NO_CONN = 0x8, HAS_DOT = 0x20, DOT_IS_BLUE = 0x100, DOT_IS_ORANGE = 0x200, DOT_IS_INVISIBLE = 0x1000, HAS_ONE_CONN = 0x100000, HAS_VERTI_CONN = 0x200000, HAS_HORIZ_CONN = 0x400000, }; void ReadIntersections(Puzzle& p); void ReadExtras(Puzzle& p); void ReadDecorations(Puzzle& p, int id); void ReadSequence(Puzzle& p, int id); void ReadSymmetry(Puzzle& p, int id); void WriteIntersections(const Puzzle& p); void WriteDots(const Puzzle& p); void WriteGaps(const Puzzle& p); void WriteEndpoints(const Puzzle& p); void WriteDecorations(const Puzzle& p, int id); void WriteSequence(const Puzzle& p, int id); void WriteSymmetry(const Puzzle& p, int id); std::tuple loc_to_xy(const Puzzle& p, int location) const; int xy_to_loc(const Puzzle& p, int x, int y) const; int extra_xy_to_loc(const Puzzle& p, int x, int y) const; // Decoration location std::tuple dloc_to_xy(const Puzzle& p, int location) const; int xy_to_dloc(const Puzzle& p, int x, int y) const; // Grid coordinates std::tuple xy_to_pos(const Puzzle& p, int x, int y) const; Cell::Dot FlagsToDot(int flags) const; // Iterate connection lists for another location which is connected to us; return that other location. int FindConnection(int location) const; void AddIntersection(const Puzzle& p, int x, int y, float xPos, float yPos, int flags); std::shared_ptr _memory; int _numGridLocations; int _numIntersections; std::vector _intersectionFlags; std::vector _connectionsA; std::vector _connectionsB; std::vector _intersectionLocations; // Locations of non-grid points, i.e. dots, gaps, and endpoints std::unordered_map _extraLocations; float MIN, MAX, INTERVAL; int X_OFF, Y_OFF; };