From 80f25c62c20323fee3077e946cb1ab848d200129 Mon Sep 17 00:00:00 2001 From: 01010100b Date: Mon, 13 Sep 2021 00:07:39 +0200 Subject: [PATCH] feat: gather farms --- Unary/Managers/BuildingManager.cs | 25 +++++++++++++++-- Unary/Managers/EconomyManager.cs | 4 +-- Unary/Operations/GatherOperation.cs | 42 +++++++++++++++++++++++++++- Unary/sheet.ods | Bin 18820 -> 18846 bytes 4 files changed, 66 insertions(+), 5 deletions(-) diff --git a/Unary/Managers/BuildingManager.cs b/Unary/Managers/BuildingManager.cs index e2cde0b..d404c63 100644 --- a/Unary/Managers/BuildingManager.cs +++ b/Unary/Managers/BuildingManager.cs @@ -12,8 +12,8 @@ namespace Unary.Managers { class BuildingManager : Manager { - private static readonly Point[] TC_FARM_DELTAS = new[] { new Point(2, 3), new Point(-1, 3), new Point(3, 0), new Point(3, -3), new Point(-4, 2), new Point(-4, -1), new Point(0, -4), new Point(-3, -4) }; - private static readonly Point[] MILL_FARM_DELTAS = new[] { new Point(-1, 2), new Point(2, -1), new Point(2, 2), new Point(-3, -1), new Point(-1, -3) }; + internal static readonly Point[] TC_FARM_DELTAS = new[] { new Point(2, 3), new Point(-1, 3), new Point(3, 0), new Point(3, -3), new Point(-4, 2), new Point(-4, -1), new Point(0, -4), new Point(-3, -4) }; + internal static readonly Point[] MILL_FARM_DELTAS = new[] { new Point(-1, 2), new Point(2, -1), new Point(2, 2), new Point(-3, -1), new Point(-1, -3) }; private readonly HashSet BuildingFoundations = new HashSet(); private readonly List BuildOperations = new List(); @@ -70,6 +70,26 @@ public IEnumerable GetBuildingPlacements(UnitType building) throw new NotImplementedException(); } + public IEnumerable GetFarmPlacements(Unit dropsite) + { + var deltas = TC_FARM_DELTAS; + if (dropsite[ObjectData.BASE_TYPE] == 68) + { + deltas = MILL_FARM_DELTAS; + } + + foreach (var delta in deltas) + { + var x = dropsite.Position.PointX + delta.X; + var y = dropsite.Position.PointY + delta.Y; + + if (Unary.GameState.Map.IsOnMap(x, y)) + { + yield return Unary.GameState.Map.GetTile(x, y); + } + } + } + internal override void Update() { Unary.GameState.SetStrategicNumber(StrategicNumber.DISABLE_BUILDER_ASSISTANCE, 1); @@ -182,6 +202,7 @@ private void DoBuildOperations() if (builders.Count == 0) { Unary.Log.Info($"Could not find enough builders"); + break; } diff --git a/Unary/Managers/EconomyManager.cs b/Unary/Managers/EconomyManager.cs index 9bac7eb..4c1d10d 100644 --- a/Unary/Managers/EconomyManager.cs +++ b/Unary/Managers/EconomyManager.cs @@ -83,7 +83,7 @@ private void ManageGatherers() Unary.GameState.SetStrategicNumber(StrategicNumber.MAXIMUM_STONE_DROP_DISTANCE, -2); Unary.GameState.SetStrategicNumber(StrategicNumber.MAXIMUM_FOOD_DROP_DISTANCE, -2); - Unary.GameState.SetStrategicNumber(StrategicNumber.MAXIMUM_HUNT_DROP_DISTANCE, 8); + Unary.GameState.SetStrategicNumber(StrategicNumber.MAXIMUM_HUNT_DROP_DISTANCE, -2); Unary.GameState.SetStrategicNumber(StrategicNumber.ENABLE_BOAR_HUNTING, 0); Unary.GameState.SetStrategicNumber(StrategicNumber.LIVESTOCK_TO_TOWN_CENTER, 1); @@ -295,7 +295,7 @@ private void ManageGatherOperations() var free = op.Units.FirstOrDefault(u => u[ObjectData.CARRY] == 0); if (free != null && Unary.Rng.NextDouble() < 0.1) { - free.Target(op.Dropsite.Position); + free.Target(op.Dropsite); op.RemoveUnit(free); } } diff --git a/Unary/Operations/GatherOperation.cs b/Unary/Operations/GatherOperation.cs index b7b8af8..d563f06 100644 --- a/Unary/Operations/GatherOperation.cs +++ b/Unary/Operations/GatherOperation.cs @@ -142,6 +142,7 @@ private void DoFood() UnitCapacity = 0; var units = Units; + units.Sort((a, b) => a[ObjectData.ID].CompareTo(b[ObjectData.ID])); var meat = GetMeat(); if (meat.Count > 0) @@ -182,7 +183,31 @@ private void DoFood() var berries = GetBerries(); UnitCapacity += Math.Min(4, berries.Count * 2); - DoGathering(units, berries); + if (berries.Count > 0) + { + var gatherers = new List(); + for (int i = 0; i < 4; i++) + { + if (units.Count == 0) + { + break; + } + + gatherers.Add(units[0]); + units.RemoveAt(0); + } + DoGathering(gatherers, berries); + } + + var farms = GetFarms(); + UnitCapacity += farms.Count; + for (int i = 0; i < Math.Min(farms.Count, units.Count); i++) + { + if (units[i][ObjectData.TARGET_ID] != farms[i].Id) + { + units[i].Target(farms[i]); + } + } } private List GetMeat() @@ -235,6 +260,21 @@ private List GetBerries() return berries; } + private List GetFarms() + { + var farms = new List(); + foreach (var tile in Unary.BuildingManager.GetFarmPlacements(Dropsite)) + { + var farm = tile.Units.FirstOrDefault(u => u.Targetable && u[ObjectData.CLASS] == (int)UnitClass.Farm); + if (farm != null) + { + farms.Add(farm); + } + } + + return farms; + } + private void DoGathering(List units, List resources) { if (units.Count == 0 || resources.Count == 0) diff --git a/Unary/sheet.ods b/Unary/sheet.ods index ddfcc8a082cba7df7cdb043ccda2d1d32cf6c554..b77a2a62e7211d366a03a1dd19c0587379ec340b 100644 GIT binary patch delta 7752 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 RwO|sMqaq$Ez3lI>{{yvyFckm* delta 7636 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 Z)3HBSPZ?oBAl&~$bC98hN0R(4{ukfL74`rC