Полезные советы


  • Некоторые игры хранят значения (особенно количество жизней) на одну единицу больше или меньше. Например, у вас 3 жизни, они могут храниться как 4 жизни (3 осталось + 1 текущая), и как 2 (в этом случае 0 означает последняя жизнь).

  • Поиск диапазона значений бывает крайне полезен, хранимое значение может отличаться от видимого на единицу и более, в результат эффекта задержки или просто игра так хранит значения. Поэтому, иногда полезно искать примерное значение, особенно для таймера. Например, 100 секунд нужно искать диапазоном от 98 до 102.

  • Если Вы ищите параметр, значение которого не знаете, используйте поиск неизвестного значения. Или если Вы не можете найти ничего обычном поиском. В игре Mass Destruction броня хранится умноженной на 6, то есть у вас броня 1000, а хранится 6000. Поэтому поиском точного значения ее не найти. Чередуйте условия отсеивания (увеличилось, уменьшилось) это уменьшит количество шагов. Потеряйте немного брони и сделайте отсеивание "уменьшилось", а потом восстановите и сделайте "увеличилось". Если Вы всегда будете делать "уменьшилось" то потратите в два раза больше времени.

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

  • Часто адреса некоторых значений меняются при переходе на новый уровень. В игре Shadows of the Empire жизни и очки хранятся всегда по одному адресу. А адрес жизни меняется при переходе на новый уровень. В игре Commandos патроны снайпера всегда меняют адрес при инициализации уровня, случайным образом. Поэтому в этом случае нужно искать указатель. В случаях неработоспособности адресов при перезапуске не забывайте использовать "Авто изменение адресов".

  • Значение может храниться умноженное на определенное постоянное число. В игре Mass Destruction броня умножена на 6. В игре Warcraft 3 золото умножено на 10.

  • Значение может храниться суммированным с определенным постоянным числом. Например, 100 патронов хранится как 12300 (12200+100), а 50 патронов 12250 (12200+50), 0 патронов 12000.

  • Также игра может хранить жизнь более детально, чем выводит на экран. На экран выводит целые проценты, а хранит еще десятые доли. Например, 1 жизнь может быть представлена от 0 до 10, то есть это десятые. Возьмем 2.2%, игра на экран выводи просто 2, а хранит как 22 (2*10+2). А 2.8%, игра тоже выводи просто 2, а хранит как 28 (2*10+8). Это может быть не десятая доля, а пятая или третья.

  • Здоровье хранится как повреждение. Когда здоровье уменьшается, при этом повреждение увеличивается. Когда повреждение максимум Вы умерли. То есть если Вы не можете найти здоровье, тогда попробуйте искать повреждение.

  • Иногда игра работает со слотами. Например, игра MDK работает со слотами. Есть адрес, где хранится тип предмета, и второй адрес, где хранится его количество. Кроме того, есть адрес, где хранится счетчик слотов (количество занятых слотов). Если Вы измените тип предмета, то Вы превратите один предмет в другой. Если Вы хотите увеличить вместимость персонажа, меняйте счетчик слотов.

  • Несколько значений может храниться по одному адресу. Байт состоит из 8 битов. Игра Frogger использует это при собирании лягушат. Если Вы нашли зеленого лягушонка, то это первый бит значение 1, желтого лягушонка, то это второй бит значение 2, фиолетового лягушонка, то это третий бит значение 4, голубого лягушонка, то это четвертый бит значение 8, красного лягушонка, то это пятый бит значение 16. Тогда состояние когда собраны все лягушки равно 31 (1+2+4+8+16). Это двоичная арифметика.
    - значение 1 - 1-ый бит включен
    - значение 2 - 2-ой бит включен
    - значение 4 - 3-ий бит включен
    - значение 8 - 4-ый бит включен
    - значение 16 - 5-ый бит включен
    - значение 32 - 6-ой бит включен
    - значение 64 - 7-ой бит включен
    - значение 128 - 8-ой бит включен

  • Значение может храниться по нескольким адресам. Например, значение денег 1244, может храниться по двум адресам. По первому адресу 12, по второму 44. А может и по четырем, под каждую цифру свой адрес.

  • Требуется перезарядка оружия. В игре Half Life перед каждым поиском нужно делать перезарядку оружия, иначе ничего не находилось.

  • Требуется смена оружия. Например, Я искал количество патронов для дробовика, он был у меня в руках, с помощью поиска точного значения. После 14 отсеиваний осталось 80 адресов. Тогда я поменял оружие в руках на пистолет. И сразу после пятнадцатого отсеивания остался только один адрес.

  • Значение может храниться перевернутым. Игры таким способом скрывают значения. Например, 1234 хранится как 4321.

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

