Найти в Дзене

Дневник начинающего разработчика. Часть 2. Длиннопостные животные и сотворение жизни в Лесу

Продолжение истории о том, как я пишу Духов Леса - свою первую текстовую ММОРПГ в телеграм-боте на Python⁠⁠.

Но, для начала, посмотрите на эти прекрасные мордашки.

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

Итак, начало положено. Параллельно с изучением теории программирования я набрасывал в табличках планы, механики, формулы, объекты и ключевые события.

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

Первым делом, нужно было создать персонажей, чтобы все дальнейшие нововведения было на ком проверять. И на старте я неделю расписывал их создание. Сразу стало понятно, что одним знанием Python⁠⁠ тут не ограничиться. Нужно хотя бы на базовом уровне понимать SQL, чтобы хранить данные о персонажах.

Довольно быстро я понял, что записывать в одну базу десятки характеристик, переменных и состояний каждого персонажа будет проблематично. Тем более, игре придется потом часто к ним обращаться. Поэтому, подробные переменные я стал записывать в отдельный JSON файл для каждого персонажа, а в базе данных оставил только основные сведения (id класс имя и т.д.).

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

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

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

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

Как оказалось позже, даже на этой стадии всем игрокам невозможно угодить. Так как я делал именно текстовую игру, казалось логичным, что львиную долю информации о механиках и лоре придется преподносить именно текстом. Однако, уже на создании персонажа для некоторых проблемой стало "много букв". Но для себя я уже тогда решил, что подход к текстам будет именно таким. Я собирался прорабатывать детальный мир, а для передачи всех механик и лора явно требовалось больше пары строчек текста.

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

Первый из "длиннопостных" животных. Он рад каждому новому путнику в Изумрудном Холме, и ему есть что рассказать тем, кто не ленится читать. Так выглядит создание персонажа.
Первый из "длиннопостных" животных. Он рад каждому новому путнику в Изумрудном Холме, и ему есть что рассказать тем, кто не ленится читать. Так выглядит создание персонажа.

Здесь же, на стадии создания персонажа, нужно было кратко ввести игроков в курс боевки. Как любителя РПГ типа Diablo и POE меня всегда радовала вариативность. Потому и в своем мире мне хотелось сделать не жесткое деление на классы, а возможность их комбинировать. Основа должна быть простой и понятной с первого взгляда: воин, танк, убийца - которые по принципу камень-ножницы-бумага имеют разные преимущества. Однако, с самого начала игры новички предупреждаются, что все классы можно комбинировать, и ни один из первоначальных выборов не ограничивает другие возможности. Просто стоимость прокачки "чужих" навыков будет больше, чем "родных".

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

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

Навыки к этому моменту уже были в общих чертах распланированы в таблице, оставалось их только перенести в код и надеяться, что на стадии создания боевки я смогу это все учесть в формулах и функциях. Сначала я написал только первые 3 школы по 6 боевых навыков, а впоследствии добавил к ним 4 ремесленные школы по 8 - 10 скиллов.

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

С инвентарем пришлось повозиться тоже достаточно долго. Была создана база данных с видами предметов и функции для создания баз данных экземпляров предметов для каждого чата, где запущена игра. Так например вид предмета "катана", в зависимости от материала, из которого ее создают, может превратиться в экземпляры: Стальная катана, Кобальтовая катана, Титановая катана и т.д. со своими характеристиками. Плюс каждый из экземпляров можно улучшить, пока что до 5 уровня. Таким образом 1 строчка предмета "катана" в типовой базе с учетом коэффициентов материалов и улучшений превращалась в игре в 25 разных катан с отличающимися характеристиками.

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

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

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

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

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

Спасибо всем, кто дочитал! Продолжение следует.

Играйте в игры, любите игры, следуйте за своей мечтой и просто хорошо проводите время!