Dive into the Ultimate Free Library: Your One-Stop Hub for Entertainment!

Paw Noir C64 devlog

Description
Кирилл и Тимофей портируют игру про котика на Commodore 64
Advertising
We recommend to visit

По рекламе: @evoanna

Last updated 4 days, 20 hours ago

По рекламе 👉🏼 @hotdogsup
Inst: vlad.muzalev🧑🏼‍🦲

@kroptop1

@sheikhto

@nkhamaev

@ssempaai

Сотрудничество по YouTube - @utopia_agency

Last updated 1 month ago

Ставим тут https://csgopositive.me/raiz

Канал с короткими нарезками моментов - https://www.youtube.com/@raizshort

Лицензионный софт - https://soft.store

Last updated 1 month, 1 week ago

1 month, 4 weeks ago

Извините, немного подвыгорел, после отпуска вернусь к игре

2 months, 2 weeks ago

Так

А вот теперь серьезно, го в субботу стрим в 13:00 Мск

2 months, 2 weeks ago

Давайте что ли завтра стрим по кодингу. В 13:00 МСК https://www.twitch.tv/bootak

3 months, 2 weeks ago
Paw Noir C64 devlog
3 months, 2 weeks ago
Ассемблер ассемблером, а в вебе я …

Ассемблер ассемблером, а в вебе я вообще ну просто полнейший ноль. Поэтому большое спасибо товарищу nill:rem, который на пыхаче за вечер наколбасил глобальную таблицу рекордов!

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

4 months ago

Поймал момент "открыл бардачок - заглох мотор"

Был такой баг: если играть вторым джойстиком и не пропускать экран с логотипом, то игра стартует без туториала

Вот такой с виду внезапный баг. Теперь немного контекста чтобы картинка сложилась:

  • Я сделал автоматический выбор управления. Пока управление не выбрано, игра проверяет нажатие Fire тремя способами: из первого джойстика (адрес dc01), из второго джойстика (адрес dc00) и с клавиатуры (опрос клавиатурной матрицы: пишем в dc00 столбец, читаем из dc01 строку). Если нажатие зафиксировано - запоминается его источник и впредь опрашивается только он
  • По умолчанию управление настроено на клавиатуру
  • Выбор управления встроен в функцию is_fire_just_pressed (проверка однократного нажатия Fire)
  • Эта функция вызывается для пропуска экрана с логотипом
  • После экрана с логотипом стартует экран с катсценами
  • На этом экране вызывается функция is_fire_pressed (проверка, что Fire нажат сейчас). В этой функции выбора управления не происходит
  • Игру можно запустить без туториала. Для этого на экране с перебивкой надо нажать Up + Fire вместо Fire

Ну а теперь механизм работы бага:
1. Мы не пропустили экран с логотипом. То есть у функции is_fire_just_pressed не было шанса настроить управление и оно осталось стандартным - с клавиатуры
2. В итоге мы попадаем на экран с катсценой, где вызываются обе функции: сначала is_fire_just_pressed (для переключения на следующую катсцену), а затем is_fire_pressed (для пропуска всех катсцен). При этом управление ещё не выбрано, поэтому в is_fire_pressed мы попадаем в обработчик клавиатурного ввода:

@is\_pressed\_kb lda \#%11111110 ; test column 0 sta $dc00 lda $dc01 and \#%00000010 ; Check "Return" rts

В итоге младший бит dc01 в выставляется в 0

Рано или поздно (для пропуска катсцен или выбора "New Game" в главном меню) мы всё-таки нажимаем Fire на джойстике. В is_fire_just_pressed срабатывает выбор управления и выбирается второй джойстик. Теперь мы читаем порт dc00. Где младший бит по-прежнему 0

И, наконец, на экране с перебивкой происходит такое:

jsr is\_fire\_pressed beq @skip\_state\_change lda GAME\_STATE sta current\_state jsr is\_up\_pressed bne @skip\_reset\_show\_tutorial lda \#0 sta should\_show\_tutorial

Т.е если нажат Fire - проверяем, нажат ли Up - и если да, то выключаем показ туториала. Хм. А как проверяется нажатие Up на втором джойстике? Да вот же:

lda $dc00 and \#%00000001 ; Check "Up" rts

Ага. 0b11111110 & 0b00000001 даёт 0, и в итоге игра считает, что "вверх" действительно нажат. Поэтому игра стартует без туториала, но ТОЛЬКО если играть со вторым джойстиком. Я очень редко тестировал именно этот кейс (обычно - при запуске на реальном железе), поэтому долгое время думал, что это какой-то железо-специфичный баг, не воспроизводимый на эмуляторе.

В итоге перенёс выбор управления в is_up_pressed и для оптимизации заменил выставление флага на модификацию кода:

is\_fire\_pressed jsr select\_input\_mode bcc @no ; overwrite first instruction to ; jmp is\_fire\_pressed\_no\_check lda \#$4c sta is\_fire\_pressed lda \#>is\_fire\_pressed\_no\_check sta is\_fire\_pressed+2 lda \#<is\_fire\_pressed\_no\_check sta is\_fire\_pressed+1 lda \#0 rts @no lda \#1 rts is\_fire\_pressed\_no\_check lda inputs\_mode beq @is\_pressed\_kb

Здесь после успешного выбора управления код модифицирует сам себя чтобы больше не вызывать функцию select_input_mode, а сразу прыгать на is_fire_pressed_no_check

5 months, 1 week ago
Комод выдает очень чёткую картинку

Комод выдает очень чёткую картинку

5 months, 1 week ago

Доделал эту часть туториала. Может, подумаю над текстом ещё. Но механика работает: когда вы впервые берёте трупик, вокруг него начинает летать рамка.

Сначала я хотел, чтобы рамка исчезала вместе с подсказкой. Но это было слишком рано. кажется, игроки могли бы даже не обратить на это внимание. Поэтому сейчас она исчезает в самый последний из возможных моментов: когда на экране появляется противник. Потому что пули и рамка используют одни и те же спрайты. Будь я чуточку умнее, я бы сделал sprite multiplexing и не парился бы об этом. Но в очередной раз удалось обойтись без него

5 months, 1 week ago
Парадоксы современности: 128к FLASH оказалась дешевле, …

Парадоксы современности: 128к FLASH оказалась дешевле, чем 64к EPROM

Так что купил тестовую партию и проверил, заработает ли. Заработало. Как думаете, чем забить оставшееся место на картридже?

5 months, 2 weeks ago
Начинаем разгребать обратную связь!

Начинаем разгребать обратную связь!

Итак, одна из проблем: игроки частенько пиксель-хантили положение трупика по X: дело в том, что если отпустить трупик, его X координата выравнивается по сетке тайлов. И иногда трупик может уехать вперёд дальше, чем вы хотели бы (и, например, упасть с обрыва)

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

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

Если у вас есть альтернативные идеи - буду рад их услышать!

Одна проблема: для её рисования понадобится 2 спрайта. А у меня все 8 уже использованы (4 на котика, 2 на трупик, 2 на пули)

Пришло время сдуть пыль с написанного ещё в апреле спрайт мультиплексинга, который позволял засунуть кота в 2 спрайта

We recommend to visit

По рекламе: @evoanna

Last updated 4 days, 20 hours ago

По рекламе 👉🏼 @hotdogsup
Inst: vlad.muzalev🧑🏼‍🦲

@kroptop1

@sheikhto

@nkhamaev

@ssempaai

Сотрудничество по YouTube - @utopia_agency

Last updated 1 month ago

Ставим тут https://csgopositive.me/raiz

Канал с короткими нарезками моментов - https://www.youtube.com/@raizshort

Лицензионный софт - https://soft.store

Last updated 1 month, 1 week ago