Превозмогая 88

Мы продолжаем КВН обрабатывать напильником престарелую 88, докручивая параллельно некоторые новые фичи. К сожалению, карта до сих пор не вышла на 100% стабильности, и фаталы мало-помалу, но случаются. В данный момент я занят анализом прошлых логов крашей в попытках устранить точки отказа, и до 7.00 с её прибабахами пока далеко нет дела. Поэтому — немного о делах насущных, а затем — очередной баг любимой игры. Ах, обожаю эти ножи в спину.





Что задержит 7.00

Старые баги — недоработки, которые всю дорогу оставляли «на потом», погружаясь в пучины прокрастинации. Большинство, конечно, продолжат лежать в долгом ящике, но некоторым нужно уделить время. Как, например, это было с рикимарой, чей ульт не поддерживал клив от батлфури до самого последнего момента.

Неясная сложность новых механик. Таланты — ладно, макака — туда-сюда пойдет, но что делать с рюкзаком — решительно неясно. На данный момент всё еще нет технологии, которая бы предоставляла возможности, ожидаемые от рюкзака — отображение кд на картинках, замедление этого самого кд в реальности, а также взаимодействие с кликами мышью. Но что еще хуже — доту делают реальные люди, и вот разработчику библиотеки понадобился отпуск на пару месяцев. В ходе его инактива новых продвинутых фич точно не предвидится — только на базе того, что было создано ранее.

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

С какого-то патча д2 переделали еще и механику регенерации, что тоже весьма и весьма крупное изменение. В отличие от многих других, оно супер-глобально — регенерация есть у каждого юнита на карте, и нужны огромные мощности для обработки таких массивов на уровне игрового кода. Вот на уровне чистого C — другое дело, но либа пока в отпуске.

Изменение механики клива с аое-урона на конус — тоже существенная деградация производительности, особенно в случае стака кливов. Впрочем, это сугубо вопрос производительности, сложность — низкая.

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



Баги с обзором

И сборник рассказов «как мы потеряли день/неделю/месяц на решение мелкой проблемы».

У меня есть целая статья о том, как работает обзор в Варкрафте. Вся карта состоит из маленьких квадратов, которые либо видны, либо закрыты. Каждую долю секунды (0.1 в версиях дотки 88+, ~0.4 в варкрафте) вызывается перерасчет видимости. Проблем с этой системой, как выяснилось, довольно много — близзы явно не занимались продвинутыми тестами, ограничившись принципом «работает и славно». Впрочем, тяжело винить их — мало кто рассчитывал, что игра протянет более 10 лет, не говоря уже о мощностях современного моддинга.

Post-mortum
Итак, проблема первая — в случае смерти юнит переключается на «предсмертный» обзор. Согласно константам, которые не менялись с самого начала доты, это 500 АоЕ. При этом юниту добавляется специальный флаг, используемый при анализе дальности обзора. Всё бы ничего, но удаляют этот флаг только в том случае, если юнит мертв на момент перепроверки. В обычном варкрафте это нормально — вернуться обратно могут только герои, притом за солидный промежуток времени. Увидеть проблему можно лишь при наличии реинкарнации, которая займет меньше времени, чем время анимации смерти.

Каждый юнит в игре имеет параметр «время анимации смерти». От него пляшет таймер, отмеряющий предсмертный обзор — если тушка умирает 2 секунды, видимость будет идти 2 секунды. Время определяется вручную для каждого типа юнита, как правило — отталкиваясь от времени анимации смерти выбранной модельки. В дотке подход сохранился, но вот беда — в некоторых случаях восстановление героя происходит за меньший интервал времени. В результате флаг предсмертного обзор сохраняется, т.к. снимать его разрешено только с мертвого юнита. Причины такого ограничения неизвестны.

Решение элементарно — каждому юниту, кто возраждается, мы сами снимаем флажок. Других побочных эффектов от этого флага вроде нет.

Сквозное зрение
Проверка видимости начинается с той клетки, где находится источник обзора. Как конкретно работают векторы, определяющие наличие препятствий, я не знаю, но зато имею информацию, как работают препятствия, закрывающие обзор. Например, деревья, занимающие целиком клетку, могут стоять на двух клетках разом, или даже на 4-х одновременно. Но реальный засвет обеспечивает правый верхний сегмент — остальные вообще никакой функции не выполняют. При этом, если источник обзора стоит на той же клетке, где расположен правый верхний сегмент, то препятствие считается прозрачным.





