Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //--------------------------------------------------------------------------------------------------
- // *** Tactical Zerg AI ***
- //--------------------------------------------------------------------------------------------------
- //--------------------------------------------------------------------------------------------------
- // *** QUEEN ***
- //--------------------------------------------------------------------------------------------------
- //--------------------------------------------------------------------------------------------------
- order Transfusion (int player, unit aiUnit, marker mark) {
- order ord;
- unitgroup group;
- aifilter filter;
- if (AIPlayerDifficulty(player) < c_campAdvanced) {
- return null;
- }
- ord = AICreateOrder(player, c_AB_Transfusion, 0);
- if (!UnitOrderIsValid(aiUnit, ord)) {
- return null;
- }
- group = AIFindUnits(player, null, UnitGetPosition(aiUnit),
- AIAbilityFixed(player, c_AB_Transfusion, c_fieldRange0) + 1,
- c_noMaxCount)
- ;
- filter = AIFilter(player);
- AISetFilterAlliance(filter, c_playerGroupAlly);
- AISetFilterMarker(filter, c_noMarkersMin, c_noMarkersMax, mark);
- AISetFilterLifeLost(filter, AIEffectFixed(player, c_EF_Transfusion, c_fieldEffectChange0) - 20, c_noMax);
- group = AIGetFilterGroup(filter, group);
- if (group == null) {
- return null;
- }
- return AIUnitGroupGetValidOrder(group, ord, aiUnit, c_forwards);
- }
- //--------------------------------------------------------------------------------------------------
- const int maxLarva = 32;
- order SpawnLarva (int player, unit aiUnit) {
- order ord;
- unitgroup hatcheries;
- int larvaCount;
- // Only cast if idle.
- //
- if (UnitOrder(aiUnit, 0) != null) {
- return null;
- }
- ord = AICreateOrder(player, c_AB_SpawnMutantLarva, 0);
- if (!UnitOrderIsValid(aiUnit, ord)) {
- return null;
- }
- // Don't cast if we already own at least 32 larva
- //
- larvaCount = TechTreeUnitCount(player, c_ZU_Larva, c_techCountQueuedOrBetter);
- if (larvaCount >= maxLarva) {
- return null;
- }
- hatcheries = AIFindUnits(player,
- c_ZB_Hatchery_Alias,
- UnitGetPosition(aiUnit),
- 15,
- c_noMaxCount)
- ;
- return AIUnitGroupGetValidOrder(hatcheries, ord, aiUnit, c_backwards);
- }
- //--------------------------------------------------------------------------------------------------
- order CreepTumor (int player, unit aiUnit) {
- order ord;
- point p;
- unitgroup creepTumorGroup;
- int creepTumorCount;
- //if (AIIsCampaign(player)) {
- // return null;
- //}
- // Only cast if idle.
- //
- if (UnitOrder(aiUnit, 0) != null) {
- return null;
- }
- // Save at least 25 energy for spawn larva
- if (UnitGetPropertyInt(aiUnit, c_unitPropEnergy, c_unitPropCurrent) <= 50) {
- return null;
- }
- ord = AICreateOrder(player, c_AB_QueenBuild, 0);
- if (!UnitOrderIsValid(aiUnit, ord)) {
- return null;
- }
- // Don't cast if there is no creep point set for this player.
- p = AIGetBestCreepSpot(player, aiUnit, 30);
- if (p == null) {
- return null;
- }
- // Don't create large clusters of tumors
- creepTumorGroup = UnitGroup(c_ZB_CreepTumor, player, RegionCircle(p, 10),
- UnitFilter(0, 0, (1 << c_targetFilterMissile), (1 << (c_targetFilterDead - 32)) | (1 << (c_targetFilterHidden - 32))), 0);
- UnitGroupAddUnitGroup(creepTumorGroup,
- UnitGroup(c_ZB_CreepTumorBurrowed, player, RegionCircle(p, 10),
- UnitFilter(0, 0, (1 << c_targetFilterMissile), (1 << (c_targetFilterDead - 32)) | (1 << (c_targetFilterHidden - 32))), 0));
- creepTumorCount = UnitGroupCount(creepTumorGroup, c_unitCountAlive);
- if (creepTumorCount != 0) {
- return null;
- }
- OrderSetTargetPlacement(ord, p, aiUnit, c_ZB_CreepTumor);
- if (!UnitOrderIsValid(aiUnit, ord)) {
- return null;
- }
- return ord;
- }
- //--------------------------------------------------------------------------------------------------
- void AIThinkQueen (int player, unit aiUnit, unitgroup scanGroup) {
- order ord;
- unit heal;
- marker mark;
- // burrow
- // Burrowing is not working as intended, so commenting for now
- // if (AIUnitGetWave(aiUnit) == null || UnitGroupCount((AIWaveGetUnits(AIUnitGetWave(aiUnit))), c_unitCountAlive) > 1 ) {
- // if (AIEvalTacticalData(aiUnit, null)) {
- // return;
- // }
- // }
- //ord = SpawnLarva(player, aiUnit);
- //if (ord != null) {
- // AICast(aiUnit, ord, c_noMarker, c_castHold);
- // return;
- //}
- mark = AIMarker(aiUnit, c_MK_Transfusion);
- ord = Transfusion(player, aiUnit, mark);
- if (ord != null) {
- AICast(aiUnit, ord, mark, c_castHold);
- return;
- }
- ord = CreepTumor(player, aiUnit);
- if (ord != null) {
- AICast(aiUnit, ord, c_noMarker, c_castRetreat);
- return;
- }
- }
- //--------------------------------------------------------------------------------------------------
- // *** CREEP TUMOR ***
- //--------------------------------------------------------------------------------------------------
- void AIThinkCreepTumor (int player, unit aiUnit, unitgroup scanGroup) {
- order ord;
- point p;
- unitgroup creepTumorGroup;
- unitgroup creepTumorBurrowedGroup;
- int creepTumorCount;
- //if (AIIsCampaign(player)) {
- // return;
- //}
- // Only cast if idle.
- //
- if (UnitOrder(aiUnit, 0) != null) {
- return;
- }
- ord = AICreateOrder(player, c_AB_CreepTumorBuild, 0);
- if (!UnitOrderIsValid(aiUnit, ord)) {
- return;
- }
- // Don't cast if there is no creep point set for this player.
- p = AIGetBestCreepSpot(player, aiUnit, 9);
- if (p == null) {
- return;
- }
- // Don't create large clusters of tumors
- creepTumorGroup = UnitGroup(c_ZB_CreepTumor, player, RegionCircle(p, 5),
- UnitFilter(0, 0, (1 << c_targetFilterMissile), (1 << (c_targetFilterDead - 32)) | (1 << (c_targetFilterHidden - 32))), 0);
- UnitGroupAddUnitGroup(creepTumorGroup,
- UnitGroup(c_ZB_CreepTumorBurrowed, player, RegionCircle(p, 5),
- UnitFilter(0, 0, (1 << c_targetFilterMissile), (1 << (c_targetFilterDead - 32)) | (1 << (c_targetFilterHidden - 32))), 0));
- creepTumorCount = UnitGroupCount(creepTumorGroup, c_unitCountAlive);
- if (creepTumorCount != 0) {
- return;
- }
- OrderSetTargetPlacement(ord, p, aiUnit, c_ZB_CreepTumor);
- if (!UnitOrderIsValid(aiUnit, ord)) {
- return;
- }
- AICast(aiUnit, ord, c_noMarker, c_castRetreat);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement