ozkriff.games 🦀
221 subscribers
161 photos
8 videos
173 links
👋 I'm @ozkriff: Rust zealot, hobby game developer, fan of turn based games, one of arewegameyet.rs' maintainers and gamedev.rs' editors. ex-Wargaming, ex-JetBrains.

See the pinned message for more info and links: https://xn--r1a.website/ozkriff_games/4
Download Telegram
# Rust GameDev Newsletter 16: Ноябрь

📆 Выпустил ежемесячник по ржавому игрострою за Ноябрь: https://rust-gamedev.github.io/posts/newsletter-016 (обсуждения: Reddit, Twitter).

Отпуск закончился - будем считать, что я отдохнул) Скоро будут обновления по Земероту.
# Звуки!

Я наконец-то заканчиваю первую итерацию звуковых эффектов Земерота.

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

* opengameart.org - тут брал целые паки ("RPG Sound Pack", "Owlish Media Sound Effects", и т.п.) и подбирал из них релевантное.
* freesound.org - а тут выколупывал уже отдельные штучные записи.

Для всего скачанного сохранял ссылки и следил за лицензиями (CC0 или CC BY) - что бы с чистой совестью указать авторов в ридми и сходить по каждой ссылке поблагодарить их.

Пришлось даже освоить какие-то азы работы в Audacity для базового редактирования (в основном по ютуб видяхам, а текстом про изменения звуков совсем тяжко воспринимается):

* вырезание интересующих кусков из длинных записей (например, звуки оседающей пыли, толкания по поверхности и человеческой ходьбы все вырезаны из одной минутной записи, где человек упорно юлозит камнем по песку);

* создание своих эффектов на основе комбинаций кусков исходников (например, брызги крови - поставленная вплотную с наложением серия легких ударов по какому-то фрукту);

* удаление очень заметных фоновых шумов или лишних частот;

* перевод всего в 44100Hz и хотя бы грубо подгон всех отобранных звуков друг к другу по громкости.

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

* кельтских барабанов - в качестве минималистичной фоновой музыки;
* UI: нажатия на кнопки и началом хода;
* шагов, кряхтенья и вскриков (разными для людей и демонов);
* оседающей пыли и протаскивания по земле;
* сломанной брони, ударов по мясу и брызг крови;
* взмахами для острого и тупого оружия;
* взрывом бомб, горения, ожогов, отравления;
* магии, лечения и кровожадности;

Теперь про код. Поскольку игра недавно переехала на Федин macroquad, логично использовать квадовый звук: quad_snd. Базовый API простой, вот пример с парочкой звуков:

// создаем миксер
let mut mixer = SoundMixer::new();

// загружаем wav или ogg звук из байт
let sound_wav: Sound = decoder::read_wav(BYTES_WAV)?;
let sound_ogg: Sound = decoder::read_ogg(BYTES_OGG)?;

// отправляем звуки на однократное параллельное проигрывание
mixer.play(sound_wav);
mixer.play(sound_ogg);

// каждый кадр дергаем миксер в главном цикле
loop {
// ...
mixer.frame();
// ...
}

.play возвращает SoundId, используя который можно потом останавливать звук, менять его громкость и т.п.

Работает quad_snd на Linux/Win/macOS/WASM'е, но библиотека пока довольно сырая, доступная только напрямую с гитхаба - надо быть готовым к багрепортам, что у кого-то на машине звук не завелся.

Интеграция в код Земерота довольно прямолинейная:

* Завел глобальный ленивый миксер, используя once_cell::Lazy, и добавил его дергание каждый кадр.

* Изначальную асинхронную загрузку звуков пихнул в стандартный assets.rs модуль.

* Непосредственно запуск звуков на проигрывание выглядит как play_sound(&assets::get().sound.step) и вставляется в нужные места визуализаторов событий между всякими действиями, добавляющими, перекрашивающими и передвигающими спрайты. Внутри эта функция создает замыкание для scene::action::Custom, где дергается mixer::play(sound).

* Ну и добавил в компонент Agent поле типа enum AgentKind { Human, Imp }, что бы выбирать какие звуки играть.

В assets/sound директорию репозитория идут только 44100Hz (quad_snd не поддерживает другие рейты) .ogg файлы. Решил не заморачиваться с сохранением wav исходников и проектов Audacity ни в каком репозитории - если что понадобится существенно изменить в аудиофайлах, думаю, по ссылкам на исходники перевыкачаю архивы с исходниками и повторю операции.

Демо:
Потенциальные улучшения звуков, которые отложил на потом:

* не хватает еще парочки относительно редких звуков - например, эффекта оглушения;
* меню опций с настройкой громкости музыки и эффектов;
* наборы звуков со случайным выбором, что бы часто повторяющиеся действия (взмахи, вскрики и т.п.) звучали не так одинаково;
* стерео эффект в зависимости от горизонтального положения на карте?
# Rust GameDev Podcast 4: Fedor Logachev

На днях вышел 4й выпуск Rust GameDev Podcast с Федей в гостях:

https://rustgamedev.com/episodes/interview-with-fedor-logachev

Федя, если что, это разработчик SHAR (одной из первых серьезных ржавых игр) и miniquad/macroquad экосистемы.

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

Я теперь, видимо, сертифицированный Rust-евангелист.

Клац-клац! 🦀
# Rust GameDev Newsletter 17: Декабрь

📆 Выпустил наконец-то ежемесячник по ржавому игрострою за Декабрь: https://rust-gamedev.github.io/posts/newsletter-017 (обсуждения: Reddit, Twitter).

Задержка на две недели - это, конечно, не клево вышло. Буду активнее обсуждать частичную делегацию редактуры другим членам WG, хоть оно и грозит мне еще большим гемором в короткосрочной перспективе.
https://twitter.com/ozkriff/status/1353323170481115137 - вспомнил, что не показывал особо макеты своих прошлогодних экспериментов по варгеймостроению.

Возможно, минималистичный иконко-подобный 2D стиль и правда мог бы решить проблемы старой 3D версии с читаемостью и слотами внутри клеток. Я вряд ли в обозримом будущем ZoC воскрешать буду - слишком большой проект с не сильно четкими USP - но чего бы не выложить картинку? Авось когда-нибудь и вернусь к проекту таки.
# Rust GameDev Newsletter 18: Январь 2021

📆 Выпустил ежемесячник по ржавому игрострою за Январь: https://rust-gamedev.github.io/posts/newsletter-018 (обсуждения: Reddit, Twitter).

Попробовали с этого месяца несколько урезанный формат и работу редакторской командой - "Newsletter: new format and more delegation". Если все пойдет по плану, то следующий месяц или два выпускающим редактором буду не я, юху!
# Rust GameDev Newsletter 19: Февраль 2021

📆 Выпустили ежемесячник по ржавому игрострою за Февраль: https://rust-gamedev.github.io/posts/newsletter-019 (обсуждения: Reddit, Twitter).

Все таки пошло +- по плану, так что это первый выпуск, который координировал не я, а Форест (один из разработчиков Veloren). Ура делегации!

Сил на пиление своего Земерота я пока не нашел, продолжаю хандрить. Хотя бытовые дела теперь немного приведены в порядок, может в этом месяце получится собраться.
# Rust GameDev Newsletter 20: Март 2021

📆 Выпустил ежемесячник по ржавому игрострою за Март: https://rust-gamedev.github.io/posts/newsletter-020 (обсуждения: /r/rust, Twitter).

По Земероту и новому проекту в ближайшие месяцы обновлений можно не ждать: я вконец загнался и решил таки взять "отпуск от хобби" как минимум до лета (а то и до осени).
# gamedev.rs

Отличные новости вдогонку к ежемесячнику: только что закончил перевоз rust-gamedev.github.io на максимально роскошный домен:

https://gamedev.rs

Огромное спасибо Juratech Systems за подаренный домен, а то мы уж отчаялись выбирать из альтернатив.
# Rust GameDev Newsletter 21: Апрель 2021

📆 Выпустили ежемесячник по ржавому игрострою за Апрель: https://gamedev.rs/news/021 (обсуждения: Reddit, Twitter).

Первый выпуск, скординированный 17cupsofcoffee (автор Tetra).
# Rust GameDev Newsletter 22: Май 2021

📆 Выпустили ежемесячник по ржавому игрострою за Май: https://gamedev.rs/news/022
# WIP Android

Хоть мой "отпуск" от активных попыток работы над Земеротом еще не закончился (и продлится еще месяца полтора минимум), работа над Земеротом таки идет:

