载入中...
搜索中...
未找到
Action.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
19#include "common/ECS.h"
20#include "common/Identity.h"
22#include "common/Result.h"
23#include "common/StrongUint64.h"
24#include "common/Time.h"
25#include "common/Value.h"
26#include "decision/Condition.h"
27#include "sensing/Targeting.h"
29
30#include <cstdint>
31#include <map>
32#include <memory>
33#include <optional>
34#include <string>
35#include <vector>
36
37namespace eve::action {
38
40enum class ActionPhase : std::uint8_t {
43 Windup,
44 Active,
45 Recover,
48 Failed,
49};
50
56[[nodiscard]] EVENGINE_API_PLATFORM const char* actionPhaseName(ActionPhase phase) noexcept;
57
59enum class TargetingMode : std::uint8_t {
61 None,
65 Query,
66};
67
82
98 TargetingMode targetingMode = TargetingMode::None;
100 std::optional<sensing::TargetingSpec> targetingSpec;
102 std::optional<resource::CostSpec> cost;
104 std::vector<std::string> effectIds;
106 bool activeExecutionRequired = false;
110 std::optional<ActionTimeline> timeline;
111
116 [[nodiscard]] Result<void> validate() const;
117};
118
131 std::optional<ecs::EntityHandle> source;
133 std::vector<ecs::EntityHandle> targetEntities;
135 std::optional<sensing::TargetingQuery> targetingQuery;
143 std::string transactionId;
145 SimulationTick requestedTick = SimulationTick::zero();
146
152 [[nodiscard]] Result<void> validate(const ActionDefinition& definition) const;
153};
154
158
168
181 std::vector<ActionTransition> transitions;
187 std::vector<ActionTimelineEvent> timelineEvents;
189 std::vector<ActionActiveBlock> activeBlocks;
190};
191
201public:
203 virtual ~IActionConditionEvaluator() = default;
204
209 [[nodiscard]] virtual Result<decision::ConditionResult> evaluate(const ActionDefinition& definition,
210 const ActionRequest& request) const = 0;
211};
212
220public:
222 virtual ~IActionTargetResolver() = default;
223
228 [[nodiscard]] virtual Result<sensing::TargetSet> resolve(const sensing::TargetingQuery& query) const = 0;
229};
230
240public:
242 virtual ~IActionResourceProvider() = default;
243
251 [[nodiscard]] virtual Result<resource::Affordability> canAfford(const ActionDefinition& definition,
252 const ActionRequest& request,
253 const resource::CostSpec& cost) const = 0;
254
266 [[nodiscard]] virtual Result<resource::Reservation> reserve(const ActionDefinition& definition,
267 const ActionRequest& request,
268 const resource::CostSpec& cost) = 0;
269
279 [[nodiscard]] virtual Result<resource::Receipt> commit(const resource::Reservation& reservation) = 0;
280
290 [[nodiscard]] virtual Result<void> rollback(const resource::Reservation& reservation) = 0;
291};
292
302public:
304 virtual ~IActionEffectOperation() = default;
305
310
312 virtual void commit() noexcept = 0;
314 virtual void rollback() noexcept = 0;
315
316protected:
319};
320
332public:
334 virtual ~IActionEffectExecutor() = default;
335
345 const ActionRequest& request,
346 const sensing::TargetSet* targets,
347 SimulationTick tick) = 0;
348};
349
353 IActionConditionEvaluator* conditions = nullptr;
355 IActionTargetResolver* targeting = nullptr;
359 IActionEffectExecutor* effects = nullptr;
367 transaction::ITransactionParticipant* transactionEffect = nullptr;
369 resource::IResourceAccount* transactionAccount = nullptr;
370};
371
380class ActionRuntime;
381
391public:
393 [[nodiscard]] ActionExecutionId id() const noexcept { return id_; }
395 [[nodiscard]] const LogicalId& definitionId() const noexcept { return definition_.id; }
397 [[nodiscard]] const ActionDefinition& definition() const noexcept { return definition_; }
399 [[nodiscard]] const ActionRequest& request() const noexcept { return request_; }
401 [[nodiscard]] ActionPhase phase() const noexcept { return phase_; }
403 [[nodiscard]] Duration phaseElapsed() const noexcept { return phaseElapsed_; }
405 [[nodiscard]] Duration totalElapsed() const noexcept { return totalElapsed_; }
407 [[nodiscard]] SimulationTick lastTick() const noexcept { return lastTick_; }
409 [[nodiscard]] const Status& status() const noexcept { return status_; }
417 [[nodiscard]] const sensing::TargetSet* resolvedTargets() const noexcept {
418 return resolvedTargets_ ? &*resolvedTargets_ : nullptr;
419 }
421 [[nodiscard]] bool hasCommittedCost() const noexcept { return receipt_.has_value(); }
423 [[nodiscard]] bool activeExecuted() const noexcept { return activeExecuted_; }
430 [[nodiscard]] const transaction::TransactionReceipt* transactionReceipt() const noexcept {
431 return transactionReceipt_ ? &*transactionReceipt_ : nullptr;
432 }
433
434private:
435 friend class ActionRuntime;
436
438 : id_(id),
439 definition_(std::move(definition)),
440 request_(std::move(request)),
441 lastTick_(request_.requestedTick),
442 status_(Status::success(StatusCode::Pending)) {}
443
445 ActionDefinition definition_;
446 ActionRequest request_;
447 ActionPhase phase_ = ActionPhase::Requested;
448 Duration phaseElapsed_ = Duration::zero();
449 Duration totalElapsed_ = Duration::zero();
450 SimulationTick lastTick_ = SimulationTick::zero();
451 Status status_;
452 std::optional<sensing::TargetSet> resolvedTargets_;
453 std::optional<resource::Receipt> receipt_;
454 std::optional<transaction::TransactionReceipt> transactionReceipt_;
455 bool activeExecuted_ = false;
456 bool timelineStarted_ = false;
457};
458
466public:
469
472 [[nodiscard]] Result<sensing::TargetSet> resolve(const sensing::TargetingQuery& query) const override;
473
474private:
476};
477
486public:
493 explicit ActionRuntime(ActionServices services = {}) : services_(services) {}
494
495 ActionRuntime(const ActionRuntime&) = delete;
500 ~ActionRuntime() = default;
501
510
519 [[nodiscard]] Result<ActionAdvance> advance(ActionExecutionId id, SimulationTick tick, Duration delta);
520
529 [[nodiscard]] Result<void> cancel(ActionExecutionId id, SimulationTick tick);
530
537 [[nodiscard]] const ActionExecution* find(ActionExecutionId id) const noexcept;
544 [[nodiscard]] ActionExecution* find(ActionExecutionId id) noexcept;
546 [[nodiscard]] std::size_t executionCount() const noexcept { return executions_.size(); }
548 void clear() noexcept;
549
550private:
551 using ExecutionStore = std::map<ActionExecutionId, std::unique_ptr<ActionExecution>>;
552
553 [[nodiscard]] Result<void> validateExecution(ActionExecution& execution);
554 [[nodiscard]] Result<void> enterActive(ActionExecution& execution, SimulationTick tick);
555 [[nodiscard]] Result<void> addElapsed(ActionExecution& execution, Duration amount);
556 void transition(ActionExecution& execution, ActionPhase next, SimulationTick tick,
557 std::vector<ActionTransition>& transitions);
558 void failExecution(ActionExecution& execution, Status status, SimulationTick tick,
559 std::vector<ActionTransition>* transitions = nullptr);
560 [[nodiscard]] Result<ActionExecutionId> nextExecutionId();
561
562 ActionServices services_;
563 ExecutionStore executions_;
564 ActionExecutionId nextId_{1};
565};
566
567} // namespace eve::action
Versioned, deterministic authoring timeline for gameplay actions.
float phase
Definition CaveMesh.cpp:58
Pure, explainable condition trees shared by gameplay domains.
eve::resource::CostSpec cost
#define EVENGINE_API_PLATFORM
Definition Export.h:107
const GltfImportRequest & request
wgpu::PopErrorScopeStatus status
Strong identity values shared by persistence, content and logical-name APIs.
std::vector< std::weak_ptr< DeviceBytes > > resources
Definition OnnxGpgpu.cpp:55
std::string id
Definition PlayHost.cpp:108
Strongly typed, transaction-friendly resource cost protocol.
Move-only, checked operation results for the common layer.
Internal storage primitive for domain-owned unsigned values.
LogicalId definition
SimulationTick tick
Coordinate-safe targeting protocol shared by sensing and gameplay adapters.
Common time values and an injectable deterministic simulation clock.
Owning, renderer-independent dynamic values.
Signed, fixed-resolution simulation duration in nanoseconds.
Definition Time.h:43
static constexpr Duration zero() noexcept
Return zero duration.
Definition Time.h:60
Human-readable, scoped identifier in the form namespace:name.
Definition Identity.h:411
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Structured status and zero or more diagnostics for an operation.
Definition Status.h:68
std::map< std::string, Value > Object
Definition Value.h:34
Read-only view of one execution owned by ActionRuntime.
Definition Action.h:390
const sensing::TargetSet * resolvedTargets() const noexcept
Resolved targets, or null until a Query action is validated.
Definition Action.h:417
bool hasCommittedCost() const noexcept
Whether Active committed a resource debit.
Definition Action.h:421
SimulationTick lastTick() const noexcept
Last simulation tick observed by the execution.
Definition Action.h:407
ActionPhase phase() const noexcept
Current lifecycle phase.
Definition Action.h:401
const ActionDefinition & definition() const noexcept
Original definition owned by this execution.
Definition Action.h:397
bool activeExecuted() const noexcept
Whether the Active transaction has committed successfully.
Definition Action.h:423
const Status & status() const noexcept
Current structured execution status.
Definition Action.h:409
ActionExecutionId id() const noexcept
Runtime identity.
Definition Action.h:393
Duration totalElapsed() const noexcept
Total injected simulation duration consumed.
Definition Action.h:405
const ActionRequest & request() const noexcept
Original request owned by this execution.
Definition Action.h:399
Duration phaseElapsed() const noexcept
Time spent in the current phase.
Definition Action.h:403
const LogicalId & definitionId() const noexcept
Definition identity copied at submission time.
Definition Action.h:395
const transaction::TransactionReceipt * transactionReceipt() const noexcept
Return the common transaction receipt produced at Active.
Definition Action.h:430
Deterministic action lifecycle coordinator.
Definition Action.h:485
~ActionRuntime()=default
Action runtime.
ActionRuntime(ActionServices services={})
Bind borrowed composition ports to this owner-thread runtime.
Definition Action.h:493
ActionRuntime(ActionRuntime &&)=delete
ActionRuntime(const ActionRuntime &)=delete
std::size_t executionCount() const noexcept
Number of executions retained by this runtime.
Definition Action.h:546
ActionRuntime & operator=(const ActionRuntime &)=delete
ActionRuntime & operator=(ActionRuntime &&)=delete
Read-only condition composition port.
Definition Action.h:200
virtual ~IActionConditionEvaluator()=default
Releases IActionConditionEvaluator resources.
virtual Result< decision::ConditionResult > evaluate(const ActionDefinition &definition, const ActionRequest &request) const =0
Evaluate one action condition.
Active-phase effect/operation preparation port.
Definition Action.h:331
virtual ~IActionEffectExecutor()=default
Releases IActionEffectExecutor resources.
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.
Move-only staged Active operation.
Definition Action.h:301
IActionEffectOperation(const IActionEffectOperation &)=delete
virtual void commit() noexcept=0
Apply the prepared operation; must not fail or throw.
IActionEffectOperation & operator=(IActionEffectOperation &&)=delete
virtual void rollback() noexcept=0
Release/compensate the prepared operation; must not fail or throw.
IActionEffectOperation(IActionEffectOperation &&)=delete
virtual ~IActionEffectOperation()=default
Releases IActionEffectOperation resources.
IActionEffectOperation & operator=(const IActionEffectOperation &)=delete
Resource-account lookup port for canonical CostSpec operations.
Definition Action.h:239
virtual ~IActionResourceProvider()=default
Releases IActionResourceProvider resources.
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.
Targeting composition port.
Definition Action.h:219
virtual Result< sensing::TargetSet > resolve(const sensing::TargetingQuery &query) const =0
Resolve a validated targeting query.
virtual ~IActionTargetResolver()=default
Releases IActionTargetResolver resources.
Reusable adapter from the sensing TargetingResolver to ActionRuntime.
Definition Action.h:465
SensingTargetingAdapter()=default
Construct an adapter with no retained query or target state.
Immutable condition AST node.
Definition Condition.h:195
static constexpr StrongUint64 zero() noexcept
Returns the zero value for this strong type.
Immutable canonical multi-resource cost.
Provider-neutral resource account contract.
Owning target result containing primary-independent subjects and optional geometry.
Definition Targeting.h:384
Generic constraint evaluator that composes candidate and LOS capabilities.
Definition Targeting.h:543
Synchronous participant contract for one coordinator transaction.
const char * actionPhaseName(ActionPhase phase) noexcept
Return the stable lowercase spelling of an action phase.
Definition Action.cpp:42
ActionPhase
Lifecycle phase shared by every gameplay action adapter.
Definition Action.h:40
TargetingMode
Selects how an action obtains its target set.
Definition Action.h:59
@ Query
The request supplies a sensing query resolved during validation.
@ None
The action has no target selection.
@ Explicit
The request already owns the selected ECS target handles.
StatusCode
Stable outcome category for an operation.
Definition Status.h:27
Result payload for one deterministic advance call.
Definition Action.h:175
ActionPhase phase
Current phase after all transitions in this call.
Definition Action.h:179
Duration phaseElapsed
Current time spent in the phase.
Definition Action.h:183
std::vector< ActionTransition > transitions
Phase changes in deterministic order.
Definition Action.h:181
Duration totalElapsed
Total simulation duration consumed by the execution.
Definition Action.h:185
std::vector< ActionTimelineEvent > timelineEvents
Owning timeline boundaries crossed by this advance.
Definition Action.h:187
std::vector< ActionActiveBlock > activeBlocks
Owning samples of timeline states active after this advance.
Definition Action.h:189
ActionExecutionId id
Execution advanced by this call.
Definition Action.h:177
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
decision::Condition condition
Side-effect-free precondition tree.
Definition Action.h:96
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
ActionTiming timing
Timed phase policy in simulation durations.
Definition Action.h:94
LogicalId id
Scoped logical definition identity, not a runtime execution id.
Definition Action.h:92
Value::Object metadata
Deterministic extension data owned by this definition.
Definition Action.h:108
std::optional< sensing::TargetingSpec > targetingSpec
Constraints used when targetingMode is Query.
Definition Action.h:100
Opaque runtime identity for one ActionExecution.
Definition Action.h:156
One caller-owned request to instantiate an action execution.
Definition Action.h:127
Value::Object parameters
Adapter-owned deterministic parameters copied into the execution.
Definition Action.h:137
LogicalId actionId
Definition identity this request intends to execute.
Definition Action.h:129
std::optional< sensing::TargetingQuery > targetingQuery
Query input, used only when the definition selects Query.
Definition Action.h:135
std::string transactionId
Optional caller-supplied transaction correlation identifier.
Definition Action.h:143
std::vector< ecs::EntityHandle > targetEntities
Explicit targets, used only when the definition selects Explicit.
Definition Action.h:133
std::optional< ecs::EntityHandle > source
Optional source ECS identity; the action core does not interpret its type.
Definition Action.h:131
Borrowed composition ports used by one ActionRuntime owner.
Definition Action.h:351
Deterministic simulation durations for the three timed action phases.
Definition Action.h:74
Duration recover
Time spent in Recover before completion.
Definition Action.h:80
Duration active
Time for which the Active result remains in progress.
Definition Action.h:78
Duration windup
Time spent in Windup before Active.
Definition Action.h:76
One phase change observed while advancing an action.
Definition Action.h:160
SimulationTick tick
Injected simulation tick at which the transition was applied.
Definition Action.h:166
ActionPhase from
Phase before the transition.
Definition Action.h:162
ActionPhase to
Phase after the transition.
Definition Action.h:164
Reservation credential returned by a successful reserve operation.
A query passed from a domain targeting algorithm to sensing.
Definition Targeting.h:350
Observable summary returned after an atomic participant commit.
Definition Transaction.h:97