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