PrisonHeroPlacer.cpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /*
  2. * PrisonHeroPlacer.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "PrisonHeroPlacer.h"
  12. #include "../CMapGenerator.h"
  13. #include "../RmgMap.h"
  14. #include "TreasurePlacer.h"
  15. #include "../CZonePlacer.h"
  16. #include "../../VCMI_Lib.h"
  17. #include "../../mapObjectConstructors/AObjectTypeHandler.h"
  18. #include "../../mapObjectConstructors/CObjectClassesHandler.h"
  19. #include "../../mapObjects/MapObjects.h"
  20. VCMI_LIB_NAMESPACE_BEGIN
  21. void PrisonHeroPlacer::process()
  22. {
  23. getAllowedHeroes();
  24. }
  25. void PrisonHeroPlacer::init()
  26. {
  27. // Reserve at least 16 heroes for each player
  28. reservedHeroes = 16 * generator.getMapGenOptions().getHumanOrCpuPlayerCount();
  29. }
  30. void PrisonHeroPlacer::getAllowedHeroes()
  31. {
  32. // TODO: Give each zone unique HeroPlacer with private hero list?
  33. // Call that only once
  34. if (allowedHeroes.empty())
  35. {
  36. allowedHeroes = generator.getAllPossibleHeroes();
  37. }
  38. }
  39. int PrisonHeroPlacer::getPrisonsRemaning() const
  40. {
  41. return std::max<int>(allowedHeroes.size() - reservedHeroes, 0);
  42. }
  43. HeroTypeID PrisonHeroPlacer::drawRandomHero()
  44. {
  45. RecursiveLock lock(externalAccessMutex);
  46. if (getPrisonsRemaning() > 0)
  47. {
  48. RandomGeneratorUtil::randomShuffle(allowedHeroes, zone.getRand());
  49. HeroTypeID ret = allowedHeroes.back();
  50. allowedHeroes.pop_back();
  51. return ret;
  52. }
  53. else
  54. {
  55. throw rmgException("No unused heroes left for prisons!");
  56. }
  57. }
  58. void PrisonHeroPlacer::restoreDrawnHero(const HeroTypeID & hid)
  59. {
  60. RecursiveLock lock(externalAccessMutex);
  61. allowedHeroes.push_back(hid);
  62. }
  63. VCMI_LIB_NAMESPACE_END