
Неделя 7 (ноябрь 2): Инвентарь, апгрейд построек.
Наконец в игре появился инвентарь. Сделать его было довольно просто, хотя успел побадаться с лайаутами внутри лайаутов.
Мне очень хотелось чтобы все объекты, отсортированные по типам отображались в отдельных панелях, которые сами были бы элементами списка. Тогда при смене закладки сортировки можно было бы включать или выключать панель, а не бегать по списку отдельных объектов.
Но у меня получался список (иконок предметов на панели) в списке (панелей на экране), и иконки отказались выстраиваться нужным мне образом. В результате я просто отказался от идеи делить предметы в инвентаре на отдельные панели. Нет ничего страшного в том, чтобы при переключении закладок бегать по всему набору иконок, включать нужные, и прятать не нужные. Немного выкрученный интерфейс все того же магазина и вуаля.
***
Сделал механизм апгрейда построек на основе рецептов. Получилось довольно быстро, но оказалось проблематично встроить новый тип рецептов в имеющийся механизм простых и дефолтных рецептов.
Проблема была в том, что система крафта оказалась довольно нежно настроена на то, что у каждого сверчка есть свой шесток. И появление инстанса рецепта, который вроде принадлежит постройке, но находится вне системы слотов, привело к проблемам с логикой. Затыкал я ее как мог. Вроде заработало.
Не на долго, правда.
***
Второй частью механизма апгрейда построек является довольно неожиданный механизм — ограничения или рестрикшены (как-то так повелось еще со времен Рыбного Места что я использую именно слово «рестрикшены»).
Мысль довольно простая: каждый рецепт апгрейда построек увеличивает ее уровень на… значение результата бонуса (я же могу в бонус рецепта поставить лубую цифру), но главное что на каждый уровень приходится свой рецепт. А как определить какой именно рецепт в данный момент времени делать доступным? Рестрикшенами.
В коде контроллера рестрикшенов есть полный перечень логических условий, использующихся в поле ConditionType. BuildingLevelCurrent — это условие на конкретное значение уровня постройки. Поле conditionValueType используется в случаях когда через ConditionType нельзя однозначно установить какое именно значение нужно сравнивать. Например у персонажа есть список параметров, со значениями которых можно связывать ограничения. Со списком не получится работать напрямую — количество значений неизвестно — и тут поможет поле conditionValueType.
В итоге ингредиенты в бонусах ограничивают с помощью механизма списания из инвентаря, а рестрикшены ограничивают с помощью сравнения параметров. Еще один конфиг и еще один механизм сверки параметров.
Pingback: Неделя 22 (март 2): Рецепты подземелий и прочие мелочи. – gloomy games