载入中...
搜索中...
未找到
SkillCondition.cpp
浏览该文件的文档.
2
4#include "rpg/RPGActor.h"
5#include "rpg/Skill.h"
6
7#include <string>
8
9namespace eve::rpg {
10namespace {
11
12std::optional<eve::Value> skillValue(const RPGActor* actor, const SkillDefinition& definition, std::string_view key) {
13 if (!actor) return std::nullopt;
14 auto* mutableActor = const_cast<RPGActor*>(actor);
15 const auto* runtime = [&]() -> const SkillRuntime* {
16 const auto it = mutableActor->skills()->known.find(definition.id);
17 return it == mutableActor->skills()->known.end() ? nullptr : &it->second;
18 }();
19 if (key == "skill.id") return eve::Value(definition.id);
20 if (key == "skill.targetType") return eve::Value(definition.targetType);
21 if (key == "skill.known") return eve::Value(runtime != nullptr);
22 if (key == "skill.casting") return eve::Value(mutableActor->skills()->casting.active);
23 if (key == "skill.cooldown") return eve::Value(runtime ? runtime->cooldownRemaining : 0.0);
24 if (key == "skill.phase") return eve::Value(mutableActor->skills()->casting.active ? "casting" : "idle");
25 return std::nullopt;
26}
27
28} // namespace
29
32 : actor_(actor), definition_(&definition), queries_(std::move(queries)) {}
33
34std::optional<eve::Value> SkillConditionContext::value(std::string_view key) const {
35 return skillValue(actor_, *definition_, key);
36}
37
38std::optional<bool> SkillConditionContext::hasTag(std::string_view tag) const {
39 if (!actor_) return std::nullopt;
40 if (definition_->hasTag(std::string(tag))) return true;
41 return const_cast<RPGActor*>(actor_)->hasStatusTag(std::string(tag));
42}
43
44std::optional<eve::Value> SkillConditionContext::attribute(std::string_view key) const {
45 if (!actor_ || key.empty()) return std::nullopt;
46 auto* mutableActor = const_cast<RPGActor*>(actor_);
47 if (!AttributeSystem::hasAttribute(mutableActor, std::string(key))) return std::nullopt;
48 return eve::Value(AttributeSystem::getFinal(mutableActor, std::string(key)));
49}
50
51std::optional<eve::Value> SkillConditionContext::resource(std::string_view key) const {
52 // RPG resources are attributes by design (mana, stamina, and game-defined
53 // resources use the same canonical AttributeSet source).
54 return attribute(key);
55}
56
57std::optional<eve::Value> SkillConditionContext::state(std::string_view key) const { return value(key); }
58
59std::optional<bool> SkillConditionContext::authority(std::string_view scope) const {
60 if (!queries_.authority) return std::nullopt;
61 return queries_.authority(scope);
62}
63
64std::optional<decision::ConditionResult> SkillConditionContext::policy(std::string_view name,
65 const eve::Value& arguments) const {
66 if (!queries_.policy) return std::nullopt;
67 return queries_.policy(name, arguments);
68}
69
72 SkillConditionQueries queries) {
73 SkillConditionContext context(actor, definition, std::move(queries));
74 return condition.evaluate(context);
75}
76
77} // namespace eve::rpg
double value
RPG's thin compatibility facade over the attributes module.
eve::Value condition
std::uint32_t key
JobScope scope
std::string name
const std::string * tag
RPG Skill adapter for the renderer-independent decision protocol.
const VegetationPresetContext & context
The canonical owning dynamic value used by data-facing protocols.
Definition Value.h:31
Explain one condition evaluation in a UI- and log-friendly form.
Definition Condition.h:129
Immutable condition AST node.
Definition Condition.h:195
static bool hasAttribute(RPGActor *actor, const std::string &attribute)
Query whether an attribute exists on the actor.
static double getFinal(RPGActor *actor, const std::string &attribute)
Compute the final value through the canonical attributes engine.
属性 / 状态 / 技能三表合一的 ECS 实体。
Definition RPGActor.h:34
static decision::ConditionResult evaluate(const RPGActor *actor, const SkillDefinition &definition, const decision::Condition &condition, SkillConditionQueries queries={})
Evaluate one skill condition against an actor and definition.
EvaluationContext backed by one borrowed RPG actor and SkillDefinition.
SkillConditionContext(const RPGActor *actor, const SkillDefinition &definition, SkillConditionQueries queries={})
Bind a read-only actor/skill pair for one synchronous evaluation.
std::optional< bool > hasTag(std::string_view tag) const override
Query tag membership; nullopt means the tag source is unavailable.
std::optional< eve::Value > value(std::string_view key) const override
Query a named scalar or structured value for Compare nodes.
std::optional< eve::Value > state(std::string_view key) const override
Query a state value for StateEquals nodes.
std::optional< eve::Value > resource(std::string_view key) const override
Query a resource amount or resource marker.
std::optional< bool > authority(std::string_view scope) const override
Query authority without changing grants, leases, or state.
std::optional< eve::Value > attribute(std::string_view key) const override
Query an attribute value; nullopt means the attribute is absent.
std::optional< decision::ConditionResult > policy(std::string_view name, const eve::Value &arguments) const override
Evaluate a named read-only policy with owned arguments.
RPG 模块的基础实体:把属性 / 状态 / 技能三张表挂到一个 ECS 实体上。
Read-only extension points for authority and policy queries.
SkillDefinition public API.
Definition Skill.h:28
bool hasTag(const std::string &tag) const
True when tag.
Definition Skill.cpp:61