Начало : История проекта "Казаки" началась в 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 большие средства, тем самым поспособствовав продажам Казаков. В результате нам удалось не только сделать хорошую игру и получить удовольствие от процесса, но и неплохо заработать. В первом приближении "Казаки" выглядели так: противостояние задумывалось между Россией и Украиной, а всего наций было четыре - русские, украинцы, европейцы и турки. Продаваться игра должна была на отечественном рынке. В 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 или Джона Ромеро подходят к стенду и говорят "Вау!", каждое похвальное превью и отзыв на форуме давало положительные эмоции, дарило нам реальную понимание в то, что мы можем сделать мега-хит. Это заставляло нас выкладываться на полную. "Казаки" того стоили. Разработка проекта - это как игра в футбол: вратарь может пропускать голы, но проигрывает вся команда, а если он ловит мяч, то и выигрывает вся команда. Вся работа в команде опирается на всех членов команды без исключения. Соответственно, успех и популярность нас во всем мире - заслуга каждого члена команды.