Пример #1
0
        public void Update(PudgeSensorsData data)
        {
            var Location = new Location(data.SelfLocation);

            /*foreach (var rune in data.Map.Runes)
             * {
             *  var curRune = new Rune(rune.Location.X, rune.Location.Y);
             *  if (!graph.edges.ContainsKey(curRune))
             *  {
             *      graph.edges.Add(curRune, curRune.Edges);
             *      graph.runes.Add(curRune);
             *      graph.AddEdges(curRune, true);
             *  }
             * }*/
            var runesAround = graph.runes
                              .Where(x => x.GetDistance(Location) <= PudgeRules.Current.VisibilityRadius - 1);
            var seeRunes     = data.Map.Runes.Select(x => new Rune(x.Location.X, x.Location.Y));
            var runesVisited = runesAround
                               .Where(x => !seeRunes.Contains(x));

            foreach (var rune in runesVisited)
            {
                rune.visited = true;
            }
        }
Пример #2
0
        public static bool Search_rune(Node current_node, PudgeSensorsData data)
        {
            bool result = false;

            foreach (var node in current_node.IncidentNodes)
            {
                foreach (var rune in data.Map.Runes)
                {
                    if (rune.Location.X == node.Position.X && rune.Location.Y == node.Position.Y)
                    {
                        switch (rune.Type.ToString())
                        {
                        case "Invisibility":
                            node.Type = NodeType.invisibility;
                            break;

                        case "Haste":
                            node.Type = NodeType.haste;
                            break;

                        case "GoldXP":
                            node.Type = NodeType.bounty;
                            break;
                        }

                        result = true;
                    }
                }
            }

            return(result);
        }
Пример #3
0
        public static DijkstraAnswer InvestigateWorld(PudgeSensorsData data, Graph graph, IEnumerable <Point2D> runes, WorldInfo visited, List <Node> excluded)
        {
            var toGo = new List <DijkstraAnswer>();

            foreach (var rune in runes)
            {
                if (visited.HashSet.Contains(rune))
                {
                    continue;
                }
                var loc     = data.SelfLocation;
                var minimal = graph.Nodes.Select(x => Movement.GetDistance(x.Location, loc)).Min();
                var start   = graph.Nodes.Where(x => Movement.GetDistance(x.Location, loc) == minimal).Single();
                var finish  = graph.Nodes.Where(x => x.Location == rune).Single();
                if (start != finish)
                {
                    var path = PathFinder.DijkstraAlgo(graph, start, finish, excluded);
                    if (path != null)
                    {
                        toGo.Add(path);
                    }
                }
            }

            if (toGo.Count == 0)
            {
                return(new DijkstraAnswer(new List <Node>(), 0));
            }
            var min    = toGo.Select(x => x.PathLength).Min();
            var choice = toGo.Where(x => x.PathLength == min).First();

            return(choice);
        }
Пример #4
0
        public static PudgeSensorsData GoTo(this PudgeClientLevel3 client, PudgeSensorsData data, Point2D end, WorldInfo visited, WorldInfo killed)
        {
            var old      = data.SelfLocation;
            var dx       = end.X - data.SelfLocation.X;
            var dy       = end.Y - data.SelfLocation.Y;
            var distance = Movement.GetDistance(dx, dy);

            data = client.RotateTo(data, dx, dy);
            data = MoveByLine(client, data, distance, visited, killed);
            if (!data.IsDead)
            {
                if (!AfterHook && Movement.ApproximatelyEqual(old, data.SelfLocation, 2))
                {
                    data = client.Rotate(180);
                    data = client.MoveByLine(data, 10, visited, killed);
                    visited.Check(data.WorldTime);
                    killed.Check(data.WorldTime);
                }
                AfterHook = false;
                if (!Movement.ApproximatelyEqual(data.SelfLocation, end, 7))
                {
                    return(client.GoTo(data, end, visited, killed));
                }
            }
            return(data);
        }
Пример #5
0
 public static void PrintData(PudgeSensorsData data)
 {
     Console.WriteLine("---------------------------------");
     if (data.IsDead)
     {
         Console.WriteLine("Ooops, i'm dead :(");
         return;
     }
     Console.WriteLine("I'm here: " + data.SelfLocation);
     Console.WriteLine("My score now: {0}", data.SelfScores);
     Console.WriteLine("Current time: {0:F}", data.WorldTime);
     foreach (var rune in data.Map.Runes)
     {
         Console.WriteLine("Rune! Type: {0}, Size = {1}, Location: {2}", rune.Type, rune.Size, rune.Location);
     }
     foreach (var heroData in data.Map.Heroes)
     {
         Console.WriteLine("Enemy! Type: {0}, Location: {1}, Angle: {2:F}", heroData.Type, heroData.Location,
                           heroData.Angle);
     }
     foreach (var eventData in data.Events)
     {
         Console.WriteLine("I'm under effect: {0}, Duration: {1}", eventData.Event,
                           eventData.Duration - (data.WorldTime - eventData.Start));
     }
     Console.WriteLine("---------------------------------");
     Console.WriteLine();
 }
