Заголовок вполне подойдет для рассказа ужасов 🙂 Но на самом деле речь о Призраках в Дейве. Алекс нашел баг, который проявлялся только в 5-м уровне, да и то не всегда. Выглядело это так: Дейв появляется в начале уровня, к нему подлетает Призрак, Дейв его убивает, идет дальше и там его душит Зомби. Все ок (хмм), но после повторной загрузки уровня наблюдаем или черный экран или Дейв появляется черт знает где, но не в начале уровня.
Так как проявлялось это только в 5-м уровне, то сначала я грешил на какие-то проблемы в данных. Но сам я по этому лабиринту бегал неоднократно и никаких проблем не замечал, хотя Призраков этих там валом и убивал я их пачками и Зомби тем более сто раз душили. Но в том и суть бета-тестинга, что другой человек делает все по-другому и может найти баги, которые только при его стиле игры вылезут.
Проблем с данными никаких не обнаружилось. Вдобавок, сам я никак не мог повторить этого эффекта. Ну, идем, ну убиваем Призрака, ну душит Зомби — и все ок, никаких черных экранов. Выяснилось, что Алекс использует в игре управление от клавиатуры, хотя я все время играл с джойстика. Ок, пробую с клавиатуры. Несколько раз все ок, но потом все-таки я напарываюсь на черный экран. Бинго!
Почему возник черный экран стало ясно сразу — код инициализации лабиринта при рестарте был тупо запорчен. Нашел адрес, по которому была испорчена память, поставил точку остановки на факт записи по этому адресу. Теперь, если вдруг возникнет запись в этот адрес — эмулятор остановится и покажет кусок кода, который пытается это сделать. Это ж круто!
Играю снова, снова добиваюсь глюка и черного экрана, но никакой остановки не возникло. Почему? Потому что теперь память запорчена по другому адресу. Отлично. Терпеть не могу подобные глюки. Это может делать какая угодно процедура, сбившаяся с пути истинного…
Начинаю изучать КАК, собственно, запорчена память. В обоих случаях одинаково — по одному адресу записано число 12, а содержимое следующей ячейки памяти декрементировано. Это уже зацепка. Беру и наудачу ищу в исходниках текст MOV #12, — и нахожу MOV #12,124(R0) ! Хотя, конечно, это удача, ведь такой команды могло и не быть, число могло быть получено в результате каких-то операций, а не прямо вот записью конкретно 12. И что нашлось рядом? Команда DEC 126(R0). Это попадание в десятку.
Так-с, и что это за подпрограмма? Это обработка попадания в монстра. Все-таки дело в убийстве Призрака, а не в последующей смерти от рук Зомби. Очевидно, что в R0 образовался какой-то левый адрес. Но почему? Это уже второй этап. Ставлю точку остановки на эту подпрограмму и иду стрелять Призраков.
И фигушки — остановки происходят, но все данные нормальные. Призраки помирают как положено и никаких глюков не возникает. Как так-то? Пришлось смотреть видос от Алекса и изучать как именно он расправляется с Призраком. И тут я понимаю, что стреляет он их неправильно, ведь изначально Призрак нематериален и стрелять в него бесполезно. Уязвимым он становится лишь после того, как коснется Дейва и материализуется. Но Алекс палит в Призрака стоя на месте в то время, а ведь надо отойти! И что в итоге получается? Пробую сам так же сделать и на какой-то раз ловлю момент, когда в R0 явно левое значение — 1557, ведь это адреса в нулевой странице, где код и никаких данных монстров. Смотрю пошагово как он там образовался и нахожу чтение из таблицы, которая в переключаемой странице AZBK. Но таблица содержит корретные данные, а прочитана ерунда. Значит, эта страница не было подключена в нужный адрес в нужное время. И как же так, ведь в начале цикла включаются нужные страницы, пусть во время цикла и включаются туда же другие… А… не в начале цикла включаются, а перед началом цикла…. А в самом цикле там черт знает что творится….
И как оно раньше работало???
Ну, так и работало — просто я убивал Призрака как положено и этот цикл просто исполнялся только один раз. А вот Алекс умудрился убить по-другому. А Призрак, в отместку, стер память.
Свежие комментарии