<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Recent changes to ObjectCounter</title><link>https://sourceforge.net/p/feos-tas/wiki/ObjectCounter/</link><description>Recent changes to ObjectCounter</description><atom:link href="https://sourceforge.net/p/feos-tas/wiki/ObjectCounter/feed" rel="self"/><language>en</language><lastBuildDate>Fri, 13 Mar 2015 15:30:39 -0000</lastBuildDate><atom:link href="https://sourceforge.net/p/feos-tas/wiki/ObjectCounter/feed" rel="self" type="application/rss+xml"/><item><title>ObjectCounter modified by Anonymous</title><link>https://sourceforge.net/p/feos-tas/wiki/ObjectCounter/</link><description>&lt;div class="markdown_content"&gt;&lt;h1 id="_1"&gt;Вступление&lt;/h1&gt;
&lt;p&gt;Игра обрабатывает различный код каждый кадр. (Поскольку идет в 60fps) Игровой цикл выглядит примерно так: Повторить: &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;jsr&lt;/span&gt; &lt;span class="err"&gt;Обработать&lt;/span&gt; &lt;span class="err"&gt;код&lt;/span&gt; &lt;span class="err"&gt;объектов&lt;/span&gt;
&lt;span class="n"&gt;jsr&lt;/span&gt; &lt;span class="err"&gt;Обработать&lt;/span&gt; &lt;span class="err"&gt;взаимодействия&lt;/span&gt; &lt;span class="err"&gt;объектов&lt;/span&gt;
&lt;span class="n"&gt;jsr&lt;/span&gt; &lt;span class="err"&gt;Обработать&lt;/span&gt; &lt;span class="err"&gt;другие&lt;/span&gt; &lt;span class="err"&gt;вещи&lt;/span&gt;
&lt;span class="n"&gt;jsr&lt;/span&gt; &lt;span class="err"&gt;Обработать&lt;/span&gt; &lt;span class="err"&gt;карту&lt;/span&gt; &lt;span class="err"&gt;уровня&lt;/span&gt;
&lt;span class="n"&gt;jsr&lt;/span&gt; &lt;span class="err"&gt;Обработать&lt;/span&gt; &lt;span class="err"&gt;спрайты&lt;/span&gt; &lt;span class="err"&gt;объектов&lt;/span&gt;
&lt;span class="n"&gt;tst&lt;/span&gt; &lt;span class="err"&gt;ждать&lt;/span&gt; &lt;span class="err"&gt;следующего&lt;/span&gt; &lt;span class="err"&gt;кадра&lt;/span&gt;
&lt;span class="n"&gt;jmp&lt;/span&gt; &lt;span class="err"&gt;повторить&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Коды связанные с объектами состоят из цикла , выполняемого 15 раз (поскольку у нас 15 слотов для объектов). &lt;/p&gt;
&lt;p&gt;Начало цикла для спрайтов находится тут: &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;ROM&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mf"&gt;3063F&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;BANK6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;862F&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Для счета текущего обрабатываемого объекта используются Y и &lt;em&gt;$15&lt;/em&gt; и &lt;em&gt;$16&lt;/em&gt; для хранения Y. То есть обработали один объект (выставили его спрайты), далее увеличиваем Y и &lt;em&gt;$15&lt;/em&gt; на 1, и так пока не достигнет &lt;em&gt;$F&lt;/em&gt;. (завершаем цикл на 16-ом объекте так как у нас их всего 15-ть) Кроме того счетчик двух-направленный в зависимости от четности кадра. То есть в следующий раз счет пойдет не с первого по 15-ый объект, а с 15-ого по 1-ый. И на значении -1 завершится. Это сделано чтобы при лимите спрайтов обрабатывать объекты идущие в последних слотах, создает эффект мерцания спрайтов. &lt;/p&gt;
&lt;p&gt;Баг: если лаг возникнет во время обработки этого цикла (то есть игра не успеет обработать весь нужный код за кадр), происходит запись неверного значения в память ячейку &lt;em&gt;$15&lt;/em&gt; (так как например &lt;em&gt;$15&lt;/em&gt; также используется во время опроса джойстиков)во время прерывания nmi и переключения кода в другое место рома (где и есть опрос джойстиков). После обработки его игра возвращается в исходное место и продолжит обрабатывать спрайты. В нормальных ситуациях когда игра всё оработала она сама ждет прерывания на следующий кадр. Это нормальная ситуация для всех игр, только тут ошибка состоит в том, что для счечтика взяли ячейку &lt;em&gt;$15&lt;/em&gt; которая используется и во время прерывания, и в результате лага значение &lt;em&gt;$15&lt;/em&gt; сбивается и цикл обработки спрайтов продолжится с неверным значением. В нормальных условиях значение должно быть от &lt;em&gt;$00&lt;/em&gt; до &lt;em&gt;$0E&lt;/em&gt;. А после такого возврата после лага оно может быть любым хоть 20 хоть 66. И игра продолжит обработку спрайтов для несуществующих слотов объектов. &lt;/p&gt;
&lt;h1 id="_2"&gt;Отступление&lt;/h1&gt;
&lt;p&gt;Представим массив(таблицу) чисел созданную из 5-ти ячеек: &lt;/p&gt;
&lt;p&gt;скорость&lt;br /&gt;
1&lt;br /&gt;
1&lt;br /&gt;
0&lt;br /&gt;
1&lt;br /&gt;
0&lt;/p&gt;
&lt;p&gt;ускорение&lt;br /&gt;
5&lt;br /&gt;
0&lt;br /&gt;
5&lt;br /&gt;
5&lt;br /&gt;
5&lt;/p&gt;
&lt;p&gt;поворот&lt;br /&gt;
2&lt;br /&gt;
2&lt;br /&gt;
0&lt;br /&gt;
0&lt;br /&gt;
2&lt;/p&gt;
&lt;p&gt;Например машина #1 имеет параметры - 1/5/2 ; #2 - 1/0/2; Какие значения будут у машины #6? Мы ведь не вписывали ее в таблицу. Но данные в роме(или в памяти) то идут друг за другом и игре &lt;strong&gt;всё равно&lt;/strong&gt; есть это или нет. 1 1 0 1 0 5 0 5 5 5 2 2 0 0 2 Поэтому для машины #6 возьмется цифра 5 (6-ая по счёту), далее 2, а третья вообще из следом идущих данных. &lt;/p&gt;
&lt;h1 id="_3"&gt;Детали&lt;/h1&gt;
&lt;p&gt;Теперь вернемся к жабам. Если значение счетчика сбилось мы продолжим обрабатывать несуществующие объекты: Например для объекта #17 - &lt;em&gt;obj type id ($3C1)&lt;/em&gt; совпадет c &lt;em&gt;$3D1 (player2_anim_frame)&lt;/em&gt;; &lt;em&gt;03FD Objects_Xpos_L&lt;/em&gt; с &lt;em&gt;40D player2_Ypos_H&lt;/em&gt;; то есть для оработки спрайта объекта если надо считать его &lt;em&gt;XposL&lt;/em&gt; для #17 она считается из ячейки &lt;em&gt;40D (player2Y)&lt;/em&gt;. Вообщем для обработки спрайтов следующих объектов используются совершенно левые значения образуемые из последующих ячеек памяти. &lt;/p&gt;
&lt;p&gt;Сам код вывода обработки спрайтов объекта состоит не только из чтения из нужных ячеек объектов &lt;em&gt;LDA&lt;/em&gt; (координаты например) и запись в буфер спрайтов, но также и запись &lt;em&gt;STA&lt;/em&gt; в некоторые ячейки. Причем есть как глобальные участки кода(для любых объектов), так и специфические для определенных. В частности для объекта &lt;em&gt;tall walker (ходули)&lt;/em&gt;, есть записи в ячейки: &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;STA&lt;/span&gt;     &lt;span class="n"&gt;Objects_Z_floor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;
&lt;span class="n"&gt;STA&lt;/span&gt;     &lt;span class="n"&gt;Objects_Y_shad&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;
&lt;span class="n"&gt;STA&lt;/span&gt;     &lt;span class="n"&gt;Objects_various_flags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;
&lt;span class="n"&gt;STA&lt;/span&gt;     &lt;span class="n"&gt;Objects_Y_shad&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Для других объектов тоже могут быть записи в ячейки, да и в общем коде.(не изучалось пока) &lt;/p&gt;
&lt;p&gt;В ситуации если значение объект-счетчика сбилось на &lt;em&gt;#$3D&lt;/em&gt;, то &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;RAM&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0475&lt;/span&gt; &lt;span class="n"&gt;Objects_Z_floor&lt;/span&gt;  &lt;span class="mi"&gt;475&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;B2&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;а &lt;em&gt;4B2&lt;/em&gt; это &lt;em&gt;RAM:04B2 player2_state&lt;/em&gt;, то еcть запись &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;STA&lt;/span&gt;     &lt;span class="n"&gt;Objects_Z_floor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;где&lt;/span&gt; &lt;span class="n"&gt;Y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;запишет данные в ячейку &lt;em&gt;4b2&lt;/em&gt; - в стейт флаги 2-ого объекта. А 5-ый бит стейта отвечает за наличие стика (палочки). &lt;/p&gt;
&lt;p&gt;Теперь рассмотрим все условия именно этой комбинации: &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Должен возникнуть лаг и сбиться счечтик(так как лаг необязательно может пройти на этом месте, да и даже если в этом, не всегда - зависит от строчки). &lt;/li&gt;
&lt;li&gt;В завимости от четности кадра на число большее или меньшее чем &lt;em&gt;#$3D&lt;/em&gt;. Так чтобы цикл обработался с этим числом. &lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Рассмотренные &lt;em&gt;STA&lt;/em&gt; идут только для объекта 'ходуля' (есть и другие - но не проверялись); поэтому перед выполнением этого участка кода вначале идет опроса кода на тип объекта: &lt;br /&gt;
Узнаем тип объекта с номером &lt;em&gt;#3D&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;RAM:03C1 Objects_TypeID: . + 3D = равняется ячейка 3FE =&lt;/p&gt;
&lt;p&gt;RAM:03FE player2_Xpos_L: &lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;То есть мы можем влиять на эту ячейку - меняя &lt;em&gt;Xpos&lt;/em&gt; игрока мы и будем менять также ID объекта &lt;em&gt;#3D&lt;/em&gt;. Нам нужно значение в этой ячейке = &lt;em&gt;$11&lt;/em&gt; или &lt;em&gt;$12&lt;/em&gt;, для запуска кода спрайтов специфичного для Ходуль , где есть приведенные выше записи в в память &lt;em&gt;STA&lt;/em&gt;. - В частности &lt;em&gt;STA Objects_Z_floor,Y&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;BANK6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8659&lt;/span&gt;                 &lt;span class="n"&gt;STY&lt;/span&gt;     &lt;span class="n"&gt;tmp_var_16&lt;/span&gt;      &lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;slotID&lt;/span&gt;
&lt;span class="n"&gt;BANK6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;865&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;                 &lt;span class="n"&gt;LDA&lt;/span&gt;     &lt;span class="n"&gt;Objects_TypeID&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;

