载入中...
搜索中...
未找到
Action.cpp
浏览该文件的文档.
16 return condition.kind() == decision::ConditionKind::All && condition.children().empty() && condition.isValid();
20 return phase == ActionPhase::Completed || phase == ActionPhase::Cancelled || phase == ActionPhase::Failed;
57 if (!id.isValid()) return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "action definition id is invalid", "id"));
59 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "action condition is invalid", "condition"));
60 if (timing.windup.nanoseconds() < 0 || timing.active.nanoseconds() < 0 || timing.recover.nanoseconds() < 0)
61 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "action phase durations must be non-negative", "timing"));
67 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "targetingSpec is only valid for Query actions", "targetingSpec"));
71 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Query actions require a targetingSpec", "targetingSpec"));
80 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "action cost must be a validated non-empty CostSpec", "cost"));
83 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "action effect ids must not be empty", "effectIds"));
89 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "action timeline id does not match its definition", "timeline.actionId"));
95 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "action timeline duration must equal windup + active + recover", "timeline.durationNs"));
104 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "action request id does not match its definition", "actionId"));
109 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "a non-targeted action cannot carry target selection", "targets"));
113 return Result<void>::failure(Diagnostic::error(DiagnosticCode::PreconditionViolation, "an Explicit action requires at least one target", "targetEntities"));
115 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Explicit actions cannot carry a targeting query", "targetingQuery"));
119 return Result<void>::failure(Diagnostic::error(DiagnosticCode::PreconditionViolation, "a Query action requires a targeting query", "targetingQuery"));
121 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Query actions cannot carry explicit targets", "targetEntities"));
131Result<sensing::TargetSet> SensingTargetingAdapter::resolve(const sensing::TargetingQuery& query) const {
138 Diagnostic::error(DiagnosticCode::InvariantViolation, "action execution id is zero", "execution.id"));
143 Diagnostic::error(DiagnosticCode::InvariantViolation, "action execution id exhausted", "execution.id"));
148Result<ActionExecutionId> ActionRuntime::submit(ActionDefinition definition, ActionRequest request) {
160 std::unique_ptr<ActionExecution> execution(new ActionExecution(id, std::move(definition), std::move(request)));
184 return Result<void>::failure(Diagnostic::error(DiagnosticCode::Unsupported, "action condition requires an evaluator", "services.conditions"));
199 return Result<void>::failure(Diagnostic::error(DiagnosticCode::Unsupported, "Query action requires a target resolver", "services.targeting"));
209 return Result<void>::failure(Diagnostic::error(DiagnosticCode::Unsupported, "action Active phase requires an effect executor", "services.effects"));
216 return Result<void>::failure(Diagnostic::error(DiagnosticCode::Unsupported, "cost-bearing action requires a resource provider", "services.resources"));
243 return Result<void>::failure(Diagnostic::error(DiagnosticCode::Unsupported, "transaction-backed action cost requires an account", "services.transactionAccount"));
245 const std::string transactionId = request.transactionId.empty() ? "action." + definition.id.format() + "." +
251 ? transaction::AtomicResourcePayment::execute(context, *services_.transactionAccount, *definition.cost,
263 return Result<void>::failure(Diagnostic::error(DiagnosticCode::Unsupported, "action Active phase requires an effect executor", "services.effects"));
265 definition, request, execution.resolvedTargets_ ? &*execution.resolvedTargets_ : nullptr, tick);
269 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvariantViolation, "effect executor returned an empty staged operation", "effects"));
276 return Result<void>::failure(Diagnostic::error(DiagnosticCode::Unsupported, "activating a cost-bearing action requires a resource provider", "services.resources"));
286 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvariantViolation, "resource provider returned an invalid reservation", "cost.reservation"));
329void ActionRuntime::transition(ActionExecution& execution, ActionPhase next, SimulationTick tick,
337 else if (next == ActionPhase::Requested || next == ActionPhase::Validating || next == ActionPhase::Windup ||
342void ActionRuntime::failExecution(ActionExecution& execution, Status status, SimulationTick tick,
354Result<ActionAdvance> ActionRuntime::advance(ActionExecutionId id, SimulationTick tick, Duration delta) {
358 return Result<ActionAdvance>::failure(invalidStatus("action advance duration must be non-negative", "delta"));
360 return Result<ActionAdvance>::failure(invalidStatus("action simulation tick moved backwards", "tick"));
365 ActionAdvance result{id, execution->phase_, {}, execution->phaseElapsed_, execution->totalElapsed_};
479 auto sampled = execution->definition_.timeline->sample(timelinePrevious, execution->totalElapsed_,
520 Diagnostic::error(DiagnosticCode::Conflict, "completed action execution cannot be cancelled", "action")));
522 if (execution->phase_ == ActionPhase::Cancelled) return Result<void>::success(Status::success(StatusCode::NoOp));
Renderer- and ruleset-neutral gameplay action pipeline.
Small transaction facade for a resource cost plus one domain effect.
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
constexpr std::int64_t nanoseconds() const noexcept
Return the exact signed nanosecond representation.
Definition Time.h:69
Result< Duration > tryAdd(Duration other) const
Add two durations with overflow validation.
Definition Time.cpp:30
static constexpr Duration fromNanoseconds(std::int64_t nanoseconds) noexcept
Construct an exact duration from nanoseconds.
Definition Time.h:55
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
static Status failure(StatusCode code, Diagnostic diagnostic)
Construct a failed status with one diagnostic.
Definition Status.h:84
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
Type kind() const noexcept
Compatibility spelling for the former dialogue data tree.
Definition Value.h:85
Read-only view of one execution owned by ActionRuntime.
Definition Action.h:390
Result< ActionAdvance > advance(ActionExecutionId id, SimulationTick tick, Duration delta)
Advance one execution by an injected simulation duration.
Definition Action.cpp:354
Result< void > cancel(ActionExecutionId id, SimulationTick tick)
Cancel a non-terminal execution before its Active transaction.
Definition Action.cpp:514
void clear() noexcept
Discard every retained execution and restart deterministic local ids at one.
Definition Action.cpp:531
const ActionExecution * find(ActionExecutionId id) const noexcept
Find a borrowed read-only execution view, or null when absent.
Definition Action.cpp:168
Result< ActionExecutionId > submit(ActionDefinition definition, ActionRequest request)
Submit a validated definition/request pair in Requested phase.
Definition Action.cpp:148
virtual Result< decision::ConditionResult > evaluate(const ActionDefinition &definition, const ActionRequest &request) const =0
Evaluate one action condition.
virtual Result< std::unique_ptr< IActionEffectOperation > > prepare(const ActionDefinition &definition, const ActionRequest &request, const sensing::TargetSet *targets, SimulationTick tick)=0
Prepare the active operation once without applying its effect.
virtual Result< resource::Receipt > commit(const resource::Reservation &reservation)=0
Commit a reservation by its account nonce.
virtual Result< resource::Reservation > reserve(const ActionDefinition &definition, const ActionRequest &request, const resource::CostSpec &cost)=0
Reserve a cost at the Active boundary.
virtual Result< void > rollback(const resource::Reservation &reservation)=0
Roll back a reservation by its account nonce.
virtual Result< resource::Affordability > canAfford(const ActionDefinition &definition, const ActionRequest &request, const resource::CostSpec &cost) const =0
Query affordability without reserving or mutating an account.
virtual Result< sensing::TargetSet > resolve(const sensing::TargetingQuery &query) const =0
Resolve a validated targeting query.
Result< sensing::TargetSet > resolve(const sensing::TargetingQuery &query) const override
Resolve a validated targeting query.
Definition Action.cpp:131
bool isValid() const noexcept
Return whether the factory invariants for this node hold.
Definition Condition.cpp:207
constexpr std::optional< StrongUint64 > incremented() const noexcept
Returns the next value, or empty instead of unsigned wraparound.
Definition StrongUint64.h:30
constexpr bool isZero() const noexcept
Returns whether this value is zero.
Definition StrongUint64.h:28
virtual eve::Result< Affordability > canAfford(const CostSpec &cost) const =0
Query whether a cost can be paid from currently available funds.
Result< TargetSet > resolve(const TargetingQuery &query) const
Resolves a constrained candidate set through registered capabilities.
Definition Targeting.cpp:486
static eve::Result< TransactionReceipt > execute(const TransactionContext &context, std::span< ITransactionParticipant * > participants)
Execute already prepared domain participants as one transaction.
Definition AtomicResourcePayment.cpp:13
Definition AbilityAsset.cpp:9
const char * actionPhaseName(ActionPhase phase) noexcept
Return the stable lowercase spelling of an action phase.
Definition Action.cpp:42
@ Completed
@ Windup
@ Active
@ Recover
@ Cancelled
@ Validating
@ Failed
@ Requested
@ Query
The request supplies a sensing query resolved during validation.
@ Explicit
The request already owns the selected ECS target handles.
const char * conditionReasonCodeName(ConditionReasonCode code) noexcept
Return the stable lowercase spelling of a condition reason code. @ownership Borrowed process-static t...
Definition Condition.cpp:82
constexpr HexDirection next(HexDirection d) noexcept
The next direction clockwise (NW wraps to NE).
Definition HexMetrics.h:76
std::vector< RuntimeTensor > execute(const Node &n, const std::vector< const RuntimeTensor * > &in, OnnxCompute *compute)
Execute.
Definition OnnxExecute.cpp:207
std::vector< DiagnosticDetail > DiagnosticDetails
Owning collection of diagnostic details with stable insertion order.
Definition Diagnostic.h:88
@ InvalidArgument
@ NotFound
@ PreconditionViolation
@ Cancelled
@ Unsupported
@ InvariantViolation
@ Failed
@ Conflict
@ Pending
@ NotFound
@ NoOp
@ Applied
@ Cancelled
@ Rejected
@ Failed
@ Conflict
detail::StrongUint64< detail::SimulationTickTag > SimulationTick
Deterministic simulation time step; it is not wall-clock time.
Definition Time.h:31
Immutable-by-convention definition of one action kind.
Definition Action.h:90
std::vector< std::string > effectIds
Stable effect-definition ids interpreted by the active executor.
Definition Action.h:104
std::optional< ActionTimeline > timeline
Optional versioned choreography authored by the action editor.
Definition Action.h:110
std::optional< resource::CostSpec > cost
Optional canonical cost reserved and committed by the pipeline.
Definition Action.h:102
Result< void > validate() const
Validate definition invariants without changing the definition.
Definition Action.cpp:56
std::optional< sensing::TargetingSpec > targetingSpec
Constraints used when targetingMode is Query.
Definition Action.h:100
One caller-owned request to instantiate an action execution.
Definition Action.h:127
Result< void > validate(const ActionDefinition &definition) const
Validate request/definition correspondence without side effects.
Definition Action.cpp:100
std::optional< sensing::TargetingQuery > targetingQuery
Query input, used only when the definition selects Query.
Definition Action.h:135
std::vector< ecs::EntityHandle > targetEntities
Explicit targets, used only when the definition selects Explicit.
Definition Action.h:133
IActionEffectExecutor * effects
Optional active executor; required by effects/active operations.
Definition Action.h:359
IActionTargetResolver * targeting
Optional query resolver; required by Query actions.
Definition Action.h:355
IActionResourceProvider * resources
Optional account provider; required by cost-bearing actions.
Definition Action.h:357
transaction::ITransactionParticipant * transactionEffect
Optional common transaction effect participant.
Definition Action.h:367
resource::IResourceAccount * transactionAccount
Account paired with transactionEffect for a cost-bearing action.
Definition Action.h:369
IActionConditionEvaluator * conditions
Optional precondition evaluator; empty is valid for an empty Condition.
Definition Action.h:353
A query passed from a domain targeting algorithm to sensing.
Definition Targeting.h:350