Во-первых, я сегодня быстро пофиксил баг, который мне казался весьма геморным — порча фона при выводе друг на друга летящих пуль и костей. Это оказалось как раз просто — просто «Тэд из прошлого» не сделал два отдельных цикла «взять все фоны под все пули и кости», и только потом «вывести все пули и кости», а объединил их в один цикл, где последующая кость брала себе фон с предыдущей пулей.
Во-вторых, внезапно при выходе из телепорта все накрылось медным тазом. Ага, думаю, новый глюк, чтоб его. Пробую снова выйти и снова держу клавишу влево — баг повторяется. Не держу — вроде сначала все ок, черепа завелись и побежали, а потом снова все зависло. Видимо, дело не в клавише. А в чем? А в том, что кнопка влево разворачивает Балбеса влево и спрайт начинает выводиться другой процедурой, которая уже выводит спрайт с поворотом. А если клавишу не жать, то черепа, добежав до правого края, тоже разворачиваются налево и тогда снова начинает работать «левая» процедура. Значит, дело в ней.
Ставлю точку остановки, смотрю что там — а там прямо в исполняемом коде какая-то чушь вместо одной из команд. Откуда-то взялся байт 367. Что за самомодифицирующийся код, который не заказывали? Отслеживаю момент, когда портится ячейка по этому адресу, начиная от телепорта, конечно же. Портится она при распаковке новой сцены. А чего на портится-то? А при применении списка изменений. При распаковке же сцена получается «свежая», с еще не выпитыми эликсирами, несобранными Гномами и невзятыми ключами. Вот список изменений и применяется.
Оказалось, составляется он неоптимально — если открыт секрет и на экране (и в лабиринте) появился бонус, то в список изменений пишется адрес в лабиринте и код этого бонуса, естественно. А когда бонус взят? В список изменений ДОБАВЛЯЕТСЯ замена этого бонуса на ноль. Итоге, ДВЕ записи изменений одного и того же места лабиринта. Вот список и переполнился, стали «применяться» левые данные по левым адресам, в итоге пострадал уже исполняемый код.
Значит, надо или перед записью изменения искать такой адрес в списке и обновлять данные по нему или тупо увеличить место под возможное кол-во изменений лабиринта.
Свежие комментарии