https://lua-api.factorio.com/latest/types/ProductPrototypeBase.html

ProductPrototypeBase - Prototype Docs | FactorioProductPrototypeBase - Prototype Docs | Factoriolua-api.factorio.com


ProductPrototypeBase를 보면 


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만

그 외에는 둘 다 나오지 않음


이런 복잡한 상황도 설정할 수 있음


앞으로 나올 다른 모드들이 어떤 시스템을 만들지 기대가 되는 부분임