По рекламе 👉🏼 @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
Извините, немного подвыгорел, после отпуска вернусь к игре
Так
А вот теперь серьезно, го в субботу стрим в 13:00 Мск
Давайте что ли завтра стрим по кодингу. В 13:00 МСК https://www.twitch.tv/bootak
Ассемблер ассемблером, а в вебе я вообще ну просто полнейший ноль. Поэтому большое спасибо товарищу nill:rem, который на пыхаче за вечер наколбасил глобальную таблицу рекордов!
Теперь любой желающий сможет поделиться своим результатом. Для этого надо в специальную формочку забить пароль, который игра выдаёт после прохождения. Там закодировано количество уровней, время, потраченные жизни. И всё это раскодируется, отвалидируется и положится в базу
Поймал момент "открыл бардачок - заглох мотор"
Был такой баг: если играть вторым джойстиком и не пропускать экран с логотипом, то игра стартует без туториала
Вот такой с виду внезапный баг. Теперь немного контекста чтобы картинка сложилась:
is_fire_just_pressed
(проверка однократного нажатия Fire) is_fire_pressed
(проверка, что 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
Комод выдает очень чёткую картинку
Доделал эту часть туториала. Может, подумаю над текстом ещё. Но механика работает: когда вы впервые берёте трупик, вокруг него начинает летать рамка.
Сначала я хотел, чтобы рамка исчезала вместе с подсказкой. Но это было слишком рано. кажется, игроки могли бы даже не обратить на это внимание. Поэтому сейчас она исчезает в самый последний из возможных моментов: когда на экране появляется противник. Потому что пули и рамка используют одни и те же спрайты. Будь я чуточку умнее, я бы сделал sprite multiplexing и не парился бы об этом. Но в очередной раз удалось обойтись без него
Парадоксы современности: 128к FLASH оказалась дешевле, чем 64к EPROM
Так что купил тестовую партию и проверил, заработает ли. Заработало. Как думаете, чем забить оставшееся место на картридже?
Начинаем разгребать обратную связь!
Итак, одна из проблем: игроки частенько пиксель-хантили положение трупика по X: дело в том, что если отпустить трупик, его X координата выравнивается по сетке тайлов. И иногда трупик может уехать вперёд дальше, чем вы хотели бы (и, например, упасть с обрыва)
Было бы здорово как-то визуально показывать, где именно по X окажется трупик, если его отпустить прямо сейчас
Попробую сделать вот такую "мишень", которая будет "прилипать" к сетке тайлов и давать визуальную подсказку, где окажется тело.
Если у вас есть альтернативные идеи - буду рад их услышать!
Одна проблема: для её рисования понадобится 2 спрайта. А у меня все 8 уже использованы (4 на котика, 2 на трупик, 2 на пули)
Пришло время сдуть пыль с написанного ещё в апреле спрайт мультиплексинга, который позволял засунуть кота в 2 спрайта
По рекламе 👉🏼 @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