Пример #6
0
 public void UpdateData(PudgeSensorsData data)
 {
     this.data    = data;
     decider.data = data;
     while (data.IsDead)
     {
         UpdateData(client.Wait(PudgeRules.Current.PudgeRespawnTime));
     }
     //graphUpdater.Update(data);
 }
Пример #7
0
 public static double AngleToVictim(PudgeSensorsData data, Pudge pudge, PudgeClientLevel3 client)
 {
     foreach (var enemy in data.Map.Heroes)
     {
         var targetRotate = new Vector(new Node(new Point((int)data.SelfLocation.X, (int)data.SelfLocation.Y)),
                                       new Node(new Point((int)enemy.Location.X, (int)enemy.Location.Y)));
         var rotationAngle = GetRotationAngle(pudge.Direction, targetRotate);
         return(rotationAngle);
     }
     return(0);
 }
Пример #8
0
        public PudgeIntellect(PudgeClient <PudgeSensorsData> client, IEnumerable <Point> trees)
        {
            Client = client;
            Client.SensorDataReceived += data => this.data = data;
            Client.SensorDataReceived += PrintData;

            Trees          = trees.ToArray();
            Graph          = BuildWaypointsGraph().ToArray();
            RunesUsedCount = new Dictionary <Point, int>();
            InitRunesUsedCount();
        }
Пример #9
0
        public static double FindAngle(PudgeSensorsData data, double dx, double dy)
        {
            var angle  = Math.Atan2(dy, dx) * 180 / Math.PI;
            var rAngle = (angle - data.SelfLocation.Angle) % 360;

            if (Math.Abs(rAngle) > 180)
            {
                rAngle -= Math.Sign(rAngle) * 360;
            }
            return(rAngle);
        }
Пример #10
0
 public static string CheckEnemy(PudgeSensorsData data)
 {
     if (data.Map.Heroes.Select(x => x.Type).Contains(HeroType.Pudge))
     {
         return("Pudge");
     }
     else if (data.Map.Heroes.Select(x => x.Type).Contains(HeroType.Slardar) &&
              !data.Events.Select(x => x.Event).Contains(PudgeEvent.Invisible))
     {
         return("Slardar");
     }
     return("");
 }
Пример #11
0
 MyPudge(PudgeSensorsData data)
 {
     foreach (var effect in data.Events)
     {
         if (effect.ToString() == "Hasted")
         {
             hasteStart    = effect.Start;
             hasteDuration = effect.Duration;
         }
         if (effect.ToString() == "Invisible")
         {
             inviseStart    = effect.Start;
             inviseDuration = effect.Duration;
         }
     }
 }
Пример #12
0
        public static PudgeSensorsData HookEnemy(PudgeClientLevel3 client, PudgeSensorsData data)
        {
            var old   = data.SelfLocation;
            var enemy = data.Map.Heroes.Where(x => x.Type == HeroType.Slardar || x.Type == HeroType.Pudge).Single();
            var dx    = enemy.Location.X - data.SelfLocation.X;
            var dy    = enemy.Location.Y - data.SelfLocation.Y;
            var angle = Movement.FindAngle(data, dx, dy);

            data      = client.Rotate(angle);
            data      = client.Hook();
            AfterHook = !AfterHook;
            data      = client.Rotate(-angle);
            while (data.Events.Select(x => x.Event).Contains(PudgeEvent.HookThrown))
            {
                data = client.Wait(0.05);
            }
            return(data);
        }
