Файл: app/Http/Controllers/TournamentController.php
Строк: 307
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use AppModelsUserModel;
use Auth;
use AppModelsTournamentBattleModel;
use AppModelsTournamentPlayerModel;
use AppServicesServices;
class TournamentController extends Controller
{
public function index()
{
$result = Auth::user()->tournament_result;
if($result != '')
{
$user = UserModel::find(Auth::user()->id);
$user->tournament_result = '';
$user->save();
}
if(Auth::user()->tournament_battle != 0)
{
$battle = TournamentBattleModel::findOrFail(Auth::user()->tournament_battle);
if($battle->status == 'start' && $battle->time <= time())
{
$players = TournamentPlayerModel::where('battle', $battle->id)->get();
$team1 = 0;
$team2 = 0;
foreach($players as $pl)
{
$pl->team = $team1 == 3 ? 2 : 1;
if($team1 == 3) $team2++;
else $team1++;
$pl->save();
}
$battle->status = 'battle';
$battle->time = time()+120;
$battle->save();
return redirect('/tournament/battle')->with('ok', 'Турнир начался!');
}
if($battle->status == 'battle') return redirect('/tournament/battle');
$players = TournamentPlayerModel::where('battle', $battle->id)->count();
return view('game.battles.tournament.index', ['battle' => $battle, 'players' => $players, 'result' => $result]);
}
else return view('game.battles.tournament.index', ['result' => $result]);
}
public function enterBattle()
{
if(Auth::user()->tournament_battle != 0) return back();
if(Auth::user()->tournament_cooldown > time()) return back();
if(Services::getAllParameters('health', Auth::user()->id) == 0) return back()->with('error', 'Выберите карты в колоду!');
$battle = TournamentBattleModel::find(Auth::user()->tournament_battle);
if($battle != null && $battle->status == 'battle') return redirect('/tournament/battle');
$issetBattle = TournamentBattleModel::where('players', '<', 6)->first();
if($issetBattle == null)
{
$btl = TournamentBattleModel::create([
'status' => 'prepare',
'players' => 1
]);
}
else
{
$btl = $issetBattle;
$btl->players++;
if($btl->players == 6)
{
$btl->time = time()+30;
$btl->status = 'start';
}
$btl->save();
}
TournamentPlayerModel::create([
'battle' => $btl->id,
'user' => Auth::user()->id,
'health' => Services::getAllParameters('health', Auth::user()->id)
]);
$user = UserModel::find(Auth::user()->id);
$user->tournament_battle = $btl->id;
$user->save();
return back()->with('ok', 'Вы в очереди!');
}
public function leaveBattle()
{
if(Auth::user()->tournament_battle == 0) return back();
$battle = TournamentBattleModel::find(Auth::user()->tournament_battle);
if($battle->status == 'battle') return redirect('/tournament/battle');
TournamentPlayerModel::where('user', Auth::user()->id)->where('battle', $battle->id)->delete();
$user = UserModel::find(Auth::user()->id);
$user->tournament_battle = 0;
$user->save();
if($battle->players == 1) $battle->delete();
else
{
$battle->players--;
if($battle->players < 6)
{
$battle->time = 0;
$battle->status = 'prepare';
}
$battle->save();
}
return back()->with('ok', 'Вы вышли из очереди!');
}
public function battle()
{
if(Auth::user()->tournament_battle == 0) return redirect('/tournament');;
$battle = TournamentBattleModel::where('id', Auth::user()->tournament_battle)->first();
if($battle->status == 'prepare' && $battle->status == 'start') return redirect('/tournament');
$my = TournamentPlayerModel::where('user', Auth::user()->id)->where('battle', $battle->id)->first();
$players = TournamentPlayerModel::where('battle', $battle->id)->where('health', '<', 1)->get();
foreach($players as $pl)
{
if($pl->respawn_time <= time())
{
$pl->health = Services::getAllParameters('health', $pl->user);
$pl->respawn_time = 0;
$pl->save();
}
}
if($battle->time <= time()) return self::result();
$team1Alive = TournamentPlayerModel::where('battle', $battle->id)->where('team', $my->team)->where('health', '>', 0)->count();
$team2Alive = TournamentPlayerModel::where('battle', $battle->id)->where('team', '<>', $my->team)->where('health', '>', 0)->count();
if($my->opponent == 0)
{
$opponent = TournamentPlayerModel::with('getUserInfo')->where('user', '<>', Auth::user()->id)->where('battle', $battle->id)->where('health', '>', 0)->where('team', '<>', $my->team)->inRandomOrder()->first();
if($opponent != null)
{
$my->opponent = $opponent->id;
$my->save();
return redirect('/tournament/battle');
}
else return view('game.battles.tournament.battle', ['battle' => $battle, 'my' => $my, 't1a' => $team1Alive, 't2a' => $team2Alive]);
}
else
{
$opponent = TournamentPlayerModel::with('getUserInfo')->find($my->opponent);
if($opponent->health <= 0)
{
$my->opponent = 0;
$my->save();
return redirect('/tournament/battle');
}
}
return view('game.battles.tournament.battle', ['battle' => $battle, 'my' => $my, 'opponent' => $opponent, 't1a' => $team1Alive, 't2a' => $team2Alive]);
}
public function attack()
{
if(Auth::user()->tournament_battle == 0) return redirect('/tournament');;
$battle = TournamentBattleModel::where('id', Auth::user()->tournament_battle)->first();
if($battle->status == 'prepare' && $battle->status == 'start') return redirect('/tournament');
$my = TournamentPlayerModel::where('user', Auth::user()->id)->where('battle', $battle->id)->first();
if($my->opponent == 0) return redirect('/tournament/battle');
if($my->attack_cooldown > time()) return back()->with('error', 'Откат удара!');
$opponent = TournamentPlayerModel::with('getUserInfo')->find($my->opponent);
$attack = Services::getAllParameters('attack', Auth::user()->id);
$armor = 0;//Services::getAllParameters('armor', $opponent->user)
$damage = Services::getCardDamage($attack, $attack, $armor);
if($damage >= $opponent->health)
{
$damage = $opponent->health;
$opponent->health = 0;
$opponent->respawn_time = time()+5;
$opponent->save();
if($my->team == 1) $battle->team1_points++;
else $battle->team2_points++;
$battle->save();
$my->points++;
}
else
{
$opponent->health -= $damage;
$opponent->save();
}
$my->attack_cooldown = time()+rand(3,5);
$my->damage += $damage;
$my->save();
return redirect('/tournament/battle');
}
public function change()
{
if(Auth::user()->tournament_battle == 0) return redirect('/tournament');;
$battle = TournamentBattleModel::where('id', Auth::user()->tournament_battle)->first();
if($battle->status == 'prepare' && $battle->status == 'start') return redirect('/tournament');
$my = TournamentPlayerModel::where('user', Auth::user()->id)->where('battle', $battle->id)->first();
$opponent = TournamentPlayerModel::with('getUserInfo')->where('user', '<>', Auth::user()->id)->where('battle', $battle->id)->where('health', '>', 0)->where('team', '<>', $my->team)->where('id', '<>', $my->opponent)->inRandomOrder()->first();
$my->opponent = $opponent->id;
$my->save();
return redirect('/tournament/battle');
}
public function result()
{
$battle = TournamentBattleModel::where('id', Auth::user()->tournament_battle)->first();
if($battle == null) return redirect('/tournament');
if(Auth::user()->tournament_battle == 0) return redirect('/tournament');
if($battle->team1_points > $battle->team2_points) $winner = 1;
elseif($battle->team1_points < $battle->team2_points) $winner = 2;
else $winner = 0;
$players = TournamentPlayerModel::where('battle', $battle->id)->get();
foreach($players as $pl)
{
$winner_coeff = $pl->team == $winner ? 2 : 1;
$exp = round(($pl->damage/100)*$pl->points*$winner_coeff);
$result = $winner_coeff == 2 ? 'Ваша команда победила!<br>' : 'Ваша команда проиграла!<br>';
$result .= 'Награда: '.$exp.' монет и '.$pl->points.' вальмер!<br>';
$user = UserModel::find($pl->user);
$user->valmers += $pl->points;
$user->exp += $exp;
$user->tournament_battle = 0;
$user->tournament_result = $result;
$user->tournament_cooldown = time()+1800;
$user->save();
$pl->delete();
}
$battle->delete();
return redirect('/tournament');
}
}