(Приглашение к совместному проекту с открытым исходным кодом)
Зачем люди пишут игровых ботов? – Можно назвать много возможных причин, одной из них, безусловно, является чисто академический интерес решения сложной задачи AI. В литературе по философии CS и по философии математики программирование неоднократно сравнивалось с альпинизмом. Трудно сказать, кто первый сделал такое сравнение. На наш взгляд, оно очень подходит и к нашему случаю, поэтому, рискуя показаться не оригинальными, все же сделаем утверждение: написание нетривиального бота для программиста – такой же вызов, как покорение вершины для альпиниста. Чем недоступнее вершина – тем сильнее желание ее покорить. Поэтому, прежде всего, нужно выбрать действительно достойную вершину в интересном горном массиве. Одним из таких массивов со множеством сложных, никем пока не покоренных вершин, является игра "Космические Рейнджеры 2 HD: Революция" (КР2) — продолжение серии игр "Космические Рейнджеры" (КР). Знатокам игровой индустрии игры этой серии представлять не надо, поскольку это один из довольно редких случаев компьютерных игр-долгожителей: первая игра серии, разработанная российской студией Elemental Games, была издана компанией 1С в 2002 году. Интересная история развития этой игровой серии хорошо отражена в статьях Википедии, посвященных этим играм, поэтому не будем здесь повторяться. Отметим только, что сейчас разработкой, поддержкой и совершенствованием КР2 занимается студия СНК-Games.
Не случайно (и уж точно не для пустой рекламы) мы упомянули разработчика, так как от его отношения во многом зависит удачность выбора объекта для ботостроения. Многие разработчики крайне негативно относятся не только к ботам, но даже к сторонним модификациям (модам) своих игр, дистанцируются от пользователей-игроков, сводя поддержку к чисто формальным ответам на узкий круг часто задаваемых вопросов, типа «у меня не запускается игра». Причем ответы на горячей линии обычно дают специально нанятые для этого операторы не высокой квалификации, в разработке игры не занятые и не знающие ее изнутри. Что касается обновлений, если они и выходят, то с чисто косметическими изменениями. Обратная связь «пользователь-разработчик» почти не работает. Радикальные идеи типа совершенствования баланса игры в таких случаях обычно игнорируются. В случае КР2 картина совершенно противоположная. Игра периодически обновляется, причем каждое обновление содержит серьезные улучшения. Основные разработчики поддерживают форум, где любой желающий может получить из первых рук ответ по устройству игры (в частности, по используемым алгоритмам) и высказать свое мнение. На этом форуме можно найти и скачать множество сторонних модов, причем разработчики развивают интерфейсы, облегчающие модостроительство, размещают в свободном доступе документацию по этим интерфейсам и отвечают на возникающие у модостроителей вопросы. Такое же благожелательное отношение видим у разработчиков и к ботостроительству. Во многом благодаря этому к настоящему времени сделано уже два несложных бота, пользующихся высокой популярностью у пользователей: бот для генерации стартовых галактических карт и анализа дампа текущего хода игры SRHDDumpReader (автор Burning Daylight) и бот для генерации корпусов космических кораблей SR2HDShipbuilder, сделанный автором этой статьи. В настоящее время мы (совместно с tactic) работаем над еще одним ботом SR2HDPascalBot, предназначенным для прохождения планетарных битв (бои роботов). Об этом боте мы дальше и расскажем подробнее, но сначала скажем несколько слов о предметной области, то есть о планетарных битвах.
Планетарные битвы (ПБ) – это отдельные небольшие задания в основной игре, которые, впрочем, можно выбрать из списка, не проходя основную игру. Задания выполняются в реальном времени с возможностью пауз, но без возможности промежуточных сохранений. У каждого задания своя карта игрового мира, представляющего собой арену (например, остров с горным и равнинным ландшафтами), где происходит битва роботов игрока и роботов одной-трех вражеских сторон (друг с другом они тоже воюют). Цель — уничтожить всех вражеских роботов. Обычно у каждой стороны (в том числе и у игрока) есть база, на которой при достаточном количестве ресурсов можно из модулей построить одного или нескольких роботов. В ассортимент модулей входят различные виды оружия (ракетомет, пулемет, огнемет и т.д.), устройства передвижения (колесное шасси, шасси на гусеничном ходу, на воздушной подушке и т.д.), а также разные корпуса роботов, позволяющие установить разное число оружейных систем, и некоторые другие модули. Для производства разных модулей требуется разное количество ресурсов. К ресурсам относятся: титан, электронные микросхемы, источники энергии и плазма. Ресурсы вырабатываются заводами. Для того, чтобы захватить объект (завод или базу), нужно привести своего робота в соприкосновение со специальной площадкой у этого объекта. От количества баз и заводов, которыми владеет сторона, зависит предельное число роботов, которое можно построить в данный момент. Есть еще много правил, которые в этом коротком описании мы опустили, так как для понимания общего принципа они представляются несущественными.
Задачей игрового бота SR2HDPascalBot является автоматическое ведение ПБ в целях выигрыша. Для решения этой задачи на выбранной карте ПБ надо описать параметры карты и действия бота в специальном скрипте – для каждой карты свой скрипт. Т.о. одной из составных частей нашего бота является интерпретатор скриптов. Другая очевидная часть – это система распознавания образов, позволяющая боту получать информацию о сиюминутной ситуации в игровом мире из снимка экрана. И третья стандартная для игровых ботов часть – это имитация команд пользователя, т.е. эмуляция клавиатуры и мыши. В качестве интерпретатора мы использовали свободно распространяемый интерпретатор Pascal P5, являющийся модификацией Виртовского Pascal P4. Pascal P5 написан на Паскале и в принципе должен обладать свойством самокомпилируемости, но перед нами не стоит задача раскрутки Паскаля с нуля, поэтому мы перевели исходный текст интерпретатора на ОО Паскаль Delphi-7, сделав несложную IDE с GUI и использовав стандартный Windows API. Специальные функции для скриптов (например, функция имитации нажатия левой кнопки мыши) описаны в интерпретаторе как предопределенные, аналогично стандартным (например, writeln, odd). Проект находится на начальной стадии, и мы успели получить предварительные результаты только от двух карт ПБ. Первую самую простую (учебную) карту наш бот проходит, всегда побеждая, во второй более сложной карте он иногда побеждает. Интересно, что первую карту бот проходит меньше, чем за пять минут, в то время как автор этой статьи тратит на ее прохождение 6-10 мин. Лучшим результатом для второй карты явился результат 5 побед из 10 попыток. К сожалению, он не воспроизвелся. На вторую карту бот тратит до часу времени, поэтому вместо того, чтобы тратить время на более масштабные испытания для получения воспроизводимого результата, мы решили сосредоточить усилия на совершенствование как скрипта для этой карты, так и самого бота. Как и следовало ожидать, написать бота в черновом варианте оказалось гораздо проще, чем хорошие скрипты к нему.
Итак, предстоит большой объем работ, в том числе и чисто экспериментальных, исследовательских в области AI, и столь малыми силами, как сейчас, — всего два человека — вряд ли он будет успешно выполнен. Среди любителей игры КР2 немало профессиональных программистов, и в надежде на них мы уже разместили приглашение принять участие в этом проекте. В этой статье мы адресуемся к специалистам, которые, возможно, и не слышали об этой игре, но хотели бы поучаствовать в решении действительно сложной задачи для игрового бота. По нашему мнению, КР2 настолько удачная и интересная модель некой виртуальной вселенной, что стоит потратить время на подробное ознакомление с этой моделью. Но мы не ставим своей целью пропаганду этой игры. Сложный и интересный бот можно сделать для любой подходящей для этого игры, особо не углубляясь в саму игру. Выше мы назвали причины, почему, на наш взгляд, КР2 подходит для этого лучше, чем многие другие игры.
Исходный код.
Зачем люди пишут игровых ботов? – Можно назвать много возможных причин, одной из них, безусловно, является чисто академический интерес решения сложной задачи AI. В литературе по философии CS и по философии математики программирование неоднократно сравнивалось с альпинизмом. Трудно сказать, кто первый сделал такое сравнение. На наш взгляд, оно очень подходит и к нашему случаю, поэтому, рискуя показаться не оригинальными, все же сделаем утверждение: написание нетривиального бота для программиста – такой же вызов, как покорение вершины для альпиниста. Чем недоступнее вершина – тем сильнее желание ее покорить. Поэтому, прежде всего, нужно выбрать действительно достойную вершину в интересном горном массиве. Одним из таких массивов со множеством сложных, никем пока не покоренных вершин, является игра "Космические Рейнджеры 2 HD: Революция" (КР2) — продолжение серии игр "Космические Рейнджеры" (КР). Знатокам игровой индустрии игры этой серии представлять не надо, поскольку это один из довольно редких случаев компьютерных игр-долгожителей: первая игра серии, разработанная российской студией Elemental Games, была издана компанией 1С в 2002 году. Интересная история развития этой игровой серии хорошо отражена в статьях Википедии, посвященных этим играм, поэтому не будем здесь повторяться. Отметим только, что сейчас разработкой, поддержкой и совершенствованием КР2 занимается студия СНК-Games.
Не случайно (и уж точно не для пустой рекламы) мы упомянули разработчика, так как от его отношения во многом зависит удачность выбора объекта для ботостроения. Многие разработчики крайне негативно относятся не только к ботам, но даже к сторонним модификациям (модам) своих игр, дистанцируются от пользователей-игроков, сводя поддержку к чисто формальным ответам на узкий круг часто задаваемых вопросов, типа «у меня не запускается игра». Причем ответы на горячей линии обычно дают специально нанятые для этого операторы не высокой квалификации, в разработке игры не занятые и не знающие ее изнутри. Что касается обновлений, если они и выходят, то с чисто косметическими изменениями. Обратная связь «пользователь-разработчик» почти не работает. Радикальные идеи типа совершенствования баланса игры в таких случаях обычно игнорируются. В случае КР2 картина совершенно противоположная. Игра периодически обновляется, причем каждое обновление содержит серьезные улучшения. Основные разработчики поддерживают форум, где любой желающий может получить из первых рук ответ по устройству игры (в частности, по используемым алгоритмам) и высказать свое мнение. На этом форуме можно найти и скачать множество сторонних модов, причем разработчики развивают интерфейсы, облегчающие модостроительство, размещают в свободном доступе документацию по этим интерфейсам и отвечают на возникающие у модостроителей вопросы. Такое же благожелательное отношение видим у разработчиков и к ботостроительству. Во многом благодаря этому к настоящему времени сделано уже два несложных бота, пользующихся высокой популярностью у пользователей: бот для генерации стартовых галактических карт и анализа дампа текущего хода игры SRHDDumpReader (автор Burning Daylight) и бот для генерации корпусов космических кораблей SR2HDShipbuilder, сделанный автором этой статьи. В настоящее время мы (совместно с tactic) работаем над еще одним ботом SR2HDPascalBot, предназначенным для прохождения планетарных битв (бои роботов). Об этом боте мы дальше и расскажем подробнее, но сначала скажем несколько слов о предметной области, то есть о планетарных битвах.
Планетарные битвы (ПБ) – это отдельные небольшие задания в основной игре, которые, впрочем, можно выбрать из списка, не проходя основную игру. Задания выполняются в реальном времени с возможностью пауз, но без возможности промежуточных сохранений. У каждого задания своя карта игрового мира, представляющего собой арену (например, остров с горным и равнинным ландшафтами), где происходит битва роботов игрока и роботов одной-трех вражеских сторон (друг с другом они тоже воюют). Цель — уничтожить всех вражеских роботов. Обычно у каждой стороны (в том числе и у игрока) есть база, на которой при достаточном количестве ресурсов можно из модулей построить одного или нескольких роботов. В ассортимент модулей входят различные виды оружия (ракетомет, пулемет, огнемет и т.д.), устройства передвижения (колесное шасси, шасси на гусеничном ходу, на воздушной подушке и т.д.), а также разные корпуса роботов, позволяющие установить разное число оружейных систем, и некоторые другие модули. Для производства разных модулей требуется разное количество ресурсов. К ресурсам относятся: титан, электронные микросхемы, источники энергии и плазма. Ресурсы вырабатываются заводами. Для того, чтобы захватить объект (завод или базу), нужно привести своего робота в соприкосновение со специальной площадкой у этого объекта. От количества баз и заводов, которыми владеет сторона, зависит предельное число роботов, которое можно построить в данный момент. Есть еще много правил, которые в этом коротком описании мы опустили, так как для понимания общего принципа они представляются несущественными.
Задачей игрового бота SR2HDPascalBot является автоматическое ведение ПБ в целях выигрыша. Для решения этой задачи на выбранной карте ПБ надо описать параметры карты и действия бота в специальном скрипте – для каждой карты свой скрипт. Т.о. одной из составных частей нашего бота является интерпретатор скриптов. Другая очевидная часть – это система распознавания образов, позволяющая боту получать информацию о сиюминутной ситуации в игровом мире из снимка экрана. И третья стандартная для игровых ботов часть – это имитация команд пользователя, т.е. эмуляция клавиатуры и мыши. В качестве интерпретатора мы использовали свободно распространяемый интерпретатор Pascal P5, являющийся модификацией Виртовского Pascal P4. Pascal P5 написан на Паскале и в принципе должен обладать свойством самокомпилируемости, но перед нами не стоит задача раскрутки Паскаля с нуля, поэтому мы перевели исходный текст интерпретатора на ОО Паскаль Delphi-7, сделав несложную IDE с GUI и использовав стандартный Windows API. Специальные функции для скриптов (например, функция имитации нажатия левой кнопки мыши) описаны в интерпретаторе как предопределенные, аналогично стандартным (например, writeln, odd). Проект находится на начальной стадии, и мы успели получить предварительные результаты только от двух карт ПБ. Первую самую простую (учебную) карту наш бот проходит, всегда побеждая, во второй более сложной карте он иногда побеждает. Интересно, что первую карту бот проходит меньше, чем за пять минут, в то время как автор этой статьи тратит на ее прохождение 6-10 мин. Лучшим результатом для второй карты явился результат 5 побед из 10 попыток. К сожалению, он не воспроизвелся. На вторую карту бот тратит до часу времени, поэтому вместо того, чтобы тратить время на более масштабные испытания для получения воспроизводимого результата, мы решили сосредоточить усилия на совершенствование как скрипта для этой карты, так и самого бота. Как и следовало ожидать, написать бота в черновом варианте оказалось гораздо проще, чем хорошие скрипты к нему.
Итак, предстоит большой объем работ, в том числе и чисто экспериментальных, исследовательских в области AI, и столь малыми силами, как сейчас, — всего два человека — вряд ли он будет успешно выполнен. Среди любителей игры КР2 немало профессиональных программистов, и в надежде на них мы уже разместили приглашение принять участие в этом проекте. В этой статье мы адресуемся к специалистам, которые, возможно, и не слышали об этой игре, но хотели бы поучаствовать в решении действительно сложной задачи для игрового бота. По нашему мнению, КР2 настолько удачная и интересная модель некой виртуальной вселенной, что стоит потратить время на подробное ознакомление с этой моделью. Но мы не ставим своей целью пропаганду этой игры. Сложный и интересный бот можно сделать для любой подходящей для этого игры, особо не углубляясь в саму игру. Выше мы назвали причины, почему, на наш взгляд, КР2 подходит для этого лучше, чем многие другие игры.
Исходный код.