载入中...
搜索中...
未找到
EquipmentSystem.cpp
浏览该文件的文档.
2
3#include "common/Json.h"
6#include "rpg/RPGActor.h"
7
8#include <unordered_map>
9
10namespace eve::rpg {
11
13
14namespace {
15
16std::unordered_map<std::string, std::vector<EquipmentStat>> &itemStatsTable() {
17 static std::unordered_map<std::string, std::vector<EquipmentStat>> t;
18 return t;
19}
20
21} // namespace
22
23void EquipmentSystem::registerItemStat(const std::string &itemId, const EquipmentStat &stat) {
24 if (itemId.empty() || stat.attribute.empty()) return;
25 itemStatsTable()[itemId].push_back(stat);
26}
27
28int EquipmentSystem::registerItemStatsFromJson(const std::string &itemId, const std::string &json) {
29 if (itemId.empty()) return 0;
30 std::string err;
31 const eve::json::Document doc = eve::json::Document::parse(json, &err);
32 if (!doc.valid()) return 0;
33 const Value root = doc.root();
34 int n = 0;
35 const auto addObject = [&](Value o) {
36 if (!o.isObject()) return;
37 EquipmentStat stat;
38 stat.attribute = o.getString("attribute");
39 stat.op = o.getString("op", "add");
40 stat.value = o.getDouble("value", 0.0);
41 stat.priority = o.getInt("priority", 0);
42 if (stat.attribute.empty()) return;
43 itemStatsTable()[itemId].push_back(std::move(stat));
44 ++n;
45 };
46 if (root.isArray()) {
47 for (size_t i = 0; i < root.size(); ++i) addObject(root.at(i));
48 } else if (root.isObject()) {
49 addObject(root);
50 }
51 return n;
52}
53
54void EquipmentSystem::clearItemStats(const std::string &itemId) { itemStatsTable().erase(itemId); }
55
56void EquipmentSystem::clearAll() { itemStatsTable().clear(); }
57
58int EquipmentSystem::statItemCount() { return int(itemStatsTable().size()); }
59
61 if (!actor || !equip) return 0;
62 int applied = 0;
63 for (int i = 0; i < equip->getSlotCount(); ++i) {
64 const std::string slot = equip->getSlotName(i);
65 const std::string source = "equip:" + slot;
66 // 先清除该槽位旧加成(覆盖换装/卸下的情况)。
68 if (equip->isSlotEmpty(slot)) continue;
69 const std::string itemId = equip->getSlotItemId(slot);
70 auto it = itemStatsTable().find(itemId);
71 if (it == itemStatsTable().end()) continue;
72 for (const auto &stat : it->second) {
73 AttributeSystem::addModifier(actor, stat.attribute, source, stat.op, stat.value,
74 stat.priority);
75 ++applied;
76 }
77 }
78 return applied;
79}
80
81} // namespace eve::rpg
LogicalId itemId
int root
Definition AnimSmr.cpp:119
RPG's thin compatibility facade over the attributes module.
装备加成:把已装备物品(inventory::EquipmentSet)的注册属性加成同步到 actor 的属性修改器上。
glm::vec3 n
Definition Grass.cpp:63
float t
float size
Definition TreeMesh.cpp:156
const UnitySourceAsset & source
EVENGINE_API_FOUNDATION public API.
Definition Equipment.h:19
std::string getSlotName(int index) const
Returns the slot name.
Definition Equipment.cpp:39
bool isSlotEmpty(const std::string &slotName) const
True when slot empty.
Definition Equipment.cpp:44
std::string getSlotItemId(const std::string &slotName) const
Returns the slot item id.
Definition Equipment.cpp:50
int getSlotCount() const
Returns the slot count.
Definition Equipment.cpp:37
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
static int removeAllModifiersBySource(RPGActor *actor, const std::string &source)
Compatibility all-attribute source removal facade.
static eve::Result< ModifierId > addModifier(RPGActor *actor, AttributeModifier modifier)
Add one canonical modifier to an actor.
static int registerItemStatsFromJson(const std::string &itemId, const std::string &json)
批量注册某物品的属性加成;返回成功条数。
static int syncEquipModifiers(RPGActor *actor, eve::inventory::EquipmentSet *equip)
把装备栏当前装备同步为 actor 属性修改器(先清旧再施加)。
static int statItemCount()
已注册加成的物品数量。
static void clearItemStats(const std::string &itemId)
清除某物品的加成。
static void registerItemStat(const std::string &itemId, const EquipmentStat &stat)
为某物品 id 注册一条属性加成。
static void clearAll()
清除全部物品加成注册。
属性 / 状态 / 技能三表合一的 ECS 实体。
Definition RPGActor.h:34
RPG 模块的基础实体:把属性 / 状态 / 技能三张表挂到一个 ECS 实体上。
一件物品的一条属性加成规格。