Star-Control-2

Pkunk船再生/復活的規則是什麼?

  • April 3, 2014

如果在戰鬥中被殺,Pkunk 船似乎有能力再生/復活。

然而,當它們再生或不再生時,它似乎很隨機。

對於何時發生/不發生再生是否有特定的已知規則?

在深入研究了可用的原始碼(或者至少是 debian 用來維護這個包的 git 儲存庫)之後,我將效果跟踪到ships/pkunk/pkunk.c函式中的以下程式碼片段pkunk_preprocess()

       if (((BYTE)TFB_Random () & 1)
                       && (hPhoenix = AllocElement ()))
       {

               LockElement (hPhoenix, &PhoenixPtr);
               PhoenixPtr->state_flags =
                               FINITE_LIFE | NONSOLID | IGNORE_SIMILAR
                               | (ElementPtr->state_flags & (GOOD_GUY | BAD_GUY));
               PhoenixPtr->life_span = 1;

               PhoenixPtr->death_func = intercept_pkunk_death;

               SetElementStarShip (PhoenixPtr, StarShipPtr);

               UnlockElement (hPhoenix);
               InsertElement (hPhoenix, GetHeadElement ());
       }

如果我的解釋是正確的,那麼會發生什麼是在船生成時預先確定了復活——如果 TFB_Random() 返回一個奇數值,那麼 death_func() 呼叫將替換為在更下方定義的intercept_pkunk_death()在程式碼中並觸發“HAAAAAllelujah!” 在生成新的 Pkunk 船之前進行轉世——它本身呼叫 pkunk_preprocess() 並繼續循環。

TL;DR:至少根據 Debian 中存在的原始碼,重生的機率與軟體隨機生成器所能獲得的一樣接近 50%。

(不,我不認為其他版本的行為有很大不同,但這是我可以絕對確定的唯一版本;如果您想確定您的版本是否相同,請查看上述功能的原始碼)

編輯哎呀,說得太快了。

在函式中intercept_pkunk_death()

       if (GRAVITY_MASS (ShipPtr->mass_points + 1))
       {
               ElementPtr->state_flags |= DISAPPEARING;
               ElementPtr->life_span = 0;
       }
       else
       {
               ShipPtr->mass_points = MAX_SHIP_MASS + 1;
               StarShipPtr->RaceDescPtr->preprocess_func = ShipPtr->preprocess_func;
               StarShipPtr->RaceDescPtr->postprocess_func = ShipPtr->postprocess_func;
               StarShipPtr->RaceDescPtr->init_weapon_func =
                               (COUNT (*) (PELEMENT ElementPtr,
                                               HELEMENT Weapon[]))
                                               ShipPtr->death_func;

               ElementPtr->death_func = new_pkunk;
       }

GRAVITY_MASS()是一個定義的函式,用於測試一個值的質量是否高於MAX_SHIP_MASS* 10(這又是一個定義的值 10)。

所以還有一個非確定性的因素可以決定輪迴是否被取消,涉及到飛船的mass_points。弄清楚這些是如何計算的有點困難,但是 Pkunk 船從質量“1”開始,除非 mass_points 高於 100,否則此檢查不會跳閘……

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