На картинках-примерах огр видит спектру, а та не может повторить этот трюк с обратной стороны.

Аналогично, не существует никаких понятий «дальность обзора» — их следовало бы назвать «количество видимых клеток по прямой». Это объясняет сложности с внедрением отображения АоЕ обзоров — они будут далеки от реальных данных.

Решение: не существует, нужно весь двиг обзора перебирать и уменьшать клетку до минимального размера.

Сквозное зрение 2
На одной клетке может быть только одно препятствие, блокирующее обзор. Если у него появляется напарник, то… он ничего не делает. Фактически, каждая клетка имеет не счетчик препятствий, а булевый рычаг — есть препятствие или нет. И, как только любое из препятствий разрушается, значение переключается на 0. Это позволяет видеть сквозь деревья, которые, по всем законам, должны были блокировать обзор, срубив его соседа.

Сейчас на карте есть как минимум пара таких мест, но ничего сверхъестественного — сквозной обзор получают все, включая врагов. Решения, аналогично предыдущему пункту, с нашего уровня нет — слишком сложна система.

Post-mortum 2
И если предыдущие проблемы были известны достаточно давно, и в их отношении были предприняты определенные изменения, то очередную проблему поймал за хвост буквально на прошлой неделе.

Как уже сказано, время предсмертного обзора зависит от настроек конкретного ID юнита. В попытке устранить саму необходимость механической работы с флагом, я обнулил время смерти, ожидая, что это поможет решить проблему в корне. Но проглядел проблемку — когда время смерти проходит, юнит быстренько теряет плотность, набирая прозрачность, и исчезает с карты. На практике это привело к тому, что герои потеряли анимации смерти — они чаще просто растворялись, а иногда и вовсе моментально исчезали после убийства. Неловко вышло.



Починив обратно, очередные тесты показали, что предсмертный обзор работает неверно — герой продолжает дарить полноценный обзор вокруг точки смерти :O Ну в этот раз точно «я ничего не трогал, оно само». На деле это значит, что, убив юнита, нельзя пройти мимо него незамеченным, рассчитывая на обзор 500 — он продолжит отдавать стандартную видимость. В чем проблема?

Каждый юнит носит индивидуальный параметр обзора. В нём всегда указан актуальный радиус обзора, с учетом бонусов и бафов. В своё время это создало ряд проблем для муншарда — не получается раз и навсегда выдать бонус обзор, т.к. он постоянно пересчитывается. Но мы были неправы. Оказывается, пересчет начинается только после наступления ночи. До этого, с момента входа юнита на карту и до момента ночи, его обзор статичен — сколько запишешь, столько и будет. Но стоит волкам объявить луну, как включается периодический пересчет, несколько раз в секунду. Но мало того — перерасчет активируется ТОЛЬКО для юнитов, которые существуют этой ночью. Сначала-то была надежда, что после первой ночи всё придет в норму — будто достаточно включить и выключить ночь на секундочку. Не получилось — проверки активируются сугубо после наступления ночи и наличии юнита на карте.

Решения для этой проблемы пока не придумано. Каждый крип, который родился днем и не пережил ночь, будет отдавать обзор в 800 после смерти, а не 500. Каждый герой, умирающий до наступления первой ночи, будет после смерти отдавать свой максимальный обзор в 1800. Вроде бы и мелочь, но может существенно подставить в моменты интеллектуальных засад, когда обходишь мертвых крипов по кромке, а на самом деле — уже как на ладони виден врагу.



Холодок пробивает от того, насколько несовершенен движок игры, и сколько времени уходит на исправление или просто выяснение этих проблем. Очень грустно становится от заторможенного прогресса и постоянного оттока игроков. Но надеемся на лучшее и ставим Kappa.


4 комментария

avatar
на этот раз было легко
avatar
Обожаю твои блоги. Качественное сочетание юмора и серьезной подачи инфы. Текущая 88v8 играется гладко и приятно, описанные баги и недоработки не критичны.
avatar
орнул с пикчи
avatar
Чёго только люди не сделают лишь бы в д2 не играть
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.