载入中...
搜索中...
未找到
CombatMotionWarp.cpp
浏览该文件的文档.
2
3#include <cmath>
4
5namespace eve::combat {
6namespace {
7
8bool finite3(CombatVector3 value) { return std::isfinite(value.x) && std::isfinite(value.y) && std::isfinite(value.z); }
9
10double lengthXZ(CombatVector3 value) { return std::hypot(value.x, value.z); }
11
12CombatVector3 normalizedXZ(CombatVector3 value) {
13 const double magnitude = lengthXZ(value);
14 if (magnitude <= 0.0) return {};
15 return {value.x / magnitude, 0.0, value.z / magnitude};
16}
17
18} // namespace
19
21 if (!finite3(attacker) || !finite3(target) || !finite3(attackerFacing))
23 Diagnostic::error(DiagnosticCode::InvalidArgument, "warp poses are invalid", "pose"));
24 if (!std::isfinite(desiredDistance) || desiredDistance < 0.0)
26 Diagnostic::error(DiagnosticCode::InvalidArgument, "desired warp distance is invalid", "desiredDistance"));
27 if (!std::isfinite(maxTranslation) || maxTranslation < 0.0)
29 Diagnostic::error(DiagnosticCode::InvalidArgument, "max warp translation is invalid", "maxTranslation"));
30 if (!std::isfinite(remainingBudget) || remainingBudget < 0.0)
32 Diagnostic::error(DiagnosticCode::InvalidArgument, "warp budget is invalid", "remainingBudget"));
33 return Result<void>::success();
34}
35
37 auto valid = request.validate();
38 if (!valid) return Result<CombatWarpResult>::failure(valid.status());
39
40 CombatWarpResult result;
41 result.facing = request.attackerFacing;
42 CombatVector3 delta{request.target.x - request.attacker.x, 0.0, request.target.z - request.attacker.z};
43 const double distance = lengthXZ(delta);
44 if (request.facing && distance > 0.0) result.facing = normalizedXZ(delta);
45 if (!request.horizontal || distance <= 0.0)
47
48 const double error = distance - request.desiredDistance;
49 if (std::abs(error) <= 1e-6) return Result<CombatWarpResult>::success(result, Status::success(StatusCode::NoOp));
50
51 CombatVector3 direction = normalizedXZ(delta);
52 if (error < 0.0) direction = {-direction.x, 0.0, -direction.z};
53 double step = std::min(std::abs(error), request.maxTranslation);
54 if (step > request.remainingBudget) {
55 result.budgetExceeded = true;
57 Diagnostic::error(DiagnosticCode::Conflict, "motion warp would exceed remaining budget", "budget"));
58 }
59 result.translation = {direction.x * step, 0.0, direction.z * step};
60 result.budgetConsumed = step;
62}
63
64} // namespace eve::combat
double value
Bounded attack translation/facing correction toward a lock target.
const GltfImportRequest & request
bool valid
float distance
std::string error
Definition Package.cpp:60
RoadLaneDirection direction
float step
Definition TreeMesh.cpp:314
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
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result success(T value)
Construct a successful result owning value.
Definition Result.h:164
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< CombatWarpResult > solve(const CombatWarpRequest &request)
Solve one warp step from owning request data.
Finite 3D combat vector.
Input for one deterministic motion-warp solve.
Result< void > validate() const
Reject non-finite poses, distances or budgets.
Owning warp delta that callers add to root motion or position.