Файл: app/Http/Controllers/MobController.php
Строк: 215
<?php
namespace AppHttpControllers;
use AppModelsCardUserModel;
use AppModelsCardModel;
use IlluminateHttpRequest;
use Auth;
use AppModelsMobTempModel;
use AppModelsUserModel;
use AppServicesServices;
use AppModelsMobRankModel;
class MobController extends Controller
{
public function index()
{
if(!in_array(Auth::user()->id, [1,2])) redirect('/');
$nextRank = MobRankModel::where('rank', (Auth::user()->mobs_rank+1))->first();
$battle = MobTempModel::where('user', Auth::user()->id)->first();
if($battle != null) return redirect('/mobs/battle');
$selectedCard = Auth::user()->mob_card > 0 ? Auth::user()->mob_card : 0;
if($selectedCard > 0)
{
$card = CardUserModel::with('getCardInfo')->find($selectedCard);
if($card == null)
{
$user = UserModel::find(Auth::user()->id);
$user->mob_card = 0;
$user->save();
return redirect('/mobs');
}
return view('game.battles.mobs.index', ['rank' => $nextRank, 'selectedCard' => $selectedCard, 'card' => $card]);
}
else return view('game.battles.mobs.index', ['rank' => $nextRank, 'selectedCard' => $selectedCard]);
}
public function start()
{
$battle = MobTempModel::where('user', Auth::user()->id)->first();
if($battle != null) return redirect('/mobs/battle');
if(Auth::user()->mob_battles <= 0) return redirect('/mobs')->with('error', 'Недостаточно боёв!');
if(Auth::user()->mob_card == 0) return redirect('/mobs')->with('error', 'Выберите карту для битвы!');
$card = CardUserModel::findOrFail(Auth::user()->mob_card);
if($card->user != Auth::user()->id) return back();
$myStats = [
'card' => $card->id,
'health' => $card->getCardInfo->health+Services::getUpgradeBonus($card->getCardInfo->health, $card->upgrade_level),
'cooldown' => 0
];
$mobHealth = rand($card->getCardInfo->health+Services::getUpgradeBonus($card->getCardInfo->health, $card->upgrade_level)-100, $card->getCardInfo->health+Services::getUpgradeBonus($card->getCardInfo->health, $card->upgrade_level)+10);
$mobStats = [
'card' => rand(1,29),
'health' => $mobHealth,
'max_health' => $mobHealth,
'attack' => rand($card->getCardInfo->max_attack+Services::getUpgradeBonus($card->getCardInfo->max_attack, $card->upgrade_level)-50, $card->getCardInfo->max_attack+Services::getUpgradeBonus($card->getCardInfo->max_attack, $card->upgrade_level)+5),
'armor' => rand($card->getCardInfo->armor+Services::getUpgradeBonus($card->getCardInfo->armor, $card->upgrade_level)-50, $card->getCardInfo->armor+Services::getUpgradeBonus($card->getCardInfo->armor, $card->upgrade_level)+5),
];
MobTempModel::create([
'user' => Auth::user()->id,
'status' => 'battle',
'myStats' => json_encode($myStats),
'mobStats' => json_encode($mobStats)
]);
return redirect('/mobs/battle');
}
public function pick()
{
$deck = explode(';', Auth::user()->deck);
$cards = CardUserModel::with('getCardInfo')->whereIn('id', $deck)->get();
if(count($cards) == 0) return redirect('/deck/my');
return view('game.battles.mobs.pick', ['cards' => $cards]);
}
public function pickConfirm($card)
{
$cardInfo = CardUserModel::findOrFail($card);
$deck = explode(';', Auth::user()->deck);
if(!in_array($card, $deck)) return back()->with('error', 'Карты нет в колоде!');
$user = UserModel::find(Auth::user()->id);
$user->mob_card = $cardInfo->id;
$user->save();
return redirect('/mobs')->with('ok', 'Карта выбрана!');
}
public function battle()
{
$battle = MobTempModel::where('user', Auth::user()->id)->first();
if($battle == null) return redirect('/mobs');
$myStats = json_decode($battle->myStats);
$mobStats = json_decode($battle->mobStats);
$firstAttack = session('first_attack');
if($firstAttack != null)
{
if($myStats->health <= 0 && $mobStats->health > 0) return self::result($battle->id, 'lose');
elseif($myStats->health > 0 && $mobStats->health <= 0) return self::result($battle->id, 'win');
elseif($myStats->health <= 0 && $mobStats->health <= 0) return self::result($battle->id, 'draw');
}
$myCard = CardUserModel::with('getCardInfo')->findOrFail($myStats->card);
$mobCard = CardModel::findOrFail($mobStats->card);
$bars = [
'my' => round($myStats->health/($myCard->getCardInfo->health+Services::getUpgradeBonus($myCard->getCardInfo->health, $myCard->upgrade_level))*100),
'mob' => round($mobStats->health/$mobStats->max_health*100)
];
return view('game.battles.mobs.battle', ['battle' => $battle, 'bars' => (object) $bars, 'myStats' => $myStats, 'mobStats' => $mobStats, 'myCard' => $myCard, 'mobCard' => $mobCard]);
}
public function attack()
{
$battle = MobTempModel::where('user', Auth::user()->id)->first();
if($battle == null) return redirect('/mobs');
$myStats = json_decode($battle->myStats);
if($myStats->cooldown > time()) return back()->with('error', 'Откат карты!');
$mobStats = json_decode($battle->mobStats);
$card = CardUserModel::with('getCardInfo')->findOrFail($myStats->card);
$myDamage = Services::getCardDamage($card->getCardInfo->min_attack+Services::getUpgradeBonus($card->getCardInfo->min_attack, $card->upgrade_level), $card->getCardInfo->max_attack+Services::getUpgradeBonus($card->getCardInfo->max_attack, $card->upgrade_level), $mobStats->armor);
$mobDamage = Services::getCardDamage($mobStats->attack, $mobStats->attack, $card->getCardInfo->armor+Services::getUpgradeBonus($card->getCardInfo->armor, $card->upgrade_level));
$firstAttack = session('first_attack');
if($myDamage >= $mobStats->health)
{
$myDamage = abs($mobStats->health);
$mobDamage = 0;
}
elseif($mobDamage >= $myStats->health)
{
$mobDamage = abs($myStats->health);
$myDamage = 0;
}
$myStats->health -= $mobDamage;
$myStats->cooldown = time()+$card->getCardInfo->cooldown;
if($firstAttack == null)
{
$myDamage = $myDamage >= $mobStats->health ? round($mobStats->health/2) : $myDamage;
session(['first_attack' => 1]);
}
$mobStats->health -= $myDamage;
$battle->myStats = json_encode($myStats);
$battle->mobStats = json_encode($mobStats);
$battle->save();
return back();
}
public function result($battle, $status)
{
session(['first_attack' => null]);
$battle = MobTempModel::findOrFail($battle);
$mobStats = json_decode($battle->mobStats);
if($status == 'win')
{
$exp = round($mobStats->attack/10) > 0 ? round($mobStats->attack/10) : rand(1,100);
$exp *= 5;
$valmers = rand(0,10) == 3 ? rand(1,3) : 0;
$message = 'Победа! Получено: '.$exp.' монет '.($valmers > 0 ? 'и '.$valmers.' вальмер' : '').'!';
}
elseif($status == 'lose')
{
$exp = round($mobStats->attack/50) > 0 ? round($mobStats->attack/50) : rand(1,100);
$exp *= 5;
$valmers = 0;
$message = 'Поражение! Получено: '.$exp.' монет!';
}
elseif($status == 'draw')
{
$exp = round($mobStats->attack/25) > 0 ? round($mobStats->attack/25) : rand(1,100);
$exp *= 5;
$valmers = rand(0,100) == 0 ? 1 : 0;
$message = 'Ничья! Получено: '.$exp.' монет '.($valmers > 0 ? 'и '.$valmers.' вальмер' : '').'!';
}
elseif($status == 'surrender')
{
$exp = round($mobStats->attack/50) > 0 ? round($mobStats->attack/50) : rand(1,100);
$exp *= 5;
$valmers = 0;
$message = 'Вы сдались! Получено: '.$exp.' монет!';
}
$user = UserModel::find(Auth::user()->id);
$user->mob_battles--;
$user->mobs_exp += rand(25,100);
$user->exp += $exp;
$user->valmers += $valmers;
$user->save();
$battle->delete();
session(['result' => $message]);
return redirect('/mobs');
}
public function apiGetCooldown($battle)
{
$battle = MobTempModel::find($battle);
if($battle == null) return response()->json(['result' => 0]);
$my = json_decode($battle->myStats);
if($my->cooldown >= time()) return response()->json(['result' => '1', 'cooldown' => Services::getChestTime($my->cooldown-time()), 'cooldown_sec' => ($my->cooldown-time())]);
else return response()->json(['result' => 0]);
}
public function surrender()
{
$battle = MobTempModel::where('user', Auth::user()->id)->first();
if($battle == null) return redirect('/mobs');
return self::result($battle->id, 'surrender');
}
public function up()
{
$nextRank = MobRankModel::where('rank', (Auth::user()->mobs_rank+1))->first();
if(Auth::user()->mobs_exp < $nextRank->exp) return back();
$message = 'Ранг повышен! Получено: '.$nextRank->reward.' вальмер!';
$user = UserModel::find(Auth::user()->id);
$user->valmers += $nextRank->reward;
$user->mobs_exp = 0;
$user->mobs_rank++;
$user->save();
return back()->with('ok', $message);
}
}