ZX Power #04
09 января 2000
  Cheats  

Ликбез - CHEATS&POKES. Две последние части из цикла.

<b>Ликбез</b> - CHEATS&POKES. Две последние части из цикла.
CHEAT и POKES 
 в игровых программах 

        часть 2 

(С) 1996-99, Александр Десятниченко 
__________________________________________ 

   Таким  образом,  наше предположение оп- 
равдалось.  Командой DEC A по адресу 46278
количество  жизней уменьшается на единицу,
затем  снова  отправляется  на  постоянное
хранение  в ячейку 48249. Что ж, попробуем
направить  работу  этой  процедуры  в свое
русло, исключив из нее команду DEC A. Про-
ще  всего, конечно, забить ее нулем, кото-
рый в переводе с языка машиного кода будет
обозначать, что в этой ячейке во время вы-
полнения программы не будет осуществляться
никакой  операции  (NOP),  ну,  а на языке
бейсика   это  звучит  еще  проще  -  POKE
646278,0.
   Теперь,  если  вы  вставите в загрузчик
строку  с  таким выражением перед запуском
игры  командой  RANDOMIZE USR, то, сколько
бы  ваш герой в игре не умирал, у него все
равно будет в запасе еще 8 жизней, другими
словами,  вы сделали его бессмертным. Ана-
логично  в  игре выглядит и процедура, до-
бавляющая жизнь при успешной игре:

            45314 LD A,(48249) 
            45317 CP #08
            45319 RET NC
            45320 AND A
            45321 INC A
            45322 DAA
            45323 LD (48249),A
            45326 CALL 47988

   Oна  сначала проверяет, не равно ли ко- 
