모드 안쓰고 기차역 회로 연결해서

LTN 처럼 하는데 어느정도 성공했다


역이름 같게 설정하면 발생하는 문제가

상차역이 10개고

하차역이 1개라고 가정했을 때


하차역 1개만 켜져있어도

상차역에 있던 10대 기차가 동시에 하차역으로 달려가서

1등으로 달려간놈은 하차역에 푸슉해서 신난다~ 하면서 물품 내리고

1등으로 못한 나머지 열차놈들은 에이 쉬벌탱 하면서 다시 원래 상차역으로 돌아갔는데


이게 쓸데없이 철도 교통량을 늘려서 교통체증을 발생시켰음


이젠 하차역이 1개 켜져있으면 열차 1대만 출동한다

신호 아주 살짝 응용했음

아주 완벽하진 않지만 현재 실험해봤을 때 나름대로 만족



대충 말해주자면


<준비과정> 

1. 철도를 따라 전신주 이어 박고, 그 전신주를 회로선으로 연결 (블루프린트로 전신주 사이사이 회로선 연결해놓는거 만들어놓으면 편하게 회로선 연결 가능)

2. 상차역 하차역 두개다 열차가 정차하면 꺼지게끔 설정

3. 하차역 같은 경우 보관상자에 충분한 물품이 있을 경우 역 끄기 - SR 래치 쓰던지, 안쓸거면 하차역에서 열차 출발 조건을 시간으로 설정해버리던지 하셈

4. 상차역에 조합기를 이용해서 딜레이 만들어주기

ㄴ 이게 핵심인데 동시에 열차를 출발시키지 않기 위해 만든거임

ㄴ 밑에 4번에서 설명


1,2,4번은 필수 / 3번은 선택인데 3번도 무조건 하는게 좋음



<말로 설명하는 서킷네트워크 신호 교류 방식>

1. 하차역이 켜지면 철도 따라 박은 전신주- 쭉 연결된 회로선에 원하는 물품을 신호로 정해서 value = 1 을 전송 

(신호 종류는 가급적 상/하차하는 물품으로 하는게 안헷갈리고 좋음)

2. 상차역에서는 역이 꺼져 있을 때는 +0 을 전송 / 역이 켜져 있을 때 철도 따라 박힌 회로선에 1번과 같은 신호종류로 value = -1 을 전송 

ㄴ 이 때는 어떤식으로 하냐면, constant combinator 로 -1 을 항상 전송하고, 열차가 역에 정차해있을 때 +1 을 추가적으로 전송해줘야함

   이렇게 하면 열차가 역에 있을 때는 신호를 안내보내다가( -1+1=0 이니까 신호를 안보낸단느것),  열차가 역을 떠나면 (역이 켜지면) -1 을 보냄

3. 열차 출발 조건 : '니가 원하는 조건 ex) 120초 후' AND '해당 신호>0 '

4. 상차역에 딜레이 만들기 

ㄴdecider combinator (아 시바 한글로 뭐였는지 또 까먹었는데 신호 비교 조합기인가 그럴거임) 총 3개 필요 - 3개 직렬로 연결해야함


ㄴ1번, 2번에서 철도 따라 이은 회로선을 첫번째 조합기 input 에 꼬라박기

ㄴ첫번째 조합기 parameter : 옮기는물품 신호 > 0   / output : 옮기는물품 신호 (1을 내보내기에 체크)


ㄴ첫번째 조합기 output 을 두번째 조합기 input 에 연결

ㄴ두번째 조합기 parameter : 옮기는물품신호 < 원하는딜레이틱(숫자로)  / output : 옮기는물품신호(input count 에 체크; 한국말로 들어오는 신호 그대로 내보내기 이런거임)


ㄴ두번째 조합기 output을 세번째 조합기 input 과 두번째 조합기 input 에 연결(이게 딜레이만드는거임) 

ㄴ세번째 조합기 parameter : 옮기는물품신호 = 원하는딜레이틱(숫자로)  / output : 옮기는물품 신호 (1을 내보내기에 체크)


ㄴ마지막으로 세번째 조합기 output 을 상차역에 연결



이런식으로 해주면 됨

기차 2대로 실험중이라 원하는딜레이틱을 120으로 했는데, 120틱이면 2초니까

만약 하차역이 2개가 켜지면, 상차역에 있던 2대가 평균 1초 간격으로 출발함(어디까지나 평균이고 실제로는 평균값은 큰 의미없음)


실제로 열차 여러대를 운영한다 생각해보면 120틱은 너무 적은거같고 같은 물품 옮기는 기차가 10대 있다고 치면 여유있게 300틱 정도 해주는게 좋을거같음

참고로 실험결과 - 열차가 출발하는데 걸리는 시간 3틱이므로, 아무리 적게 틱을 잡더라도 최소 (기차수*3) 보다는 크게 해야함 무조건!

