Этот репозиторий содержит список входных данных, которые превзойдут Pokemon Platinum. Используя комбинацию техник и симуляций, прогресс в игре гарантирован. Здесь не используются манипуляции с генератором случайных чисел, не требуются точные входные данные, а последовательность входных данных статична и неизменна независимо от событий в игре.
Код симулятора можно найти здесь.
Входные данные можно найти в каталоге commands
. Каждый файл соответствует отдельной части игры, и каждый из них перетекает друг в друга от 1 до 9. Существует также вспомогательный файл для изменения памяти игры для тестирования и файл для записи входных данных во время игры.
Каждый командный файл содержит список команд в формате [
, где первое значение указывает, какую команду следует выполнить, а второе — сколько кадров удерживать эту команду. В тех случаях, когда команда представляет собой набор нажатий кнопок,
указывает, сколько повторений этой команды необходимо выполнить.
Основные команды следующие:
Команда | Описание |
---|---|
а | А |
б | Б |
уф | Вверх |
дф | Вниз |
лф | Левый |
рф | Верно |
ул. | Начинать |
х | Х |
й | Да |
уб | Вверх + Б |
БД | Вниз + Б |
фунт | Влево + Б |
РБ | Вправо + Б |
ш | Ждать |
Другие кнопки, такие как «Выбрать», «L» и «R», не используются.
В командных файлах используются дополнительные команды для представления набора этих основных нажатий кнопок. Например, чтобы нажать A 10 раз, в качестве сокращения используется {'press_a', 10}
, а не 10 команд подряд для удержания кнопки A в течение 60 кадров.
Каждый файл также определяет до 12 пользовательских команд, которые выполняют различные процедуры, такие как обработка почты в памяти, выполнение стандартных боевых действий или навигация по разделам игры, которые необходимо повторить.
Обратите внимание, что команды l
, r
, u
и d
— это сокращения для выполнения одного шага в направлении, а lf
, rf
, uf
и df
— это команды для удержания кнопки направления в течение определенного количества кадров.
Вместо того, чтобы писать команды вручную, если вы хотите изменить последовательность или создать новую, вы можете использовать файл recordInputs
вместе с эмулятором bizhawk для записи введенных вами входных данных, а затем вывести их в формате, который можно использовать в сценарии.
Чтобы записать ваши входные данные, сначала вы должны очистить горячие клавиши контроллера, т.е. запретить эмулятору напрямую использовать ваши входные данные в качестве команд. Вы можете сделать это через Config -> Controllers -> Misc -> Clear
. Вы можете загрузить горячие клавиши позже, выбрав Misc -> Load Defaults
в том же меню.
Затем вы должны открыть консоль Lua через Tools -> Lua Console -> Script -> Open Script
, где затем открыть скрипт recordInputs.lua
. Как только скрипт запустится, он запишет ваши входные данные.
Горячие клавиши кнопок перечислены в файле recordInputs.lua
, но наиболее важными из них являются lshift
, который выводит список форматированных команд, когда вы закончите запись, и rshift
, который добавляет команду времени ожидания на 60 кадров. Устройство записи ввода НЕ записывает время простоя, то есть, если вы не добавите время ожидания с помощью rshift
, оно будет просто быстро выполнять команды одну за другой, без перерывов.
Это приводит к тому, что выходной список входных данных и то, что вы на самом деле делали во время игры, будут отличаться. Можно легко забыть добавить время ожидания, что вызовет проблемы при воспроизведении. Но в качестве преимущества нет необходимости записывать входные данные по таймеру.
Остальные клавиши соответствуют значениям по умолчанию для эмулятора: клавиши со стрелками для перемещения, x
, z
, s
, a
для A
, B
, X
, Y
и enter
для запуска.
Могут быть некоторые нестабильности с сенсорным управлением, которое является обязательным в самом начале игры. Для продвижения необходимо коснуться середины экрана, попав в центр покебола. Это нестандартный аналоговый вход, который в коде обозначается как touch_middle
. Это происходит только один раз.
Также существует вероятность того, что входные данные не учитывают что-то, о чем я просто не знаю или не думал проверять. Эта человеческая ошибка присутствует всегда, независимо от того, сколько раз я проверял и перепроверял последовательность действий на наличие проблем и ошибок.
Pokemon использует генератор случайных чисел Linear Congruent (LCRNG) для создания большей части своих случайных чисел. Это работает путем создания последовательности чисел, которая выглядит достаточно случайной, а затем последовательного прохождения последовательности для получения «случайных» чисел.
Игры про покемонов четвертого поколения отличаются от своих предшественников тем, что в них не происходит циклического перебора случайных чисел, а используется случайное число только тогда, когда оно необходимо.
Например, в Ruby/Sapphire/Emerald игра будет проходить через последовательность случайных чисел каждый второй кадр, даже если в игре ничего не происходит, и выдавать любое число, которое находится в данный момент, когда игра его запрашивает.
В Diamond/Pearl/Platinum генератор случайных чисел остается неизменным до тех пор, пока игра не запросит значение. Это означает, что если вы стоите в пустой области игры, генератор случайных чисел ничего не сделает.
Если вы моделируете все возможные результаты генератора случайных чисел для данного действия, скажем, подбрасывания монеты, в играх четвертого поколения этот результат будет детерминированным (при условии, что вы находитесь в пустой или «тихой» зоне) независимо от вашего времени.
В играх третьего поколения этот результат не является детерминированным и зависит от вашего выбора времени. Это означает, что если вы подбросите монету сейчас, результат может быть иным, чем если бы вы подбросили ее две секунды спустя.
Для наших целей это качество игр четвертого поколения делает так, что даже если игрок-человек использует этот список входных данных для игры, он все равно будет работать правильно, поскольку игрок-человек не будет вводить входные данные в определенное время, и либо нажимайте кнопки немного раньше, либо немного позже. Пока кнопки не нажаты слишком рано, вы можете отложить их на неопределенное время, не влияя на результат игры (при условии, что вы в конце концов нажмете кнопки).
Используя этот принцип, моделируя все 4 миллиарда возможных семян или стартовых позиций в последовательности случайных чисел Pokemon Platinum, мы можем предсказать, что произойдет во всех возможных играх. Например, подбрасывание монеты 100 раз имеет детерминированное количество результатов. Проверив их все, мы можем обнаружить худший/лучший сценарий, который в данном случае представляет собой разделение 80/20.
В случае подбрасывания монеты этот процесс очень похож на использование математических вычислений для определения ожидаемого значения с помощью простой статистики. В более сложных вещах, таких как сражения покемонов, становится гораздо сложнее использовать математику для определения результата. Легче смоделировать все 4 миллиарда возможностей, чем вычислить вероятность с учетом шанса критического удара, промаха, бросков на урон, сигнала ИИ, шансов на вторичный эффект и т. д.
Это дает нам представление о том, какие стратегии выигрывают в каждой возможной игре, и позволяет мне побеждать разных тренеров со 100% уверенностью, даже если математически существует шанс потерпеть неудачу или проиграть.
Конечным результатом является эта последовательность входных данных, которая должна превосходить каждую платиновую игру от начала до конца без каких-либо шансов на неудачу, за исключением неправильных входов или ошибок.