(Приглашение к совместному проекту с открытым исходным кодом)

Зачем люди пишут игровых ботов? – Можно назвать много возможных причин, одной из них, безусловно, является чисто академический интерес решения сложной задачи AI. В литературе по философии CS и по философии математики программирование неоднократно сравнивалось с альпинизмом. Трудно сказать, кто первый сделал такое сравнение. На наш взгляд, оно очень подходит и к нашему случаю, поэтому, рискуя показаться не оригинальными, все же сделаем утверждение: написание нетривиального бота для программиста – такой же вызов, как покорение вершины для альпиниста. Чем недоступнее вершина – тем сильнее желание ее покорить. Поэтому, прежде всего, нужно выбрать действительно достойную вершину в интересном горном массиве. Одним из таких массивов со множеством сложных, никем пока не покоренных вершин, является игра "Космические Рейнджеры 2 HD: Революция" (КР2) — продолжение серии игр "Космические Рейнджеры" (КР). Знатокам игровой индустрии игры этой серии представлять не надо, поскольку это один из довольно редких случаев компьютерных игр-долгожителей: первая игра серии, разработанная российской студией Elemental Games, была издана компанией 1С в 2002 году. Интересная история развития этой игровой серии хорошо отражена в статьях Википедии, посвященных этим играм, поэтому не будем здесь повторяться. Отметим только, что сейчас разработкой, поддержкой и совершенствованием КР2 занимается студия СНК-Games.

Не случайно (и уж точно не для пустой рекламы) мы упомянули разработчика, так как от его отношения во многом зависит удачность выбора объекта для ботостроения. Многие разработчики крайне негативно относятся не только к ботам, но даже к сторонним модификациям (модам) своих игр, дистанцируются от пользователей-игроков, сводя поддержку к чисто формальным ответам на узкий круг часто задаваемых вопросов, типа «у меня не запускается игра». Причем ответы на горячей линии обычно дают специально нанятые для этого операторы не высокой квалификации, в разработке игры не занятые и не знающие ее изнутри. Что касается обновлений, если они и выходят, то с чисто косметическими изменениями. Обратная связь «пользователь-разработчик» почти не работает. Радикальные идеи типа совершенствования баланса игры в таких случаях обычно игнорируются. В случае КР2 картина совершенно противоположная. Игра периодически обновляется, причем каждое обновление содержит серьезные улучшения. Основные разработчики поддерживают форум, где любой желающий может получить из первых рук ответ по устройству игры (в частности, по используемым алгоритмам) и высказать свое мнение. На этом форуме можно найти и скачать множество сторонних модов, причем разработчики развивают интерфейсы, облегчающие модостроительство, размещают в свободном доступе документацию по этим интерфейсам и отвечают на возникающие у модостроителей вопросы. Такое же благожелательное отношение видим у разработчиков и к ботостроительству. Во многом благодаря этому к настоящему времени сделано уже два несложных бота, пользующихся высокой популярностью у пользователей: бот для генерации стартовых галактических карт и анализа дампа текущего хода игры SRHDDumpReader (автор Burning Daylight) и бот для генерации корпусов космических кораблей SR2HDShipbuilder, сделанный автором этой статьи. В настоящее время мы (совместно с tactic) работаем над еще одним ботом SR2HDPascalBot, предназначенным для прохождения планетарных битв (бои роботов). Об этом боте мы дальше и расскажем подробнее, но сначала скажем несколько слов о предметной области, то есть о планетарных битвах.

image

