Category: Блог

22
Ноя
2023

Продолжаю битву с багами

Исправил вчерашний баг с переполнением списка изменений. Было два метода решения:

  • красивый метод — оптимизировать само пополнение списка, т.е. искать адрес среди внесенных и править имеющуюся запись
  • тупой — увеличить место под сам список, чтобы хватило в любом случае

Я, конечно, пошел первым путем — оптимизировал работу со списком. И увеличил место под сам список.

А также исправлено:

+BUG: переполнение списка мигающих бонусов (оказалось, их может быть и больше 5 на один уровень)
+BUG: не было проверки на предмет сразу после залезания (не брал бонусы)

21
Ноя
2023

Хитрый баг

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

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

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

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

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

19
Ноя
2023

Последние подарочки

Победил баги сегодня:

  • BUG: добавить звук огня в подвальных лабиринтах — добавил
  • BUG: подарки с жизнями и опытом не работают — теперь все работает, можно брать «мешки» с бонусами в виде очков, жизни, опыта
  • BUG: Балбес проваливается в 18-03, во втором через флаг в земле? — исправлено

Осталось:

BUG: кость + пуля = порча фона — это мне видится самым муторным
BUG: при отключенной музыке нет паузы после game over
BUG: нота сзади верхняя пролетела без урона
BUG: если Балбес получает толчок во время удара, то проваливается
BUG: мешок давит по новым координатам
BUG: скелет убит под землей?? boom был ниже!

 

18
Ноя
2023

Снова Тэд из будущего

Очередной прикол из серии «пусть об этом думает Тэд из будущего» — оказывается, после определения того, что Шериф верхом на глыбе доехал до потолка и должен быть раздавлен…. ничего не делается. Пришлось доделать.

Сегодня исправлено:

+BUG: шерифа давит мешком об потолок, но не давит. Потому что там и нет действия!
+BUG: скелет не запрыгивает? сцена 11-02, начало GOON DOCKS
+BUG: наискосок скелет летит странно
+BUG: увеличить угол нот, увеличить их скорость
+BUG: ноты при вопле выводить ближе
+BUG: скелет после появления в воздухе не сразу проваливается

В итоге Скелет перестал летать «странно», теперь он сразу падает, если возродился в воздухе (то самое убийство нечисти в полете), а также перестал исчезать, когда должен был запрыгнуть на уровень выше (там не было вообще такого кода движения, но кто их считает).

Что осталось исправить:

BUG: Балбес проваливается в 18-03, во втором черем флаг в земле?
BUG: кость + пуля = порча фона
BUG: подарки с жизнями и опытом не работают
BUG: при отключенной музыке нет паузы после game over
BUG: нота сзади верхняя пролетела без урона
BUG: если Балбес получает толчок во время удара, то проваливается
BUG: добавить звук огня в подвальных лабиринтах
BUG: мешок иногда давит по новым координатам
BUG: скелет убит под землей?? boom был ниже!

17
Ноя
2023

Шериф и прерванный полет

Начал я сегодня очередной раунд борьбы с багами. Часть поборол:

+BUG: для призрака координаты пересчитываются раз в пятилетку
+BUG: флаг Призрака не возвращается после его ликвидации
+BUG: в золотом нет призрака?
+BUG: призрак не поражает и в конце он красный

Потом взялся за это:

BUG: скелет в прыжке 137070 не вызывает FIGHT?

Это я заметил, когда пытался стукнуть прыгающего Скелета во время его пребывания в воздухе. И Скелет меня проигнорировал. Потом я проверил это на Шерифах и выяснил, что когда ноги Шерифа выше уровня земли, он игнорирует Балбеса и его удары. Соответствующий комментарий даже был в коде. То ли это было «пусть об этом думает Тэд из будущего», то ли я думал, что в прыжках нечисть сбивать будет только маньяк, т.к. там велика вероятность самому огрести. Попробовал я сделать это на оригинальной игре MSX и открыл для себя новость — оказывается, если поймать Шерифа во время полета и стукнуть, то он падает вниз, но после падения не бежит себе дальше, а именно валяется и дрыгает ногами. Т.е. эта ситуация была авторами предусмотрена. Мне и в голову не приходило охотиться на Шерифов и бить их на взлете — я старался держаться от них подальше. Ну… что делать, пришлось внедрять и мне такой же трюк. Теперь Шерифа можно бить в полете. Вот так это выглядит:

В процессе отладки этого механизма я поймал эпичный скриншот, когда за мной гонялись сразу ДВА Шерифа:

 

Список оставшихся багов (он пополнился):

BUG: Балбес проваливается в 18-03, во втором черем флаг в земле?
BUG: кость + пуля = порча фона
BUG: скелет не запрыгивает? сцена 11-02, начало GOON DOCKS
BUG: подарки с жизнями и опытом не работают
BUG: при отключенной музыке нет паузы после game over
BUG: ноты при вопле выводить ближе
BUG: кости вообще не набиваются!
BUG: нота сзади верхняя пролетела без урона
BUG: если Балбес получает толчок во время удара, то проваливается

