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