battles/classes/Battles/Fight.php

142 lines
6.2 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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