글레바에서 공장을 시행착오 겪으면서 만들어보기 힘들어서 샌드박스 모드 만지다가 만들었는데 활용의 여지가 있는 거 같아서 올림.
할 수 있는 일은 특정 물건(여기선 군사과학팩)을 기준으로 거기서 다음 물건까지 균등 분배.
원리는 분배기에 출력방향을 정할 수 있으니까 저 회로 읽는 데서 펄스로 군사팩 읽은 시점으로부터 고정적인 틱후부터 출력을 바꾸면 분배가 되겠지?
그건 녹벨은 한 벨트에 8틱 머물고 분배기에서 있는 8번 동안의 틱중에 6에서 7로 넘어갈 시점에 좌우가 결정됨.
근데 조합기들도 1틱씩 걸려서 펄스 뒤로 몇 틱 뒤부터 해야되는지는 회로마다 값을 다르게 넣어야 되서 조금 노가다 했음.
결국 구현을 2부분으로 나눌 수 있는데
1. 특정 물건 감지(군사과학팩)하고 그게 몇 번째 발견인지 (4로 나눈 나머지) 출력
2. 앞으로 특정 틱 이후에 분배기의 출력을 바꿈(바꾼 채로 유지 다시 바꾸지 않으면)
1 은 간단하게 위에 비교기랑 연산기 하나씩 있는 것으로 한다. 펄스로 입력받아서 해당 시점에 새는 거임.
그리고 3줄 있는데 첫줄을 매번 바꾸고 2번째줄을 2번마다 바꾸고 4번째 줄을 4번마다 바꾸면 결국 균등분배가 위에 처럼 되게됨.
그래서 카운트를 8까지 세고 다른 부분도 8개 만들고 이럴 필요가 없이 3개만 만들어도 됨.
2는 다시 정리하면 결국 어떤 신호를 받고 고정적인 몇 틱 후에 신호를 바꿀 수 있어야 하고 신호가 처리되기 전에도 역시 또 변경을 예약 할 수 있어야해.
구현 방법의 다양성은 가늠이 안되지만 지금 방법을 설명하면
어떤 수 x를 매 틱마다 << 1(시프트) 해준다고 생각해보자 그럼 32개의 1을 저장 할 수 있고 이게 가장 끝까지 가고 결국 없어질거야
이때 가장 끝에 있을 때 그러니까 부호비트 일때 얘를 사용하면 되는 거지 그럼 몇 비트 후에 일을 처리할 수 있겠지?
그리고 중간에 아직 끝나지 않아도 여전히 원하는 시점에 일을 예약할 수 있겠지?
간단한 예로 4칸짜리라고 치면 너가 일이 있을 때마다 1을 넣는 거임.
0001 -> 0010 -> 0100 -> 1000 -> 0000
이렇게 3틱 후에 부호비트가 되어서 일을 해야 함을 알 수 있고 끝난 후에는 알아서 사라짐.
0001 -> 0010 -> 0101 -> 1010 -> 0100 -> 1000 -> 0000
이렇게 중간에 예약을 추가하는 것이 아무런 영향도 없겠지?
지금은 동시에 같은 곳에 예약이 들어오지 않으니 + 해주어도 상관없어.
그리고 지금은 +1을 해주었지만 내가 예약을 하고 싶은 시점이 조금 더 빠르면 10(2)이나 100(4)를 더해주면 됨.
그런데 단순히 그 비트로 분배기에 연결해도 해당 틱만 음수로 바뀌니까 이것을 기록해야겠지?
그래서 아웃풋이 얘가 아니라 따로 o가 있다.
o는 그냥 기존 자기 값에 저기서 들어오는 << 되는 값을 매 틱 xor한다.
o의 부호는 xor하면 어떻게 결정될까?
o와 xor하는 값의 부호 비트가 0이면 o의 값이 유지되고 xor하는 값이 부호비트가 1이면 o의 부호가 바뀌어 이걸 결정하는 것은 이 두가지 요소 밖에 없어서
덧셈이나 곱셈이랑 다르게 다른 비트는 영향이 없어.
딱 지금 필요한 연산이지.
그럼 매 틱마다xor해나가는 o는 지저분한 값이 되겠지만 결국 부호는 우리가 <<하면서 관리한 값의 부호비트가 1일때만 바뀌어.
이 값을 분배기랑 연결해서 o가 음수거나 아니면 0>=일 때 조건을 나누어서 좌우 제어하면 원하는 것을 구현할 수 있다.
그리고 녹벨이나 파벨까지 지금 구현으로는 8분기를 만들 수 있어 왜냐하면 32비트 자료형이니까 가능한 가장 나중의 예약이 1이겠지?
같은 원리로 충분히 연장할 수 있겠지만 지금 구현은 그래.
얘는 마지막 라인 구현이야.
마지막 라인이라 꽤 나중에 바꾸어야 겠지? 그래서 값이 상대적으로 작아.
다른 애들도 그렇지만 지금은 미래에 어떤 한 틱만 예약하는 거라서 모두 2^n꼴이야.
그리고 녹벨 한 칸에 8틱 걸리니까 전에 값들이랑 이거에 비례하게 차이가 나 예컨데 2 다음 틱에 예약하려면 1을 넣어야겠지?
그리고 카운터가 1일때만 바꿔 1,2,3,4 가능함.
아까 말했던 shift하는 애.
위 두 친구들의 f와 3의 값(아까 틱에서 shift한 값)을 합쳐줘.
+가 되는데 이건 f를 새로 예약하는 과정이라고 보면 돼 .
그리고 <<가 보면 루프인데 루프가 자신과 있는게 아니라 지금 비교 연산이랑 이어져서 크기가 2인 루프야
그래서 shift가 2번마다 한 번 일어나서 정교함을 떨어졌지만 좀 더 먼 미래까지 예약할 수 있어.
사실 <<얘를 매 틱하는 루프를 어떻게 만들지 모르겠어서 이렇게 만들었는데 오히려 좋은듯?
말했던 진짜 아웃풋 얘로 분배기에 음수면 왼쪽 자연수면 오른쪽 이런 식으로 걸어 놓으면 잘 작동함.
그래서 이걸 왜 만들려고 했냐면 아래 같은 것을 만들 수 있음. 글레바에서 목표 아웃풋을 정하고 그에 맞게 확장하면 문제될게 없지만 지금 나는 처음이라 그런 시스템보다는
인풋이 변해도 낭비가 적게 하고 인풋이 변했을때 오는 잠재적인 문제들을 대비 할 수 있는 유연한 공장을 만들고 싶었음. 마치 전기 공장처럼.
나중에 가다듬고 안 귀찮으면 정리해봄. 근데 문제는 뉴비라 녹벨이 아니라 파벨도 없는데 만들고 못쓰는 건가?
https://factoriobin.com/post/wc3alf
분배기 - FactorioBinFactorioBin is a site for quickly and easily sharing Factorio blueprintsfactoriobin.com
첫짤 보자마자 이거생각남 ㅋㅋㅋㅋ
@세차갤 ㅇㅈ ㅋㅋㅋㅋㅋ
먼가 원리는 잘 몰겠지만 한묶음씩 우선순위 분배가 되는 그런거임? 스시가 불균형해도 동작하는건가
보기 예쁘라고 맞추었는데 어떤 특정아이템을 기점으로 그 아이템과 같은 순간부터 다음의 그 아이템까지 한 덩어리 처럼 나뉘는 기능인 거임.
@글쓴 팩붕이(121.189) 덩어리마다 특정 아이템이 가장 앞줄에 있게 할 수 있으면 다 상관없지 그냥 위 예에서 2줄이 아니라 한 줄에 알 영양 영양 과일? 이렇게 한 줄에 몰아 넣어도 상관 없고 간격이 커도 상관없음.
오...?