123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- /*
- * PrisonHeroPlacer.cpp, 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
- *
- */
- #include "StdInc.h"
- #include "PrisonHeroPlacer.h"
- #include "../CMapGenerator.h"
- #include "../RmgMap.h"
- #include "TreasurePlacer.h"
- #include "../CZonePlacer.h"
- #include "../../GameLibrary.h"
- #include "../../mapObjectConstructors/AObjectTypeHandler.h"
- #include "../../mapObjectConstructors/CObjectClassesHandler.h"
- #include "../../mapObjects/MapObjects.h"
- #include <vstd/RNG.h>
- VCMI_LIB_NAMESPACE_BEGIN
- void PrisonHeroPlacer::process()
- {
- getAllowedHeroes();
- }
- void PrisonHeroPlacer::init()
- {
- // Reserve at least 16 heroes for each player
- reservedHeroes = 16 * generator.getMapGenOptions().getHumanOrCpuPlayerCount();
- }
- void PrisonHeroPlacer::getAllowedHeroes()
- {
- // TODO: Give each zone unique HeroPlacer with private hero list?
- // Call that only once
- if (allowedHeroes.empty())
- {
- allowedHeroes = generator.getAllPossibleHeroes();
- }
- }
- int PrisonHeroPlacer::getPrisonsRemaining() const
- {
- return std::max<int>(allowedHeroes.size() - reservedHeroes, 0);
- }
- HeroTypeID PrisonHeroPlacer::drawRandomHero()
- {
- RecursiveLock lock(externalAccessMutex);
- if (getPrisonsRemaining() > 0)
- {
- RandomGeneratorUtil::randomShuffle(allowedHeroes, zone.getRand());
- HeroTypeID ret = allowedHeroes.back();
- allowedHeroes.pop_back();
- return ret;
- }
- else
- {
- throw rmgException("No unused heroes left for prisons!");
- }
- }
- void PrisonHeroPlacer::restoreDrawnHero(const HeroTypeID & hid)
- {
- RecursiveLock lock(externalAccessMutex);
- allowedHeroes.push_back(hid);
- }
- VCMI_LIB_NAMESPACE_END
|