Автор: 2002 (c) Oliver Sahr.
Перевод: 2005 (c) System SoftLab.

В хелпе очень много полезной информации, но её иногда явно не достаточно. Хотел поделиться некоторыми "хитринками". Авось кому помогут. Тем более, что разработчики игр нынче не глупые пошли и пытаются:
  1. Кодировать свои значения
  2. Ограничить вход/выход из игры горячими клавишами
  3. Делать сразу и то и другое
Как бороться с первой проблемой вскользь упоминается в хелпе. Но на этом стоит акцентировать внимание. Самые популярные для взлома значения - деньги и навыки. Рассмотрим основные проблемы, с которыми можно столкнуться.
  1. Деньги невозможно найти никакими способами (как было в КР или империум галактике). Самое простое в таком случае это не сидеть и искать часами значение, а пораскинуть мозгами и найти смежные значения (те, которые влияют на цену). Так, к примеру, в КР было сложно найти деньги, но я нашёл износ детали, взломал износ, поставил на несколько миллиардов и цена на деталь резко (в тысячи раз =)) возросла... В галактике же это были люди на планете. На день я ставил на планете до %%% людей и получал до %%% бабла =) С навыками, примерно, так же...
  2. Теперь об ограничении входа/выхода. Если ограничение входа в игру после Alt+Tab, то надо делать так: запустить игру, свернуть, искать значение, убить её, запустить снова, изменить значение, свернуть, выбрать её как процесс, отсеять, убить и т.д. Если на выход, то Alt+Ctrl+Del обычно справляется.
В 3-ем пункте уже надо применять логику и действовать по обстоятельствам.

Спасибо за внимание.

Автор: 2003 (c) Defil (defil@pisem.net)
Здесь описаны способы нахождения значений в эмуляторах приставок, компьютеров и аркадных автоматов. Этими же способами можно искать в любых эмуляторах (мобильных телефонов и пр.), и в ПК-играх. Эмуляторы обычно позволяют сохранять текущее состояние в игре - это так и называется "Save state", иначе "Quick save state", " Save snapshot".

1. Поиск значения, представленного на экране цифрами (иногда значение бывает представлено не цифрами, а графическими элементами, например две жизни - два самолета.). Количество жизней обычно ищется поиском точного значения. Я обычно нахожу, начав с поиска диапазоном значений (если на экране 3 жизни: значение больше или равно 2 и меньше или равно 4), потом теряю одну жизнь - отсеиваю "уменьшилось на 1" и т.д. Или аналогичным способом по формуле:
На экране число 3 - сохраняем дамп памяти в ArtMoney PRO (будет состояние M1)
На экране число 2 - сохраняем второй дамп памяти (будет M2)
На экране 1 - сохраняем третий дамп памяти (будет M3)
И далее по формуле:
(M1>=2)and(M1<=4)and(M1=M2+1)and(M2=M3+1)
или же (M1>=2)and(M1<=4)and(M1=M2+1)and(M1=M3+2)

