diff --git a/TBot/Includes/CalculationService.cs b/TBot/Includes/CalculationService.cs index f45390c9..b7fcd6e3 100644 --- a/TBot/Includes/CalculationService.cs +++ b/TBot/Includes/CalculationService.cs @@ -568,20 +568,48 @@ public decimal CalcOptimalFarmSpeed(Celestial origin, Coordinate destination, Sh return CalcOptimalFarmSpeed(origin.Coordinate, destination, ships, loot, ratio, maxFlightTime, researches, serverData, lfBonuses, playerClass, allyClass); } - public Resources CalcMaxTransportableResources(Ships ships, Resources resources, int hyperspaceTech, ServerData serverData, LFBonuses lfBonuses = null, CharacterClass playerClass = CharacterClass.NoClass, long deutToLeave = 0, int probeCargo = 0) { + public Resources CalcMaxTransportableResources(Ships ships, Resources resources, int hyperspaceTech, ServerData serverData, LFBonuses lfBonuses = null, CharacterClass playerClass = CharacterClass.NoClass, long deutToLeave = 0, int probeCargo = 0, (int Metal, int Crystal, int Deut) rankRess = default) { var capacity = CalcFleetCapacity(ships, serverData, hyperspaceTech, lfBonuses, playerClass, probeCargo); + Resources result = new(); + if (rankRess == default) rankRess = (3, 2, 1); if (resources.TotalResources <= capacity) { return new Resources { Deuterium = resources.Deuterium - deutToLeave, Crystal = resources.Crystal, Metal = resources.Metal }; } else { - if (resources.Deuterium - deutToLeave > capacity) { - return new Resources { Deuterium = capacity }; - } else if (capacity >= resources.Deuterium - deutToLeave && capacity < (resources.Deuterium - deutToLeave + resources.Crystal)) { - return new Resources { Deuterium = resources.Deuterium - deutToLeave, Crystal = (capacity - resources.Deuterium + deutToLeave) }; - } else if (capacity >= (resources.Deuterium - deutToLeave + resources.Crystal) && capacity < resources.TotalResources) { - return new Resources { Deuterium = resources.Deuterium - deutToLeave, Crystal = resources.Crystal, Metal = (capacity - resources.Deuterium + deutToLeave - resources.Crystal) }; - } else - return resources; + resources.Deuterium -= deutToLeave; + if (rankRess.Metal == 1) { + if (resources.Metal > capacity) return new Resources { Metal = capacity }; + else result.Metal = resources.Metal; + } else if (rankRess.Crystal == 1) { + if (resources.Crystal > capacity) return new Resources { Crystal = capacity }; + else result.Crystal = resources.Crystal; + } else if (rankRess.Deut == 1) { + if (resources.Deuterium > capacity) return new Resources { Deuterium = capacity }; + else result.Deuterium = resources.Deuterium; + } + + if (rankRess.Metal == 2) { + if (resources.Metal + result.TotalResources > capacity) return new Resources { Metal = capacity - result.TotalResources, Crystal = result.Crystal, Deuterium = result.Deuterium }; + else result.Metal = resources.Metal; + } else if (rankRess.Crystal == 2) { + if (resources.Crystal + result.TotalResources > capacity) return new Resources { Metal = result.Metal, Crystal = capacity - result.TotalResources, Deuterium = result.Deuterium }; + else result.Crystal = resources.Crystal; + } else if (rankRess.Deut == 2) { + if (resources.Deuterium + result.TotalResources > capacity) return new Resources { Metal = result.Metal, Crystal = result.Crystal, Deuterium = capacity - result.TotalResources }; + else result.Deuterium = resources.Deuterium; + } + + if (rankRess.Metal == 3) { + if (resources.Metal + result.TotalResources > capacity) return new Resources { Metal = capacity - result.TotalResources, Crystal = result.Crystal, Deuterium = result.Deuterium }; + else result.Metal = resources.Metal; + } else if (rankRess.Crystal == 3) { + if (resources.Crystal + result.TotalResources > capacity) return new Resources { Metal = result.Metal, Crystal = capacity - result.TotalResources, Deuterium = result.Deuterium }; + else result.Crystal = resources.Crystal; + } else if (rankRess.Deut == 3) { + if (resources.Deuterium + result.TotalResources > capacity) return new Resources { Metal = result.Metal, Crystal = result.Crystal, Deuterium = capacity - result.TotalResources }; + else result.Deuterium = resources.Deuterium; + } } + return result; } public long CalcShipNumberForPayload(Resources payload, Buildables buildable, int hyperspaceTech, ServerData serverData, float cargoBonus = 0, CharacterClass playerClass = CharacterClass.NoClass, int probeCapacity = 0) { diff --git a/TBot/Includes/ICalculationService.cs b/TBot/Includes/ICalculationService.cs index ab84d941..ad064bee 100644 --- a/TBot/Includes/ICalculationService.cs +++ b/TBot/Includes/ICalculationService.cs @@ -45,7 +45,7 @@ public interface ICalculationService { int CalcMaxPlanets(int astrophysics); int CalcMaxPlanets(Researches researches); bool IsAstrophysicsPositionValid(int pos, int astrophysics); - Resources CalcMaxTransportableResources(Ships ships, Resources resources, int hyperspaceTech, ServerData serverData, LFBonuses lfBonuses = null, CharacterClass playerClass = CharacterClass.NoClass, long deutToLeave = 0, int probeCargo = 0); + Resources CalcMaxTransportableResources(Ships ships, Resources resources, int hyperspaceTech, ServerData serverData, LFBonuses lfBonuses = null, CharacterClass playerClass = CharacterClass.NoClass, long deutToLeave = 0, int probeCargo = 0, (int Metal, int Crystal, int Deut) rankRess = default); long CalcMetalProduction(Buildings buildings, int position, int speedFactor, float ratio = 1, Researches researches = null, LFBonuses lfBonuses = null, CharacterClass playerClass = CharacterClass.NoClass, bool hasGeologist = false, bool hasStaff = false, int crawlers = 0, float crawlerRatio = 1); long CalcMetalProduction(int level, int position, int speedFactor, float ratio = 1, int plasma = 0, float metalLFBonus = 0, CharacterClass playerClass = CharacterClass.NoClass, bool hasGeologist = false, bool hasStaff = false, int crawlers = 0, float crawlerRatio = 1); long CalcMetalProduction(Planet planet, int speedFactor, float ratio = 1, Researches researches = null, CharacterClass playerClass = CharacterClass.NoClass, bool hasGeologist = false, bool hasStaff = false, int crawlers = 0, float crawlerRatio = 1); diff --git a/TBot/Workers/FleetScheduler.cs b/TBot/Workers/FleetScheduler.cs index 860ade9f..9ecfcd9f 100644 --- a/TBot/Workers/FleetScheduler.cs +++ b/TBot/Workers/FleetScheduler.cs @@ -1330,7 +1330,12 @@ public async Task CollectImpl(bool fromTelegram, bool noLimit = } else { ships.Add(preferredShip, tempCelestial.Ships.GetAmount(preferredShip)); } - payload = _calcService.CalcMaxTransportableResources(ships, payload, _tbotInstance.UserData.researches.HyperspaceTechnology, _tbotInstance.UserData.serverData, tempCelestial.LFBonuses, _tbotInstance.UserData.userInfo.Class, _tbotInstance.UserData.serverData.ProbeCargo); + var rankRess = ( Metal: ((int) _tbotInstance.InstanceSettings.Brain.AutoRepatriate.ResourcesRankPriority.Metal <= 0 || (int) _tbotInstance.InstanceSettings.Brain.AutoRepatriate.ResourcesRankPriority.Metal > 3) ? 3 : (int) _tbotInstance.InstanceSettings.Brain.AutoRepatriate.ResourcesRankPriority.Metal, + Crystal: ((int) _tbotInstance.InstanceSettings.Brain.AutoRepatriate.ResourcesRankPriority.Crystal <= 0 || (int) _tbotInstance.InstanceSettings.Brain.AutoRepatriate.ResourcesRankPriority.Crystal > 3) ? 2 : (int) _tbotInstance.InstanceSettings.Brain.AutoRepatriate.ResourcesRankPriority.Crystal, + Deut: ((int) _tbotInstance.InstanceSettings.Brain.AutoRepatriate.ResourcesRankPriority.Deuterium <= 0 || (int) _tbotInstance.InstanceSettings.Brain.AutoRepatriate.ResourcesRankPriority.Deuterium > 3) ? 1 : (int) _tbotInstance.InstanceSettings.Brain.AutoRepatriate.ResourcesRankPriority.Deuterium ); + if (rankRess.Metal == rankRess.Crystal || rankRess.Metal == rankRess.Deut || rankRess.Crystal == rankRess.Deut) + rankRess = ( Metal: 3, Crystal: 2, Deut: 1 ); + payload = _calcService.CalcMaxTransportableResources(ships, payload, _tbotInstance.UserData.researches.HyperspaceTechnology, _tbotInstance.UserData.serverData, tempCelestial.LFBonuses, _tbotInstance.UserData.userInfo.Class, 0, _tbotInstance.UserData.serverData.ProbeCargo, rankRess); if (payload.TotalResources > 0) { var fleetId = await SendFleet(tempCelestial, ships, destinationCoordinate, Missions.Transport, Speeds.HundredPercent, payload); diff --git a/TBot/instance_settings.json b/TBot/instance_settings.json index 6f77812b..2ad47349 100644 --- a/TBot/instance_settings.json +++ b/TBot/instance_settings.json @@ -21,7 +21,7 @@ "Height": 1080, "Timezone": "Europe/London", "Lang": "en" - } + } }, "General": { "Host": "localhost", @@ -343,6 +343,11 @@ "Type": "Moon" } ], + "ResourcesRankPriority": { + "Metal": 3, + "Crystal": 2, + "Deuterium": 1 + }, "TargetAssociateMoon": false, "CargoType": "LargeCargo", "RandomOrder": false,