Планетарные битвы (ПБ) – это отдельные небольшие задания в основной игре, которые, впрочем, можно выбрать из списка, не проходя основную игру. Задания выполняются в реальном времени с возможностью пауз, но без возможности промежуточных сохранений. У каждого задания своя карта игрового мира, представляющего собой арену (например, остров с горным и равнинным ландшафтами), где происходит битва роботов игрока и роботов одной-трех вражеских сторон (друг с другом они тоже воюют). Цель — уничтожить всех вражеских роботов. Обычно у каждой стороны (в том числе и у игрока) есть база, на которой при достаточном количестве ресурсов можно из модулей построить одного или нескольких роботов. В ассортимент модулей входят различные виды оружия (ракетомет, пулемет, огнемет и т.д.), устройства передвижения (колесное шасси, шасси на гусеничном ходу, на воздушной подушке и т.д.), а также разные корпуса роботов, позволяющие установить разное число оружейных систем, и некоторые другие модули. Для производства разных модулей требуется разное количество ресурсов. К ресурсам относятся: титан, электронные микросхемы, источники энергии и плазма. Ресурсы вырабатываются заводами. Для того, чтобы захватить объект (завод или базу), нужно привести своего робота в соприкосновение со специальной площадкой у этого объекта. От количества баз и заводов, которыми владеет сторона, зависит предельное число роботов, которое можно построить в данный момент. Есть еще много правил, которые в этом коротком описании мы опустили, так как для понимания общего принципа они представляются несущественными.

Задачей игрового бота SR2HDPascalBot является автоматическое ведение ПБ в целях выигрыша. Для решения этой задачи на выбранной карте ПБ надо описать параметры карты и действия бота в специальном скрипте – для каждой карты свой скрипт. Т.о. одной из составных частей нашего бота является интерпретатор скриптов. Другая очевидная часть – это система распознавания образов, позволяющая боту получать информацию о сиюминутной ситуации в игровом мире из снимка экрана. И третья стандартная для игровых ботов часть – это имитация команд пользователя, т.е. эмуляция клавиатуры и мыши. В качестве интерпретатора мы использовали свободно распространяемый интерпретатор Pascal P5, являющийся модификацией Виртовского Pascal P4. Pascal P5 написан на Паскале и в принципе должен обладать свойством самокомпилируемости, но перед нами не стоит задача раскрутки Паскаля с нуля, поэтому мы перевели исходный текст интерпретатора на ОО Паскаль Delphi-7, сделав несложную IDE с GUI и использовав стандартный Windows API. Специальные функции для скриптов (например, функция имитации нажатия левой кнопки мыши) описаны в интерпретаторе как предопределенные, аналогично стандартным (например, writeln, odd). Проект находится на начальной стадии, и мы успели получить предварительные результаты только от двух карт ПБ. Первую самую простую (учебную) карту наш бот проходит, всегда побеждая, во второй более сложной карте он иногда побеждает. Интересно, что первую карту бот проходит меньше, чем за пять минут, в то время как автор этой статьи тратит на ее прохождение 6-10 мин. Лучшим результатом для второй карты явился результат 5 побед из 10 попыток. К сожалению, он не воспроизвелся. На вторую карту бот тратит до часу времени, поэтому вместо того, чтобы тратить время на более масштабные испытания для получения воспроизводимого результата, мы решили сосредоточить усилия на совершенствование как скрипта для этой карты, так и самого бота. Как и следовало ожидать, написать бота в черновом варианте оказалось гораздо проще, чем хорошие скрипты к нему.

image

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

