载入中...
搜索中...
未找到
AttributeSystem.cpp
浏览该文件的文档.
2#include "rpg/RPGActor.h"
3
4#include <utility>
5
6namespace eve::rpg {
7
8namespace {
9
10eve::Diagnostic invalidArgument(std::string message, std::string path = {}) {
12}
13
14eve::Result<ModifierId> actorRequired(RPGActor*) {
15 return eve::Result<ModifierId>::failure(invalidArgument("attribute operation requires an actor", "actor"));
16}
17
18eve::Result<void> actorRequiredVoid(RPGActor*) {
19 return eve::Result<void>::failure(invalidArgument("attribute operation requires an actor", "actor"));
20}
21
22eve::Result<int> actorRequiredCount(RPGActor*) {
23 return eve::Result<int>::failure(invalidArgument("attribute operation requires an actor", "actor"));
24}
25
26} // namespace
27
32
33void AttributeSystem::setBase(RPGActor* actor, const std::string& attribute, double value) {
34 if (actor) actor->attributes()->values.setBase(attribute, value);
35}
36
37double AttributeSystem::getBase(RPGActor* actor, const std::string& attribute) {
38 return actor ? actor->attributes()->values.getBase(attribute) : 0.0;
39}
40
41void AttributeSystem::modifyBase(RPGActor* actor, const std::string& attribute, double delta) {
42 if (actor) actor->attributes()->values.modifyBase(attribute, delta);
43}
44
45bool AttributeSystem::hasAttribute(RPGActor* actor, const std::string& attribute) {
46 return actor && actor->attributes()->values.has(attribute);
47}
48
50 if (!actor) return actorRequired(actor);
51 return actor->attributes()->values.addModifier(std::move(modifier));
52}
53
54std::string AttributeSystem::addModifier(RPGActor* actor, const std::string& attribute, const std::string& source,
55 const std::string& operation, double value, int priority) {
56 if (!actor || attribute.empty()) return {};
57
59 AttributeModifier modifier;
60 modifier.attribute = attribute;
61 modifier.source = source;
62 modifier.priority = priority;
63 if (parsed.ok()) {
64 modifier.operation = parsed.value().operation;
65 modifier.value = parsed.value().value;
66 } else if (customOps().has(operation)) {
67 parsed.ignore("RPG custom operation compatibility fallback");
68 modifier.operation = AttributeOperation::Custom;
69 modifier.policyId = operation;
70 modifier.value = value;
71 } else {
72 parsed.ignore("unknown RPG attribute operation");
73 return {};
74 }
75
76 auto result = addModifier(actor, std::move(modifier));
77 if (!result.ok()) return {};
78 return result.value();
79}
80
82 if (!actor) return actorRequiredVoid(actor);
83 return actor->attributes()->values.removeModifier(modifierId);
84}
85
86bool AttributeSystem::removeModifier(RPGActor* actor, const std::string& attribute, const std::string& modifierId) {
87 if (!actor) return false;
88 auto result = actor->attributes()->values.removeModifier(attribute, modifierId);
89 return result.ok();
90}
91
93 const std::string& source) {
94 if (!actor) return actorRequiredCount(actor);
95 return actor->attributes()->values.removeBySource(source, attribute);
96}
97
99 auto result = actor ? actor->attributes()->values.removeBySource(source) : actorRequiredCount(actor);
100 return result.ok() ? result.value() : 0;
101}
102
103double AttributeSystem::getFinal(RPGActor* actor, const std::string& attribute) {
104 return actor ? actor->attributes()->values.getFinal(attribute, 0.0, &customOps()) : 0.0;
105}
106
107void AttributeSystem::invalidate(RPGActor* actor, const std::string& attribute) {
108 if (actor) actor->attributes()->values.invalidate(attribute);
109}
110
111} // namespace eve::rpg
ActionParameterOperation operation
double value
RPG's thin compatibility facade over the attributes module.
int priority
std::string message
std::string path
Definition PlayHost.cpp:110
const UnitySourceAsset & source
A structured explanation of a failed, degraded, or noteworthy result.
Definition Diagnostic.h:94
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 failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
Registry for explicitly named custom attribute policies.
static void setBase(RPGActor *actor, const std::string &attribute, double value)
Set a base value; invalid actor or attribute is a compatibility no-op.
static bool hasAttribute(RPGActor *actor, const std::string &attribute)
Query whether an attribute exists on the actor.
static eve::Result< int > removeModifiersBySource(RPGActor *actor, const std::string &attribute, const std::string &source)
Remove source modifiers with a structured count result.
static void modifyBase(RPGActor *actor, const std::string &attribute, double delta)
Add a delta to a base value.
static void invalidate(RPGActor *actor, const std::string &attribute)
Mark a canonical attribute value dirty for its next built-in read.
static double getBase(RPGActor *actor, const std::string &attribute)
Read a base value, returning zero for a missing actor/attribute.
static int removeAllModifiersBySource(RPGActor *actor, const std::string &source)
Compatibility all-attribute source removal facade.
static double getFinal(RPGActor *actor, const std::string &attribute)
Compute the final value through the canonical attributes engine.
static AttributeOpTable & customOps()
Process-wide custom policy registry used only for Custom modifiers.
static eve::Result< ModifierId > addModifier(RPGActor *actor, AttributeModifier modifier)
Add one canonical modifier to an actor.
static eve::Result< void > removeModifier(RPGActor *actor, const ModifierId &modifierId)
Remove by canonical modifier id with a structured result.
属性 / 状态 / 技能三表合一的 ECS 实体。
Definition RPGActor.h:34
eve::Result< ParsedAttributeOperation > parseAttributeOperation(std::string_view operation, double value)
Parse a built-in operation spelling used by existing data and APIs.
RPG 模块的基础实体:把属性 / 状态 / 技能三张表挂到一个 ECS 实体上。
::eve::attributes::ModifierId ModifierId
std::unordered_map< std::string, SkillDefinition > & table()
Definition Skill.cpp:65
One canonical runtime modifier applied to one named attribute.