/// <summary> /// Load the specified FileContents. /// </summary> /// ModifyExistingEntriesOnly : When true, Only modify keys that allready exist. /// This is used to prevent old input config files from adding back deprecated keys. public void Load(string FileContents, bool ModifyExistingEntriesOnly){ using (XmlReader reader = XmlReader.Create(new StringReader(FileContents))){ while (reader.Read()){ if (reader.IsStartElement()){ switch (reader.Name){ case "Key": InputMapEntry ReadEntry = new InputMapEntry(); ReadEntry.Name = reader.GetAttribute("Name"); ReadEntry.PrimaryKey = (KeyCode)Enum.Parse(typeof(KeyCode), reader.GetAttribute("PrimaryKey")); ReadEntry.SecondaryKey = (KeyCode)Enum.Parse(typeof(KeyCode),reader.GetAttribute("SecondaryKey")); ReadEntry.PrimaryModifier = (KeyCode)Enum.Parse(typeof(KeyCode),reader.GetAttribute("PrimaryModifier")); ReadEntry.SecondaryModifier = (KeyCode)Enum.Parse(typeof(KeyCode),reader.GetAttribute("SecondaryModifier")); bool.TryParse(reader.GetAttribute("PrimaryIsAxis"), out ReadEntry.PrimaryIsAxis); ReadEntry.PrimaryAxisName = reader.GetAttribute("PrimaryAxisName"); float.TryParse(reader.GetAttribute("PrimaryAxisDeadzone"), out ReadEntry.PrimaryAxisDeadzone); bool.TryParse(reader.GetAttribute("SecondaryIsAxis"), out ReadEntry.SecondaryIsAxis); ReadEntry.SecondaryAxisName = reader.GetAttribute("SecondaryAxisName"); float.TryParse(reader.GetAttribute("SecondaryAxisDeadzone"), out ReadEntry.SecondaryAxisDeadzone); if (ModifyExistingEntriesOnly){ if (MapEntries.ContainsKey(ReadEntry.Name)){ MapEntries[ReadEntry.Name] = ReadEntry; //Make sure keys are properly set as modifiers if (ReadEntry.PrimaryModifier != KeyCode.None){ if (ReadEntry.PrimaryKey != KeyCode.None){ SetModifier(ReadEntry.PrimaryKey, ReadEntry.PrimaryModifier); } if (ReadEntry.PrimaryAxisName != ""){ SetModifier(ReadEntry.PrimaryAxisName, ReadEntry.PrimaryModifier); } } if (ReadEntry.SecondaryModifier != KeyCode.None){ if (ReadEntry.SecondaryKey != KeyCode.None){ SetModifier(ReadEntry.SecondaryKey, ReadEntry.SecondaryModifier); } if (ReadEntry.SecondaryAxisName != ""){ SetModifier(ReadEntry.SecondaryAxisName, ReadEntry.SecondaryModifier); } } } }else{ MapEntries[ReadEntry.Name] = ReadEntry; //Make sure keys are properly set as modifiers if (ReadEntry.PrimaryModifier != KeyCode.None){ if (ReadEntry.PrimaryKey != KeyCode.None){ SetModifier(ReadEntry.PrimaryKey, ReadEntry.PrimaryModifier); } if (ReadEntry.PrimaryAxisName != ""){ SetModifier(ReadEntry.PrimaryAxisName, ReadEntry.PrimaryModifier); } } if (ReadEntry.SecondaryModifier != KeyCode.None){ if (ReadEntry.SecondaryKey != KeyCode.None){ SetModifier(ReadEntry.SecondaryKey, ReadEntry.SecondaryModifier); } if (ReadEntry.SecondaryAxisName != ""){ SetModifier(ReadEntry.SecondaryAxisName, ReadEntry.SecondaryModifier); } } } break; case "Axis": InputAxisEntry ReadAxis = new InputAxisEntry(); ReadAxis.Name = reader.GetAttribute("Name"); ReadAxis.KeyPositive = reader.GetAttribute("KeyPositive"); ReadAxis.KeyNegative = reader.GetAttribute("KeyNegative"); if (ModifyExistingEntriesOnly){ if (AxisEntries.ContainsKey(ReadAxis.Name)){ AxisEntries[ReadAxis.Name] = ReadAxis; } }else{ AxisEntries[ReadAxis.Name] = ReadAxis; } break; } } } } }
/// <summary> /// Sets the secondary key as axis. /// </summary> public void SetSecondaryKeyAsAxis(string Name, string SecondaryAxisName, KeyCode SecondaryModifier, float SecondaryAxisDeadzone){ if (!MapEntries.ContainsKey(Name)){ MapEntries[Name] = new InputMapEntry(); } InputMapEntry Entry = MapEntries[Name]; Entry.Name = Name; Entry.SecondaryAxisName = SecondaryAxisName; Entry.SecondaryModifier = SecondaryModifier; Entry.SecondaryAxisDeadzone = SecondaryAxisDeadzone; Entry.SecondaryIsAxis = true; if (SecondaryModifier != KeyCode.None){ SetModifier(SecondaryAxisName, SecondaryModifier); } }
/// <summary> /// Checks the axis key. /// </summary> private float CheckAxisKey(InputMapEntry Entry){ float AxisVal = 0; if (Entry.PrimaryIsAxis){ AxisVal += Entry.PrimaryAxisValue; }else if (Entry.SecondaryIsAxis){ AxisVal += Entry.SecondaryAxisValue; } if (AxisVal == 0){ if (Entry.KeyHeld){ AxisVal += 1; } } return AxisVal; }
/// <summary> /// Sets the primary key as axis. /// </summary> public void SetPrimaryKeyAsAxis(string Name, string PrimaryAxisName, KeyCode PrimaryModifier, float PrimaryAxisDeadzone){ if (!MapEntries.ContainsKey(Name)){ MapEntries[Name] = new InputMapEntry(); } InputMapEntry Entry = MapEntries[Name]; Entry.Name = Name; Entry.PrimaryAxisName = PrimaryAxisName; Entry.PrimaryModifier = PrimaryModifier; Entry.PrimaryAxisDeadzone = PrimaryAxisDeadzone; Entry.PrimaryIsAxis = true; if (PrimaryModifier != KeyCode.None){ SetModifier(PrimaryAxisName, PrimaryModifier); } }
/// <summary> /// Sets the secondary key. /// </summary> public void SetSecondaryKey(string Name, KeyCode SecondaryKey, KeyCode SecondaryModifier){ if (!MapEntries.ContainsKey(Name)){ MapEntries[Name] = new InputMapEntry(); } InputMapEntry Entry = MapEntries[Name]; Entry.Name = Name; Entry.SecondaryKey = SecondaryKey; Entry.SecondaryModifier = SecondaryModifier; MapEntries[Name].SecondaryIsAxis = false; if (SecondaryModifier != KeyCode.None){ SetModifier(SecondaryKey, SecondaryModifier); } }
/// <summary> /// Sets the primary key. /// </summary> public void SetPrimaryKey(string Name, KeyCode PrimaryKey, KeyCode PrimaryModifier){ if (!MapEntries.ContainsKey(Name)){ MapEntries[Name] = new InputMapEntry(); } InputMapEntry Entry = MapEntries[Name]; Entry.Name = Name; Entry.PrimaryKey = PrimaryKey; Entry.PrimaryModifier = PrimaryModifier; MapEntries[Name].PrimaryIsAxis = false; if (PrimaryModifier != KeyCode.None){ SetModifier(PrimaryKey, PrimaryModifier); } }
/// <summary> /// Sets the key. /// </summary> public void SetKey(string Name, KeyCode PrimaryKey, KeyCode SecondaryKey, KeyCode PrimaryModifier, KeyCode SecondaryModifier){ if (!MapEntries.ContainsKey(Name)){ MapEntries[Name] = new InputMapEntry(); } MapEntries[Name].Name = Name; MapEntries[Name].PrimaryKey = PrimaryKey; MapEntries[Name].SecondaryKey = SecondaryKey; MapEntries[Name].PrimaryModifier = PrimaryModifier; MapEntries[Name].SecondaryModifier = SecondaryModifier; MapEntries[Name].PrimaryIsAxis = false; MapEntries[Name].SecondaryIsAxis = false; if (PrimaryModifier != KeyCode.None){ SetModifier(PrimaryKey, PrimaryModifier); } if (SecondaryModifier != KeyCode.None){ SetModifier(SecondaryKey, SecondaryModifier); } }
/// <summary> /// Checks the entry input. Needs to be done every update. /// </summary> private void CheckEntryInput(InputMapEntry MapEntry){ bool PrimaryDown; bool PrimaryUp; bool PrimaryHeld; float PrimaryValue = 0; bool SecondaryDown = false; bool SecondaryUp = false; bool SecondaryHeld = false; float SecondaryValue = 0; if (MapEntry.PrimaryIsAxis){ CheckAxis(MapEntry.PrimaryAxisName, MapEntry.PrimaryModifier, out PrimaryDown, out PrimaryUp, out PrimaryHeld, out PrimaryValue, MapEntry.PrimaryAxisDeadzone, MapEntry.PrimaryAxisValue); }else{ CheckKey(MapEntry.PrimaryKey, MapEntry.PrimaryModifier, out PrimaryDown, out PrimaryUp, out PrimaryHeld); } if (MapEntry.SecondaryIsAxis){ CheckAxis(MapEntry.SecondaryAxisName, MapEntry.SecondaryModifier, out SecondaryDown, out SecondaryUp, out SecondaryHeld, out SecondaryValue, MapEntry.SecondaryAxisDeadzone, MapEntry.SecondaryAxisValue); }else{ CheckKey(MapEntry.SecondaryKey, MapEntry.SecondaryModifier, out SecondaryDown, out SecondaryUp, out SecondaryHeld); } MapEntry.KeyUp = PrimaryUp || SecondaryUp; //Failsafe for KeyUp checking. Should theoretically fix things like Alt-Tabbing not registering Alt's release event. if (MapEntry.KeyHeld && !PrimaryHeld && !SecondaryHeld){ MapEntry.KeyUp = true; } MapEntry.KeyDown = PrimaryDown || SecondaryDown; MapEntry.KeyHeld = PrimaryHeld || SecondaryHeld; MapEntry.PrimaryAxisValue = PrimaryValue; MapEntry.SecondaryAxisValue = SecondaryValue; }