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; }
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); }