Начало
История
проекта "Казаки" началась в 1997 году, когда компания Microsoft
представила на суд общественности свой стратегический тайтл Age of
Empires. В нем было множество оригинальных ходов, которые просто
завораживали игроков, это была настоящая революция в жанре, новое слово
в стратегиях, которое, надо признаться, оставило след в наших сердцах.
В
то время мы занимались созданием мультимедийных энциклопедий, продажи
которых стала потихоньку идти на спад, и разработка игр стала вопросом
дальнейшего выживания компании. Так или иначе, мы решили попробовать
себя в новой сфере. Исходив Age of Empires вдоль и поперек, мы изучили
все ее особенности и фичи, старались понять, чем она взяла аудиторию.
За полтора год активной игры у нас появились нужные идеи и понимание
того, что мы способны сделать продукт даже лучше, чем Ensemble Studios.
Мы были уверены в своих силах, и запустили проект "Казаки".
Первый
вопрос, который встал на самых первых порах разработки - это в каком
временном периоде разместить игру? В Age of Empires затронуты эпохи от
каменного века до античности. Мы решили "бить" в ХV - XVIII века,
потому что Microsoft наверняка избрала бы средневековье для Age of
Empires II, и Казаки получились бы ее логическим продолжением.
Фактически, мы тем самым сделали "третью" AOE, не пересекающуюся с
первой и второй частями. Это был наш маркетинговый расчет.
Время
показало, что мы не ошиблись. Сеттинг и время действия игры были
выбраны правильно, что привело к коммерческому успеху проекта.
Microsoft вложила в раскрутку тематики Age of Empires большие средства,
тем самым поспособствовав продажам Казаков. В результате нам удалось не
только сделать хорошую игру и получить удовольствие от процесса, но и
неплохо заработать.
В "Казаках" используется временной период с XV по XVIII век
В
первом приближении "Казаки" выглядели так: противостояние задумывалось
между Россией и Украиной, а всего наций было четыре - русские,
украинцы, европейцы и турки. Продаваться игра должна была на
отечественном рынке.
В
1998 году, когда проект был запущен, в команде насчитывалось всего
четыре человека. По нынешним меркам, это мизер - программист, дизайнер,
исторический консультант и руководитель проекта. Через два года, когда
"Казаки" уже вышли на финишную прямую, количество разработчиков выросло
втрое - до 12 человек. Хотя, опять же, это немного. Впрочем, следует
отметить, что к проекту на разных стадиях подключались создатели карт и
тестеры, так что размер команды варьировался.
Первые шаги
Первым
важным шагом к коммерческому проекту стала демо-версия, которую мы в
1999 году привезли на выставку MILIA в Каннах. Это был настоящий "выход
в свет" - мы не только показали свой проект заинтересованной аудитории,
но и обзавелись полезными знакомствами с издателями и прочими
представителями игровой индустрии. Там же мы впервые услышали совет
делать "Казаков" с прицелом на весь европейский рынок. Собственно, для
нас это был шок, так как о потенциале нашей "игрушки" с уверенностью
говорили авторитеты, в профессионализме которых не было сомнений. Так
было принято решение увеличить количество наций до 16 и издавать игру
по всему миру.
Собственно,
удача следовала за нами с самого начала проекта. Как оказалось, мы
попали в яблочко и с названием проекта, так как казаков - в силу
исторических причин - знают и в Англии, и во Франции. В Европе это
слово однозначно считается синонимом русского колорита, как
"Калашников" или "водка". Успех был полный - узнаваемый, но
незаезженный бренд принес нам на Западе огромные продажи.
Продолжая
список удачных моментов, нельзя не сказать и о дате релиза. Нам помог
тот факт, что за год до выхода Казаков рынок стратегий был переполнен
проектами, причем не самого высокого качества. Жанр перестал привлекать
разработчиков, и они сбавили обороты. Мы вышли как раз тогда, когда
игроки "изголодались" по качественным RTS.
Кроме
того, в игре был задействован оригинальный временной промежуток: от
средневековья до 18 века. Важную роль сыграли очень красочные
скриншоты, на которых мы "били" в одну из наших главных фич - огромные
толпы юнитов. В то время это было ново, и наши орды пришлись по душе и
публике, и прессе, которая не скупилась на высокие оценки на сайтах и в
журналах.
Орды юнитов стали визитной карточкой проекта
Но
брать пользователя мы собирались не только толпящимися на экране
юнитами. Отличий от других RTS хватало: в частности, в "Казаках"
применялась система формаций с возможностью удержания позиции (stand
ground). В результате отряды получали бонус к параметрам защиты и
атаки. Кроме того, мы реализовали возможность захватывать крестьян
противника и незащищенные здания и параллельно развивать нацию бывшего
врага. В
основу экономической части игры была положена добыча ресурсов, как и в
большинстве стратегий того времени. В "Казаках" их число равнялось 6.
Основным ресурсом была еда, которая использовалась для постройки всех
юнитов и тратилась на их содержание и усовершенствование. Дерево,
камень и еда добывались крестьянами непосредственно на карте, а
оставшиеся 3 ресурса (золото, железо, и уголь) - в шахтах. Уголь,
например, тратился на каждый выстрел.
При
балансировке игры мы сделали все ресурсы на карте бесконечными. Плюс
этой схемы - можно было играть одной базой, как угодно развивая свою
империю. Естественно, были и неизбежные минусы - теряется часть игры,
когда у тебя есть войска и отсутствует возможность постройки юнитов,
так что итог зависит от того, как ты проведешь последний бой. Это
сильно укорачивало время игровой сессии.
2D или 3D?
Споры
о видении проекта начались в самом начале разработок. Мы потратили
неделю на выяснение того, выбрать ли нам 2D или 3D
(изометрия-перспектива), и лишь волевым решением Сергея Григоровича
решили остановиться на двумерном движке. Сейчас это решение может
показаться странным, но не стоит забывать, что для того времени прорыв
в 3D мог обойтись слишком дорого. Кроме того, в пользу двухмерности
говорило и то, что при тогдашнем развитии технологий с ее помощью можно
было сделать более качественных и детализированных юнитов. Наконец,
наши "толпы юнитов", важная и оригинальная черта игры, могли быть
реализованы только в 2D.
Был
и еще один немаловажный момент, благодаря которому мы не стали рваться
в третье измерение. В то время мы не хотели конкурировать с крупными
разработчиками, которые вкладывали огромные суммы в разработку нового
поколения 3D-стратегий. Рынок 2D RTS быстро сокращался, и мы оказались
чуть ли не единственными представителями на нем.
Разобравшись
с измерениями, мы начали экспериментировать с углом наклона камеры.
Вариантов был несколько - от 90 до 45 градусов, но остановились мы на
30. Оказалось, что в этом случае наши спрайтовые войска выглядели
максимально привлекательно и не закрывали стоящих за ними юнитов, что
упрощало управление крупными армиями.
В "Казаках" очень разнообразные локации: на этих скриншотах запечатлены Киев и Лондон
Как
мы уже говорили выше, первоначально игра планировалась к выходу только
на территории СНГ. Поскольку основная фишка игры - одновременное
отображение 8000 юнитов, нам пришлось разрабатывать свои технологии
отображения графики и просчета логики игры с учетом того, что будущие
игроки будут иметь компьютеры чуть ниже среднего уровня. Вообще, выбор
главной "фичи" стоил большой крови нашему главному программисту - темпы
написания кода были около 300-400 строк в день! Объем чистого кода
"Казаков" на момент релиза (1.5 Мб) мог сравниться по объему с "Анной
Карениной". Главный программист – человек с отличной памятью, который
всегда помнил, "что где лежит", не прибегая к комментариям кода.
Одними
из основных проблем в разработке движка были вывод большого количества
юнитов и трехмерного ландшафта, быстрый поиск пути и искусственный
интеллект. Немало пришлось повозиться с многопользовательской игрой и
игрой через Интернет. Во время работы над Казаками мы постоянно держали
в уме главное правило - наш код не должен тормозить. Считаем, что нам
это удалось. Основная схема, по которой делался "быстрый" код - функции
не были громоздкими, а все алгоритмы линейно зависели от количества
юнитов.
Поиск пути
В
постмортеме "Казаков" нельзя не упомянуть одну из главных проблем, с
которыми столкнулись девелоперы. Это поиск пути - фундаментальная
задача игровых разработок. В нашем случае пришлось столкнуться с тем,
что обычные алгоритмы поиска, при которых карта разбивается на
проходимые и непроходимые зоны, и от точки исхода до точки назначения
строится кривая, огибающая "непроходимости", не подходит. Все упиралось
в так много раз упоминаемые в этом постмортеме 8000 юнитов, которые на
классических алгоритмах безбожно тормозили.
Выйти
из ситуации помог двухуровневый поиск пути, состоящий из двух частей.
Первая из них - "глобальная", путь в ней ищется по топологическим
зонам, которые имели соединения между собою и некий условный вес.
Вторая часть системы - "точный" поиск, который использовался для
перемещения в рамках 1 топологической зоны (обычный поиск пути по
карте, разбитой на квадраты в 16x16 пикселей).
Система
работала следующим образом: чтобы найти путь, юниты искали кратчайший
путь, а затем, когда входили в конечный район, проверяя прямые, которые
связывали центры топологических зон, выбирали путь в указанную игроком
точку, используя точный поиск.
Система поиска путей в действии
Наличие
топологических зон здорово помогло при создании ИИ. Как уже говорилось,
каждая зона имела свой вес (на этот показатель влияло наличие и число
войск противника). ИИ строил путь по топологическим зонам, обходя
опасные места стороной. Как правило, на карте было около 700
топологических зон, что значительно облегчало поиск пути, по сравнению
с 16384х16384 возможных точек.
Впрочем,
этот удачный во всех отношениях поиск пути буксовал при наличии стен,
которыми перегораживали топологическую зону. Чтобы обойти эту проблему,
мы реализовали алгоритм динамического изменения топологических зон в
реальном времени, что оказалось очень непростой задачей.
Прочие проблемы
Были
некоторые проблемы и в графическом департаменте. Огромные объемы
двумерной графики, которыми приходилось оперировать, привели нас к
созданию собственного формата: каждый кадр паковался отдельно,
используя алгоритм LZ с общим словарем. За счет этого достигалась
хорошая степень сжатия, а доступ к каждому кадру не требовал распаковки
предыдущих.
Возникла
проблема с просчетом тумана войны. Так как динамически рассчитать
радиус обзора для каждого из 8000 юнитов, не напрягая при этом
процессор довольно сложно, мы придумали следующее решение. Вокруг юнита
расставлялось от 1 до 8 точек - карта тумана войны. И далее методом
решения уравнения Лапласа достигалось сглаживание между этими точками.
В результате туман войны выглядел достоверно, плавно и не тормозил. Еще
одно приятное решение было связано с отображением воды, с которой мы
расправились с помощью быстрого и перспективного алгоритма, который,
кстати мы используем до сих пор. Маленькие волны на воде целочисленно и
быстро решались физическим реальным уравнением волновых процессов. И
рендеринг одной "водной" текстуры размером 256х256 точек на компьютере
200 МГц занимал доли миллисекунды.
Игра через Интернет
Технология сетевой игры была реализована следующим образом:
Предположим,
что 1, 2 и 3 - игровые такты. Предположим, что в некоторый момент
Игрок-2 нажимает на иконку строить юнит, и пакет с информацией об этом
приказе отсылается на компьютер Игрока-1. При этом компьютер Игрока-2
выполняет этот приказ на 3 такте, когда пакет теоретически будет у
Игрока-1. Таким образом, происходит синхронизация компьютеров Игрока-1
и Игрока-2. В случае, если пакет не доходит (теряется) и Игрок-1 не
получил информацию о приказе, то он останавливается на 3 стадии, а
Игрок-2 идет дальше, на следующий такт, так как он пакет отправил.
Принципиальная схема работы мультиплеерной составляющей
Игрок-2
не получает никаких пакетов от Игрока-1 и думает, что пакет, наверное,
потерян и посылает пакет снова. Игрок-1 получает пакет, отсылает свои
пакеты, а сам идет на 4 такт. После того как Игрок-2 получил пакет
приказов от Игрока-1, игра синхронизировалась, и они дальше продолжают
обмениваться пакетами. И хотя ситуация с потерей пакета возникает
крайне редко, эту проблему все равно пришлось решать. Данный метод
хорош тем, что после отправки пакета Игрок-2 не должен ждать пакета с
подтверждением того, что приказ получен. Также на этапе разработки
возникла проблема, с реальным временем, которое на разных машинах идет
по-разному. При игре больше часа возникала разница где-то в 1-2
секунды. Эта проблема особо проявлялась при пинге больше 1000. Для
устранения проблемы машины пинговались и вычислялось среднее время. Для
этого посылались пакеты данных, фиксировалось время отправления и пинг.
Далее время уравнивалось.
Многопользовательская игра и Интернет
Проблема
рассинхронизации игры на двух компьютерах возникала в самих разных
ситуациях, и отследить ее можно было только чудом. Поиски решения
занимали недели. Иногда при расчете таблицы синусов и косинусов,
которая использовалась повсеместно (например, для поиска путей или
траектории полета снарядов), на разных компьютерах получались разные
значения.
Эта
проблема возникла из-за так называемой floating point inconsistency
(несоответствие значения при использовании плавающей точки). Для
успешного поиска точного места в коде, которое стало причиной
рассинхронизации, мы сделали генератор случайного числа (на которое
влияло почти все: расположение юнитов, отыгрываемые кадры анимации,
отданные приказы...в общем, все, что должно было быть
синхронизировано), который вставлялся в сомнительные участки кода.
После
окончания игрового цикла значения между машинами сравнивались и если
цифры были разными, значит, произошла рассинхронизация. При этом
программист получал название файла и номер строки, где произошел "сбой
случайного числа". Далее методом предположения и околонаучного "тыка"
находилось конкретное место в коде, которое могло стать причинной
рассинхронизации. Найденный баг нещадно уничтожался.
Несмотря
на титанические усилия по доводке Интернет-игры, следует отметить, что
интерес к сетевым баталиям в "Казаках" не был очень высоким. Причиной
тому - поэтапное издание игры в разных странах, из-за которого
коммьюнити Интернет-игроков никак не могло набрать критическую массу.
Сначала "Казаки" вышли в Германии, потом Англии и Франции, затем в
Испании, Японии, Италии и так далее. Всего наша игра вышла в 17 странах
мира, но интерес к Интернет-игре рос слишком медленно. Самое большое
количество игроков в онлайне было около 500, а в среднем - 150-200 днем
и 10-50 ночью.
В "Казаках" нашлось место и для сетевых баталий
Количество
игроков, необходимое для появления полноценного коммьюнити, способного
затягивать новых пользователей, мы в то время оценивали в 2000. Крупные
компании (Blizzard, Microsoft, EA) издают свои игры одновременно по
всему миру, добиваясь огромного количества игроков на серверах и
создавая ажиотаж вокруг Интернет-возможностей своей продукции.
Финишная прямая
В
начале работы над проектом все гордились своей работой и проектом. Но
под конец сотрудники начали "выгорать". Появились сомнения в успехе,
развился синдром "бесконечного ремонта".
Кто-то
стал говорить, что графика недостаточно детализирована, кто-то - что
игра не будет популярной и уже сейчас неинтересна. Проект заканчивали,
буквально стиснув зубы. Когда
мы вышли на стадию бета-тестирования "Казаков" и трезво оценили объемы
работ, стало понятно, что проекту потребуется еще минимум 6 месяцев.
Чтобы не допустить срывов, мы пошли на крайние меры и внедрили систему
"военного времени": трудовой день начинался в 6 утра и длился до 11
вечера с обеденным перерывом в один час. Цели были ясны как никогда, и
от нас требовалось не выдохнуться на финишной прямой, на этом самом
сложном участке любого забега.
Жесточайший
распорядок дня несколько сглаживался начислением двойных зарплат и
бесплатными обедами. Все приходили без опозданий и работали не покладая
рук. Военное время длилось для команды долгих 3 месяца, в течение
которых из беты выковывался к "золотой мастер" проекта. После того, как
финальная версия "Казаков" была отправлена издателю, полуживая команда
в полном составе была отправлена в отпуск.
P.S.
Поле
завершения работы над "Казаками" и выдачи всех патчей (следует
признать, что после релиза последовала очень "жирная" заплатка) мы сели
за многопользовательскую игру и просидели на нашем сервере полгода.
Прибегали рано утром, до работы, и оставались после работы на всю
ночь... играли. Кроме того, после выхода Казаков, мы обнаружили, что в
50% игр в Интернете люди договаривались не нападать в начале сессии -
от 15 до 60 минут. И мы сделали это опцией в аддоне (называется она
Peace Time - "время ненападения", что оказалось довольно полезной
находкой. Потом, собравшись с силами и идеями, забросили "Казаков" на
полку и засели за "Завоевание Америки".
Игра,
начатая как небольшой проект для внутреннего рынка от маленькой, никому
не известной команды, вырос в итоге в крупный игровой продукт, вышедший
в двух десятках стран мира и снискавший заслуженную славу. Реализовать
его нам помогла вера в свои силы и неувядаемое чувство энтузиазма.
Каждая поездка на выставку, когда люди вроде программистов Age of
Empires или Джона Ромеро подходят к стенду и говорят "Вау!", каждое
похвальное превью и отзыв на форуме давало положительные эмоции, дарило
нам реальную понимание в то, что мы можем сделать мега-хит. Это
заставляло нас выкладываться на полную. "Казаки" того стоили.
Разработка
проекта - это как игра в футбол: вратарь может пропускать голы, но
проигрывает вся команда, а если он ловит мяч, то и выигрывает вся
команда. Вся работа в команде опирается на всех членов команды без
исключения. Соответственно, успех и популярность нас во всем мире -
заслуга каждого члена команды.
Сергей Григорович
Автор статьи - Евгений Григорович
|