载入中...
搜索中...
未找到
Class.cpp
浏览该文件的文档.
1#include "rpg/Class.h"
2
3#include "common/Json.h"
4
5#include <algorithm>
6
7namespace eve::rpg {
8
10
11bool ClassDefinition::hasTag(const std::string &tag) const {
12 return std::find(tags.begin(), tags.end(), tag) != tags.end();
13}
14
15std::string ClassDefinition::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, ClassDefinition> &classTable() {
22 static std::unordered_map<std::string, ClassDefinition> t;
23 return t;
24}
25} // namespace
26
28 if (def.id.empty()) return;
29 classTable()[def.id] = def;
30}
31
32const ClassDefinition *ClassRegistry::find(const std::string &id) {
33 auto &t = classTable();
34 auto it = t.find(id);
35 return it == t.end() ? nullptr : &it->second;
36}
37
38bool ClassRegistry::remove(const std::string &id) { return classTable().erase(id) > 0; }
39
40void ClassRegistry::clear() { classTable().clear(); }
41
42int ClassRegistry::count() { return int(classTable().size()); }
43
44int ClassRegistry::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.displayName = o.getString("displayName");
59 def.tags = o.getStringArray("tags");
60 def.extra = o.getStringMap("extra");
61 def.traits = o.getStringArray("traits");
62 const Value learn = o.get("learnSkills");
63 for (size_t i = 0; i < learn.size(); ++i) {
64 const Value e = learn.at(i);
66 ls.skillId = e.getString("skillId");
67 ls.level = e.getInt("level", 1);
68 if (ls.level <= 0) ls.level = 1;
69 if (ls.skillId.empty()) continue;
70 def.learnSkills.push_back(std::move(ls));
71 }
72 classTable()[def.id] = std::move(def);
73 ++n;
74 };
75 if (root.isArray()) {
76 for (size_t i = 0; i < root.size(); ++i) parseOne(root.at(i));
77 } else if (root.isObject()) {
78 parseOne(root);
79 }
80 return n;
81}
82
83} // namespace eve::rpg
int root
Definition AnimSmr.cpp:119
职业(Class)定义:可学技能(升级解锁)与职业基础特征,进程级注册表。
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
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
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
static const ClassDefinition * find(const std::string &id)
Find a registered class definition by id.
Definition Class.cpp:32
static void registerClass(const ClassDefinition &def)
Registers class.
Definition Class.cpp:27
static void clear()
Clears .
Definition Class.cpp:40
static int loadFromJson(const std::string &json, std::string *error=nullptr)
从 JSON 数组/对象批量注册。元素形如: { "id":"warrior","displayName":"战士", "traits":["mighty"], "learnSkills":[{"ski...
Definition Class.cpp:44
static bool remove(const std::string &id)
Remove a class by id (compatibility facade returning whether it was present).
Definition Class.cpp:38
static int count()
Returns the number of .
Definition Class.cpp:42
RPG 模块的基础实体:把属性 / 状态 / 技能三张表挂到一个 ECS 实体上。
数据驱动的职业模板。
Definition Class.h:26
bool hasTag(const std::string &tag) const
True when tag.
Definition Class.cpp:11
std::vector< std::string > traits
职业基础特征 id(施加于 actor)
Definition Class.h:30
std::vector< std::string > tags
Definition Class.h:31
std::string getExtra(const std::string &key, const std::string &fallback={}) const
Returns the extra.
Definition Class.cpp:15
std::unordered_map< std::string, std::string > extra
Definition Class.h:32
std::vector< ClassLearnSkill > learnSkills
Definition Class.h:29
std::string displayName
Definition Class.h:28
一条"升到 level 级可学 skillId"的规格。
Definition Class.h:20
std::string skillId
Definition Class.h:21