- Joined
- Nov 26, 2006
- Messages
- 11,136
JASS:
//==================================================================================================
// Zerg Melee AI
//==================================================================================================
include "TriggerLibs/Zerg0"
//--------------------------------------------------------------------------------------------------
// Counter-Attack Units
//--------------------------------------------------------------------------------------------------
static void InitCounters (int player) {
//xxx lots of old data -- needs to be totally redone
// versus Protoss
AICounterUnit(player, c_PU_Zealot, 1.00, c_ZU_Baneling);
AICounterUnit(player, c_PU_Stalker, 1.00, c_ZU_Roach);
AICounterUnit(player, c_PU_Immortal, 8.00, c_ZU_Zergling);
AICounterUnit(player, c_PU_HighTemplar, 2.00, c_ZU_Roach);
AICounterUnit(player, c_PU_Disruptor, 4.00, c_ZU_Zergling);
AICounterUnit(player, c_PU_Archon, 4.00, c_ZU_Zergling);
AICounterUnit(player, c_PU_Archon, 2.00, c_ZU_Hydralisk);
AICounterUnit(player, c_PU_Archon, 2.00, c_ZU_Roach);
AICounterUnit(player, c_PU_Colossus, 1.00, c_ZU_Mutalisk);
AICounterUnit(player, c_PU_VoidRay, 2.00, c_ZU_Corruptor);
AICounterUnit(player, c_PU_VoidRay, 1.00, c_ZU_Mutalisk);
AICounterUnit(player, c_PU_Phoenix, 2.00, c_ZU_Hydralisk);
AICounterUnit(player, c_PU_Carrier, 2.00, c_ZU_Hydralisk);
AICounterUnit(player, c_PU_Carrier, 2.00, c_ZU_Corruptor);
// versus Terran
AICounterUnit(player, c_TU_Marine, 0.60, c_ZU_Baneling);
AICounterUnit(player, c_TU_Marauder, 3.00, c_ZU_Zergling);
AICounterUnit(player, c_TU_Hellion, 0.60, c_ZU_Roach);
AICounterUnit(player, c_TU_Ghost, 6.00, c_ZU_Zergling);
AICounterUnit(player, c_TU_SiegeTank_Alias, 6.00, c_ZU_Zergling);
AICounterUnit(player, c_TU_Reaper, 0.30, c_ZU_Mutalisk);
AICounterUnit(player, c_TU_Thor, 12.00, c_ZU_Zergling);
AICounterUnit(player, c_TU_Banshee, 0.50, c_ZU_Mutalisk);
AICounterUnit(player, c_TU_BattlecruiserClass, 2.00, c_ZU_Corruptor);
AICounterUnit(player, c_TU_BattlecruiserClass, 2.00, c_ZU_Hydralisk);
// versus Zerg
AICounterUnit(player, c_ZU_Zergling, 0.25, c_ZU_Baneling);
AICounterUnit(player, c_ZU_Baneling, 0.25, c_ZU_Lurker);
AICounterUnit(player, c_ZU_Roach, 3.00, c_ZU_Zergling);
AICounterUnit(player, c_ZU_Hydralisk, 1.00, c_ZU_Hydralisk);
AICounterUnit(player, c_ZU_Lurker, 1.50, c_ZU_Hydralisk);
AICounterUnit(player, c_ZU_Mutalisk, 0.50, c_ZU_Mutalisk);
AICounterUnit(player, c_ZU_Mutalisk, 0.50, c_ZU_Corruptor);
AICounterUnit(player, c_ZU_Corruptor, 1.00, c_ZU_Corruptor);
AICounterUnit(player, c_ZU_BroodLord, 0.50, c_ZU_Corruptor);
}
//--------------------------------------------------------------------------------------------------
// ZergSubStateName
//--------------------------------------------------------------------------------------------------
string ZergSubStateName (int state) {
// TODO Call the individual difficulties to return a real substate name
return "-" + IntToString(state) + "-";
}
//--------------------------------------------------------------------------------------------------
// DebugCallbackZerg
//--------------------------------------------------------------------------------------------------
void DebugCallbackZerg (int player) {
DebugAI("=====ZERG=====\n");
DebugMelee(player);
DebugAI("e_mainState = " + MainStateName(AIState(player, e_mainState)) +
", e_mainSubState = " + ZergSubStateName(AIState(player, e_mainSubState)) +
", e_attackState = " + AttackStateName(AIState(player, e_attackState))
);
}
//--------------------------------------------------------------------------------------------------
// AINewUnitZerg
//--------------------------------------------------------------------------------------------------
void AINewUnitZerg (int player, unit u) {
wave w;
string type = UnitGetType(u);
// ignored units
//
if (type == c_ZU_Larva ||
type == c_ZU_Broodling ||
type == c_ZU_Mantaling) {
return;
}
if (UnitTypeTestAttribute(type, c_unitAttributeStructure)) {
return;
}
if (UnitTypeTestFlag(type, c_unitFlagWorker)) {
return;
}
// units that stay near home
//
if (type == c_ZB_SpineCrawler || type == c_ZB_SporeCrawler) {
AIWaveAddUnitPriority(AIWaveGet(player, c_waveHome), u, c_prioWavePeon);
return;
}
if (type == c_ZU_Queen) {
AIWaveAddUnitPriority(AIWaveGet(player, c_waveHome), u, c_prioWavePeon);
return;
}
// detector
//
if (type == c_ZU_Overseer) {
AINewDetector(player, u, true);
return;
}
// extra scout units
//
if (type == c_ZU_Overlord || type == c_ZU_OverlordCocoon ) {
AIAddToExtraScoutGroup(player, u);
return;
}
// clear obstacle units
//
if (AIWaveNeedClearObsUnits(player)) {
if (type == c_ZU_Zergling || type == c_ZU_Roach || type == c_ZU_Hydralisk) {
AIMergeUnit(player, u, AIWaveGet(player, c_waveClearObs));
return;
}
}
// main wave units
//
AINewUnitDefault(player, u);
}
//--------------------------------------------------------------------------------------------------
// AIGetScoutZerg
//--------------------------------------------------------------------------------------------------
unit AIGetScoutZerg (int player, int index, unit prev) {
unit seer;
if (!AIGetFlag(player, e_flagsScouting)) {
return c_nullUnit;
}
if (UnitGetType(prev) == c_ZU_Overseer) {
return prev;
}
seer = AIGrabUnit(player, c_ZU_Overseer, c_prioScout, null);
if (seer) {
return seer;
}
if (prev) {
return prev;
}
if (AIGetFlag(player, e_flagsLateScout)) {
return c_nullUnit;
}
return AIGrabUnit(player, c_ZU_Overlord, c_prioScout, null);
}
//--------------------------------------------------------------------------------------------------
// AIEarlyDefScoutZerg
//--------------------------------------------------------------------------------------------------
unit AIEarlyDefScoutZerg (int player, unit prev) {
unit obs;
if (!AIGetFlag(player, e_flagsEarlyDefScout)) {
return c_nullUnit;
}
if (UnitGetType(prev) == c_ZU_Overseer) {
return prev;
}
obs = AIGrabUnit(player, c_ZU_Overseer, c_prioScout, null);
if (obs) {
return obs;
}
if (UnitGetType(prev) == c_ZU_Zergling) {
return prev;
}
obs = AIGrabUnit(player, c_ZU_Zergling, c_prioScout, null);
if (obs) {
return obs;
}
if (prev) {
return prev;
}
return AIGrabUnit(player, c_ZU_Drone, c_prioScout, null);
}
//--------------------------------------------------------------------------------------------------
// AIWaveThinkZerg
//--------------------------------------------------------------------------------------------------
void AIWaveThinkZerg (int player, wave w, int type) {
AIWaveThinkDefault(player, w, type);
}
//--------------------------------------------------------------------------------------------------
// Zerg Init
//--------------------------------------------------------------------------------------------------
static void ZergInit (int player) {
int state;
InitCounters(player);
AISetNumScouts(player, 1);
AISetFlag(player, e_flagsScouting, true);
AISetFlag(player, e_flagsEarlyDefScout, false);
AIReqCountAsBuiltObject(player, c_ZU_Larva);
AITechCountFixupSingle(player, c_ZB_HydraliskDen, c_ZB_LurkerDen);
AITechCountFixupSingle(player, c_ZB_Spire, c_ZB_GreaterSpire);
AITechCountFixupInOrder(player, c_ZB_Hatchery, c_ZB_Lair, c_ZB_Hive);
AISetCreepBuilding(player, c_ZB_CreepTumor, "ZergBuildingNotOnCreep");
if (AIGetGroundStartLocs(PlayerStartLocation(player)) > 0) {
state = AIDiffEnum(player, e_mainState_OpenGnd0);
}
else {
state = AIDiffEnum(player, e_mainState_OpenAir0);
}
AISetMainState(player, state, e_mainSubState_Unset);
}
//--------------------------------------------------------------------------------------------------
// AIMeleeZerg
//--------------------------------------------------------------------------------------------------
void AIMeleeZerg (int player) {
int mainState = AIState(player, e_mainState);
if (mainState == e_mainState_Init) { ZergInit(player); }
else if (mainState == e_mainState_OpenGnd0) { ZergOpenGnd0(player); }
//else if (mainState == e_mainState_OpenGnd1) { ZergOpenGnd1(player); }
//else if (mainState == e_mainState_OpenGnd2) { ZergOpenGnd2(player); }
//else if (mainState == e_mainState_OpenGnd3) { ZergOpenGnd3(player); }
//else if (mainState == e_mainState_OpenGnd4) { ZergOpenGnd4(player); }
//else if (mainState == e_mainState_OpenGnd5) { ZergOpenGnd5(player); }
else if (mainState == e_mainState_OpenAir0) { ZergOpenAir0(player); }
//else if (mainState == e_mainState_OpenAir1) { ZergOpenAir1(player); }
//else if (mainState == e_mainState_OpenAir2) { ZergOpenAir2(player); }
//else if (mainState == e_mainState_OpenAir3) { ZergOpenAir3(player); }
//else if (mainState == e_mainState_OpenAir4) { ZergOpenAir4(player); }
//else if (mainState == e_mainState_OpenAir5) { ZergOpenAir5(player); }
else if (mainState == e_mainState_Mid0) { ZergMid0(player); }
//else if (mainState == e_mainState_Mid1) { ZergMid1(player); }
//else if (mainState == e_mainState_Mid2) { ZergMid2(player); }
//else if (mainState == e_mainState_Mid3) { ZergMid3(player); }
//else if (mainState == e_mainState_Mid4) { ZergMid4(player); }
//else if (mainState == e_mainState_Mid5) { ZergMid5(player); }
else if (mainState == e_mainState_Late0) { ZergLate0(player); }
//else if (mainState == e_mainState_Late1) { ZergLate1(player); }
//else if (mainState == e_mainState_Late2) { ZergLate2(player); }
//else if (mainState == e_mainState_Late3) { ZergLate3(player); }
//else if (mainState == e_mainState_Late4) { ZergLate4(player); }
//else if (mainState == e_mainState_Late5) { ZergLate5(player); }
else if (mainState == e_mainState_Off) { EndMeleeScript(player); }
else if (mainState == e_mainState_Disabled) { }
else { ErrorMeleeScript(player, "Invalid mainState"); }
}