Вход Регистрация
Файл: 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);
    }
}
Онлайн: 1
Реклама