Введение
Данные ИСТ и ВЫХ в задачках для The Signal State определяются простыми скриптами на языке Lua. Код на Lua решает три задачи:
1) Задает число ИСТ- и ВЫХ-каналов и общее число тактов.
2) Задает числовое значение каждого такта на каждом канале ИСТ и ВЫХ
3) Возвращает эти данные в игру в виде Lua-таблицы
Вот пример простого кода из первой сюжетной задачки The Signal State:
sstate.setSignalSpecs(1,2,50)
for i=0, 49
do
sstate.setSrc(0,i,i+1)
sstate.setOut(0,i,i+1)
sstate.setOut(1,i,i+1)
end
return sstate.signals()
sstate.setSignalSpecs(1,2,50)
указывает на то, что в этой задачке есть один канал ИСТ и 2 канала ВЫХ, а общая длина сигнала равна 50 тактам. Ваш код также должен содержать данные о числе тактов и каналов ИСТ и ВЫХ.
В цикле FOR sState.setSrc(0,i,i+1)
указывает это для ИСТ 1 (индексные значения в коде обозначаются нулями), а значение для такта i будет равно i+1. Если в вашем коде не будут определены какие-то значения в любом из тактов, игра будет считать их равными 0.
В конце цикла FOR return sstate.signals()
возвращает данные в игру. Эта строка обязательно должна быть в конце вашего кода.
sstate
— это модуль, который включен в игровой интерпретатор Lua. Он содержит ряд функций, которые пригодятся вам при написании кода для сигнала. Эти функции описаны ниже.
Примечание: код на Lua в игре исполняется в песочнице при помощи интерпретатора Moonsharp, так что вам будет доступна не вся стандартная библиотека Lua. Однако вы по-прежнему можете пользоваться базовыми библиотеками, в том числе математическими. Подробнее о языке Lua по ссылке: https://www.lua.org/manual/5.2/.
sstate.setSignalSpecs(srcCount, outCount, timesteps)
Задает число каналов ИСТ и ВЫХ, а также число тактов. В задачке не может быть больше 4 ИСТ и 4 ВЫХ, а общее число каналов не может превышать 5. Кроме того, число тактов не может превышать 150.
sstate.setSrcCount(srcCount)
Задает число ИСТ-каналов (не больше 4).
sstate.setOutCount(outCount)
Задает число ВЫХ-каналов (не больше 4).
sstate.setSignalLength(length)
Задает число тактов (не больше 150).
sstate.getSrcCount()
Выводит число ИСТ-каналов. Сначала его нужно задать.
sstate.getOutCount()
Выводит число ВЫХ-каналов. Сначала его нужно задать.
sstate.getSrc(srcChannel, timestep)
Выводит значение текущего ИСТ-канала на текущем такте. Сначала его нужно задать.
sstate.getOut(srcChannel, timestep)
Выводит значение текущего ВЫХ-канала на текущем такте. Сначала его нужно задать.
sstate.getSignalLength()
Выводит число тактов. Сначала его нужно задать.
sstate.signals()
Выводит таблицу с данными выбранного сигнала. Код должен заканчиваться строкой return sstate.signals()
.
sstate.setSrc(channel, timestep, value)
Задает значение для выбранного ИСТ-канала и такта (в диапазоне от -100 до 100).
sstate.setOut(channel, timestep, value)
Задает значение для выбранного ВЫХ-канала и такта (в диапазоне от -100 до 100).
sstate.attenuator(input, attValue)
Эмулирует поведение модуля «Аттенюатор» и выводит его выходное значение. Входное значение должно быть целым числом от -100 до 100. attValue
должно быть десятичной дробью от -1 до 1. Важно: модуль «Аттенюатор» в игре может работать со значениями только с одним знаком после запятой.
sstate.vca(input,cv)
Эмулирует поведение модуля VCA и выводит его выходное значение. Входное значение и значение CV должны быть целыми числами от -100 до 100.
sstate.andGate(in1,in2)
Эмулирует поведение модуля AND и выводит его выходное значение. Входное значение должно быть целым числом от -100 до 100.
sstate.orGate(in1,in2)
Эмулирует поведение модуля OR и выводит его выходное значение. Входное значение должно быть целым числом от -100 до 100.
sstate.notGate(in)
Эмулирует поведение модуля NOT и выводит его выходное значение. Входное значение должно быть целым числом от -100 до 100.
sstate.xorGate(in1,in2)
Эмулирует поведение модуля XOR и выводит его выходное значение. Входное значение должно быть целым числом от -100 до 100.
sstate.toBool(input)
Выдает значение «Истина», если входное значение больше 0; иначе выдает «Ложь».
sstate.sign(input)
Выдает -1, если входное значение меньше 0; 1, если оно больше 0; и 0, если оно равно 0.
Примеры кода
Тест VCA
sstate.setSignalSpecs(2,1,50)
for i=0, 49
do
val = math.random(-16,16)*5
val2 = math.random(0,5)*20
sstate.setSrc(0,i,val)
sstate.setSrc(1,i,val2)
sstate.setOut(0,i,sstate.vca(val,val2))
end
return sstate.signals()
Дрон-следопыт
sstate.setSignalSpecs(1,1,50)
val1 = 0
val2 = 0
for i=0, 49
do
val3 = math.random(-30,30)
sstate.setSrc(0,i,val3)
if val3 > val2 and val3 > val1 then
sstate.setOut(0,i,val3)
elseif val2 > val1 and val2 > val3 then
sstate.setOut(0,i,val2)
else
sstate.setOut(0,i,val1)
end
val1 = val2
val2 = val3
end
return sstate.signals()
Семплер
sstate.setSignalSpecs(1,1,50)
ctr = 0
for i=0, 49
do
if 7 >= i then
sstate.setSrc(0,i,math.random(25,80))
else
sstate.setSrc(0,i,0)
end
sstate.setOut(0,i,sstate.getSrc(0,ctr))
ctr = ctr + 1
if ctr >= 8 then
ctr = 0
end
end
return sstate.signals()