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