기본적인 구성은 위 글과 같은데, 댓글에서 언급된 문제점과 개선방안을 참고해서 새롭게 회로를 구성해 봤음.
LTN과 거~의 동일하게 작동할 것으로 예상되는데, 실제로 대규모로 굴려보지 않아서 많은 피드백 부탁함.
기본적인 얼개는 위 링크와 동일하게 공급역과 요청역에서 아이템에 해당하는 신호를 1씩 쏘아 올리면 그것이 매칭되어서 열차가 출발하는 것임.
각 신호의 의미는 다음과 같음
빨간색 신호: 공급
초록색 신호: 요청
나는 여기서 "하나의 공급역에 여러 열차가 한 번에 배정될 수 있게끔" 하고 싶었고,
공급역 -> 요청역으로 이동 중 새로운 열차 스케줄이 설정되는 것을 방지하고자 했음.
먼저 공급역임.
회로가 많이 복잡해서, 블루프린트를 받아서 직접 주석을 보면서 따라가 보는 게 더 이해가 잘 되지 싶음.
말로 설명을 하자면
1. 상자의 아이템 종류를 읽어, 아이템의 스택 크기를 얻음
2. 여러 연산을 통해 상자에 저장된 아이템을 스택 단위로 변환함
3. (나는 1-2-1 기차를 사용하므로) 스택을 80으로 나누어, 기차 단위로 저장된 아이템을 변환함.
즉, 몇 대 분량의 아이템이 저장되어있는지 도출함
4. 빨간 조합기에서 "최대 열차 수" (LTN의 그것과 동일한 기능) 를 지정함.
5. 최대 열차 수와 저장된 아이템을 비교하여
5-1: 최대 열차 수>저장된 아이템 의 경우, 저장된 아이템 수를 출력
5-2: 최대 열차 수<=저장된 아이템 의 경우, 최대 열차 수를 출력
-> 최소한 열차 한 대 분량이 있어야 열차가 배정될 수 있고, 아이템이 많이 쌓여있어도 최대 열차 수 이상으로 배정되지 못함.
이 단계에서, 만약 최대 기차 수가 2이고 아이템이 기차 2대 분량 이상 저장되어 있으면 기차 신호 2가 출력될 것임.
이 신호는 "이 공급역에서 최대 2대의 열차를 받을 수 있다" 는 의미임.
요청역에서 철광석 요청이 떠서 기차가 배차되면 열차가 오게 될 것이니, 만약 상술한 "기차 신호 2"가 그대로 있으면 몇 대의 열차가 오던지 관계없이 열차가 계속 배차될 것임. 문제가 되겠지
그렇기에 다시 조합기를 사용해서 (기차 신호 2 - 정거장에 오는 열차의 수) 를 계산해 줌.
이렇게 되면 기차가 1대 배치되면 추가로 1대 더 배치될 수 있고, 2대 모두 배치되면 더이상 열차가 배차되지 않을 것임.
이제 앞서 계산한 (기차 신호 2 - 정거장에 오는 열차의 수) 값을 회로를 이용해서 적당히 박스에 담겨있는 아이템 신호로 바꿈.
예를 들어 이곳이 철광석 공급역이고, 최대 기차 수가 2이며, 저장된 아이템은 3대 분량이고, 정거장에 열차가 1대 오고 있다면 철광석 1이 출력될 것임.
이 빨간색 신호를 레이더에 연결해서, 전역 네트워크에 빨간색 철광석 신호 1을 송신함.
이 말은 즉슨 이 역에 철광석을 수송하기 위한 열차가 1대 더 배차될 수 있다는 의미임.
그런데 문제는, (요청역 부분에서 후술하겠으나) 공급역을 향해 열차가 배차되어도, 요청역에서는 요청 신호를 계속 뿜어내고 있다는 것임.
요청역의 요청 신호는 요청할 아이템 양과 최대 기차 수에 의해 정해지는데, 요청역 입장에서는 열차가 공급역을 향해 출발하던 말던 알 방법이 없음.
그래서, 공급역에서 공급역을 향해오는 열차의 수를 공급역에서 공급하는 아이템 신호로 바꾸고, 여기에 (-1)을 곱해 초록 신호(요청) 으로 출력함.
즉, 철광석 기차가 공급역을 향해 출발하면 요청량이 1 줄어듦으로서 추가적으로 열차가 배차되는 것을 방지하는 효과가 있음.
다음은 요청역임.
기본적인 구성은 공급역과 비슷함.
빨간 상자에서 아이템 유지량(기차 단위: 예를 들어 요청량이 4라면, 4*80 = 240 스택을 상시 유지하겠다는 뜻임)과 최대 기차 수를 설정함.
이후 공급역과 비슷한 구조로 저장된 아이템의 갯수를 기차 단위로 환산해서, (아이템 유지량 - 저장된 아이템) 을 계산해서 몇 대 분량이 부족한지 계산함.
이후 최대 기차 수와 비교하여 항상 최대 기차 수보다 적은 값이 출력되도록 함.
이때 동일하게 부르고자 하는 기차의 수에서 요청역을 향해오는 기차의 수를 뺀 값을 만들고,
이 값을 요청역에서 요구하는 아이템의 종류로 바꾸어서 레이더에 초록색 신호로 송출함.
예를 들어 여기가 철광석 요청역이고, 최대 기차 수는 2이며, 기차 4대 분량을 저장하고자 하는데 남은 양이 기차 2대 분량뿐이라면
2대를 요청하는 신호가 발신될 것임.
그런데 여기서 중요한 포인트가, 이 요청역을 향해오는 기차의 수는 이 기차가 공급역을 출발한 시점에 회로에 잡힌다는 점임.
그래서 아까 공급역에서 미리 마이너스를 곱해서 요청량을 없애준 것임.
마지막으로 대기역.
레이더에서 빨간 신호와 파란 신호를 모두 수신받아
두 개 모두 1 이상인 경우 1로 출력함.
기차 인터럽트는 이렇게 설정함.
역 이름이 모두 똑같은 형식이어야 함. (아이템) 공급 / (아이템) 요청 식으로.
자, 그럼 사고실험을 해 보자.
현재 공급역에서 철광석이 가득 차 있고, 최대 기차 수가 2여서 빨간색 철광석 2를 출력 중이다.
이때 요청역에서 철광석이 계속 소비되다가, 부족해지는 시점에 초록색 철광석 1이 출력된다.
대기역에서는 철광석이 빨간색과 파란색 모두 0 이상이므로, 철광석 1 신호를 기차에 보낼 것이다.
기차 인터럽트에서는 철광석 = 1 이 되므로, 기차에 (철광석) 공급 -> (철광석) 요청 이라는 임시 경로가 인터럽트로 생성된다.
이때 기차가 (철광석) 공급 역을 향하면서, 철광석 공급역을 향해오는 기차의 숫자가 1이 된다.
따라서 상술한 연산을 통해 빨간색 철광석 신호도 하나 줄어들고, 초록색 철광석 신호도 하나 줄어들 것이다.
결과적으로 네트워크에 남아있는 신호는 빨간색 철광석 1 뿐이다.
공급역에서 기차가 상차를 마치고 발차했다.
공급역의 재고는 아직 충분하므로, 네트워크에는 다시 빨간색 철광석 2가 출력된다.
이제는 철광석 요청역을 향해오는 기차의 숫자가 1이 되었다.
요청역의 회로에 의해 요청역에서는 아무런 출력이 없다. (부르고자 하는 기차의 수 1 - 오고 있는 기차 수 1 = 0)
즉 초록색 철광석 신호 출력되지 않는다.
철광석 공급역을 향해오는 기차의 수가 없어지기까지 약간의 지연이 있어, 잠시 동안 초록색 철광석 -1이 잠시 표시되다 사라진다.
철광석 요청역에 기차가 정차하고, 아이템을 하차한다. 그동안 초록색 철광석 신호는 0이다.
철광석 요청역을 기차가 발차하면,
- 만약 요청역에 철광석이 충분하다면 아무 신호도 없을 것이고
- 그동안 소비량이 많아 또 기차 1대 분량만큼 소비되었다면 다시 요청 신호가 표시될 것이다.
이러한 방식을 통해 기차 꼬임 현상을 예방하고,
기차가 많아질 때 공급역에서 기차가 무한 대기하는 현상 역시 없앨 수 있을 것 같다.
다만 대규모로 운용해보지 않아 확실하지는 않다...
청사진 문자열 올리니, 많이 테스트해보고 피드백 부탁함.
나도 다른 맵에 적용해서 테스트해봐야겠음.
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
2.0은 조금만 건들면 사이버신은 어려워도 LTN은 될거 같은데 뭔가 뭔가 계속 어려운 문제가 발생함...
차가 출발하는 신호가 모든 대기역에 동시 송출되는게 제일 큰 문제였는데 결국 최종적으로 완성했는데 다들 자기먼의 방법으로 잘 쓰길래 후속 공략은 안올렸움 - dc App
올려줘잉 다양하게 연구되면 좋지
추가: 요청역에서 요청 신호를 쏠 때만 정거장이 활성화되도록 조건을 걸어주는 회로 만듦. 요청역이 여러 군데일때 애먼 데로 가는 경우가 있었음
추가2: 요청역에서 (최대열차수) - (오고있는열차수) >=0 일때 값을 뱉어내게 중간에 수량비교기 추가함
인터럽트 관심가지고 보는사람 많네 좋다
회로글 읽을때마다 워크샵 열어서 강의해주면 좋겠다....내가 어디부터 이해안가는지도 모르겠다.
디코 방송켜서 해설해줄까 ㅋㅋ
왜 나는 안될까 기차가 대기역에서 멍 때리고 있다ㅜㅜ