UQM:Orz vac-suit 擊殺不同敵艦的機率
這篇關於 Ultronomicon的文章描述了 Orz“入侵者”(海軍陸戰隊)如何殺死敵方船員並依次被殺死。該文章暗示無論敵艦的類型如何,機率都是相同的。
然而,對我來說,Orz 入侵者在某些敵艦類型中的表現似乎比其他類型的要好。特別是,Slylandro 探測器似乎幾乎不受它們的影響。就遊戲原始碼而言,文章的暗示是否正確?是否有其他因素(例如隨機數生成不佳)可能導致有效機率不同?
我下載了原始碼。在文件orz.c中,有一個呼叫函式
intruder_preprocess
來處理入侵者在敵艦上時發生的情況。在該函式中是以下程式碼:BYTE randval; ElementPtr->thrust_wait = MARINE_WAIT; randval = (BYTE)TFB_Random (); if (randval < (0x0100 / 16)) { ElementPtr->life_span = 0; ElementPtr->state_flags |= DISAPPEARING; ProcessSound (SetAbsSoundIndex ( StarShipPtr->RaceDescPtr->ship_data.ship_sounds, 4), ElementPtr); goto LeftShip; } else if (randval < (0x0100 / 2 + 0x0100 / 16)) { if (!DeltaCrew (ShipPtr, -1)) ShipPtr->life_span = 0; ++ElementPtr->thrust_wait; s.origin.x = 16 + (ElementPtr->turn_wait & 3) * 9; s.origin.y = 14 + (ElementPtr->turn_wait >> 2) * 11; s.frame = SetAbsFrameIndex (ElementPtr->next.image.farray[0], GetFrameCount (ElementPtr->next.image.farray[0]) - 1); ModifySilhouette (ShipPtr, &s, 0); ProcessSound (SetAbsSoundIndex ( StarShipPtr->RaceDescPtr->ship_data.ship_sounds, 3), ElementPtr); }
如您所見,從 TFB_Random 函式(在 random.c 文件中定義)生成了一個隨機數。如果小於 6.25(這來自 100/16),則 ElementPtr 的 life_span 設置為 0。 ElementPtr 代表入侵者,將 life_span 設置為 0 意味著他死亡。這與 Ultranomicon 中所說的“6.25% 的海洋死亡機率”相吻合。
如果隨機數大於 6.25 但小於 56.25(這來自 50+6.25),即 50 的範圍,則在 ShipPtr 上呼叫 -1 值的 DeltaCrew 函式。DeltaCrew 在 status.c 文件中定義,並修改船上的船員人數。ShipPtr 代表敵艦,-1 表示一名敵方船員死亡。這與 Ultranomicon 中所說的“一名敵方船員死亡的機率為 50%”相吻合。
如果隨機數大於 56.25 且小於 100,即 43.75 的範圍,則不會發生任何事情。這與 Ultranomicon 所說的“43.75% 的機會沒有任何事情發生”相吻合。
沒有檢查敵艦類型的程式碼。函式中的程式碼
intruder_preprocess
將對所有敵艦執行,因此 Ultranomicon 是正確的。編輯:
至於 TFB_Random 函式,它由 TFB_SeedRandom 函式播種(也在 random.c 中定義):
#define A 16807 /* a relatively prime number -- also M div Q */ #define M 2147483647L /* 0xFFFFFFFF / 2 */ #define Q 127773L /* M div A */ #define R 2836 /* M mod A */ static DWORD seed = 12345L; /* random number seed */ DWORD TFB_Random (void) { seed = A * (seed % Q) - R * (seed / Q); if (seed > M) return (seed -= M); else if (seed) return (seed); else return (seed = 1L); } DWORD TFB_SeedRandom (DWORD new_seed) { DWORD old_seed; /* coerce the seed to be in the range 1..M */ if (new_seed == 0L) /* 0 becomes 1 */ new_seed = 1; else if (new_seed > M) /* and less than M */ new_seed -= M; old_seed = seed; seed = new_seed; return (old_seed); }
我搜尋了所有對 TFB_SeedRandom 的呼叫,每個呼叫(與近戰和艦船戰鬥有關)都傳入一個基於目前時間的值。種子中沒有任何內容取決於船舶類型。如果隨機數生成或播種很差,那麼所有敵艦都是如此,而不僅僅是某些類型。