1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-22 22:13:35 +02:00
vcmi/lib/rmg/modificators/TreasurePlacer.h
2024-09-14 08:55:28 +02:00

99 lines
2.6 KiB
C++

/*
* TreasurePlacer.h, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
#pragma once
#include "../ObjectInfo.h"
#include "../Zone.h"
#include "../../mapObjects/ObjectTemplate.h"
VCMI_LIB_NAMESPACE_BEGIN
class CGObjectInstance;
class ObjectManager;
class RmgMap;
class CMapGenerator;
class ObjectConfig;
class TreasurePlacer: public Modificator
{
public:
MODIFICATOR(TreasurePlacer);
void process() override;
void init() override;
char dump(const int3 &) override;
void createTreasures(ObjectManager & manager);
void addObjectToRandomPool(const ObjectInfo& oi);
void setBasicProperties(ObjectInfo & oi, CompoundMapObjectID objid) const;
// TODO: Can be defaulted to addAllPossibleObjects, but then each object will need to be configured
void addCommonObjects();
void addDwellings();
void addPandoraBoxes();
void addPandoraBoxesWithGold();
void addPandoraBoxesWithExperience();
void addPandoraBoxesWithCreatures();
void addPandoraBoxesWithSpells();
void addSeerHuts();
void addPrisons();
void addScrolls();
void addAllPossibleObjects(); //add objects, including zone-specific, to possibleObjects
// TODO: Read custom object config from zone file
/// Get all objects for this terrain
void setMaxPrisons(size_t count);
size_t getMaxPrisons() const;
int creatureToCount(const CCreature * creature) const;
protected:
bool isGuardNeededForTreasure(int value);
ObjectInfo * getRandomObject(ui32 desiredValue, ui32 currentValue, bool allowLargeObjects);
std::vector<ObjectInfo*> prepareTreasurePile(const CTreasureInfo & treasureInfo);
rmg::Object constructTreasurePile(const std::vector<ObjectInfo*> & treasureInfos, bool densePlacement = false);
protected:
class ObjectPool
{
public:
void addObject(const ObjectInfo & info);
void updateObject(MapObjectID id, MapObjectSubID subid, ObjectInfo info);
std::vector<ObjectInfo> & getPossibleObjects();
void patchWithZoneConfig(const Zone & zone, TreasurePlacer * tp);
void sortPossibleObjects();
void discardObjectsAboveValue(ui32 value);
ObjectConfig::EObjectCategory getObjectCategory(CompoundMapObjectID id);
private:
std::vector<ObjectInfo> possibleObjects;
std::map<CompoundMapObjectID, ObjectInfo> customObjects;
} objects;
// TODO: Need to nagivate and update these
int minGuardedValue = 0;
rmg::Area treasureArea;
rmg::Area treasureBlockArea;
rmg::Area guards;
size_t maxPrisons;
std::vector<const CCreature *> creatures; //native creatures for this zone
std::vector<int> tierValues;
};
VCMI_LIB_NAMESPACE_END