1.2. Поиск неизвестного значения. Допустим, нужно найти адрес, отвечающий за полоску жизни. Два примера:
1.2.1 Здоровье хранится как полоска, значение уменьшается, соответственно уменьшается и здоровье. Вариант поиска полоски на уменьшение:
Сохраняемся, когда у нас 100% жизни, ищем в ArtMoney -"неизвестное значение" - "целое 2 байта" (в различных случаях надо выбирать "целое 4 байта", иногда "4 байта с точкой" - об этом в конце статьи). Пропускаем удар - отсеиваем "уменьшилось". Грузим сохранение - "увеличилось" (также можно дождаться следующего раунда). Без ранений проводим какое-то время в игре - "не изменилось". И так далее. Нередко заодно находится и адрес таймера. И может быть еще дополнительный адрес, отвечающий за длину полоски жизни на экране. Сохраняться можно сколько угодно, главное - оставить сохранение при 100% жизни, так будет удобнее. В версии PRO лучше использовать отсеивание по формуле - то же, просто сохранять дамп памяти при разных состояниях, как написано в руководстве. Пример:
На экране 100% полоски - сохраняем дамп памяти в ArtMoney PRO (будет M1). Также на этом шаге делаем быстрое сохранение игры средствами эмулятора.
Теряем чуть-чуть здоровья - сохраняем второй дамп памяти (будет M2)
Без новых ранений двигаемся в игре - делаем в игре что хотим, чтобы было максимум изменений (но лучше без перехода на другой уровень, ибо адреса могут измениться)- сохраняем третий дамп (будет M3)
Грузим наше быстрое сохранение с 100% здоровьем, после этого выполняем различные действия в игре, как и на предыдущем шаге, но так, чтобы оставалось 100% здоровья - сохраняем дамп памяти (будет M4)


После этого отсеиваем по формуле:
(M1>M2)and(M1=M4)and(M2=M3)and(M2>0)
Можно продолжить обычными отсеиваниями в случае необходимости ("уменьшилось/увеличилось/изменилось/не изменилось/больше 0")
Быстрые сохранения в эмуляторах позволяют очень быстро проделывать такие действия - не нужно искать бонусы для восстановления здоровья и т.п.

1.2.2. Если вышеуказанным способом найти не удалось, то вероятно здоровье хранится как повреждение, т.е. при 100 здоровья значение по нужному адресу равно 0, при каждом ранении постепенно увеличивается, при достижении определенного значения наступает смерть персонажа. Примеры таких игр - Pitfall the Mayan Adventure (SMD, Sega 32X, SNES, Atari Jaguar), World's Scariest Police Chases (PSX). В игре Red Zone на Sega Genesis здоровье вертолета хранится как повреждение (значение равно 0 при 100% здоровья), а здоровье игрока в миссиях за человека - в обычном виде, значение здоровья человека уменьшается от ранений.
На экране 100% здоровья - сохраняем дамп памяти в ArtMoney PRO (будет M1). На этом шаге делаем быстрое сохранение игры средствами эмулятора. Предполагается, что сейчас в памяти значение равно 0.
Теряем чуть-чуть здоровья - сохраняем второй дамп памяти (будет M2). Предполагается, что значение в памяти увеличилось.
Без новых ранений проводим какое-то время в игре - сохраняем третий дамп (будет M3).
Теряем ещё здоровье - сохраняем четвертый дамп (будет M4)
Грузим наше быстрое сохранение с 100% здоровьем, продвигаемся в игре без ранений- сохраняем дамп памяти (будет M5)
Предлагается две различных формулы - более "универсальная" и такая, которая включает точное значение 0.
Первая:
(M1< M[2,4])and(M1=M5)and(M2=M3)and(M2< M4)
Вторая:
(M1=0)and(M1=M5)and(M1< M[2,4])and(M2=M3)and(M2< M4)
Опять же, можно продолжать обычными отсеиваниями "уменьшилось/увеличилось/изменилось/не изменилось/больше 0/равно 0")

1.2.3. Кроме того, если уровень длины полоски больше миниального и меньше максимального, то можно дополнять отсеиваниями диапазоном (примеры даны, если используется беззнаковое целое):
Для типа 1 байт целое:
Больше 0 и меньше 255
Для типа 2 байт целое:
Больше 0 и меньше 65535
Можно и нужно также включать их в формулы.

