API (Application Program Interface) — набор программных функций и переменных, которые Klei специально приготовили для разработчиков модов. Большая часть игры состоит из открытого кода на языке Lua. Поэтому, можно сказать, что весь код игры является огромным API. Но для более удобного понимания всё же следует выделить отдельные функции и переменные и описать их независимо друг от друга.
Элемент API — это название функции или переменной. Смысл его в том, что вы просто берёте готовый элемент и используете его. Когда вы меняете этот элемент, вам не нужно помнить обо всех местах, где он используется. Вам нужно лишь следить, чтобы элемент соответствовал своему названию и назначению. Большинство элементов уже созданы для нас, и их можно просто использовать, не вникая в тонкости внутреннего устройства. Каждый элемент обязан иметь говорящее за себя название.
Такая концепция позволяет творить, удобно оперируя комплексными элементами, не заморачиваясь деталями. Вся черновая работа скрыта от глаз разработчика мода, и он может сосредоточиться на творчестве, а не на рутине. Кроме того, такой подход позволяет разделять обязанности между несколькими разработчиками модов (и также разработчиками игры).
TUNING[]
Файл tuning содержит в себе постоянные величины, которые можно вызвать с помощью TUNING.ИМЯ_ПОСТОЯННОЙ. В основном это показатели мобов, предметов и структур.
Пример использования:
health = TUNING.HEALING_MED,
hunger = TUNING.CALORIES_LARGE,
perishtime = TUNING.PERISH_SLOW,
sanity = TUNING.SANITY_TINY,
В файле tuning содержатся следующие значения этих постоянных:
HEALING_MED = 20,
CALORIES_LARGE = calories_per_day/2,
PERISH_SLOW = 15*total_day_time*perish_warp,
SANITY_TINY = 5,
Как вы можете заметить, внутри файла TUNING используются внутренние переменные, как у нас в примере:
local calories_per_day = 75
local total_day_time = seg_time*16
local perish_warp = 1
Также существует файл tuning_override, в котором содержатся постоянные для разных настроек в меню создания мира.
Компоненты[]
Компоненты позволяют существенно сократить код. Вместо того, чтобы прописывать двум объектам одинаковые функции, где отличаться будут только значения, например, урона, компоненты позволяют назначить только эти самые различия через переменные.
Компоненты используются почти во всех объектах кода игры.
Глобальные функции[]
Глобальные функции могут быть вызваны из любого другого файла.
Пример глобальной функции:
function globalfunction(params)
print("I am globalFunction")
end
Вызов:
globalFunction(param)
Разберём на примере глобальных функций компонентов:
inst.components.childspawner:SetRegenPeriod(90)
Данный код вызывает глобальную функцию компонента childspawner и назначает параметру period значение в 90 секунд:
function ChildSpawner:SetRegenPeriod(period, variance)
self.regenperiod = period
self.regenvariance = variance or period * 0.1
end
Функции префаба[]
Локальные функции действуют только внутри файла и прописываются следующим образом:
local function namefunction(params)
print("I am localfunction")
end
Вызвать локальную функцию можно только внутри файла.
Разберём на примере функции, заставляющей посох призывателя звёзд создавать звезду при вселении в него призрака персонажа:
local function onhauntlight(inst)
if math.random() <= TUNING.HAUNT_CHANCE_RARE then
local pos = inst:GetPosition()
local start_angle = math.random() * 2 * PI
local offset = FindWalkableOffset(pos, start_angle, math.random(3, 12), 60, false, true, NoHoles)
if offset ~= nil then
createlight(inst, nil, pos + offset)
inst.components.hauntable.hauntvalue = TUNING.HAUNT_LARGE
return true
end
end
return false
end
Вызов функции внутри файла:
AddHauntableCustomReaction(inst, onhauntlight, true, false, true)
При этом функция вызывается в глобальной функции AddHauntableCustomReaction (см. предыдущий раздел).
Тэги[]
Тэги присуждаются префабу с помощью следующего кода:
inst:AddTag("name")
Тэги — это своеобразные категории объектов в коде. Они присуждаются нескольким префабам, и впоследствии служат для того, чтобы не прописывать каждый объект, а прописывать нужный тэг.
Пример использования в коде Абигейл:
local function auratest(inst, target)
return target:HasTag("monster") or target:HasTag("prey")
end
В данном случае целью Абигейл назначаются объекты в игре, имеющие теги "monster" и "prey". Представьте, каково было бы прописывать каждого монстра по отдельности.