Сервер

Борьба с сервером. Часть вторая

Целый день потратил на поиск ошибок, нашлось куча мелких багов, но ситуация с окном, не прояснялась.

Уже столько всего выводил в лог – что при запуске сервера лог пух на почти мегабайт от каждого действия.

Нашлось случайно – решил проверить на локальном сервере (под Windows) – оказалась та-же самая ошибка с прорисовкой, причем появлялась она тоже не каждый раз – была плавающей.

Расстановка

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

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

    В Flash передача оказалась (как и предполагалась) ерундовым делом:
    Кнопка, на кнопке onPress.
    on (press) {
    btn_apply._visible = false;
    var inv='';for(var i=0;i<_root.itemsList.length;i++) {
    var tmp = itemsList[i].id.toString(16);
    if (tmp.length<6) { var i=6-tmp.length; for(var j=0;j<i;j++) {tmp='0'+tmp;} }
    inv+=itemsList[i].place.toString(16)+tmp;
    }
    loadVariablesNum(_root.host+"/maze?action=set_inv&inv="+inv+"&sessionid="+_root.session,0);
    }

    Ну да в Flash'ку пришлось передавать host, ну думаю может и не надо.

    На стороне сервера :

    Правки

    Избавился от пересчета нужно ли обновлять карту – теперь при открытии карты с сервера, запоминаются координаты, что с этого положения карта уже запрашивалась.
    Пометка сохраняется в массиве watchmap.

    На сервере связи с этим сделал, чтобы карта открывалась только по обозреваемой территории – алгоритм тут.

    Интеграция

    Нарисовал героя и даже сделав для него анимацию, попытался прикрутить его в основной проект.
    Для начала пришлось все-таки переписать загрузчик для SWF, теперь он сразу создает нужный клип, название которого приходит ему качестве параметра: function loadclipfromserver(path, loadname,nameclip).

    Затем пришлось в структуру(объект) creature добавить mcname,dx,dy,и все другие параметры для анимации
    Теперь в функции moveCreature не сразу присваиваются _x и _y, а выполняется ряд действий (может и избыточных, но пока нужных)

    Добавляем характеристики

    Про сами характеристики я писал уже ранее, сейчас же прикручиваем параметры. Для этого была сделана структура TCreatureParams.
    typedef struct
    {
    short Stamina;
    short Strength;
    short Dexterity;
    short Intellect;
    short HP;
    } TCreatureParams;

    Которая была добавлена в две структуры в TUser и TMazeCreature, потому как игрок может оказаться в лабиринте, а вот существо из лабиринта никогда не попадает в список пользователей.

    При переходе в лабиринт, было добавлено копирование структуры params из TUser в структуру TMazeCreature.

    Прикручиваем "книгу действий"

    Прикручивал «книгу действий» - экран который вызывается при нажатии на персонажа.
    Легко нарисовал прямоугольник, вставил первый клип – активация телепорта, и столкнулся с проблемой №1.Не называешь клип как инстанцию – не получаешь к ней доступа, называешь – ошибка , что данный клип используется другой инстанцией. Отжимаешь галку экспорт в ActiveScript – ошибка пропадает, но т.к. клип лежит на другом клипе (книге), то доступа до него нет. Короче что-то не то. И уже было (с кнопкой конец хода)

    Программируем телепорты

    Вернее сказать телепорты - это первые "объекты", с которыми можно взаимодействовать (не ландшафт). Для начала пришлось создать отдельную структуру
    typedef struct
    {
    bool visible;
    short type,x,y;
    int data[6];
    } TMazeObject;

    visible будет определять существует ли объект или нет, ну и естественно type - тип и координаты объекта x,y.

    Для телепортов застолбим тип равный 0x10, а также для других различных телепортов (например в тестовом лабиринте входящий и исходящий телепорт разные) - 0x11,0x12,0x13
    Иными словами:

    Вводим действия

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

    vector<THistoryAction> historyAction, где THistoryAction - некая абстрактная структура, предположим:
    typedef struct
    {
    int action;
    int data[5];
    } THistoryAction;

    Допустим игровой клиент запрашивает таймер, а с таймером ему приходит еще и количество записанных действий (lastAction=histroyAction.size()).

    Делаем очередность хода

    Так как лабиринты планируются игрой пошаговой, необходимо внедрить алгоритм перехода хода.

    Пока решил внедрять фиксированное время на ход, потом может поменяю, а может и нет.

    Для начала, внес некии правки в структуру TMazeMap
    typedef struct
    {
    int Id;
    unsigned char w,h;
    char *data;

    TCreatureList creatures;
    time_t lastTime;
    int currentId;
    int timelenght;

    } TMazeMap;

    А также написал несколько дополнительных функций, а именно:
    void initMaze(TMazeMap *m);
    void nextTurn(TMazeMap *m);
    void checkMazes();

    RSS-материал