ZX Format #04
14 июня 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.
_________________________________________
                                           



Другие статьи номера:

Игрушки - 48 утюгов (3 уровень).

Игрушки - прохождение La abadia del crimen.

Игрушки - новелла по игре "Приключения Винни Пуха" (Level 1)

Программистам - изучаем Бейсик (часть 4).

Программистам - Адаптация программ под TR-DOS #2.

Программистам - IMMORTAL #2 (бессмертие в играх).

Программистам - музыкальные Редакторы, которые мы выбираем.

Программистам - справочник по теневому сервис монитору Scorpion ZS 256.

Программистам - "В ПОИСКАХ ВЕЧНОЙ ЖИЗНИ".

IS-DOS - Рубрика "IS-DOS - начинающим" No 4.

IS-DOS - пользователям" No4: "Работа с электронным диском в среде IS-DOS".

IS-DOS - информация о фирме ISKRASOFT.

Железо - Nemo отвечает на вопросы пользователей.

Железо - Сообщение от фирмы Nemo (о микропроцессорах Z84C0010PEC).

Премьера - АССЕМБЛЕРЫ, КОТОРЫЕ МЫ ВЫБИРАЕМ (описание XAS).

Премьера - Описание программы 'CONVER-Commander V 4.50 pro'.

Премьера - НЛО-2. Дьяволы бездны.

Презентация - новгородская группа Digital Reality о себе.

Интервью - Интервью Капитана Nemo с комментариями фирмы Искрасофт.

Интервью - Николай Родионов и ZX-Sectrum.

Интервью - интервью с разработчиком компьютера HOBBIT Дмитрием Михайловым.

Отдохнём - HAL 9000

Отдохнём - Nemo рассказывает о ВиртуалЕТной реальности в России.

Почтовый ящик - письма читателей.

Почтовый ящик - доска обьявлений.

Почтовый ящик - "Империя Spectrum".

Разное - Вступительная новелла к игре Paradise Lost (Потерянный Рай).

Разное - перспективы П/О: WARCRAFT

Разное - Amiga Club: Вопросы и ответы #2.

Разное - Amiga Rulez или пропоганда здорового образа жизни.

От Авторов - о новом номере и планах на будущее.

Авторы журнала - ZX-Format No.4

Лотерея - первые итоги первой лотереи.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Реклама - сказочки про "Вовочку".
Статьи - интервью с Вячеславом Скутиным/Nemo взятое редакцией ZX-Format.
Только хиты - Самые популярные шлягеры нашего времени только здесь и сейчас.

В этот день...   9 июля