Файл: app/Http/Controllers/CampaignController.php
Строк: 1005
<?php
namespace AppHttpControllers;
use AppModelsCampaignTempModel;
use AppModelsCardModel;
use AppModelsCardUserModel;
use AppModelsUserModel;
use AppServicesServices;
use IlluminateHttpRequest;
use Auth;
use AppModelsCampaignRankModel;
use Session;
class CampaignController extends Controller
{
public function index()
{
$campaignChapter = explode('.', Auth::user()->campaign_stage);
$nextRank = CampaignRankModel::where('rank', (Auth::user()->campaign_rank+1))->first();
if($campaignChapter[1] == '0')
{
return view('game.campaign.index', ['cc' => $campaignChapter, 'rank' => $nextRank]);
}
else
{
$campaignInfo = config('campaign.chapter'.$campaignChapter[0].'.stage'.$campaignChapter[1]);
$campaignUser = json_decode(Auth::user()->campaign_temp);
if($campaignInfo['type'] == 'raid')
{
$campaignT = CampaignTempModel::where('user', Auth::user()->id)->first();
if(isset($campaignT)) return redirect('/campaign/battle');
if($campaignUser->battle == 0 && $campaignUser->cooldown <= time())
{
$campaignUser->battle = 1;
$campaignUser->cooldown = 0;
$user = UserModel::find(Auth::user()->id);
$user->campaign_temp = json_encode($campaignUser);
$user->save();
return redirect('/campaign');
}
if(count((array) $campaignUser->enemies_left) == 1)
{
$user = UserModel::find(Auth::user()->id);
$campaignUser->complete = 1;
$user->campaign_temp = json_encode($campaignUser);
$user->save();
return redirect('/campaign/next');
}
}
elseif($campaignInfo['type'] == 'village')
{
if($campaignUser->count >= 160)
{
$user = UserModel::find(Auth::user()->id);
$campaignUser->complete = 1;
$user->campaign_temp = json_encode($campaignUser);
$user->save();
return redirect('/campaign/next');
}
}
elseif($campaignInfo['type'] == 'opposition')
{
if($campaignUser->cooldown <= time() && $campaignUser->find == 0)
{
$campaignUser->find = 1;
$user = UserModel::find(Auth::user()->id);
$user->campaign_temp = json_encode($campaignUser);
$user->save();
return redirect('/campaign');
}
if($campaignUser->complete == 1) return redirect('/campaign/next');
if($campaignUser->battle == 1 && $campaignUser->destruct_cooldown < time())
{
if($campaignUser->myHealth > 0 && $campaignUser->enemyHealth <= 0) return self::oppositionResult('win');
elseif($campaignUser->myHealth <= 0 && $campaignUser->enemyHealth > 0) return self::oppositionResult('lose');
elseif($campaignUser->myHealth <= 0 && $campaignUser->enemyHealth <= 0) return self::oppositionResult('lose');
}
}
return view('game.campaign.process', ['ci' => (object) $campaignInfo, 'cu' => (object) $campaignUser, 'rank' => $nextRank]);
}
}
public function start($campaign)
{
if(Auth::user()->campaign_stage != $campaign.'.0') return back();
$campaignInfo = config('campaign.chapter'.$campaign.'.stage1');
$user = UserModel::find(Auth::user()->id);
$user->campaign_stage = $campaign.'.1';
$user->campaign_temp = json_encode($campaignInfo['user']);
$user->save();
return redirect('/campaign');
}
public function next()
{
$campaignChapter = explode('.', Auth::user()->campaign_stage);
if(Auth::user()->campaign_stage == $campaignChapter[0].'0') return back();
$campaignInfo = config('campaign.chapter'.$campaignChapter[0].'.stage'.$campaignChapter[1]);
$campaignUser = json_decode(Auth::user()->campaign_temp);
if($campaignUser->complete == 1)
{
$nextStage = explode('.', $campaignInfo['next']);
$nextStageInfo = config('campaign.chapter'.$nextStage[0].'.stage'.$nextStage[1]);
$user = UserModel::find(Auth::user()->id);
$user->campaign_stage = $campaignInfo['next'];
$nextStageInfoUser = $nextStageInfo['user'];
$nextStageInfoUser['cooldown'] = time()+60*$campaignInfo['cooldown'];
$user->campaign_temp = json_encode($nextStageInfoUser);
if($campaignInfo['type'] == 'text-with-reward')
{
$user->exp += $campaignInfo['reward']['exp'];
if(isset($campaignInfo['reward']['diamonds'])) $user->diamonds += $campaignInfo['reward']['diamonds'];
if(isset($campaignInfo['reward']['campaign_exp'])) $user->campaign_exp += $campaignInfo['reward']['campaign_exp'];
$user->valmers += $campaignInfo['reward']['valmers'];
}
$user->save();
return redirect('/campaign');
}
}
public function raid()
{
$campaignChapter = explode('.', Auth::user()->campaign_stage);
if(Auth::user()->campaign_stage == $campaignChapter[0].'0') return redirect('/campaign');
$campaignUser = json_decode(Auth::user()->campaign_temp);
$campaignT = CampaignTempModel::where('user', Auth::user()->id)->first();
if($campaignT != null) return redirect('/campaign/battle');
if($campaignUser->raid != 0) return redirect('/campaign');
$enemiesLeft = (array) $campaignUser->enemies_left;
$randEnemy = array_rand($enemiesLeft);
$campaignUser->raid = 1;
$campaignUser->cooldown = time()+3600;
if(count($enemiesLeft) >= 7)
{
$campaignUser->enemy = $enemiesLeft[$randEnemy];
}
else
{
$campaignUser->enemy = $campaignUser->enemies_left->{$randEnemy};
}
$user = UserModel::find(Auth::user()->id);
$user->campaign_temp = json_encode($campaignUser);
$user->save();
return redirect('/campaign');
}
public function startBattle()
{
$campaignChapter = explode('.', Auth::user()->campaign_stage);
if(Auth::user()->campaign_stage == $campaignChapter[0].'0') return back();
$campaignInfo = config('campaign.chapter'.$campaignChapter[0].'.stage'.$campaignChapter[1]);
$campaignUser = json_decode(Auth::user()->campaign_temp);
$campaignT = CampaignTempModel::where('user', Auth::user()->id)->first();
if($campaignUser->raid == 0 || $campaignUser->battle == 0) return redirect('/campaign');
if(isset($campaignT)) return redirect('/campaign/battle');
if(isset($campaignUser->battle) || $campaignUser->battle == 1)
{
$mob = $campaignInfo['enemies'][$campaignUser->enemy];
$info = [
'health' => $mob['health'],
'card' => $mob['card'],
'myCard1' => 0,
'cooldown1' => 0,
'myHealth1' => 0,
'myCard2' => 0,
'cooldown2' => 0,
'myHealth2' => 0
];
CampaignTempModel::create([
'user' => Auth::user()->id,
'info' => json_encode($info)
]);
return redirect('/campaign/battle');
}
return back();
}
public function battle()
{
$campaignChapter = explode('.', Auth::user()->campaign_stage);
if(Auth::user()->campaign_stage == $campaignChapter[0].'0') return back();
$campaignInfo = config('campaign.chapter'.$campaignChapter[0].'.stage'.$campaignChapter[1]);
$campaignUser = json_decode(Auth::user()->campaign_temp);
$campaignT = CampaignTempModel::where('user', Auth::user()->id)->firstOrFail();
$campaignTemp = json_decode($campaignT->info);
if(!isset($campaignUser->battle) && $campaignUser->battle == 0) return back();
if(($campaignTemp->myCard1 == 0 && $campaignTemp->myCard2 == 0) || ($campaignTemp->myCard1 > 0 && $campaignTemp->myCard2 == 0)) return redirect('/campaign/pick');
$card1 = CardModel::find($campaignTemp->card);
$card2 = CardUserModel::with('getCardInfo')->findOrFail($campaignTemp->myCard1);
$card3 = CardUserModel::with('getCardInfo')->findOrFail($campaignTemp->myCard2);
if(($campaignTemp->myHealth1 > 0 || $campaignTemp->myHealth2 > 0) && $campaignTemp->health <= 0) $status = 'win';
elseif(($campaignTemp->myHealth1 <= 0 && $campaignTemp->myHealth2 <= 0) && $campaignTemp->health > 0) $status = 'lose';
elseif($campaignTemp->myHealth1 <= 0 && $campaignTemp->myHealth2 <= 0 && $campaignTemp->health <= 0) $status = 'lose';
else $status = 'battle';
if($status != 'battle')
{
$user = UserModel::find(Auth::user()->id);
if($status == 'win')
{
$user->wins++;
$user->valmers += $campaignInfo['enemies'][$campaignUser->enemy]['reward']['valmers'];
$user->exp += $campaignInfo['enemies'][$campaignUser->enemy]['reward']['exp'];
$user->campaign_exp += $campaignInfo['enemies'][$campaignUser->enemy]['reward']['campaign_exp'];
if($campaignUser->enemy != 7)
{
$enemiesLeft = (array) $campaignUser->enemies_left;
$key = array_search($campaignUser->enemy, $enemiesLeft);
if(count($enemiesLeft) >= 7)
{
unset($enemiesLeft[$key]);
$campaignUser->enemies_left = $enemiesLeft;
}
else unset($campaignUser->enemies_left->{$key});
$result = $campaignInfo['text_if_success'];
$result .= ' Награда:'.$campaignInfo['enemies'][$campaignUser->enemy]['reward']['valmers'].' вальмер, ';
$result .= $campaignInfo['enemies'][$campaignUser->enemy]['reward']['exp'].' монет и ';
$result .= $campaignInfo['enemies'][$campaignUser->enemy]['reward']['campaign_exp'].' опыта кампании!';
}
else
{
$result = $campaignInfo['text_if_success_pupil'];
$result .= ' Награда:'.$campaignInfo['enemies'][$campaignUser->enemy]['reward']['valmers'].' вальмер, ';
$result .= $campaignInfo['enemies'][$campaignUser->enemy]['reward']['exp'].' монет и ';
$result .= $campaignInfo['enemies'][$campaignUser->enemy]['reward']['campaign_exp'].' опыта кампании!';
}
}
else
{
$result = $campaignInfo['text_if_fail'];
$user->loses++;
}
$campaignUser->enemy = 0;
$campaignUser->raid = 0;
$campaignUser->battle = 0;
$user->campaign_temp = json_encode($campaignUser);
$user->save();
$campaignT->delete();
Session::put('result', $result);
return redirect('/campaign');
}
return view('game.campaign.battle', ['ci' => $campaignInfo, "cu" => $campaignUser, 'ct' => $campaignTemp, 'c1' => $card1, 'c2' => $card2, 'c3' => $card3]);
}
public function attack($card)
{
$campaignChapter = explode('.', Auth::user()->campaign_stage);
if(Auth::user()->campaign_stage == $campaignChapter[0].'0') return back();
$campaignInfo = config('campaign.chapter'.$campaignChapter[0].'.stage'.$campaignChapter[1]);
$campaignUser = json_decode(Auth::user()->campaign_temp);
$campaignT = CampaignTempModel::where('user', Auth::user()->id)->firstOrFail();
$campaignTemp = json_decode($campaignT->info);
$cooldown = 'cooldown'.$card;
$myHealth = 'myHealth'.$card;
$myCard = 'myCard'.$card;
if($campaignTemp->$cooldown > time()) return back();
if(!isset($campaignUser->battle) && $campaignUser->battle == 0) return back();
if($campaignTemp->$myCard == 0) return redirect('/campaign/pick');
$card = CardUserModel::with('getCardInfo')->findOrFail($campaignTemp->$myCard);
$myDamage = Services::getCardDamage(round($card->getCardInfo->min_attack+Services::getUpgradeBonus($card->getCardInfo->min_attack, $card->upgrade_level)), round($card->getCardInfo->min_attack+Services::getUpgradeBonus($card->getCardInfo->min_attack, $card->upgrade_level)), $campaignInfo['enemies'][$campaignUser->enemy]['armor']);
$botDamage = Services::getCardDamage(($campaignInfo['enemies'][$campaignUser->enemy]['attack']-20), $campaignInfo['enemies'][$campaignUser->enemy]['attack'], round($card->getCardInfo->armor+Services::getUpgradeBonus($card->getCardInfo->armor, $card->upgrade_level)));
$campaignTemp->health -= $myDamage;
$campaignTemp->$myHealth -= $botDamage;
$campaignTemp->$cooldown = time()+$card->getCardInfo->cooldown;
$campaignT->info = json_encode($campaignTemp);
$campaignT->save();
return back();
}
public function pick()
{
$campaignChapter = explode('.', Auth::user()->campaign_stage);
if(Auth::user()->campaign_stage == $campaignChapter[0].'0') return back();
$campaignUser = json_decode(Auth::user()->campaign_temp);
if(!isset($campaignUser->battle) && $campaignUser->battle == 0) return back();
$campaignT = CampaignTempModel::where('user', Auth::user()->id)->firstOrFail();
$campaignTemp = json_decode($campaignT->info);
if($campaignTemp->myCard1 > 0 && $campaignTemp->myCard2 > 0) return redirect('/campaign/battle');
if($campaignTemp->myCard1 > 0) $myCards = CardUserModel::with('getCardInfo')->where('id', '<>', $campaignTemp->myCard1)->where('user', Auth::user()->id)->where('status', 'redeemed')->paginate(10);
else $myCards = CardUserModel::with('getCardInfo')->where('user', Auth::user()->id)->where('status', 'redeemed')->paginate(10);
return view('game.campaign.pick', ['cards' => $myCards, 'ct' => $campaignTemp]);
}
public function pickCard($id)
{
$campaignChapter = explode('.', Auth::user()->campaign_stage);
if(Auth::user()->campaign_stage == $campaignChapter[0].'0') return back();
$campaignT = CampaignTempModel::where('user', Auth::user()->id)->firstOrFail();
$campaignTemp = json_decode($campaignT->info);
$campaignUser = json_decode(Auth::user()->campaign_temp);
if(!isset($campaignUser->battle) && $campaignUser->battle == 0) return back();
if($campaignTemp->myCard1 > 0 && $campaignTemp->myCard2 > 0) return redirect('/campaign/battle');
$card = CardUserModel::with('getCardInfo')->findOrFail($id);
if($campaignTemp->myCard1 == $id) return back();
if($campaignTemp->myCard1 > 0)
{
$campaignTemp->myCard2 = $id;
$campaignTemp->myHealth2 = round($card->getCardInfo->health+Services::getUpgradeBonus($card->getCardInfo->health, $card->upgrade_level));
}
else
{
$campaignTemp->myCard1 = $id;
$campaignTemp->myHealth1 = round($card->getCardInfo->health+Services::getUpgradeBonus($card->getCardInfo->health, $card->upgrade_level));
}
$campaignT->info = json_encode($campaignTemp);
$campaignT->save();
return redirect('/campaign/battle');
}
public function up()
{
$nextRank = CampaignRankModel::where('rank', (Auth::user()->campaign_rank+1))->first();
if(Auth::user()->campaign_exp < $nextRank->exp) return back();
$message = 'Ранг повышен! Получено: '.$nextRank->reward.' вальмер!';
$user = UserModel::find(Auth::user()->id);
$user->valmers += $nextRank->reward;
$user->campaign_exp = 0;
$user->campaign_rank++;
$user->save();
return back()->with('ok', $message);
}
public function findVillage()
{
$campaignChapter = explode('.', Auth::user()->campaign_stage);
if(Auth::user()->campaign_stage == $campaignChapter[0].'0') return back();
if(Auth::user()->campaign_stage != '2.2') return redirect('/');
$campaignUser = json_decode(Auth::user()->campaign_temp);
$attackChance = rand(1,10);
if($attackChance == 9) $village = rand(7,9);
else $village = $campaignUser->next_village;
$campaignUser->cooldown = time()+3600;
$campaignUser->find = 1;
if($campaignUser->village == 0)
{
$campaignUser->village = $village;
$campaignUser->next_village++;
}
$user = UserModel::find(Auth::user()->id);
$user->campaign_temp = json_encode($campaignUser);
$user->save();
return back()->with('ok', 'Поиск деревни начался!');
}
public function startAttackVillage()
{
$campaignChapter = explode('.', Auth::user()->campaign_stage);
if(Auth::user()->campaign_stage == $campaignChapter[0].'0') return back();
if(Auth::user()->campaign_stage != '2.2') return redirect('/');
$campaignUser = json_decode(Auth::user()->campaign_temp);
$campaignInfo = config('campaign.chapter'.$campaignChapter[0].'.stage'.$campaignChapter[1]);
$campaignUser->battle = 1;
$campaignUser->villageHealth = $campaignInfo['villages'][$campaignUser->village]['health'];
$campaignUser->attacks = $campaignInfo['villages'][$campaignUser->village]['max_attacks'];
$campaignUser->myAttack = Services::getAllParameters('attack', Auth::user()->id);
$campaignUser->myHealth = Services::getAllParameters('health', Auth::user()->id);
$campaignUser->myArmor = Services::getAllParameters('armor', Auth::user()->id);
$user = UserModel::find(Auth::user()->id);
$user->campaign_temp = json_encode($campaignUser);
$user->save();
return redirect('/campaign');
}
public function leaveVillage()
{
$campaignChapter = explode('.', Auth::user()->campaign_stage);
if(Auth::user()->campaign_stage == $campaignChapter[0].'0') return back();
if(Auth::user()->campaign_stage != '2.2') return redirect('/');
$campaignUser = json_decode(Auth::user()->campaign_temp);
$campaignUser->find = 0;
$campaignUser->village = 0;
$user = UserModel::find(Auth::user()->id);
$user->campaign_temp = json_encode($campaignUser);
$user->save();
return back()->with('ok', 'Вы обошли деревню!');
}
public function attackVillage()
{
$campaignChapter = explode('.', Auth::user()->campaign_stage);
if(Auth::user()->campaign_stage == $campaignChapter[0].'0') return back();
if(Auth::user()->campaign_stage != '2.2') return redirect('/');
$campaignUser = json_decode(Auth::user()->campaign_temp);
if($campaignUser->attacks <= 0) return back()->with('error', 'Недостаточно ударов!');
$campaignInfo = config('campaign.chapter'.$campaignChapter[0].'.stage'.$campaignChapter[1]);
$myDamage = Services::getCardDamage($campaignUser->myAttack, $campaignUser->myAttack, $campaignInfo['villages'][$campaignUser->village]['armor']);
$villageDamage = $campaignInfo['villages'][$campaignUser->village]['attack'] > 0 ? Services::getCardDamage($campaignInfo['villages'][$campaignUser->village]['attack'], $campaignInfo['villages'][$campaignUser->village]['attack'], $campaignUser->myArmor) : 0;
$campaignUser->myHealth -= $villageDamage;
$campaignUser->villageHealth -= $myDamage;
$campaignUser->attacks--;
$user = UserModel::find(Auth::user()->id);
$user->campaign_temp = json_encode($campaignUser);
$user->save();
if($campaignUser->villageHealth <= 0 && $campaignUser->myHealth > 0)
{
$message = 'Деревня разрушена! Получено: '.$campaignInfo['villages'][$campaignUser->village]['reward']['count'].' эйронита, '.$campaignInfo['villages'][$campaignUser->village]['reward']['exp'].' монет и '.$campaignInfo['villages'][$campaignUser->village]['reward']['campaign_exp'].' опыта кампании!';
$campaignUser->count += $campaignInfo['villages'][$campaignUser->village]['reward']['count'];
$user = UserModel::find(Auth::user()->id);
$user->campaign_exp += $campaignInfo['villages'][$campaignUser->village]['reward']['campaign_exp'];
$user->exp += $campaignInfo['villages'][$campaignUser->village]['reward']['exp'];
$campaignUser->find = 0;
$campaignUser->battle = 0;
$campaignUser->village = 0;
$user->campaign_temp = json_encode($campaignUser);
$user->save();
return back()->with('ok', $message);
}
elseif($campaignUser->villageHealth > 0 && $campaignUser->myHealth <= 0)
{
$message = 'Карты разрушены жителями деревни! Получено: '.round($campaignInfo['villages'][$campaignUser->village]['reward']['exp']/20).' монет и '.round($campaignInfo['villages'][$campaignUser->village]['reward']['campaign_exp']/20).' опыта кампании!';
$user = UserModel::find(Auth::user()->id);
$user->campaign_exp += round($campaignInfo['villages'][$campaignUser->village]['reward']['campaign_exp']/20);
$user->exp += round($campaignInfo['villages'][$campaignUser->village]['reward']['exp']/20);
$campaignUser->find = 0;
$campaignUser->battle = 0;
$campaignUser->village = 0;
$user->campaign_temp = json_encode($campaignUser);
$user->save();
return back()->with('ok', $message);
}
return back();
}
public function startOpposition()
{
$campaignChapter = explode('.', Auth::user()->campaign_stage);
if(Auth::user()->campaign_stage == $campaignChapter[0].'0') return back();
if(Auth::user()->campaign_stage != '3.2') return redirect('/');
$campaignUser = json_decode(Auth::user()->campaign_temp);
$campaignInfo = config('campaign.chapter'.$campaignChapter[0].'.stage'.$campaignChapter[1]);
if($campaignUser->find == 0) return back();
$campaignUser->destruct_cooldown = time()+60;
$campaignUser->myHealth = Services::getAllParameters('health', Auth::user()->id);
$campaignUser->enemyHealth = $campaignInfo['enemies'][$campaignUser->enemy]['health'];
$campaignUser->battle = 1;
$user = UserModel::find(Auth::user()->id);
$user->campaign_temp = json_encode($campaignUser);
$user->save();
return redirect('/campaign');
}
public function attackEnemy()
{
$campaignChapter = explode('.', Auth::user()->campaign_stage);
if(Auth::user()->campaign_stage == $campaignChapter[0].'0') return back();
$campaignInfo = config('campaign.chapter'.$campaignChapter[0].'.stage'.$campaignChapter[1]);
$campaignUser = json_decode(Auth::user()->campaign_temp);
if($campaignUser->attackCooldown >= time()) return back()->with('error', 'Откат!');
$attack = Services::getAllParameters('attack', Auth::user()->id);
$armor = Services::getAllParameters('armor', Auth::user()->id);
$myDamage = Services::getCardDamage($attack, $attack, $campaignInfo['enemies'][$campaignUser->enemy]['armor']);
$botDamage = Services::getCardDamage($campaignInfo['enemies'][$campaignUser->enemy]['attack'], $campaignInfo['enemies'][$campaignUser->enemy]['attack'], $armor);
if($campaignUser->myHealth > 0 && $campaignUser->enemyHealth <= 0) return self::oppositionResult('win');
elseif($campaignUser->myHealth <= 0 && $campaignUser->enemyHealth > 0) return self::oppositionResult('lose');
elseif($campaignUser->myHealth <= 0 && $campaignUser->enemyHealth <= 0) return self::oppositionResult('lose');
$campaignUser->enemyHealth -= $myDamage;
$campaignUser->myHealth -= $botDamage;
$campaignUser->attackCooldown = time()+3;
$user = UserModel::find(Auth::user()->id);
$user->campaign_temp = json_encode($campaignUser);
$user->save();
return back();
}
public function oppositionResult($result)
{
$campaignChapter = explode('.', Auth::user()->campaign_stage);
$campaignInfo = config('campaign.chapter'.$campaignChapter[0].'.stage'.$campaignChapter[1]);
$campaignUser = json_decode(Auth::user()->campaign_temp);
$user = UserModel::find(Auth::user()->id);
if($result == 'win')
{
if($campaignUser->enemy < 4)
{
$campaignUser->enemy++;
$campaignUser->myHealth = Services::getAllParameters('health', Auth::user()->id);
$campaignUser->enemyHealth = $campaignInfo['enemies'][$campaignUser->enemy]['health'];
$campaignUser->attackCooldown = 0;
$user->campaign_exp += $campaignInfo['enemies'][$campaignUser->enemy]['reward']['campaign_exp'];
$user->valmers += $campaignInfo['enemies'][$campaignUser->enemy]['reward']['valmers'];
$message = 'Враг уничтожен!';
}
else
{
$campaignUser->complete = 1;
$message = 'Вы уничтожили всех врагов!';
}
}
else
{
$campaignUser->cooldown = time()+1800;
$campaignUser->enemy = 1;
$campaignUser->battle = 0;
$campaignUser->find = 0;
$campaignUser->myHealth = Services::getAllParameters('health', Auth::user()->id);
$message = 'Вы потерпели поражение!';
}
$user->campaign_temp = json_encode($campaignUser);
$user->save();
Session::put('result', $message);
return redirect('/campaign');
}
}