142 lines
6.2 KiB
PHP
142 lines
6.2 KiB
PHP
|
<?php
|
|||
|
|
|||
|
namespace Battles;
|
|||
|
|
|||
|
use Battles\Database\Db;
|
|||
|
|
|||
|
class Fight
|
|||
|
{
|
|||
|
public static Fight $current;
|
|||
|
private $db;
|
|||
|
private \DateTimeImmutable $timer;
|
|||
|
public const MELEE_ATTACK = 1;
|
|||
|
public const RANGED_ATTACK = 2;
|
|||
|
public const USE_MAGIC = 3;
|
|||
|
public const MOVE = 4;
|
|||
|
public const FLEE = 5;
|
|||
|
public const PASS = 0;
|
|||
|
private int $turn_timeout;
|
|||
|
|
|||
|
public function init($fighters)
|
|||
|
{
|
|||
|
$defaultRow = 2;
|
|||
|
$defaultTimer = $this->timer->format('U');
|
|||
|
$query = 'insert into fighters (
|
|||
|
user_id,
|
|||
|
strength,
|
|||
|
dexterity,
|
|||
|
intuition,
|
|||
|
endurance,
|
|||
|
intelligence,
|
|||
|
wisdom,
|
|||
|
accuracy,
|
|||
|
evasion,
|
|||
|
criticals,
|
|||
|
health,
|
|||
|
max_health,
|
|||
|
mana,
|
|||
|
max_mana,
|
|||
|
melee_min,
|
|||
|
melee_max,
|
|||
|
battle_id,
|
|||
|
team_id,
|
|||
|
row_id,
|
|||
|
turn_timeout
|
|||
|
) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)';
|
|||
|
$i = 1;
|
|||
|
$mergedOptions = [];
|
|||
|
foreach ($fighters as $fighter) {
|
|||
|
$statsObj = new UserStats($fighter->user_id);
|
|||
|
$stats = $statsObj->getFullStats();
|
|||
|
$options[$i] = [
|
|||
|
$fighter->user_id,
|
|||
|
$stats->strength,
|
|||
|
$stats->dexterity,
|
|||
|
$stats->intuition,
|
|||
|
$stats->endurance,
|
|||
|
$stats->intelligence,
|
|||
|
$stats->wisdom,
|
|||
|
$stats->accuracy,
|
|||
|
$stats->evasion,
|
|||
|
$stats->criticals,
|
|||
|
$statsObj->getHealth(),
|
|||
|
$statsObj->getMaxHealth(),
|
|||
|
$statsObj->getMana(),
|
|||
|
$statsObj->getMaxMana(),
|
|||
|
$stats->min_physical_damage,
|
|||
|
$stats->max_physical_damage,
|
|||
|
$fighter->fight_id,
|
|||
|
$fighter->team_id,
|
|||
|
$defaultRow,
|
|||
|
$defaultTimer,
|
|||
|
];
|
|||
|
if ($i > 1) {
|
|||
|
$query .= ', (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)';
|
|||
|
$mergedOptions = array_merge_recursive($mergedOptions, $options[$i]);
|
|||
|
}
|
|||
|
$i++;
|
|||
|
}
|
|||
|
Db::getInstance()->execute($query, $mergedOptions);
|
|||
|
}
|
|||
|
|
|||
|
public function playerTurn(int $action, int $uid): void
|
|||
|
{
|
|||
|
// Перед ходом проверить, а жив ли ты вообще?
|
|||
|
if (empty($this->turn_timeout)) {
|
|||
|
$this->turn_timeout = $this->db->querySingle('select turn_timeout from fighters where uid = ' . $uid);
|
|||
|
}
|
|||
|
$now = date('U');
|
|||
|
|
|||
|
/* select from last_turn_time and look at $now_plus_3_minutes - if ok, continue, if no, do nothing */
|
|||
|
if ($now > $this->turn_timeout && !in_array($action, [self::MELEE_ATTACK, self::RANGED_ATTACK, self::USE_MAGIC, self::MOVE, self::PASS, self::FLEE])) {
|
|||
|
$action = self::PASS;
|
|||
|
$stmt_update_timer = $this->db->prepare('update fighters set last_turn_time = ? where uid = ?');
|
|||
|
$stmt_update_timer->bindValue(1, date('U', strtotime('+3 minute')));
|
|||
|
$stmt_update_timer->bindValue(2, $uid);
|
|||
|
}
|
|||
|
|
|||
|
if ($action === self::MELEE_ATTACK) {
|
|||
|
//Выполнимо только с клетки 1, только по вражеской клетке 1.
|
|||
|
//Выполнимо по клетке 2, если клетка 1 пуста _у всех сторон_;
|
|||
|
//Выполнимо по клетке 3, если клетка 2 пуста _у всех сторон_;
|
|||
|
//Стоя на клетке 2 при пустой клетке 1 - атака невозможна!
|
|||
|
echo 'Melee!';
|
|||
|
}
|
|||
|
|
|||
|
if ($action === self::RANGED_ATTACK) {
|
|||
|
//С клетки 1 атака на вражеские клетки 1 и 2;
|
|||
|
//С клетки 2 атака на свою клетку 1 и вражескую клетку 1;
|
|||
|
//С клетки 2 атака на вражескую 2, только если пустая клетка 1, либо нет клеток 1 _ни у одной из сторон_.
|
|||
|
echo 'Ranged!';
|
|||
|
}
|
|||
|
|
|||
|
if ($action === self::USE_MAGIC) {
|
|||
|
//Достаёт кого угодно откуда угодно в любых обстоятельствах.
|
|||
|
//ОЧЕНЬ внимательно проверять цель. Случайный хил трупа вызовёт апокалипсис в логике.
|
|||
|
echo '!MAGIC!';
|
|||
|
}
|
|||
|
|
|||
|
if ($action === self::MOVE) {
|
|||
|
//клетка 1 - ближний ряд, только шаг назад
|
|||
|
//клетка 2 - средний ряд, вперёд или назад
|
|||
|
//клетка 3 - тыл, только вперёд
|
|||
|
//В момент хода при соблюдении условий удара может прилететь неблокируемая атака на расстоянии.
|
|||
|
//Перемещение - это ручной гарантированный уворот от всех летящих физических атак.
|
|||
|
//Перемещение на пустующую клетку 1 с клетки 2 - это ручной гарантированный уворот всех стоящих на клетке 2 от всех летящих немагических атак по всей клетке.
|
|||
|
echo 'I have legs!!';
|
|||
|
}
|
|||
|
if ($action === self::FLEE) {
|
|||
|
//побег из боя, только с клетки 3.
|
|||
|
echo 'Help me, mommy!';
|
|||
|
}
|
|||
|
if ($action === self::PASS) {
|
|||
|
//Пропуск хода.
|
|||
|
echo 'I pass this turn.';
|
|||
|
}
|
|||
|
|
|||
|
// ПИСАТЬ РЕЗУЛЬТАТ ХОДА ТОЛЬКО ПОСЛЕ ПОВТОРНОЙ ПРОВЕРКИ НА НАЛИЧИЕ ПРОТИВНИКА - ОН МОГ УСПЕТЬ ОТОЙТИ!
|
|||
|
// !!ИЛИ УМЕРЕТЬ!!
|
|||
|
$stmt_update_timer->execute();
|
|||
|
}
|
|||
|
|
|||
|
}
|