16
Ноя
2023

Забытые баги

Почему-то я потерял половину списка багов и сижу радуюсь, что мало осталось работы. А вот фиг там! Но сегодня неплохо пофиксил:

  • BUG: при спуске по лиане клавиша вниз — сделал наконец-то отмену автоповтора при слезании, а то Балбес не останавливался на этаже, если находил сразу же лиану вниз, а продолжал спускаться уже по ней
  • BUG: при пересечении экрана вниз кто-то сталкивается с Балбесом — а точнее, если голова Балбеса была в одном окне, а тело в другом, то нижняя координата считалась неверно. И потому он «занимал» весь экран с Y=0 по Y=25 и первый попавшийся враг в этом диапазоне наносил урон
  • BUG: иногда при сработке щита звук урона — да, при срабатывании щита не сбрасывался флаг и тут же назначался общий звук урона
  • BUG: при наколачивании нечисти удар в прыжке не считается? — удар считался, но набитая нечисть подсчитывалась только при ударе на земле
  • BUG: при накоплении мышь и череп одно и тоже?? — была кривая проверка

Что осталось на данный момент:

BUG: в золотом нет призрака?
BUG: Балбес проваливается в 18-03, во втором через флаг в земле?
BUG: кость + пуля = порча фона
BUG: скелет не запрыгивает? сцена 11-02, начало GOON DOCKS
BUG: подарки с жизнями и опытом не работают
BUG: при отключенной музыке нет паузы после game over
BUG: ноты при вопле выводить ближе

15
Ноя
2023

Движемся по списку багов

Сегодня список уменьшился на три пункта:

+no BUG: МОНЕТА СВЕРХУ НА ГНОМА = ЗАВИС?
+no BUG: монета в стену завис?
+BUG: при падении на череп и ударе проваливается

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

Пока что список багов выглядит так:

BUG: подарки с жизнями и опытом не работают
BUG: при спуске по лиане клавиша вниз !
BUG: при пересечении экрана вниз кто-то сталкивается с Балбесом?
BUG: при отключенной музыке нет паузы после game over
BUG: иногда при сработке щита звук урона

14
Ноя
2023

Неплохая охота на баги

Исправил несколько давно бесивших багов:

  • Вопящий Шериф при первом появлении ненадолго превращался в Стрелка, а ведь у него нет фаз стрельбы — он вопит. Сделал ему отдельное движение, без «стрельбы»
  • Мышь отучена кусать Балбеса методом бесконтактного боя (уточнено расстояние между Мышью и Балбесом по вертикали)
  • спрайт «БУМ» при ударе по врагам выводился на месте «будущего» положения врага, а мы-то всегда видим «прошлое» положение, т.к. отображается уже готовый экран.
  • звуку вопля Шерифа назначен высший приоритет, т.к. до этого его заглушала падающая глыба

Оставшиеся баги (на данный момент):

BUG: подарки с жизнями и опытом не работают
BUG: МОНЕТА СВЕРХУ НА ГНОМА = ЗАВИС?
BUG: при спуске по лиане клавиша вниз !
BUG: при пересечении экрана вниз кто-то сталкивается с Балбесом?
BUG: монета в стену завис?
BUG: при падении на череп и ударе проваливается
BUG: при отключенной музыке нет паузы после game over
BUG: иногда при сработке щита звук урона
BUG: кость + пуля = порча фона
BUG: в золотом нет призрака?
BUG: Балбес проваливается через флаг в земле
BUG: скелет не запрыгивает? сцена 10-03
BUG: капля не исчезает, если нанесла урон в самой верхней своей позиции
BUG: ходим по водопадам

Возможно, какие-то баги уже «исправились» в процессе исправления других.

13
Ноя
2023

И снова о стенах

Как оказалось, стена немного неверно давит Шерифов, под раздачу попадали и монеты, которые летели на этой горизонтали. Поправил.

Осталось не так много неисправленных глюков. Потом, конечно, надо будет попытаться пройти всю игру и тогда найдется куча новых глюков.

09
Ноя
2023

Допиливаем движок

Добавил необходимую фичу: растущая стена теперь давит как Балбеса, так и Шерифов/Скелетов. Для реализации пришлось допиливать функцию определения столкновения спрайтов, но это итак было нужно делать. До этого времени удары били нечисть весьма вольготно, а в оригинале по Мыши еще попробуй попади (не зря она синусоиды выписывает), да и прыгающий череп убивается в верхнем положении только если Балбес при этом тоже бьет в прыжке. Сейчас как раз это я и начал реализовывать. Попутно исправлен баг с некорректным завершением игры при задавливании мешком.