Игра для кодеров. HackeRPG DevLog #1
Идея:
Около полгода я вынашивал идею игры в которой управление будет построено полностью на программировании.
Изначально задумка была крайне примитивной:
Жанр: Roguelite арена. Референсом послужил недавно нашумевший Brotato, но управление будет полностью кодом. А ещё можно будет писать свои функции, создавать переменные, потоки, демоны (не те, которые из потустороннего мира, хотя для новичков в программировании они могут быть куда страшнее).
Так выглядит игра референс. Порекомендовал бы её фанатам жанра, но думаю все и любители жанра и так знают эту игру.
В дальнейшем я несколько подробнее расписал своё видение и выделил механики, на которых будет базироваться интересный геймплей. Но это были лишь идеи, которые только предстоит протестировать. Ведь на бумаге идея GTA для Android с возможностью грабить караваны кажется крутой, но суровые реалии опыта игроков все расставляют на свои места.
Подготовка:
Для начала мне нужно определиться с инструментарием. В целом, мой опыт в программировании довольно насыщенный, поэтому критерий "сложность в освоении" был на меня на одном из последних мест.
Самыми важными для меня были:
Удобство.
Многим начинающим большое количество элементов визуального программирования и возможность руками расставлять объекты на сцене и на экране кажется крайне удобным, но не мне. Мне больше нравится всё делать через код. Поэтому уже на этом этапе я исключил для себя титанов вроде UE, Unity и Godot.
2. Лицензия.
Кодеры любят писать код и не любят делать что-то ещё (вот я например не люблю писать этот пост сейчас, но боль от того, что я буду пилить игру год и про неё никто не узнает куда сильнее, поэтому держусь). Лишние проблемы с лицензиями и авторскими правами мне ни к чему, поэтому UE, насчёт которого я ещё сомневался после первого пункта вылетает.
3. Перформанс и устойчивость к ошибкам.
Эти два пункта я объединил в один, чтобы точнее передать муки выбора - большая часть моего опыта - Kotlin и Java. На них можно создавать довольно хороший код с точки зрения ошибкоустойчивости + у меня есть небольшой опыт использования библиотеки LibGDX (популярный игровой движок на Java). Но, учитывая тот факт, что я тот ещё геймдевер, а JVM не самое лучшее решение для производительных игр, я решил отбросить этот вариант.
После чего задумался о языках семейства C, узнал о наличии довольно большого количества движков, но понял, что с моими навыками писать безопасный код (они на самом деле неплохие, просто холодно сейчас), это - не лучшая идея и я сел думать.
Так идея и продолжала консервироваться, т.к. я не мог выбрать идеальные для себя инструменты, до того момента, как однажды я не увидел статью про то, что Microsoft стремительно переписывает свою любимую ОС на Rust. Я немного касался этого языка, но по сути не знал о нём ничего и мне стало интересно.
Закинул себе на Kindle вот эту книгу и с каждой страницей всё больше начинал влюбляться в этот язык. Я подумал: "Вот оно!". И принялся искать игровые движки на этом языке, и довольно быстро наткнулся на Bevy.
Движок был относительно молодой и опенсорсный, что внушало некоторое опасение. Я изучил сайт (движок поддерживается неплохой, по меркам смертных, копеечкой), принцип ECS, что значит Data-Driven, пообщался с ребятами в дискорде и понял - это оно!
Как пробу пера я набросал небольшую визуальную новеллу (сейчас понимаю, что это была отличная идея, т.к. для адепта ООП такая парадигма разработки ломает привычное понимание и код получается ужасным), после чего понял, что мне подходит этот инструмент и можно браться за дело.
Вот так выглядела игра, арты любезно сгенерил старина Кандинский.
Прототип (Версия 0.0.1)
Начать разработку я решил с создания простого прототипа, который позволит тестировать механики и отбрасывать то, что не работает без лишних временных затрат. На первых порах я решил использовать бесплатные пискель арты, но очень быстро от них отказался, набросав сам все арты в игре (дешево, сердито, не идеально, но с душой).
Геймплей хотелось немного обосновать логически и я придумал для себя некоторую сюжетную основу игры: мы играем за кодера, который исправляет различные проблемы в системе (баги, вирусы и тд). Так и пришла идея первых двух видов врагов (жуки и черви).
По визуальному стилю я выбрал пиксель арт + стереотипный кодерский стиль (черный фон, зеленый текст). Изначально я хотел сделать всю игровую палитру одноцветной, но враги и снаряды персонажа терялись и было сложно адекватно реагировать на игру, из-за чего враги перекрасились в красный цвет, как и положено ошибкам в коде. После некоторого времени работы у меня получилось что-то такое:
Главное меню с окном в стиле MacOS и возможность почитать описание основных игровых команд.
А вот и наш игровой персонаж.
Крайне интересным опытом было написание своего интерпретатора, наконец получилось воспользоваться всей мощностью регулярных выражений. Помимо простой обработки команд, в первую версию так же вошла возможность добавлять свои функции по мере прокачки. Интерпретатор способен обрабатывать и их. Пока это решение ещё предстоит отполировать, но я уже очень доволен результатом.
Первое геймплейное видео.
Проблемы первой версии
Как это часто бывает, пока я тестировал игру, мой глаз замылился: я набил руку в управлении, из-за чего мне хотелось постоянно увеличивать сложность, все механики казались мне интуитивными, но плейтесты моих товарищей спустили меня с небес на землю.
Сложна, страшна, паника
Частая проблемы была в том, что когда противников становиться больше люди делали ошибки, начинали паниковать и получали много урона, не в силах камбэкнуть в игру, проблема серьёзная и я понял, что её нужно обязательно решать, поэтому добавил эту задачу к себе в бэклог.
Медленно, нет экшона, нудно
Идея управлять всеми действиями кодом изначально показалась крутой: некоторые действия могут быть сложными, тогда для них пишешь функцию, которая упрощает этот процесс. В будущем я планировал добавить больше инструментов, чтобы сделать ощущения прогресса ещё более сильным, но проблема в том, что сейчас таких инструментов мало, а нажимать около 10 клавиш, чтобы пройти пару шагов - очень медленно и надоедает. И даже наличие истории прошлого ввода (при нажатии стрелки вверх) особо эту проблему не решало. Проблема так же улетает в бэклог.
Обучение игре
Обучение управлению в процессе - довольно сложная штука, учитывая, что для игры в идеале использовать 6 команд. Однако освоение проходило довольно быстро, поэтому эту проблему я решил отложить на более позднее время.
Помимо этих проблем было ещё много вещей, которые я изначально (до плейтестов) хотел исправить, поэтому бэклог всё увеличивался. В версии 0.0.2 я решил взять прицел на улучшение пользовательского опыта, но об этом - в следующем посте.
Спасибо за уделённое время, потрогать игру можно по ссылке
Лига Разработчиков Видеоигр
7.1K постов22.3K подписчиков
Правила сообщества
ОБЩИЕ ПРАВИЛА:
- Уважайте чужой труд и используйте конструктивную критику
- Не занимайтесь саморекламой, пишите качественные и интересные посты
- Никакой политики
СТОИТ ПУБЛИКОВАТЬ:
- Посты о Вашей игре с историей её разработки и описанием полученного опыта
- Обучающие материалы, туториалы
- Интервью с опытными разработчиками
- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе
НЕ СТОИТ ПУБЛИКОВАТЬ:
- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры
- Посты, единственная цель которых - набор команды для разработки игры
- Посты, не относящиеся к тематике сообщества
Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.
ЗАПРЕЩЕНО:
- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции
- Выдавать чужой труд за свой
Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.
О РАЗМЕЩЕНИИ ССЫЛОК:
Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:
- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества
- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз
- Cсылка размещается в формате: "Страница игры в Steam: URL"