C++

Полет стрелы. Серверная часть.

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

Проверка на наличие снарядов и возможности стрельбы – очень простая: проверяется, что оружие в правой руке – тип артиллерия (TW_RANGE), наличие снарядов, что в правой есть предмет с типом снарядов (TW_ARROW), далее проверяется количество снарядов (прочность предмета).

Очередной этап

Сделали реализацию магазина, в общем скелете уже набросана покупка/продажа вещей и артефактов, но пока протестировано лишь выкуп минерала.

Также пришлось изменить количество минерала на картах (кроме пустой карты) в два раза по сравнению с расчетными показателями, потому как некоторые «кусты» минерала попадает на закрытые территории (нельзя до них дойти), да и в целом покупать карту за 50 золотых, чтобы получить 60 и это все только раз в час – это задротство какое-то, ей богу.

Квестовые карты - собираем рапаппилу

Доделали на сервере окончательную покупку карт и квест по сбору минерала.

Код, не очень сложный получился - и не очень большой (даже маленький) ~ 150 строк.

Изменяемые шаблоны

Ранее думалось, что реализовывать экраны через скрипты, но сейчас думаю это из пушки по воробьям. Нет, в целом скрипты очень даже нужны будут, особенно при программировании ИИ существ, но вот для зарузки html страничек – это перебор.

Реализация сундуков

Сделал реализацию открытия сундуков.

На клиенте

var sunduk = _root.maybeOpen(tx,ty);
if (sunduk && dx<=1 && dy<=1)
_root.openChest(tx,ty);

Функция maybeOpen - просто проверяет что на карте в (x,y) находиться сундук (открытый или закрытый), а функция openChest - посылает на сервер сигнал open_chest.

На сервере

Реализация сбора рапаппилы

Начал реализацию сбора рапаппилы, самое просто - завел объект:

#define MAZE_OBJ_RAPAPPILA 0x25
#define MAZE_OBJ_RAPAPPILA_V 0x26

MAZE_OBJ_RAPAPPILA_V - это объект - "выкорчеванная рапаппила", дырка в земле.

А в Flash, соответственно сделал прорисовку этих объектов.
Также в флэшке сделал кнопку сбор рапаппилы, которая появляется если герой стоит на клетке с рапаппилой.
Кнопка становится неактивная если у героя нет с собой сумки.

Работа над ошибками

В чем минус эволюционной разработки?

Эволюционная разработка - работа над проектом волнами, когда один блок заменяется другим. Для более быстрой проверки работоспособности создаются заглушки или код на первое время

Минус в том, что могут появляется ошибки(глюки) на стыке двух модулей, т.е. по отдельности они нормально работают, а вот их объединили - и не работают оба.

В моем случае - появился глюк при исполнении команды retreat. Команда выполнялась в случае гибели персонажа или его победы в лабиринте (выполнения условий).

Загружаемые персонажи

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

Изменения кода checkActiveDemands() -

void checkActiveDemands()
{
time_t now=time(0);
for(vector<int>::iterator i=activeDemands.begin();i<activeDemands.end();i++)
{
TMazeDemand *md = &mazeDemands[*i];
if (!md->close && md->type == TP_ARENA_CITY)
if (now-md->atime >= TIME_FOR_WAIT_DEMAND)
{

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

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

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

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

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

Структура заявок - 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 - что заявка уже закрыта (пока не знаю для чего это нужно, но кажется нужно).

RSS-материал