private async Task<IReadOnlyList<RaceGridEntry>> FindCandidates(CancellationToken cancellation = default(CancellationToken)) {
var mode = Mode;
// Don’t change anything in Fixed or Manual mode
if (mode == BuiltInGridMode.Custom || mode == BuiltInGridMode.CandidatesManual) {
return null;
}
// Basic mode, just one car
if (mode == BuiltInGridMode.SameCar) {
return _playerCar == null ? new RaceGridEntry[0] : new[] { new RaceGridEntry(_playerCar) };
}
// Other modes require cars list to be loaded
if (!CarsManager.Instance.IsLoaded) {
await CarsManager.Instance.EnsureLoadedAsync();
}
// Another simple mode
if (mode == BuiltInGridMode.CandidatesFiltered) {
return CarsManager.Instance.EnabledOnly.Select(x => new RaceGridEntry(x)).ToArray();
}
// Same group mode
if (mode == BuiltInGridMode.CandidatesSameGroup) {
if (_playerCar == null) return new RaceGridEntry[0];
var parent = _playerCar.Parent ?? _playerCar;
return parent.Children.Prepend(parent).Where(x => x.Enabled).Select(x => new RaceGridEntry(x)).ToArray();
}
// Entry from a JSON-file
if (mode.AffectedByCar && _playerCar == null || mode.AffectedByTrack && _track == null) {
return new RaceGridEntry[0];
}
var candidatesMode = mode as CandidatesGridMode;
if (candidatesMode != null) {
return await Task.Run(() => {
var carsEnumerable = (IEnumerable<CarObject>)CarsManager.Instance.EnabledOnly.ToList();
if (!string.IsNullOrWhiteSpace(candidatesMode.Filter)) {
var filter = StringBasedFilter.Filter.Create(CarObjectTester.Instance, candidatesMode.Filter);
carsEnumerable = carsEnumerable.Where(filter.Test);
}
if (!string.IsNullOrWhiteSpace(candidatesMode.Script)) {
var state = LuaHelper.GetExtended();
if (state == null) throw new InformativeException(ToolsStrings.Common_LuaFailed);
if (mode.AffectedByCar) {
state.Globals[@"selected"] = _playerCar;
}
if (mode.AffectedByTrack) {
state.Globals[@"track"] = _track;
}
var result = state.DoString(PrepareScript(candidatesMode.Script));
if (result.Type == DataType.Boolean && !result.Boolean) return new RaceGridEntry[0];
var fn = result.Function;
if (fn == null) throw new InformativeException(ToolsStrings.RaceGrid_InvalidScriptResult);
carsEnumerable = carsEnumerable.Where(x => fn.Call(x).Boolean);
}
return carsEnumerable.Select(x => new RaceGridEntry(x)).ToArray();
}, cancellation);
}
Logging.Error($"Not supported mode: {mode.Id} ({mode.GetType().Name})");
return new RaceGridEntry[0];
}