Advertisement
Guest User

Untitled

a guest
Dec 17th, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.02 KB | None | 0 0
  1. //--------------------------------------------------------------------------------------------------
  2. //  *** Tactical Zerg AI ***
  3. //--------------------------------------------------------------------------------------------------
  4.  
  5.  
  6. //--------------------------------------------------------------------------------------------------
  7. //  *** QUEEN ***
  8. //--------------------------------------------------------------------------------------------------
  9.  
  10. //--------------------------------------------------------------------------------------------------
  11. order Transfusion (int player, unit aiUnit, marker mark) {
  12.     order ord;
  13.     unitgroup group;
  14.     aifilter filter;
  15.  
  16.     if (AIPlayerDifficulty(player) < c_campAdvanced) {
  17.         return null;
  18.     }
  19.  
  20.     ord = AICreateOrder(player, c_AB_Transfusion, 0);
  21.     if (!UnitOrderIsValid(aiUnit, ord)) {
  22.         return null;
  23.     }
  24.  
  25.     group = AIFindUnits(player, null, UnitGetPosition(aiUnit),
  26.                         AIAbilityFixed(player, c_AB_Transfusion, c_fieldRange0) + 1,
  27.                         c_noMaxCount)
  28.     ;
  29.  
  30.     filter = AIFilter(player);
  31.     AISetFilterAlliance(filter, c_playerGroupAlly);
  32.     AISetFilterMarker(filter, c_noMarkersMin, c_noMarkersMax, mark);
  33.     AISetFilterLifeLost(filter, AIEffectFixed(player, c_EF_Transfusion, c_fieldEffectChange0) - 20, c_noMax);
  34.     group = AIGetFilterGroup(filter, group);
  35.     if (group == null) {
  36.         return null;
  37.     }
  38.  
  39.  
  40.     return AIUnitGroupGetValidOrder(group, ord, aiUnit, c_forwards);
  41. }
  42.  
  43. //--------------------------------------------------------------------------------------------------
  44. const int maxLarva = 32;
  45. order SpawnLarva (int player, unit aiUnit) {
  46.     order ord;
  47.     unitgroup hatcheries;
  48.     int larvaCount;
  49.  
  50.     //  Only cast if idle.
  51.     //
  52.     if (UnitOrder(aiUnit, 0) != null) {
  53.         return null;
  54.     }
  55.  
  56.     ord = AICreateOrder(player, c_AB_SpawnMutantLarva, 0);
  57.     if (!UnitOrderIsValid(aiUnit, ord)) {
  58.         return null;
  59.     }
  60.  
  61.     //  Don't cast if we already own at least 32 larva
  62.     //
  63.     larvaCount = TechTreeUnitCount(player, c_ZU_Larva, c_techCountQueuedOrBetter);
  64.     if (larvaCount >= maxLarva) {
  65.         return null;
  66.     }
  67.  
  68.     hatcheries = AIFindUnits(player,
  69.                              c_ZB_Hatchery_Alias,
  70.                              UnitGetPosition(aiUnit),
  71.                              15,
  72.                              c_noMaxCount)
  73.                              ;
  74.     return AIUnitGroupGetValidOrder(hatcheries, ord, aiUnit, c_backwards);
  75. }
  76.  
  77. //--------------------------------------------------------------------------------------------------
  78. order CreepTumor (int player, unit aiUnit) {
  79.  
  80.     order ord;
  81.     point p;
  82.    
  83.     unitgroup creepTumorGroup;
  84.     int creepTumorCount;
  85.  
  86.     //if (AIIsCampaign(player)) {
  87.     //    return null;
  88.     //}
  89.  
  90.     //  Only cast if idle.
  91.     //
  92.     if (UnitOrder(aiUnit, 0) != null) {
  93.         return null;
  94.     }
  95.    
  96.     // Save at least 25 energy for spawn larva
  97.     if (UnitGetPropertyInt(aiUnit, c_unitPropEnergy, c_unitPropCurrent) <= 50) {
  98.         return null;
  99.     }
  100.  
  101.     ord = AICreateOrder(player, c_AB_QueenBuild, 0);
  102.     if (!UnitOrderIsValid(aiUnit, ord)) {
  103.         return null;
  104.     }
  105.  
  106.     //  Don't cast if there is no creep point set for this player.
  107.     p = AIGetBestCreepSpot(player, aiUnit, 30);
  108.     if (p == null) {
  109.         return null;
  110.     }
  111.    
  112.     // Don't create large clusters of tumors
  113.     creepTumorGroup =     UnitGroup(c_ZB_CreepTumor, player, RegionCircle(p, 10),
  114.                             UnitFilter(0, 0, (1 << c_targetFilterMissile), (1 << (c_targetFilterDead - 32)) | (1 << (c_targetFilterHidden - 32))), 0);
  115.     UnitGroupAddUnitGroup(creepTumorGroup,
  116.                         UnitGroup(c_ZB_CreepTumorBurrowed, player, RegionCircle(p, 10),
  117.                             UnitFilter(0, 0, (1 << c_targetFilterMissile), (1 << (c_targetFilterDead - 32)) | (1 << (c_targetFilterHidden - 32))), 0));
  118.    
  119.     creepTumorCount = UnitGroupCount(creepTumorGroup, c_unitCountAlive);
  120.    
  121.     if (creepTumorCount != 0) {
  122.         return null;
  123.     }
  124.  
  125.     OrderSetTargetPlacement(ord, p, aiUnit, c_ZB_CreepTumor);
  126.     if (!UnitOrderIsValid(aiUnit, ord)) {
  127.         return null;
  128.     }
  129.  
  130.     return ord;
  131. }
  132.  
  133. //--------------------------------------------------------------------------------------------------
  134. void AIThinkQueen (int player, unit aiUnit, unitgroup scanGroup) {
  135.     order ord;
  136.     unit heal;
  137.     marker mark;
  138.    
  139.     // burrow
  140.     // Burrowing is not working as intended, so commenting for now
  141.     // if (AIUnitGetWave(aiUnit) == null || UnitGroupCount((AIWaveGetUnits(AIUnitGetWave(aiUnit))), c_unitCountAlive) > 1 ) {
  142.         // if (AIEvalTacticalData(aiUnit, null)) {
  143.             // return;
  144.         // }
  145.     // }
  146.    
  147.     //ord = SpawnLarva(player, aiUnit);
  148.     //if (ord != null) {
  149.     //    AICast(aiUnit, ord, c_noMarker, c_castHold);
  150.     //    return;
  151.     //}
  152.     mark = AIMarker(aiUnit, c_MK_Transfusion);
  153.     ord = Transfusion(player, aiUnit, mark);
  154.     if (ord != null) {
  155.         AICast(aiUnit, ord, mark, c_castHold);
  156.         return;
  157.     }
  158.     ord = CreepTumor(player, aiUnit);
  159.     if (ord != null) {
  160.         AICast(aiUnit, ord, c_noMarker, c_castRetreat);
  161.         return;
  162.     }
  163. }
  164.  
  165. //--------------------------------------------------------------------------------------------------
  166. //  *** CREEP TUMOR ***
  167. //--------------------------------------------------------------------------------------------------
  168. void AIThinkCreepTumor (int player, unit aiUnit, unitgroup scanGroup) {
  169.     order ord;
  170.     point p;
  171.    
  172.     unitgroup creepTumorGroup;
  173.     unitgroup creepTumorBurrowedGroup;
  174.     int creepTumorCount;
  175.  
  176.     //if (AIIsCampaign(player)) {
  177.     //    return;
  178.     //}
  179.  
  180.     //  Only cast if idle.
  181.     //
  182.     if (UnitOrder(aiUnit, 0) != null) {
  183.         return;
  184.     }
  185.    
  186.     ord = AICreateOrder(player, c_AB_CreepTumorBuild, 0);
  187.     if (!UnitOrderIsValid(aiUnit, ord)) {
  188.         return;
  189.     }
  190.  
  191.     //  Don't cast if there is no creep point set for this player.
  192.     p = AIGetBestCreepSpot(player, aiUnit, 9);
  193.     if (p == null) {
  194.         return;
  195.     }
  196.    
  197.     // Don't create large clusters of tumors
  198.     creepTumorGroup =     UnitGroup(c_ZB_CreepTumor, player, RegionCircle(p, 5),
  199.                             UnitFilter(0, 0, (1 << c_targetFilterMissile), (1 << (c_targetFilterDead - 32)) | (1 << (c_targetFilterHidden - 32))), 0);
  200.     UnitGroupAddUnitGroup(creepTumorGroup,
  201.                         UnitGroup(c_ZB_CreepTumorBurrowed, player, RegionCircle(p, 5),
  202.                             UnitFilter(0, 0, (1 << c_targetFilterMissile), (1 << (c_targetFilterDead - 32)) | (1 << (c_targetFilterHidden - 32))), 0));
  203.    
  204.     creepTumorCount = UnitGroupCount(creepTumorGroup, c_unitCountAlive);
  205.    
  206.     if (creepTumorCount != 0) {
  207.         return;
  208.     }
  209.  
  210.     OrderSetTargetPlacement(ord, p, aiUnit, c_ZB_CreepTumor);
  211.     if (!UnitOrderIsValid(aiUnit, ord)) {
  212.         return;
  213.     }
  214.  
  215.     AICast(aiUnit, ord, c_noMarker, c_castRetreat);
  216. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement