warringstates的aiplayer中有幾個(gè)管理器每幀更新:
1. build_mgr(工程部)
2. exploration_mgr(探索部)
3. army_mgr(軍工部)
4. unit_mgr(人力部)
5. resource_mgr(資源部)
每個(gè)管理器相當(dāng)于一個(gè)部門,它每幀會(huì)更新處理兩個(gè)事情:a. 請(qǐng)求列表(request)處理; b.工作(job)列表處理;c.job的響應(yīng)事件(觸發(fā)式:
job提交的請(qǐng)求得到滿足時(shí)觸發(fā)回來(lái))
每個(gè)部門更新時(shí)在job中處理自己要做的事情(這是b.步驟),發(fā)現(xiàn)需要其它部門的幫助時(shí),則向其它部門發(fā)出請(qǐng)求, 其它部門會(huì)把請(qǐng)求收入隊(duì)列,
然后更新時(shí)檢查是否可以滿足對(duì)應(yīng)的請(qǐng)求(這是在a.步驟),是則立即給響應(yīng),否則按排工作組員(job)去完成; 完成后再給對(duì)應(yīng)請(qǐng)求部門(這里直接是請(qǐng)求者(job)發(fā)出響應(yīng) (這是c.步驟)
例如:
1. aiplayer的更新中發(fā)現(xiàn)人口太多,房屋不夠則向build_mgr發(fā)出一個(gè)增加住房的請(qǐng)求,build_mgr收到后找到消耗金錢少的但住人多的
戶型并產(chǎn)生一個(gè)AIBuildJob讓組員去完成.
2. AIBuildJob的更新中發(fā)現(xiàn)要建造這樣的戶型所需的資源當(dāng)前不夠(缺少木村),于是他向resource_mgr(資源管理器)MakeRequest申請(qǐng)
所需要的資源。
3. resource_mgr的更新中:
a. 從請(qǐng)求列表中取出該請(qǐng)求,產(chǎn)生對(duì)應(yīng)的AIHarvestJob放入jobs列表中。
b. 接著遍歷更新jobs取出該AIHarvestJob更新
c. AIHarvestJob的更新發(fā)現(xiàn)該采集job還沒(méi)有對(duì)應(yīng)農(nóng)民,于是它向unit_mgr請(qǐng)求對(duì)應(yīng)類型的農(nóng)民。
4. unit_mgr的更新中:
從請(qǐng)求列表中取出該請(qǐng)求, 發(fā)現(xiàn)當(dāng)前mAvailableUnits中有符合的已產(chǎn)生的農(nóng)民,于時(shí)立即響應(yīng)給對(duì)應(yīng)的請(qǐng)求者AIHarvestJob
AIHarvestJob把對(duì)應(yīng)的農(nóng)民登錄到mHarvesters中.(說(shuō)明:如果沒(méi)有的話則產(chǎn)生一個(gè)AITrainJob,在AITrainJob的處理中會(huì)看是否有對(duì)應(yīng)unitype的工廠,
沒(méi)有則向build_mgr發(fā)出請(qǐng)求,有則向資源請(qǐng)求對(duì)應(yīng)的單位所需要的資源,等資源管理器更新時(shí)發(fā)現(xiàn)請(qǐng)求滿足并響應(yīng)回來(lái)時(shí)則開(kāi)始向?qū)?yīng)的工廠發(fā)出
eCOMMAND_TYPE_Train指令,之后就會(huì)跑到GameBuilding的Train工作流程)
5. resource_mgr的更新中:
遍歷更新jobs取出該AIHarvestJob進(jìn)行更新,該AIHarvestJob遍歷mHarvesters取得那個(gè)農(nóng)民,向他發(fā)出eCOMMAND_TYPE_Harvest
指令。
6. object_mgr的更新中:
遍歷所有單位進(jìn)行更新,輪到那個(gè)農(nóng)民更新時(shí),它think函數(shù)中發(fā)現(xiàn)當(dāng)前指令是eCOMMAND_TYPE_Harvest,于是它開(kāi)始了Harvest的
工作流程:判斷背包中木材是否滿了,是則回城(搜索路徑),否則尋找木材資源(搜索路徑),到達(dá)后卸載/收割資源.
這樣當(dāng)木材足夠時(shí)在resource_mgr的更新中,發(fā)現(xiàn)對(duì)應(yīng)的木材資源請(qǐng)求足夠時(shí)就會(huì)移除該請(qǐng)求并向
對(duì)應(yīng)的AIBuildJob發(fā)出響應(yīng)說(shuō)明木材已收集夠了; AIBuildJob收到后接著會(huì)向unit_mgr請(qǐng)求一名建筑工人。
(插入說(shuō)明: 向unit_mgr請(qǐng)求所得的工人都是出租方式的,時(shí)間到了會(huì)收回并按請(qǐng)求級(jí)別優(yōu)先級(jí)重新分配給其它需要他的請(qǐng)求)
由于之前收割的農(nóng)民租期到了,而且那個(gè)木材收割的request已被移除(因此沒(méi)再請(qǐng)求分配農(nóng)民)。
所以u(píng)nit_mgr會(huì)把當(dāng)前這個(gè)農(nóng)民重新分配為建筑工人,向?qū)?yīng)AIBuildJob發(fā)出響應(yīng)。AIBuildJob收到后開(kāi)始在主城附近有塊空地
并向建筑工人發(fā)出eCOMMAND_TYPE_Build指令讓其開(kāi)始建造的工作流程.
其它軍工部的更新會(huì)判斷當(dāng)前是否需要軍隊(duì),并向人力部請(qǐng)求對(duì)應(yīng)的兵,人力部又會(huì)看是否有這樣的兵,沒(méi)有的話則判斷對(duì)應(yīng)產(chǎn)生
這樣兵種的兵工廠是否存在,不存在的話又會(huì)向工程部發(fā)出請(qǐng)求對(duì)應(yīng)的兵工廠,工程部收到后又會(huì)判斷是否有足夠資源,沒(méi)有的話
又會(huì)向資源部要求對(duì)應(yīng)的資源,資源部又會(huì)向人力請(qǐng)求對(duì)應(yīng)的農(nóng)民來(lái)采集資源,等等,如此類似的相關(guān)循環(huán)。。。