Неделя 15 (январь 3): Генерация предметов и склад складов.

Оглавление

Я чуть было не начал впадать в уныние от всей этой философии (фермовой и ролевой). Очень тяжело что-то делать, не получая видимых результатов. Поэтому я придумал себе развлечение с результатом.

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

Если помните, в игре есть понятие склада. Это такой объект, который хранит в себе информацию о том, кому он принадлежит: постройке или персонажу. Нужен он для того чтобы во-первых была возможность сделать несколько (неизвестное количество) складов/слотов персонажей и чтобы можно было сказать предмету, в каком именно складе он находится.

Система была хороша пока один артикул порождал один предмет. Он находился либо там, либо сям. Если же у игрока есть несколько экземпляров какого-то предмета при установке одной его единицы в слот персонажа надо было их как-то разделить. Проблему я это решил просто (хоть и не правильно): начал дублировать предметы. Предмет в игровом инвентаре и в слоте персонажа оборачивался двумя строками в таблице инвентаря игрока. Это даже работало. Я мог легко удалить и восстановить предмет по его айдишнику артикула в конфигах.

***

Но если предмет генерируется, то удалять его больше нельзя — его невозможно будет восстановить с теми же параметрами. И я решил создать еще одну сущность склада, которая связывала бы собственно склады и предметы связью многие-к-многим. Один предмет может храниться на несколько складах, а один склад может содержать несколько предметов.

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

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

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

Ну и появился механизм генерации параметров предмета. Сейчас параметр один — редкость. Скорей всего я заменю или дополню его сидом рандома. Но до этого еще дожить надо. Плюс пока еще не очень понятно как выдавать игроку конкретные предметы с конкретным набором параметров, которые бы в другом случае должны были бы быть сгенерированы. Но это проблема будущего меня. Удачи тебе, я из будущего. (Сука, я тебя ненавижу. Я из недели 19.)

В конфиге артикулов появилось поле редкости.

Вместе с механизмом подрос и конфиг. На уровне конфига редкость я решил сделать бинарной: предмет либо имеет редкость, либо нет. При создании предмета игра либо обратится к генератору редкости, либо нет. А вот на уровне инстанса предмета редкость выражается уже конкретным числом. Сейчас у меня редкостей 7. Выше 4 я редкости сам еще не видел.

Оглавление