2 Нужно найти адрес переменной, отвечающий за бессмертие, которое дается в начале уровня, после взятия приза, после пропущенного удара или респауна (Invincibility), с миганием (Flashing). Этот параметр позволяет избегать столкновений с врагами, ходить по шипам и т.п. Когда бессмертие есть, значение по этому адресу больше нуля, постепенно падает до нуля - по сути, это тот же таймер, только отсчет скрыт от пользователя. В некоторых играх это значение может быть другим - в игре Go Go Ackman 2 на SNES при "выключенном" бессмертии оно равно 2. Находим поиском незвестного значения, можно с условиями "изменилось/не изменилось" (наиболее универсальный способ), при желании можно "уменьшилось/увеличилось/изменилось/не изменилось/больше 0". Конечно же, Вы всегда можете отсеять на нулевое значение при «выключенном» бессмертии, но при этом не забывайте, что в настройках ArtMoney всегда должно быть включено «разрешить отмену отсеиваний». Тип переменной при поиске лучше всего выбирать целое 4 байта (можно целое 2 байта).
2.2. Важно - при таком поиске обычно находятся несколько адресов, обычно, 2-4 адреса (если выбран тип целое 4 байта или целое 2 байта). После того, как Вы нашли адреса неуязвимости, то нужно брать тот, размер у которого меньше ( целое 1 байт или целое 2 байта). Как объясняют это разработчики ArtMoney:
Если адрес 0001 и размер 4 байта, то он включает адреса 0001-0004. Адрес 0002 и размер 2 байта, включает адреса 0002-0003. Соответственно все эти три адреса с такими типами включают друг друга, если все работают, то логично верный тот у которого размер меньше.
2.3. В ряде игр при «включенном» бессмертии персонаж не может подобрать бонусы, те. просто проходит сквозь них. Например, в игре Sonic CD игрок не может подбирать кольца при таком состоянии.

3. Нужно найти адреса, отвечающие за координаты объектов. Например, хочется "пролететь" какое-то место в игре - поиском неизвестного значения можно найти адрес каждой координаты. Может быть так, что чем выше (для координаты Y) и левее (для координаты X) объект на экране - тем значение меньше. С вертикальными координатами может быть и наоборот - чем выше позиция объекта, тем больше значение.
Также бывают так называемые "неабсолютные" координаты - к примеру, один адрес отвечает за положение объекта на одном экране, а при переходе на другой экран за его положение отвечает уже другой адрес. Или же один адрес отвечает за какую-то часть экрана (например, половину экрана), а второй за другую часть. Для примера, в игре Phantom Fighter на Nes за положение игрока по оси X (горизонтальной оси) внутри помещений отвечают два разных адреса - за положение на левой части и на правой части, тип 1 байт целое. Может быть так, что за координаты отвечают переменные разных типов, например за координату X-целое 2 байта, а за координату Y - целое 4 байта - это может зависеть от того, на какие расстояния двигается объект. В 8-мибитных играх обычно это целое 1 байт, может быть целое 2 байта, в более новых играх 4 байта целое, в консолях выше первой PlayStation 4 байта с точкой, или же 8 байт с точкой (включая Nintendo 64) Пример - игра Dynamite Cop (Dynamite Deka 2) на Sega DreamCast и Sega Model 2 координаты объектов и камеры хранит как 4 байта с точкой. Если Вы будете искать переменные целых типов (т.е целое 1, 2, 4 байта), то смотрите пункт 2.2 этой статьи (про несколько адресов разных типов).
В "одноэкранных" играх вроде Galaga и Bomberman, а также многих 2D файтингов часто координаты хранятся как 1 байт целое. т.е. крайняя левая позиция игрока по оси X — значение равно нулю, крайняя правая правая позиция — значение равно 255.
Можно и нужно пробовать находить адрес следующей координаты, прибавляя к адресу предыдущей смещения 1h, 2h, 4h, 8h, 10h, 6h, A6h, 100h и т.д. Наиболее часто используется 4h - найдите адрес координаты X поиском неизвестного значения, после этого прибавьте к её адресу смещение 4h, получите адрес координаты Y или Z. То же касается адресов координат камеры. Для старых консолей и компьютеров типа Atari пробуйте прибавлять по 1 байту (+1h/-1h). В большинстве случаев проще найти адрес вертикальной координаты (Z, а также Y в двухмерных играх), и затем уже прибавлять к нему эти смещения. Или наоборот, есть игры, где проще найти адрес горизонтальной координаты, затем найти адреса остальных координат., прибавляя смещения. Также можно открыть редактор памяти на известном адресе координаты, затем скопировать близлежащие ячейки в правую таблицу и проверить перебором, есть ли среди них адреса других координат.

