找到AI的Battlecruiser不会用Yamato的原因了
打AI的时候发现无论哪个AI造出的Battlecruiser都不会用Yamato技能,结果就是AI使用这个兵种的效果大打折扣。于是到处找原因,花了两天的时间翻遍所有AI的TactXXXAI.galaxy看,由于不会编程,只是靠英语猜一点点出来,看得头大。对比所有技能AI之后终于发现,除了Yamato之外,其他技能都有FilterRange。于是尝试自己加入fixed AIRangeBattlecruiser,结果是:进入游戏变成三无地图……囧死。不甘心,继续尝试。之前自己改mod和AI玩得出的经验,可能是单位名字不对,于是去查了下RequirementsAI.galaxy,发现Battlecruiser有好多形态(早期SC2中的设定),其中一个是BattlecruiserYamato,于是把名字换成这个,进地图发现不再是三无了。但是AI还是不会用Yamato。于是继续尝试,会不会是技能名字不对?技能伤害代码不对?各种尝试后,均无果。抓狂。
但是今天早上出现转机,突然闪现了灵感,问题会不会在Battlecruiser本身上面?立刻去查Base.SC2Data中的UnitData,发现,所有单位,除了Battlecruiser之外,都有
<TacticalAIRange value="AIRangeXXX"/>
<TacticalAIThink value="AIThinkXXX"/>
天杀的 -_-|||。
立刻自己加上,并在TactTerrAI.galaxy里补上对应的fixed AIRangeBattlecruiser和void AIThinkBattlecruiser,加入AISetFilterRange。然后进入游戏试验,果然AI自己终于可以用Yamato了。
看图说话:
盟友方的BC放出一个Yamato后潇洒转身离开,能量用掉了。
不会编程,下面只是照其他技能的样子copy了过来的技能AI,为了测试去掉了只在进攻是放的命令。fixed AIRangeBattlecruiser (int player, unit aiUnit) {
return AIAbilityFixed(player, c_AB_Yamato, c_fieldRange0) + 1;
}
order AIOrderYamato (int player, unit aiUnit, unitgroup scanGroup, marker mark) {
order ord;
aifilter filter;
fixed damage;
ord = AICreateOrder(player, c_AB_Yamato, 0);
if (!UnitOrderIsValid(aiUnit, ord)) {
return null;
}
damage = AIEffectFixed(player, c_EF_YamatoDamage, c_fieldAmount);
filter = AIFilter(player);
AISetFilterAlliance(filter, c_playerGroupEnemy);
AISetFilterRange(filter, aiUnit, AIAbilityFixed(player, c_AB_Yamato, c_fieldRange0) + 1);
AISetFilterLifePerMarker(filter, damage, mark);
AISetFilterLifeSortReference(filter, damage, damage*c_distanceFromDamage);
scanGroup = AIGetFilterGroup(filter, scanGroup);
return AIUnitGroupGetValidOrder(scanGroup, ord, aiUnit, c_backwards);
}下面的void AIThinkBattlecruiser没区别。
也许自己火星了,不过这样到处挖着玩并最终解决问题确实很有意思。
页:
[1]