https://factoriobin.com/post/qu63ai








두 개의 청사진으로 이어져있는데



가장 첫 부분은 위에 상수조합기가 연결되어있음





그다음부터는 상수조합기 필요없이 쭉 이어주면 됨






빨간선이 저렇게 세로로 쭉 이어져야함




원리




일단 벨트와 투입기와 분쇄기에서는 전부 내용물 읽기를 수행하고 있음

예를들어 고급품질의 금속소행성이 있다면 고급품질의 금속소행성 재처리를 하도록 설정하는게 목적





분쇄기의 경우 내용물 읽기도 해야하고 제작법 설정을 하기도 해야하기 때문에 잘못 합선나지 않도록 하는게 (1) 연산기

분쇄기에 연결된 녹색선이 (1)의 입력으로 들어가면서 그대로 (1)의 출력에 나오도록 하였음

한편 벨트와 투입기도 내용물을 읽었는데 이건 빨간선으로 연결해서 (1)의 입력으로 넣어주었다

이것도 초록색선으로 하면 벨트의 있는 소행성 신호가 그대로 분쇄기에 연결된 초록선이랑 합선 되어서 분쇄기의 레시피가 꼬이기 때문에 다른색 선을 쓴것

결국(1)의 출력은 녹색선으로 들어온 분쇄기내용물 신호와 빨간선으로 들어온 투입기벨트의 내용물의 합산 값이 나가게 된다


(예시 : 분쇄기에서 나온 고급금속3, 투입기 벨트에서 나온 고급탄소3 고급금속2 고급산화물2 희귀금속1, 그 합산 값인 고급금속5 고급탄소3 고급산화물2 희귀금속1)


이 출력은 녹색선을 타고 (2) 비교기로 들어간다




여기는 조건을 녹색선으로 들어온 신호가 0보다 클 경우, 그에 해당하는 빨간색 선 값을 프로메튬 신호로 바꿔서 내보내게 했다

빨간선으로는 상수조합기에 세팅된 값이 들어오는데

12종의 신호가 1,2,4,8,16,32,64,128,256,512,1024,2048 이렇게 2의 제곱수가 되도록 설정된 값이다


현재 상태의 경우 녹색선으로 들어오는 신호는 고급금속5 고급탄소3 고급산화물2 희귀금속1

이것들은 각각 빨간선 테이블에 의해 

고급금속5 -> 프로메튬2

고급탄소3 -> 프로메튬32

고급산화물2 -> 프로메튬512

희귀금속1 -> 프로메튬4
로 바뀌게되고 다 더하면 프로메튬550이 나온다


사실 꼭 프로메튬 신호로 할필요는 없고 걍 아무거나 써도 되는데 소행성처리하는거니까 남는 소행성 신호중에서 골랐음


550은 2진법으로 쓰면 0b0010_0010_0110 인데 각각 

0b0010(고급산화물이 있음)_0010(고급탄소가 있음) _0110(희귀금속,고급금속이 있음) 이라는 정보가 담겨져 있는 셈임



이렇게 얻은 신호는 녹색선을 타고 (3)연산기로 들어감




여기서는 전단에서 받은 프로메튬 신호와 상수조합기에서 빨간선을 타고 온 신호끼리 and 연산을 수행함

여기의 상수조합기는 먼저 봤던 상수조합기처럼 1,2,4,8,... 2의 제곱수로 세팅이 되어있는데 다만 신호의 종류는 소행성 신호가 아니라, 그거에 짝이 맞는 "소행성 재처리" 신호임


여기서의 연산은


일반금속 0b0000_0000_0001 and 0b0010_0010_0110 = 0b0000_0000_0000 = 0

고급금속 0b0000_0000_0010 and 0b0010_0010_0110 = 0b0000_0000_0010 = 2

희귀금속 0b0000_0000_0100 and 0b0010_0010_0110 = 0b0000_0000_0100 = 4

특급금속 0b0000_0000_1000 and 0b0010_0010_0110 = 0b0000_0000_0000 = 0

일반탄소 0b0000_0001_0000 and 0b0010_0010_0110 = 0b0000_0000_0000 = 0

고급탄소 0b0000_0010_0000 and 0b0010_0010_0110 = 0b0000_0010_0000 = 32

희귀탄소 0b0000_0100_0000 and 0b0010_0010_0110 = 0b0000_0000_0000 = 0

특급탄소 0b0000_1000_0000 and 0b0010_0010_0110 = 0b0000_0000_0000 = 0

