Allow loading settings from external file
This commit is contained in:
parent
09fa50602a
commit
e6d75aa2f0
6 changed files with 225 additions and 6 deletions
197
src/Managers/ConfigManager.cs
Normal file
197
src/Managers/ConfigManager.cs
Normal file
|
@ -0,0 +1,197 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace OpenbveFcmbTrainPlugin
|
||||||
|
{
|
||||||
|
/// <summary>A class for loading plugin settings from a file.</summary>
|
||||||
|
internal static class ConfigManager
|
||||||
|
{
|
||||||
|
/// <summary>Represents a collection of plugin settings.</summary>
|
||||||
|
internal class SettingsCollection
|
||||||
|
{
|
||||||
|
internal bool DoorsDeviceEnabled;
|
||||||
|
internal bool DeadmanDeviceEnabled;
|
||||||
|
internal bool TrainStopDeviceEnabled;
|
||||||
|
internal bool AtcBombardierDeviceEnabled;
|
||||||
|
internal bool AtcDimetronicDeviceEnabled;
|
||||||
|
|
||||||
|
internal bool DoorsRequireClosingSound;
|
||||||
|
internal int DoorsClosingSoundDuration = 5;
|
||||||
|
internal int DoorsClosingSoundTimeout = 15;
|
||||||
|
internal int DoorsClosingSoundIndex = 10;
|
||||||
|
|
||||||
|
internal int DeadmanBrakeDelay = 5;
|
||||||
|
internal bool DeadmanRequireFullStop;
|
||||||
|
|
||||||
|
internal int AtcBombardierInitializationTime = 30;
|
||||||
|
internal int AtcBombardierYardIdleTime = 60;
|
||||||
|
internal int AtcBombardierYardSpeedLimit = 20;
|
||||||
|
internal int AtcBombardierBlinkTime = 500;
|
||||||
|
|
||||||
|
internal int AtcDimetronicYardSpeedLimit = 25;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Represents the plugin settings.</summary>
|
||||||
|
internal static SettingsCollection PluginSettings = new SettingsCollection();
|
||||||
|
|
||||||
|
/// <summary>Loads a config file.</summary>
|
||||||
|
internal static void LoadConfig(string folder, string file)
|
||||||
|
{
|
||||||
|
string configFile = OpenBveApi.Path.CombineFile(folder, file);
|
||||||
|
if (System.IO.File.Exists(configFile))
|
||||||
|
{
|
||||||
|
// load options
|
||||||
|
string[] Lines = System.IO.File.ReadAllLines(configFile, new System.Text.UTF8Encoding());
|
||||||
|
string Section = "";
|
||||||
|
for (int i = 0; i < Lines.Length; i++)
|
||||||
|
{
|
||||||
|
Lines[i] = Lines[i].Trim(new char[] { });
|
||||||
|
if (Lines[i].Length != 0 && !Lines[i].StartsWith(";", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
if (Lines[i].StartsWith("[", StringComparison.Ordinal) &
|
||||||
|
Lines[i].EndsWith("]", StringComparison.Ordinal))
|
||||||
|
{
|
||||||
|
Section = Lines[i].Substring(1, Lines[i].Length - 2).Trim(new char[] { }).ToLowerInvariant();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int j = Lines[i].IndexOf("=", StringComparison.OrdinalIgnoreCase);
|
||||||
|
string Key, Value;
|
||||||
|
if (j >= 0)
|
||||||
|
{
|
||||||
|
Key = Lines[i].Substring(0, j).TrimEnd().ToLowerInvariant();
|
||||||
|
Value = Lines[i].Substring(j + 1).TrimStart();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Key = "";
|
||||||
|
Value = Lines[i];
|
||||||
|
}
|
||||||
|
switch (Section)
|
||||||
|
{
|
||||||
|
case "doors":
|
||||||
|
switch (Key)
|
||||||
|
{
|
||||||
|
case "enabled":
|
||||||
|
PluginSettings.DoorsDeviceEnabled = string.Compare(Value, "false", StringComparison.OrdinalIgnoreCase) != 0;
|
||||||
|
break;
|
||||||
|
case "brakedelay":
|
||||||
|
PluginSettings.DoorsRequireClosingSound = string.Compare(Value, "false", StringComparison.OrdinalIgnoreCase) != 0;
|
||||||
|
break;
|
||||||
|
case "closingsoundduration":
|
||||||
|
{
|
||||||
|
if (int.TryParse(Value, out int a))
|
||||||
|
{
|
||||||
|
PluginSettings.DoorsClosingSoundDuration = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "closingsoundtimeout":
|
||||||
|
{
|
||||||
|
if (int.TryParse(Value, out int a))
|
||||||
|
{
|
||||||
|
PluginSettings.DoorsClosingSoundTimeout = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "closingsoundindex":
|
||||||
|
{
|
||||||
|
if (int.TryParse(Value, out int a))
|
||||||
|
{
|
||||||
|
PluginSettings.DoorsClosingSoundIndex = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "deadman":
|
||||||
|
switch (Key)
|
||||||
|
{
|
||||||
|
case "enabled":
|
||||||
|
PluginSettings.DeadmanDeviceEnabled = string.Compare(Value, "false", StringComparison.OrdinalIgnoreCase) != 0;
|
||||||
|
break;
|
||||||
|
case "brakedelay":
|
||||||
|
{
|
||||||
|
if (int.TryParse(Value, out int a))
|
||||||
|
{
|
||||||
|
PluginSettings.DeadmanBrakeDelay = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "requirefullstop":
|
||||||
|
PluginSettings.DeadmanRequireFullStop = string.Compare(Value, "false", StringComparison.OrdinalIgnoreCase) != 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "trainstop":
|
||||||
|
switch (Key)
|
||||||
|
{
|
||||||
|
case "enabled":
|
||||||
|
PluginSettings.TrainStopDeviceEnabled = string.Compare(Value, "false", StringComparison.OrdinalIgnoreCase) != 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "atcbombardier":
|
||||||
|
switch (Key)
|
||||||
|
{
|
||||||
|
case "enabled":
|
||||||
|
PluginSettings.AtcBombardierDeviceEnabled = string.Compare(Value, "false", StringComparison.OrdinalIgnoreCase) != 0;
|
||||||
|
break;
|
||||||
|
case "initializationtime":
|
||||||
|
{
|
||||||
|
if (int.TryParse(Value, out int a))
|
||||||
|
{
|
||||||
|
PluginSettings.AtcBombardierInitializationTime = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "yardidletime":
|
||||||
|
{
|
||||||
|
if (int.TryParse(Value, out int a))
|
||||||
|
{
|
||||||
|
PluginSettings.AtcBombardierYardIdleTime = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "yardspeedlimit":
|
||||||
|
{
|
||||||
|
if (int.TryParse(Value, out int a))
|
||||||
|
{
|
||||||
|
PluginSettings.AtcBombardierYardSpeedLimit = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "blinktime":
|
||||||
|
{
|
||||||
|
if (int.TryParse(Value, out int a))
|
||||||
|
{
|
||||||
|
PluginSettings.AtcBombardierBlinkTime = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "atcdimetronic":
|
||||||
|
switch (Key)
|
||||||
|
{
|
||||||
|
case "enabled":
|
||||||
|
PluginSettings.AtcDimetronicDeviceEnabled = string.Compare(Value, "false", StringComparison.OrdinalIgnoreCase) != 0;
|
||||||
|
break;
|
||||||
|
case "yardspeedlimit":
|
||||||
|
{
|
||||||
|
if (int.TryParse(Value, out int a))
|
||||||
|
{
|
||||||
|
PluginSettings.AtcDimetronicYardSpeedLimit = a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace OpenbveFcmbTrainPlugin
|
namespace OpenbveFcmbTrainPlugin
|
||||||
{
|
{
|
||||||
|
/// <summary>A class for displaying messages to the user.</summary>
|
||||||
internal static class MessageManager
|
internal static class MessageManager
|
||||||
{
|
{
|
||||||
/// <summary>The callback function to show an interface message.</summary>
|
/// <summary>The callback function to show an interface message.</summary>
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace OpenbveFcmbTrainPlugin
|
namespace OpenbveFcmbTrainPlugin
|
||||||
{
|
{
|
||||||
|
/// <summary>A class for playing sounds in the simulation.</summary>
|
||||||
internal static class SoundManager
|
internal static class SoundManager
|
||||||
{
|
{
|
||||||
/// <summary>An array storing the sound handles.</summary>
|
/// <summary>An array storing the sound handles.</summary>
|
||||||
|
|
|
@ -23,6 +23,7 @@ namespace OpenbveFcmbTrainPlugin
|
||||||
/// <returns>Whether the plugin was loaded successfully.</returns>
|
/// <returns>Whether the plugin was loaded successfully.</returns>
|
||||||
public bool Load(LoadProperties properties)
|
public bool Load(LoadProperties properties)
|
||||||
{
|
{
|
||||||
|
ConfigManager.LoadConfig(properties.TrainFolder, "OpenbveFcmbTrainPlugin.cfg");
|
||||||
properties.AISupport = AISupport.Basic;
|
properties.AISupport = AISupport.Basic;
|
||||||
properties.Panel = new int[256];
|
properties.Panel = new int[256];
|
||||||
Train = new Train(properties.Panel);
|
Train = new Train(properties.Panel);
|
||||||
|
|
|
@ -46,6 +46,7 @@
|
||||||
<Compile Include="Managers\SoundManager.cs" />
|
<Compile Include="Managers\SoundManager.cs" />
|
||||||
<Compile Include="Managers\MessageManager.cs" />
|
<Compile Include="Managers\MessageManager.cs" />
|
||||||
<Compile Include="Devices\AtcDimetronic.cs" />
|
<Compile Include="Devices\AtcDimetronic.cs" />
|
||||||
|
<Compile Include="Managers\ConfigManager.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="Devices\" />
|
<Folder Include="Devices\" />
|
||||||
|
|
|
@ -58,19 +58,37 @@ namespace OpenbveFcmbTrainPlugin
|
||||||
private Speed AccelerationSpeed = new Speed(0);
|
private Speed AccelerationSpeed = new Speed(0);
|
||||||
|
|
||||||
/// <summary>Creates a new train with the device configuration provided.</summary>
|
/// <summary>Creates a new train with the device configuration provided.</summary>
|
||||||
/// <param name="panel">The array of panel variables.</pa
|
/// <param name="panel">The array of panel variables.</param>
|
||||||
internal Train(int[] panel)
|
internal Train(int[] panel)
|
||||||
{
|
{
|
||||||
Specs = new VehicleSpecs(0, BrakeTypes.ElectromagneticStraightAirBrake, 0, false, 0);
|
Specs = new VehicleSpecs(0, BrakeTypes.ElectromagneticStraightAirBrake, 0, false, 0);
|
||||||
State = new VehicleState(0.0, new Speed(0.0), 0.0, 0.0, 0.0, 0.0, 0.0);
|
State = new VehicleState(0.0, new Speed(0.0), 0.0, 0.0, 0.0, 0.0, 0.0);
|
||||||
Panel = panel;
|
Panel = panel;
|
||||||
PhysicalHandles = new DriverHandles();
|
PhysicalHandles = new DriverHandles();
|
||||||
|
|
||||||
|
// Create list of devices and populate it according to settings
|
||||||
Devices = new List<Device>();
|
Devices = new List<Device>();
|
||||||
Devices.Add(new Doors(false, 5, 15, 10));
|
ConfigManager.SettingsCollection settings = ConfigManager.PluginSettings;
|
||||||
Devices.Add(new Deadman(5.0, false));
|
if (settings.DoorsDeviceEnabled)
|
||||||
Devices.Add(new TrainStop());
|
{
|
||||||
//Devices.Add(new AtcBombardier(30, 60, 20, 500));
|
Devices.Add(new Doors(settings.DoorsRequireClosingSound, settings.DoorsClosingSoundDuration, settings.DoorsClosingSoundTimeout, settings.DoorsClosingSoundIndex));
|
||||||
Devices.Add(new AtcDimetronic(25));
|
}
|
||||||
|
if (settings.DeadmanDeviceEnabled)
|
||||||
|
{
|
||||||
|
Devices.Add(new Deadman(settings.DeadmanBrakeDelay, settings.DeadmanRequireFullStop));
|
||||||
|
}
|
||||||
|
if (settings.TrainStopDeviceEnabled)
|
||||||
|
{
|
||||||
|
Devices.Add(new TrainStop());
|
||||||
|
}
|
||||||
|
if (settings.AtcBombardierDeviceEnabled)
|
||||||
|
{
|
||||||
|
Devices.Add(new AtcBombardier(settings.AtcBombardierInitializationTime, settings.AtcBombardierYardIdleTime, settings.AtcBombardierYardSpeedLimit, settings.AtcBombardierBlinkTime));
|
||||||
|
}
|
||||||
|
if (settings.AtcDimetronicDeviceEnabled)
|
||||||
|
{
|
||||||
|
Devices.Add(new AtcDimetronic(settings.AtcDimetronicYardSpeedLimit));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Is called when the train should initialize.</summary>
|
/// <summary>Is called when the train should initialize.</summary>
|
||||||
|
|
Loading…
Add table
Reference in a new issue