public object GetPreview(string serializedData) { var ini = IniFile.Parse(serializedData); var result = new StringBuilder(); // input method result.AppendFormat(ControlsStrings.Controls_Preview_InputMethod, ini["HEADER"].GetEntry("INPUT_METHOD", Controls.InputMethods).DisplayName); // device var section = ini["CONTROLLERS"]; var devices = LinqExtension.RangeFrom().Select(x => section.GetNonEmpty("CON" + x.ToInvariantString())).TakeWhile(x => x != null).Distinct().ToList(); if (devices.Count > 1) { result.Append('\n'); result.AppendFormat(ControlsStrings.Controls_Preview_Devices, devices.JoinToString(@", ")); } else if (devices.Count == 1) { result.Append('\n'); result.AppendFormat(ControlsStrings.Controls_Preview_Device, devices[0]); } return(new BbCodeBlock { BbCode = result.ToString() }); }
protected virtual void LoadConditions(IniFile ini) { var conditions = LinqExtension.RangeFrom() .Select(x => $@"CONDITION_{x}") .TakeWhile(ini.ContainsKey) .Select(x => new { Type = ini[x].GetEnumNullable <PlaceConditionsType>("TYPE"), Value = ini[x].GetIntNullable("OBJECTIVE") }) .ToList(); if (conditions.Count != 3 || conditions[0].Type == null || conditions.Any(x => x.Value == null || x.Type != null && x.Type != conditions[0].Type)) { AddError(AcErrorType.Data_KunosCareerConditions, ini["CONDITION_0"].GetNonEmpty("TYPE") ?? @"?"); } else { RemoveError(AcErrorType.Data_KunosCareerConditions); ConditionType = conditions[0].Type.Value; FirstPlaceTarget = conditions[2].Value.Value; SecondPlaceTarget = conditions[1].Value.Value; ThirdPlaceTarget = conditions[0].Value.Value; } }
public static IReadOnlyList <ResolutionEntry> GetResolutions() { if (InitializeAcVideoModes()) { try { return(AcVideoModes.GetResolutionEntries().ToList()); } catch (Exception e) { NonfatalError.Notify(ToolsStrings.AcSettings_CannotGetResolutions, e); } } var d = new User32.DEVMODE(); return(LinqExtension.RangeFrom() .Select(i => User32.EnumDisplaySettings(null, i, ref d) ? new ResolutionEntry(i + 1, d.dmPelsWidth, d.dmPelsHeight, d.dmDisplayFrequency) : null) .TakeWhile(x => x != null).Distinct().ToList()); }
protected override IEnumerable <AcPlaceholderNew> ScanOverride() { if (OptionIgnoreSkippedEvents) { return(base.ScanOverride()); } var entries = Directories.GetContentDirectories().Select(x => new { Name = Path.GetFileName(x)?.ToLowerInvariant(), Path = x }).ToList(); return(LinqExtension.RangeFrom(1) .Select(x => @"event" + x) .Select(x => entries.FirstOrDefault(y => y.Name == x)) .TakeWhile(x => x != null) .Select(dir => CreateAcPlaceholder(Directories.GetId(dir.Path), Directories.CheckIfEnabled(dir.Path)))); }
private void LoadOpponents() { if (Type != KunosCareerObjectType.Championship) { return; } InitializeEventsManager(); var firstEvent = GetFirstEventOrNull(); if (firstEvent == null) { AddError(AcErrorType.Data_KunosCareerEventsAreMissing, DisplayName); } var ini = new IniFile(OpponentsIniFilename); var drivers = LinqExtension.RangeFrom(1).Select(x => $"AI{x}").TakeWhile(ini.ContainsKey).Select(x => ini[x]).Select((section, id) => { var model = section.GetNonEmpty("MODEL"); if (model == null) { Logging.Error($"Section AI{id + 1}: MODEL is required, fallback to default"); model = CarsManager.Instance.GetDefault()?.Id ?? ""; } var skin = section.GetNonEmpty("SKIN"); if (skin == null) { Logging.Error($"Section AI{id + 1}: SKIN is required, fallback to default"); } var car = CarsManager.Instance.GetById(model); CarSkinObject carSkin; if (car == null) { AddError(AcErrorType.Data_KunosCareerCarIsMissing, section.GetNonEmpty("MODEL")); carSkin = null; } else { carSkin = skin == null ? car.GetFirstSkinOrNull() : car.GetSkinByIdFromConfig(skin); if (carSkin == null) { if (!KunosEventObjectBase.OptionIgnoreMissingSkins) { AddError(AcErrorType.Data_KunosCareerCarSkinIsMissing, car.DisplayName, section.GetNonEmpty("SKIN")); } carSkin = (CarSkinObject)car.SkinsManager.WrappersList.RandomElementOrDefault()?.Loaded(); } } return(new ChampionshipDriverEntry { Id = id, Name = section.GetPossiblyEmpty("DRIVER_NAME"), Nationality = section.GetPossiblyEmpty("NATIONALITY"), AiLevel = section.GetInt("AI_LEVEL", 100), SetupId = section.GetPossiblyEmpty("SETUP"), Car = car, CarSkin = carSkin }); }).Prepend(new ChampionshipDriverEntry { Id = -1, Name = SettingsHolder.Drive.PlayerName, Nationality = SettingsHolder.Drive.PlayerNationality, Car = firstEvent?.CarObject, CarSkin = firstEvent?.CarSkin, IsPlayer = true }); ChampionshipDrivers.ReplaceEverythingBy(drivers); }
public async Task <IList <Game.AiCar> > GenerateGameEntries(CancellationToken cancellation = default(CancellationToken)) { if (IsBusy) { await RebuildGridAsync(); if (cancellation.IsCancellationRequested) { return(null); } } var opponentsNumber = OpponentsNumberLimited; if (FilteredView.Count == 0 || opponentsNumber == 0) { return(new Game.AiCar[0]); } var skins = new Dictionary <string, GoodShuffle <CarSkinObject> >(); foreach (var car in FilteredView.OfType <RaceGridEntry>().Where(x => x.CarSkin == null).Select(x => x.Car).Distinct()) { await car.SkinsManager.EnsureLoadedAsync(); if (cancellation.IsCancellationRequested) { return(null); } skins[car.Id] = GoodShuffle.Get(car.EnabledOnlySkins); } NameNationality[] nameNationalities; if (opponentsNumber == 7 && OptionNfsPorscheNames) { nameNationalities = new[] { new NameNationality { Name = "Dylan", Nationality = "Wales" }, new NameNationality { Name = "Parise", Nationality = "Italy" }, new NameNationality { Name = "Steele", Nationality = "United States" }, new NameNationality { Name = "Wingnut", Nationality = "England" }, new NameNationality { Name = "Leadfoot", Nationality = "Australia" }, new NameNationality { Name = "Amazon", Nationality = "United States" }, new NameNationality { Name = "Backlash", Nationality = "United States" } }; } else if (DataProvider.Instance.NationalitiesAndNames.Any()) { nameNationalities = GoodShuffle.Get(DataProvider.Instance.NationalitiesAndNamesList).Take(opponentsNumber).ToArray(); } else { nameNationalities = null; } List <int> aiLevels; if (AiLevelFixed) { aiLevels = null; } else { var aiLevelsInner = from i in Enumerable.Range(0, opponentsNumber) select AiLevelMin + ((opponentsNumber < 2 ? 1d : 1d - i / (opponentsNumber - 1d)) * (AiLevel - AiLevelMin)).RoundToInt(); if (AiLevelArrangeReverse) { aiLevelsInner = aiLevelsInner.Reverse(); } if (Equals(AiLevelArrangeRandom, 1d)) { aiLevelsInner = GoodShuffle.Get(aiLevelsInner); } else if (AiLevelArrangeRandom > 0d) { aiLevelsInner = LimitedShuffle.Get(aiLevelsInner, AiLevelArrangeRandom); } aiLevels = aiLevelsInner.Take(opponentsNumber).ToList(); Logging.Debug("AI levels: " + aiLevels.Select(x => $@"{x}%").JoinToString(@", ")); } IEnumerable <RaceGridEntry> final; if (Mode.CandidatesMode) { var list = FilteredView.OfType <RaceGridEntry>().SelectMany(x => new[] { x }.Repeat(x.CandidatePriority)).ToList(); if (ShuffleCandidates) { var shuffled = GoodShuffle.Get(list); if (_playerCar != null) { var same = list.FirstOrDefault(x => x.Car == _playerCar); if (same != null) { shuffled.IgnoreOnce(same); } } final = shuffled.Take(opponentsNumber); } else { var skip = _playerCar; final = LinqExtension.RangeFrom().Select(x => list.RandomElement()).Where(x => { if (x.Car == skip) { skip = null; return(false); } return(true); }).Take(opponentsNumber); } } else { final = NonfilteredList.Where(x => !x.SpecialEntry); } if (_playerCar != null) { skins.GetValueOrDefault(_playerCar.Id)?.IgnoreOnce(_playerCar.SelectedSkin); } var takenNames = new List <string>(opponentsNumber); return(final.Take(opponentsNumber).Select((entry, i) => { var level = entry.AiLevel ?? aiLevels?[i] ?? 100; var skin = entry.CarSkin; if (skin == null) { skin = skins.GetValueOrDefault(entry.Car.Id)?.Next; } var name = entry.Name; if (string.IsNullOrWhiteSpace(name) && SettingsHolder.Drive.QuickDriveUseSkinNames) { var skinDriverNames = skin?.DriverName?.Split(',').Select(x => x.Trim()).Where(x => x.Length > 0).ToList(); if (skinDriverNames?.Count > 0) { name = GoodShuffle.Get(skinDriverNames).Take(skinDriverNames.Count).FirstOrDefault(x => !takenNames.Contains(x)) ?? name; takenNames.Add(name); } } if (string.IsNullOrWhiteSpace(name)) { name = nameNationalities?[i].Name ?? @"AI #" + i; takenNames.Add(name); } var nationality = entry.Nationality ?? nameNationalities?[i].Nationality ?? @"Italy"; var skinId = skin?.Id; return new Game.AiCar { AiLevel = level, CarId = entry.Car.Id, DriverName = AiLevelInDriverName ? $@"{name} ({level}%)" : name, Nationality = nationality, Setup = "", SkinId = skinId }; }).ToList()); }
public static IEnumerable <string> GetSectionNames(string prefixName, int startFrom) { return(LinqExtension.RangeFrom(startFrom == -1 ? 0 : startFrom) .Select(x => startFrom == -1 && x == 0 ? prefixName : $"{prefixName}_{x}")); }