载入中...
搜索中...
未找到
Effect.cpp
浏览该文件的文档.
1#include "rpg/Effect.h"
2
3#include "common/Json.h"
4
5#include <algorithm>
6
7namespace eve::rpg {
8
10
11bool EffectDefinition::hasTag(const std::string &tag) const {
12 return std::find(tags.begin(), tags.end(), tag) != tags.end();
13}
14
15std::string EffectDefinition::getExtra(const std::string &key, const std::string &fallback) const {
16 auto it = extra.find(key);
17 return it == extra.end() ? fallback : it->second;
18}
19
20std::unordered_map<std::string, EffectDefinition> &EffectRegistry::table() {
21 static std::unordered_map<std::string, EffectDefinition> t;
22 return t;
23}
24
26 if (def.id.empty()) return;
27 table()[def.id] = def;
28}
29
30const EffectDefinition *EffectRegistry::find(const std::string &id) {
31 auto &t = table();
32 auto it = t.find(id);
33 return it == t.end() ? nullptr : &it->second;
34}
35
36bool EffectRegistry::remove(const std::string &id) { return table().erase(id) > 0; }
37
38void EffectRegistry::clear() { table().clear(); }
39
40int EffectRegistry::count() { return int(table().size()); }
41
42namespace {
43
44EffectDefinition parseEffectObject(Value o) {
46 if (!o.isObject()) return def;
47 def.id = o.getString("id");
48 def.durationPolicy = o.getString("durationPolicy", "instant");
49 def.duration = o.getFloat("duration", 0.f);
50 def.period = o.getFloat("period", 0.f);
51 def.stackPolicy = o.getString("stackPolicy", "none");
52 def.maxStacks = o.getInt("maxStacks", 1);
53 def.tags = o.getStringArray("tags");
54 def.extra = o.getStringMap("extra");
55
56 const Value mods = o.get("modifiers");
57 for (size_t i = 0; i < mods.size(); ++i) {
58 const Value mo = mods.at(i);
60 spec.attribute = mo.getString("attribute");
61 spec.op = mo.getString("op", "add");
62 spec.value = mo.getDouble("value", 0.0);
63 spec.priority = mo.getInt("priority", 0);
64 if (!spec.attribute.empty()) def.modifiers.push_back(std::move(spec));
65 }
66 return def;
67}
68
69} // namespace
70
71int EffectRegistry::loadFromJson(const std::string &json, std::string *error) {
72 std::string err;
73 const eve::json::Document doc = eve::json::Document::parse(json, &err);
74 if (!doc.valid()) {
75 if (error) *error = err.empty() ? "invalid json" : err;
76 return 0;
77 }
78
79 const Value root = doc.root();
80 int n = 0;
81 if (root.isArray()) {
82 for (size_t i = 0; i < root.size(); ++i) {
83 EffectDefinition def = parseEffectObject(root.at(i));
84 if (def.id.empty()) continue;
85 registerEffect(def);
86 ++n;
87 }
88 } else if (root.isObject()) {
89 EffectDefinition def = parseEffectObject(root);
90 if (!def.id.empty()) {
91 registerEffect(def);
92 ++n;
93 }
94 }
95 return n;
96}
97
98} // namespace eve::rpg
glm::vec3 n
Definition Grass.cpp:64
std::string error
bool valid() const
Definition Json.h:111
static Document parse(const std::string &text, std::string *error=nullptr)
Definition Json.cpp:449
Value root() const
Definition Json.h:112
bool isObject() const
Definition Json.cpp:296
Value get(const char *key) const
Definition Json.cpp:301
size_t size() const
Definition Json.cpp:316
bool isArray() const
Definition Json.cpp:297
Value at(size_t index) const
Definition Json.cpp:323
float getFloat(const char *key, float fallback=0.f) const
Definition Json.cpp:386
int getInt(const char *key, int fallback=0) const
Definition Json.cpp:385
std::string getString(const char *key, const std::string &fallback={}) const
Definition Json.cpp:390
std::vector< std::string > getStringArray(const char *key) const
Definition Json.cpp:402
double getDouble(const char *key, double fallback=0.0) const
Definition Json.cpp:387
std::unordered_map< std::string, std::string > getStringMap(const char *key) const
Definition Json.cpp:424
static bool remove(const std::string &id)
Definition Effect.cpp:36
static void clear()
Definition Effect.cpp:38
static int loadFromJson(const std::string &json, std::string *error=nullptr)
从 JSON 数组批量注册效果定义,返回成功注册的数量。 每个元素形如: { "id": "poison", "durationPolicy": "duration",...
Definition Effect.cpp:71
static const EffectDefinition * find(const std::string &id)
Definition Effect.cpp:30
static void registerEffect(const EffectDefinition &def)
Definition Effect.cpp:25
RPG 模块入口:属性 / 效果 / 状态 / 技能 / 结算五套系统的脚本绑定与帧调度点。
float duration
durationPolicy == "duration" 时使用(秒)
Definition Effect.h:37
float period
> 0 时为周期效果:每隔 period 秒产生一次 StatusTickEvent。
Definition Effect.h:40
std::string getExtra(const std::string &key, const std::string &fallback={}) const
Definition Effect.cpp:15
std::string durationPolicy
"instant" | "duration" | "infinite"(未知值按 "instant" 处理)。
Definition Effect.h:36
std::unordered_map< std::string, std::string > extra
游戏自定义附加数据(图标路径、特效名、脚本钩子……)。
Definition Effect.h:55
std::vector< std::string > tags
Definition Effect.h:52
bool hasTag(const std::string &tag) const
Definition Effect.cpp:11
std::string stackPolicy
"none" | "refresh" | "extend" | "stack",或 StatusSystem::registerStackPolicy 注册的名字。 未知且未注册时按 "none" 处理...
Definition Effect.h:46
std::vector< EffectModifierSpec > modifiers
durationPolicy 为 duration/infinite 且 period<=0 时,apply 会直接写入这些修改器。
Definition Effect.h:50
效果里携带的一条属性修改规格(应用到 AttributeSystem::addModifier)。
Definition Effect.h:25