112 lines
3.6 KiB
PHP
112 lines
3.6 KiB
PHP
|
<?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);
|
|||
|
}
|
|||
|
}
|