首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 瀏覽器遊戲 Xnova (OGame) 源碼解讀(十六):攻擊任務深度分析

     編輯:PHP 綜合知識

任務入口:MissionCaseAttack()

艦隊任務類型中,攻擊任務(mission=1)邏輯最複雜。核心流程:到達判斷 → 數據收集 → 戰鬥模擬 → 結果處理 → 報告生成 → 數據庫更新 → 消息通知。

關鍵時間字段含義

字段含義
fleet_start_time到達目標時間(非出發時間)
start_time真實出發時間
fleet_end_time返回母星時間
fleet_end_stay結束停留時間(聯合防禦/遠征用)
fleet_mess狀態:0=前進中,1=返航中,2=停留中

核心邏輯分段解析

1. 到達判斷與戰鬥引擎載入

if ($FleetRow['fleet_start_time'] <= time()) {
    if ($FleetRow['fleet_mess'] == 0) {
        if (!isset($CombatCaps[202]['sd'])) {
            message($lang['sys_no_vars'], $lang['sys_error'], 'fleet.'.$phpEx, 2);
        }
        include_once($xnova_root_path . 'includes/ataki.'.$phpEx);
    }
}

2. 雙方數據收集(艦隊、科技、防禦設施)

  • 攻擊方:$CurrentUser、$CurrentTechno、$CurrentSet(解析 fleet_array)
  • 防守方:$TargetPlanet、$TargetUser、$TargetTechno、$TargetSet(星球防禦建築)
  • 聯合防禦邏輯缺失(註釋提示需自行擴展)

3. 戰鬥模擬與耗時統計

$mtime = microtime();
$starttime = array_sum(explode(' ', $mtime));

$walka = walka($CurrentSet, $TargetSet, $CurrentTechno, $TargetTechno);

$mtime = microtime();
$endtime = array_sum(explode(' ', $mtime));
$totaltime = $endtime - $starttime; // 戰鬥報告生成耗時

4. 結果解析與資源掠奪計算

  • $walka['atakujacy'] 攻擊方剩餘艦隊
  • $walka['wrog'] 防守方剩餘艦隊/防禦
  • $walka['wygrana'] 勝負:'a'=攻勝,'r'=守勝,'w'=平局
  • $walka['zlom'] 廢墟資源(金屬/晶體)
  • 掠奪邏輯:按 1/3 倉容分配金屬/晶體/重氫,存在「金屬佔滿倉位導致其他資源無法掠奪」缺陷

5. 數據庫事務性更新

  1. 更新目標星球資源、防禦建築
  2. 更新星系廢墟帶
  3. 更新攻擊方艦隊載貨、陣容、狀態(fleet_mess=1 返航)
  4. 記錄玩家戰鬥經驗(xpraid、raids/raidswin/raidsloose)

6. 戰鬥報告生成(極長字符串拼接)

  • 雙方坐標、科技等級、每輪交火細節(艦隊數、攻擊/護盾/結構值、傷害輸出/吸收)
  • 勝負結語、生成耗時
  • MD5 存入 rw 表,前端通過 rid 讀取

7. 月球形成機率

$MoonChance = min(20, $FleetDebris / 100000);
if ($FleetDebris >= 100000 && mt_rand(1,100) <= $MoonChance) {
    // 生成月球邏輯(省略)
}

8. 雙方站內信通知

攻擊方/防守方分別發送含戰報鏈接的消息,標題顏色區分勝負。

9. 艦隊返航卸貨邏輯

當 fleet_end_time <= time(),將剩餘資源、艦隊歸還母星,刪除艦隊記錄釋放航道。

代碼結構問題與重構建議

  1. 職責過重:單函數超 500 行,建議拆分為 BattleService、ReportGenerator、FleetUpdater、Notifier
  2. 業務與數據耦合:SQL 硬編碼分散,引入 Repository 模式
  3. 戰鬥引擎外部文件:ataki.php 缺乏接口定義,難以測試替換
  4. 掠奪算法缺陷:需改為「優先裝滿總容量,按比例分配」
  5. 事務缺失:多表更新無事務包裹,異常時數據不一致

總結

攻擊任務是 Xnova 核心玩法循環的心臟。理解其「時間驅動 → 狀態機 → 戰鬥模擬 → 狀態持久化」模式,有助於擴展新任務類型(如星際採集、聯盟戰)並重構技術債務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved