(бухай): программируй
148 subscribers
465 photos
96 videos
3 files
65 links
Мысли, дегустация и код
Download Telegram
И тут я подумал, что неплохо было бы на экране как-нибудь визуально отображать попадания и промахи.

Например, при попадании в игрока можно быстро переключать цвета рамки экрана.
А при попадании во врага с помощью XOR переключать цвета спрайта.

И скорее всего это все нужно будет делать в прерываниях. Надеюсь, у меня там еще осталось время для такого.

И конечно, на все это надо наложить какие-нибудь звуки, а это вообще моя больная тема 😢
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤‍🔥2
Нашел на даче старый телевизор, Panasonic со встроенным кассетоприемником )

И Atari все таки предназначено именно для таких теликов. Изображение офигенное
🔥10❤‍🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Помучился с прерываниями, но засунул еще два для визуализации попаданий и промахов.

А помогло то, что я написал собственную функцию выхода из прерывания, которая намного короче, чем системная.

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

Для прерывания можно настроить два цвета и задержку между из переключениями.

На видео цвета меняются каждые 8 кадров в течение ≈ 2.5 секунд.
🔥2❤‍🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
С врагами примерно также, но так как у спрайтов 2 цвета общих и 4 уникальных, менять можно все шесть.

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

На этом спрайте мерцание выглядит неплохо, но на спрайте собаки совсем криво
👍2❤‍🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Который день борюсь с созданием fade out заставки. Самой заставки еще нет, поэтому экспериментирую на основном экране=)

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

Я добавил в цикл две задержки, каждая по 5 кадров. Да, это очень банальное решение.

Я помещаю в переменную timer_delay значение от 0 до 255 (от 0 до +- 5 секунд). Процессор в очередном прерывании считывает эту переменную, и если она не равна нулю, уменьшает значение на 1.

А в самой функции я просто жду:
        ; wait several moments        
lda #5
sta timer_delay
@delay_1
lda timer_delay
bne @delay_1


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

При этом я не могу в отладчике поймать момент, когда все начинает ломаться. Видимо пришла пора воспользоваться записью процесса в VICE.
❤‍🔥1
Кстати, у меня часто встречается вот такой косяк с цветами на экране, когда я использую дебаггер.

Как я давно выяснил, это не проблема. Просто C64 Debugger при загрузке игры пишет в текстовой области памяти то, что на второй картинке.

А так как в bitmap multicolor режиме текстовая область используется как хранилище цветов для каждого знакоместа, то и получается вот такая фигня.

В VICE и на оригинальном железе такой проблемы нет, к счастью=)
❤‍🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Написал более красивый шахматный паттерн для гашения экрана.
Это мне больше нравится, и возникла одна идея.

Сделать под каждую шахматную последовательность разные звуки как в играх Лукаса Поупа. А у него очень хорошо получаются резкие звуки в привязке к какому-то действию.

А проблема с таймером решилась очень просто. Оказалось, что это я очень тупил, потому что функцию fade_out вызывал в дебаггере. И я мог вызвать функцию, когда процессор выполняет какую-нибудь из системных функций и при этом выключает прерывания. Логично, что все при этом перестает работать.

Если встроить код в стандартный процесс (в моем случае я поместил ее на кнопку Save), то все работает нормально=)
❤‍🔥5🔥5
За эту неделю сделал очень много, хотя пунктов будет всего 3.

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

Заставка:
Теперь при загрузке игры отображается не игровой экран, а заставка (пока что только тестовая😂), а текстовая зона переключается между двумя состояниями. при выходе из заставки она делает Fade-out и начинается загрузка игры.

Доработки:
Во-первых, я освободил больше 1 Кб памяти, потому что нашел пространство, которое вообще не использовалось игрой.
Во-вторых, перерисовал ключ, покрасил в разные цвета индикаторы здоровья и брони игрока и переделал компас.
В-третьих, переписал некоторые функции, которые почему-то занимали очень много места.

