2021-12-05 17:54:36 +00:00
|
|
|
#pragma once
|
|
|
|
|
2021-12-20 10:25:45 +00:00
|
|
|
#include "dCommonVars.h"
|
|
|
|
#include <unordered_map>
|
|
|
|
#include "Singleton.h"
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2021-12-20 10:25:45 +00:00
|
|
|
class Entity;
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2021-12-20 10:25:45 +00:00
|
|
|
struct RarityTableEntry {
|
|
|
|
uint32_t rarity;
|
|
|
|
float randMax;
|
|
|
|
};
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2021-12-20 10:25:45 +00:00
|
|
|
typedef std::vector<RarityTableEntry> RarityTable;
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2021-12-20 10:25:45 +00:00
|
|
|
struct LootMatrixEntry {
|
|
|
|
uint32_t lootTableIndex;
|
|
|
|
uint32_t rarityTableIndex;
|
|
|
|
float percent;
|
|
|
|
uint32_t minDrop;
|
|
|
|
uint32_t maxDrop;
|
|
|
|
};
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2021-12-20 10:25:45 +00:00
|
|
|
typedef std::vector<LootMatrixEntry> LootMatrix;
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2021-12-20 10:25:45 +00:00
|
|
|
struct LootTableEntry {
|
|
|
|
LOT itemID;
|
|
|
|
bool isMissionDrop;
|
|
|
|
};
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2021-12-20 10:25:45 +00:00
|
|
|
typedef std::vector<LootTableEntry> LootTable;
|
2021-12-05 17:54:36 +00:00
|
|
|
|
2021-12-20 10:25:45 +00:00
|
|
|
// used for glue code with Entity and Player classes
|
|
|
|
namespace Loot {
|
|
|
|
struct Info {
|
|
|
|
LWOOBJID id;
|
|
|
|
LOT lot;
|
|
|
|
uint32_t count;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class LootGenerator : public Singleton<LootGenerator> {
|
|
|
|
public:
|
|
|
|
LootGenerator();
|
|
|
|
|
|
|
|
std::unordered_map<LOT, int32_t> RollLootMatrix(Entity* player, uint32_t matrixIndex);
|
|
|
|
std::unordered_map<LOT, int32_t> RollLootMatrix(uint32_t matrixIndex);
|
|
|
|
void GiveLoot(Entity* player, uint32_t matrixIndex);
|
|
|
|
void GiveLoot(Entity* player, std::unordered_map<LOT, int32_t>& result);
|
|
|
|
void GiveActivityLoot(Entity* player, Entity* source, uint32_t activityID, int32_t rating = 0);
|
|
|
|
void DropLoot(Entity* player, Entity* killedObject, uint32_t matrixIndex, uint32_t minCoins, uint32_t maxCoins);
|
|
|
|
void DropLoot(Entity* player, Entity* killedObject, std::unordered_map<LOT, int32_t>& result, uint32_t minCoins, uint32_t maxCoins);
|
|
|
|
void DropActivityLoot(Entity* player, Entity* source, uint32_t activityID, int32_t rating = 0);
|
|
|
|
|
|
|
|
private:
|
|
|
|
std::unordered_map<uint32_t, uint8_t> m_ItemRarities;
|
|
|
|
std::unordered_map<uint32_t, RarityTable> m_RarityTables;
|
|
|
|
std::unordered_map<uint32_t, LootMatrix> m_LootMatrices;
|
|
|
|
std::unordered_map<uint32_t, LootTable> m_LootTables;
|
2021-12-05 17:54:36 +00:00
|
|
|
};
|