public F2ViewModel(SpatialUnit spatialUnit) : base(spatialUnit)
        {
            AddTimestepCommand    = new RelayCommand(AddTimestep);
            RemoveTimestepCommand = new RelayCommand(RemoveTimestep);
            AddYearCommand        = new RelayCommand(AddYear);
            PasteCommand          = new RelayCommand(Paste);

            Timestep     = new ObjectiveResult();
            SelectedYear = Model.Attributes.AssessmentYear;
        }
Exemplo n.º 2
0
        public ObjectiveResult GetNeededTime(List <Objective> objectives, List <Obj_AI_Hero> allies)
        {
            var result = new ObjectiveResult {
                ObjectiveTimes = new float[objectives.Count], Objectives = objectives
            };

            List <Player> players;

            if (allies == null)
            {
                players = HeroManager.Allies.Select(item => new Player {
                    Hero = item, DistanceTime = (CalculateExact ? ObjectiveCommons.GetNeededMoveTimeHeavy(item, objectives.First().GetGameObject().Position) : ObjectiveCommons.GetNeededMoveTime(item, objectives.First().GetGameObject().Position)) - item.AttackRange / item.MoveSpeed
                }).ToList();
            }
            else
            {
                players = allies.Select(item => new Player {
                    Hero = item, DistanceTime = (CalculateExact ? ObjectiveCommons.GetNeededMoveTimeHeavy(item, objectives.First().GetGameObject().Position) : ObjectiveCommons.GetNeededMoveTime(item, objectives.First().GetGameObject().Position)) - item.AttackRange / item.MoveSpeed
                }).ToList();
            }

            for (int i = 0; i < objectives.Count; i++)
            {
                players = players.OrderBy(player => player.DistanceTime).ToList();

                var go      = objectives[i].GetGameObject();
                var health  = go.Health;
                var objTime = 0f;

                //Console.WriteLine(players[0].Hero.ChampionName);

                for (int j = 0; j < players.Count; j++)
                {
                    var dmg = players.Sum(player => player.GetPossibleDmgTo(objectives[i], players[j].DistanceTime));

                    if (dmg > health)
                    {
                        try
                        {
                            var sumdps = players.Sum(player => player.DistanceTime < players[j].DistanceTime ? objectives[i].GetEstimatedDps(player.Hero) : 0);
                            objTime = players[j - 1].DistanceTime + (health) / sumdps;
                            break;
                        }
                        catch (Exception ex)
                        {
                            Console.ForegroundColor = ConsoleColor.Green;

                            Console.WriteLine(ex);
                            Console.ForegroundColor = ConsoleColor.Gray;
                        }
                    }
                    else
                    {
                        health -= dmg;

                        if (j + 1 == players.Count)
                        {
                            var sumdps = players.Sum(player => objectives[i].GetEstimatedDps(player.Hero));
                            objTime = players[j].DistanceTime + health / sumdps;
                        }
                    }
                }

                result.ObjectiveTimes[i] = objTime;
                result.TotalTime        += objTime;

                if (i + 1 < objectives.Count)
                {
                    players.ForEach(player => player.DistanceTime = Math.Max(0, player.DistanceTime - objTime) + objectives[i].GetMeleeDistanceTo(objectives[i + 1]) / player.Hero.MoveSpeed);
                }
            }



            return(result);
        }