3.1 Если Вы нашли адреса координат неверным типом переменной, например 4 байта целое вместо 4 байта с точкой или 8 байт с точкой, то нужно открыть окно редактирования этого адреса и сменить тип на правильный, после чего пробовать нажимать мышью стрелки справа от поля "Адрес эмул." (для ПК игр и таблиц без настроек эмуляторов просто "Адрес"), один клик соответственно прибавляет/отнимает по одному байту. Таким образом, Вы получите верный адрес. Имеется в виду, что в трехмерных играх на консолях типа Nintendo 64, PS2 и т.п. для положения объектов и камеры используются типы 4 байта с точкой, 8 байт с точкой, но в ряде случаев можно найти такой адрес как 4 байт целое - целый тип в этом случае будет неверен. С другой стороны, есть очень много 2D игр - портов с других консолей/аркад/компьютеров и т. п. (к примеру, серия Metal Slug) - в них используется целый тип. Понятно, что переиздания игр с того же SNES на WiiWare используют целый тип. В современных 2D и 2,5D играх для хранения значений координат это обычно значения с точкой.

Существует много игр, в которых при замороженном значении по адресу координаты объект не может двигаться по другой оси координат - т.е. Вы не сможете левитировать влево-вправо и вперед-назад кнопками направления (стрелками) при замороженном адресе вертикальной оси координат. На этот случай нужно назначить горячие клавиши для прибавления/уменьшения значнения по адресам остальных координат. Для примера - игра Kula World на PlayStation и Moon Crystal на Nes.
Можно телепортировать игрока в какое-то место уровня. Проще всего это сделать, поставив в игре паузу, далее в ArtMoney заморозить адреса координат, изменить значения по этим адресам, далее снять паузу и в игре проверить эффект от изменений.

