Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 13.75 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using OpenRA.Mods.Common.Activities;
  4. using OpenRA.Mods.Common.AI;
  5. using OpenRA.Mods.Common.Traits;
  6. using OpenRA.Mods.MW.Activities;
  7. using OpenRA.Mods.MW.Traits;
  8. using OpenRA.Traits;
  9.  
  10. namespace OpenRA.Mods.MW.MWAI
  11. {
  12.  
  13.     public class UndeadAIHAndler
  14.     {
  15.         public readonly World World;
  16.         public Player Player { get; private set; }
  17.         public HackyAIInfo hackyAIInfo;
  18.         public HackyAI hackyAI;
  19.  
  20.         // Undead variables
  21.  
  22.         public HashSet<Actor> AcolyteBuilder = new HashSet<Actor>();
  23.         public HashSet<Actor> AcolyteHarvester = new HashSet<Actor>();
  24.  
  25.         readonly Queue<Order> orders = new Queue<Order>();
  26.  
  27.         public UndeadAIHAndler(World w, HackyAIInfo hackinfo, HackyAI hai)
  28.         {
  29.             World = w;
  30.             hackyAIInfo = hackinfo;
  31.             hackyAI = hai;
  32.         }
  33.  
  34.  
  35.         public int CountPeasants()
  36.         {
  37.             return Player.PlayerActor.Trait<PlayerCivilization>().Peasantpopulationvar;
  38.         }
  39.  
  40.         public int CountPossiblePopulation()
  41.         {
  42.             return Player.PlayerActor.Trait<PlayerCivilization>().FreePopulation + Player.PlayerActor.Trait<PlayerCivilization>().Peasantpopulationvar;
  43.         }
  44.  
  45.  
  46.         public int CountPotentialFreeBeds()
  47.         {
  48.             var housactors = World.ActorsHavingTrait<Building>()
  49.                 .Where(a => a.Owner == Player && hackyAIInfo.BuildingCommonNames.Houses.Contains(a.Info.Name));
  50.  
  51.             var potentialpop = 0;
  52.  
  53.             if (housactors.Any() && housactors != null)
  54.             {
  55.                 foreach (var hous in housactors)
  56.                 {
  57.                     var preserv = Player.World.Map.Rules.Actors[hous.Info.Name.Replace(".scaff", string.Empty).ToLower()];
  58.  
  59.                     if (preserv != null && preserv.HasTraitInfo<ProvidesLivingspaceInfo>())
  60.                         potentialpop += preserv.TraitInfo<ProvidesLivingspaceInfo>().Ammount;
  61.                 }
  62.             }
  63.             return potentialpop;
  64.         }
  65.  
  66.         public void GiveOrdersToIdleCultists()
  67.         {
  68.             // Find idle cultist and give them orders:
  69.  
  70.             var Cultists = World.ActorsHavingTrait<Mobile>().Where(a => a.Owner == Player && hackyAIInfo.UndeadCommonNames.Cultists.Contains(a.Info.Name)).ToList();
  71.  
  72.  
  73.             foreach (var cultist in Cultists)
  74.             {
  75.                 if (!cultist.IsIdle)
  76.                     continue;
  77.  
  78.                 var CorruptDeerstand = FindNewDeerstand();
  79.  
  80.                 if (CorruptDeerstand != null)
  81.                     cultist.QueueActivity(new Attack(cultist, Target.FromActor(CorruptDeerstand), true, true, 100));
  82.             }
  83.         }
  84.  
  85.         public Actor FindNewDeerstand()
  86.         {
  87.             var DeerStands = World.ActorsHavingTrait<ISeedableResource>().Where(a => hackyAIInfo.UndeadCommonNames.PrayableDeerStands.Contains(a.Info.Name)).ToList();
  88.  
  89.             if (!DeerStands.Any())
  90.                 return null;
  91.  
  92.             var ClosestDeerStands = DeerStands.OrderBy(a => (a.CenterPosition - Player.World.Map.CenterOfCell(hackyAI.initialBaseCenter)).LengthSquared);
  93.  
  94.             foreach (var stand in ClosestDeerStands)
  95.             {
  96.                 var prayer = World.FindActorsInCircle(stand.CenterPosition, WDist.FromCells(4)).Where(a => a.Owner == Player && hackyAIInfo.UndeadCommonNames.PrayableDeerStands.Contains(a.Info.Name)).Count();
  97.  
  98.                 if (prayer >= 3)
  99.                     continue;
  100.  
  101.                 return stand;
  102.             }
  103.             return null;
  104.         }
  105.  
  106.         public void ManageBuildrAcolytes()
  107.         {
  108.             var pentagrams = World.ActorsHavingTrait<Building>().Where(a => a.Owner == Player && a.Info.Name.Contains(".penta"));
  109.  
  110.             if (AcolyteBuilder.Any() && pentagrams.Any())
  111.             {
  112.                 var BuilderDoNothing = AcolyteBuilder.Where(a => a.IsIdle); //getting an Idle Farmer Acolyte
  113.  
  114.                 if (!BuilderDoNothing.Any())
  115.                     return;
  116.  
  117.                 var preytarget = pentagrams.First();
  118.                 var IdlePreyer = BuilderDoNothing.First();
  119.  
  120.                 //TODO: Acolytes start building
  121.                 if (preytarget != null)
  122.                     IdlePreyer.QueueActivity(new PreyBuild(IdlePreyer, preytarget));
  123.             }
  124.         }
  125.  
  126.         public void ManageVamipres()
  127.         {
  128.  
  129.             foreach (var vamp in hackyAI.activeUnits)
  130.             {
  131.                 var transforms = vamp.TraitOrDefault<Transforms>();
  132.                 if (transforms == null)
  133.                     continue;
  134.                 var aircraft = vamp.TraitOrDefault<Aircraft>();
  135.                 if (aircraft == null)
  136.                     continue;
  137.  
  138.                 if (!vamp.IsIdle)
  139.                     continue;
  140.  
  141.                 vamp.QueueActivity(new Transform(vamp, vamp.Info.TraitInfo<TransformsInfo>().IntoActor));
  142.  
  143.             }
  144.         }
  145.  
  146.         public void ManageFarmerAcolytes()
  147.         {
  148.             if (AcolyteHarvester.Any())
  149.             {
  150.                 var FarmerDoNothing = AcolyteHarvester.Where(a => a.IsIdle); //getting an Idle Farmer Acolyte
  151.  
  152.                 if (!FarmerDoNothing.Any())
  153.                     return;
  154.  
  155.                 var IdleFarmer = FarmerDoNothing.First();
  156.  
  157.                 var ZigguratLv2 = World.ActorsHavingTrait<Building>().Where(a => a.Owner == Player && (hackyAIInfo.UndeadCommonNames.ZigguratLv3.Contains(a.Info.Name) || hackyAIInfo.UndeadCommonNames.ZigguratLv2.Contains(a.Info.Name)));
  158.                 var FarmFields = World.ActorsHavingTrait<ISeedableResource>().Where(a => (hackyAIInfo.UndeadCommonNames.PrayableCrops.Contains(a.Info.Name))).ToHashSet();
  159.                 var IronFields = World.ActorsHavingTrait<ISeedableResource>().Where(a => (hackyAIInfo.UndeadCommonNames.PrayableIron.Contains(a.Info.Name)));
  160.                 var DeerStands = World.ActorsHavingTrait<ISeedableResource>().Where(a => (hackyAIInfo.UndeadCommonNames.PrayableDeerStands.Contains(a.Info.Name)));
  161.  
  162.  
  163.  
  164.                 if (ZigguratLv2 != null && ZigguratLv2.Any())
  165.                     foreach (var aco in IronFields)
  166.                     {
  167.                         FarmFields.Add(aco);
  168.                     }
  169.  
  170.                 foreach (var stand in DeerStands)
  171.                 {
  172.                     foreach (var seed in stand.TraitsImplementing<ISeedableResource>())
  173.                     {
  174.                         if (seed.IsTraitEnabled())
  175.                         {
  176.                             FarmFields.Add(stand);
  177.                         }
  178.                     }
  179.                 }
  180.  
  181.                 // Sort the fields
  182.                 if (FarmFields != null && FarmFields.Any())
  183.                 {
  184.                     var fields = FarmFields.ToList(); // get list of closest possible Fields
  185.                     var closestfields = fields.OrderBy(a => (hackyAIInfo.UndeadCommonNames.PrayableIron.Contains(a.Info.Name) ? ((a.CenterPosition - Player.World.Map.CenterOfCell(hackyAI.initialBaseCenter)).LengthSquared) / 2 : (a.CenterPosition - Player.World.Map.CenterOfCell(hackyAI.initialBaseCenter)).LengthSquared));
  186.  
  187.                     Actor preytarget = null;
  188.  
  189.                     foreach (var scarecrow in closestfields)
  190.                     {
  191.  
  192.                         var surroundingEnemies = Player.World.FindActorsInCircle(scarecrow.CenterPosition, hackyAIInfo.AcolytePrayProximity)
  193.                             .Count(e => e.Info.HasTraitInfo<BuildingInfo>() && Player.Stances[e.Owner] == Stance.Enemy);
  194.  
  195.                         if (surroundingEnemies > 0)
  196.                             continue;
  197.  
  198.                         var OccupyCount = 0;
  199.  
  200.  
  201.                         // Do we have enough resources around to prey?
  202.  
  203.                         var reslay = Player.World.WorldActor.Trait<ResourceLayer>();
  204.                         var getResourceArroundit = Player.World.Map.FindTilesInCircle(scarecrow.Location, 4, true).Where(c => reslay.GetResourceDensity(c) > 0);
  205.                         var NumberOfFullCells = getResourceArroundit.Count();
  206.  
  207.                         if (NumberOfFullCells < hackyAIInfo.MinimumResourceFields) // We want atleast 5 cells filled with resources
  208.                             continue;
  209.  
  210.                         // Get the occupy count
  211.                         foreach (var dock in scarecrow.TraitsImplementing<Dock>())
  212.                         {
  213.                             if (dock.IsBlocked || dock.Reserver != null || !dock.CanAccessDock(IdleFarmer))
  214.                                 OccupyCount++;
  215.                         }
  216.  
  217.  
  218.                         if (OccupyCount < 5)
  219.                         {
  220.                             preytarget = scarecrow;
  221.  
  222.                             break;
  223.                         }
  224.  
  225.                     }
  226.                     if (preytarget != null)
  227.                         IdleFarmer.QueueActivity(new Prey(IdleFarmer, preytarget));
  228.                 }
  229.             }
  230.         }
  231.  
  232.         public void ManageDeadAcolytes()
  233.         {
  234.  
  235.             var deseasedActors = new HashSet<Actor>();
  236.  
  237.             foreach (var aco in AcolyteBuilder)
  238.             {
  239.                 if (aco.IsDead || !aco.IsInWorld)
  240.                     deseasedActors.Add(aco);
  241.             }
  242.             foreach (var aco in AcolyteHarvester)
  243.             {
  244.                 if (aco.IsDead || !aco.IsInWorld)
  245.                     deseasedActors.Add(aco);
  246.             }
  247.  
  248.             foreach (var aco in deseasedActors)
  249.             {
  250.                 if (AcolyteHarvester.Contains(aco))
  251.                     AcolyteHarvester.Remove(aco);
  252.                 if (AcolyteBuilder.Contains(aco))
  253.                     AcolyteBuilder.Remove(aco);
  254.             }
  255.         }
  256.         public void ManageEmptyAcolytes()
  257.         {
  258.  
  259.             var ListedAcolytes = 0;
  260.  
  261.             ListedAcolytes = AcolyteBuilder.Count() + AcolyteHarvester.Count();
  262.  
  263.             var findAcolytes = Player.World.ActorsHavingTrait<AcolytePrey>().Where(a => a.Owner == Player && !AcolyteBuilder.Contains(a) && !AcolyteHarvester.Contains(a)).ToHashSet();
  264.  
  265.             if (ListedAcolytes == 0 && findAcolytes.Any())
  266.             {
  267.                 //AcolyteWorkerRatio
  268.                 var PotentialWorkerNumber = (int)(decimal)(findAcolytes.Count() * hackyAIInfo.AcolyteWorkerRatio) / 100;
  269.  
  270.                 for (int i = 1; i <= PotentialWorkerNumber; i++)
  271.                 {
  272.                     var lyte = findAcolytes.First();
  273.                     if (lyte != null && !lyte.IsDead && lyte.IsInWorld)
  274.                     {
  275.                         AcolyteBuilder.Add(lyte);
  276.                         findAcolytes.Remove(lyte);
  277.                     }
  278.                 }
  279.                 if (findAcolytes.Any())
  280.                 {
  281.                     foreach (var aco in findAcolytes)
  282.                     {
  283.                         if (aco != null && !aco.IsDead && aco.IsInWorld)
  284.                             AcolyteHarvester.Add(aco);
  285.                     }
  286.                 }
  287.             }
  288.             else if (ListedAcolytes > 0 && findAcolytes.Any())
  289.             {
  290.                 foreach (var aco in findAcolytes)
  291.                 {
  292.                     if (aco != null && !aco.IsDead && aco.IsInWorld)
  293.                     {
  294.  
  295.                         var calculatedratio = (int)(decimal)(100 / (AcolyteBuilder.Count() + AcolyteHarvester.Count())) * AcolyteBuilder.Count();
  296.                         if (calculatedratio >= hackyAIInfo.AcolyteWorkerRatio)
  297.                         {
  298.                             AcolyteHarvester.Add(aco);
  299.                         }
  300.                         else
  301.                         {
  302.                             AcolyteBuilder.Add(aco);
  303.                         }
  304.                     }
  305.                 }
  306.             }
  307.         }
  308.  
  309.         public void CheckAllPatchesForProfit()
  310.         {
  311.             // Find Empty Patches and retreat Acolytes from them:
  312.  
  313.             var FarmFields = World.ActorsHavingTrait<ISeedableResource>().Where(a => (hackyAIInfo.UndeadCommonNames.PrayableCrops.Contains(a.Info.Name) || hackyAIInfo.UndeadCommonNames.PrayableIron.Contains(a.Info.Name) || hackyAIInfo.UndeadCommonNames.PrayableDeerStands.Contains(a.Info.Name))).ToHashSet();
  314.             var reslay = Player.World.WorldActor.Trait<ResourceLayer>();
  315.  
  316.             foreach (var crow in FarmFields)
  317.             {
  318.  
  319.                 var doihavepreyers = crow.TraitsImplementing<Dock>().Where(d => d.Reserver != null && d.Reserver.Owner == Player);
  320.  
  321.                 if (doihavepreyers.Count() <= hackyAIInfo.MAxAcolytesOnEmptyPatch)
  322.                 {
  323.  
  324.                     continue;
  325.                 }
  326.                 //BotDebug("AI: Non adequate ammount of acolytes at " + crow.Location + " found, with " + doihavepreyers.Count() + " acolytes");
  327.  
  328.  
  329.                 var getResourceArroundit = Player.World.Map.FindTilesInCircle(crow.Location, 4, true).Where(c => reslay.GetResourceDensity(c) > 0).Count();
  330.  
  331.                 if (getResourceArroundit >= hackyAIInfo.MinimumResourceFields) // We want atleast MinimumResourceFields cells filled with resources
  332.                 {
  333.                     //BotDebug("AI: Enough Cells Found at " + crow.Location + " with " + getResourceArroundit + " cells full resources");
  334.                     continue;
  335.                 }
  336.  
  337.                 var AllowedNumber = 0;
  338.  
  339.                 foreach (var dock in crow.TraitsImplementing<Dock>().Where(d => d.Reserver != null))
  340.                 {
  341.                     if (AllowedNumber >= hackyAIInfo.MAxAcolytesOnEmptyPatch && dock.Reserver.Owner == Player)
  342.                     {
  343.                         //BotDebug("AI: acolyte " + dock.Reserver + " released from duty");
  344.                         dock.Reserver.CancelActivity();
  345.                     }
  346.  
  347.                     AllowedNumber++;
  348.                 }
  349.             }
  350.         }
  351.  
  352.     }
  353. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement