Oxygen Not Included (缺氧) DLC1甜素甲蟲變異機制解析

29 6 月

廣告

作者:234xdd

來源:缺氧吧

簡化版總結

太長不看版,甜素甲蟲產蟲果果蟲卵的幾率為隨照料蟲果類植物的次數增加而增加,直至趨近於100%,而甜素甲蟲每週期可以照料7棵左右的作物。

因此,大約可以在全效照

料4週期以後達到50%,7週期後達到70%,10週期後達到80%。如適用蟲果果蟲產卵,猜測除初始值變更為33%以外變異機制與甜素甲蟲一致。

理論計算公式在幾率不足98%時為a_n = 1 – (1 – a_0)*(1 + x)^(-n),超過98%時增長會更慢。其中n表示照料蟲果類植物的次數,a表示產下果蟲卵的幾率,a_0表示初始幾率2%。x表示變異率2.5%。

代碼分析

首先找到甜素甲蟲的檔 DivergentBeetleConfig。

找到 EntityTemplates.ExtendEntityToFertileCreature(這一行定義了動物的生殖行為,所以海牛和章魚應該時沒這一行的)。

找到其中定義產卵幾率的參數 DivergentTuning.EGG_CHANCES_BEETLE,所以我們轉戰 DivergentTuning 檔。

其實到這裡乍一看就無計可施了,因為 EGG_CHANCES_BEETLE 只定義了 0.02 和 0.98 兩個數字,對應甜素甲蟲初始狀態下產出兩種卵的幾率。

好在仔細一看,這個檔中還有一個似乎和產卵幾率相關的變數有定義 TIMES_TENDED_PER_CYCLE_FOR_EVOLUTION 為 2,直譯為“進化所需的每週期照料次數”。

搜索 TIMES_TENDED_PER_CYCLE_FOR_EVOLUTION 在代碼文件中的引用,發現在 TUNING.CREATURES.EGG_CHANCE_MODIFIERS 檔中的 CreateCropTendedModifier 有用到。 CreateCropTendedModifier 的第一個參數為蟲果果蟲id,第二個為蟲果果蟲卵id,第三個為兩種能提供變異的植物((貧瘠)蟲果植株),第四個參數即是0.05除以TIMES_TENDED_PER_CYCLE_FOR_EVOLUTION (得0.025)。那麼我門接下來分析 CreateCropTendedModifier 的邏輯。

可以看到,在 CreateFertilityModifier 的最後一個變數 applyFunction 中,回檔的輸入被轉換為 CropTendingStates.CropTendingEventData 植物照料事件資料,它其中便有被照料的植物id — corpID。代碼邏輯為,如果被照料的植物是之前定義的幾種植物((貧瘠)蟲果植株)中的一種,那就調用 inst.AddBreedingChance(eggType, modifierPerEvent) 函數調整變異幾率,其中eggType是回呼函數的輸入值,盲猜是蟲果果蟲卵的id,modifierPerEvent 正式之前算出的第四個參數 0.025。

現在來看 AddBreedingChance,簡化的代碼為 chance.weight += Min(1 – chance.weight, Max(0f – chance.weight, 0.025)),套用到蟲果果蟲的例子中用人話說就是,蟲果果蟲卵當前的權重加上0.025,再把它限制到0到1的範圍之內。注意後面還有一行NormalizeBreedingChances,作用就是等比縮放所有的蛋的幾率使得它們的和為1。

公式推導

本段涉及到最多到高中的數學知識

符號定義:

a 產出蟲果果蟲卵的幾率,用0到1之間的小數表示。

x 每次照料增加的幾率係數,為0.025

n 照料蟲果系植株的次數,為自然數。

這樣,a_0就是初始狀態下甜素甲蟲產下蟲果果蟲卵的幾率0.02(2%),a_n就是照料過n次蟲果系植株以後的甜素甲蟲產下蟲果果蟲卵的幾率。

根據代碼中的邏輯,現在可以得到蟲果果蟲卵幾率的遞推公式:

當a_{n-1} 小於等於 0.975時,a_n = (a_{n-1} + x) / ((a_{n-1} + x) + (1 – a_{n-1})) = (a_{n-1} + x) / (1 + x)

當a_{n-1} 大於 0.975 時,a_n = 1 / (1 + (1 – a_{n-1} )) = 1 / (2 – a_{n-1})

根據高中的通過遞推公式求通項公式的知識(我自己忘得差不多了所以去某乎複習了一下),易得(等式兩邊同時減 1 即為等比數列)

當a_{n-1} 小於等於 0.975時,a_n = 1 – (1 – a_0) * (1 + x)^(-n)

根據(excel)計算,n 最大為 149 (即第一個超過 0.975 的 a_n 對應的 n)

那麼當 n 大於 149 時,通項公式為(等式兩邊同時減 1 再取倒數即為等差數列)

a_n = 1 + 1/(1/(a_{149}-1) – n + 149)

結論驗證

資料

其中”觀察值”為(1 – “原始觀察值”/100)。”理論值近似”為”理論值”四捨五入後的百分率表示方法。

圖表

可以看到觀察值與理論值分毫不差。

結論驗證

資料

其中”理論值近似”為”理論值”四捨五入後的百分率表示方法。

圖表

可以看到理論值和實際值有一定誤差。推測誤差有兩方面,一是也許每週期照料作物棵數不是恰好為7,二是單精確度浮點數計算上的誤差。

總結

目前看來論證公式能很好得解釋遊戲中的現象。根據相似的代碼查找方法,可以推測如果用蟲果果蟲產卵,除初始值變更為33%以外變異機制與甜素甲蟲一致。對於別的小動物的變異機制,理論上應該也能通過分析TUNING.CREATURES.EGG_CHANCE_MODIFIERS 檔來得到確切的邏輯。


發佈留言

發佈留言必須填寫的電子郵件地址不會公開。