载入中...
搜索中...
未找到
RTSSystemMovementInternal.h
浏览该文件的文档.
1#pragma once
2
3// Private shared movement helpers; no independent state or provider lookup.
4#include <cmath>
5#include <optional>
6#include "rts/RTSSystems.h"
7
9
10// Conservative swept-radius query against the canonical navigation grid.
11// Oversized/invalid queries return false and retain ordinary path steering.
12EVENGINE_API_DOMAINS bool isFormationSegmentClear(const map::Pathfinder& pathfinder, const NavigationGrid& grid,
13 WorldPosition from, WorldPosition to, float radius);
14
15inline bool isFinitePosition(WorldPosition position) { return std::isfinite(position.x) && std::isfinite(position.y); }
16
17inline bool isSameHandle(const ecs::EntityHandle& left, const ecs::EntityHandle& right) {
18 return left.table == right.table && left.type == right.type && left.id == right.id &&
19 left.generation == right.generation;
20}
21
22
23inline float distanceSquared(float ax, float ay, float bx, float by) {
24 const float dx = ax - bx;
25 const float dy = ay - by;
26 return dx * dx + dy * dy;
27}
28
30 switch (kind) {
31 case OrderKind::Move:
43 case OrderKind::SupplyRelay: return true;
44 default: return false;
45 }
46}
47
48inline std::optional<WorldPosition> entityPosition(const ecs::EntityHandle& handle) {
49 if (auto* unit = dynamic_cast<Unit*>(ecs::try_get(handle)))
50 return WorldPosition{unit->motion()->x, unit->motion()->y};
51 if (auto* building = dynamic_cast<Building*>(ecs::try_get(handle)))
52 return WorldPosition{building->placement()->worldX, building->placement()->worldY};
53 return std::nullopt;
54}
55
57 auto current = orders.current();
58 if (current) return Result<std::optional<OrderRecord>>::success(std::move(current).takeValue());
59 if (current.code() == StatusCode::NotFound) {
60 current.ignore("RTS entity has no active order");
62 }
63 return Result<std::optional<OrderRecord>>::failure(current.status());
64}
65
66} // namespace eve::rts::systems_internal
std::string from
int ax
Definition CaveMesh.cpp:113
int ay
Definition CaveMesh.cpp:113
int bx
Definition CaveMesh.cpp:114
int by
Definition CaveMesh.cpp:114
#define EVENGINE_API_DOMAINS
Definition Export.h:110
HexVec3 left
HexVec3 right
HexCoordinates to
Cell the unit walks towards on this segment.
Definition HexUnits.cpp:64
TokenKind kind
std::array< float, 3 > position
float radius
PrimitiveHandle handle
Deterministic phase-one RTS systems and their ECS contracts.
double current
float dy
float dx
TacticalUnit * unit
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
RTS building domain root with placement and production composition.
Definition RTSTypes.h:840
Generic orders component adapter; the queue remains the sole order owner.
Definition RTSTypes.h:385
Result< OrderRecord > current() const
Project the active order or return NotFound when idle.
Definition RTSTypes.cpp:419
RTS unit domain root.
Definition RTSTypes.h:495
float distanceSquared(float ax, float ay, float bx, float by)
Result< std::optional< OrderRecord > > readCurrent(OrderComponent &orders)
bool isSameHandle(const ecs::EntityHandle &left, const ecs::EntityHandle &right)
std::optional< WorldPosition > entityPosition(const ecs::EntityHandle &handle)
bool isFinitePosition(WorldPosition position)
EVENGINE_API_DOMAINS bool isFormationSegmentClear(const map::Pathfinder &pathfinder, const NavigationGrid &grid, WorldPosition from, WorldPosition to, float radius)
OrderKind
Commands shared by movement, combat, construction and gathering.
Definition RTSTypes.h:64
Two-dimensional deterministic RTS world position.
Definition RTSTypes.h:48