소개

The Signal State에서 퍼즐의 SRC 및 OUT 데이터는 Lua 언어로 작성된 간단한 스크립트로 정의됩니다. Lua 코드는 다음 3가지를 수행합니다.

1) SRC 및 OUT 채널 개수와 시간 단계의 총합을 지정합니다.
2) 각 SRC 및 OUT 채널에서 각 시간 단계의 수치를 지정합니다.
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)의 경우 이 퍼즐이 1개의 SRC 채널, 2개의 OUT 채널, 총 50개 시간 단계의 신호 길이를 갖도록 지정합니다. 코드는 SRC 및 OUT 채널 개수와 시간 단계 개수를 지정해야 합니다.

for 루프 내에서 sState.setSrc(0,i,i+1)은 SRC 1(인덱스 값은 코드 내에서 0으로 인덱싱됨)에 대해 시간 단계 i의 값이 i+1이 되도록 지정합니다. 코드에서 지정하지 않은 시간 단계에 값이 있으면 게임에서 이를 0으로 가정합니다.

return sstate.signals()(은)는 for 루프의 끝에서 데이터를 게임에 반환합니다. 코드 끝에 이 줄이 포함되어야 합니다.

sstate는 신호 데이터 코드 작성에 유용한 여러 기능을 제공하는 게임의 Lua 인터프리터에 포함된 모듈입니다. 이러한 기능은 아래에 자세히 설명되어 있습니다.

게임에서 Lua 코드는 Moonsharp 인터프리터를 통해 샌드박스에서 실행되므로 Lua의 표준 라이브러리에 대한 액세스가 제한됩니다. 수학 라이브러리와 같은 기본 라이브러리는 계속 액세스할 수 있습니다. Lua 언어에 대한 자세한 내용은 https://www.lua.org/manual/5.2/를 참조하십시오.

sstate.setSignalSpecs(srcCount, outCount, timesteps)

SRC 및 OUT 채널 개수와 시간 단계 개수를 지정합니다. 4개의 SRC 또는 4개의 OUT 채널을 초과할 수 없으며, 총 5개의 채널을 초과할 수 없습니다. 시간 단계는 150개를 초과할 수 없습니다.


sstate.setSrcCount(srcCount)

SRC 채널 개수를 지정합니다. SRC 채널은 4개를 초과할 수 없습니다.


sstate.setOutCount(outCount)

OUT 채널 개수를 지정합니다. OUT 채널은 4개를 초과할 수 없습니다.


sstate.setSignalLength(length)

시간 단계 개수를 지정합니다. 시간 단계는 150개를 초과할 수 없습니다.


sstate.getSrcCount()

SRC 채널 개수를 반환합니다. 해당 값이 먼저 지정되어 있어야 합니다.


sstate.getOutCount()

OUT 채널 개수를 반환합니다. 해당 값이 먼저 지정되어 있어야 합니다.


sstate.getSrc(srcChannel, timestep)

주어진 시간 단계에서 주어진 SRC 채널의 값을 반환합니다. 해당 값이 먼저 지정되어 있어야 합니다.


sstate.getOut(srcChannel, timestep)

주어진 시간 단계에서 주어진 OUT 채널의 값을 반환합니다. 해당 값이 먼저 지정되어 있어야 합니다.


sstate.getSignalLength()

시간 단계 개수를 반환합니다. 해당 값이 먼저 지정되어 있어야 합니다.


sstate.signals()

지정된 신호 데이터가 포함된 테이블을 반환합니다. 코드가 return sstate.signals()(으)로 끝나야 합니다.


sstate.setSrc(channel, timestep, value)

지정된 SRC 채널 및 시간 단계에 대해 값을 설정합니다. -100~100 사이의 값이어야 합니다.


sstate.setOut(channel, timestep, value)

지정된 OUT 채널 및 시간 단계에 대해 값을 설정합니다. -100~100 사이의 값이어야 합니다.


sstate.attenuator(input, attValue)

감쇠기 모듈의 동작을 시뮬레이션하고 출력을 반환합니다. 입력 값은 -100~100 사이의 정수여야 합니다. attValue(은)는 -1~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보다 크면 true를 반환하고, 그렇지 않으면 false를 반환합니다.


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