Einführung

Die SRC- und OUT-Daten in einem Rätsel in dem Signalstatus werden mit einfachen Skripten definiert, die in der Sprache Lua geschrieben sind. Der Lua-Code macht 3 Dinge:

1) Er gibt die Anzahl der SRC- und OUT-Kanäle und die Gesamtzahl der Zeitschritte
2) Er gibt die numerischen Werte für jeden Zeitschritt an jedem SRC- und OUT-Kanal
3) Er gibt diese Daten als Lua-Tabelle an das Spiel zurück

Hier ist ein grundlegendes Codebeispiel aus dem ersten Story-Rätsel von 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) gibt an, dass dieses Rätsel 1 SRC-Kanal, 2 OUT-Kanäle und eine Gesamtlänge des Signals von 50 Zeitschritten hat. Dein Code muss die Anzahl der SRC- und OUT-Kanäle sowie die Anzahl der Zeitschritte angeben.

Innerhalb der for-Schleife, sState.setSrc(0,i,i+1) gibt an, dass für SRC 1 (Indexwerte werden im Code mit Null indiziert) der Wert bei Zeitschritt i i+1 sein wird. Wenn es in einem Zeitschritt Werte gibt, die nicht in deinem Code angegeben sind, nimmt das Spiel an, dass sie 0 sind.

Am Ende der for-Schleife return sstate.signals() gibt die Daten an das Spiel zurück. Dein Code muss diese Zeile am Ende enthalten.

sstate ist ein Modul, das im Lua-Interpreter des Spiels enthalten ist und mehrere nützliche Funktionen zum Schreiben deines Signaldatencodes bietet. Diese Funktionen werden im Folgenden beschrieben.

Beachte, dass der Lua-Code im Spiel in einer Sandbox über den Moonsharp-Interpreter ausgeführt wird, sodass du nur begrenzten Zugriff auf die Lua-Standardbibliothek hast. Auf grundlegende Bibliotheken wie die Mathematikbibliothek kannst du trotzdem zugreifen. Siehe https://www.lua.org/manual/5.2/ für weitere Informationen über die Lua-Sprache.

sstate.setSignalSpecs(srcCount, outCount, timesteps)

Legt die Anzahl der SRC- und OUT-Kanäle sowie die Anzahl der Zeitschritte fest. Es kann nicht mehr als 4 SRC- oder 4 OUT-Kanäle geben, und es sollte nicht mehr als 5 Kanäle insgesamt geben. Es können nicht mehr als 150 Zeitschritte sein.


sstate.setSrcCount(srcCount)

Legt die Anzahl der SRC-Kanäle fest. Es können nicht mehr als 4 SRC-Kanäle sein.


sstate.setOutCount(outCount)

Legt die Anzahl der OUT-Kanäle fest. Es können nicht mehr als 4 OUT-Kanäle sein.


sstate.setSignalLength(length)

Legt die Anzahl der Zeitschritte fest. Es können nicht mehr als 150 Zeitschritte sein.


sstate.getSrcCount()

Gibt die Anzahl der SRC-Kanäle zurück. Der Wert muss zuerst festgelegt worden sein.


sstate.getOutCount()

Gibt die Anzahl der OUT-Kanäle zurück. Der Wert muss zuerst festgelegt worden sein.


sstate.getSrc(srcChannel, timestep)

Gibt den Wert des angegebenen SRC-Kanals zum angegebenen Zeitschritt zurück. Der Wert muss zuerst festgelegt worden sein.


sstate.getOut(srcChannel, timestep)

Gibt den Wert des angegebenen OUT-Kanals zum angegebenen Zeitschritt zurück. Der Wert muss zuerst festgelegt worden sein.


sstate.getSignalLength()

Gibt die Anzahl der Zeitschritte zurück. Der Wert muss zuerst festgelegt worden sein.


sstate.signals()

Gibt die Tabelle zurück, die die angegebenen Signaldaten enthält. Dein Code muss mit return sstate.signals() enden.


sstate.setSrc(channel, timestep, value)

Legt den Wert für den angegebenen SRC-Kanal und den Zeitschritt fest. Der Wert muss zwischen -100 und 100 liegen.


sstate.setOut(channel, timestep, value)

Legt den Wert für den angegebenen OUT-Kanal und den Zeitschritt fest. Der Wert muss zwischen -100 und 100 liegen.


sstate.attenuator(input, attValue)

Simuliert das Verhalten eines Abschwächermoduls und gibt dessen Ausgang zurück. Der Eingabewert sollte eine ganze Zahl zwischen -100 und 100 sein. attValue sollte ein Dezimalwert zwischen -1 und 1 sein. Beachte, dass das Abschwächermodul im Spiel nur Abschwächungswerte mit 1 Dezimalpunkt zulässt.


sstate.vca(input,cv)

Simuliert das Verhalten eines VCA-Moduls und gibt dessen Ausgang zurück. Die Eingangs- und CV-Werte sollten Ganzzahlen zwischen -100 und 100 sein.


sstate.andGate(in1,in2)

Simuliert das Verhalten eines AND-Moduls und gibt dessen Ausgabe zurück. Die Eingabewerte sollten ganze Zahlen zwischen -100 und 100 sein.


sstate.orGate(in1,in2)

Simuliert das Verhalten eines OR-Moduls und gibt dessen Ausgabe zurück. Die Eingabewerte sollten ganze Zahlen zwischen -100 und 100 sein.


sstate.notGate(in)

Simuliert das Verhalten eines NOT-Moduls und gibt dessen Ausgabe zurück. Der Eingabewert sollte eine ganze Zahl zwischen -100 und 100 sein.


sstate.xorGate(in1,in2)

Simuliert das Verhalten eines XOR-Moduls und gibt dessen Ausgabe zurück. Die Eingabewerte sollten Ganzzahlen zwischen -100 und 100 sein.


sstate.toBool(input)

Gibt true zurück, wenn der Eingabewert größer als 0 ist, sonst false.


sstate.sign(input)

Gibt -1 zurück, wenn der Eingabewert kleiner als 0 ist, 1, wenn er größer als 0 ist, und 0, wenn er 0 ist.


Code-Beispiele


VCA-Test


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()
                

Drohnen-Pfadfinder


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()
                

Abtastung


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()