Косяки

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

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

Но самый главный косяк и не продуманность была в getaction - получении и обработки команд с сервера.

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

Ага - подумал я, и поставил если очередность не игрока, то запрашивать каждую секунду.

И тут все поехало, причем в плохом смысле.

Обработчик команд не успевал и переменная lastaction (которая указывает какую команду обрабатывает клиент) - посылалась в качестве последней команды для getlistaction с сервера, сервер бодро отвечал что уже команд дофига - и выдавал их список.
Клиент помещал список в стэк и обрабатывал, но прикол в том что когда он доходил до конца в стэке были повторения и он их конечно пропускал, но там стоит пауза в 50мс, и за это время стэк опять же забивался командами (теми же).

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

  • lastaction - он же playAction - указывает на последнюю команду, которую выполнял клиент
  • server_lastaction - указывает на последюю команду по версии сервера
  • lastgetaction - указывает на последнюю команду полученную с сервера
  • lastputaction - указывает какую последнюю команду мы указали в качестве последней, при последней отправке запроса на получения команд
  • if (_root.server_lastaction>_root.lastgetaction)
    if (_root.lastgetaction > _root.lastputaction)
    need_action=true;

    Это я тут так быстро написал - на деле оказалась больше недели потраченного времени, и криков - "да с какого тут?"
    Лабиринты зыби - 7 лабиринтов. Арена