Модификации > Моддинг

Туториал: реакции

(1/3) > >>

dub:
Готовясь к созданию мода про роботов осваиваю основы моддинга. А так как самый эффективный способ что-то изучить, это разобраться в материале и рассказать об этом другому, то пишу данный туториал.

Начать решил с реакций, которые выполняются в мастерских. Для этого я занялся переводом соответствующей страницы на фики: dfwk.ru/Reaction. Там все можно будет посмотреть так, как излагается по науке. А в этой ветке будет описание на пальцах =)

dub:
Где работает:

Реакции могут работать в режиме крепости (выполняются в мастерских) и в режиме приключения (сразу доступны герою через x->create). Меня интересует мод для режима крепости, поэтому об адвенчер моде я рассказывать особо не буду.

Что позволяют делать реакции:

* Реакции позволяют взять 0 и более реагентов и превратить их в 0 и более продуктов. Здесь реагенты и продукты, это какие-то предметы.
* в процессе реакции реагенты могут как исчезать, так и сохраняться.
* реагенты могут задаваться по типу предмета, типу материала или неким тегам внутри материала
* разрешается использовать контейнеры (взять реагент из контейнера или поместить продукт в контейнер)
* разрешается модифицировать (украшать) реагенты
* продуктам можно указывать некую вероятность их возникновения в результате реакции
* количество как потребляемых реагентов и получаемых продуктов может быть как фиксированным в описании реакции, так и зависимым (т.е. взяв стек с большим кол-вом костей можно получить на выходе много костного порошка). Только данная возможность достаточно забагована, так что лучше использовать фиксированные величины (2 слитка превращаются в 1 велосипед и т.п.)

з.ы. кстати, если создать новый предмет с типом костыль и назвать его "велосипед", подправить скорость передвижения на костылях и заставить дварфов использовать костыли (заразить болезнью, вызывающую некроз ног), то можно получить крепость, полную велосипедистов! =)

dub:
Заготовок реакции:

Все реакции должны находится в файле, название которого начинается с "reaction_". Создадим файл reaction_mymod.txt и добавим в него следующее содержимое:

reaction_mymod
[OBJECT:REACTION]

[REACTION:DUMMY_REACTION]
  [NAME:play the ass]
  [BUILDING:SMELTER:NONE]

Первые две строки должны быть в начале любого файла с реакциями:
- имя файла
- указание на то, что далее в файле идут реакции

После этого создается новая реакция [REACTION:DUMMY_REACTION] с внутренним именем DUMMY_REACTION, которое вы придумываете сами. Это имя вам нужно будет использовать в описании вашей цивилизации, чтобы разрешить эту реакцию.

Для этого открываете файл entity_default.txt (или тот, в котором вы создали свою цивилизацию) и у нужной (это после тега [ENTITY:...]) цивилизации добавляете тег [PERMITTED_REACTION:DUMMY_REACTION]

В строке [NAME:Play the ass] вы пишете то, как реакция будет выглядеть в меню мастерской. В нашем случае реакция ничего не делает, поэтому я написал "Валять дурака". тут нужна достаточно короткая фраза с заглавной буквы, чтобы придерживаться общего стиля названий реакций.

В строке [BUILDING:SMELTER:NONE] вы выбираете, в какой мастерской будет доступна эта реакция. В нашем случае это SMELTER - плавильня.

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

Сохраняем файл, запускаем DF, генерируем новый мир, высаживаемся, строим плавильню и... наслаждаемся реакцией "валять дурака"!

В игре это выглядит так:

dub:
Добавляем реагенты:

Реагенты, это то, что необходимо для проведения реакции и необратимо уничтожается, после ее завершения. Уничтожение реагентов - поведение по умолчанию, но его можно отменить, пометив реагент специальным тегом (об этом ниже). Реагентов может быть сколько угодно.

Реагент описывается в общем виде следующим образом:
[REAGENT:<name>:<quantity>:<item token>:<material token>][...modifiers...]<name> - Имя реагента, используемое внутри реакции. Оно может быть любым и уникальность имен реагентов требуется только в рамках одной реакции. Имя вам может понадобиться, чтобы указать, например, у какого реагента скопировать материал для продукта или в какой реагент (который является контейнером) поместить произведенный продукт.

<quantity> - Необходимое количество. Вообще говоря, разные виды реагентов, измеряются в разных единицах измерения (нити, жидкости, предметы и пр.), но для простейших случаев количество измеряется в штуках.

<item token> - Тип предмета реагента. Состоит из двух частей ITEM_TYPE:ITEM_SUBTYPE и позволяет нам выбрать, что же используется в качестве реагента. Если вас интересует общий класс предметов, то во второй части пишите NONE. Например WEAPON:NONE описывает вообще любое оружие. Полный список типов предметов смотрите тут

<material token> - Из какого материала изготовлен реагент. Тут можно подсмотреть, как описываются материалы. Если коротко, то у вас на выбор три способа:
* указать встроенный тип (WATER, MUD и т.п.)
* указать тип и подтип (INORGANIC:NAME, COAL:COKE и т.п.)
* указать категорию, тип и подтип (PLANT_MAT:PLANT_ID:MATERIAL_NAME и т.п.)
Разумеется, можно написать NONE, если вы не хотите конкретизировать тип или подтип. Например NONE:NONE - означает что реагент может быть вообще из чего угодно.

[...modifiers...] - Набор токенов, которые уточняют информацию о реагенте. Их список достаточно большой. Здесь упомяну только модификатор [PRESERVE_REAGENT] который сообщает, что этот реагент НЕ должен исчезать после реакции. Используется, например, для того, чтобы в мастерскую принесли бочку (как реагент) и поместили в нее продукт реакции. Естественно, такая бочка не должна исчезать.

Собираем все вместе:

[REACTION:PEACE_REACTION]
  [NAME:Make peace not war]
  [BUILDING:SMELTER:NONE]
  [REAGENT:A:1:WEAPON:NONE:NONE:NONE]Эта реакция берет любое оружие WEAPON:NONE из любого материала NONE:NONE и... уничтожает его.

В итоге файл reaction_mymod.txt принимает вид:
reaction_mymod
[OBJECT:REACTION]

[REACTION:DUMMY_REACTION]
  [NAME:Play the ass]
  [BUILDING:SMELTER:NONE]

[REACTION:PEACE_REACTION]
  [NAME:Make peace not war]
  [BUILDING:SMELTER:NONE]
  [REAGENT:A:1:WEAPON:NONE:NONE:NONE]
А в файле entity_default.txt появляются уже две строчки:[PERMITTED_REACTION:DUMMY_REACTION]
[PERMITTED_REACTION:PEACE_REACTION]

Сохраняем изменения, создаем новый мир, высаживаемся и наслаждаемся крайне миролюбивой реакцией "Миру мир":


p.s. Эта реакция может показаться крайне бестолковой (ничего не производится), но на самом деле, даже такая реакция может оказаться крайне полезной. Например для создания операции кремирования ненужных частей тел, что захламляют свалку, или для уничтожения одежды, оставшейся от очередного нашествия гоблинов.

dub:
Отступление:

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

* реагент - книга по, скажем, столярному делу.
* продукт - такая же книга.

То есть исходная книга уничтожается и создается новая. Если бы мы просто поставили книге флаг "не уничтожается", то сама реакция происходила бы мгновенно. И, возможно, даже не тренировала бы навык.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии