_currentPlanet = $currentPlanet; $this->_currentUser = $currentUser; $this->init(); } abstract public function init(); abstract protected function _initItem(); public function enqueue() { $params = func_get_args(); $item = call_user_func_array(array($this, '_initItem'), $params); $item->setIndex($this->_index); $this->_queue[$this->_index++] = $item; return $this; } public function dequeue($itemIndex) { unset($this->_queue[$itemIndex]); return $this; } protected function getItem($itemIndex) { if (isset($this->_queue[$itemIndex])) { return $this->_queue[$itemIndex]; } return null; } protected function _serializeQueue() { $serialize = array(); foreach ($this->_queue as $item) { $serialize[] = $item->getAllDatas(); } return serialize($serialize); } protected function _unserializeQueue($serialized) { $this->clearQueue(); $unserialized = unserialize($serialized); if ($unserialized === false) { $this->_queue = array(); return $this; } foreach ($unserialized as $itemData) { call_user_func_array(array($this, 'enqueue'), $itemData); } return $this; } public function __toString() { return $this->_serializeQueue(); } public function getQueue() { return $this->_queue; } public function clearQueue() { $this->_queue = array(); } /** * Check if an item type is actually buildable on the current * planet, depending on the technology and buildings requirements. * * @param int $typeId * @return bool */ public function checkAvailability($typeId) { $types = Legacies_Empire_Model_Game_Types::getSingleton(); $requirements = Legacies_Empire_Model_Game_Requirements::getSingleton(); if (!isset($requirements[$typeId]) || empty($requirements[$typeId])) { return true; } foreach ($requirements[$typeId] as $requirement => $level) { if ($types->is($requirement, Legacies_Empire::TYPE_BUILDING) && $this->_currentPlanet->hasElement($requirement, $level)) { continue; } else if ($types->is($requirement, Legacies_Empire::TYPE_RESEARCH) && $this->_currentUser->hasElement($requirement, $level)) { continue; } else if ($types->is($requirement, Legacies_Empire::TYPE_DEFENSE) && $this->_currentPlanet->hasElement($requirement, $level)) { continue; } else if ($types->is($requirement, Legacies_Empire::TYPE_SHIP) && $this->_currentPlanet->hasElement($requirement, $level)) { continue; } return false; } try { // Dispatch event. Throw an exception to break the avaliability. Legacies::dispatchEvent('builder.check-availability', array( 'type_id' => $typeId, 'builder' => $this, 'planet' => $this->_currentPlanet, 'user' => $this->_currentUser )); } catch (Legacies_Empire_Model_Builder_Break $e) { return false; } return true; } abstract public function getResourcesNeeded($typeId, $level); abstract public function getBuildingTime($typeId, $level); public function serialize() { return $this->_serializeQueue(); } public function unserialize($serialized) { $this->_unserializeQueue($serialized); } public function count() { return count($this->_queue); } public function current() { return current($this->_queue); } public function next() { $element = next($this->_queue); $this->_index = key($this->_queue); return $element; } public function key() { return $this->_index; } public function valid() { return $this->current() !== false; } public function rewind() { reset($this->_queue); $this->_index = 0; } }