Введение

Данные ИСТ и ВЫХ в задачках для 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()