Комментарии (55)


  1. ksenobayt
    05.05.2016 16:15
    +16

    Не глядя выдал инвайт.
    Живы ещё, извращенцы, живы.


    1. BelBES
      05.05.2016 16:36
      +1

      КР2, Delphi 7… эту статью впору размещать в блоге "История ИТ" на ГТ)


      1. ksenobayt
        05.05.2016 17:06
        +6

        Дело не в этом. Я рад, что прожект, на который я убил ровно десять лет своей жизни, все ещё ковыряют. И настолько по-хардкору.


        1. third112
          05.05.2016 17:46

          Рад возможности поблагодарить Вас за этот «прожект». ИМХО он стоил десяти лет! :)


        1. koceg
          06.05.2016 08:14

          Знаешь, мне кажется и через 10 лет будут ковырять. Не слежу что там сейчас на форуме СНК, но если что-то похожее на то, что было на ФЕГ, то никуда энтузиасты не денутся.


          1. ksenobayt
            06.05.2016 09:44

            На ЕГ оригинальных разработок, ЕМНИП, было даже меньше. По крайней мере, моддерской направленности.


            1. third112
              06.05.2016 14:21

              Сильно меньше! Дамп игры сделал великое дело!


      1. third112
        05.05.2016 17:40

        BTW у Delphi хороший рейтинг, а

        Игра «Космические рейнджеры» вошла в десятку лучших игр всех времен и народов по версии Хабрахабра 2013 года. (См.)
        :)


        1. ksenobayt
          05.05.2016 17:42

          Надо Вадима потыкать, впору проводить новое голосование. Уж три года прошло.


    1. third112
      05.05.2016 17:30
      +1

      Большое спасибо! :-)


  1. LoadRunner
    05.05.2016 16:37
    +3

    А будет статья или цикл статей с более подробным описанием работы бота и его алгоритмов?
    Ведь, как известно, комментарии к статье порой ценнее самой статьи и там (то есть, здесь) можно получить конкретные советы по улучшению\оптимизации и просто дельные советы.


    1. third112
      05.05.2016 18:00

      Зависит от дальнейшего хода работ и от успеха проекта. Пока в боте очень простая распознавалка (по широко известным алгоритмам), а интерпретатор Р5 уже описан в книге. Нужно изучать систему «игра+бот+скрипты», пробовать различные подходы в скриптах, расширять и исправлять функции бота. Тут могут получиться новые серьезные алгоритмы. Когда и если такое произойдет — конечно, нужно будет описать эти алгоритмы подробно. Может, не только здесь, но и на arxiv.org ;)


      1. VioletGiraffe
        13.05.2016 12:52

        Мне, например, интересно, как сделано получение снимка экрана и распознавание игровой ситуации. Я бы тоже хотел попробовать написать бота для какой-нибудь игры, но понятия не имею, как его прикрутить к игре.


        1. third112
          13.05.2016 15:37

          См. function CaptureScreenRect в файле UnitRecognize.pas. По гуглу можно найти много похожих примеров кода для снимка экрана. Процедуры распознавания в том же файле. (Исходный код выложен здесь).


  1. novoxudonoser
    05.05.2016 18:06
    +1

    Как я задрачивался в планетарные битвы. Всё, я в ностальгии, однозначно берусь…


    1. third112
      05.05.2016 19:08

      Очень рад! Ответил ЛС в диалоге.


  1. third112
    05.05.2016 19:04

    Потому как обычно «программисты сложных игровых ботов» не торопятся раскрывать свои секреты и редко пишут статьи о таком хобби, хотя тема очень любопытная.
    Из подзаголовка «Приглашение к совместному проекту с открытым исходным кодом» следует, что это не тот случай: все секреты, даже код — в открытом доступе (код выложу сегодня/завтра на сайте СНК).

    Видео пока нет. Спасибо: хорошая идея, нужно будет сделать.
    Карта боя пока не анализируется. Распознавалку только успели сделать и испытать. (BTW Там проблемы получения снимка экрана с виндами 8 и моложе). В двух приложенных к боту скриптах игра идет вслепую. Как распознавать роботов, пока не думали. Заводы/базы — по цветам квадратиков 7х7 пикселей. Цифры просто сравниваются с шаблонами. Для статичного снимка, полученного средствами игры, шумов нет и фонт одинаковый, т.о. распознается 100%. В динамике хуже, сейчас ищем решение.

    Античит-система есть. Любое посягательство на оперативную память игры отмечается, и это портит рекорд. Наш принцип: никакого взлома. (Иначе бы нас выгнали с сайта СНК, а так не гонят и помогают советами/инфой об устройстве игры :)

    Много ли привязок к конкретным координатам экрана, по которым идут клики?
    Сейчас все привязано к конкретным координатам (BTW в хелпе бота детальное описание функций).

    Вроде на все вопросы Вашего сообщения ответил?


    1. iCpu
      06.05.2016 09:18
      +1

      0) Как ловите экран? Как вводите? Античит ловит виртуальные клики? Не пытались использовать популярные инструменты, вроде AutoIT?
      1) Ловить роботов можно по образам. Если не боитесь, обученной нейросетью, иначе по монохромным спрайтам + мастер-цвет для определения фракции. Серьёзные мучения вызовут анимации\эффекты. Экранщики, которые я делал для простейших ЧМОРПГ, вроде haven and hearth, очень плохо ловили анимации, оставляя неприятные лаги в определении персонажей. Если добавлять больше образов, ФПС уходит в отрицательные значения, а на маленьком числе велика вероятность проворонить слона. В РПГ достичь баланса возможно, разнообразие юнитов на одной локации мало и все они очень разные, в стратегиях всё хуже. Если можно, откручивайте настройки графики в отрицательную зону. Есть ещё 3d скриншоты, вещь не самая приятная, но там хотя бы по текстурам можно ловить. Опять же, не представляю, как это скажется на FPS, плохо, ужасно или ужасно плохо.
      2) Перекрывающиеся и скрытые юниты. Если первых можно искать по крышкам, вторые просто исчезают из памяти золотой рыбки.Не играл в рейнджеров (Фу, ньюфаг!), но в RA2 возможно полное перекрытие юнита зданием или ландшафтом, с чем я пытался бороться, запоминая координаты своих юнитов. Весьма неудачно, должен сказать: юниты в RA2 — истинные джентльмены, уступающие друг другу дорогу. Единственное спасение — группы, но, опять же. в рейджеров я не играл (Фу, ньюфаг), и лимиты на юнитов и быстрые группы не знаю.
      3) Нужно ловить звуки. Мини-карта — это хорошо, но нападение в тыл движущимся войскам или заход в тыл базы обнаружить бывает очень сложно. Да и цвета на миникарте не всегда можно разобрать, даже с дополнительной обработкой. так что «база под атакой» — святая халтура…
      4) Обработка юнитов, ушедших за пределы экрана. В бытность редалерта я использовал группы и простейший поиск пути по миникарте с оценкой времени. И даже так умудрялся терять 10% войск пропавшими без вести\убитыми. С тех пор понял, что нужно мониторить все отряды противника, все свои отряды и не допускать переопределения групп. Только пополнение.

      Это то, что вспомнил сразу. И нет, к разработке не присоединюсь, есть более интересный проект.


      1. third112
        06.05.2016 13:52

        Спасибо за советы. Возможно, в дальнейшем придется воспользоваться Вашим опытом. Но пока будем двигаться от простого к сложному и попытаемся выжать как можно больше инфы из миникарты.

        И нет, к разработке не присоединюсь, есть более интересный проект.
        Жаль, что такое Ваше решение. Но чисто из интереса позвольте спросить: а в чем проблема? Даже в очень интересном проекте случаются моменты, когда хочется отдохнуть, переключившись на что-то другое. И раз у Вас есть наработки, разве долго вставить готовый код в другой проект. Или же этот код закрыт? — Тогда понятно, почему нет ;)


        1. iCpu
          06.05.2016 14:29
          +1

          Наработки уже не актуальны, да и затеряны где-то на полугорелом харде от моего первого компа. Сорцы представляли из себя кадавра из вижуал бейсика (месье знает толк), дарк бейсика (все поиски путей и прочее просто стырено из инета), фортрана (Профессора Фортрана!) и соплей 16-летних пацанов. Как это всё вместе работало — до сих пор не представляю. Так что любой скаченный бот на AutoIT (а таких — сотни, включая весьма продвинутые прожекты, тот же Aion) будет на пару порядков полезнее. Кстати, именно потому я о нём и спросил, что обычно это первый (на крайняк — второй) по скорости появления бота движок.

          > Но чисто из интереса позвольте спросить: а в чем проблема?
          В сутках всего лишь 24 часа, время, и хотя бы 5 из них всё же необходимо оставлять на сон. Кроме основной работы пилю пакетника на одну ММО. Успехи весьма велики, но код выкладывать в открытый доступ не собираюсь, так как это очень негативно скажется на игре. И, хотя я преследую не только академические цели, обрушать её экономику я не планирую. У неё и сейчас не самый высокий онлайн в истории, а если моими стараниями 3\4 игроков будут иметь ники «killmeiambot%d», популярность игры станет ещё меньше.
          Если в ходе разработки наткнусь на действительно интересные моменты по созданию ботов, обязательно выложу и в виде статей, и в виде кода. Но, если честно, пока не представляю, что именно может заинтересовать сообщество. Рассказ о том, что если пишите на Java, не забывайте обфусцировать код, иначе он обязательно попадёт в руки хитрожопа? Это я могу, да, но нужно ли оно здесь?


          1. third112
            06.05.2016 14:42

            Успехи весьма велики, но код выкладывать в открытый доступ не собираюсь, так как это очень негативно скажется на игре.
            У нас противоположная ситуация :) Дампридер ИМХО повысил интерес к игре. И мой генератор корпусов не вызвал негатива, и бот для ПБ не вызовет. А доступность кода ставит всех игроков в равные условия. Вот если бы исполняемый код был доступен только нескольким игрокам — было бы несправедливо :)


            1. iCpu
              06.05.2016 15:01

              Опять же, не играл, и, вероятно, именно поэтому меня такой проект не цепляет. Что касается справедливости — игры, в принципе, несправедливы. Потому как после выкладывания движка бота начнётся гонка скриптов, многие из которых не будут выложены на публику. Дальше появятся нытики, которые не могут написать или найти хороший скрипт — и сюжетная развилка у руководителей проекта.

              А про распознавалку, что уже получается распознать?


              1. third112
                06.05.2016 15:30

                Потому как после выкладывания движка бота начнётся гонка скриптов, многие из которых не будут выложены на публику.
                Пока гонки не видно. Пока гораздо легче пройти ПБ обычным образом руками, чем написать скрипт:) В игре несколько десятков ПБ карт (можно подключать свои, но заданий на их прохождения в стандартной игре не будет). Эти несколько десятков карт рекордсмены прошли многократно. Просто надоедает проходить одни и те же карты, а отказ от прохождения очень невыгоден и хороший рекорд без ПБ сделать гораздо труднее.

                Еще такое соображение: если кто-то сделал бота, но не стал выкладывать в широкий доступ, то это ничего не меняет, т.к. кто-то другой может сделать аналогичного бота ;)

                Если бот окажется успешным, то будет как с секретами прохождений основной игры и отдельных ПБ. Рекордсмены охотно делятся секретами. Иногда даже руководства пишут (см., нпр.) На все ПБ есть видеопрохождения.

                А про распознавалку, что уже получается распознать?
                Числа ресурсов. Скрин игры всегда распознается правильно.


                1. iCpu
                  06.05.2016 15:51

                  > Числа ресурсов. Скрин игры всегда распознается правильно.
                  Уже что-то. Пытались искать спрайты интерфейса?

                  Посмотрел, что рейнджеры — одиночная игра. Если так — согласен.


  1. a1hb
    05.05.2016 19:09
    +2

    А видео самого процесса посмотреть можно где-нибудь?
    Просто после чтения статьи возникает куча вопросов, не связанных с альпинизмом и философией )

    Если используются скрипты прямо для каждого уровня, насколько тщательно вы анализируете карту боя (что именно из себя представляет «система распознавания образов»? распознавание отдельных пикселей? строгий поиск картинок по результатам BitBlt? чтение памяти?)
    Насколько быстро идет распознавание объектов, учитывая, что вы используете интерпретатор паскаля? Сколько снимков в секунду анализируется (читай — насколько выходит медленнее C++)?
    Много ли привязок к конкретным координатам экрана, по которым идут клики? Или же поведение бота полностью основано на распознавании вражеских объектов и противодействию им?
    Если «Эмуляция клавиатуры и мыши», то никаких инжектов в память? Я не фанат КР2, поэтому не знаю, есть ли там античит-система. Если есть, какие методы для обхода вы применяли? Это ведь очень важный момент в написании ботов.

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


    1. third112
      05.05.2016 19:11

      Ответ встал выше: не учел, что сначала нужно одобрить :)


      1. a1hb
        05.05.2016 21:01
        +1

        Да, теперь намного понятнее, спасибо.

        С проблемой скана экрана на молодых Windows сталкивался и я (после тысяч успешных вызовов BitBlt начинала выдавать непонятные ошибки). В моем случае помог автоматический рестарт экзешника-ядра бота. В общем случае можно использовать VirtualPC с образом WinXp, чтобы не заморачиваться с многими вещами, а сконцентрироваться на разработке логики. Удачи.


        1. third112
          06.05.2016 00:19

          Ok. И мы работаем на ХР, у меня еще линукс+Oracle VM VirtualBox. Еще проблема имитации клавиатуры: Direct Input игры для ПБ не хочет даже на низком уровне. В других частях игры имитировать удается.


          1. a1hb
            06.05.2016 16:57

            Заинтриговали. Установил, проверил свою старую бибиотеку на основе SendInput и keybd_event (не open source, но ничего секретного. см. msdn для примеров).
            Win7x32, «Space Rangers HD: A War Apart», планетарный бой #1.
            Ввод имитируется без ошибок, клики мыши проходят, нажатия клавиш типа Ctrl+1, 2 (хоткеи для отрядов роботов) прожимаются. В общем, проблем не обнаружил.


            1. third112
              06.05.2016 17:16

              Очень интересно. Подскажите, пожалуйста, где ошибка?:

              function kbd (key : integer): integer;
              ...
               // Press key
                pInputs.ki.wVk := key;
                pInputs.ki.dwFlags := 0;
                SendInput (1, pInputs,sizeof(TInput));
              
                // Release key
                pInputs.ki.dwFlags := KEYEVENTF_KEYUP;
                SendInput (1, pInputs,sizeof(TInput));
              

              У меня, правда, ознакомительная Win8.1x32. Надеюсь, здесь это несущественно.


              1. a1hb
                06.05.2016 18:29

                Видимо, пропустили wScan:
                keyboardInput.ki.wScan = MapVirtualKey(key, 0);


                1. third112
                  07.05.2016 00:36

                  Не помогает. И в ХР не работает.


  1. idris070
    05.05.2016 19:10
    +1

    интересная тема, раньше пытался создавать всяких ботов под игры, если можно не против присоединиться, и если смогу чем помочь, помогу! «Больше в поучительных целях» — если нужен опытный программист в этом деле то это не ко мне!


    1. third112
      05.05.2016 19:25

      Добро пожаловать!
      Мы рады любой помощи. А опыт придет — было бы желание. По идее скрипты писать не сложно, если даже не знать стандартный Паскаль, то его можно изучить прочитав всего 30 страниц :) Но нужно много пробовать, экспериментировать, т.е. кропотливо заниматься серьезной исследовательской работой. Это не просто, но не требует много знаний. Чтобы править бота — нужно больше знаний, но для программиста с опытом — это направление м.б. легче. Есть и другие работы. Нпр., выше хороший совет — сделать видео.


  1. Saffron
    05.05.2016 23:59
    +1

    Меня вот интересует та часть, которая отвечает за распознавание. Я в своё время использовал библиотеку sikuli. Там только самые простые алгоритмы и не видно основательного подхода. Существуют ли какие-нибудь другие фреймворки для захвата интерфейса? На низком уровне sikuli использует индустриальный стандарт opencv, но предоставляет высокоуровневую прослойку. Вот я заинтересовался, нет ли другой прослойки?


    1. third112
      06.05.2016 00:23

      Пока и opencv не успели попробовать.


  1. littleguga
    05.05.2016 23:59
    +1

    А как же github?


    1. third112
      06.05.2016 00:26

      Пока в проекте мало участников — можно и без github. Будет больше — будем думать.


      1. littleguga
        06.05.2016 03:19

        Я думаю, в современном сообществе программистов github сильно влияет на приток людей.


        1. third112
          06.05.2016 14:18

          Трудно сказать. Упомянутый в статье SRHDDumpReader на github. ИМХО приток не большой. Но автору виднее: ридер очень популярен среди игроков. Сам с большой пользой познакомился с исходным кодом, за что очень благодарен автору.


  1. third112
    06.05.2016 00:10

    Выложил исходный код.


  1. Arkham
    06.05.2016 05:11

    Почему выбран путь распознавания по скриншоту? И почему собираетесь эмулировать нажатия клавиш/кликов?
    Гораздо производительней и проще было бы оперировать/отслеживать внутренние события самой игры.
    Тем более раз разработчики такие общительные, может подскажут некий внутренний api.

    P.S. Планетарки… Сколько нервов было на них потрачено.


    1. ksenobayt
      06.05.2016 10:16

      Никакого API нет by design. Внутренние события тщательно скрыты от любого дебага во имя защиты от хитрожопых игроков.
      В своё время ПБ были одной из самых незащищённых частей игры: даже читы, используемые во время планетарок, не отражались в общем логе игры, и не влияли на валидность\невалидность рекорда для отправки в лидерборд. Нынче с этим покончено, так что разбор скринов — единственный вариант, который у этих товарищей остаётся. При любой попытке хотя бы вычитать память, рекорд будет забракован автоматом.


      1. Arkham
        06.05.2016 10:22

        Спасибо за ответ. А если не секрет, можете рассказать как происходит мониторинг чтения памяти? Слабо разбираюсь в этой теме. Suspend процесса товарищам не поможет?


        1. ksenobayt
          06.05.2016 11:59

          ПБ спавнятся как дочерний процесс основным — это отдельная часть на программном уровне, роботы полностью писаны на C++. Ядро, rangers.exe, в себе содержит ватчдог, который следит за определёнными потоками. Но поскольку народ нынче совсем хитрый, большая часть значений попросту шифруется в RSA.


          1. Arkham
            06.05.2016 12:36

            То есть, если сделать suspend ватчдога и достать из исходников rsa ключ, то может и получится?


            1. ksenobayt
              06.05.2016 12:39

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


    1. WayMax
      06.05.2016 12:55

      Какой вы однако невнимательный, автор же выше писал:
      Античит-система есть. Любое посягательство на оперативную память игры отмечается, и это портит рекорд. Наш принцип: никакого взлома. (Иначе бы нас выгнали с сайта СНК, а так не гонят и помогают советами/инфой об устройстве игры :)


      1. Arkham
        06.05.2016 13:31
        +1

        Ну так использование вызовов событий, которые могут быть вызваны по правилам игры — это не взлом, а автоматизация.


        1. third112
          06.05.2016 14:08

          Ok — это не взлом. Пробовал посылать сообщения о событиях мыши/клавиатуры. К сожалению, не работает, т.к. Direct Input :( Еще пробовал уговорить разработчиков игры на COM — не удалось :(


    1. KReal
      10.05.2016 17:29

      Так ведь можно и без них


  1. VaalKIA
    06.05.2016 08:51
    +1

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


    1. third112
      06.05.2016 14:03

      Спасибо за совет. Да. Есть проблемы с перерисовкой. В виндах много полезных флагов, но нам нужно смотреть DirectX. Какие флаги там работают? Или нужно делать несколько чтений экрана и сравнивать результаты распознавания. Цифры меняются медленно — раз в несколько секунд.


  1. Temtaime
    06.05.2016 09:51

    ИХМО распознавать по скриншоту — неудачная идея.
    Юниты могут быть за деревьями, что угодно.
    Гораздо интереснее было бы написать хуки к клиенту так, чтобы система защиты, если она есть, не обнаружила их.


    1. third112
      06.05.2016 13:31

      Прежде всего, можно предположить, что возможно обойти защиту. Просто потому, что никому в мире не удавалось сделать 100%-ю защиту, и можно предположить, что теоретически 100% защита невозможна. (Только давайте не будем здесь обсуждать проблемы типа P =? NP, иначе далеко уйдем от темы :) Итак, предположим, что защиту мы обошли. Тогда наш бот будет не нужен. Без всякого прохождения пишем в память желаемое количество очков и отсылаем сверх-рекорд. Что-то подобное было с первыми КР2 в эпоху Elemental Games. За слово ArtMoney на их форуме можно было заработать бан :) Кончилось тем, что таблицу рекордов закрыли. Т.о. ИМХО этот путь обсуждать не стоит, как не относящийся к теме, т.е. к боту — бот, повторю, при таком пути станет не нужен.

      Далее. Основную сцену «роботы за деревьями» распознавать ИМХО слишком сложно и затратно, тем более в реальном времени. Гораздо проще и продуктивней использовать миникарту в левом нижнем углу экрана (рис.1 в статье). Там роботы обозначены маленькими кружочками, заводы и базы — квадратиками, шума нет. В отличие от роботов заводы и базы не меняют координат, а только цвет. Их распознать проще. BTW если будет не хватать времени, то всегда можно сделать паузу в игре, т.о. проблему реального времени можно легко обойти.