Pull to refresh

Comments 57

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

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

Дело не в этом. Я рад, что прожект, на который я убил ровно десять лет своей жизни, все ещё ковыряют. И настолько по-хардкору.
Рад возможности поблагодарить Вас за этот «прожект». ИМХО он стоил десяти лет! :)
Знаешь, мне кажется и через 10 лет будут ковырять. Не слежу что там сейчас на форуме СНК, но если что-то похожее на то, что было на ФЕГ, то никуда энтузиасты не денутся.
На ЕГ оригинальных разработок, ЕМНИП, было даже меньше. По крайней мере, моддерской направленности.
BTW у Delphi хороший рейтинг, а
Игра «Космические рейнджеры» вошла в десятку лучших игр всех времен и народов по версии Хабрахабра 2013 года. (См.)
:)
Надо Вадима потыкать, впору проводить новое голосование. Уж три года прошло.
А будет статья или цикл статей с более подробным описанием работы бота и его алгоритмов?
Ведь, как известно, комментарии к статье порой ценнее самой статьи и там (то есть, здесь) можно получить конкретные советы по улучшению\оптимизации и просто дельные советы.
Зависит от дальнейшего хода работ и от успеха проекта. Пока в боте очень простая распознавалка (по широко известным алгоритмам), а интерпретатор Р5 уже описан в книге. Нужно изучать систему «игра+бот+скрипты», пробовать различные подходы в скриптах, расширять и исправлять функции бота. Тут могут получиться новые серьезные алгоритмы. Когда и если такое произойдет — конечно, нужно будет описать эти алгоритмы подробно. Может, не только здесь, но и на arxiv.org ;)
Мне, например, интересно, как сделано получение снимка экрана и распознавание игровой ситуации. Я бы тоже хотел попробовать написать бота для какой-нибудь игры, но понятия не имею, как его прикрутить к игре.
См. function CaptureScreenRect в файле UnitRecognize.pas. По гуглу можно найти много похожих примеров кода для снимка экрана. Процедуры распознавания в том же файле. (Исходный код выложен здесь).
Как я задрачивался в планетарные битвы. Всё, я в ностальгии, однозначно берусь…
Очень рад! Ответил ЛС в диалоге.
Потому как обычно «программисты сложных игровых ботов» не торопятся раскрывать свои секреты и редко пишут статьи о таком хобби, хотя тема очень любопытная.
Из подзаголовка «Приглашение к совместному проекту с открытым исходным кодом» следует, что это не тот случай: все секреты, даже код — в открытом доступе (код выложу сегодня/завтра на сайте СНК).

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

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

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

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

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

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

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

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

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

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

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

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

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

С проблемой скана экрана на молодых Windows сталкивался и я (после тысяч успешных вызовов BitBlt начинала выдавать непонятные ошибки). В моем случае помог автоматический рестарт экзешника-ядра бота. В общем случае можно использовать VirtualPC с образом WinXp, чтобы не заморачиваться с многими вещами, а сконцентрироваться на разработке логики. Удачи.
Ok. И мы работаем на ХР, у меня еще линукс+Oracle VM VirtualBox. Еще проблема имитации клавиатуры: Direct Input игры для ПБ не хочет даже на низком уровне. В других частях игры имитировать удается.
Заинтриговали. Установил, проверил свою старую бибиотеку на основе SendInput и keybd_event (не open source, но ничего секретного. см. msdn для примеров).
Win7x32, «Space Rangers HD: A War Apart», планетарный бой #1.
Ввод имитируется без ошибок, клики мыши проходят, нажатия клавиш типа Ctrl+1, 2 (хоткеи для отрядов роботов) прожимаются. В общем, проблем не обнаружил.
Очень интересно. Подскажите, пожалуйста, где ошибка?:
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. Надеюсь, здесь это несущественно.
Видимо, пропустили wScan:
keyboardInput.ki.wScan = MapVirtualKey(key, 0);
Не помогает. И в ХР не работает.
интересная тема, раньше пытался создавать всяких ботов под игры, если можно не против присоединиться, и если смогу чем помочь, помогу! «Больше в поучительных целях» — если нужен опытный программист в этом деле то это не ко мне!
Добро пожаловать!
Мы рады любой помощи. А опыт придет — было бы желание. По идее скрипты писать не сложно, если даже не знать стандартный Паскаль, то его можно изучить прочитав всего 30 страниц :) Но нужно много пробовать, экспериментировать, т.е. кропотливо заниматься серьезной исследовательской работой. Это не просто, но не требует много знаний. Чтобы править бота — нужно больше знаний, но для программиста с опытом — это направление м.б. легче. Есть и другие работы. Нпр., выше хороший совет — сделать видео.
Меня вот интересует та часть, которая отвечает за распознавание. Я в своё время использовал библиотеку sikuli. Там только самые простые алгоритмы и не видно основательного подхода. Существуют ли какие-нибудь другие фреймворки для захвата интерфейса? На низком уровне sikuli использует индустриальный стандарт opencv, но предоставляет высокоуровневую прослойку. Вот я заинтересовался, нет ли другой прослойки?
Пока и opencv не успели попробовать.
Пока в проекте мало участников — можно и без github. Будет больше — будем думать.
Я думаю, в современном сообществе программистов github сильно влияет на приток людей.
Трудно сказать. Упомянутый в статье SRHDDumpReader на github. ИМХО приток не большой. Но автору виднее: ридер очень популярен среди игроков. Сам с большой пользой познакомился с исходным кодом, за что очень благодарен автору.
Почему выбран путь распознавания по скриншоту? И почему собираетесь эмулировать нажатия клавиш/кликов?
Гораздо производительней и проще было бы оперировать/отслеживать внутренние события самой игры.
Тем более раз разработчики такие общительные, может подскажут некий внутренний api.

