/** * Сбор и отображение выходов из комнаты * @param \Rottenwood\UtopiaMudBundle\Entity\Room $room * @return array */ public function techLookExits($room) { $result = array(); if ($room->getNorth()) { $door = $room->getNorthdoor(); $isDoor = $this->techCheckDoor($door); if (!$isDoor) { $result["n"] = 1; } } if ($room->getSouth()) { $door = $room->getSouthdoor(); $isDoor = $this->techCheckDoor($door); if (!$isDoor) { $result["s"] = 1; } } if ($room->getEast()) { $door = $room->getEastdoor(); $isDoor = $this->techCheckDoor($door); if (!$isDoor) { $result["e"] = 1; } } if ($room->getWest()) { $door = $room->getWestdoor(); $isDoor = $this->techCheckDoor($door); if (!$isDoor) { $result["w"] = 1; } } if ($room->getUp()) { $door = $room->getUpdoor(); $isDoor = $this->techCheckDoor($door); if (!$isDoor) { $result["u"] = 1; } } if ($room->getDown()) { $door = $room->getDowndoor(); $isDoor = $this->techCheckDoor($door); if (!$isDoor) { $result["d"] = 1; } } return $result; }
/** * форматирование списка зон, перевод зон из YAML в БД * @return array * @throws \Symfony\Component\Config\Definition\Exception\Exception */ public function import() { $result = array(); // удаление всех живых монстров и лежащих вещей $this->livemobRepository->deleteAll(); $this->roomitemRepository->deleteAll(); // парсинг файла списка зон $path = $this->kernel->locateResource("@RottenwoodUtopiaMudBundle/Resources/zones/zonelist.yml"); if (!is_string($path)) { throw new Exception("Type of {$path} must be string."); } $zones = Yaml::parse(file_get_contents($path)); echo "Загрузка компонентов:\n"; // Обработка каждой зоны foreach ($zones["zonelist"] as $zoneanchor => $zone) { // если зона размещена на удаленном хосте. if (array_key_exists("url", $zone)) { $yamlRemote = @file_get_contents($zone["url"]); if ($yamlRemote) { echo $zoneanchor, ": зона на удаленном хосте загружена.\n"; $zone = Yaml::parse($yamlRemote); } else { echo $zoneanchor, ": зона на удаленном хосте НЕ загружена!\n"; continue; } } else { echo $zoneanchor, ": загрузка локальной зоны.\n"; $zonepath = $this->kernel->locateResource("@RottenwoodUtopiaMudBundle/Resources/zones/" . $zoneanchor . "/rooms.yml"); if (!is_string($zonepath)) { throw new Exception("Type of {$zonepath} must be string."); } $zone = Yaml::parse(file_get_contents($zonepath)); } if (array_key_exists("mobs", $zone)) { // цикл создания и записи в базу новых монстров $i = 1; foreach ($zone["mobs"] as $mobAnchor => $mob) { $oldMob = $this->mobRepository->findByAnchor($mobAnchor, $zoneanchor); $i++; if ($oldMob) { // если комната уже существовала $importMob[$i] = $oldMob[0]; } else { // если комнаты еще нет $importMob[$i] = new Mob(); } $importMob[$i]->setName($mobAnchor); $importMob[$i]->setName1($mob["name"][0]); $importMob[$i]->setName2($mob["name"][1]); $importMob[$i]->setName3($mob["name"][2]); $importMob[$i]->setName4($mob["name"][3]); $importMob[$i]->setName5($mob["name"][4]); $importMob[$i]->setName6($mob["name"][5]); $importMob[$i]->setShortdesc($mob["short"]); $importMob[$i]->setLongdesc($mob["desc"]); $importMob[$i]->setRace($mob["race"]); $importMob[$i]->setST($mob["ST"]); $importMob[$i]->setDX($mob["DX"]); $importMob[$i]->setIQ($mob["IQ"]); $importMob[$i]->setHT($mob["HT"]); $importMob[$i]->setZone($zoneanchor); // подготовка объекта для записи в БД $this->em->persist($importMob[$i]); } } if (array_key_exists("items", $zone)) { // цикл создания и записи в базу новых предметов $i = 1; foreach ($zone["items"] as $itemAnchor => $item) { $oldItem = $this->itemRepository->findByAnchor($itemAnchor, $zoneanchor); $i++; if ($oldItem) { // если моб уже существовал $importItem[$i] = $oldItem; } else { // если моба еще нет $importItem[$i] = new Item(); } $importItem[$i]->setAnchor($itemAnchor); $importItem[$i]->setType($item["type"]); $importItem[$i]->setName1($item["name"][0]); $importItem[$i]->setName2($item["name"][1]); $importItem[$i]->setName3($item["name"][2]); $importItem[$i]->setName4($item["name"][3]); $importItem[$i]->setName5($item["name"][4]); $importItem[$i]->setName6($item["name"][5]); $importItem[$i]->setShortdesc($item["short"]); $importItem[$i]->setLongdesc($item["desc"]); $importItem[$i]->setZone($zoneanchor); // заполнение полей уникальных для типа $itemExtra = array(); switch ($item["type"]) { case "decor": $itemExtra["decoration"] = $itemExtra; break; case "": break; } $importItem[$i]->setExtra($itemExtra); // подготовка объекта для записи в БД $this->em->persist($importItem[$i]); } } // цикл создания и записи в базу новых комнат foreach ($zone["rooms"] as $anchor => $roomData) { $oldRoom = $this->roomRepository->findByAnchor($anchor, $zoneanchor); if ($oldRoom) { // если комната уже существовала $room = $oldRoom[0]; } else { // если комнаты еще нет $room = new Room(); } $room->setAnchor($anchor); $room->setName($roomData["name"]); $room->setRoomdesc($roomData["desc"]); $room->setZone($zoneanchor); $room->setType($roomData["type"]); // выходы и двери // север $dir = "north"; $dirExits = $this->techImportCreateRoomExits($dir, $roomData); $room->setNorth($dirExits["room"]); $room->setNorthdoor($dirExits["door"]); // юг $dir = "south"; $dirExits = $this->techImportCreateRoomExits($dir, $roomData); $room->setSouth($dirExits["room"]); $room->setSouthdoor($dirExits["door"]); // запад $dir = "west"; $dirExits = $this->techImportCreateRoomExits($dir, $roomData); $room->setWest($dirExits["room"]); $room->setWestdoor($dirExits["door"]); // восток $dir = "east"; $dirExits = $this->techImportCreateRoomExits($dir, $roomData); $room->setEast($dirExits["room"]); $room->setEastdoor($dirExits["door"]); // вверх $dir = "up"; $dirExits = $this->techImportCreateRoomExits($dir, $roomData); $room->setUp($dirExits["room"]); $room->setUpdoor($dirExits["door"]); // вниз $dir = "down"; $dirExits = $this->techImportCreateRoomExits($dir, $roomData); $room->setDown($dirExits["room"]); $room->setDowndoor($dirExits["door"]); // если в комнате указаны мобы if (array_key_exists("mobs", $roomData)) { $i = 1; foreach ($roomData["mobs"] as $mobInRoomAnchor) { $mobInRoom = $this->mobRepository->findByAnchor($mobInRoomAnchor, $zoneanchor); // TODO: разобраться получше if (!$mobInRoom) { continue; } /** @var Mob $mobInRoom */ $mobInRoom = $mobInRoom[0]; // расчет максимального хп монстра: HT * 10 $mobHp = 10 * $mobInRoom->getHT(); $livemob[$i] = new Livemob(); $livemob[$i]->setMob($mobInRoom); $livemob[$i]->setRoom($room); $livemob[$i]->setHp($mobHp); $this->em->persist($livemob[$i]); $i++; } } // если в комнате указаны предметы if (array_key_exists("items", $roomData)) { $ii = 1; foreach ($roomData["items"] as $itemInRoomAnchor) { $itemInRoom = $this->itemRepository->findByAnchor($itemInRoomAnchor, $zoneanchor); // TODO: разобраться получше if (!$itemInRoom) { continue; } $roomitem[$ii] = new Roomitem(); $roomitem[$ii]->setItem($itemInRoom); $roomitem[$ii]->setRoom($room); $this->em->persist($roomitem[$ii]); $ii++; } } // подготовка объектов для записи в БД $this->em->persist($room); } } // запись в БД $this->em->flush(); // вывод результата $result["system"] = "Зоны были успешно импортирована."; // Импорт рас $setRaces = $this->setRaces(); if ($setRaces) { $result["system2"] = "Расы были успешно импортированы."; } else { $result["system2"] = "Расы не импортированы!"; } return $result; }