21
Ноя
2023

Хитрый баг

Во-первых, я сегодня быстро пофиксил баг, который мне казался весьма геморным – порча фона при выводе друг на друга летящих пуль и костей. Это оказалось как раз просто – просто “Тэд из прошлого” не сделал два отдельных цикла “взять все фоны под все пули и кости”, и только потом “вывести все пули и кости”, а объединил их в один цикл, где последующая кость брала себе фон с предыдущей пулей.

Во-вторых, внезапно при выходе из телепорта все накрылось медным тазом. Ага, думаю, новый глюк, чтоб его. Пробую снова выйти и снова держу клавишу влево – баг повторяется. Не держу – вроде сначала все ок, черепа завелись и побежали, а потом снова все зависло. Видимо, дело не в клавише. А в чем? А в том, что кнопка влево разворачивает Балбеса влево и спрайт начинает выводиться другой процедурой, которая уже выводит спрайт с поворотом. А если клавишу не жать, то черепа, добежав до правого края, тоже разворачиваются налево и тогда снова начинает работать “левая” процедура. Значит, дело в ней.

Ставлю точку остановки, смотрю что там – а там прямо в исполняемом коде какая-то чушь вместо одной из команд. Откуда-то взялся байт 367. Что за самомодифицирующийся код, который не заказывали? Отслеживаю момент, когда портится ячейка по этому адресу, начиная от телепорта, конечно же. Портится она при распаковке новой сцены. А чего на портится-то? А при применении списка изменений. При распаковке же сцена получается “свежая”, с еще не выпитыми эликсирами, несобранными Гномами и невзятыми ключами. Вот список изменений и применяется.

Оказалось, составляется он неоптимально – если открыт секрет и на экране (и в лабиринте) появился бонус, то в список изменений пишется адрес в лабиринте и код этого бонуса, естественно. А когда бонус взят? В список изменений ДОБАВЛЯЕТСЯ замена этого бонуса на ноль. Итоге, ДВЕ записи изменений одного и того же места лабиринта. Вот список и переполнился, стали “применяться” левые данные по левым адресам, в итоге пострадал уже исполняемый код.

Значит, надо или перед записью изменения искать такой адрес в списке и обновлять данные по нему или тупо увеличить место под возможное кол-во изменений лабиринта.

Share

You may also like...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *