Опять немного поправил функцию для расчета урона и перенес ее в ассемблер. Получилась конечно та еще дичь, но вроде работает.
; ---------------------- CALCULATE DAMAGE ------------------------------
; weapon_min + (rand(weapon_min; weapon_max) * ((((player_attack << 4)/enemy_defence)*32)>>6))
; ----------------------------------------------------------------------
; rotate left player attack 4 times
lda fight_player_attack
sta rotate_inout
lda #0
sta rotate_inout+1
ldy #3
jsr rol_16bit
; divide player_attack by enemy_defence
lda rotate_inout
sta div_dividend
lda rotate_inout+1
sta div_dividend+1
lda fight_enemy_defence
sta div_divisor
lda #0
sta div_divisor+1
jsr divide_16bit
; multiply the previous result by 32
lda div_dividend
sta mult_f_number
lda div_dividend+1
sta mult_f_number+1
lda #32
sta mult_s_number
lda #0
sta mult_s_number+1
jsr mult_16bit
; rotate right the previous result 6 times
lda mult_result
sta rotate_inout
lda mult_result+1
sta rotate_inout+1
ldy #5
jsr ror_16bit
; get random weapon strength
jsr get_random_number
lda rnd_1
ldy curr_weapon_mod
jsr mod
clc
adc curr_weapon_add
; multiply random number by the previous result
sta mult_f_number
lda #0
sta mult_f_number+1
lda rotate_inout
sta mult_s_number
lda rotate_inout+1
sta mult_s_number+1
jsr mult_16bit
; add minimum weapon strength
lda mult_result
clc
adc curr_weapon_add
sta mult_result
lda mult_result+1
adc #0
sta mult_result+1
❤🔥1
А вообще возникла такая идея.
У игрока будет всего 4 возможных варианта в бою (не считая аптечки и брони):
— Атака - обычная атака;
— Защита - defence * 2;
— Уклонение - dexterity * 2;
— Побег - dexterity / 2;
А вот с врагами интереснее!
Будет три типа атаки:
— Обычная атака;
— Усиленная атака - attack * 2
— Хитрая атака - accuracy * 2
И также будут уклонение и защита, как и у игрока.
И игроку надо будет выбирать, как поступить дальше. Например, если враг использует усиленную атаку, логичным вариантом будет встать в защиту.
На экран будут выводиться подсказки, но думаю, что для каждого врага нужно будет придумать свою собственную подсказку, как в старых jrpg.
Хочется уже показать что-то кроме сплошных формул, но пока на экране ничего не происходит=(
У игрока будет всего 4 возможных варианта в бою (не считая аптечки и брони):
— Атака - обычная атака;
— Защита - defence * 2;
— Уклонение - dexterity * 2;
— Побег - dexterity / 2;
А вот с врагами интереснее!
Будет три типа атаки:
— Обычная атака;
— Усиленная атака - attack * 2
— Хитрая атака - accuracy * 2
И также будут уклонение и защита, как и у игрока.
И игроку надо будет выбирать, как поступить дальше. Например, если враг использует усиленную атаку, логичным вариантом будет встать в защиту.
На экран будут выводиться подсказки, но думаю, что для каждого врага нужно будет придумать свою собственную подсказку, как в старых jrpg.
Хочется уже показать что-то кроме сплошных формул, но пока на экране ничего не происходит=(
❤🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Немного помучился вчера с боями и теперь есть, что показать=)
Пока работают только 3 кнопки: атака, защита и уклонение.
— При атаке урон высчитывается по уже известной формуле. При этом, 25% урона всегда идет на броню, а остаток на здоровье. Если урон броне перевалил за количество брони, то остаток урона прибавляется к урону здоровья. Возможно над этим надо еще подумать.
— При нажатии на "Защиту", показатель defence умножается на 2.
— Аналогично с "Уклонением". Но на 2 умножается dexterity.
— После хода игрока все показатели врага сбрасываются до дефолтных значений и vice versa.
А ну и еще немного перерисовал текстуры первого уровня, изменил сам уровень и начал добавлять сюжетный текст.
Когда-нибудь это закончится, а то 14 мая будет уже ровно полгода, как мне в голову пришла идея снова заняться игрой на коммодор...
Пока работают только 3 кнопки: атака, защита и уклонение.
— При атаке урон высчитывается по уже известной формуле. При этом, 25% урона всегда идет на броню, а остаток на здоровье. Если урон броне перевалил за количество брони, то остаток урона прибавляется к урону здоровья. Возможно над этим надо еще подумать.
— При нажатии на "Защиту", показатель defence умножается на 2.
— Аналогично с "Уклонением". Но на 2 умножается dexterity.
— После хода игрока все показатели врага сбрасываются до дефолтных значений и vice versa.
А ну и еще немного перерисовал текстуры первого уровня, изменил сам уровень и начал добавлять сюжетный текст.
Когда-нибудь это закончится, а то 14 мая будет уже ровно полгода, как мне в голову пришла идея снова заняться игрой на коммодор...
🔥5❤🔥2
https://youtu.be/LnzuMJLZRdU?si=S59nYuS6Pftfr8tw
Офигенная серия видео. Мужик на макетной плате собирает компьютер на базе процессора 6502 и тут же программирует его.
После этого видео захотелось тоже чем-то таким заняться, но с чего начать, не могу сообразить.
Погуглил, оказывается, есть куча современных микропроцессоров, да и 6502 все еще производят (точнее 65С02). Но как к этому подступиться, пока не понимаю)
Офигенная серия видео. Мужик на макетной плате собирает компьютер на базе процессора 6502 и тут же программирует его.
После этого видео захотелось тоже чем-то таким заняться, но с чего начать, не могу сообразить.
Погуглил, оказывается, есть куча современных микропроцессоров, да и 6502 все еще производят (точнее 65С02). Но как к этому подступиться, пока не понимаю)
YouTube
“Hello, world” from scratch on a 6502 — Part 1
Learn how computers work in this series where I build and program a basic computer with the classic 6502 microprocessor. More info: https://www.eater.net/6502
Part 2: https://www.youtube.com/watch?v=yl8vPW5hydQ
Part 3: https://www.youtube.com/watch?v=oO8_2JJV0B4…
Part 2: https://www.youtube.com/watch?v=yl8vPW5hydQ
Part 3: https://www.youtube.com/watch?v=oO8_2JJV0B4…
❤🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Не так давно я начал заниматься ролевой системой и уже добавил проверку на попадание и расчет урона.
И это все хорошо, но у меня даже изображений врагов нет, как и других изображений, потому что их было сложно рисовать.
Один игровой спрайт в моей игре состоит из 4 хардварных спрайтов. Я сперва рисовал игровые спрайты в Aseprite (двойные пиксели трудно рисовать), а потом переносил вручную изображение в редактор спрайтов для Commodore, где рисовал их уже по отдельности (и это очень неудобно).
Поэтому я не придумал ничего лучше, чем создать собственный редактор спрайтов исключительно для своей игры. Это очень сырая версия, которую потом я конечно же доработаю (нет). Осталось добавить только функции для сохранения изображений в json, png и asm.
А писал я кстати на Godot. Обожаю этот движок за то, что на нем можно спроектировать все что угодно за день-два.
Редактор поддерживает все возможности Commodore:
Во-первых, можно отдельно отключить сетку для каждого пикселя и сетку для каждого спрайта.
Во-вторых, можно выбрать цвет для каждого спрайта и два цвета, общих для всех спрайтов.
В-третьих, можно выбрать, каким из цветов рисовать конкретный пиксель (или стереть его)
В-четвертых, все это работает в 60 FPS.
Короче, как допишу сохранение и загрузку, станет намного проще.
А то, как я реализовал в итоге шанс попадания по врагу в игре потом покажу)
И это все хорошо, но у меня даже изображений врагов нет, как и других изображений, потому что их было сложно рисовать.
Один игровой спрайт в моей игре состоит из 4 хардварных спрайтов. Я сперва рисовал игровые спрайты в Aseprite (двойные пиксели трудно рисовать), а потом переносил вручную изображение в редактор спрайтов для Commodore, где рисовал их уже по отдельности (и это очень неудобно).
Поэтому я не придумал ничего лучше, чем создать собственный редактор спрайтов исключительно для своей игры. Это очень сырая версия, которую потом я конечно же доработаю (нет). Осталось добавить только функции для сохранения изображений в json, png и asm.
А писал я кстати на Godot. Обожаю этот движок за то, что на нем можно спроектировать все что угодно за день-два.
Редактор поддерживает все возможности Commodore:
Во-первых, можно отдельно отключить сетку для каждого пикселя и сетку для каждого спрайта.
Во-вторых, можно выбрать цвет для каждого спрайта и два цвета, общих для всех спрайтов.
В-третьих, можно выбрать, каким из цветов рисовать конкретный пиксель (или стереть его)
В-четвертых, все это работает в 60 FPS.
Короче, как допишу сохранение и загрузку, станет намного проще.
А то, как я реализовал в итоге шанс попадания по врагу в игре потом покажу)
🔥5❤🔥1
Короче повозился я с этой программой, а все потому что ассемблер приучил меня все усложнять ради производительности. В Godot импорт изображений в рантайме осуществляется одной строкой, а я написал аж 4. Из-за этого, после экспорта в .exe, она перестала работать нормально (уже починил).
Но рисовать спрайты реально стало удобнее. Теперь не приходится подгонять пиксели под сетку 2*1, а потом переносить каждый спрайт по отдельности в другой редактор.
Но проблема все равно есть. Для редактора я брал цвета с Commodore Wiki, и они должны быть правильными. Но вот в эмуляторе это все выглядит совершенно иначе (на реальном железе еще не проверял).
Вот, нарисовал кривую собаку) В редакторе выглядит ну... нормально, а в самой игре ИМХО хуже.
Хотя и в этом есть вайб 80-х. Там и не таких уродцев можно было встретить=)
Но рисовать спрайты реально стало удобнее. Теперь не приходится подгонять пиксели под сетку 2*1, а потом переносить каждый спрайт по отдельности в другой редактор.
Но проблема все равно есть. Для редактора я брал цвета с Commodore Wiki, и они должны быть правильными. Но вот в эмуляторе это все выглядит совершенно иначе (на реальном железе еще не проверял).
Вот, нарисовал кривую собаку) В редакторе выглядит ну... нормально, а в самой игре ИМХО хуже.
Хотя и в этом есть вайб 80-х. Там и не таких уродцев можно было встретить=)
👍4❤🔥1
А вообще жесть. Я тут посчитал, что раз у меня на каждый уровень уникальные текстуры стен и спрайты врагов и объектов, то получается, что мне надо нарисовать:
— 16 * 10 уровней = 160 текстур;
— 4 * 10 = 40 врагов;
— 4 * 10 = 40 объектов;
Итого 240 изображений.
Кажется, что я буду использовать уже имеющиеся текстуры на других уровнях, но менять окраску (как в Doom RPG), и это должно сработать.
Немного цветовой магии, и вот обычная собака превращается в посланника ада (нет)
В общем, это можно использовать)
— 16 * 10 уровней = 160 текстур;
— 4 * 10 = 40 врагов;
— 4 * 10 = 40 объектов;
Итого 240 изображений.
Кажется, что я буду использовать уже имеющиеся текстуры на других уровнях, но менять окраску (как в Doom RPG), и это должно сработать.
Немного цветовой магии, и вот обычная собака превращается в посланника ада (нет)
В общем, это можно использовать)
😁3❤🔥2👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Почти дописал боевую систему!!!
Правда не очень понятно, насколько она вышла адекватной. Надо тестировать. А еще обязательно надо будет проверить пошагово на правильность кода. Визуально он вроде работает, но где-нибудь могла закрасться ошибка.
А еще надо бы как-то показывать на экране, чей ход. Сейчас, в принципе, это видно по тексту, но хотелось бы более понятный индикатор.
Когда враг планирует сильную или хитрую атаку, это отображается на экране. При этом игроку надо угадать, что делать дальше: защищаться или уклоняться. Ну и после каждого хода врага есть задержка в 2 секунды, чтобы игрок успевал прочитать текст. Да, вродекривого кода дофига с кучей деления и умножения, но отрабатывает моментально.
Ну и последнее. Я решил пойти по простому пути в части поведения врагов. У каждого врага будет тип (или характер). Будут тупые или аккуратные враги, которые только атакуют и/или защищаются. Будут враги-маньяки, которые будут чаще бить усиленными атаками и т.д. Все паттерны поведения будут храниться в таблице
Правда не очень понятно, насколько она вышла адекватной. Надо тестировать. А еще обязательно надо будет проверить пошагово на правильность кода. Визуально он вроде работает, но где-нибудь могла закрасться ошибка.
А еще надо бы как-то показывать на экране, чей ход. Сейчас, в принципе, это видно по тексту, но хотелось бы более понятный индикатор.
Когда враг планирует сильную или хитрую атаку, это отображается на экране. При этом игроку надо угадать, что делать дальше: защищаться или уклоняться. Ну и после каждого хода врага есть задержка в 2 секунды, чтобы игрок успевал прочитать текст. Да, вроде
Ну и последнее. Я решил пойти по простому пути в части поведения врагов. У каждого врага будет тип (или характер). Будут тупые или аккуратные враги, которые только атакуют и/или защищаются. Будут враги-маньяки, которые будут чаще бить усиленными атаками и т.д. Все паттерны поведения будут храниться в таблице
👍2🔥2❤🔥1
И тут я подумал, что неплохо было бы на экране как-нибудь визуально отображать попадания и промахи.
Например, при попадании в игрока можно быстро переключать цвета рамки экрана.
А при попадании во врага с помощью XOR переключать цвета спрайта.
И скорее всего это все нужно будет делать в прерываниях. Надеюсь, у меня там еще осталось время для такого.
И конечно, на все это надо наложить какие-нибудь звуки, а это вообще моя больная тема😢
Например, при попадании в игрока можно быстро переключать цвета рамки экрана.
А при попадании во врага с помощью XOR переключать цвета спрайта.
И скорее всего это все нужно будет делать в прерываниях. Надеюсь, у меня там еще осталось время для такого.
И конечно, на все это надо наложить какие-нибудь звуки, а это вообще моя больная тема
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Помучился с прерываниями, но засунул еще два для визуализации попаданий и промахов.
А помогло то, что я написал собственную функцию выхода из прерывания, которая намного короче, чем системная.
Первое прерывание моргает рамкой двумя цветами. Решил, что синий и голубой цвета будут означать, что игрок промахнулся.
Для прерывания можно настроить два цвета и задержку между из переключениями.
На видео цвета меняются каждые 8 кадров в течение ≈ 2.5 секунд.
А помогло то, что я написал собственную функцию выхода из прерывания, которая намного короче, чем системная.
Первое прерывание моргает рамкой двумя цветами. Решил, что синий и голубой цвета будут означать, что игрок промахнулся.
Для прерывания можно настроить два цвета и задержку между из переключениями.
На видео цвета меняются каждые 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.
А в самой функции я просто жду:
Так вот, иногда каким-то магическим образом эта функция ломает мне всю игру. Прерывания перестают работать, timer_delay не уменьшается и происходит бесконечный цикл.
При этом я не могу в отладчике поймать момент, когда все начинает ломаться. Видимо пришла пора воспользоваться записью процесса в VICE.
Получается криво, и я точно буду искать другой паттерн. Но не в этом главная проблема.
На видео функция отработала нормально, но так происходит не всегда.
Я добавил в цикл две задержки, каждая по 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 и на оригинальном железе такой проблемы нет, к счастью=)
Как я давно выяснил, это не проблема. Просто C64 Debugger при загрузке игры пишет в текстовой области памяти то, что на второй картинке.
А так как в bitmap multicolor режиме текстовая область используется как хранилище цветов для каждого знакоместа, то и получается вот такая фигня.
В VICE и на оригинальном железе такой проблемы нет, к счастью=)
❤🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Написал более красивый шахматный паттерн для гашения экрана.
Это мне больше нравится, и возникла одна идея.
Сделать под каждую шахматную последовательность разные звуки как в играх Лукаса Поупа. А у него очень хорошо получаются резкие звуки в привязке к какому-то действию.
А проблема с таймером решилась очень просто. Оказалось, что это я очень тупил, потому что функцию fade_out вызывал в дебаггере. И я мог вызвать функцию, когда процессор выполняет какую-нибудь из системных функций и при этом выключает прерывания. Логично, что все при этом перестает работать.
Если встроить код в стандартный процесс (в моем случае я поместил ее на кнопку Save), то все работает нормально=)
Это мне больше нравится, и возникла одна идея.
Сделать под каждую шахматную последовательность разные звуки как в играх Лукаса Поупа. А у него очень хорошо получаются резкие звуки в привязке к какому-то действию.
А проблема с таймером решилась очень просто. Оказалось, что это я очень тупил, потому что функцию fade_out вызывал в дебаггере. И я мог вызвать функцию, когда процессор выполняет какую-нибудь из системных функций и при этом выключает прерывания. Логично, что все при этом перестает работать.
Если встроить код в стандартный процесс (в моем случае я поместил ее на кнопку Save), то все работает нормально=)
❤🔥5🔥5
За эту неделю сделал очень много, хотя пунктов будет всего 3.
Самое главное:
Почти готовы сражения. Теперь мерцает и рамка и враг (синий/голубой - промах, красный/желтый - попадание).
При победе игрока высчитывается количество опыта, информация выводится на экран, а рамка мерцает зелеными цветами.
Заставка:
Теперь при загрузке игры отображается не игровой экран, а заставка (пока что только тестовая😂), а текстовая зона переключается между двумя состояниями. при выходе из заставки она делает Fade-out и начинается загрузка игры.
Доработки:
Во-первых, я освободил больше 1 Кб памяти, потому что нашел пространство, которое вообще не использовалось игрой.
Во-вторых, перерисовал ключ, покрасил в разные цвета индикаторы здоровья и брони игрока и переделал компас.
В-третьих, переписал некоторые функции, которые почему-то занимали очень много места.
По-хорошему, надо доделать наконец функции смерти и побега от врага. Тогда можно будет приступать к рисованию уровней и графики.
Сохранение и загрузку начну делать позже, пока не очень понимаю, как это должно выглядеть=(
Самое главное:
Почти готовы сражения. Теперь мерцает и рамка и враг (синий/голубой - промах, красный/желтый - попадание).
При победе игрока высчитывается количество опыта, информация выводится на экран, а рамка мерцает зелеными цветами.
Заставка:
Теперь при загрузке игры отображается не игровой экран, а заставка (пока что только тестовая😂), а текстовая зона переключается между двумя состояниями. при выходе из заставки она делает Fade-out и начинается загрузка игры.
Доработки:
Во-первых, я освободил больше 1 Кб памяти, потому что нашел пространство, которое вообще не использовалось игрой.
Во-вторых, перерисовал ключ, покрасил в разные цвета индикаторы здоровья и брони игрока и переделал компас.
В-третьих, переписал некоторые функции, которые почему-то занимали очень много места.
По-хорошему, надо доделать наконец функции смерти и побега от врага. Тогда можно будет приступать к рисованию уровней и графики.
Сохранение и загрузку начну делать позже, пока не очень понимаю, как это должно выглядеть=(
🔥5❤🔥2