немного логики

This commit is contained in:
lopar 2022-01-27 00:56:03 +02:00
parent e4cce2e96e
commit d8ccb13873
2 changed files with 78 additions and 18 deletions

View File

@ -8,5 +8,5 @@ use Battles\Template;
Template::header('Арена');
$fight = new Arena(1);
$fight->Init([[2,1],[3,2]]);
$dbname = new SQLite3('name.db');
Arena::$current = new Arena($dbname);

View File

@ -6,8 +6,9 @@ use SQLite3;
class Arena
{
public static Arena $current;
private $db;
private const DB_INIT = 'create table if not exists fighters (
private const DB_TEMPLATE = 'create table if not exists fighters (
uid integer not null,
strength integer not null,
dexterity integer not null,
@ -26,29 +27,62 @@ class Arena
melee_max integer not null,
teamid integer not null,
rowid integer not null,
last_turn_time integer)';
turn_timeout integer)';
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 __construct(int $battleId)
public function __construct(SQLite3 $battleId)
{
$dbname = 'battle-' . $battleId;
//Придумать человеческий путь, чтобы не создавалось в папке с классами
$dbname = 'battle-' . $battleId . '.db';
if (!file_exists($dbname)) {
$this->db = new SQLite3($dbname);
$this->db->query(self::DB_INIT);
$this->createDb($dbname);
}
}
private function createDb($dbname)
{
$this->db = new SQLite3($dbname);
$this->db->query(self::DB_TEMPLATE);
}
// array type: [[uid1,teamid1], [uid2,teamid2], ..., [uid_N,teamid_N]].
public function Init(array $fighters)
{
$init_query = 'insert into fighters (uid, strength, dexterity, intuition, endurance, intelligence, wisdom, accuracy, evasion, criticals, health, max_health, mana, max_mana, melee_min, melee_max, teamid, rowid) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
$stmt = $this->db->prepare($init_query);
foreach ($fighters as list($uid, $team)) {
$init_db_query = 'create table if not exists fighters (
uid integer not null,
strength integer not null,
dexterity integer not null,
intuition integer not null,
endurance integer not null,
intelligence integer not null,
wisdom integer not null,
accuracy integer not null,
evasion integer not null,
criticals integer not null,
health integer not null,
max_health integer not null,
mana integer not null,
max_mana integer not null,
melee_min integer not null,
melee_max integer not null,
teamid integer not null,
rowid integer not null,
turn_timeout integer)';
$init_table_query = 'insert into fighters (
uid,
strength, dexterity, intuition, endurance, intelligence, wisdom,
accuracy, evasion, criticals,
health, max_health, mana, max_mana, melee_min, melee_max,
teamid, rowid)
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
$stmt = $this->db->prepare($init_table_query);
foreach ($fighters as [$uid, $team]) {
$fighter = new UserStats($uid);
$stats = $fighter->getFullStats();
$stmt->bindValue(1, $fighter->getId());
@ -73,37 +107,63 @@ class Arena
}
}
public function Turn(int $action, int $uid): void
public function playerTurn(int $action, int $uid): void
{
$now_minus_3_minutes = date('U', strtotime('-3 minute'));
$check_turn_timer = $this->db->querySingle('select last_turn_time from fighters where uid = ' . $uid);
// Перед ходом проверить, а жив ли ты вообще?
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_minus_3_minutes > $check_turn_timer && !in_array($action, [self::MELEE_ATTACK, self::RANGED_ATTACK, self::USE_MAGIC, self::MOVE, self::PASS])) {
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'));
$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();
}
}