/src/application/code/core/Wootook/Empire/Model/BuilderAbstract.php

https://github.com/wootook/wootook · PHP · 254 lines · 179 code · 47 blank · 28 comment · 20 complexity · e88ff972cc27820bfc94ee72a53db5a9 MD5 · raw file

  1. <?php
  2. abstract class Wootook_Empire_Model_BuilderAbstract
  3. implements Countable, Serializable, Iterator
  4. {
  5. /**
  6. * Planet instance
  7. * @var Wootook_Empire_Model_Planet
  8. */
  9. protected $_currentPlanet = null;
  10. /**
  11. * Player instance
  12. * @var Wootook_Player_Model_Entity
  13. */
  14. protected $_currentPlayer = null;
  15. /**
  16. * construction queue
  17. * @var array
  18. */
  19. protected $_queue = null;
  20. /**
  21. * construction queue
  22. * @var array
  23. */
  24. protected $_itemClass = 'Wootook_Empire_Model_Builder_Item';
  25. /**
  26. *
  27. * @param Wootook_Empire_Model_Planet $currentPlanet
  28. * @param Wootook_Player_Model_Entity $currentPlayer
  29. */
  30. public function __construct(Wootook_Empire_Model_Planet $currentPlanet, Wootook_Player_Model_Entity $currentPlayer)
  31. {
  32. $this->_currentPlanet = $currentPlanet;
  33. $this->_currentPlayer = $currentPlayer;
  34. $this->init();
  35. }
  36. abstract public function init();
  37. abstract protected function _initItem(Array $params);
  38. public function enqueue($params, $index = null)
  39. {
  40. if ($this->_currentPlayer->isVacation()) {
  41. return $this;
  42. }
  43. $item = $this->_initItem($params);
  44. if ($item === null) {
  45. return $this;
  46. }
  47. if ($index === null) {
  48. $index = $this->_generateIndex();
  49. }
  50. $item->setIndex($index);
  51. $this->_queue[$index] = $item;
  52. return $this;
  53. }
  54. public function dequeue($item)
  55. {
  56. unset($this->_queue[$item->getIndex()]);
  57. return $this;
  58. }
  59. protected function _generateIndex()
  60. {
  61. return uniqid();
  62. }
  63. public function getItem($itemIndex)
  64. {
  65. if (isset($this->_queue[$itemIndex])) {
  66. return $this->_queue[$itemIndex];
  67. }
  68. return null;
  69. }
  70. protected function _serializeQueue()
  71. {
  72. $serialize = array();
  73. foreach ($this->_queue as $itemIndex => $itemInstance) {
  74. $serialize[$itemIndex] = $itemInstance->getAllDatas();
  75. }
  76. return serialize($serialize);
  77. }
  78. protected function _unserializeQueue($serialized)
  79. {
  80. $this->clearQueue();
  81. $unserialized = false;
  82. if (!empty($serialized)) {
  83. $unserialized = @unserialize($serialized);
  84. }
  85. if ($unserialized === false) {
  86. $this->_queue = array();
  87. return $this;
  88. }
  89. foreach ($unserialized as $itemIndex => $itemData) {
  90. $this->enqueue($itemData, $itemIndex);
  91. }
  92. return $this;
  93. }
  94. public function __toString()
  95. {
  96. return $this->_serializeQueue();
  97. }
  98. public function getQueue()
  99. {
  100. return $this->_queue;
  101. }
  102. public function clearQueue()
  103. {
  104. $this->_queue = array();
  105. }
  106. abstract public function updateQueue(Wootook_Core_DateTime $time);
  107. abstract public function appendQueue($typeId, $qty, Wootook_Core_DateTime $time);
  108. /**
  109. * Check if an item type is actually buildable on the current
  110. * planet, depending on the technology and buildings requirements.
  111. *
  112. * @param int $typeId
  113. * @return bool
  114. */
  115. public function checkAvailability($typeId)
  116. {
  117. $types = Wootook_Empire_Helper_Config_Types::getSingleton();
  118. $requirements = Wootook_Empire_Helper_Config_Requirements::getSingleton();
  119. if (!isset($requirements[$typeId]) || empty($requirements[$typeId])) {
  120. return true;
  121. }
  122. foreach ($requirements[$typeId] as $requirement => $level) {
  123. if ($types->is($requirement, Legacies_Empire::TYPE_BUILDING) && $this->_currentPlanet->hasElement($requirement, $level)) {
  124. continue;
  125. } else if ($types->is($requirement, Legacies_Empire::TYPE_RESEARCH) && $this->_currentPlayer->hasElement($requirement, $level)) {
  126. continue;
  127. } else if ($types->is($requirement, Legacies_Empire::TYPE_DEFENSE) && $this->_currentPlanet->hasElement($requirement, $level)) {
  128. continue;
  129. } else if ($types->is($requirement, Legacies_Empire::TYPE_SHIP) && $this->_currentPlanet->hasElement($requirement, $level)) {
  130. continue;
  131. }
  132. return false;
  133. }
  134. return true;
  135. }
  136. abstract public function getResourcesNeeded($typeId, $level);
  137. abstract public function getBuildingTime($typeId, $level);
  138. public function serialize()
  139. {
  140. return $this->_serializeQueue();
  141. }
  142. public function unserialize($serialized)
  143. {
  144. $this->_unserializeQueue($serialized);
  145. }
  146. public function count()
  147. {
  148. return count($this->_queue);
  149. }
  150. public function current()
  151. {
  152. return current($this->_queue);
  153. }
  154. public function next()
  155. {
  156. return next($this->_queue);
  157. }
  158. public function key()
  159. {
  160. return key($this->_queue);
  161. }
  162. public function valid()
  163. {
  164. return current($this->_queue) !== false;
  165. }
  166. public function rewind()
  167. {
  168. reset($this->_queue);
  169. }
  170. public function getCurrentPlanet()
  171. {
  172. return $this->_currentPlanet;
  173. }
  174. public function getCurrentPlayer()
  175. {
  176. return $this->_currentPlayer;
  177. }
  178. public function setCurrentPlanet(Wootook_Empire_Model_Planet $planet)
  179. {
  180. $this->_currentPlanet = $planet;
  181. return $this;
  182. }
  183. public function setCurrentPlayer(Wootook_Player_Model_Entity $player)
  184. {
  185. $this->_currentPlayer = $player;
  186. return $this;
  187. }
  188. protected function _calculateResourceRemainingAmounts($resourceNeeded)
  189. {
  190. $resourceAmounts = array();
  191. foreach ($resourceNeeded as $resourceId => $resourceAmount) {
  192. $resourceAmounts[$resourceId] = Math::sub($this->_currentPlanet[$resourceId], $resourceAmount);
  193. if (Math::isNegative($resourceAmounts[$resourceId])) {
  194. return false;
  195. }
  196. }
  197. return $resourceAmounts;
  198. }
  199. protected function _calculateResourceReclaimedAmounts($resourceNeeded)
  200. {
  201. $resourceAmounts = array();
  202. foreach ($resourceNeeded as $resourceId => $resourceAmount) {
  203. $resourceAmounts[$resourceId] = Math::add($this->_currentPlanet[$resourceId], $resourceAmount);
  204. }
  205. return $resourceAmounts;
  206. }
  207. }