P.S. Планетарки… Сколько нервов было на них потрачено.
Никакого API нет by design. Внутренние события тщательно скрыты от любого дебага во имя защиты от хитрожопых игроков.
В своё время ПБ были одной из самых незащищённых частей игры: даже читы, используемые во время планетарок, не отражались в общем логе игры, и не влияли на валидность\невалидность рекорда для отправки в лидерборд. Нынче с этим покончено, так что разбор скринов — единственный вариант, который у этих товарищей остаётся. При любой попытке хотя бы вычитать память, рекорд будет забракован автоматом.
Спасибо за ответ. А если не секрет, можете рассказать как происходит мониторинг чтения памяти? Слабо разбираюсь в этой теме. Suspend процесса товарищам не поможет?
ПБ спавнятся как дочерний процесс основным — это отдельная часть на программном уровне, роботы полностью писаны на C++. Ядро, rangers.exe, в себе содержит ватчдог, который следит за определёнными потоками. Но поскольку народ нынче совсем хитрый, большая часть значений попросту шифруется в RSA.
То есть, если сделать suspend ватчдога и достать из исходников rsa ключ, то может и получится?
Не выйдет. Ключ при компиляции обфусцируется — иначе всю систему шифрования рекордов уже давным-давно бы срыли.
А если сделать саспенд — сработает встроенный античит, подвязанный на полсотни игровых событий, и рекорду всё равно придёт конец. В конце концов, мы шесть лет потратили на то, чтобы максимально читерам жизнь усложнить :) — такие войны шли, что оглядываться страшно.
Какой вы однако невнимательный, автор же выше писал:
Античит-система есть. Любое посягательство на оперативную память игры отмечается, и это портит рекорд. Наш принцип: никакого взлома. (Иначе бы нас выгнали с сайта СНК, а так не гонят и помогают советами/инфой об устройстве игры :)
Ну так использование вызовов событий, которые могут быть вызваны по правилам игры — это не взлом, а автоматизация.
Ok — это не взлом. Пробовал посылать сообщения о событиях мыши/клавиатуры. К сожалению, не работает, т.к. Direct Input :( Еще пробовал уговорить разработчиков игры на COM — не удалось :(
Так ведь можно и без них
Я для эмуляции ввода использовал библиотеку AutoIt3, рекомендую.
Проблемы были при чтении экрана, в общем случае нельзя понять, когда игра его перерисовала, вроде бы есть какие-то флаги в Виндовс, которые игра может восстанавливать при перерисовке, ещё была идея портить канвас и смотреть, когда он восстанавливается. Но в принципе, даже при не очень надёжном считывании экрана, результат вполне приемлим.
Спасибо за совет. Да. Есть проблемы с перерисовкой. В виндах много полезных флагов, но нам нужно смотреть DirectX. Какие флаги там работают? Или нужно делать несколько чтений экрана и сравнивать результаты распознавания. Цифры меняются медленно — раз в несколько секунд.
ИХМО распознавать по скриншоту — неудачная идея.
Юниты могут быть за деревьями, что угодно.
Гораздо интереснее было бы написать хуки к клиенту так, чтобы система защиты, если она есть, не обнаружила их.
Прежде всего, можно предположить, что возможно обойти защиту. Просто потому, что никому в мире не удавалось сделать 100%-ю защиту, и можно предположить, что теоретически 100% защита невозможна. (Только давайте не будем здесь обсуждать проблемы типа P =? NP, иначе далеко уйдем от темы :) Итак, предположим, что защиту мы обошли. Тогда наш бот будет не нужен. Без всякого прохождения пишем в память желаемое количество очков и отсылаем сверх-рекорд. Что-то подобное было с первыми КР2 в эпоху Elemental Games. За слово ArtMoney на их форуме можно было заработать бан :) Кончилось тем, что таблицу рекордов закрыли. Т.о. ИМХО этот путь обсуждать не стоит, как не относящийся к теме, т.е. к боту — бот, повторю, при таком пути станет не нужен.

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

Articles