作者ddavid (謊言接線生)
看板StarCraft
標題Re: [SC2] AI 腳本開發最簡入門
時間Thu Mar 11 11:37:28 2010
簡單的摸了一下這個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