6#include <unordered_map>
13std::unordered_map<std::string, LootTableDefinition> &lootTables() {
14 static std::unordered_map<std::string, LootTableDefinition>
t;
20 if (def.
id.empty())
return;
21 lootTables()[def.
id] = def;
27 if (!doc.
valid())
return 0;
30 const auto parseTable = [&](
Value o) {
31 if (!o.isObject())
return;
33 def.
id = o.getString(
"id");
34 if (def.
id.empty())
return;
36 for (
size_t i = 0; i <
entries.size(); ++i) {
43 if (entry.
itemId.empty())
continue;
47 def.
entries.push_back(std::move(entry));
49 lootTables()[def.
id] = std::move(def);
53 for (
size_t i = 0; i <
root.size(); ++i) parseTable(
root.at(i));
54 }
else if (
root.isObject()) {
61 auto &
t = lootTables();
63 return it ==
t.end() ? nullptr : &it->second;
74 std::uniform_real_distribution<double> chanceDist(0.0, 1.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);
std::unordered_map< std::string, QuestRuntime > entries
int addItem(const std::string &itemId, int quantity)
Adds item.
EVENGINE_API_FOUNDATION public API.
static Document parse(const std::string &text, std::string *error=nullptr)
Parse.
EVENGINE_API_FOUNDATION public API.
Value get(const char *key) const
Returns the value.
Value at(size_t index) const
At.
int getInt(const char *key, int fallback=0) const
Returns the int.
std::string getString(const char *key, const std::string &fallback={}) const
Returns the string.
double getDouble(const char *key, double fallback=0.0) const
Returns the double.
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 实体上。
double chance
[0,1],roll 值小于 chance 才掉落
std::vector< LootEntry > entries