载入中...
搜索中...
未找到
RTSFormation.cpp
浏览该文件的文档.
18 Diagnostic::error(DiagnosticCode::InvalidArgument, "formation rotation must be finite", "rotationRadians"));
21 Diagnostic::error(DiagnosticCode::InvalidArgument, "formation columns must be non-negative", "columns"));
33Result<std::vector<WorldPosition>> FormationPlanner::plan(std::size_t count, WorldPosition anchor,
39 Diagnostic::error(DiagnosticCode::InvalidArgument, "formation anchor must be finite", "anchor"));
44 return Result<std::vector<WorldPosition>>::success(std::move(result), Status::success(StatusCode::NoOp));
115 point = {static_cast<float>(anchor.x + c * x - s * y), static_cast<float>(anchor.y + s * x + c * y)};
118 if (std::any_of(result.begin(), result.end(), [](WorldPosition point) { return !isFinitePosition(point); }))
121 return Result<std::vector<WorldPosition>>::success(std::move(result), Status::success(StatusCode::Applied));
124Result<FanOutReceipt> CommandFanOutSystem::fanOut(std::span<const ecs::EntityHandle> unitHandles,
128 DiagnosticCode::InvalidArgument, "RTS command fan-out requires at least one Unit", "selection.units"));
160 const bool inView = std::any_of(visibleUnits.begin(), visibleUnits.end(), [&liveHandle](const auto& candidate) {
169 DiagnosticCode::InvalidArgument, "Formation selection contains duplicate units", "selection.units"));
171 if (!std::isfinite(radius) || radius <= 0.f || !isFinitePosition({unit->motion()->x, unit->motion()->y}))
184 if (selected.size() > 1) resolved.spacing = std::max(resolved.spacing, largestRadius + secondRadius);
188 if (std::any_of(plannedTargets.begin(), plannedTargets.end(), [](WorldPosition p) { return !isFinitePosition(p); }))
202 std::sort(assignmentOrder.begin(), assignmentOrder.end(), [&](std::size_t left, std::size_t right) {
205 const float leftDistance = distanceSquared(leftMotion->x, leftMotion->y, command.target.x, command.target.y);
206 const float rightDistance = distanceSquared(rightMotion->x, rightMotion->y, command.target.x, command.target.y);
213 auto best = std::min_element(available.begin(), available.end(), [&](const auto& left, const auto& right) {
214 const float leftDistance = distanceSquared(motion->x, motion->y, left.position.x, left.position.y);
215 const float rightDistance = distanceSquared(motion->x, motion->y, right.position.x, right.position.y);
228 return std::hypot(static_cast<double>(motion->x) - target.x, static_cast<double>(motion->y) - target.y);
264 auto order = assigned.append ? selected[index]->orders()->values.enqueue(assigned, assignedSlots[index].index)
279 return Result<FanOutReceipt>::success(std::move(receipt), Status::success(StatusCode::Applied));
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
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
static Result< std::vector< WorldPosition > > plan(std::size_t count, WorldPosition anchor, const FormationSpec &spec)
Plan positions around an anchor for a fixed unit count.
Definition RTSFormation.cpp:33
float distanceSquared(float ax, float ay, float bx, float by)
Definition RTSSystemMovementInternal.h:23
bool isSameHandle(const ecs::EntityHandle &left, const ecs::EntityHandle &right)
Definition RTSSystemMovementInternal.h:17
bool isFinitePosition(WorldPosition position)
Definition RTSSystemMovementInternal.h:15
Definition RTS.cpp:24
@ Column
@ Dispersed
@ InvalidArgument
@ InvariantViolation
@ StaleHandle
@ NoOp
@ Applied
One domain-neutral command submitted to a unit's generic order queue.
Definition RTSTypes.h:101
Result< void > validate() const
Validate coordinates and command metadata without mutating state.
Definition RTSTypes.cpp:201
Receipt containing all order ids accepted by command fan-out.
Definition RTSSystems.h:202
EVENGINE_API_DOMAINS Result< void > validate() const
Validate layout kind, spacing, grid columns and finite rotation.
Definition RTSFormation.cpp:12
float rotationRadians
Counterclockwise rotation around the anchor; zero preserves legacy layouts.
Definition RTSSystems.h:38