1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

[Ковыряние] Warcraft Orc and Humans. Что ни день - сто грамм

Автор: Zelya · 24 июн 2019 · ·


  1. Вот вы думаете, что игру написать трудно. Неправда, фигня это все. Особенно в современном мире. Раз-два и игра готова; проще пареной репы.
    Может, трудно игру отладить и наполнить интересным контентом. Это уже ближе к правде. Но в моем случае вопрос с контентом не актуален. А вот с отладкой... С отладкой все по-хардкору. Она мне стоила не одну поллитру хдоровья. Ведь как с обычной игрой: потыкал в юнита, посмотрел доходит ли он до заданной позиции и радуйся. А если игра не обычная, а мультиплеерная. И с другой стороны не ваш клиент, а чужой, с которым вы декларируете совместимость. Что это меняет?
    Рассмотрим пример. Играете вы себе по сети. Играете, играете, даже побеждаете - никаких проблем. А тут бабах! Фермы начали скакать, аки юниты живые, пеоны телепортироваться в другие шахты и все венчает солидный креш. В чем дело-то? Ничего ж не делал недозволенного. Уже почти победил же, обидно! А проблема в том, что второй игрок (который тоже ничего недозволенного не делал) уже тоже почти победил. Увы, игра хоть кое-как и проверят целостность сетевых данных (см тут), но вот на синхронность игрового состояния ей начхать. Т.е. каждый игрок играет в свою независимую игру, лишь дублируя команды в сеть.
    Вот, скажем, идут себе два пеона: один лес домой несет, а второй в шахту за золотом спешит. Встретились они лоб в лоб посреди узенькой дорожки. Кто кому дорогу уступит? Да какая разница! А разница принципиальная. Уступил, скажем, у вас дорогу "пустой" пеон. Прибежал тот что с лесом, и принес ресурсы. И сразу же бац, барак в постройку! А вот у оппонента, пеон с лесом решил дорогу уступить, и в момент постройки барака он еще бежал к таун холу. Как отреагирует игра на такую постройку: да обычно, проигнорирует приказ. Леса-то не хватает. Вот и получится, у одного игрока уже есть барак, а у другого нет. А тут, допустим, новый пеон родился. И у второго игрока он займет аккурат то же место в списке игровых объектов, где у перовго барак. Вот и получили мы ситуацию, когда баракам приказы на дивжение и сбор ресурсов отдаются. А игра-то их и не запрещает. Она даже представить не могла, что такие приказы можно отдать. И чем дальше, тем абсурднее становится ситуация. Эффект бабочки.

    Или вот пример с последнего теста. Оригинал:

    Порт:


    Играют себе люди, да и играют. А дело крешем закончилось. Ищем проблему. Ах вот она! Смотрим 8:35 оригинала и 8:34 порта. В оригинале пеон после удара футмена убежал по диагонали, а в порте вправо. Мелочь, но потом все позиции пеонов развалились. В результате в одной версии один убитый пеон, в другой - два. А потом на "лишнее" свободное место барак втыкается, и игра разваливается.

    И такая дребедень каждый день: то с маршрутом то с фермами хрень Во всех случаях симпты одинаковые: либо прыгают юниты/строения, либо креш, либо и то и то. Ну как тут не спиться, ну судите сами:

    14-06
    Неправильно работал таймер постройки. Смешной баг. Все началось с этого места:
    [​IMG]
    Я ставил в BuildingTimer ch вместо cl, и никак не мог увидеть, где проблема. Раза с 10-го только увидел.
    Простой баг. 100 грамм.

    15-06 Пеон выписывал странные кренделя, при поиске маршрута. Симпотомы удалось воспроизвести довольно быстро. Вар1 генерит маршрут следующим образом:
    [​IMG]
    Сначала генерится прямой маршрут (розовая линия), который делится на "доступные" точки (фиолетовые) и недоступные (розовые). Как только маршрут доходит до препятствия (желтое), начинается обход по правило правой и левой руки. Как только найдена цель или недоступная ранее точка маршрута - успех. Если найден старт маршрута - феил. Но если за 100 итераций не найдено ничего, то игра считает, лучше уж пойти в никуда и оттуда перестроить маршурт, чем просто стоять столбом. Все логично, пока мы не натываемся на такую ситуацию:
    [​IMG]
    Мы получаем зацикиливание. По результатам 100 итераций, пеон куда-то да попадает, и стало быть он все же пойдет на одну из точек обхода, а оттуда построит новый маршрут к цели. Выписав при этом загогулину. Но оригинал вел себя явно не так, и где отличие я никак не мог увидеть. По дороге домой я рассуждал, как бы я фиксил такую дурацкую ситуацию. Самый простой вариант - фейлится, если игра ходит по уже проложенным точкам, я отмел сразу. В таком случае пеон не сможет обходить препятствия по диагонали. Какая-то сложная логика даже не рассматривалась, так как ресурсы игры этого не позволяли. И тогда я "придумал" такой вот фикс:
    [​IMG]
    Так как быг возможен только при диагональном пересечении прямого маршрута и нашего обхода, то достаточно каждый раз "зыркать" на 45 градусов в сторону, нет ли там нужной точки. Какой простой фикс, думал я. И ресурсов много не надо, и работает на 100%. Почему Близзард его не сделали? Прийдя домой, я открыл код и обнаружил, что они сделали именно такой фикс от зацикливания! Просто при переносе логики, я опять немного напортачил, и голубые стрелочки у меня совпадали с черными.
    Не особо трудный баг. 100 грамм.

    Продолжение следует...
    ivan866, rusty_dragon, alfy и 11 другим нравится это.

Комментарии

  1. ivan866
    На чем портируешь, не понял?
    Что, код игры разве выложен? А что насчет WarGus?

    Трассировка маршрута - вещь достаточно тривиальная, особенно если брать современные либы для steering behaviour.
    А вот написать генератор карт, и так, чтобы не было на них недоступных участков, тупиков и просто неинтересных мест - уже немного сложнее.
  2. Zelya
    > На чем портируешь, не понял?
    Голый C#. Минимальная формочка для вывода графики. Ни к чему не привязываюсь, чтобы потом (теоретически) портировать на что угодно.
    > Что, код игры разве выложен?
    Нет
    > А что насчет WarGus?
    Не понял вопроса
    > Трассировка маршрута - вещь достаточно тривиальная, особенно если брать современные либы для steering behaviour.
    Да, для любой современной игры. Перенести с оригинала - не то чтобы очень трудно, но надо быть внимательным.
    > А вот написать генератор карт, и так, чтобы не было на них недоступных участков, тупиков и просто неинтересных мест - уже немного сложнее
    В Вар1 нет генератора карт.
  3. Kristobal Hozevich Hunta
    Так и спиться недолго :)
Чтобы оставить комментарий просто зарегистрируйтесь и станьте участником!
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление