载入中...
搜索中...
未找到
LootSystem.cpp
浏览该文件的文档.
1#include "rpg/LootSystem.h"
2
3#include "common/Json.h"
4#include "inventory/Bag.h"
5
6#include <unordered_map>
7
8namespace eve::rpg {
9
11
12namespace {
13std::unordered_map<std::string, LootTableDefinition> &lootTables() {
14 static std::unordered_map<std::string, LootTableDefinition> t;
15 return t;
16}
17} // namespace
18
20 if (def.id.empty()) return;
21 lootTables()[def.id] = def;
22}
23
24int LootSystem::registerTablesFromJson(const std::string &json) {
25 std::string err;
26 const eve::json::Document doc = eve::json::Document::parse(json, &err);
27 if (!doc.valid()) return 0;
28 const Value root = doc.root();
29 int n = 0;
30 const auto parseTable = [&](Value o) {
31 if (!o.isObject()) return;
33 def.id = o.getString("id");
34 if (def.id.empty()) return;
35 const Value entries = o.get("entries");
36 for (size_t i = 0; i < entries.size(); ++i) {
37 const Value e = entries.at(i);
38 LootEntry entry;
39 entry.itemId = e.getString("itemId");
40 entry.chance = e.getDouble("chance", 0.0);
41 entry.minQty = e.getInt("minQty", 1);
42 entry.maxQty = e.getInt("maxQty", 1);
43 if (entry.itemId.empty()) continue;
44 if (entry.maxQty < entry.minQty) entry.maxQty = entry.minQty;
45 if (entry.maxQty <= 0) entry.maxQty = 1;
46 if (entry.minQty <= 0) entry.minQty = 1;
47 def.entries.push_back(std::move(entry));
48 }
49 lootTables()[def.id] = std::move(def);
50 ++n;
51 };
52 if (root.isArray()) {
53 for (size_t i = 0; i < root.size(); ++i) parseTable(root.at(i));
54 } else if (root.isObject()) {
55 parseTable(root);
56 }
57 return n;
58}
59
60const LootTableDefinition *LootSystem::find(const std::string &id) {
61 auto &t = lootTables();
62 auto it = t.find(id);
63 return it == t.end() ? nullptr : &it->second;
64}
65
66void LootSystem::clear() { lootTables().clear(); }
67
68int LootSystem::count() { return int(lootTables().size()); }
69
70int LootSystem::roll(const std::string &tableId, eve::inventory::Bag *bag, std::mt19937 &rng) {
71 if (!bag) return 0;
72 const LootTableDefinition *def = find(tableId);
73 if (!def) return 0;
74 std::uniform_real_distribution<double> chanceDist(0.0, 1.0);
75 int drops = 0;
76 for (const auto &entry : def->entries) {
77 if (chanceDist(rng) >= entry.chance) continue;
78 std::uniform_int_distribution<int> qtyDist(entry.minQty, entry.maxQty);
79 const int qty = qtyDist(rng);
80 if (qty <= 0) continue;
81 bag->addItem(entry.itemId, qty);
82 ++drops;
83 }
84 return drops;
85}
86
87} // namespace eve::rpg
int root
Definition AnimSmr.cpp:119
std::unordered_map< std::string, QuestRuntime > entries
glm::vec3 n
Definition Grass.cpp:63
掉落表:按概率随机掉落物品到背包。
float t
float size
Definition TreeMesh.cpp:156
格子型物品容器(脚本可直接操作)。
Definition Bag.h:21
int addItem(const std::string &itemId, int quantity)
Adds item.
Definition Bag.cpp:67
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
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
double getDouble(const char *key, double fallback=0.0) const
Returns the double.
Definition Json.cpp:424
static int registerTablesFromJson(const std::string &json)
Registers tables from json.
static const LootTableDefinition * find(const std::string &id)
Finds .
static void registerTable(const LootTableDefinition &def)
Registers table.
static int count()
Returns the number of .
static void clear()
Clears .
static int roll(const std::string &tableId, eve::inventory::Bag *bag, std::mt19937 &rng)
按掉落表 roll 一次,把命中的物品加入 bag。
RPG 模块的基础实体:把属性 / 状态 / 技能三张表挂到一个 ECS 实体上。
掉落表里的一条掉落。
Definition LootSystem.h:26
double chance
[0,1],roll 值小于 chance 才掉落
Definition LootSystem.h:28
std::string itemId
Definition LootSystem.h:27
std::vector< LootEntry > entries
Definition LootSystem.h:36