대략적으로 600틱 해놓으면 아무리 메가베이스라서 철판을 존나게 옮긴다고 해도 철판 옮기는 기차가 200대는 안될테니

그냥 계산하기 귀찮으면 600틱으로 해놓으셈 


내가 추천하는 딜레이 틱은 (기차수*30틱) or (기차수*60틱)

적절하게 진짜 어쩌다 어쩌다 한번씩 2대 동시에 출발해도 상관없지뭐 하는 사람은 기차수*30틱

나는 절대 기차가 2대 동시에 출발하는 꼴을 못보겠다 하면 기차수*60틱


참고로 몇틱을 넣던 동시에 역을 3개 활성화시키면 처음 출발은 동시일거임

하지만 그다음부터는 순차적으로 간다



<알고리즘을 말로 풀어서 설명해보기 feat. 예>

쉽게 생각하면, 철도 따라 전신주에 쭉 연결해놓은 회로선이 신호교류 네트워크의 중심이지?

이걸 중심으로 얘기해주자면

예를 들어 석탄을 옮기는 열차와 상/하차역이 있다고 치자


철도 따라 박힌 회로선에 석탄신호=1  이라는 신호가 들어왔다는 얘기는?

석탄 하차역 1개 에서 석탄 공급이 필요합니다 <- 라는 의미야


석탄 신호=2 가 들어왔다면?

석탄 하차역 2개에서 석탄 공급이 필요합니다 <- 라는 얘기고.

(물론 내가 이렇게 신호를 이해하기 편하게 위에 설명한데로 정했기 때문이고 신호 value 를 -1로 하든 -100 으로 하든 그건 너희의 선택)


이제 석탄 신호와 연결해서, 상차역에서 열차 출발 조건을 보자.

예를 들어, '120초 후 출발' AND '석탄신호 >0'  이런식으로 내가 아까 설정하라고 했는데

And 니까 당연히 120초 기다리기 + 석탄신호>0 ( 하차역에서 석탄 공급이 필요합니다 라는 신호가 있을 때) 

출발한다는건 쉽게 이해했을테지


이 때 내가 가 생각하는 핵심은, 켜진 하차역이 1개뿐인데 대기하는 모든 열차가 그 역에 가지 않게끔 하는거야

물론 '(켜져있는)하차역 갯수' > '(켜져있는) 상차역 갯수'  일 땐 동시에 다 출발하건 말건 상관이 없어 왜냐면 모든 열차가 다 다른 목적지가 있으니까

암튼 서론 때려치우고 <딜레이 + 상차역에서 내보내는 신호>가 하는 역할이 바로 모든 열차가 동시에 출발 안하게끔 하는거야



##상차역에서 내보내는 신호 설명

상차역에서 내보내는 신호를 보면, 

-역이 꺼져 있을 때 (열차가 역에 정차해있을 떄) 신호=0을 전송 

(정확히 얘기하자면, 신호를 그냥 안보내는거지 신호 0을 전송하라고 설명한 이유는 신호 설정을 어떻게 해야하는지 너희들이 이해하라고 그렇게 설명한거고)

-역이 켜져있을 때는 ( 역에 아무 열차가 정차해 있지 않을 때 ) 신호 = -1 을 전송


즉 무슨 얘기냐면, 

철도 따라 이어진 회로선에 석탄 신호value=1 이 들어왔을 때 의미하는게 석탄 하차역 1개에서 석탄공급이 필요합니다 라는 얘기였는데

상차역 1개가 비어있으면 석탄 신호vlaue=-1 을 내보냄으로서  철도 따라 이어진 회로 네트워크에 있는 석탄 신호는 -1+1 이 되어서 신호가 없어져버림


다시 설명해주면, 

석탄하차역 1개에서 석탄 공급이 필요해 = 석탄 신호 1 보내기

석탄상차역에 있던 열차 1대가 출발했어 = 석탄신호 -1 보내기


이게 종합해져서 석탄 공급이 필요하다는 신호가 없어져버리는거야

그럼 나머지 상차역에 있는 열차는 출발 안하고 대기타는거지. 언제까지 대기타냐고? 다른 석탄 하차역에서 석탄 공급해라는 신호가 올 때까지!


##딜레이 설명

딜레이는 그럼 왜 다는데?

석탄 필요하다고 보내는 신호+1 이랑, 상차역에서 열차가 출발하면 보내는 신호-1 이 합쳐져서 없어진다며?

근데 필요해 시바


-딜레이란?

:말 그대로, 어떤 신호가 전송되는 데 있어서 인터벌을 두겠다는 얘기야

너네 신호에 대해서 펄스파 이런거 들어봤을 텐데 신호가 밑바닥에서 기다가 갑자기 튀어올라서 쭈루룩 가다가 다시 내려앉고 그러는거있지? 

그런것처럼 주기적으로 신호를 보내는 딜레이를 걸겠다는 얘기임.

120틱을 딜레이로 걸면 어떻게 되냐면, 신호를 120틱 후에 1틱동안 전송하고 다시 120틱 대기하다가 1틱동안 전송하고 이런식임