4. В случае если в игре меняются адреса.
4.1. Если адреса в игре меняются все вместе - используйте автоизменение адресов на всё, если не все - нужно предварительно разбить на группы, делать автоизменение на группу. ArtMoney также позволяет работать с эмуляторными указателями, действия поиска и отсеивания указателей подробно будут описаны ниже. Если Вы работали с указателями в играх под Windows, то в эмуляторах алгоритм тот же, только надо учесть некоторые особенности - отсеивать указатели нужно по эмуляторному адресу (открыть окно редактирования адреса - "Адрес эмул.", а не по адресу ПК. При поиске эмуляторных указателей нельзя отмечать "только статические адреса в модулях" и "модульная адресация".
Бывает так, что эмулятор использует DMA, хотя сама приставка не использует - например, в эмуляторе GameBoyColor - ROM Player[rew.] всё фиксировано, а в VisualBoyAdvance адреса каждый раз меняются. В эмуляторе DreamCast под названием Demul блок WorkRAM фиксирован, а в Chankast и NullDC память выделяется динамически. В таких случаях нужно просто автоизменять все адреса по одному адресу

4.2. Пример. В первом уровне находим адреса различных параметров, сохраняемся средствами эмулятора. Выбираем один из адресов, к примеру, адрес жизней, допустим что он хранит жизни точным значением. Делаем по нему поиск указателя на начало блока памяти. Далее в левой таблице сохраняем отсеивание в файл.
Переходим на другой уровень. Если адреса параметров в правой таблице стали нерабочими, то находим наш новый адрес жизней, по нему автоизменяем адреса. Делать это нужно так - в левой таблице выделяем новый адрес жизней, в правой - старый (нерабочий). Далее ПКМ - "Больше" - "Автоизменение адресов" - "Автоизменить адреса и скопировать в новую группу.". Задаем имя для новой группы (можно группы именовать по номерам уровней, к примеру). После этого таблицу сохраняем, причем адреса, найденные в первом уровне, также остаются в ней. Не забываем сделать быстрое сохранение в этом уровне.

Далее загружаем файл отсеивания указателей. Делаем отсеивание указателей - сделать это можно либо по "Точное значение", вписав новое значение по адресу жизней, либо по "Указатель", вписав в поле новый адрес (ПКМ на адресе жизней - скопировать адрес из поля "Адрес эмул."), добавив h в конце. Если отсеивание прошло успешно, то в левой таблице сохраняем отсеивание указателей в файл.
Далее переходим на следующий уровень, повторяем процедуру. - так же автоизменяем адреса, копируем в новую группу. Так же отсеиваем указатели, сохраняем отсеивание указателей.
Далее, если указателей осталось мало, можно перейти на другой уровень, найти адрес жизней, автоизменить адреса и скопировать в новую группу (получается уже четвертая группа адресов). Поскольку мы имеем таблицу с четырьмя группами адресов для четырех уровней, то можно в любой момент загрузить быстрое сохранение в любом из уровней, для которого у нас есть адреса в таблице, и отсеять указатели по эмуляторному адресу жизней из группы, соответствующей этому уровню. Во многих случаях можно обойтись меньшим количеством уровней - можно просто возвращаться на предыдущие уровни, загружая быстрые сохранения, а также через меню игры, внутриигровые сохранения/эмулируемые карты памяти или даже пароли на выбор уровня. Главное, чтобы отсеивание указателей проходило правильно.

После этого нужно сделать бэкап таблицы (обязательно), далее удалить из таблицы все группы адресов, кроме одной - это может быть любая на Ваше усмотрение, единственное условие - адреса в ней не должны быть рабочими перед установкой указателей, т.е. адреса в ней должны быть не для того уровня, в котором Вы в данный момент находитесь. Сохраняем таблицу под другим именем.
После этого нужно загрузить последний сделанный файл отсеивания указателей, выделить в левой таблице указатель (тот, что идет с наименьшим смещением), в правой - адрес жизней (напомню, что он сейчас нерабочий), и выполнить команду "Больше" - "Действия с указателями" -"Установить указатель" и выбрать, устанавливать указатели на всё или на группу. Если Вы все сделали правильно, то получим таблица с адресами, которые будут всегда актуальны, для всех уровней. Обычно указатели (как эмуляторные, так и указатели в обычных ПК играх) инициализируются только в момент загрузки уровня. То есть в стартовых меню игры или просто между уровнями адреса с указателями в таблице будут иметь значение <НЕТ> - это совершенно нормально. Как только уровень будет загружен, адреса станут рабочими.

Важно - GBA, Nintendo Wii, Sega Saturn и некоторые другие консоли используют два и более блока WorkRAM для хранения нужных Вам параметров - в таком случае нужно всегда разбивать адреса на группы, т.е. своя группа для адресов из каждого блока. Опять же, многие игры хранят значения различных параметров в разных блоках, то есть адреса меняются не все вместе, как написано выше, даже в случае с одним блоком WorkRAM - к примеру Contra 4 на NDS, Sonic The Hedgehog 4 Episode 1 на Wii (WiiWare). К примеру, игры серии CT Special Forces на PlayStation и Game Boy Advance хранят количество жизней, здоровье, оружие статично, а адреса координат игрока (положение персонажа в мире) и адрес неуязвимости (Invincibility) меняются в зависимости от уровня. Используются указатели первого уровня. Для этих игр (CT Special Forces 1-3) нужно статические адреса оставлять в основной группе, которую не нужно трогать вообще, а из динамических адресов найти все адреса для первого уровня, далее в следующих уровнях находить по одному эквивалентному адресу (лучше адрес координаты X или Y игрока, тип 4 байта целое, смещение между X и Y равно 4h) и по нему в следующих уровнях автоизменять адреса и копировать их в новую группу, каждый раз отсеивая указатели по этому новому адресу. Кроме того, в CT Special Forces есть миссии как за человека (горизонтальный скроллер), так и миссии на вертолете (вертикальный скроллер)- нужно находить адреса координат и неуязвимости отдельно для человека и вертолета, и указатели искать для человека и вертолета также отдельно. Миссии человека и вертолета чередуются, но, опять же, быстрые сохранения можно делать в любой момент игры, к тому же эмулятор Visual Boy Advance, PCSX-Reloaded и некоторые другие позволяют задавать произвольное имя для сохранения, не ограничиваясь стандартным количеством слотов.

Важно - никогда не устанавливайте указатели на статику, оставляйте ее в основной группе.
В справке ArtMoney читайте раздел "Использование указателей и автоизменение адресов".
В случае, если в игре обращение к переменным происходит через указатели выше первого уровня - нужно при поиске выбирать "Искать" - "Указатель на указатель", и задавать максимальный уровень указателя и максимальное смещение. Потом сохранять указатели в файл отсеивания, после перехода на другой уровень для отсеивания выбирать отсеять по "Указатель на указатель" (не просто по "Указатель"). Более подробное описание поиска многоуровневых указателей будет добавлено в другой раз.

5. Нужно найти таймер. Если поиском точного значения не получилось найти, надо искать поиском неизвестного значения с условиями "уменьшилось на/увеличилось на".Если все равно ничего не найдено - поиском неизвестного значения с условиями "уменьшилось/увеличилось", тип переменной целое 2 байта, если не получилось - целое 4 байта. И проверить этот адрес, после того как он будет найден, например если время измеряется в секундах - нужно поставить две секунды, подождать в игре три, если время не кончилось, то адрес правильный. Рекомендуется начинать поиск, когда значение секунд на экране равно 59 или меньше. Допустим, у Вас на таймере 2:00 - дождитесь когда будет 1:59, ибо есть вероятность того, что таймер хранится по разным адресам для минут и секунд. То есть при 02:00 по адресу секунд будет значение 0, а если Вы сперва выполните поиск неизвестного значения при нулевом значении, а потом значение изменится на ненулевое (59 или ниже), то отсеивание по условию "уменьшилось" отбросит адрес секунд. А при 1:59 вполне вероятно что значение будет 9 или 59. Конечно, всё зависит от конкретной игры. Пример - игра Batman на PC Engine/Turbografx 16. Есть игры, которые хранят каждую цифру в отдельном адресе - всем известная игра Super Mario Brothers на Nes каждую цифру из трех хранит в отдельном адресе, тип 1 байт целое. При этом адреса эти идут друг за другом подряд без всяких смещений, то есть искать нужно последовательность значений целое 1 байт: если на экране значение Time 127, то ищите последовательность значений 1, 2 и 7, тип 1 байт целое. Точно так же хранится время в Nes игре Kabuki - Quantum Fighter и в многих других.

Примеры формул:
1) Имеем четыре состояния, экранные значения таймера для них:
Первое состояние (M1) - экранное значение 27
Второе (M2) - экранное значение 24
Третье (M3) - экранное значение 19
Четвертое (M4) - экранное значение 17
Варианты формул:
Первый вариант - поиск точного значения: (M1=27)and(M2=24)and(M3=19)and(M4=17)
Второй вариант - поиск неизвестного значения:
(M1>M[2,3,4])and(M2>M[3,4])and(M3>M4)and(M4>0)
Третий вариант - отсеивание на интервал, таймер на уменьшение: (M1=M2+3)and(M2=M3+5)and(M3=M4+2) или (M1=M2+3)and(M1=M3+8)and(M1=M4+10)

