コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
        /* 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
            }));
        }
コード例 #5
0
        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"));
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        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
                });
            }
        }
コード例 #9
0
        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
                });
            }
        }