载入中...
搜索中...
未找到
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
int root
Definition AnimSmr.cpp:119
std::uint32_t key
glm::vec3 n
Definition Grass.cpp:63
const std::string * tag
std::string error
Definition Package.cpp:60
float t
float size
Definition TreeMesh.cpp:156
EVENGINE_API_FOUNDATION public API.
Definition Json.h:136
bool valid() const
Valid.
Definition Json.h:157
static Document parse(const std::string &text, std::string *error=nullptr)
Parse.
Definition Json.cpp:581
Value root() const
Root.
Definition Json.h:159
EVENGINE_API_FOUNDATION public API.
Definition Json.h:38
bool isObject() const
True when object.
Definition Json.cpp:331
Value get(const char *key) const
Returns the value.
Definition Json.cpp:336
size_t size() const
Returns the size of .
Definition Json.cpp:351
Value at(size_t index) const
At.
Definition Json.cpp:358
float getFloat(const char *key, float fallback=0.f) const
Returns the float.
Definition Json.cpp:423
int getInt(const char *key, int fallback=0) const
Returns the int.
Definition Json.cpp:422
std::string getString(const char *key, const std::string &fallback={}) const
Returns the string.
Definition Json.cpp:427
std::vector< std::string > getStringArray(const char *key) const
Returns the string array.
Definition Json.cpp:439
double getDouble(const char *key, double fallback=0.0) const
Returns the double.
Definition Json.cpp:424
std::unordered_map< std::string, std::string > getStringMap(const char *key) const
Definition Json.cpp:461
static bool remove(const std::string &id)
Removes .
Definition Effect.cpp:36
static void clear()
Clears .
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)
Find a registered effect definition by id.
Definition Effect.cpp:30
static int count()
Returns the number of .
Definition Effect.cpp:40
static void registerEffect(const EffectDefinition &def)
Registers effect.
Definition Effect.cpp:25
RPG 模块的基础实体:把属性 / 状态 / 技能三张表挂到一个 ECS 实体上。
EVENGINE_API_PLATFORM public API.
Definition Effect.h:35
float duration
durationPolicy == "duration" 时使用(秒)
Definition Effect.h:40
float period
> 0 时为周期效果:每隔 period 秒产生一次 StatusTickEvent。
Definition Effect.h:43
std::string getExtra(const std::string &key, const std::string &fallback={}) const
Returns the extra.
Definition Effect.cpp:15
std::string durationPolicy
"instant" | "duration" | "infinite"(未知值按 "instant" 处理)。
Definition Effect.h:39
std::unordered_map< std::string, std::string > extra
游戏自定义附加数据(图标路径、特效名、脚本钩子……)。
Definition Effect.h:58
std::vector< std::string > tags
Definition Effect.h:55
bool hasTag(const std::string &tag) const
True when tag.
Definition Effect.cpp:11
std::string stackPolicy
"none" | "refresh" | "extend" | "stack",或 StatusSystem::registerStackPolicy 注册的名字。 未知且未注册时按 "none" 处理...
Definition Effect.h:49
std::vector< EffectModifierSpec > modifiers
durationPolicy 为 duration/infinite 且 period<=0 时,apply 会直接写入这些修改器。
Definition Effect.h:53
效果里携带的一条属性修改规格(应用到 AttributeSystem::addModifier)。
Definition Effect.h:27