Annatar, Castlevania: The Lecarde Chronicles (
скачать) на движке от Clickteam, судя по DLL и дате выхода игры (2013 год) это версия Multimedia Fusion 2 (MMF2). После запуска игры, основные файлы движка будут распакованы в %temp% (stdrt.exe, mmf2d3d9.dll и т. п.), ресурсы будут грузиться из
ctlc data d.exe. Патчить файлы движка, полагаю, будет непросто. С помощью Cheat Engine я нахожу здоровье, которое равно 80 (0x50), там всегда 4 адреса с этим значением, 3 из которых зависимы, но адреса после смены уровня или смерти меняются, так что придётся каждый раз искать.
Есть способ автоматизации для одичалых: после запуска игры значения после адреса жизни не меняются. После запуска игры находим адрес здоровья, подставляясь под врага, из 4 найденных адресов меняем каждый, пока не найдём тот, от которого зависят другие. В Memory View после нашего адреса жизни копируем 79 байт. В Memory View открываем Tools > Lua Engine. Вводим скрипт, который сделал на
основе первого попавшегося результата:
aobresult = AOBScan("СЮДА 79 БАЙТОВ")
if (aobresult ~= nil) then
print("Results found: "..aobresult.Count)
local addressList = getAddressList()
if aobresult.Count>0 then
print("First result="..aobresult[0])
local hp1 = addressList.getMemoryRecordByDescription('HP1')
if hp1 == nil then
hp1 = addressList.createMemoryRecord()
hp1.setDescription("HP1")
end
hp1.setAddress(string.format("%x", tonumber(aobresult[0], 16) - 1))
hp1.Active = true
hp1.Value = "80"
end
if aobresult.Count>1 then
print("Second result="..aobresult[1])
local hp2 = addressList.getMemoryRecordByDescription('HP2')
if hp2 == nil then
hp2 = addressList.createMemoryRecord()
hp2.setDescription("HP2")
end
hp2.setAddress(string.format("%x", tonumber(aobresult[1], 16) - 1))
hp2.Active = true
hp2.Value = "80"
end
if aobresult.Count>2 then
print("Third result="..aobresult[2])
local hp3 = addressList.getMemoryRecordByDescription('HP3')
if hp3 == nil then
hp3 = addressList.createMemoryRecord()
hp3.setDescription("HP3")
end
hp3.setAddress(string.format("%x", tonumber(aobresult[2], 16) - 1))
hp3.Active = true
hp3.Value = "80"
end
aobresult.destroy()
aobresult = nil
else
print("No results found")
end
Вместо
СЮДА 79 БАЙТОВ вставляем байты как видим в хекс-редакторе (00 AB FF ...), если нажали Ctrl+C в Memory View, то всё будет правильно. Теперь после каждой смены уровня, нажимаем Execute в окне Lua Engine, будут находиться от 1 до 3 адресов и добавляться в окно адресов HP1, HP2, HP3. Проблема в том, что после смены уровня CE будет перезаписывать какие-то байты, поэтому нужно улучшить скрипт, чтобы он перед изменением значения, когда оно уменьшается, проверял байты для поиска и искал заново, тогда можно будет находить жизнь только после первого запуска игры. Но я не разбираюсь в CE, так что может кто вам подскажет, как это сделать лучше.
--------
Оказалось хуже, через 16 байт от жизни идёт лимит жизни, а ещё через 16 байт текущая мана (зелёная шкала), и после через 16 байт лимит маны. Ману не использовал, поэтому она не изменялась. Поэтому нужно искать без учёта маны, а если лимиты жизни/маны меняются, то и это учитывать.
--------
Сразу не догадался, вы можете просто повысить лимит. Находите жизнь, как описывал выше, через 16 байт будет 0x50, меняете на байты FF FF FF (это 16777215 HP), жизнь тоже до FF FF FF. Позже после смерти будет снова FF FF FF.