Osu машина для убийств

OSU! Relax (основы)

Привет, Хабр! Представляю вашему вниманию перевод статьи Adventures in osu! game hacking.

Не так давно я начал играть в OSU! и она мне понравилась. Со временем захотелось немного поковыряться во внутренностях этой игры.

Основной анализ beatmap

Итак, как мы будем разбирать beatmap? Мы можем разобрать все, начиная от названия песни, заканчивая настройками сложности. (Мы будем держать вещи простыми и анализируем только моменты времени, объекты попадания и некоторые значения, относящиеся к слайдеру.)

Я не хочу останавливаться на этом разделе слишком долго, так как это просто чтение каждой строки, ее разделение и сохранение результатов.

Получение игрового времени

Существует несколько различных способов сделать это, но самый простой — с помощью Cheat Engine. Если вы параноик, как я, вы можете сделать эту часть в автономном режиме, в конце концов, было много известных случаев автоматических запретов, связанных с использованием Cheat Engine. По крайней мере, убедитесь, что вы вышли из своего OSU!, прежде чем продолжить.

Начните с открытия Cheat Engine. Если OSU! пока не запущена, запустите её сейчас. Нажмите на значок в верхнем левом углу, чтобы открыть список процессов, отсюда выберите OSU!.exe и нажмите „Attach debugger to process”. Вернитесь к OSU. Теперь убедитесь, что никакая музыка не играет. Вы можете сделать это в главном меню, щелкнув на значок остановки в правом верхнем углу.

Теперь вернитесь к Cheat Engine, введите 0 в поле «Значение» и выполните первое сканирование. Как только оно будет закончено, вы увидите больше миллиона результатов. Мы сократим это до нескольких. Вернитесь к OSU! и снова начните воспроизведение музыки. Теперь вернитесь к Cheat Engine, установите для типа сканирования значение «Увеличенное значение» и нажмите «Следующее сканирование». Это значительно уменьшит количество результатов. Продолжайте нажимать кнопку «Следующее сканирование», пока не останется с несколько результатов.

Мы почти получили его. Все, что осталось сейчас, — это динамически получать это значение. Вот почему мы использовали отладчик Cheat Engine раньше. Щелкните правой кнопкой мыши на каждый адрес и выберите <> в раскрывающемся меню. Некоторые из них нам не подходят, но вы должны найти тот, который при разборке выглядит аналогичным.

Я загрузил базовый внешний сигнатурный сканер, который мы будем использовать позже в нашей реализации.

Обратите внимание, что указанная выше подпись относится только к каналу Stable (Latest) release. Подписи, вероятно, будут отличаться по каналам Stable (Fallback), Beta и Cutting Edge (Experimental), но процесс его поиска будет таким же, как и выше.

Реализация

Теперь нам нужно найти идентификатор процесса OSU! и обработать его. Существует много разных способов сделать это, но вероятно проще всего использовать CreateToolhelp32Snapshot, а также Process32Next для перебора списка процессов.

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

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

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

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

Обязательно добавьте проверку для карт с AudioLeadIn time.

Вот где начинается настоящая забава. Возможно, вы ожидали, что эта часть будет сложной, но логика здесь на самом деле довольно прямолинейна. Мы ждем ‘start time’ текущего объекта, удерживаем ключ, ждем ‘end time’, а затем освобождаем его. После того, как мы выпустили ключ, мы переходим к следующему объекту и продолжаем, пока не достигнем конца beatmap.

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

Ну, теперь мы готовы скомпилировать и протестировать OSU!Relax!

Источник

Точность

Точность (аккураси, акка) — это оценка того, насколько вовремя игрок нажимает на ноты. Она измеряется в процентах и бывает трёх видов:

Игровые режимы

Формула расчёта точности для osu!

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

Пример с одной нотой:

osu!taiko

Формула расчёта точности для osu!taiko

В osu!taiko точность рассчитывается как сумма точностей нот, делённая на их общее количество. Точность ноты может быть GREAT (良) (cчитается как 100%), GOOD (可) (cчитается как 50%), или MISS/BAD (不可) (считается как 0%, а также сбрасывает комбо). Слайдеры (drum roll) и спиннеры не влияют на точность.

osu!catch

Формула расчёта точности для osu!catch

В osu!catch точность рассчитывается как количество собранных объектов, делённое на их общее количество (бананы при этом нигде не учитываются). Все объекты, кроме бананов, имеют одинаковое значение точности.

osu!mania

Формула расчёта точности для osu!mania

В osu!mania точность рассчитывается аналогично osu!.

График производительности

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

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

Accuracy

При наведении курсора на график всплывает окошко со значениями Error (отклонение) и Unstable Rate (разброс нажатий).

В связи с тем, как реализованы моды DT (Double Time) и HT (Half Time), значения Error и Unstable Rate будут умножены на коэффициент мода. Чтобы получить истинные значения при игре с DT, разделите их на 1.5. Аналогично, при игре с HT умножьте их на 1.33.

Error (отклонение)

Error показывает два числа: среднее значение всех ранних и всех поздних ударов по нотам. Чем выше Overall Difficulty карты, тем меньше вы должны отклоняться от идеальных нажатий, чтобы набрать высокую точность.

Unstable Rate (разброс нажатий)

Unstable Rate отражает то, как стабильно вы нажимаете на ноты, и чем ниже это значение, тем лучше (у игроков высокого ранга оно почти всегда меньше 100). Обратите внимание, что разброс нажатий показывает не точность, а насколько размеренно вы нажимаете на ноты. Если вы всегда попадаете по ним очень поздно, но опаздываете примерно на одно и то же время, это число будет таким же низким, как и при стабильных нажатиях вовремя. По сути, разброс нажатий — это их стандартное отклонение в миллисекундах, умноженное на 10. С тем, как оно считается в стабильной версии osu!, можно ознакомиться с помощью кода, выложенного peppy.

Примечание: Spin отображается только для osu!.

Вместе с информацией о точности можно посмотреть статистику по спиннерам.

Speed (скорость вращения)

Speed — это средняя скорость вращения, или RPM (число оборотов в минуту) на всех спиннерах карты. Значение с припиской Max показывает самую быструю скорость вращения, которой достиг игрок на карте.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *