緒論

在《訊號法則》中,訊號源 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()