V 2.44 - BETA Build 79 - 1st Layout Release take care

- added Input device layout dialog and some layouts for the most common device controllers
   NOTE: THIS IS VERY EARLY and may break or not show - use the GitHub Issue feature to report
   also make sure to copy the graphics\layouts folder from the distribution else no layouts are available
- update Can read Exported XMLs from the Game (mostly ... max 3 points for curves are supported) (#91)
- update - defaultProfile.xml from SC LIVE PTU 3.8.2 as last resort built in one
pull/104/head v2.44beta
bm98 4 years ago
parent 384f2c9986
commit ae56478bdc

@ -5,6 +5,7 @@ using System.Text;
using System.Configuration;
using System.Drawing;
using System.Windows.Forms;
using static SCJMapper_V2.Layout.MapProps;
namespace SCJMapper_V2
{
@ -12,12 +13,12 @@ namespace SCJMapper_V2
{
FormSettings FS = null; // Settings form
// Singleton
private static readonly Lazy<AppSettings> m_lazy = new Lazy<AppSettings>( () => new AppSettings( ) );
public static AppSettings Instance { get => m_lazy.Value; }
private AppSettings( )
private AppSettings()
{
if ( this.FirstRun ) {
// migrate the settings to the new version if the app runs the first time
@ -66,10 +67,10 @@ namespace SCJMapper_V2
// manages Upgrade
[UserScopedSetting( )]
[DefaultSettingValue( "True" )]
[DefaultSettingValue( "True" )]
public bool FirstRun
{
get { return ( bool )this["FirstRun"]; }
get { return (bool)this["FirstRun"]; }
set { this["FirstRun"] = value; }
}
@ -79,7 +80,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "1000, 900" )]
public Size FormSize
{
get { return ( Size )this["FormSize"]; }
get { return (Size)this["FormSize"]; }
set { this["FormSize"] = value; }
}
@ -87,7 +88,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "10, 10" )]
public Point FormLocation
{
get { return ( Point )this["FormLocation"]; }
get { return (Point)this["FormLocation"]; }
set { this["FormLocation"] = value; }
}
@ -96,7 +97,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "layout_joystick_spacesim" )] // from Game Bundle
public string DefMappingName
{
get { return ( string )this["DefMappingName"]; }
get { return (string)this["DefMappingName"]; }
set { this["DefMappingName"] = value; }
}
@ -104,7 +105,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "layout_my_joystick" )] // just a default
public string MyMappingName
{
get { return ( string )this["MyMappingName"]; }
get { return (string)this["MyMappingName"]; }
set { this["MyMappingName"] = value; }
}
@ -112,7 +113,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "True" )]
public bool ShowJoystick
{
get { return ( bool )this["ShowJoystick"]; }
get { return (bool)this["ShowJoystick"]; }
set { this["ShowJoystick"] = value; }
}
@ -120,7 +121,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "True" )]
public bool ShowGamepad
{
get { return ( bool )this["ShowGamepad"]; }
get { return (bool)this["ShowGamepad"]; }
set { this["ShowGamepad"] = value; }
}
@ -128,7 +129,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "True" )]
public bool ShowKeyboard
{
get { return ( bool )this["ShowKeyboard"]; }
get { return (bool)this["ShowKeyboard"]; }
set { this["ShowKeyboard"] = value; }
}
@ -136,7 +137,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "True" )]
public bool ShowMouse // 20151220BM: add mouse device (from AC 2.0 defaultProfile usage)
{
get { return ( bool )this["ShowMouse"]; }
get { return (bool)this["ShowMouse"]; }
set { this["ShowMouse"] = value; }
}
@ -144,7 +145,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "False" )]
public bool ShowMapped
{
get { return ( bool )this["ShowMapped"]; }
get { return (bool)this["ShowMapped"]; }
set { this["ShowMapped"] = value; }
}
@ -155,7 +156,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "" )]
public string IgnoreJS1
{
get { return ( string )this["IgnoreJS1"]; }
get { return (string)this["IgnoreJS1"]; }
set { this["IgnoreJS1"] = value; }
}
@ -163,7 +164,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "" )]
public string IgnoreJS2
{
get { return ( string )this["IgnoreJS2"]; }
get { return (string)this["IgnoreJS2"]; }
set { this["IgnoreJS2"] = value; }
}
@ -171,7 +172,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "" )]
public string IgnoreJS3
{
get { return ( string )this["IgnoreJS3"]; }
get { return (string)this["IgnoreJS3"]; }
set { this["IgnoreJS3"] = value; }
}
@ -179,7 +180,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "" )]
public string IgnoreJS4
{
get { return ( string )this["IgnoreJS4"]; }
get { return (string)this["IgnoreJS4"]; }
set { this["IgnoreJS4"] = value; }
}
@ -187,7 +188,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "" )]
public string IgnoreJS5
{
get { return ( string )this["IgnoreJS5"]; }
get { return (string)this["IgnoreJS5"]; }
set { this["IgnoreJS5"] = value; }
}
@ -195,7 +196,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "" )]
public string IgnoreJS6
{
get { return ( string )this["IgnoreJS6"]; }
get { return (string)this["IgnoreJS6"]; }
set { this["IgnoreJS6"] = value; }
}
@ -203,7 +204,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "" )]
public string IgnoreJS7
{
get { return ( string )this["IgnoreJS7"]; }
get { return (string)this["IgnoreJS7"]; }
set { this["IgnoreJS7"] = value; }
}
@ -211,7 +212,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "" )]
public string IgnoreJS8
{
get { return ( string )this["IgnoreJS8"]; }
get { return (string)this["IgnoreJS8"]; }
set { this["IgnoreJS8"] = value; }
}
@ -219,7 +220,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "" )]
public string IgnoreJS9
{
get { return ( string )this["IgnoreJS9"]; }
get { return (string)this["IgnoreJS9"]; }
set { this["IgnoreJS9"] = value; }
}
@ -227,7 +228,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "" )]
public string IgnoreJS10
{
get { return ( string )this["IgnoreJS10"]; }
get { return (string)this["IgnoreJS10"]; }
set { this["IgnoreJS10"] = value; }
}
@ -235,7 +236,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "" )]
public string IgnoreJS11
{
get { return ( string )this["IgnoreJS11"]; }
get { return (string)this["IgnoreJS11"]; }
set { this["IgnoreJS11"] = value; }
}
@ -269,7 +270,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "" )]
public string UserSCPath
{
get { return ( string )this["UserSCPath"]; }
get { return (string)this["UserSCPath"]; }
set { this["UserSCPath"] = value; }
}
@ -277,7 +278,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "False" )]
public bool UserSCPathUsed
{
get { return ( bool )this["UserSCPathUsed"]; }
get { return (bool)this["UserSCPathUsed"]; }
set { this["UserSCPathUsed"] = value; }
}
@ -285,7 +286,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( ",default,multiplayer,singleplayer,player,flycam,vehicle_driver," )] // empty Note: comma separated list, must have a comma at the begining and the end (to find 'player' on its own...)
public string IgnoreActionmaps
{
get { return ( string )this["IgnoreActionmaps"]; }
get { return (string)this["IgnoreActionmaps"]; }
set { this["IgnoreActionmaps"] = value; }
}
@ -294,7 +295,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "False" )]
public bool DetectGamepad
{
get { return ( bool )this["DetectGamepad"]; }
get { return (bool)this["DetectGamepad"]; }
set { this["DetectGamepad"] = value; }
}
@ -302,7 +303,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "False" )]
public bool UsePTU
{
get { return ( bool )this["UsePTU"]; }
get { return (bool)this["UsePTU"]; }
set { this["UsePTU"] = value; }
}
@ -310,7 +311,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "False" )]
public bool UseCSVListing
{
get { return ( bool )this["UseCSVListing"]; }
get { return (bool)this["UseCSVListing"]; }
set { this["UseCSVListing"] = value; }
}
@ -318,7 +319,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "False" )]
public bool ListModifiers
{
get { return ( bool )this["ListModifiers"]; }
get { return (bool)this["ListModifiers"]; }
set { this["ListModifiers"] = value; }
}
@ -355,7 +356,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "1000, 900" )]
public Size FormTableSize
{
get { return ( Size )this["FormTableSize"]; }
get { return (Size)this["FormTableSize"]; }
set { this["FormTableSize"] = value; }
}
@ -363,7 +364,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "760, 320" )]
public Point FormTableLocation
{
get { return ( Point )this["FormTableLocation"]; }
get { return (Point)this["FormTableLocation"]; }
set { this["FormTableLocation"] = value; }
}
@ -371,7 +372,7 @@ namespace SCJMapper_V2
[DefaultSettingValue( "" )]
public string FormTableColumnWidth
{
get { return ( string )this["FormTableColumnWidth"]; }
get { return (string)this["FormTableColumnWidth"]; }
set { this["FormTableColumnWidth"] = value; }
}
@ -395,6 +396,137 @@ namespace SCJMapper_V2
}
//**** Form Layout
[UserScopedSetting( )]
[DefaultSettingValue( "1000, 765" )]
public Size FormLayoutSize
{
get { return (Size)this["FormLayoutSize"]; }
set { this["FormLayoutSize"] = value; }
}
[UserScopedSetting( )]
[DefaultSettingValue( "10, 10" )]
public Point FormLayoutLocation
{
get { return (Point)this["FormLayoutLocation"]; }
set { this["FormLayoutLocation"] = value; }
}
[UserScopedSetting( )]
[DefaultSettingValue( "16" )]
public int LayoutFontSize
{
get { return (int)this["LayoutFontSize"]; }
set { this["LayoutFontSize"] = value; }
}
[UserScopedSetting( )]
[DefaultSettingValue( "255,0,0,139|255,255,255,255" )]
public string GroupColor_00
{
get { return (string)this["GroupColor_00"]; }
set { this["GroupColor_00"] = value; }
}
[UserScopedSetting( )]
[DefaultSettingValue( "255,255,140,00|255,255,255,255" )]
public string GroupColor_01
{
get { return (string)this["GroupColor_01"]; }
set { this["GroupColor_01"] = value; }
}
[UserScopedSetting( )]
[DefaultSettingValue( "255,138,43,226|255,255,255,255" )]
public string GroupColor_02
{
get { return (string)this["GroupColor_02"]; }
set { this["GroupColor_02"] = value; }
}
[UserScopedSetting( )]
[DefaultSettingValue( "255,220,20,60|255,255,255,255" )]
public string GroupColor_03
{
get { return (string)this["GroupColor_03"]; }
set { this["GroupColor_03"] = value; }
}
[UserScopedSetting( )]
[DefaultSettingValue( "255,184,134,11|255,255,255,255" )]
public string GroupColor_04
{
get { return (string)this["GroupColor_04"]; }
set { this["GroupColor_04"] = value; }
}
[UserScopedSetting( )]
[DefaultSettingValue( "255,46,139,87|255,255,255,255" )]
public string GroupColor_05
{
get { return (string)this["GroupColor_05"]; }
set { this["GroupColor_05"] = value; }
}
[UserScopedSetting( )]
[DefaultSettingValue( "255,128,128,0|255,255,255,255" )]
public string GroupColor_06
{
get { return (string)this["GroupColor_06"]; }
set { this["GroupColor_06"] = value; }
}
[UserScopedSetting( )]
[DefaultSettingValue( "255,47,79,79|255,255,255,255" )]
public string GroupColor_07
{
get { return (string)this["GroupColor_07"]; }
set { this["GroupColor_07"] = value; }
}
[UserScopedSetting( )]
[DefaultSettingValue( "255,255,0,0|255,255,255,255" )]
public string GroupColor_08
{
get { return (string)this["GroupColor_08"]; }
set { this["GroupColor_08"] = value; }
}
[UserScopedSetting( )]
[DefaultSettingValue( "255,255,215,0|255,255,255,255" )]
public string GroupColor_09
{
get { return (string)this["GroupColor_09"]; }
set { this["GroupColor_09"] = value; }
}
[UserScopedSetting( )]
[DefaultSettingValue( "0|255,255,255,255" )]
public string GroupColor_10
{
get { return (string)this["GroupColor_10"]; }
set { this["GroupColor_10"] = value; }
}
[UserScopedSetting( )]
[DefaultSettingValue( "255,128,0,128|255,255,255,255" )]
public string GroupColor_11
{
get { return (string)this["GroupColor_11"]; }
set { this["GroupColor_11"] = value; }
}
[UserScopedSetting( )]
[DefaultSettingValue( "255,255,20,147|255,255,255,255" )]
public string GroupColor_12
{
get { return (string)this["GroupColor_12"]; }
set { this["GroupColor_12"] = value; }
}
#endregion

@ -8,6 +8,24 @@ namespace SCJMapper_V2.Devices
{
public class DeviceList : List<DeviceCls>
{
/// <summary>
/// Dumps the know GameDevices
/// </summary>
/// <returns></returns>
public string DumpDevices()
{
this.Clear( );
if ( AppSettings.Instance.DetectGamepad && ( DeviceInst.GamepadRef != null ) ) {
this.Add( DeviceInst.GamepadRef );
}
this.AddRange( DeviceInst.JoystickListRef );
this.Add( DeviceInst.MouseRef );
string ret = $"DXInput Device Listing:\n";
foreach(var dev in this ) {
ret += $"\t{(dev.DevClass+":").PadRight(10)}{dev.DevName}\n\t - Product: {dev.DevGUID} - Instance: {{{dev.DevInstanceGUID}}}\n";
}
return ret;
}
}
}

@ -160,7 +160,7 @@ namespace SCJMapper_V2.Devices.Mouse
/// <summary>
/// The ProductGUID property
/// </summary>
public override string DevGUID { get { return "{}"; } } // @@@ tbd
public override string DevGUID { get { return $"{{{m_device.Information.ProductGuid.ToString( )}}}"; } } // @@@ tbd
/// <summary>
/// The JS Instance GUID for multiple device support (VJoy gets 2 of the same name)
/// </summary>

@ -151,6 +151,14 @@ namespace SCJMapper_V2.Devices
</devices>
<categories>
<category label="@ui_CCSpaceFlight"/>
<category label="@ui_CGLightControllerDesc"/>
<category label="@ui_CCFPS"/>
<category label="@ui_CCEVA"/>
<category label="@ui_CCVehicle"/>
<category label="@ui_CGEASpectator"/>
<category label="@ui_CGUIGeneral"/>
<category label="@ui_CGInteraction"/>
<category label="@ui_CCCamera"/>
</categories>
</CustomisationUIHeader>
*/
@ -171,6 +179,13 @@ namespace SCJMapper_V2.Devices
// CIG adds them to export - so can we ...
r += string.Format( "\t\t<categories>\n" );
r += string.Format( "\t\t<category label=\"@ui_CCSpaceFlight\"/>\n" );
r += string.Format( "\t\t<category label=\"@ui_CCFPS\"/>\n" );
r += string.Format( "\t\t<category label=\"@ui_CCEVA\"/>\n" );
r += string.Format( "\t\t<category label=\"@ui_CCVehicle\"/>\n" );
r += string.Format( "\t\t<category label=\"@ui_CGEASpectator\"/>\n" );
r += string.Format( "\t\t<category label=\"@ui_CGUIGeneral\"/>\n" );
r += string.Format( "\t\t<category label=\"@ui_CGInteraction\"/>\n" );
r += string.Format( "\t\t<category label=\"@ui_CCCamera\"/>\n" );
r += string.Format( "\t\t</categories>\n" );
r += string.Format( "\t</CustomisationUIHeader>\n" );

33
FormMain.Designer.cs generated

@ -146,6 +146,7 @@
this.meShowOptionsDialog = new System.Windows.Forms.ToolStripMenuItem();
this.meShowDeviceTuningDialog = new System.Windows.Forms.ToolStripMenuItem();
this.meShowDeviceMonitoringDialog = new System.Windows.Forms.ToolStripMenuItem();
this.meShowLayoutDialog = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
this.msBtConfig = new System.Windows.Forms.ToolStripDropDownButton();
this.meSettingsDialog = new System.Windows.Forms.ToolStripMenuItem();
@ -395,13 +396,13 @@
this.tmeWDown,
this.toolStripSeparator4});
this.cmMouseEntry.Name = "cmMouseEntry";
this.cmMouseEntry.Size = new System.Drawing.Size(172, 132);
this.cmMouseEntry.Size = new System.Drawing.Size(173, 132);
this.cmMouseEntry.Opening += new System.ComponentModel.CancelEventHandler(this.cmMouseEntry_Opening);
//
// tmeK_Tab
//
this.tmeK_Tab.Name = "tmeK_Tab";
this.tmeK_Tab.Size = new System.Drawing.Size(171, 22);
this.tmeK_Tab.Size = new System.Drawing.Size(172, 22);
this.tmeK_Tab.Tag = "K_Tab";
this.tmeK_Tab.Text = "Kbd - TAB";
this.tmeK_Tab.Click += new System.EventHandler(this.tmeItem_Click);
@ -409,12 +410,12 @@
// toolStripSeparator7
//
this.toolStripSeparator7.Name = "toolStripSeparator7";
this.toolStripSeparator7.Size = new System.Drawing.Size(168, 6);
this.toolStripSeparator7.Size = new System.Drawing.Size(169, 6);
//
// tmeXAxis
//
this.tmeXAxis.Name = "tmeXAxis";
this.tmeXAxis.Size = new System.Drawing.Size(171, 22);
this.tmeXAxis.Size = new System.Drawing.Size(172, 22);
this.tmeXAxis.Tag = "X";
this.tmeXAxis.Text = "X-Axis (horizontal)";
this.tmeXAxis.Click += new System.EventHandler(this.tmeItem_Click);
@ -422,7 +423,7 @@
// tmeYAxis
//
this.tmeYAxis.Name = "tmeYAxis";
this.tmeYAxis.Size = new System.Drawing.Size(171, 22);
this.tmeYAxis.Size = new System.Drawing.Size(172, 22);
this.tmeYAxis.Tag = "Y";
this.tmeYAxis.Text = "Y-Axis (vertical)";
this.tmeYAxis.Click += new System.EventHandler(this.tmeItem_Click);
@ -430,12 +431,12 @@
// toolStripSeparator3
//
this.toolStripSeparator3.Name = "toolStripSeparator3";
this.toolStripSeparator3.Size = new System.Drawing.Size(168, 6);
this.toolStripSeparator3.Size = new System.Drawing.Size(169, 6);
//
// tmeWUp
//
this.tmeWUp.Name = "tmeWUp";
this.tmeWUp.Size = new System.Drawing.Size(171, 22);
this.tmeWUp.Size = new System.Drawing.Size(172, 22);
this.tmeWUp.Tag = "U";
this.tmeWUp.Text = "Wheel Up";
this.tmeWUp.Click += new System.EventHandler(this.tmeItem_Click);
@ -443,7 +444,7 @@
// tmeWDown
//
this.tmeWDown.Name = "tmeWDown";
this.tmeWDown.Size = new System.Drawing.Size(171, 22);
this.tmeWDown.Size = new System.Drawing.Size(172, 22);
this.tmeWDown.Tag = "D";
this.tmeWDown.Text = "Wheel Down";
this.tmeWDown.Click += new System.EventHandler(this.tmeItem_Click);
@ -451,14 +452,14 @@
// toolStripSeparator4
//
this.toolStripSeparator4.Name = "toolStripSeparator4";
this.toolStripSeparator4.Size = new System.Drawing.Size(168, 6);
this.toolStripSeparator4.Size = new System.Drawing.Size(169, 6);
//
// cbxThrottle
//
this.cbxThrottle.AutoSize = true;
this.cbxThrottle.Location = new System.Drawing.Point(107, 108);
this.cbxThrottle.Name = "cbxThrottle";
this.cbxThrottle.Size = new System.Drawing.Size(66, 17);
this.cbxThrottle.Size = new System.Drawing.Size(67, 17);
this.cbxThrottle.TabIndex = 13;
this.cbxThrottle.Tag = "§";
this.cbxThrottle.Text = "Throttle";
@ -1353,7 +1354,8 @@
this.meShowToggleTable,
this.meShowOptionsDialog,
this.meShowDeviceTuningDialog,
this.meShowDeviceMonitoringDialog});
this.meShowDeviceMonitoringDialog,
this.meShowLayoutDialog});
this.msBtShow.Image = global::SCJMapper_V2.Properties.Resources.Monitor;
this.msBtShow.ImageTransparentColor = System.Drawing.Color.Magenta;
this.msBtShow.Name = "msBtShow";
@ -1394,6 +1396,13 @@
this.meShowDeviceMonitoringDialog.Text = "Show Device Monitoring Dialog...";
this.meShowDeviceMonitoringDialog.Click += new System.EventHandler(this.meShowDeviceMonitoringDialog_Click);
//
// meShowLayoutDialog
//
this.meShowLayoutDialog.Name = "meShowLayoutDialog";
this.meShowLayoutDialog.Size = new System.Drawing.Size(250, 22);
this.meShowLayoutDialog.Text = "Show Layout Dialog...";
this.meShowLayoutDialog.Click += new System.EventHandler(this.meShowLayoutDialog_Click);
//
// toolStripSeparator6
//
this.toolStripSeparator6.Name = "toolStripSeparator6";
@ -1518,6 +1527,7 @@
this.IL2.Images.SetKeyName(0, "User");
this.IL2.Images.SetKeyName(1, "Locked");
this.IL2.Images.SetKeyName(2, "RSI");
this.IL2.Images.SetKeyName(3, "Exported");
//
// MainForm
//
@ -1695,6 +1705,7 @@
private System.Windows.Forms.ToolStripMenuItem tdiExpandAll;
private System.Windows.Forms.ToolStripMenuItem meShowDeviceMonitoringDialog;
private System.Windows.Forms.Label lblPTU;
private System.Windows.Forms.ToolStripMenuItem meShowLayoutDialog;
}
}

@ -23,6 +23,7 @@ using SCJMapper_V2.Devices.Options;
using SCJMapper_V2.Devices.Monitor;
using SCJMapper_V2.Translation;
using System.Threading;
using SCJMapper_V2.Layout;
namespace SCJMapper_V2
{
@ -310,7 +311,10 @@ namespace SCJMapper_V2
SCMappings.UpdateMappingNames( );
msSelectMapping.DropDownItems.Clear( );
foreach ( string s in SCMappings.MappingNames ) {
if ( !SCMappings.IsUserMapping( s ) ) {
if ( SCMappings.IsExportedMapping( s ) ) {
msSelectMapping.DropDownItems.Add( Path.GetFileNameWithoutExtension( s ), IL2.Images["Exported"] );
}
else if ( !SCMappings.IsUserMapping( s ) ) {
msSelectMapping.DropDownItems.Add( Path.GetFileNameWithoutExtension( s ), IL2.Images["RSI"] );
}
else {
@ -598,7 +602,8 @@ namespace SCJMapper_V2
// there is a joystick device left..
DeviceInst.JoystickListRef[joyStickIndex].JSAssignment = joyStickIndex + 1; // assign number 1..
m_AT.ActionMaps.jsN[deviceTabIndex] = DeviceInst.JoystickListRef[joyStickIndex].DevName;
m_AT.ActionMaps.jsNGUID[deviceTabIndex] = DeviceInst.JoystickListRef[joyStickIndex].DevInstanceGUID;
m_AT.ActionMaps.jsN_instGUID[deviceTabIndex] = DeviceInst.JoystickListRef[joyStickIndex].DevInstanceGUID;
m_AT.ActionMaps.jsN_prodGUID[deviceTabIndex] = DeviceInst.JoystickListRef[joyStickIndex].DevGUID;
joyStickIndex++;
}
}
@ -1036,7 +1041,10 @@ namespace SCJMapper_V2
private void meDumpLogfile_Click( object sender, EventArgs e )
{
AutoTabXML_Assignment( EATabXML.Tab_XML );
rtb.Text = string.Format( "-- {0} - SC Joystick AC Path and Logfile --\n\n{1}\n{2}", DateTime.Now, SCPath.Summary(), SCLogExtract.ExtractLog( ) );
rtb.Text = $"-- {DateTime.Now} - SC Joystick AC Path and Logfile --\n";
var devList = new DeviceList( );
rtb.Text += $"\n{devList.DumpDevices( )}\n{SCPath.Summary( )}\n{SCLogExtract.ExtractLog( )}";
devList = null;
}
private void meDumpDefaultProfile_Click( object sender, EventArgs e )
@ -1148,6 +1156,15 @@ namespace SCJMapper_V2
timer1.Enabled = true;
}
private void meShowLayoutDialog_Click( object sender, EventArgs e )
{
timer1.Enabled = false; // must be off while a modal window is shown, else DX gets crazy
var LAYOUT = new FormLayout { ActionList = m_AT.ReportActionsSItemText() };
LAYOUT.ShowDialog( this );
LAYOUT = null; // get rid and create a new one next time..
timer1.Enabled = true;
}
// *** Settings
@ -1197,10 +1214,12 @@ namespace SCJMapper_V2
for ( int i = 0; i < JoystickCls.JSnum_MAX; i++ ) {
j = DeviceInst.JoystickListRef.Find_InstanceForjsN( i + 1 );
if ( j != null ) {
newTree.ActionMaps.jsN[i] = j.DevName; newTree.ActionMaps.jsNGUID[i] = j.DevInstanceGUID;
newTree.ActionMaps.jsN[i] = j.DevName;
newTree.ActionMaps.jsN_instGUID[i] = j.DevInstanceGUID;
newTree.ActionMaps.jsN_prodGUID[i] = j.DevGUID;
}
else {
newTree.ActionMaps.jsN[i] = ""; newTree.ActionMaps.jsNGUID[i] = "";
newTree.ActionMaps.jsN[i] = ""; newTree.ActionMaps.jsN_instGUID[i] = ""; newTree.ActionMaps.jsN_prodGUID[i] = "";
}
}

@ -128,7 +128,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAA8
EAAAAk1TRnQBSQFMAgEBCQEAAVgBFAFYARQBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
EAAAAk1TRnQBSQFMAgEBCQEAAWgBFAFoARQBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAATADAAEBAQABCAYAAQwYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
@ -581,9 +581,9 @@
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADc
GQAAAk1TRnQBSQFMAgEBAwEAARgBAgEYAQIBMAEAATABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABwAMAATADAAEBAQABCAYAASQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACy
HQAAAk1TRnQBSQFMAgEBBAEAASgBAgEoAQIBMAEAATABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABwAMAAWADAAEBAQABCAYAAUgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
@ -610,89 +610,105 @@
AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/2sAHP8JAAH/SAAB/wL0
AfME8AHzAvQB/0MAAf8B8wG6HKwBugHzAf9KAAH/AfIBBwG0AYsMawGLAfcBvAHzAf8aAAH0AfABBwHv
ApIB7wEHAfAB9BgAAf8B8wGyIKwBsgHzAf9GAAHzAfcWawG7AfQVAAH/AfEB9wHvAQcCvALxArwBBwHv
AfcB8QH/FAAB/wEJJKwBCQH/QwAB9AG7GmsBuwH0EgAB8QGSAe8B8ArxAfAB7wGSAfESAAH/AQkmrAEJ
Af9BAAHzAmsaigJrAfQPAAH/AfAB7wHwDvEB8AHvAfAB/w8AAf8B8yisAfMB/0AAAfcBaxyKAWsBuw4A
AfQBvAEHBPEB8AH3AZABiwJrAosBkQG8BPEBBwG8AfQOAAH/KqwB/z8AAfQBax4GAWsB/wwAAf8BvAEH
BPEBkQprAZEBvAPxAQcBvAH/DQAB8yqsAfM/AAHzAWseigFrAfMMAAHwAQcD8QG7A2sCigGLAvMBiwOK
AmsBkQPxAQcB8A0AAboqrAG6PwAB9AFrHooBawHzCwAB8QHvA/EB9wFrAYoEBgG7Av8BtAQGAYoBawGR
A/EB7wHxCwAB/wGyBqwXsw6sAf8+AAH/AWseigFrAfQKAAH/AZIB8ALxAe8BawEGBYoBkALzAYsFigEG
AWsBkQLxAfABkgH/CgAB/wesAbMBZgINGWYBswesAf8/AAGQHooBiwsAAfEBBwPxAWsRBgGKAWsBvALx
AQcB8QoAAf8GrAGzAa0BDQEQBQ0GQwpmBUMBrQGzBqwB/z0AAf8B9AEHAYoBkBmKAYsBkAEGAbwKAAH/
AZID8QGRE4oBBgGRA/EBkgH/CQAB/wasAbMBrQkNBUMIZgVDAQ0BrQGzBqwB/zgAAf8BGwEaAXkBUgMr
AWsCkBeLApABgQGRCwAB8wHvAvIB8QFrCYoCawmKAWsBvALyAe8B8wkAAf8GrAGzAa0NDQFDBWYCQwFm
AkMEDQGtAbMGrAH/NgAB8wGZAisBMQUyAUsBawKzAZATiwKQAbMBkAFrAfILAAHwAQcC8gHvAYoGiwGK
AYsBuwK8AbsBiwGKBosBigGRAvIBBwHwCQAB/wasArMODQJDA2YEQwUNArMGrAH/NAAB9AGZASsKMgFL
AWsBkAKzEZADswGKAWsB8gwAAQcB8ALyAZEBigWQAYoBiwG8BPEBvAGLAYoFkAGKAYsC8gHwAQcJAAH/
BqwCsw8NBkMHDQKzBqwB/zMAAfMBKwExDDIBTAHqAYoFswmQBbMBgQFrAQcB/w0AAfcB8QLyAosBswG6
AbMCkAEGAe8G8gHvAQYCkAGzAboBswGQAWsC8gHxAfcJAAH/BqwCswINAmUEDQRmAWUHZgENAmYBZQEN
ARACDQKzBqwB/zMAAXkQMgFMAeoBawGKAYEBkAGzB5ABswGQAbMBigFrAZEBvAH/DwABkgPyAYsBkAH0
Af8BGQKzAWsB8AbyAfEBawKzAfQB/wEZAbMBawHwAvIBkgkAAf8GrAKzAQ0BQwGzAdsBiwINAWwBugHb
AbMDiwG0A7oB2wG0AUMBswHbAbMEDQKzBqwB/zIAAf8BKxIyATEBTAFKAQYJswGKAbsB8wH/EgABkgPy
AYsBswH0Af8BGQKzAWsB8gbzAfIBawKzAfQB/wEZAbMBawHwAvIBkgkAAf8GrAKzAg0BtAHbAbMCDQGz
A9sCkAGLAbQF2wFsAYsC2wFmAg8BDQKzBqwB/zIAAfMBKxQyAUoBigmzAYoBuxQAAfcB8gHzAfIBiwGQ
AbMBugOzAYoBuwH/BPMB/wG7AYoDswG6ArMBawHyAfMB8gH3CQAB/wasArMCDQGQAtsBZgENAbQC2wG0
A4sBkAO0AtsBiwFsAtsBiwMPArMGrAH/MgAB9AErFDIBbAuzAWsB/xMAAQcB8AH0AfIBkQGQBrMBiwH0
BP8B9AGLAZAGswGLAfIB9AHwAQcJAAH/BqwCswEPAQ0BbALbAbQBiwLbAbMHDQFmAtsBtAFmAtsBkAEK
Ag8CswasAf8yAAH/ASsTMgFSAWsLswGKAfMTAAHwAbwB9AHzAbsBigazAYoBiwG7AvMBuwGLAYoGswGB
AZEB8wH0AbwB8AkAAf8GrAKzAQ8BDQFmBtsBiwYNAYsD2wGzAQ0BtAHbAbQBDQIPArMGrAH/MwABUhMy
AVEBiguzAYoBuxMAAfMB7wH/AfMB8gFrAbMBuQazAYoCawGKCLMBigHwAfMB9AHvAfMJAAH/BqwCswEP
Ag0BugXbAbQBZgQNAZAD2wG0AWYBDQGRAtsBZgEKAQ8CswasAf8zAAEaATESMgFKAZAMswGREwAB/wGS
AfQB/wHzAbQBigHaAbkPswHaAbMBkQHzAf8B9AGSAf8JAAH/BqwBuQGzAg8BDQG0AtsBtATbAZABDQFm
AbQD2wGLAQ0BDwEKAYsC2wFsAQ4BDwGzAbkGrAH/MwAB/wErATIBUxAyAWwNswFrAf8TAAHxAbwB/wLz
AWsBswHaDrkB2gG5AWsB8AHzAf8BvAHxCgAB/wasAboBswEPAQ4BCgGLAtsBZgFsAbQD2wFsAboC2wG6
AWwEDQFmAtsBkAEKAQ8BswG6BqwB/zQAARoBKwJZD1MBbA2zAQYB9BMAAf8BkgH0Af8B8wG7AWsC2gW5
AvQFuQLaAYoB9wHzAf8B9AGSAf8KAAH/BqwBugGzAQ8CCgFsAtsBiwENAQ8BiwLbAZABugHbAboBFQYN
AboB2wG0AQ0BDwGzAboGrAH/NQABGgErATICWQ1TAWwNswGKAfMUAAGSAQcC/wHzAbUBawG5AtoCuQHc
Av8B3AK5A9oBigGRAfMC/wEHAZILAAH/BqwBugGzAQ4BCgEPAUMD2wO6AtsCtALbBLoDiwG0AtsBDQEP
AbMBugasAf82AAH0AZkBMQVZCVMBbA2zAYoB8hQAAfcB7wG8Av8B8wG7AWsBkAPaAdsC9ATaAbMBawH3
AfMC/wG8Ae8BkgsAAf8GrAG6AbMBDgEKAQ4BDQG6BdwC2wG6AZEB3AHbA9wB4QG0ApEBtALcAWwBCgGz
AboGrAH/OAAB9AGZASsBMQEyAVMBWQdTAVkBbAGzDLkBigHyFAABkgHxAe8B8QL/AvMBtAFrAZACuQLf
ArkBswGKAZEB8QHzAv8B8QHvAfEBkgsAAf8GrAG6AbMBDgMKAZEB3AbbAbQBZgG6BNsB3AG0A5EBugHc
AYsBDQGzAboGrAH/OgAB/wHzARoBMQlTAWwBswy5AYoB9BQAAZIB8gHwAe8BvAL/AfQC8wG7AZEBiwJr
AYsBkAG1AfIB8wH0Av8BvAHvAfAB8gGSCwAB/wasAboBswEOAgoCDQdDAw0CQwNmAUMBDQFDAQ0CQwIN
AbMBugasAf88AAGZATEJUwFLAZAB2gm5AdoBuQFrAf8UAAGSAvIB8QHvAQcB9AL/AfQI8wH0Av8B9AEH
Ae8B8QLyAZILAAH/BqwBugGzAg4BCgcOAQ8CDQIPAQ4FDQEPAQ0BDwEQAQ8CCgGzAboGrAH/PAABUgpT
AVIBawLaCLkB2gGzAbsVAAGSBPICkgEHAfQK/wH0AQcCkgTyAZILAAH/BqwBugGzCgoCDwINAg4BDwQN
AQ8CDgEPAQoCDgGzAboGrAH/OwAB9gExC1kBSgGBA9oEuQPaAYoB9BUAAZIB8gHzAvIBkgH/AfEB9wHv
AbwC8wL/AvMBvAHvAfcB8QH/AZIC8gHzAfIBkgsAAf8GrAG6AbkBCgIOBwoBDgEPAQ0BDwIKAQ4BDwIN
Ag8BDgEKAQ4CCgEOAbkBugasAf87AAEbATELWQFSAewBgQHaAd8E2gHfAbkBBgG8FgAB7wHxAfMC8gHv
AfQCAAH0AfABBwHvApIB7wEHAfAB9AIAAfQB7wLyAfMB8QHvCwAB/wasAdsBuQEKAQ4BCgUOAQoBDgMP
AQ4BCgEOAQoBDgIPAQ0BDwMKAw4BuQHbBqwB/zsAAZkBUgtZAVMBdAG8AYsBBgGQAbkBswGBAQYBkQHy
FwABBwHwAfQC8gEHAfIOAAHyAQcC8gH0AfABBwsAAf8GrAK6AQ4BAAYKAQ4BCgMOAQoBDgIKAQ4CCgIO
AQoDDgIAAroGrAH/OwABdAFTDFkBKwH/AQAB8wHwAbsBvAHzAf8ZAAHxAQcB/wLzArwOAAK8AvMB/wEH
AfELAAH/BqwBswHbAWwaDQFsAdsBswasAf87AAFSDVkBMQH/IAAB9AHvAf8B9AHzAfIB7wHzDAAB8wHv
AfIB8wH0Af8B7wH0CwAB/wesAbkB2xq6AdsBuQesAf87AAFSDVkBMQHzIQABBwHyAf8C8wHwAfcB9AoA
AfQB9wHwAvMB/wHyAQcMAAH/CKwBshqzAbIIrAH/OwABUg1ZATEBGyEAAfMB7wL/AvMBvAH3AfMIAAHz
AfcBvALzAv8B7wHzDAAB/yysAf87AAFSDVkBMQEbIgAC8AH/AfQC8wHwAe8BvAHyAfQC/wH0AfIBvAHv
AfAC8wH0Af8C8A4AAboqrAG6PAABeQFTDFkBMQH0IgAB9AGSAfMB/wH0A/MB8AEHAe8CkgHvAQcB8APz
AfQB/wHzAZIB9A4AAfMqrAHzPAABGgFSDFkBKwH/IwAB8gH3AfIC/wzzAv8B8gH3AfIPAAH/KqwB/zwA
Af8BMQxZAZklAAHzAZIB8AP/CPMD/wHwAZIB8xAAAf8B8yisAfMB/z0AARoBUgFeCVkBMQH0JgAB9AHw
Ae8B8gT/AvQE/wHyAe8B8AH0EgAB/wEJJqwBCQH/PwABmQFSAV4G5QFZATEBGikAAfMBBwH3AbwB8gHz
Av8B8wHyAbwB9wEHAfMVAAH/AQkkrAEJAf9BAAEaAVIBMQFSAVkBWAFSATEBdAEbLAAB/wHxAQcB7wKS
Ae8BBwHxAf8YAAH/AfMBsiCsAbIB8wH/RAAB8wEaAZkBGgHzAf9SAAH/AfMBuxusAbMBuwHzAf+hABz/
OgABQgFNAT4HAAE+AwABKAMAAcADAAEwAwABAQEAAQEFAAGAAQQWAAP/AQAN/wHAAgABAwH+BgAD/wEA
AQ8H/wH+BAABfwYAAv8B4AIAAX8C/wHgAQcC/wH4BAABHwYAAv8BgAIAAR8C/wIAAv8B8AQAAQ8GAAH/
Af4DAAEHAf8B/gIAAX8B/wHgBAABBwYAAf8B/AMAAQMB/wH4AgABHwH/AcAEAAEDBgAB/wH8AwABAwH/
AfACAAEPAf8BwAQAAQMGAAH/AfgDAAEBAf8B4AIAAQcB/wHABAABAwYAAf8B+AMAAQEB/wHgAgABBwH/
AcAEAAEDBgAB/wH4AwABAQH/AcACAAEDAf8BgAQAAQEGAAH/AfgDAAEBAf8BgAIAAQEB/wGABAABAQYA
Af8B/AMAAQMB/wGAAgABAQH/AYAEAAEBBgAB/wHwAwABAwH/BAAB/wGABAABAQYAAf4EAAEHAf8EAAH/
AYAEAAEBBgAB+AQAAQcB/wQAAf8BgAQAAQEGAAHgBAABDwH/BAAB/wGABAABAQYAAcAEAAEfAf8EAAH/
AYAEAAEBBgABwAQAAX8B/wQAAf8BgAQAAQEGAAGAAwABAwL/BAAB/wGABAABAQYAAYADAAEPAv8EAAH/
AYAEAAEBBgABgAMAAQcC/wQAAf8BgAQAAQEGAAGAAwABBwL/BAAB/wGABAABAQYAAcADAAEHAv8EAAH/
AYAEAAEBBgABwAMAAQcC/wQAAf8BgAQAAQEGAAHAAwABAwL/AYACAAEBAf8BgAQAAQEGAAHgAwABAwL/
AYACAAEBAf8BgAQAAQEGAAHwAwABAwL/AcACAAEDAf8BgAQAAQEGAAH4AwABAwL/AcACAAEDAf8BgAQA
AQEGAAH+AwABAwL/AcACAAEDAf8BgAQAAQEGAAH/AYACAAEDAv8BwAIAAQMB/wGABAABAQYAAf8B4AIA
AQMC/wHAAgABAwH/AYAEAAEBBgAB/wHgAgABBwL/AcACAAEDAf8BgAQAAQEGAAH/AcACAAEHAv8BwAIA
AQMB/wGABAABAQYAAf8BwAIAAQ8C/wHAAWABBgEDAf8BgAQAAQEGAAH/AcACAAEfAv8BwAF/Af4BAwH/
AYAEAAEBBgAB/wHAAQABIAF/Av8BwAF/Af4BAwH/AYAEAAEBBgAB/wHAAQABPwP/AcABPwH8AQMB/wGA
BAABAQYAAf8BwAEAAT8D/wHgAR8B+AEHAf8BgAQAAQEGAAH/AcABAAE/A/8B4AEPAfABBwH/AYAEAAEB
BgAB/wHAAQABPwP/AfACAAEPAf8BwAQAAQMGAAH/AcABAAE/A/8B8AIAAQ8B/wHABAABAwYAAf8BwAEA
AT8D/wH4AgABHwH/AcAEAAEDBgAB/wHAAQABfwP/AfwCAAE/Af8BwAQAAQMGAAH/AeABAAF/A/8B/gIA
AX8B/wHgBAABBwYAAf8B8AEABf8BgAEBAv8B8AQAAQ8GAAH/AfgBAQX/AeABBwL/AfgEAAEfBgAB/wH+
AQcJ/wH+BAABfwYADf8BwAIAAQMB/wYACw==
AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD//8A/wD/AP8A/wD/AP8A
/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AI8A
HP8JAAH/EgAD9AHzBPAB8wP0KgAB/wL0AfME8AHzAvQB/0MAAf8B8wG6HKwBugHzAf8TAAH0AfABuwGR
D2sBiwGRAbsB8QH0HwAB/wHyAQcBtAGLDGsBiwH3AbwB8wH/GgAB9AHwAQcB7wKSAe8BBwHwAfQYAAH/
AfMBsiCsAbIB8wH/DQAB9QHuAZEZawFsAZEB8AH/GQAB8wH3FmsBuwH0FQAB/wHxAfcB7wEHArwC8QK8
AQcB7wH3AfEB/xQAAf8BCSSsAQkB/woAAfIBkSBrAbsB9BUAAfQBuxprAbsB9BIAAfEBkgHvAfAK8QHw
Ae8BkgHxEgAB/wEJJqwBCQH/BwAB9AG7JGsBuwH/EgAB8wJrGooCawH0DwAB/wHwAe8B8A7xAfAB7wHw
Af8PAAH/AfMorAHzAf8FAAHxAmskigFrAfcB8xEAAfcBaxyKAWsBuw4AAfQBvAEHBPEB8AH3AZABiwJr
AosBkQG8BPEBBwG8AfQOAAH/KqwB/wQAAfQCayaKAmsB/w8AAfQBax4GAWsB/wwAAf8BvAEHBPEBkQpr
AZEBvAPxAQcBvAH/DQAB8yqsAfMEAAG7AWsoBgFrAfAPAAHzAWseigFrAfMMAAHwAQcD8QG7A2sCigGL
AvMBiwOKAmsBkQPxAQcB8A0AAboqrAG6BAABiyoGAZAPAAH0AWseigFrAfMLAAHxAe8D8QH3AWsBigQG
AbsC/wG0BAYBigFrAZED8QHvAfELAAH/AbIGrBezDqwB/wMAAWsqigFrDwAB/wFrHooBawH0CgAB/wGS
AfAC8QHvAWsBBgWKAZAC8wGLBYoBBgFrAZEC8QHwAZIB/woAAf8HrAGzAWYCDRlmAbMHrAH/AgAB/wFr
KooBawH/DwABkB6KAYsLAAHxAQcD8QFrEQYBigFrAbwC8QEHAfEKAAH/BqwBswGtAQ0BEAUNBkMKZgVD
Aa0BswasAf8DAAGLAoonBgGKAWwOAAH/AfQBBwGKAZAZigGLAZABBgG8CgAB/wGSA/EBkROKAQYBkQPx
AZIB/wkAAf8GrAGzAa0JDQVDCGYFQwENAa0BswasAf8DAAGRKooBkAkAAf8BGwEaAXkBUgMrAWsCkBeL
ApABgQGRCwAB8wHvAvIB8QFrCYoCawmKAWsBvALyAe8B8wkAAf8GrAGzAa0NDQFDBWYCQwFmAkMEDQGt
AbMGrAH/AwABuwEGKYoBuwcAAfMBmQIrATEFMgFLAWsCswGQE4sCkAGzAZABawHyCwAB8AEHAvIB7wGK
BosBigGLAbsCvAG7AYsBigaLAYoBkQLyAQcB8AkAAf8GrAKzDg0CQwNmBEMFDQKzBqwB/wMAAfQBayiK
AWsB8wUAAfQBmQErCjIBSwFrAZACsxGQA7MBigFrAfIMAAEHAfAC8gGRAYoFkAGKAYsBvATxAbwBiwGK
BZABigGLAvIB8AEHCQAB/wasArMPDQZDBw0CswasAf8EAAGRAYoBkCSKAZABigGRBQAB8wErATEMMgFM
AeoBigWzCZAFswGBAWsBBwH/DQAB9wHxAvICiwGzAboBswKQAQYB7wbyAe8BBgKQAbMBugGzAZABawLy
AfEB9wkAAf8GrAKzAg0CZQQNBGYBZQdmAQ0CZgFlAQ0BEAINArMGrAH/BAAB8gFrApAiiwKQAWsB8gUA
AXkQMgFMAeoBawGKAYEBkAGzB5ABswGQAbMBigFrAZEBvAH/DwABkgPyAYsBkAH0Af8BGQKzAWsB8Aby
AfEBawKzAfQB/wEZAbMBawHwAvIBkgkAAf8GrAKzAQ0BQwGzAdsBiwINAWwBugHbAbMDiwG0A7oB2wG0
AUMBswHbAbMEDQKzBqwB/wUAAbsBigGzAZAfiwGQArMBigEHBQAB/wErEjIBMQFMAUoBBgmzAYoBuwHz
Af8SAAGSA/IBiwGzAfQB/wEZArMBawHyBvMB8gFrArMB9AH/ARkBswFrAfAC8gGSCQAB/wasArMCDQG0
AdsBswINAbMD2wKQAYsBtAXbAWwBiwLbAWYCDwENArMGrAH/BgABuwEGArMekAKzAWsB7gYAAfMBKxQy
AUoBigmzAYoBuxQAAfcB8gHzAfIBiwGQAbMBugOzAYoBuwH/BPMB/wG7AYoDswG6ArMBawHyAfMB8gH3
CQAB/wasArMCDQGQAtsBZgENAbQC2wG0A4sBkAO0AtsBiwFsAtsBiwMPArMGrAH/BwABuwGKA7MZkAOz
AYoBawHxBwAB9AErFDIBbAuzAWsB/xMAAQcB8AH0AfIBkQGQBrMBiwH0BP8B9AGLAZAGswGLAfIB9AHw
AQcJAAH/BqwCswEPAQ0BbALbAbQBiwLbAbMHDQFmAtsBtAFmAtsBkAEKAg8CswasAf8IAAHyAZEBigSz
E5AEswGBAWsBBwH/CAAB/wErEzIBUgFrC7MBigHzEwAB8AG8AfQB8wG7AYoGswGKAYsBuwLzAbsBiwGK
BrMBgQGRAfMB9AG8AfAJAAH/BqwCswEPAQ0BZgbbAYsGDQGLA9sBswENAbQB2wG0AQ0CDwKzBqwB/woA
AfIBkQGKAYEFswqQBrMBgQGKAYsBvAH/CwABUhMyAVEBiguzAYoBuxMAAfMB7wH/AfMB8gFrAbMBuQaz
AYoCawGKCLMBigHwAfMB9AHvAfMJAAH/BqwCswEPAg0BugXbAbQBZgQNAZAD2wG0AWYBDQGRAtsBZgEK
AQ8CswasAf8MAAH1Ae4BkQFrAooBswqQAbMBkAGKAQYBiwGRAe4B9A4AARoBMRIyAUoBkAyzAZETAAH/
AZIB9AH/AfMBtAGKAdoBuQ+zAdoBswGRAfMB/wH0AZIB/wkAAf8GrAG5AbMCDwENAbQC2wG0BNsBkAEN
AWYBtAPbAYsBDQEPAQoBiwLbAWwBDgEPAbMBuQasAf8QAAH0AYoMswKQAfQSAAH/ASsBMgFTEDIBbA2z
AWsB/xMAAfEBvAH/AvMBawGzAdoOuQHaAbkBawHwAfMB/wG8AfEKAAH/BqwBugGzAQ8BDgEKAYsC2wFm
AWwBtAPbAWwBugLbAboBbAQNAWYC2wGQAQoBDwGzAboGrAH/EAABuwEGDbMBBgHzEwABGgErAlkPUwFs
DbMBBgH0EwAB/wGSAfQB/wHzAbsBawLaBbkC9AW5AtoBigH3AfMB/wH0AZIB/woAAf8GrAG6AbMBDwIK
AWwC2wGLAQ0BDwGLAtsBkAG6AdsBugEVBg0BugHbAbQBDQEPAbMBugasAf8QAAGLAZANswGKAbsUAAEa
ASsBMgJZDVMBbA2zAYoB8xQAAZIBBwL/AfMBtQFrAbkC2gK5AdwC/wHcArkD2gGKAZEB8wL/AQcBkgsA
Af8GrAG6AbMBDgEKAQ8BQwPbA7oC2wK0AtsEugOLAbQC2wENAQ8BswG6BqwB/w8AAfQBig+zAWsB/xQA
AfQBmQExBVkJUwFsDbMBigHyFAAB9wHvAbwC/wHzAbsBawGQA9oB2wL0BNoBswFrAfcB8wL/AbwB7wGS
CwAB/wasAboBswEOAQoBDgENAboF3ALbAboBkQHcAdsD3AHhAbQCkQG0AtwBbAEKAbMBugasAf8PAAHw
AYoPswEGAfMWAAH0AZkBKwExATIBUwFZB1MBWQFsAbMMuQGKAfIUAAGSAfEB7wHxAv8C8wG0AWsBkAK5
At8CuQGzAYoBkQHxAfMC/wHxAe8B8QGSCwAB/wasAboBswEOAwoBkQHcBtsBtAFmAboE2wHcAbQDkQG6
AdwBiwENAbMBugasAf8PAAG7AZAPswGKAbsYAAH/AfMBGgExCVMBbAGzDLkBigH0FAABkgHyAfAB7wG8
Av8B9ALzAbsBkQGLAmsBiwGQAbUB8gHzAfQC/wG8Ae8B8AHyAZILAAH/BqwBugGzAQ4CCgINB0MDDQJD
A2YBQwENAUMBDQJDAg0BswG6BqwB/w8AAZARswGRGgABmQExCVMBSwGQAdoJuQHaAbkBawH/FAABkgLy
AfEB7wEHAfQC/wH0CPMB9AL/AfQBBwHvAfEC8gGSCwAB/wasAboBswIOAQoHDgEPAg0CDwEOBQ0BDwEN
AQ8BEAEPAgoBswG6BqwB/w4AAf8BaxGzAWsB/xkAAVIKUwFSAWsC2gi5AdoBswG7FQABkgTyApIBBwH0
Cv8B9AEHApIE8gGSCwAB/wasAboBswoKAg8CDQIOAQ8EDQEPAg4BDwEKAg4BswG6BqwB/w4AAfQBihGz
AYoB8xgAAfYBMQtZAUoBgQPaBLkD2gGKAfQVAAGSAfIB8wLyAZIB/wHxAfcB7wG8AvMC/wLzAbwB7wH3
AfEB/wGSAvIB8wHyAZILAAH/BqwBugG5AQoCDgcKAQ4BDwENAQ8CCgEOAQ8CDQIPAQ4BCgEOAgoBDgG5
AboGrAH/DgAB8QGKEbMBigHwGAABGwExC1kBUgHsAYEB2gHfBNoB3wG5AQYBvBYAAe8B8QHzAvIB7wH0
AgAB9AHwAQcB7wKSAe8BBwHwAfQCAAH0Ae8C8gHzAfEB7wsAAf8GrAHbAbkBCgEOAQoFDgEKAQ4DDwEO
AQoBDgEKAQ4CDwENAQ8DCgMOAbkB2wasAf8OAAG8AYoRswGQAbsYAAGZAVILWQFTAXQBvAGLAQYBkAG5
AbMBgQEGAZEB8hcAAQcB8AH0AvIBBwHyDgAB8gEHAvIB9AHwAQcLAAH/BqwCugEOAQAGCgEOAQoDDgEK
AQ4CCgEOAgoCDgEKAw4CAAK6BqwB/w4AAQcBkBKzAbsYAAF0AVMMWQErAf8BAAHzAfABuwG8AfMB/xkA
AfEBBwH/AvMCvA4AArwC8wH/AQcB8QsAAf8GrAGzAdsBbBoNAWwB2wGzBqwB/w4AAbsBkBKzAfcYAAFS
DVkBMQH/IAAB9AHvAf8B9AHzAfIB7wHzDAAB8wHvAfIB8wH0Af8B7wH0CwAB/wesAbkB2xq6AdsBuQes
Af8OAAHuAZASswG0GAABUg1ZATEB8yEAAQcB8gH/AvMB8AH3AfQKAAH0AfcB8ALzAf8B8gEHDAAB/wis
AbIaswGyCKwB/w4AAfABihG5AbMBtRgAAVINWQExARshAAHzAe8C/wLzAbwB9wHzCAAB8wH3AbwC8wL/
Ae8B8wwAAf8srAH/DgAB8wEGEbkBkAG7GAABUg1ZATEBGyIAAvAB/wH0AvMB8AHvAbwB8gH0Av8B9AHy
AbwB7wHwAvMB9AH/AvAOAAG6KqwBug8AAf8BaxG5AYoB8RgAAXkBUwxZATEB9CIAAfQBkgHzAf8B9APz
AfABBwHvApIB7wEHAfAD8wH0Af8B8wGSAfQOAAHzKqwB8xAAAfcBswHaDbkC2gFrAf8YAAEaAVIMWQEr
Af8jAAHyAfcB8gL/DPMC/wHyAfcB8g8AAf8qrAH/EAAB8wGKAtoMuQHaAbMBuxkAAf8BMQxZAZklAAHz
AZIB8AP/CPMD/wHwAZIB8xAAAf8B8yisAfMB/xEAAbsBswLaCrkC2gGKAfQaAAEaAVIBXglZATEB9CYA
AfQB8AHvAfIE/wL0BP8B8gHvAfAB9BIAAf8BCSasAQkB/xIAAfQBuwGzDNoBBgG7HAABmQFSAV4G5QFZ
ATEBGikAAfMBBwH3AbwB8gHzAv8B8wHyAbwB9wEHAfMVAAH/AQkkrAEJAf8UAAH0AbsBgQHaAd8F2gLf
AbkBBgG7HgABGgFSATEBUgFZAVgBUgExAXQBGywAAf8B8QEHAe8CkgHvAQcB8QH/GAAB/wHzAbIgrAGy
AfMB/xcAAfABkAEGAZABswK5ApABawG7AfQhAAHzARoBmQEaAfMB/1IAAf8B8wG7G6wBswG7AfMB/xsA
AfQB8AG8ArsB8AHyAf9+ABz/OgABQgFNAT4HAAE+AwABKAMAAcADAAFgAwABAQEAAQEGAAEJFgAD//8A
/wD/AP8AhQAN/wHAAgABAwH+Av8BwAEDBf8BAAEPB/8B/gQAAX8B/wHwAgABDwP/AeACAAF/Av8B4AEH
Av8B+AQAAR8B/wQAA/8BgAIAAR8C/wIAAv8B8AQAAQ8B/AQAAT8B/wH+AwABBwH/Af4CAAF/Af8B4AQA
AQcB8AQAAQ8B/wH8AwABAwH/AfgCAAEfAf8BwAQAAQMB4AQAAQcB/wH8AwABAwH/AfACAAEPAf8BwAQA
AQMBwAQAAQMB/wH4AwABAQH/AeACAAEHAf8BwAQAAQMBwAQAAQMB/wH4AwABAQH/AeACAAEHAf8BwAQA
AQMBwAQAAQMB/wH4AwABAQH/AcACAAEDAf8BgAQAAQEBwAQAAQMB/wH4AwABAQH/AYACAAEBAf8BgAQA
AQEBgAQAAQEB/wH8AwABAwH/AYACAAEBAf8BgAQAAQEBwAQAAQMB/wHwAwABAwH/BAAB/wGABAABAQHA
BAABAwH+BAABBwH/BAAB/wGABAABAQHABAABAwH4BAABBwH/BAAB/wGABAABAQHABAABAwHgBAABDwH/
BAAB/wGABAABAQHgBAABBwHABAABHwH/BAAB/wGABAABAQHgBAABBwHABAABfwH/BAAB/wGABAABAQHw
BAABDwGAAwABAwL/BAAB/wGABAABAQH4BAABHwGAAwABDwL/BAAB/wGABAABAQH8BAABPwGAAwABBwL/
BAAB/wGABAABAQH+BAABfwGAAwABBwL/BAAB/wGABAABAQH/AYACAAEBAf8BwAMAAQcC/wQAAf8BgAQA
AQEB/wHgAgABDwH/AcADAAEHAv8EAAH/AYAEAAEBAf8B/gIAAv8BwAMAAQMC/wGAAgABAQH/AYAEAAEB
Af8B/gIAAv8B4AMAAQMC/wGAAgABAQH/AYAEAAEBAf8B/gIAAv8B8AMAAQMC/wHAAgABAwH/AYAEAAEB
Af8B/AIAAX8B/wH4AwABAwL/AcACAAEDAf8BgAQAAQEB/wH8AgABfwH/Af4DAAEDAv8BwAIAAQMB/wGA
BAABAQH/AfwCAAF/Av8BgAIAAQMC/wHAAgABAwH/AYAEAAEBAf8B/AIAAX8C/wHgAgABAwL/AcACAAED
Af8BgAQAAQEB/wH4AgABPwL/AeACAAEHAv8BwAIAAQMB/wGABAABAQH/AfgCAAE/Av8BwAIAAQcC/wHA
AgABAwH/AYAEAAEBAf8B+AIAAT8C/wHAAgABDwL/AcABYAEGAQMB/wGABAABAQH/AfgCAAE/Av8BwAIA
AR8C/wHAAX8B/gEDAf8BgAQAAQEB/wH4AgABPwL/AcABAAEgAX8C/wHAAX8B/gEDAf8BgAQAAQEB/wH4
AgABPwL/AcABAAE/A/8BwAE/AfwBAwH/AYAEAAEBAf8B+AIAAT8C/wHAAQABPwP/AeABHwH4AQcB/wGA
BAABAQH/AfgCAAE/Av8BwAEAAT8D/wHgAQ8B8AEHAf8BgAQAAQEB/wH4AgABPwL/AcABAAE/A/8B8AIA
AQ8B/wHABAABAwH/AfgCAAE/Av8BwAEAAT8D/wHwAgABDwH/AcAEAAEDAf8B/AIAAT8C/wHAAQABPwP/
AfgCAAEfAf8BwAQAAQMB/wH8AgABfwL/AcABAAF/A/8B/AIAAT8B/wHABAABAwH/Af4CAAF/Av8B4AEA
AX8D/wH+AgABfwH/AeAEAAEHAf8B/gIAA/8B8AEABf8BgAEBAv8B8AQAAQ8C/wEAAQED/wH4AQEF/wHg
AQcC/wH4BAABHwL/AcABAwP/Af4BBwn/Af4EAAF/Av8B8AEPD/8BwAIAAQMH/ws=
</value>
</data>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">

@ -0,0 +1,121 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SCJMapper_V2.Layout
{
/// <summary>
/// defines the action grouping
/// </summary>
class ActionGroups
{
/// <summary>
/// All actionmap groups
/// </summary>
public enum EGroup
{
SpaceFlight = 0,
SpaceDefensive,
SpaceTargeting,
SpaceWeapons,
SpaceMining,
Player,
EVA,
Vehicle,
VehicleWeapons,
Lights,
Interaction,
Spectator,
Others,
}
private static Dictionary<EGroup, List<string>> m_actionDict;
/// <summary>
/// cTor
/// </summary>
static ActionGroups()
{
m_actionDict = new Dictionary<EGroup, List<string>>( );
// Define which maps belongs to which group
var x = new List<string>( ) { "spaceship_general", "spaceship_view", "spaceship_movement", "spaceship_docking", "spaceship_power", "IFCS_controls" };
m_actionDict.Add( EGroup.SpaceFlight, x );
x = new List<string>( ) { "spaceship_targeting", "spaceship_target_hailing", "spaceship_scanning", "spaceship_ping", "spaceship_radar" };
m_actionDict.Add( EGroup.SpaceTargeting, x );
x = new List<string>( ) { "spaceship_mining" };
m_actionDict.Add( EGroup.SpaceMining, x );
x = new List<string>( ) { "spaceship_turret", "spaceship_weapons", "spaceship_missiles", "spaceship_auto_weapons" };
m_actionDict.Add( EGroup.SpaceWeapons, x );
x = new List<string>( ) { "spaceship_defensive" };
m_actionDict.Add( EGroup.SpaceDefensive, x );
x = new List<string>( ) { "lights_controller" };
m_actionDict.Add( EGroup.Lights, x );
x = new List<string>( ) { "default", "prone", "player", "player_choice", "player_emotes", "player_input_optical_tracking" };
m_actionDict.Add( EGroup.Player, x );
x = new List<string>( ) { "zero_gravity_eva" };
m_actionDict.Add( EGroup.EVA, x );
x = new List<string>( ) { "vehicle_general", "vehicle_driver" };
m_actionDict.Add( EGroup.Vehicle, x );
x = new List<string>( ) { "vehicle_gunner" };
m_actionDict.Add( EGroup.VehicleWeapons, x );
x = new List<string>( ) { "spaceship_hud", "ui_textfield", "ui_notification" };
m_actionDict.Add( EGroup.Interaction, x );
x = new List<string>( ) { "spectator", "flycam", "view_director_mode" };
m_actionDict.Add( EGroup.Spectator, x );
x = new List<string>( ) { };
m_actionDict.Add( EGroup.Others, x );
}
/// <summary>
/// Return the names of the groups
/// </summary>
/// <returns></returns>
public static List<string> ActionGroupNames()
{
return Enum.GetNames( typeof( EGroup ) ).ToList( );
}
/// <summary>
/// Returns the list of actionmaps of a group
/// </summary>
/// <param name="eClass"></param>
/// <returns></returns>
public static List<string> ActionmapNames( EGroup eClass )
{
return m_actionDict[eClass];
}
/// <summary>
/// Returns the group from the actionmap
/// </summary>
/// <param name="actionmap"></param>
/// <returns></returns>
public static EGroup MapNameToGroup( string actionmap )
{
foreach ( var kv in m_actionDict ) {
if ( kv.Value.Contains( actionmap ) )
return kv.Key;
}
return EGroup.Others;
}
/// <summary>
/// Returns the group from the actiongroup name
/// </summary>
/// <param name="actiongroup"></param>
/// <returns></returns>
public static EGroup GroupNameToGroup( string actiongroup )
{
foreach ( var kv in m_actionDict ) {
if ( kv.Key.ToString( ) == actiongroup )
return kv.Key;
}
return EGroup.Others;
}
}
}

@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SCJMapper_V2.Layout
{
/// <summary>
/// One Action Item for the Layout process
/// </summary>
class ActionItem
{
/// <summary>
/// The Text Shown in the Map
/// </summary>
public string DispText { get; set; }
/// <summary>
/// The action map this item belongs to
/// </summary>
public string ActionMap { get; set; } = ""; // TODO may be set a color for this one later
// Input Device Refs
public string DeviceName { get; set; } = ""; // Device Name
public string DeviceProdGuid { get; set; } = ""; // Device Product GUID
public string InputType { get; set; } = ""; // K, M, J, G (keyb, mouse, joystick, gamepad)
// Command Input Ref - match required to find the display location
public string ControlInput { get; set; } = ""; // buttonN, hatN_up,_right,_down,_left, [rot]xyz, sliderN (CryInput notification)
}
}

@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SCJMapper_V2.Layout
{
/// <summary>
/// A list of ActionItems
/// </summary>
class ActionItemList : List<ActionItem>
{
/// <summary>
/// Get the Devices contained in the List
/// </summary>
public List<string> Devices
{
get {
var list = new List<string>( );
foreach ( var si in this ) {
if ( !list.Contains( si.DeviceName ) ) {
list.Add( si.DeviceName );
}
}
return list;
}
}
}
}

@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;
namespace SCJMapper_V2.Layout
{
/// <summary>
/// Reads a DeviceFile from a file or stream
/// </summary>
class ControllerJson
{
/// <summary>
/// Reads from a file one Controller entry
/// </summary>
/// <param name="jFilename">The Json Filename</param>
/// <returns>A Controller obj or null for errors</returns>
public static DeviceFile FromJson( string jFilename )
{
DeviceFile c = null;
string fn = jFilename;
if ( !File.Exists( jFilename ) ) {
fn = Path.Combine( TheUser.LayoutsDir, fn ); // if it is not found use the default path
}
if ( File.Exists( fn ) ) {
using ( var ts = File.OpenRead( jFilename ) ) {
c = FromJson( ts );
}
}
return c;
}
/// <summary>
/// Reads from the open stream one Controller entry
/// </summary>
/// <param name="jStream">An open stream at position</param>
/// <returns>A Controller obj or null for errors</returns>
public static DeviceFile FromJson( Stream jStream )
{
try {
var jsonSerializer = new DataContractJsonSerializer( typeof( DeviceFile ) );
object objResponse = jsonSerializer.ReadObject( jStream );
var jsonResults = objResponse as DeviceFile;
return jsonResults;
}
catch ( Exception e ) {
return null;
}
}
}
}

@ -0,0 +1,191 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace SCJMapper_V2.Layout
{
// The Json file for a controller
/*
{
"InputDevice" : {
"InputType": "Joystick",
"DeviceName": "SaitekX55Joystick",
"DeviceProdGuid": "{6dfb1c7b-7808-4f43-9dec-e9a4d83fcf4f}",
"MapImage": "x55-joystick.jpg",
"Controls": [
{ "Input": "B1", "Type": "Digital", "X": 2044, "Y": 604, "Width": 642, "Height": 108, "Cmt": "Primary trigger" },
...
]
}
}
*/
[DataContract]
class DeviceFile
{
[DataMember( IsRequired = true )]
public string MapName { get; set; }
[DataMember( IsRequired = true )]
public string MapImage { get; set; } // The map Image
[DataMember]
public List<Device> InputDevices { get; set; } = new List<Device>( );
/// <summary>
/// Create all possible ShapeItems for this Device
/// </summary>
public void CreateShapes()
{
for ( int i = 0; i < InputDevices.Count; i++ ) {
InputDevices[i].CreateShapes( );
}
}
/// <summary>
/// Find a Control entry with the given product guid and input command
/// </summary>
/// <param name="pGuid">the Device Prduct GUID</param>
/// <param name="item">the Item (device property)</param>
/// <returns>The found Control or Null</returns>
public Control FindItem( string pGuid, string item )
{
if ( string.IsNullOrEmpty( pGuid ) ) return null;
if ( string.IsNullOrEmpty( item ) ) return null;
for ( int i = 0; i < InputDevices.Count; i++ ) {
if ( InputDevices[i].DevicePIDVID.Contains( pGuid.Substring(1,8).ToLowerInvariant( ) ) ) {
return InputDevices[i].FindItem( item );
}
}
return null;
}
}
[DataContract]
class Device
{
[DataMember]
public string InputType { get; set; } // Joystick, Throttle, Pedal, Gamepad, Keyboard, Other
[DataMember]
public string DeviceName { get; set; } // The device name
[DataMember]
public List<string> DeviceProdGuid { get; set; } = new List<string>( ); // The device product GUIDs as read by DirecInput
[DataMember]
public List<Control> Controls { get; set; } = new List<Control>( );// The list of Controls supported (see below)
// non Json
/// <summary>
/// returns the PID VID part of the GUID (seems how this is composed in Win)
/// </summary>
public List<string> DevicePIDVID
{
get {
var ret = new List<string>( );
foreach ( string s in DeviceProdGuid ) {
string pv = s.Substring( 1, 8 ).ToLowerInvariant(); // this is "{12345678-0000-0000 etc}
ret.Add( pv );
}
return ret;
}
}
/// <summary>
/// Find a Control entry with the given input command
/// </summary>
/// <param name="item">the Item (device property)</param>
/// <returns>The found Control or Null</returns>
public Control FindItem( string item )
{
for ( int i = 0; i < Controls.Count; i++ ) {
if ( Controls[i].Input == item ) {
return Controls[i];
}
}
return null;
}
/// <summary>
/// Create all possible ShapeItems for this Device
/// </summary>
public void CreateShapes()
{
for ( int i = 0; i < Controls.Count; i++ ) {
Controls[i].CreateShapes( );
}
}
}
/// <summary>
/// One Device Input (command)
/// </summary>
[DataContract]
class Control
{
[DataMember]
public string Input { get; set; } = ""; // buttonN, hatN_up,_right,_down,_left, [rot]xyz, sliderN (CryInput notification)
[DataMember]
public string Type { get; set; } = ""; // "" or Analog or Digital
[DataMember]
public int X { get; set; } = 0; // X label pos (left=0)
[DataMember]
public int Y { get; set; } = 0; // Y label pos (top=0)
[DataMember]
public int Width { get; set; } = 600; // Label field width
[DataMember]
public int Height { get; set; } = 54; // Label field height
[DataMember]
public string Cmt { get; set; } // Comment
// non Json
/// <summary>
/// A queue with all available text fields
/// Take one and Insert the Display text and then add it to the DisplayList
/// If exhausted - well bad luck..
/// </summary>
public Queue<ShapeItem> ShapeItems = null;
// Base layout values to get enough fields and still have readable text
private const float c_baseFontSize = 16F;
/// <summary>
/// Create all possible ShapeItems for this Control
/// </summary>
public void CreateShapes()
{
// this is a bit messy...
// have to allocate a number of Rectangles to draw into but the layout rects are very different in size..
this.ShapeItems = new Queue<ShapeItem>( ); // get rid of previous ones
// create a reference font
int baseHeight = MapProps.MapFont.Height;
int baseWidth = MapProps.MapFont.Height * 12; // Lets see if this is good or needs adjustment
// live values from base
int nCols = Width / baseWidth;
int nLines = Height / baseHeight;
for ( int l = 0; l < nLines; l++ ) {
for ( int c = 0; c < nCols; c++ ) {
var sh = new ShapeItem {
X = X + c * baseWidth,
Y = Y + l * baseHeight,
Width = baseWidth,
Height = baseHeight
};
ShapeItems.Enqueue( sh );
}
}
}
}
}

@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SCJMapper_V2.Properties;
namespace SCJMapper_V2.Layout
{
/// <summary>
/// One Device Layout (from Json description)
/// </summary>
class DeviceLayout
{
public DeviceFile DeviceController { get; set; } = new DeviceFile( );
public string Filename { get; set; } = "";
/// <summary>
/// Returns the Display string for this object
/// </summary>
/// <returns></returns>
public override string ToString()
{
return DeviceController.MapName;
}
/// <summary>
/// Returns the background image from the appropriate folder
/// </summary>
/// <param name="imageFilename">The image filename</param>
/// <returns>An image or a dummy one if it does not exist</returns>
public Image Image
{
get {
string fn = this.DeviceController.MapImage;
if ( !File.Exists( fn ) ) {
fn = Path.Combine( TheUser.LayoutsDir, fn ); // if it is not found use the default path
}
if ( File.Exists( fn ) ) {
return Image.FromFile( fn );
}
else {
return Resources.page_notdefined;
}
}
}
}
}

@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SCJMapper_V2.Layout
{
/// <summary>
/// A display list of items to be drawn in the paint event
/// </summary>
class DisplayList : List<IShape>
{
/// <summary>
/// Draw all items in the list
/// </summary>
/// <param name="g">Graphics context to draw to</param>
public void DrawList( Graphics g )
{
foreach ( var item in this ) {
item.DrawShape( g );
}
}
}
}

@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SCJMapper_V2.Layout
{
/// <summary>
/// Subclassing the Panel to draw on it
/// Sets the graphics props to avoid flicker
/// </summary>
class DrawPanel : System.Windows.Forms.Panel
{
public DrawPanel()
{
this.SetStyle(
System.Windows.Forms.ControlStyles.UserPaint |
System.Windows.Forms.ControlStyles.AllPaintingInWmPaint |
System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer,
true );
}
public Image BackgroundImageResized
{
get => base.BackgroundImage;
set {
base.BackgroundImage = value;
this.Size = base.BackgroundImage.Size; // autosize the panel to the image size
this.Refresh( );
}
}
}
}

@ -0,0 +1,387 @@
namespace SCJMapper_V2.Layout
{
partial class FormLayout
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose( bool disposing )
{
if ( disposing && ( components != null ) ) {
components.Dispose( );
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormLayout));
this.tlPanel = new System.Windows.Forms.TableLayoutPanel();
this.chkLbActionGroups = new System.Windows.Forms.ListView();
this.chkLbActionMaps = new System.Windows.Forms.ListView();
this.pnlInput = new System.Windows.Forms.Panel();
this.btColors = new System.Windows.Forms.Button();
this.btSave = new System.Windows.Forms.Button();
this.btLayout = new System.Windows.Forms.Button();
this.cbxLayouts = new System.Windows.Forms.ComboBox();
this.drawPanel = new System.Windows.Forms.Panel();
this.gbxColors = new System.Windows.Forms.GroupBox();
this.label2 = new System.Windows.Forms.Label();
this.btAcceptColors = new System.Windows.Forms.Button();
this.lblTextColor = new System.Windows.Forms.Label();
this.lblTest = new System.Windows.Forms.Label();
this.lblBackColor = new System.Windows.Forms.Label();
this.chkLbActionGroupsColor = new System.Windows.Forms.ListView();
this.btCancelColors = new System.Windows.Forms.Button();
this.SFD = new System.Windows.Forms.SaveFileDialog();
this.colDlg = new System.Windows.Forms.ColorDialog();
this.tbFontSize = new System.Windows.Forms.TrackBar();
this.lblFontSize = new System.Windows.Forms.Label();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.tlPanel.SuspendLayout();
this.pnlInput.SuspendLayout();
this.drawPanel.SuspendLayout();
this.gbxColors.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.tbFontSize)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// tlPanel
//
this.tlPanel.ColumnCount = 2;
this.tlPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 180F));
this.tlPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tlPanel.Controls.Add(this.chkLbActionGroups, 0, 1);
this.tlPanel.Controls.Add(this.chkLbActionMaps, 0, 2);
this.tlPanel.Controls.Add(this.pnlInput, 0, 0);
this.tlPanel.Controls.Add(this.drawPanel, 1, 1);
this.tlPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.tlPanel.Location = new System.Drawing.Point(0, 0);
this.tlPanel.Name = "tlPanel";
this.tlPanel.RowCount = 3;
this.tlPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 80F));
this.tlPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.tlPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 75F));
this.tlPanel.Size = new System.Drawing.Size(1298, 640);
this.tlPanel.TabIndex = 0;
//
// chkLbActionGroups
//
this.chkLbActionGroups.Activation = System.Windows.Forms.ItemActivation.OneClick;
this.chkLbActionGroups.CheckBoxes = true;
this.chkLbActionGroups.Dock = System.Windows.Forms.DockStyle.Fill;
this.chkLbActionGroups.FullRowSelect = true;
this.chkLbActionGroups.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
this.chkLbActionGroups.HideSelection = false;
this.chkLbActionGroups.HoverSelection = true;
this.chkLbActionGroups.LabelWrap = false;
this.chkLbActionGroups.Location = new System.Drawing.Point(3, 83);
this.chkLbActionGroups.MultiSelect = false;
this.chkLbActionGroups.Name = "chkLbActionGroups";
this.chkLbActionGroups.ShowGroups = false;
this.chkLbActionGroups.Size = new System.Drawing.Size(174, 134);
this.chkLbActionGroups.TabIndex = 5;
this.chkLbActionGroups.UseCompatibleStateImageBehavior = false;
this.chkLbActionGroups.View = System.Windows.Forms.View.Details;
this.chkLbActionGroups.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.chkLbActionGroups_ItemCheck);
//
// chkLbActionMaps
//
this.chkLbActionMaps.Activation = System.Windows.Forms.ItemActivation.OneClick;
this.chkLbActionMaps.CheckBoxes = true;
this.chkLbActionMaps.Dock = System.Windows.Forms.DockStyle.Fill;
this.chkLbActionMaps.FullRowSelect = true;
this.chkLbActionMaps.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
this.chkLbActionMaps.HideSelection = false;
this.chkLbActionMaps.HoverSelection = true;
this.chkLbActionMaps.LabelWrap = false;
this.chkLbActionMaps.Location = new System.Drawing.Point(3, 223);
this.chkLbActionMaps.MultiSelect = false;
this.chkLbActionMaps.Name = "chkLbActionMaps";
this.chkLbActionMaps.ShowGroups = false;
this.chkLbActionMaps.ShowItemToolTips = true;
this.chkLbActionMaps.Size = new System.Drawing.Size(174, 414);
this.chkLbActionMaps.TabIndex = 6;
this.chkLbActionMaps.UseCompatibleStateImageBehavior = false;
this.chkLbActionMaps.View = System.Windows.Forms.View.Details;
//
// pnlInput
//
this.tlPanel.SetColumnSpan(this.pnlInput, 2);
this.pnlInput.Controls.Add(this.pictureBox1);
this.pnlInput.Controls.Add(this.btColors);
this.pnlInput.Controls.Add(this.btSave);
this.pnlInput.Controls.Add(this.btLayout);
this.pnlInput.Controls.Add(this.cbxLayouts);
this.pnlInput.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnlInput.Location = new System.Drawing.Point(3, 3);
this.pnlInput.Name = "pnlInput";
this.pnlInput.Size = new System.Drawing.Size(1292, 74);
this.pnlInput.TabIndex = 1;
//
// btColors
//
this.btColors.Image = global::SCJMapper_V2.Properties.Resources.Settings;
this.btColors.Location = new System.Drawing.Point(651, 15);
this.btColors.Name = "btColors";
this.btColors.Size = new System.Drawing.Size(80, 54);
this.btColors.TabIndex = 5;
this.btColors.UseVisualStyleBackColor = true;
this.btColors.Click += new System.EventHandler(this.btColors_Click);
//
// btSave
//
this.btSave.Image = ((System.Drawing.Image)(resources.GetObject("btSave.Image")));
this.btSave.Location = new System.Drawing.Point(534, 15);
this.btSave.Name = "btSave";
this.btSave.Size = new System.Drawing.Size(80, 54);
this.btSave.TabIndex = 4;
this.btSave.UseVisualStyleBackColor = true;
this.btSave.Click += new System.EventHandler(this.btSave_Click);
//
// btLayout
//
this.btLayout.Image = ((System.Drawing.Image)(resources.GetObject("btLayout.Image")));
this.btLayout.Location = new System.Drawing.Point(383, 16);
this.btLayout.Name = "btLayout";
this.btLayout.Size = new System.Drawing.Size(80, 53);
this.btLayout.TabIndex = 3;
this.btLayout.UseVisualStyleBackColor = true;
this.btLayout.Click += new System.EventHandler(this.btLayout_Click);
//
// cbxLayouts
//
this.cbxLayouts.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.cbxLayouts.FormattingEnabled = true;
this.cbxLayouts.Location = new System.Drawing.Point(91, 30);
this.cbxLayouts.Name = "cbxLayouts";
this.cbxLayouts.Size = new System.Drawing.Size(269, 25);
this.cbxLayouts.TabIndex = 1;
this.cbxLayouts.SelectedIndexChanged += new System.EventHandler(this.cbxLayouts_SelectedIndexChanged);
//
// drawPanel
//
this.drawPanel.AutoScroll = true;
this.drawPanel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.drawPanel.Controls.Add(this.gbxColors);
this.drawPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.drawPanel.Location = new System.Drawing.Point(183, 83);
this.drawPanel.Name = "drawPanel";
this.tlPanel.SetRowSpan(this.drawPanel, 2);
this.drawPanel.Size = new System.Drawing.Size(1112, 554);
this.drawPanel.TabIndex = 2;
//
// gbxColors
//
this.gbxColors.BackColor = System.Drawing.Color.Gray;
this.gbxColors.Controls.Add(this.lblFontSize);
this.gbxColors.Controls.Add(this.tbFontSize);
this.gbxColors.Controls.Add(this.label2);
this.gbxColors.Controls.Add(this.btAcceptColors);
this.gbxColors.Controls.Add(this.lblTextColor);
this.gbxColors.Controls.Add(this.lblTest);
this.gbxColors.Controls.Add(this.lblBackColor);
this.gbxColors.Controls.Add(this.chkLbActionGroupsColor);
this.gbxColors.Controls.Add(this.btCancelColors);
this.gbxColors.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.gbxColors.Location = new System.Drawing.Point(17, 16);
this.gbxColors.Name = "gbxColors";
this.gbxColors.Size = new System.Drawing.Size(534, 418);
this.gbxColors.TabIndex = 0;
this.gbxColors.TabStop = false;
this.gbxColors.Text = "Layout Settings";
this.gbxColors.Visible = false;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(248, 243);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(247, 78);
this.label2.TabIndex = 12;
this.label2.Text = "Select an entry in the list and then click above \r\nto assing colors.\r\n\r\nNote: \r\nW" +
"hite background is treated as Transparent\r\nwhile drawing items to the image.";
//
// btAcceptColors
//
this.btAcceptColors.Location = new System.Drawing.Point(234, 370);
this.btAcceptColors.Name = "btAcceptColors";
this.btAcceptColors.Size = new System.Drawing.Size(129, 26);
this.btAcceptColors.TabIndex = 11;
this.btAcceptColors.Text = "Accept";
this.btAcceptColors.UseVisualStyleBackColor = true;
this.btAcceptColors.Click += new System.EventHandler(this.btAcceptColors_Click);
//
// lblTextColor
//
this.lblTextColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.lblTextColor.Cursor = System.Windows.Forms.Cursors.Hand;
this.lblTextColor.Location = new System.Drawing.Point(281, 181);
this.lblTextColor.Name = "lblTextColor";
this.lblTextColor.Size = new System.Drawing.Size(157, 32);
this.lblTextColor.TabIndex = 8;
this.lblTextColor.Text = "Text Color";
this.lblTextColor.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.lblTextColor.Click += new System.EventHandler(this.lblTextColor_Click);
//
// lblTest
//
this.lblTest.BackColor = System.Drawing.Color.Transparent;
this.lblTest.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.lblTest.Font = new System.Drawing.Font("Tahoma", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblTest.Location = new System.Drawing.Point(234, 89);
this.lblTest.Name = "lblTest";
this.lblTest.Size = new System.Drawing.Size(245, 49);
this.lblTest.TabIndex = 10;
this.lblTest.Text = "Color Test Label";
this.lblTest.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// lblBackColor
//
this.lblBackColor.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.lblBackColor.Cursor = System.Windows.Forms.Cursors.Hand;
this.lblBackColor.Location = new System.Drawing.Point(251, 162);
this.lblBackColor.Name = "lblBackColor";
this.lblBackColor.Size = new System.Drawing.Size(211, 71);
this.lblBackColor.TabIndex = 9;
this.lblBackColor.Text = "Background Color";
this.lblBackColor.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
this.lblBackColor.Click += new System.EventHandler(this.lblBackColor_Click);
//
// chkLbActionGroupsColor
//
this.chkLbActionGroupsColor.Activation = System.Windows.Forms.ItemActivation.OneClick;
this.chkLbActionGroupsColor.FullRowSelect = true;
this.chkLbActionGroupsColor.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.None;
this.chkLbActionGroupsColor.HideSelection = false;
this.chkLbActionGroupsColor.HoverSelection = true;
this.chkLbActionGroupsColor.LabelWrap = false;
this.chkLbActionGroupsColor.Location = new System.Drawing.Point(20, 30);
this.chkLbActionGroupsColor.MultiSelect = false;
this.chkLbActionGroupsColor.Name = "chkLbActionGroupsColor";
this.chkLbActionGroupsColor.ShowGroups = false;
this.chkLbActionGroupsColor.Size = new System.Drawing.Size(189, 291);
this.chkLbActionGroupsColor.TabIndex = 7;
this.chkLbActionGroupsColor.UseCompatibleStateImageBehavior = false;
this.chkLbActionGroupsColor.View = System.Windows.Forms.View.Details;
this.chkLbActionGroupsColor.ItemActivate += new System.EventHandler(this.chkLbActionGroupsColor_ItemActivate);
//
// btCancelColors
//
this.btCancelColors.Location = new System.Drawing.Point(382, 370);
this.btCancelColors.Name = "btCancelColors";
this.btCancelColors.Size = new System.Drawing.Size(129, 26);
this.btCancelColors.TabIndex = 6;
this.btCancelColors.Text = "Cancel";
this.btCancelColors.UseVisualStyleBackColor = true;
this.btCancelColors.Click += new System.EventHandler(this.btCloseColors_Click);
//
// SFD
//
this.SFD.DefaultExt = "png";
this.SFD.SupportMultiDottedExtensions = true;
this.SFD.Title = "Save Map Image";
//
// colDlg
//
this.colDlg.AnyColor = true;
this.colDlg.FullOpen = true;
//
// tbFontSize
//
this.tbFontSize.LargeChange = 2;
this.tbFontSize.Location = new System.Drawing.Point(248, 30);
this.tbFontSize.Maximum = 22;
this.tbFontSize.Minimum = 12;
this.tbFontSize.Name = "tbFontSize";
this.tbFontSize.Size = new System.Drawing.Size(160, 45);
this.tbFontSize.SmallChange = 2;
this.tbFontSize.TabIndex = 13;
this.tbFontSize.TickFrequency = 2;
this.tbFontSize.TickStyle = System.Windows.Forms.TickStyle.Both;
this.tbFontSize.Value = 16;
this.tbFontSize.Scroll += new System.EventHandler(this.tbFontSize_Scroll);
//
// lblFontSize
//
this.lblFontSize.AutoSize = true;
this.lblFontSize.Font = new System.Drawing.Font("Segoe UI", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblFontSize.Location = new System.Drawing.Point(428, 35);
this.lblFontSize.Name = "lblFontSize";
this.lblFontSize.Size = new System.Drawing.Size(37, 30);
this.lblFontSize.TabIndex = 14;
this.lblFontSize.Text = "16";
//
// pictureBox1
//
this.pictureBox1.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("pictureBox1.BackgroundImage")));
this.pictureBox1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.pictureBox1.Location = new System.Drawing.Point(3, 3);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(82, 71);
this.pictureBox1.TabIndex = 6;
this.pictureBox1.TabStop = false;
//
// FormLayout
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1298, 640);
this.Controls.Add(this.tlPanel);
this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MinimizeBox = false;
this.Name = "FormLayout";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Device Layout";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormLayout_FormClosing);
this.Load += new System.EventHandler(this.FormLayout_Load);
this.tlPanel.ResumeLayout(false);
this.pnlInput.ResumeLayout(false);
this.drawPanel.ResumeLayout(false);
this.gbxColors.ResumeLayout(false);
this.gbxColors.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.tbFontSize)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tlPanel;
private System.Windows.Forms.Panel pnlInput;
private System.Windows.Forms.Button btLayout;
private System.Windows.Forms.ComboBox cbxLayouts;
private System.Windows.Forms.Panel drawPanel;
private System.Windows.Forms.ListView chkLbActionMaps;
private System.Windows.Forms.ListView chkLbActionGroups;
private System.Windows.Forms.Button btSave;
private System.Windows.Forms.SaveFileDialog SFD;
private System.Windows.Forms.Button btColors;
private System.Windows.Forms.GroupBox gbxColors;
private System.Windows.Forms.Button btCancelColors;
private System.Windows.Forms.Label lblTest;
private System.Windows.Forms.ListView chkLbActionGroupsColor;
private System.Windows.Forms.Label lblBackColor;
private System.Windows.Forms.Label lblTextColor;
private System.Windows.Forms.ColorDialog colDlg;
private System.Windows.Forms.Button btAcceptColors;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TrackBar tbFontSize;
private System.Windows.Forms.Label lblFontSize;
private System.Windows.Forms.PictureBox pictureBox1;
}
}

@ -0,0 +1,351 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using SCJMapper_V2.Common;
using SCJMapper_V2.Translation;
using SCJMapper_V2.Actions;
using SCJMapper_V2.SC;
using static SCJMapper_V2.Layout.ActionGroups;
using System.IO;
namespace SCJMapper_V2.Layout
{
public partial class FormLayout : Form
{
// Graphics
private DrawPanel m_dPanel = new DrawPanel( ); // draw panel
private DrawPanel m_sPanel = new DrawPanel( ); // show panel
private DisplayList m_displayList = new DisplayList( );
private readonly Color COL_OK = Color.LightGreen;
private readonly Color COL_ERR = Color.Gold;
private Layouts m_layouts = null;
internal ActionItemList ActionList { get; set; } = null;
public FormLayout()
{
InitializeComponent( );
}
/// <summary>
/// Local to support the handling
/// </summary>
private class ActionMapItem
{
public string ActionMap = "";
public string ActionMapDisp = "";
public override string ToString()
{
return ActionMapDisp;
}
}
// the item index is shared with the checkbox list in the GUI
private List<ActionMapItem> m_chkLbActionMaps = new List<ActionMapItem>( );
private void FormLayout_Load( object sender, EventArgs e )
{
Tx.LocalizeControlTree( this );
AppSettings.Instance.Reload( );
// Assign Size property - check if on screen, else use defaults
if ( Commons.IsOnScreen( new Rectangle( AppSettings.Instance.FormLayoutLocation, AppSettings.Instance.FormLayoutSize ) ) ) {
this.Size = AppSettings.Instance.FormLayoutSize;
this.Location = AppSettings.Instance.FormLayoutLocation;
}
// Action Groups
// Main dialog
chkLbActionGroups.Items.Clear( );
chkLbActionGroups.Columns.Add( "Actiongroups", chkLbActionMaps.Width );
foreach ( var s in ActionGroups.ActionGroupNames( ) ) {
var item = chkLbActionGroups.Items.Add( s );
item.ForeColor = MapProps.GroupColor( GroupNameToGroup( s ) ).ForeColor;
item.BackColor = MapProps.GroupColor( GroupNameToGroup( s ) ).BackColor;
}
// color settings
chkLbActionGroupsColor.Items.Clear( );
chkLbActionGroupsColor.Columns.Add( "Actiongroups", chkLbActionMaps.Width );
foreach ( var s in ActionGroups.ActionGroupNames( ) ) {
var item = chkLbActionGroupsColor.Items.Add( s );
item.ForeColor = MapProps.GroupColor( GroupNameToGroup( s ) ).ForeColor;
item.BackColor = MapProps.GroupColor( GroupNameToGroup( s ) ).BackColor;
}
// Action Maps
chkLbActionMaps.Items.Clear( ); m_chkLbActionMaps.Clear( );
chkLbActionMaps.Columns.Add( "Actionmaps", chkLbActionMaps.Width );
foreach ( EGroup g in Enum.GetValues( typeof( EGroup ) ) ) {
var aMaps = ActionmapNames( g );
foreach ( var aMap in aMaps ) {
if ( !AppSettings.Instance.IgnoreActionmaps.Contains( "," + aMap + "," ) ) {
var ami = new ActionMapItem( ) {
ActionMap = aMap,
ActionMapDisp = SCUiText.Instance.Text( aMap )
};
m_chkLbActionMaps.Add( ami );
var item = chkLbActionMaps.Items.Add( ami.ActionMapDisp );
item.ToolTipText = ami.ActionMap;
item.ForeColor = MapProps.MapColor( ami.ActionMap ).ForeColor;
item.BackColor = MapProps.MapColor( ami.ActionMap ).BackColor;
}
}
}
// Layouts
m_layouts = new Layouts( );
foreach ( var l in m_layouts ) {
cbxLayouts.Items.Add( l );
}
if ( cbxLayouts.Items.Count > 0 ) cbxLayouts.SelectedIndex = 0;
// Draw Panel
// drawPanel.Controls.Add( m_dPanel );
// m_dPanel.Top = 0; m_dPanel.Left = 0;
this.Controls.Add( m_dPanel );
m_dPanel.Top = 0; m_dPanel.Left = this.Width + 2000; // out of view
m_dPanel.Visible = false;
m_dPanel.AutoSize = true;
m_dPanel.BackgroundImageLayout = ImageLayout.None;
m_dPanel.BackColor = Color.SpringGreen;
m_dPanel.BackgroundImageResized = ( cbxLayouts.SelectedItem as DeviceLayout ).Image;
m_dPanel.Paint += M_dPanel_Paint;
drawPanel.Controls.Add( m_sPanel );
m_sPanel.Top = 0; m_sPanel.Left = 0;
m_sPanel.AutoSize = false;
m_sPanel.Dock = DockStyle.Fill;
m_sPanel.BackgroundImageLayout = ImageLayout.Zoom;
RefreshPanel( );
}
private void FormLayout_FormClosing( object sender, FormClosingEventArgs e )
{
// don't record minimized, maximized forms
if ( this.WindowState == FormWindowState.Normal ) {
AppSettings.Instance.FormLayoutSize = this.Size;
AppSettings.Instance.FormLayoutLocation = this.Location;
}
AppSettings.Instance.Save( );
}
#region dPanel Events
private void M_dPanel_Paint( object sender, PaintEventArgs e )
{
Graphics g = e.Graphics;
m_displayList.DrawList( g );
}
private void RefreshPanel()
{
m_dPanel.Refresh( );
var b = new Bitmap( m_dPanel.Width, m_dPanel.Height );
m_dPanel.DrawToBitmap( b, new Rectangle( 0, 0, b.Width, b.Height ) );
m_sPanel.BackgroundImage = b;
}
#endregion
/// <summary>
/// Matches for any selection possible
/// e.g. action maps selected etc.
/// </summary>
/// <param name="action">The actionItem</param>
/// <returns>True to map</returns>
private bool MatchCriteria( ActionItem action )
{
// is the map checked?
foreach ( int idx in chkLbActionMaps.CheckedIndices ) {
if ( m_chkLbActionMaps[idx].ActionMap == action.ActionMap ) return true;
}
return false; // TODO (add criterias)
}
/// <summary>
/// Populate the display list from the Items found in the ActionTree
/// </summary>
private void Populate()
{
// for all actions found from action tree
m_displayList.Clear( );
( cbxLayouts.SelectedItem as DeviceLayout ).DeviceController.CreateShapes( );
foreach ( var si in ActionList ) {
// if ( si.DeviceName == cbxDevices.SelectedItem.ToString( ) ) {
// matches the selected device
if ( MatchCriteria( si ) ) {
var ctrl = ( cbxLayouts.SelectedItem as DeviceLayout ).DeviceController.FindItem( si.DeviceProdGuid, si.ControlInput );
if ( ctrl != null ) {
if ( ctrl.ShapeItems.Count > 0 ) {
var shape = ctrl.ShapeItems.Dequeue( );
shape.DispText = si.DispText;
shape.TextColor = MapProps.MapForeColor( si.ActionMap );
shape.BackColor = MapProps.MapBackColor( si.ActionMap );
m_displayList.Add( shape );
}
}
}
// }
}
}
// Event Handlers
private void btLayout_Click( object sender, EventArgs e )
{
Populate( );
RefreshPanel( );
}
private void cbxLayouts_SelectedIndexChanged( object sender, EventArgs e )
{
m_displayList.Clear( );
m_dPanel.BackgroundImageResized = ( cbxLayouts.SelectedItem as DeviceLayout ).Image;
RefreshPanel( );
}
private void chkLbActionGroups_ItemCheck( object sender, ItemCheckEventArgs e )
{
var group = (EGroup)e.Index;
var gNames = ActionmapNames( group );
for ( int idx = 0; idx < chkLbActionMaps.Items.Count; idx++ ) {
if ( gNames.Contains( m_chkLbActionMaps[idx].ActionMap ) ) {
chkLbActionMaps.Items[idx].Checked = ( e.NewValue == CheckState.Checked ) ? true : false;
}
}
}
private void btSave_Click( object sender, EventArgs e )
{
SFD.Filter = "PNG Files|*.png|Jpg Files|*.jpg|All Files|*.*";
SFD.DefaultExt = "png";
if ( SFD.ShowDialog( this ) == DialogResult.OK ) {
var b = new Bitmap( m_dPanel.Width, m_dPanel.Height );
m_dPanel.DrawToBitmap( b, new Rectangle( 0, 0, b.Width, b.Height ) );
string ext = Path.GetExtension( SFD.FileName );
if ( ext.ToLowerInvariant( ) == ".jpg" ) {
b.Save( SFD.FileName, ImageFormat.Jpeg );
}
else if ( ext.ToLowerInvariant( ) == ".png" ) {
b.Save( SFD.FileName, ImageFormat.Png );
}
else {
MessageBox.Show( "Unkown fileformat - use jpg or png please", "Save Image Error", MessageBoxButtons.OK, MessageBoxIcon.Error );
}
}
}
#region Color Setting Handling
private int m_colSelGroup = -1; // index of selected group
private void btColors_Click( object sender, EventArgs e )
{
pnlInput.Enabled = false;
m_sPanel.Visible = false;
tbFontSize.Value = MapProps.FontSize; lblFontSize.Text = MapProps.FontSize.ToString( );
lblTest.Font = MapProps.MapFont;
gbxColors.Visible = true;
}
private void btCloseColors_Click( object sender, EventArgs e )
{
gbxColors.Visible = false;
pnlInput.Enabled = true;
m_sPanel.Visible = true;
}
private void btAcceptColors_Click( object sender, EventArgs e )
{
// carry values to MapProps
MapProps.FontSize = int.Parse( lblFontSize.Text );
foreach ( ListViewItem lv in chkLbActionGroupsColor.Items ) {
MapProps.SetMapColor( (EGroup)lv.Index, lv.ForeColor, lv.BackColor );
}
MapProps.SaveToSettings( );
// recolor the selection in main
foreach ( ListViewItem item in chkLbActionGroups.Items ) {
item.ForeColor = MapProps.GroupColor( (EGroup)item.Index ).ForeColor;
item.BackColor = MapProps.GroupColor( (EGroup)item.Index ).BackColor;
}
foreach ( ListViewItem item in chkLbActionMaps.Items ) {
item.ForeColor = MapProps.GroupColor( MapNameToGroup( item.ToolTipText) ).ForeColor;
item.BackColor = MapProps.GroupColor( MapNameToGroup( item.ToolTipText ) ).BackColor;
}
gbxColors.Visible = false;
pnlInput.Enabled = true;
m_sPanel.Visible = true;
}
private void lblTextColor_Click( object sender, EventArgs e )
{
if ( m_colSelGroup >= 0 ) {
colDlg.Color = lblTest.ForeColor;
if ( colDlg.ShowDialog( this ) == DialogResult.OK ) {
lblTest.ForeColor = colDlg.Color;
chkLbActionGroupsColor.Items[m_colSelGroup].ForeColor = colDlg.Color;
}
}
else {
MySounds.PlayCannot( );
}
}
private void lblBackColor_Click( object sender, EventArgs e )
{
if ( m_colSelGroup >= 0 ) {
colDlg.Color = lblTest.BackColor;
if ( colDlg.ShowDialog( this ) == DialogResult.OK ) {
lblTest.BackColor = colDlg.Color;
chkLbActionGroupsColor.Items[m_colSelGroup].BackColor = colDlg.Color;
}
}
else {
MySounds.PlayCannot( );
}
}
private void chkLbActionGroupsColor_ItemActivate( object sender, EventArgs e )
{
foreach ( ListViewItem item in chkLbActionGroupsColor.SelectedItems ) {
m_colSelGroup = item.Index;
lblTest.Text = item.Text;
lblTest.ForeColor = item.ForeColor; lblTextColor.BackColor = item.ForeColor;
lblTest.BackColor = item.BackColor; lblBackColor.BackColor = item.BackColor;
}
}
private void tbFontSize_Scroll( object sender, EventArgs e )
{
lblFontSize.Text = tbFontSize.Value.ToString( );
lblTest.Font = new Font( lblTest.Font.FontFamily, tbFontSize.Value ); ;
}
#endregion
}
}

@ -0,0 +1,830 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="pictureBox1.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
QmCC
</value>
</data>
<data name="btSave.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAASaSURBVGhD1Zn9T1tVGMeLRuOii1mMMSYCi+8mvqBRY3zdmGiMS/zBn/1HdL8YwfmCQ8PccCHM
uBiNW1ic6OILhtCtbBVKW1s7GAFCZJeWl7YWZF0bHs/3ZHeee865d8dabtqbfEJ7ePp9vh9S1o4GiKiu
0R7WE9rDekJ7WE9oD+sJ5SD6ZsDmBcbXjD8ZZDPSsY2GOhs3DeSL+xjYjx7ow7uJfR13wOWh9uTeLZSN
P0eX8q+z4zeugCXLy8vsdvWvXC7H88V92I8e6INeJgKtqQ9vorK1m8h6jSj5CpUjL1Nx9CUOFkQiEYrF
YpRMJmliYoJmZmZofn6eMpkML7G2tkbFYpHK5TJtbGxwcBtn+B5mFhcX+WPw2MnJSZ6FTOTbu7AX+9Gj
vLCbznVuhUSb2NdRHrCBo7kfWojOv0qlMRb0W5uDSgTwGBlPAWkneqBP7uSjEOgX+zrKAzaQWz+9gyjG
yodfVMCCSgTkDE8BYdYGfdZDOyFQEPs6ygM2QMUzu+jS2V38q0zFAlKGp4Awa2P3QT+x75UbNlxgZKcr
FQtIGZ4CwqyMkcBF9hRyo1IBOcNLQJyVMRMIPu9KxQJShqeAMCtjJjD8rCsVC0gZngLCrIyZwNDTrgS7
mmksfOq/CwgZbgLRyFkK7mtyzMqYCfz6lCvx3nsp/OMBYwFcKCxTKpUUgdGfe3i+bq+NmcAvT7qSPv4I
DR9kP4nRU8YCbpcokIieoeDBZ3i+bq+NmcBPj3ty/ov7abi7hSKDPZSKj3gK4CkEcBtn+B5m7KfQVGqM
YkO9NLy/hefq9omYCZx87Kpkjj1E8UN30+mPm7VPEVPweOQgT7dHxkhg/fuWmsVM4LuHaxYzgW8frFnM
BPofqFnMBI7dV7OYCXxzjyvpI3fR7we2U6irSfuvSqUgD7nI1+21MRL4+6s7tUx+1kwjPU9Q5twJuliw
2Hj1LuQhF/nYo9sPzAS+3K6wcLiZwn07qLSeZWPEX5Ty+Txls9n/DXKQhwv54cOtZPUxCU0PM4EjTQrx
/Y00nzjOX1XxSrqyslJ1kIv8C8kTFOtu1PYwE/j8DoXgR42UvjBLhUKBlpaWNg3kZ6w5vk/Xw0yg73YF
/KLhvQ7ew+DrZmHnY5+uh5lA720KCEyn0xzLsigUClUdOx9wAU0PI4G1Q7cqIBDF/QL7dD3MBHpuUUAg
3v76BRfQ9DAT+HSbAgLn5uZ8gwtoepgJdN+sgMDZ2Vnf4AKaHmYCn2xVQOD09DRnamqKBgcHq46dD7iA
poeZQNeNCghEcb/gApoeZgL7tiggEP+B9wsuoOlhJtB5gwICU6mUb3ABTQ8jgdUPrldAIP6M4hfYp+th
IpD7673raPV9JwhMJBKceDxOAwMDVcfOB1xA6oBerN9VPx/oT79zDa3uvdYBAlHcL7iA1AG90E/s6ygP
2EDbH3sClO9gEu/+CwKj0ahvcAFhP/qgF/qJfR3lARsA7Ym3ArTwdgPl2xtotaOBB46Pj/sGF2B7sR89
0Ae90E/s67gDLguAVsZRhsXY9M+HZYTPi7EfPdCHdxP7Ou7UI9rD+oEC/wDpn39oHcs5EQAAAABJRU5E
rkJggg==
</value>
</data>
<data name="btLayout.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
0HW+PUD8F0cdfEVoSwiLAAAAAElFTkSuQmCC
</value>
</data>
<metadata name="SFD.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="colDlg.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>90, 17</value>
</metadata>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAQEAAAAEAIAAoQgAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANvc
3yTb2+Ak29viJNvb4iTb2+Mk29rlJNvb5iTb3OYk29zmJNvd5yTb3uck293nJNvd5yTb3egk29vgJNvb
3STb2+Ak29vhJNvb4STb2+Ak29vhJNvb4CTb298k29vgJNvb3yTb294k29vfJNvb3STb290k29veJNvb
3STb298k29vhJNvb5CTb2+Yk29vmJNvb5CTb2+Ik29viJNvb4STb294k29vbJNvb2yTb29sk29vbJNvb
2yTb29sk29vbJNvb3STb294k29vcJNvb3iTb294k29vfJNvb3yTb298k29vfJNvb3STb29sk29vbJNvb
2yTb29sk29vbJNvb3CQHCDn6BQU/+gUFRvoFBE36BQlW+gUTYfoFHGj6BR1q+gUjbvoFKnX6BSp0+gUp
cvoFKXP6BSh0+gUWVPoFBDD6BQU7+gUFQfoFBUn6BQVE+gUFR/oFBUP6BQU7+gUFP/oFBTz6BQU4+gUF
NvoFBS36BQUv+gUFM/oFBTb6BQVB+gUFUvoFBWL6BQdx+gUGcfoFBVv6BQVO+gUFTPoFBUb6BQU1+gUF
KPoFBRr6BQUQ+gUFDvoFBQj6BQUG+gUFDfoFBSH6BQUw+gUFK/oFBTP6BQU4+gUFOfoFBT36BQU++gUF
NvoFBSX6BQUR+gUFCPoFBQX6BQUF+gUFBfoFBQb6AABE/wAASv8AAFH/AApZ/wAWZv8AI2//ACh2/wAn
dv8AL33/ADWD/wA1gv8AMX7/ADN//wAwfP8AKHT/AANI/wAAP/8AAEf/AABR/wAATf8AAEr/AABM/wAA
T/8AAE3/AABD/wAAQf8AAD7/AAA9/wAAOv8AADz/AABC/wAAUP8AAGX/AAB2/wAOhP8ACYD/AABj/wAA
Vv8AAFH/AABM/wAAQv8AADP/AAAg/wAAD/8AAAb/AAAH/wAADP8AABP/AAAj/wAALP8AADH/AAA4/wAA
P/8AAEL/AABE/wAAP/8AAB//AAAF/wAABP8AAAD/AAAA/wAAAP8AAAD/AAAA/wIDU/8AA1b/ABRh/wAk
bv8AMHj/ADR9/wA1gf8ANYH/ADiF/wA/if8AQor/AD2G/wA+h/8AOoT/ADaA/wAcZv8AAEz/AABU/wAA
Vv8AAFP/AABS/wAAVP8AAF3/AABZ/wAAT/8AAEr/AABK/wAAUP8AAEz/AABL/wAAVP8AAGX/AAB0/wAO
g/8AIJL/ABiL/wADcf8AAF7/AABV/wAATv8AAEj/AAA5/wAAI/8AABH/AAAH/wAADP8AABX/AAAk/wAA
Lv8AADb/AAA4/wAAOf8AADf/AAA5/wAAN/8AAC3/AAAM/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
Af8CC13/AA5f/wAhbP8ALXn/ADWA/wA5hP8AOob/AD6K/wBCjP8ASI//AEqS/wBFjf8AQIn/ADqD/wA3
gP8AMXv/AAZX/wAAVv8AAFP/AABS/wAAVP8AAFf/AABc/wAAW/8AAFj/AABX/wAAW/8AAGL/AABd/wAA
X/8AAmn/AAZ5/wAMgv8AHI7/AC2e/wAnl/8ACnv/AABl/wAAW/8AAFH/AABK/wAAPf8AACn/AAAd/wAA
Ev8AABH/AAAY/wAAKv8AADf/AAA8/wAAOP8AAC7/AAAe/wAAFv8AABD/AAAI/wAAAv8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAH/Ahln/wAYaP8AHmz/AC55/wA2gv8AOIX/ADqG/wBBi/8AR5D/AEuS/wBM
lP8ASpP/AEKL/wA6hP8AN4L/ADeB/wAaY/8AAEz/AABW/wAAUf8AAFT/AABa/wAAXf8AAFz/AABe/wAG
bf8ABG7/AAZv/wAGbv8AB3P/ABaB/wAaiv8AH5L/AC2e/wBArf8AOan/AByM/wAHc/8AAWr/AABg/wAA
Wf8AAFb/AABG/wAAL/8AACP/AAAn/wAAM/8AADX/AAA5/wAAOP8AADr/AAA2/wAAH/8AAA//AAAC/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAB/wIYZ/8AFmn/ABlo/wAjb/8AMHv/ADSB/wA8
hv8ARI3/AEqT/wBNlf8ATZb/AEyT/wBEi/8APYb/ADuE/wA+hv8AM33/AAJJ/wAATv8AAFP/AABU/wAA
XP8AAF3/AABj/wAAZ/8ADHX/AA95/wATfP8AGIH/ABuE/wAmlP8ALJz/ADGi/wBArv8AVL3/AFC5/wAy
n/8AHIb/ABV//wAQev8AA2//AABn/wAAXv8AAEv/AABE/wAARf8AAEj/AAA//wAAPf8AADz/AABD/wAA
Pv8AACf/AAAW/wAACv8AAAf/AAAQ/wAADP8AAAP/AAAA/wAAAP8AAAD/AAAA/wAAAf8CHGv/AB1r/wAh
bf8AJ3D/ADF4/wAzfP8AOYD/AEKJ/wBJkv8AS5P/AE2U/wBNk/8ASY//AESM/wBGjP8ASI7/AESM/wAT
W/8AAEj/AABS/wAAXf8AAGH/AABn/wAAb/8AAnL/AAt8/wAQfv8AIYn/ACyV/wA1m/8AO6T/AESt/wBM
tf8AWL//AG3K/wBuyP8AULT/ADyd/wA3lv8ALpP/AByH/wAPe/8ACnX/AAlt/wAIZ/8ABGH/AAJb/wAB
WP8AAFb/AABQ/wAARf8AADb/AAAn/wAAH/8AABf/AAAV/wAAG/8AAAv/AAAB/wAAAP8AAAD/AAAA/wAA
AP8AAAH/Ai13/wAod/8AKXf/AC54/wA1fP8AO4H/ADuC/wBFif8AUJX/AFWX/wBZmf8AXJr/AFyY/wBZ
mP8AV5j/AFWY/wBRlv8AMHz/AABS/wAAXv8AAGf/AABt/wAAc/8ABXj/AA5+/wAUhf8AGoj/AC2V/wA7
of8ARKj/AFK0/wBjwf8Ab8v/AHnT/wCR3P8Ak9z/AHrN/wBmuv8AWrH/AE2p/wBAov8AO5v/ADiX/wA1
k/8ALYr/ACSA/wAVeP8ABnD/AAFi/wAAU/8AAEX/AAAw/wAAKv8AACf/AAAi/wAAGv8AABX/AAAE/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAB/wITQf8AEUD/ABRH/wAUTv8AGlX/ACJh/wAnav8AOHj/AFCK/wVj
mf8QcKL/EnWn/wxzpv8Gbab/AGSi/wBhoP8AXqD/AFWZ/wARc/8ACXT/ABF7/wATgP8AFYH/AB2K/wAg
jv8AI5H/ACeU/wA2nv8AQqb/AFWw/wBuxv8AUrv/ADKs/wBDs/8AcM//BJLb/wCD0/8AaMH/AHXF/wBw
wf8Abb3/AGu7/wBkuP8AWbD/AEql/wA2lf8AIYH/AA1z/wABZf8AAFL/AABE/wAAM/8AACz/AAAm/wAA
Jf8AACf/AAAv/wAAHf8AAAj/AAAA/wAAAP8AAAD/AAAA/wAAAf8BABP/AAAP/wAAF/8AACL/AAAt/wAA
PP8ADE//AClm/wBEfP8BWIz/BGOW/wRlmv8CWpf/AU2R/wBHk/8APY//AEaV/wBUnf8AUJz/AFWh/wBi
q/8AZq//AF6s/wBarP8AWK3/AFCq/wBQq/8AUq//AF60/wBww/8AQ63/ABaM/wEnmf8AP6r/Ale8/xOG
0v8KbsH/B2q1/wKZ0/8AoNr/AJrY/wCO0/8AgMr/AGq//wBSrv8APZz/ACqK/wAXeP8ABWf/AABZ/wAA
Tf8AAD7/AAA1/wAALf8AACn/AAAf/wAAG/8AABD/AAAE/wAAAP8AAAD/AAAA/wAAAP8AAAH/AQIH/wAA
B/8AAAz/AAAT/wAAHv8AATf/ABJR/wAmYf8AN3L/ADt4/wA1d/8AMHf/ADF6/wAtef8AMoD/ADaG/wBB
k/8ATJv/AF6n/wBys/8CicP/CpfO/w2Z0P8Jlc7/BZHN/wKNzf8Aicv/AIvM/wCOz/8AUKf/ADWS/wBi
tP8Hh87/AIjU/zW75/+Q7vv/auH3/1bZ9f9Kz/D/Ncft/xm36P8Fotz/AIrR/wB1xf8AXrb/AEyn/wA7
mf8AJ4j/ABZ3/wADa/8AAF3/AABQ/wAAQP8AAC//AAAj/wAAFP8AAA7/AAAF/wAADP8AABj/AAAK/wAA
AP8AAAD/AAAB/wICHP8AABz/AAAp/wABM/8ACj7/ABhS/wAgWv8AJGH/ACZn/wAhZP8AIWP/ACtt/wA7
ff8AQ4X/AFCP/wBbmv8AWZz/AFuf/wBco/8AVKL/AGWu/wN5u/8Ih8T/CpTL/w+e0/8Podb/CaDW/w+l
2/8Bcrv/AFWh/wBwt/8Ag8j/AJrZ/wKx5/9S2fT/5v7//8D1/v+g7Pv/geT5/2DX8/87xez/GLLj/wKg
2v8AjdL/AHzE/wBsuf8AW67/AEqf/wA5kv8AJYP/ABZz/wASbv8AClz/AAVG/wACOf8AASX/AAAQ/wAA
F/8AACT/AAAe/wAABf8AAAD/AAAA/wAAAf8BAiP/AAAo/wAAOv8AC0n/ABxZ/wAqZP8ALmf/ACNj/wAd
Yf8AJmX/ADFt/wA/ev8ATIj/AE2O/wBRkv8AYJ7/AnGr/wd7s/8MgLn/D4O9/wyFv/8Dg7//BonD/xmZ
zv8jpNb/KKnZ/yWs2/8Fi8v/BHm6/wuUy/8Qo9f/Hq3e/xm45/820/T/w/T8///////p/v7/sO/8/37g
9v9X0PD/Nb/o/xuv4f8En9j/AI/O/wB7wv8Aa7j/AF+w/wBVpv8ASZv/ADuR/wAxiP8AJnz/ABtx/wAQ
Zf8AB1f/AARN/wAAP/8AAkn/AAFC/wAALP8AABP/AAAC/wAAAf8AAAP/AQIZ/wAAKv8ABEL/ABtX/wAo
Y/8ALmf/AChh/wAeWv8AE1P/ABFV/wATWv8AFWH/ABpn/wAca/8AIXH/ADCA/wBNl/8BaKr/Bn65/xaR
xf8hmsz/HJvO/xyczv81rNj/R7je/1fB4/8tr9v/IaLQ/0G43f9BwOX/YdHu/4zo+f9x5fj/uvX9////
////////9v///7vy/P+C4Pb/Vc3u/zK85f8Tqdz/BZTS/wGGxv8AdL7/AGW0/wBdrv8ATqL/AESY/wA+
j/8ANoj/AC5+/wAldP8AGmn/AAxd/wAEVP8AAVL/AABM/wAAQP8AADP/AAAi/wAADP8AAAb/AgIM/wEB
Cv8AAB3/AAQ9/wAMS/8AFlL/ABlT/wASTP8ADkb/AA9J/wAOTf8ABkf/AAA7/wAARP8ABlj/ABhs/wAp
e/8APov/AFCb/wBfp/8AcbL/BoO9/xaSx/8uodD/SrHa/2PA4v9Etd7/PK/X/1m93/9vyuf/Ycjo/4XZ
8f9g1PH/feD2//b9/////////////+7+///B9P3/kOX5/2nW8v9Ox+v/Lrbk/xOm3P8Jntb/AI3N/wB6
v/8AbLX/AFWk/wBHmP8AOo7/ACyC/wAgdf8AFmr/AA5g/wAJVv8AA0j/AANK/wABRP8AADn/AAAx/wAA
K/8AACP/AAAZ/wICGf8BAB//AAA1/wAUU/8AHlv/AB9c/wAYVv8ABUX/AAE+/wABPv8AADb/AAAo/wAD
MP8ABUv/AApf/wAOZv8AEGj/ABxz/wAuhP8AQpL/AFSd/wBqq/8Lgrn/NJvJ/0+s1f8+p9P/QqfQ/3TC
4P+Ayub/gc7p/3/M5/990u3/XMrr/7zs+P/9////+v////T////Y+f7/sO/8/4ji9/9m1PL/SMXr/yay
4v8IoNf/ApXS/wCIy/8AfML/AG+5/wBeqP8AVJ7/AEuW/wBAif8ANHz/ACZv/wAbZf8AFlr/AAtH/wAH
O/8AAy//AAEn/wAAHv8AACD/AAAp/wAAMP8CAzX/Aixn/wAybP8AQHf/AEl//wBIgf8AN3P/ACFe/wAb
WP8AE1X/AAxP/wANUf8AEFz/AA5g/wAKX/8AC2H/ABxw/wAyhf8APo//AEqW/wBgov8OerL/LJDA/zCT
xv8pksP/UabP/3/B3/+Ozef/gszn/3TF4/+Z1uz/e87r/5TZ8P/p/P7/8v///+/////c+v7/wvP9/6Ho
+P932fP/Scbr/y+45f8Uq93/AJrU/wCJyv8AecD/AGu0/wBZpv8ATJj/AEWQ/wBAjP8AOIP/ADF5/wAs
cP8AKG3/ACRn/wAaYP8ADU//AAM//wABOP8AAjP/AAU7/wAIPf8AAi7/AQMe/wJYkP8AX5T/AGaX/wBr
nf8Ab6H/AGue/wBjlv8DZ5f/C2uc/wFPjP8ANnn/ACZv/wAfa/8AIW//ACNw/wAsdP8AO4D/AEaJ/wBa
mP8Jcaj/JYW3/zeWxP85k8L/Z6/P/4DB3/9qutz/OaHO/yyZyf+Ax+L/i9Tr/1jA5P9JvOT/WsHn/6fh
8v+m4PT/xvP8/7rw/f+T4fX/Zs3u/ze35P8TpNn/AJXQ/wCMzP8Ahcb/AH3B/wBos/8AVaL/AEaT/wA3
hP8ALnn/ACVv/wAgZv8AHGD/ACNm/wAhZv8AF1z/AApJ/wAEPv8AAz3/AANC/wACQ/8AA0D/AAI+/wIE
Nv8CVov/AFuP/wBhlv8AYZj/AGGY/wBil/8FaJr/HHqp/xlonP8CSon/AEqI/wBSj/8AWJP/AFuV/wBa
k/8AVo7/AFqR/wBHgf8AMGv/AlOI/x56qf9Mm8L/dLPT/4TC3f9Op87/EHiy/wBZnv8AXaD/F4i//xuM
xf8QgsL/AHG7/wBgt/8Aa7z/AG/B/ziZ0v+b3PL/jN/2/1HB5/8jqtz/CprS/wCBxP8Ab7n/AGaw/wBm
r/8AXav/AFWi/wBKl/8AOIX/ACly/wAeZv8AFFv/AA1S/wAPU/8ADVL/AAVH/wACQP8AATz/AAI6/wAC
Of8AADT/AAAw/wAAMv8CAzP/AluP/wBjkv8AbJr/AGyd/wBnmv8BYJT/GmmW/y5/p/8ocpr/JWiS/x5g
jv8XXYv/EF2L/wdcjP8GXoz/CGqV/wBEcv8ADDf/AClc/xpsmP9DkLb/cK/O/3O31P8/nMf/BVub/wAv
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
AP8AAAD/AAAA/wAAAP8AAAD/AAAK/wADMv8GM3X/LpfC/y2YxP8Sfq7/AHGk/wBsov8AbqX/AG6m/wBp
pP8AZZ//AGGf/wBamv8AVZP/AFSO/wBSjv8AU5T/AE6P/wBMjf8AV5j/AEiJ/wA5ff8AMnP/ACNk/wAY
WP8ADEn/AAQ7/wACNv8ABDL/AAQp/wIFJv8CWJn/ADp2/wA6af8QU3z/F2CL/xVdh/8WYIT/F2SI/xFa
g/8DOVn/AA0X/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAUJ/x5kff9HncD/GkRz/wAAAP8AAAD/AAAA/wIS
IP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAf8AAAD/AAAC/wAPNf8AIF//KoO0/zqjz/8njLz/DXir/wBr
nv8AZpv/AGmh/wBrpf8AaaP/AGOc/wBdmf8AW5X/AFeQ/wBVjv8AVo//AFiW/wBbm/8AW5r/AFWW/wBQ
jv8AR4L/ADV3/wAlaf8AFlb/AAtA/wAGMP8ABDD/AAIv/wAAKv8CAi3/Aj96/wAuZf8AJ1f/BDhi/w9M
df8RT3j/Dkty/w9UeP8ENU7/AAQI/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAB/wcNEf8OLDr/L3mZ/zuI
ov8eUG3/Bhov/wIJEP8CERv/AAML/wAAAP8AAAD/AAAA/wAAAP8AAAX/AQkP/wIcNf8VSHj/NI27/z2g
zP8okcL/FICx/wRuov8AZpn/AGSY/wBnnf8AaqP/AGym/wBnn/8AZJv/AGOa/wBimP8BXpb/AVyW/wBa
lv8AV5P/AFKM/wBOh/8ATIb/AEiD/wA/ff8ANHT/ACtn/wAhXP8AGFj/AAxS/wACSv8AADz/AgMx/wIi
WP8AHE//AB9O/wAmVv8BOmT/Bj1o/wQsV/8AFCX/AAAA/wAAAP8AAAD/AAMJ/wABCP8GAgH/BgoL/wAD
CP8KJS3/ByU3/xYzSf8waoH/LnOW/0aMrv9Nian/OWuI/yJPbv8TLUL/Chgm/wkZIv8hQVb/O3CO/0aL
r/8+irH/P5O9/zWTvv8ki7v/GYK2/whwo/8AXpL/AFWK/wBPhv8AU4r/AFiR/wFYk/8AUo7/AE6I/wBN
h/8ATYn/AE+M/wBUjf8AVpL/AFaS/wBWjP8AVov/AFeM/wBTif8ASIH/ADt0/wApZf8AGFX/AA1E/wAE
NP8AACf/AAAa/wEBEv8CHlX/ABpR/wAeU/8AH1L/AB9I/wAaPv8ABhT/AAAA/wAAAP8DCxP/ABkv/wBE
b/8AQHL/Ay5X/wMLGP8AAAD/AAAA/wALFf8TRWP/JWqM/y54mf82fJ3/OH2c/z2Bof8+g6b/PYWp/zuB
p/87g6f/RpC1/0GMs/8ygqn/J3un/xpyo/8QbaP/CW2k/wVnoP8BU4z/AER7/wBCd/8AQXn/AEaB/wBR
iv8AWI7/AFiP/wBVjf8AU4v/AFOL/wBOiP8ASoX/AEmG/wBCgP8AN3P/AC9q/wAmX/8AHlX/ABNH/wAK
Pv8ABC//AAEY/wAABP8AAAD/AAAA/wAAAP8AAAD/AhlY/wAVT/8AEUL/AAg2/wACFv8AAAP/AAAA/wAA
AP8AAQH/CDha/wA8cf8APWT/ADJN/wAXIf8AAAD/AAMJ/wAZLv8ANlr/Bkxv/wtFaf8HPmb/BkJp/wNB
Z/8ERmz/B091/wxagf8WZYr/G2qP/xhskf8WbJX/D2qW/wdpl/8DZZn/AGGW/wBgmf8AWpf/AEeB/wA5
b/8ANGr/AC9o/wAuav8AL27/ACxq/wAmZP8AIF3/ABlW/wATUP8ADUX/AAhE/wAFRf8AA0X/AAA7/wAA
Mv8AACX/AAAd/wAAGf8AABv/AAAR/wAAAf8AAAD/AAAA/wAAAP8AAAD/AAAB/wIZYf8ACEf/AAEx/wAB
Nv8AACb/AAAM/wAAAP8ACSj/AAs6/wAIGf8AECn/AAYJ/wAAAP8AAAL/AA4k/wAiRP8ALlP/AC1R/wAr
Tf8AHz//ACBA/wAjRf8AJkf/ACtK/wAvUv8BNFn/AjRb/wIxXP8BL1//ASxg/wAqY/8AJWL/AB5b/wAY
W/8AFmX/ABFk/wAHRf8AAi//AAEn/wAALP8AAC//AAAz/wAANP8AADH/AAAu/wAAJ/8AACP/AAAe/wAA
Hv8AACD/AAAe/wAAGP8AABb/AAAU/wAADP8AAAb/AAAC/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
Af8CJ3X/AA5c/wAGTP8ADlb/AApS/wAAHv8AAAD/AAYQ/wAJJf8AAAD/AAAA/wAABf8ACSb/ABVD/wAe
SP8AIUb/ACNK/wAkTP8AHT//AAAG/wAAAv8AAAL/AAAC/wAAAf8AAAT/AAAK/wAADv8AABP/AAAb/wAA
If8AACf/AAAl/wAAJ/8AADH/AABG/wAASP8AACv/AAAX/wAAFv8AABz/AAAh/wAAJv8AACj/AAAl/wAA
If8AAB3/AAAa/wAAGv8AABr/AAAX/wAAD/8AAAf/AAAB/wAABP8AAAL/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAH/AiJy/wAZa/8AF2f/ABdo/wAGOP8AAAD/AAED/wADGP8AAAD/AAAH/wAI
Kv8AE0n/ABxT/wAeUP8AHk//ACBN/wAiTf8AI1H/ABYz/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAv8AAAn/AAAN/wAADP8AABH/AAAf/wAANv8AADn/AAAg/wAAE/8AABf/AAAc/wAA
HP8AAB7/AAAf/wAAHv8AABz/AAAa/wAAHf8AAB7/AAAf/wAAIv8AAB7/AAAV/wAAC/8AAAb/AAAB/wAA
Af8AAAX/AAAC/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAB/wIcbv8AFmn/ABFf/wATYv8DD0n/ChIe/wAB
AP8AEEH/AAtD/wAVUf8AGlz/ABpX/wAcUv8AH1T/AB9W/wAiV/8AI1X/ACFV/wALIP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAC/wAAEf8AACn/AAAu/wAA
Gf8AAA//AAAW/wAAIP8AAB//AAAa/wAAGv8AAB3/AAAb/wAAHf8AACr/AAAs/wAALP8AAC//AAAk/wAA
Hv8AABj/AAAN/wAAB/8AAAT/AAAE/wAAAv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAf8CEWf/AAlf/wAI
WP8AC1j/AxVc/wgZXP8AACL/AAYl/wAVXv8AG13/ABdY/wAVVP8AF1H/ABtT/wAdVP8AHlT/ABxQ/wAX
Sf8AAgv/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAv/AAAf/wAAI/8AAA//AAAG/wAAD/8AABn/AAAh/wAAGf8AABH/AAAQ/wAAEf8AAB7/AAAt/wAA
Lv8AADH/AAAn/wAAG/8AABT/AAAQ/wAAC/8AAAz/AAAJ/wAAB/8AAAH/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAH/AgRc/wAAU/8AAFD/AABN/wACTf8AAEX/AABC/wADQv8ADlL/ABFS/wAPUP8ADlD/ABFM/wAW
Tv8AF0z/ABZK/wAVSf8ACzH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAF/wAAGP8AABn/AAAD/wAAAP8AAAX/AAAN/wAAGP8AAA3/AAAD/wAA
AP8AAAr/AAAb/wAAFP8AABf/AAAk/wAAGP8AAAz/AAAJ/wAAB/8AAAb/AAAL/wAACP8AAAb/AAAD/wAA
Af8AAAD/AAAA/wAAAP8AAAD/AAAB/wAAQ/8AADv/AAAy/wAALv8AACr/AAAl/wAAKv8AADj/AABA/wAA
QP8AAEH/AABA/wAEQP8ABD//AAM7/wACOv8AAjX/AAAM/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAb/AAAG/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAv8AAAD/AAAA/wAACf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
Af8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8fIUnlHR9D5R0fPOUdHznlHR855R0f
PuUdH0blHR9M5R0fVOUdH1XlHR9S5R0fUuUeIVXlHiJU5R4gTuUeH0zlHR495RoaHOUaGhvlGhob5Roa
G+UaGhvlGhob5RoaG+UaGhvlGhob5RoaG+UaGhvlGhsc5RobHOUaGxzlGhsc5RobHOUaGxzlGhse5Rob
IeUaGxzlGhsb5RobHOUaGxvlGhsb5RobG+UaGxzlGhsc5RobG+UaGxvlGhob5R0hJuUbHB7lGhsb5Rob
HOUaGxzlGhsc5RobHOUaGx3lGhsc5RobHeUaGxzlGhsc5RobHOUaGxzlGhob5RoaG+UaGhvl9fb3DPX2
9wz19vcM9fb3DPX29wz19vgM9fb4DPX2+Az19vgM9fb4DPX2+Az19vgM9fb4DPX2+Az19vcM9fb3DPX1
9Qzz8/MM8/PzDPPz8wzz8/MM8/P0DPPz9Azz8/QM8/P0DPPz9Azz8/QM8/P0DPPz9Azz8/QM8/P0DPPz
9Azz8/QM8/P0DPP09Azz9PQM8/P0DPPz9Azz8/QM8/P0DPPz9Azz8/QM8/P0DPPz9Azz8/QM8/T0DPPz
9Az19/gM8/T1DPPz9Azz8/QM8/P0DPPz9Azz9PQM8/T0DPPz9Azz8/QM8/P0DPPz9Azz8/QM8/P0DPPz
9Azz8/QM8/PzDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////8=
</value>
</data>
</root>

@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SCJMapper_V2.Layout
{
/// <summary>
/// The shape drawing/interaction interface
/// </summary>
interface IShape
{
bool IsValid { get; }
/// <summary>
/// Draws the shape
/// </summary>
void DrawShape( Graphics g );
/// <summary>
/// Sets X,Y from Mouse location - shape is centered
/// </summary>
/// <param name="loc"></param>
void SetMouseLocation( Point loc );
/// <summary>
/// Returns true if the item contains the location
/// </summary>
/// <param name="location">A location point</param>
/// <returns>True if the location is with the item area</returns>
bool HitTest( Point location );
/// <summary>
/// Offset of click location vs. middle of the rectangle
/// to move it seamlessly
/// </summary>
/// <param name="location">Click location</param>
/// <returns>Movement offset</returns>
Point ClickOffset( Point location );
}
}

@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SCJMapper_V2.Layout
{
class Layouts : List<DeviceLayout>
{
/// <summary>
/// cTor: Collect all Layouts in the distribution folder
/// </summary>
public Layouts()
{
this.Clear( );
if ( !Directory.Exists( TheUser.LayoutsDir ) ) return;
var jsons = Directory.EnumerateFiles( TheUser.LayoutsDir, "*.json" );
foreach ( var f in jsons ) {
var devLayout = new DeviceLayout {
Filename = f,
DeviceController = ControllerJson.FromJson( f )
};
if ( devLayout.DeviceController != null ) {
this.Add( devLayout );
}
}
}
}
}

@ -0,0 +1,204 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static SCJMapper_V2.Layout.ActionGroups;
namespace SCJMapper_V2.Layout
{
/// <summary>
/// Maintains the colormap for the Layout
/// </summary>
class MapProps
{
/// <summary>
/// Save Color Settings for the Layout
/// </summary>
public struct ColorPair
{
public Color ForeColor;
public Color BackColor;
public ColorPair( Color fColor, Color bColor )
{
ForeColor = fColor;
BackColor = bColor;
}
}
private static int m_fontSize = 16; // maintained as int to support the TrackBar Value property)
private static Font m_font = new Font( "Tahoma", m_fontSize ); // real fontsize will be scaled to float but not used outside
// all known actionmaps with it's classification
private static Dictionary<EGroup, ColorPair> m_amColors;
/// <summary>
/// cTor: Load Colors from AppSettings
/// </summary>
static MapProps()
{
AppSettings.Instance.Reload( );
FontSize = AppSettings.Instance.LayoutFontSize; // also creates the MapFont property
m_amColors = new Dictionary<EGroup, ColorPair> {
{ EGroup.SpaceFlight, ConvertFromString(AppSettings.Instance.GroupColor_00) },
{ EGroup.SpaceDefensive, ConvertFromString(AppSettings.Instance.GroupColor_01) },
{ EGroup.SpaceTargeting, ConvertFromString(AppSettings.Instance.GroupColor_02) },
{ EGroup.SpaceWeapons, ConvertFromString(AppSettings.Instance.GroupColor_03) },
{ EGroup.SpaceMining, ConvertFromString(AppSettings.Instance.GroupColor_04) },
{ EGroup.Player, ConvertFromString(AppSettings.Instance.GroupColor_05) },
{ EGroup.EVA, ConvertFromString(AppSettings.Instance.GroupColor_06) },
{ EGroup.Vehicle, ConvertFromString(AppSettings.Instance.GroupColor_07) },
{ EGroup.VehicleWeapons, ConvertFromString(AppSettings.Instance.GroupColor_08) },
{ EGroup.Lights, ConvertFromString(AppSettings.Instance.GroupColor_09) },
{ EGroup.Interaction, ConvertFromString(AppSettings.Instance.GroupColor_10) },
{ EGroup.Spectator, ConvertFromString(AppSettings.Instance.GroupColor_11) },
{ EGroup.Others, ConvertFromString(AppSettings.Instance.GroupColor_12) }
};
}
/// <summary>
/// Save color map settings for the Layout
/// </summary>
public static void SaveToSettings()
{
AppSettings.Instance.LayoutFontSize = m_fontSize;
AppSettings.Instance.GroupColor_00 = ConvertToString( m_amColors[EGroup.SpaceFlight] );
AppSettings.Instance.GroupColor_01 = ConvertToString( m_amColors[EGroup.SpaceDefensive] );
AppSettings.Instance.GroupColor_02 = ConvertToString( m_amColors[EGroup.SpaceTargeting] );
AppSettings.Instance.GroupColor_03 = ConvertToString( m_amColors[EGroup.SpaceWeapons] );
AppSettings.Instance.GroupColor_04 = ConvertToString( m_amColors[EGroup.SpaceMining] );
AppSettings.Instance.GroupColor_05 = ConvertToString( m_amColors[EGroup.Player] );
AppSettings.Instance.GroupColor_06 = ConvertToString( m_amColors[EGroup.EVA] );
AppSettings.Instance.GroupColor_07 = ConvertToString( m_amColors[EGroup.Vehicle] );
AppSettings.Instance.GroupColor_08 = ConvertToString( m_amColors[EGroup.VehicleWeapons] );
AppSettings.Instance.GroupColor_09 = ConvertToString( m_amColors[EGroup.Lights] );
AppSettings.Instance.GroupColor_10 = ConvertToString( m_amColors[EGroup.Interaction] );
AppSettings.Instance.GroupColor_11 = ConvertToString( m_amColors[EGroup.Spectator] );
AppSettings.Instance.GroupColor_12 = ConvertToString( m_amColors[EGroup.Others] );
AppSettings.Instance.Save( );
}
/// <summary>
/// Cheap serializing...
/// Converts from a ColorPair to a string
/// </summary>
/// <param name="colPair">A ColorPair</param>
/// <returns>A serialized string</returns>
private static string ConvertToString( ColorPair colPair )
{
string f = TypeDescriptor.GetConverter( typeof( Color ) ).ConvertToInvariantString( colPair.ForeColor );
string b = TypeDescriptor.GetConverter( typeof( Color ) ).ConvertToInvariantString( colPair.BackColor );
return $"{f}|{b}";
}
/// <summary>
/// Cheap deserializing...
/// Converts from a string to a ColorPair
/// </summary>
/// <param name="colPairS">A serialized string</param>
/// <returns>A ColorPair</returns>
private static ColorPair ConvertFromString( string colPairS )
{
string[] e = colPairS.Split( new char[] { '|' } );
if ( e.Length == 2 ) {
var f = (Color)TypeDescriptor.GetConverter( typeof( Color ) ).ConvertFromInvariantString( e[0] );
var b = (Color)TypeDescriptor.GetConverter( typeof( Color ) ).ConvertFromInvariantString( e[1] );
return new ColorPair( f, b );
}
else {
return new ColorPair( Color.Pink, Color.Transparent );
}
}
// Handle Layout Font
/// <summary>
/// Returns the Display Font for the layout
/// </summary>
public static Font MapFont { get => m_font; }
/// <summary>
/// FontSize property
/// creates a new MapFont property to use
/// </summary>
public static int FontSize
{
get => m_fontSize;
set {
m_fontSize = value;
m_font = new Font( m_font.FontFamily, m_fontSize );
}
}
// Handle Layout Colors
public static void SetMapColor( EGroup eGroup, ColorPair colorPair )
{
m_amColors[eGroup] = colorPair;
}
public static void SetMapColor( EGroup eGroup, Color fcolor, Color bcolor )
{
m_amColors[eGroup] = new ColorPair( fcolor, bcolor );
}
public static void SetMapForeColor( EGroup eGroup, Color color )
{
var copy = m_amColors[eGroup];
copy.ForeColor = color;
m_amColors[eGroup] = copy;
}
public static void SetMapBackColor( EGroup eGroup, Color color )
{
var copy = m_amColors[eGroup];
copy.BackColor = color;
m_amColors[eGroup] = copy;
}
public static ColorPair MapColor( string actionmap )
{
var acls = ActionGroups.MapNameToGroup( actionmap );
return m_amColors[acls];
}
/// <summary>
/// Returns the text color for an actionmap
/// </summary>
/// <param name="actionmap"></param>
public static Color MapForeColor( string actionmap )
{
var acls = ActionGroups.MapNameToGroup( actionmap );
return m_amColors[acls].ForeColor;
}
public static Color MapBackColor( string actionmap )
{
var acls = ActionGroups.MapNameToGroup( actionmap );
return m_amColors[acls].BackColor;
}
public static ColorPair GroupColor( EGroup eGroup )
{
return m_amColors[eGroup];
}
public static Color GroupForeColor( EGroup eGroup )
{
return m_amColors[eGroup].ForeColor;
}
public static Color GroupBackColor( EGroup eGroup )
{
return m_amColors[eGroup].BackColor;
}
}
}

@ -0,0 +1,148 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SCJMapper_V2.Layout
{
/// <summary>
/// Controller Input
/// contains a text to display at a position within a rectangle
/// </summary>
class ShapeItem : IShape
{
/// <summary>
/// The Text Shown in the Map
/// </summary>
public string DispText { get; set; }
/// <summary>
/// Location Left
/// </summary>
public int X { get; set; } = 0;
/// <summary>
/// Location Top
/// </summary>
public int Y { get; set; } = 0;
/// <summary>
/// Width
/// </summary>
public int Width { get; set; } = 0;
/// <summary>
/// Height
/// </summary>
public int Height { get; set; } = 0;
public Point Location
{
get { return new Point( X, Y ); }
set { X = value.X; Y = value.Y; }
}
public Size Size
{
get { return new Size( Width, Height ); }
set { Width = value.Width; Height = value.Height; }
}
public Rectangle Rectangle
{
get { return new Rectangle( X, Y, Width, Height ); }
set { X = value.X; Y = value.Y; Width = value.Width; Height = value.Height; }
}
public bool IsValid { get => !string.IsNullOrEmpty( DispText ); }
private Brush m_textBrush = Brushes.Black;
private Color m_textColor = Color.DarkBlue;
private Brush m_backBrush = Brushes.White;
private Color m_backColor = Color.White;
/// <summary>
/// Set the Textcolor
/// </summary>
public Color TextColor
{
get => m_textColor;
set {
m_textColor = value;
m_textBrush.Dispose( );
m_textBrush = new SolidBrush( m_textColor ); // set the text brush as well
}
}
/// <summary>
/// Set the Textcolor
/// </summary>
public Color BackColor
{
get => m_backColor;
set {
m_backColor = value;
m_backBrush.Dispose( );
m_backBrush = new SolidBrush( m_backColor ); // set the text brush as well
}
}
/// <summary>
/// Returns the drawn text size for this item
/// </summary>
/// <param name="g"></param>
/// <returns></returns>
public SizeF MeasureShape( Graphics g )
{
return g.MeasureString( DispText, MapProps.MapFont );
}
#region IShape Implementation
/// <summary>
/// Draws the shape
/// </summary>
public void DrawShape( Graphics g )
{
if ( IsValid ) {
if ( m_backColor!= Color.White ) {
g.FillRectangle( m_backBrush, Rectangle );
}
g.DrawString( DispText, MapProps.MapFont, m_textBrush, Rectangle ); // write into the rectangle
}
}
/// <summary>
/// Sets X,Y from Mouse location - shape is centered
/// </summary>
/// <param name="loc"></param>
public void SetMouseLocation( Point loc )
{
}
/// <summary>
/// Returns true if the item contains the location
/// </summary>
/// <param name="location">A location point</param>
/// <returns>True if the location is with the item area</returns>
public bool HitTest( Point location )
{
return new Rectangle( X, Y, Width, Height ).Contains( location );
}
/// <summary>
/// Offset of click location vs. middle of the rectangle
/// to move it seamlessly
/// </summary>
/// <param name="location">Click location</param>
/// <returns>Movement offset</returns>
public Point ClickOffset( Point location )
{
return new Point( -( location.X - X - Width / 2 ),
-( location.Y - Y - Height / 2 ) );
}
#endregion
}
}

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SCJMapper_V2.Layout
{
/// <summary>
/// A list of ShapeItems
/// </summary>
class ShapeItemList : List<ShapeItem>
{
}
}

@ -44,10 +44,21 @@ namespace SCJMapper_V2.OGL
uint TMU0_Handle;
TextureTarget TMU0_Target;
private string[] SBFiles = { "graphics/SB_SC_BrokenMoon.dds","graphics/SB_SC_DyingStar.dds","graphics/SB_SC_Demien.dds","graphics/SB_SC_Area18.dds",
"graphics/SB_OutThere1.dds", "graphics/SB_OutThere3.dds", "graphics/SB_Canyon.dds",
"graphics/SB_Shiodome.dds", "graphics/SB_Highway.dds", "graphics/SB_BigSight.dds", "graphics/SB_LA_Helipad.dds", "graphics/SB_Sunset.dds",
"graphics/Skybox.dds" };
private string[] SBFiles = {
Path.Combine(TheUser.GraphicsDir, "SB_SC_BrokenMoon.dds"),
Path.Combine(TheUser.GraphicsDir, "SB_SC_DyingStar.dds"),
Path.Combine(TheUser.GraphicsDir, "SB_SC_Demien.dds"),
Path.Combine(TheUser.GraphicsDir, "SB_SC_Area18.dds"),
Path.Combine(TheUser.GraphicsDir, "SB_OutThere1.dds"),
Path.Combine(TheUser.GraphicsDir, "SB_OutThere3.dds"),
Path.Combine(TheUser.GraphicsDir, "SB_Canyon.dds"),
Path.Combine(TheUser.GraphicsDir, "SB_Shiodome.dds"),
Path.Combine(TheUser.GraphicsDir, "SB_Highway.dds"),
Path.Combine(TheUser.GraphicsDir, "SB_BigSight.dds"),
Path.Combine(TheUser.GraphicsDir, "SB_LA_Helipad.dds"),
Path.Combine(TheUser.GraphicsDir, "SB_Sunset.dds"),
Path.Combine(TheUser.GraphicsDir, "Skybox.dds" )
};
// index into SBFiles
const int SB_BrokenMoon = 0;
const int SB_DyingStar = SB_BrokenMoon + 1;
@ -994,7 +1005,7 @@ namespace SCJMapper_V2.OGL
private void UpdateMouseTargetRect()
{
DeviceInst.MouseRef.SetTargetRectForCmdData( new Rectangle( glControl1.PointToScreen( new Point(0,0) ), glControl1.Size ) );
DeviceInst.MouseRef.SetTargetRectForCmdData( new Rectangle( glControl1.PointToScreen( new Point( 0, 0 ) ), glControl1.Size ) );
}

@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration( "" )]
[assembly: AssemblyCompany( "Cassini (SC handle)" )]
[assembly: AssemblyProduct( "SCJMapper" )]
[assembly: AssemblyCopyright( "Copyright (c) 2019 M.Burri + see LICENSE file" )]
[assembly: AssemblyCopyright( "Copyright (c) 2020 M.Burri + see LICENSE file" )]
[assembly: AssemblyTrademark( "" )]
[assembly: AssemblyCulture( "" )]
@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion( "2.43.0.78" )]
[assembly: AssemblyFileVersion( "2.43.0.78" )]
[assembly: AssemblyVersion( "2.44.0.79" )]
[assembly: AssemblyFileVersion( "2.44.0.79" )]

@ -93,19 +93,18 @@ namespace SCJMapper_V2.Properties {
/// <summary>
/// Looks up a localized string similar to &lt;profile version=&quot;1&quot; optionsVersion=&quot;2&quot; rebindVersion=&quot;2&quot; &gt;
/// &lt;platforms &gt;
/// &lt;PC keyboard=&quot;1&quot; mouse=&quot;1&quot; xboxpad=&quot;1&quot; ps3pad=&quot;0&quot; joystick=&quot;1&quot; /&gt;
/// &lt;Xbox keyboard=&quot;1&quot; xboxpad=&quot;1&quot; ps3pad=&quot;0&quot; /&gt;
/// &lt;PS3 keyboard=&quot;1&quot; xboxpad=&quot;0&quot; ps3pad=&quot;1&quot; /&gt;
/// &lt;PC keyboard=&quot;1&quot; mouse=&quot;1&quot; gamepad=&quot;1&quot; joystick=&quot;1&quot; /&gt;
/// &lt;XboxOne keyboard=&quot;1&quot; mouse=&quot;0&quot; gamepad=&quot;1&quot; joystick=&quot;0&quot; /&gt;
/// &lt;PS4 keyboard=&quot;1&quot; mouse=&quot;0&quot; gamepad=&quot;1&quot; joystick=&quot;0&quot; /&gt;
/// &lt;/platforms&gt;
///
/// &lt;actiongroup action=&quot;v_attack1&quot; &gt;
/// &lt;action name=&quot;v_attack1_group1&quot; /&gt;
/// &lt;action name=&quot;v_attack1_group2&quot; /&gt;
/// &lt;action name=&quot;v_attack1_group3&quot; /&gt;
/// &lt;/actiongroup&gt;
///
/// &lt;ActivationModes &gt;
/// &lt;ActivationMode name=&quot;tap&quot; onPress= [rest of string was truncated]&quot;;.
/// &lt;ActivationMode name=&quot;tap&quot; onPress=&quot;0&quot; onHold=&quot;0&quot; onRe [rest of string was truncated]&quot;;.
/// </summary>
internal static string defaultProfile {
get {
@ -203,6 +202,16 @@ namespace SCJMapper_V2.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap page_notdefined {
get {
object obj = ResourceManager.GetObject("page_notdefined", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>

@ -169,4 +169,7 @@
<data name="NPad" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\graphics\NPad.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="page_notdefined" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\graphics\page_notdefined.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

@ -25,6 +25,13 @@ using log4net.dll<br>
<br>
Built with VisualStudio 2017 Community free version<br>
<br>
# Credits
Device Layout Images and Maps:<br>
<br>
https://github.com/richardbuckle/EDRefCard
<br>
DDS Skydome Images:<br>
<br>
Canyon, Highway, Shiodome, BigSight, LA Heliport:<br>

@ -1,12 +1,12 @@
SC Joystick Mapper V 2.43 - Build 78 BETA
(c) Cassini, StandardToaster - 29-Feb-2020
SC Joystick Mapper V 2.44 - Build 79 BETA
(c) Cassini, StandardToaster - 07-Mar-2020
Contains 14 files + graphics:
SCJMapper.exe The program (V2.43)
SCJMapper.exe.config Program config (V2.43) - MUST be in the same folder as the Exe file
de\SCJMapper.resources.dll German language (V2.43) - MUST be in the same folder as the Exe file
fr\SCJMapper.resources.dll French language (V2.43) - MUST be in the same folder as the Exe file
SCJMapper.exe The program (V2.44)
SCJMapper.exe.config Program config (V2.44) - MUST be in the same folder as the Exe file
de\SCJMapper.resources.dll German language (V2.44) - MUST be in the same folder as the Exe file
fr\SCJMapper.resources.dll French language (V2.44) - MUST be in the same folder as the Exe file
Storage\*.scj Folder for collected assets (V2.35) - MUST be in the same folder as the Exe file
PTU_Storage\*.scj Folder for collected PTU (V2.37) - MUST be in the same folder as the Exe file
SharpDX.DirectInput.dll Managed DirectInput Assembly - MUST be in the same folder as the Exe file
@ -23,6 +23,7 @@ SCJMapper_QGuide V2.35beta.pdf Quick Guide (v2.35)
ReadMe.txt This file
graphics folder Skybox Images (V2.32) - graphics folder MUST be in the same folder as the Exe file
graphics\layouts folder Layout Images & defs (V2.44) - layouts folder MUST be in the graphics folder above
NOTE V 2.41+:
search order for defaultProfile.xml to build the action tree is:
@ -46,9 +47,15 @@ Scanned for viruses before packing...
cassini@burri-web.org
Changelog:
V 2.44 - BETA Build 79
- added Input device layout dialog and some layouts for the most common device controllers
NOTE: THIS IS VERY EARLY and may break or not show - use the GitHub Issue feature to report
also make sure to copy the graphics\layouts folder from the distribution else no layouts are available
- update Can read Exported XMLs from the Game (mostly ... max 3 points for curves are supported) (#91)
- update - defaultProfile.xml from SC LIVE PTU 3.8.2 as last resort built in one
V 2.43 - BETA Build 78
- added About / Splash Screen while loading Game resources
- update checkbox "Forced write" for Invert items in Options (writes the invert tag in any case to disable CIG invert defaults) #90
- update checkbox "Forced write" for Invert items in Options (writes the invert tag in any case to disable CIG invert defaults) (#90)
V 2.42 - BETA Build 77
- fix for not using the proper PTU cache when pulling data from gamepack (#87)
NOTE: please delete .scj files in <installDir>\Storage\*.scj (as they have been overwritten with PTU content)

@ -16,6 +16,7 @@ namespace SCJMapper_V2.SC
public const string c_MapStartsWith = "layout_"; // we only allow those mapping names
private const string c_UserMapStartsWith = c_MapStartsWith + "my_"; // we only allow those mapping names
private const string c_ExportedMapEndsWith = "_exported"; // we only allow those mapping names
static private List<string> m_scMappings = new List<string>( );
static private SCGameMaps m_scGameMaps = new SCGameMaps( ); // only one instance allowed... else we read it multiple times from the pak file
@ -55,6 +56,17 @@ namespace SCJMapper_V2.SC
return Path.GetFileNameWithoutExtension( mapName ).StartsWith( c_UserMapStartsWith );
}
/// <summary>
/// Returns true if a mapping name is considered an exported mapping
/// </summary>
/// <param name="mapName">The mapping name</param>
/// <returns>True if it is an exported mapping name</returns>
static public bool IsExportedMapping( string mapName )
{
return Path.GetFileNameWithoutExtension( mapName ).StartsWith( c_MapStartsWith )
&& Path.GetFileNameWithoutExtension( mapName ).EndsWith( c_ExportedMapEndsWith );
}
/// <summary>
/// Check if we may use that name - we allow only names like "layout_my_XYZ"
/// </summary>
@ -73,7 +85,7 @@ namespace SCJMapper_V2.SC
{
if ( Directory.Exists( SCPath.SCClientMappingPath ) ) {
m_scMappings.Clear( );
m_scMappings = (List<string>)Directory.EnumerateFiles( SCPath.SCClientMappingPath ).ToList( );
m_scMappings = Directory.EnumerateFiles( SCPath.SCClientMappingPath ).ToList( );
foreach ( KeyValuePair<string, string> kv in m_scGameMaps ) {
m_scMappings.Insert( 0, kv.Key ); // insert before others
}
@ -107,16 +119,25 @@ namespace SCJMapper_V2.SC
static public string Mapping( string mappingName )
{
string retVal = "";
if ( IsUserMapping( mappingName ) ) {
// first check for exported as they may start with user mapping pattern as well
if ( IsExportedMapping( mappingName ) ) {
string mFile = Path.Combine( SCPath.SCClientMappingPath, ( mappingName + ".xml" ) );
if ( File.Exists( mFile ) ) {
using ( var sr = new StreamReader( mFile ) ) {
retVal = sr.ReadToEnd( );
}
}
}
else if ( IsUserMapping( mappingName ) ) {
string mFile = Path.Combine( SCPath.SCClientMappingPath, ( mappingName + ".xml" ) );
if ( File.Exists( mFile ) ) {
using ( StreamReader sr = new StreamReader( mFile ) ) {
using ( var sr = new StreamReader( mFile ) ) {
retVal = sr.ReadToEnd( );
}
}
}
else {
// game mapping
// CIG provided game mapping
if ( m_scGameMaps.ContainsKey( mappingName ) ) {
retVal = m_scGameMaps[mappingName];
}

@ -27,8 +27,8 @@
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>78</ApplicationRevision>
<ApplicationVersion>2.43.0.%2a</ApplicationVersion>
<ApplicationRevision>79</ApplicationRevision>
<ApplicationVersion>2.44.0.79</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
@ -110,6 +110,7 @@
<Reference Include="System" />
<Reference Include="System.configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.Windows.Forms.DataVisualization" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
@ -175,6 +176,27 @@
<DependentUpon>FormOptions.cs</DependentUpon>
</Compile>
<Compile Include="Devices\Options\Tuningoptions.cs" />
<Compile Include="Layout\ActionGroups.cs" />
<Compile Include="Layout\ActionItem.cs" />
<Compile Include="Layout\ActionItemList.cs" />
<Compile Include="Layout\MapProps.cs" />
<Compile Include="Layout\ControllerJson.cs" />
<Compile Include="Layout\DeviceFile.cs" />
<Compile Include="Layout\DeviceLayout.cs" />
<Compile Include="Layout\DisplayList.cs" />
<Compile Include="Layout\DrawPanel.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="Layout\FormLayout.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Layout\FormLayout.Designer.cs">
<DependentUpon>FormLayout.cs</DependentUpon>
</Compile>
<Compile Include="Layout\IShape.cs" />
<Compile Include="Layout\Layouts.cs" />
<Compile Include="Layout\ShapeItem.cs" />
<Compile Include="Layout\ShapeItemList.cs" />
<Compile Include="RTF\RTFformatter.cs" />
<Compile Include="SC\Modifiers.cs" />
<Compile Include="SC\p4kFile\p4kDirectory.cs" />
@ -326,6 +348,9 @@
<EmbeddedResource Include="Devices\Options\FormOptions.resx">
<DependentUpon>FormOptions.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Layout\FormLayout.resx">
<DependentUpon>FormLayout.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Translation\Strings.de.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Strings.de.Designer.cs</LastGenOutput>
@ -439,6 +464,7 @@
<None Include="graphics\LArrow.png" />
<None Include="graphics\RSI.png" />
<None Include="graphics\NPad.png" />
<None Include="graphics\page_notdefined.png" />
<Content Include="ReadMe.txt" />
<None Include="graphics\YPR.png" />
<None Include="graphics\300i.jpg" />

@ -125,5 +125,16 @@ namespace SCJMapper_V2
if ( File.Exists( mf ) ) File.Copy( mf, mf + ".backup", true );
}
/// <summary>
/// Graphics folder name in the Application directory
/// </summary>
static public string GraphicsDir => "graphics";
/// <summary>
/// Graphics\Layouts folder name in the Application directory
/// </summary>
static public string LayoutsDir => Path.Combine(GraphicsDir, "layouts");
}
}

@ -59,7 +59,8 @@ namespace SCJMapper_V2.Actions
// own additions for JS mapping - should not harm..
private string[] m_js;
private string[] m_GUIDs;
private string[] m_product_GUIDs;
private string[] m_instance_GUIDs;
/// <summary>
/// get/set jsN assignment (use 0-based index i.e. js1 -> [0])
@ -70,11 +71,18 @@ namespace SCJMapper_V2.Actions
}
/// <summary>
/// get/set jsN GUID assignment (use 0-based index i.e. js1GUID -> [0])
/// get/set jsN product GUID assignment (use 0-based index i.e. js1GUID -> [0])
/// </summary>
public string[] jsNGUID
public string[] jsN_prodGUID
{
get { return m_GUIDs; }
get { return m_product_GUIDs; }
}
/// <summary>
/// get/set jsN instance GUID assignment (use 0-based index i.e. js1GUID -> [0])
/// </summary>
public string[] jsN_instGUID
{
get { return m_instance_GUIDs; }
}
/// <summary>
@ -83,7 +91,8 @@ namespace SCJMapper_V2.Actions
public void Clear_jsEntry( int index )
{
m_js[index] = "";
m_GUIDs[index] = "";
m_instance_GUIDs[index] = "";
m_product_GUIDs[index] = "";
}
// provide access to Tuning items of the Options obj to the owner
@ -129,7 +138,8 @@ namespace SCJMapper_V2.Actions
{
this.version = other.version;
this.m_js = other.m_js;
this.m_GUIDs = other.m_GUIDs;
this.m_instance_GUIDs = other.m_instance_GUIDs;
this.m_product_GUIDs = other.m_product_GUIDs;
// other ref objects are not populated here
}
@ -142,9 +152,10 @@ namespace SCJMapper_V2.Actions
// create the Joystick assignments
Array.Resize( ref m_js, JoystickCls.JSnum_MAX + 1 );
Array.Resize( ref m_GUIDs, JoystickCls.JSnum_MAX + 1 );
Array.Resize( ref m_instance_GUIDs, JoystickCls.JSnum_MAX + 1 );
Array.Resize( ref m_product_GUIDs, JoystickCls.JSnum_MAX + 1 );
for ( int i = 0; i < JoystickCls.JSnum_MAX; i++ ) {
m_js[i] = ""; m_GUIDs[i] = "";
m_js[i] = ""; m_instance_GUIDs[i] = ""; m_product_GUIDs[i] = "";
}
// create the default mapped optiontree
// CreateNewOptions( );
@ -273,7 +284,7 @@ namespace SCJMapper_V2.Actions
// now the devices (our addition)
for ( int i = 0; i < JoystickCls.JSnum_MAX; i++ ) {
if ( !string.IsNullOrEmpty( jsN[i] ) ) r += string.Format( "\tjs{0}=\"{1}\" ", i + 1, jsN[i] );
if ( !string.IsNullOrEmpty( jsNGUID[i] ) ) r += string.Format( "js{0}G=\"{1}\" \n", i + 1, jsNGUID[i] );
if ( !string.IsNullOrEmpty( jsN_instGUID[i] ) ) r += string.Format( "js{0}G=\"{1}\" \n", i + 1, jsN_instGUID[i] );
}
// close the tag
@ -331,12 +342,12 @@ namespace SCJMapper_V2.Actions
{
log.Debug( "ActionMapsCls.fromXML - Entry" );
XmlReaderSettings settings = new XmlReaderSettings {
var settings = new XmlReaderSettings {
ConformanceLevel = ConformanceLevel.Fragment,
IgnoreWhitespace = true,
IgnoreComments = true
};
using ( XmlReader reader = XmlReader.Create( new StringReader( xml ), settings ) ) {
using ( var reader = XmlReader.Create( new StringReader( xml ), settings ) ) {
reader.MoveToContent( );
if ( reader.EOF ) return false;
@ -344,6 +355,7 @@ namespace SCJMapper_V2.Actions
if ( XNode.ReadFrom( reader ) is XElement el ) {
// read the header element
bool jsMapFound = false;
if ( el.Name.LocalName == "ActionMaps" ) {
if ( el.HasAttributes ) {
version = (string)el.Attribute( "version" );
@ -351,8 +363,9 @@ namespace SCJMapper_V2.Actions
// get the joystick mapping if there is one
for ( int i = 0; i < JoystickCls.JSnum_MAX; i++ ) {
jsN[i] = (string)el.Attribute( string.Format( "js{0}", i + 1 ) );
jsNGUID[i] = (string)el.Attribute( string.Format( "js{0}G", i + 1 ) );
jsN[i] = (string)el.Attribute( $"js{i + 1}" );
jsN_instGUID[i] = (string)el.Attribute( $"js{i + 1}G" );
if ( !string.IsNullOrEmpty( jsN_instGUID[i] ) ) jsMapFound = true; // any found will do
}
}
else {
@ -362,7 +375,8 @@ namespace SCJMapper_V2.Actions
// now handle the js assignment from the map
// Reset with the found mapping
DeviceInst.JoystickListRef.ResetJsNAssignment( jsNGUID );
if (jsMapFound) DeviceInst.JoystickListRef.ResetJsNAssignment( jsN_instGUID );
// Only now create the default optiontree for this map, containing included joysticks and the gamepad
CreateNewOptions( );

@ -14,6 +14,7 @@ using SCJMapper_V2.Devices.Mouse;
using SCJMapper_V2.Devices.Gamepad;
using SCJMapper_V2.Devices.Joystick;
using SCJMapper_V2.Translation;
using SCJMapper_V2.Layout;
namespace SCJMapper_V2.Actions
{
@ -1309,6 +1310,60 @@ namespace SCJMapper_V2.Actions
}
/// <summary>
/// Reports a list of the mapped items
/// </summary>
/// <returns></returns>
public ActionItemList ReportActionsSItemText()
{
log.Debug( "ReportActions (ActionItem) - Entry" );
var repList = new ActionItemList( );
foreach ( ActionMapCls acm in ActionMaps ) {
foreach ( ActionCls ac in acm ) {
foreach ( ActionCommandCls acc in ac.InputList ) {
if ( !string.IsNullOrEmpty( acc.Input ) && !( acc.Input == DeviceCls.DisabledInput ) ) {
var sItem = new ActionItem( );
sItem.ActionMap = acm.MapName;
sItem.DispText = SCUiText.Instance.Text( ac.ActionName );
sItem.ControlInput = acc.Input;
switch ( Act.ADeviceFromDevID( acc.DevID ) ) {
case Act.ActionDevice.AD_Keyboard:
sItem.InputType = "K";
sItem.DeviceName = KeyboardCls.DeviceClass;
sItem.DeviceProdGuid = "";
break;
case Act.ActionDevice.AD_Mouse:
sItem.InputType = "M";
sItem.DeviceName = MouseCls.DeviceClass;
sItem.DeviceProdGuid = "";
break;
case Act.ActionDevice.AD_Joystick:
int jsNum = JoystickCls.JSNum( acc.DevInput ) - 1;
if ( jsNum >= 0 ) {
sItem.DeviceName = ActionMaps.jsN[jsNum];
sItem.DeviceProdGuid = ActionMaps.jsN_prodGUID[jsNum];
sItem.InputType = "J";
}
break;
case Act.ActionDevice.AD_Gamepad:
sItem.InputType = "G";
sItem.DeviceName = GamepadCls.DevNameCIG;
sItem.DeviceProdGuid = GamepadCls.DevGUIDCIG ;
break;
default: break;
}//switch
// add if valid
if ( !string.IsNullOrEmpty( sItem.InputType ) )
repList.Add( sItem );
}
}
}
}
return repList;
}
/// <summary>
/// Reports a summary list of the mapped items
/// </summary>

@ -54,6 +54,7 @@
<optiongroup name="flight_move_pitch" UILabel="@ui_COFlightPitch" UIShowCurve="1" UIShowInvert="1" />
<optiongroup name="flight_move_yaw" UILabel="@ui_COFlightYaw" UIShowCurve="1" UIShowInvert="1" />
<optiongroup name="flight_move_speed_range" UILabel="@ui_COSpeedRange" UIShowCurve="1" UIShowInvert="1" />
<optiongroup name="flight_move_accel_range" UILabel="@ui_COAccelRange" UIShowCurve="1" UIShowInvert="1" />
</optiongroup>
<optiongroup name="flight_view" UILabel="@ui_COFreeLook" UIShowCurve="1" UIShowInvert="1" >
@ -188,6 +189,7 @@
<optiongroup name="flight_move_strafe_forward" UILabel="@ui_COStrafeForward" UIShowCurve="1" UIShowInvert="1" />
<optiongroup name="flight_move_strafe_backward" UILabel="@ui_COStrafeBackward" UIShowCurve="1" UIShowInvert="1" />
<optiongroup name="flight_move_speed_range" UILabel="@ui_COSpeedRange" UIShowCurve="1" UIShowInvert="1" />
<optiongroup name="flight_move_accel_range" UILabel="@ui_COAccelRange" UIShowCurve="1" UIShowInvert="1" />
</optiongroup>
<optiongroup name="flight_aim" UILabel="@ui_COFlightAim" UIShowCurve="1" UIShowInvert="1" >
@ -288,6 +290,7 @@
<optiongroup name="flight_move_strafe_forward" UILabel="@ui_COStrafeForward" UIShowCurve="1" UIShowInvert="1" />
<optiongroup name="flight_move_strafe_backward" UILabel="@ui_COStrafeBackward" UIShowCurve="1" UIShowInvert="1" />
<optiongroup name="flight_move_speed_range" UILabel="@ui_COSpeedRange" UIShowCurve="1" UIShowInvert="1" />
<optiongroup name="flight_move_accel_range" UILabel="@ui_COAccelRange" UIShowCurve="1" UIShowInvert="1" />
</optiongroup>
<optiongroup name="flight_aim" UILabel="@ui_COFlightAim" UIShowCurve="1" UIShowInvert="1" >
@ -343,22 +346,38 @@
<mod input="kb_lalt" />
</modifiers>
<ActionCategories >
<Category name="ShipSystems" UILabel="@PIT_ACShipSystems" UIIcon="" />
<Category name="FlightSystems" UILabel="@PIT_ACFlightSystems" UIIcon="" />
<Category name="VehicleActions" UILabel="@PIT_ACVehicleSystems" UIIcon="" />
<Category name="WeaponSystems" UILabel="@PIT_ACWeaponSystems" UIIcon="" />
<Category name="PlayerActions" UILabel="@PIT_ACPlayerActions" UIIcon="" />
<Category name="Emotes" UILabel="@PIT_Emote" UIIcon="" />
<Category name="MobiGlasActions" UILabel="@PIT_Mobiglas" UIIcon="" />
<Category name="ItemActions" UILabel="@PIT_ItemActions" UIIcon="" />
<Category name="WeaponSelection" UILabel="@ui_Equipment" UIIcon="" />
<Category name="RemoteTurret" UILabel="@item_Name_Turret_Remote" UIIcon="" />
</ActionCategories>
<actionmap name="spaceship_general" version="2" UILabel="@ui_CGSpaceFlightCockpit" UICategory="@ui_CCSpaceFlight" >
<action name="v_eject" ActivationMode="delayed_press_long" keyboard="y" gamepad="shoulderl+b" joystick="rctrl+button6" UILabel="@ui_CIEject" UIDescription="@ui_CIEjectDesc" />
<action name="v_eject" ActivationMode="delayed_press_long" keyboard="y" gamepad="shoulderl+b" joystick="rctrl+button6" UILabel="@ui_CIEject" UIDescription="@ui_CIEjectDesc" Category="PlayerActions" />
<action name="v_eject_cinematic" ActivationMode="delayed_hold_long" keyboard="y" gamepad="shoulderl+b" joystick="rctrl+button6" />
<action name="v_exit" ActivationMode="tap" keyboard="y" gamepad="shoulderl+b" joystick=" " UILabel="@ui_CIExit" UIDescription="@ui_CIExitDesc" />
<action name="v_self_destruct" ActivationMode="press" keyboard="backspace" joystick=" " UILabel="@ui_CISelfDestruct" UIDescription="@ui_CISelfDestructDesc" >
<action name="v_exit" ActivationMode="tap" keyboard="y" gamepad="shoulderl+b" joystick=" " UILabel="@ui_CIExit" UIDescription="@ui_CIExitDesc" Category="PlayerActions" />
<action name="v_self_destruct" ActivationMode="press" keyboard="backspace" joystick=" " UILabel="@ui_CISelfDestruct" UIDescription="@ui_CISelfDestructDesc" Category="ShipSystems" >
<gamepad ActivationMode="delayed_press_medium" input="shoulderl+shoulderr" />
</action>
<action name="v_emergency_exit" ActivationMode="tap" keyboard="u+lshift" joystick=" " UILabel="@ui_CIEmergencyExit" UIDescription="@ui_CIEmergencyExitDesc" />
<action name="v_cooler_throttle_up" onPress="1" onHold="1" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICoolerThrottleUp" UIDescription="@ui_CICoolerThrottleUpDesc" />
<action name="v_cooler_throttle_down" onPress="1" onHold="1" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICoolerThrottleDown" UIDescription="@ui_CICoolerThrottleDownDesc" />
<action name="spectate_enterpuremode" ActivationMode="delayed_press" keyboard="" UILabel="" UIDescription="" />
<action name="v_flightready" ActivationMode="press" keyboard="r" gamepad="shoulderl+shoulderr" joystick=" " UILabel="@ui_CICockpitFlightReady" UIDescription="@ui_CICockpitFlightReadyDesc" />
<action name="v_doors_open_all" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICockpitDoorsOpenAll" UIDescription="@ui_CICockpitDoorsOpenAllDesc" />
<action name="v_doors_close_all" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICockpitDoorsCloseAll" UIDescription="@ui_CICockpitDoorsCloseAllDesc" />
<action name="v_doors_lock_all" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICockpitDoorsLockAll" UIDescription="@ui_CICockpitDoorsLockAllDesc" />
<action name="v_doors_unlock_all" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICockpitDoorsUnlockAll" UIDescription="@ui_CICockpitDoorsUnlockAllDesc" />
<action name="v_flightready" ActivationMode="press" keyboard="r" gamepad="shoulderl+shoulderr" joystick=" " UILabel="@ui_CICockpitFlightReady" UIDescription="@ui_CICockpitFlightReadyDesc" Category="ShipSystems" />
<action name="v_toggle_all_doors" ActivationMode="press" keyboard="k" gamepad=" " joystick=" " UILabel="@ui_CICockpitDoorsToggleAll" UIDescription="@ui_CICockpitDoorsToggleAllDesc" Category="VehicleActions" />
<action name="v_open_all_doors" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICockpitDoorsOpenAll" UIDescription="@ui_CICockpitDoorsOpenAllDesc" />
<action name="v_close_all_doors" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICockpitDoorsCloseAll" UIDescription="@ui_CICockpitDoorsCloseAllDesc" />
<action name="v_toggle_all_doorlocks" ActivationMode="press" keyboard="l" gamepad=" " joystick=" " UILabel="@ui_CICockpitLockToggleAll" UIDescription="@ui_CICockpitLockToggleAllDesc" Category="VehicleActions" />
<action name="v_lock_all_doors" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICockpitDoorsLockAll" UIDescription="@ui_CICockpitDoorsLockAllDesc" />
<action name="v_unlock_all_doors" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICockpitDoorsUnlockAll" UIDescription="@ui_CICockpitDoorsUnlockAllDesc" />
</actionmap>
<actionmap name="spaceship_view" version="21" UILabel="@ui_CGSpaceFlightView" UICategory="@ui_CCSpaceFlight" >
@ -377,14 +396,14 @@
<action name="v_view_cycle_internal_fwd" onPress="1" keyboard=" " gamepad=" " joystick=" " />
<action name="v_view_option" onPress="1" onRelease="1" keyboard=" " gamepad=" " joystick=" " />
<action name="v_view_mode" onPress="1" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICycleViewMode" UIDescription="@ui_CICycleViewModeDesc" />
<action name="v_view_zoom_in" onPress="1" onHold="1" mouse=" " keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIZoomIn" UIDescription="@ui_CIZoomInDesc" />
<action name="v_view_zoom_out" onPress="1" onHold="1" mouse=" " keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIZoomOut" UIDescription="@ui_CIZoomOutDesc" />
<action name="v_view_zoom_in" onPress="1" onHold="1" mouse="mwheel_up" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIZoomIn" UIDescription="@ui_CIZoomInDesc" />
<action name="v_view_zoom_out" onPress="1" onHold="1" mouse="mwheel_down" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIZoomOut" UIDescription="@ui_CIZoomOutDesc" />
<action name="v_view_interact" onPress="1" onRelease="1" keyboard="f" gamepad="a" joystick=" " />
<action name="v_view_freelook_mode" ActivationMode="all" keyboard="z" gamepad=" " joystick=" " UILabel="@ui_CIUnlockView" UIDescription="@ui_CIUnlockViewDesc" />
<action name="v_view_freelook_mode" ActivationMode="hold" keyboard="z" gamepad=" " joystick=" " UILabel="@ui_CIUnlockView" UIDescription="@ui_CIUnlockViewDesc" />
<action name="v_view_dynamic_focus" mouse="lalt+maxis_z" keyboard=" " gamepad=" " joystick=" " optionGroup="flight_zoom" UILabel="@ui_CIDynamicZoomInOut" UIDescription="@ui_CIDynamicZoomInOutDesc" />
<action name="v_view_dynamic_focus_in" ActivationMode="all" mouse=" " keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIDynamicZoomIn" UIDescription="@ui_CIDynamicZoomInDesc" />
<action name="v_view_dynamic_focus_out" ActivationMode="all" mouse=" " keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIDynamicZoomOut" UIDescription="@ui_CIDynamicZoomOutDesc" />
<action name="v_view_look_behind" ActivationMode="delayed_hold_no_retrigger" keyboard="z" joystick=" " UILabel="@ui_CILookBehind" UIDescription="@ui_CILookBehindDesc" >
<action name="v_view_look_behind" ActivationMode="delayed_hold_no_retrigger" keyboard=" " joystick=" " UILabel="@ui_CILookBehind" UIDescription="@ui_CILookBehindDesc" >
<gamepad ActivationMode="hold_no_retrigger" input="shoulderl+a" />
</action>
@ -411,7 +430,11 @@
<action name="v_speed_range_down" onPress="1" onRelease="1" keyboard=" " gamepad="shoulderl+triggerl_btn" joystick=" " UILabel="@ui_CISpeedRangeDown" UIDescription="@ui_CISpeedRangeDownDesc" />
<action name="v_speed_range_rel" always="1" mouse="maxis_z" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CISpeedRangeRel" UIDescription="@ui_CISpeedRangeRelDesc" />
<action name="v_speed_range_abs" always="1" keyboard=" " gamepad=" " joystick=" " optionGroup="flight_move_speed_range" UILabel="@ui_CISpeedRangeAbs" UIDescription="@ui_CISpeedRangeAbsDesc" />
<action name="v_ifcs_toggle_vector_decoupling" ActivationMode="hold_toggle" keyboard="v" gamepad="thumbr" joystick=" " UILabel="@ui_CIToggleDecoupledMode" UIDescription="@ui_CIToggleDecoupledModeDesc" UICategory="@ui_CCFlightModes" />
<action name="v_accel_range_up" onPress="1" onRelease="1" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIAccelRangeUp" UIDescription="@ui_CIAccelRangeUpDesc" />
<action name="v_accel_range_down" onPress="1" onRelease="1" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIAccelRangeDown" UIDescription="@ui_CIAccelRangeDownDesc" />
<action name="v_accel_range_rel" always="1" mouse="ralt+maxis_z" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIAccelRangeRel" UIDescription="@ui_CIAccelRangeRelDesc" />
<action name="v_accel_range_abs" always="1" keyboard=" " gamepad=" " joystick=" " optionGroup="flight_move_accel_range" UILabel="@ui_CIAccelRangeAbs" UIDescription="@ui_CIAccelRangeAbsDesc" />
<action name="v_ifcs_toggle_vector_decoupling" ActivationMode="hold_toggle" keyboard="v" gamepad="thumbr" joystick=" " UILabel="@ui_CIToggleDecoupledMode" UIDescription="@ui_CIToggleDecoupledModeDesc" UICategory="@ui_CCFlightModes" Category="FlightSystems" />
<action name="v_strafe_up" onPress="1" onRelease="1" always="1" keyboard="space" gamepad=" " joystick="button9" optionGroup="flight_move_strafe_vertical" UILabel="@ui_CIStrafeUp" UIDescription="@ui_CIStrafeUpDesc" />
<action name="v_strafe_down" onPress="1" onRelease="1" always="1" keyboard="lctrl" gamepad=" " joystick="button10" optionGroup="flight_move_strafe_vertical" UILabel="@ui_CIStrafeDown" UIDescription="@ui_CIStrafeDownDesc" />
<action name="v_strafe_vertical" keyboard=" " gamepad="shoulderl+thumbry" joystick=" " optionGroup="flight_move_strafe_vertical" UILabel="@ui_CIStrafeUpDown" UIDescription="@ui_CIStrafeUpDownDesc" />
@ -424,13 +447,14 @@
<action name="v_strafe_longitudinal_invert" onPress="1" onRelease="1" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIStrafeLongitudinalInvert" UIDescription="@ui_CIStrafeLongitudinalInvertDesc" />
<action name="v_ifcs_toggle_speed_limiter" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIToggleSpeedLimiter" UIDescription="@ui_CIToggleSpeedLimiterDesc" />
<action name="v_ifcs_toggle_gforce_safety" ActivationMode="smart_toggle" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIToggleGSafe" UIDescription="@ui_CIToggleGSafeDesc" />
<action name="v_ifcs_toggle_esp" ActivationMode="smart_toggle" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIToggleESP" UIDescription="@ui_CIToggleESPDesc" />
<action name="v_ifcs_toggle_cruise_control" ActivationMode="press" keyboard="c" gamepad="shoulderl+thumbl" joystick=" " UILabel="@ui_CIToggleCruise" UIDescription="@ui_CIToggleCruiseDesc" />
<action name="v_ifcs_toggle_esp" ActivationMode="smart_toggle" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIToggleESP" UIDescription="@ui_CIToggleESPDesc" Category="FlightSystems" />
<action name="v_ifcs_toggle_cruise_control" ActivationMode="press" keyboard="c" gamepad="shoulderl+thumbl" joystick=" " UILabel="@ui_CIToggleCruise" UIDescription="@ui_CIToggleCruiseDesc" Category="FlightSystems" />
<action name="v_afterburner" ActivationMode="all" keyboard="lshift" gamepad="thumbl" joystick="button8" UILabel="@ui_CIAfterburner" UIDescription="@ui_CIAfterburnerDesc" />
<action name="v_toggle_landing_system" ActivationMode="tap" keyboard="n" gamepad="dpad_down" joystick="button12" UILabel="@ui_CIToggleLandingSystem" UIDescription="@ui_CIToggleLandingSystemDesc" />
<action name="v_autoland" ActivationMode="delayed_hold" keyboard="n" gamepad="dpad_down" joystick="button12" UILabel="@ui_CIAutoland" UIDescription="@ui_CIAutolandDesc" />
<action name="v_toggle_qdrive_spooling" ActivationMode="tap" keyboard="b" gamepad="shoulderl+x" joystick=" " UILabel="@ui_CIQuantumTravelSystemToggle" UIDescription="@ui_CIQuantumTravelSystemToggleDesc" />
<action name="v_toggle_qdrive_engagement" ActivationMode="delayed_press" keyboard="b" gamepad="shoulderl+x" joystick=" " UILabel="@ui_CIQuantumDriveToggle" UIDescription="@ui_CIQuantumDriveToggleDesc" />
<action name="v_toggle_landing_system" ActivationMode="tap" keyboard="n" gamepad="dpad_down" joystick="button12" UILabel="@ui_CIToggleLandingSystem" UIDescription="@ui_CIToggleLandingSystemDesc" Category="VehicleActions" />
<action name="v_toggle_vtol" ActivationMode="press" keyboard="j" gamepad=" " joystick=" " UILabel="@ui_CIToggleVTOL" UIDescription="@ui_CIToggleVTOLDesc" Category="FlightSystems" />
<action name="v_autoland" ActivationMode="delayed_hold" keyboard="n" gamepad="dpad_down" joystick="button12" UILabel="@ui_CIAutoland" UIDescription="@ui_CIAutolandDesc" Category="FlightSystems" />
<action name="v_toggle_qdrive_spooling" ActivationMode="tap" keyboard="b" gamepad="shoulderl+x" joystick=" " UILabel="@ui_CIQuantumTravelSystemToggle" UIDescription="@ui_CIQuantumTravelSystemToggleDesc" Category="FlightSystems" />
<action name="v_toggle_qdrive_engagement" ActivationMode="delayed_press" keyboard="b" gamepad="shoulderl+x" joystick=" " UILabel="@ui_CIQuantumDriveToggle" UIDescription="@ui_CIQuantumDriveToggleDesc" Category="FlightSystems" />
</actionmap>
<actionmap name="spaceship_docking" version="1" >
@ -439,19 +463,22 @@
</actionmap>
<actionmap name="spaceship_targeting" version="8" UILabel="@ui_CGSpaceFlightTargeting" UICategory="@ui_CCSpaceFlight" >
<action name="v_aim_yaw" gamepad="thumbrx" joystick=" " optionGroup="flight_aim_yaw" UILabel="@ui_CIYawAim" UIDescription="@ui_CIYawAimDesc" />
<action name="v_aim_yaw" gamepad=" " joystick=" " optionGroup="flight_aim_yaw" UILabel="@ui_CIYawAim" UIDescription="@ui_CIYawAimDesc" />
<action name="v_aim_yaw_left" onPress="1" onRelease="1" keyboard=" " joystick=" " gamepad=" " optiongroup="flight_view_yaw_left" UILabel="@ui_CIRotateAimLeft" UIDescription="@ui_CIRotateAimLeftDesc" />
<action name="v_aim_yaw_right" onPress="1" onRelease="1" keyboard=" " joystick=" " gamepad=" " optiongroup="flight_view_yaw_right" UILabel="@ui_CIRotateAimRight" UIDescription="@ui_CIRotateAimRightDesc" />
<action name="v_aim_pitch" gamepad="thumbry" joystick=" " optionGroup="flight_aim_pitch" UILabel="@ui_CIPitchAim" UIDescription="@ui_CIPitchAimDesc" />
<action name="v_aim_pitch" gamepad=" " joystick=" " optionGroup="flight_aim_pitch" UILabel="@ui_CIPitchAim" UIDescription="@ui_CIPitchAimDesc" />
<action name="v_aim_pitch_up" onPress="1" onRelease="1" keyboard=" " gamepad=" " joystick=" " optiongroup="flight_view_pitch_up" UILabel="@ui_CIRotateAimUp" UIDescription="@ui_CIRotateAimUpDesc" />
<action name="v_aim_pitch_down" onPress="1" onRelease="1" keyboard=" " gamepad=" " joystick=" " optiongroup="flight_view_pitch_down" UILabel="@ui_CIRotateAimDown" UIDescription="@ui_CIRotateAimDownDesc" />
<action name="v_aim_yaw_mouse" mouse="maxis_x" optionGroup="flight_move_yaw" UILabel="@ui_CIYawAim" UIDescription="@ui_CIYawAimDesc" />
<action name="v_aim_pitch_mouse" mouse="maxis_y" optionGroup="flight_move_pitch" UILabel="@ui_CIPitchAim" UIDescription="@ui_CIPitchAimDesc" />
<action name="v_aim_snap" ActivationMode="press" gamepad=" " joystick=" " UILabel="@ui_CICenterAim" UIDescription="@ui_CICenterAim" />
<action name="v_couple_aim_to_move" ActivationMode="smart_toggle" keyboard="lalt+r" gamepad=" " joystick=" " UILabel="@ui_CICoupleAimMove" UIDescription="@ui_CICoupleAimMoveDesc" />
<action name="v_look_ahead_enable" ActivationMode="smart_toggle" keyboard="lalt+r" gamepad=" " joystick=" " UILabel="@ui_CILookAheadOn" UIDescription="@ui_CILookAheadOnDesc" />
<action name="v_look_ahead_start_target_tracking" ActivationMode="smart_toggle" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CILookAheadStartTargetTracking" UIDescription="@ui_CILookAheadStartTargetTrackingDesc" />
<action name="v_target_tracking_auto_zoom" ActivationMode="smart_toggle" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CITargetTrackingAutoZoomEnabled" UIDescription="@ui_CITargetTrackingAutoZoomEnabledDesc" />
<action name="v_toggle_mouse_aim_only" ActivationMode="press" keyboard="rshift" UILabel="@ui_CICycleMouseAimMode" UIDescription="@ui_CICycleMouseAimModeDesc" />
<action name="v_target_toggle_computer_onoff" onPress="1" onRelease="1" keyboard=" " gamepad=" " joystick=" " />
<action name="v_target_reticle_focus" ActivationMode="tap" keyboard="1" gamepad="dpad_up" joystick="button11" UILabel="@ui_CITargetReticleFocus" UIDescription="@ui_CITargetReticleFocusDesc" />
<action name="v_target_deselect_entity" ActivationMode="tap" keyboard="0" gamepad="dpad_down" joystick=" " UILabel="@ui_CIDeselectEntity" UIDescription="@ui_CIDeselectEntityDesc" />
<action name="v_target_cycle_all_fwd" ActivationMode="press" keyboard=" " joystick=" " UILabel="@ui_CICycleTargetsFwd" UIDescription="@ui_CICycleTargetsFwdDesc" >
<gamepad ActivationMode="tap" input=" " />
</action>
@ -489,27 +516,26 @@
<gamepad ActivationMode="delayed_press" input="shoulderl+dpad_up" />
</action>
<action name="v_target_nearest_friendly" ActivationMode="tap" keyboard=" " joystick=" " UILabel="@ui_CITargetNearestFriendly" UIDescription="@ui_CITargetNearestFriendlyDesc" >
<gamepad ActivationMode="delayed_press" input="shoulderl+dpad_left" />
</action>
<action name="v_target_cycle_subitem_fwd" ActivationMode="tap" keyboard="2" gamepad="dpad_left" joystick=" " UILabel="@ui_CISubtargetFwd" UIDescription="@ui_CISubtargetFwdDesc" />
<action name="v_target_cycle_subitem_back" ActivationMode="tap" keyboard="lalt+2" gamepad=" " joystick=" " UILabel="@ui_CISubtargetBack" UIDescription="@ui_CISubtargetBackDesc" />
<action name="v_target_focus_root_entity" ActivationMode="delayed_press" keyboard="2" gamepad="dpad_left" joystick=" " UILabel="@ui_CISubtargetRoot" UIDescription="@ui_CISubtargetRootDesc" />
<action name="v_target_cycle_reticle_mode" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CITargetReticleMode" UIDescription="@ui_CITargetReticleModeDesc" />
<action name="v_target_head_tracking" ActivationMode="smart_toggle" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CITargetHeadTracking" UIDescription="@ui_CITargetHeadTrackingDesc" />
<action name="v_target_trigger_scan" onPress="1" keyboard="" gamepad="" joystick="" />
<action name="v_target_cycle_component_fwd" onPress="1" keyboard="" gamepad="" joystick="" />
<action name="v_target_cycle_component_back" onPress="1" keyboard="" gamepad="" joystick="" />
<action name="v_target_cycle_component_group_fwd" ActivationMode="double_tap_nonblocking" keyboard="" gamepad="" joystick="" />
<action name="v_target_cycle_component_group_back" ActivationMode="double_tap_nonblocking" keyboard="" gamepad="" joystick="" />
<action name="v_target_deselect_component" ActivationMode="delayed_press" pressTriggerThreshold="0.75" joystick="" />
<action name="v_toggle_mining_mode" ActivationMode="tap" keyboard="m" gamepad="shoulderl+dpad_right" joystick=" " UILabel="@ui_CIMiningMode" UIDescription="@ui_CIMiningModeDesc" />
<action name="v_toggle_scan_mode" ActivationMode="tap" keyboard="tab" gamepad="dpad_right" joystick=" " UILabel="@ui_CIScanningMode" UIDescription="@ui_CIScanningModeDesc" />
<action name="v_invoke_ping" ActivationMode="hold" mouse="mouse2" keyboard=" " gamepad="shoulderr" joystick="button1" UILabel="@ui_CIScanningRadarPing" UIDescription="@ui_CIScanningRadarPingDesc" />
<action name="v_target_reticle_scan_target" ActivationMode="hold" mouse="mouse2" keyboard=" " joystick=" " >
<gamepad ActvationMode="smart_toggle" input="shoulderl+shoulderr" />
</action>
<action name="v_enter_remote_turret_1" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_interactor_use_remote_turret" UIDescription="@ " Category="RemoteTurret" />
<action name="v_enter_remote_turret_2" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_interactor_use_remote_turret" UIDescription="@ " Category="RemoteTurret" />
<action name="v_enter_remote_turret_3" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_interactor_use_remote_turret" UIDescription="@ " Category="RemoteTurret" />
</actionmap>
<actionmap name="spaceship_target_hailing" version="1" UILabel="@ui_CGSpaceFlightTargetHailing" UICategory="@ui_CCSpaceFlight" >
<action name="v_target_hail" ActivationMode="tap" keyboard="6" joystick=" " UILabel="@ui_CIHailTarget" UIDescription="@ui_CIHailTargetDesc" />
</actionmap>
<actionmap name="spaceship_scanning" version="2" UILabel="@ui_CGSpaceFlightTargeting" UICategory="@ui_CCSpaceFlight" >
<action name="v_toggle_scan_mode" ActivationMode="tap" keyboard="tab" gamepad="dpad_right" joystick=" " UILabel="@ui_CIScanningMode" UIDescription="@ui_CIScanningModeDesc" Category="ShipSystems" />
<action name="v_scanning_trigger_scan" ActivationMode="hold" keyboard=" " mouse="mouse1" joystick=" " UILabel="@ui_CIScanningActivate" UIDescription="@ui_CIScanningActivateDesc" >
<gamepad ActivationMode="smart_toggle" input="shoulderl+shoulderr" />
</action>
@ -528,6 +554,7 @@
</actionmap>
<actionmap name="spaceship_mining" version="1" UILabel="@ui_CGSpaceFlightMining" UICategory="@ui_CCSpaceFlight" >
<action name="v_toggle_mining_mode" ActivationMode="tap" keyboard="m" gamepad="shoulderl+dpad_right" joystick=" " UILabel="@ui_CIMiningMode" UIDescription="@ui_CIMiningModeDesc" Category="ShipSystems" />
<action name="v_toggle_mining_laser_fire" ActivationMode="smart_toggle" keyboard=" " mouse="mouse1" joystick="button1" UILabel="@ui_CIToggleMiningLaserFire" UIDescription="@ui_CIToggleMiningLaserFireDesc" >
<gamepad ActivationMode="tap" input="shoulderr" />
</action>
@ -584,7 +611,14 @@
<gamepad ActivationMode="tap" input=" " />
</action>
<action name="v_target_nearest_hostile" ActivationMode="tap" keyboard="lalt+1" gamepad="shoulderl+dpad_up" joystick=" " UILabel="@ui_CITargetNearestHostile" UIDescription="@ui_CITargetNearestHostileDesc" />
<action name="v_target_nearest_hostile" ActivationMode="tap" keyboard="lalt+1" joystick=" " UILabel="@ui_CITargetNearestHostile" UIDescription="@ui_CITargetNearestHostileDesc" >
<gamepad ActivationMode="delayed_press" input="shoulderl+dpad_up" />
</action>
<action name="v_target_nearest_friendly" ActivationMode="tap" keyboard=" " joystick=" " UILabel="@ui_CITargetNearestFriendly" UIDescription="@ui_CITargetNearestFriendlyDesc" >
<gamepad ActivationMode="delayed_press" input="shoulderl+dpad_left" />
</action>
<action name="v_target_focus_root_entity" ActivationMode="delayed_press" keyboard="2" gamepad="dpad_left" joystick=" " UILabel="@ui_CISubtargetRoot" UIDescription="@ui_CISubtargetRootDesc" />
<action name="v_target_cycle_subitem_fwd" ActivationMode="tap" keyboard="2" gamepad="dpad_left" joystick=" " UILabel="@ui_CISubtargetFwd" UIDescription="@ui_CISubtargetFwdDesc" />
<action name="v_target_cycle_subitem_back" ActivationMode="tap" keyboard="lalt+2" gamepad=" " joystick=" " UILabel="@ui_CISubtargetBack" UIDescription="@ui_CISubtargetBackDesc" />
@ -595,7 +629,7 @@
<action name="v_attack1_group2" ActivationMode="all" mouse="mouse2" keyboard=" " gamepad="triggerl_btn" joystick="button2" UILabel="@ui_CIAttackGroup2" UIDescription="@ui_CIAttackGroup2Desc" />
<action name="v_weapon_cycle_ammo_fwd" onPress="1" onRelease="1" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICycleWeaponAmmoFwd" UIDescription="@ui_CICycleWeaponAmmoFwdDesc" />
<action name="v_weapon_cycle_ammo_back" onPress="1" onRelease="1" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICycleWeaponAmmoBack" UIDescription="@ui_CICycleWeaponAmmoBackDesc" />
<action name="v_weapon_cycle_aimmode" ActivationMode="press" keyboard="r" gamepad="b" joystick=" " UILabel="@ui_CIGimbalLock" UIDescription="@ui_CIGimbalLockDesc" />
<action name="v_weapon_cycle_aimmode" ActivationMode="press" keyboard="r" gamepad="b" joystick=" " UILabel="@ui_CIGimbalLock" UIDescription="@ui_CIGimbalLockDesc" Category="WeaponSystems" />
<action name="v_turret_gyromode" ActivationMode="press" keyboard="g" gamepad=" " joystick=" " UILabel="@ui_CITurretGyroMode" UIDescription="@ui_CITurretGyroModeDesc" />
<action name="v_turret_sensitivityincrease" ActivationMode="press" keyboard="e" gamepad=" " joystick=" " UILabel="" UIDescription="" />
<action name="v_turret_sensitivitydecrease" ActivationMode="press" keyboard="q" gamepad=" " joystick=" " UILabel="" UIDescription="" />
@ -610,9 +644,9 @@
</actionmap>
<actionmap name="spaceship_defensive" version="2" UILabel="@ui_CGSpaceFlightDefensive" UICategory="@ui_CCSpaceFlight" >
<action name="v_weapon_launch_countermeasure" ActivationMode="press" keyboard="g" gamepad="a" joystick="button3" UILabel="@ui_CILaunchCM" UIDescription="@ui_CILaunchCMDesc" />
<action name="v_weapon_launch_countermeasure" ActivationMode="press" keyboard="g" gamepad="a" joystick="button3" UILabel="@ui_CILaunchCM" UIDescription="@ui_CILaunchCMDesc" Category="WeaponSystems" />
<action name="v_weapon_launch_countermeasure_cinematic" onPress="0" onHold="1" onRelease="1" keyboard="g" gamepad="a" joystick="button3" />
<action name="v_weapon_cycle_countermeasure_fwd" ActivationMode="press" keyboard="h" gamepad="x" joystick="button5" UILabel="@ui_CICycleCMFwd" UIDescription="@ui_CICycleCMFwdDesc" />
<action name="v_weapon_cycle_countermeasure_fwd" ActivationMode="press" keyboard="h" gamepad="x" joystick="button5" UILabel="@ui_CICycleCMFwd" UIDescription="@ui_CICycleCMFwdDesc" Category="WeaponSystems" />
<action name="v_weapon_cycle_countermeasure_back" ActivationMode="tap" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICycleCMBack" UIDescription="@ui_CICycleCMBackDesc" />
<action name="v_shield_raise_level_forward" onPress="1" onRelease="1" onHold="1" holdTriggerDelay="0.15" keyboard="np_8" gamepad=" " joystick=" " UILabel="@ui_CIShieldLevelFront" UIDescription="@ui_CIShieldLevelFrontDesc" />
<action name="v_shield_raise_level_back" onPress="1" onRelease="1" onHold="1" holdTriggerDelay="0.15" keyboard="np_2" gamepad=" " joystick=" " UILabel="@ui_CIShieldLevelBack" UIDescription="@ui_CIShieldLevelBackDesc" />
@ -636,10 +670,10 @@
<action name="v_power_throttle_down" onPress="1" onHold="1" keyboard="f9" gamepad=" " joystick=" " UILabel="@ui_CIPowerThrottleDown" UIDescription="@ui_CIPowerThrottleDownDesc" />
<action name="v_power_throttle_max" ActivationMode="double_tap" keyboard="f10" gamepad=" " joystick=" " UILabel="@ui_CIPowerThrottleMax" UIDescription="@ui_CIPowerThrottleMaxDesc" />
<action name="v_power_throttle_min" ActivationMode="double_tap" keyboard="f9" gamepad=" " joystick=" " UILabel="@ui_CIPowerThrottleMin" UIDescription="@ui_CIPowerThrottleMinDesc" />
<action name="v_power_toggle_group_1" ActivationMode="smart_toggle" keyboard="p" gamepad=" " joystick=" " UILabel="@ui_CIPowerPresetToggle1" UIDescription="@ui_CIPowerPresetToggle1Desc" />
<action name="v_power_toggle_group_2" ActivationMode="smart_toggle" keyboard="o" gamepad=" " joystick=" " UILabel="@ui_CIPowerPresetToggle2" UIDescription="@ui_CIPowerPresetToggle2Desc" />
<action name="v_power_toggle_group_3" ActivationMode="smart_toggle" keyboard="i" gamepad=" " joystick=" " UILabel="@ui_CIPowerPresetToggle3" UIDescription="@ui_CIPowerPresetToggle3Desc" />
<action name="v_power_toggle" ActivationMode="press" keyboard="u" gamepad=" " joystick=" " UILabel="@ui_CIPowerToggle" UIDescription="@ui_CIPowerToggleDesc" />
<action name="v_power_toggle_group_1" ActivationMode="smart_toggle" keyboard="p" gamepad=" " joystick=" " UILabel="@ui_CIPowerPresetToggle1" UIDescription="@ui_CIPowerPresetToggle1Desc" Category="WeaponSystems" />
<action name="v_power_toggle_group_2" ActivationMode="smart_toggle" keyboard="o" gamepad=" " joystick=" " UILabel="@ui_CIPowerPresetToggle2" UIDescription="@ui_CIPowerPresetToggle2Desc" Category="ShipSystems" />
<action name="v_power_toggle_group_3" ActivationMode="smart_toggle" keyboard="i" gamepad=" " joystick=" " UILabel="@ui_CIPowerPresetToggle3" UIDescription="@ui_CIPowerPresetToggle3Desc" Category="ShipSystems" />
<action name="v_power_toggle" ActivationMode="press" keyboard="u" gamepad=" " joystick=" " UILabel="@ui_CIPowerToggle" UIDescription="@ui_CIPowerToggleDesc" Category="ShipSystems" />
</actionmap>
<actionmap name="spaceship_radar" version="2" UILabel="@ui_CGSpaceFlightRadar" UICategory="@ui_CCSpaceFlight" >
@ -655,7 +689,7 @@
</actionmap>
<actionmap name="spaceship_hud" version="2" UILabel="@ui_CGSpaceFlightHUD" UICategory="@ui_CCSpaceFlight" >
<action name="mobiglas" ActivationMode="press" keyboard="f1" gamepad="back" UILabel="@ui_CIMobiGlas" UIDescription="@ui_CIMobiGlasDesc" />
<action name="mobiglas" ActivationMode="press" keyboard="f1" gamepad="back" UILabel="@ui_CIMobiGlas" UIDescription="@ui_CIMobiGlasDesc" Category="MobiGlasActions" />
<action name="toggle_ar_mode" ActivationMode="press" keyboard="" gamepad="" />
<action name="v_hud_open_scoreboard" ActivationMode="delayed_hold_no_retrigger" keyboard="tab" gamepad="back" joystick=" " UILabel="@ui_CIOpenScoreboard" UIDescription="@ui_CIOpenScoreboardDesc" />
<action name="v_hud_interact_toggle" ActivationMode="press" keyboard=" " joystick=" " />
@ -679,23 +713,23 @@
<action name="v_comm_select_precanned_3" onPress="1" onRelease="1" keyboard="" gamepad="" joystick="" />
<action name="v_comm_select_precanned_4" onPress="1" onRelease="1" keyboard="" gamepad="" joystick="" />
<action name="v_comm_select_precanned_5" onPress="1" onRelease="1" keyboard="" gamepad="" joystick="" />
<action name="v_starmap" ActivationMode="press" keyboard="f2" joystick=" " UILabel="@ui_CIMap" UIDescription="@ui_CIMapDesc" >
<action name="v_starmap" ActivationMode="press" keyboard="f2" joystick=" " UILabel="@ui_CIMap" UIDescription="@ui_CIMapDesc" Category="MobiGlasActions" >
<gamepad ActivationMode="delayed_press" input="back" />
</action>
</actionmap>
<actionmap name="lights_controller" version="1" UILabel="@ui_CGLightController" UICategory="@ui_CGLightControllerDesc" >
<action name="v_lights" ActivationMode="press" keyboard="t" gamepad="shoulderl+dpad_down" joystick=" " UILabel="@ui_CIToggleLights" UIDescription="@ui_CIToggleLightsDesc" />
<action name="v_lights" ActivationMode="press" keyboard="t" gamepad="shoulderl+dpad_down" joystick=" " UILabel="@ui_CIToggleLights" UIDescription="@ui_CIToggleLightsDesc" Category="VehicleActions" />
<action name="v_toggle_running_lights" ActivationMode="smart_toggle" keyboard=" " gamepad=" " joystick=" " />
<action name="v_toggle_cabin_lights" ActivationMode="smart_toggle" keyboard=" " gamepad=" " joystick=" " />
</actionmap>
<actionmap name="player" version="27" UILabel="@ui_CGFPSMovement" UICategory="@ui_CCFPS" >
<action name="moveleft" ActivationMode="hold" keyboard="a" joystick=" " UILabel="@ui_CIFPSMoveLeft" UIDescription="@ui_CIFPSMoveLeftDesc" />
<action name="moveright" ActivationMode="hold" keyboard="d" joystick=" " UILabel="@ui_CIFPSMoveRight" UIDescription="@ui_CIFPSMoveRightDesc" />
<action name="moveforward" ActivationMode="hold" keyboard="w" joystick=" " UILabel="@ui_CIFPSMoveForward" UIDescription="@ui_CIFPSMoveForwardDesc" />
<action name="moveback" ActivationMode="hold" keyboard="s" joystick=" " UILabel="@ui_CIFPSMoveBack" UIDescription="@ui_CIFPSMoveBackDesc" />
<action name="moveleft" ActivationMode="hold" retriggerable="1" keyboard="a" joystick=" " UILabel="@ui_CIFPSMoveLeft" UIDescription="@ui_CIFPSMoveLeftDesc" />
<action name="moveright" ActivationMode="hold" retriggerable="1" keyboard="d" joystick=" " UILabel="@ui_CIFPSMoveRight" UIDescription="@ui_CIFPSMoveRightDesc" />
<action name="moveforward" ActivationMode="hold" retriggerable="1" keyboard="w" joystick=" " UILabel="@ui_CIFPSMoveForward" UIDescription="@ui_CIFPSMoveForwardDesc" />
<action name="moveback" ActivationMode="hold" retriggerable="1" keyboard="s" joystick=" " UILabel="@ui_CIFPSMoveBack" UIDescription="@ui_CIFPSMoveBackDesc" />
<action name="rotateyaw" mouse="maxis_x" keyboard=" " optionGroup="fps_view_yaw" />
<action name="rotatepitch" mouse="maxis_y" keyboard=" " optionGroup="fps_view_pitch" />
<action name="gp_movex" gamepad="thumblx" joystick=" " optionGroup="fps_move_lateral" UILabel="@ui_CIFPSAxisMoveLeftToRight" UIDescription="@ui_CIFPSPadMoveLeftToRightDesc" />
@ -703,53 +737,72 @@
<action name="gp_rotateyaw" gamepad="thumbrx" joystick=" " optionGroup="fps_view_yaw" UILabel="@ui_CIFPSAxisLookYaw" UIDescription="@ui_CIFPSPadLookYawDesc" />
<action name="gp_rotatepitch" gamepad="thumbry" joystick=" " optionGroup="fps_view_pitch" UILabel="@ui_CIFPSAxisLookPitch" UIDescription="@ui_CIFPSPadLookPitchDesc" />
<action name="jump" ActivationMode="press" keyboard="space" joystick=" " UILabel="@ui_CIFPSMoveJump" UIDescription="@ui_CIFPSMoveJumpDesc" />
<action name="crouch" ActivationMode="hold_toggle" keyboard="lctrl" UILabel="@ui_CIFPSStanceCrouch" UIDescription="@ui_CIFPSStanceCrouchDesc" />
<action name="crouch" ActivationMode="hold_toggle" keyboard="lctrl" UILabel="@ui_CIFPSStanceCrouch" UIDescription="@ui_CIFPSStanceCrouchDesc" Category="PlayerActions" />
<action name="gp_jump" ActivationMode="press" gamepad="a" UILabel="@ui_CIFPSMoveJump" UIDescription="@ui_CIFPSMoveJumpDesc" />
<action name="gp_crouch" ActivationMode="press" gamepad="b" UILabel="@ui_CIFPSStanceCrouch" UIDescription="@ui_CIFPSStanceCrouchDesc" >
<joystick ActivationMode="press" input=" " />
</action>
<action name="prone" ActivationMode="press" keyboard="x" joystick=" " UILabel="@ui_CIFPSStanceProne" UIDescription="@ui_CIFPSStanceProneDesc" >
<action name="prone" ActivationMode="press" keyboard="x" joystick=" " UILabel="@ui_CIFPSStanceProne" UIDescription="@ui_CIFPSStanceProneDesc" Category="PlayerActions" >
<gamepad ActivationMode="delayed_press" input="b" />
</action>
<action name="sprint" ActivationMode="smart_toggle" keyboard="lshift" gamepad="thumbl" joystick=" " UILabel="@ui_CIFPSMoveModeSprint" UIDescription="@ui_CIFPSMoveModeSprintDesc" />
<action name="sprint" ActivationMode="hold" keyboard="lshift" gamepad="thumbl" joystick=" " UILabel="@ui_CIFPSMoveModeSprint" UIDescription="@ui_CIFPSMoveModeSprintDesc" />
<action name="walk" ActivationMode="tap" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIFPSMoveModeWalk" UIDescription="@ui_CIFPSMoveModeWalkDesc" />
<action name="leanleft" onPress="1" onRelease="1" onHold="1" keyboard="q" gamepad="shoulderl+thumbl" joystick=" " UILabel="@ui_CIFPSLeanLeft" UIDescription="@ui_CIFPSLeanLeftDesc" />
<action name="leanright" onPress="1" onRelease="1" onHold="1" keyboard="e" gamepad="shoulderl+thumbr" joystick=" " UILabel="@ui_CIFPSLeanRight" UIDescription="@ui_CIFPSLeanRightDesc" />
<action name="toggle_lowered" ActivationMode="tap" keyboard=" " gamepad=" " />
<action name="attack1" ActivationMode="all" mouse="mouse1" keyboard=" " gamepad="triggerr_btn" joystick=" " UILabel="@ui_CIFPSAttack1" UIDescription="@ui_CIFPSAttack1Desc" />
<action name="weapon_melee" ActivationMode="press" mouse="mouse3" keyboard=" " gamepad="thumbr" joystick=" " UILabel="@ui_CIFPSAttackMelee" UIDescription="@ui_CIFPSAttackMeleeDesc" />
<action name="attack1" ActivationMode="hold" mouse="mouse1" keyboard=" " gamepad="triggerr_btn" joystick=" " UILabel="@ui_CIFPSAttack1" UIDescription="@ui_CIFPSAttack1Desc" />
<action name="melee_AttackLightLeft" ActivationMode="tap" mouse="mouse1" keyboard=" " gamepad="triggerl_btn" joystick=" " UILabel="@ui_CIFPSMeleeAttackLightLeft" UIDescription="@ui_CIFPSAttack1Desc" />
<action name="melee_AttackLightRight" ActivationMode="tap" mouse="mouse2" keyboard=" " gamepad="triggerr_btn" joystick=" " UILabel="@ui_CIFPSMeleeAttackLightRight" UIDescription="@ui_CIFPSAttack1Desc" />
<action name="melee_AttackHeavyLeft" ActivationMode="delayed_press" mouse="mouse1" keyboard=" " gamepad="triggerl_btn" joystick=" " UILabel="@ui_CIFPSMeleeAttackHeavyLeft" UIDescription="@ui_CIFPSAttack1Desc" />
<action name="melee_AttackHeavyRight" ActivationMode="delayed_press" mouse="mouse2" keyboard=" " gamepad="triggerr_btn" joystick=" " UILabel="@ui_CIFPSMeleeAttackHeavyRight" UIDescription="@ui_CIFPSAttack1Desc" />
<action name="melee_block" ActivationMode="hold" mouse="mouse1_2" keyboard=" " gamepad="triggerl_r_btn" joystick=" " UILabel="@ui_CIFPSMeleeBlock" UIDescription="@ui_CIFPSMeleeBlockDesc" />
<action name="melee_dodgeLeft" ActivationMode="double_tap_nonblocking" keyboard="a" UILabel="@ui_CIFPSMoveDodgeLeft" UIDescription="@ui_CIFPSMoveDodgeLeftDesc" >
<gamepad ActivationMode="press" input="shoulderl+thumbl_left" />
</action>
<action name="melee_dodgeRight" ActivationMode="double_tap_nonblocking" keyboard="d" UILabel="@ui_CIFPSMoveDodgeRight" UIDescription="@ui_CIFPSMoveDodgeRightDesc" >
<gamepad ActivationMode="press" input="shoulderl+thumbl_right" />
</action>
<action name="melee_dodgeBack" ActivationMode="double_tap_nonblocking" keyboard="s" UILabel="@ui_CIFPSMoveDodgeBack" UIDescription="@ui_CIFPSMoveDodgeBackDesc" >
<gamepad ActivationMode="press" input="shoulderl+thumbl_down" />
</action>
<action name="weapon_melee" ActivationMode="press" mouse="mouse3" keyboard="" gamepad="thumbr" joystick=" " UILabel="@ui_CIFPSAttackMelee" UIDescription="@ui_CIFPSAttackMeleeDesc" />
<action name="grenade" ActivationMode="hold" keyboard="g" gamepad="shoulderr" joystick=" " UILabel="@ui_CIFPSUseItem" UIDescription="@ui_CIFPSUseItem" />
<action name="zoom" ActivationMode="hold_toggle" mouse="mouse2" keyboard=" " gamepad="triggerl_btn" joystick=" " UILabel="@ui_CIFPSAimDownSight" UIDescription="@ui_CIFPSAimDownSightDesc" />
<action name="zoom_out" ActivationMode="press" mouse="mwheel_down" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIFPSZoomOut" UIDescription="@ui_CIFPSZoomOutDesc" />
<action name="zoom_in" ActivationMode="press" mouse="mwheel_up" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIFPSZoomIn" UIDescription="@ui_CIFPSZoomInDesc" />
<action name="zoom_in_out" ActivationMode="press" keyboard=" " gamepad="dpad_up" joystick=" " UILabel="@ui_CIFPSZoomInOut" UIDescription="@ui_CIFPSZoomInOutDesc" />
<action name="selectpistol" ActivationMode="press" keyboard="1" gamepad="dpad_right" joystick=" " UILabel="@ui_CIFPSSelectSidearm" UIDescription="@ui_CIFPSSelectSidearmDesc" />
<action name="selectprimary" ActivationMode="press" keyboard="2" gamepad="dpad_up" joystick=" " UILabel="@ui_CIFPSSelectPrimary" UIDescription="@ui_CIFPSSelectPrimaryDesc" />
<action name="selectsecondary" ActivationMode="press" keyboard="3" gamepad="dpad_left" joystick=" " UILabel="@ui_CIFPSSelectSecondary" UIDescription="@ui_CIFPSSelectSecondaryDesc" />
<action name="selectgadget" ActivationMode="press" keyboard="4" gamepad="dpad_down" joystick=" " UILabel="@ui_CIFPSSelectGadget" UIDescription="@ui_CIFPSSelectGadgetDesc" />
<action name="selectMeleeWeapon" ActivationMode="press" keyboard="5" gamepad=" " joystick=" " />
<action name="selectpistol" ActivationMode="press" keyboard="1" gamepad="dpad_right" joystick=" " UILabel="@ui_CIFPSSelectSidearm" UIDescription="@ui_CIFPSSelectSidearmDesc" Category="WeaponSelection" />
<action name="selectprimary" ActivationMode="press" keyboard="2" gamepad="dpad_up" joystick=" " UILabel="@ui_CIFPSSelectPrimary" UIDescription="@ui_CIFPSSelectPrimaryDesc" Category="WeaponSelection" />
<action name="selectsecondary" ActivationMode="press" keyboard="3" gamepad="dpad_left" joystick=" " UILabel="@ui_CIFPSSelectSecondary" UIDescription="@ui_CIFPSSelectSecondaryDesc" Category="WeaponSelection" />
<action name="selectgadget" ActivationMode="press" keyboard="4" gamepad="dpad_down" joystick=" " UILabel="@ui_CIFPSSelectGadget" UIDescription="@ui_CIFPSSelectGadgetDesc" Category="WeaponSelection" />
<action name="selectMeleeWeapon" ActivationMode="press" keyboard="5" gamepad="shoulderl+dpad_right" joystick=" " UILabel="@ui_CIFPSSelectMeleeWeapon" UIDescription="@ui_CIFPSSelectMeleeWeaponDesc" Category="WeaponSelection" />
<action name="selectUtilityItem" ActivationMode="press" keyboard="6" gamepad=" " joystick=" " UILabel="@ui_CIFPSSelectContract" UIDescription="@ui_CIFPSSelectContractDesc" />
<action name="selectUnarmedCombat" ActivationMode="press" keyboard="0" gamepad="shoulderl+dpad_up" joystick=" " UILabel="@ui_CIFPSSelectUnarmedCombat" UIDescription="@ui_CIFPSSelectUnarmedCombatDesc" Category="WeaponSelection" />
<action name="nextitem" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " />
<action name="prevItem" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " />
<action name="nextweapon" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIFPSNextWeapon" UIDescription="@ui_CIFPSNextWeaponDesc" />
<action name="prevweapon" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIFPSPreviousWeapon" UIDescription="@ui_CIFPSPreviousWeaponDesc" />
<action name="reload" ActivationMode="tap" keyboard="r" gamepad="x" joystick=" " UILabel="@ui_CIFPSReload" UIDescription="@ui_CIFPSReloadDesc" />
<action name="holster" ActivationMode="delayed_press_medium" keyboard="r" gamepad="x" joystick=" " UILabel="@ui_CIFPSHolsterWeapon" UIDescription="@ui_CIFPSHolsterWeaponDesc" />
<action name="reload" ActivationMode="tap" keyboard="r" gamepad="x" joystick=" " UILabel="@ui_CIFPSReload" UIDescription="@ui_CIFPSReloadDesc" Category="ItemActions" />
<action name="holster" ActivationMode="delayed_press_medium" keyboard="r" gamepad="x" joystick=" " UILabel="@ui_CIFPSHolsterWeapon" UIDescription="@ui_CIFPSHolsterWeaponDesc" Category="WeaponSelection" />
<action name="drop" onPress="1" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIDropItem" UIDescription="@ui_CIDropItemDesc" />
<action name="inspect" ActivationMode="tap" keyboard="i" joystick=" " UILabel="@ui_CIInpsectItem" UIDescription="@ui_CIInpsectItemDesc" >
<action name="inspect" ActivationMode="tap" keyboard=" " joystick=" " UILabel="@ui_CIInpsectItem" UIDescription="@ui_CIInpsectItemDesc" >
<gamepad ActivationMode="double_tap" input="dpad_left" />
</action>
<action name="stabilize" ActivationMode="hold" keyboard="lshift" gamepad="thumbl" joystick=" " UILabel="@ui_CIFPSHoldBreath" UIDescription="@ui_CIFPSHoldBreathDesc" />
<action name="weapon_change_firemode" ActivationMode="press" keyboard="v" gamepad="shoulderl+b" joystick=" " UILabel="@ui_CIFPSWeaponChangeFireMode" UIDescription="@ui_CIFPSWeaponChangeFireModeDesc" />
<action name="weapon_auxiliary_action" ActivationMode="press" keyboard="u" gamepad="shoulderl+dpad_left" joystick=" " UILabel="@ui_CIFPSAuxiliaryWeaponAction" UIDescription="ui_CIFPSAuxiliaryWeaponActionDesc" Category="ItemActions" />
<action name="weapon_change_firemode" ActivationMode="press" keyboard="v" gamepad="shoulderl+b" joystick=" " UILabel="@ui_CIFPSWeaponChangeFireMode" UIDescription="@ui_CIFPSWeaponChangeFireModeDesc" Category="ItemActions" />
<action name="fixed_speed_increment" ActivationMode="press" mouse="mwheel_up" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIFPSMoveModeSpeedInc" UIDescription="@ui_CIFPSMoveModeSpeedIncDesc" />
<action name="fixed_speed_decrement" ActivationMode="press" mouse="mwheel_down" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIFPSMoveModeSpeedDec" UIDescription="@ui_CIFPSMoveModeSpeedDecDesc" />
<action name="use" onPress="1" onRelease="1" keyboard="f" gamepad="a" joystick=" " />
<action name="use" onPress="1" onRelease="1" keyboard="e" gamepad="a" joystick=" " />
<action name="useAttachmentBottom" ActivationMode="all" keyboard="" gamepad="" joystick="" />
<action name="useAttachmentTop" ActivationMode="all" keyboard="" gamepad="" joystick="" />
<action name="toggle_flashlight" ActivationMode="press" keyboard="t" gamepad="shoulderl+dpad_down" joystick=" " UILabel="@ui_CIFPSToggleFlashLight" UIDescription="@ui_CIFPSToggleFlashLightDesc" />
<action name="toggle_flashlight" ActivationMode="press" keyboard="t" gamepad="shoulderl+dpad_down" joystick=" " UILabel="@ui_CIFPSToggleFlashLight" UIDescription="@ui_CIFPSToggleFlashLightDesc" Category="ItemActions" />
<action name="combatheal" ActivationMode="press" keyboard="c" joystick=" " UILabel="@ui_CIFPSCombatHeal" UIDescription="@ui_CIFPSCombatHealDesc" >
<gamepad ActivationMode="tap" input="shoulderl+x" />
</action>
@ -762,14 +815,14 @@
<action name="cancelselect" ActivationMode="press" onRelease="1" mouse="mouse2" keyboard=" " gamepad="b" />
<action name="thirdperson" ActivationMode="tap" keyboard="f4" gamepad="shoulderl+y" joystick=" " UILabel="@ui_CIFPSToggleThirdPerson" UIDescription="@ui_CIFPSToggleThirdPersonDesc" />
<action name="toggle_cursor_input" ActivationMode="press" keyboard="f11" gamepad="" />
<action name="free_thirdperson_camera" ActivationMode="smart_toggle" keyboard="z" gamepad=" " joystick=" " UILabel="@ui_CIFPSToggle3rdPersonFreeView" UIDescription="@ui_CIFPSToggle3rdPersonFreeViewDesc" />
<action name="free_thirdperson_camera" ActivationMode="hold" keyboard="z" gamepad=" " joystick=" " UILabel="@ui_CIFPSToggle3rdPersonFreeView" UIDescription="@ui_CIFPSToggle3rdPersonFreeViewDesc" />
<action name="pan_thirdperson_up" ActivationMode="press" keyboard="up" />
<action name="pan_thirdperson_down" ActivationMode="press" keyboard="down" />
<action name="break_conversation_effects" onPress="1" onRelease="1" keyboard="" gamepad="" UILabel="" UIDescription="" />
<action name="hmd_rotateyaw" keyboard="HMD_Yaw" />
<action name="hmd_rotatepitch" keyboard="HMD_Pitch" />
<action name="hmd_rotateroll" keyboard="HMD_Roll" />
<action name="mobiglas" ActivationMode="press" keyboard="f1" gamepad="back" joystick=" " UILabel="@ui_CIMobiGlas" UIDescription="@ui_CIMobiGlasDesc" />
<action name="mobiglas" ActivationMode="press" keyboard="f1" gamepad="back" joystick=" " UILabel="@ui_CIMobiGlas" UIDescription="@ui_CIMobiGlasDesc" Category="MobiGlasActions" />
<action name="pl_hud_open_scoreboard" ActivationMode="hold_no_retrigger" keyboard="tab" gamepad="back" joystick=" " UILabel="@ui_CIOpenScoreboard" UIDescription="@ui_CIOpenScoreboardDesc" />
<action name="pl_hud_confirm" ActivationMode="press" keyboard="enter" gamepad="a" />
<action name="toggle_ar_mode" ActivationMode="press" keyboard="" gamepad="" />
@ -783,11 +836,11 @@
<action name="v_eject_cinematic" ActivationMode="delayed_hold_long" keyboard="y" gamepad="shoulderl+b" joystick=" " />
<action name="spectate_enterpuremode" ActivationMode="delayed_press" keyboard="" gamepad="" UILabel="" UIDescription="" />
<action name="port_modification_select" ActivationMode="press" mouse="mouse1" keyboard=" " gamepad="a" joystick=" " UILabel="@ui_CIModifyPort" UIDescription="@ui_CIModifyPortDesc" />
<action name="v_starmap" ActivationMode="press" keyboard="f2" joystick=" " UILabel="@ui_CIMap" UIDescription="@ui_CIMapDesc" >
<action name="v_starmap" ActivationMode="press" keyboard="f2" joystick=" " UILabel="@ui_CIMap" UIDescription="@ui_CIMapDesc" Category="MobiGlasActions" >
<gamepad ActivationMode="delayed_press" input="back" />
</action>
<action name="force_respawn" ActivationMode="delayed_press_medium" keyboard="backspace" gamepad=" " joystick=" " UILabel="@ui_CIForceRespawn" UIDescription="@ui_CIForceRespawnDesc" />
<action name="force_respawn" ActivationMode="delayed_press_medium" keyboard="backspace" gamepad=" " joystick=" " UILabel="@ui_CIForceRespawn" UIDescription="@ui_CIForceRespawnDesc" Category="PlayerActions" />
</actionmap>
<actionmap name="prone" version="1" UILabel="@ui_CGFPSMovement" UICategory="@ui_CCFPS" >
@ -832,7 +885,7 @@
<action name="eva_strafe_longitudinal" keyboard=" " gamepad="thumbly" joystick=" " UILabel="@ui_CIEVAStrafeLongitudinal" UIDescription="@ui_CIEVAStrafeLongitudinalDesc" />
<action name="eva_brake" ActivationMode="hold" keyboard="x" gamepad=" " joystick=" " UILabel="@ui_CIEVABrake" UIDescription="@ui_CIEVABrakeDesc" />
<action name="eva_boost" ActivationMode="hold" keyboard="lshift" gamepad="thumbl" joystick=" " UILabel="@ui_CIEVABoost" UIDescription="@ui_CIEVABoostDesc" />
<action name="eva_toggle_headlook_mode" ActivationMode="tap" keyboard="z" gamepad=" " joystick=" " UILabel="@ui_CIEVAFreelook" UIDescription="@ui_CIEVAFreelookDesc" />
<action name="eva_toggle_headlook_mode" ActivationMode="hold" keyboard="z" gamepad=" " joystick=" " UILabel="@ui_CIEVAFreelook" UIDescription="@ui_CIEVAFreelookDesc" />
</actionmap>
<actionmap name="vehicle_general" version="27" UILabel="@ui_CGVehicleGeneral" UICategory="@ui_CCVehicle" >
@ -846,7 +899,7 @@
<action name="v_view_pitch_mouse" mouse="maxis_y" optionGroup="mgv_view_pitch" UILabel="@ui_CIPitchView" UIDescription="@ui_CIPitchViewDesc" />
<action name="v_view_yaw" gamepad="thumbrx" joystick="x" optionGroup="mgv_view_yaw" UILabel="@ui_CIYawView" UIDescription="@ui_CIYawViewDesc" />
<action name="v_view_pitch" gamepad="thumbry" joystick="y" optionGroup="mgv_view_pitch" UILabel="@ui_CIPitchView" UIDescription="@ui_CIPitchViewDesc" />
<action name="v_view_look_behind" ActivationMode="delayed_hold" keyboard="z" joystick=" " UILabel="@ui_CILookBehind" UIDescription="@ui_CILookBehindDesc" >
<action name="v_view_look_behind" ActivationMode="delayed_hold" keyboard=" " joystick=" " UILabel="@ui_CILookBehind" UIDescription="@ui_CILookBehindDesc" >
<gamepad ActivationMode="hold_no_retrigger" input="shoulderl+a" />
</action>
@ -856,13 +909,15 @@
<action name="v_view_yaw_absolute" keyboard="HMD_Yaw" />
<action name="v_view_pitch_absolute" keyboard="HMD_Pitch" />
<action name="v_view_roll_absolute" keyboard="HMD_Roll" />
<action name="mobiglas" ActivationMode="press" keyboard="f1" gamepad="back" UILabel="@ui_CIMobiGlas" UIDescription="@ui_CIMobiGlasDesc" />
<action name="v_flightready" ActivationMode="press" keyboard="r" gamepad="shoulderl+shoulderr" joystick=" " UILabel="@ui_CICockpitFlightReady" UIDescription="@ui_CICockpitFlightReadyDesc" />
<action name="v_doors_open_all" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICockpitDoorsOpenAll" UIDescription="@ui_CICockpitDoorsOpenAllDesc" />
<action name="v_doors_close_all" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICockpitDoorsCloseAll" UIDescription="@ui_CICockpitDoorsCloseAllDesc" />
<action name="v_doors_lock_all" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICockpitDoorsLockAll" UIDescription="@ui_CICockpitDoorsLockAllDesc" />
<action name="v_doors_unlock_all" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICockpitDoorsUnlockAll" UIDescription="@ui_CICockpitDoorsUnlockAllDesc" />
<action name="v_starmap" ActivationMode="press" keyboard="f2" joystick=" " UILabel="@ui_CIMap" UIDescription="@ui_CIMapDesc" >
<action name="mobiglas" ActivationMode="press" keyboard="f1" gamepad="back" UILabel="@ui_CIMobiGlas" UIDescription="@ui_CIMobiGlasDesc" Category="MobiglasActions" />
<action name="v_flightready" ActivationMode="press" keyboard="r" gamepad="shoulderl+shoulderr" joystick=" " UILabel="@ui_CICockpitFlightReady" UIDescription="@ui_CICockpitFlightReadyDesc" Category="ShipSystems" />
<action name="v_toggle_all_doors" ActivationMode="press" keyboard="k" gamepad=" " joystick=" " UILabel="@ui_CICockpitDoorsToggleAll" UIDescription="@ui_CICockpitDoorsToggleAllDesc" Category="VehicleActions" />
<action name="v_open_all_doors" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICockpitDoorsOpenAll" UIDescription="@ui_CICockpitDoorsOpenAllDesc" />
<action name="v_close_all_doors" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICockpitDoorsCloseAll" UIDescription="@ui_CICockpitDoorsCloseAllDesc" />
<action name="v_toggle_all_doorlocks" ActivationMode="press" keyboard="l" gamepad=" " joystick=" " UILabel="@ui_CICockpitLockToggleAll" UIDescription="@ui_CICockpitLockToggleAllDesc" />
<action name="v_lock_all_doors" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICockpitDoorsLockAll" UIDescription="@ui_CICockpitDoorsLockAllDesc" />
<action name="v_unlock_all_doors" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CICockpitDoorsUnlockAll" UIDescription="@ui_CICockpitDoorsUnlockAllDesc" />
<action name="v_starmap" ActivationMode="press" keyboard="f2" joystick=" " UILabel="@ui_CIMap" UIDescription="@ui_CIMapDesc" Category="MobiGlasActions" >
<gamepad ActivationMode="delayed_press" input="back" />
</action>
@ -889,11 +944,6 @@
</actionmap>
<actionmap name="debug" version="23" >
<action name="flymode" onPress="1" noModifiers="1" keyboard="f3" />
<action name="flymode_strafe_up" onHold="1" keyboard="space" />
<action name="flymode_strafe_down" onHold="1" keyboard="lctrl" />
<action name="flymode_roll_left" onHold="1" keyboard="q" />
<action name="flymode_roll_right" onHold="1" keyboard="e" />
<action name="godmode" onPress="1" noModifiers="1" keyboard="f9" />
<action name="toggleaidebugdraw" onPress="1" noModifiers="1" keyboard="f11" />
<action name="ai_DebugCenterViewAgent" onPress="1" noModifiers="1" keyboard="np_divide" />
@ -925,7 +975,7 @@
<action name="spectate_rotatepitch" keyboard=" " gamepad="thumbry" joystick="y" optionGroup="fps_view_pitch" UILabel="@ui_CISpectatorRotatePitch" UIDescription="@ui_CISpectatorRotatePitchDesc" />
<action name="spectate_toggle_hud" ActivationMode="press" keyboard="b" joystick=" " gamepad="b" UILabel="@ui_CISpectatorHudToggle" UIDescription="@ui_CISpectatorHudToggleDesc" />
<action name="spectate_gen_nextcamera" ActivationMode="press" keyboard="n" joystick=" " gamepad=" " UILabel="" UIDescription="" />
<action name="spectate_gen_nextmode" ActivationMode="tap" keyboard="f4" gamepad="shoulderl+y" joystick=" " UILabel="@ui_CISpectatorModeNext" UIDescription="@ui_CISpectatorModeNextDesc" />
<action name="spectate_gen_nextmode" ActivationMode="press" keyboard="f4" gamepad="shoulderl+y" joystick=" " UILabel="@ui_CISpectatorModeNext" UIDescription="@ui_CISpectatorModeNextDesc" />
<action name="spectate_gen_prevmode" ActivationMode="press" keyboard=" " joystick=" " gamepad=" " UILabel="@ui_CISpectatorModePrev" UIDescription="@ui_CISpectatorModePrevDesc" />
<action name="spectate_moveleft" ActivationMode="hold" keyboard="a" gamepad="thumbl_left" UILabel="" UIDescription="" />
<action name="spectate_moveright" ActivationMode="hold" keyboard="d" gamepad="thumbl_right" UILabel="" UIDescription="" />
@ -935,7 +985,7 @@
<action name="spectate_movedown" ActivationMode="hold" keyboard="lctrl" gamepad="shoulderl+thumbr_down" UILabel="" UIDescription="" />
<action name="spectate_freecam_sprint" ActivationMode="hold" keyboard="lshift" gamepad="thumbl" UILabel="" UIDescription="" />
<action name="spectate_toggle_freecam" ActivationMode="press" keyboard="z" gamepad="thumbr" UILabel="" UIDescription="" />
<action name="spectate_toggle_thirdperson" ActivationMode="tap" keyboard="f4" gamepad="shoulderl+y" joystick=" " UILabel="" UIDescription="" />
<action name="spectate_toggle_thirdperson" ActivationMode="press" keyboard="f4" gamepad="shoulderl+y" joystick=" " UILabel="" UIDescription="" />
<action name="spectate_roll_left" ActivationMode="hold" keyboard="q" gamepad="shoulderl+thumbl_left" UILabel="" UIDescription="" />
<action name="spectate_roll_right" ActivationMode="hold" keyboard="e" gamepad="shoulderl+thumbl_right" UILabel="" UIDescription="" />
</actionmap>
@ -951,6 +1001,11 @@
<action name="respawn" ActivationMode="press" keyboard="x" gamepad="x" joystick="button1" UILabel="@ui_CIRespawn" UIDescription="@ui_CIRespawnDesc" />
<action name="retry" ActivationMode="press" keyboard="x" gamepad="x" joystick="button1" />
<action name="ready" ActivationMode="press" keyboard="x" gamepad="x" joystick="button1" />
<action name="flymode" onPress="1" noModifiers="1" keyboard="f3" />
<action name="flymode_strafe_up" onHold="1" keyboard="space" />
<action name="flymode_strafe_down" onHold="1" keyboard="lctrl" />
<action name="flymode_roll_left" onHold="1" keyboard="q" />
<action name="flymode_roll_right" onHold="1" keyboard="e" />
<action name="ui_toggle_pause" onPress="1" keyboard="escape" gamepad="start" />
<action name="ui_click" onPress="1" gamepad="shoulderr" >
<keyboard >
@ -1021,6 +1076,7 @@
</action>
<action name="flashui_backspace" onPress="1" onRelease="1" keyboard="backspace" gamepad="b" joystick="button3" />
<action name="flashui_spacebar" onPress="1" onRelease="1" keyboard="space" />
<action name="flashui_tab" onPress="1" onRelease="1" keyboard="tab" gamepad="thumbl" />
<action name="flashui_kp_2" onPress="1" onRelease="1" gamepad="x" joystick="button7" />
<action name="flashui_kp_3" onPress="1" onRelease="1" gamepad="y" joystick="button4" />
@ -1062,13 +1118,9 @@
</action>
<action name="foip_pushtotalk" ActivationMode="hold" keyboard="np_add" UILabel="@ui_CIPushToTalk" UIDescription="@ui_CIPushToTalkDesc" />
<action name="foip_pushtoheadtrack" ActivationMode="press" keyboard="np_divide" UILabel="@ui_CIPushToHeadTrack" UIDescription="@ui_CIPushToHeadTrackDesc" />
<action name="foip_viewownplayer" ActivationMode="hold" keyboard="np_subtract" UILabel="@ui_CIViewSelf" UIDescription="@ui_CIViewSelfDesc" />
<action name="foip_recalibrate" ActivationMode="press" keyboard="np_multiply" UILabel="@ui_CIFOIPRecalibrate" UIDescription="@ui_CIFOIPRecalibrateDesc" />
<action name="toggle_contact" ActivationMode="press" keyboard="f11" UILabel="@ui_CIUIContactsToggle" UIDescription="@ui_CIUIContactsToggleDesc" />
<action name="toggle_chat" ActivationMode="press" keyboard="f12" UILabel="@ui_CIUIChatToggle" UIDescription="@ui_CIUIChatToggleDesc" />
<action name="focus_on_chat_textinput" ActivationMode="press" UILabel="@ui_CIUIChatFocus" UIDescription="@ui_CIUIChatFocusDesc" >
<action name="toggle_contact" ActivationMode="press" keyboard="f11" joystick=" " gamepad=" " UILabel="@ui_CIUIContactsToggle" UIDescription="@ui_CIUIContactsToggleDesc" Category="MobiGlasActions" />
<action name="toggle_chat" ActivationMode="press" keyboard="f12" joystick=" " gamepad=" " UILabel="@ui_CIUIChatToggle" UIDescription="@ui_CIUIChatToggleDesc" Category="MobiGlasActions" />
<action name="focus_on_chat_textinput" ActivationMode="press" joystick=" " gamepad=" " UILabel="@ui_CIUIChatFocus" UIDescription="@ui_CIUIChatFocusDesc" >
<keyboard >
<inputdata input="enter" />
<inputdata input="np_enter" />
@ -1132,46 +1184,57 @@
</actionmap>
<actionmap name="player_emotes" version="1" UILabel="@ui_CGEmotes" UICategory="@ui_CCFPS" >
<action name="emote_cs_forward" ActivationMode="press" keyboard="np_5" gamepad=" " joystick=" " UILabel="@ui_CIEmoteForward" UIDescription="@ui_CIEmoteForwardDesc" />
<action name="emote_cs_left" ActivationMode="press" keyboard="np_1" gamepad=" " joystick=" " UILabel="@ui_CIEmoteLeft" UIDescription="@ui_CIEmoteLeftDesc" />
<action name="emote_cs_right" ActivationMode="press" keyboard="np_3" gamepad=" " joystick=" " UILabel="@ui_CIEmoteRight" UIDescription="@ui_CIEmoteRightDesc" />
<action name="emote_cs_stop" ActivationMode="press" keyboard="np_2" gamepad=" " joystick=" " UILabel="@ui_CIEmoteStop" UIDescription="@ui_CIEmoteStopDesc" />
<action name="emote_cs_yes" ActivationMode="press" keyboard="np_4" gamepad=" " joystick=" " UILabel="@ui_CIEmoteYes" UIDescription="@ui_CIEmoteYesDesc" />
<action name="emote_cs_no" ActivationMode="press" keyboard="np_6" gamepad=" " joystick=" " UILabel="@ui_CIEmoteNo" UIDescription="@ui_CIEmoteNoDesc" />
<action name="emote_agree" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteAgree" UIDescription="@ui_CIEmoteAgreeDesc" />
<action name="emote_angry" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteAngry" UIDescription="@ui_CIEmoteAngryDesc" />
<action name="emote_atease" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteAtease" UIDescription="@ui_CIEmoteAteaseDesc" />
<action name="emote_attention" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteAttention" UIDescription="@ui_CIEmoteAttentionDesc" />
<action name="emote_blah" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteBlah" UIDescription="@ui_CIEmoteBlahDesc" />
<action name="emote_bored" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteBored" UIDescription="@ui_CIEmoteBoredDesc" />
<action name="emote_bow" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteBow" UIDescription="@ui_CIEmoteBowDesc" />
<action name="emote_burp" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteBurp" UIDescription="@ui_CIEmoteBurpDesc" />
<action name="emote_cheer" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteCheer" UIDescription="@ui_CIEmoteCheerDesc" />
<action name="emote_chicken" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteChicken" UIDescription="@ui_CIEmoteChickenDesc" />
<action name="emote_clap" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteClap" UIDescription="@ui_CIEmoteClapDesc" />
<action name="emote_come" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteCome" UIDescription="@ui_CIEmoteComeDesc" />
<action name="emote_cry" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteCry" UIDescription="@ui_CIEmoteCryDesc" />
<action name="emote_dance" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteDance" UIDescription="@ui_CIEmoteDanceDesc" />
<action name="emote_disagree" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteDisagree" UIDescription="@ui_CIEmoteDisagreeDesc" />
<action name="emote_failure" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteFailure" UIDescription="@ui_CIEmoteFailureDesc" />
<action name="emote_flex" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteFlex" UIDescription="@ui_CIEmoteFlexDesc" />
<action name="emote_flirt" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteFlirt" UIDescription="@ui_CIEmoteFlirtDesc" />
<action name="emote_gasp" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteGasp" UIDescription="@ui_CIEmoteGaspDesc" />
<action name="emote_gloat" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteGloat" UIDescription="@ui_CIEmoteGloatDesc" />
<action name="emote_greet" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteGreet" UIDescription="@ui_CIEmoteGreetDesc" />
<action name="emote_laugh" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteLaugh" UIDescription="@ui_CIEmoteLaughDesc" />
<action name="emote_launch" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteLaunch" UIDescription="@ui_CIEmoteLaunchDesc" />
<action name="emote_point" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmotePoint" UIDescription="@ui_CIEmotePointDesc" />
<action name="emote_rude" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteRude" UIDescription="@ui_CIEmoteRudeDesc" />
<action name="emote_salute" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteSalute" UIDescription="@ui_CIEmoteSaluteDesc" />
<action name="emote_sit" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteSit" UIDescription="@ui_CIEmoteSitDesc" />
<action name="emote_sleep" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteSleep" UIDescription="@ui_CIEmoteSleepDesc" />
<action name="emote_smell" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteSmell" UIDescription="@ui_CIEmoteSmellDesc" />
<action name="emote_taunt" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteTaunt" UIDescription="@ui_CIEmoteTauntDesc" />
<action name="emote_threaten" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteThreaten" UIDescription="@ui_CIEmoteThreatenDesc" />
<action name="emote_wait" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteWait" UIDescription="@ui_CIEmoteWaitDesc" />
<action name="emote_wave" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteWave" UIDescription="@ui_CIEmoteWaveDesc" />
<action name="emote_whistle" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteWhistle" UIDescription="@ui_CIEmoteWhistleDesc" />
<action name="emote_cs_forward" ActivationMode="press" keyboard="np_5" gamepad=" " joystick=" " UILabel="@ui_CIEmoteForward" UIDescription="@ui_CIEmoteForwardDesc" Category="Emotes" />
<action name="emote_cs_left" ActivationMode="press" keyboard="np_1" gamepad=" " joystick=" " UILabel="@ui_CIEmoteLeft" UIDescription="@ui_CIEmoteLeftDesc" Category="Emotes" />
<action name="emote_cs_right" ActivationMode="press" keyboard="np_3" gamepad=" " joystick=" " UILabel="@ui_CIEmoteRight" UIDescription="@ui_CIEmoteRightDesc" Category="Emotes" />
<action name="emote_cs_stop" ActivationMode="press" keyboard="np_2" gamepad=" " joystick=" " UILabel="@ui_CIEmoteStop" UIDescription="@ui_CIEmoteStopDesc" Category="Emotes" />
<action name="emote_cs_yes" ActivationMode="press" keyboard="np_4" gamepad=" " joystick=" " UILabel="@ui_CIEmoteYes" UIDescription="@ui_CIEmoteYesDesc" Category="Emotes" />
<action name="emote_cs_no" ActivationMode="press" keyboard="np_6" gamepad=" " joystick=" " UILabel="@ui_CIEmoteNo" UIDescription="@ui_CIEmoteNoDesc" Category="Emotes" />
<action name="emote_agree" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteAgree" UIDescription="@ui_CIEmoteAgreeDesc" Category="Emotes" />
<action name="emote_angry" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteAngry" UIDescription="@ui_CIEmoteAngryDesc" Category="Emotes" />
<action name="emote_atease" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteAtease" UIDescription="@ui_CIEmoteAteaseDesc" Category="Emotes" />
<action name="emote_attention" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteAttention" UIDescription="@ui_CIEmoteAttentionDesc" Category="Emotes" />
<action name="emote_blah" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteBlah" UIDescription="@ui_CIEmoteBlahDesc" Category="Emotes" />
<action name="emote_bored" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteBored" UIDescription="@ui_CIEmoteBoredDesc" Category="Emotes" />
<action name="emote_bow" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteBow" UIDescription="@ui_CIEmoteBowDesc" Category="Emotes" />
<action name="emote_burp" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteBurp" UIDescription="@ui_CIEmoteBurpDesc" Category="Emotes" />
<action name="emote_cheer" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteCheer" UIDescription="@ui_CIEmoteCheerDesc" Category="Emotes" />
<action name="emote_chicken" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteChicken" UIDescription="@ui_CIEmoteChickenDesc" Category="Emotes" />
<action name="emote_clap" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteClap" UIDescription="@ui_CIEmoteClapDesc" Category="Emotes" />
<action name="emote_come" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteCome" UIDescription="@ui_CIEmoteComeDesc" Category="Emotes" />
<action name="emote_cry" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteCry" UIDescription="@ui_CIEmoteCryDesc" Category="Emotes" />
<action name="emote_dance" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteDance" UIDescription="@ui_CIEmoteDanceDesc" Category="Emotes" />
<action name="emote_disagree" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteDisagree" UIDescription="@ui_CIEmoteDisagreeDesc" Category="Emotes" />
<action name="emote_failure" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteFailure" UIDescription="@ui_CIEmoteFailureDesc" Category="Emotes" />
<action name="emote_flex" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteFlex" UIDescription="@ui_CIEmoteFlexDesc" Category="Emotes" />
<action name="emote_flirt" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteFlirt" UIDescription="@ui_CIEmoteFlirtDesc" Category="Emotes" />
<action name="emote_gasp" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteGasp" UIDescription="@ui_CIEmoteGaspDesc" Category="Emotes" />
<action name="emote_gloat" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteGloat" UIDescription="@ui_CIEmoteGloatDesc" Category="Emotes" />
<action name="emote_greet" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteGreet" UIDescription="@ui_CIEmoteGreetDesc" Category="Emotes" />
<action name="emote_laugh" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteLaugh" UIDescription="@ui_CIEmoteLaughDesc" Category="Emotes" />
<action name="emote_launch" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteLaunch" UIDescription="@ui_CIEmoteLaunchDesc" Category="Emotes" />
<action name="emote_point" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmotePoint" UIDescription="@ui_CIEmotePointDesc" Category="Emotes" />
<action name="emote_rude" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteRude" UIDescription="@ui_CIEmoteRudeDesc" Category="Emotes" />
<action name="emote_salute" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteSalute" UIDescription="@ui_CIEmoteSaluteDesc" Category="Emotes" />
<action name="emote_sit" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteSit" UIDescription="@ui_CIEmoteSitDesc" Category="Emotes" />
<action name="emote_sleep" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteSleep" UIDescription="@ui_CIEmoteSleepDesc" Category="Emotes" />
<action name="emote_smell" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteSmell" UIDescription="@ui_CIEmoteSmellDesc" Category="Emotes" />
<action name="emote_taunt" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteTaunt" UIDescription="@ui_CIEmoteTauntDesc" Category="Emotes" />
<action name="emote_threaten" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteThreaten" UIDescription="@ui_CIEmoteThreatenDesc" Category="Emotes" />
<action name="emote_wait" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteWait" UIDescription="@ui_CIEmoteWaitDesc" Category="Emotes" />
<action name="emote_wave" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteWave" UIDescription="@ui_CIEmoteWaveDesc" Category="Emotes" />
<action name="emote_whistle" ActivationMode="press" keyboard=" " gamepad=" " joystick=" " UILabel="@ui_CIEmoteWhistle" UIDescription="@ui_CIEmoteWhistleDesc" Category="Emotes" />
</actionmap>
<actionmap name="player_input_optical_tracking" version="1" UILabel="@ui_CGOpticalTracking" UICategory="@ui_CGOpticalTracking" >
<action name="headtrack_enabled" ActivationMode="press" keyboard="np_divide" joystick=" " gamepad=" " UILabel="@ui_CIHeadTrackEnabled" UIDescription="@ui_CIHeadTrackEnabledDesc" />
<action name="headtrack_hold" ActivationMode="hold" keyboard=" " joystick=" " gamepad=" " UILabel="@ui_CIHeadTrackHold" UIDescription="@ui_CIHeadTrackHoldDesc" />
<action name="headtrack_recalibrate" ActivationMode="hold" keyboard=" " joystick=" " gamepad=" " UILabel="@ui_CIHeadTrackCalibrate" UIDescription="@ui_CIHeadTrackCalibrateDesc" />
<action name="foip_pushtotalk" ActivationMode="hold" keyboard="np_add" joystick=" " gamepad=" " UILabel="@ui_CIPushToTalk" UIDescription="@ui_CIPushToTalkDesc" />
<action name="foip_pushtotalk_proximity" ActivationMode="hold" keyboard="lalt+np_add" joystick=" " gamepad=" " UILabel="@ui_CIProximityPushToTalk" UIDescription="@ui_CIProximityPushToTalkDesc" />
<action name="foip_viewownplayer" ActivationMode="delayed_hold" keyboard="np_subtract" joystick=" " gamepad=" " UILabel="@ui_CIViewSelf" UIDescription="@ui_CIViewSelfDesc" />
<action name="foip_recalibrate" ActivationMode="press" keyboard="np_multiply" joystick=" " gamepad=" " UILabel="@ui_CIFOIPRecalibrate" UIDescription="@ui_CIFOIPRecalibrateDesc" />
<action name="foip_cyclechannel" ActivationMode="press" keyboard="np_period" joystick=" " gamepad=" " UILabel="@ui_CICycleAudioChannel" UIDescription="@ui_CICycleAudioChannelDesc" />
</actionmap>
<actionmap name="player_choice" version="1" UILabel="@ui_CGInteraction" UICategory="@ui_CGInteraction" >
@ -1188,14 +1251,15 @@
<action name="pc_screen_focus_right" ActivationMode="press" keyboard="d" gamepad="dpad_right" joystick=" " UILabel="@ui_CIMFDSnapRight" UIDescription="@ui_CIMFDSnapRightDesc" />
<action name="pc_screen_focus_up" ActivationMode="press" keyboard="w" gamepad="dpad_up" joystick=" " UILabel="@ui_CIMFDSnapUp" UIDescription="@ui_CIMFDSnapUpDesc" />
<action name="pc_screen_focus_down" ActivationMode="press" keyboard="s" gamepad="dpad_down" joystick=" " UILabel="@ui_CIMFDSnapDown" UIDescription="@ui_CIMFDSnapDownDesc" />
<action name="pc_personal_thought" ActivationMode="tap" keyboard="tab" gamepad="thumbl" joystick=" " UILabel="@ui_CIInteractionPersonal" UIDescription="@ui_CIInteractionPersonalDesc" />
<action name="pc_personal_index1" ActivationMode="press" keyboard="np_1" gamepad="x" joystick=" " />
<action name="pc_personal_index2" ActivationMode="press" keyboard="np_2" gamepad="a" joystick=" " />
<action name="pc_personal_index3" ActivationMode="press" keyboard="np_3" gamepad="b" joystick=" " />
<action name="pc_personal_index4" ActivationMode="press" keyboard="np_4" gamepad="dpad_left" joystick=" " />
<action name="pc_personal_index5" ActivationMode="press" keyboard="np_5" gamepad="dpad_down" joystick=" " />
<action name="pc_personal_index6" ActivationMode="press" keyboard="np_6" gamepad="dpad_right" joystick=" " />
<action name="pc_personal_back" ActivationMode="press" keyboard="np_0" gamepad="thumbr" joystick=" " />
<action name="pc_personal_thought" ActivationMode="press" keyboard="tab" gamepad="thumbl" joystick=" " UILabel="@ui_CIInteractionPersonal" UIDescription="@ui_CIInteractionPersonalDesc" />
<action name="pc_personal_back" ActivationMode="press" keyboard="np_0" gamepad="thumbr" joystick=" " UILabel="@ui_Exit" />
<action name="pc_pit_inventory" ActivationMode="press" keyboard="i" joystick=" " UILabel="@ui_CIInteractionPersonalInventory" >
<gamepad ActivationMode="smart_toggle" input="shoulderl+thumbl" />
</action>
<action name="pc_pit_item_unstown" ActivationMode="press" keyboard="np_2" gamepad="" joystick=" " />
<action name="pc_pit_item_drop" ActivationMode="press" keyboard="np_3" gamepad="" joystick=" " UILabel="@ui_CIDropItem" />
<action name="pc_pit_empty_backpack" ActivationMode="press" keyboard="np_4" gamepad="" joystick=" " UILabel="@ui_StoreAll" />
</actionmap>
<actionmap name="flycam" version="2" >
@ -1255,5 +1319,9 @@
<action name="view_restore_defaults" onPress="1" onRelease="1" keyboard="np_multiply" gamepad=" " joystick=" " UILabel="@ui_CIAdvanCamViewReset" UIDescription="@ui_CIAdvanCamViewResetDesc" />
</actionmap>
<actionmap name="server_renderer" version="2" UILabel="@ui_CG_SR_Mode" UICategory="@ui_CC_SR_Mode" >
<action name="v_view_cycle_fwd" ActivationMode="tap" keyboard="f4" gamepad="shoulderl+y" joystick=" " UILabel="@ui_CICycleView" UIDescription="@ui_CICycleViewDesc" />
</actionmap>
</profile>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

@ -0,0 +1,89 @@
Joystick Product GUID ????
{PIDVID-0000-0000-0000-504944564944}
SaitekFLY5 {13020738-}
SaitekFLY5 {083606A3-}
SaitekP2600RumbleForce {5F0D06A3-}
SaitekP2500RumbleForce {FF0C06A3-}
SaitekST290Pro {046006A3-}
SaitekCyborgEvoWireless {353E06A3-}
SaitekProFlightCombatRudderPedals {076406A3-}
SaitekProFlightRudderPedals {076306A3-}
SaitekProFlightPedals {076506A3-}
SaitekAV8R03 {0C2806A3-}
SaitekAV8R03 {046106A3-}
SaitekX45 {053C06A3-}
SaitekX52Pro {076206A3-}
SaitekX52 {075C06A3-}
SaitekX52 {025506A3-}
SaitekX55Joystick {22150738-}
SaitekX55Throttle {A2150738-}
SaitekX56Joystick {22210738-}
SaitekX56Throttle {A2210738-}
SaitekX65F {0B6A06A3-}
SidePanelControlDeck {22180738-}
LogitechG940Pedals {C2AA046D-}
LogitechG940Joystick {C2A8046D-}
LogitechG940Throttle {C2A9046D-}
LogitechExtreme3DPro {C215046D-}
Logitech710WirelessGamepad {C219046D-}
LogitechWingManStrikeForce3D {C285046D-}
LogitechGTWheel {C29A046D-}
ThrustMasterWarthogJoystick {0402044F-}
ThrustMasterWarthogThrottle {0404044F-}
ThrustMasterWarthogCombined {FFFF044F-}
TMwTARGET {FFFF044F-}
ThrustMasterTFlightHOTASX {B108044f-}
ThrustMasterHOTAS4 {B67C044F-}
ThrustMasterHOTAS4 {B67B044F-}
TFlightHotasOne {B68D044F-}
T16000M {B10A044F-}
T16000MTHROTTLE {B687044F-}
T-Rudder {B679044F-}
TFlightStickX {B106044F-}
CHProThrottle1 {00F1068E-}
CHProThrottle2 {C0F1068E-}
CHFighterStick {00F3068E-}
CHFighterStick {C0F3068E-}
CHFighterStick {C010068E-}
CHProPedals {C0F2068E-}
CHCombatStick {C0F4068E-}
CHCombatStick {00F4068E-}
CHThrottleQuadrant {00FA068E-}
CHProFlightThrottleQuadrant {0C2D06A3-}
CHProPedals {00F2068E-}
VPC-WarBRD-DELTA-Left {204203EB-}
VPC-WarBRD-DELTA-Right {204403EB-}
CobraM5 {560311C0-}
CobraM5 {560511C0-}
Gladiator {0121231D-}
Sabretooth {FE001689-}
Cougar {B351044F-}
Cougar {B352044F-}
BlackWidow {031707B5-}
GioteckPS3WiredController {C12125F0-}
EDTracker {80372341-}
MFGCrosswind {0A3816D0-}
MFGCrosswind {02038564-}
TrustPredator {00030E8F-}
Playstation3Controller {0268054C-}
SlawFlightControlRudder {001104D8-}
OculusTouch {02112833-}
DualShock4 {0BA0054C-}
DualShock4 {05c4054C-}
DualShock4 {09cc054C-}
XBox {02FF045E-}
XBox {02DD045E-}
XBoxElite {02E3045E-}
XterminatorDualControl {3001047D-}
SideWinderForceFeedback2 {001B045E-}
vJoy {BEAD1234-}
ArduinoLeonardo {80362341-}

Binary file not shown.

After

Width:  |  Height:  |  Size: 765 KiB

@ -0,0 +1,61 @@
{
"MapName" : "CH Combat Stick + Throttle",
"MapImage" : "chcombat.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "CH Combat Stick",
"DeviceProdGuid": ["{C0F4068E-0000-0000-0000-504944564944}",
"{00F4068E-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":1974, "Y":854, "Width":592, "Height":54, "Cmt": "Primary trigger"},
{ "Input": "button2", "Type": "Digital", "X":2984, "Y":944, "Width":832, "Height":54, "Cmt": "Thumb button"},
{ "Input": "button3", "Type": "Digital", "X":2964, "Y":654, "Width":832, "Height":54, "Cmt": "Top button"},
{ "Input": "button4", "Type": "Digital", "X":2084, "Y":1159, "Width":592, "Height":54, "Cmt": "Pinky trigger"},
{ "Input": "button5", "Type": "Digital", "X":1754, "Y":234, "Width":892, "Height":54, "Cmt": "Side trigger"},
{ "Input": "button6", "Type": "Digital", "X":1664, "Y":334, "Width":892, "Height":54, "Cmt": "Top trigger"},
{ "Input": "button7", "Type": "Digital", "X":1689, "Y":464, "Width":832, "Height":54, "Cmt": "PoV hat up"},
{ "Input": "button8", "Type": "Digital", "X":1689, "Y":520, "Width":832, "Height":54, "Cmt": "PoV hat right"},
{ "Input": "button9", "Type": "Digital", "X":1689, "Y":576, "Width":832, "Height":54, "Cmt": "PoV hat down"},
{ "Input": "button10", "Type": "Digital", "X":1689, "Y":632, "Width":832, "Height":54, "Cmt": "PoV hat left"},
{ "Input": "hat1_up", "Type": "Digital", "X":2964, "Y":212, "Width":832, "Height":54, "Cmt": "Right hat up"},
{ "Input": "hat1_right", "Type": "Digital", "X":2964, "Y":268, "Width":832, "Height":54, "Cmt": "Right hat right"},
{ "Input": "hat1_down", "Type": "Digital", "X":2964, "Y":324, "Width":832, "Height":54, "Cmt": "Right hat down"},
{ "Input": "hat1_left", "Type": "Digital", "X":2964, "Y":380, "Width":832, "Height":54, "Cmt": "Right hat left"},
{ "Input": "x", "Type": "Analogue", "X":3124, "Y":1168, "Width":692, "Height":54, "Cmt": "Stick X axis"},
{ "Input": "y", "Type": "Analogue", "X":3124, "Y":1112, "Width":692, "Height":54, "Cmt": "Stick Y axis"},
{ "Input": "z", "Type": "Analogue", "X":2254, "Y":1894, "Width":692, "Height":54, "Cmt": "Wheel on left of base"}
]
},
{
"InputType": "J",
"DeviceName": "CH Pro Throttle 1",
"DeviceProdGuid": ["{00F1068E-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":1114, "Y":966, "Width":832, "Height":54, "Cmt": "Castle hat right"},
{ "Input": "button2", "Type": "Digital", "X":1114, "Y":1022, "Width":832, "Height":54, "Cmt": "Castle hat down"},
{ "Input": "button3", "Type": "Digital", "X":1114, "Y":1078, "Width":832, "Height":54, "Cmt": "Castle hat left"},
{ "Input": "button4", "Type": "Digital", "X":1114, "Y":910, "Width":832, "Height":54, "Cmt": "Castle hat up"},
{ "Input": "button5", "Type": "Digital", "X":1189, "Y":1696, "Width":1032, "Height":54, "Cmt": "Bottom hat right"},
{ "Input": "button6", "Type": "Digital", "X":1189, "Y":1752, "Width":1032, "Height":54, "Cmt": "Bottom hat down"},
{ "Input": "button7", "Type": "Digital", "X":1189, "Y":1808, "Width":1032, "Height":54, "Cmt": "Bottom hat left"},
{ "Input": "button8", "Type": "Digital", "X":1189, "Y":1640, "Width":1032, "Height":54, "Cmt": "Bottom hat up"},
{ "Input": "button9", "Type": "Digital", "X":1198, "Y":1275, "Width":832, "Height":54, "Cmt": "Rear hat down"},
{ "Input": "button10", "Type": "Digital", "X":1198, "Y":1219, "Width":832, "Height":54, "Cmt": "Rear hat right"},
{ "Input": "button11", "Type": "Digital", "X":1198, "Y":1163, "Width":832, "Height":54, "Cmt": "Rear hat up"},
{ "Input": "button12", "Type": "Digital", "X":1198, "Y":1331, "Width":832, "Height":54, "Cmt": "Rear hat left"},
{ "Input": "button13", "Type": "Digital", "X":1261, "Y":1549, "Width":932, "Height":54, "Cmt": "Mouse button"},
{ "Input": "button14", "Type": "Digital", "X":1042, "Y":814, "Width":892, "Height":54, "Cmt": "Right back"},
{ "Input": "button15", "Type": "Digital", "X":904, "Y":724, "Width":892, "Height":54, "Cmt": "Middle back"},
{ "Input": "button16", "Type": "Digital", "X":684, "Y":634, "Width":892, "Height":54, "Cmt": "Left back"},
{ "Input": "hat1_up", "Type": "Digital", "X":132, "Y":1896, "Width":932, "Height":54, "Cmt": "PoV hat up (looks like witch hat)"},
{ "Input": "hat1_right", "Type": "Digital", "X":132, "Y":1952, "Width":932, "Height":54, "Cmt": "PoV hat right (looks like witch hat)"},
{ "Input": "hat1_down", "Type": "Digital", "X":132, "Y":2008, "Width":932, "Height":54, "Cmt": "PoV hat down (looks like witch hat)"},
{ "Input": "hat1_left", "Type": "Digital", "X":132, "Y":1840, "Width":932, "Height":54, "Cmt": "PoV hat left (looks like witch hat)"},
{ "Input": "x", "Type": "Analogue", "X":1261, "Y":1493, "Width":932, "Height":54, "Cmt": "Mouse X axis"},
{ "Input": "y", "Type": "Analogue", "X":1261, "Y":1437, "Width":932, "Height":54, "Cmt": "Mouse Y axis"},
{ "Input": "z", "Type": "Analogue", "X":80, "Y":714, "Width":692, "Height":54, "Cmt": "Throttle"}
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 865 KiB

@ -0,0 +1,69 @@
{
"MapName" : "CH Fighter Stick + Throttle",
"MapImage" : "chfighter.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "CH Fighter Stick",
"DeviceProdGuid": ["{00F3068E-0000-0000-0000-504944564944}",
"{C0F3068E-0000-0000-0000-504944564944}",
"{C010068E-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input" : "button1" , "Type" : "Digital" , "X" : 1974 , "Y" : 854 , "Width" : 592 , "Height" : 54 , "Cmt" : "Primary trigger" },
{ "Input" : "button2" , "Type" : "Digital" , "X" : 1664 , "Y" : 334 , "Width" : 892 , "Height" : 54 , "Cmt" : "Top trigger" },
{ "Input" : "button3" , "Type" : "Digital" , "X" : 1754 , "Y" : 234 , "Width" : 892 , "Height" : 54 , "Cmt" : "Side trigger" },
{ "Input" : "button4" , "Type" : "Digital" , "X" : 2084 , "Y" : 1159 , "Width" : 592 , "Height" : 54 , "Cmt" : "Pinky trigger" },
{ "Input" : "button5" , "Type" : "Digital" , "X" : 1689 , "Y" : 464 , "Width" : 832 , "Height" : 54 , "Cmt" : "Left hat up" },
{ "Input" : "button6" , "Type" : "Digital" , "X" : 1689 , "Y" : 520 , "Width" : 832 , "Height" : 54 , "Cmt" : "Left hat right" },
{ "Input" : "button7" , "Type" : "Digital" , "X" : 1689 , "Y" : 576 , "Width" : 832 , "Height" : 54 , "Cmt" : "Left hat down" },
{ "Input" : "button8" , "Type" : "Digital" , "X" : 1689 , "Y" : 632 , "Width" : 832 , "Height" : 54 , "Cmt" : "Left hat left" },
{ "Input" : "button9" , "Type" : "Digital" , "X" : 2994 , "Y" : 494 , "Width" : 832 , "Height" : 54 , "Cmt" : "Castle hat up" },
{ "Input" : "button10" , "Type" : "Digital" , "X" : 2994 , "Y" : 550 , "Width" : 832 , "Height" : 54 , "Cmt" : "Castle hat right" },
{ "Input" : "button11" , "Type" : "Digital" , "X" : 2994 , "Y" : 606 , "Width" : 832 , "Height" : 54 , "Cmt" : "Castle hat down" },
{ "Input" : "button12" , "Type" : "Digital" , "X" : 2994 , "Y" : 662 , "Width" : 832 , "Height" : 54 , "Cmt" : "Castle hat left" },
{ "Input" : "button13" , "Type" : "Digital" , "X" : 3058 , "Y" : 810 , "Width" : 772 , "Height" : 54 , "Cmt" : "Thumb hat up" },
{ "Input" : "button14" , "Type" : "Digital" , "X" : 3058 , "Y" : 866 , "Width" : 772 , "Height" : 54 , "Cmt" : "Thumb hat right" },
{ "Input" : "button15" , "Type" : "Digital" , "X" : 3058 , "Y" : 922 , "Width" : 772 , "Height" : 54 , "Cmt" : "Thumb hat down" },
{ "Input" : "button16" , "Type" : "Digital" , "X" : 3058 , "Y" : 978 , "Width" : 772 , "Height" : 54 , "Cmt" : "Thumb hat left" },
{ "Input" : "hat1_up" , "Type" : "Digital" , "X" : 2964 , "Y" : 212 , "Width" : 832 , "Height" : 54 , "Cmt" : "POV hat up (looks like witch hat)" },
{ "Input" : "hat1_right" , "Type" : "Digital" , "X" : 2964 , "Y" : 268 , "Width" : 832 , "Height" : 54 , "Cmt" : "POV hat right (looks like witch hat)" },
{ "Input" : "hat1_down" , "Type" : "Digital" , "X" : 2964 , "Y" : 324 , "Width" : 832 , "Height" : 54 , "Cmt" : "POV hat down (looks like witch hat)" },
{ "Input" : "hat1_left" , "Type" : "Digital" , "X" : 2964 , "Y" : 380 , "Width" : 832 , "Height" : 54 , "Cmt" : "POV hat left (looks like witch hat)" },
{ "Input" : "x" , "Type" : "Analogue" , "X" : 3124 , "Y" : 1112 , "Width" : 692 , "Height" : 54 , "Cmt" : "Stick X axis" },
{ "Input" : "y" , "Type" : "Analogue" , "X" : 3124 , "Y" : 1168 , "Width" : 692 , "Height" : 54 , "Cmt" : "Stick Y axis" },
{ "Input" : "z" , "Type" : "Analogue" , "X" : 2254 , "Y" : 1894 , "Width" : 692 , "Height" : 54 , "Cmt" : "Wheel on left of base" }
]
},
{
"InputType": "J",
"DeviceName": "CH Pro Throttle 1",
"DeviceProdGuid": ["{00F1068E-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":1114, "Y":966, "Width":832, "Height":54, "Cmt": "Castle hat right"},
{ "Input": "button2", "Type": "Digital", "X":1114, "Y":1022, "Width":832, "Height":54, "Cmt": "Castle hat down"},
{ "Input": "button3", "Type": "Digital", "X":1114, "Y":1078, "Width":832, "Height":54, "Cmt": "Castle hat left"},
{ "Input": "button4", "Type": "Digital", "X":1114, "Y":910, "Width":832, "Height":54, "Cmt": "Castle hat up"},
{ "Input": "button5", "Type": "Digital", "X":1189, "Y":1696, "Width":1032, "Height":54, "Cmt": "Bottom hat right"},
{ "Input": "button6", "Type": "Digital", "X":1189, "Y":1752, "Width":1032, "Height":54, "Cmt": "Bottom hat down"},
{ "Input": "button7", "Type": "Digital", "X":1189, "Y":1808, "Width":1032, "Height":54, "Cmt": "Bottom hat left"},
{ "Input": "button8", "Type": "Digital", "X":1189, "Y":1640, "Width":1032, "Height":54, "Cmt": "Bottom hat up"},
{ "Input": "button9", "Type": "Digital", "X":1198, "Y":1275, "Width":832, "Height":54, "Cmt": "Rear hat down"},
{ "Input": "button10", "Type": "Digital", "X":1198, "Y":1219, "Width":832, "Height":54, "Cmt": "Rear hat right"},
{ "Input": "button11", "Type": "Digital", "X":1198, "Y":1163, "Width":832, "Height":54, "Cmt": "Rear hat up"},
{ "Input": "button12", "Type": "Digital", "X":1198, "Y":1331, "Width":832, "Height":54, "Cmt": "Rear hat left"},
{ "Input": "button13", "Type": "Digital", "X":1261, "Y":1549, "Width":932, "Height":54, "Cmt": "Mouse button"},
{ "Input": "button14", "Type": "Digital", "X":1042, "Y":814, "Width":892, "Height":54, "Cmt": "Right back"},
{ "Input": "button15", "Type": "Digital", "X":904, "Y":724, "Width":892, "Height":54, "Cmt": "Middle back"},
{ "Input": "button16", "Type": "Digital", "X":684, "Y":634, "Width":892, "Height":54, "Cmt": "Left back"},
{ "Input": "hat1_up", "Type": "Digital", "X":132, "Y":1896, "Width":932, "Height":54, "Cmt": "PoV hat up (looks like witch hat)"},
{ "Input": "hat1_right", "Type": "Digital", "X":132, "Y":1952, "Width":932, "Height":54, "Cmt": "PoV hat right (looks like witch hat)"},
{ "Input": "hat1_down", "Type": "Digital", "X":132, "Y":2008, "Width":932, "Height":54, "Cmt": "PoV hat down (looks like witch hat)"},
{ "Input": "hat1_left", "Type": "Digital", "X":132, "Y":1840, "Width":932, "Height":54, "Cmt": "PoV hat left (looks like witch hat)"},
{ "Input": "x", "Type": "Analogue", "X":1261, "Y":1493, "Width":932, "Height":54, "Cmt": "Mouse X axis"},
{ "Input": "y", "Type": "Analogue", "X":1261, "Y":1437, "Width":932, "Height":54, "Cmt": "Mouse Y axis"},
{ "Input": "z", "Type": "Analogue", "X":80, "Y":714, "Width":692, "Height":54, "Cmt": "Throttle"}
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 KiB

@ -0,0 +1,22 @@
{
"MapName" : "CH Pro Flight Throttle Quadrant",
"MapImage" : "chproflightquadrant.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "CH Pro Flight Throttle Quadrant",
"DeviceProdGuid": ["{0C2D06A3-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":354, "Y":1484, "Width":932, "Height":54, "Cmt": "Switch 1 up"},
{ "Input": "button2", "Type": "Digital", "X":354, "Y":1540, "Width":932, "Height":54, "Cmt": "Switch 1 down"},
{ "Input": "button3", "Type": "Digital", "X":1474, "Y":1754, "Width":932, "Height":54, "Cmt": "Switch 2 up"},
{ "Input": "button4", "Type": "Digital", "X":1474, "Y":1810, "Width":932, "Height":54, "Cmt": "Switch 2 down"},
{ "Input": "button5", "Type": "Digital", "X":2614, "Y":1484, "Width":932, "Height":54, "Cmt": "Switch 3 up"},
{ "Input": "button6", "Type": "Digital", "X":2614, "Y":1540, "Width":932, "Height":54, "Cmt": "Switch 3 down"},
{ "Input": "x", "Type": "Analogue", "X":554, "Y":564, "Width":932, "Height":54, "Cmt": "Throttle 1"},
{ "Input": "y", "Type": "Analogue", "X":1474, "Y":324, "Width":932, "Height":54, "Cmt": "Throttle 2"},
{ "Input": "z", "Type": "Analogue", "X":2414, "Y":564, "Width":932, "Height":54, "Cmt": "Throttle 3"}
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 609 KiB

@ -0,0 +1,44 @@
{
"MapName" : "Defender Cobra M5",
"MapImage" : "cobram5.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "Defender Cobra M5",
"DeviceProdGuid": ["{560311C0-0000-0000-0000-504944564944}",
"{560511C0-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":64, "Y":1273, "Width":1392, "Height":54, "Cmt": "Primary trigger"},
{ "Input": "button2", "Type": "Digital", "X":2264, "Y":922, "Width":1392, "Height":54, "Cmt": "Secondary trigger"},
{ "Input": "button3", "Type": "Digital", "X":124, "Y":1124, "Width":1332, "Height":54, "Cmt": "NAV left red button"},
{ "Input": "button4", "Type": "Digital", "X":2324, "Y":734, "Width":1332, "Height":54, "Cmt": "NAV right red button"},
{ "Input": "button5", "Type": "Digital", "X":184, "Y":722, "Width":1272, "Height":54, "Cmt": "NAV witch hat left"},
{ "Input": "button6", "Type": "Digital", "X":184, "Y":554, "Width":1272, "Height":54, "Cmt": "NAV witch hat up"},
{ "Input": "button7", "Type": "Digital", "X":184, "Y":610, "Width":1272, "Height":54, "Cmt": "NAV witch hat right"},
{ "Input": "button8", "Type": "Digital", "X":184, "Y":666, "Width":1272, "Height":54, "Cmt": "NAV witch hat down"},
{ "Input": "button9", "Type": "Digital", "X":124, "Y":1414, "Width":1332, "Height":54, "Cmt": "NAV pinky trigger"},
{ "Input": "button10", "Type": "Digital", "X":124, "Y":1064, "Width":1332, "Height":54, "Cmt": "BVR left red button"},
{ "Input": "button11", "Type": "Digital", "X":2324, "Y":674, "Width":1332, "Height":54, "Cmt": "BVR right red button"},
{ "Input": "button12", "Type": "Digital", "X":184, "Y":492, "Width":1272, "Height":54, "Cmt": "BVR witch hat left"},
{ "Input": "button13", "Type": "Digital", "X":184, "Y":324, "Width":1272, "Height":54, "Cmt": "BVR witch hat up"},
{ "Input": "button14", "Type": "Digital", "X":184, "Y":380, "Width":1272, "Height":54, "Cmt": "BVR witch hat right"},
{ "Input": "button15", "Type": "Digital", "X":184, "Y":436, "Width":1272, "Height":54, "Cmt": "BVR witch hat down"},
{ "Input": "button16", "Type": "Digital", "X":124, "Y":1354, "Width":1332, "Height":54, "Cmt": "BVR pinky trigger"},
{ "Input": "button17", "Type": "Digital", "X":124, "Y":1184, "Width":1332, "Height":54, "Cmt": "VIS left red button"},
{ "Input": "button18", "Type": "Digital", "X":2324, "Y":794, "Width":1332, "Height":54, "Cmt": "VIS right red button"},
{ "Input": "button19", "Type": "Digital", "X":184, "Y":952, "Width":1272, "Height":54, "Cmt": "VIS witch hat left"},
{ "Input": "button20", "Type": "Digital", "X":184, "Y":784, "Width":1272, "Height":54, "Cmt": "VIS witch hat up"},
{ "Input": "button21", "Type": "Digital", "X":184, "Y":840, "Width":1272, "Height":54, "Cmt": "VIS witch hat right"},
{ "Input": "button22", "Type": "Digital", "X":184, "Y":896, "Width":1272, "Height":54, "Cmt": "VIS witch hat down"},
{ "Input": "button23", "Type": "Digital", "X":124, "Y":1474, "Width":1332, "Height":54, "Cmt": "VIS pinky trigger"},
{ "Input": "hat1_up", "Type": "Digital", "X":1864, "Y":324, "Width":1932, "Height":54, "Cmt": "PoV up"},
{ "Input": "hat1_right", "Type": "Digital", "X":1864, "Y":380, "Width":1932, "Height":54, "Cmt": "PoV right"},
{ "Input": "hat1_down", "Type": "Digital", "X":1864, "Y":436, "Width":1932, "Height":54, "Cmt": "PoV down"},
{ "Input": "hat1_left", "Type": "Digital", "X":1864, "Y":492, "Width":1932, "Height":54, "Cmt": "PoV left"},
{ "Input": "x", "Type": "Analogue", "X":2324, "Y":1080, "Width":1332, "Height":54, "Cmt": ""},
{ "Input": "y", "Type": "Analogue", "X":2324, "Y":1024, "Width":1332, "Height":54, "Cmt": ""},
{ "Input": "rotz", "Type": "Analogue", "X":2324, "Y":1136, "Width":1332, "Height":54, "Cmt": ""}
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 540 KiB

@ -0,0 +1,33 @@
{
"MapName" : "Logitech Extreme 3DPro",
"MapImage" : "extreme3dpro.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "Logitech Extreme 3DPro",
"DeviceProdGuid": ["{C215046D-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":474, "Y":904, "Width":1092, "Height":54, "Cmt": "Primary trigger" },
{ "Input": "button2", "Type": "Digital", "X":474, "Y":1004, "Width":1092, "Height":54, "Cmt": "Side trigger" },
{ "Input": "button3", "Type": "Digital", "X":424, "Y":784, "Width":1092, "Height":54, "Cmt": "Bottom-left button" },
{ "Input": "button4", "Type": "Digital", "X":2124, "Y":784, "Width":1092, "Height":54, "Cmt": "Bottom-right button" },
{ "Input": "button5", "Type": "Digital", "X":424, "Y":654, "Width":1092, "Height":54, "Cmt": "Top-left button" },
{ "Input": "button6", "Type": "Digital", "X":2124, "Y":654, "Width":1092, "Height":54, "Cmt": "Top-right button" },
{ "Input": "button7", "Type": "Digital", "X":244, "Y":1434, "Width":542, "Height":108, "Cmt": "Left bank top-left button" },
{ "Input": "button8", "Type": "Digital", "X":794, "Y":1434, "Width":542, "Height":108, "Cmt": "Left bank top-right button" },
{ "Input": "button9", "Type": "Digital", "X":244, "Y":1550, "Width":542, "Height":108, "Cmt": "Left bank middle-left button" },
{ "Input": "button10", "Type": "Digital", "X":794, "Y":1550, "Width":542, "Height":108, "Cmt": "Left bank middle-right button" },
{ "Input": "button11", "Type": "Digital", "X":244, "Y":1666, "Width":542, "Height":108, "Cmt": "Left bank bottom-left button" },
{ "Input": "button12", "Type": "Digital", "X":794, "Y":1666, "Width":542, "Height":108, "Cmt": "Left bank bottom-right button" },
{ "Input": "hat1_up", "Type": "Digital", "X":864, "Y":374, "Width":1932, "Height":54, "Cmt": "PoV hat up" },
{ "Input": "hat1_right", "Type": "Digital", "X":864, "Y":430, "Width":1932, "Height":54, "Cmt": "PoV hat right" },
{ "Input": "hat1_down", "Type": "Digital", "X":864, "Y":486, "Width":1932, "Height":54, "Cmt": "PoV hat down" },
{ "Input": "hat1_left", "Type": "Digital", "X":864, "Y":542, "Width":1932, "Height":54, "Cmt": "PoV hat left" },
{ "Input": "rotz", "Type": "Analogue", "X":2357, "Y":980, "Width":1132, "Height":54, "Cmt": "Stick twist" },
{ "Input": "slider1", "Type": "Analogue", "X":2864, "Y":1574, "Width":832, "Height":54, "Cmt": "Stick throttle slider" },
{ "Input": "x", "Type": "Analogue", "X":2357, "Y":924, "Width":1132, "Height":54, "Cmt": "Stick pitch" },
{ "Input": "y", "Type": "Analogue", "X":2357, "Y":868, "Width":1132, "Height":54, "Cmt": "Stick roll" }
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 572 KiB

@ -0,0 +1,36 @@
{
"MapName" : "Cyborg F.L.Y. 5",
"MapImage" : "fly5.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "SaitekFLY5",
"DeviceProdGuid": ["{13020738-0000-0000-0000-504944564944}",
"{083606A3-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":684, "Y":794, "Width":1092, "Height":54, "Cmt": "Primary trigger" },
{ "Input": "button2", "Type": "Digital", "X":734, "Y":874, "Width":1092, "Height":54, "Cmt": "Bottom-left button" },
{ "Input": "button3", "Type": "Digital", "X":2414, "Y":744, "Width":1092, "Height":54, "Cmt": "Bottom-right button" },
{ "Input": "button4", "Type": "Digital", "X":624, "Y":704, "Width":1092, "Height":54, "Cmt": "Top-left button" },
{ "Input": "button5", "Type": "Digital", "X":2414, "Y":594, "Width":1092, "Height":54, "Cmt": "Top-right button" },
{ "Input": "button6", "Type": "Digital", "X":584, "Y":1847, "Width":1092, "Height":54, "Cmt": "Bottom bank first button" },
{ "Input": "button7", "Type": "Digital", "X":734, "Y":1927, "Width":1092, "Height":54, "Cmt": "Bottom bank second button" },
{ "Input": "button8", "Type": "Digital", "X":884, "Y":2007, "Width":1092, "Height":54, "Cmt": "Bottom bank third button" },
{ "Input": "button9", "Type": "Digital", "X":1034, "Y":2090, "Width":1092, "Height":54, "Cmt": "Bottom bank fourth button" },
{ "Input": "button10", "Type": "Digital", "X":304, "Y":1604, "Width":1092, "Height":54, "Cmt": "Rear left button" },
{ "Input": "button11", "Type": "Digital", "X":664, "Y":1204, "Width":1092, "Height":54, "Cmt": "Rear right button" },
{ "Input": "button12", "Type": "Digital", "X":2474, "Y":864, "Width":1132, "Height":54, "Cmt": "Scroll wheel up" },
{ "Input": "button13", "Type": "Digital", "X":2474, "Y":920, "Width":1132, "Height":54, "Cmt": "Scroll wheel down" },
{ "Input": "button14", "Type": "Digital", "X":2594, "Y":1504, "Width":1092, "Height":54, "Cmt": "Base button" },
{ "Input": "hat1_up", "Type": "Digital", "X":990, "Y":304, "Width":1932, "Height":54, "Cmt": "PoV hat up" },
{ "Input": "hat1_right", "Type": "Digital", "X":990, "Y":360, "Width":1932, "Height":54, "Cmt": "PoV hat right" },
{ "Input": "hat1_down", "Type": "Digital", "X":990, "Y":416, "Width":1932, "Height":54, "Cmt": "PoV hat down" },
{ "Input": "hat1_left", "Type": "Digital", "X":990, "Y":472, "Width":1932, "Height":54, "Cmt": "PoV hat left" },
{ "Input": "rotz", "Type": "Analogue", "X":2484, "Y":1136, "Width":1132, "Height":54, "Cmt": "Stick twist" },
{ "Input": "x", "Type": "Analogue", "X":2484, "Y":1080, "Width":1132, "Height":54, "Cmt": "Stick roll" },
{ "Input": "y", "Type": "Analogue", "X":2484, "Y":1024, "Width":1132, "Height":54, "Cmt": "Stick pitch" },
{ "Input": "z", "Type": "Analogue", "X":264, "Y":1404, "Width":1032, "Height":54, "Cmt": "Throttle" }
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 724 KiB

@ -0,0 +1,41 @@
{
"MapName" : "Logitec G940 Stick + Throttle",
"MapImage" : "g940.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "Logitec G940 Stick",
"DeviceProdGuid": ["{C2A8046D-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":2034, "Y":604, "Width":652, "Height":54, "Cmt": "Primary trigger half-press"},
{ "Input": "button2", "Type": "Digital", "X":2044, "Y":424, "Width":642, "Height":108, "Cmt": "Fire button"},
{ "Input": "button3", "Type": "Digital", "X":2124, "Y":234, "Width":642, "Height":108, "Cmt": "S1 button"},
{ "Input": "button4", "Type": "Digital", "X":3064, "Y":496, "Width":752, "Height":54, "Cmt": "S2 button"},
{ "Input": "button5", "Type": "Digital", "X":3064, "Y":584, "Width":752, "Height":54, "Cmt": "S3 button"},
{ "Input": "button6", "Type": "Digital", "X":2044, "Y":764, "Width":642, "Height":108, "Cmt": "S4 button"},
{ "Input": "button7", "Type": "Digital", "X":2044, "Y":1018, "Width":642, "Height":108, "Cmt": "S5 button"},
{ "Input": "button8", "Type": "Digital", "X":2954, "Y":386, "Width":832, "Height":54, "Cmt": "Ministick button"},
{ "Input": "slider2", "Type": "Analogue", "X":2954, "Y":330, "Width":832, "Height":54, "Cmt": "Ministick X"},
{ "Input": "slider1", "Type": "Analogue", "X":2954, "Y":274, "Width":832, "Height":54, "Cmt": "Ministick Y"},
{ "Input": "button9", "Type": "Digital", "X":2034, "Y":660, "Width":652, "Height":54, "Cmt": "Primary trigger full-press"},
{ "Input": "hat1_up", "Type": "Digital", "X":3124, "Y":694, "Width":692, "Height":54, "Cmt": "POV hat up"},
{ "Input": "hat1_right", "Type": "Digital", "X":3124, "Y":750, "Width":692, "Height":54, "Cmt": "POV hat right"},
{ "Input": "hat1_down", "Type": "Digital", "X":3124, "Y":806, "Width":692, "Height":54, "Cmt": "POV hat down"},
{ "Input": "hat1_left", "Type": "Digital", "X":3124, "Y":862, "Width":692, "Height":54, "Cmt": "POV hat left"},
{ "Input": "x", "Type": "Analogue", "X":3144, "Y":1060, "Width":672, "Height":54, "Cmt": "Stick X axis"},
{ "Input": "y", "Type": "Analogue", "X":3144, "Y":1004, "Width":672, "Height":54, "Cmt": "Stick Y axis"},
{ "Input": "rotx", "Type": "Analogue", "X":3084, "Y":1824, "Width":592, "Height":54, "Cmt": "Trim 2"},
{ "Input": "roty", "Type": "Analogue", "X":3224, "Y":1744, "Width":592, "Height":54, "Cmt": "Trim 3"},
{ "Input": "rotz", "Type": "Analogue", "X":2934, "Y":1904, "Width":592, "Height":54, "Cmt": "Trim 1"}
]
},
{
"InputType": "J",
"DeviceName": "Logitec G940 Throttle",
"DeviceProdGuid": ["{C2A9046D-0000-0000-0000-504944564944}"],
"Controls": [
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 506 KiB

@ -0,0 +1,16 @@
{
"MapName" : "Logitec G940 Pedals",
"MapImage" : "g940pedals.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "Logitec G940 Pedals",
"DeviceProdGuid": ["{C2AA046D-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "x", "Type": "Digital", "X":2264, "Y":588, "Width":1332, "Height":162, "Cmt": "Right pedal (unconfirmed)"},
{ "Input": "y", "Type": "Digital", "X":164, "Y":588, "Width":1332, "Height":162, "Cmt": "Left pedal (unconfirmed)"},
{ "Input": "rotx", "Type": "Analogue", "X":1208, "Y":331, "Width":1332, "Height":162, "Cmt": "Rudder"}
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 646 KiB

@ -0,0 +1,54 @@
{
"MapName" : "VKB Gladiator",
"MapImage" : "gladiator.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "VKB Gladiator",
"DeviceProdGuid": ["{0121231D-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":204, "Y":1524, "Width":992, "Height":54, "Cmt": "Flaps up"},
{ "Input": "button2", "Type": "Digital", "X":254, "Y":1624, "Width":992, "Height":54, "Cmt": "Flaps down"},
{ "Input": "button3", "Type": "Digital", "X":784, "Y":1904, "Width":992, "Height":54, "Cmt": "A1"},
{ "Input": "button4", "Type": "Digital", "X":2524, "Y":1514, "Width":992, "Height":54, "Cmt": "A2"},
{ "Input": "button5", "Type": "Digital", "X":2464, "Y":1424, "Width":992, "Height":54, "Cmt": "A3"},
{ "Input": "button6", "Type": "Digital", "X":1144, "Y":1994, "Width":992, "Height":54, "Cmt": "B1"},
{ "Input": "button7", "Type": "Digital", "X":2484, "Y":1814, "Width":992, "Height":54, "Cmt": "B2"},
{ "Input": "button8", "Type": "Digital", "X":2564, "Y":1604, "Width":992, "Height":54, "Cmt": "B3"},
{ "Input": "button9", "Type": "Digital", "X":2244, "Y":1994, "Width":992, "Height":54, "Cmt": "C1"},
{ "Input": "button10", "Type": "Digital", "X":2414, "Y":1904, "Width":992, "Height":54, "Cmt": "C2"},
{ "Input": "button11", "Type": "Digital", "X":2624, "Y":1694, "Width":992, "Height":54, "Cmt": "C3"},
{ "Input": "button12", "Type": "Digital", "X":2274, "Y":1254, "Width":1192, "Height":54, "Cmt": "Engine start"},
{ "Input": "button13", "Type": "Digital", "X":2204, "Y":1114, "Width":1192, "Height":54, "Cmt": "Eject"},
{ "Input": "button14", "Type": "Digital", "X":2184, "Y":584, "Width":1472, "Height":54, "Cmt": "Primary trigger (mode 1"},
{ "Input": "button15", "Type": "Digital", "X":2184, "Y":640, "Width":1472, "Height":56, "Cmt": "Primary trigger (mode 1"},
{ "Input": "button16", "Type": "Digital", "X":2184, "Y":704, "Width":1472, "Height":54, "Cmt": "Primary trigger (mode 2"},
{ "Input": "button17", "Type": "Digital", "X":2184, "Y":760, "Width":1472, "Height":56, "Cmt": "Primary trigger (mode 2"},
{ "Input": "button18", "Type": "Digital", "X":2124, "Y":304, "Width":1472, "Height":54, "Cmt": "Thumb trigger (mode 1"},
{ "Input": "button19", "Type": "Digital", "X":2124, "Y":360, "Width":1472, "Height":56, "Cmt": "Thumb trigger (mode 1"},
{ "Input": "button20", "Type": "Digital", "X":2124, "Y":424, "Width":1472, "Height":54, "Cmt": "Thumb trigger (mode 2"},
{ "Input": "button21", "Type": "Digital", "X":2124, "Y":480, "Width":1472, "Height":56, "Cmt": "Thumb trigger (mode 2"},
{ "Input": "hat1_up", "Type": "Digital", "X":274, "Y":304, "Width":1112, "Height":54, "Cmt": "POV hat up (mode 1"},
{ "Input": "button22", "Type": "Digital", "X":274, "Y":360, "Width":1112, "Height":54, "Cmt": "POV hat up (mode 1"},
{ "Input": "hat1_down", "Type": "Digital", "X":274, "Y":526, "Width":1112, "Height":52, "Cmt": "POV hat down (mode 1"},
{ "Input": "button23", "Type": "Digital", "X":274, "Y":580, "Width":1112, "Height":54, "Cmt": "POV hat down (mode 1"},
{ "Input": "hat1_left", "Type": "Digital", "X":274, "Y":636, "Width":1112, "Height":52, "Cmt": "POV hat left (mode 1"},
{ "Input": "button24", "Type": "Digital", "X":274, "Y":690, "Width":1112, "Height":66, "Cmt": "POV hat left (mode 1"},
{ "Input": "hat1_right", "Type": "Digital", "X":274, "Y":416, "Width":1112, "Height":52, "Cmt": "POV hat right (mode 1"},
{ "Input": "button25", "Type": "Digital", "X":274, "Y":470, "Width":1112, "Height":54, "Cmt": "POV hat right (mode 1"},
{ "Input": "hat2_up", "Type": "Digital", "X":274, "Y":764, "Width":1112, "Height":54, "Cmt": "POV hat up (mode 2"},
{ "Input": "button26", "Type": "Digital", "X":274, "Y":820, "Width":1112, "Height":54, "Cmt": "POV hat up (mode 2"},
{ "Input": "hat2_down", "Type": "Digital", "X":274, "Y":986, "Width":1112, "Height":52, "Cmt": "POV hat down (mode 2"},
{ "Input": "button27", "Type": "Digital", "X":274, "Y":1040, "Width":1112, "Height":54, "Cmt": "POV hat down (mode 2"},
{ "Input": "hat2_left", "Type": "Digital", "X":274, "Y":1096, "Width":1112, "Height":52, "Cmt": "POV hat left (mode 2"},
{ "Input": "button28", "Type": "Digital", "X":274, "Y":1150, "Width":1112, "Height":66, "Cmt": "POV hat left (mode 2"},
{ "Input": "hat2_right", "Type": "Digital", "X":274, "Y":876, "Width":1112, "Height":52, "Cmt": "POV hat right (mode 2"},
{ "Input": "button29", "Type": "Digital", "X":274, "Y":930, "Width":1112, "Height":54, "Cmt": "POV hat right (mode 2"},
{ "Input": "x", "Type": "Analogue", "X":2164, "Y":910, "Width":1532, "Height":54, "Cmt": "Roll"},
{ "Input": "y", "Type": "Analogue", "X":2164, "Y":854, "Width":1532, "Height":54, "Cmt": "Pitch"},
{ "Input": "rotx", "Type": "Analogue", "X":2164, "Y":966, "Width":1532, "Height":54, "Cmt": "Yaw"},
{ "Input": "z", "Type": "Analogue", "X":564, "Y":1402, "Width":832, "Height":54, "Cmt": "Throttle"}
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 725 KiB

@ -0,0 +1,35 @@
{
"MapName" : "ThrustMaster HOTAS 4",
"MapImage" : "hotas4.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "ThrustMaster HOTAS 4",
"DeviceProdGuid": ["{B67C044F-0000-0000-0000-504944564944}",
"{B67B044F-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":1394, "Y":614, "Width":1082, "Height":54, "Cmt": "Stick primary trigger"},
{ "Input": "button2", "Type": "Digital", "X":2114, "Y":264, "Width":1192, "Height":54, "Cmt": "Stick L1 button"},
{ "Input": "button3", "Type": "Digital", "X":2954, "Y":544, "Width":792, "Height":108, "Cmt": "Stick R3 button"},
{ "Input": "button4", "Type": "Digital", "X":2754, "Y":374, "Width":832, "Height":108, "Cmt": "Stick L3 button"},
{ "Input": "button5", "Type": "Digital", "X":950, "Y":734, "Width":592, "Height":108, "Cmt": "Throttle square"},
{ "Input": "button6", "Type": "Digital", "X":950, "Y":898, "Width":592, "Height":108, "Cmt": "Throttle cross"},
{ "Input": "button7", "Type": "Digital", "X":950, "Y":1046, "Width":592, "Height":108, "Cmt": "Throttle circle"},
{ "Input": "button8", "Type": "Digital", "X":1044, "Y":1374, "Width":592, "Height":108, "Cmt": "Throttle triangle"},
{ "Input": "button9", "Type": "Digital", "X":1628, "Y":710, "Width":832, "Height":54, "Cmt": "Throttle R2 button"},
{ "Input": "button10", "Type": "Digital", "X":1928, "Y":790, "Width":532, "Height":108, "Cmt": "Throttle L2 button"},
{ "Input": "button11", "Type": "Digital", "X":284, "Y":2044, "Width":592, "Height":54, "Cmt": "Throttle SE button"},
{ "Input": "button12", "Type": "Digital", "X":984, "Y":2044, "Width":592, "Height":54, "Cmt": "Throttle ST button"},
{ "Input": "hat1_up", "Type": "Digital", "X":994, "Y":354, "Width":1532, "Height":54, "Cmt": "PoV hat up"},
{ "Input": "hat1_right", "Type": "Digital", "X":994, "Y":410, "Width":1532, "Height":54, "Cmt": "PoV hat right"},
{ "Input": "hat1_down", "Type": "Digital", "X":994, "Y":466, "Width":1532, "Height":54, "Cmt": "PoV hat down"},
{ "Input": "hat1_left", "Type": "Digital", "X":994, "Y":522, "Width":1532, "Height":54, "Cmt": "PoV hat left"},
{ "Input": "rotz", "Type": "Analogue", "X":3018, "Y":1988, "Width":792, "Height":108, "Cmt": "Stick twist"},
{ "Input": "x", "Type": "Analogue", "X":3018, "Y":1878, "Width":792, "Height":108, "Cmt": "Stick left/right"},
{ "Input": "y", "Type": "Analogue", "X":3018, "Y":1768, "Width":792, "Height":108, "Cmt": "Stick up/down"},
{ "Input": "z", "Type": "Analogue", "X":96, "Y":736, "Width":692, "Height":54, "Cmt": "Throttle"},
{ "Input": "slider1", "Type": "Analogue", "X":1114, "Y":1504, "Width":932, "Height":108, "Cmt": "Throttle rocker"}
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 725 KiB

@ -0,0 +1,34 @@
{
"MapName" : "ThrustMaster TFlight HOTASX",
"MapImage" : "hotasx.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "ThrustMaster TFlight HOTASX",
"DeviceProdGuid": ["{B108044f-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":1394, "Y":614, "Width":1082, "Height":54, "Cmt": "Stick primary trigger"},
{ "Input": "button2", "Type": "Digital", "X":2114, "Y":264, "Width":1192, "Height":54, "Cmt": "Stick L1 button"},
{ "Input": "button3", "Type": "Digital", "X":2954, "Y":544, "Width":792, "Height":108, "Cmt": "Stick R3 button"},
{ "Input": "button4", "Type": "Digital", "X":2754, "Y":374, "Width":832, "Height":108, "Cmt": "Stick L3 button"},
{ "Input": "button5", "Type": "Digital", "X":950, "Y":734, "Width":592, "Height":108, "Cmt": "Throttle square"},
{ "Input": "button6", "Type": "Digital", "X":950, "Y":898, "Width":592, "Height":108, "Cmt": "Throttle cross"},
{ "Input": "button7", "Type": "Digital", "X":950, "Y":1046, "Width":592, "Height":108, "Cmt": "Throttle circle"},
{ "Input": "button8", "Type": "Digital", "X":1044, "Y":1374, "Width":592, "Height":108, "Cmt": "Throttle triangle"},
{ "Input": "button9", "Type": "Digital", "X":1628, "Y":710, "Width":832, "Height":54, "Cmt": "Throttle R2 button"},
{ "Input": "button10", "Type": "Digital", "X":1928, "Y":790, "Width":532, "Height":108, "Cmt": "Throttle L2 button"},
{ "Input": "button11", "Type": "Digital", "X":284, "Y":2004, "Width":592, "Height":54, "Cmt": "Throttle SE button"},
{ "Input": "button12", "Type": "Digital", "X":984, "Y":2004, "Width":592, "Height":54, "Cmt": "Throttle ST button"},
{ "Input": "hat1_up", "Type": "Digital", "X":994, "Y":354, "Width":1532, "Height":54, "Cmt": "PoV hat up"},
{ "Input": "hat1_right", "Type": "Digital", "X":994, "Y":410, "Width":1532, "Height":54, "Cmt": "PoV hat right"},
{ "Input": "hat1_down", "Type": "Digital", "X":994, "Y":466, "Width":1532, "Height":54, "Cmt": "PoV hat down"},
{ "Input": "hat1_left", "Type": "Digital", "X":994, "Y":522, "Width":1532, "Height":54, "Cmt": "PoV hat left"},
{ "Input": "rotz", "Type": "Analogue", "X":3018, "Y":947, "Width":792, "Height":108, "Cmt": "Stick twist"},
{ "Input": "x", "Type": "Analogue", "X":3018, "Y":837, "Width":792, "Height":108, "Cmt": "Stick left/right"},
{ "Input": "y", "Type": "Analogue", "X":3018, "Y":727, "Width":792, "Height":108, "Cmt": "Stick up/down"},
{ "Input": "z", "Type": "Analogue", "X":96, "Y":736, "Width":692, "Height":54, "Cmt": "Throttle"},
{ "Input": "slider1", "Type": "Analogue", "X":1114, "Y":1504, "Width":932, "Height":108, "Cmt": "Throttle rocker"}
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 KiB

@ -0,0 +1,16 @@
{
"MapName" : "Saitek ProFlight Combat Rudder Pedals",
"MapImage" : "proflightcombatpedals.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "Saitek ProFlight Combat Rudder Pedals",
"DeviceProdGuid": ["{076406A3-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "x", "Type": "Digital", "X":164, "Y":588, "Width":1332, "Height":162, "Cmt":"Left pedal"},
{ "Input": "y", "Type": "Digital", "X":2264, "Y":588, "Width":1332, "Height":162, "Cmt":"Right pedal"},
{ "Input": "rotz", "Type": "Analogue", "X":1208, "Y":331, "Width":1332, "Height":162, "Cmt":"Rudder"}
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 464 KiB

@ -0,0 +1,17 @@
{
"MapName" : "Saitek ProFlight Combat Rudder Pedals",
"MapImage" : "proflightpedals.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "Saitek ProFlight Combat Rudder Pedals",
"DeviceProdGuid": ["{076306A3-0000-0000-0000-504944564944}",
"{076506A3-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "x", "Type": "Digital", "X":164, "Y":588, "Width":1332, "Height":162, "Cmt":"Left pedal"},
{ "Input": "y", "Type": "Digital", "X":2264, "Y":588, "Width":1332, "Height":162, "Cmt":"Right pedal"},
{ "Input": "rotz", "Type": "Analogue", "X":1208, "Y":331, "Width":1332, "Height":162, "Cmt":"Rudder"}
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 KiB

@ -0,0 +1,47 @@
{
"MapName" : "Saitek Side Panel Control Deck",
"MapImage" : "sidepanelcontroldeck.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "Saitek Side Panel Control Deck",
"DeviceProdGuid": ["{22180738-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":34, "Y":584, "Width":592, "Height":54, "Cmt":""},
{ "Input": "button2", "Type": "Digital", "X":634, "Y":584, "Width":592, "Height":54, "Cmt":""},
{ "Input": "button3", "Type": "Digital", "X":1234, "Y":584, "Width":592, "Height":54, "Cmt":""},
{ "Input": "button4", "Type": "Digital", "X":2629, "Y":584, "Width":592, "Height":54, "Cmt":""},
{ "Input": "button5", "Type": "Digital", "X":3229, "Y":584, "Width":592, "Height":54, "Cmt":""},
{ "Input": "button6", "Type": "Digital", "X":34, "Y":646, "Width":592, "Height":54, "Cmt":""},
{ "Input": "button7", "Type": "Digital", "X":634, "Y":646, "Width":592, "Height":54, "Cmt":""},
{ "Input": "button8", "Type": "Digital", "X":1234, "Y":646, "Width":592, "Height":54, "Cmt":""},
{ "Input": "button9", "Type": "Digital", "X":2629, "Y":646, "Width":592, "Height":54, "Cmt":""},
{ "Input": "button10", "Type": "Digital", "X":3229, "Y":646, "Width":592, "Height":54, "Cmt":""},
{ "Input": "button11", "Type": "Digital", "X":34, "Y":884, "Width":592, "Height":54, "Cmt":""},
{ "Input": "button12", "Type": "Digital", "X":34, "Y":946, "Width":592, "Height":54, "Cmt":""},
{ "Input": "button13", "Type": "Digital", "X":634, "Y":884, "Width":592, "Height":54, "Cmt":""},
{ "Input": "button14", "Type": "Digital", "X":634, "Y":946, "Width":592, "Height":54, "Cmt":""},
{ "Input": "button15", "Type": "Digital", "X":1234, "Y":884, "Width":592, "Height":54, "Cmt":""},
{ "Input": "button16", "Type": "Digital", "X":1234, "Y":946, "Width":592, "Height":54, "Cmt":""},
{ "Input": "button17", "Type": "Digital", "X":2629, "Y":884, "Width":592, "Height":54, "Cmt":""},
{ "Input": "button18", "Type": "Digital", "X":3229, "Y":884, "Width":592, "Height":54, "Cmt":""},
{ "Input": "button19", "Type": "Digital", "X":2629, "Y":946, "Width":592, "Height":54, "Cmt":""},
{ "Input": "button20", "Type": "Digital", "X":3229, "Y":946, "Width":592, "Height":54, "Cmt":""},
{ "Input": "button21", "Type": "Digital", "X":2624, "Y":1132, "Width":992, "Height":54, "Cmt":""},
{ "Input": "button22", "Type": "Digital", "X":2624, "Y":1222, "Width":992, "Height":54, "Cmt":""},
{ "Input": "button23", "Type": "Digital", "X":2624, "Y":1284, "Width":992, "Height":54, "Cmt":""},
{ "Input": "button24", "Type": "Digital", "X":2624, "Y":1344, "Width":992, "Height":54, "Cmt":""},
{ "Input": "button25", "Type": "Digital", "X":1060, "Y":1371, "Width":772, "Height":54, "Cmt": "Scroll wheel press"},
{ "Input": "button26", "Type": "Digital", "X":1060, "Y":1259, "Width":772, "Height":54, "Cmt":""},
{ "Input": "button27", "Type": "Digital", "X":1060, "Y":1315, "Width":772, "Height":54, "Cmt":""},
{ "Input": "button28", "Type": "Digital", "X":835, "Y":1160, "Width":992, "Height":54, "Cmt": "Stick red button"},
{ "Input": "x", "Type": "Analogue", "X":695, "Y":1556, "Width":1132, "Height":108, "Cmt":""},
{ "Input": "y", "Type": "Analogue", "X":695, "Y":1666, "Width":1132, "Height":108, "Cmt":""},
{ "Input": "z", "Type": "Analogue", "X":695, "Y":1776, "Width":1132, "Height":108, "Cmt":""},
{ "Input": "rotx", "Type": "Analogue", "X":2685, "Y":1556, "Width":1132, "Height":108, "Cmt":""},
{ "Input": "roty", "Type": "Analogue", "X":2685, "Y":1666, "Width":1132, "Height":108, "Cmt":""},
{ "Input": "rotz", "Type": "Analogue", "X":2685, "Y":1776, "Width":1132, "Height":108, "Cmt":""}
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 822 KiB

@ -0,0 +1,16 @@
{
"MapName" : "Slaw BF-109 Pedals",
"MapImage" : "slawbf109pedals.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "Slaw BF-109 Pedals",
"DeviceProdGuid": ["{001104D8-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "x", "Type": "Digital", "X":164, "Y":588, "Width":1332, "Height":162, "Cmt":"Left pedal (unconfirmed)"},
{ "Input": "y", "Type": "Digital", "X":2264, "Y":588, "Width":1332, "Height":162, "Cmt":"Right pedal (unconfirmed)"},
{ "Input": "rotz", "Type": "Analogue", "X":1208, "Y":331, "Width":1332, "Height":162, "Cmt":"Rudder"}
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 590 KiB

@ -0,0 +1,33 @@
{
"MapName" : "ThrustMaster T.Flight X",
"MapImage" : "stickx.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "ThrustMaster T.Flight X",
"DeviceProdGuid": ["{B106044F-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":684, "Y":822, "Width":1092, "Height":54, "Cmt": "Primary trigger"},
{ "Input": "button2", "Type": "Digital", "X":2204, "Y":744, "Width":1092, "Height":54, "Cmt": "Secondary trigger"},
{ "Input": "button3", "Type": "Digital", "X":2124, "Y":564, "Width":1092, "Height":54, "Cmt": "Button 3"},
{ "Input": "button4", "Type": "Digital", "X":2174, "Y":654, "Width":1092, "Height":54, "Cmt": "Button 4"},
{ "Input": "button5", "Type": "Digital", "X":474, "Y":1564, "Width":1092, "Height":54, "Cmt": "Button 5"},
{ "Input": "button6", "Type": "Digital", "X":544, "Y":1424, "Width":1092, "Height":54, "Cmt": "Button 6"},
{ "Input": "button7", "Type": "Digital", "X":584, "Y":1266, "Width":1092, "Height":54, "Cmt": "Button 7"},
{ "Input": "button8", "Type": "Digital", "X":584, "Y":1204, "Width":1092, "Height":54, "Cmt": "Button 8"},
{ "Input": "button9", "Type": "Digital", "X":554, "Y":1704, "Width":1092, "Height":54, "Cmt": "Button 9"},
{ "Input": "button10", "Type": "Digital", "X":554, "Y":1766, "Width":1092, "Height":54, "Cmt": "Button 10"},
{ "Input": "button11", "Type": "Digital", "X":2824, "Y":1428, "Width":692, "Height":54, "Cmt": "Button 11"},
{ "Input": "button12", "Type": "Digital", "X":2824, "Y":1338, "Width":692, "Height":54, "Cmt": "Button 12"},
{ "Input": "hat1_up", "Type": "Digital", "X":990, "Y":304, "Width":1932, "Height":54, "Cmt": "PoV hat up"},
{ "Input": "hat1_right", "Type": "Digital", "X":990, "Y":360, "Width":1932, "Height":54, "Cmt": "PoV hat right"},
{ "Input": "hat1_down", "Type": "Digital", "X":990, "Y":416, "Width":1932, "Height":54, "Cmt": "PoV hat down"},
{ "Input": "hat1_left", "Type": "Digital", "X":990, "Y":472, "Width":1932, "Height":54, "Cmt": "PoV hat left"},
{ "Input": "rotz", "Type": "Analogue", "X":2364, "Y":966, "Width":1132, "Height":54, "Cmt": "Stick twist"},
{ "Input": "slider1", "Type": "Analogue", "X":2584, "Y":1833, "Width":892, "Height":54, "Cmt": "Throttle axis"},
{ "Input": "x", "Type": "Analogue", "X":2364, "Y":910, "Width":1132, "Height":54, "Cmt": "Stick left/right"},
{ "Input": "y", "Type": "Analogue", "X":2364, "Y":854, "Width":1132, "Height":54, "Cmt": "Stick up/down"}
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 KiB

@ -0,0 +1,37 @@
{
"MapName" : "T16000M",
"MapImage" : "T16000M.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "T16000M",
"DeviceProdGuid": ["{B10A044F-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":2124, "Y":624, "Width":1092, "Height":54, "Cmt": "Primary trigger" },
{ "Input": "button2", "Type": "Digital", "X":474, "Y":624, "Width":1092, "Height":54, "Cmt": "Bottom button" },
{ "Input": "button3", "Type": "Digital", "X":474, "Y":494, "Width":1092, "Height":54, "Cmt": "Left-hand button" },
{ "Input": "button4", "Type": "Digital", "X":2124, "Y":494, "Width":1092, "Height":54, "Cmt": "Right-hand button" },
{ "Input": "button5", "Type": "Digital", "X":24, "Y":1104, "Width":542, "Height":108, "Cmt": "Left bank top-left button" },
{ "Input": "button6", "Type": "Digital", "X":574, "Y":1104, "Width":542, "Height":108, "Cmt": "Left bank top-middle button" },
{ "Input": "button7", "Type": "Digital", "X":1124, "Y":1104, "Width":542, "Height":108, "Cmt": "Left bank top-right button" },
{ "Input": "button8", "Type": "Digital", "X":1124, "Y":1220, "Width":542, "Height":108, "Cmt": "Left bank bottom-right button" },
{ "Input": "button9", "Type": "Digital", "X":574, "Y":1220, "Width":542, "Height":108, "Cmt": "Left bank bottom-middle button" },
{ "Input": "button10", "Type": "Digital", "X":24, "Y":1220, "Width":542, "Height":108, "Cmt": "Left bank bottom-left button" },
{ "Input": "button11", "Type": "Digital", "X":3264, "Y":1104, "Width":542, "Height":108, "Cmt": "Right bank top-right button" },
{ "Input": "button12", "Type": "Digital", "X":2714, "Y":1104, "Width":542, "Height":108, "Cmt": "Right bank top-middle button" },
{ "Input": "button13", "Type": "Digital", "X":2164, "Y":1104, "Width":542, "Height":108, "Cmt": "Right bank top-left button" },
{ "Input": "button14", "Type": "Digital", "X":2164, "Y":1220, "Width":542, "Height":108, "Cmt": "Right bank bottom-left button" },
{ "Input": "button15", "Type": "Digital", "X":2714, "Y":1220, "Width":542, "Height":108, "Cmt": "Right bank bottom-middle button" },
{ "Input": "button16", "Type": "Digital", "X":3264, "Y":1220, "Width":542, "Height":108, "Cmt": "Right bank bottom-right button" },
{ "Input": "hat1_up", "Type": "Digital", "X":1542, "Y":214, "Width":1532, "Height":54, "Cmt": "PoV hat up" },
{ "Input": "hat1_right", "Type": "Digital", "X":1542, "Y":270, "Width":1532, "Height":54, "Cmt": "PoV hat right" },
{ "Input": "hat1_down", "Type": "Digital", "X":1542, "Y":326, "Width":1532, "Height":54, "Cmt": "PoV hat down" },
{ "Input": "hat1_left", "Type": "Digital", "X":1542, "Y":382, "Width":1532, "Height":54, "Cmt": "PoV hat left" },
{ "Input": "rotz", "Type": "Analogue", "X":2357, "Y":980, "Width":1132, "Height":54, "Cmt": "Stick twist" },
{ "Input": "slider1", "Type": "Analogue", "X":2584, "Y":1750, "Width":832, "Height":54, "Cmt": "Stick throttle slider" },
{ "Input": "x", "Type": "Analogue", "X":2357, "Y":924, "Width":1132, "Height":54, "Cmt": "Stick pitch" },
{ "Input": "y", "Type": "Analogue", "X":2357, "Y":868, "Width":1132, "Height": 54, "Cmt": "Stick roll" }
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 KiB

@ -0,0 +1,67 @@
{
"MapName" : "T16000MFCS",
"MapImage" : "t16000mfcs.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "T16000M Stick",
"DeviceProdGuid": "{B10A044F-0000-0000-0000-504944564944}",
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":1804, "Y":844, "Width":642, "Height":54, "Cmt": "Primary trigger" },
{ "Input": "button2", "Type": "Digital", "X":2764, "Y":604, "Width":992, "Height":54, "Cmt": "Bottom button" },
{ "Input": "button3", "Type": "Digital", "X":1754, "Y":484, "Width":692, "Height":54, "Cmt": "Left-hand button" },
{ "Input": "button4", "Type": "Digital", "X":2764, "Y":504, "Width":992, "Height":54, "Cmt": "Right-hand button" },
{ "Input": "button5", "Type": "Digital", "X":1254, "Y":1244, "Width":292, "Height":108, "Cmt": "Left bank top-left button" },
{ "Input": "button6", "Type": "Digital", "X":1554, "Y":1244, "Width":292, "Height":108, "Cmt": "Left bank top-middle button" },
{ "Input": "button7", "Type": "Digital", "X":1854, "Y":1244, "Width":292, "Height":108, "Cmt": "Left bank top-right button" },
{ "Input": "button8", "Type": "Digital", "X":1854, "Y":1360, "Width":292, "Height":108, "Cmt": "Left bank bottom-right button" },
{ "Input": "button9", "Type": "Digital", "X":1554, "Y":1360, "Width":292, "Height":108, "Cmt": "Left bank bottom-middle button" },
{ "Input": "button10", "Type": "Digital", "X":1254, "Y":1360, "Width":292, "Height":108, "Cmt": "Left bank bottom-left button" },
{ "Input": "button11", "Type": "Digital", "X":3484, "Y":992, "Width":292, "Height":108, "Cmt": "Right bank top-right button" },
{ "Input": "button12", "Type": "Digital", "X":3184, "Y":992, "Width":292, "Height":108, "Cmt": "Right bank top-middle button" },
{ "Input": "button13", "Type": "Digital", "X":2884, "Y":992, "Width":292, "Height":108, "Cmt": "Right bank top-left button" },
{ "Input": "button14", "Type": "Digital", "X":2884, "Y":1108, "Width":292, "Height":108, "Cmt": "Right bank bottom-left button" },
{ "Input": "button15", "Type": "Digital", "X":3184, "Y":1108, "Width":292, "Height":108, "Cmt": "Right bank bottom-middle button" },
{ "Input": "button16", "Type": "Digital", "X":3484, "Y":1108, "Width":292, "Height":108, "Cmt": "Right bank bottom-right button" },
{ "Input": "hat1_up", "Type": "Digital", "X":2524, "Y":214, "Width":1192, "Height":54, "Cmt": "PoV hat up" },
{ "Input": "hat1_right", "Type": "Digital", "X":2524, "Y":270, "Width":1192, "Height":54, "Cmt": "PoV hat right" },
{ "Input": "hat1_down", "Type": "Digital", "X":2524, "Y":326, "Width":1192, "Height":54, "Cmt": "PoV hat down" },
{ "Input": "hat1_left", "Type": "Digital", "X":2524, "Y":382, "Width":1192, "Height":54, "Cmt": "PoV hat left" },
{ "Input": "rotz", "Type": "Analogue", "X":2824, "Y":856, "Width":932, "Height":54, "Cmt": "Stick twist" },
{ "Input": "slider1", "Type": "Analogue", "X":2944, "Y":1593, "Width":832, "Height":54, "Cmt": "Stick throttle slider" },
{ "Input": "x", "Type": "Analogue", "X":2824, "Y":800, "Width":932, "Height":54, "Cmt": "Stick pitch" },
{ "Input": "y", "Type": "Analogue", "X":2824, "Y":744, "Width":932, "Height": 54, "Cmt": "Stick roll" }
]
},
{
"InputType": "J",
"DeviceName": "T16000M Throttle",
"DeviceProdGuid": "{B687044F-0000-0000-0000-504944564944}",
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":294, "Y":1244, "Width":792, "Height":54, "Cmt": "Thumb button" },
{ "Input": "button2", "Type": "Digital", "X":1774, "Y":1774, "Width":892, "Height":54, "Cmt": "Pinky button" },
{ "Input": "button3", "Type": "Digital", "X":1714, "Y":1664, "Width":892, "Height":54, "Cmt": "Ring finger button" },
{ "Input": "button4", "Type": "Digital", "X":1484, "Y":1514, "Width":692, "Height":54, "Cmt": "Middle finger rocker up" },
{ "Input": "button5", "Type": "Digital", "X":1484, "Y":1570, "Width":692, "Height":54, "Cmt": "Middle finger rocker down" },
{ "Input": "button6", "Type": "Digital", "X":244, "Y":1866, "Width":732, "Height":54, "Cmt": "Index finger mouse push" },
{ "Input": "button7", "Type": "Digital", "X":1024, "Y":654, "Width":692, "Height":54, "Cmt": "Middle hat up" },
{ "Input": "button8", "Type": "Digital", "X":1024, "Y":710, "Width":692, "Height":54, "Cmt": "Middle hat right" },
{ "Input": "button9", "Type": "Digital", "X":1024, "Y":766, "Width":692, "Height":54, "Cmt": "Middle hat down" },
{ "Input": "button10", "Type": "Digital", "X":1024, "Y":820, "Width":692, "Height":54, "Cmt": "Middle hat left" },
{ "Input": "button11", "Type": "Digital", "X":1034, "Y":929, "Width":692, "Height":54, "Cmt": "Middle hat up" },
{ "Input": "button12", "Type": "Digital", "X":1034, "Y":985, "Width":692, "Height":54, "Cmt": "Castle hat right" },
{ "Input": "button13", "Type": "Digital", "X":1034, "Y":1041, "Width":692, "Height":54, "Cmt": "Castle hat down" },
{ "Input": "button14", "Type": "Digital", "X":1034, "Y":1097, "Width":692, "Height":54, "Cmt": "Castle hat left" },
{ "Input": "hat1_up", "Type": "Digital", "X":1014, "Y":364, "Width":692, "Height":54, "Cmt": "PoV hat up" },
{ "Input": "hat1_right", "Type": "Digital", "X":1014, "Y":420, "Width":692, "Height":54, "Cmt": "PoV hat right" },
{ "Input": "hat1_down", "Type": "Digital", "X":1014, "Y":476, "Width":692, "Height":54, "Cmt": "PoV hat down" },
{ "Input": "hat1_left", "Type": "Digital", "X":1014, "Y":532, "Width":692, "Height":54, "Cmt": "PoV hat left" },
{ "Input": "x", "Type": "Digital", "X":244, "Y":1810, "Width":732, "Height":54, "Cmt": "Index finger mouse X" },
{ "Input": "y", "Type": "Digital", "X":244, "Y":1754, "Width":732, "Height":54, "Cmt": "Index finger mouse Y" },
{ "Input": "z", "Type": "Digital", "X":84, "Y":555, "Width":572, "Height":54, "Cmt": "Throttle" },
{ "Input": "slider1", "Type": "Digital", "X":1874, "Y":1914, "Width":832, "Height":54, "Cmt": "Pinky dial" },
{ "Input": "rotz", "Type": "Digital", "X":1954, "Y":2054, "Width":832, "Height":54, "Cmt": "Paddle" }
]
}
]
}

@ -0,0 +1,30 @@
{
"MapName" : "A Name that is shown in the dropdown",
"MapImage" : "DeviceImage.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "DeviceName Name as shown in the SCJM GUI",
"DeviceProdGuid": ["{Product GUID from DX Input}", "{An alternate product GUID from DX Input}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X": 1629, "Y": 628, "Width": 732, "Height": 52, "Cmt": "Primary trigger" },
{ "Input": "button2", "Type": "Digital", "X": 1723, "Y": 450, "Width": 731, "Height": 52, "Cmt": "Top trigger (A)" },
..
..
{ "Input": "z", "Type": "Analogue", "X": 97, "Y": 763, "Width": 572, "Height": 54, "Cmt": "Throttle Left" }
]
},
{
"InputType": "J",
"DeviceName": "Next DeviceName Name as shown in the SCJM GUI",
"DeviceProdGuid": ["{Product GUID from DX Input}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X": 1629, "Y": 628, "Width": 732, "Height": 52, "Cmt": "Primary trigger" },
{ "Input": "button2", "Type": "Digital", "X": 1723, "Y": 450, "Width": 731, "Height": 52, "Cmt": "Top trigger (A)" },
..
..
{ "Input": "z", "Type": "Analogue", "X": 97, "Y": 763, "Width": 572, "Height": 54, "Cmt": "Throttle Left" }
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 630 KiB

@ -0,0 +1,16 @@
{
"MapName" : "ThrustMaster T-Flight Pedals",
"MapImage" : "tfrpedals.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "ThrustMaster T-Flight Pedals",
"DeviceProdGuid": ["{B679044F-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "x", "Type": "Digital", "X":164, "Y":588, "Width":1332, "Height":162, "Cmt":"Left pedal"},
{ "Input": "y", "Type": "Digital", "X":2264, "Y":588, "Width":1332, "Height":162, "Cmt":"Right pedal"},
{ "Input": "z", "Type": "Analogue", "X":1208, "Y":331, "Width":1332, "Height":162, "Cmt":"Rudder"}
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 559 KiB

@ -0,0 +1,40 @@
{
"MapName" : "VPC WarBRD Delta (left)",
"MapImage" : "vpc-warbrd-delta-left.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "VPC WarBRD Delta left",
"DeviceProdGuid": ["{204203EB-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":2470, "Y":1100, "Width":1180, "Height":54, "Cmt":"Trigger first stage"},
{ "Input": "button2", "Type": "Digital", "X":2470, "Y":1160, "Width":1180, "Height":54, "Cmt":"Trigger second stage"},
{ "Input": "button3", "Type": "Digital", "X":2470, "Y":1300, "Width":1180, "Height":54, "Cmt":"Trigger button"},
{ "Input": "button4", "Type": "Digital", "X":270, "Y":1000, "Width":1180, "Height":54, "Cmt":"Wheel up"},
{ "Input": "button5", "Type": "Digital", "X":270, "Y":1060, "Width":1180, "Height":54, "Cmt":"Wheel down"},
{ "Input": "button6", "Type": "Digital", "X":270, "Y":1120, "Width":1180, "Height":54, "Cmt":"Wheel push"},
{ "Input": "button7", "Type": "Digital", "X":270, "Y":820, "Width":1180, "Height":54, "Cmt":"Mini-joystick push"},
{ "Input": "button8", "Type": "Digital", "X":2470, "Y":700, "Width":1180, "Height":54, "Cmt":"4-way hat right up"},
{ "Input": "button9", "Type": "Digital", "X":2470, "Y":760, "Width":1180, "Height":54, "Cmt":"4-way hat right righ"},
{ "Input": "button10", "Type": "Digital", "X":2470, "Y":820, "Width":1180, "Height":54, "Cmt":"4-way hat right down"},
{ "Input": "button11", "Type": "Digital", "X":2470, "Y":880, "Width":1180, "Height":54, "Cmt":"4-way hat right left"},
{ "Input": "button12", "Type": "Digital", "X":2470, "Y":940, "Width":1180, "Height":54, "Cmt":"4-way hat right push?"},
{ "Input": "button13", "Type": "Digital", "X":270, "Y":300, "Width":1180, "Height":54, "Cmt":"4-way hat left up"},
{ "Input": "button14", "Type": "Digital", "X":270, "Y":360, "Width":1180, "Height":54, "Cmt":"4-way hat left righ"},
{ "Input": "button15", "Type": "Digital", "X":270, "Y":420, "Width":1180, "Height":54, "Cmt":"4-way hat left down"},
{ "Input": "button16", "Type": "Digital", "X":270, "Y":480, "Width":1180, "Height":54, "Cmt":"4-way hat left left"},
{ "Input": "button17", "Type": "Digital", "X":270, "Y":540, "Width":1180, "Height":54, "Cmt":"4-way hat left push?"},
{ "Input": "button18", "Type": "Digital", "X":2470, "Y":300, "Width":1180, "Height":54, "Cmt":"8-way hat LED up"},
{ "Input": "button19", "Type": "Digital", "X":2470, "Y":360, "Width":1180, "Height":54, "Cmt":"8-way hat LED righ"},
{ "Input": "button20", "Type": "Digital", "X":2470, "Y":420, "Width":1180, "Height":54, "Cmt":"8-way hat LED down"},
{ "Input": "button21", "Type": "Digital", "X":2470, "Y":480, "Width":1180, "Height":54, "Cmt":"8-way hat LED left"},
{ "Input": "button22", "Type": "Digital", "X":2470, "Y":540, "Width":1180, "Height":54, "Cmt":"8-way hat LED push?"},
{ "Input": "x", "Type": "Analogue", "X":270, "Y":1400, "Width":1180, "Height":54, "Cmt":"Joystick axis" },
{ "Input": "y", "Type": "Analogue", "X":270, "Y":1460, "Width":1180, "Height":54, "Cmt":""},
{ "Input": "z", "Type": "Analogue", "X":270, "Y":1520, "Width":1180, "Height":54, "Cmt":""},
{ "Input": "rotx", "Type": "Analogue", "X":270, "Y":700, "Width":1180, "Height":54, "Cmt":"Mini-joysticks axis"},
{ "Input": "roty", "Type": "Analogue", "X":270, "Y":760, "Width":1180, "Height":54, "Cmt":""}
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 564 KiB

@ -0,0 +1,40 @@
{
"MapName" : "VPC WarBRD Delta (right)",
"MapImage" : "vpc-warbrd-delta-right.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "VPC WarBRD Delta right",
"DeviceProdGuid": ["{204403EB-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":270, "Y":1100, "Width":1180, "Height":54, "Cmt":"Trigger first stage"},
{ "Input": "button2", "Type": "Digital", "X":270, "Y":1160, "Width":1180, "Height":54, "Cmt":"Trigger second stage"},
{ "Input": "button3", "Type": "Digital", "X":270, "Y":1300, "Width":1180, "Height":54, "Cmt":"Trigger button"},
{ "Input": "button4", "Type": "Digital", "X":2470, "Y":1000, "Width":1180, "Height":54, "Cmt":"Wheel up"},
{ "Input": "button5", "Type": "Digital", "X":2470, "Y":1060, "Width":1180, "Height":54, "Cmt":"Wheel down"},
{ "Input": "button6", "Type": "Digital", "X":2470, "Y":1120, "Width":1180, "Height":54, "Cmt":"Wheel push"},
{ "Input": "button7", "Type": "Digital", "X":2470, "Y":820, "Width":1180, "Height":54, "Cmt":"Mini-joystick push"},
{ "Input": "button8", "Type": "Digital", "X":2470, "Y":300, "Width":1180, "Height":54, "Cmt":"4-way hat right up"},
{ "Input": "button9", "Type": "Digital", "X":2470, "Y":360, "Width":1180, "Height":54, "Cmt":"4-way hat right righ"},
{ "Input": "button10", "Type": "Digital", "X":2470, "Y":420, "Width":1180, "Height":54, "Cmt":"4-way hat right down"},
{ "Input": "button11", "Type": "Digital", "X":2470, "Y":480, "Width":1180, "Height":54, "Cmt":"4-way hat right left"},
{ "Input": "button12", "Type": "Digital", "X":2470, "Y":540, "Width":1180, "Height":54, "Cmt":"4-way hat right push?"},
{ "Input": "button13", "Type": "Digital", "X":270, "Y":700, "Width":1180, "Height":54, "Cmt":"4-way hat left up"},
{ "Input": "button14", "Type": "Digital", "X":270, "Y":760, "Width":1180, "Height":54, "Cmt":"4-way hat left righ"},
{ "Input": "button15", "Type": "Digital", "X":270, "Y":820, "Width":1180, "Height":54, "Cmt":"4-way hat left down"},
{ "Input": "button16", "Type": "Digital", "X":270, "Y":880, "Width":1180, "Height":54, "Cmt":"4-way hat left left"},
{ "Input": "button17", "Type": "Digital", "X":270, "Y":940, "Width":1180, "Height":54, "Cmt":"4-way hat left push?"},
{ "Input": "button18", "Type": "Digital", "X":270, "Y":300, "Width":1180, "Height":54, "Cmt":"8-way hat LED up"},
{ "Input": "button19", "Type": "Digital", "X":270, "Y":360, "Width":1180, "Height":54, "Cmt":"8-way hat LED righ"},
{ "Input": "button20", "Type": "Digital", "X":270, "Y":420, "Width":1180, "Height":54, "Cmt":"8-way hat LED down"},
{ "Input": "button21", "Type": "Digital", "X":270, "Y":480, "Width":1180, "Height":54, "Cmt":"8-way hat LED left"},
{ "Input": "button22", "Type": "Digital", "X":270, "Y":540, "Width":1180, "Height":54, "Cmt":"8-way hat LED push?"},
{ "Input": "x", "Type": "Analogue", "X":2470, "Y":1400, "Width":1180, "Height":54, "Cmt":"Joystick axis"},
{ "Input": "y", "Type": "Analogue", "X":2470, "Y":1460, "Width":1180, "Height":54, "Cmt":""},
{ "Input": "z", "Type": "Analogue", "X":2470, "Y":1520, "Width":1180, "Height":54, "Cmt":""},
{ "Input": "rotx", "Type": "Analogue", "X":2470, "Y":700, "Width":1180, "Height":54, "Cmt":"Mini-joysticks axis"},
{ "Input": "roty", "Type": "Analogue", "X":2470, "Y":760, "Width":1180, "Height":54, "Cmt":""}
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 808 KiB

@ -0,0 +1,85 @@
{
"MapName" : "Warthog Throttle and Joystick",
"MapImage" : "warthog.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "ThrustMaster Warthog Joystick",
"DeviceProdGuid": ["{0402044F-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":2042, "Y":548, "Width":620, "Height":54, "Cmt": "Primary trigger half press"},
{ "Input": "button2", "Type": "Digital", "X":1952, "Y":214, "Width":880, "Height":54, "Cmt": "Top trigger red button"},
{ "Input": "button3", "Type": "Digital", "X":2084, "Y":1102, "Width":580, "Height":54, "Cmt": "Pinky button"},
{ "Input": "button4", "Type": "Digital", "X":2084, "Y":1012, "Width":580, "Height":54, "Cmt": "Pinky trigger"},
{ "Input": "button5", "Type": "Digital", "X":2886, "Y":212, "Width":880, "Height":54, "Cmt": "Top side button"},
{ "Input": "button6", "Type": "Digital", "X":2042, "Y":602, "Width":620, "Height":54, "Cmt": "Primary trigger full press"},
{ "Input": "button7", "Type": "Digital", "X":1916, "Y":300, "Width":760, "Height":54, "Cmt": "Left hat up"},
{ "Input": "button8", "Type": "Digital", "X":1916, "Y":354, "Width":760, "Height":54, "Cmt": "Left hat right"},
{ "Input": "button9", "Type": "Digital", "X":1916, "Y":408, "Width":760, "Height":54, "Cmt": "Left hat down"},
{ "Input": "button10", "Type": "Digital", "X":1916, "Y":462, "Width":760, "Height":54, "Cmt": "Left hat left"},
{ "Input": "button11", "Type": "Digital", "X":3048, "Y":562, "Width":760, "Height":54, "Cmt": "Right hat up"},
{ "Input": "button12", "Type": "Digital", "X":3048, "Y":616, "Width":760, "Height":54, "Cmt": "Right hat right"},
{ "Input": "button13", "Type": "Digital", "X":3048, "Y":670, "Width":760, "Height":54, "Cmt": "Right hat down"},
{ "Input": "button14", "Type": "Digital", "X":3048, "Y":724, "Width":760, "Height":54, "Cmt": "Right hat left"},
{ "Input": "button15", "Type": "Digital", "X":2004, "Y":700, "Width":660, "Height":54, "Cmt": "Thumb hat up"},
{ "Input": "button16", "Type": "Digital", "X":2004, "Y":754, "Width":660, "Height":54, "Cmt": "Thumb hat right"},
{ "Input": "button17", "Type": "Digital", "X":2004, "Y":808, "Width":660, "Height":54, "Cmt": "Thumb hat down"},
{ "Input": "button18", "Type": "Digital", "X":2004, "Y":862, "Width":660, "Height":54, "Cmt": "Thumb hat left"},
{ "Input": "button19", "Type": "Digital", "X":2004, "Y":914, "Width":660, "Height":54, "Cmt": "Thumb hat push"},
{ "Input": "hat1_up", "Type": "Digital", "X":3048, "Y":308, "Width":760, "Height":54, "Cmt": "PoV hat up"},
{ "Input": "hat1_right", "Type": "Digital", "X":3048, "Y":362, "Width":760, "Height":54, "Cmt": "PoV hat right"},
{ "Input": "hat1_down", "Type": "Digital", "X":3048, "Y":416, "Width":760, "Height":54, "Cmt": "PoV hat down"},
{ "Input": "hat1_left", "Type": "Digital", "X":3048, "Y":470, "Width":760, "Height":54, "Cmt": "PoV hat left"},
{ "Input": "x", "Type": "Analogue", "X":3126, "Y":872, "Width":680, "Height":54, "Cmt": "Stick left/right"},
{ "Input": "y", "Type": "Analogue", "X":3126, "Y":818, "Width":680, "Height":54, "Cmt": "Stick up/down"}
]
},
{
"InputType": "J",
"DeviceName": "ThrustMaster Warthog Throttle",
"DeviceProdGuid": ["{0404044F-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":2870, "Y":1422, "Width":680, "Height":54, "Cmt": "Rear analogue push"},
{ "Input": "button2", "Type": "Digital", "X":1674, "Y":1672, "Width":660, "Height":54, "Cmt": "Side hat push"},
{ "Input": "button3", "Type": "Digital", "X":1674, "Y":1456, "Width":660, "Height":54, "Cmt": "Side hat up"},
{ "Input": "button4", "Type": "Digital", "X":1674, "Y":1510, "Width":660, "Height":54, "Cmt": "Side hat right"},
{ "Input": "button5", "Type": "Digital", "X":1674, "Y":1564, "Width":660, "Height":54, "Cmt": "Side hat down"},
{ "Input": "button6", "Type": "Digital", "X":1674, "Y":1618, "Width":660, "Height":54, "Cmt": "Side hat left"},
{ "Input": "button7", "Type": "Digital", "X":1694, "Y":1810, "Width":640, "Height":54, "Cmt": "Side top switch right"},
{ "Input": "button8", "Type": "Digital", "X":1694, "Y":1756, "Width":640, "Height":54, "Cmt": "Side top switch left"},
{ "Input": "button9", "Type": "Digital", "X":1694, "Y":1950, "Width":640, "Height":54, "Cmt": "Side middle switch right"},
{ "Input": "button10", "Type": "Digital", "X":1694, "Y":1896, "Width":640, "Height":54, "Cmt": "Side middle switch left"},
{ "Input": "button11", "Type": "Digital", "X":1694, "Y":2088, "Width":640, "Height":54, "Cmt": "Side bottom switch right"},
{ "Input": "button12", "Type": "Digital", "X":1694, "Y":2034, "Width":640, "Height":54, "Cmt": "Side bottom switch left"},
{ "Input": "button13", "Type": "Digital", "X":3386, "Y":1976, "Width":420, "Height":54, "Cmt": "Side toggle up"},
{ "Input": "button14", "Type": "Digital", "X":3386, "Y":2030, "Width":420, "Height":54, "Cmt": "Side toggle down"},
{ "Input": "button15", "Type": "Digital", "X":3196, "Y":1514, "Width":620, "Height":54, "Cmt": "Rear red button"},
{ "Input": "button16", "Type": "Digital", "X":1080, "Y":566, "Width":620, "Height":54, "Cmt": "ENG left button"},
{ "Input": "button17", "Type": "Digital", "X":1200, "Y":666, "Width":620, "Height":54, "Cmt": "ENG right button"},
{ "Input": "button18", "Type": "Digital", "X":1316, "Y":1000, "Width":420, "Height":54, "Cmt": "ENG operate left down"},
{ "Input": "button19", "Type": "Digital", "X":1354, "Y":844, "Width":420, "Height":54, "Cmt": "ENG operate right down"},
{ "Input": "button20", "Type": "Digital", "X":1140, "Y":1118, "Width":620, "Height":54, "Cmt": "APU start button"},
{ "Input": "button21", "Type": "Digital", "X":960, "Y":1362, "Width":620, "Height":54, "Cmt": "LDGH silence button"},
{ "Input": "button22", "Type": "Digital", "X":88, "Y":750, "Width":320, "Height":54, "Cmt": "Flaps up"},
{ "Input": "button23", "Type": "Digital", "X":88, "Y":804, "Width":320, "Height":54, "Cmt": "Flaps down"},
{ "Input": "button24", "Type": "Digital", "X":36, "Y":1428, "Width":480, "Height":54, "Cmt": "EAC"},
{ "Input": "button25", "Type": "Digital", "X":218, "Y":1542, "Width":480, "Height":54, "Cmt": "RDR ALT"},
{ "Input": "button26", "Type": "Digital", "X":436, "Y":1646, "Width":480, "Height":54, "Cmt": "Autopilot"},
{ "Input": "button27", "Type": "Digital", "X":1020, "Y":1460, "Width":420, "Height":54, "Cmt": "Autopilot select up"},
{ "Input": "button28", "Type": "Digital", "X":1020, "Y":1514, "Width":420, "Height":54, "Cmt": "Autopilot select down"},
{ "Input": "button31", "Type": "Digital", "X":1316, "Y":946, "Width":420, "Height":54, "Cmt": "ENG operate left up"},
{ "Input": "button32", "Type": "Digital", "X":1354, "Y":790, "Width":420, "Height":54, "Cmt": "ENG operate right up"},
{ "Input": "hat1_up", "Type": "Digital", "X":1964, "Y":1214, "Width":760, "Height":54, "Cmt": "Rear PoV hat up"},
{ "Input": "hat1_right", "Type": "Digital", "X":1964, "Y":1268, "Width":760, "Height":54, "Cmt": "Rear PoV hat right"},
{ "Input": "hat1_down", "Type": "Digital", "X":1964, "Y":1322, "Width":760, "Height":54, "Cmt": "Rear PoV hat down"},
{ "Input": "hat1_left", "Type": "Digital", "X":1964, "Y":1376, "Width":760, "Height":54, "Cmt": "Rear PoV hat left"},
{ "Input": "slider1", "Type": "Analogue", "X":1082, "Y":1252, "Width":520, "Height":54, "Cmt": "Throttle friction control"},
{ "Input": "x", "Type": "Analogue", "X":2870, "Y":1368, "Width":680, "Height":54, "Cmt": "Rear analogue left/right"},
{ "Input": "y", "Type": "Analogue", "X":2870, "Y":1314, "Width":680, "Height":54, "Cmt": "Rear analogue up/down"},
{ "Input": "z", "Type": "Analogue", "X":530, "Y":316, "Width":540, "Height":54, "Cmt": "Throttle"}
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 940 KiB

@ -0,0 +1,49 @@
{
"MapName" : "x45-joystick+throttle",
"MapImage" : "x45.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "Saitek X45 Stick and Throttle",
"DeviceProdGuid": ["{053C06A3-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":4260, "Y":1040, "Width":600, "Height":54, "Cmt": "Stick Trigger button" },
{ "Input": "button2", "Type": "Digital", "X":2900, "Y":810, "Width":600, "Height":54, "Cmt": "Stick Fire button A" },
{ "Input": "button3", "Type": "Digital", "X":4100, "Y":640, "Width":600, "Height":54, "Cmt": "Stick Fire button B" },
{ "Input": "button4", "Type": "Digital", "X":3710, "Y":410, "Width":600, "Height":54, "Cmt": "Stick Launch button" },
{ "Input": "button5", "Type": "Digital", "X":1880, "Y":1410, "Width":600, "Height":54, "Cmt": "Throttle Fire button D" },
{ "Input": "button6", "Type": "Digital", "X":1630, "Y":2400, "Width":600, "Height":54, "Cmt": "Throttle Mouse Fire button" },
{ "Input": "button7", "Type": "Digital", "X":4200, "Y":1370, "Width":600, "Height":54, "Cmt": "Stick Pinkie button" },
{ "Input": "button8", "Type": "Digital", "X":4260, "Y":800, "Width":600, "Height":54, "Cmt": "Stick Fire button C" },
{ "Input": "button9", "Type": "Digital", "X":1630, "Y":1556, "Width":600, "Height":54, "Cmt": "Stick first switch up" },
{ "Input": "button10", "Type": "Digital", "X":1630, "Y":1608, "Width":600, "Height":54, "Cmt": "Stick first switch down" },
{ "Input": "button11", "Type": "Digital", "X":1785, "Y":1716, "Width":600, "Height":54, "Cmt": "Stick second switch up" },
{ "Input": "button12", "Type": "Digital", "X":1785, "Y":1768, "Width":600, "Height":54, "Cmt": "Stick second switch down" },
{ "Input": "button13", "Type": "Digital", "X":2110, "Y":1872, "Width":600, "Height":54, "Cmt": "Stick third switch up" },
{ "Input": "button14", "Type": "Digital", "X":2110, "Y":1924, "Width":600, "Height":54, "Cmt": "Stick third switch down" },
{ "Input": "button15", "Type": "Digital", "X":2940, "Y":370, "Width":600, "Height":54, "Cmt": "Stick PoV2 Up" },
{ "Input": "button16", "Type": "Digital", "X":2940, "Y":450, "Width":600, "Height":54, "Cmt": "Stick PoV2 Right" },
{ "Input": "button17", "Type": "Digital", "X":2940, "Y":540, "Width":600, "Height":54, "Cmt": "Stick PoV2 Down" },
{ "Input": "button18", "Type": "Digital", "X":2940, "Y":630, "Width":600, "Height":54, "Cmt": "Stick PoV2 Left" },
{ "Input": "button19", "Type": "Digital", "X":1630, "Y":530, "Width":600, "Height":54, "Cmt": "Throttle rear hat up" },
{ "Input": "button20", "Type": "Digital", "X":1630, "Y":610, "Width":600, "Height":54, "Cmt": "Throttle rear hat right" },
{ "Input": "button21", "Type": "Digital", "X":1630, "Y":700, "Width":600, "Height":54, "Cmt": "Throttle rear hat down" },
{ "Input": "button22", "Type": "Digital", "X":1630, "Y":790, "Width":600, "Height":54, "Cmt": "Throttle rear hat left" },
{ "Input": "button23", "Type": "Digital", "X":2180, "Y":1930, "Width":600, "Height":54, "Cmt": "Throttle Mouse Hat Up" },
{ "Input": "button24", "Type": "Digital", "X":2180, "Y":2010, "Width":600, "Height":54, "Cmt": "Throttle Mouse Hat Right" },
{ "Input": "button25", "Type": "Digital", "X":2180, "Y":2100, "Width":600, "Height":54, "Cmt": "Throttle Mouse Hat Down" },
{ "Input": "button26", "Type": "Digital", "X":2180, "Y":2190, "Width":600, "Height":54, "Cmt": "Throttle Mouse Hat Left" },
{ "Input": "hat1_up", "Type": "Digital", "X":2810, "Y":1050, "Width":600, "Height":54, "Cmt": "Stick PoV1 hat up" },
{ "Input": "hat1_right", "Type": "Digital", "X":2810, "Y":1130, "Width":600, "Height":54, "Cmt": "Stick PoV1 hat right" },
{ "Input": "hat1_down", "Type": "Digital", "X":2810, "Y":1220, "Width":600, "Height":54, "Cmt": "Stick PoV1 hat down" },
{ "Input": "hat1_left", "Type": "Digital", "X":2810, "Y":1315, "Width":600, "Height":54, "Cmt": "Stick PoV1 hat left" },
{ "Input": "rotx", "Type": "Analogue", "X":1890, "Y":1620, "Width":600, "Height":54, "Cmt": "Throttle bottom rotary" },
{ "Input": "roty", "Type": "Analogue", "X":1940, "Y":1120, "Width":600, "Height":54, "Cmt": "Throttle top rotary" },
{ "Input": "rotz", "Type": "Analogue", "X":730, "Y":880, "Width":600, "Height":54, "Cmt": "Throttle yaw rocker" },
{ "Input": "x", "Type": "Analogue", "X":4210, "Y":2310, "Width":600, "Height":54, "Cmt": "Stick roll" },
{ "Input": "y", "Type": "Analogue", "X":4210, "Y":2400, "Width":600, "Height":54, "Cmt": "Stick pitch" },
{ "Input": "slider1", "Type": "Analogue", "X":140, "Y":1600, "Width":600, "Height":54, "Cmt": "Throttle main slider" }
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 823 KiB

@ -0,0 +1,55 @@
{
"MapName" : "x52-joystick+throttle",
"MapImage" : "x52.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "Saitek X52 Stick and Throttle",
"DeviceProdGuid": ["{075C06A3-0000-0000-0000-504944564944}",
"{025506A3-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":3164, "Y":858, "Width":600, "Height":54, "Cmt": "Stick primary trigger half press" },
{ "Input": "button2", "Type": "Digital", "X":2524, "Y":210, "Width":560, "Height":54, "Cmt": "Stick Safe" },
{ "Input": "button3", "Type": "Digital", "X":3108, "Y":478, "Width":560, "Height":54, "Cmt": "Stick blue button right of Safe" },
{ "Input": "button4", "Type": "Digital", "X":3118, "Y":662, "Width":560, "Height":54, "Cmt": "Stick blue button right of hat" },
{ "Input": "button5", "Type": "Digital", "X":2071, "Y":674, "Width":570, "Height":54, "Cmt": "Stick black button left of hat" },
{ "Input": "button6", "Type": "Digital", "X":3102, "Y":1148, "Width":570, "Height":54, "Cmt": "Stick pinky trigger" },
{ "Input": "button7", "Type": "Digital", "X":1334, "Y":1038, "Width":740, "Height":54, "Cmt": "Throttle blue button" },
{ "Input": "button8", "Type": "Digital", "X":1142, "Y":656, "Width":760, "Height":54, "Cmt": "Throttle top rotary button" },
{ "Input": "button9", "Type": "Digital", "X":1630, "Y":1556, "Width":560, "Height":54, "Cmt": "Stick first switch up" },
{ "Input": "button10", "Type": "Digital", "X":1630, "Y":1608, "Width":560, "Height":54, "Cmt": "Stick first switch down" },
{ "Input": "button11", "Type": "Digital", "X":1785, "Y":1716, "Width":560, "Height":54, "Cmt": "Stick second switch up" },
{ "Input": "button12", "Type": "Digital", "X":1785, "Y":1768, "Width":560, "Height":54, "Cmt": "Stick second switch down" },
{ "Input": "button13", "Type": "Digital", "X":2110, "Y":1872, "Width":560, "Height":54, "Cmt": "Stick third switch up" },
{ "Input": "button14", "Type": "Digital", "X":2110, "Y":1924, "Width":560, "Height":54, "Cmt": "Stick third switch down" },
{ "Input": "button15", "Type": "Digital", "X":3164, "Y":910, "Width":600, "Height":54, "Cmt": "Stick primary trigger full press" },
{ "Input": "button16", "Type": "Digital", "X":2044, "Y":422, "Width":740, "Height":54, "Cmt": "Stick top hat down" },
{ "Input": "button17", "Type": "Digital", "X":2044, "Y":370, "Width":740, "Height":54, "Cmt": "Stick top hat right" },
{ "Input": "button18", "Type": "Digital", "X":2044, "Y":318, "Width":740, "Height":54, "Cmt": "Stick top hat up" },
{ "Input": "button19", "Type": "Digital", "X":2044, "Y":476, "Width":740, "Height":54, "Cmt": "Stick top hat left" },
{ "Input": "button20", "Type": "Digital", "X":254, "Y":330, "Width":750, "Height":54, "Cmt": "Throttle rear hat up" },
{ "Input": "button21", "Type": "Digital", "X":254, "Y":382, "Width":750, "Height":54, "Cmt": "Throttle rear hat right" },
{ "Input": "button22", "Type": "Digital", "X":254, "Y":434, "Width":750, "Height":54, "Cmt": "Throttle rear hat down" },
{ "Input": "button23", "Type": "Digital", "X":254, "Y":486, "Width":750, "Height":54, "Cmt": "Throttle rear hat left" },
{ "Input": "button27", "Type": "Digital", "X":26, "Y":1748, "Width":570, "Height":54, "Cmt": "Throttle bottom left button (RST)" },
{ "Input": "button28", "Type": "Digital", "X":198, "Y":1850, "Width":570, "Height":54, "Cmt": "Throttle bottom middle button" },
{ "Input": "button29", "Type": "Digital", "X":355, "Y":1954, "Width":570, "Height":54, "Cmt": "Throttle bottom right button (FUN)" },
{ "Input": "button30", "Type": "Digital", "X":1498, "Y":1316, "Width":750, "Height":54, "Cmt": "Throttle bottom rotary button" },
{ "Input": "button31", "Type": "Digital", "X":1114, "Y":2014, "Width":620, "Height":54, "Cmt": "Throttle mouse click" },
{ "Input": "button32", "Type": "Digital", "X":124, "Y":752, "Width":650, "Height":54, "Cmt": "Throttle rear wheel click" },
{ "Input": "hat1_up", "Type": "Digital", "X":1878, "Y":786, "Width":740, "Height":54, "Cmt": "PoV hat up" },
{ "Input": "hat1_right", "Type": "Digital", "X":1878, "Y":838, "Width":740, "Height":54, "Cmt": "PoV hat right" },
{ "Input": "hat1_down", "Type": "Digital", "X":1878, "Y":890, "Width":740, "Height":54, "Cmt": "PoV hat down" },
{ "Input": "hat1_left", "Type": "Digital", "X":1878, "Y":942, "Width":740, "Height":54, "Cmt": "PoV hat left" },
{ "Input": "rotx", "Type": "Analogue", "X":1498, "Y":1264, "Width":750, "Height":54, "Cmt": "Throttle bottom rotary" },
{ "Input": "roty", "Type": "Analogue", "X":1142, "Y":604, "Width":740, "Height":54, "Cmt": "Throttle top rotary" },
{ "Input": "rotz", "Type": "Analogue", "X":3074, "Y":1946, "Width":720, "Height":54, "Cmt": "Stick yaw" },
{ "Input": "slider1", "Type": "Analogue", "X":422, "Y":584, "Width":460, "Height":54, "Cmt": "Throttle volume slider" },
{ "Input": "x", "Type": "Analogue", "X":3074, "Y":1894, "Width":720, "Height":54, "Cmt": "Stick roll" },
{ "Input": "y", "Type": "Analogue", "X":3074, "Y":1842, "Width":720, "Height":54, "Cmt": "Stick pitch" },
{ "Input": "z", "Type": "Analogue", "X":102, "Y":1224, "Width":460, "Height":54, "Cmt": "Throttle main slider" },
{ "Input": "slider2", "Type": "Analogue", "X":120, "Y":694, "Width":660, "Height":54, "Cmt": "Throttle rear wheel" }
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 721 KiB

@ -0,0 +1,53 @@
{
"MapName" : "x52pro-joystick+throttle",
"MapImage" : "x52pro.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "Saitek X52 Pro Stick and Throttle",
"DeviceProdGuid": ["{076206A3-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":3164, "Y":824, "Width":652, "Height":54, "Cmt": "Stick primary trigger half press" },
{ "Input": "button2", "Type": "Digital", "X":2404, "Y":214, "Width":792, "Height":54, "Cmt": "Stick Safe" },
{ "Input": "button3", "Type": "Digital", "X":3104, "Y":484, "Width":692, "Height":54, "Cmt": "Stick red button right of Safe" },
{ "Input": "button4", "Type": "Digital", "X":3104, "Y":674, "Width":692, "Height":54, "Cmt": "Stick red button right of hat" },
{ "Input": "button5", "Type": "Digital", "X":1964, "Y":674, "Width":692, "Height":54, "Cmt": "Stick black button left of hat" },
{ "Input": "button6", "Type": "Digital", "X":3092, "Y":1144, "Width":732, "Height":54, "Cmt": "Stick pinky trigger" },
{ "Input": "button7", "Type": "Digital", "X":1364, "Y":1054, "Width":792, "Height":54, "Cmt": "Throttle red button" },
{ "Input": "button8", "Type": "Digital", "X":1144, "Y":660, "Width":772, "Height":54, "Cmt": "Throttle top rotary button" },
{ "Input": "button9", "Type": "Digital", "X":1624, "Y":1554, "Width":572, "Height":54, "Cmt": "Stick first switch up" },
{ "Input": "button10", "Type": "Digital", "X":1624, "Y":1610, "Width":572, "Height":54, "Cmt": "Stick first switch down" },
{ "Input": "button11", "Type": "Digital", "X":1784, "Y":1724, "Width":572, "Height":54, "Cmt": "Stick second switch up" },
{ "Input": "button12", "Type": "Digital", "X":1784, "Y":1780, "Width":572, "Height":54, "Cmt": "Stick second switch down" },
{ "Input": "button13", "Type": "Digital", "X":2084, "Y":1864, "Width":572, "Height":54, "Cmt": "Stick third switch up" },
{ "Input": "button14", "Type": "Digital", "X":2084, "Y":1920, "Width":572, "Height":54, "Cmt": "Stick third switch down" },
{ "Input": "button15", "Type": "Digital", "X":3164, "Y":880, "Width":652, "Height":54, "Cmt": "Stick primary trigger full press" },
{ "Input": "button16", "Type": "Digital", "X":1004, "Y":2016, "Width":932, "Height":54, "Cmt": "Throttle mouse click" },
{ "Input": "button17", "Type": "Digital", "X":104, "Y":700, "Width":732, "Height":54, "Cmt": "Throttle rear wheel down" },
{ "Input": "button18", "Type": "Digital", "X":104, "Y":644, "Width":732, "Height":54, "Cmt": "Throttle rear wheel up" },
{ "Input": "button19", "Type": "Digital", "X":104, "Y":756, "Width":732, "Height":54, "Cmt": "Throttle rear wheel click" },
{ "Input": "button20", "Type": "Digital", "X":1814, "Y":304, "Width":932, "Height":54, "Cmt": "Stick top hat up" },
{ "Input": "button21", "Type": "Digital", "X":1814, "Y":360, "Width":932, "Height":54, "Cmt": "Stick top hat right" },
{ "Input": "button22", "Type": "Digital", "X":1814, "Y":416, "Width":932, "Height":54, "Cmt": "Stick top hat down" },
{ "Input": "button23", "Type": "Digital", "X":1814, "Y":472, "Width":932, "Height":54, "Cmt": "Stick top hat left" },
{ "Input": "button27", "Type": "Digital", "X":244, "Y":284, "Width":972, "Height":54, "Cmt": "Throttle rear hat up" },
{ "Input": "button28", "Type": "Digital", "X":244, "Y":340, "Width":972, "Height":54, "Cmt": "Throttle rear hat right" },
{ "Input": "button29", "Type": "Digital", "X":244, "Y":396, "Width":972, "Height":54, "Cmt": "Throttle rear hat down" },
{ "Input": "button30", "Type": "Digital", "X":244, "Y":452, "Width":972, "Height":54, "Cmt": "Throttle rear hat left" },
{ "Input": "button31", "Type": "Digital", "X":1494, "Y":1320, "Width":772, "Height":54, "Cmt": "Throttle bottom rotary button" },
{ "Input": "button32", "Type": "Digital", "X":44, "Y":1864, "Width":752, "Height":54, "Cmt": "Left-hand MFD button" },
{ "Input": "hat1_up", "Type": "Digital", "X":1694, "Y":774, "Width":932, "Height":54, "Cmt": "PoV hat up" },
{ "Input": "hat1_right", "Type": "Digital", "X":1694, "Y":830, "Width":932, "Height":54, "Cmt": "PoV hat right" },
{ "Input": "hat1_down", "Type": "Digital", "X":1694, "Y":886, "Width":932, "Height":54, "Cmt": "PoV hat down" },
{ "Input": "hat1_left", "Type": "Digital", "X":1694, "Y":942, "Width":932, "Height":54, "Cmt": "PoV hat left" },
{ "Input": "rotx", "Type": "Analogue", "X":1494, "Y":1264, "Width":772, "Height":54, "Cmt": "Throttle bottom rotary" },
{ "Input": "roty", "Type": "Analogue", "X":1144, "Y":604, "Width":772, "Height":54, "Cmt": "Throttle top rotary" },
{ "Input": "rotz", "Type": "Analogue", "X":3034, "Y":1956, "Width":792, "Height":54, "Cmt": "Stick yaw" },
{ "Input": "slider1", "Type": "Analogue", "X":264, "Y":554, "Width":632, "Height":54, "Cmt": "Throttle volume slider" },
{ "Input": "x", "Type": "Analogue", "X":3034, "Y":1900, "Width":792, "Height":54, "Cmt": "Stick roll" },
{ "Input": "y", "Type": "Analogue", "X":3034, "Y":1844, "Width":792, "Height":54, "Cmt": "Stick pitch" },
{ "Input": "z", "Type": "Analogue", "X":84, "Y":1054, "Width":472, "Height":108, "Cmt": "Throttle main slider" }
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 KiB

@ -0,0 +1,34 @@
{
"MapName" : "x55-joystick",
"MapImage" : "x55-joystick.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "Saitek Pro Flight X-55 Rhino Stick",
"DeviceProdGuid": ["{22150738-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X": 397, "Y": 604, "Width": 642, "Height": 108, "Cmt": "Primary trigger" },
{ "Input": "button2", "Type": "Digital", "X": 498, "Y": 224, "Width": 792, "Height": 54, "Cmt": "Top trigger" },
{ "Input": "button3", "Type": "Digital", "X": 1417, "Y": 555, "Width": 692, "Height": 54, "Cmt": "Side trigger" },
{ "Input": "button4", "Type": "Digital", "X": 397, "Y": 744, "Width": 642, "Height": 108, "Cmt": "Secondary trigger" },
{ "Input": "button5", "Type": "Digital", "X": 1377, "Y": 974, "Width": 792, "Height": 54, "Cmt": "Pinky button" },
{ "Input": "button6", "Type": "Digital", "X": 397, "Y": 884, "Width": 642, "Height": 108, "Cmt": "Pinky trigger" },
{ "Input": "button7", "Type": "Digital", "X": 1408, "Y": 224, "Width": 772, "Height": 54, "Cmt": "Witch hat up" },
{ "Input": "button8", "Type": "Digital", "X": 1408, "Y": 280, "Width": 772, "Height": 54, "Cmt": "Witch hat right" },
{ "Input": "button9", "Type": "Digital", "X": 1408, "Y": 336, "Width": 772, "Height": 54, "Cmt": "Witch hat down" },
{ "Input": "button10", "Type": "Digital", "X": 1408, "Y": 393, "Width": 772, "Height": 54, "Cmt": "Witch hat left" },
{ "Input": "button11", "Type": "Digital", "X": 1428, "Y": 724, "Width": 742, "Height": 54, "Cmt": "Castle hat up" },
{ "Input": "button12", "Type": "Digital", "X": 1428, "Y": 781, "Width": 742, "Height": 54, "Cmt": "Castle hat right" },
{ "Input": "button13", "Type": "Digital", "X": 1428, "Y": 837, "Width": 742, "Height": 54, "Cmt": "Castle hat down" },
{ "Input": "button14", "Type": "Digital", "X": 1428, "Y": 893, "Width": 742, "Height": 54, "Cmt": "Castle hat left" },
{ "Input": "hat1_up", "Type": "Digital", "X": 97, "Y": 304, "Width": 1072, "Height": 54, "Cmt": "PoV hat up" },
{ "Input": "hat1_right", "Type": "Digital", "X": 97, "Y": 360, "Width": 1072, "Height": 54, "Cmt": "PoV hat right" },
{ "Input": "hat1_down", "Type": "Digital", "X": 97, "Y": 415, "Width": 1072, "Height": 54, "Cmt": "PoV hat down" },
{ "Input": "hat1_left", "Type": "Digital", "X": 97, "Y": 472, "Width": 1072, "Height": 54, "Cmt": "PoV hat left" },
{ "Input": "y", "Type": "Analogue", "X": 1547, "Y": 1055, "Width": 632, "Height": 54, "Cmt": "Stick Y" },
{ "Input": "x", "Type": "Analogue", "X": 1547, "Y": 1112, "Width": 632, "Height": 54, "Cmt": "Stick X" },
{ "Input": "rotz", "Type": "Analogue", "X": 1547, "Y": 1167, "Width": 632, "Height": 54, "Cmt": "Stick RotZ" }
]
}
]
}

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 813 KiB

@ -0,0 +1,81 @@
{
"MapName" : "x55 Throttle and Joystick",
"MapImage" : "x55-throttle+stick.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "Saitek Pro Flight X-55 Rhino Stick",
"DeviceProdGuid": ["{22150738-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":2044, "Y":604, "Width":642, "Height":108, "Cmt": "Primary trigger" },
{ "Input": "button2", "Type": "Digital", "X":2144, "Y":224, "Width":792, "Height":54, "Cmt": "Top trigger" },
{ "Input": "button3", "Type": "Digital", "X":3064, "Y":554, "Width":692, "Height":54, "Cmt": "Side trigger" },
{ "Input": "button4", "Type": "Digital", "X":2044, "Y":744, "Width":642, "Height":108, "Cmt": "Secondary trigger" },
{ "Input": "button5", "Type": "Digital", "X":3024, "Y":974, "Width":792, "Height":54, "Cmt": "Pinky button" },
{ "Input": "button6", "Type": "Digital", "X":2044, "Y":884, "Width":642, "Height":108, "Cmt": "Pinky trigger" },
{ "Input": "button7", "Type": "Digital", "X":3054, "Y":224, "Width":772, "Height":54, "Cmt": "Witch hat up" },
{ "Input": "button8", "Type": "Digital", "X":3054, "Y":280, "Width":772, "Height":54, "Cmt": "Witch hat right" },
{ "Input": "button9", "Type": "Digital", "X":3054, "Y":336, "Width":772, "Height":54, "Cmt": "Witch hat down" },
{ "Input": "button10", "Type": "Digital", "X":3054, "Y":392, "Width":772, "Height":54, "Cmt": "Witch hat left" },
{ "Input": "button11", "Type": "Digital", "X":3074, "Y":724, "Width":742, "Height":54, "Cmt": "Castle hat up" },
{ "Input": "button12", "Type": "Digital", "X":3074, "Y":780, "Width":742, "Height":54, "Cmt": "Castle hat right" },
{ "Input": "button13", "Type": "Digital", "X":3074, "Y":836, "Width":742, "Height":54, "Cmt": "Castle hat down" },
{ "Input": "button14", "Type": "Digital", "X":3074, "Y":892, "Width":742, "Height":54, "Cmt": "Castle hat left" },
{ "Input": "hat1_up", "Type": "Digital", "X":1744, "Y":304, "Width":1072, "Height":54, "Cmt": "PoV hat up" },
{ "Input": "hat1_right", "Type": "Digital", "X":1744, "Y":360, "Width":1072, "Height":54, "Cmt": "PoV hat right" },
{ "Input": "hat1_down", "Type": "Digital", "X":1744, "Y":416, "Width":1072, "Height":54, "Cmt": "PoV hat down" },
{ "Input": "hat1_left", "Type": "Digital", "X":1744, "Y":472, "Width":1072, "Height":54, "Cmt": "PoV hat left" },
{ "Input": "y", "Type": "Analogue", "X":3194, "Y":1166, "Width":632, "Height":54, "Cmt": "Y-Axis" },
{ "Input": "x", "Type": "Analogue", "X":3194, "Y":1110, "Width":632, "Height":54, "Cmt": "X-Axis" },
{ "Input": "rotz", "Type": "Analogue", "X":3194, "Y":1054, "Width":632, "Height":54, "Cmt": "RotZ-Axis" }
]
},
{
"InputType": "J",
"DeviceName": "Saitek Pro Flight X-55 Rhino Throttle",
"DeviceProdGuid": ["{A2150738-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":44, "Y":604, "Width":852, "Height":54, "Cmt": "E button" },
{ "Input": "button2", "Type": "Digital", "X":1874, "Y":1660, "Width":672, "Height":54, "Cmt": "F push" },
{ "Input": "button3", "Type": "Digital", "X":1534, "Y":1810, "Width":672, "Height":54, "Cmt": "G push" },
{ "Input": "button4", "Type": "Digital", "X":2574, "Y":1694, "Width":892, "Height":54, "Cmt": "H button" },
{ "Input": "button5", "Type": "Digital", "X":2744, "Y":1784, "Width":892, "Height":54, "Cmt": "I button" },
{ "Input": "button6", "Type": "Digital", "X":74, "Y":1604, "Width":572, "Height":54, "Cmt": "Switch 1" },
{ "Input": "button7", "Type": "Digital", "X":74, "Y":1660, "Width":572, "Height":54, "Cmt": "Switch 2" },
{ "Input": "button8", "Type": "Digital", "X":94, "Y":1754, "Width":572, "Height":54, "Cmt": "Switch 3" },
{ "Input": "button9", "Type": "Digital", "X":94, "Y":1810, "Width":572, "Height":54, "Cmt": "Switch 4" },
{ "Input": "button10", "Type": "Digital", "X":764, "Y":1754, "Width":572, "Height":54, "Cmt": "Switch 5" },
{ "Input": "button11", "Type": "Digital", "X":764, "Y":1810, "Width":572, "Height":54, "Cmt": "Switch 6" },
{ "Input": "button12", "Type": "Digital", "X":1104, "Y":1424, "Width":572, "Height":54, "Cmt": "TGL 1 up" },
{ "Input": "button13", "Type": "Digital", "X":1104, "Y":1480, "Width":572, "Height":54, "Cmt": "TGL 1 down" },
{ "Input": "button14", "Type": "Digital", "X":1164, "Y":1284, "Width":572, "Height":54, "Cmt": "TGL 2 up" },
{ "Input": "button15", "Type": "Digital", "X":1164, "Y":1340, "Width":572, "Height":54, "Cmt": "TGL 2 down" },
{ "Input": "button16", "Type": "Digital", "X":1224, "Y":1154, "Width":572, "Height":54, "Cmt": "TGL 3 up" },
{ "Input": "button17", "Type": "Digital", "X":1224, "Y":1210, "Width":572, "Height":54, "Cmt": "TGL 3 down" },
{ "Input": "button18", "Type": "Digital", "X":1244, "Y":1014, "Width":572, "Height":54, "Cmt": "TGL 4 up" },
{ "Input": "button19", "Type": "Digital", "X":1244, "Y":1070, "Width":572, "Height":54, "Cmt": "TGL 4 down" },
{ "Input": "button20", "Type": "Digital", "X":1154, "Y":564, "Width":772, "Height":54, "Cmt": "H3 up" },
{ "Input": "button21", "Type": "Digital", "X":1154, "Y":620, "Width":772, "Height":54, "Cmt": "H3 right" },
{ "Input": "button22", "Type": "Digital", "X":1154, "Y":676, "Width":772, "Height":54, "Cmt": "H3 down" },
{ "Input": "button23", "Type": "Digital", "X":1154, "Y":732, "Width":772, "Height":54, "Cmt": "H3 left" },
{ "Input": "button24", "Type": "Digital", "X":1364, "Y":1924, "Width":772, "Height":54, "Cmt": "H4 up" },
{ "Input": "button25", "Type": "Digital", "X":1364, "Y":1980, "Width":772, "Height":54, "Cmt": "H4 right" },
{ "Input": "button26", "Type": "Digital", "X":1364, "Y":2036, "Width":772, "Height":54, "Cmt": "H4 down" },
{ "Input": "button27", "Type": "Digital", "X":1364, "Y":2092, "Width":772, "Height":54, "Cmt": "H4 left" },
{ "Input": "button28", "Type": "Digital", "X":3124, "Y":2034, "Width":692, "Height":54, "Cmt": "Pinky rocker up" },
{ "Input": "button29", "Type": "Digital", "X":3124, "Y":2090, "Width":692, "Height":54, "Cmt": "Pinky rocker down" },
{ "Input": "button30", "Type": "Digital", "X":3134, "Y":1884, "Width":692, "Height":54, "Cmt": "Pinky spin up" },
{ "Input": "button31", "Type": "Digital", "X":3134, "Y":1940, "Width":692, "Height":54, "Cmt": "Pinky spin down" },
{ "Input": "x", "Type": "Analogue", "X":164, "Y":680, "Width":572, "Height":54, "Cmt": "Throttle" },
{ "Input": "z", "Type": "Analogue", "X":1874, "Y":1604, "Width":672, "Height":54, "Cmt": "F spin" },
{ "Input": "rotx", "Type": "Analogue", "X":1534, "Y":1754, "Width":672, "Height":54, "Cmt": "G spin" },
{ "Input": "roty", "Type": "Analogue", "X":1014, "Y":1574, "Width":692, "Height":54, "Cmt": "RTY2 axis" },
{ "Input": "rotz", "Type": "Analogue", "X":854, "Y":1654, "Width":692, "Height":54, "Cmt": "RTY1 axis" },
{ "Input": "slider2", "Type": "Analogue", "X":1194, "Y":870, "Width":732, "Height":54, "Cmt": "Mouse left/right" },
{ "Input": "slider1", "Type": "Analogue", "X":1194, "Y":814, "Width":732, "Height":54, "Cmt": "Mouse up/down" }
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 542 KiB

@ -0,0 +1,51 @@
{
"MapName" : "x55-throttle",
"MapImage" : "x55-throttle.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "Saitek Pro Flight X-55 Rhino Throttle",
"DeviceProdGuid": ["{A2150738-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":422, "Y":300, "Width":852, "Height":54, "Cmt": "E button" },
{ "Input": "button2", "Type": "Digital", "X":585, "Y":1659, "Width":672, "Height":54, "Cmt": "F push" },
{ "Input": "button3", "Type": "Digital", "X":244, "Y":1810, "Width":672, "Height":54, "Cmt": "G push" },
{ "Input": "button4", "Type": "Digital", "X":1284, "Y":1694, "Width":892, "Height":54, "Cmt": "H button" },
{ "Input": "button5", "Type": "Digital", "X":1453, "Y":1784, "Width":892, "Height":54, "Cmt": "I button" },
{ "Input": "button6", "Type": "Digital", "X":453, "Y":1299, "Width":572, "Height":54, "Cmt": "Switch 1" },
{ "Input": "button7", "Type": "Digital", "X":453, "Y":1355, "Width":572, "Height":54, "Cmt": "Switch 2" },
{ "Input": "button8", "Type": "Digital", "X":472, "Y":1450, "Width":572, "Height":54, "Cmt": "Switch 3" },
{ "Input": "button9", "Type": "Digital", "X":472, "Y":1506, "Width":572, "Height":54, "Cmt": "Switch 4" },
{ "Input": "button10", "Type": "Digital", "X":1143, "Y":1450, "Width":572, "Height":54, "Cmt": "Switch 5" },
{ "Input": "button11", "Type": "Digital", "X":1143, "Y":1506, "Width":572, "Height":54, "Cmt": "Switch 6" },
{ "Input": "button12", "Type": "Digital", "X":1483, "Y":1120, "Width":572, "Height":54, "Cmt": "TGL 1 up" },
{ "Input": "button13", "Type": "Digital", "X":1483, "Y":1176, "Width":572, "Height":54, "Cmt": "TGL 1 down" },
{ "Input": "button14", "Type": "Digital", "X":1542, "Y":979, "Width":572, "Height":54, "Cmt": "TGL 2 up" },
{ "Input": "button15", "Type": "Digital", "X":1542, "Y":1035, "Width":572, "Height":54, "Cmt": "TGL 2 down" },
{ "Input": "button16", "Type": "Digital", "X":1602, "Y":849, "Width":572, "Height":54, "Cmt": "TGL 3 up" },
{ "Input": "button17", "Type": "Digital", "X":1602, "Y":905, "Width":572, "Height":54, "Cmt": "TGL 3 down" },
{ "Input": "button18", "Type": "Digital", "X":1623, "Y":710, "Width":572, "Height":54, "Cmt": "TGL 4 up" },
{ "Input": "button19", "Type": "Digital", "X":1623, "Y":765, "Width":572, "Height":54, "Cmt": "TGL 4 down" },
{ "Input": "button20", "Type": "Digital", "X":1532, "Y":260, "Width":772, "Height":54, "Cmt": "H3 up" },
{ "Input": "button21", "Type": "Digital", "X":1532, "Y":315, "Width":772, "Height":54, "Cmt": "H3 right" },
{ "Input": "button22", "Type": "Digital", "X":1532, "Y":371, "Width":772, "Height":54, "Cmt": "H3 down" },
{ "Input": "button23", "Type": "Digital", "X":1532, "Y":428, "Width":772, "Height":54, "Cmt": "H3 left" },
{ "Input": "button24", "Type": "Digital", "X":74, "Y":1924, "Width":772, "Height":54, "Cmt": "H4 up" },
{ "Input": "button25", "Type": "Digital", "X":73, "Y":1979, "Width":772, "Height":54, "Cmt": "H4 right" },
{ "Input": "button26", "Type": "Digital", "X":73, "Y":2035, "Width":772, "Height":54, "Cmt": "H4 down" },
{ "Input": "button27", "Type": "Digital", "X":73, "Y":2092, "Width":772, "Height":54, "Cmt": "H4 left" },
{ "Input": "button28", "Type": "Digital", "X":1834, "Y":2033, "Width":692, "Height":54, "Cmt": "Pinky rocker up" },
{ "Input": "button29", "Type": "Digital", "X":1834, "Y":2089, "Width":692, "Height":54, "Cmt": "Pinky rocker down" },
{ "Input": "button30", "Type": "Digital", "X":1843, "Y":1884, "Width":692, "Height":54, "Cmt": "Pinky spin up" },
{ "Input": "button31", "Type": "Digital", "X":1843, "Y":1940, "Width":692, "Height":54, "Cmt": "Pinky spin down" },
{ "Input": "x", "Type": "Analogue", "X":542, "Y":376, "Width":572, "Height":54, "Cmt": "Throttle" },
{ "Input": "y", "Type": "Analogue", "X":583, "Y":1604, "Width":672, "Height":54, "Cmt": "F spin" },
{ "Input": "rotx", "Type": "Analogue", "X":244, "Y":1753, "Width":672, "Height":54, "Cmt": "G spin" },
{ "Input": "roty", "Type": "Analogue", "X":1233, "Y":1350, "Width":692, "Height":54, "Cmt": "RTY2 axis" },
{ "Input": "rotz", "Type": "Analogue", "X":1393, "Y":1269, "Width":692, "Height":54, "Cmt": "RTY1 axis" },
{ "Input": "slider2", "Type": "Analogue", "X":1572, "Y":566, "Width":732, "Height":54, "Cmt": "Mouse left/right" },
{ "Input": "slider1", "Type": "Analogue", "X":1572, "Y":510, "Width":732, "Height":54, "Cmt": "Mouse up/down" }
]
}
]
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save