Пример #13
0
 public Mover(Graph graph, PudgeSensorsData data, PudgeClientLevel2 client)
 {
     decider      = new Decider(graph, data, seenNetwork);
     pathFinder   = new PathFinder(graph);
     graphUpdater = new GraphUpdater(graph);
     graphUpdater.Update(data);
     this.graph     = graph;
     this.data      = data;
     this.client    = client;
     executeCommand = new Dictionary <string, Action <Command> >
     {
         { HookCommand.TypeName, x => ExecuteHook((x as HookCommand).Target) },
         { MoveCommand.TypeName, x => ExecuteMove((x as MoveCommand).Destination) },
         { WaitCommand.TypeName, x => ExecuteWait((x as WaitCommand).Time) },
         { LongMoveCommand.TypeName, x => ExecuteLongMove((x as LongMoveCommand).Destination) },
         { LongKillMoveCommand.TypeName, x => ExecuteLongKillMove((x as LongKillMoveCommand).Destination, out hooked) },
         { MoveAndReturnCommand.TypeName, x => ExecuteMoveAndReturn((x as MoveAndReturnCommand).Destination) },
         { HookAroundCommand.TypeName, x => ExecuteHookAround() },
         { MeetSlardarCommand.TypeName, x => ExecuteMeetSlardar((x as MeetSlardarCommand).Destination) }
     };
 }
Пример #14
0
        public static PudgeSensorsData PartWalking(PudgeSensorsData data, PudgeClientLevel3 client, IEnumerable <Node> path, WorldInfo visited, WorldInfo killed)
        {
            foreach (var node in path)
            {
                visited.Check(data.WorldTime);
                killed.Check(data.WorldTime);
                data = client.GoTo(data, node.Location, visited, killed);
                if (data.IsDead)
                {
                    for (int i = 0; i < 1; i++)
                    {
                        data = client.Wait(PudgeRules.Current.PudgeRespawnTime);
                        visited.Check(data.WorldTime);
                        killed.Check(data.WorldTime);
                    }
                    return(data);
                }
            }
            var destination = path.Last().Location;

            visited.Add(destination);
            data = client.Wait(0.1);
            return(data);
        }
Пример #15
0
 public Pudge(PudgeSensorsData data)
 {
     Location  = new Point((int)data.SelfLocation.X, (int)data.SelfLocation.Y);
     Angle     = data.SelfLocation.Angle;
     Direction = new Vector(new Node(new Point(0, 0)), new Node(new Point(1, 1)));
 }
Пример #16
0
        public static PudgeSensorsData MoveByLine(this PudgeClientLevel3 client, PudgeSensorsData data, double distance, WorldInfo visited, WorldInfo killed)
        {
            double speed;

            if (data.Events.Select(x => x.Event).Contains(PudgeEvent.Hasted))
            {
                var hasteDuration = data.Events.Select(x => x).Where(x => x.Event == PudgeEvent.Hasted).First().Duration;
                if (hasteDuration > distance / 80)
                {
                    speed = 80;
                }
                else
                {
                    speed = distance / (hasteDuration + (distance - hasteDuration * 80) / 40);
                }
            }
            else
            {
                speed = 40;
            }

            var count = Math.Floor((distance / speed) * 4.5);
            var step  = distance / count;

            for (var i = 0; i < count; i++)
            {
                if (data.IsDead)
                {
                    break;
                }
                var check = CheckEnemy(data);
                if (check != "")
                {
                    if (!data.Events.Select(x => x.Event).Contains(PudgeEvent.HookCooldown))
                    {
                        if (check == "Slardar")
                        {
                            killed.Add(SlardarSpots.Where(x => Movement.ApproximatelyEqual(data.SelfLocation, x, 100)).Single());
                        }
                        data = HookEnemy(client, data);
                        break;
                    }
                }
                #region MaybeNextTime
                //if (CheckRune(data))
                //    if (!OnMove)
                //    {
                //        var loc = data.Map.Runes.First().Location;
                //        var min = Points.Select(x => Movement.GetDistance(x, data.SelfLocation)).Min();
                //        var toGo = Points.Where(x => Movement.GetDistance(x, data.SelfLocation) == min).First();
                //        OnMove = !OnMove;
                //        data = client.GoTo(data, toGo, visited);
                //        data = client.GoTo(data, loc, visited);
                //        visited.Add(loc);
                //        OnMove = !OnMove;
                //        break;
                //    }
                #endregion
                data = client.Move(step);
                visited.Check(data.WorldTime);
                killed.Check(data.WorldTime);
            }

            return(data);
        }
Пример #17
0
        public static PudgeSensorsData RotateTo(this PudgeClientLevel3 client, PudgeSensorsData data, double dx, double dy)
        {
            var angle = Movement.FindAngle(data, dx, dy);

            return(client.Rotate(angle));
        }
Пример #18
0
 public static bool CheckRune(PudgeSensorsData data)
 {
     return(data.Map.Runes.Count != 0);
 }
Пример #19
0
 public Decider(Graph graph, PudgeSensorsData data, SeenNetwork network)
 {
     this.data    = data;
     this.graph   = graph;
     this.network = network;
 }