载入中...
搜索中...
未找到
AttributeResourceAccount.cpp
浏览该文件的文档.
2
3#include <cstdint>
4#include <string>
5#include <utility>
6
7namespace eve::attributes {
8namespace {
9
10} // namespace
11
15
16const char* AttributeResourceAccountAdapter::resourceName(AttributeResourceKind kind) noexcept {
17 switch (kind) {
18 case AttributeResourceKind::Mana: return "mana";
19 case AttributeResourceKind::Stamina: return "stamina";
20 }
21 return nullptr;
22}
23
25 std::int64_t amount) {
26 const char* name = resourceName(kind);
27 if (name == nullptr)
29 eve::DiagnosticCode::InvalidArgument, "attribute resource kind is invalid", "resource.kind"));
31}
32
33eve::Result<void> AttributeResourceAccountAdapter::validateCost(const eve::resource::CostSpec& cost) const {
34 const char* name = resourceName(kind_);
35 if (name == nullptr)
37 eve::DiagnosticCode::InvalidArgument, "attribute resource kind is invalid", "resource.kind"));
38 if (!cost.isValid())
40 eve::DiagnosticCode::InvalidArgument, "attribute resource view requires a validated CostSpec", "cost"));
41 if (cost.size() != 1 || cost.items().front().resource.value() != name)
44 "named attribute resource view received a different resource", "cost.resource"));
46}
47
54
60
66
72
74 const eve::resource::Reservation& reservation) {
75 const char* name = resourceName(kind_);
76 if (name == nullptr || !reservation.isValid() || reservation.cost.size() != 1 ||
77 reservation.cost.items().front().resource.value() != name)
79 eve::DiagnosticCode::InvalidArgument, "named attribute resource view received a foreign reservation cost",
80 "reservation.cost"));
81 return account_.commit(reservation);
82}
83
85 const char* name = resourceName(kind_);
86 if (name == nullptr || !reservation.isValid() || reservation.cost.size() != 1 ||
87 reservation.cost.items().front().resource.value() != name)
89 eve::DiagnosticCode::InvalidArgument, "named attribute resource view received a foreign reservation cost",
90 "reservation.cost"));
91 return account_.rollback(reservation);
92}
93
94} // namespace eve::attributes
Named Mana/Stamina views over the canonical AttributeSet account.
eve::resource::CostSpec cost
eve::resource::IResourceAccount * account
TokenKind kind
std::string name
bool valid
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
eve::Result< eve::resource::Affordability > canAfford(const eve::resource::CostSpec &cost) const override
Query whether a cost can be paid from currently available funds.
static eve::Result< eve::resource::CostSpec > makeCost(AttributeResourceKind kind, std::int64_t amount)
Build a positive cost for this view's named resource.
AttributeResourceKind kind() const noexcept
Return the resource exposed by this view.
eve::Result< eve::resource::Receipt > commit(const eve::resource::Reservation &reservation) override
Commit one active reservation as an atomic debit.
AttributeResourceAccountAdapter(AttributeSetResourceAccount &account, AttributeResourceKind kind) noexcept
Bind a named view to an existing AttributeSet resource account.
eve::Result< eve::resource::Receipt > credit(const eve::resource::CostSpec &cost) override
Atomically credit all items immediately.
eve::Result< void > rollback(const eve::resource::Reservation &reservation) override
Release one active reservation without changing balances.
eve::Result< eve::resource::Receipt > debit(const eve::resource::CostSpec &cost) override
Atomically debit all items immediately.
eve::Result< eve::resource::Reservation > reserve(const eve::resource::CostSpec &cost) override
Reserve all items of a cost without changing visible balances.
Adapts integral AttributeSet base values to IResourceAccount.
eve::Result< eve::resource::Affordability > canAfford(const eve::resource::CostSpec &cost) const override
Query whether a cost can be paid from currently available funds.
eve::Result< eve::resource::Receipt > commit(const eve::resource::Reservation &reservation) override
Commit one active reservation as an atomic debit.
eve::Result< eve::resource::Receipt > credit(const eve::resource::CostSpec &cost) override
Atomically credit all items immediately.
eve::Result< void > rollback(const eve::resource::Reservation &reservation) override
Release one active reservation without changing balances.
eve::Result< eve::resource::Reservation > reserve(const eve::resource::CostSpec &cost) override
Reserve all items of a cost without changing visible balances.
eve::Result< eve::resource::Receipt > debit(const eve::resource::CostSpec &cost) override
Atomically debit all items immediately.
Immutable canonical multi-resource cost.
const std::vector< ResourceCost > & items() const noexcept
Return canonical items as a read-only borrowed view.
bool isValid() const noexcept
Whether this value contains a validated non-empty cost.
std::size_t size() const noexcept
Return the number of canonical resource entries.
static eve::Result< CostSpec > single(std::string_view resource, std::int64_t amount)
Build a one-resource cost.
AttributeResourceKind
Attribute-backed resource names used by common gameplay adapters.
Reservation credential returned by a successful reserve operation.
bool isValid() const noexcept
Whether this credential has valid account/id identity and cost.