stratagus的ai規則:
stratagus這個高仿war2的程序會分時間段來調用ai的處理函數。它的ai規則主要是用一些ai函數來定義,
比如說某方電腦可以定義對應的ai規則函數,記得是通過類似aidefine, aineed, aiwait, aiattack的函數進行ai規則的定義,比如說aineed 兵種 個數,然后aiwait會陰塞直到程序ai處理到達條件才繼續執行后面的ai規則函數,這就可以非常方便的定義各種電腦的ai行為,比如說生產出aineed一些農民,然后等待,夠出就會aineed兵營之類,等待夠了就aineed多少個兵,aiattack開始嘗試出兵攻擊玩家.
另外這個游戲的迷霧作法是以地圖塊記錄陣營迷霧表,地圖塊的unit進出會進行刷新,而迷霧簡單地用預處理好的迷霧圖塊(作法跟地表紋理一樣的)進行拼接渲染,這種作法跟當前war3的作法基本一致,只是war3的迷霧圖塊是實時更新的,迷霧可以動態圓滑過渡(在之前一文章分析過了),而這個迷霧圖則只能按格子跳動,不能圓滑漸變。
另外存下一下以前的跟蹤流程,以備用。
stratagus流程
一。 腳本Start Game按鈕調用 RunMap(mapname)中執行程序中StartMap(map)
二。 程序中CreateGame后GameMainLoop中游戲循環處理.
//---------------------------------------------------------------------------
一。祥細:
1. 腳本初始:
程序通過加載stratagus.lua進行初始設置, 并裝載其它腳本,通過
DefineUnitType(..)來定義各種類型unit的屬性
2. 渲染初始:
InitVideo()
3. 聲音初始:
InitSound() && InitMusic()
4. 加載字體:
LoadFonts()
5. 顯示splash:
ShowTitleScreens
6. 單位管理器初始:
UnitManager.Init(); // Units memory management
7. 界面加載:
PreMenuSetup(); // Load everything needed for menus
8. 界面:
在MenuLoop()中加載guichan.lua,這會運行RunProgramStartMenu() //如果是編輯器則是另一函數
創建WarMenu界面,上面Single Player Game按鈕綁定RunSinglePlayerGameMenu()函數,
響應后里面再創建另一個WarMenu界面,并綁定Start Game函數為
RunMap(mapname),該函數會調用InitGameVariables遍歷調用初始化函數表InitFuncs[]()中每個函數.
最后調用程序的StartMap(map)游戲開始
//---------------------------------------------------------------------------
二。祥細:
1. CreateGame中:
a. 迷霧初始
InitVisionTable
b. .smp地圖初始:
執行.smp地圖(lua文件來的, 就兩行調用DefinePlayerTypes()定義PlayerType和PresentMap()函數設置地圖信息)
DefinePlayerTypes("person","nobody","nobody","nobody","nobody","person") //neutral||computer||person||nobody||rescue-passive||rescue-active
PresentMap("Mysterious Dragon Isle", 2, 128, 128, 1)
c. 玩家初始:
遍歷16個玩家進行CreatePlayer創建(從Player[]取出), ThisPlayer=Players[NetLocalPlayerNumber];
應用上述b中設置的PlayerType進行team設置(中立=0,電腦=1,玩家=2+i, PlayerRescuePassive及PlayerRescueActive=2+i,)
b. InitUnitTypes
初始type->BuildingRules, type->stats[player](stats->Costs,stats->Variables)
c. .sms地圖加載:
執行.sms地圖(lua文件來的),其中
用類似以下方法設置幾個玩家資源等信息(如下第一個參數0表示玩家號, 本地圖有0-5個玩家)
SetStartView(0, 80, 30)
SetPlayerData(0, "Resources", "gold", 2000)
SetPlayerData(0, "Resources", "wood", 1500)
SetPlayerData(0, "Resources", "oil", 1000)
SetPlayerData(0, "RaceName", "orc")
SetAiType(0, "wc2-air-attack")
SetStartView(1, 0, 0)
SetPlayerData(1, "Resources", "gold", 2000)
...
然后LoadTileModels("scripts/tilesets/wasteland.lua")(這個函數同等于直接執行lua腳本)
在wasteland.lua中執行了DefineTileset(...)來設置一堆地形中各圖塊資源位置
并調用BuildTilesetTables()程序進行處理, 接著調用 Load("scripts/scripts.lua")這個會據當前玩家的playertype來調用不同的ui.lua(human/org)
之后是一堆
SetTile(32, 0, 0, 0)
SetTile(35, 1, 0, 0)
...
作用是HP for walls/ Wood Regeneration
最后是通過
unit = CreateUnit("unit-oil-patch", 15, {7, 5})
這個會據第一個參數來找到對應的type并創建出unit對象,然后刷新unit所處在地塊的UnitFieldFlags用于尋路,
以及MapMarkUnitSight刷新視野, 視野的做法有點怪,他是根據角色視野來刷新地塊MapField->Visible[屬方]是否可見,
然后再從unit所在位置的地塊的visible[]來刷新unit->visible[屬方],刷新時判斷
上次和今次變化,從而得知unit是不是從屬方player視野中進出.
SetResourcesHeld(unit, 20000)
unit = CreateUnit("unit-gold-mine", 15, {66, 6})
SetResourcesHeld(unit, 35000)
...
來創建一些資源
d. Map.Init();這個只調用了InitFogOfWar()
e. PlayersInitAi()
遍歷16方玩家,產生查詢對應aitype信息(有aiscript函數)設置給PlayerAi對象,并將對象綁定給該玩家.
f. InitTriggers()
用于注冊條件函數以及要執行的函數。當前調用SinglePlayerTriggers()腳本函數,只注冊了勝利或失敗條件函數及對應執行處理函數
g. InitPathfinder()
2. GameMainLoop中:
主要是分時段來執行ai處理函數等,具體不寫了。。。
posted on 2011-06-24 16:40
flipcode 閱讀(450)
評論(0) 編輯 收藏 引用