В теме показано как искать неизвестное значение
Рассмотрены некоторые особенности поиска неизвестных значений и координат
Поиск неизвестного значения применяется, если вы не знаете точно, каким является значение, например, если оно отображено просто заполняющейся полоской, или в странном формате (например как формат времени).
В этой статье показано как найти координаты персонажа на примере игры Terraria.
Сначала откройте игру и подключитесь к процессу с помощью Cheat Engine, как показано в предыдущей статье:
Теперь перейдите в игру, так как неизвестно, какие у персонажа координаты, и когда они увеличиваются, а когда уменьшаются, предположим что увеличиваются они если персонаж перемещается вправо, а уменьшаются влево. Для удобства поставьте в игре ограничительные блоки:
Установите персонажа впритык к самому левому:
Поставьте игру на паузу и перейдите в Cheat Engine, там выберете поиск неизвестного значения из списка:
Нажмите First Scan, не появится никаких значений слева, но должно показать общее их количество:
Теперь перейдите в игру и передвиньте персонажа вплотную к следующей отметке:
Перейдите в Cheat Engine и выберите Scan Type как Increased value (увеличенное значение):
После этого нажмите Next Scan, если вы всё сделали верно и поиск успешен то сверху появятся значения и их общее количество (около Found) уменьшится:
Значений слишком много и нужно провести отсеивание, для этого передвигайте персонажа и выбирайте тип следующего поиска в соответствии с этим, переместите персонажа снова впритык к левому ограничителю:
В Cheat Engine выберите тип поиска Decreased value (уменьшенное значение):
После этого нажмите Next Scan:
Если вы всё сделали верно то количество значений должно уменьшиться. Продолжайте перемещать персонажа вправо и влево производя соответствующий отсев, выбирая "Увеличилось" если персонаж стоит правее чем при прошлом поиске, и "Уменьшилось" если левее. Если вы совершили ошибку, например перепутали стороны поиска и поняли это, не обязательно начинать новый поиск, вы можете вернуться к результатам предыдущего отсева нажав Undo Scan.
Когда значений останется меньше и вы заметите что их количество от поиска к поиску уменьшается слабо, стоит использовать отсев с указанием "Не изменилось", для этого сдвиньте персонажа в определённую сторону, выберите соответствующий поиск (уменьшилось/увеличилось) и проведите его, после этого вернитесь в игру и не перемещайте персонажа с позиции последнего поиска.
Позвольте ему немного постоять на месте и перейдите назад в программу, выберите тип поиска Unchanged value, это значит что вы хотите что бы Cheat Engine убрал все значения из списка которые изменились с прошлого поиска и оставил лишь те которые не изменились, если персонаж не двигался с прошлого поиска то его значение должно попадать в диапазон:
Произведите поиск:
Количество значений довольно заметно сократилось. Теперь, не перемещая персонажа продолжайте возвращаться в игру, а потом в Cheat Engine и нажимать Next Scan с выбранным Unchanged value, пока количество значений ещё сильнее не уменьшится:
Значений всё равно много, что бы их уменьшить стоит прибегнуть к сравнению с первым поиском, именно для этого персонажа устанавливали вплотную к ограничителю из блоков. Поставьте персонажа в точно такое же положение как при первом поиске:
Перейдите в Cheat Engine и поставьте галочку на Compare to first scan, тогда при следующем нажатии Next Scan программа будет сравнивать значения не с результатом прошлого поиска, а с результатом самого первого:
Выберите тип Unchanged value, потому что персонаж стоит в той же позиции что и при первом поиске и произведите отсев:
Значений стало меньше, но всё равно ещё слишком много. Не забудьте снять галочку с Compare to first scan когда сдвините персонажа с позиции. Что бы ещё уменьшить их количество, попробуйте сделать что то необычное. Поиск производился для координаты X персонажа, то есть для горизонтального положения, поэтому попробуйте уменьшить другую координату, опустите, или поднимите его:
После этого произведите отсев с параметром "не изменившееся":
Значений стало намного меньше, но всё равно ещё слишком много. Что бы ещё уменьшить их количество, попробуйте увести персонажа далеко вправо от позиции начального поиска:
И проведите отсев увеличившегося значения:
Значений стало ещё меньше, вернитесь в изначальную позицию и произведите отсев уменьшившегося значения:
Количество значений не изменяется, это значит что дальше отсеять уже нельзя. Все эти значения относятся к разным объектам на экране, позиция персонажа, позиция камеры, позиция шляпы персонажа и прочего, поэтому их так много. Такая ситуация возникает довольно часто и что бы найти нужное значение координаты X персонажа - нужно проверять их.
Выберите все значения и добавьте их в таблицу, для этого нажмите на любое значение в окне поиска и нажмите Ctrl+A
на клавиатуре что бы выделить все значения, после чего нажмите на красную стрелочку, все значения переместятся в таблицу:
Для нахождения нужного значения, выделяйте и замораживайте группы значений, что бы они не могли изменяться и пробуйте перемещать персонажа в игре. Для заморозки значений выделите несколько из них мышкой, для этого нажмите на первое, потом зажмите клавишу шифт и нажмите на следующее, выделятся все значения между ними включая их самих:
Для того что бы быстро заморозить, или разморозить значения, нажмите пробел находясь в активном окне Cheat Engine:
Перейдите в игру и попробуйте переместить персонажа вправо, или влево:
Персонаж перемещается, но дёргается небо и облака, значит это не нужные значения. Удалите выделенные значения нажав клавишу Del
на клавиатуре, если они вам не нужны, или просто снимите с них заморозку нажав пробел. Выделите следующую группу значений и повторите процедуру.
Для удобства и быстроты поиска, самый эффективный способ это выделять и замораживать сразу половину от всех значений в таблице, проверять в игре, может ли персонаж перемещаться по X, если искомое значение будет среди них и он не сможет, вы сможете сразу удалить другую половину значений в таблице и повторить процедуру с половиной оставшихся значений:
После нескольких повторений осталось лишь несколько значений:
Так как персонаж может перемещаться, значит верхние значения не нужные, удалите их:
Теперь можно поочерёдно замораживая значения и проверяя игру, найти нужное:
Остальные значения можно удалить:
Сравним значение в позиции около первого ограничителя и около второго:
И у второго:
Вы можете записать эти числа и в дальнейшем, после перезапуска игры без труда найти нужное значение с помощью поиска точного значения из предыдущей статьи. Как сделать что бы значение не нужно было каждый раз искать рассказано в следующих статьях.
Теперь вы можете заметить, что значение координат выглядит странным слишком большим. Можно проверить свои подозрения, попробовав изменить его тип, как программа читает его из памяти, для этого два раза кликните на "4 Bytes" в строке Type, появится окно выбора типа:
Выберите тип float и посмотрите как изменится внешний вид значения:
Посмотрите как оно выглядит в первой и второй позициях:
Теперь оно приняло читаемый вид и можно попробовать вычислить расстояние, которое занимает один блок в игре, посчитав блоки между столбиками и разделив разницу между вторым и первым значением на это количество, получится (51340 - 51280) / 4 (блоков 5, но персонаж занимает 2 блока, потому -1 блок будет 4) = 15
Для проверки попробуем вычесть из значения около правого столба 30 и записать его, посмотрев, на сколько блоков переместится персонаж, производить арифметические операции можно прямо в строке изменения значения:
Персонаж переместился ровно на 2 блока влево, значит всё посчитано верно.
Это было математическое отступление, а теперь нужно найти вторую координату, что бы перемещать персонажа не только вправо и влево, но и вверх и вниз.
Можно начать новый поиск, но сначала попробуйте добавить значение по адресу расположенное прямо следующим за этим, так как координаты обычно располагаются рядом. Есть разные виды расположения координат, x y
, x y z
, x z y
, и прочие, это двухмерная игра, поэтому стоит попробовать проверить первый тип, для этого продублируйте значение в таблице, выделив его, нажав Ctrl+C
и затем Ctrl+V
, после того как вы сделаете это, появится окно спрашивающее, как добавить значение:
В нём можно указать на сколько сместить адрес, чем заменить и прочее, сейчас просто нажмите кнопку Paste ничего не меняя, значение появится в таблице:
Для удобства назовите первое значение "X", для этого кликните дважды на No description и введите свой текст.
Что бы проверить, находится ли координата Y поблизости, нужно изменить адрес только что добавленной записи. Для этого нажмите на адрес в графе Address второго значения и добавьте к адресу 4, так как тип float занимает 4 байта, а получить нужно значение идущее следующим:
Как только вы введёте + 4, вам станет видно какое значение располагается по этому адресу, если оно выглядит адекватным, тогда можно нажать OK и адрес в таблице изменится. Если бы поиск начинался с Y, тогда для получения X нужно было бы вычитать 4, а не добавлять. Помните что адрес считается в байтах в шестнадцатеричной системе счисления.
Для проверки попробуйте изменить значение, например добавив к нему 60 (4 блока):
Персонаж переместился вниз, значит координата Y тем больше, чем ниже персонаж в этой игре (обычно наоборот).
С этими значениями вы можете перемещать персонажа по всей карте в любое место. Как это делать удобнее можно узнать из следующих статей.