2
0

ResourceSet.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include "StdInc.h"
  2. #include "ResourceSet.h"
  3. #include "GameConstants.h"
  4. Res::ResourceSet::ResourceSet()
  5. {
  6. resize(GameConstants::RESOURCE_QUANTITY, 0);
  7. }
  8. bool Res::ResourceSet::nonZero() const
  9. {
  10. for(int i = 0; i < size(); i++)
  11. if(at(i))
  12. return true;
  13. return false;
  14. }
  15. void Res::ResourceSet::amax(const TResourceCap &val)
  16. {
  17. for(int i = 0; i < size(); i++)
  18. ::vstd::amax(at(i), val);
  19. }
  20. bool Res::ResourceSet::canBeAfforded(const ResourceSet &res) const
  21. {
  22. return Res::canAfford(res, *this);
  23. }
  24. bool Res::ResourceSet::canAfford(const ResourceSet &price) const
  25. {
  26. return Res::canAfford(*this, price);
  27. }
  28. bool Res::canAfford(const ResourceSet &res, const ResourceSet &price)
  29. {
  30. assert(res.size() == price.size() && price.size() == GameConstants::RESOURCE_QUANTITY);
  31. for(int i = 0; i < GameConstants::RESOURCE_QUANTITY; i++)
  32. if(price[i] > res[i])
  33. return false;
  34. return true;
  35. }
  36. bool Res::ResourceSet::nziterator::valid()
  37. {
  38. return cur.resType < GameConstants::RESOURCE_QUANTITY && cur.resVal;
  39. }
  40. Res::ResourceSet::nziterator Res::ResourceSet::nziterator::operator++()
  41. {
  42. advance();
  43. return *this;
  44. }
  45. Res::ResourceSet::nziterator Res::ResourceSet::nziterator::operator++(int)
  46. {
  47. nziterator ret = *this;
  48. advance();
  49. return ret;
  50. }
  51. const Res::ResourceSet::nziterator::ResEntry& Res::ResourceSet::nziterator::operator*() const
  52. {
  53. return cur;
  54. }
  55. const Res::ResourceSet::nziterator::ResEntry * Res::ResourceSet::nziterator::operator->() const
  56. {
  57. return &cur;
  58. }
  59. void Res::ResourceSet::nziterator::advance()
  60. {
  61. do
  62. {
  63. cur.resType++;
  64. } while(cur.resType < GameConstants::RESOURCE_QUANTITY && !(cur.resVal=rs[cur.resType]));
  65. if(cur.resType >= GameConstants::RESOURCE_QUANTITY)
  66. cur.resVal = -1;
  67. }
  68. Res::ResourceSet::nziterator::nziterator(const ResourceSet &RS)
  69. : rs(RS)
  70. {
  71. cur.resType = 0;
  72. cur.resVal = rs[0];
  73. if(!valid())
  74. advance();
  75. }