载入中...
搜索中...
未找到
Trait.cpp
浏览该文件的文档.
1#include "rpg/Trait.h"
2
3#include "common/Json.h"
4
5#include <algorithm>
6
7namespace eve::rpg {
8
10
11bool TraitDefinition::hasTag(const std::string &tag) const {
12 return std::find(tags.begin(), tags.end(), tag) != tags.end();
13}
14
15std::string TraitDefinition::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
20namespace {
21std::unordered_map<std::string, TraitDefinition> &traitTable() {
22 static std::unordered_map<std::string, TraitDefinition> t;
23 return t;
24}
25} // namespace
26
28 if (def.id.empty()) return;
29 traitTable()[def.id] = def;
30}
31
32const TraitDefinition *TraitRegistry::find(const std::string &id) {
33 auto &t = traitTable();
34 auto it = t.find(id);
35 return it == t.end() ? nullptr : &it->second;
36}
37
38bool TraitRegistry::remove(const std::string &id) { return traitTable().erase(id) > 0; }
39
40void TraitRegistry::clear() { traitTable().clear(); }
41
42int TraitRegistry::count() { return int(traitTable().size()); }
43
44int TraitRegistry::loadFromJson(const std::string &json, std::string *error) {
45 std::string err;
46 const eve::json::Document doc = eve::json::Document::parse(json, &err);
47 if (!doc.valid()) {
48 if (error) *error = err.empty() ? "invalid json" : err;
49 return 0;
50 }
51 const Value root = doc.root();
52 int n = 0;
53 const auto parseOne = [&](Value o) {
54 if (!o.isObject()) return;
56 def.id = o.getString("id");
57 if (def.id.empty()) return;
58 def.tags = o.getStringArray("tags");
59 def.extra = o.getStringMap("extra");
60 const Value traits = o.get("traits");
61 for (size_t i = 0; i < traits.size(); ++i) {
62 const Value t = traits.at(i);
63 TraitSpec spec;
64 spec.kind = t.getString("kind");
65 spec.target = t.getString("target");
66 spec.value = t.getDouble("value", 0.0);
67 if (spec.kind.empty()) continue;
68 def.traits.push_back(std::move(spec));
69 }
70 traitTable()[def.id] = std::move(def);
71 ++n;
72 };
73 if (root.isArray()) {
74 for (size_t i = 0; i < root.size(); ++i) parseOne(root.at(i));
75 } else if (root.isObject()) {
76 parseOne(root);
77 }
78 return n;
79}
80
81} // 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
特征(Trait):RPG Maker 式数据驱动的能力/特性模板与进程级注册表。
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
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
static int count()
Returns the number of .
Definition Trait.cpp:42
static bool remove(const std::string &id)
Remove a trait by id (compatibility facade returning whether it was present).
Definition Trait.cpp:38
static void clear()
Clears .
Definition Trait.cpp:40
static int loadFromJson(const std::string &json, std::string *error=nullptr)
从 JSON 数组/对象批量注册,返回成功数量。元素形如: { "id":"fire_resist", "traits":[{"kind":"elementRate",...
Definition Trait.cpp:44
static void registerTrait(const TraitDefinition &def)
Registers trait.
Definition Trait.cpp:27
static const TraitDefinition * find(const std::string &id)
Find a registered trait definition by id.
Definition Trait.cpp:32
RPG 模块的基础实体:把属性 / 状态 / 技能三张表挂到一个 ECS 实体上。
数据驱动的特征模板。
Definition Trait.h:32
std::unordered_map< std::string, std::string > extra
Definition Trait.h:36
std::vector< TraitSpec > traits
Definition Trait.h:34
std::string getExtra(const std::string &key, const std::string &fallback={}) const
Returns the extra.
Definition Trait.cpp:15
std::vector< std::string > tags
Definition Trait.h:35
bool hasTag(const std::string &tag) const
True when tag.
Definition Trait.cpp:11
特征承载的一条能力规格。
Definition Trait.h:21
std::string kind
"paramRate" | "elementRate" | "stateRate" | "stateResist" | "exParam" | "attackElement" | "attackStat...
Definition Trait.h:24
std::string target
目标名(参数/元素/状态/exParam 名);部分 kind 可空。
Definition Trait.h:26
double value
倍率或加值;攻击次数为整数加值,其它多为倍率。
Definition Trait.h:28