Восьмая часть туториала по созданию подземелья на Commodore BASIC. В прошлый раз у игры не было врагов — гоблины стояли столбами. Теперь они гоняются за игроком. Ради этого пришлось чинить дикий баг с памятью, который на глазах портил символы на экране.
Первое изменение — переназначение клавиш. Раньше управление было зашито буквами (QAOP). Теперь игра сама не сравнивает с буквами — только с переменными вроде QKEY$. Все пять клавиш хранятся отдельно. Важно: в Commodore BASIC переменные опознаются только по первым двум символам. Если назвать PLAYERHEALTH и PLAYERX — это одна и та же переменная PL. Ещё нельзя использовать ключевые слова внутри имён: GOLD сломается, потому что BASIC видит GO.
Программа переопределения клавиш использует GET, а не INPUT. Чтобы ждать нажатия, сделали бесконечный цикл: GET K$: IF K$="" THEN GOTO CHANGETHISKEY. В конце — подтверждение, чтобы не ошибиться.
Гоблины перестали быть просто картинками. Теперь у них есть массивы GX, GY и GH на 10 штук. Координаты считаются со смещением +1, потому что гоблин стоит в центре метатайла. Если на карте выпадет больше десяти тайлов с гоблинами — вылетит ?BAD SUBSCRIPT ERROR.
ИИ гоблинов — примитивный, но работает. Сравнивается позиция игрока и гоблина по X и Y. Если гоблин левее — идёт вправо, если выше — вниз и так далее. Перемещение проверяется через PEEK на наличие точки пола. Если там стена или другой гоблин — стоит на месте. Движение пошаговое: сначала игрок, потом враги.
Боевая система — бросок d20 с модификатором силы. Формула классическая: INT((STATS(0)-10)/2). Armour Class гоблина твёрдо задан восьмёркой. Если промах — игрок получает 5 урона, хотя по правилам D&D промах есть промах. Бросок семенится от системного таймера R=RND(-TI), иначе последовательность будет одинаковой.
Самый жуткий баг — глитчи символов. Текст превращался в кашу, буквы пропадали. Проблема: VIC-II видит только первые 16 КБ памяти. Туда же лезет и BASIC со своими массивами. Старый файл с шрифтами занимал 4 КБ начиная с адреса 12288. Когда массивы гоблинов доросли до этого адреса, они начали писать поверх буквы A.
Решение — обрезать шрифт до 2 КБ и сдвинуть на адрес 14336. Регистр видеопроцессора 53272 перепрограммируется через POKE, а BASIC'у говорят, что память кончается на 14336. Проблема: CLR, который применяет новую границу, стирает все переменные. Поэтому флаг «я уже сделал фикс» хранится в байте по адресу 2 — его CLR не трогает. Используется значение 73. Вероятность случайного совпадения — 1 к 256.
В планах на будущее: нормальные атаки гоблинов, генерация врагов без перекосов, условия победы и поражения, разные типы монстров, туман войны, лестницы и этажи.