十三、 建造總覽(buildings.php)
從這篇文章開始,對xnova的研究重點放在流程上面,其實就是大量的函數;至于頁面的構造將不再仔細解釋。
buildings.php文件不只是處理建筑金屬礦產等,而是包括了建筑、研究、造船廠、防御四個功能;通過傳遞不同的參數來決定進入哪個功能,所以這個文件其實是一個導航文件。下面我們簡單解釋下這個文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
//更新當前星球的建筑隊列,比較復雜 UpdatePlanetBatimentQueueList ( $planetrow , $user ); //處理當前用戶的科技研究 HandleTechnologieBuild ( $planetrow , $user ); //下面是根據參數進入不同的功能頁面 //造船廠頁面 case 'fleet' : FleetBuildingPage ( $planetrow , $user ); //研究頁面 case 'research' : ResearchBuildingPage ( $planetrow , $user , $IsWorking [ 'OnWork' ], $IsWorking [ 'WorkOn' ] ); //防御頁面 case 'defense' : DefensesBuildingPage ( $planetrow , $user ); //剩下的自然是建筑頁面 default : BatimentBuildingPage ( $planetrow , $user ); 下面我們看更新當前星球的建筑隊列函數 function UpdatePlanetBatimentQueueList ( & $CurrentPlanet , & $CurrentUser ) { $RetValue = false; //判斷是否有建筑隊列,字段b_building_id保存建筑隊列 if ( $CurrentPlanet [ 'b_building_id' ] != 0 ) { //進入循環,開始處理隊列 while ( $CurrentPlanet [ 'b_building_id' ] != 0 ) { //如果當前建造的建筑時間小于time的話,就處理,字段b_building保存建筑到期的時間 if ( $CurrentPlanet [ 'b_building' ] <= time() ) { //先更新下星球的資源,以后再解析 PlanetResourceUpdate ( $CurrentUser , $CurrentPlanet , $CurrentPlanet [ 'b_building' ], false ); //處理掉當前的建筑,并把當前建筑字段清空;代碼很多,其實比較簡單 $IsDone = CheckPlanetBuildingQueue( $CurrentPlanet , $CurrentUser ); //如果前面處理成功,這里就要處理隊列中的下一個建筑,包括扣除資源 if ( $IsDone == true ) { SetNextQueueElementOnTop ( $CurrentPlanet , $CurrentUser ); } } else { $RetValue = true; break ; } } } return $RetValue ; } |
我們繼續下去,跟蹤入CheckPlanetBuildingQueue函數,這個函數代碼挺多,其實簡單;我不寫注釋了,說下流程。先從字段b_building_id解析出來建筑的種類、建筑或拆除、結束建筑的時間等;然后更新該建筑的等級,升級或者降級;更新星球的最大空間和使用空間;更新當前建筑的時間為0和更新當前的剩余建筑隊列。不難吧,呵呵。
接下來處理隊列中的下一個建筑,跟蹤SetNextQueueElementOnTop函數,也不難。先從隊列中解析出建筑數據;然后判斷是否可以建造,如果可以就要計算建造資源等;如果不行就發送消息等;最后更新建筑完成的時間、剩余建筑隊列和資源等。和上面的流程一樣簡單,拿下。