Перейти к содержанию

Лидеры

Популярный контент

Показан контент с высокой репутацией 02.11.2014 во всех областях

  1. В общем я решил по настроению сделать пошаговую инструкцию для новичков по взлому игр Dendy, NES и Nintendo. И так приступим... 1: Скачиваем с интернета эмулятор FCEUX v2.2.22: Запускаем эмулятор и открываем с помощью него игру, например - Contra (U) [!].nes.3: Начинаем играть в игру и видим две жизни у нашего героя.4: В меню эмуляторе нажимаем на Tools > Cheats, появится окно поиска адресов.5: В этом окне жмём на кнопку Reset, справа появится адреса и их значения.6: Далее вводим значение 02 где 0x 00 и жмём на кнопку Known Value.7: Переходим обратно в игру и теряем одну жизнь и опять переходим в окно Cheats Search.8: Вводим значение 01, где 0x 02 и жмём опять на кнопку Known Value.8: Так проделываем пока не будет один адрес: 0032 это и есть адрес наших жизней.9: Далее в меню эмулятора нажмите на Debug > Degugger появится большое окно отладчика.10: Справа с верху есть три кнопки две из-них не активны и одна кнопка с названием Add нажмите на неё.11: Появится окно Add BreakPoint, вводим в поле где адрес, наш адрес жизней 0032 - 0032 и ставим галочку где Write и жмём ОК.12: Переходим обратно в игру и теряем ещё одну жизнь, сразу должен сработать бряк в отладчике и он покажет в самом верху слева нашу инструкцию уменьшения жизней 07:DA03:D6 32 DEC $32,X @ $0032 = #$0213: Подводим к этой инструкции курсор мышки, в самом низу отладчика будет отображаться информация.Информация: CPU Address 07:DA03, Offset 0x01DA13 in file "Contra (U) [!].nes" (NL file: 7)14: Далее в меню эмулятора нажмите на Debug > Game Genie Decoder/Encoder появится окно создания кодов.15: Вводим в поле Address - DA03, в поле Compare вводим значение в НЕХ'е D6, а где Value вводим значение НЕХ'е 60, справа верху появится наш Game Genie код ATEIUZVI. Вот мы и сделали свой Game Genie код на вечные жизни. Пояснение:DA03 - Это адрес где сработал наш бряк на уменьшение жизней.D6 - Это первый байт нашей инструкции (07:DA03:D6 32 DEC $32,X @ $0032 = #$02).60 - Это байт инструкции RTS, которая затирает наш оригинальный байт D6, что бы жизни в игре не уменьшались. Как вшить этот чит-код в игру на вечные жизни, что бы больше не париться для его ввода? 1: Скачиваем с интернета программу WinHEX желательно русскую, не забудьте ввести ключ продукта для активации, а лучше скачивайте крякнутую или портейбл версию, ну или любой другой НЕХ-Редактор.2: Запускаем программу WinHEX и перетаскиваем в неё туда файл игры Contra (U) [!].nes.3: Появится много чисел и букв, это называется НЕХ-Кодами.4: Далее в меню программы жмём Навигация > Перейти к смещению, появится окно.5: Вводим в поле наше смещение 01DA13 и жмём ОК (Это смещение выдал наш отладчик в информации или где мы создавали Game Genie код, там он тоже отображался пока игра была запущена).6: И мы сразу перейдём на наше смещение и увидим знакомый нам код инструкции D6 32.7: Заменяем D6 на 60 и жмём в программе WinHEX сохранить, то есть жмём на дискетку с изображением верхнем в левом углу программы.Вот и всё, закрываем программу WinHEX, запускаем эмулятор с игрой и наслаждаемся.
    3 балла
  2. Итак, Adventure Island, первая часть. так и не прошёл в детстве, хоть сейчас отыграюсь))) Проходим до конца уровня и сохраняемся. Открываем RAM Search и ищем единичку(первый уровень). Проходим на 2-й и ищем двойку. Нету. Хм. Попробуем на 1-м уровне поискать ноль, а на втором единицу. Находится десяток адресов, но интересный первый 0038. Ставим в Debugger'e бряк на запись по этому адресу, вываливаемся по адресу 815B: 00:815B:E6 38 INC $0038 = #$00 это увеличение номера round'а. Запомнили место, пригодится если надо будет прыгнуть на следующий уровень. Идем ниже по коду. В 0037 номер area, запомнили. Идём дальше. Вот он прыжок на начало уровня: 00:816F:4C 9A 80 JMP $809AТеперь можно писать скрипт. Напишем функцию обратного вызова для нажатия на кнопку перехода: cheats = { --название таблицы с функциями обратного вызова, пока только одна функция пусть будет "toLevel" ["toLevel"] = function(...) --в функцию передаются некоторые параметры local val, area, round = {...}, nil, nil --пишем их в таблицу val, а также заведём локальные переменные area и round area, round = tonumber(val[1]), tonumber(val[2]) --переписываем параметры в соответствующие переменные ---------------------------------- --если переход запускается из меню memory.writebyte(0x003F, 3) --устанавливаем кол-во жизней memory.writebyte(0x0076, 10) --сытость memory.writebyte(0x0528, 10) --сытость memory.writebyte(0x0077, 0xFF) --сытость --------------------------------- if (area == 0) or (round == 0) then --если любой аргумент равен 0 будем прыгать на след. уровень memory.setregister("pc", 0x815B) --прыгаем на место увеличения round, дальше игра сама разберётся print("Jumped to next level") --печатаем в консоль else --если переход на конкретный уровень memory.writebyte(0x0037, area-1) --записываем в area и round значения memory.writebyte(0x0038, round-1) --на 1 меньшие memory.setregister("pc", 0x809A) -- и прыгаем на начало уровня print("Jumped to area "..area..", round "..round) --печатаем для отладки end end}Теперь напишем интерфейс и зададим функцию обратного вызова для кнопки: function winDraw() -- переход на уровень levelSpinArea = iup.text{ --спиннер для area spinmin = 0, --ограничиваем значения spinmax = 8, --от 0 до 8 spin = "YES", readonly = "YES" --только чтение(от шаловливых ручек) } levelSpinRound = iup.text{--спиннер для round spinmin = 0, spinmax = 4, spin = "YES", readonly = "YES" } levelButton = iup.button{ title = "GO", --надпись на кнопке action = function(self) --функция обработки для кнопки, передаём два параметра cheats["toLevel"](levelSpinArea.spinvalue, levelSpinRound.spinvalue) end } levelLabel = iup.label{ --надпись с пояснением как пользоваться title = "if (area or round) = 0 then jump to next level" } level = iup.frame{ --пространство обведённое рамочкой title = "To area(1-8) round(1-4)", iup.vbox{ --вертикальный контейнер для элементов iup.hbox{ --внутри горизонтальный контейнер для элементов levelSpinArea, --пихаем спиннер для area levelSpinRound, --пихаем спиннер для round levelButton --кнопку }, levelLabel --ну и надпись ниже }, size = "85X20" --размер фрейма } dialogs = dialogs + 1 --увеличиваем на 1 диалог для обработки handles[dialogs] = iup.dialog{ --и создаём его title="Adventure Island Trainer +1 by A1t0r", --заголовок окна resize = "NO", --без ресайза size = "220X50", --размер окна iup.hbox{ iup.vbox{ level --и вставляем наш level jump } } } handles[dialogs]:show() --показываем окноendwinDraw() --выполнить функцию вышеwhile (true) do FCEU.frameadvance() --нарисовать кадр игрыendТеперь скрипт полностью. Когда напишу (если напишу) полный трейнер, выложу в Файлы. Или drs36 напишет для практики) --[[Адреса игровых значений:0x0037 - area0x0038 - roundИнтересные места в коде игры:0x815B - увеличение уровня на 10x809A - начало уровня]]--require("auxlib")--таблица обратных вызовов(callback)cheats = {["toLevel"] = function(...)local val, area, round = {...}, nil, nilarea, round = tonumber(val[1]), tonumber(val[2])memory.writebyte(0x003F, 3)memory.writebyte(0x0076, 10)memory.writebyte(0x0528, 10)memory.writebyte(0x0077, 0xFF)if (area == 0) or (round == 0) thenmemory.setregister("pc", 0x815B)print("Jumped to next level")elsememory.writebyte(0x0037, area-1)memory.writebyte(0x0038, round-1)memory.setregister("pc", 0x809A)print("Jumped to area "..area..", round "..round)endend}function winDraw()--ПОДГОТОВКА ЭЛЕМЕНТОВ ИНТЕРФЕЙСА И ЛОГИКИ-------------------------------------------- переход на уровеньlevelSpinArea = iup.text{spinmin = 0,spinmax = 8,spin = "YES",readonly = "YES"}levelSpinRound = iup.text{spinmin = 0,spinmax = 4,spin = "YES",readonly = "YES"}levelButton = iup.button{title = "GO",action = function(self)cheats["toLevel"](levelSpinArea.spinvalue, levelSpinRound.spinvalue)end}levelLabel = iup.label{title = "if (area or round) = 0 then jump to next level"}level = iup.frame{title = "To area(1-8) round(1-4)",iup.vbox{iup.hbox{levelSpinArea,levelSpinRound,levelButton},levelLabel},size = "85X20"}dialogs = dialogs + 1handles[dialogs] = iup.dialog{title="Adventure Island Trainer +1 by A1t0r",resize = "NO",size = "220X50",iup.hbox{iup.vbox{level}}}handles[dialogs]:show()endwinDraw()while (true) doFCEU.frameadvance()end
    2 балла
  3. Адрес-то правильный, просто чит замораживает значение по адресу. drs36, если хочешь чтобы работало нормально, то активируй и сразу же деактивируй чит с нужным значением уровня. Тактика активировал и забыл хороша для жизней, патронов и т. д.
    1 балл
  4. Адрес хоть правильный нашёл? Пробовал изменить его значение на 2 + заморозить и перезапустить игру...
    1 балл
  5. Кстати в этом эмуляторе есть какая та поддержка LUA.
    1 балл
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.