Девять месяцев ассемблера или как я все еще пишу игру на Commodore 64...
Начнем с позитива
Я написал практически весь игровой код. Осталось только вылавливать баги и, возможно, внедрять что-то новое.
Более того, я уже выставил первую версию игры на всеобщее обозрение, и скачать ее можно вот здесь:
В этой версии полностью готов первый уровень, но нет никаких звуков и музыки (об этом ниже). И именно так этот уровень будет выглядеть в финальной версии игры.
Для игры потребуется либо реальное железо с эмулятором дисковода (например, SD2IEC) или программный эмулятор (конечно же это VICE Emulator). Просто запускаем VICE и выбираем File-Smart attach...-Autostart. Сразу предупрежу, что игры на Commodore 64 грузятся очень долго. Для таких случаев в левом нижнем углу эмулятора есть кнопка Warp, которая ускоряет работу процессора в 10 раз.
В игре работает все, что планировалось, и даже больше. Изучаем уровни, ищем ключи и оружие, читаем сюжет, сражаемся с врагами. Даже секреты есть.
Исследование
Карты небольшие - всего 24*24 блока, но я постарался забить их под завязку с учетом ограничений. Например, на одной карте нельзя разместить более 32 объектов (патроны, ключи и прочее). А еще максимум 96 триггеров отвечают за всю логику карты (двери, кнопки, подбор предметов и т.д.)
Ограничения пришлось ввести из-за небольшого размера памяти дискеты (166 Кб) и самого компьютера (64 Кб), но даже при таком раскладе размер одной карты составляет чуть больше 7 Кб.
Карты я рисую в Tiled, и пришлось написать скрипт для переноса данных на язык ассемблера.
В исследовании мира помогает компас в текстовой зоне, а также мини-карта, которая открывается на клавишу M. Ее можно перемещать, но отображаться будут только те блоки, которые игрок уже видел. Более того, не будут видны принудительно закрытые блоки.
Битвы и ролевая система
Битвы случайные с вероятностью в 7% на каждый ход. На одну карту заготовлено 4 уникальных противника. При этом я стараюсь соблюсти баланс и сделать их не слишком сложными и не слишком сильными для игрока.
Ролевая система очень простая. И у игрока и у врагов есть всего 4 параметра: Attack, Defence, Dexterity и Accuracy. Последние два отвечают за вероятность промаха. Чем больше Accuracy у игрока и чем меньше Dexterity у врага, тем больше шанс по врагу попасть.
Первые два параметра отвечают за урон. Здесь работает такое же соотношение, как и в первом случае, но еще учитывается диапазон урона оружия.
Есть и нюансы. Игрок, например, может атаковать, защититься (Defence X2) и уклониться (Dexterity X2). У врага опций больше. Он может совершить сильную атаку (Attack X4) и аккуратную атаку (Accuracy X4). Из-за этого игрок должен делать выбор: рисковать, защищаться или уклоняться.
Сделал я это затем, что изначально защита и уклонение были довольно бесполезными штуками. Теперь же, если враг совершает сильную атаку, приходится уклоняться, потому что иначе он может убить одним ударом.
А еще все это сопровождается вот такими олдскульными эффектами:
Но у игрока тоже есть преимущество. Во-первых, можно выучить паттерны поведения врагов (они не случайные и зашиты в код). Во-вторых, каждый враг подвержен воздействию какого-либо оружия. Если атаковать его нужным оружием, то окончательный урон умножается на два. В общем, надо экспериментировать.
За каждую победу игроку дается опыт. Причем значение зависит от соотношения между параметрами игрока и врага. То есть можно, конечно, бесконечно фармить слабых врагов на первом уровне, но смысла в этом особого нет.
А еще можно сбежать с поля боя с вероятностью 1/3. И это полезно в самом крайнем случае. Опыта за такое не дают, а враги на следующей карте будут крайне рады слабому игроку. Не стоит забывать и про боссов, от которых сбежать не получится (и которые еще не сделаны, если честно).
Лечение
На картах разбросаны аптечки и броня. Их можно использовать, неожиданно, для лечения и починки брони. Каждый предмет восстанавливает полностью нужный параметр, но самих предметов на карте не очень много, поэтому надо экономить. А еще эти предметы можно использовать в бою.
Сохранение и загрузка
Без этого обойтись было нельзя. Игра получается не слишком простой, поэтому надо было дать такую возможность.
Было несколько вариантов:
- Пароли. Прям как в старых играх, да! Но проблема заключается в том, что сохранять надо больше 2 Кб информации. В единственный пароль это не влезет.
- Сохранять на дискету только номер уровня и основные параметры при его запуске. Это имеет право на существование (и это можно даже в пароль засунуть), но я решил пойти третьим путем.
- Сохранить все, что возможно. Сюда входит номер уровня, его состояние и все основные параметры.
Так я и поступил, и теперь сохраняться можно в любой момент. Файл пишется на дискету и с нее же считывается.
Музыка и звуки
А их нет. Я только начал разбираться, как устроен звуковой чип (SID), но для меня это пока что темный лес. Я не музыкант, и никогда им не стану. Поэтому надеюсь на помощь товарищей-музыкантов и пытаюсь искать единомышленников. Без звуков игра будет неполноценной, поэтому заняться этим определенно надо.
Сторонний софт
Софта для разработки игр на Commodore 64 просто дофига.
Код я пишу в CBM prj Studio, но не могу посоветовать. Лучше взять обычный VS Code и скачать один из кучи плагинов для разработки под процессор MOS 6502.
Для тайловой графики и спрайтов можно обратиться к этому сайту:
Графику в режиме BitMap можно рисовать в программе Multipaint
Для музыки и звуков есть много трекеров. Я лично положил глаз на SID Factory II.
Но было бы все так просто...
Проприетарный софт
Мне пришлось написать две программы.
Первая программа для отрисовки попиксельной графики в режиме Multicolor. Дело в том, что Multipaint распределяет цвета по памяти в соответствии с каким-то своим алгоритмом. Мне нужно было, чтобы я мог выбирать все 3 цвета для каждого знакоместа вручную. Эту штуку я написал на Python, и она получилась очень тормознутой, но для моих целей хватает. Она позволяет переносить данные в формат ассемблера и сохранять .png файлы.
Вторую программу я написал для отрисовки объектов на уровне. Дело в том, что каждый объект в игре состоит из четырех аппаратных спрайтов Commodore 64, и надо было эти спрайты как-то совместить, чтобы не рисовать их по-отдельности. Я нашел одну программу, которая позволяет сделать такое, но она продается только на itch.io, а в России заплатить я не могу.
Написал я программу на движке Godot, и она также умеет конвертировать изображение в ASM код.
И конечно было написано еще много скриптов, которые облегчают жизнь.
В такие моменты начинаешь понимать, какими монстрами были геймдизайнеры и разработчики тех времен. Без доступа к современным нам возможностям они умудрялись делать шедевры.
That's all Folks
Сейчас я занимаюсь тем, что рисую, рисую и еще раз рисую. Уровни, текстуры, врагов, объекты. Из всего этого когда-нибудь, я надеюсь, выйдет полноценная игра.
Особняком стоит звуковое сопровождение. Я даже не знаю, как к этому вопросу правильно подступиться. Но что-нибудь придумаем.
А еще я веду Telegram канал, в котором рассказываю про разработку этой игры. Но там еще много интересного. Например, недавно я купил советский компьютер "Микроша" и даже написал на нем программу для отображения тайловой графики.