研究系統與建築系統最大的不同在於 **無建造隊列**:同一時間只能進行一項研究,完成後自動生效。本文詳細拆解 `ResearchBuildingPage.php` 的研究處理函數、頁面構造、用戶操作(開始/取消研究)及數據持久化流程。
HandleTechnologieBuild每次請求入口調用,檢查當前研究是否完成:
foreach ($techList as $techId => $techData) {
// 1. 判斷是否為科技研究項 (排除建築、艦船等)
// 2. 檢查前置條件 (vars.php 定義:需求建築等級、其他科技等級)
// 3. 計算下一級資源消耗 (金屬/晶體/重氫) - 指數增長公式
// 4. 計算研究時間 - 公式含實驗室等級加成
// 5. 判斷是否可研究 (資源足夠、前置滿足、無正在進行的研究)
// 6. 分支渲染:
if (empty($currentResearch)) {
// 無研究進行中 → 顯示「研究」按鈕 + 耗時/消耗
} else {
// 有研究進行中 → 顯示倒計時進度條 + 研究項名稱
}
}
| 操作 | 邏輯 | 關鍵 SQL |
|---|---|---|
| 開始研究 | 1. 安全校驗 (防偽造) 2. 計算消耗/時間 3. 扣除用戶資源 (`UPDATE planet SET metal=metal-...`) 4. 寫入研究字段:`b_tech_id=tech_id, b_tech=time()+duration, b_tech_planet=planet_id` 5. 記錄日誌 | `UPDATE planet SET b_tech_id=?, b_tech=?, b_tech_planet=? WHERE id=?` |
| 取消研究 | 1. 計算已消耗資源 (原消耗 * 進度比例 或 全額退還,視遊戲設置) 2. 退還資源 (`UPDATE planet SET metal=metal+...`) 3. 清空研究字段:`b_tech_id=0, b_tech=0, b_tech_planet=0` 4. 記錄日誌 | `UPDATE planet SET b_tech_id=0, b_tech=0, b_tech_planet=0 WHERE id=?` |
// 資源消耗指數增長 (典型 Ogame 公式)
$costMetal = $baseMetal * pow(2, $currentLevel);
$costCrystal = $baseCrystal * pow(2, $currentLevel);
$costDeuterium = $baseDeuterium * pow(2, $currentLevel);
// 研究時間 (秒) - 受實驗室等級加成
$baseTime = $costMetal + $costCrystal; // 簡化公式
$labLevel = $planet['lab']; // 實驗室等級
$duration = $baseTime / ($labLevel + 1) / $universeSpeed; // 宇宙速度倍率
| 維度 | 建築系統 | 研究系統 |
|---|---|---|
| 隊列 | 支持多項排隊 (字符串存儲) | 單項,無隊列 |
| 完成觸發 | 請求駐動 `UpdatePlanetBatimentQueueList` | 請求駐動 `HandleTechnologieBuild` |
| 取消機制 | 可取消隊列中任意項 / 正在建造項 | 只能取消當前唯一研究 |
| 前置條件 | 建築等級、星球欄位、資源 | 實驗室等級、其他科技等級、資源 |
| 效果生效 | 建築等級+1 即時生效 (產量/存儲/防禦) | 科技等級+1 即時生效 (艦船解鎖/速度/資源加成) |
下一篇進入 **造船廠頁面 `FleetBuildingPage.php`** :艦船/防禦建造隊列、船廠等級限制、資源/人口/船廠槽位多重約束、艦隊組裝邏輯。