[ 'CEO Office / Executive Lounge', 'Open Area / Staff Room', 'Tellers\' Office / Archives', 'Basement CCTV Room / Basement Lockers', ], 'Border' => [ 'Supply Room / Customs Inspection', 'Workshop / Ventilation Room', 'Bathroom / Tellers', 'Armory Lockers / Archives', ], 'Club House' => [ 'Bedroom / Gym', 'Cash Room / CCTV Room', 'Bar / Stock Room', 'Basement Church / Basement Arsenal Room', ], 'Coastline' => [ 'Billiards Room / Hookah Lounge', 'Theater / Penthouse', 'Kitchen / Service Entrance', 'Blue Bar / Sunrise Bar', ], 'Consulate' => [ 'Meeting Room / Consulate Office', 'Press Room / Lobby', 'Basement Archives / Tellers', 'Basement Cafeteria / Basement Garage', ], 'Kafe Dostoyevsky' => [ '3rd Floor Cocktail Lounge', 'Fireplace Hall / Mining Room', 'Reading Room / Fireplace Hall', 'Kitchen Service / Kitchen Cooking' ], 'Villa' => [ 'Aviator Room / Games Room', 'Trophy Room / Statuary Room', 'Living Room / Library', 'Dining Room / Kitchen' ] ]; private $position = 0; protected $currentMap = 'Villa'; protected $history = [ [ 'site' => 'Aviator Room / Games Room', 'win' => Stripe::TEAM_ORANGE, 'win_role' => self::ROLE_DEFEND ], [ 'site' => 'Trophy Room / Statuary Room', 'win' => Stripe::TEAM_BLUE, 'win_role' => self::ROLE_ATTACK ], [ 'site' => 'Dining Room / Kitchen', 'win' => Stripe::TEAM_ORANGE, 'win_role' => self::ROLE_ATTACK ] ]; /** * @return array */ public function getSites(): array { return $this->sites; } /** * @return string */ public function getCurrentMap(): string { return $this->currentMap; } /** * @return array */ public function getHistory(): array { return $this->history; } private function validMap($mapName) { $mapList = array_keys($this->sites); return in_array($mapName, $mapList); } private function validSite($siteName) { return in_array($siteName, $this->sites[$this->currentMap]); } public function setCurrentMap(string $mapName) { if (!$this->validMap($mapName)) { throw new \InvalidArgumentException("No such map: " . $mapName); } $this->currentMap = $mapName; } public function addHistoryItem(string $site, string $winner = Stripe::TEAM_BLUE, $win_role = MatchHistory::ROLE_DEFEND) { if (!$this->validSite($site)) { throw new \InvalidArgumentException("No such site: " . $site . " on map: " . $this->currentMap); } if (!in_array($winner, [Stripe::TEAM_BLUE, Stripe::TEAM_ORANGE])) { throw new \InvalidArgumentException("No such team: " . $winner); } if (!in_array($win_role, [MatchHistory::ROLE_DEFEND, MatchHistory::ROLE_ATTACK])) { throw new \InvalidArgumentException("No such role: " . $win_role); } $this->history[] = [ 'site' => $site, 'win' => $winner, 'win_role' => $win_role ]; } public function getState(): array { return [ 'history' => $this->history, 'map' => $this->currentMap ]; } public function loadState(array $state): self { if (!empty($state['map'])) { $this->setCurrentMap($state['map']); } if (!empty($state['history'])) { foreach ($state['history'] as $item) { $this->addHistoryItem($item['site'], $item['win'], $item['win_role']); } } return $this; } public function current() { return $this->history[$this->position]; } public function next() { $this->position++; } public function key() { return $this->position; } public function valid() { return isset($this->history[$this->position]); } public function rewind() { $this->position = 0; } public function count() { return count($this->history); } }