Трудные времена на пути к Starcraft 3/3
Patrick Wyatt, бывший вице-президент и старший разработчик Blizzard, рассказывает о кошмарном пути разработки Starcraft.
Часть 3/3
Прокладка путей для игровых юнитов это что-то, что игроки не замечают, пока все работает как надо, но малейшие баги в этой системе могут вызывать настоящую ярость. В ходе разработки Старкрафта были времена, когда прокладка путей не работала вообще.
Разработка Стракрафта волочилась, и временами казалось, что мы никогда его не закончим: игра все время была “в двух месяцах до старта”, при этом совершенно не приближаясь к мифической дате выхода. “К счастью” — я употребляю этот термин обдуманно — у Blizzard был богатый опыт затяжки сроков сдачи игр.
Мы всегда держали в уме цели по датам выхода (или лучше сказать желания), но мы старались ничего публично не анонсировать, пока не были уверены в высокой вероятности, что все будет действительно готово в нужный момент. Политика Blizzard “когда будет готово” это отражения того, что никто толком не знал, когда именно все будет готово и результат желания выпускать качественные продукты.
На каждом этапе движения проекта к его завершению появлялась кипа проблем, которые задерживали выпуск. Как любая игра на поздних этапах разработки, наша изобиловала дефектами, которые следовало найти и исправить до выхода игры. Счет багов шел на тысячи.
Многие из них были весьма тривиальными и не требовали большого труда для исправления. Но к сожалению не все баги можно было отнести к таковым.
Некоторые, как к примеру баги синхронизации в мультиплеерных играх, выскакивали и требовали привлечения от нескольких разработчиков и, иногда, недель усилий для исправления. Другие разработчики тоже упоминали о подобных проблемах с синхронизацией игр: например Age of Empires и Supreme Commander.
Некоторые проблемы были вызваны самим ходом процесса разработки. К примеру авианосец протосов постоянно запаздывал по отношению к другим юнитам, так как отличным от других образом делал... все. В какой-то момент код Авианосца отделился от основного кода безо всякой надежды на реинтеграцию. Каждый раз, когда остальные юниты получали новую фичу, её приходилось отдельно внедрять для авианосца. И когда мы исправляли баг в юнитах, позже он всплывал отдельно для авианосца, только найти и поправить его было труднее.
Но самой большой проблемой тормозящей процесс разработки на месте была прокладка путей.
Не то чтобы прокладка путей вообще не работала, в большинстве случаев все работало как надо. Но было огромное количество пограничных ситуаций, которые удерживали игру от выхода.
Юниты застревали и останавливались посреди поля боя. Часто они с неимоверными усилиями продвигались вперед дюйм за дюймом или зацикливались и ходили кругами, отказываясь отправляться к указанным целям, а иногда их заклинивало и они застревали на месте. Целые армии увязали на месте, как будто решили устроить пикник.
Эта проблема портила настроение игроков, а также сильно ослабляла ИИ, делая невозможным сбалансировать миссии.
Хотя я никогда не был игроком RTS высшего уровня, я стал неплохо играть, поскольку обнаружил, что Голиаф был сделан сильно имбалансным, чтобы компенсировать его проблемы с продвижением по карте. Они были больше других наземных юнитов и требовали более широких пространств для прохода, но я научился протаскивать их через все преграды, доставляя из огневую мощь туда, куда мне было необходимо, и обыгрывать макро-игроков, которые в другой ситуации порвали бы меня в клочья. Увы, мое счастье длилось недолго: Голиафы довели до ума и понёрфили. Эх...
Ранняя прокладка путей была примерной — хотя были выбраны хорошие алгоритмы, управлявшие движением юнитов, кое-какие плохие решения, сделанные в процессе разработки поломали малину.
Как мы до такого дошли?
В ранних статьях я упоминал сложности с прокладкой путей. Старкрафт был сделан на движке Варкрафт, который отрисовывал рисунок местности на используя алгоритм, оптимизированный для вывода квадратных “плиток” 32х32 пикселя, состоявших из 16 клеток 8х8 пикселей. Я создал движок Варкрафта таким образом, поскольку такой подход отлично работал на всех наших изданиях для Super Nintendo и Genesis. Эти консоли имели аппаратную поддержку отрисовки плиток 8х8 пикселей, которую мы могли легко програмно эмулировать на PC.
Перспектива в Варкрафт I и II была практически вертикальной и грани объектов (лесов, ландшафта, зданий) были горизонтальными или вертикальными, так что восприятие мира графическим движком вполне подходило и для прокладки путей. В тех играх каждый квадрат 32х32 был либо проходимым, либо непроходимым. Внизу я показал границы некоторых квадратов. Некоторые, которые с первого взгляда кажутся проходимыми, на самом деле таковыми не являются. Бараки на рисунке не влезают на площадку 48х48 целиком, из за чего два красных квадрата только кажутся проходимыми.
Однако по ходу дела команда разработчиков переключилась на изометрическое изображение, которое дело игру визуально привлекательнее. Но графический движок не был переписан, художники просто перерисовали все эскизы соответствующим образом.
Новый вид отлично выглядел, но чтобы заставить прокладку путей работать, пришлось увеличить разрешение квадратов. Теперь квадраты 8х8 были проходимыми или непроходимыми, что увеличило размер карты прокладки путей в 16 раз. Новое разрешение позволило размещать на карте больше юнитов, но также увеличило количество вычислений для прокладки путей в новом пространстве.
Самой большой проблемой оказалось то, что диагональные границы, нарисованные художниками делили квадраты на неравные части, делая трудным определение того, проходим квадрат или нет. Обеспечить корректную разметку проходимости требовало чудовищных усилий.
А редактор карт в Старкрафт писать было невообразимо сложно поскольку постоянно возникало огромное число коллизий на границе квадратных полей в которые были вписаны изометрические рисунки. Написание кода подгонки границ квадратов потребовало месяцев программистских усилий.
В отличие от Diablo, использовавшего изометрический графический движок, команда Старкрафта упорно придерживалась квадратной отрисовки, хотя новые проблемы с этим подходом возникали каждую неделю.
На рисунке показано, как мост разбивается на квадраты 8х8 пикселей и близкое к изометрическому изображение делит квадраты на неравные части, формируя “лесенку” непроходимых квадратов на каждой стороне моста, там где вы видите, как красная линия режет квадраты на неправильные фигуры.
Поскольку проект завис в состоянии “двух месяцев до выхода”, у нас не было возможности создать заново движок построения местности, который облегчил бы задачу нахождение путей, стояла задача просто во что бы то не стало заставить прокладку путей работать. Пришлось учитывать все возможные граничные случаи, из-за чего код прокладки путей взрывообразно разросся в машину состояний, содержащую самые разнообразные приемы выхода из сложных ситуаций. (Народ изучавший, код Стракрафт пишет, что было прописано 35 состояний двигающегося юнита - masuk0)
Час пик
Если можно назвать еще одну крупную проблему с прокладкой путей, то это будет толкучка, создававшаяся харвестрами (КСМ терранов, зонд протоссов и дрон зергов), собиравшими кристаллы (позже названные минералами) и газ беспен, из-за чего добыча иногда просто останавливалась. Пока игрок руководил атакой, ставил эксп, рабы создавали пробку и приток минералов прерывался. Впоследствии игрок обнаруживал, что весь его билд полетел к черту из-за дефицита средств.
Основная проблема была в том, что игроки старались максимизировать число рабочих на дозу, чтобы увеличить доход. Рабочие бегали от доз к базе и обратно, сталкиваясь на пути со своими собратьями, спешащими в обратном направлении. Когда в небольшом пространстве скапливается достаточно рабочих вполне возможно, что некоторые из них намертво застрянут и будут стоять пока какую-нибудь дозу полностью не выработают.
(Почему беспен? Газ же называется веспен! В комментариях Патрик признается, что это оговорка не спроста. Газ веспен назван по аналогии с планетой Беспин из Звёздных Войн, на которой Ландо Калриссиан в Облачном городе добывал газ тибанна. Да пребудет с вами сила! - masuk0)
Как выйти из положения?
То ли я вызвался добровольцем, то ли меня попросили заняться этой проблемой, через столько лет я уже просто не помню. Тщательно изучив код прокладки пути, я пришел к выводу, что я ни разу не достаточно умён, чтобы взять и разобраться с этой проблемой. Так что я придумал грязный трюк.
Вообще программисты бывают одержимы желанием находить чистое, идеализированное, совершенное решение проблемы, но иногда настают времена, когда чем-то приходится жертвовать. Если все правильно сделать никто не узнает об этих сделках с совестью, как это можно сказать о хаках описанных Brandon Sheffield в его статье “Грязные приём программирования”. (Сcылка перестала быть доступна на момент этой публикации - masuk0)
Моя идея была проста: когда харвестр едет добывать минералы или едет с добычей на базу, они должны игнорировать столкновения с харвестрами в том же состоянии (всеми юнитами). Исключив столкновения мы полностью избавились от пробок и заставили харвестры работать с максимальной эффективностью.
Этот эффект можно наблюдать, выбрав группу рабов, добывающих минералы и приказать им остановиться. Они немедленно рассредоточатся на местности в поисках свободных от соседей квадратов.
Это поведение очевидно, если присмотреться, но скрыто от поверхностного взгляда — не все знают об этой особенности, но профессиональные игроки, картоделы и создатели модов, конечно, знают об этом.
Данный трюк прост и он полностью снимает проблему — а это лучший вид хака.
Оставалось еще полно работы, которую надо было сделать, чтобы выпустить игру, и этот хак позволил нам избавиться от огромных, пожирающих время переделок.
(Но в Старкрафт харвестер с командой добычи игнорирует столкновения со всеми юнитами, а не только со своими коллегами по добыче! В комментах Патрик пишет, что за прошествием лет уже не помнит, как так вышло. Его идея касалась только самих харвестеров в этом состоянии. Любители Старкрафта знают, что этот элемент геймплея перенесён во второй Старкрафт, и хак теперь - фича. Но кое-что поправлено, например трюк, когда раб мог растолкать стену из юнитов противника на входе на базу, выключив свой бестелесный режим в нужный момент.- masuk0)
Команда разработчиков смогла разрешить многие другие проблемы нахождения пути и вынуждена была проигнорировать оставшиеся, к примеру, драгун протоссов заполучил дурную репутацию. Будучи самым крупным наземным юнитом он часто терпел неудачи в поисках пути к месту назначения.
Конечный результат был достаточно неплох, и мы все получили жестокий урок о надеждах и выдавании желаемого за действительное, как основах планирования.