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

PHP 網頁遊戲 Xnova (Ogame) 源碼解讀(十):建築總覽 buildings.php 流程解析

     編輯:PHP 相關知識

進入 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;     // 建築(默認)
}

二、核心隊列更新:UpdatePlanetBatimentQueueList

function 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

流程(代碼較長,此處邏輯摘要):

  1. 從 b_building_id 解析:建築 ID、操作類型(建造/拆除)、完成時間。
  2. 更新該建築等級(+1 或 -1)。
  3. 重新計算星球最大/已用欄位 (CalculateMaxPlanetFields)。
  4. 清空 b_building、b_building_id (當前建造項)。
  5. 返回 true 觸發下一項啟動。

四、啟動隊列下一項:SetNextQueueElementOnTop

  1. 從隊列字段 (如 b_building_queue) 解析下一項建築數據。
  2. 檢查資源是否足夠、前置條件(科技等級)是否滿足。
  3. 扣除資源,計算建造時間,寫入 b_building、b_building_id。
  4. 更新隊列字段(移除已啟動項)。

五、架構優勢總結

設計模式體現位置優勢
前置處理入口統一調用 UpdatePlanetBatimentQueueList保證每次請求見到的星球狀態均為「最新結算後」
命令模式隊列存儲「建築ID+操作+時間」支持取消、插隊、拆除等複雜隊列操作
關注點分離建築/研究/艦隊/防禦分文件單一職責,便於擴展新建築類型
資源即時結算PlanetResourceUpdate 按時間差計算無需定時任務,請求駐動,架構輕量

六、下期預告

下一篇深入 BatimentBuildingPage.php 真正的建築頁面:UI 構造、建造條件判斷、隊列操作(取消/插隊/拆除)、作弊檢測懲罰機制。

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