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

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

Сперва я покусился на игры от Gameloft и потерпел фиаско. Хотел вытащить спрайты из Prince of Persia: Warrior Within, декомпилировал код, но там довольно сложная система архивации на сотню строк. Надо разбираться.

Зато Bobby Carrot зашел замечательно. Спрайты там даже не архивированы, а уровни можно изменять прямо в HEX-редакторе. Вот сделал самый легкий уровень на основе первого :)
❤‍🔥2
Все таки ассемблер периодически начинает надоедать, поэтому решил продолжить писать порт игры под винду с блэкджеком и увеличенными дальностью прорисовки и разрешением.
Уже перенес первый уровень, почти все триггеры и оружие. И как же странно программировать классами... В оригинале я почти об этом не думал. Конечно, разбивать разную функциональность на блоки надо, но куда важнее сохранить десятки, а то и сотни лишних байт. Поэтому никакого ООП в оригинальном коде, лишь жесткие обращения к нужным байтам.
👌1
А вообще возник вопрос. Стоит ли повышать дальность отрисовки?
Оригинал рисует только первые три блока перед игроком, и за счет этого ты никогда не знаешь, какие предметы попадутся тебе на пути.
Тут же всю карту видно и все предметы. Кажется, что из-за этого теряется интерес к исследованию уровней.
1👌1
Стоит ли оставить дальность прорисовки мира, как в оригинале?
Anonymous Poll
70%
Оставляй! Олдскул наше все.
30%
Конечно нет. Мы что, не в 21 веке живем?
Оставили мне тут комментарий на itch.io. И это мега-круто.

ZZAP!64 - это журнал, посвящённый чисто Коммодору, издается ещё с 80-х годов.

В итоге написал им на почту, попросили до 25 сентября сделать эксклюзивную версию игры для журнала и написать инструкции.

Буду популярным 😂

P.S. И это повод наконец-то выйти из прокрастинации. Новые уровни сами себя не сделают и графика сама себя не нарисует
🔥141
Нарисовал тут врагов для второго уровня. И как будто бы последний вообще не в тему=)

Сразу вспоминаются игры типа Might&Magic, где гоблины и скелеты соседствуют c ниндзя, живыми свечами, летающими рыбами и роботами. Хотя там все это обусловлено лором.

В целом, моя игра тоже позволяет всякие такие штуки, но вот ниндзя вообще не вписываются, по крайней мере на втором уровне=)
🔥2
Все, определился с врагами.
Пришлось немного переписать текст на уровне, чтобы немного приблизиться к лору с кровавыми глазами и гулями=) Но, в целом, я доволен.
Не доволен я теперь врагами на первом уровне. Как будто бы они слишком простыми вышли, возможно буду переделывать.

А еще начал изучать KickAssembler, и это просто великолепно. По сравнению с CBM prj Studio синтаксисом, на котором пишу сейчас, это небо и земля. Следующий проект точно буду писать на нем, этот уже поздно переделывать, к сожалению.

Например, сейчас, чтобы собрать high/low byte таблицы, мне приходится каждый байт расставлять ручками.
В KickAss же это дело одной команды:
// создаем две таблицы адресов строк экранной памяти
screen_a: .lohifill 25,$0400 + 40*i
// обращаемся к таблицам с помощью .hi/.lo
lda screen_a.lo
ldx screen_a.hi

Ну или можно засунуть это в цикл for:
// создаем таблицу low byte строк карты
map_lb: .for(var b=0;b<16;b++){
.byte <map_data+b*16
}

Тут вообще много полезных директив и конструкций, которые сильно упрощают жизнь. А писать можно в VSCode, и даже плагин есть.
В общем, советую=)
3👍3❤‍🔥21
This media is not supported in your browser
VIEW IN TELEGRAM
Пришло время выходить из прокрастинации.
Спасибо Кириллу Лейферу. Он подсказал мне замечательную идею - ограничить количество врагов на уровне.
И я это сделал. Игроку эта информация недоступна, а вот мне, как разработчику станет гораздо легче проектировать уровни и балансить врагов.
Когда игрок убивает врага, количество уменьшается. Когда оно достигает нуля, выводится сообщение, что мол "кажется, врагов вокруг не осталось", а игра перестает высчитывать вероятность их появления.

Забавно, как от идеи полуоткрытого мира, как в Hexen (да, такие планы тоже были), я добрался до откровенно линейной игры=)
3🤩1
Час чинил сейвы вместо того, чтобы готовить игру к публикации в журнале... При определенной последовательности действий игра загружала второй уровень с текстурами и врагами из первого=)

Сохраняемся на втором уровне — Умираем — Игра загружает первый уровень — Загружаем сейв — Игра загружает второй уровень — Сохраняемся заново — Умираем второй раз — Игра загружает первый уровень — Загружаем сейв. Поздравляю, вы сломали сейвы.

Дело в том, что при переходе с уровня на уровень и при их загрузке в памяти сохраняется указатель на название этого уровня, но не при загрузке сейвов.

Когда сейв загружается с дискеты, он проверяет указатель с сейв-файла на соответствие указателю в памяти.
Если указатели разные, то игра сперва загружает нужный уровень полностью. Если одинаковые, то загружаются только измененные данные.

Так вот, если умереть в первый раз на втором уровне в память кладется указатель на первый уровень. Если при этом загрузить сейв со вторым уровнем, то в память указатель на него не отправится.
А после очередного сохранения возникает несоответствие: в сейв-файле оказываются данные второго уровня с указателем на первый.

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

Слишком блин долгие загрузки!

Сейчас как все устроено. Ты умираешь, и игра переключается в состояние инициализации. Запускает заставку, потом начинает заново грузить первый уровень. А потом ты загружаешь сейв, и если ты умер на другом уровне, то она еще и новый уровень подгружает. В общем, сплошное ожидание, и это начинает бесить даже меня.

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

Что касается новых игроков, то на дискете уже будет лежать сейв в самом начале игры. И загружаться будет именно он. Да, при таком подходе есть и минусы. Если ты захочешь начать новую игру, и сейв у тебя лежит старый, то загружаться будет именно он. Но время, как мне кажется, дороже.

P.S. А еще я нарисовал вот такой милый дорожный конус)
🔥6
Что ж, это работает просто отлично!
Правда пришлось немного повозиться, потому что сперва у меня пропала половина цветов, как на скриншотах=)
Дело в том, что угасание экрана происходит простым заполнением нулями Color и Screen RAM (области памяти, отвечающие за цвета в Bitmap Multicolor Mode). И при загрузке сейва эти цвета не восстанавливаются.
Пришлось в очередной раз костылить и добавить в death state код загрузки изначальных значений с дискеты (да простят меня любители ООП).

Зато теперь игра после смерти грузит предыдущее сохранение за 15 секунд, что гораздо приятнее предыдущих нескольких минут!
🔥2