中级玩家
 
- 贡献度
- 15
- 金元
- 996
- 积分
- 160
- 精华
- 0
- 注册时间
- 2010-2-23
|
首先放上 人族高AI时虫和神出Error补丁,虫神再不会纱布了。 直接Copy到StarCraft II BetaTriggerLibs里面 现在在高AI人族的时候虫和神不会不造东西了。
http://www.rayfile.com/files/4d98be57-2430-11df-a726-0015c55db73d/
error是因为没有调用虫和神的AI文件。
现在想自己写AI的来看看:
暴雪现在是用的Galaxy脚本语言,和C语言很类似。用MPQ把StarCraft II BetaModsLiberty.SC2ModBase.SC2Data 解开以后,会出现和AI有关的几个Galaxy脚本
MeleeNotHardAI.galaxy MeleeAI.galaxy Protoss0.galaxy Protoss.galaxy Zerg.galaxy Zerg0.galaxy Terran.galaxy Terran0.galaxy TacticalAI.galaxy
其中, MeleeNotHardAI.galaxy MeleeAI.galaxy应该是战争的整体策略,Protoss.galaxy Terran.galaxy Zerg.galaxy则是每个种族的策略,后面带0的表示难度0下的该种族策略。现在就来看看Terran0.galaxy的部分
//==================================================================================================
// Terran Melee AI
//==================================================================================================
include "TriggerLibs/Terran0"
//--------------------------------------------------------------------------------------------------
// Counter-Attack Units 这个应该是兵种相克表,告诉AI什么应该用什么对付
//--------------------------------------------------------------------------------------------------
static void InitCounters (int player) {
//xxx lots of old data -- needs to be totally redone
// versus Protoss
AICounterUnit(player, c_PB_PhotonCannon, 0.50, c_TU_SiegeTank);
AICounterUnit(player, c_PU_Zealot, 1.00, c_TU_Hellion);
AICounterUnit(player, c_PU_Stalker, 1.00, c_TU_Marauder);
AICounterUnit(player, c_PU_Immortal, 2.00, c_TU_Marauder);
AICounterUnit(player, c_PU_Disruptor, 1.00, c_TU_Ghost);
AICounterUnit(player, c_PU_HighTemplar, 1.00, c_TU_Ghost);
AICounterUnit(player, c_PU_DarkTemplar, 1.00, c_TU_Hellion);
AICounterUnit(player, c_PU_Archon, 0.33, c_TU_Hellion);
AICounterUnit(player, c_PU_Colossus, 1.00, c_TU_Thor);
AICounterUnit(player, c_PU_VoidRay, 0.50, c_TU_Battlecruiser);
AICounterUnit(player, c_PU_Phoenix, 0.50, c_TU_BattlecruiserMissile);
AICounterUnit(player, c_PU_Carrier, 0.75, c_TU_BattlecruiserYamato);
// versus Terran
AICounterUnit(player, c_TB_Bunker, 0.33, c_TU_SiegeTank);
AICounterUnit(player, c_TU_Marine, 0.50, c_TU_Hellion);
AICounterUnit(player, c_TU_Reaper, 0.70, c_TU_Hellion);
AICounterUnit(player, c_TU_Marauder, 0.50, c_TU_SiegeTank);
AICounterUnit(player, c_TU_Ghost, 2.00, c_TU_Hellion);
AICounterUnit(player, c_TU_Hellion, 0.25, c_TU_Thor);
AICounterUnit(player, c_TU_SiegeTank_Alias, 0.50, c_TU_Thor);
AICounterUnit(player, c_TU_Thor, 3.00, c_TU_Marauder);
AICounterUnit(player, c_TU_Viking_Alias, 1.00, c_TU_Viking);
AICounterUnit(player, c_TU_Banshee, 1.00, c_TU_Viking);
AICounterUnit(player, c_TU_BattlecruiserClass, 1.00, c_TU_BattlecruiserYamato);
// versus Zerg
AICounterUnit(player, c_ZB_SpineCrawler, 0.33, c_TU_SiegeTank);
AICounterUnit(player, c_ZU_Zergling, 0.25, c_TU_Hellion);
AICounterUnit(player, c_ZU_Roach, 0.80, c_TU_Marauder);
AICounterUnit(player, c_ZU_Hydralisk, 0.50, c_TU_Ghost);
AICounterUnit(player, c_ZU_Lurker, 1.00, c_TU_Marauder);
AICounterUnit(player, c_ZU_Infestor, 0.50, c_TU_Ghost);
AICounterUnit(player, c_ZU_Ultralisk, 1.00, c_TU_Thor);
AICounterUnit(player, c_ZU_Mutalisk, 0.80, c_TU_Viking);
AICounterUnit(player, c_ZU_Corruptor, 0.50, c_TU_Battlecruiser);
AICounterUnit(player, c_ZU_BroodLord, 0.50, c_TU_Viking);
}
//--------------------------------------------------------------------------------------------------
// TerranSubStateName
//--------------------------------------------------------------------------------------------------
string TerranSubStateName (int state) {
// TODO Call the individual difficulties to return a real substate name
return "-" + IntToString(state) + "-";
}
//--------------------------------------------------------------------------------------------------
// DebugCallbackTerr
//--------------------------------------------------------------------------------------------------
void DebugCallbackTerr (int player) {
DebugAI("=====TERRAN=====n");
DebugMelee(player);
DebugAI("e_mainState = " + MainStateName(AIState(player, e_mainState)) +
", e_mainSubState = " + TerranSubStateName(AIState(player, e_mainSubState)) +
", e_attackState = " + AttackStateName(AIState(player, e_attackState))
);
}
//--------------------------------------------------------------------------------------------------
// AINewUnitTerr 关于一些AI中错误的应对
//--------------------------------------------------------------------------------------------------
void AINewUnitTerr (int player, unit u) {
wave w;
string type = UnitGetType(u);
// ignored units
//
if (UnitTypeTestAttribute(type, c_unitAttributeStructure)) {
return;
}
if (UnitTypeTestFlag(type, c_unitFlagWorker)) {
return;
}
if (type == c_TU_Medivac) {
// TODO after normal scouting claims the ones it wants give the rest to the
// attack wave instead of the extra scout group
AIAddToExtraScoutGroup(player, u);
return;
}
// detector
//
if (type == c_TU_Raven) {
AINewDetector(player, u, false);
return;
}
// clear obstacle units
//
if (AIWaveNeedClearObsUnits(player)) {
if (type == c_TU_Marine || type == c_TU_Reaper || type == c_TU_Marauder) {
AIMergeUnit(player, u, AIWaveGet(player, c_waveClearObs));
return;
}
}
// diversion units
if (AIGetFlag(player, e_flagsDiversion)) {
if (type == c_TU_Reaper) {
AIMergeUnit(player, u, AIWaveGet(player, c_waveDivert1));
return;
}
if (type == c_TU_Banshee) {
AIMergeUnit(player, u, AIWaveGet(player, c_waveDivert2));
return;
}
}
// main wave units
//
AINewUnitDefault(player, u);
}
//--------------------------------------------------------------------------------------------------
// AIGetScoutTerr
//--------------------------------------------------------------------------------------------------
unit AIGetScoutTerr (int player, int index, unit prev) {
unit medivac;
if (!AIGetFlag(player, e_flagsScouting)) {
return c_nullUnit;
}
if (UnitGetType(prev) == c_TU_Medivac) {
return prev;
}
medivac = AIGrabUnit(player, c_TU_Medivac, c_prioScout, null);
if (medivac) {
return medivac;
}
if (prev) {
return prev;
}
if (AIGetFlag(player, e_flagsLateScout)) {
return c_nullUnit;
}
return AIGrabUnit(player, c_TU_SCV, c_prioScout, null);
}
//--------------------------------------------------------------------------------------------------
// AIEarlyDefScoutTerr
//--------------------------------------------------------------------------------------------------
unit AIEarlyDefScoutTerr (int player, unit prev) {
unit obs;
if (!AIGetFlag(player, e_flagsEarlyDefScout)) {
return c_nullUnit;
}
if (UnitGetType(prev) == c_TU_Medivac) {
return prev;
}
obs = AIGrabUnit(player, c_TU_Medivac, c_prioScout, null);
if (obs) {
return obs;
}
if (UnitGetType(prev) == c_TU_Marine) {
return prev;
}
obs = AIGrabUnit(player, c_TU_Marine, c_prioScout, null);
if (obs) {
return obs;
}
if (prev) {
return prev;
}
return AIGrabUnit(player, c_TU_SCV, c_prioScout, null);
}
//--------------------------------------------------------------------------------------------------
// AIWaveThinkTerr
//--------------------------------------------------------------------------------------------------
void AIWaveThinkTerr (int player, wave w, int type) {
AIWaveThinkDefault(player, w, type);
}
//--------------------------------------------------------------------------------------------------
// Terran Init 人族初始化
//--------------------------------------------------------------------------------------------------
static void TerranInit (int player) {
int state;
InitCounters(player);
AISetNumScouts(player, 1);
AISetFlag(player, e_flagsScouting, false);
AISetFlag(player, e_flagsEarlyDefScout, false);
AITechCountFixupEither(player, c_TB_CommandCenter, c_TB_OrbitalCommand, c_TB_PlanetaryFortress);
if (AIGetGroundStartLocs(PlayerStartLocation(player)) > 0) {
state = AIDiffEnum(player, e_mainState_OpenGnd0);
}
else {
state = AIDiffEnum(player, e_mainState_OpenAir0);
}
AISetMainState(player, state, e_mainSubState_Unset);
}
//--------------------------------------------------------------------------------------------------
// AIMeleeTerr
//--------------------------------------------------------------------------------------------------
void AIMeleeTerr (int player) {
int mainState = AIState(player, e_mainState);
if (mainState == e_mainState_Init) { TerranInit(player); }
else if (mainState == e_mainState_OpenGnd0) { TerranOpenGnd0(player); }
//else if (mainState == e_mainState_OpenGnd1) { TerranOpenGnd1(player); }
//else if (mainState == e_mainState_OpenGnd2) { TerranOpenGnd2(player); }
//else if (mainState == e_mainState_OpenGnd3) { TerranOpenGnd3(player); }
//else if (mainState == e_mainState_OpenGnd4) { TerranOpenGnd4(player); }
//else if (mainState == e_mainState_OpenGnd5) { TerranOpenGnd5(player); }
else if (mainState == e_mainState_OpenAir0) { TerranOpenAir0(player); }
//else if (mainState == e_mainState_OpenAir1) { TerranOpenAir1(player); }
//else if (mainState == e_mainState_OpenAir2) { TerranOpenAir2(player); }
//else if (mainState == e_mainState_OpenAir3) { TerranOpenAir3(player); }
//else if (mainState == e_mainState_OpenAir4) { TerranOpenAir4(player); }
//else if (mainState == e_mainState_OpenAir5) { TerranOpenAir5(player); }
else if (mainState == e_mainState_Mid0) { TerranMid0(player); }
//else if (mainState == e_mainState_Mid1) { TerranMid1(player); }
//else if (mainState == e_mainState_Mid2) { TerranMid2(player); }
//else if (mainState == e_mainState_Mid3) { TerranMid3(player); }
//else if (mainState == e_mainState_Mid4) { TerranMid4(player); }
//else if (mainState == e_mainState_Mid5) { TerranMid5(player); }
else if (mainState == e_mainState_Late0) { TerranLate0(player); }
//else if (mainState == e_mainState_Late1) { TerranLate1(player); }
//else if (mainState == e_mainState_Late2) { TerranLate2(player); }
//else if (mainState == e_mainState_Late3) { TerranLate3(player); }
//else if (mainState == e_mainState_Late4) { TerranLate4(player); }
//else if (mainState == e_mainState_Late5) { TerranLate5(player); }
else if (mainState == e_mainState_Off) { EndMeleeScript(player); }
else if (mainState == e_mainState_Disabled) { }
else { ErrorMeleeScript(player, "Invalid mainState"); } //这个就是大家看到的错误信息
}
|
|