private static EngineType DetectEngineFromRules(MapFile mf, IniFile rulesTS, IniFile rulesFS, IniFile rulesRA2, IniFile rulesYR, TheaterSettings theaterTS, TheaterSettings theaterFS, TheaterSettings theaterRA2, TheaterSettings theaterYR, VFS vfsTS, VFS vfsFS, VFS vfsRA2, VFS vfsYR) { double tsScore = PercentageObjectsKnown(mf, vfsTS, rulesTS, theaterTS); double fsScore = PercentageObjectsKnown(mf, vfsFS, rulesFS, theaterFS); double ra2Score = PercentageObjectsKnown(mf, vfsRA2, rulesRA2, theaterRA2); double yrScore = PercentageObjectsKnown(mf, vfsYR, rulesYR, theaterYR); double maxScore = Math.Max(Math.Max(Math.Max(tsScore, fsScore), ra2Score), yrScore); if (maxScore == ra2Score) { return(EngineType.RedAlert2); } else if (maxScore == yrScore) { return(EngineType.YurisRevenge); } else if (maxScore == tsScore) { return(EngineType.TiberianSun); } else if (maxScore == fsScore) { return(EngineType.Firestorm); } return(EngineType.YurisRevenge); // default }
public TileCollection(TheaterType theater, ModConfig config, VirtualFileSystem vfs, IniFile rules, IniFile art, TheaterSettings theaterSettings, IniFile theaterIni = null) : base(CollectionType.Tiles, theater, config, vfs, rules, art) { _theaterSettings = theaterSettings; if (theaterIni == null) { _theaterIni = _vfs.Open <IniFile>(theaterSettings.TheaterIni); if (_theaterIni == null) { Logger.Warn("Unavailable theater loaded, theater.ini not found"); return; } } else { _theaterIni = theaterIni; } #region Set numbers IniFile.IniSection General = _theaterIni.GetSection("General"); ACliffMMPieces = General.ReadShort("ACliffMMPieces", -1); ACliffPieces = General.ReadShort("ACliffPieces", -1); BlackTile = General.ReadShort("BlackTile", -1); BlueMoldTile = General.ReadShort("BlueMoldTile", -1); BridgeBottomLeft1 = General.ReadShort("BridgeBottomLeft1", -1); BridgeBottomLeft2 = General.ReadShort("BridgeBottomLeft2", -1); BridgeBottomRight1 = General.ReadShort("BridgeBottomRight1", -1); BridgeBottomRight2 = General.ReadShort("BridgeBottomRight2", -1); BridgeMiddle1 = General.ReadShort("BridgeMiddle1", -1); BridgeMiddle2 = General.ReadShort("BridgeMiddle2", -1); BridgeSet = General.ReadShort("BridgeSet", -1); BridgeTopLeft1 = General.ReadShort("BridgeTopLeft1", -1); BridgeTopLeft2 = General.ReadShort("BridgeTopLeft2", -1); BridgeTopRight1 = General.ReadShort("BridgeTopRight1", -1); BridgeTopRight2 = General.ReadShort("BridgeTopRight2", -1); ClearTile = General.ReadShort("ClearTile", -1); ClearToBlueMoldLat = General.ReadShort("ClearToBlueMoldLat", -1); ClearToCrystalLat = General.ReadShort("ClearToCrystalLat", -1); ClearToGreenLat = General.ReadShort("ClearToGreenLat", -1); ClearToPaveLat = General.ReadShort("ClearToPaveLat", -1); ClearToRoughLat = General.ReadShort("ClearToRoughLat", -1); ClearToSandLat = General.ReadShort("ClearToSandLat", -1); CliffRamps = General.ReadShort("CliffRamps", -1); CliffSet = General.ReadShort("CliffSet", -1); CrystalCliff = General.ReadShort("CrystalCliff", -1); CrystalTile = General.ReadShort("CrystalTile", -1); DestroyableCliffs = General.ReadShort("DestroyableCliffs", -1); DirtRoadCurve = General.ReadShort("DirtRoadCurve", -1); DirtRoadJunction = General.ReadShort("DirtRoadJunction", -1); DirtRoadSlopes = General.ReadShort("DirtRoadSlopes", -1); DirtRoadStraight = General.ReadShort("DirtRoadStraight", -1); DirtTrackTunnels = General.ReadShort("DirtTrackTunnels", -1); DirtTunnels = General.ReadShort("DirtTunnels", -1); GreenTile = General.ReadShort("GreenTile", -1); HeightBase = General.ReadShort("HeightBase", -1); Ice1Set = General.ReadShort("Ice1Set", -1); Ice2Set = General.ReadShort("Ice2Set", -1); Ice3Set = General.ReadShort("Ice3Set", -1); IceShoreSet = General.ReadShort("IceShoreSet", -1); MMRampBase = General.ReadShort("MMRampBase", -1); MMWaterCliffAPieces = General.ReadShort("MMWaterCliffAPieces", -1); Medians = General.ReadShort("Medians", -1); MiscPaveTile = General.ReadShort("MiscPaveTile", -1); MonorailSlopes = General.ReadShort("MonorailSlopes", -1); PaveTile = General.ReadShort("PaveTile", -1); PavedRoadEnds = General.ReadShort("PavedRoadEnds", -1); PavedRoadSlopes = General.ReadShort("PavedRoadSlopes", -1); PavedRoads = General.ReadShort("PavedRoads", -1); RampBase = General.ReadShort("RampBase", -1); RampSmooth = General.ReadShort("RampSmooth", -1); Rocks = General.ReadShort("Rocks", -1); RoughGround = General.ReadShort("RoughGround", -1); RoughTile = General.ReadShort("RoughTile", -1); SandTile = General.ReadShort("SandTile", -1); ShorePieces = General.ReadShort("ShorePieces", -1); SlopeSetPieces = General.ReadShort("SlopeSetPieces", -1); SlopeSetPieces2 = General.ReadShort("SlopeSetPieces2", -1); SwampTile = General.ReadShort("SwampTile", -1); TrackTunnels = General.ReadShort("TrackTunnels", -1); TrainBridgeSet = General.ReadShort("TrainBridgeSet", -1); Tunnels = General.ReadShort("Tunnels", -1); WaterBridge = General.ReadShort("WaterBridge", -1); WaterCaves = General.ReadShort("WaterCaves", -1); WaterCliffAPieces = General.ReadShort("WaterCliffAPieces", -1); WaterCliffs = General.ReadShort("WaterCliffs", -1); WaterSet = General.ReadShort("WaterSet", -1); WaterfallEast = General.ReadShort("WaterfallEast", -1); WaterfallNorth = General.ReadShort("WaterfallNorth", -1); WaterfallSouth = General.ReadShort("WaterfallSouth", -1); WaterfallWest = General.ReadShort("WaterfallWest", -1); WaterToSwampLat = General.ReadShort("WaterToSwampLat", -1); WoodBridgeSet = General.ReadShort("WoodBridgeSet", -1); #endregion }
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); }
/// <summary>Detect map type.</summary> /// <param name="rules">The rules.ini file to be used.</param> /// <returns>The engine to be used to render this map.</returns> public static EngineType DetectEngineType(MapFile mf) { var vfsTS = new VFS(); var vfsFS = new VFS(); var vfsRA2 = new VFS(); var vfsYR = new VFS(); if (Directory.Exists(VFS.TSInstallDir)) { vfsTS.ScanMixDir(VFS.TSInstallDir, EngineType.TiberianSun); vfsFS.ScanMixDir(VFS.TSInstallDir, EngineType.Firestorm); } if (Directory.Exists(VFS.RA2InstallDir)) { vfsRA2.ScanMixDir(VFS.RA2InstallDir, EngineType.RedAlert2); vfsYR.ScanMixDir(VFS.RA2InstallDir, EngineType.YurisRevenge); } IniFile rulesTS = vfsTS.OpenFile <IniFile>("rules.ini"); IniFile rulesFS = vfsFS.OpenFile <IniFile>("rules.ini"); if (rulesFS != null) { rulesFS.MergeWith(vfsFS.OpenFile <IniFile>("firestrm.ini")); } IniFile rulesRA2 = vfsRA2.OpenFile <IniFile>("rules.ini"); IniFile rulesYR = vfsYR.OpenFile <IniFile>("rulesmd.ini"); TheaterType theater = Theater.TheaterTypeFromString(mf.ReadString("Map", "Theater")); TheaterSettings thsTS = ModConfig.DefaultsTS.GetTheater(theater); TheaterSettings thsFS = ModConfig.DefaultsFS.GetTheater(theater); TheaterSettings thsRA2 = ModConfig.DefaultsRA2.GetTheater(theater); TheaterSettings thsYR = ModConfig.DefaultsYR.GetTheater(theater); if (thsTS != null) { foreach (var f in thsTS.Mixes) { vfsTS.AddFile(f); } } if (thsFS != null) { foreach (var f in thsFS.Mixes) { vfsFS.AddFile(f); } } if (thsRA2 != null) { foreach (var f in thsRA2.Mixes) { vfsRA2.AddFile(f); } } if (thsYR != null) { foreach (var f in thsYR.Mixes) { vfsYR.AddFile(f); } } var ret = DetectEngineFromRules(mf, rulesTS, rulesFS, rulesRA2, rulesYR, thsTS, thsFS, thsRA2, thsYR, vfsTS, vfsFS, vfsRA2, vfsYR); Logger.Debug("Engine type detected as {0}", ret); return(ret); }
public TileCollection(TheaterSettings ths, IniFile theaterIni) : base() { _theaterSettings = ths; _theaterIni = theaterIni; }