進入 Xnova 核心業務流程解析階段。buildings.php 是建築、研究、造船廠、防禦四大功能的**統一導航控制器**,通過 mode 參數分發具體業務頁面。本文詳細拆解其隊列更新機制、分發邏輯及關鍵子函數調用鏈。
<?php
// 1. 更新當前星球建築隊列(核心定時任務)
UpdatePlanetBatimentQueueList($planetrow, $user);
// 2. 處理科技研究隊列
HandleTechnologieBuild($planetrow, $user);
// 3. 根據 mode 參數進入不同功能頁面
switch ($mode) {
case 'fleet': FleetBuildingPage($planetrow, $user); break; // 造船廠
case 'research': ResearchBuildingPage($planetrow, $user, ...); break; // 研究
case 'defense': DefensesBuildingPage($planetrow, $user); break; // 防禦
default: BatimentBuildingPage($planetrow, $user); break; // 建築(默認)
}
UpdatePlanetBatimentQueueListfunction UpdatePlanetBatimentQueueList(&$CurrentPlanet, &$CurrentUser) {
$RetValue = false;
// 有建築隊列時 (b_building_id != 0)
while ($CurrentPlanet['b_building_id'] != 0) {
// 隊列首項建造完成時間 <= 當前時間
if ($CurrentPlanet['b_building'] <= time()) {
// 1. 更新星球資源產出 (到建造完成時間點)
PlanetResourceUpdate($CurrentUser, $CurrentPlanet, $CurrentPlanet['b_building'], false);
// 2. 處理完成的建築:升級/拆除、更新欄位、清空當前建築字段
$IsDone = CheckPlanetBuildingQueue($CurrentPlanet, $CurrentUser);
// 3. 若處理成功,啟動隊列下一項
if ($IsDone === true) {
SetNextQueueElementOnTop($CurrentPlanet, $CurrentUser);
}
} else {
$RetValue = true; // 隊列首項尚未完成
break;
}
}
return $RetValue; // true=有進行中項目, false=隊列空閒
}
&$CurrentPlanet 直接修改全局星球數據。b_building (完成時間戳) 與 time() 比較,無需 Cron 定時任務。PlanetResourceUpdate 計算從上次更新到建造完成時間的資源增量。CheckPlanetBuildingQueue流程(代碼較長,此處邏輯摘要):
b_building_id 解析:建築 ID、操作類型(建造/拆除)、完成時間。CalculateMaxPlanetFields)。b_building、b_building_id (當前建造項)。true 觸發下一項啟動。SetNextQueueElementOnTopb_building_queue) 解析下一項建築數據。b_building、b_building_id。| 設計模式 | 體現位置 | 優勢 |
|---|---|---|
| 前置處理 | 入口統一調用 UpdatePlanetBatimentQueueList | 保證每次請求見到的星球狀態均為「最新結算後」 |
| 命令模式 | 隊列存儲「建築ID+操作+時間」 | 支持取消、插隊、拆除等複雜隊列操作 |
| 關注點分離 | 建築/研究/艦隊/防禦分文件 | 單一職責,便於擴展新建築類型 |
| 資源即時結算 | PlanetResourceUpdate 按時間差計算 | 無需定時任務,請求駐動,架構輕量 |
下一篇深入 BatimentBuildingPage.php 真正的建築頁面:UI 構造、建造條件判斷、隊列操作(取消/插隊/拆除)、作弊檢測懲罰機制。