绪论

在《信号法则》中,信号源 SRC 和输出信号 OUT 的数据通过 Lua 语言编写的简单脚本来定义。Lua 脚本负责以下三件工作:

1) 它定义了信号源和输出信号频道的数量以及信号一共有多少时步。
2) 它定义了每个时步每个信号源和输出信号的数据表。
3) 它会使用 Lua 中数据类型 table 来返回第2)步中定义的数据表。

以下代码示例来自《信号法则》的第一个剧情谜题:


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) 定义了一个拥有1个信号源,2个输出信号端,信号共计50个时步的谜题。你的脚本必须要定义信号源和输出信号端的数量,以及信号一共有多少时步。

在 for 循环中,sState.setSrc(0,i,i+1) 定义了信号源 SRC 1 的信号数据(代码中的计数从0开始),在第 i 个时步它的信号为 i+1。如果你的脚本没有定义某个时步的信号值,游戏将默认值为 0。

在 for 循环结束处,return sstate.signals()会将数据表返回给游戏。你的脚本结尾处必须包含此行。

sstate 是本游戏 Lua 解释器中含有的模块质疑,提供了编写信号数据会用到的一系列函数,详情如下。

注意,游戏中的 Lua 代码通过 Moonsharp 解释器运行在沙盒环境中,因此,访问 Lua 标准库的行为会受到限制,但一些基本的类,例如数学运算相关的库依然可以使用。请参考https://www.lua.org/manual/5.2/来了解更多有关 Lua 语言的信息。

sstate.setSignalSpecs(srcCount, outCount, timesteps)

定义信号源数量、输出信号频道数和总时步数。信号源或输出信号频道数不得超过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之间的小数。注意游戏内的衰减器模块仅能衰减最多带10位小数的数值。


sstate.vca(input,cv)

模拟VCA模块的行为,并返回其输出值。输入值以及控制电压值 CV 必须是-100到100之间的整数。


sstate.andGate(in1,in2)

模拟逻辑与门的行为,并返回其输出值。输入值必须是-100到100之间的整数。


sstate.orGate(in1,in2)

模拟逻辑或门的行为,并返回其输出值。输入值必须是-100到100之间的整数。


sstate.notGate(in)

模拟逻辑非门的行为,并返回其输出值。输入值必须是-100到100之间的整数。


sstate.xorGate(in1,in2)

模拟逻辑异或门的行为,并返回其输出值。输入值必须是-100到100之间的整数。


sstate.toBool(input)

如果输入值大于0,则返回真,否则返回假。


sstate.sign(input)

如果输入值小于0,则返回-1,如果大于0,则返回1,如果为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()