드릴과 분배기를 보기전에 우선 벨트위에 아이템 좌표에 대해 먼저 보고가자

터보벨트위에 아이템을 올리고 1틱씩 이동할때마다 아이템의 좌표를 찍어보았다


1틱당 0.125 = 1/8칸씩 이동을 하고 있어서 1칸이동에 8틱이 소요되는 모습을 볼 수 있다




참고로 노란벨트 위에서는 이렇다

1틱에 1/32= 0.03125만 이동해서 한칸 이동에 32틱이나 소요되고 있는 모습


그런데 내가 녹벨에서는 철판을 0위치에 정렬시키고 출발시켰지만 노란벨트는 정렬안시키고 찍었다 보니 좌표가 지저분한 것을 볼 수 있다

이는 벨트위에서의 좌표 정밀도가 1/32수준이 아니라는 뜻




간단한 테스트를 해보니 벨트 위 아이템의 양자화 단위는

0.46875-0.46484375=0.00390625=1/256

아이템은 벨트위에서 256개의 좌표를 가질 수 있다




본론으로 들어가보자


철광석은 스프라이트가 계속 변화하면서 보기가 힘들기 때문에 철판을 캐도록 개조를 좀 해두었다



풀벨트로 잘만 동작하던게 벨트한번 막혔었다고 왜 반벨트로 동작하게 된 것일까?


그 비밀을 파헤치기 위해 분배기를 벗겨보았다


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

분배기와 지하벨트가 투명하다면?갑자기 궁금해서 스프라이트 투명하게 바꾸면 뒤에서 무슨 일이 생기나 구경해봤음투명 지하벨트투명 분배기투명 레인 밸런서빨간 네모 친 부분이 분배기에 해당하는 영역임초록 네모 친부분 잘 보면 아이템 두개가 겹쳐있는 걸 볼gall.dcinside.com

4년전에 했던 짓을 이제와서 또 해보게 될줄이야



이건 정상 동작할때의 모습이다(1/15 배속)

둘 다 풀벨트로 잘 나가는 모습



이건 왼쪽 드릴이 비정상 동작할때의 모습이다(1/15 배속)

둘의 차이가 보이는가?



딱봐도 드릴이 아이템을 내려놓은 위치가 다른것을 볼 수 있다



가동 직후의 드릴은 바닥에 놓인템이 아무도 없는 상태에서는 최대한 가운데에 아이템을 내려둔다


2틱동안 아이템의 좌표를 출력해보았다



Line1은 분배기의 왼쪽입력라인

Line5는 분배기의 출력왼쪽라인

Line7는 분배기의 출력오른쪽라인


드릴은 Line1의 0.07421875 위치에 아이템을 내려놓는다

아까 녹벨은 틱당 0.125씩 이동한다고 했던것을 기억하고 있는가?

0.07421875-0.125 = -0.05078125

0보다 작아지기 때문에 분배기 건너편으로 넘어가게 된다

분배기 건너간 직후의 좌표는 0.25로 고정되는듯한 모습이다


드릴에서 중앙에 내려놓은 아이템은 1틱만에 분배기 건너편으로 넘어가기 때문에 자리 점유하던것을 바로 풀어버리게 되고, 드릴은 그 빈자리에 바로바로 새 아이템을 내려놓을 수 있다

내려놓은 아이템은 1틱은 위로 가고 1틱은 아래로 가고를 반복한다




한가지 짚고 넘어가는 것을 잊었다

벨트 반줄 위에는 아이템이 4스택까지 올라갈 수 있고 따라서 아이템사이의 간격은 1/4 = 0.25다

녹벨은 한틱당 1/8씩 이동하기 때문에 1틱은 위로 아이템을 보내고, 1틱은 아래로 아이템을 보내서 2틱주기로 템을 내보낸다 하더라도 풀벨트를 딱코로 맞출수 있다





이제 막힌 벨트 케이스를 다시 보자


Line5,7의 출력이 막혀있기 때문에

Line1에도 2개의 템이 있는 것을 볼 수 있다

하나는 Line5,7의 출력을 기다리며 딱 0좌표에 있고, 두번째 아이템은 0.25위치에 있는 모습



이제 벨트를 풀고 다음틱의 모습을 보면



Line1의 0좌표에 있던 아이템은 Line5의 0.43359375로 넘어갔고,

드릴은 새로운 아이템을 내려놓았다


기존처럼 0.07421875에 내려놓는 것이 아닌, 0.375에 내려놓았다




한틱이 더 지나간 모습

0.125, 0.375에 있던게 0, 0.25로 이동했지만 이 시점에 분배기를 건너간 아이템은 없다

드릴은 추가 아이템을 둘 공간이 확보되지 않았기 때문에 추가 아이템을 내려놓지 못한다


그렇기에 펑크가 난다


문제가 생긴 드릴은 껏다가 키면 바로앞 공간이 다시 비기 때문에 다시 0.07421875에 내려놓을것이고, 이 아이템은 다시 1틱만에 분배기를 건너갈 것이다.

그렇기에 복구가 된다.





참고로 터보분배기 말고 다른 분배기를 사용할 경우는 내려놓는 위치가 조금 다르다

녹벨 : 0.07421875=19/256 (벨트속도 32/256)

파벨 : 0.10546875=27/256 (벨트속도 24/256)

빨벨 : 0.13671875=35/256 (벨트속도 16/256)

노벨 : 0.16796875=43/256 (벨트속도 8/256)


티어가 낮아질수록 내려놓는 위치가 점점 분배기 중앙포지션에서 멀어진다

가뜩이나 속도도 더 느린데 내려놓는 위치가 저렇게 멀어져버리니 다른 티어로는 풀벨트를 만들래야 만들 수 없다


내려놓는 위치 자체가 바뀌는 원인은 뭘까?

이건 진짜 코바렉스가 와서 알려주지 않는 이상 모를 것 같다




혹여라도 벨트위 좌표를 직접 확인하고 싶은 사람이 있다면 벨트나 분배기에 커서를 올린 상태에서 아래의 커맨드를 쓰면 확인할 수 있다


/c local selected=game.player.selected local m=selected.get_max_transport_line_index() for i=1,m do local cs=selected.get_transport_line(i).get_detailed_contents() for _,c in pairs(cs) do game.print("Line "..i..": ".. c.position)  end  end 




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


깔끔한 해결책이 생각나서 추가로 공유하고자한다

분배기의 입력쪽에 벨트를 하나 떠 깔아주고 내용물 읽기(모든벨트)를 체크한다

이러면 분배기의 입력쪽에 걸려있는 아이템을 회로로 얻을수 있기 때문

그리고 드릴은 동작조건을 모두<=4 일때 동작하도록 한다


이러면 출력이 막히더라도 분배기 입력쪽에 아이템을 과하게 내려 놓는것을 막을 수 있다


1배속



틱단위 재생



상당히 깔끔해서 마음에 든다