Как разрабатываются программы для помощи в игре в покер

Последний пост:23 февраля
80
1 2 3

  • Спойлер: Показать


    Добрый день всем собравшимся.

    Эта тема посвящена истории разработки вспомогательного программного обеспечения для онлайн игры в покер.
    Многие меня знают как автора программы StarsHelper.
    Это программа выполняла разные мелкие полезные функции в руме PokerStars.
    Я был разработчиком StarsHelper на протяжении 9 лет и сейчас готов поделиться разными подробностями и историями.
    Надеюсь вам будет интересно.
    -----------------------

    Тема #1. Почему не будет продолжения развития программы?
    Первый вопрос который я решил осветить на мой взгляд не очень интересен.
    Но этот вопрос часто спрашивают, я отвечал на него много раз и решил ответить ещё раз максимально подробно.


    Причина 1.
    Цена на программу была впервые установлена около 8 лет назад и за это время поменялась только один раз с 25 долларов до 35 долларов.
    Условия продажи подразумевают разовую оплату. А не ежегодную или ежемесячную.
    Такая модель позволяет финансировать будущую разработку только за счёт новых пользователей, так как старые пользователи уже не платят.
    Это можно частично сравнить с финансовой пирамидой, которая живёт до тех пор пока есть новые пользователи.
    Вероятно это моя ошибка изначально назначить сверх низкую цену, но 8 лет назад я не очень хорошо умел прогнозировать.

    Причина 2.
    PokerStars не очень хорошо относится к вспомогательному программному обеспечению.
    Это выражается в том что каждые несколько лет правила относительно дополнительных программ ужесточаются.
    В результате все подобные программы созданные для PokerStars постоянно становятся всё более менее эффективны.
    Возможно для игроков это плюс, но для разработчиков это минус.

    Причина 3.
    PokerStars добавляют функции и улучшают свой клиент. В результате чего частично отпадает необходимость в дополнительных программах.
    Приведу небольшой, но яркий пример. После того как PokerStars добавили встроенное преобразования фишек в большие блайнды, продажи StarsHelper снизились примерно в 2 раза.
    Многие пользователи прямо говорили что использовали StarsHelper только для этой функции, а всё остальное им не интересно.

    Причина 4.
    Румов становится всё больше. Их качество постепенно повышается. Нет однозначной доминации PokerStars как безальтернативного рума.
    Из-за этого процесса игроки распределяются более равномерно по множеству румов.
    Делать программу которая будет работать сразу во многих румах значительно сложнее. Хотя это возможно, но потребуется больше ресурсов и времени.

    Причина 5.
    Малая прогнозируемость решений покер румов. В любой момент рум может выпустить обновление которое сломает часть функций. Или же сломает вообще все функции как это было например с графикой Aurora на PokerStars.
    В этот же пункт можно добавить вероятность закрытия рума.

    Причина 6.
    Онлайн покер в целом это довольно малая целевая аудитория. Ввиду разных государственных запретов и ограничений мне кажется что аудитория скорее снижается, в лучшем случае остаётся на одном месте.
    Например когда то давно игроки разных стран могли законно играть друг против друга за одним столом. Сейчас многие развитые страны разрешают игру только внутри своей страны или только внутри одного штата.
    Этот пункт субъективный и основан на ощущении. Точных статистических данных у меня нет.

    Причина 7.
    Наличие конкурентов.
    Конкуренты были практически всегда. Но из-за причин выше остаётся всё меньше возможности создания множества подобных программ.
    Если бы конкурентов не было, либо они были слабые, тогда было бы выгодно разрабатывать новую программу или адаптировать старую.
    Интересный факт. На момент первичной разработки StarsHelper у меня не было ни одного конкурента.


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

    Спойлер: Показать


    -----------------------
    Техническая поддержка StarsHelper в этой теме
    Сообщение отредактировал StarsHelper - 29.10.2020, 1:56
    1/18
    Ответить Цитировать
    106
  • Являешься ли ты сам покерным игроком?
    Сколько копий программы продал?
    Чем планируешь заняться дальше?
    1/2
    Ответить Цитировать
    0
    Это сообщение пока никто не оценил.
  • EIvis,
    игроком в покер не являюсь, так как не интересен сам процесс онлайн игры. Если бы предложили поиграть в покер в реале с друзьями, то согласился бы.
    В разработке StarsHelper на протяжении всего периода участвовали профессиональные игроки. Врятли они захотят рассказывать о себе. Те люди которые оказывали консультации в первый год разработки тоже были профессиональными игроками, но вероятно уже давно не играют в покер.

    Сколько продал не скажу. Если суммировать все года, счёт идёт на тысячи.

    В ближайшие полгода мой род деятельности не изменится. Так как программа ещё работает, я всё ещё занимаюсь поддержкой пользователей. Вероятно выпущу обновление для расстановки столов в StarsHelper. Так же мне нужно закончить другой большой проект который я начал 4 года назад после окончания университета.
    Что я буду делать через полгода-год не знаю. С высокой вероятностью буду ещё что то программировать, так как это мой основной навык.
    2/18
    Ответить Цитировать
    13
  • Тема #2. Первая версия StarsHelper.

    Спойлер: Показать


    Начну совсем издалека. О программировании.
    Я начал программировать будучи школьником. Мой первый проект был браузерной онлайн игрой. Я сделал её не сам. Сначала я смог уговорить разработчиков игры передать мне исходники и сайт. Игра не была каким то коммерческим мега проектом, скорее как хобби. Поэтому мне так легко её отдали. Для школьника который ничего не умеет это был предел мечтаний и возможностей. Мне даже удавалось заработать на игре какие то деньги. Иногда 100, иногда 500 баксов, но чаще это была мелочь. Один раз мне даже подарили старый компьютер с электронно-лучевым монитором.

    2012 год. Я студент второго или третьего курса.
    Это уже мой второй университет, так как из первого меня отчислили за неуспеваемость.
    Хожу на пары, играю в разные игры. Типичная жизнь студента. В то время я подсел на всем известную игру с аббревиатурой WoT. Состоял в клане, мы высаживались на карте, после боёв завязывались приватные разговоры с соклановцами на разные темы. Я как то сказал что помимо учёбы иногда увлекаюсь программированием. На что мне предложили попробовать написать одну программу.
    Ввиду того что студенты между сессиями особо ничего сложного не делают, у меня было много времени чтобы попытаться сделать некую программу.
    Тогда я вообще ничего не знал про покер. Даже не знал что там нужно собирать какие то комбинации карт. Стал изучать в интернете что это за игра такая. Мои боевые товарищи по клану долго и кропотливо рассказывали что бы они хотели получить в итоге. Хотелок было много. Вопрос состоял в том что я смогу реализовать.
    Начал я с самого лёгкого. Первая моя программа умела выполнять следующие функции:
    -Читать историю рук.
    -Создавать статистику на основании истории рук.
    -Был редактор который позволял создавать свои статы. Он был очень сложным, но зато в нём можно было описать любую игровую ситуацию.
    -Хранить уже посчитанную статистику в файле, чтобы не приходилось при каждом запуске её пересчитывать.
    Думаю многие догадались что это некая пародия на холдем менеджер или покер трекер.
    Но у моей программы было несколько преимуществ.
    Она не имела никаких баз данных по типу postgre sql. Все операции происходили напрямую в памяти не используя жёсткий диск. Мы проводили сравнительные тесты на больших объёмах рук и получалось что моя программа выполняет парсинг истории на порядок быстрее (возможно в 10 раз быстрее, я уже не помню). Это было актуально на 2012 год, сейчас возможно технологии ушли вперёд, да и компьютеры посильнее.
    Второе преимущество моей программы было в том что собранную статистику планировалось не выводить на стол, а строить на её основании некие стратегии игры. Или подсказки к действию. Да это запрещено. Но тогда я вероятно даже не знал об этом (не помню уже). Так как я делал программу не для продажи, а по просьбе пары человек, по сути я ничем не рисковал.

    Так же программа имела калькулятор который мог просчитать вероятность выиграть на основании тех данных что известны (какие карты в руке, карты на столе, сколько людей в игре, позиции игроков, какие карты предположительно имеют оппоненты). Калькулятор работал по принципу бесконечного перебора используя генератор случайных чисел для выброса недостающих карт на стол. Даже за полсекунды работы процессора можно было получить относительно точный результат. Имеется ввиду что за полсекунды можно перебрать миллионы вариантов что даёт маленькую погрешность вычисления.
    Разумеется этот калькулятор не являлся универсальной машиной которая бы позволяла всегда выигрывать. Тогда я не особо понимал что это может дать на практике, просто делал то что был в состоянии реализовать.

    К программе имели доступ 3 человека включая меня. На сколько я помню из нас троих никто так и не сделал статы. Я не понимал какие статы нужны. А остальные не знали как сделать статы. Либо им было лень, уже не помню.
    К тому же программа не умела выводить статы на стол или как то их полезно использовать.
    Фактически всё что описано выше не было никем использовано по следующим причинам:
    Не было доведено до ума ввиду моей не опытности.
    Не было публично опубликовано.
    Были работающие программы PokerTracker и Holdem Manager.

    Далее мне рассказали что есть такая программа которая называется LongHUD. Даже сейчас любой может загуглить её, найти скриншоты и её описание.
    Разработчик этой замечательной программы отказался от её поддержки. Она ещё работала, но доживала свои последние месяцы. Мне предложили сделать аналог этой программы.
    Я рискнул и у меня получилось. О технических сложностях с которыми мне пришлось столкнуться я расскажу позже. Это очень объёмная тема. В общей сложности я потратил около одного года на то чтобы сделать первую публичную версию программы.

    Так это выглядело:

    Она не продавалась. Я просто выложил её на одном покерном форуме.
    Как видите по скриншоту там была всего одна функция: конвертация всех фишек за столом в большие блайнды.
    Получив восторженные отзывы я понял что мне нужно продолжать дальше.
    Теперь вы знаете что StarsHelper изначально был аналогом программы LongHUD и в конечном итоге получил все функции которые были в LongHUD. Часть функций потом запретили старзы, поэтому сейчас вы не найдёте такую функцию как "префлоп агрессия".

    В последующем я начал добавлять ещё много разных функций и некоторые стали думать что StarsHelper это некий аналог программы Table Ninja.
    Хотя программы были абсолютно разные как по набору функций, так и по принципу работы.

    Интересный факт. В StarsHelper прямо в главной вкладке есть функция которая называется "не изменять общий банк".
    Наверняка многие не знают в чём польза этой настройки.
    Это нужно для того чтобы Table Ninja могла работать одновременно со StarsHelper.

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

    В следующем выпуске я расскажу о техническом устройстве программы.
    3/18
    Ответить Цитировать
    95
  • Тема #3. Как StarsHelper взаимодействует с клиентом.

    Как извлечь данные из клиента - такой вопрос периодически поступает в поддержку.
    На него можно ответить по-разному, зависит от уровня подготовки того кто спрашивает.

    Как правило спрашивающий не указывает никаких деталей, его уровень знаний мне не известен, поэтому приходится давать самый простой ответ.
    Один спрашивающий указал что хочет сделать дипломную работу как то связанную с этой темой.

    Так как здесь программистов не очень много, я буду писать только понятные всем вещи.

    Итак простой ответ.
    Чтобы понять что происходит за игровым столом можно применить метод оптического распознавания текста или образов.
    Распознавание текста сокращённо называется OCR.
    Существуют уже готовые библиотеки которые сами могут распознать текст.
    Распознавание сложных (не статичных) образов обычно строится на обучении.
    Например, в нейронную сеть подаётся десятки изображений котиков. После этого, если сети показать новое изображение, то она выдаст с какой вероятностью это изображение является котиком.
    Чем сложнее образ, тем сложнее обучить сеть.
    Если изображение всегда статичное, то можно не применять нейронные сети, а просто сравнивать картинку с оригиналом.
    На практике, из-за того что изображение имеет свойство растягиваться и масштабироваться, как правило абсолютно статичной картинки не бывает.

    Плюсы такого метода.
    Легко освоить и реализовать.
    Можно применять где угодно.

    Минусы.
    Нет 100% точности.
    Низкая производительность.

    Но есть и другой метод.
    Вся нарисованная на столе информация хранится в оперативной памяти вашего компьютера.
    Windows предоставляет инструменты для чтения памяти других процессов.
    Например вы можете обратиться к вашей операционной системе и попросить её скопировать для вас нужный вам участок памяти.
    А дальше делать с этой информацией что вам угодно.

    Плюсы такого метода.
    Высокая производительность (по сравнению с OCR).
    Можно прочитать даже то что не нарисовано на экране.
    100% точность.

    Минусы.
    Очень сложно реализовать.
    При малейшем изменении в структуре данных у вас всё сломается.


    StarsHelper использует метод чтения памяти.
    Для работы функции chips to bb, кроме чтения памяти, так же применяется запись в память.
    Простыми словами StarsHelper подменяет числа и буквы в памяти процесса клиента, чтобы заставить клиент нарисовать другой текст.

    Как понять в каком участке памяти находится нужная информация?
    Для этого нужно использовать дизассемблер, знать ассемблер и иметь очень много терпения.
    Я использовал в своей работе дизассемблеры IDA и ollydbg. Хотя есть и другие хорошие инструменты.
    В зависимости от уровня подготовки и поставленной задачи, на поиск нужной информации может уйти от 1 дня до нескольких месяцев.

    Для наглядности сделал скриншот демонстрирующий работу в ollydbg.



    Понимаю что для большинства это выглядит как текст на китайском.

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


    Как StarsHelper узнаёт в какой момент нужно считывать информацию?
    Для решения этой задачи используется модификация кода клиента.
    Например, в момент когда клиент заканчивает рисовать стол, клиент посылает в StarsHelper сигнал что я закончил, теперь твоя очередь думать.
    Разумеется в клиенте изначально нет таких алгоритмов, я сам их написал, а StarsHelper вживляет эти алгоритмы в клиент.
    Такие алгоритмы, которые вживляются в клиент, я пишу двоичными кодами не используя языки программирования.
    Пример такой программы:
    0x5A
    0x59
    0x58
    0xC2
    0x04
    0x00
    Такие микропрограммы пишутся очень долго. Я потратил много месяцев. Хотя при наличии опыта можно управиться быстрее.

    Если написать такую программу на языке высокого уровня, то вживить её в клиент будет сложнее. Хотя это возможно.


    Но не думайте что если вы нашли нужную информацию и написали мега программу на этом всё закончилось.
    Любое обновление клиента может сломать ваши алгоритмы.
    Чем больше информации вы извлекаете и чем больше функций сделали, тем чаще у вас будет всё ломаться.

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

    Когда обновляется клиент, мне приходит уведомление в телеграмм. Я бросаю все дела, открываю IDA и начинаю искать нужные для StarsHelper участки памяти.
    Так как я занимаюсь этим уже 9 лет и наперёд знаю что искать, каждый такой поиск занимает у меня в среднем 1 час. Это если в клиенте не произошло каких то значительных изменений.
    При значительных изменениях требуемое время может увеличиться в десять-сто раз.

    На сегодняшний день StarsHelper поддерживает 21 регион PokerStars. Каждый регион имеет свой клиент и обновляется независимо.
    В среднем за месяц я произвожу примерно 10-30 таких поисков (иногда весь месяц нет ни одного обновления).

    Часто бывает так что обновляется сразу 3-5 клиентов в одно время и мне нужно много времени чтобы всё обработать.
    Самый популярный com клиент я обновляю всегда в первую очередь.
    Результаты моих поисков загружаются в StarsHelper автоматически, поэтому не все замечают что произошли какие то изменения.

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


    StarsHelper это моя первая программа такого уровня сложности.
    Если вы знаете как реализовать алгоритмы StarsHelper проще или лучше, напишите, возможно я чего то не знаю.


    В следующем выпуске я расскажу сколько времени занимает создание новых функций. А так же почему даже лёгкие в реализации функции часто не добавляются в программу.
    4/18
    Ответить Цитировать
    119
  • Очень интересно, спасибо, что пишешь.
    А OCR нельзя закешировать?! Интересно, как в caption-е, tabletamer-е и других конкурентах реализовано - онли OCR без чтение памяти и дилер чата?
    1/1
    Ответить Цитировать
    0
    Это сообщение пока никто не оценил.
  • gesperid, на оба вопроса не знаю ответ.
    5/18
    Ответить Цитировать
    0
    Это сообщение пока никто не оценил.
  • Далек от программирования под десктопы, но я думал что все намного проще и есть какой-нибудь winApi, через который можно доставать данные с клиента ps.
    1/1
    Ответить Цитировать
    0
    Это сообщение пока никто не оценил.
  • Brokkoli, Без winapi такие алгоритмы было бы нельзя реализовать.
    Он используется для чтения/записи в память другого процесса.
    6/18
    Ответить Цитировать
    2
  • наверное Brokkoli имел в виду просто апи. Такого конечно же нет.
    Не хватало облегчать работу всяким ботам итд.

    Интересно как доказывалось старзам, что мы ничего плохого не делаем и как они разрешили лазить им в память и ковырять там всё.
    всякие шутеры-мморпг обычно на такое реагируют банами
    1/1
    Ответить Цитировать
    1
  • Да, кстати, получается, вы каждое малейшее изменение согласовываете со Старзами, чтобы оставаться в списке разрешённых программ?
    2/2
    Ответить Цитировать
    0
    Это сообщение пока никто не оценил.
  • Yras, можно прислать им свою программу. Описать что она делает. Спросить разрешена ли такая программа.

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

    Специального разрешения залезать в память лично я не получал, так как не спрашивал его.

    Надеюсь я сейчас не выдам никаких секретов. Тем более уже много лет прошло.
    Например для их службы безопасности было странно что StarsHelper читает текст который клиент пишет в файл лога. При этом не открывая этот файл.
    Они уточняли как происходит чтение этого текста. После объяснения никаких запретов не последовало. Думаю они интересовались этим чтобы понять как работают продвинутые боты. Либо они удовлетворяли своё любопытство. Всякое может быть.
    7/18
    Ответить Цитировать
    4
  • EIvis, нет. Смотрим с специальный файл где описано что можно делать а что нельзя.
    Если в этом файле разъяснений не достаточно, тогда уже спрашиваем.
    8/18
    Ответить Цитировать
    0
    Это сообщение пока никто не оценил.
  • Купил и забыл конечно хорошо, но я уже склоняюсь к мысли что годовое обслуживание таких прог крайне важно.
    1/1
    Ответить Цитировать
    8
  • Не совсем понятно, что мешает перейти на модель с годовой подпиской, благо примеров как это делается предостаточно - тот же HoldemManager. Выпускаете условный StarsHelper 2, делаете период льготного (бесплатного) апгрейда для владельцев пожизненной лицензии старого Хелпера, которые купили его в последний год (или два года или иной срок по желанию). Поддерживать софт, купленный за 25$ 7-8 лет назад, регулярно его обновляя, - звучит довольно абсурдно, имхо.

    Но логика остальных аргументов, особенно 3 и 7, понятна.
    Сообщение отредактировал Repairion - 9.11.2020, 7:43
    1/1
    Ответить Цитировать
    9
  • Цитата (StarsHelper @ 5.11.2020)
    Если вы знаете как реализовать алгоритмы StarsHelper проще или лучше, напишите, возможно я чего то не знаю.
    Мне часть вещей удалось автоматизировать, но часть других данных, которые я использую, тоже приходится искать вручную, хотя и реже - обычно достаточно сделать это для первого обновившегося клиента, а у остальных всё аналогично (например PokerStars.uk недавно обновился до 35261 и я сделал его поддержку, надеюсь что и для всех остальных клиентов старзов это обновление будет работать). И часто несколько следующих мелких апдейтов клиентов тоже ничего для меня не меняют.

    Если я верно понимаю - одна из вещей, которые ты ищешь вручную, это адрес функции, которая отрисовывает текст на столе. Я её ищу динамически по сигнатуре (на стороне клиента), она уже несколько лет не меняется во всех типах / билдах клиентов (до этого был другой вариант, а до того ещё какой-то).
    Хотя сейчас посмотрел - я там до сих пор два варианта ищу, и даже не знаю, который из них сейчас реально работает.
    Последняя из добавленных -
    0x57, 0x50, 0x8D, 0x45, 0xF4, 0x64, 0xA3, 0x00, 0x00, 0x00, 0x00, 0x8B, 0xF9, 0x8B, 0x4D, 0x14, 0x8B, 0x5D, 0x08, 0x8B, 0x55, 0x0C, 0x8B, 0x75
    судя по моему комменту, она впервые появилась в PokerStars.ee 22608
    Если это так, то тоже можешь попробовать это автоматизировать (судя по всему ты ту же самую функцию перехватываешь, хотя я и не проверял).

    Но это всё старого движка касается, в Авроре всё совсем по-другому, конечно.
    1/5
    Ответить Цитировать
    5
  • На каком языке писалась прога и требовала ли служба безопасности исходный код?
    1/1
    Ответить Цитировать
    0
    Это сообщение пока никто не оценил.
  • fantomm, так можно сделать. Я рассматривал такой вариант. Почему так не сделал описано в первом сообщении.

    LikeAA, Этот поход мне понятен. Закрадывались такие идеи. Но мне показалось что реализовать динамический поиск для всех нужных мне функций очень сложно. Видимо надо было так сделать раньше хотя бы для части функций.

    artyoms, код никто не требовал. Основная часть программы на c#.
    9/18
    Ответить Цитировать
    0
    Это сообщение пока никто не оценил.
  • Цитата (StarsHelper @ 9.11.2020)
    artyoms, код никто не требовал.
    А у меня просили, кстати. И для основной программы, и ещё для одной вспомогательной, которую я использую для тестовых целей и поиска нужной инфы при обновлении клиента (спросили что это за StarsTest.exe я постоянно запускаю, почему он постоянно меняется, попросили рассказать зачем он нужен и исходники посмотреть).
    2/5
    Ответить Цитировать
    0
    Это сообщение пока никто не оценил.
  • LikeAA, видимо разная активность вызывает разный уровень подозрений.
    У меня просили лицензинный ключ для проверки некоторых отдельных функций.
    А так же просили объяснить как работает чтение карт героя (без исходного кода).
    Вероятно так же играет роль известность, репутация, как давно занимается разработкой, следование правилам, играет ли сам разработчик на реальные деньги, его винрейт, стиль игры, роботизированность решений во время игры и прочее.
    10/18
    Ответить Цитировать
    0
    Это сообщение пока никто не оценил.
46 постов
1 2 3
1 человек читает эту тему (1 гость):
Зачем регистрироваться на GipsyTeam?
  • Вы сможете оставлять комментарии, оценивать посты, участвовать в дискуссиях и повышать свой уровень игры.
  • Если вы предпочитаете четырехцветную колоду и хотите отключить анимацию аватаров, эти возможности будут в настройках профиля.
  • Вам станут доступны закладки, бекинг и другие удобные инструменты сайта.
  • На каждой странице будет видно, где появились новые посты и комментарии.
  • Если вы зарегистрированы в покер-румах через GipsyTeam, вы получите статистику рейка, бонусные очки для покупок в магазине, эксклюзивные акции и расширенную поддержку.