Star-Control-2
Pkunk船再生/復活的規則是什麼?
如果在戰鬥中被殺,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,否則此檢查不會跳閘……