2) Имеем два состояния, экранные значения таймера для них:
Первое (M1) - экранное значение 224
Второе (M2) - экранное знаечние 222.
Здесь можно использовать
(M1=224)and(M2=222)
(M1=M2+2)

6. При поиске надо выбирать эти типы:
"Целое 1 байт - количество жизней, других предметов, когда их мало, число выигранных раундов, иногда жизнь, время в игре, неуязвимость, координаты.
"Целое 2 байта - жизнь, другие значения, представленные графикой (полоска жизни), количество предметов, неуязвимость, время, координаты.
"Целое 3 байта - деньги, наиболее часто используется в играх жанра RPG и стратегиях, также другие параметры. Пример - деньги и Exp. Points в Final Fantasy 5 на PSX. Если игрой предусмотрено количество больше 65535, а поиск по целое 4 байта результата не дал, то искать надо целое 3 байта.
"Целое 4 байта - деньги, другие предметы, которых может быть больше 65535, лайфбары и другие параметры, отображающиеся графикой (обычно полоской) неуязвимость, время в игре, координаты.
"С точкой 4 байта - этот тип используется в консолях Nintendo 64, DreamCast, Gamecube, PS2, NDS и выше (в т.ч. ПК игры). Таким типом часто хранятся значения координат, особенно в больших 3D играх. Также таймеры и другие значения.
"С точкой 8 байт - также координаты и другие значения, например таймеры.
Во всех современных коммерческих трехмерных играх для хранения значений координат используется тип с точкой. В любительских играх может использоваться целый тип.
"Также может использоваться тип "Текст" для хранения имен персонажей, экранных значений и т.п. Примеры - яблоки в SMD игре Disney's Aladdin, имя игрока в игре Bloody Wolf на PC Engine/Turbografx, имена персонажей в различных играх жанра РПГ (Dragon Quest 8 на PS2).

