CNCMaps.Engine.Map.EngineDetector.PercentageObjectsKnown C# (CSharp) Метод

PercentageObjectsKnown() приватный статический Метод

private static PercentageObjectsKnown ( MapFile mf, VFS vfs, IniFile rules, CNCMaps.Shared.TheaterSettings ths ) : double
mf CNCMaps.FileFormats.Map.MapFile
vfs VFS
rules IniFile
ths CNCMaps.Shared.TheaterSettings
Результат double
        private static double PercentageObjectsKnown(MapFile mf, VFS vfs, IniFile rules, TheaterSettings ths)
        {
            if (rules == null || ths == null) return 0.0;
            var theaterIni = vfs.OpenFile<IniFile>(ths.TheaterIni);
            if (theaterIni == null) return 0.0;

            Func<MapObject, IniFile.IniSection, bool> objectKnown = (obj, section) => {
                if (obj is NamedMapObject) {
                    string name = (obj as NamedMapObject).Name;
                    return section.OrderedEntries.Any(kvp => kvp.Value.ToString().Equals(name, StringComparison.InvariantCultureIgnoreCase));
                }
                else if (obj is NumberedMapObject) {
                    int number = (obj as NumberedMapObject).Number;
                    return section.HasKey(number.ToString());
                }
                return false; // should not happen
            };

            int known = 0;
            int total = 0;

            var tiles = mf.Tiles.Where(t => t != null).DistinctBy(t => t.TileNum);
            var tilesCollection = new TileCollection(ths, vfs.OpenFile<IniFile>(ths.TheaterIni));
            tilesCollection.InitTilesets();
            known += mf.Tiles.Count(o => o.TileNum <= tilesCollection.NumTiles);
            total += mf.Tiles.Count();

            var infs = mf.Infantries.DistinctBy(o => o.Name);
            known += infs.Count(o => objectKnown(o, rules.GetSection("InfantryTypes")));
            total += infs.Count();

            var terrains = mf.Infantries.DistinctBy(o => o.Name);
            known += terrains.Count(o => objectKnown(o, rules.GetSection("TerrainTypes")));
            total += terrains.Count();

            var units = mf.Infantries.DistinctBy(o => o.Name);
            known += units.Count(o => objectKnown(o, rules.GetSection("VehicleTypes")));
            total += units.Count();

            var aircrafts = mf.Aircrafts.DistinctBy(o => o.Name);
            known += aircrafts.Count(o => objectKnown(o, rules.GetSection("AircraftTypes")));
            total += aircrafts.Count();

            var smudges = mf.Smudges.DistinctBy(o => o.Name);
            known += smudges.Count(o => objectKnown(o, rules.GetSection("SmudgeTypes")));
            total += smudges.Count();

            var structures = mf.Structures.DistinctBy(o => o.Name);
            known += structures.Count(o => objectKnown(o, rules.GetSection("BuildingTypes"))
                || objectKnown(o, rules.GetSection("OverlayTypes")));
            total += structures.Count();

            var overlays = mf.Overlays.DistinctBy(o => o.Number);
            known += overlays.Count(o => objectKnown(o, rules.GetSection("OverlayTypes")));
            total += overlays.Count();

            return known / (double)total;
        }