载入中...
搜索中...
未找到
AttributeSet.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
5#include "common/Result.h"
6
7#include <cstdint>
8#include <functional>
9#include <memory>
10#include <string>
11#include <string_view>
12#include <unordered_map>
13#include <utility>
14#include <vector>
15
16namespace eve::attributes {
17
18using AttributeId = std::string;
19using ModifierId = std::string;
20using SourceId = std::string;
21using ModifierPriority = std::int32_t;
22using ModifierSequence = std::uint64_t;
23
25enum class AttributeOperation : std::uint8_t {
26 Add,
32 Custom,
33};
34
45[[nodiscard]] const char* attributeOperationName(AttributeOperation operation) noexcept;
46
58
64 std::string_view operation, double value);
65
68public:
69 using Function = std::function<double(double current, double value)>;
70
72 void registerOperation(const std::string& policyId, Function function);
74 void unregisterOperation(const std::string& policyId);
76 bool has(const std::string& policyId) const;
78 double apply(const std::string& policyId, double current, double value) const;
79
81 void registerOp(const std::string& policyId, Function function);
83 void unregisterOp(const std::string& policyId);
84
85private:
86 std::unordered_map<std::string, Function> operations_;
87};
88
100 AttributeOperation operation = AttributeOperation::Add;
101 double value = 0.0;
104 std::string policyId;
105
107 AttributeModifier() = default;
108
111 AttributeOperation operationValue, double modifierValue, ModifierPriority priorityValue = 0,
112 ModifierSequence sequenceValue = 0, std::string policy = {})
114 : id(std::move(modifierId)),
116 attribute(std::move(attributeId)),
118 source(std::move(sourceId)),
120 operation(operationValue),
122 value(modifierValue),
124 priority(priorityValue),
126 sequence(sequenceValue),
128 policyId(std::move(policy)) {}
129
135 AttributeModifier(ModifierId modifierId, SourceId sourceId, std::string_view operationName, double modifierValue,
136 ModifierPriority priorityValue = 0);
137};
138
141 double base = 0.0;
142 std::vector<AttributeModifier> modifiers;
143 mutable double cached = 0.0;
144 mutable bool dirty = true;
145};
146
155 const AttributeValue& attribute, const AttributeOperationRegistry* customOperations = nullptr);
156
158
161public:
163 explicit AttributeSet(std::string subject = {});
167 AttributeSet(const AttributeSet& other);
169 AttributeSet& operator=(const AttributeSet& other);
171 AttributeSet(AttributeSet&& other) noexcept;
173 AttributeSet& operator=(AttributeSet&& other) noexcept;
174
176 const std::string& subject() const;
178 void setBase(const AttributeId& attribute, double value);
180 void modifyBase(const AttributeId& attribute, double delta);
182 bool has(const AttributeId& attribute) const;
184 double getBase(const AttributeId& attribute, double fallback = 0.0) const;
191 double getFinal(const AttributeId& attribute, double fallback = 0.0,
192 const AttributeOperationRegistry* customOperations = nullptr) const;
193
199 [[nodiscard]] eve::Result<ModifierId> addModifier(AttributeModifier modifier);
200
206 bool addModifier(const std::string& id, const std::string& attribute, const std::string& source,
207 const std::string& operation, double value, ModifierPriority priority = 0);
208
210 [[nodiscard]] eve::Result<void> removeModifier(const ModifierId& id);
212 [[nodiscard]] eve::Result<void> removeModifier(const AttributeId& attribute, const ModifierId& id);
214 [[nodiscard]] eve::Result<int> removeBySource(const SourceId& source, const AttributeId& attribute = {});
216 void invalidate(const AttributeId& attribute);
218 void clearModifiers();
220 int modifierCount() const;
222 const AttributeModifier* modifierAt(int index) const;
224 int attributeCount() const;
226 std::string attributeAt(int index) const;
227
228private:
229 void rebuildOrder() const;
230 static bool isValidOperation(const AttributeModifier& modifier) noexcept;
231 void publishWorldAdapter();
232 void withdrawWorldAdapter();
233
234 std::string subject_;
235 std::unordered_map<AttributeId, AttributeValue> values_;
236 mutable std::vector<const AttributeModifier*> order_;
237 mutable bool orderDirty_ = true;
238 ModifierSequence nextSequence_ = 1;
239 ModifierSequence nextModifierId_ = 1;
240 std::unique_ptr<AttributeSetStateAdapter> worldAdapter_;
241};
242
243} // namespace eve::attributes
ActionParameterOperation operation
double value
int subject
Definition AnimSmr.cpp:163
int priority
std::uint64_t sourceId
#define EVENGINE_API_FOUNDATION
每个链接组(link group)各自的导出宏。
Definition Export.h:106
std::unique_ptr< gpgpu::Sequence > sequence
Definition OnnxGpgpu.cpp:43
std::string id
Definition PlayHost.cpp:108
Move-only, checked operation results for the common layer.
MigrationFunction function
double current
std::string policyId
uint32_t index
const UnitySourceAsset & source
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Registry for explicitly named custom attribute policies.
std::function< double(double current, double value)> Function
Adapts one AttributeSet to numeric world reads and volatile writes.
Generic owning collection of canonical attributes and modifiers.
std::uint64_t ModifierSequence
std::string AttributeId
std::string SourceId
double computeAttributeValue(const AttributeValue &attribute, const AttributeOperationRegistry *customOperations)
Compute one attribute using the canonical operation order.
AttributeOperation
Built-in calculation operation for an attribute modifier.
const char * attributeOperationName(AttributeOperation operation) noexcept
Stable spelling of a built-in attribute operation. @ownership The returned string is a borrowed,...
std::int32_t ModifierPriority
eve::Result< ParsedAttributeOperation > parseAttributeOperation(std::string_view operation, double value)
Parse a built-in operation spelling used by existing data and APIs.
std::string ModifierId
One canonical runtime modifier applied to one named attribute.
AttributeModifier(ModifierId modifierId, AttributeId attributeId, SourceId sourceId, AttributeOperation operationValue, double modifierValue, ModifierPriority priorityValue=0, ModifierSequence sequenceValue=0, std::string policy={})
Construct a canonical modifier with an explicit operation.
AttributeModifier()=default
Attribute modifier.
Runtime value and modifiers for exactly one attribute.
std::vector< AttributeModifier > modifiers
Parsed legacy operation and its normalized value.