일반산화 0b0001_0000_0000 and 0b0010_0010_0110 = 0b0000_0000_0000 = 0

고급산화 0b0010_0000_0000 and 0b0010_0010_0110 = 0b0010_0000_0000 = 512

희귀산화 0b0100_0000_0000 and 0b0010_0010_0110 = 0b0000_0000_0000 = 0

특급산화 0b1000_0000_0000 and 0b0010_0010_0110 = 0b0000_0000_0000 = 0


를 수행하는 거다

비트끼리 마스팅 연산을 통해서 

고급금속 고급탄소 고급산화물 희귀금속 라는 신호를

고급금속재처리 고급탄소재처리 고급산화물재처리 희귀금속 재처리 신호로 바꾼 것이다


https://gall.dcinside.com/mgallery/board/view/?id=factorio&no=79390

인덱싱을 활용한 자동 소행성 재처리 구조*들어가기 전에 빅-샤라웃투 https://www.reddit.com/r/factorio/comments/1gi529x/quality_grind_strategy/이 글은 거의 이 레딧 포스트의 해설에 가까움.소행성 재gall.dcinside.com


선별조합기의 인덱스 기능을 이용한 방법도 있던데 

아무래도 선별조합기 2개보단 연산기 1개 비교기 1개 쓰는게 좀 더 싸긴 하다




사실 여기까지의 결과를 분쇄기에 물려도 동작은 할 것이지만 살짝 문제가 있다




보았는가?


너무 빠르니 천천히 보자




레시피가 바뀌는 순간

탄소 재처리를 하려다가 

갑자기 산화물 재처리로 바뀌더니 투입기가 산화물을 집기 시작한다

근데 그 찰나에 또 금속 재처리로 공정이 바뀌었다

소행성은 이미 집은 산화물을 기계에 넣었지만, 이미 공정은 금속 재처리로 바뀌었기 때문에 잘못 넣은 산화물은 그대로 배출구로 직행되고 

그 이후에 다시 금속을 집은 소행성에 의해 공장이 작동한다


이렇게 신호간의 우선순위 이슈에 의해 이미 처리되고 있던 레시피가 강제로 레시피가 바뀌어 버리는 상황이 발생되기 때문에

버벅이는 것을 막기 위한 추가적인 회로가 붙는다




연산기(3)의 출력은 빨간선을 타고 비교기(4)로 들어간다




이 회로는 빨간선으로 신호가 들어오는게 있을 경우, 그 신호의 지속시간을 카운팅해주는 회로다

스샷으로는 감이 안오니 움짤로 보면






빨간신호가 뭔가 들어올때마다 그에 해당하는 신호가 틱마다 1씩 증가하는 것을 볼 수 있다

결과적으로 제일먼저 입력되었던 신호의 경우, 가장 큰 출력 값을 가진다

오래된 빨간신호가 죽을때마다 출력신호칸이 왼쪽으로 한칸씩 이동하는 모습이 보일거임


거의 다했다

비교기(4)의 출력은 선별기(5)로 들어간다




선별기에서는 가장 큰 신호만 필터링을 해준다

그리고 이 출력은 분쇄기로 연결되어서 가장 짬이 높은 소행성에 대해 분쇄 레시피를 실행할 것이다


이러면 레시피 변경시 버벅이는 것을 막을 수 있다











뭔가 이런 글이 이미 팩갤에 꽤 있을 줄 알았는데 별로 없길래 한번 정리해봤음

일단 만들기는 일반~특급에 대응해서 작동하도록 했는데

나는 일반품질 재처리는 별도 단지에서 전용으로 굴리고, 고급 이상에 대해서만 이 가변회로를 쓰고있음

계산 때려보니 일반재처리 분쇄기가 18개 있다면, 고급이상 재처리 분쇄기는 9.216개 필요한 것같더라

산화물 재처리 속도가 2초가 아니라 1초라는걸 빼먹고 계산하긴했지만 그거 고려해도 대충 저런 느낌으로 나오긴 할듯












선별조합기 쓰는걸 비교조합기로 바꾼 개선버전

https://gall.dcinside.com/mgallery/board/view/?id=factorio&no=93237

소행성 가변 품질작 개선https://gall.dcinside.com/mgallery/board/view/?id=factorio&no=93058 소행성 가변 품질작 청사진 - 팩토리오 마이너 갤러리https://factoriobingall.dcinside.com