По-хорошему, надо доделать наконец функции смерти и побега от врага. Тогда можно будет приступать к рисованию уровней и графики.
Сохранение и загрузку начну делать позже, пока не очень понимаю, как это должно выглядеть=(
🔥5❤‍🔥2
В общем, я начал активно заниматься созданием уровней. И первым делом полностью перерисовал первый уровень.
Потратил 60 триггеров из 96 возможных на всякие важные штуки вроде дверей, ключей и сюжетного текста.
На уровень я хочу добавить всякие предметы, типа аптечек, оружия и патронов. Учитывая, что на один предмет мне нужно по 2 или 3 триггера, то выходит 18 или 12 предметов на уровень. Думаю, этого хватит.

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

Еще пока что на уровне 7 спрайтов-объектов из 32 возможных, но потом их станет больше. Это и ключи, и компьютеры с сюжетной информацией и монтировка.

Еще в планах дорисовать двух врагов (и определить их параметры) и какие-нибудь новые объекты (есть еще два свободных места). Ну и уровень можно считать готовым.

P.S. А еще я сделал явную отсылку на Heretic=)
🔥6❤‍🔥2
Media is too big
VIEW IN TELEGRAM
Уже довольно длинный видеотчет на реальном железе.
Даже немного порезал его, чтобы совсем не было скучно=)

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

Но все работает! И это, я считаю, главное.
🔥4❤‍🔥1
Пытался нарисовать военного, а вышло что-то среднее между гопником и персонажем из Cyberpunk 2077😂

Ограничение цветов конечно сказывается...
👍3😁3❤‍🔥1
Система уровней в Doom RPG конечно хорошая, но оказалось, что и подходит она только для Doom RPG.
Поэтому я решил переписать две функции.

Начну с получения опыта при победе.
В Doom RPG результат рассчитывается исходя только из характеристик врага. Таким образом, даже на высоких уровнях все зависело не от того, насколько ты сильнее или слабее врага, а только от самого врага. И это совершенно не работает в моей игре.
Поэтому я решил высчитывать полученный XP исходя из соотношения параметров врага к параметрам игрока. Получилась такая формула:
exp = ((e_attack<<8 / p_attack) + (e_defence<<8 / p_defence) + (e_dexterity<<8 / p_dexterity) + (e_accuracy<<8 / p_accuracy))/60

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

И мы переходим ко второй проблеме.
Повышение границы необходимого опыта при повышении уровня.
В Doom RPG каждый уровень граница опыта просто увеличивается на 20. Там это работало. В моей игре не работает совсем. Поэтому я написал такую формулу:
next_exp = current_exp + level * 5 + 160

Таким образом, каждый уровень необходимое количество опыта растет в геометрической прогрессии. Если взять предыдущую формулу, то за одного врага (если он примерно равен по силе игроку) дается +/-16 опыта. То есть на первом уровне игроку надо убить 10 врагов, а вот на 99-ом уже 40. Это не учитывая очень сильных и очень слабых противников.

Ну и наконец, я перерисовал предыдущего противника и нарисовал еще одного.
Перерисовать пришлось, потому что на первом уровне много зеленых стен и Человек-Х с ними тупо сливается🤦‍♂️
🔥4❤‍🔥2
https://www.youtube.com/watch?v=DZgFafrS85s&t=801s

Увидел вот такое видео про Commodore и решил проверить сам, как это работает.
И это работает. Если забить в адрес 788 значение 82, то можно рисовать курсором.

А почему это работает.
Потому что 722 в шестнадцатеричной системе это $0314.
И это адрес нижнего байта вектора прерывания.
То есть, записывая в этот адрес новое значение мы немного смещаем вектор, и компьютер не выполняет несколько значимых вещей. Например, обновление таймера и моргание курсором.

Это реально круто, потому что у меня значительная части игры строится на прерываниях. За счет этого в нижней части экрана отображается текст, который просто изменять. За счет этого моргают враги при атаке. А еще параллельно работают два таймера, которые я запускаю при необходимости сделать какую-либо задержку=)
❤‍🔥4👍2
Нарисовал пару новых спрайтов для окружения уровня, и на этом доступные спрайты закончились.
Ну и вот, как выглядят новые враги первого уровня в самой игре. Доступные враги тоже кстати закончились.

Осталось прописать им адекватные параметры и поведение.

А еще починил скрипт повышения уровня. Оказалось, что неправильно проводилось сравнение 16-ти битных чисел (текущий опыт и необходимый опыт), поэтому уровни повышались после каждого убитого врага=)
🔥5❤‍🔥4👍3