Прошел еще месяц разработки игры для Commodore 64
И это все больше становится похоже на настоящую игру.
Сделал я не так много, больше занимался отловом багов и внедрением украшательств. Но зато полностью закончил второй уровень и нарисовал для него врагов и объекты.
Долгие загрузки
Это бич Commodore 64. Еще в 80-х, когда Commodore разрабатывали дисковод 1540, то обнаружился критический баг, который мог полностью блокировать передачу данных из-за отсутствия синхронизации. Разработчикам пришлось пойти на изменение процесса передачи. Теперь вместо одного байта данные считывались по одному биту. Для предшественника C64 - Commodore VIC-20 это не было серьезной проблемой. В VIC-20 было всего 5 Кб оперативки, и загрузка происходила довольно быстро.
Но вот когда дело дошло до 64-килобайтового Commodore 64, эта проблема стала критической. Более того, новый видеочип VIC-II, который стоит в C64, периодически прерывает процессор, и это еще больше замедляет загрузку с дискеты.
Но как это влияет на мою игру?
В игре есть возможность сохраняться и загружаться в любой момент. Сохранение происходит на дискету. Раньше при смерти игрока стейт-машина переключалась в состояние инициализации игры, то есть сперва загружала заставку, потом загружала первый уровень. А если игрок умер на каком-нибудь другом уровне, то еще и новый уровень грузила.
Но теперь я сделал иначе. При смерти игра сразу загружает последний сейв, и это позволило ускорить все это дело с нескольких минут до 15 секунд.
Правда потом еще пришлось решать косяк с отсутствием цветов, потому что при шахматном угасании экрана все, что делает игра - это заполняет нулями области памяти, отвечающие за цвета в режиме Bitmap Multicolor Mode.
Было примерно так:
Решилось это загрузкой дефолтных данных цветов с дискеты при смерти игрока.
Несоответствие указателей на уровень
И долгими загрузками все не закончилось. В какой-то момент я обнаружил баг, из-за которого второй уровень грузился с текстурами и врагами из первого уровня.
С этим я разбирался долго, но оказалось, что это очень банальная проблема.
Чтобы воспроизвести баг, надо было сделать следующее:
- Переходим на второй уровень.
- Сохраняемся.
- Умираем. Игра начинает грузить первый уровень (это было еще до доработки принудительной загрузки последнего сейва).
- Загружаем сейв. Игра подгружает второй уровень.
- Сохраняемся еще раз и загружаемся.
- Profit... Игра сломана.
Чтобы проверить, на каком уровне сохранился игрок, в сейв файле первые два байта занимает указатель на название файла уровня. Такой же указатель находится в памяти, и при загрузке сейва проводится сравнение этих двух указателей. Если указатели разные, то происходит загрузка нового уровня, если одинаковые, то с дискеты подгружается только данные сейв-файла.
Проблема оказалась в том, что при смерти игрока и при загрузке сохранения новый указатель не помещался в память. И поэтому при последующем сохранении в сейв файле оказывался указатель на первый уровень с данными второго уровня.
Решилось это банальным принудительным сохранением указателя в память при каждой загрузке сохранения.
Враги и ролевая система
Игра получается непростой, и наверное именно за-за этого я добавил возможность сохраняться в любой момент.
На первом уровне, прежде чем игрок получит возможность выносить всех с двух ударов, ему надо пройти половину карты и раздобыть оружие. На втором уровне ситуация похожая. Вообще план такой: на каждом уровне враги будут бояться именно того оружия, которое лежит где-то в середине этой карты.
Причем, если постараться, то можно это оружие найти и на предыдущем уровне - оно будет лежать в секретной области.
Но самым сложным оказалось прописать баланс врагам. Они получались либо слишком простыми, либо слишком сложными, и я никак не мог найти золотую середину.
Пришлось даже пойти на ухищрения (спасибо Кириллу Лейферу за идею). Раньше в игре не было ограничений на количество врагов на карте. И если очень захотеть, можно было получить уже на первой карте хоть сколько уровней.
Теперь же я добавил ограничения. На первой карте, например, всего 20 врагов. После их убийства появляется сообщение, что враги, как будто бы закончились, и игра перестает высчитывать вероятность их появления.
И это очень хорошо помогло мне в балансировке врагов. Теперь я точн�� знаю, что игрок не дойдет до второй карты выше, чем на третьем уровне.
Но это не касается боссов. Во-первых, босс н�� попадает в ограничения, и при его убийстве счетчик не уменьшается. Во-вторых, от босса нельзя сбежать. Это сделано для того, чтобы игроки не эксплуатировали возможность побега из битвы. В-третьих, босс не появится на уровне, пока не будет запущен соответствующий скрипт, который телепортирует игрока на арену и не запускает сражение с боссом.
Минусом такого подхода оказалось то, что на картах с боссом будет не 4 типа врагов, а всего три. Четвертым будет сам босс.
ZZAP!64 и прокрастинация
На itch.io мне написал мужик из журнала ZZAP!64. Этот журнал посвящен Commodore 64 и выпускается аж с 80-х годов. Предложил он мне доработать игру и выложить в этом журнале следующую версию с инструкциями и скриншотами.
И как назло на меня навалилась прокрастинация.
Я написал уже почти весь код, и мне осталось только рисовать уровни, графику и сочинять музыку. А это для меня самое сложное. Поэтому я еле-еле осилил второй уровень, доработал вышеприведенные баги и отправил в журнал. Но времени потратил на это какое-то нереальное количество.
Еще параллельно начал раздумывать о следующей игре, и даже писать код, и это только отвлекает от процесса. Но игру надо закончить, не зря же я столько времени на это потратил
Зато враги получились более интересными, чем на первом уровне:
�� ведь я планирую сделать как минимум еще 6 уровней, и это будет непросто. Хорошо, что подружка пообещала написать мелодию, товарищ - нарисовать заставку, а вот звуки графику и все остальное придется делать самому.
Надеюсь, что смогу закончить игру в начале следующего года, а за процессом можно следить в моем Telegram-канале:
А предыдущую версию игры можно скачать на itch.io: