Файл: app/Http/Controllers/Api/ArenaController.php
Строк: 320
<?php
namespace AppHttpControllersApi;
use IlluminateHttpRequest;
use AppModelsUserModel;
use AppModelsArenaBattleModel;
use AppModelsArenaCardsModel;
use Auth;
use AppServicesServices;
use AppHttpControllersController;
class ArenaController extends Controller
{
public function getIndexPage()
{
$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>';
$redirect = 0;
}
else
{
$battle = ArenaBattleModel::where('user1', Auth::user()->id)->orWhere('user2', Auth::user()->id)->first();
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>';
$redirect = 0;
}
else
{
if($battle->start_time < time())
{
$battle->status = 'card1_pick';
$battle->save();
$redirect = '/arena/pick/1';
}
else $redirect = 0;
$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 response()->json(["result" => $result, "redirect" => $redirect]);
}
public function getPickStatus($pick, $battle, $user)
{
$status = Services::getPickStatus($pick, $battle, $user);
return response()->json(['status' => $status]);
}
public function redirectIfPicked($pick, $battle, $user1, $user2)
{
$user1Pick = Services::getPickStatus($pick, $battle, $user1);
$user2Pick = Services::getPickStatus($pick, $battle, $user2);
return response()->json(['status' => (integer) $user1Pick && $user2Pick]);
}
public function attack($battle_id, $card1, $card2)
{
$battle = ArenaBattleModel::findOrFail($battle_id);
if($battle->user1 != Auth::user()->id && $battle->user2 != Auth::user()->id) return response()->json(['status' => 'error', 'message' => 'Ошибка!']);
$myCard = ArenaCardsModel::with('getCardUserInfo.getCardInfo')->findOrFail($card1);
$opponentCard = ArenaCardsModel::with('getCardUserInfo.getCardInfo')->findOrFail($card2);
if($myCard->user != Auth::user()->id) return response()->json(['status' => 'error', 'message' => 'Ошибка!']);
if($battle->move != Auth::user()->id) return response()->json(['status' => 'error', 'message' => 'Ходит оппонент!']);
if($battle->move == Auth::user()->id && $battle->move_time < time()) return response()->json(['status' => 'error', 'message' => 'Ход завершён!']);
if($opponentCard->health < 0) return response()->json(['status' => 'error', 'message' => 'Карта уничтожена!']);
if($myCard->health < 0) return response()->json(['status' => 'error', 'message' => 'Карта уничтожена!']);
if($myCard->moved == 1) return response()->json(['status' => 'error', 'message' => 'Ход этой картой уже сделан!']);
$damage = 0;
for($i=1;$i<=$myCard->getCardUserInfo->getCardInfo->attack_count;$i++)
{
$damage += Services::getCardDamage(
$myCard->getCardUserInfo->getCardInfo->min_attack+Services::getUpgradeBonus($myCard->getCardUserInfo->getCardInfo->min_attack, $myCard->getCardUserInfo->upgrade_level),
$myCard->getCardUserInfo->getCardInfo->max_attack+Services::getUpgradeBonus($myCard->getCardUserInfo->getCardInfo->max_attack, $myCard->getCardUserInfo->upgrade_level),
$opponentCard->getCardUserInfo->getCardInfo->armor+Services::getUpgradeBonus($opponentCard->getCardUserInfo->getCardInfo->armor, $opponentCard->getCardUserInfo->upgrade_level)
);
}
$opponentCard->health -= $damage;
$opponentCard->save();
$myCard->moved = 1;
$myCard->save();
return response()->json(['status' => 'ok', 'damage' => $damage, 'opponentCard' => $opponentCard->pick, 'myCard' => $myCard->pick]);
}
public function getMoveStatus($battle_id)
{
$battle = ArenaBattleModel::find($battle_id);
if($battle == null) return response()->json(['status' => 5]);
if($battle->user1 == Auth::user()->id)
{
$opponent = $battle->user2;
$myColumn = 'user1_win';
$opponentColumn = 'user2_win';
}
else
{
$opponent = $battle->user1;
$myColumn = 'user2_win';
$opponentColumn = 'user1_win';
}
$myPick1 = ArenaCardsModel::with('getCardUserInfo.getCardInfo')->where('battle', $battle_id)->where('user', Auth::user()->id)->where('pick', 1)->first();
$myPick2 = ArenaCardsModel::with('getCardUserInfo.getCardInfo')->where('battle', $battle_id)->where('user', Auth::user()->id)->where('pick', 2)->first();
$opponentPick1 = ArenaCardsModel::with('getCardUserInfo.getCardInfo')->where('battle', $battle_id)->where('user', $opponent)->where('pick', 1)->first();
$opponentPick2 = ArenaCardsModel::with('getCardUserInfo.getCardInfo')->where('battle', $battle_id)->where('user', $opponent)->where('pick', 2)->first();
if($battle->move == Auth::user()->id)
{
if((($myPick1->moved == 1 || $myPick1->health <= 0) && ($myPick2->moved == 1 || $myPick2->health <= 0)) || $battle->move_time < time())
{
$battle->move = $opponent;
$battle->move_time = time()+30;
$battle->save();
$myPick1->moved = 0;
$myPick1->save();
$myPick2->moved = 0;
$myPick2->save();
}
}
else
{
if((($opponentPick1->moved == 1 || $opponentPick1->health <= 0) && ($opponentPick2->moved == 1 || $opponentPick2->health <= 0)) || $battle->move_time < time())
{
$battle->move = Auth::user()->id;
$battle->move_time = time()+30;
$battle->save();
$opponentPick1->moved = 0;
$opponentPick1->save();
$opponentPick2->moved = 0;
$opponentPick2->save();
}
}
$myAliveCards = ArenaCardsModel::where('battle', $battle->id)->where('user', Auth::user()->id)->where('health', '>', '0')->count();
$opponentAliveCards = ArenaCardsModel::where('battle', $battle->id)->where('user', $opponent)->where('health', '>', '0')->count();
if($battle->status == 'battle') {
if ($myAliveCards == 0 && $opponentAliveCards > 0)
{
if($battle->winner_count == 0)
{
$battle->$opponentColumn++;
$battle->winner_count = 1;
}
$battle->round++;
$battle->save();
Services::setArenaHealth($myPick1, $myPick2, $opponentPick1, $opponentPick2, $battle);
return response()->json(['status' => 2, 'winner' => Services::userInfo($opponent)->login, 'roundNum' => $battle->round]);
}
elseif ($myAliveCards > 0 && $opponentAliveCards == 0)
{
if($battle->winner_count == 0)
{
$battle->$myColumn++;
$battle->winner_count = 1;
}
$battle->round++;
$battle->save();
Services::setArenaHealth($myPick1, $myPick2, $opponentPick1, $opponentPick2, $battle);
return response()->json(['status' => 2, 'winner' => Services::userInfo(Auth::user()->id)->login, 'roundNum' => $battle->round]);
}
elseif ($myAliveCards == 0 && $opponentAliveCards == 0)
{
$battle->round++;
$battle->save();
Services::setArenaHealth($myPick1, $myPick2, $opponentPick1, $opponentPick2, $battle);
return response()->json(['status' => 3, 'roundNum' => $battle->round]);
}
else
{
if($battle->winner_count == 1)
{
$battle->winner_count = 0;
$battle->save();
}
}
if ($battle->user1_win >= 3 || $battle->user2_win >= 3)
{
$battle->status = 'result';
$battle->save();
$winner = $battle->user1_win >= 3 ? $battle->user1 : $battle->user2;
return response()->json(['status' => 4, 'winner' => Services::userInfo($winner)->login, 'roundNum' => $battle->round]);
}
}
if($battle->move != Auth::user()->id) return response()->json([
'status' => 0,
'health' => [
'my1' => $myPick1->health > 0 ? $myPick1->health : 0,
'my2' => $myPick2->health > 0 ? $myPick2->health : 0,
'opp1' => $opponentPick1->health > 0 ? $opponentPick1->health : 0,
'opp2' => $opponentPick2->health > 0 ? $opponentPick2->health : 0,
],
'moveTime' => (string) Services::timer($battle->move_time-time()),
'move' => Services::userInfo($battle->move)->login,
'roundNum' => $battle->round
]);
return response()->json([
'status' => 1,
'pick1' => ($myPick1->health > 0 ? $myPick1->moved : 1),
'pick2' => ($myPick2->health > 0 ? $myPick2->moved : 1),
'health' => [
'my1' => $myPick1->health > 0 ? $myPick1->health : 0,
'my2' => $myPick2->health > 0 ? $myPick2->health : 0,
'opp1' => $opponentPick1->health > 0 ? $opponentPick1->health : 0,
'opp2' => $opponentPick2->health > 0 ? $opponentPick2->health : 0,
],
'moveTime' => (string) Services::timer($battle->move_time-time()),
'move' => Services::userInfo($battle->move)->login,
'roundNum' => $battle->round
]);
}
}