public static bool Load(IConfigurable target, string iniFile) { Debug.WriteLine("Loading configuration file " + iniFile); // Reset to default target.ResetParameters(); try { // Load custom settings from INI file using (var ini = new IniReader(iniFile, true)) { ini.AddHandler((x) => { if (target.AcceptsConfigs.Any(y => y == x.Group)) { target.ApplyParameter(x); } }); ini.Parse(); } return(true); } catch { Debug.WriteLine("Failed to load configuration from " + iniFile); } return(false); // DONE :) }
public void TestRFM() { var readCalls = 0; var data = new Dictionary <string, List <string> >(); var reader = new IniReader(TestConstants.TestFolder + "F1CTDP05.rfm"); reader.AddHandler(x => { string group = x.NestedGroupName + "." + x.Key; // Do some ReadAs() tests. if (x.Key == "VehiclesDir") { Assert.AreEqual(@"GAMEDATA\VEHICLES\CTDP\", x.ReadAsString()); } if (x.Key == "PitGroup" && data.ContainsKey(group) == false) // do only on first entriy { Assert.AreEqual(new string[2] { "2", "Group1" }, x.ReadAsStringArray()); } if (data.ContainsKey(group)) { data[group].Add(x.RawValue); } else { data.Add(group, new List <string>(new[] { x.RawValue })); } readCalls++; Debug.WriteLine(group + "=" + x.RawValue); }); reader.Parse(); Assert.AreEqual(144, readCalls); Assert.True(data.ContainsKey("Main.SceneOrder.")); Assert.AreEqual(12, data["Main.SceneOrder."].Count); Assert.True(data.ContainsKey("Main.Season = CTDP F1 2005.SceneOrder.")); Assert.AreEqual(14, data["Main.Season = CTDP F1 2005.SceneOrder."].Count); Assert.True(data.ContainsKey("Main.PitGroupOrder.PitGroup")); Assert.AreEqual(17, data["Main.PitGroupOrder.PitGroup"].Count); Assert.AreEqual("CTDP F1 2005", data["Main.Mod Name"][0]); Assert.AreEqual("*", data["Main.Track Filter"][0]); Assert.AreEqual("39001", data["Main.Matchmaker TCP Port"][0]); }
public void TestTupleReadout() { var reader = new IniReader(TestConstants.TestFolder + "MP420_engine.ini"); reader.AddHandler(x => { if (x.Key == "IdleRPMLogic") { Assert.AreEqual(3900.0f, x.ReadAsFloat(0)); Assert.AreEqual(4100.0f, x.ReadAsFloat(1)); } if (x.Key == "LaunchEfficiency") { Assert.AreEqual(0.92f, x.ReadAsFloat()); x.ReadAsFloat(0); // shouldn't reach this Assert.Fail("Exception failed"); } }); reader.Parse(); }
public void TestEngine() { var rpmTorques = 0; var reader = new IniReader(TestConstants.TestFolder + "MP420_engine.ini"); reader.AddHandler(x => { Debug.WriteLine(x.NestedGroupName + "." + x.Key + "=" + x.RawValue); if (x.Key == "RPMTorque") { rpmTorques++; switch (rpmTorques) { case 1: Assert.AreEqual(0.0f, x.ReadAsFloat(0)); Assert.AreEqual(-37.0f, x.ReadAsFloat(1)); Assert.AreEqual(-37.0f, x.ReadAsFloat(2)); break; case 33: Assert.AreEqual(16000.0f, x.ReadAsFloat(0)); Assert.AreEqual(-163.7f, x.ReadAsFloat(1)); Assert.AreEqual(353.5f, x.ReadAsFloat(2)); break; case 34: Assert.AreEqual(16500.0, x.ReadAsDouble(0)); Assert.AreEqual(-169.9, x.ReadAsDouble(1)); Assert.AreEqual(350.8, x.ReadAsDouble(2)); break; case 35: Assert.AreEqual(17000, x.ReadAsDouble(0)); Assert.AreEqual(17000, x.ReadAsInteger(0)); Assert.AreEqual(-176.3, x.ReadAsDouble(1)); Assert.AreEqual(348.4, x.ReadAsDouble(2)); break; case 47: Assert.AreEqual(23000.0f, x.ReadAsFloat(0)); Assert.AreEqual(-401.9f, x.ReadAsFloat(1)); Assert.AreEqual(-294.3f, x.ReadAsFloat(2)); break; default: // Don't care about the others... break; } } if (x.Key == "FuelConsumption") { float v = 2.755f / 100000.0f; Assert.AreEqual(v, x.ReadAsFloat()); } if (x.Key == "SpeedLimiter") { Assert.AreEqual(1, x.ReadAsInteger()); } if (x.Key == "OnboardStarter") { Assert.AreEqual(0, x.ReadAsInteger()); } }); reader.Parse(); Assert.AreEqual(47, rpmTorques); }
public Car Get(string id) { string vehFile = path + id; // Helpers for other car parts. var hdvFile = ""; var engFile = ""; var engineName = ""; var engineManufacturer = ""; string team = "", driver = "", description = ""; int number = 0; var classes = new List <string>(); Debug.WriteLine("Car::Get(\"" + id + "\")"); // Parse Vehicle File using (var vehIni = new IniReader(vehFile, true)) { vehIni.AddHandler(x => { if (x.Key == "Team") { team = x.ReadAsString(); } if (x.Key == "Driver") { driver = x.ReadAsString(); } if (x.Key == "Description") { description = x.ReadAsString(); } if (x.Key == "Number") { number = x.ReadAsInteger(); } if (x.Key == "Classes") { classes.AddRange(x.ReadAsStringArray()); } if (x.Key == "HDVehicle") { hdvFile = x.ReadAsString(); } if (x.Key == "Engine") { engineName = x.ReadAsString(); } if (x.Key == "Manufacturer") { engineManufacturer = x.ReadAsString(); } }); vehIni.Parse(); } // Create car object var carObj = new Car(id, team, driver, description, number); carObj.Assign(classes); hdvFile = SearchHDV(hdvFile); if (hdvFile == string.Empty) { throw new Exception("could not build this car, hdv file not found"); } // Create other objects. using (var hdvIni = new IniReader(hdvFile, true)) { hdvIni.AddHandler(x => { if (x.Key == "Normal" && x.Group == "ENGINE") { engFile = x.ReadAsString(); } }); hdvIni.Parse(); } engFile = SearchIni(engFile); if (engFile == string.Empty) { throw new Exception("could not build this car, engine file not found"); } carObj.Assign(BuildEngine(engFile, engineName, engineManufacturer)); return(carObj); }
private Engine BuildEngine(string file, string name, string manufacturer) { var idleRpm = new Range(0, 0); var maximumRpm = new Range(0, 0); var engineMode = new List <EngineMode>(); var engineTorque = new List <EngineTorque>(); // temporary helpers var lifetimeTime = new NormalDistrbution(0, 0); var lifetimeRpm = new NormalDistrbution(0, 0); var lifetimeOil = new NormalDistrbution(0, 0); var lifetimeLength = 0.0f; var engineBoostModes = 0.0f; var engineBoostScale = new Range(0, 0); var engineBoostRpm = 0.0f; var engineBoostFuel = 0.0f; var engineBoostWear = 0.0f; var engineBoostTorque = 0.0f; var engineBoostPower = 0.0f; using (var engFile = new IniReader(file, true)) { engFile.AddHandler(x => { if (x.Key == "RPMTorque") { engineTorque.Add(new EngineTorque(x.ReadAsFloat(0), x.ReadAsFloat(1), x.ReadAsFloat(2))); } if (x.Key == "IdleRPMLogic") { idleRpm = new Range(x.ReadAsFloat(0), x.ReadAsFloat(1)); } if (x.Key == "RevLimitRange") { var minRpm = x.ReadAsFloat(0); var slopeRpm = x.ReadAsFloat(1); var rpmSlopeSettings = x.ReadAsInteger(2); var maxRpm = minRpm + slopeRpm * rpmSlopeSettings; maximumRpm = new Range(minRpm, maxRpm, 0, slopeRpm); } if (x.Key == "EngineBoostRange") { engineBoostModes = x.ReadAsInteger(2); engineBoostScale = new Range(x.ReadAsFloat(0), x.ReadAsFloat(1)); } if (x.Key == "BoostEffects") { engineBoostRpm = x.ReadAsFloat(0); engineBoostFuel = x.ReadAsFloat(1); engineBoostWear = x.ReadAsFloat(2); } if (x.Key == "BoostTorque") { engineBoostTorque = x.ReadAsFloat(); } if (x.Key == "BoostPower") { engineBoostPower = x.ReadAsFloat(); } if (x.Key == "LifetimeEngineRPM") { lifetimeRpm = new NormalDistrbution(x.ReadAsFloat(0), x.ReadAsFloat(1)); } if (x.Key == "LifetimeOilTemp") { lifetimeOil = new NormalDistrbution(x.ReadAsFloat(0), x.ReadAsFloat(1)); } if (x.Key == "LifetimeAvg") { lifetimeLength = x.ReadAsFloat(); } if (x.Key == "LifetimeVar") { lifetimeTime = new NormalDistrbution(lifetimeLength, x.ReadAsFloat()); } }); engFile.Parse(); } // Combine read values: if (engineBoostModes > 0) { for (var mode = 0; mode < engineBoostModes; mode++) { var factor = engineBoostScale.Minimum + mode * engineBoostScale.Span / engineBoostModes; var rpmPlus = factor * engineBoostRpm; var fuelPlus = factor * engineBoostScale.Maximum / engineBoostModes * engineBoostFuel; var wearPlus = factor * engineBoostWear; var powerPlus = factor * engineBoostPower; var torquePlus = factor * engineBoostTorque; engineMode.Add(new EngineMode(powerPlus, torquePlus, rpmPlus, fuelPlus, wearPlus)); } } var lifetime = new EngineLifetime(lifetimeTime, lifetimeRpm, lifetimeOil); return(new Engine(name, manufacturer, 0, 0, idleRpm, maximumRpm, engineMode, engineTorque, lifetime)); }