Неделя 25 (март 5): Новое дерево крафта и реально много разных мелочей.
Мотивация — это очень сложно. У меня были целые недели тупежа, хотя обычно я проводил их за решением философских вопросов. Но чем дальше, чем больше результат моей работы походит на игру, тем интереснее становится ей заниматься. Тем чаще нужно сделать что-то осязаемое. Тем чаще можно увидеть результат сразу. Тем больше хочется заниматься игрой… Мне кажется это должно быть особенно заметно по объему постов: чем дальше, тем больше задач я выполняю и больше рассказать о работе могу.
В общем, этот спринт у меня начался не в понедельник, а в субботу. Не прошло и полугода, как я наконец поставил себе дома Sourcetree, обновил Unity и Visual Studio. В общем, я очень надеюсь что темпы моей работы вырастут. Еще очень много всего надо сделать.
***
Собственно, на выходных я доделал интерфейс доски заказов. И за ним последовала одна небольшая доделка и одна большая проблема.
Доделка — это зависимость количества заказов от уровня постройки. Не вечно же нам на одном заказе сидеть. Мелочь, но все же. В итоге это позволит связать количество заказов с уровнем Холла — рецепт на улучшение доски заказов зависит от уровня Холла.
А проблема — это то, что при списании предметов из инвентаря я не учитывал тот факт, что предметы одного артикула могут иметь разные инстансы с разной, например, редкостью. Это должно было стать проблемой еще когда я перенес рецепты из HayDay и стал использовать в качестве ингредиентов не однородные абстрактные ресурсы типа еды или железа, а конкретные предметы типа пшеницы. Но по невнимательности не всплыло.
Все дело в том, что ресурсы не имеют редкости и всегда представлены одним единственным инстансом. А предметы редкость имеют. Она мало того что далеко не всегда первая, так еще и иногда первым и единственным скрафченным предметом оказывается предмет очень высокой редкости.
И вот игрок, зная что только что сделал на ферме пару яиц идет на кухню делать яичницу… но не может: игра говорит, что яйцо только одно. Просто второе яйцо оказалось другой редкости и другим инстансом.
В общем, пришлось несколько модифицировать некоторое количество счетчиков и интерфейсов чтобы игра начала учитывать все предметы определенного артикула.
***
Еще одним довольно важным элементом, необходимым для создания ощущения игры, является, как ни странно, голда. Тут эффект примерно такой же как и у магазина построек, который я сделал на прошлой неделе. До этого момента я мог просто отменить находящийся в производстве рецепт… и это было слишком просто с эмоциональной точки зрения. Когда я сделал рандомные дефолтные рецепты для фермы, оказалось проще отменить неудобный дефолтный рецепт чем ждать его завершения.
Теперь же отменить дефолтный рецепт будет нельзя. Только купить его завершение за алмазы. Пришло время для жесткой монетизации!
Это очень важная именно с точки зрения ощущений история. Ни что не мешает просто следовать каким-то правилам, хранящимся в голове. Но эмоции вызывает совершенно другие. Даже если кристаллы можно восстановить нажатием на одну кнопку, инстинкт игрока в f2p-игры с многолетним стажем подсказывает, что этот ресурс надо экономить. Да и просто одно дополнительное действие в виде этой кнопки — уже достаточно серьезное препятствие на пути ощущения отсутствия цены у действия.
На видео показана работа доски заказов и вроде бы мелькает завершение рецептов за кристаллы.
***
На пути сборки второго пака контента неожиданно встало еще одно препятствие: рестрикшены. Как я и боялся (см. историю про магазин построек), механизм рестрикшенов не выдержал напора и сломался. Причем на довольно простой проблеме: мне нужно показать, например, текущий рецепт улучшения постройки, который удовлетворяет условию самой постройки (рецепт улучшения до 3 уровня требует постройку 2 уровня и она как раз такая и есть), но не удовлетворяет другим условиям (рецепт улучшения до 3 уровня требует какую-то другую постройку 3 уровня). Контроллер рестрикшенов с этой задачей совершенно не справлялся, он мог ответить только на вопрос доступен ли рецепт в целом или нет.
Решение проблемы далось мне довольно тяжело. Надо куда-то адресовать вопросы «доступен ли рецепт» или «выполняется ли конкретное условие», но куда? Тем не менее решение оказалось довольно простым и красивым: суть контроллера рестрикшенов переехала в сам класс данных рестрикшена (это который создается при загрузке конфига из гуглодоков). В том что было контроллером остались только статичные функции сравнения значений (например, уровня постройки со значением из конфигов). И теперь можно узнать выполнение отдельного условия (соответствие уровня текущей постройки необходимому) или целого рецепта — он сам по циклу все условия опрашивает опять же через свой класс данных.
(Очень много скобок последние два абзаца, не находите?)
Ну и опять мой гений потешился тем фактом, что изменение одного компонента вообще никак не повлияло на работу игры. Пух, и все работает!
Благодаря переделке механизма рестрикшенов, я сделал еще два небольших украшения, без которых игра работала, но играть в нее было невозможно:
- Собственно, наконец в интерфейсе улучшения постройки видно какие условия надо выполнить.
- В интерфейсе крафта теперь можно увидеть рецепты, которые станут доступны на следующем уровне постройки.
***
В итоге я благополучно собрал все что было нужно для работы моего варианта дерева рецептов из HayDay. Дерево это, кстати сказать, довольно интересно. При том, что оно взято из игры с несколько иными правилами, в моем варианте оно все равно довольно интересно работает. Дело в том, что это дерево создает минипетли: игрок добывает пшеницу на ферме, потом на кухне создает из нее корм для кур, из которого на ферме создаются яйца, из которых на кухне… и так далее.
Это кажется довольно простым и логичным, но моя пара «шахта-кузница» таких минипетель не создавала. То есть я сам до этого не догадался. Это довольно обидно.
И вот пришло время вернуться к тому, на чем я остановился еще две недели назад: к тому, ради чего я начал работу над доской заказов — к расширению игровой петли. Теперь надо скрестить ужа хейдейного дерева с ежом придуманной мной две недели назад фигни.
В качестве основы для скрещивания используется механизм ограничения доступности рецептов на значение ролевого параметра, который я придумал для того чтобы ограничить доступ к крутым рецептам в пещерах. Тут еще раз на помощь пришел переделанный мной механизм рестрикшенов: ведь по уровню постройки рецепт доступн (а значит должен быть виден в интерфейсе), а по уровню ролевого параметра — нет (а значит должен быть недоступен для запуска).
Тут можно посмотреть как связываются левелапы построек, рецепты и шмотки.
Небольшое, но очень важное с точки зрения проектирования отступление. В этот момент меня начало немного клинить. Проблема в том, что механизм рестрикшенов должен работать однозначно и просто. Не должно быть такого, когда какие-то условия (на уровень текущей постройки) обрабатываются одним образом, а другие (все остальные) другим. То есть по-хорошему проверку уровня текущей постройки надо вынести из рестрикшенов и перенести в рецепты. В конце концов почти все рецепты имеют это ограничение, а значит его можно вынести из рестрикшенов в рецепты… Короче так и сделаю при случае.
В итоге получилася примерно такой обрубок:
- Игрок крафтит еду чтобы проходить подземелья.
- Игрок крафтит шмот чтобы делать более крутую еду (для более крутых подземелий) и чтобы собственно проходить подземелья.
Для полноты картины осталось только пристроить подземелья. В подземельях по моему плану должны добываться ресурсы необходимые для обучения персонажей — повышениях скилов, чтобы они могли пользоваться более крутыми шмотками чтобы делать более крутую еду и далее по кругу. В общем оказалось что моя учебная комната так не умеет и ее надо целиком переделывать… Так что опять без билда, всем спасибо за внимание.