/* * 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 prepareTreasurePile(const CTreasureInfo & treasureInfo); rmg::Object constructTreasurePile(const std::vector & treasureInfos, bool densePlacement = false); protected: class ObjectPool { public: void addObject(const ObjectInfo & info); void updateObject(MapObjectID id, MapObjectSubID subid, ObjectInfo info); std::vector & getPossibleObjects(); void patchWithZoneConfig(const Zone & zone, TreasurePlacer * tp); void sortPossibleObjects(); void discardObjectsAboveValue(ui32 value); ObjectConfig::EObjectCategory getObjectCategory(CompoundMapObjectID id); private: std::vector possibleObjects; std::map 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 creatures; //native creatures for this zone std::vector tierValues; }; VCMI_LIB_NAMESPACE_END