protected override CommandQueueElement RunInternal() { var resp = Client.IssueRequest(Client.RequestBuilder.GetPage(PageType.Fleet, PlanetId)); PlanetResources resources = resp.GetParsedSingle <PlanetResources>(); DetectedShip cargo = resp.GetParsed <DetectedShip>().FirstOrDefault(s => s.Ship == ShipType.LargeCargo); FleetComposition fleet = FleetComposition.ToTransport(resources.Resources); // if on a moon, leave 10% of deuterium, or else no other ship will be able to travel if (resp.GetParsedSingle <OgamePageInfo>().PlanetCoord.Type == CoordinateType.Moon) { fleet.Resources.Deuterium = (int)(fleet.Resources.Deuterium * 0.9f); } int needed = fleet.Ships[ShipType.LargeCargo]; int available = cargo?.Count ?? 0; if (needed > available) { Logger.Instance.Log(LogLevel.Error, $"Not enough Large Cargos on planet: needed {needed}, only {available} available."); return(null); } SendFleetCommand sendFleet = new SendFleetCommand() { Mission = UseDeployment ? MissionType.Deployment : MissionType.Transport, Speed = Speed, PlanetId = PlanetId, Destination = Destination, Fleet = fleet }; sendFleet.Run(); return(null); }
protected override CommandQueueElement RunInternal() { using (Client.EnterPlanetExclusive(this)) { HttpRequestMessage req; ResponseContainer resp; req = Client.RequestBuilder.GetPage(PageType.JumpGate, PlanetId); resp = Client.IssueRequest(req); if (Fleet == null) { Fleet = FleetComposition.FromDetected(resp.GetParsed <DetectedShip>()); } Dictionary <string, string> postParams = new Dictionary <string, string>(); postParams["token"] = resp.GetParsedSingle <OgamePageInfo>().OrderToken; postParams["zm"] = Destination.ToString(); postParams.Merge(Fleet.Ships.ToDictionary(s => "ship_" + (int)s.Key, s => s.Value.ToString())); req = Client.RequestBuilder.PostPage(PageType.JumpGateExecute, postParams.ToArray()); resp = Client.IssueRequest(req); } return(null); }
public IEnumerable <Target> GetTargets(IEnumerable <EspionageReport> reports) { var farmsToAttack = reports.Where(m => m.Details.HasFlag(ReportDetails.Defense) && (m.DetectedDefence == null || ((PlanetDefences)m.DetectedDefence).TotalValue == 0) && m.Details.HasFlag(ReportDetails.Ships) && m.DetectedShips == null) .OrderByDescending(m => m.Resources.TotalWithPriority(ResourcePriority)); foreach (EspionageReport farm in farmsToAttack) { if (!AreSlotsAvailable() || !AreCargosAvailable()) { yield break; } Target target = new Target() { Destination = farm.Coordinate, Fleet = FleetComposition.ToPlunder(farm.Resources, Cargo), ExpectedPlunder = FleetComposition.GetPlunder(farm.Resources) }; int ships = target.Fleet.Ships[Cargo]; if (ships < MinimumCargosToSend) { yield break; } _cargoCount -= ships; _slots.Current++; yield return(target); } }
/* Formula: ProbeCount + (ET_Self - ET_Target) * ABS(ET_Self - ET_Target) * <2 Resources * 2 Resources + Fleet * 3 Resources + Fleet + Defense * 5 Resources + Fleet + Defense + Buildings * 7 Resources + Fleet + Defense + Buildings + Research */ public IEnumerable <Target> GetTargets(IEnumerable <EspionageReport> reports) { // Has ships but not defense, just one more probe away return(reports.Where(r => r.Details.HasFlag(ReportDetails.Ships) && !r.Details.HasFlag(ReportDetails.Defense) && ((PlanetShips)r.DetectedShips).TotalValue >= MinValue) .Select(r => new Target { Destination = r.Coordinate, Fleet = FleetComposition.ToSpy(ProbeCount + 1), Mission = MissionType.Espionage })); }
public string Inject(OgamePageInfo info, string body, ResponseContainer response, string host, int port) { if (info?.Page != PageType.Fleet) { return(body); } int cargosNecessary = FleetComposition.ToTransport(response.GetParsedSingle <PlanetResources>().Resources).Ships[ShipType.LargeCargo]; return(largeCargo.Replace(body, $@"$1<span onclick=""toggleMaxShips('#shipsChosen', 203,{cargosNecessary}); checkIntInput('#ship_203', 0, {cargosNecessary}); checkShips('shipsChosen'); event.stopPropagation(); return false;"" style='color: #aaa'>[{cargosNecessary}]</span> $2")); }
public static FleetComposition ParseFleetInfoTable(OGameClient client, HtmlNode fleetInfoContainer) { HtmlNode fleetInfoTable = fleetInfoContainer.SelectSingleNode(".//table[@class='fleetinfo']"); Debug.Assert(fleetInfoTable != null); Dictionary <string, ShipType> revMapShips = client.StringProvider.GetReverseMap <ShipType>(); Dictionary <string, ResourceType> revMapResources = client.StringProvider.GetReverseMap <ResourceType>(); FleetComposition res = new FleetComposition(); Resources resources = new Resources(); HtmlNodeCollection rows = fleetInfoTable.SelectNodes(".//tr"); foreach (HtmlNode row in rows) { HtmlNodeCollection tds = row.SelectNodes(".//td"); if (tds?.Count != 2) { continue; } string name = tds[0].InnerText.Trim().TrimEnd(':'); int count = int.Parse(tds[1].InnerText, NumberStyles.AllowThousands | NumberStyles.Integer, client.ServerCulture); ShipType asShip; ResourceType asResource; if (revMapShips.TryGetValue(name, out asShip)) { res.Ships.AddOrUpdate(asShip, () => count, (type, i) => i + count); } else if (revMapResources.TryGetValue(name, out asResource)) { if (asResource == ResourceType.Metal) { resources.Metal += count; } else if (asResource == ResourceType.Crystal) { resources.Crystal += count; } else if (asResource == ResourceType.Deuterium) { resources.Deuterium += count; } } } res.Resources = resources; return(res); }
protected override CommandQueueElement RunInternal() { _oneWayTrip = TimeSpan.FromSeconds((ReturnTime - DateTimeOffset.Now).TotalSeconds / 2); using (BotDb db = new BotDb()) using (Client.EnterPlanetExclusive(this)) { var resp = Client.IssueRequest(Client.RequestBuilder.GetPage(PageType.Fleet, PlanetId)); var info = resp.GetParsedSingle <OgamePageInfo>(); FleetComposition fleet = FleetComposition.FromDetected(resp.GetParsed <DetectedShip>()); if (!fleet.Ships.ContainsKey(ShipType.Recycler)) { Logger.Instance.Log(LogLevel.Error, "Planet does not have a recycler, cannot fleetsave"); return(null); } fleet.Resources = resp.GetParsedSingle <PlanetResources>().Resources; PlayerResearch research = db.Players.Where(p => p.PlayerId == info.PlayerId).Select(p => p.Research).First(); int fleetSpeed = fleet.Speed(research); Coordinate here = info.PlanetCoord; FleetSaveTarget candidate = CandidateFromSystem(db, here, fleetSpeed) ?? CandidateFromGalaxy(db, here, fleetSpeed); if (candidate != null) { Logger.Instance.Log(LogLevel.Success, $"Best candidate for fleetsave is {candidate.Target} at speed {candidate.Speed}; one way trip {candidate.Duration}"); new SendFleetCommand() { PlanetId = PlanetId, Destination = Coordinate.Create(candidate.Target, CoordinateType.DebrisField), Speed = candidate.Speed, Mission = MissionType.Recycle, Fleet = fleet }.Run(); } else { Logger.Instance.Log(LogLevel.Error, $"Could not find a good candidate for fleetsave"); } } return(null); }
public override IEnumerable <DataObject> ProcessInternal(ClientBase client, ResponseContainer container) { HtmlDocument doc = container.ResponseHtml.Value; HtmlNodeCollection imageFields = doc.DocumentNode.SelectNodes("//div[starts-with(@id, 'fleet')]"); if (imageFields == null) { yield break; } FleetSlotCount count = new FleetSlotCount(); HtmlNode slots = doc.DocumentNode.SelectSingleNode("//div[@id='content']//div[@class='fleetStatus']/span[@class='fleetSlots']"); count.Current = int.Parse(slots.SelectSingleNode("./span[@class='current']").InnerText); count.Max = int.Parse(slots.SelectSingleNode("./span[@class='all']").InnerText); yield return(count); foreach (HtmlNode node in imageFields) { string idText = node.GetAttributeValue("id", null); int id = int.Parse(FleetIdRegex.Match(idText).Groups[1].Value, NumberStyles.AllowThousands | NumberStyles.Integer, client.ServerCulture); FleetMissionDetails missionDetails = FleetUtilityParser.ParseFleetMissionDetails(node); HtmlNode fleetInfo = node.SelectSingleNode(".//span[@class='starStreak']"); FleetComposition composition = FleetUtilityParser.ParseFleetInfoTable((OGameClient)client, fleetInfo); FleetEndpointInfo endpointOrigin = ParseEndpoint(node.SelectSingleNode("./span[@class='originData']")); FleetEndpointInfo endpointDestination = ParseEndpoint(node.SelectSingleNode("./span[@class='destinationData']")); yield return(new FleetInfo { Id = id, ArrivalTime = missionDetails.ArrivalTime, IsReturning = missionDetails.IsReturn, MissionType = missionDetails.Mission, Origin = endpointOrigin, Destination = endpointDestination, Composition = composition }); } }
public override IEnumerable <DataObject> ProcessInternal(ClientBase client, ResponseContainer container) { HtmlDocument doc = container.ResponseHtml.Value; HtmlNodeCollection imageFields = doc.DocumentNode.SelectNodes("//div[starts-with(@id, 'fleet')]"); if (imageFields == null) { yield break; } foreach (HtmlNode node in imageFields) { string idText = node.GetAttributeValue("id", null); int id = int.Parse(FleetIdRegex.Match(idText).Groups[1].Value, NumberStyles.AllowThousands | NumberStyles.Integer, client.ServerCulture); MissionType missionType = (MissionType)node.GetAttributeValue("data-mission-type", 0); bool isReturn = node.GetAttributeValue("data-return-flight", false); int arrivalSec = node.GetAttributeValue("data-arrival-time", 0); DateTimeOffset arrival = DateTimeOffset.FromUnixTimeSeconds(arrivalSec); HtmlNode fleetInfo = node.SelectSingleNode(".//span[@class='starStreak']"); FleetComposition composition = FleetCompositionParser.ParseFleetInfoTable((OGameClient)client, fleetInfo); FleetEndpointInfo endpointOrigin = ParseEndpoint(node.SelectSingleNode("./span[@class='originData']")); FleetEndpointInfo endpointDestination = ParseEndpoint(node.SelectSingleNode("./span[@class='destinationData']")); yield return(new FleetInfo { Id = id, ArrivalTime = arrival, IsReturning = isReturn, MissionType = missionType, Origin = endpointOrigin, Destination = endpointDestination, Composition = composition }); } }