MissionCaseAttack()艦隊任務類型中,攻擊任務(mission=1)邏輯最複雜。核心流程:到達判斷 → 數據收集 → 戰鬥模擬 → 結果處理 → 報告生成 → 數據庫更新 → 消息通知。
| 字段 | 含義 |
|---|---|
| fleet_start_time | 到達目標時間(非出發時間) |
| start_time | 真實出發時間 |
| fleet_end_time | 返回母星時間 |
| fleet_end_stay | 結束停留時間(聯合防禦/遠征用) |
| fleet_mess | 狀態:0=前進中,1=返航中,2=停留中 |
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);
}
}
$CurrentUser、$CurrentTechno、$CurrentSet(解析 fleet_array)$TargetPlanet、$TargetUser、$TargetTechno、$TargetSet(星球防禦建築)$mtime = microtime();
$starttime = array_sum(explode(' ', $mtime));
$walka = walka($CurrentSet, $TargetSet, $CurrentTechno, $TargetTechno);
$mtime = microtime();
$endtime = array_sum(explode(' ', $mtime));
$totaltime = $endtime - $starttime; // 戰鬥報告生成耗時
$walka['atakujacy'] 攻擊方剩餘艦隊$walka['wrog'] 防守方剩餘艦隊/防禦$walka['wygrana'] 勝負:'a'=攻勝,'r'=守勝,'w'=平局$walka['zlom'] 廢墟資源(金屬/晶體)rw 表,前端通過 rid 讀取$MoonChance = min(20, $FleetDebris / 100000);
if ($FleetDebris >= 100000 && mt_rand(1,100) <= $MoonChance) {
// 生成月球邏輯(省略)
}
攻擊方/防守方分別發送含戰報鏈接的消息,標題顏色區分勝負。
當 fleet_end_time <= time(),將剩餘資源、艦隊歸還母星,刪除艦隊記錄釋放航道。
BattleService、ReportGenerator、FleetUpdater、Notifierataki.php 缺乏接口定義,難以測試替換攻擊任務是 Xnova 核心玩法循環的心臟。理解其「時間驅動 → 狀態機 → 戰鬥模擬 → 狀態持久化」模式,有助於擴展新任務類型(如星際採集、聯盟戰)並重構技術債務。