7. Адреса, найденные для одной версии эмулятора, не подходят к другой версии. Нужно использовать настройки эмулятора - выбрать из списка нужную игровую систему и эмулятор. Версия эмулятора выбирается из списка автоматически, если контрольная сумма (MD5) файла запуска Вашего эмулятора совпадает с MD5 из списка. Если в списке этой версии эмулятора нет - нужно найти самостоятельно нулевой адрес эмулятора (читайте соответствующий раздел в руководстве), и указатель на него (если блок WorkRAM не фиксирован).

8. При сохранении в таблицу крайне желательно записывать, отличается ли значение в памяти от экранного, и насколько. (+1) - если в памяти значение на единицу больше, (-1) - если наоборот — на единицу меньше, и т.д. если значение меняется в случае смены персонажа (оружия, транспорта) или версии игры (рома или образа) - в комментарии. Эти значения надо проверять в игре, предварительно сохранившись в месте, где они сменяются - на экране выбора игрока и т.п. (начиная от этого места).

8.1. Кроме того, это помогает находить нулевые адреса в эмуляторах по известному адресу параметра. К примеру, есть адрес таймера отсчета времени на экране выбора игрока в игре Captain Commando на CPS1. Время на экране выбора игрока хранится в памяти точным значением, адрес в RAM (эмуляторный адрес) равен 00FF9275. RAM начинается с адреса 00FF0000. Когда выходит новая версия эмулятора (к примеру, эмулятор Final Burn Alpha), то можно запустить эту игру в эмуляторе, дождаться экрана выбора игрока, сделать паузу эмуляции, выполнить поиск значения таймера по всей памяти эмулятора, снять паузу на какое-то время, снова поставить паузу, отсеять на новое значение, после чего получим адрес таймера (у меня на 32 бит версиях эмулятора адрес находится после первого отсеивания). После этого к этому адресу прибавляем смещение -9275h, получаем нулевой адрес эмуляции. На это адрес нужно будет найти указатель, получим настройку новой версии эмулятора.

8.2.Также существуют эмуляторы, в которых порядок байтов отличается от используемого в самой консоли. В таком случае адрес будет не совпадать с физическим.
Например эмулятор Kega Fusion использует перевернутый порядок байтов, а сама приставка Megadrive/Genesis, ее аддон Sega 32X и консоль Sega Mega CD используют нормальный порядок байтов. Также перевернутый порядок байтов используют эмуляторы Mednafen (только в режиме эмуляции Genesis/SMD), и Gens Movie 11a/11b. Бывает и наоборот - приставка Sega Saturn и ее эмуляторы SSF и GiriGiri используют перевернутый порядок байтов, а эмулятор Yabause использует нормальный порядок байтов. Начиная с версии 7.39, ArtMoney автоматически выбирает порядок байтов для поиска в эмуляторе из базы.
Вы можете увидеть примеры поиска нулевого адреса в различных эмуляторах в разделе статей на официальном сайте ArtMoney:
https://www.artmoney.ru/r_articles.htm


Автор: 2012 (c) iddqd (iddqd@tv-games.ru)
Назад    Содержание    Вперед

Copyright (C) 1996-2017, System SoftLab.
Дата последнего обновления
27 июля 2017 года