Файл: app/Http/Controllers/ArenaController.php
Строк: 319
<?php
namespace AppHttpControllers;
use AppModelsCardUserModel;
use IlluminateHttpRequest;
use AppModelsUserModel;
use AppModelsArenaBattleModel;
use AppModelsArenaCardsModel;
use Auth;
use Services;
class ArenaController extends Controller
{
public function index()
{
$issetBattle = ArenaBattleModel::where('user1', Auth::user()->id)->orWhere('user2', Auth::user()->id)->count();
if($issetBattle == 0)
{
$result = 'Начать подбор противника!<br>
<a href="/arena/find" class="btn btn-games2 btn-block">Искать</a>';
}
else
{
$battle = ArenaBattleModel::where('user1', Auth::user()->id)->orWhere('user2', Auth::user()->id)->first();
if($battle->status == 'card1_pick') return redirect('/arena/pick/1');
if($battle->status == 'card2_pick') return redirect('/arena/pick/2');
if($battle->status == 'battle') return redirect('/arena/battle');
if($battle->status == 'result') return redirect('/arena/result');
if($battle->user1 == Auth::user()->id) $opponent = $battle->user2;
else $opponent = $battle->user1;
if($opponent == 0) $result = 'Идёт поиск противника!<br>
<a href="/arena/cancel" class="btn btn-games2 btn-block">Отменить поиск</a>';
else
{
if($battle->start_time < time())
{
$battle->status = 'card1_pick';
$battle->save();
return redirect('/arena/pick/1');
}
$result = 'Противник найден!<br>
'.($battle->start_time-time() > 0 ? 'До начала боя: '.Services::timer($battle->start_time-time()).'<br>' : 'Бой начался!<br>').'
<a href="/arena/cancel" class="btn btn-games2 btn-block">Отменить поиск</a>';
}
}
return view('game.battles.arena.index', ['result' => $result]);
}
public function find()
{
$issetBattle = ArenaBattleModel::where('user1', Auth::user()->id)->orWhere('user2', Auth::user()->id)->count();
if($issetBattle > 0) return back()->with('error', 'Подбор уже начат!');
$battles = ArenaBattleModel::where('status', 'prepare')->where('user2', 0)->inRandomOrder();
$myMaxCardLevel = Services::getMaxCardLevel(Auth::user()->id);
if($battles->count() == 0)
{
ArenaBattleModel::create([
'user1' => Auth::user()->id,
'card_level' => $myMaxCardLevel+1
]);
return back()->with('ok', 'Поиск противника начат!');
}
else
{
$battles = $battles->first();
if($battles->card_level-1 > $myMaxCardLevel) $battles->card_level = $myMaxCardLevel+1;
$battles->user2 = Auth::user()->id;
$battles->start_time = time()+30;
$battles->save();
return back()->with('ok', 'Противник найден!');
}
}
public function cancelFind()
{
$issetBattle = ArenaBattleModel::where('user1', Auth::user()->id)->orWhere('user2', Auth::user()->id);
if($issetBattle->count() == 0) return back()->with('error', 'Подбор ещё не начат!');
$foundBattle = $issetBattle->first();
if($foundBattle->user1 == Auth::user()->id) $foundBattle->delete();
else
{
$opponentMaxCardLevel = Services::getMaxCardLevel($foundBattle->user1);
if($opponentMaxCardLevel != $foundBattle->card_level) $foundBattle->card_level = $opponentMaxCardLevel+1;
$foundBattle->user2 = 0;
$foundBattle->save();
}
return back();
}
public function cardPick1()
{
$battle = ArenaBattleModel::where('user1', Auth::user()->id)->where('user2', '<>', 0)->orWhere('user1', '<>', 0)->where('user2', Auth::user()->id)->where('status', '<>', 'prepare')->first();
if($battle == null) return redirect('/arena');
if($battle->pick_time == 0)
{
$battle->pick_time = time()+60;
$battle->save();
}
if($battle->status == 'prepare') return redirect('/arena');
if($battle->status == 'card2_pick') return redirect('/arena/pick/2');
if($battle->status == 'battle') return redirect('/arena/battle');
if($battle->status == 'result') return redirect('/arena/result');
if($battle->user1 == Auth::user()->id) $opponent = $battle->user2;
else $opponent = $battle->user1;
if(Services::getPickStatus(1, $battle->id, $battle->user1) && Services::getPickStatus(1, $battle->id, $battle->user2))
{
$battle->status = 'card2_pick';
$battle->pick_time = time()+60;
$battle->save();
return redirect('/arena/pick/2');
}
else
{
if($battle->pick_time < time() && $battle->pick_time != 0) return $this->cancelBattle($battle->id);
}
$cards = CardUserModel::with('getCardInfo')->where('user', Auth::user()->id)->where('status', 'redeemed')->get();
return view('game.battles.arena.pick1', ['battle' => $battle, 'cards' => $cards, 'opponent' => $opponent]);
}
public function cardPick1Confirm($id)
{
$battle = ArenaBattleModel::where('user1', Auth::user()->id)->where('user2', '<>', 0)->orWhere('user1', '<>', 0)->where('user2', Auth::user()->id)->where('status', '<>', 'prepare')->first();
if($battle == null) return redirect('/arena');
if($battle->status == 'prepare') return redirect('/arena');
if($battle->status == 'card2_pick') return redirect('/arena/pick/2');
if($battle->status == 'battle') return redirect('/arena/battle');
if($battle->status == 'result') return redirect('/arena/result');
$card = CardUserModel::with('getCardInfo')->find($id);
if($card == null) return redirect('/arena');
if($card->getCardInfo->level > $battle->card_level) return back();
if($card->user != Auth::user()->id) return back();
$pickCount = ArenaCardsModel::where('battle', $battle->id)->where('user', Auth::user()->id)->where('pick', 1)->count();
if($pickCount > 0) return back()->with('error', 'Карта уже выбрана!');
ArenaCardsModel::create([
'battle' => $battle->id,
'user' => Auth::user()->id,
'card' => $id,
'health' => $card->getCardInfo->health+Services::getUpgradeBonus($card->getCardInfo->health, $card->upgrade_level),
'pick' => 1
]);
return back()->with('ok', 'Карта выбрана!');
}
public function cardPick2()
{
$battle = ArenaBattleModel::where('user1', Auth::user()->id)->where('user2', '<>', 0)->orWhere('user1', '<>', 0)->where('user2', Auth::user()->id)->where('status', '<>', 'prepare')->first();
if($battle == null) return redirect('/arena');
if($battle->status == 'prepare') return redirect('/arena');
if($battle->status == 'card1_pick') return redirect('/arena/pick/1');
if($battle->status == 'battle') return redirect('/arena/battle');
if($battle->status == 'result') return redirect('/arena/result');
if($battle->user1 == Auth::user()->id) $opponent = $battle->user2;
else $opponent = $battle->user1;
if(Services::getPickStatus(2, $battle->id, $battle->user1) && Services::getPickStatus(2, $battle->id, $battle->user2))
{
$players = [Auth::user()->id, $opponent];
$battle->status = 'battle';
$battle->move_time = time()+30;
$battle->move = $players[array_rand($players)];
$battle->save();
return redirect('/arena/battle');
}
else
{
if($battle->pick_time < time()) return $this->cancelBattle($battle->id);
}
$pick1 = ArenaCardsModel::where('battle', $battle->id)->where('user', Auth::user()->id)->where('pick', 1)->first();
$cards = CardUserModel::with('getCardInfo')->where('user', Auth::user()->id)->where('id', '<>', $pick1->card)->where('status', 'redeemed')->get();
return view('game.battles.arena.pick2', ['battle' => $battle, 'cards' => $cards, 'opponent' => $opponent]);
}
public function cardPick2Confirm($id)
{
$battle = ArenaBattleModel::where('user1', Auth::user()->id)->where('user2', '<>', 0)->orWhere('user1', '<>', 0)->where('user2', Auth::user()->id)->where('status', '<>', 'prepare')->first();
if($battle == null) return redirect('/arena');
if($battle->status == 'prepare') return redirect('/arena');
if($battle->status == 'card1_pick') return redirect('/arena/pick/1');
if($battle->status == 'battle') return redirect('/arena/battle');
if($battle->status == 'result') return redirect('/arena/result');
$pick1 = ArenaCardsModel::where('battle', $battle->id)->where('user', Auth::user()->id)->where('pick', 1)->first();
if($id == $pick1->id) return back();
$pickCount = ArenaCardsModel::where('battle', $battle->id)->where('user', Auth::user()->id)->where('pick', 2)->count();
if($pickCount > 0) return back()->with('error', 'Карта уже выбрана!');
$card = CardUserModel::with('getCardInfo')->find($id);
if($card == null) return redirect('/arena');
if($card->getCardInfo->level > $battle->card_level) return back();
if($card->user != Auth::user()->id) return back();
ArenaCardsModel::create([
'battle' => $battle->id,
'user' => Auth::user()->id,
'card' => $id,
'health' => $card->getCardInfo->health+Services::getUpgradeBonus($card->getCardInfo->health, $card->upgrade_level),
'pick' => 2
]);
return back()->with('ok', 'Карта выбрана!');
}
public function battle()
{
$battle = ArenaBattleModel::where('user1', Auth::user()->id)->where('user2', '<>', 0)->orWhere('user1', '<>', 0)->where('user2', Auth::user()->id)->where('status', '<>', 'prepare')->firstOrFail();
if($battle->status == 'prepare') return redirect('/arena');
if($battle->status == 'card1_pick') return redirect('/arena/pick/1');
if($battle->status == 'card2_pick') return redirect('/arena/pick/2');
if($battle->status == 'result') return redirect('/arena/result');
if($battle->user1 == Auth::user()->id) $opponent = $battle->user2;
else $opponent = $battle->user1;
$myCard1 = ArenaCardsModel::with('getCardUserInfo.getCardInfo')->where('battle', $battle->id)->where('user', Auth::user()->id)->where('pick', 1)->first();
$opponentCard1 = ArenaCardsModel::with('getCardUserInfo.getCardInfo')->where('battle', $battle->id)->where('user', $opponent)->where('pick', 1)->first();
$myCard2 = ArenaCardsModel::with('getCardUserInfo.getCardInfo')->where('battle', $battle->id)->where('user', Auth::user()->id)->where('pick', 2)->first();
$opponentCard2 = ArenaCardsModel::with('getCardUserInfo.getCardInfo')->where('battle', $battle->id)->where('user', $opponent)->where('pick', 2)->first();
return view('game.battles.arena.battle', ['battle' => $battle, 'myCard1' => $myCard1, 'myCard2' => $myCard2, 'opponent' => $opponent, "opponentCard1" => $opponentCard1, "opponentCard2" => $opponentCard2]);
}
public function result()
{
$battle = ArenaBattleModel::where('user1', Auth::user()->id)->where('user2', '<>', 0)->orWhere('user1', '<>', 0)->where('user2', Auth::user()->id)->where('status', '<>', 'prepare')->first();
if($battle == null) return redirect('/arena');
if($battle->status == 'prepare') return redirect('/arena');
if($battle->status == 'card1_pick') return redirect('/arena/pick/1');
if($battle->status == 'card2_pick') return redirect('/arena/pick/2');
if($battle->status == 'battle') return redirect('/arena/battle');
$winner = $battle->user1_win >= 3 ? $battle->user1 : $battle->user2;
$loser = $battle->user1_win >= 3 ? $battle->user2 : $battle->user1;
$winnerExp = rand(10*$battle->card_level, 25*$battle->card_level);
$winnerValmers = rand(1*$battle->card_level, 2*$battle->card_level);
$loserExp = rand(2*$battle->card_level, 5*$battle->card_level);
$loserValmers = 1;
$winUser = UserModel::find($winner);
$winUser->wins += 1;
$winUser->exp += $winnerExp;
$winUser->valmers += $winnerValmers;
$winUser->save();
$loseUser = UserModel::find($loser);
$loseUser->loses += 1;
$loseUser->exp += $loserExp;
$loseUser->valmers += $loserValmers;
$loseUser->save();
ArenaCardsModel::where('battle', $battle->id)->delete();
$battle->delete();
$message = $winner == Auth::user()->id ? 'Вы победили! Получено: '.$winnerExp.' монет, '.$winnerValmers.' вальмер!' : 'Вы проиграли! Получено: '.$loserExp.' монет, '.$loserValmers.' вальмер!';
return redirect('/arena')->with('ok', $message);
}
public function cancelBattle($battle)
{
ArenaCardsModel::where('battle', $battle)->delete();
ArenaBattleModel::destroy($battle);
return redirect('/arena')->with('error', 'Битва отменена!');
}
}