载入中...
搜索中...
未找到
HexUnits.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
7#include "common/Result.h"
8#include "hexmap/HexSearch.h"
10
11#include <cstdint>
12#include <vector>
13
14namespace eve::hexmap {
15
19 std::int32_t speed = 24;
21 std::int32_t visionRange = 3;
23 float travelSpeed = 4.f;
25 float rotationSpeed = 180.f;
26
28 [[nodiscard]] HexMoveRules moveRules() const noexcept { return HexMoveRules{speed, visionRange}; }
29};
30
34 std::int32_t locationIndex = -1;
36 float orientation = 0.f;
37};
38
42 std::int32_t id = -1;
50 float orientation = 0.f;
52 bool traveling = false;
53};
54
70public:
72 HexUnitRegistry() = default;
73
75 [[nodiscard]] const HexUnitTuning& tuning() const noexcept { return tuning_; }
77 void setTuning(const HexUnitTuning& tuning) noexcept { tuning_ = tuning; }
78
80 [[nodiscard]] bool empty() const noexcept { return units_.empty(); }
82 [[nodiscard]] std::int32_t unitCount() const noexcept { return static_cast<std::int32_t>(units_.size()); }
83
96 [[nodiscard]] Result<std::int32_t> addUnit(HexMap& map, HexVisibility& visibility, HexSearchContext& scratch,
97 HexCoordinates location, float orientation);
98
103 [[nodiscard]] Result<void> removeUnit(HexMap& map, HexVisibility& visibility, HexSearchContext& scratch,
104 std::int32_t unitId);
105
113 void removeAll(HexMap& map, HexVisibility& visibility) noexcept;
114
116 [[nodiscard]] std::int32_t unitIdAt(HexCoordinates coordinates) const noexcept;
118 [[nodiscard]] bool isOccupied(HexCoordinates coordinates) const noexcept {
119 return unitIdAt(coordinates) >= 0;
120 }
121
126 [[nodiscard]] HexOccupancyQuery occupancyQuery() const;
127
145 [[nodiscard]] Result<void> beginTravel(HexMap& map, HexVisibility& visibility, HexSearchContext& scratch,
146 std::int32_t unitId, const std::vector<std::int32_t>& path);
147
165 [[nodiscard]] Result<HexUnitSample> advance(HexMap& map, HexVisibility& visibility, HexSearchContext& scratch,
166 std::int32_t unitId, float dt);
167
169 void advanceAll(HexMap& map, HexVisibility& visibility, HexSearchContext& scratch, float dt);
170
179 void refreshVisibility(HexMap& map, HexVisibility& visibility, HexSearchContext& scratch);
180
182 void refreshPositions(const HexMap& map) noexcept;
183
185 [[nodiscard]] std::vector<HexUnitState> snapshot() const;
186
195 [[nodiscard]] Result<void> restore(HexMap& map, HexVisibility& visibility, HexSearchContext& scratch,
196 const std::vector<HexUnitState>& states);
197
198private:
199 struct Unit {
200 std::int32_t locationIndex = -1;
201 float orientation = 0.f;
202 bool traveling = false;
204 std::vector<std::int32_t> path;
206 std::int32_t segment = 1;
208 float t = 0.f;
210 std::int32_t visionIndex = -1;
218 HexCoordinates location{};
219 };
220
229 [[nodiscard]] Unit* find(std::int32_t unitId) noexcept;
236 [[nodiscard]] const Unit* find(std::int32_t unitId) const noexcept;
237 [[nodiscard]] Result<HexUnitSample> makeSample(const HexMap& map, std::int32_t unitId, const Unit& unit) const;
238
239 HexUnitTuning tuning_{};
240 std::vector<Unit> units_;
241};
242
243} // namespace eve::hexmap
#define EVENGINE_API_WORLD
Definition Export.h:109
Cell-graph search used by pathfinding and visibility.
Reference-counted cell visibility and explored state.
std::string path
Definition PlayHost.cpp:110
float t
Move-only, checked operation results for the common layer.
TacticalUnit * unit
Move-only operation result carrying either a value or Status.
Definition Result.h:155
An editable, chunked, pointy-top hex map.
Definition HexMap.h:72
Reusable search scratch: one record per cell plus a priority bucket queue.
Definition HexSearch.h:68
Owns the units of one map and their fog-of-war contribution.
Definition HexUnits.h:69
bool empty() const noexcept
Whether no unit is registered.
Definition HexUnits.h:80
void setTuning(const HexUnitTuning &tuning) noexcept
Replaces the tuning; ongoing travel keeps its plan but uses the new speed.
Definition HexUnits.h:77
const HexUnitTuning & tuning() const noexcept
Current tuning.
Definition HexUnits.h:75
std::int32_t unitCount() const noexcept
Number of registered units.
Definition HexUnits.h:82
HexUnitRegistry()=default
Hex unit registry.
bool isOccupied(HexCoordinates coordinates) const noexcept
Whether any unit occupies a cell.
Definition HexUnits.h:118
Fog-of-war bookkeeping: how many viewers currently see each cell.
std::function< bool(HexCoordinates)> HexOccupancyQuery
Predicate answering whether a cell is already occupied by another actor.
Definition HexSearch.h:143
Axial coordinates of one hex cell.
Movement tuning of one actor; cells per turn and vision radius in cells.
Definition HexSearch.h:130
Snapshot of one unit used to drive rendering.
Definition HexUnits.h:40
HexCoordinates travelFrom
Cell the unit is currently walking away from, or (0, 0) when idle.
Definition HexUnits.h:46
HexVec3 position
Interpolated world position.
Definition HexUnits.h:48
float orientation
Interpolated facing angle in degrees.
Definition HexUnits.h:50
HexCoordinates location
Cell the unit occupies; for a travelling unit this is its destination.
Definition HexUnits.h:44
bool traveling
Whether the unit is still moving along its path.
Definition HexUnits.h:52
Serializable state of one unit.
Definition HexUnits.h:32
std::int32_t locationIndex
Linear index of the occupied cell, or -1 when the unit is not on the grid.
Definition HexUnits.h:34
float orientation
Facing angle in degrees.
Definition HexUnits.h:36
Per-unit tuning shared by every unit of a registry.
Definition HexUnits.h:17
float rotationSpeed
Turn rate in degrees per second while travelling.
Definition HexUnits.h:25
std::int32_t visionRange
Vision radius in cells, matching HexMoveRules::visionRange.
Definition HexUnits.h:21
std::int32_t speed
Movement points per turn, matching HexMoveRules::speed.
Definition HexUnits.h:19
float travelSpeed
Travel speed in path segments per second.
Definition HexUnits.h:23
HexMoveRules moveRules() const noexcept
The pathfinding rules implied by this tuning.
Definition HexUnits.h:28
Minimal 3-component float vector used by the hex mesh builders.
Definition HexMetrics.h:18