载入中...
搜索中...
未找到
HexSerializer.cpp
浏览该文件的文档.
38constexpr std::uint32_t kKnownFlagMask = 0x3fu | (0x3fu << 6) | (0x3fu << 12) | (1u << 18) | (1u << 20) | (1u << 21);
51 if (elevation < HexMetrics::kMinElevation || elevation > HexMetrics::kMaxElevation) return false;
54 if (cell.values.terrainType() < 0 || cell.values.terrainType() >= kHexTerrainTypeCount) return false;
88void pushI32(std::vector<std::uint8_t>& out, std::int32_t value) { pushU32(out, static_cast<std::uint32_t>(value)); }
91void pushF32(std::vector<std::uint8_t>& out, float value) { pushU32(out, std::bit_cast<std::uint32_t>(value)); }
131 value |= static_cast<std::uint32_t>(data_[offset_ + index]) << (8u * static_cast<unsigned>(index));
143 value |= static_cast<std::uint64_t>(data_[offset_ + index]) << (8u * static_cast<unsigned>(index));
163Result<void> saveHexMap(const HexMap& map, const std::vector<HexUnitState>& units, std::vector<std::uint8_t>& out) {
164 if (map.empty()) return Result<void>::failure(invalidArgument("cannot serialize an empty hex map"));
168 kHeaderSize + static_cast<std::size_t>(cellCount) * kCellRecordSize + 4 + units.size() * kUnitRecordSize;
197Result<void> loadHexMap(const std::vector<std::uint8_t>& bytes, HexMap& map, std::vector<HexUnitState>& units) {
198 if (bytes.size() < kHeaderSize) return Result<void>::failure(invalidArgument("hex save payload is truncated"));
208 if (!reader.skip(kMagicSize)) return Result<void>::failure(invalidArgument("hex save payload is truncated"));
226 return Result<void>::failure(invalidArgument("hex save grid dimensions exceed the 512 cell limit"));
232 const std::size_t cellCount = static_cast<std::size_t>(cellCountX) * static_cast<std::size_t>(cellCountZ);
236 return Result<void>::failure(invalidArgument("hex save payload is truncated before the unit records"));
238 if (!reader.seek(cellsEnd)) return Result<void>::failure(invalidArgument("hex save payload is truncated"));
243 return Result<void>::failure(invalidArgument("hex save payload size does not match its contents"));
247 if (!reader.seek(kHeaderSize)) return Result<void>::failure(invalidArgument("hex save payload is truncated"));
256 if (!reader.seek(unitsStart)) return Result<void>::failure(invalidArgument("hex save payload is truncated"));
265 if (!reader.ok()) return Result<void>::failure(invalidArgument("hex save payload is truncated"));
282 auto resized = map.reset(static_cast<std::int32_t>(cellCountX), static_cast<std::int32_t>(cellCountZ), seed);
285 map.setCellState(map.coordinatesAt(static_cast<std::int32_t>(index)), cells[index].values, cells[index].flags)
Stable, structured diagnostics shared by engine modules.
Pointy-top hex metrics, directions and vertex helpers.
Versioned payload codec for a hex map and its units.
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
void ignore(std::string_view reason={}) const noexcept
Explicitly discard this result after documenting the reason.
Definition Result.h:537
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
Packed boolean cell state (roads, rivers, walls, exploration).
Definition HexCell.h:123
HexCoordinates coordinatesAt(std::int32_t index) const noexcept
Coordinates of a linear cell index; out-of-range indices return (0, 0).
Definition HexMap.cpp:69
std::uint64_t revision() const noexcept
Monotonic counter bumped by every mutation; used to detect stale meshes.
Definition HexMap.h:108
Result< void > setCellState(HexCoordinates c, HexValues values, HexFlags flags)
Writes a complete cell record verbatim.
Definition HexMap.cpp:505
Result< void > reset(std::int32_t cellCountX, std::int32_t cellCountZ, std::uint32_t seed)
Replaces the grid with a new cellCountX * cellCountZ map.
Definition HexMap.cpp:37
const HexCellData * cellAt(std::int32_t index) const noexcept
Cell record by linear index, or null when out of range. @ownership Borrowed; the map owns the record....
Definition HexMap.cpp:74
Definition HexCell.h:9
constexpr bool canHoldUnit(const HexCellData &cell) noexcept
Whether a cell record is in a state that can hold a unit.
Definition HexCell.h:261
constexpr std::uint8_t kHexSaveMagic[8]
Magic prefix of a hex map payload; ASCII EVEHEX\0\0.
Definition HexSerializer.h:17
constexpr std::int32_t kMaxHexGridDimension
Largest grid edge, in cells, any entry point may request.
Definition HexMap.h:47
constexpr std::int32_t kHexDirectionCount
Number of hex edges / facing directions.
Definition HexMetrics.h:62
constexpr std::uint32_t kHexSaveVersion
Format version written by saveHexMap.
Definition HexSerializer.h:20
Result< void > loadHexMap(const std::vector< std::uint8_t > &bytes, HexMap &map, std::vector< HexUnitState > &units)
Restores a map and its units from a payload produced by saveHexMap.
Definition HexSerializer.cpp:197
Result< void > saveHexMap(const HexMap &map, const std::vector< HexUnitState > &units, std::vector< std::uint8_t > &out)
Serializes a map and its units into a self-describing byte payload.
Definition HexSerializer.cpp:163
constexpr std::int32_t kHexTerrainTypeCount
Number of entries in the terrain palette.
Definition HexCell.h:21
Vector2 seek(Vector2 position, Vector2 target, float maxSpeed)
Returns a velocity of at most maxSpeed directed from position to target.
Definition Steering.cpp:149
@ InvalidArgument
One cell of the hex map: packed values plus packed flags.
Definition HexCell.h:244