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);
|
||
}
|
||
} |