арена

Аренда, заявки и команды

Три дня наши программисты (все трое) тестировали и внедряли новый код арены, с заявками на командные бои.
Теперь можно создавать заявки на турнирную арену с различными вариантами боев.
Таких как 2 vs 2 vs 2. Или 4 vs 4.

В принципе, общие принципы были сделаны давно (такие как - что за убийство наперника не дается опыт, и что мобы не атакуют напарников), но как водится полезла куча глюков.

Часть мы искали три дня, что-то нашли, но думаю что-то еще осталось. Также в Flash напарники выводятся в верхнем правом углу. Есть какой-то баг с этим связанный, сейчас ищем.

Турнирная арена

Если обычная арена - это дуэль, причем сейчас чаще всего с ботом, а при хорошем онлайне 99% с живым противником, то турнирная - это бой против нескольких соперников.

Сегодня тестировали и искали оптимальные размеры арен, для разного количества участников. Для начала запустили 4 противников на арену 20x20. Реально последнего бота искали минут 10 - т.к. он постоянно ходил в другую, понятную ему только, сторону. И это бот - а человек более непредсказуем.
Потому решено для 4 участников размер арены - 15x15, а для 6 и более - 20x20.

Арена и воины

Доводим до ума арену, решил уменьшить ее размер (10x10) и сделать ее фиксированной вот, такого вида:
unsigned char pack[13]={255,7,88,111,133,149,86,90,104,191,1,254,7};

Собственно это сжатая на биты карта, для ее отображения небольшой код:
int TMap::MakeMapFromPack(unsigned char *pack)
{
int l =w*h;
int size_pack = l/8;
if (l % 8) size_pack++;
for(int j=0,i=0;i<size_pack;i++)
for(int k=0;k<8;k++)
if (j<l) Map[j++] = pack[i] & (1 << k);
}

Ветераны арены

Ветеран арены. 7maze.ru - лабиринты зыбиПодумал и решил сделать для арены - количество игроков не два, а три.
Причем ветераны добавляются автоматически после 30 секундного простоя, после добавления каждого игрока.

Маленькие правки

Добавил в структуру TMazeCreature exp, данный параметр уже присутствует в TMazeCreature, через TCreatureParams, но там он показывает общий опыт полученный персонажем.
А в структуре TMazeCreature будет показывать опыт набранный в текущем лабринте, также его можно будет показывать на страничке после победы - типа "выграл игрок, получил XXX опыта".

Так-же, добавил на странице ожидания арены таймер, который рефрешает страницу каждые 5 секунд, а то до этого нужно было рефрешать ручками.
Примитивный JS-скрипт:

О правильном названии функций

Делаю я арену, и натыкаюсь в одном месте на вызов не существующей функции checkMaze - подумал, нафик я ее поставил, тем более ее еще и нет, есть функция checkMazes - которая в фоне проверяет ходы, крутит таймер и все такое.
Закоментил, с надписью "что не знаю что такое".

Принцип равновесия

Чтобы придать на арене большего рандома решил ввести разные типы амуниция.
Потому что до сего момента, рандома не было никакого. Допустим встречаются два игрока на арене - с одинаковыми параметрами и одинаковым вооружением.

Понятно, что победитель тот - кто раньше ударил. Поэтому решено ввести принцип камень-ножницы-бумага, а именно добавить стрелковое и тяжелое вооружение.

Реализация заявок

Собственно реализация - получение списка текущих заявок, добавление заявок и хранение их где-то.

Структура заявок - TMazeDemand
typedef struct
{
bool close; //close?
int id;
int type; //type
int place; //location
time_t stime; //start time
time_t etime; //end time
vector<int> victim; //players
} TMazeDemand;

Ну все кажется понятным, кроме close - что заявка уже закрыта (пока не знаю для чего это нужно, но кажется нужно).

Расстановка

Делаю арену, и тут маленькой подзадачкой стало расстановка игроков в лабиринте, таким образом чтоб шанс был практически равный у всех.
Сначала думал написать общий алгоритм, а потом решил, что нафик не надо, ибо количество игроков в лабиринте-арене – лимитировано.
И так вот, что получилось:
Есть лабиринт с размерами wh*wh, и есть n игроков. Задача расставить n игроков по полю наиболее равномерно, в зависимости от n.
Далее варианты:

  • Игрок один – становится ровно по центру c={wm/2,wh/2}
  • Арена

    Начал делать реализацию боев на арене с противником человеком.
    Алгоритм делаю следующим:

  • Игрок заходит на арену, и если стэк заявок пуст, то регистрируется новая заявка
  • Если стэк заполнен - то двое переносятся в лабиринт
  • Далее думаю сделать следующую проверку - победителем будет тот, кто останется в лабиринте один, т.е. второй игрок (а может еще и третий с четвертым и пятым) может попросту выйти из лабиринта - и того победа засчитывается последнему.
    Ну и противника можно вывести из лабиринта против его воли :)

    Изменения в игровой механике - минимальные:

    RSS-материал