Star-Control-2

UQM:Orz vac-suit 擊殺不同敵艦的機率

  • November 4, 2014

這篇關於 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 的呼叫,每個呼叫(與近戰和艦船戰鬥有關)都傳入一個基於目前時間的值。種子中沒有任何內容取決於船舶類型。如果隨機數生成或播種很差,那麼所有敵艦都是如此,而不僅僅是某些類型。

引用自:https://gaming.stackexchange.com/questions/161766