&lt;span class="n"&gt;BANK6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8672&lt;/span&gt;                 &lt;span class="n"&gt;CMP&lt;/span&gt;     &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="n"&gt;$11&lt;/span&gt;
&lt;span class="n"&gt;BANK6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8674&lt;/span&gt;                 &lt;span class="n"&gt;BEQ&lt;/span&gt;     &lt;span class="n"&gt;loc_6000_86A2&lt;/span&gt;
&lt;span class="n"&gt;BANK6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8676&lt;/span&gt;                 &lt;span class="n"&gt;CMP&lt;/span&gt;     &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="n"&gt;$12&lt;/span&gt;
&lt;span class="n"&gt;BANK6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8678&lt;/span&gt;                 &lt;span class="n"&gt;BEQ&lt;/span&gt;     &lt;span class="n"&gt;loc_6000_86A2&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Кроме того &lt;em&gt;STA&lt;/em&gt; (запись A) само число A должно оказаться любым чтобы создался стик - но так чтобы 05-ый бит в этом числе был равен 1. Вообщем тут 50/50 но на A косвенно влияют например &lt;em&gt;$21&lt;/em&gt; и &lt;em&gt;$8D&lt;/em&gt;: &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;BANK6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;89&lt;/span&gt;&lt;span class="n"&gt;F0&lt;/span&gt;                 &lt;span class="n"&gt;SBC&lt;/span&gt;     &lt;span class="n"&gt;byte_0_21&lt;/span&gt;
&lt;span class="n"&gt;BANK6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;89&lt;/span&gt;&lt;span class="n"&gt;F2&lt;/span&gt;                 &lt;span class="n"&gt;SEC&lt;/span&gt;
&lt;span class="n"&gt;BANK6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;89&lt;/span&gt;&lt;span class="n"&gt;F3&lt;/span&gt;                 &lt;span class="n"&gt;SBC&lt;/span&gt;     &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="n"&gt;BANK6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;89&lt;/span&gt;&lt;span class="n"&gt;F5&lt;/span&gt;                 &lt;span class="n"&gt;SBC&lt;/span&gt;     &lt;span class="n"&gt;byte_0_8D&lt;/span&gt;
&lt;span class="n"&gt;BANK6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;89&lt;/span&gt;&lt;span class="n"&gt;F7&lt;/span&gt;
&lt;span class="n"&gt;BANK6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;89&lt;/span&gt;&lt;span class="n"&gt;F7&lt;/span&gt; &lt;span class="n"&gt;level4_stick_bug&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;                       &lt;span class="o"&gt;;&lt;/span&gt;  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;Y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt;
&lt;span class="n"&gt;BANK6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;89&lt;/span&gt;&lt;span class="n"&gt;F7&lt;/span&gt;                 &lt;span class="n"&gt;STA&lt;/span&gt;     &lt;span class="n"&gt;Objects_Z_floor&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Таким образом происходит запись неверного числа в атрибут игрока и у него появляется в руках стик (палочка от ходули). &lt;/p&gt;
&lt;p&gt;Это не единственный возможный баг из-за счетчика, так как возможны записи и в другие ячейки , и в эту же при других условиях - надо смотреть код, да и Y дает очень большой диапозон. Ведь он может сбится и продолжить обрабатывать сотню несуществующих слотов объектов. Другое дело что не все комбинации могут быть легко выполнены, а некоторые даже теоретически невыполнимы. Да и надо придумывать что кроме атрибут можно было бы полезным изменить. Но для начала надо научится вызывать лаг чтобы сбивать счечтик (на само число можно повлиять кнопками и в зависимости от четности кадра надо ставить число больше &lt;em&gt;$F&lt;/em&gt; либо меньше &lt;em&gt;$7F&lt;/em&gt;). А потом изучить все возможные &lt;em&gt;STA&lt;/em&gt;. &lt;/p&gt;
&lt;p&gt;Например для &lt;em&gt;STA 0475 Objects_Z_floor&lt;/em&gt;, для счечтика от &lt;em&gt;F&lt;/em&gt; до &lt;em&gt;$7F&lt;/em&gt; возможны записи в ячейки - &lt;em&gt;475+F&lt;/em&gt; - &lt;em&gt;475+7F&lt;/em&gt;, дипозон &lt;em&gt;484-4F4&lt;/em&gt;. Только для Y отличного от &lt;em&gt;3D&lt;/em&gt;, для запуска этого кода ID считываться уже будет не с &lt;em&gt;RAM:03FE player2_Xpos_L&lt;/em&gt; , а с &lt;em&gt;3С1+F&lt;/em&gt; - &lt;em&gt;3C1+7F&lt;/em&gt;, диапозон &lt;em&gt;3D0-440&lt;/em&gt;, то есть при &lt;em&gt;3d0=12&lt;/em&gt; и Y =F возможна запис в &lt;em&gt;484&lt;/em&gt;. при &lt;em&gt;3d1=12&lt;/em&gt; и y=10 возможна запись в &lt;em&gt;485&lt;/em&gt; и т.д. &lt;/p&gt;
&lt;p&gt;Ну и другие комбинации с &lt;em&gt;STA&lt;/em&gt;/ ID. Для тех же ходуль есть еще записи в память, добавляем Y&amp;gt;F и смотрим куда записи пойдут. &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;STA&lt;/span&gt;     &lt;span class="n"&gt;Objects_Y_shad&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;
&lt;span class="n"&gt;STA&lt;/span&gt;     &lt;span class="n"&gt;Objects_various_flags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;А для объекта номер 6 &lt;em&gt;BANK6:867E CMP #6&lt;/em&gt; есть запись например в : &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;BANK6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;87&lt;/span&gt;&lt;span class="n"&gt;EE&lt;/span&gt;                 &lt;span class="n"&gt;STA&lt;/span&gt;     &lt;span class="n"&gt;Objects_TargetID&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Anonymous</dc:creator><pubDate>Fri, 13 Mar 2015 15:30:39 -0000</pubDate><guid>https://sourceforge.netf3d81f4d0140195ffebfa4eb93caffab58de60c3</guid></item></channel></rss>