AI的藝♂術
AI的藝♂術 - 2022年1月版AI教程
by Madman_M
前言 關於AI的一些常識
在折騰AI之前,首先要明確一點——Ra2這個遊戲的AI非常殘障,因此某種意義上來講AI必須通過一定程度的作弊才能與玩家抗衡……而寫AI的目的,一方面是儘量讓AI顯得不那麼殘障,另一方面是限制AI的作弊程度,讓AI的作弊變得不那麼明顯。
目錄
第一章 AI的設計思路
第二章 Rules(MD)
第三章 單位代碼
第四章 AI(MD)
第五章 地圖相關
PLUS Ares平台下的AI騷操作
第一章 AI的設計思路
1.什麼樣的AI才是好的AI?
無腦暴兵摁死玩家的AI是屑,換著花樣兒慢慢「折磨」玩家的AI才是AI之鑑。
而折磨玩家的目的也不在於摁死玩家,而是讓玩家在反折磨和反推AI之後獲得成就感。
當然,一堆AI三下五除二滅掉一個玩家還是合情合理的……
2.AI應該怎樣折磨玩家?
(1)戰術的多樣化:AI可以玩騷擾,而且玩起來還挺6。只要給AI加上搶中立科技、工程師偷家、間諜斷電偷錢之類的騷擾戰術,玩家在與AI正面對抗的同時,就需要隨時留意後方。這樣一來處理難度會有很大提升。
(2)攻擊形式的多樣化:在調整了全局的條件下,AI的最大優勢就是不差錢,不差錢帶來的優勢就是可以隨時改變戰術。在一波地面攻勢之後,AI可以毫無壓力地再出動一波空中攻勢,而玩家此時很可能並沒有做好防空的準備,應付起來就會手忙腳亂。
(3)兵種搭配的多樣化:與(2)不同,兵種搭配是在一個部隊內進行的,如反裝甲單位和反步兵單位搭配、遠程單位和近戰單位搭配、地面單位和空中單位搭配,都可以起到很好的效果。如果有不同陣營的AI,還有可能出現幾支需要玩家使用不同手段分別處理的部隊同時殺向玩家的奇景,會給玩家造成很大壓力。
(4)適當暴兵:就像玩家一樣,暴兵也是AI不可或缺的戰術。但是暴兵時需要控制數量。一方面是要讓玩家能夠處理,另一方面也要考慮AI的尋路能力。
3.怎樣才能做出優秀的AI?
首先合理的全局設定是AI執行的前提。其次優秀的AI通常【應該】掌握一些基本操作:
(1)工程師占中立或偷家。
(2)Rush和守家。
(3)間諜和反間諜。
(4)運輸。
(5)擾礦。
(6)反特定建築(如防禦建築和超武)。
(7)巷戰和反巷戰。
(8)海軍。
(9)空襲。
總而言之,就是把自己能想到戰術賦予AI,給AI制定一個具有多種可能性的劇本,並且通過代碼讓AI按照劇本發展,從而讓AI表現得更像是有策略地進攻而不只是機械地出兵,是AI設計應該考慮的主要內容。
第二章 Rules(MD)
一套完整的AI,從來都不是只靠ai(md).ini一個文件來實現的。而是Rules設定、ai(md).ini以及單位代碼共同作用的結果。
Rules對AI表現的影響非常大,會直接影響AI的出兵效率和發展水平。
以下是Rules中部分對AI產生影響的內容解釋:
(注釋: num-數字、X,Y,Z-三個數字、bool-yes/no、list-列表)
[General]
; computer and movement controls
BaseBias=num ;當敵人靠近AI時,AI對敵人威脅的判定倍數,會影響AI對單位威脅值的敏銳度。可以調高。
BaseDefenseDelay=num ;AI派出防禦部隊處理基地威脅的延遲時間。(單位:分鐘)
CloseEnough=num ;AI執行"移動到"指令時,距離目的地多近就視為完成接近。
Stray=num ;一個小隊在執行任務時,偏離這個距離之內時不會導致小隊重組。會影響路經點判定,可以適當增加,但最好不超過2.9。
RelaxedStray=num ;執行"集結"指令(應該是指53,54號指令)時,以這個數值替代Stray。可以適當增加以便AI可以使用大部隊。
TeamDelays=X,Y,Z ;(困難、中等、簡單)的AI創造部隊時間間隔。(單位:幀)
AIHateDelays=X,Y,Z ;(困難、中等、簡單)的AI選擇敵人的時間間隔。(單位:幀)
AIAlternateProductionCreditCutoff=num ;AI資金低於這個數值就不再花錢。
MultiplayerAICM=X,Y,Z ;(困難、中等、簡單)的AI開局時的金錢【百分比】。公式為:AI開局金錢=玩家開局金錢*(X+100)/100。
AIVirtualPurifiers=X,Y,Z ;(困難、中等、簡單)的AI獲取資金的倍數。
AISlaveMinerNumber=X,Y,Z ;(困難、中等、簡單)的AI的奴隸礦車數。
HarvestersPerRefinery=X,Y,Z ;三個陣營每個礦場的礦車數。
AIExtraRefineries=X,Y,Z ;(困難、中等、簡單)的AI追加的礦場數。(Ares里的建議不給礦場加AIBuildCounts,如果需要增加礦場數量的話用AIExtraCounts)
FillEarliestTeamProbability=X,Y,Z ;(困難、中等、簡單)的AI製造第一個部隊的時間。(單位:幀)
MinimumAIDefensiveTeams=X,Y,Z ;(困難、中等、簡單)的AI最少守家部隊(IsBaseDefense=yes)數量。
MaximumAIDefensiveTeams=X,Y,Z ;(困難、中等、簡單)的AI最多守家部隊數量。(Min和Max即使都寫0,0,0也會至少造1隊守家部隊)
UseMinDefenseRule=bool ;AI在製造了滿足MinimumAIDefensiveTeams數量的守家部隊之後才開始製造其他小隊。
;UseMinDefenseRule=無論寫啥AI都會至少先造1個守家部隊,但是寫no的話AI不會因為沒有可造的守家部隊而傻掉。所以如果UseMinDefenseRule=yes,要保證每個陣營【至少有一個】(不是只有一個!)可用的IsBaseDefense=yes的小隊,否則AI不會出兵。
TotalAITeamCap=X,Y,Z ;(困難、中等、簡單)的AI可以同時使用的部隊總數。
DissolveUnfilledTeamDelay=num ;AI在多久後會解散一個不完整的部隊。理論上不應降低,否則AI製造成員較多的部隊時會在製造完畢之前就解散該隊伍。(單位:幀)
;*** New AI type snippets ***
AISafeDistance=num ;AI執行53號指令時的集結點與敵方基地的距離。
(Ares)AIFriendlyDistance=num ;AI執行54號指令時的集結點與己方基地的距離。默認=AISafeDistance
AIMinorSuperReadyPercent=num ;AI使用次級超武的機率
AlliedBaseDefenseCounts=X,Y,Z
SovietBaseDefenseCounts=X,Y,Z
ThirdBaseDefenseCounts=X,Y,Z
三個陣營在(困難、中等、簡單)時的防禦建築數量係數。計算公式:((已有建築的價格-2000)/1500 * GDIBaseDefenseCoefficient) + 3*(該係數-1)
AIPickWallDefensePercent=X,Y,Z ;(困難、中等、簡單)的AI選擇圍牆來替代防禦建築的概率。
AIRestrictReplaceTime=num ;AI建築被摧毀後,用電廠/防禦建築/圍牆替代被摧毀建築的時間。(單位:幀)
ThreatPerOccupant=num ;每個駐軍對可進駐建築威脅值的提升。
GuardAreaTargetingDelay=num ;區域警戒(Area Guard)狀態下AI搜索目標的延遲。
NormalTargetingDelay=num ;閒置狀態下AI搜索目標的延遲。
DisabledDisguiseDetectionPercent=X,Y,Z ;(困難、中等、簡單)的AI識破幻影的概率。
AISuperDefenseProbability=X,Y,Z ;(困難、中等、簡單)的AI用護盾防禦超武的概率。
AISuperDefenseFrames=num ;AI用護盾防禦超武的延遲。(單位:幀)
AISuperDefenseDistance=num ;基地的多少距離內是AI考慮使用護盾的範圍。
; AI trigger weighting parameters
AITriggerSuccessWeightDelta=num ;觸發成功權重變化值(可以寫負值)。
AITriggerFailureWeightDelta=num ;觸發失敗權重變化值(通常是負值)。
AITriggerTrackRecordCoefficient=num ;觸發權重變化係數(建議寫1)。
;負責[AITriggerTypes]中權重變化的三個數值。計算方法是每當AI的部隊執行一次49號指令,就會在該AITrigger中增加AITriggerSuccessWeightDelta的權重。如果被消滅之前沒能執行49號指令,則減少AITriggerFailureWeightDelta*AITriggerTrackRecordCoefficient的權重。
威脅值相關:
; default threat evaluation controls
MyEffectivenessCoefficientDefault=num ;當AI的單位與威脅等級高於自身的目標交戰時,會在計算威脅時乘以這個係數。幫助AI恃強凌弱。
TargetEffectivenessCoefficientDefault=num ;當AI的單位與威脅等級高於自身的目標交戰時,會在計算威脅時乘以這個係數。防止AI以卵擊石。
TargetSpecialThreatCoefficientDefault=num ;當AI目標具有SpecialThreatValue時,會在計算威脅時考慮這個係數。
TargetStrengthCoefficientDefault=num ;當AI的單位將目標指向生命比自己高的單位時,會根據敵方生命百分比考慮這個係數。
TargetDistanceCoefficientDefault=num ;當AI的單位選擇目標時,會根據距離考慮這個係數。
; defaults for dumb threat evaluation ;與default threat evaluation controls基本相同,但是適用於HasStupidGuardMode=yes的單位。
DumbMyEffectivenessCoefficient=num
DumbTargetEffectivenessCoefficient=num
DumbTargetSpecialThreatCoefficient=num
DumbTargetStrengthCoefficient=num
DumbTargetDistanceCoefficient=num
EnemyHouseThreatBonus=num
以上數值都不是百分數,而官方給的數值卻是按百分數填的。都除以100可能會獲得較為明顯的效果。
附:威脅值計算公式
float Threat = Attacker's best weapon's Verses against Defender * Target Effectiveness;
if(Attacker is currently targeting Defender) { Threat = Threat * (-1);}
float tempValue = Special Threat Value * Special Threat Coefficient;
Threat = Threat + tempValue;
if(Defender is currently considering Attacker's owner house as the Enemy House) {Threat = Threat + [General]→EnemyHouseThreatBonus=;}
tempValue = Defender's best weapon's Verses against Attacker * Self Effectiveness;
Threat = Threat + tempValue;
tempValue = Target Strength * Attacker's current health percentage;
Threat = Threat + tempValue;
tempValue = Target Distance * Distance between Defender and Attacker;
Threat = Threat + tempValue;
Threat = Threat + 100000.0;
粗(JI)翻:
Threat = 攻擊單位武器對目標的Versus * TargetEffectiveness;
如果進攻者已經在攻擊目標,Threat=Threat * (-1)
tempValue = 單位的SpecialThreatValue * TargetSpecialThreatCoefficient;
Threat = Threat + tempValue;
如果AI作為防禦方把進攻者視為敵對方,Threat = Threat + EnemyHouseThreatBonus;
tempValue = 防禦方武器對進攻者的Versus * MyEffectiveness;
Threat = Threat + tempValue;
tempValue = TargetStrengthCoefficient * 攻擊者當前的生命百分比;
Threat = Threat + tempValue;
tempValue = TargetDistanceCoefficient * 防禦者和攻擊者之間的距離;
Threat = Threat + tempValue;
Threat = Threat + 100000.0;
[CombatDamage]
Crush=num ;距離這麼近時AI會嘗試用碾壓代替開火。寫高點的話AI的車輛更容易直接碾壓玩家步兵。
[AI]
BuildConst=list ;基地列表(可以不是基地)。在Ares里,決定StartInMultiplayer.WithConst=true時開局給的【建築】。
BuildPower=list ;電力建築列表,每個陣營只能寫一個。開局必然會先造一個,因此如果有給某個陣營使用昂貴電力加載物作為電力供給的情況,請把兵營或其他開局就能造的建築註冊到電力列表裡。
BuildRefinery=list ;礦場列表。
BuildBarracks=list ;兵營列表。
BuildTech=list ;高科列表。
BuildWeapons=list ;工廠列表。
BuildRadar=list ;雷達列表。
ConcreteWalls=list ;圍牆列表。
BuildNavalYard=list ;船塢列表。
;不彈框的最低要求是有基地(廢話)、電廠,並且兵營和工廠沒同時被禁(當然,這並不意味著AI真的能造,只要讓AI以為自己能造就可以)。
AlliedBaseDefenses=list
SovietBaseDefenses=list
ThirdBaseDefenses=list
AIForcePredictionFudge=X,Y,Z
;(困難、中等、簡單)的AI根據敵方擁有單位的造價總和,按照此處數值的百分比選擇防空,反裝甲或反步兵的防禦建築。(數值越小越敏感)
MaximumBaseDefenseValue=num ;AI防禦建築的威脅值總和(不包括防空建築)。
ComputerBaseDefenseResponse=num ; 影響AI對基地和ToProtect單位的響應程度,具體效果未知。
PatrolScan=num ;AI執行巡邏任務時搜索敵人的時間。(單位:分鐘)
CreditReserve=num ;低於這個資金量時AI不再進行維修。
PathDelay=num ;堵車時間隔這麼長時間再次嘗試通過。(單位:分鐘)
BlockagePathDelay=num ;再次嘗試隔這麼長時間仍無法通過則繞路。(單位:幀)
AutocreateTime=num ;平均間隔多長時間建造一隊具有"Autocreate=yes"標籤的小隊。(單位:分鐘)
InfantryReserve=num ;AI擁有高於這個數值的金錢時將會一直建造步兵。
InfantryBaseMult=num ;如果AI當前建築數量乘以此數值比步兵數量多,則一直製造步兵。
PowerSurplus=num ;AI電力超出臨界不足這個數值時將會製造電廠。
BaseSizeAdd=num ;AI的基地規模不會大於玩家基地規模的這個倍數。
RefineryRatio=num
RefineryLimit=num
BarracksRatio=num
BarracksLimit=num
WarRatio=num
WarLimit=num
DefenseRatio=num
DefenseLimit=num
AARatio=num
AALimit=num
TeslaRatio=num
TeslaLimit=num
HelipadRatio=num
HelipadLimit=num
AirstripRatio=num ;由於Ra2里沒有Airstrips,這個數值最好寫0。
AirstripLimit=num ;同上。
;各類建築的建造比重和數量限制,各類Ratio總和不能低於1。
Paranoid=bool ;AI私下進行PY交易共同對抗玩家。
PowerEmergency=num ;砸鍋賣鐵保電量的電量臨界值。(%)
AIBaseSpacing=num ;AI建築間隔距離,寫0會無法正常擺建築,稍微增大可以緩解AI堵車。
[IQ] ;一系列數字,通常結合地圖中所屬方的IQ設置生效。遭遇戰中AI的IQ均為最大值。
MaxIQLevels=num ;IQ最大值。
SuperWeapons=num ;AI自動使用超武。
Production=num ;自動建造建築物。
GuardArea=num ;新造出來的小隊自動進入[Area Guard]狀態。
RepairSell=num ;可以選擇維修或變賣受損建築。
AutoCrush=num ;自動碾壓。
Scatter=num ;規避有彈道的拋射體。
ContentScan=num ;使[Easy]、[Normal]、[Difficult]項下的ContentScan生效。
Aircraft=num ;自動補充飛機。
Harvester=num ;自動補充礦車。
SellBack=num ;允許變賣建築。
(ARES)TogglePower=num ;沒電時讓可斷電建築停止工作。
; ******* Difficulty Settings *******
[Easy]、[Normal]、[Difficult] ;這仨的註冊名稱寫!倒!了!Easy代表的是困難,Difficult代表的是簡單。(然而裡面的數值是正常的,WWSB!)
難度項下的設置僅ROF、RepairDelay、BuildDelay、DestroyWalls、ContentScan有效,其餘均已廢棄。
ContentScan=bool ;AI使用運輸單位時,會將運輸工具及乘客的Points和ThreatPosed都考慮進去。寫no或[IQ]此項不滿足的話則只考慮運輸工具自身的。
; ******* Mission Control *******
;一些狀態(Mission)相關參數,決定特定情況下單位的行動模式。箱子單位狀態可能與踩箱子的單位一致(待驗證)。
[Harvest] ;FreeUnit的默認狀態。
[Hunt] ;很重要的一個狀態,傘兵和空投單位通常都是這個狀態。
[Enter] ;會自動找尋可進駐建築物,可進駐的傘兵有時會是這個狀態。
Recruitable=bool ;是否允許重組,寫yes的話,AI的小隊在執行一些特殊指令後(主要為11號指令相關)就可以接受重組並加入到其他小隊中去。
Rule部分其實比AI更複雜,對AI強度的影響也更明顯。賦予AI合理的數值是AI能否正常執行AI(MD)中指令的前提。
Ares新增陣營和新增國家相關:
新增陣營和新增國家,AI最低要求是至少不彈框。而讓AI不彈框需要注意以下幾項:
1.[AI]中指定了新陣營的基地、電廠。
2.[新國家]中用AI.PowerPlants指明了且該電廠的AIBasePlanningSide正常。
第三章 單位代碼
單位代碼雖然也包含在Rules里,但由於不同種類單位情況各不相同,因此單獨列為一章。
本章內容較少,僅列舉一些特殊語句和單位。
通用:
TechLevel=num ;AI可以建造TechLevel=-1的建築,但是不能建造TechLevel=-1或大於最大TechLevel的單位。
的給各個可造單位安排合理的TechLevel可以讓玩家的建造界面比較有層次感。(TechLevel=0可以用來調整建造界面單位順序。)
AI建造前提:
建築:
無視:【TechLevel=-1】,PrerequisiteOverride,RequiresStolenAlliedTech,RequiresStolenSovietTech,RequiresStolenThirdTech,SpyEffect.StolenTechIndex(Ares)
有效:TechLevel,Prerequisite,Owner,AIBasePlanningSide,RequiredHouses,ForbiddenHouses
;如果建築A的Prerequisite為建築B且Owner/AIBasePlanningSide均正常,但是建築B因為RequiredHouses/ForbiddenHouses無法建造,AI會認為建築A可造,但是實際上無法建造建築A,且不影響其他符合條件的建築建造。
單位:
無視:Prerequisite,PrerequisiteOverride,Owner
有效:TechLevel,RequiredHouses,ForbiddenHouses,RequiresStolenAlliedTech,RequiresStolenSovietTech,RequiresStolenThirdTech,SpyEffect.StolenTechIndex(Ares)
;如果[TaskForces]里有無法建造的單位,則會跳過該項繼續建造之後的單位。除非通過重組湊齊無法建造的單位,否則無法執行腳本。
ThreatPosed=num
SpecialThreatValue=num
詳見Rules中的威脅值部分,給單位安排合理的威脅值會影響到AI選擇目標的優先順序,關係到AI能否選擇合適的目標進行攻擊。
建築:
AIBasePlanningSide=num ;寫陣營序號(0=GDI,1=Nod,2=ThirdSide,Ares新陣營依次往後排),標明第幾個陣營會建造該建築(寫-1時所有陣營都可造)。
AIBuildThis=bool ;AI是否會建造該建築。
(Ares)AIBuildCounts=X,Y,Z ;AI至少建造幾個該建築。
(Ares)AIExtraCounts=X,Y,Z ;AI可能額外補充幾個該建築。
AI在補足AIBuildCounts和AIExtraCounts數量時不是一股腦補足的,而是隨機穿插建造(雖然也有可能一連造好幾個)。
另:AI所有建築的數量都會根據其擁有的基地數量而翻倍!
單位:
ToProtect=bool ;寫yes的單位受到攻擊時,AI會出動閒置部隊去保護。原版海軍都有這句,但海軍加這個意義不大。
專屬單位:
RequiredHouses/ForbiddenHouses導致某個國家無法使用該陣營通用單位時,涉及該通用單位的[TaskForces]就需要每個國家單獨設置。否則被禁用的國家在製造帶有該單位時,會產生一支無法執行腳本的半成品小隊。
第四章 AI(MD)
ai(md).ini里包括4個部分:[TaskForces]、[ScriptTypes]、[TeamTypes]、[AITriggerTypes]
[TaskForces] ;決定AI的小隊中包含哪些單位,建造順序從上到下。
首先是註冊表,格式跟正常註冊表一樣:索引=註冊ID。可以跳數。
0=註冊項0
1=註冊項1
……
然後是每個註冊項:
[註冊項0]
Name=名稱 ;隨便寫反正不讀,僅供編寫者記憶和查找用。(可以寫中文)
0=數量,單位註冊名
1=數量,單位註冊名
……
5=數量,單位註冊名
Group=-1 ;無特殊需要建議保留原值-1
;索引只讀取0~5(相當於兩個G胖),但是跟其他註冊表無視左側項目的情況不同,Task和Script的註冊表都是嚴格升序讀取(也就是說最好別跳數寫或者倒序寫。多寫可以,反正不會數6),跳數的話可能無法完成組隊。
[ScriptTypes] ;決定AI的小隊執行哪些指令,執行順序從上到下。
首先也是註冊表,格式跟正常註冊表一樣:索引=註冊ID。也可以跳數。
0=註冊項2
1=註冊項3
……
然後是每個註冊項:
[註冊項2]
Name=名稱 ;隨便寫反正不讀,僅供編寫者記憶和查找用。(可以寫中文)
0=X,Y ;X:指令,Y:參數
1=X,Y
2=X,Y
……
49=X,Y
;跟TaskForces索引類似,但是讀取0~49。如果跳數,空出的行可能會以0,0的形式被識別並影響後面條目的執行。
以下是部分指令解釋(標★為常用,☆為特定情況下有用):
(X,Y)
★0,n - 攻擊最近的目標,目標類型由n指定。(間諜無法執行。)(陸軍只判定地面單位,海軍只判定水面單位)
n = 0 - 任何目標([VehicleTypes]/[AircraftTypes]/[InfantryTypes]/[BuildingTypes])(Aircraft類無法執行此項。)
1 - 同0,0(其實根本沒有0,1,空項自動判定成0,0)
2 - 建築物([BuildingTypes])
3 - 資源類([BuildingTypes]/[VehicleTypes]/[AircraftTypes],Storag>0)
4 - 步兵([InfantryTypes])
5 - 載具([VehicleTypes]/[AircraftTypes])
6 - 工廠([BuildingTypes],Factory=)
7 - 防禦建築([BuildingTypes],Primary=)
8 - 同0,0(同樣是空項)
9 - 電廠([BuildingTypes],BuildCat=Power)
10 - 可駐軍建築([BuildingTypes],MaxNumberOccupants>0)
11 - 中立科技建築([BuildingTypes],NeedsEngineer=yes)
★1,n - 攻擊n號路徑點,工程師/間諜/突擊隊都可以用這句完成占領/滲透/清理。
2,0 - Cyborg狂暴化(無效)。
☆3,n - 移動到n號路徑點(Waypoint)。
☆4,n - 移動到n號單元標記(CellTag)。
☆5,n - 警戒(Guard)狀態保持n秒。
★6,n - 跳轉到當前Script的第n(n=索引+1)行。
7,0 - 欽點該Team所有者獲勝。
★8,n - 釋放乘客
n = 0 - 保留運輸工具和乘客執行接下來的指令。
1 - 只保留運輸工具。
2 - 只保留乘客。
3 - 全解散。
★9,0 - 部署。(步兵、基地車、武裝直升機皆有效)
10,0 - 跟隨最近的友好單位。(如果寫在Script的第一行,將會無條件跟隨產生的第一個小隊)
★11,n - 進入第n種狀態(通常能在Rules里找到並修改相應狀態),無法執行該Script內接下來的任何指令。(可以通過重組至其他小隊來終止任務)
n = 0 Sleep - 休眠。
1 Attack - 根據威脅等級進行TeamType中的攻擊任務。
2 Move - 移動。
3 QMove - 在其他部隊移動結束後移動到目的地。(遭遇戰無效)
4 Retreat - 撤退(可能會逃出地圖)。
☆5 Guard - 防禦,只攻擊進入射程內的敵人。
6 Sticky - 與防禦類似,會與敵人交戰但不會移動和追擊。(默認無法重組,但是可以改)
☆7 Enter - 進入建築或運輸工具。AI會自動找尋附近的建築物進駐。
8 Capture - 用於MultiEngineer模式的工程師搶建築。
9 Eaten - 修理時賣掉(疑似Ra95殘留)。
10 Harvest - 採礦。
★11 Area Guard - 區域防禦,會主動迎擊附近的敵人。
12 Return - 子機回歸。
13 Stop - 停止當前動作。
14 Ambush - 無效。
★15 Hunt - 獵殺敵人。非Aircraft單位有AA=yes的武器時會優先搜尋敵方Aircraft類單位,但是依然無視Balloon類單位(蛋疼……)。Aircraft類單位會按0,3尋敵。(傘兵默認執行此狀態。【海軍有效】。默認無法重組,但是可以改)
16 Unload - 運輸單位卸貨。
17 Sabotage - 放置C4或炸藥。
☆18 Construction - 在建築建立的位置造建築。(車輛部署建築同樣有效)
19 Selling - 變賣建築。
20 Repair - 修理。
21 Rescue - 救援(意味不明)。
22 Missile - 種蘑菇。
23 Harmless - 進入人畜無害狀態。
24 Open - 開門開門開門吶!
25 Patrol - 巡邏。(遭遇戰無效)
26 Paradrop Approach - 空投靠近。
27 Paradrop Overfly - 空投。
28 Wait - 等待。
29 Move - (特殊)Chrono類單位移動到目的地。
30 Attack - (特殊)使用AreaFire武器開火。
31 Spyplane Approach - 偵察機靠近。
32 Spyplane Overfly - 偵察機偵查。
★14,0 - 隊伍中存在有Passengers位置的運輸工具,並且其餘單位Size和PhysicalSize滿足運輸條件時,乘客們進入運輸工具。(實際使用時,一個隊伍里只能存在1個運輸工具)(運輸步兵時可以在14,0之後加43,0保證單位裝載完畢,運輸車輛時不可接43,0)
16,n - 沿著n號路徑點巡邏。巡邏途中會按照PatrolScan搜尋附近敵人並與敵人交戰。通常用於任務,多了會卡……
17,n - 變為執行第n號腳本(n為該腳本在註冊列表中的【順序號】而非索引號,從0開始)。理論上可以用來實現超過50行的腳本……
18,n - 改變小隊,讓當前小隊加入第n號小隊(n為該小隊在註冊列表中的【順序號】而非索引號,從0開始)。理論上可以用來實現超過6行的大隊……
19,0 - 恐慌,小隊中有Fraidycat標籤的成員會亂跑,並且播放Panic序列,沒有該標籤的會臥倒。
20,n - 二五仔,任務限定。
☆21,0 - 分散部隊,某些情況下有奇效。
22,0 - 躲貓貓……
23,0 - 決定該Team所有者失敗。
29,0 - 任務中用於讓AI自動建造。
30,0 - 賣家一波流。
31,0 - 自戕以謝天下。
41,0 - 不怕不怕,與19,0相反。
42,n - 改變朝向。
n = 0-北
1-東北
2-東
3-東南
4-南
5-西南
6-西
7-西北
43,0 - 等待運輸單位完全裝載完畢。運載步兵時可以用在14,0之後,運載車輛時不要使用!
★46,N - 攻擊N指定建築。(工程師為占領、間諜為滲透、突擊者為清駐兵、海軍可用此指令攻擊陸地建築)
N=該建築在註冊列表中的【順序號】+判定係數,從【0】開始(然而原版建築註冊是從1開始)。判定係數分別為:0-最小威脅、65536-最大威脅、131072-最近、196608-最遠。
推薦計算方法:把建築列表複製進excel,【查找重複項並去掉重複項】,從1開始重新生成序號。
按照上述方法,指定建築時就可以用以下公式:
-1 + 序號 = 選擇指定建築中威脅最小的。
65535 + 序號 = 選擇指定建築中威脅最大的。
131071 + 序號 = 選擇指定建築中距離最近的。
196607 + 序號 = 選擇指定建築中距離最遠的。
以YR為例:
萌軍電廠1=GAPOWR,4種計算結果分別為0、65536、131072、196608
光頭電廠306=YAPOWR,由於中間185和241都註冊成了NAPSYA,253和273都被注釋掉了,304根本不存在,所以光頭電廠的順序其實是302,4種計算結果分別是301、65837、131373、196909。
★47,N - 移動到N指定敵方或中立建築附近。N的計算方法同上,"附近"的範圍由CloseEnough指定。(海軍可用)
48,0 - 偵查。(遭遇戰無效)
★49,0 - 任務執行成功。小隊每執行一次49號指令,都會在該AITrigger中增加AITriggerSuccessWeightDelta的權重。如果被消滅之前沒能執行49號指令,則減少AITriggerFailureWeightDelta*AITriggerTrackRecordCoefficient的權重。
★53,0 - 在敵人基地附近集合,距離由AISafeDistance決定。(海軍有效)
★54,0 - 在友方基地附近集合。距離由AISafeDistance決定,Ares中由AIFriendlyDistance決定。(海軍有效)
☆55,0 - 如果鐵幕就緒,則為該小隊罩鐵幕。
☆56,N - 如果超時空傳送就緒,則傳送該小隊至N指定建築物,N算法見46號指令。
☆57,n - 如果超時空傳送就緒,則傳送該小隊至n指定類別,n類別同0號指令。
★58,N - 移動到N指定友方建築附近,N算法見46號指令。(海軍可用)
59,n - 攻擊n號的路徑點。
60,0 - 進入回收站。
☆61,0 - 進入坦克碉堡。
☆62,0 - 進入生化發電廠。
63,0 - 進駐最近的戰鬥碉堡。(經常不靈)
★64,0 - 進駐最近的可駐軍建築。(即使是用來占己方碉堡,也比63更穩定……)
Ares
65,<power> - 永久改變一個所屬方的電力,可以設置負數讓該所屬方的電力降低,允許多次重複使用。
66,0 - 擊殺這支小隊裡的駕駛員,所有被影響的單位的所屬方都會轉變成Special。鐵幕或ProtectDriver等防止司機被殺死的機制可以免疫此指令。
67,0 - 劫車。小隊裡所有帶有CanDrive=yes或者VehicleThief=yes的步兵會找最近的能被駕駛或劫持的車輛去開。
68,0 - 變身,有Convert.Script=的成員會變為Convert.Script=指定的單位。
69,<frames> - 在規定時間內失去隱形能力,寫0可以直接進入隱形。
70,<frames> - 在規定時間禁用所有團隊成員的武器。
Phobos限定
★71,n - 區域警戒(Area Guard)狀態保持n秒。
72,0 - 把所有沒乘客位的塞進有乘客位的載具,不需要接43,0。
註:這條本身沒啥用。值得一提的是Phobos修好了Ares的AI不能單獨造帶乘客位的海軍的問題。
★73,0 - 當小隊內所有成員彈藥滿時繼續執行下一個動作。
註:飛機必用不解釋。
★74~81,n - 攻擊n代表的單位類型。
★74,n - 更近時更高威脅
★75,n - 更遠時更高威脅
★76,n - 更近
★77,n - 更遠
78,n - 更近時更高威脅,摧毀一個目標時結束
79,n - 更遠時更高威脅,摧毀一個目標時結束
80,n - 更近,摧毀一個目標時結束
81,n - 更遠,摧毀一個目標時結束
(74~81均可搜索空中單位)
n代表的目標類型
1 - 任意目標 任意 [VehicleTypes], [AircraftTypes], [InfantryTypes] 和 [BuildingTypes]。
2 - 建築 不含 Artillary=yes, TickTank=yes, ICBMLauncher=yes 或 SensorArray=yes 的 [BuildingTypes]。
3 - 礦車 含有 Harvester=yes 或 ResourceGatherer=yes 的 [VehicleTypes], 以及含有 ResourceGatherer=yes 的 [BuildingTypes](奴隸礦場)。
4 - 步兵 任意 [InfantryTypes]。
5 - 載具 含有 Artillary=yes, TickTank=yes, ICBMLauncher=yes 和 SensorArray=yes 的 [VehicleTypes], [AircraftTypes], [BuildingTypes]。
6 - 工廠 含有Factory=設定的 [BuildingTypes]。
7 - 防禦建築 含有 IsBaseDefense=yes 的 [BuildingTypes]。
8 - 所屬方威脅 任何將小隊所屬方的任何單位作為目標的對象,或者任何接近小隊隊長的敵人。
9 - 發電廠 含有正數值 Power= 的 [BuildingTypes]。
10 - 駐紮建築 被步兵駐紮的 [BuildingTypes](進兵才算)。
11 - 科技建築 含有 Unsellable=yes, Capturable=yes, 負數值 TechLevel= 或出現在 [AI]NeutralTechBuildings= 列表上的 [BuildingTypes]。
12 - 礦場 含有Refinery=yes or ResourceGatherer=yes 的 [BuildingTypes] 及含有 ResourceGatherer=yes 和 Harvester=no 的 [VehicleTypes](奴隸礦場)。
13 - 心靈控制者 擁有心控彈頭的武器的 [VehicleTypes], [AircraftTypes], [InfantryTypes] 及 [BuildingTypes]。
14 - 空中單位 任意 [AircraftTypes] 及飛行的 [VehicleTypes] 和 [InfantryTypes]。
15 - 海上目標 含有 Naval=yes 的 [BuildingTypes] and [VehicleTypes], 以及在水面單元格上的 [VehicleTypes], [AircraftTypes], [InfantryTypes]。
16 - 干擾者 含有正數值 InhibitorRange=, RadarJamRadius= 及 CloakGenerator=yes 或 GapGenerator=yes的對象。
17 - 地面載具 不含 Naval=yes 的 [VehicleTypes], 著陸的 [AircraftTypes] 及由載具部署而來的 [BuildingTypes]。
18 - 精煉廠+經濟單位 含有 Harvester=yes or ResourceGatherer=yes 的 [VehicleTypes], 及含有 Refinery=yes, ResourceGatherer=yes 或 OrePurifier=yes 的 [BuildingTypes]。
19 - 兵營 含有 Factory=InfantryType 的 [BuildingTypes]。
20 - 戰車工廠 含有 Factory=UnitType 的 [BuildingTypes]。
21 - 機場 含有 Factory=AircraftType 的 [BuildingTypes]。
22 - 雷達 含有 Radar=yes or SpySat=yes 的 [BuildingTypes]。
23 - 科技實驗室 任何在 [AI]BuildTech= 列表上的 [BuildingTypes]。
24 - 船塢 含有 Naval=yes 和 Factory=UnitType 的 [BuildingTypes]。
25 - 超級武器 含有 SuperWeapon=, SuperWeapon2= 或 SuperWeapons= 的 [BuildingTypes]。
26 - 建造廠 含有 ConstructionYard=yes 和 Factory=BuildingType 的 [BuildingTypes]。
27 - 中立 任意中立對象 (Civilian)。
28 - 發生器 含有 CloakGenerator=yes 或 GapGenerator=yes 的 [BuildingTypes]。
29 - 雷達干擾器 含有正數值 RadarJamRadius= 的 [BuildingTypes]。
30 - 屏蔽器 含有正數值 InhibitorRange= 的 [BuildingTypes]。
31 - 水上單位 含有 Naval=yes 的 [VehicleTypes], 或在水面單元格上的 [VehicleTypes], [AircraftTypes], [InfantryTypes]。
32 - 機動單位 任意 [VehicleTypes], [AircraftTypes] and [InfantryTypes]。
33 - 可占領目標 含有 Capturable=yes 或同時有 BridgeRepairHut=yes 和 Repairable=yes 的 [BuildingTypes]。(實際效果:彈框)
34 - 區域威脅 處於小隊隊長的警戒範圍內的對象。
82,n - 減觸發分量。
83,n - 加觸發分量。
★84~91,n - 與74~81類似,攻擊由新註冊表Rules-[AITargetTypes]指定的單位組。
[AITargetTypes]
0=單位A,單位B,單位C...
1=單位X,單位Y,單位D...
注意:86會將友軍列為攻擊對象,但由於引擎強制無法攻擊友軍,因此會導致AI卡在該條指令。87、90、91未單獨測試但可能也有類似問題。
☆92,n - 寫在74~81和84~91之前,等待n秒,如未發現指定目標則跳至下一腳本,0為無限期等待。
93,n - 寫在74~81和84~91之前,使得這些腳本每擊殺一個目標單位就會增加n的觸發權重。n必須是正數。
94,n - 從Rules-[AIScriptsList]里隨機選一組腳本。(初版無效,非穩定版和#25已修復)
[AIScriptsList]
0=腳本A,腳本B,腳本C...
1=腳本X,腳本Y,腳本D...
★95~98,n - 移動至n代表的單位類型並在移動過程中嘗試攻擊,n代表的類型與74~81相同。其中97、98指向友方。移動到[General]CloseEnough的距離時執行下一條指令。
★99~102,n - 與95~98類似,從[AITargetTypes]註冊表裡選擇指定目標,移動至該目標並嘗試攻擊。其中101、102指向友方。
103,n - 用在95~102和106~109前,控制移動到距離目標多近時執行下一條指令,默認[General]CloseEnough值。
104~105,n - 與84~91類似,但是先從[AITargetTypes]列表中隨機選擇一種單位攻擊,104是攻擊最近的選定單位,105是攻擊最遠的。
106~109,n - 與99~102類似,從[AITargetTypes]註冊表裡隨機選擇一種單位接近並攻擊,106指定最近的敵方,107指定最遠的敵方,108指定最近的友方,109指定最遠的友方。
111,0 - 與49,0相反。
112,n - 在隊長單位附近區域警戒n秒。
113,n - n範圍0~100,有n%的概率跳過下一條指令。
124,0 -
125,n - 對後面所有行生效,經過n幀以後跳過當前正在執行的指令至下一行。不循環計數。
126,n - 經過n幀以後跳回下一行。
https://phobos.readthedocs.io/zh_CN/latest/General-Info.html
與其他項目不同,Script通用性很強,尤其是進攻型小隊,可能會有很多不同的小隊執行相同或類似的任務——比如各種反載具小隊都可以通過同樣的攻擊車輛的指令來達到反載具的目的。因此在製作AI時,可以先製作一個「Script池」,把泛用性較強的腳本(如反裝甲、反步兵、拆塔、抄家等)放進池子裡,建立TeamTypes的時候就可以直接從池子裡調用。可以省去大量重複性的工作。
[TeamTypes]
首先還是註冊表,格式跟正常註冊表一樣:索引=註冊ID。也可以跳數。
0=註冊項4
1=註冊項5
……
然後是每個註冊項 ;如無特殊標記,均可直接複製。:
★[註冊項4]
☆Name=名稱 ;隨便寫反正不讀,僅供編寫者記憶和查找用。(可以寫中文)
VeteranLevel=1 ;無視。
MindControlDecision=0 ;心靈控制後的動作,0=隨緣、1=加入控制者作戰小隊、2=部隊回收廠賣錢、3=生化反應爐填電、4=搜索敵人、5=摸魚
☆Loadable=yes/no ;運載單位寫yes會計算ContentScan。
Full=no ;無視。
Annoyance=yes/no ;挨揍時還手【一次】然後繼續執行任務,優先級低於Aggressive和Suicide,具體效果待測試。
GuardSlower=no ;無視。
House=<none> ;無視。
★Recruiter=yes/no ;可否從低優先級的隊伍和閒置單位中直接調用成員。
☆Autocreate=yes/no ;結合地圖預置單位生效。遭遇戰中,在條件滿足的情況下,平均每隔AutocreateTime規定的時間,製造一隊帶有Autocreate的小隊。
☆Prebuild=yes/no ;可能會在不需要時提前造好該隊伍。(待確認)
☆Reinforce=yes/no ;寫yes會強制補充該小隊中損失的成員。
Droppod=no ;無視。
UseTransportOrigin=no ;無視。
Whiner=no ;無視。
LooseRecruit=yes/no ;疑似無效。
★Aggressive=yes/no ;進攻性小隊,寫yes時出完守家部隊之後才出。據說和Suicide共同起作用。(待確認)
★Suicide=yes/no ;是否還擊,寫yes則小隊移動時不會攻擊射程內的敵人,也不會還擊,只嚴格執行腳本。據說和Aggressive共同起作用。(待確認)
★Priority=num ;優先級,範圍0~50,相同條件下越低越優先製造。寫0疑似會無視Suicide=yes,建議寫0以上。
★Max=num ;該小隊最大生成數量。
TechLevel=0 ;科技等級。
Group=-1 ;除非特殊需要。另:-2時會選取任何TaskForce。
OnTransOnly=no ;無視。
★AvoidThreats=yes/no ;是否會按威脅計算方法尋找最小威脅路徑。
IonImmune=no ;無視。
☆TransportsReturnOnUnload=yes/no ;運輸工具完成任務後是否回家。
★AreTeamMembersRecruitable=yes/no ;隊伍成員可否被調去更高優先級的隊伍中。
★IsBaseDefense=yes/no ;守家部隊。
★OnlyTargetHouseEnemy=yes/no ;是否只針對敵對方。
★Script=ScriptTypes ;註冊在[ScriptTypes]里的Script。
★TaskForce=TaskForce ;註冊在[TaskForces]里的TaskForce。
(待確認)Aggressive和Suicide:
這兩句共同決定AI執行腳本過程中是否主動攻擊敵人,以及受到攻擊時是否還擊。
(1)執行0號,1號,46號,59號指令時:Aggressive和Suicide無論寫啥,都不會對射程內的敵人進行攻擊,而是繼續執行當前腳本。如果受到攻擊,Suicide=no會進行還擊。
(2)執行3號,47號,53號指令時:如果Aggressive=yes和Suicide=no,則會對進入射程的敵人進行攻擊,在攻擊結束後繼續執行腳本。如果受到攻擊,則會進行還擊,並在還擊結束後才繼續執行腳本。其餘情況均不會對射程內的敵人進行攻擊,也不會還擊。
(3)執行16號指令時:只要Suicide=yes,就會攻擊進入射程的敵人,並且在攻擊結束後繼續執行腳本,但是受到攻擊不會還擊。如果Aggressive=yes和Suicide=no,與(2)相同。如果都是no,那麼會變向路徑點移動邊進行攻擊,如果受到攻擊,則在射程內進行還擊,其餘情況繼續移動執行腳本。
Recruiter、AreTeamMembersRecruitable、Priority:
可能是最神奇的幾個語句,能讓AI完成相對複雜的隊伍重構工作。目前測試結果表明作用方式如下:
如果TeamA和TeamB有重合的單位並且同時存在於場上,且TeamB的成員所在狀態是Recruitable=yes的,TeamA具有Recruiter=yes,TeamB具有AreTeamMembersRecruitable=yes,且TeamA的Priority大於TeamB,那麼AI在招募TeamA時就會優先從TeamB中調取單位,而不是直接從工廠製造該單位。
另,一個Recruiter=yes但是Priority=0的隊伍,也可以從無隊伍的閒置單位中調取單位。
Autocreate:
生效前提是Recruiter=yes。
地圖預置單位都有AUTOCREATE_NO_RECRUITABLE和AUTOCREATE_YES_RECRUITABLE兩個標籤,Autocreate會結合地圖預置單位的這兩個標籤生效,會優先招募地圖預置單位。
預置單位的標籤位置根據其類型決定:
[Infantry]
INDEX=OWNER,ID,HEALTH,X,Y,SUB_CELL,MISSION,FACING,TAG,VETERANCY,GROUP,HIGH,AUTOCREATE_NO_RECRUITABLE,AUTOCREATE_YES_RECRUITABLE
[Units]
INDEX=OWNER,ID,HEALTH,X,Y,FACING,MISSION,TAG,VETERANCY,GROUP,HIGH,FOLLOWS_INDEX,AUTOCREATE_NO_RECRUITABLE,AUTOCREATE_YES_RECRUITABLE
[Aircraft]
INDEX=OWNER,ID,HEALTH,X,Y,FACING,MISSION,TAG,VETERANCY,GROUP,AUTOCREATE_NO_RECRUITABLE,AUTOCREATE_YES_RECRUITABLE
作用方式:
Autocreate=no時,AUTOCREATE_NO_RECRUITABLE=0的預置單位無法招募,AUTOCREATE_NO_RECRUITABLE=1可以招募,預置單位不夠時會通過工廠生產補足隊伍,預置單位無法響應招募時無法通過工廠生產替代該單位。
Autocreate=yes時,AUTOCREATE_YES_RECRUITABLE=0的預置單位無法招募,AUTOCREATE_YES_RECRUITABLE=1可以招募。預置單位無法響應招募時會從工廠生產來補足隊伍,但是AUTOCREATE_NO_RECRUITABLE=1的單位無法通過工廠生產替代。
[AITriggerTypes]
首先這個沒註冊表……其次格式如下(最好直接複製已有的然後再改)。
1234567-G=Name瞎編一個就行(不能用中文,也不能有英文逗號和感嘆號),7654321-G,<all>,3,1,GAREFN,0A00000002000000000000000000000000000000000000000000000000000000,250,50,500,1,0,1,0,<none>,1,1,1
註冊項6=Name,TeamTypesA,國家,TechLevel(疑似無效所以不要費勁查小隊中單位最高TechLevel啦),條件,前提,前提條件參數,基礎權重,權重下限,權重上限,用於戰役還是遭遇戰(0-戰役,1-遭遇戰),0,陣營,0,TeamTypesB,簡單AI能否使用(0-否,1-是),中等AI能否使用(0-否,1-是),困難AI能否使用(0-否,1-是)
以下是各項解釋:
Name - 名稱 ;隨便寫反正不讀,僅供編寫者記憶和查找用。不能用中文,也不能有英文逗號和感嘆號
TeamTypesA & TeamTypesB - 第一小隊 & 第二小隊:分別判定,而且第二小隊先造。(不建議用第二小隊,寫<none>最好)
國家 - 如果不涉及專屬單位就寫<all>,需要設置專屬單位就寫該國家註冊名。
TechLevel - 無特殊需要可以寫1,如果有特殊模式可以按模式需要自行擬定。
條件,前提,前提條件參數:
條件,前提:
-1,<none> 任何條件
0,前提 敵方擁有(前提)指定的單位(加載物無效)
1,前提 己方擁有(前提)指定的單位(加載物無效)
2,<none> 敵方電力黃
3,<none> 敵方電力紅(間諜偷電成功時有效)
4,<none> 敵方金錢大於或等於
5,<none> 本方鐵幕裝置就緒
6,<none> 本方超時空傳送就緒
7,前提 中立方擁有(前提)指定的單位
前提:單位註冊名,AircraftTypes,BuildingTypes,InfantryTypes,VehicleTypes皆可。
前提條件參數:格式寫作XXXXXXXXYY000000000000000000000000000000000000000000000000000000,64位長度,16進制。前10位有效。前8位代表數值,第9、10位代表算法值。
(前8位是程序猿格式,要兩位兩位寫,比如5000的16進制是1388,這裡就要寫成8813,10W的16進制是186A0,這裡就要寫成A08601,不過除了金錢也沒其他數字會寫這麼長)。算法2位:00 - 小於,01 - 小於等於,02 - 等於,03 - 大於等於,04 - 大於,05 - 不等於。
例:如果觸發條件是"敵方擁有的BILLY小於等於255個",那麼就寫成"0,BILLY,FF00000001000000000000000000000000000000000000000000000000000000"
三個權重:控制AI在滿足條件下激活該觸發的可能性。數字寫多少都行,整數小數都沒問題,當然最好控制合理些以便AI可以抽到不同的觸發。(【只有】兩個特殊值:0 - 完全不觸發。5000 - 滿足條件必觸發)
陣營:1-萌,2-聯,3-尤,4-第4陣營,5-第5陣營……(0-全)
三個難度(這次WW沒寫倒):用來區分不同難度的AI。
運用:AITrigger的重點在於為AI不同發展時期的Team安排不同階段的觸發條件。比如初期低級兵種Rush就可以將前提條件設定為"己方不存在機場/雷達/其他高科技建築",這樣在AI擁有高級科技建築以後就不會再爆初期隊伍了。此外還可以利用AI權重變化,把AI權重降為0,AI就徹底不會出這支小隊了。
以上只是簡單的舉例,具體到如何編排AI的隊伍,就要各位modder自己開動腦筋了。
以上就是AI(MD).ini的四個主要板塊,其實還是很好理解的。
關於命名:
原版AI條目都是毫無規律的數字。但是在自己編寫AI的時候,完全可以採用有規律的命名方式,這樣在4個部分切換的時候會非常方便記憶和查找。採用何種規律取決於自己的記憶習慣,只要不超過32個字節即可。
另:-G完全沒用,唯一的用處是可以確保AI項目的註冊名不會跟其他項目的註冊名重複。
以下舉幾個命名規律的例子,四個[]分別對應[TaskForces]、[ScriptTypes]、[TeamTypes]、[AITriggerTypes](實際寫的時候AITriggerTypes沒有[]):
[3HTNKTask-G]、[3HTNKScript-G]、[3HTNKTeam-G]、[3HTNKTrigger-G]
[3HTNK001-G]、[3HTNK101-G]、[3HTNK201-G]、[3HTNK301-G]
[AL000001-G]、[AL100001-G]、[AL200001-G]、[AL300001-G]
[3ENG-G]、[CapOil-G]、[3ENGCapOilTeam-G]、[3ENGCapOilTrig-G]
[Ass♂We♂Can]、[Deep♂Dark♂Fantasy]、[Thank♂You♂Sir]、[DA☆ZE]
用中文和!會出bug,所以請避免使用中文。
關於第二小隊:
允許AI在滿足一個前提時造兩支Team,如果兩個Team的組成占用了同一生產線(步兵/載具/飛機),那麼先造2隊,如果在不同生產線可以同時開工。兩個Team相互獨立,組建完畢後分別執行腳本。
實際使用體驗很差,因為有很腦抽的限制——如果倆隊伍要用到不同生產線,那麼AI必須同時擁有所需的生產線時才會開工——比如1隊步兵2隊飛機,那麼即使觸發前提是兵營,AI也會在造了機場後才造1隊。
其他:吱吱醬的AI檢查腳本是極好的輔助工具,能夠查出不少容易被忽略的細節疏漏。
附,一些特殊單位的AI相關:
武裝直升機:
原版AI使用武直執行一切移動指令時,由於指令判定點為地面,而武直不會主動降落,因此會無限卡在移動指令的目標地點上空。想讓AI的武直部署基本上只能在攻擊指令之後銜接部署指令。
如果想讓AI的武直執行移動指令,就需要給武直添加BalloonHover=yes語句。
給武直添加BalloonHover目前未發現任何負面效果,不但不影響部署落地,甚至BalloonHover自帶的一定要飛目標頭上拉翔的特技,在武直身上都不存在。
當然,做到這一步只能算初步解決了AI武直的移動問題和部署問題(這時的部署僅是個視覺效果)。除此之外還要面臨一系列問題:
1.移動到路徑點之後AI可能不會部署:經測試,AI可以正常完成移動至路徑點的指令,只是無法在移動後部署。只要在移動和部署之間隨便增加個容易完成的指令即可,比如5,0(非最優)。
2.部署之後立即起飛(甚至在部署狀態就起飛,AI作弊實錘!):部署之後需要讓AI執行防守指令,以免AI瞎起飛。(註:不能用11,11)
3.部署之後不開炮或開炮距離過近:再給武直加個與副武器射程等同的GuardRange即可。
綜上,在給武直添加BalloonHover和GuardRange之後,再結合合理的指令,即可做到讓AI批量部署武直。
還想讓AI部署之後重新起飛?其實也是可行的,不過意義不大。AI的武直杵在地上當炮台才是墜吼的!至於方法,在AI(MD)部分里找吧。
機場飛機:
Ra2對機場飛機的判定極為坑爹。飛機一旦離地,AI就會認為飛機"沒了"……而一旦AI造的機場飛機和正好回歸的飛機撞了停機坪,就有大概率彈框。
目前較為穩妥的方式是,用飛機自身的數量作為觸發前提,儘可能單個製造。需要群體出擊的話通過重組組成大隊出擊,但是補充飛機時優先重組現有飛機。
大體流程如下:飛機數量小於4(視機場數量和停機坪數量而定)時,製造包含1架飛機的低優先小隊,該小隊Max=4。飛機數量等於4時,編成4架飛機組成的高優先級隊伍出擊。高優先級小隊可以調用低優先級小隊成員。
利用重組的方法,減少AI大批量造飛機的可能性,這樣即使偶爾撞停機位也不至於崩潰。
運輸船:
由於不明原因,Ares的海軍乘客邏輯被改壞了。有乘客位的海軍必須和沒有乘客位的海軍同時寫在TaskForces里,AI才能正常建造有乘客位的海軍。與此矛盾的是——運輸船雖然有乘客位,卻因為是兩棲單位,腳本會按照陸軍進行判定,導致運輸船+正常水面艦艇的組合無法有效執行移動指令和攻擊指令。因此Ares的AI無法正常使用從船塢造出來的運輸船。解決方法目前只有去掉運輸船的Naval=yes,通過工廠出運輸船。
第五章 地圖相關
地圖中可以單獨添加AI,為了區分地圖中的AI和aimd.ini中的AI,通常把寫在aimd.ini中的叫做全局AI(或者叫Global),寫在map里的叫做本地AI。
[General]、[TaskForces]、[ScriptTypes]、[TeamTypes]、[AITriggerTypes]都可以在地圖裡單獨設定,且優先級高於ini文件。
在製作玩法較為特別的地圖時,為地圖單獨設定一套專有的AI會大大提高地圖可玩性。
且地圖裡可用路徑點來達成一些全局AI無法做到的操作。
另外有兩句十分重要的語句:
[Basic]
IgnoreGlobalAITriggers=bool ;是否屏蔽全局AI的[AITriggerTypes]。AI測試圖的關鍵語句。另外一些特殊玩法地圖也可以屏蔽掉全局AI,用地圖內置AI取代全局。
AI的編寫和測試是一個繁瑣的工作。自製一張簡易的AI測試圖會非常有幫助。AI測試圖需要的大概就只有兩個發展空間足夠大的島和一條通道,再擺上一些中立建築可進駐建築之類的,用以測試一條完整的AITrigger能不能順利觸發,用處巨大。
[AITriggerTypesEnable]
決定地圖本地AI是否啟用的列表,對全局AI完全無效。格式"通常"是:AITriggerTypes註冊名=bool。
對【遭遇戰地圖】,所有本地AI強制yes/true,但是必須把本地AITriggerTypes=xxx寫進Enable列表才能被地圖識別並生效。(此時"="後面寫任何東西都算激活該條AITriggerTypes,不寫或只寫到=則視為未註冊,該本地AITrigger無效)
舉個栗子:
某遭遇戰地圖的[AITriggerTypes]項下有AI123、AI555、AI998、AI2333、AI6666、AI114514一共6個本地AITriggerTypes,[AITriggerTypesEnable]寫成如下鳥樣:
[AITriggerTypesEnable]
AI123=yes
AI555==
AI2333=倪達耶德
AI6666=no
AI114514=
那麼AI123、AI555、AI2333、AI6666生效,AI998和AI114514都不生效。
對【戰役地圖】,所有本地AI默認no/false,跟遭遇戰的區別就是能正常判斷本地AI的yes和no(但是寫no為啥不直接刪掉……)。
此外還可以通過觸發,跳過Enable列表直接激活本地AI。
無論是否寫入Enable列表,IgnoreGlobalAITriggers的優先級永遠高於Enable列表。
另外IgnoreGlobalAITriggers和Enable列表都僅影響[AITriggerTypes],全局的[TaskForces]、[ScriptTypes]、[TeamTypes]依然有效。
因此如果想要僅激活部分全局AI,則需要IgnoreGlobalAITriggers=yes,然後將想要啟用的Trigger複製進地圖本地[AITriggerTypes],將此Trigger的註冊名改成與未重複的新註冊名,再將用於遭遇戰的標籤改為用於戰役就可以了。
Ares地圖相關:除了預置單位以及開局就刷出來的單位,地圖觸發無法刷出帶載荷的運輸單位,因此需要通過其他方法實現刷載荷單位。
PLUS Ares平台下的AI騷操作
雖然Ares在AI方面並沒有多少針對性改動,不過卻在無意之間為AI提供了更多可能性。
套皮單位:
Ares最有價值的一環,即玩家無法識別的套皮單位。然而AI卻可以識別,如何只能讓AI製造套皮單位就是應用的關鍵。
如果是直接製造,我們知道AI製造非建築時會受到TechLevel限制,卻無視Prerequisite,因此只要讓套皮單位的TechLevel保持正常,把Prerequisite設定成玩家無法獲得的建築就可以了,比如無法占領的中立建築(篝火、郵筒、陽傘、毛巾、垃圾箱、熱狗攤等),也可以是只有註冊名卻不實際存在的"註冊建築"。
非直接製造的話,其實被玩家獲得也沒啥影響,反正看不出來。
套皮單位結合合理全局設置和AI腳本,甚至可以實現AI精確操控傘兵。(其實不套皮也能,只不過有時不能精確控制)
無節操運輸:
套皮單位的一個分支,可以避免AI裝載貨物時各種卡死,以及運輸腳本的諸多限制。
藉助Ares甚至可以做到多個運輸單位同時存在於同一個AI編隊,並且流暢地完成運輸任務。雖然穿幫較為明顯,但"AI必須通過一定程度的作弊來才能與玩家抗衡",綜合來看,還是能讓AI做出比正常情況下更為多樣的表現,是利大於弊的。
Delivery超武:
這個神奇的超武可以幫助AI完成許多特別的操作。比如通過觸發在地圖上刷出具有初始載荷的單位,一定程度上解決了地圖觸發刷的單位沒有載荷的問題。
還有讓AI更加智能地運用防禦塔防守的策略(特別鳴謝該戰術的研發者星星):在敵人進攻到家門口時貼臉造起一座塔,打敵人個猝不及防,讓AI表現得更像玩家。
此外,由於地圖觸發無法刷出帶載荷的運輸單位,可以考慮使用Delivery超武刷載荷單位,再結合AI腳本讓AI控制該單位。
模塊化:
拆分ini的功能使得AI可以更容易地分塊進行添加和測試,活用#include功能可以加快AI製作的效率,對AI製作流程優化有著很明顯的幫助。
以上列舉的有趣玩法僅供參考,還有更多的可能性需要大家自行發掘。
教學部分至此結束。
AI是個製作水平很難快速提升的工作,一方面需要足夠開闊的腦洞才能在諸多引擎限制之中找到賦予AI騷操作的套路,另一方面也需要枯燥乏味的海量測試來觀測AI的執行效果。即使是這篇教程,也會有不少不嚴謹或測試不到的地方,細節之處還是需要自行測試。
最後,重複一遍,一套完整的AI是Rules設定、ai(md).ini以及單位代碼共同作用的結果,AI的許多騷操作都要通過不同領域的功能組合才能實現。希望這篇教程能拓寬你的思路,並且創造出新的AI套路。
PS:本教程可能隨時根據測試結果進行更新,請以最後發布日期為準。