Прошел еще месяц разработки игры для Commodore 64

И это все больше становится похоже на настоящую игру.

Прошел еще месяц разработки игры для Commodore 64

Сделал я не так много, больше занимался отловом багов и внедрением украшательств. Но зато полностью закончил второй уровень и нарисовал для него врагов и объекты.

Долгие загрузки

Это бич Commodore 64. Еще в 80-х, когда Commodore разрабатывали дисковод 1540, то обнаружился критический баг, который мог полностью блокировать передачу данных из-за отсутствия синхронизации. Разработчикам пришлось пойти на изменение процесса передачи. Теперь вместо одного байта данные считывались по одному биту. Для предшественника C64 - Commodore VIC-20 это не было серьезной проблемой. В VIC-20 было всего 5 Кб оперативки, и загрузка происходила довольно быстро.

Дисковод Commodore-1541
Дисковод Commodore-1541

Но вот когда дело дошло до 64-килобайтового Commodore 64, эта проблема стала критической. Более того, новый видеочип VIC-II, который стоит в C64, периодически прерывает процессор, и это еще больше замедляет загрузку с дискеты.

Но как это влияет на мою игру?

В игре есть возможность сохраняться и загружаться в любой момент. Сохранение происходит на дискету. Раньше при смерти игрока стейт-машина переключалась в состояние инициализации игры, то есть сперва загружала заставку, потом загружала первый уровень. А если игрок умер на каком-нибудь другом уровне, то еще и новый уровень грузила.

Но теперь я сделал иначе. При смерти игра сразу загружает последний сейв, и это позволило ускорить все это дело с нескольких минут до 15 секунд.

Правда потом еще пришлось решать косяк с отсутствием цветов, потому что при шахматном угасании экрана все, что делает игра - это заполняет нулями области памяти, отвечающие за цвета в режиме Bitmap Multicolor Mode.

Было примерно так:

Прошел еще месяц разработки игры для Commodore 64
Прошел еще месяц разработки игры для Commodore 64

Решилось это загрузкой дефолтных данных цветов с дискеты при смерти игрока.

Несоответствие указателей на уровень

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

Прошел еще месяц разработки игры для Commodore 64

С этим я разбирался долго, но оказалось, что это очень банальная проблема.

Чтобы воспроизвести баг, надо было сделать следующее:

  • Переходим на второй уровень.
  • Сохраняемся.
  • Умираем. Игра начинает грузить первый уровень (это было еще до доработки принудительной загрузки последнего сейва).
  • Загружаем сейв. Игра подгружает второй уровень.
  • Сохраняемся еще раз и загружаемся.
  • Profit... Игра сломана.

Чтобы проверить, на каком уровне сохранился игрок, в сейв файле первые два байта занимает указатель на название файла уровня. Такой же указатель находится в памяти, и при загрузке сейва проводится сравнение этих двух указателей. Если указатели разные, то происходит загрузка нового уровня, если одинаковые, то с дискеты подгружается только данные сейв-файла.

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

Решилось это банальным принудительным сохранением указателя в память при каждой загрузке сохранения.

Враги и ролевая система

Игра получается непростой, и наверное именно за-за этого я добавил возможность сохраняться в любой момент.

На первом уровне, прежде чем игрок получит возможность выносить всех с двух ударов, ему надо пройти половину карты и раздобыть оружие. На втором уровне ситуация похожая. Вообще план такой: на каждом уровне враги будут бояться именно того оружия, которое лежит где-то в середине этой карты.

Прошел еще месяц разработки игры для Commodore 64

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

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

Пришлось даже пойти на ухищрения (спасибо Кириллу Лейферу за идею). Раньше в игре не было ограничений на количество врагов на карте. И если очень захотеть, можно было получить уже на первой карте хоть сколько уровней.

Теперь же я добавил ограничения. На первой карте, например, всего 20 врагов. После их убийства появляется сообщение, что враги, как будто бы закончились, и игра перестает высчитывать вероятность их появления.

И это очень хорошо помогло мне в балансировке врагов. Теперь я точно знаю, что игрок не дойдет до второй карты выше, чем на третьем уровне.

Но это не касается боссов. Во-первых, босс не попадает в ограничения, и при его убийстве счетчик не уменьшается. Во-вторых, от босса нельзя сбежать. Это сделано для того, чтобы игроки не эксплуатировали возможность побега из битвы. В-третьих, босс не появится на уровне, пока не будет запущен соответствующий скрипт, который телепортирует игрока на арену и не запускает сражение с боссом.

Минусом такого подхода оказалось то, что на картах с боссом будет не 4 типа врагов, а всего три. Четвертым будет сам босс.

ZZAP!64 и прокрастинация

На itch.io мне написал мужик из журнала ZZAP!64. Этот журнал посвящен Commodore 64 и выпускается аж с 80-х годов. Предложил он мне доработать игру и выложить в этом журнале следующую версию с инструкциями и скриншотами.

Прошел еще месяц разработки игры для Commodore 64

И как назло на меня навалилась прокрастинация.

Я написал уже почти весь код, и мне осталось только рисовать уровни, графику и сочинять музыку. А это для меня самое сложное. Поэтому я еле-еле осилил второй уровень, доработал вышеприведенные баги и отправил в журнал. Но времени потратил на это какое-то нереальное количество.

Еще параллельно начал раздумывать о следующей игре, и даже писать код, и это только отвлекает от процесса. Но игру надо закончить, не зря же я столько времени на это потратил

Зато враги получились более интересными, чем на первом уровне:

А ведь я планирую сделать как минимум еще 6 уровней, и это будет непросто. Хорошо, что подружка пообещала написать мелодию, товарищ - нарисовать заставку, а вот звуки графику и все остальное придется делать самому.

Надеюсь, что смогу закончить игру в начале следующего года, а за процессом можно следить в моем Telegram-канале:

А предыдущую версию игры можно скачать на itch.io:

1111
22
11
11
4 комментария

Чем хороша разработка под старые платформы: ты в одиночку можешь полностью разобраться в устройстве железки и запрограммировать ее как тебе хочется)
Никаких тебе уровней абстракции, никакой виртуальной памяти. Комп тупо делает, что ты ему скажешь

В качестве обучения программированию и устройству ПК вообще отличная тема)

1

Коммодор 64 познакомил меня с миром видеоигр. Навсегда в сердце.

1

Жалко, что в РФ он не очень популярен. Все на Спектруме сидят

1