game/_incl_data/class/Insallah/Tournament/Tournament.php

112 lines
3.6 KiB
PHP
Raw Normal View History

2022-06-06 21:30:34 +00:00
<?php
/** todo
* В каком-то месте проверять по крону не протух ли турнир!
*/
namespace Insallah;
class Tournament
{
/**
* Проверяем может ли игрок учавствовать в турнире и либо присоединяем его, либо обламываем.
*
* @param int $user_id
*
* @return void
*/
public function join($user_id)
{
/** Возвращает level, или 0 если провалены проверки. */
$userLevel = TournamentModel::getUserLevel($user_id);
if ($userLevel === 0) {
return;
}
$mq = TournamentModel::getWaitingMembersQuantity($userLevel);
if (empty($mq)) {
TournamentModel::createTournament($userLevel);
}
TournamentModel::joinTournament($user_id, $userLevel);
/** На третьем участнике пишем уведомление в чат. */
if ($mq === 2) {
TournamentModel::sysMessage("Внимание! Идёт набор бойцов на турнир " . $userLevel . " уровня! Поспешите!");
}
/** На двенадцатом участнике начинаем турнир. */
if ($mq === 11) {
TournamentModel::startTournament($userLevel);
$this->check_members($userLevel);
}
}
/**
* Проверяем есть ли ещё участники турнира. Если есть, отправляем драться. Если остался последний - значит он
* победитель.
* todo Обработать ничью!
*
* @param int $tournament_id
*
* @return void
*/
private function check_members($tournament_id)
{
$active_fighters = TournamentModel::getFreeFighters($tournament_id);
if (count($active_fighters) > 1) {
$this->start_battle($active_fighters);
} else {
TournamentModel::removeFighter($active_fighters[0]); // выбиваем победителя
$this->victory($tournament_id);
}
}
/**
* Получаем пары бойцов и начинаем их поединки.
*
* @param array $fighters_list
*
* @return void
*/
private function start_battle(array $fighters_list)
{
$teams = TournamentModel::getFightersTeams($fighters_list);
foreach ($teams as $team) {
if (count($team) === 2) {
TournamentModel::startBattle($team[0], $team[1]);
}
}
}
/**
* Вызывается при проигрыше боя или при уходе в оффлайн.
*
* @param int $user_id
*
* @return void
*/
public function kick_user($user_id)
{
if (empty($user_id)) {
return;
}
TournamentModel::removeFighter($user_id);
$this->check_members(TournamentModel::getTournamentIdByUserId($user_id)); //перезапуск выбора противника для поединка
}
/**
* Награждаем победителей турнира, чистим базу.
*
* @param int $tournament_id
*
* @return void
*/
private function victory($tournament_id)
{
$winners = TournamentModel::getWinners($tournament_id);
TournamentModel::destroyTournament($tournament_id);
TournamentModel::givePrizeItems($winners[1], 25);
TournamentModel::givePrizeItems($winners[2], 10);
TournamentModel::givePrizeItems($winners[3], 5);
}
}