Esempio n. 1
0
 /**
  * форматирование списка зон, перевод зон из 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;
 }