Exemplo n.º 1
0
 /**
  * Штурмовать вражеский замок.
  * 
  * @throws GameException
  * @throws \Exception
  */
 public function assault()
 {
     $this->continueOrException();
     $now = Carbon::now();
     // Пересчет ресурсов
     $this->goal->calcCastleIncreaseResources();
     // Расчет победителя сражения...
     $aArmy = $this->army;
     // атакующая армия
     $dArmy = $this->goal->armyOrCreate();
     // защищающиеся армия
     Log::info('---------------------------------------------------------------------------------------------------');
     Log::info("({$now}) Штурм замка id={$this->goal->id} '{$this->goal->name}' отрядом id={$this->id} '{$this->name}'...");
     // xa, ya - кол-во и уровень атакующих.
     // xd, yd, zd - кол-во, уровень войск и уровень фортификации защищающихся.
     $xa = $this->size;
     $ya = $aArmy->level;
     $xd = $dArmy->size;
     $yd = $dArmy->level;
     $zd = $this->goal->fortification()->level;
     // Уровень фортификации, пока остается 0;
     Log::info("Сила атак. отряда = {$xa} и уровень = {$ya}");
     Log::info("Сила защ. армии = {$xd}, уровень = {$yd} и фортифмкация = {$zd}");
     // Участие шпионов во всем этом замесе
     // Получаем шпионов замка
     $spiesHg = $this->goal->ownSpies()->getResults();
     //Log::info($spiesHg->toJson());
     foreach ($spiesHg as $oneSpiesHg) {
         // С вероятностью 50/50 шпион погибает
         $rand = mt_rand(0, 1);
         if ($rand) {
             $oneSpiesHg->killMe();
         }
     }
     // Ищем шпиона, который проглядел нападение (если есть)
     $sph = SpyHistory::where('squads_id', $this->id)->where('detect', 0)->get()->all();
     foreach ($sph as $oneSph) {
         $spy = Spy::find($oneSph->spy_id);
         if (!empty($spy)) {
             $spy->killMe();
         }
     }
     if ($xd == 0) {
         // Защитников нет, досрочная победа атакующих...
         DB::beginTransaction();
         try {
             Log::info("Досрочно победили атакующие. Осталось в живых = {$xa}");
             $loots = $this->rob();
             // начать грабить.
             $this->comeback();
             // вернуться назад в замок.
             // Запуск события, что отряд либо победил, либо был разгроблен.
             event(new SquadAssaulted($this, ['status' => 'win', 'loots' => $loots]));
         } catch (\Exception $ex) {
             DB::rollBack();
             throw $ex;
             // next...
         }
         DB::commit();
         return;
     }
     // Рассчет мощностей каждой из армий и их разницы...
     $rand = rand(0 - $xd / 5, $xa / 5);
     // рандом при расчете мощностей
     $diff = intval($xa * $ya - $xd * $yd * (1 + $zd / 100) + $rand);
     Log::info("Мощность атакующих = " . $xa * $ya . ". Мощность защитников = " . $xd * $yd * (1 + $zd / 100));
     Log::info("Первый рандом = {$rand}. Разница мощностей с рандомом = {$diff}");
     $rand = rand(0, 150) / 1000;
     // рандом при вычилсение сил победителей
     Log::info("Второй рандом = {$rand}");
     // Расчет сил победителей и награды, в случаи победы атакующих...
     DB::beginTransaction();
     try {
         $loots = [];
         if ($diff > 0) {
             // Атакующий отряд победил...
             $left = $diff / $ya * (1 + $rand);
             $left = intval($left > $xa ? $xa : $left);
             // Оставить только выживших...
             $this->update(['size' => $left]);
             $dArmy->reset();
             Log::info("Победили атакующие. Осталось в живых = {$left}");
             $loots = $this->rob();
             // начать грабить.
             $this->comeback();
             // вернуться назад в замок.
             $status = 'win';
         } elseif ($diff < 0) {
             // Защитники победили...
             $left = $diff / $yd * (1 + $zd / 100) * (1 + $rand);
             $left = abs(intval($left > $xd ? $xd : $left));
             // Оставить только выживших...
             $this->delete();
             $dArmy->update(['size' => $left]);
             Log::info("Победили защитники. Осталось в живых = {$left}");
             $status = 'def';
         } else {
             // Ничья.
             $this->delete();
             $dArmy->reset();
             Log::info("Ничья. Все умерли.");
             $status = 'draw';
         }
         // Запуск события, что отряд либо победил, либо был разгроблен.
         event(new SquadAssaulted($this, ['status' => $status, 'loots' => $loots]));
     } catch (\Exception $ex) {
         DB::rollBack();
         throw $ex;
         // next...
     }
     DB::commit();
 }
Exemplo n.º 2
0
 public function changeLookingCastle($id, $castle_id)
 {
     $spy = Spy::find($id);
     $castle = Castle::find($castle_id);
     $spy->enemyCastle()->associate($castle);
     $spy->save();
 }