(물론 딜레이를 어떻게 짜느냐에 따라서 몇틱후에 몇틱을 전송할지 결정할 수있는데, 적어도 지금 설명하는 이 기차제어 에서만큼은 1틱동안 전송해야함)


-딜레이 역할

: 열차가 역에 들어온 순서에 따라 딜레이 카운트가 시작된다. 내가 정한 만큼의 딜레이 숫자가 꽉 채워져야 열차가 출발하므로 '사실상 매우 높은 확률'로 모든 상차역의 딜레이는 다르게 카운트된다. 즉, 딜레이를 기차수에 비해 너무 적게 했다던가 그게 아니라면 한마디로 운이 더럽게 나쁘지 않은 이상 열차는 2대가 동시에 출발하지 않고 1대씩 순차적으로 출발하게 끔 한다.



-딜레이가 언제 카운트 되는지 간단하게 예시로 설명 - 이 기차제어를 기준으로 설명

: 열차가 2대라고 치고 틱을 120 으로 잡았을 때, 이 2초(120틱) 이라는 시간이 언제 카운트가 되냐면

철도와 연결된 회로선에 value > 0 일때 (하차역에서 공급이 필요하니까 얼른 물품 가져와라! 라는 신호를 보낼때)

임. 그 외에는 저 틱이 카운트가 안되고 원래 숫자를 유지해. 이게 핵심인데, 무슨 얘기냐면

모든 하차역에 물품이 다 충분히 저장되어 있습니다 열차는 그냥 쉬세요 <- 이런 상황일 때

열차가 대기하고 있는 상차역마다 저장되어 있는 딜레이 틱이 다르다는 얘기야


예를 들어 첫번째 상차역에 저장된 딜레이가 60이라고 하고, 두번째 상차역에 저장된 딜레이가 50 이라고 하자

그러면, 물품 공급하라는 신호가 들어왔을 때 동시에 딜레이가 카운트되기 시작하고, 첫번째 역은 60틱만 지나면 120틱이 되니까 정확히 1초후에

출발함. 이 때 두번째 역은 50틱에서 60틱이 전송되어 110틱에서 멈추고 대기. 즉 다음 공급하라는 신호가 들어오면, 10틱만 더 지나면 두번째 상차역에 대기하던 열차가 출발 (110틱 +10틱 = 120틱이 되므로)  이런식인 거임


말로 설명하기 존나 어려워 시바 직접 해보는게 이해 빠를덧

아 물론, 위에 내용은 어디까지나 이론적인 얘기고 실제로는 열차가 출발하는데 걸리는 시간 3틱이 추가되어서 첫번재 열차역은 틱이 3 저장되어 있을거임

근데 이건 그냥 몰라도 돼 중요한건 이 3틱이라는게 딜레이를 만들 때 (기차수*3) 이상의 딜레이로 설정해야 한다는거임 위에서 대충 언급했으니 이해가 안되면 그냥 그러려니 하고 넘어가셈 결론만 기억하면됨 (기차수*3) 이상의 딜레이를 설정해야 한다는게 결론


## 위에서 설명한 상차역에서 보내는 신호+딜레이 가 합쳐져서 열차를 순차적으로 1대씩 보내게 하고, 1대가 출발했으니 공급해달라는 신호를 상쇄시켜 버려서 공급해야하는 필요한 열차수만 딱 이동하게끔 한다!



---------------------------------

이제 ㄹㅇ 뻘글


아 기분 너무 좋아서 자랑글겸 뻘글 쓸려고했는데

자랑글만 쓰면 니네 화날거같아서 설명좀 하려다가 길어졌다

사진은 없어 존나 귀찮아


참고로 이 방법의 단점은

기차가 가까운 역을 우선순위로 잡기 때문에

동시에 3개 역이 켜져있으면 3대가 모두 가까운 역으로 출발한후 1등으로 도착한 열차놈은 가까운역에서 하차하고

나머지 2놈은 에이 시벌 하면서 그다음 가까운 역으로 가고, 꼴등한놈은 또 에이 시벌 하면서 제일 먼 역으로 간다는거임


하지만 smarter train 모드를 쓰면 이문제의 많은 부분을 해결할 수 있지

나는 엔밥 이런거 별로 안좋아하는데 그 이유가 사실상 팩토리오는 퍼즐겜 + 제어 겜인데

너무 복잡한 퍼즐에는 영 재미를 못느끼겠어 노가다같아... 근데 제어는 재밌어

공장 구성해서 어디로 물품 보내고 어디로 빼내고 이런건 퍼즐에 가깝다고 보는데 이런건 약간 질리는감이있음

암튼 오늘도 밥모드로 켜놓고 공장은 확장 안하고 쓸데없는 기차 만지작 거리면서 재밌게 놀았다


이제 smarter train 모드 섞어서 더 좋은 기차제어를 하러 간다