https://lua-api.factorio.com/latest/types/ProductPrototypeBase.html
ProductPrototypeBase - Prototype Docs | FactorioProductPrototypeBase - Prototype Docs | Factoriolua-api.factorio.comProductPrototypeBase를 보면
independent_probability라는 속성이 있는데 옆에 new가 박혀있긴 하지만 다른 prototype에서 옮겨온거라 원래 있던 속성임
그리고 또 shared_probability라는 속성이 있는데 이건 진짜 새로 추가된 속성임
눈치 빠른 사람이면 저 설명만 읽고도 이게 뭐하는건지 눈치 챌거라고 생각함
바닐라에서 얼마 안되는 확률적 요소를 가지고 있는 레시피인 우라늄 가공 레시피를 한번 보자
99.7%의 확률로 우라늄238이 나오고 0.7%의 확률로 우라늄235가 나옴
2.0 버전에서 저 레시피의 상세한 정보를 보면 아래와 같이 나옴
235가 나올 확률은 0.007, 238이 나올 확률은 0.993
그런데 기존의 문제점이 무엇이였냐면 저 확률이 각 아이템마다 독립적으로 적용이 되다는 것임
그렇기 때문에 235 238 중에 1개가 나오는 느낌이 아니라 확률에 따라서 235,238이 동시에 나올수도 있고, 동시에 아무것도 안나오는 일이 발생할 수 있음
실제로 우라늄광석10000개를 재료로 넣어서 1000회 테스트를 4번 진행해봤음
테스트1 : 10+989 = 999개가 나옴
테스트2 : 3+990 = 993개가 나옴
테스트3 : 10+992=1002개가 나옴
테스트4 : 14+996=1010개가 나옴
동시에 나올 수도 있고 동시에 안나올수도 있다는 점에서 그다지 마음에 들지는 않음
이걸 해결하기 위해서 2.1에서는 shared_probability라는게 추가 되었음
레시피 속성을 한번 뜯어보자
independent probability가 2.0까지의 probability가 이름을 바꾼 속성이고 값이 1로 고정되었음
그대신 새로 추가된 shared probability 속성이 보이는데
우라늄235는 0.0~0.007, 우라늄238은 0.007~1.0 으로 설정이 되어있음
independent probability는 각 생산품 별로 독립적으로 주사위를 굴렸지만
shared probability는 모든 생산품에서만 딱 한번만 0.0~1.0사이의 값이 나오는 주사위를 굴림
그 주사위의 값이 min, max 범위 내에 들어오면 출력품이 있는거고 그렇지 않으면 꽝
주사위 값이 0.007미만이면서 동시에 0.007이상인 경우는 없으니 235,238이 동시에 나올 수 없고, 아무것도 안나올 수도 없다
실전 테스트도 다시한번 굴려보면
테스트1 : 4+996 = 1000개가 나옴
테스트2 : 7+993 = 1000개가 나옴
테스트3 : 9+991 = 1000개가 나옴
테스트4 : 8+992 = 1000개가 나옴
1000개의 출력이 나오는게 보증이 된다!
이 변경사항은 바닐라에 뿐만이 아니라 모드 생태계에서 더 유용하게 사용될 것이 기대 되는데 대표적으로 우탐모의 아코스피어가 있음
모르는 사람도 있을테니 간단히 설명하자면 아코스피어는 우탐모의 극극후반에 아이템인데 게임에서 얻을 수 있는 수량이 수백개정도 한정된 자원임
그리고 이 아이템은 여러개의 레시피에서 촉매로 사용 되는데
문제는 람다 시 제타 세타 엡실론 피 감마 오메가 8개의 종류로 나눠지고
무언가의 레시피의 재료로 쓰일때는 그 중의 정해진 몇 종류가 사용이 되는데
출력은 또 다른 종류의 아코스피어로 바뀌면서 그 와중에 그 결과조차 랜덤이라는 거임
그렇기 때문에 회로를 잘 써서 각 종류의 아코스피어 갯수를 밸런싱하는 기술이 필요해지게 됨
출력이 랜덤인것을 그냥 기존의 probablity 속성을 이용해서 구현했다면 2개의 입력을 넣었을 때 출력이 2개가 고정인게 아니라 0개가 될 수도 있고 4개가 될 수도 있는 상황이였기 때문에 그 비싼 아코스피어가 복제가 되거나 아니면 재수가 없으면 사라지기도 하는 골때리는 현상이 발생했을 거임
그렇기에 에란델은 그냥 레시피 자체는 확률이 없게 설정해 둔다음 랜덤한 타이밍에 레시피 자체를 스위칭하는 기법으로 구현을 하게 됨
이 방식은 매 틱마다 저런 레시피를 사용하는 모든 건물을 감시를 해야하기 때문에 UPS적으로 손해를 보는 구조임
하지만 2.1에서 나온 shared_probability를 사용한다면 저런 번거로운 스위칭 작업 필요 없이 단일 레시피로도 손해도,복제도 되지 않는 공정을 만들 수 있게 됨
사실 4개월전에 에란델은 후원자 전용의 포스팅을 하나 올렸었는데
https://www.patreon.com/earendel/posts/recipe-exclusive-151504753
블러 처리된 이미지지만 뭔 얘긴지 대충 알겠지?
2.1에서는 exclusive probability(shaerd probability)가 적용이 될거고 아코스피어 레시피에도 그걸 도입할거라는 내용임
굳이 우탐모가 아니더라도 어떤 아이템을 다양한 아이템중 하나로 뱉는 건 여러 모드에서 자주 사용하는 기법이기 때문에 상당히 도움이 될거라고 생각함
재밌는건 우라늄처럼 0~0.007 0.007~1.0 이렇게 구간을 딱 나눠서 설정하는게 아니라
어떤 아이템을 A는 0.0~0.5, B는 0.4~0.6 이런식으로 구간을 겹치게 설정하는 것도 가능한데
이러면
주사위 값이 0.0~0.4 일때는 A만
주사위 값이 0.4~0.5 일때는 A,B 모두
주사위 값이 0.5~0.6 일때는 B만
그 외에는 둘 다 나오지 않음
이런 복잡한 상황도 설정할 수 있음
앞으로 나올 다른 모드들이 어떤 시스템을 만들지 기대가 되는 부분임
이제 고철 재활용 생산품이 덜 요동치겠네
오 맞아 확인해보니 고철 분리도 동시에 두 종류 이상의 템은 안 나오도록 바뀌어있네
품질하고도 관련있을까?
품질하고는 딱히 관련은 없지? 재료 갯수가 4의 배수가 아닐때 재활용하면서 생기는 불균형 문제는 여전히 남아있을거임
소행성재처리나 고철갈갈에서 어쩐지 두개씩 뱉는게 보이드나 했더만 이거구나
마침 소행성도 확인해 봤는데 소행성 재처리의 경우에도 기존에는 1소행성 넣어서 3종류의 소행성이 모두 뜨는 경우가 있을 수 있었지만 이제 무조건 최대 1종류의 소행성만 출력으로 나옴 이따금씩 오히려 뿔어나는 현상 때문에 벨트가 막히는 현상도 볼 수 있었는데 이제 안정성이 높아졌다 봐야할듯
이거하고는 별개인데 재활용기도 내부 버퍼 가져서 분해한 템 결과 그대로 유지하되 출력할때 4개씩 줄이면서 빼주면 좋겠음.. 재료 불균형 와서 갈아야하는서 싫어이..
그냥 입력을 4의 배수로 받게 해준다면 행복할텐데 말이지 ㅋㅋ
모드로는 있긴 함
https://mods.factorio.com/mod/deterministic-recycling
이것도 직관적으론 이상한 수정 필요한 사항이긴 했으니 진짜 완성도 높아졌네
확실히 디지털의 랜덤뽑기는 진짜 랜덤뽑기가 아니구만