личество   жизней   восьми,  и,  если  оно
меньше,  то будет увеличено на единицу ко-
мандой  INC A. Пусть не пугает вас команда
DAA,  - она нужна, чтобы подготовить число
жизней  к  печати на экране подпрограммой,
расположенной  по  адресу  47988. Taкой же
CALL  47988  вы  найдете и после процедур,
задающих  и отнимающих жизни. Часто приме-
няются  еще два способа подготовки чисел к
печати: или же количество жизней сразу за-
дается  на  #30  больше, чем надо, как это
сделано  в  WAR MACHINE (LD A,#35), или же 
посредством  добавления  числа #30 к коли-
честву жизней непосредственно перед печат-
ью (АDD А,#30).
   Во многих играх количество жизней зада-
ется,  минуя  аккумулятор,  при помощи ре-
гистра  HL.  Так,  в  игре CORSARIOS 2 это 
сделано  так: LD HL,#05. Нередко и убавле-
ние  жизни  тоже производится через тот же
регистр:

               LD HL,24851 
               DEC (HL)
               JP P,25018 

   Это  был  фрагмент  игры  BATMAN 3, а в 
программе  P-47 the FREEDOM FIGHTER приме- 
нен комбинированный метод:

               LD HL,29964 
               LD A,(HL)
               DEC A
               LD (HL),A

   Занимаясь  обессмерчиванием игр, вскоре 
вы столкнетесь и с такой ситуацией, когда,
забивая  нулем команды DEC A или DEC (HL),
при  первом  же погибании программа выдаст
знакомое  сообщение:  "GAME  OVER". Дело в
том,  что  многие программы сразу же после
отнимания  делают флаговую проверку, а ко-
манда  NOP в таком случае пустит программу
не в ту степь. В таком случае, а, еще луч-
ше,  в  любом  случае,  вместо NOP следует
применять  однобайтные команды OR A или OR
(HL)  соответственно.  Такое  вы уже могли
наблюдать,  просматривая списки POKES, где
по  адресам  вместо нуля заносится 182 или
183.
   А теперь о других, менее распростренен-
ных  способах. В игре NETHER WORLD, напри- 
мер, вы сможете обнаружить еще один способ
убавления жизней:

            33547 LD A,(65405) 
            33550 SUB #01
            33552 LD (65405),A

   В  таком  случае  достаточно вместо #01 
поставить #00 и пусть себе отнимает по ну-
лю  жизней каждый раз. Достаточно оригина-
лен  метод  отнимания жизней с помощью ко-
манды SBC, как это сделано в игре SABRINA: 

              LD HL,(24618) 
              PUSH DE
              EX DE,HL
              LD HL,#01 
              EX DE,HL
              AND A
              SBC HL,DE
              POP DE
              LD (24618),HL

   Нарушить нормальную работу такого фраг- 
мента  труднее,  но  тоже можно, например,
забив  нули  в  SBC  HL,DE и единичку в LD
HL,#01.  Кстати, иногда бывает, что подоб-
ные  подпрограмы  заканчиваются директивой
RET  и вызывается из основной програмы че-
рез  CALL.  Tогда  можно поступить проще -
поставить  RET  (из бейсика - 201) в самое
начало такой подпрограммы, чтобы CALL сюда
как пришел, так ни с чем и ушел, не выпол-
нив ни единиго действия. Среди хакеров це-
нится именно такой способ инфинизации игр,
когда при малом колличестве POKES достига-
ется наибольшая отдача.
   В  сложных,  тяжелых  и,  как  правило,
очень интересных играх часто все лимиты, в
том  числе и количество жизней, хранятся в
виде отдельной таблицы, выборка из которой
производится   через  индексные  регистры.
Так,  в программе CASANOVA количество жиз- 
ней  задается  как LD (IX+43),#05 и, соот-
ветственно,  убавляется как DEC (IX+43), a
в  игре  TERMINATOR  2 вы можете наблюдать 
такое  явление:  DEC (IY-5). Нередко такие
таблички  хранятся  отдельно  и после GAME
OVER выполняется LDIR ее на рабочее место,
как это сделано в PRINCE CLUMSY или RETURN 
of the JEDI:

               LD HL,54079 
               LD DE,54059
               LD BC,20
               LDIR

   А затем и само отнимание жизни: 

               LD HL,54059 
               LD A,(HL) 
               OR A
               SCF
               RET Z
               DEC (HL)

   В   некоторых  программах  ход  событий 
спланирован  таким образом, что количество
ошибок с каждым тяжелым случаем увеличива-
ется  и, при достижении определенного зна-
чения  игра заканчивается. Впервые я такое
увидел в игре HAMMER BOY: 

               LD A,(42097) 
               INC A
               LD (42097),A

   Кстати, в этой игре подсчет ошибок ана- 
логичным образом идет в двух местах и, ес-
ли  хоть в одном из них достигнет предела,
то придется начать игру сначала. Подобного
рода методы применяются также в тех случа-
ях,  когда контроль над одним и тем же ли-
митом  из одного и того же фрагмента прог-
раммы  невозможен или же если разного рода
ошибки отнимают разное количество жизней.
   Естественно, что после того, как хакеры
начали    "циклить"   игры,   программисты
фирм-производителей  начали принимать меры
против   подобного  рода  деятельности.  В
подпрограммах,  уменьшающих  число жизней,
начали применятся, как в игре TARGET RENE- 
GADE, недокументированные команды или, как 
в  JUNGLE  WARRIOR,  сдвиг  битов в байте. 
Найти такие вещи намного сложнее, да и что
там  говорить,  если перед хорошим кодером
поставить  задачу  сделать отнимание жизни
так,  чтобы этого никто не нашел, я думаю,
многие бы справились. В таких случаях мож-
но  пойти  на  хитрость  и сделать кое-что
другое. Так, когда-то мне не удалось найти
отнимание жизни в игре MAD MIX, зато легко 
отыскался  участок,  где  задавалось коли-
чество жизней и фрагмент, где шла проверка
оставшегося значения:

               LD A,#03 
               LD (24624),A
               .....
               LD A,(24624)
               AND A
               RET Z

   Даже  этого  уже  достаточно,  чтобы ее 
обессмертить,  ведь  проверка  идет каждый
раз  после  того,  когда  заберут жизнь. А
что,  если  вместо  проверки сделать снова
занесение  в 24624 троечки? Тем более, что
такая  программка  будет  занимать,  как и
программа проверочки, те же пять байт. Та-
ким  образом  игра  теперь  будет забирать
жизнь,  но  сразу  же  после этого, вместо
проверки, устанавливать все те же три жиз-
ни.

  5. Бесконечное время, оружие, энергия. 

   Нередко   случается,   что   в   азарте
быстренько  расстреляешь весь боекомплект,
а  затем  сосешь палец, пока не убьют. Ес-
тественно,  возникает желание все это сде-
лать бесконечно-вечным. Ну что ж, сложного
ничего  нет,  тем  более  что делается это
примерно теми же методами. Например, в иг-
ре   HAWKSTORM  вам  дается  50  патронов. 
Исследуя машинный код, нетрудно обнаружить
LD A,50, а затем, соответственно, и завет-
ное DEC A.
   Время  также  довольно часто задается и
отнимается  стандартно, вот как это выгля-
дит в игре ROBOCOP 2: 

               LD HL,43224 
               DEC (HL)
               RET NZ

   Но бывают случаи и потяжелее, когда ча- 
сы, минуты и секунды задаются, проверяются
и отнимаются (или увеличиваются) отдельно.
Ну  и  очень  уж  часто приходится сталки-
ваться  с самым интересным видом ограниче-
ния  -  энергией. Начнем с самого простого
вида  представления  энергии  - числового,
когда  энергия  отображается,  как большое
число,  например, 100 или 1000 единиц. Та-
кое можно наблюдать например, в игре CAPI- 
TAN  TRUENO,  но,  снова-таки,  все  стан- 
дартно:

               LD HL,58943 
               DEC (HL)
               JP Z,24042

   В  отличие  от  количества жизней, чаще 
отнимается сразу несколько единиц энергии,
как в игре TIME MACHINE: 

               LD A,(60499) 
               SUB #03
               LD (60499),A

   Порой  самой  трудной  задачей является
определить, сколько же единиц энергии име-
ет наш персонаж в самом начале игры, чтобы
было  затем от чего плясать в процессе по-
иска.  Ведь  часто энергия отображается на
экране  в виде полосочки. Хорошо, если она
состоит из отдельных элементов и их, как в
игре  FORGOTTEN  WORLDS,  например,  можно 
сосчитать. А вот когда такой градации нет,
на  что  только  не  приходится уповать, -
считать,  когда  медленно  убивают,  через
сколько  ударов  придет  хана или, скажем,
прикидывать  по пикселям приблизительно, а
потом пытаться найти что-то подобное...
   Ну,  а теперь самый распостраненный ме-
тод  отнимания энергии из игр серии SIRWO- 
OD.  Итак,  удалось  определить, что изна- 
чально дается 48 единиц энергии и хранится
она  в ячейке 59850, отнимается же при по-
мощи команды SUB:

                 LD C,2 
                 LD A,(59850)
                 SUB C
                 BIT 7,A
                 JP NZ,39989
                 BIT 7,C
                 JR Z,LOOP
                 CP 48
                 JR C,LOOP
                 LD A,48
                 LD (59850),A
                 JP 42272
            LOOP LD (59850),A

   Kак  видите,  в  С заносится количество 
отнимаемой  энергии, оно и вычитается из А
с  последующей  проверкой. Такое отнимание
имеет  много преимуществ, ведь можно вычи-
тать  различное  количество энергии. Такое
может быть необходимо, когда, скажем, тре-
буется,  чтобы различные виды монстров на-
носили  герою  различной силы повреждения.
Согласитесь, это делает игру более привле-
кательной  и реалистичной. В принципе, эта
подпрограмма  дает  много места для вашего
творчества,  можно  для нее подобрать нес-
колько разных POKES и каждое будет по-сво-
ему реализовывать бесконечную жизнь, ну, а
самое  простое  здесь,  конечно же, просто
забить нулем команду SUB C. Нечто подобное
найдете и в черепашках-ниндзя (TURTLES): 

               LD A,(24422) 
               LD B,A
               LD A,16
               SUB B

   К тому же, в этой игре одной программой 
отнимается энергия всех четырех черепашек,
что,  безусловно, удобно в плане обессмер-
чивания.  Но  когда  вы попытаетесь пройти
дальше,  у  вас  появится еще один лимит -
время,  за которое черепашки должны успеть
отключить все компьютеры, значит, придется
"циклить"  теперь  еще  и его! Не удивляй-
тесь,  подобного  добра  вам попадется еще
немало,  особенно  в  играх, где на каждом
новом  уровне  новое  задание. Или вот еще
ситуация,  -  в игре HUMAN KILLING MACHINE 
после того, как вы ее обессмертите, первые 
уровни  пройдутся легко, но потом, на пос-
леднем  уровне, после каждого вашего удара
противник  так  быстро отдыхает, что вы не
успеваете  ему  сбить эту энергию! Значит,
придется  найти  место,  где ему добавляют
энергию и устранить этот сюрприз.
   А вот нетипичный случай отнимания энер-
гии из полной версии игры XENON: 

               LD HL,52262 
               NEG
               ADD A,(HL)
               LD (HL),A
               RET C
               LD (HL),#00

   Достаточно  оригинально  идет  работа с
энергией в игре BRONX: 

               LD A,(64813) 
               XOR (IY-107)
               LD (64813),A

   Снова  об  играх  от  ATLANTIS SOFTWARE 
(SHOW  BROTHERS),  написанных  на каком-то 
макроязыке  и  компилированных  в машинный
код. Все лимиты задаются здесь через HL, а
обрабатываются  процедуркой,  работающей с
ячейкой  памяти, в которой этот лимит хра-
нится. Достаточно поставить туда RET, что-
бы  обессмертить одним приемом все ограни-
чения.
   И еще такая заморочка. В игре CORSARIOS 
с числовым представлением энергии, судя по 
экрану,  дается  600  единиц.  Порывшись в
программе,  не удалось найти место, где бы
фигурировало такое число. Поиграв еще нем-
ножко  и внимательнее присмотревшись к то-
му, как убавлялась энергия, я заметил, что
задействуются  только  две первые цифры, а
последний  ноль  там  вроде как для красо-
ты...  Через  минуту мое предположение оп-
равдалось, так как нашлось LD HL,60, а еще
через  минуту игра шла в уже обессмерченом
виде.

   6. IMMORTAL как самая сильная форма 
               бессмертия.

   По  сравнению  с  INFINITE LIVES, слово 
IMMОRTAL (неуязвимость) появилось в лекси-
коне  синклеристов  не так давно. В 1992-м
году в Англии была выпущена программка HA- 
KER  AMAZING, в которой приводились много- 
численные POKES и firm cheats, среди кото-
рых  попадалось и это новое словечко. Мно-
гие  пользователи,  испытав опубликованные
там  IMMORTAL, были просто поражены их ра-
ботой,  после чего это понятие прочно при-
жилось  и в нашей среде. Помните, Н.Родио- 
нов в игре R-TYPE назвал такое POKE мисти- 
ческим?
   Что же это такое? Вы, наверное, видели,
как во многих играх, после того, как ваше-
го героя ухрюкают, он снова появляется, но
при этом несколько секунд помигивает, буд-
то готовится к новым приключениям. Причем,
пока  он  мигает, он практически неуязвим,
то есть его не берут пули, не давят танки,
а  иногда он даже не тонет в воде. Кто по-
расторопней,  тот в эти секунды может даже
умудриться  пропрыгать несколько площадок,
пройдя,  таким  образом, тяжелое место, то
самое,  где ваш герой удостоился быть уби-
енным  прошлый  раз.  А что, если сделать,
чтобы  персонаж на все время игры стал та-
ким неуязвимым, только чтобы не помигивал?
Вот  это  и будет самый что ни на есть IM-
MORTAL! Но как его найти? Можно, ведь вре-
мя,  которое  персонаж  помигивает, где-то
задается  и  отнимается. Вот пример, пожа-
луй,   из   самой  известной  игры  BUBBLE 
BOBBLE: 

           43832 BIT Z,(IY+90) 
           43836 JP Z,43998

   Время неуязвимости хранится в табличке, 
идет его проверка и, если заменить JP Z на
JP  и поставить вместо 90 число 150 (в той
ячейке  всегда  то,  что нам сейчас надо),
можно запросто сделаться неуязвимым. А те-
перь фрагмент из SOLOMON'S KEY: 

           49318 LD HL,(49813) 
           49321 LD A,L
           49322 OR H
           49323 JP Z,49390
           49326 LD DE,(43206)
           49330 CALL 49356
           49333 OR A
           49334 RET Z

   Если в этом фрагменте заменить условный 
выход  RET  Z на более кардинальный RET и,
таким образом, отсечь часть программы, от-
вечающую  за обработку столкновений с вра-
гами,  то  можно  будет  больше  на них не
отвлекаться и сосредоточиться на самом ло-
гическом  задании этой очень увлекательной
игры. А в игре JACK the NIPPER 2 по адресу 
41218  находится целая подпрограмма, отве-
чающая  за условия столкновения с врагами,
водой и стенами и, если в этих процедурках
заменить  OR  A на твердое XOR A, то можно
настроить  программу  полностью  по своему
вкусу, например, прыгать, не разбиваясь, с
любой высоты.
   А  теперь главный принцип поиска неуяз-
вимости.  Итак,  сначала надо найти, где в
игре  отнимается жизнь и потом смотреть от
этого места выше, разбираясь, что выполня-
ют те участки программы, которые отработа-
ли  до того, как отнялась жизнь. Таким об-
разом можно найти фрагмент, где идет обра-
ботка  столкновений и затем пустить его по
своему сценарию. Обычно приходится сделать
RET  для такой подпрограммы или обойти ее,
поставив  безусловный  JR. Иногда, правда,
бывает достаточно, как в CABAL, забить ну- 
лем  DEC  A, или, как в F1 TORNADO SIMULA- 
TOR, исправить SUB #01. 


            конец второй части
__________________________________________ 



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

Авторы - Авторы журнала и контакты редакции.

Вступление - Приветствия и вступительное слово.

Вступление - Описание возможностей оболочки.

Вступление - Содержание номера.

Игротека - GLADIATOR. Анализ интересной fightingовой игры.

Игротека - BARD-S TALE. Продолжение "штурма" классической РПГ.

Игротека - SUPAPLEX. Презентация харьковской boulder dash-еобразной игры.

Игротека - SNAKE Презентация написанной в Харькове недетерминированной игры.

Игротека - SNAKE-HELP1. Советы по игре Snake.

Игротека - SNAKE-HELP2. Принципы игры и история создания.

Игротека - СОЛДАТИКИ. Рассказ автора о созданной им стратегической игре.

Игротека - КОРАБЛИКИ. Информация о новом стратегическом проекте.

Игротека - BRAIN PRESSURE. Рассказ о новой логической игре.

Игротека - ПСЕВДОШАШКИ. Еще одна логическая игрушка.

Интервью - Интервью с создателями нашумевшей игры Зеркало, группой ART WORK.

Интервью - Интервью с DEMIURGE ASH.

Интервью - Интервью с MIDISOFT/EM.

Интервью - Интервью с ENERGY MINDS.

Интервью - X-PROmotion. Рассказ о поездке XPJ в Донецк.

Интервью - SSG-99. Рассказ о проходившей в Севастополе Party

Интервью - Интервью с группой из Феодосии - X-THEME.

Ликбез - ВОССТАНОВЛЕНИЕ ИГР#3. Заключительная статья.

Ликбез - алгоритмы быстрой 3D-графики №2. Дополнения и замечания.

Ликбез - CHEATS&POKES. Две последние части из цикла.

Комната смеха - ПРО СИСАДМИНОВ. Подборка анекдотов.

Комната смеха - КАК СДЕЛАТЬ ЖУРНАЛ. Советы "экспертов"

Комната смеха - ГАМЛЕТ#1. Первая часть новой версии бессмертной трагедии.

Комната смеха - БЕЛЫЙ ПИНГВИН. Антиновелла по одной известной игре.

Меломания - МЕЛОМАНИЯ#2. Второй выпуск музыкальной рубрики.

Меломания - ОБЗОР АЛЬБОМОВ. Обзор heavy-metal CD за 98/99 гг.

Меломания - VOODOO (рус.)Перевод альбома King Diamond-98.

Меломания - VOODOO (англ.)Оригинальный текст альбома.

Обозрение - НОВЬЕ?.. Рассуждения на тему свежего софта, список новых игр.

Обозрение - ОБЗОР свежих электронных журналов для ZX Spectrum.

Обозрение - ИГРЫ. Знакомство с новинками игрового ПО: Козел, Охота на кротов, Белый Орел, Leprikon, 12 Тайных Книг, King, C.H.I.F., Черный Ворон - новые миссии.

Вокруг света - Intel: скептики опять ошиблись?

Вокруг света - Новые машины Silicon Graphics: ПК или рабочие станции?

Вокруг света - Новинки с MacWorld Expo.

Разное - НАШЕ НИЩЕНСТВО. Очерк А.П.Чехова.

Разное - ROLE PLAYING GAMES. История ролевых игр.

Разное - ЧЕМПИОНАТ ЗМЕЙ. Новый конкурс.

Разное - И СНОВА AY. Статья о коррекции звучания муз. сопроцессора.

Разное - РЕКЛАМА.

Разное - КОНКУРС.

Рабочий стол - DIGITAL SOUND EDITOR. Презентация цифрового редактора звука.

Рабочий стол - NEOS. Рассказ о новой операционной системе для Спектрума.

Рабочий стол - INTERMINAL. Новая терминальная программа.

Теверна - первый выпуск рубрики, посвященной игровым программам: концепция игры "Таверна".

Почта - Переписка с читателями журнала.


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

Похожие статьи:
Вдруг пригодится - Схема устранения в GRM'е конфликта между портом #FF и модемом (#EF).
Sofтинка - Техническое руководство по дисковой системе DISCiPLE/+D.
Вступление - у газеты новая листалка.
Страницы истории - Толкин: продолжение рассказа о жизни знаминитого писателя.
Part 1 - Intro.

В этот день...   19 апреля