private void LoadTtFile(string fileName) { //reads TT file using (var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read)) using (var reader = new BinaryReader(stream)) { AirTactics = reader.ReadInt16(); GroundTactics = reader.ReadInt16(); NavalTactics = reader.ReadInt16(); FirstAirTactic = 1; FirstGroundTactic = (short)(1 + AirTactics); FirstNavalTactic = (short)(1 + AirTactics + GroundTactics); TotalTactics = (short)(1 + AirTactics + GroundTactics + NavalTactics); TacticsTable = new TacticData[TotalTactics]; for (var i = 0; i < TacticsTable.Length; i++) { TacticsTable[i] = new TacticData(stream); } } }
internal Dictionary <PlayerData, KeyValuePair <PositionData, SideData> > BestLineUpForTactic(TacticData tactic, BackgroundWorker worker) { // Assumes the selected goalkeeper can't be a better choice at another position. // The side is useless here. PlayerData gkPlayer = GetSquadBestPlayerByPositionAndSide(PlayerData.Instances, PositionData.GK, SideData.C); List <PlayerData> fullSquadWithoutSelectedGk = new List <PlayerData>(PlayerData.Instances); fullSquadWithoutSelectedGk.Remove(gkPlayer); var bestPlayersByPosition = new Dictionary <KeyValuePair <PositionData, SideData>, Dictionary <PlayerData, int> >(); foreach (KeyValuePair <PositionData, SideData> positionAndSide in tactic.Positions) { if (bestPlayersByPosition.ContainsKey(positionAndSide)) { continue; } bestPlayersByPosition.Add(positionAndSide, fullSquadWithoutSelectedGk .Select(p => new Tuple <PlayerData, int>(p, p.GlobalRate * p.Positions[positionAndSide.Key] * p.Sides[positionAndSide.Value])) .OrderByDescending(p => p.Item2) .ToDictionary(p => p.Item1, p => p.Item2)); } var linesUp = new ConcurrentDictionary <Dictionary <PlayerData, KeyValuePair <PositionData, SideData> >, int>(); System.Threading.Tasks.Parallel.For(0, _parallelSequences.Count, (int i) => { var subBestLineUp = new Dictionary <PlayerData, KeyValuePair <PositionData, SideData> >(); // NB : the line-up rate doesn't include the GK (it's not required). int subBestLineUpRate = 0; int count = 0; foreach (HashSet <int> sequence in _parallelSequences[i]) { count++; if (count % 10000 == 0 && i == 0) { worker.ReportProgress(Convert.ToInt32(count / (decimal)_parallelSequences[i].Count * 100)); } var currentLineUp = new Dictionary <PlayerData, KeyValuePair <PositionData, SideData> >(); int currentLineUpRate = 0; foreach (int tacticTupleIndex in sequence) { KeyValuePair <PositionData, SideData> tacticTuple = tactic.PositionAt(tacticTupleIndex); PlayerData pickP = null; int valueP = -1; foreach (PlayerData currentP in bestPlayersByPosition[tacticTuple].Keys) { if (!currentLineUp.ContainsKey(currentP)) { pickP = currentP; valueP = bestPlayersByPosition[tacticTuple][currentP]; break; } } if (pickP != null) { currentLineUpRate += valueP; } currentLineUp.Add(pickP, tacticTuple); } if (currentLineUpRate > subBestLineUpRate) { subBestLineUp = currentLineUp; subBestLineUpRate = currentLineUpRate; } } if (!linesUp.TryAdd(subBestLineUp, subBestLineUpRate)) { throw new NotImplementedException(); } }); var bestLineUp = linesUp.OrderByDescending(kvp => kvp.Value).First().Key; bestLineUp.Add(gkPlayer, new KeyValuePair <PositionData, SideData>(PositionData.GK, SideData.C)); return(bestLineUp); }