https://twitter.com/fedor_games/status/1397966033152057347

Федя занимается портированием на андроид и в процессе допиливает функционал/оптимизации в (mini|macro)quad. А я так, сбоку отсматриваю ПРы и немного помогаю с тестированием на своих железяках. Планирую в ближайшие дни дотащить вышеописанные звуки в основную ветку, что бы Феде было удобнее отлаживать эту подсистему.

Желающие потестить могут найти последние apk сборки в #zemeroth канале QUADS дискорда.
# Rust GameDev Newsletter 23: Июнь 2021

📆 Выпустил ежемесячник по ржавому игрострою за Июнь! https://gamedev.rs/news/023 (обсуждения: Reddit, Twitter).

Серьезных обновлений в этот раз немного поменьше - много проектов отложили новости на Июль.
# Android: Открытое тестирование в Google Play

Федиными стараниями по портированию (и щепоткой моей возни с гугловой админкой) Земерот таки добрался до раннего доступа в Google Play, ура! 🎉

https://play.google.com/store/apps/details?id=rust.zemeroth

Во время внутреннего тестирования оно работало в целом неплохо, но макроквадный стек пока тестировался на относительно небольшом количестве телефонов, стоит ожидать технических проблем (да и недобитые баги в логике самой игры еще точно есть) . Так что будем благодарны за отчеты об ошибках, если оно у кого-то не заводится или глючит - можно тут в чатике, можно через репозиторий, можно в #zemeroth канале QUADS дискорда.

Вообще, это около недели назад еще случилось, но чего-то мне некогда было эту новость до телеги дотащить - кое-какие всплывшие ошибки уже получилось поправить, расскажу об этом в следующих постах. И да, это хороший знако потихоньку сворачивать свой отпуск от растогеймдева и пробовать опять влиться в процесс. Клац-клац.
# Как портировать ржавые macroquad'ные игры на Android и выкладывать в Google Play?

Основные пункты вышеописанной земеротно-андроидной деятельности были укукожены Федей в текстовый урок:

https://macroquad.rs/tutorials/android

- Какие куски тулчейнов нужны? Где можно взять докер со всем готовым?
- Как смотреть логи?
- Как генерить ключ и как подписывать приложение?
- Какие дополнительные метаданные понадобится указать в Cargo.toml?
- Какие минимальные ресурсы надо подготовить для Google Play страницы?
- и т.д.

Немного неприятный момент в том, что через несколько месяцев Google Play перестанет принимать старые добрые .apk пакеты (уже показывает кучу предупреждений) и понадобится разбираться как готовить Android App Bundle (.aab) и обновлять доки. Но что поделать :)
# Android: новая версия, ошибки с serde и путенахождением

О фатальных аппаратных неприятностях пока никто не сообщил, все всплывшие падения-ошибки просто в логике. Так что в Google Play выложена новая версия, в которой поправлено несколько ошибок и включен макроквадный "экран смерти" для быстрого просмотра бэктрейсов.

Далее немного лытдыбра о процессе отладки, вдруг кому интересно.

Последние уровни кампании были сломаны из-за тупой опечатки в описывающем их конфиге: randomzed_objects. Я ожидал, что навешенный на верхнеуровневую структуру #[serde(deny_unknown_fields)] должен заставлять serde ругаться на все незнакомые поля, но нет, это не транзитивный атрибут - нужно вообще все десериализуемые структуры рекурсивно этим обмазывать. :(

Были еще репорты про такую непонятную штуку: хотя у агента должно быть движение на три клетки, какие-то ровные пустые клетки были непроходимы. Я сначала думал, что из-за каких-то специфических обстоятельств могут не дочищаться Blocker компоненты умерших объектов. Полез смотреть и перебором зерна псевдорандома нашел стабильное воспроизведение, где ошибка точно была с самого старта до всяких смертей. Дамп внутренней карты стоимостей движения показал клетку теоретически проходимой, просто почему-то дороже трех очков. В чем оказалось дело?

Все интерактивные объекты на карте (бойцы, шипы, бомбы, булыжники, тп) являются сущностями со своим уникальным ID и компонентами, а вот россыпь мелких камей только влияет на стоимость передвижения и больше ничего не делает, так что это просто тип клетки TileType::Rocks.

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

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