/** * * @return mixed */ public function ai() { $npc = $this->getNpcHelper()->getNpc(); $this->_addListeners($npc); $state = isset($npc["state"]) ? $npc["state"] : self::STATE_STAND; //обработка в зависимости от текущего состояния switch ($state) { //обычное состояние case self::STATE_AGRESSY: $target = $this->getNpcHelper()->getTarget(); //если агрессивный и нет таргета, то находим самую слабую цель if (false === $target) { $this->getLocHelper()->eachObjects("loc", function ($objId, $obj) { if ($objId != $this->getNpcHelper()->getNpcId()) { $players = []; if (substr($objId, 0, 7) == "player_") { //считаем сумму параметров $calcService = new CalculateHelper($this->getNpcHelper()->getNpc()); $statsSumm = $calcService->getStatSumm(); $playerHelper = Game::init()->getService('player.helper')->factory($objId); $playerCalculateService = new CalculateHelper($playerHelper->getPlayer()); $playerStatsSumm = $playerCalculateService->getStatSumm(); $pr = $statsSumm / $playerStatsSumm * 100; //$players[$objId] = ; if ($pr > 5) { //если статы не меньше 1/2 то нападаем $this->getNpcHelper()->setTarget($objId); $battleEvent = new BattleEvent(); $battleEvent->setLocHelper($this->getLocHelper()); $battleEvent->setAttackType(BattleEvent::AUTO_ATTAK); $battleEvent->setToObjectId($objId); $battleEvent->setSelfObjectId($this->getNpcHelper()->getNpcId()); Game::init()->getDispatcher()->dispatch("battle.attack", $battleEvent); } } } }); } if ($this->getLocHelper()->objectExists($target)) { //атакуем } else { $this->supervision->eachLocations(function ($locHelper) use($target) { if ($locHelper->objectExists($target)) { //нашли объект, идем $this->locHelper->moveLocObject($this->getNpcHelper()->getNpcId(), $this->getNpcHelper()->getNpcId()); } }); } break; //обычное состояние //обычное состояние default: break; } }
/** * @param string $npc * @return string */ public static function compileNpcTitle($npc, $player = false) { $calcService = new CalculateHelper($npc); if (false !== $player) { $playerCalc = new CalculateHelper($player); $playerStats = $playerCalc->getStatSumm(); $stats = round($calcService->getStatSumm() / $playerStats * 100); if ($stats > 100) { $stats = 100; } if ($stats < 25) { $label = "default"; } elseif ($stats >= 25 and $stats < 50) { $label = "success"; } elseif ($stats >= 50 and $stats < 75) { $label = "warning"; } else { $label = "danger"; } $title = "<span class='label label-" . $label . "'>" . $stats . " %</span> "; } else { $title = ""; } $title .= $npc["title"]; if ($npc["prof"]) { switch ($npc["prof"]) { case NpcHelper::PROF_GID: $title .= " [гид]"; break; case NpcHelper::PROF_BANKIR: $title .= " [банкир]"; break; case NpcHelper::PROF_HEALER: $title .= " [лекарь]"; break; case NpcHelper::PROF_TRADER: $title .= " [торговец]"; break; case NpcHelper::PROF_TEACHER: $title .= " [учитель]"; break; case NpcHelper::PROF_HOUSE_MAN: $title .= " [хозяин дома]"; break; } } return $title; }
/** * @param LocationHelper $locHelper * @return LocationHelper */ private function _locAi($locHelper) { if (isset($locHelper->getLoc()["loc"]) and is_array($locHelper->getLoc()["loc"])) { $locHelper->eachObjects("loc", function ($objId, $obj) use($locHelper) { //запускаем ии НПС if (substr($objId, 0, 4) == "npc_") { $caclHelper = new CalculateHelper($obj); $caclHelper->calcParams(); $obj = $caclHelper->getObject(); if (!isset($obj["move"])) { $obj = $this->_moveAi($obj, $locHelper); if ($obj["ai"]["move"]["status"][0] == "in_move" and count($obj["ai"]["move"]["list"]) > 0) { //$locHelper->addObject($objId, $obj); $locId = array_pop($obj["ai"]["move"]["list"]); $outMsg = $obj["title"] . " " . $obj["ai"]["move"]["data"]["move"][1] . " " . $locHelper->getDoorName($locId); $inMsg = $obj["ai"]["move"]["data"]["move"][0] . " " . $obj["title"]; $jEvent1 = new JournalEvent($outMsg); $jEvent1->setLocId($locHelper->getLoc()["lid"])->setPlayers($this->getDb()->players); $jEvent2 = new JournalEvent($inMsg); $jEvent2->setLocId($locId)->setPlayers($this->getDb()->players); $this->getService("supervision")->getLocation($locId)->addObject($objId, $obj); $locHelper->removeObject($objId); $this->getDispatcher()->dispatch("addjournal.all", $jEvent1); $this->getDispatcher()->dispatch("addjournal.all", $jEvent2); //$locHelper->addJournal($outMsg, $this->getDb()->players); //$locHelper->factory($locId)->addJournal($inMsg, $this->getDb()->players); } else { $locHelper->addObject($objId, $obj); } } } }); } return $locHelper; }