载入中...
搜索中...
未找到
CardPlay.cpp
浏览该文件的文档.
12std::optional<eve::Value> cardValue(const CardData* card, const CardDefinition& definition, std::string_view key) {
27CardPlayConditionContext::CardPlayConditionContext(const CardData* card, const CardDefinition& definition,
68decision::ConditionResult CardPlayConditionAdapter::evaluate(const CardData* card, const CardDefinition& definition,
85 CardTransferParticipant(CardData& card, eve::container::IContainer& source, eve::container::IContainer& destination,
94 [[nodiscard]] std::string_view name() const noexcept override { return "card-container-transfer"; }
97 if (prepared_ || committed_) return cardLifecycleConflict("card transfer participant is already in flight");
117 eve::Diagnostic::error(eve::DiagnosticCode::StaleHandle, "card source slot is stale", "sourceSlot"));
121 if (destinationSlot_ && (destinationSlot_->value() < 0 || static_cast<std::size_t>(destinationSlot_->value()) >
124 eve::DiagnosticCode::InvalidArgument, "card destination slot is out of range", "destinationSlot"));
127 afterSource_.entries.erase(afterSource_.entries.begin() + (sourceIt - beforeSource_.entries.begin()));
131 return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::InvariantViolation,
137 destinationSlot_ ? static_cast<std::size_t>(destinationSlot_->value()) : afterDestination_.entries.size();
140 eve::DiagnosticCode::InvalidArgument, "card destination slot is out of range", "destinationSlot"));
141 afterDestination_.entries.insert(afterDestination_.entries.begin() + insertion, std::move(moved));
152 return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::InvariantViolation,
172 if (!prepared_ || committed_) return cardLifecycleConflict("card transfer has no prepared stage");
179 [[nodiscard]] eve::Result<void> rollback(const eve::transaction::TransactionContext&) override {
189 [[nodiscard]] eve::Result<void> compensate(const eve::transaction::TransactionContext&) override {
190 if (!committed_) return cardLifecycleConflict("card transfer has no committed state to compensate");
207 eve::DiagnosticCode::InvariantViolation, "card transfer compensation revision is exhausted", {}));
215 auto destinationRestore = destination_.prepare(currentDestination.value(), destinationCandidate);
224 eve::DiagnosticCode::InvariantViolation, "destination compensation returned an empty stage", {}));
243 snapshot.entries[index].membership.slot = eve::container::SlotIndex(static_cast<std::int32_t>(index));
265eve::Result<void> CardPlayParticipant::prepare(const eve::transaction::TransactionContext& context) {
277eve::Result<void> CardPlayParticipant::commit(const eve::transaction::TransactionContext& context) {
298eve::Result<void> CardPlayParticipant::compensate(const eve::transaction::TransactionContext& context) {
308eve::Result<std::optional<eve::resource::CostSpec>> CardPlayPaymentAdapter::manaCost(const CardDefinition& definition) {
311 eve::DiagnosticCode::InvalidArgument, "card definition id must not be empty", "definition.id"));
314 eve::DiagnosticCode::InvalidArgument, "card mana cost must not be negative", "definition.cost"));
315 if (definition.cost == 0) return eve::Result<std::optional<eve::resource::CostSpec>>::success(std::nullopt);
318 return eve::Result<std::optional<eve::resource::CostSpec>>::success(std::move(cost).takeValue());
322 CardData& card, const CardDefinition& definition, eve::resource::IResourceAccount& playerAccount,
332eve::Result<eve::transaction::TransactionReceipt> CardPlayPaymentAdapter::play(CardPlayRequest request) {
343 const auto condition = CardPlayConditionAdapter::evaluate(&card, definition, definition.playCondition,
349 eve::Diagnostic::error(eve::DiagnosticCode::PreconditionViolation, "card play condition was rejected",
Card Play adapter for the renderer-independent decision protocol.
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 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
单张卡牌:ECS 实体,数据拆成 Identity / Stats / Visual / Layout / State。
Definition CardTypes.h:94
static decision::ConditionResult evaluate(const CardData *card, const CardDefinition &definition, const decision::Condition &condition, CardPlayConditionQueries queries={})
Evaluate a card definition's play condition against one instance.
Definition CardPlay.cpp:68
Read-only EvaluationContext backed by one card instance and definition.
Definition CardPlay.h:47
CardPlayConditionContext(const CardData *card, const CardDefinition &definition, CardPlayConditionQueries queries={})
Bind a card instance and definition for one evaluation.
Definition CardPlay.cpp:27
std::optional< bool > hasTag(std::string_view tag) const override
Query tag membership; nullopt means the tag source is unavailable.
Definition CardPlay.cpp:35
std::optional< eve::Value > resource(std::string_view key) const override
Query a resource amount or resource marker.
Definition CardPlay.cpp:48
std::optional< bool > authority(std::string_view scope) const override
Query authority without changing grants, leases, or state.
Definition CardPlay.cpp:57
std::optional< eve::Value > value(std::string_view key) const override
Query a named scalar or structured value for Compare nodes.
Definition CardPlay.cpp:31
std::optional< decision::ConditionResult > policy(std::string_view name, const eve::Value &arguments) const override
Evaluate a named read-only policy with owned arguments.
Definition CardPlay.cpp:62
std::optional< eve::Value > state(std::string_view key) const override
Query a state value for StateEquals nodes.
Definition CardPlay.cpp:53
std::optional< eve::Value > attribute(std::string_view key) const override
Query an attribute value; nullopt means the attribute is absent.
Definition CardPlay.cpp:40
Transaction participant that publishes one CardData play.
Definition CardPlay.h:111
CardPlayParticipant(CardData &card)
Bind one card effect whose state transition is played.
Definition CardPlay.cpp:263
eve::Result< void > rollback(const eve::transaction::TransactionContext &context) override
Discard a prepared but not committed stage.
Definition CardPlay.cpp:290
eve::Result< void > commit(const eve::transaction::TransactionContext &context) override
Publish this participant's staged changes.
Definition CardPlay.cpp:277
eve::Result< void > prepare(const eve::transaction::TransactionContext &context) override
Validate and stage local changes for the transaction.
Definition CardPlay.cpp:265
eve::Result< void > compensate(const eve::transaction::TransactionContext &context) override
Undo an already committed external effect by compensation.
Definition CardPlay.cpp:298
static eve::Result< std::optional< eve::resource::CostSpec > > manaCost(const CardDefinition &definition)
Convert a non-negative card mana value into a canonical cost.
Definition CardPlay.cpp:308
static eve::Result< eve::transaction::TransactionReceipt > play(CardPlayRequest request)
Execute condition, movement, card effect and Mana as one transaction.
Definition CardPlay.cpp:332
Borrowed container implementation owned by a domain adapter.
Definition Container.h:287
virtual Result< std::unique_ptr< PreparedState > > prepare(const ContainerSnapshot &expected, const ContainerSnapshot &candidate)=0
Prepare an exact replacement from expected to candidate.
virtual Result< void > validateInsert(const ContainerObject &object, std::optional< SlotIndex > destination, std::optional< MembershipId > ignoredObject=std::nullopt) const =0
Validate insertion while optionally ignoring one moved object.
virtual Result< ContainerSnapshot > snapshot() const =0
Return current lossless state without retaining adapter pointers.
Strong identity of an object which can have one container membership.
Definition Container.h:68
Explicit slot number; it never implicitly converts to an integer.
Definition Container.h:117
Explain one condition evaluation in a UI- and log-friendly form.
Definition Condition.h:129
constexpr std::uint64_t value() const noexcept
Returns the underlying value at an explicit protocol boundary.
Definition StrongUint64.h:26
static eve::Result< CostSpec > single(std::string_view resource, std::int64_t amount)
Build a one-resource cost.
Definition ResourceAccount.cpp:117
Provider-neutral resource account contract.
Definition ResourceAccount.h:316
static eve::Result< TransactionReceipt > execute(const TransactionContext &context, std::span< ITransactionParticipant * > participants)
Execute already prepared domain participants as one transaction.
Definition AtomicResourcePayment.cpp:13
Synchronous participant contract for one coordinator transaction.
Definition Transaction.h:128
Immutable context shared by every participant of one transaction.
Definition Transaction.h:30
Definition Card.cpp:19
@ Played
@ Discarded
@ Disabled
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
WidgetDesc card(std::vector< WidgetDesc > children, std::string id)
Bordered surface container with editor-friendly padding.
Definition Widget.cpp:502
std::vector< DiagnosticDetail > DiagnosticDetails
Owning collection of diagnostic details with stable insertion order.
Definition Diagnostic.h:88
@ InvalidArgument
@ NotFound
@ PreconditionViolation
@ InvariantViolation
@ StaleHandle
@ Conflict
@ Applied
@ Conflict
Definition Container.h:602
Read-only extension points used while evaluating a card play.
Definition CardPlay.h:29
Complete caller-owned input for one atomic card play.
Definition CardPlay.h:163
Lossless snapshot of one container at one revision.
Definition Container.h:190
std::vector< MembershipEntry > entries
Definition Container.h:193