精華區beta StarCraft 關於我們 聯絡資訊
簡單的摸了一下這個AI script,邊做邊學認識了一些基本。正常的出兵流程其 實很容易,現在是如何使用技能這點還需要慢慢找資料或自己試。總之,先講一些我 的心得,當然會寫程式一定會比較易上手。首先介紹幾個初步的function: AITechCount(player, c_PU_Probe, c_techCountInProgressOrBetter); 上面這個,是讓你計算某兵種/建築的數量用的。第一個player是可以代入任何 玩家編號,當然基本填player(這是由上層傳進來的參數)就是該AI本身。第二項是 兵種/建築代號,在RequirementsAI.galaxy這個檔案裡面有得查。像這c_PU_Probe 當然就是Probe。第三個參數是說明要計算的完成度範圍,有下面這些可以代入: c_techCountQueuedOnly = 0; // 只算還堆在工作中,做都還沒開始做的 c_techCountQueuedOrBetter = 1; // 堆在工作、正在做還沒完成、已完成都算 c_techCountInProgressOnly = 2; // 只算正在做的 c_techCountInProgressOrBetter = 3; // 正在做還沒完成、已完成都算 c_techCountCompleteOnly = 4; // 只算已完成的 c_techCountIncompleteOnly = 5; // 堆在工作、正在做還沒完成的 AIGetBuildingCountInTown(player, c_townMain, c_PB_Assimilator, c_techCountCompleteOnly); 上面這個是計算在某區的某種建築數量。因為目前我只看到特定的用法,還沒找 到完全解析功能完成的,所以沒法完全解釋。總之第二個c_townMain指的可能是主礦 ,但範圍有多大、還有其它哪些可以設定的範圍還需要研究。第三個是要計數的建築 代號,最後也跟上面一樣是完成度範圍。 然後是個用得上的Debug用顯示訊息指令: TriggerDebugOutput(1, StringToText(IntToString(nProbe) + " Probe " + IntToString(nZealot) + " Zealot " + IntToString(nStalker) + " Stalker " + IntToString(nDisruptor) + " Disruptor " + IntToString(nPylon) + " Pylon " + IntToString(nGateway) + " Gateway " + IntToString(nCyberneticsCore) + " CyberneticsCore "), true); 第一個參數是問要不要顯示在debug UI裡面,不管怎樣填1就好。第二項那一長 串整個是一個text形態的值,就是要顯示啥訊息。其中IntToString()就是把int的數 值轉成string字串,而StringToText就是再把string字串轉成text格式。最後那項不 管怎樣就填true。像我這整個的功能就是讓我不斷被現在AI有幾個Probe、Zealot、 Stalker、Disruptor(很有趣的,在這個AI中哨兵Sentry使用的關鍵字是Disruptor 干擾者。這可能是他們以前取的沒改過來?)、Pylon、Gateway跟CyberneticsCore 的訊息洗螢幕XD 再來是告訴AI要怎樣做的function: AIClearStock(player); 這個是清除你之前設定的工作。基本上除非有特別用法,不然大概都是第一件事 就先清掉重設這樣,因為可能因為目前情況的不同會需要更改工作,沒清的話可能就 會跟之前的堆疊在一起造成問題。 AISetStock(player, 1, c_PB_Pylon); 這個是讓你跟AI講你要做什麼東西做到多少個。中間的參數是個數,最後的跟上 面一樣是兵種/建築代號。另外其實還有別的function跟生產工作有關,其中有一些 跟擴張有關,我還沒研究到那邊先跳過。 這個function有一些特性,下篇會講。 AIEnableStock(player); 這是跟AI講以上那些生產列表打完了,最後確定執行這樣。基本上列表的最後一 定要有它。 AISetGasPeonCountOverride(player, c_townMain, 6); 這個是讓你跟AI講,你要有幾隻工兵去採瓦斯。中間的是地點,最後的是隻數。 所以這個例子就是說主礦六隻去採瓦斯,當然是用在兩個瓦斯都開了的時候。 最後是很簡單的一波攻擊指令: AIWaveMerge(player, c_waveMain, c_waveAttack); 這是教你把第二參數的一波部隊合併入第三參數的那一波部隊。所謂的「一波」 ,我在裡面有看到的包括以下: c_waveMain c_waveAttack c_waveDefend c_waveDivert1 c_waveDivert2 c_waveClearObs c_waveHome 但是詳細意義我還沒查到,只能字面猜說第一個是主力隊,第二個是攻擊隊,第 三個是防守隊,第四、五是分隊,第六個是去清探路的,第七個是完全龜家的。當然 細節還要研究。 AISetAttackState(player, e_attackState_Attack); 這是叫AI轉換攻擊狀態。一樣是個我細節還不清楚的東西,只知道以上很明顯就 是開打,其它一共有這些: const int e_attackState_Wait = 1; const int e_attackState_Idle = 2; const int e_attackState_Attack = 3; const int e_attackState_DropAttack = 4; const int e_attackState_Scared = 5; const int e_attackState_Retreat = 6; const int e_attackState_DropRetreat = 7; const int e_attackState_InRetreat = 8; 從字面去猜吧,細節要一個個慢慢測了。 光是有了以上這些東西,你已經可以寫出一個假一波流Rush了喔!請看下篇XD -- 「如果你沒法給我個解釋的話,死一萬次也不能彌補你的過錯!」 「我沒辦法死一萬次賠妳啊。」 「可是你有辦法半死兩萬次,知道嗎,嗯?」 --蓮.席斯塔 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.36.175.240
honey823:有認真有推 03/11 11:41
icps:推 03/11 12:11
gmoz:看起來還蠻好上手的耶 03/11 12:12
ddavid:單寫生產流程應該還蠻簡單,難是難在改控兵、使用技能、特 03/11 12:40
ddavid:定地點集兵之類的,其中還有好多好多function功能都還沒研 03/11 12:41
ddavid:究完成的樣子,根本不知道某些事該怎樣做XD 03/11 12:42
H45:推 03/11 13:13
tvbic:應該沒人有興趣 03/11 13:19
ddavid:樓上小看這版上會寫程式的人們了喔:D 03/11 13:20
ddavid:還有其實這個研究完後寫出特定戰術應該還不會太難,很適合 03/11 13:23
ddavid:當針對某戰術的訓練這樣:D 03/11 13:24
whelp:有興趣+1 03/11 13:41
gmoz:我也有興趣XD 03/11 13:54
cosine:好有趣XD 03/11 17:50