Из журнала ZX Format #4, Санкт-Петербург, 15.06.1996 В ПОИСКАХ ВЕЧНОЙ ЖИЗНИ CopyRight (c) 1992-95 by Max Iwamoto /Code Busters Начало этому описанию было положено в тот момент, когда одному из нас пришла в голову мысль сделать игру, которую мы не могли пройти, безжизненной. Эта мысль увенчалась успехом, что дало импульс для попытки сделать безжизненными другие иг- ры и вплотную заняться их устройством, спецификой. В итоге нами были вынесены практические приемы работы с играми (под работой над игрой здесь(и дале е) подра- зумевается стремление сделать эту игру бессмертной ). Эти приемы были разделены на пять групп, которые и представлены далее. Все нижесказанное было опробовано на компьютерах MSX2 и ZX-Spectrum с примене- нием таких программ как: Debugger, Mons4, STS3.3 и др. Данная версия статьи расчитана ислючительно на пользователей ZX-Spectrum . Настоящее руководство рассчитано на пользователей, практически не имеющих хо- тя бы минимального опыта работы на Ас- семблере Z80, но знающих его основные команды. Предлагаем на ваше рассмотрение несколько методов с помощью которых нам удалось переделать не одну сотню игр. МЕТОД 1 ------- ПРИШЕДШИЙ В ГОЛОВУ САМ СОБОЙ Попытаться поискать ячейку, в которой хранится количество жизней и увеличить их (при этом надо иметь ввиду, что в некоторых играх число жизней, выводимых на экран, на 1,а бывает даже и 2, меньше, чем за гружается), и еще, никoгда не ста- вьте 255 жизней, т.к. если вам вдруг до- бавят жизнь, то счетчик жизней станет равным 0 и наступит Game Over. Чаще всего занесение происходит через аккумулятор (далее Acc): #6000:3E03 LD A,#03 ;жизни в Acc #6002:3200C0 LD (#C000),A ;Acc в ячейку ;(#C000) Измените число по адресу #6001, если к оличество жизней в игре увеличилось, зна- чит ячейка (#C000) содержит количество жизней. Кроме занесения через акку- мулятор существует множество других, вот некоторые из них: #6000:2100C0 LD HL,#C000 ;#C000 в HL #6003:3603 LD (HL),#03 ;жизни в ;(#C000) В данном случае ячейка с которой нуж- но далее работать -(#C000). Некоторые фирмы пошли более хит- рыми путями. Они используют еще неско- лько способов загрузки жизней в ячейки: #6000:210300 LD HL,#0003 ;загрузить 3 ;в HL #6003:7D LD A,L ;в Acc из L #6004:3200C0 LD (#C000),A ;Acc в ячейку ;(#C000) #6000:210300 LD HL,#0003 ;загрузить 3 ;в HL #6003:2200C0 LD (#C000),HL;HL в ячейку ;(#C000) Вместо HL могут использоваться DE, BC, IX, IY, но для нас главное найти ячейку, содержащую жизни. Если ячейка найдена, то необходимо перейти к этапу поиска вычитания жизни, т.к. если мы про- сто увеличим значение в нужной ячейке может так случится, что даже большого количества жизней не хватит для прохожде- ния игры. Поиск вычитания жизни рассмо- трим на примере игры BUGGY RANGER: У нас имеется 3 жизни. Находим: #B9EB:3E03 A,#03 ;жизни в Acc #B9ED:3238A9 LD (#A938),A ;Acc в ячейку ;(#A938) Ищем обращения к ячейке (#A938). Нахо- дим: #B959:2138A9 LD HL,#A938 ; #B95C:35 DEC (HL) ;вычитание ;жизней После того как мы убираем DEC (HL) (#00 в #B95C)игра становится бессмертной, но пройти ее практически невозможно, так как энергия вычитается слишком быстро. Поэтому мы начинаем искать, что заносится в ячейки рядом с ячейкой жизни, т.е. (A9??): #B9FF:3EFF A,#FF ;энергия в ;Acc #BA01:3239A9 LD (#A939),A;Acc в ячейку ;(#A939) Далее находим: #C72C:3A39A9 LD A,(#A939);энергию в ;Acc #C72F:95 SUB L ;вычитание Acc #C730:3239A9 LD (#A939),A;Acc в ячейку ;энергии #C733:B7 OR A ;выставление ;флагов #C734:CA38C7 JP Z,#C738 ;переход, ;если 0 #C737:C9 RET ;возврат, ;если не 0 #C738:AF XOR A ;Обнуление #C739:3239A9 LD (#A939),A;ячейки ;энергии #C73C:C359B9 JP #B959 ;переход на ;процедуру ;вычитания ;жизни Аналогично можно обнаружить топливо и оружие: ячейки (A93A) и (A941).Их вычи- тание аналогично вычитанию жизней. Следующий способ заключается в то м, что в ячейку помещается не само число, а ASCII код этого числа.Например, если в игрушке 3 жизни, то в соответствующую ячейку будет помещено не 3, а #33, то есть код цифры 3.Соответсвенно и жизней в данной игрушке не может быть больше 9, а также проверка осуществляется не на 0, а на ASCII код код 0, т.е. на #30. Очень любил использовать этот способ Bob Pape, который написал R-TYPE, DRAGON BREED,TUSKER. Возьмем для примера TUSKER: В этой игре 3 жизни. Поэтому мы начинаем искать занесение 3 в Acc, но ничего не находим. Далее начинаем искать занесение ASCII кода числа 3 - #33. Нахо- дим: #94D4:3E33 A,#33 ;жизни в Acc #94D6:3221FE LD (#FE21),A;Acc в ячейку ;(#FE21) Теперь начинаем искать обращения к ячейке (#FЕ21): #96E0:3A21FE LD A,(#FE21) #96E3:3D DEC A #96E4:3221FE LD (#FE21),A #96E7:FE30 CP #30 #96E9:CA0184 JP Z,#8401 DEC A у нас вызывает подозрения, они усиливаются, когда мы видим CP #30 (про- верка на код числа 0). Теперь по адресу #96Е3 ставим #00 и запускаем программу. И на последок самый хитрый и наиболее редко встречаемый способ. Данные о жиз- ни, энергии, номере этапа хранятся в теле программы, а на свои адреса пересыла- ются командой LDIR. Более того, чаще всего они хранятся после подпрограммы пе- ресылки! #6000:210C60 LD HL,#600C ;Источник #6003:1100C0 LD DE,#C000 ;Приемщик #6006:010300 LD BC,#0003 ;сколько ;переслать #6009:EDB0 LDIR ;переслать 3 ;байта #600B:C9 RET ;с #600C на #C000 #600C:03 INC BC ;пересылаемые #600D:011200 LD BC,#0012 ;данные В данном случае ячейка, где следует искать жизни - это (#C000).В (#C001) хра- нится номер этапа, а в (#C002) количество энергии игрока. Но существует еще один тип игр. Это игры, где участвуют несколько игроков. В них все делается через индексную адреса- цию, т.е. для вычитания жизней обоих игроков используется одна и таже подпро- грамма. Но, если игра представляет собой драки(например Street Fighter), то убрав процедуру вычитания энергии (или жизней) вы сделаете бессмертными обоих игроков и игра потеряет смысл. В этом случае не- обходимо убирать не команду вычитания, а обращение к процедуре вычитания для одно- го из игроков. Нужно сказать еще об одной часто вст речающейся ошибке.Если в игрушке количе- ство каких-то предметов одинаково, то занесение в ячейки часто находится в одном и том же месте. Например, в игре Saigon Combat Unit 1 число жизней ровно числу гранат и занесение находится рядом: #A823:3E04 A,#04 ;число 4 в Acc #A825:3220B0 LD (#B020),A;в ячейку жиз- ;ней #A828:3221B0 LD (#B021),A;в ячейку гра- ;нат Но на самом деле самое жестокое, когда создатели игры предусматривают, что их игру кто-то будет обессмерчивать. Напри- мер, это было сделано в игре EQUINOX.Жиз- ни в нем отключаются довольно просто, но если Вы переназначите клавиатуру перед игрой или вам не хватит времени для прохождения уровня, то начав игру сначала вы увидите, что жизни вычитаются. Если такое происходит, то нужно поискать зане- сение кода команды вычитания в память. В данном случаемы находим: #7006:3E35 A,#35 ;код команды ;DEC (HL) #7008:32B19B LD (#9BB1),A;А по адресу ;#9BB1,как раз ;и находится ;вы читание ;жизней!!! Поэтому, если поставить, #00 вместо #3 5 по адресу #7007, то игра станет абсолю- тно бесконечной. МЕТОД 2 ------- ПОИСК ПРОВЕРКИ НА НОЛЬ Если первый способ не привел к положи- тельным результатам, то следует искать проверку ячеек на ноль,убирать ее и смо- треть, что из этого получится. Далее я приведу некоторые из возможных вариантов: #6000:3A00C0 LD A,(#C000);в Acc из ;(#C000) #6003:B7 OR A ;установить ;флажки #6004:CA0080 JP Z,#8000 ;перейти, если ;A=0 Уберите переход по адресу #6004 и посмотрите, что произойдет. Если на экра- не число жизней = 0, а надпись Game Over еще не появилась, то значит ячейка жиз- ней в данном случае - (#C000). Поиском вычитания можно и не заниматься, т.к. Game Over и так никогда не наступит, но нужно помнить, что проверка на 0 может быть и в нескольких местах. Рассмотрим еще несколько примеров: #6000:2100C0 LD HL,#C000 ;#C000 в HL #6003:A6 AND (HL) ;Установить ;флажки #6004:CA0080 JP Z,#8000 ;Перейти, ;если 0 Уберите переход по адресу #6004. #6000:3A00C0 LD A,(#C000);В Acc из ;(#C000) #6003:D600 SUB #00 ;Установить ;флажки #6005:CA0080 JP Z,#8000 ;Перейти, если ;A=0 Уберите переход по адресу #6005. Очень часто вместо SUB #00 встречается SUB #01 и таким образом убиваются сразу 2 зайца - вычитается жизнь и проверяется равенство нулю. В этом случае необходимо поставить SUB #00 вместо SUB #01 и жизнь станет вечной. МЕТОД 3 ------- ПОИСК УМЕНЬШЕНИЯ ЖИЗНЕЙ Также можно искать вычитания каких либ о ячеек, среди них может оказаться и вы- читание жизни. Вычитание может производится любыми командами вычитания, например: DEC N,SUB N, где N - A, B, C, D, E, H, L, (IX+??), (IY+??), HL,DE, BC. Но бывают и более из- вращенные методы: #6000:2A00C0 LD HL,(#C000);В HL из ;памяти #6003:110100 LD DE,#0001 ;Сколько ;отнимать #6006:ED52 SBC HL,DE ;Уменьшить HL ;на DE #6008:7C LD A,H ;а не 0 ли ;у нас #6009:5B OR L ;в HL ? #600A:CА0080 JP Z,#8000 ;если 0, то ;Game Over #600D:2200C0 LD (#C000),HL;а иначе про- ;должим... Необходимо поставить #00 по адресу #6004. А некоторые делают еще необычней: #6000:3EFF LD A,#FF ;жизни в L, ;#FF в Acc #6003:85 ADD A,L ;Увеличить L ;на A=-1 #6004:3200C0 LD (#C000),A ;Возвратить ;Acc в (#C000) В данном случае можно поставить #00 п о адресу #6001 или по адресу #6002. МЕТОД 4 ------- ИСПОЛЬЗОВАНИЕ ОСОБЕННОСТЕЙ ИГРЫ Во многих играх происходит добавление жизней за что-либо, значит можно найти их добавление. А если мы знаем, что жи- зней не может быть больше N, то можно найти проверку на это число, определить ячейку из которой оно берется и прейти к методу 1, например: #6000:3A00C0 LD A,(#C000) ;в Acc из ;(#C000) #6003:FE09 CP #09 ;проверка ;равенства 9 #6005:CA0080 JP Z,#8000 ;уйти, ;если = 9 Ячейка к которой следует искать обра- щение - (#C000). Часто число жизней (номер оружия, выс трелы и т.д.)изображается цифрами. Мож- но найти место в программе, где они пе- чатаются. Рассмотрим несколько возможных случаев: #6000:7E LD A,(HL) ;Загрузить ;в A из (HL) #6001:D601 SUB #01 ;Уменьшить ;Acc на 1 #6003:27 DAA ;Десятичная ;корреция #6004: CD???? CALL PRINT ;вызов проце- ;дуры печати #6000:7E LD A,(HL) ;загрузить ;в A из (HL) #6001:C630 ADD A,#30 ;добавить #30 ;к Acc #6003:CD???? CALL PRINT ;вызов проце- ;дуры печати Во втором примере мы добавляем #3 0 к Acc и получаем число равное ASCII коду этого числа и печатаем как обычное текстовое сообщение. В этом случае нуж- но искать число,находящееся в HL. Смысл следующего метода состоит в на- хождении места, где печатается надпись Game Over (или любая другая, которая свидетельствует об окончании игры). Впо- лне вероятно, что где-нибудь рядом нахо- дится проверка какой-либо ячейки на ноль. Если этого нет, то продолжайте поиск. МЕТОД 5 ------- Это метод так называемой шоковой терапии или метод "научного тыка" с ус- пехом используемый нашей наукой в течении 73 лет. Он применяется для копания игр, в которых абсолютно не за что зацепиться. Чаще это игры с графическим показателем жизни. Этот метод основывается на вашей интуиции и заключается в создании искус- ственной зацепки: Вы "едете" в МОНИТОРЕ по листингу игры и опираясь на интуицию изменяете определенные участки программы, отвечающие, по вашему мнению, за жизни, попытки, вещи и т.д. Необходимо заметить, что вышеприведен- ные адреса и примеры чисто условны. В вашей игре эти адреса модут быть другими, более того: эти примеры могут перепле- таться в самых причудливых комбинациях. Max. _________________________________________