V 2.21 - BETA Build 55 - Updates for SCA 2.2

- fix #40 added Tab entry in Ctrl. context menu
- fix - try to fix Win10 scaling issues (hidden assignment area)
- fix - profile tree color indication also applied when re-reading defaultProfile
- improvement - enumerates up to 12 devices now (though not tested as I don't have 12 ..)
- add - use of SCA 2.2 provided defaultProfile (new location and format)
- add - indication of the used defaultProfile
- add - built in defaultProfile updated to SCA 2.2
- Doc update
pull/104/head v2.21beta
bm98 8 years ago
parent 14c7c8f130
commit 68d72cab6b

@ -190,6 +190,38 @@ namespace SCJMapper_V2
set { this["IgnoreJS8"] = value; }
}
[UserScopedSettingAttribute( )]
[DefaultSettingValueAttribute( "" )]
public String IgnoreJS9
{
get { return ( String )this["IgnoreJS9"]; }
set { this["IgnoreJS9"] = value; }
}
[UserScopedSettingAttribute( )]
[DefaultSettingValueAttribute( "" )]
public String IgnoreJS10
{
get { return ( String )this["IgnoreJS10"]; }
set { this["IgnoreJS10"] = value; }
}
[UserScopedSettingAttribute( )]
[DefaultSettingValueAttribute( "" )]
public String IgnoreJS11
{
get { return ( String )this["IgnoreJS11"]; }
set { this["IgnoreJS11"] = value; }
}
[UserScopedSettingAttribute( )]
[DefaultSettingValueAttribute( "" )]
public String IgnoreJS12
{
get { return ( String )this["IgnoreJS12"]; }
set { this["IgnoreJS12"] = value; }
}
[UserScopedSettingAttribute( )]
[DefaultSettingValueAttribute( "" )]
public String UserSCPath

113
Form1.Designer.cs generated

@ -83,7 +83,6 @@
this.tdiAddMod3 = new System.Windows.Forms.ToolStripMenuItem();
this.tc1 = new System.Windows.Forms.TabControl();
this.tabJS1 = new System.Windows.Forms.TabPage();
this.UC_JoyPanel = new SCJMapper_V2.UC_JoyPanel();
this.panel1 = new System.Windows.Forms.Panel();
this.btClip = new System.Windows.Forms.Button();
this.txRebind = new System.Windows.Forms.TextBox();
@ -118,6 +117,8 @@
this.label2 = new System.Windows.Forms.Label();
this.txFilter = new System.Windows.Forms.TextBox();
this.btClearFilter = new System.Windows.Forms.Button();
this.label3 = new System.Windows.Forms.Label();
this.lblProfileUsed = new System.Windows.Forms.Label();
this.flpExtensions = new System.Windows.Forms.FlowLayoutPanel();
this.cbxInvAimPitch = new System.Windows.Forms.CheckBox();
this.cbxInvViewPitch = new System.Windows.Forms.CheckBox();
@ -141,6 +142,9 @@
this.loadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.tmeK_Tab = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator();
this.UC_JoyPanel = new SCJMapper_V2.UC_JoyPanel();
this.cmCopyPaste.SuspendLayout();
this.panel2.SuspendLayout();
this.cmMouseEntry.SuspendLayout();
@ -177,7 +181,7 @@
this.rtb.Font = new System.Drawing.Font("Lucida Console", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.rtb.Location = new System.Drawing.Point(676, 81);
this.rtb.Name = "rtb";
this.rtb.Size = new System.Drawing.Size(372, 531);
this.rtb.Size = new System.Drawing.Size(372, 561);
this.rtb.TabIndex = 21;
this.rtb.Text = "";
this.rtb.WordWrap = false;
@ -265,6 +269,7 @@
//
// panel2
//
this.panel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.panel2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panel2.Controls.Add(this.btMakeMod);
this.panel2.Controls.Add(this.btJsKbd);
@ -278,7 +283,7 @@
this.panel2.Controls.Add(this.lblAction);
this.panel2.Controls.Add(this.btAssign);
this.panel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel2.Location = new System.Drawing.Point(3, 358);
this.panel2.Location = new System.Drawing.Point(3, 379);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(289, 168);
this.panel2.TabIndex = 17;
@ -346,6 +351,8 @@
// cmMouseEntry
//
this.cmMouseEntry.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.tmeK_Tab,
this.toolStripSeparator7,
this.tmeXAxis,
this.tmeYAxis,
this.toolStripSeparator3,
@ -353,7 +360,7 @@
this.tmeWDown,
this.toolStripSeparator4});
this.cmMouseEntry.Name = "cmMouseEntry";
this.cmMouseEntry.Size = new System.Drawing.Size(172, 104);
this.cmMouseEntry.Size = new System.Drawing.Size(172, 154);
this.cmMouseEntry.Opening += new System.ComponentModel.CancelEventHandler(this.cmMouseEntry_Opening);
//
// tmeXAxis
@ -500,7 +507,7 @@
this.tdiAddMod2,
this.tdiAddMod3});
this.cmAddDel.Name = "cmAddDel";
this.cmAddDel.Size = new System.Drawing.Size(221, 429);
this.cmAddDel.Size = new System.Drawing.Size(221, 407);
this.cmAddDel.Closed += new System.Windows.Forms.ToolStripDropDownClosedEventHandler(this.cmAddDel_Closed);
this.cmAddDel.Opening += new System.ComponentModel.CancelEventHandler(this.cmAddDel_Opening);
//
@ -615,7 +622,7 @@
this.tc1.Name = "tc1";
this.tc1.SelectedIndex = 0;
this.tc1.ShowToolTips = true;
this.tc1.Size = new System.Drawing.Size(289, 349);
this.tc1.Size = new System.Drawing.Size(289, 370);
this.tc1.TabIndex = 15;
this.tc1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.tc1_DrawItem);
this.tc1.Selected += new System.Windows.Forms.TabControlEventHandler(this.tc1_Selected);
@ -626,19 +633,10 @@
this.tabJS1.Location = new System.Drawing.Point(4, 24);
this.tabJS1.Name = "tabJS1";
this.tabJS1.Padding = new System.Windows.Forms.Padding(3);
this.tabJS1.Size = new System.Drawing.Size(281, 321);
this.tabJS1.Size = new System.Drawing.Size(281, 342);
this.tabJS1.TabIndex = 0;
this.tabJS1.Text = "Joystick 1";
//
// UC_JoyPanel
//
this.UC_JoyPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.UC_JoyPanel.JsAssignment = 0;
this.UC_JoyPanel.Location = new System.Drawing.Point(3, 3);
this.UC_JoyPanel.Name = "UC_JoyPanel";
this.UC_JoyPanel.Size = new System.Drawing.Size(275, 315);
this.UC_JoyPanel.TabIndex = 0;
//
// panel1
//
this.tlpanel.SetColumnSpan(this.panel1, 3);
@ -763,7 +761,7 @@
this.tlpanel.RowCount = 5;
this.tlpanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 75F));
this.tlpanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tlpanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 155F));
this.tlpanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 125F));
this.tlpanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 84F));
this.tlpanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 35F));
this.tlpanel.Size = new System.Drawing.Size(1054, 892);
@ -771,13 +769,14 @@
//
// flowLayoutPanel1
//
this.flowLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.flowLayoutPanel1.Controls.Add(this.tc1);
this.flowLayoutPanel1.Controls.Add(this.panel2);
this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;
this.flowLayoutPanel1.Location = new System.Drawing.Point(376, 81);
this.flowLayoutPanel1.Name = "flowLayoutPanel1";
this.flowLayoutPanel1.Size = new System.Drawing.Size(294, 531);
this.flowLayoutPanel1.Size = new System.Drawing.Size(294, 561);
this.flowLayoutPanel1.TabIndex = 22;
//
// tableLayoutPanel1
@ -785,22 +784,22 @@
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel1.Controls.Add(this.btDump, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.btGrab, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.btDump, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.btDumpList, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.btDumpLog, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.btJSTuning, 0, 4);
this.tableLayoutPanel1.Controls.Add(this.btJSTuning, 0, 3);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.GrowStyle = System.Windows.Forms.TableLayoutPanelGrowStyle.FixedSize;
this.tableLayoutPanel1.Location = new System.Drawing.Point(376, 618);
this.tableLayoutPanel1.Location = new System.Drawing.Point(376, 648);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 5;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
this.tableLayoutPanel1.RowCount = 4;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(294, 149);
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(294, 119);
this.tableLayoutPanel1.TabIndex = 23;
//
// btDumpLog
@ -815,7 +814,7 @@
//
// btJSTuning
//
this.btJSTuning.Location = new System.Drawing.Point(3, 123);
this.btJSTuning.Location = new System.Drawing.Point(3, 93);
this.btJSTuning.Name = "btJSTuning";
this.btJSTuning.Size = new System.Drawing.Size(120, 23);
this.btJSTuning.TabIndex = 17;
@ -946,6 +945,8 @@
this.flowLayoutPanel2.Controls.Add(this.label2);
this.flowLayoutPanel2.Controls.Add(this.txFilter);
this.flowLayoutPanel2.Controls.Add(this.btClearFilter);
this.flowLayoutPanel2.Controls.Add(this.label3);
this.flowLayoutPanel2.Controls.Add(this.lblProfileUsed);
this.flowLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.flowLayoutPanel2.Location = new System.Drawing.Point(6, 773);
this.flowLayoutPanel2.Name = "flowLayoutPanel2";
@ -1021,7 +1022,7 @@
this.label2.Size = new System.Drawing.Size(83, 24);
this.label2.TabIndex = 27;
this.label2.Text = "Action Filter:";
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// txFilter
//
@ -1043,6 +1044,28 @@
this.btClearFilter.UseVisualStyleBackColor = true;
this.btClearFilter.Click += new System.EventHandler(this.btClearFilter_Click);
//
// label3
//
this.label3.Font = new System.Drawing.Font("Segoe UI", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label3.Location = new System.Drawing.Point(3, 56);
this.label3.Margin = new System.Windows.Forms.Padding(3);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(39, 19);
this.label3.TabIndex = 30;
this.label3.Text = "Profile:";
this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// lblProfileUsed
//
this.lblProfileUsed.Font = new System.Drawing.Font("Segoe UI", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblProfileUsed.Location = new System.Drawing.Point(48, 56);
this.lblProfileUsed.Margin = new System.Windows.Forms.Padding(3);
this.lblProfileUsed.Name = "lblProfileUsed";
this.lblProfileUsed.Size = new System.Drawing.Size(302, 19);
this.lblProfileUsed.TabIndex = 29;
this.lblProfileUsed.Text = "...";
this.lblProfileUsed.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// flpExtensions
//
this.flpExtensions.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
@ -1056,9 +1079,9 @@
this.flpExtensions.Controls.Add(this.cbxInvStrafeLon);
this.flpExtensions.Dock = System.Windows.Forms.DockStyle.Fill;
this.flpExtensions.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;
this.flpExtensions.Location = new System.Drawing.Point(676, 618);
this.flpExtensions.Location = new System.Drawing.Point(676, 648);
this.flpExtensions.Name = "flpExtensions";
this.flpExtensions.Size = new System.Drawing.Size(372, 149);
this.flpExtensions.Size = new System.Drawing.Size(372, 119);
this.flpExtensions.TabIndex = 27;
//
// cbxInvAimPitch
@ -1103,7 +1126,7 @@
//
// cbxInvThrottle
//
this.cbxInvThrottle.Location = new System.Drawing.Point(3, 99);
this.cbxInvThrottle.Location = new System.Drawing.Point(177, 3);
this.cbxInvThrottle.Name = "cbxInvThrottle";
this.cbxInvThrottle.Size = new System.Drawing.Size(168, 18);
this.cbxInvThrottle.TabIndex = 0;
@ -1113,7 +1136,7 @@
//
// cbxInvStrafeVert
//
this.cbxInvStrafeVert.Location = new System.Drawing.Point(3, 123);
this.cbxInvStrafeVert.Location = new System.Drawing.Point(177, 27);
this.cbxInvStrafeVert.Name = "cbxInvStrafeVert";
this.cbxInvStrafeVert.Size = new System.Drawing.Size(168, 18);
this.cbxInvStrafeVert.TabIndex = 0;
@ -1123,7 +1146,7 @@
//
// cbxInvStrafeLat
//
this.cbxInvStrafeLat.Location = new System.Drawing.Point(177, 3);
this.cbxInvStrafeLat.Location = new System.Drawing.Point(177, 51);
this.cbxInvStrafeLat.Name = "cbxInvStrafeLat";
this.cbxInvStrafeLat.Size = new System.Drawing.Size(168, 18);
this.cbxInvStrafeLat.TabIndex = 0;
@ -1133,7 +1156,7 @@
//
// cbxInvStrafeLon
//
this.cbxInvStrafeLon.Location = new System.Drawing.Point(177, 27);
this.cbxInvStrafeLon.Location = new System.Drawing.Point(177, 75);
this.cbxInvStrafeLon.Name = "cbxInvStrafeLon";
this.cbxInvStrafeLon.Size = new System.Drawing.Size(168, 18);
this.cbxInvStrafeLon.TabIndex = 0;
@ -1275,6 +1298,28 @@
this.statusStrip1.TabIndex = 26;
this.statusStrip1.Text = "statusStrip1";
//
// tmeK_Tab
//
this.tmeK_Tab.Name = "tmeK_Tab";
this.tmeK_Tab.Size = new System.Drawing.Size(171, 22);
this.tmeK_Tab.Tag = "K_Tab";
this.tmeK_Tab.Text = "Kbd - TAB";
this.tmeK_Tab.Click += new System.EventHandler(this.tmeItem_Click);
//
// toolStripSeparator7
//
this.toolStripSeparator7.Name = "toolStripSeparator7";
this.toolStripSeparator7.Size = new System.Drawing.Size(168, 6);
//
// UC_JoyPanel
//
this.UC_JoyPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.UC_JoyPanel.JsAssignment = 0;
this.UC_JoyPanel.Location = new System.Drawing.Point(3, 3);
this.UC_JoyPanel.Name = "UC_JoyPanel";
this.UC_JoyPanel.Size = new System.Drawing.Size(275, 336);
this.UC_JoyPanel.TabIndex = 0;
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@ -1426,6 +1471,10 @@
private System.Windows.Forms.ToolStripComboBox tdiCbxActivation;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator6;
private System.Windows.Forms.ToolStripTextBox tdiTxDefActivationMode;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label lblProfileUsed;
private System.Windows.Forms.ToolStripMenuItem tmeK_Tab;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator7;
}
}

@ -396,6 +396,8 @@ namespace SCJMapper_V2
m_AT.DefineShowOptions( cbxShowJoystick.Checked, cbxShowGamepad.Checked, cbxShowKeyboard.Checked, cbxShowMouse.Checked, cbxShowMappedOnly.Checked );
// Init with default profile filepath
m_AT.LoadProfileTree( SCDefaultProfile.DefaultProfileName, addDefaultBinding );
lblProfileUsed.Text = SCDefaultProfile.UsedDefProfile; // SCA 2.2 show used profile
// provide an array of checkboxes to Options (all is handled there)
List<CheckBox> inversions = new List<CheckBox>( );
inversions.Add( cbxInvAimPitch ); inversions.Add( cbxInvViewPitch );
@ -650,6 +652,7 @@ namespace SCJMapper_V2
}
JoystickCls.ReassignJsColor( newL );
m_AT.DefineShowOptions( cbxShowJoystick.Checked, cbxShowGamepad.Checked, cbxShowKeyboard.Checked, cbxShowMouse.Checked, cbxShowMappedOnly.Checked );
m_AT.ReloadTreeView( ); // finally reload things into the tree
btDump.BackColor = btClear.BackColor; btDump.UseVisualStyleBackColor = btClear.UseVisualStyleBackColor; // neutral again
@ -1446,6 +1449,7 @@ namespace SCJMapper_V2
{
m_keyIn = ( !m_keyIn );
if ( m_keyIn ) {
cbxThrottle.Checked = false; cbxThrottle.Enabled = false; // must be disabled..
if ( m_Keyboard == null ) {
m_keyIn = false;
btJsKbd.ImageKey = "J";
@ -1525,13 +1529,15 @@ namespace SCJMapper_V2
}
// processes all mouse context menue item clicks
// processes all mouse context menu and some unreachable KBD item clicks
private void tmeItem_Click( object sender, EventArgs e )
{
ToolStripMenuItem ts = (ToolStripMenuItem)sender;
if ( String.IsNullOrEmpty( ( string )ts.Tag ) ) return;
String item = "";
String device = MouseCls.DeviceClass;
int btNum = 0;
if ( int.TryParse( ( string )ts.Tag, out btNum ) ) {
// got a button (most likely..)
@ -1545,18 +1551,29 @@ namespace SCJMapper_V2
item = "mwheel_up";
else if ( ( string )ts.Tag == "D" )
item = "mwheel_down";
else if ( ( string )ts.Tag == "K_Tab" ) {
item = "tab";
device = KeyboardCls.DeviceClass;
}
String ctrl = "";
if ( m_Keyboard == null ) {
// no keyboard = no modifier
ctrl = MouseCls.MakeCtrl( item, "" ); // show last handled JS control
// have to handle the two devices
if ( MouseCls.IsDeviceClass( device ) ) {
if ( m_Keyboard == null ) {
// no keyboard = no modifier
ctrl = MouseCls.MakeCtrl( item, "" ); // show last handled JS control
}
else {
UpdateModifiers( );
ctrl = MouseCls.MakeCtrl( item, m_persistentMods ); // show last handled JS control
}
m_mouseIn = true; // for this one only
}
else {
else if ( KeyboardCls.IsDeviceClass( device ) ) {
UpdateModifiers( );
ctrl = MouseCls.MakeCtrl( item, m_persistentMods ); // show last handled JS control
ctrl = KeyboardCls.MakeCtrl( item, m_persistentMods ); // show last handled JS control
}
m_mouseIn = true; // for this one
lblLastJ.Text = ctrl;
}

@ -127,77 +127,77 @@
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAA8
EAAAAk1TRnQBSQFMAgEBCQEAAdABDwHQAQ8BEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAATADAAEBAQABCAYAAQwYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wQABEgBDwgSMwABSAJP
AUgBbQPsA/QBvAESMAADkQFIAVYBTwFIA0kB7AP/AbwBEjAAAUgDTwJWAk8BTgFIAe0D/wHwARIwAAFI
A1cDVgJPAUgB9wP/AfABEjAAAUgEVwFWAlcBVgFIAe8D/wHwARIwAAORAUgCVwFIA3EBvAP/AfEBEjMA
AUgCVwFIAfED8gP/AfEBEjMAAUgCTwFIAfQG/wHyARIzAAEUAbsCCAf/AfMBEjMAARIB9Ab/AfQB8QG8
Ae8BEjMAARIB9AX/AfQBBwPyARIzAAESAfQF/wHxAbwC/wESAfEzAAESBv8CvAH/ARIB8TQAARIG/wHv
AbwBEgHxNQAJEgHxNwAB/zAAAXQFRgHyBgAB8wH3AXQB7QGLAf8JAAH/AfQLAAEHFQABRgclAfIFAAG7
AU0CUgFMAZEB/wgAAkMBFQkAAUMBFQFDAgAB8AsAAfAEAAFGCSUB8gMAAfQBdAGTAfACCQG7AbQIAAFD
AhUIAAHyAUMBFQFDAQACBwHtCAAB/wGSAbwB7wIAAUYCJQH/AUwDJQIaAiUBGwIAAfABTQH0AvMBGQHw
AQkBkAYAAQcBQwEVARMBQwH0BQABBwEVARQBFQFDAQAB9wG8Ae0JAAH3AfABkgEAAXQCJQH2Av8BTAEl
AfYC/wMlAgAB8gGaA/8B9AHzAfIB8AH/BQAB9AFDARUB6gH5Ag8DHwFDARQBHwEUARUBQwH/Ae0B8AHs
AeoBbQHvAwAB7wEOAewB7wHwAewBAAFGAiUBRgP/AfYD/wMlAgAH/wH0AfMBuwYAAUMBbQHqAUQCEAMg
AQ4BbQEUAhABEQEAAewBvAH3AeoB6wESAewBBwHsARIB6wFtAgcB6wEAAUYDKwFMBf8EKwMAAbsG/wG0
AYsGAAFDARUBEgEgAQ4BDwEfAiACFQERARQBEAFDAQABbQLsAe0BFAFtAZIB7AGSAW0B6gHtAewB7QEO
AQABRgRMAfYD/wF0BEwDAAG7A/8BuwGRAfcBvAGQBgABQwHsARQBDwIfAQABDgEPAQEBHgFEAUMBEAER
AgAB9wHvAesC7wHtAZIB7QHvAfcBkQLvAgABRgNMAfYF/wF0A0wEAAG7Af8BuwG0AfIBuwG8AYsGAAG8
ARQBDgEQAUMBRQEeAQEBQwEeAW8BDgIQAwAC7AG8AewBBwG8AW0CvAGNAbwBFQG8AgABRgJMARoD/wFM
A/8DTAQAAf8BvAL0ArQBkAH/BwABQwEQAW0BFQEBAREBFQEOAR4BCwEfAg4DAAHyAfMB7AHyBfQB8gES
AfIB8wIAAfMBUwFMAZoC/wNMAv8CTAFNBQAB9AG7AfMBtAGQCQABFQIRAR4BAAcOBQABvALwBQAC8AG8
AREDAAHzAVMKTQoAAfMB/wEAAfQBuwHwBQAB7AEQAQ8BFQMAAUMCDwH0BQABEQcAAf8BAAETBQAB8wlT
DAABvAG7Af8CAAGRJQAB8wdTEgABu3EAIP8HAAFDAQAB8hYAAf8O8QHwBv8B9AMoBv8FAAEOAZEBrgKR
AeoB/wcAC/8CAAH/AfEDawGLAZEBiwSKAUkBSgGRAfEG/wEoAykBKAX/BAABQwGaAXoBUgGRAbUBEgHx
BgAB9wEHAbwCBwLvAwcB8AHyAQcBAAH/AfECBgGLAZABuwWLAlABawHxBv8BUAQpASgE/wMAAQ8BBwGR
AnMBkQG1AbQBQwH0BAAB/wG8Ae8DvAMHAbwBBwHwAfIB8QEAAf8B8QIGAYsBkAG7BJABbAFQAVEBawHx
B/8FUAFzA/8BAAEUAVIB8wK8AQcB9wGRArQBDgH0BAAB/wG8Ae8D8AK8AvABvAHxAfIB8AEAAf8B8QKL
AZABswG7ASkBswFxA1ABkAFrAfEC/wFzBSgFUAFzAv8CAAEaAfQB9wESAUMBEQG7AZEBegHsAf8C8QHz
AQAB/wHvAfcBvAbwAbwC8QG8AQAB/wHyA5ABswG7ArMDUQEpAbMBawHyAf8NUAGZAf8CAAEOAe8BEwHq
ARUBDwGRAQ8BDgXxAQAB/wHtAbwJ8gHwAQcBAAH/AfIEswG6AYsBKQR4AVEBawHyAf8OUAH/BAABbQER
AUMBEAEVAfEC/wH0Av8CAAH/AfcB8QjyAfEB8AG8AQAB/wHyBLMBugG7ASgCeAFQAXgBKAFrAfIB/wEp
DFABKAH/BAABuwG0AZEBbQkAAf8BkgHxAfIG8wHyAvEB8AEAAf8B8wSzAbkBugHcAbQBSQJQAUkBawHz
Av8BUAV4AVcEUQEpAv8DAAHzAQABkQETCwABkgHxAfIC8wEHAZIC8wHyAfEB8gHzAQAB/wHzBrkBugHb
A9wB2wFrAfMH/wEoBFcBUAP/AwAB8AEOAewBFQsAAe0B8QHyAvMB7QHvAvMB8gHxAfIB/wEAAf8B8wza
AYsB8wb/AZkEeAFXBP8BAAHxAQABBwHtAewBrgHyCgABBwLyAvMBvAPzAfIB8QHyAgAB/w/zBv8BKQR4
Bf8BAAFuAXkBvAH3ARMB8AwAAvIG8wHyAfEB9AIAAf8I8wHyAfcB8gH3AfIB9wHzBv8BHAN4Bv8B7QHr
AbwC7w4AAvEG8gLxAwAB/wHzDf8B7wf/AZkBUAj/ARMB8AHqHAAg/wIAAfMB9wH/GwABQgFNAT4HAAE+
AwABKAMAAUADAAEwAwABAQEAAQEFAAGAAQEWAAP/AQAB4AcAAeAvAAHgBwAB4AcAAeAHAAHgBwAB4AcA
AeAHAAHgAQEGAAHgAQMGAAHgAQcGAAH3Bf8B+AEPAcAB/wGfAf0C/wHwAQcBwAF/AY8B+AHfAf0B4AED
AYABfwGPAfABjwHwAcABAQGAAT8BAwHgAQcB8AGAAQEBgAEfAwACgAEBAYABHwGAAQABgAEAAYABAQHA
AR8BgAEAAYABAAGAAQEBwAEfAYABAAGAAQABgAEBAeABHwGAAQEBgAEAAYABAQHgAR8BwAEBAcABAQGA
AQEB8AF/AcABAQHDAeEBwAEDAf8BIwHgAQMB5wHjAeABBwH/AY0E/wHwAQ8B/wH9Dv8EAAH8AT8C/wQA
AfgBDwHgAQMEAAHwAQ8BwAEBBAABwAEHAYABAQQAAYABBwGAAQEEAAGAAQABgAEBBAABwAEAAYABAQQA
AeABAQGAAQEEAAHgAf8BgAEBBAAB4AH/AcABAQQAAeEB/wHAAQEEAAGAAf8BwAEDBAABgQH/AeABAwQA
AQMB/wHgAQcEAAEHA/8EAAHHA/8L
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAA0
EAAAAk1TRnQBSQFMAgEBCQEABRABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMAAUADAAEw
AwABAQEAAQgGAAEMGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEAAfABygGm
AQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEAAYABfAH/
AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFmAwABmQMA
AcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJmAgABZgGZAgABZgHM
AgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEzAgABzAFmAgABzAGZ
AgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEAAWYBAAEzAQABmQEA
ATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/AQABMwFmAgABMwFm
ATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEAATMBmQFmAQABMwKZ
AQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEAATMCzAEAATMBzAH/
AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEAATMBAAFmAQABZgEA
AWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEzAZkBAAFmATMBzAEA
AWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEAAWYBmQFmAQABZgKZ
AQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFmAcwB/wEAAWYB/wIA
AWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEzAZkBAAGZAQABmQEA
AZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIAAZkBZgEzAQABmQEz
AWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHMAQACmQH/AQABmQHM
AgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZAf8BMwEAAZkBzAFm
AQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEAAZkBAAHMAQABzAEA
AZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFmAgABzAFmATMBAAGZ
AmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFmAQABzAKZAQABzAGZ
AcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/AgABzAH/ATMBAAGZ
Af8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEAAZkBAAHMATMCAAH/
AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEzAQABzAJmAQAB/wFm
AZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEAAf8BmQHMAQAB/wGZ
Af8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEAAv8BMwEAAcwB/wFm
AQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEAAv8BZgEAASEBAAGl
AQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4AQAB8AH7Af8BAAGk
AqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA/8EAARIAQ8IEjMAAUgCTwFIAW0D7AP0
AbwBEjAAA5EBSAFWAU8BSANJAewD/wG8ARIwAAFIA08CVgJPAU4BSAHtA/8B8AESMAABSANXA1YCTwFI
AfcD/wHwARIwAAFIBFcBVgJXAVYBSAHvA/8B8AESMAADkQFIAlcBSANxAbwD/wHxARIzAAFIAlcBSAHx
A/ID/wHxARIzAAFIAk8BSAH0Bv8B8gESMwABFAG7AggH/wHzARIzAAESAfQG/wH0AfEBvAHvARIzAAES
AfQF/wH0AQcD8gESMwABEgH0Bf8B8QG8Av8BEgHxMwABEgb/ArwB/wESAfE0AAESBv8B7wG8ARIB8TUA
CRIB8TcAAf8wAAF0BUYB8gYAAfMB9wF0Ae0BiwH/CQAB/wH0CwABBxUAAUYHJQHyBQABuwFNAlIBTAGR
Af8IAAJDARUJAAFDARUBQwIAAfALAAHwBAABRgklAfIDAAH0AXQBkwHwAgkBuwG0CAABQwIVCAAB8gFD
ARUBQwEAAgcB7QgAAf8BkgG8Ae8CAAFGAiUB/wFMAyUCGgIlARsCAAHwAU0B9ALzARkB8AEJAZAGAAEH
AUMBFQETAUMB9AUAAQcBFQEUARUBQwEAAfcBvAHtCQAB9wHwAZIBAAF0AiUB9gL/AUwBJQH2Av8DJQIA
AfIBmgP/AfQB8wHyAfAB/wUAAfQBQwEVAeoB+QIPAx8BQwEUAR8BFAEVAUMB/wHtAfAB7AHqAW0B7wMA
Ae8BDgHsAe8B8AHsAQABRgIlAUYD/wH2A/8DJQIAB/8B9AHzAbsGAAFDAW0B6gFEAhADIAEOAW0BFAIQ
AREBAAHsAbwB9wHqAesBEgHsAQcB7AESAesBbQIHAesBAAFGAysBTAX/BCsDAAG7Bv8BtAGLBgABQwEV
ARIBIAEOAQ8BHwIgAhUBEQEUARABQwEAAW0C7AHtARQBbQGSAewBkgFtAeoB7QHsAe0BDgEAAUYETAH2
A/8BdARMAwABuwP/AbsBkQH3AbwBkAYAAUMB7AEUAQ8CHwEAAQ4BDwEBAR4BRAFDARABEQIAAfcB7wHr
Au8B7QGSAe0B7wH3AZEC7wIAAUYDTAH2Bf8BdANMBAABuwH/AbsBtAHyAbsBvAGLBgABvAEUAQ4BEAFD
AUUBHgEBAUMBHgFvAQ4CEAMAAuwBvAHsAQcBvAFtArwBjQG8ARUBvAIAAUYCTAEaA/8BTAP/A0wEAAH/
AbwC9AK0AZAB/wcAAUMBEAFtARUBAQERARUBDgEeAQsBHwIOAwAB8gHzAewB8gX0AfIBEgHyAfMCAAHz
AVMBTAGaAv8DTAL/AkwBTQUAAfQBuwHzAbQBkAkAARUCEQEeAQAHDgUAAbwC8AUAAvABvAERAwAB8wFT
Ck0KAAHzAf8BAAH0AbsB8AUAAewBEAEPARUDAAFDAg8B9AUAAREHAAH/AQABEwUAAfMJUwwAAbwBuwH/
AgABkSUAAfMHUxIAAbtxACD/BwABQwEAAfIWAAH/DvEB8Ab/AfQDKAb/BQABDgGRAa4CkQHqAf8HAAv/
AgAB/wHxA2sBiwGRAYsEigFJAUoBkQHxBv8BKAMpASgF/wQAAUMBmgF6AVIBkQG1ARIB8QYAAfcBBwG8
AgcC7wMHAfAB8gEHAQAB/wHxAgYBiwGQAbsFiwJQAWsB8Qb/AVAEKQEoBP8DAAEPAQcBkQJzAZEBtQG0
AUMB9AQAAf8BvAHvA7wDBwG8AQcB8AHyAfEBAAH/AfECBgGLAZABuwSQAWwBUAFRAWsB8Qf/BVABcwP/
AQABFAFSAfMCvAEHAfcBkQK0AQ4B9AQAAf8BvAHvA/ACvALwAbwB8QHyAfABAAH/AfECiwGQAbMBuwEp
AbMBcQNQAZABawHxAv8BcwUoBVABcwL/AgABGgH0AfcBEgFDAREBuwGRAXoB7AH/AvEB8wEAAf8B7wH3
AbwG8AG8AvEBvAEAAf8B8gOQAbMBuwKzA1EBKQGzAWsB8gH/DVABmQH/AgABDgHvARMB6gEVAQ8BkQEP
AQ4F8QEAAf8B7QG8CfIB8AEHAQAB/wHyBLMBugGLASkEeAFRAWsB8gH/DlAB/wQAAW0BEQFDARABFQHx
Av8B9AL/AgAB/wH3AfEI8gHxAfABvAEAAf8B8gSzAboBuwEoAngBUAF4ASgBawHyAf8BKQxQASgB/wQA
AbsBtAGRAW0JAAH/AZIB8QHyBvMB8gLxAfABAAH/AfMEswG5AboB3AG0AUkCUAFJAWsB8wL/AVAFeAFX
BFEBKQL/AwAB8wEAAZEBEwsAAZIB8QHyAvMBBwGSAvMB8gHxAfIB8wEAAf8B8wa5AboB2wPcAdsBawHz
B/8BKARXAVAD/wMAAfABDgHsARULAAHtAfEB8gLzAe0B7wLzAfIB8QHyAf8BAAH/AfMM2gGLAfMG/wGZ
BHgBVwT/AQAB8QEAAQcB7QHsAa4B8goAAQcC8gLzAbwD8wHyAfEB8gIAAf8P8wb/ASkEeAX/AQABbgF5
AbwB9wETAfAMAALyBvMB8gHxAfQCAAH/CPMB8gH3AfIB9wHyAfcB8wb/ARwDeAb/Ae0B6wG8Au8OAALx
BvIC8QMAAf8B8w3/Ae8H/wGZAVAI/wETAfAB6hwAIP8CAAHzAfcB/xsAAUIBTQE+BwABPgMAASgDAAFA
AwABMAMAAQEBAAEBBQABgAEBFgAD/wEAAeAHAAHgLwAB4AcAAeAHAAHgBwAB4AcAAeAHAAHgBwAB4AEB
BgAB4AEDBgAB4AEHBgAB9wX/AfgBDwHAAf8BnwH9Av8B8AEHAcABfwGPAfgB3wH9AeABAwGAAX8BjwHw
AY8B8AHAAQEBgAE/AQMB4AEHAfABgAEBAYABHwMAAoABAQGAAR8BgAEAAYABAAGAAQEBwAEfAYABAAGA
AQABgAEBAcABHwGAAQABgAEAAYABAQHgAR8BgAEBAYABAAGAAQEB4AEfAcABAQHAAQEBgAEBAfABfwHA
AQEBwwHhAcABAwH/ASMB4AEDAecB4wHgAQcB/wGNBP8B8AEPAf8B/Q7/BAAB/AE/Av8EAAH4AQ8B4AED
BAAB8AEPAcABAQQAAcABBwGAAQEEAAGAAQcBgAEBBAABgAEAAYABAQQAAcABAAGAAQEEAAHgAQEBgAEB
BAAB4AH/AYABAQQAAeAB/wHAAQEEAAHhAf8BwAEBBAABgAH/AcABAwQAAYEB/wHgAQMEAAEDAf8B4AEH
BAABBwP/BAABxwP/Cw==
</value>
</data>
<metadata name="cmMouseEntry.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">

@ -50,6 +50,14 @@
this.txJS8 = new System.Windows.Forms.TextBox();
this.fbDlg = new System.Windows.Forms.FolderBrowserDialog();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.txJS11 = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.txJS12 = new System.Windows.Forms.TextBox();
this.label11 = new System.Windows.Forms.Label();
this.label12 = new System.Windows.Forms.Label();
this.txJS10 = new System.Windows.Forms.TextBox();
this.label13 = new System.Windows.Forms.Label();
this.txJS9 = new System.Windows.Forms.TextBox();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.groupBox3 = new System.Windows.Forms.GroupBox();
this.chkLbActionMaps = new System.Windows.Forms.CheckedListBox();
@ -104,7 +112,7 @@
//
this.txJS1.Location = new System.Drawing.Point(66, 46);
this.txJS1.Name = "txJS1";
this.txJS1.Size = new System.Drawing.Size(440, 22);
this.txJS1.Size = new System.Drawing.Size(199, 22);
this.txJS1.TabIndex = 6;
this.txJS1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txJS1_KeyDown);
this.txJS1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txJS1_KeyPress);
@ -131,7 +139,7 @@
//
this.txJS2.Location = new System.Drawing.Point(66, 74);
this.txJS2.Name = "txJS2";
this.txJS2.Size = new System.Drawing.Size(440, 22);
this.txJS2.Size = new System.Drawing.Size(199, 22);
this.txJS2.TabIndex = 8;
this.txJS2.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txJS1_KeyDown);
this.txJS2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txJS1_KeyPress);
@ -149,7 +157,7 @@
//
this.txJS3.Location = new System.Drawing.Point(66, 102);
this.txJS3.Name = "txJS3";
this.txJS3.Size = new System.Drawing.Size(440, 22);
this.txJS3.Size = new System.Drawing.Size(199, 22);
this.txJS3.TabIndex = 10;
this.txJS3.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txJS1_KeyDown);
this.txJS3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txJS1_KeyPress);
@ -167,7 +175,7 @@
//
this.txJS4.Location = new System.Drawing.Point(66, 130);
this.txJS4.Name = "txJS4";
this.txJS4.Size = new System.Drawing.Size(440, 22);
this.txJS4.Size = new System.Drawing.Size(199, 22);
this.txJS4.TabIndex = 12;
this.txJS4.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txJS1_KeyDown);
this.txJS4.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txJS1_KeyPress);
@ -185,7 +193,7 @@
//
this.txJS5.Location = new System.Drawing.Point(66, 158);
this.txJS5.Name = "txJS5";
this.txJS5.Size = new System.Drawing.Size(440, 22);
this.txJS5.Size = new System.Drawing.Size(199, 22);
this.txJS5.TabIndex = 14;
this.txJS5.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txJS1_KeyDown);
this.txJS5.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txJS1_KeyPress);
@ -203,7 +211,7 @@
//
this.txJS6.Location = new System.Drawing.Point(66, 186);
this.txJS6.Name = "txJS6";
this.txJS6.Size = new System.Drawing.Size(440, 22);
this.txJS6.Size = new System.Drawing.Size(199, 22);
this.txJS6.TabIndex = 16;
this.txJS6.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txJS1_KeyDown);
this.txJS6.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txJS1_KeyPress);
@ -211,7 +219,7 @@
// label9
//
this.label9.AutoSize = true;
this.label9.Location = new System.Drawing.Point(6, 217);
this.label9.Location = new System.Drawing.Point(271, 49);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(57, 13);
this.label9.TabIndex = 19;
@ -219,9 +227,9 @@
//
// txJS7
//
this.txJS7.Location = new System.Drawing.Point(66, 214);
this.txJS7.Location = new System.Drawing.Point(340, 46);
this.txJS7.Name = "txJS7";
this.txJS7.Size = new System.Drawing.Size(440, 22);
this.txJS7.Size = new System.Drawing.Size(199, 22);
this.txJS7.TabIndex = 18;
this.txJS7.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txJS1_KeyDown);
this.txJS7.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txJS1_KeyPress);
@ -229,7 +237,7 @@
// label10
//
this.label10.AutoSize = true;
this.label10.Location = new System.Drawing.Point(6, 245);
this.label10.Location = new System.Drawing.Point(271, 77);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(57, 13);
this.label10.TabIndex = 21;
@ -237,9 +245,9 @@
//
// txJS8
//
this.txJS8.Location = new System.Drawing.Point(66, 242);
this.txJS8.Location = new System.Drawing.Point(340, 74);
this.txJS8.Name = "txJS8";
this.txJS8.Size = new System.Drawing.Size(440, 22);
this.txJS8.Size = new System.Drawing.Size(199, 22);
this.txJS8.TabIndex = 20;
this.txJS8.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txJS1_KeyDown);
this.txJS8.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txJS1_KeyPress);
@ -251,6 +259,14 @@
//
// groupBox1
//
this.groupBox1.Controls.Add(this.txJS11);
this.groupBox1.Controls.Add(this.label2);
this.groupBox1.Controls.Add(this.txJS12);
this.groupBox1.Controls.Add(this.label11);
this.groupBox1.Controls.Add(this.label12);
this.groupBox1.Controls.Add(this.txJS10);
this.groupBox1.Controls.Add(this.label13);
this.groupBox1.Controls.Add(this.txJS9);
this.groupBox1.Controls.Add(this.txJS7);
this.groupBox1.Controls.Add(this.label10);
this.groupBox1.Controls.Add(this.txJS1);
@ -270,11 +286,83 @@
this.groupBox1.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.groupBox1.Location = new System.Drawing.Point(12, 12);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(561, 276);
this.groupBox1.Size = new System.Drawing.Size(561, 226);
this.groupBox1.TabIndex = 22;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Ignore Buttons - enter button numbers which should be ignored separated by spaces" +
" (e.g. 24 25)";
//
// txJS11
//
this.txJS11.Location = new System.Drawing.Point(340, 158);
this.txJS11.Name = "txJS11";
this.txJS11.Size = new System.Drawing.Size(199, 22);
this.txJS11.TabIndex = 26;
this.txJS11.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txJS1_KeyDown);
this.txJS11.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txJS1_KeyPress);
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(271, 189);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(63, 13);
this.label2.TabIndex = 29;
this.label2.Text = "Joystick 12";
//
// txJS12
//
this.txJS12.Location = new System.Drawing.Point(340, 186);
this.txJS12.Name = "txJS12";
this.txJS12.Size = new System.Drawing.Size(199, 22);
this.txJS12.TabIndex = 28;
this.txJS12.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txJS1_KeyDown);
this.txJS12.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txJS1_KeyPress);
//
// label11
//
this.label11.AutoSize = true;
this.label11.Location = new System.Drawing.Point(271, 161);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(63, 13);
this.label11.TabIndex = 27;
this.label11.Text = "Joystick 11";
//
// label12
//
this.label12.AutoSize = true;
this.label12.Location = new System.Drawing.Point(271, 133);
this.label12.Name = "label12";
this.label12.Size = new System.Drawing.Size(63, 13);
this.label12.TabIndex = 25;
this.label12.Text = "Joystick 10";
//
// txJS10
//
this.txJS10.Location = new System.Drawing.Point(340, 130);
this.txJS10.Name = "txJS10";
this.txJS10.Size = new System.Drawing.Size(199, 22);
this.txJS10.TabIndex = 24;
this.txJS10.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txJS1_KeyDown);
this.txJS10.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txJS1_KeyPress);
//
// label13
//
this.label13.AutoSize = true;
this.label13.Location = new System.Drawing.Point(271, 105);
this.label13.Name = "label13";
this.label13.Size = new System.Drawing.Size(57, 13);
this.label13.TabIndex = 23;
this.label13.Text = "Joystick 9";
//
// txJS9
//
this.txJS9.Location = new System.Drawing.Point(340, 102);
this.txJS9.Name = "txJS9";
this.txJS9.Size = new System.Drawing.Size(199, 22);
this.txJS9.TabIndex = 22;
this.txJS9.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txJS1_KeyDown);
this.txJS9.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txJS1_KeyPress);
//
// groupBox2
//
@ -282,7 +370,7 @@
this.groupBox2.Controls.Add(this.btChooseSCDir);
this.groupBox2.Controls.Add(this.cbxUsePath);
this.groupBox2.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.groupBox2.Location = new System.Drawing.Point(12, 294);
this.groupBox2.Location = new System.Drawing.Point(15, 244);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(561, 59);
this.groupBox2.TabIndex = 23;
@ -337,9 +425,9 @@
this.groupBox4.Controls.Add(this.cbxPTU);
this.groupBox4.Controls.Add(this.cbxDetectGamepad);
this.groupBox4.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.groupBox4.Location = new System.Drawing.Point(12, 359);
this.groupBox4.Location = new System.Drawing.Point(15, 309);
this.groupBox4.Name = "groupBox4";
this.groupBox4.Size = new System.Drawing.Size(561, 59);
this.groupBox4.Size = new System.Drawing.Size(561, 105);
this.groupBox4.TabIndex = 27;
this.groupBox4.TabStop = false;
this.groupBox4.Text = "Advanced Options ...";
@ -429,5 +517,13 @@
private System.Windows.Forms.GroupBox groupBox4;
private System.Windows.Forms.CheckBox cbxDetectGamepad;
private System.Windows.Forms.CheckBox cbxPTU;
private System.Windows.Forms.TextBox txJS11;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox txJS12;
private System.Windows.Forms.Label label11;
private System.Windows.Forms.Label label12;
private System.Windows.Forms.TextBox txJS10;
private System.Windows.Forms.Label label13;
private System.Windows.Forms.TextBox txJS9;
}
}

@ -55,6 +55,10 @@ namespace SCJMapper_V2
txJS6.Text = m_owner.IgnoreJS6;
txJS7.Text = m_owner.IgnoreJS7;
txJS8.Text = m_owner.IgnoreJS8;
txJS9.Text = m_owner.IgnoreJS9;
txJS10.Text = m_owner.IgnoreJS10;
txJS11.Text = m_owner.IgnoreJS11;
txJS12.Text = m_owner.IgnoreJS12;
// Ignore actionmaps
for ( int i = 0; i < chkLbActionMaps.Items.Count; i++ ) {
@ -88,6 +92,10 @@ namespace SCJMapper_V2
m_owner.IgnoreJS6 = txJS6.Text;
m_owner.IgnoreJS7 = txJS7.Text;
m_owner.IgnoreJS8 = txJS8.Text;
m_owner.IgnoreJS9 = txJS9.Text;
m_owner.IgnoreJS10 = txJS10.Text;
m_owner.IgnoreJS11 = txJS11.Text;
m_owner.IgnoreJS12 = txJS12.Text;
// Ignore actionmaps
String ignore = ",";

@ -31,6 +31,18 @@
this.btCancel = new System.Windows.Forms.Button();
this.btDone = new System.Windows.Forms.Button();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.cbxStick12 = new System.Windows.Forms.ComboBox();
this.cbxStick11 = new System.Windows.Forms.ComboBox();
this.cbxStick10 = new System.Windows.Forms.ComboBox();
this.cbxStick9 = new System.Windows.Forms.ComboBox();
this.txJS11 = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.txJS12 = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.label11 = new System.Windows.Forms.Label();
this.txJS10 = new System.Windows.Forms.TextBox();
this.label12 = new System.Windows.Forms.Label();
this.txJS9 = new System.Windows.Forms.TextBox();
this.cbxStick8 = new System.Windows.Forms.ComboBox();
this.cbxStick7 = new System.Windows.Forms.ComboBox();
this.cbxStick6 = new System.Windows.Forms.ComboBox();
@ -61,7 +73,7 @@
// btCancel
//
this.btCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.btCancel.Location = new System.Drawing.Point(565, 284);
this.btCancel.Location = new System.Drawing.Point(562, 379);
this.btCancel.Name = "btCancel";
this.btCancel.Size = new System.Drawing.Size(108, 31);
this.btCancel.TabIndex = 27;
@ -71,7 +83,7 @@
//
// btDone
//
this.btDone.Location = new System.Drawing.Point(449, 284);
this.btDone.Location = new System.Drawing.Point(446, 379);
this.btDone.Name = "btDone";
this.btDone.Size = new System.Drawing.Size(108, 31);
this.btDone.TabIndex = 26;
@ -81,6 +93,18 @@
//
// groupBox1
//
this.groupBox1.Controls.Add(this.cbxStick12);
this.groupBox1.Controls.Add(this.cbxStick11);
this.groupBox1.Controls.Add(this.cbxStick10);
this.groupBox1.Controls.Add(this.cbxStick9);
this.groupBox1.Controls.Add(this.txJS11);
this.groupBox1.Controls.Add(this.label1);
this.groupBox1.Controls.Add(this.txJS12);
this.groupBox1.Controls.Add(this.label2);
this.groupBox1.Controls.Add(this.label11);
this.groupBox1.Controls.Add(this.txJS10);
this.groupBox1.Controls.Add(this.label12);
this.groupBox1.Controls.Add(this.txJS9);
this.groupBox1.Controls.Add(this.cbxStick8);
this.groupBox1.Controls.Add(this.cbxStick7);
this.groupBox1.Controls.Add(this.cbxStick6);
@ -108,11 +132,163 @@
this.groupBox1.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.groupBox1.Location = new System.Drawing.Point(14, 12);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(654, 257);
this.groupBox1.Size = new System.Drawing.Size(654, 361);
this.groupBox1.TabIndex = 28;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "jsN - Assginment";
//
// cbxStick12
//
this.cbxStick12.FormattingEnabled = true;
this.cbxStick12.Items.AddRange(new object[] {
"n.a.",
"js1",
"js2",
"js3",
"js4",
"js5",
"js6",
"js7",
"js8",
"js9",
"js10",
"js11",
"js12"});
this.cbxStick12.Location = new System.Drawing.Point(562, 329);
this.cbxStick12.Name = "cbxStick12";
this.cbxStick12.Size = new System.Drawing.Size(84, 21);
this.cbxStick12.TabIndex = 41;
//
// cbxStick11
//
this.cbxStick11.FormattingEnabled = true;
this.cbxStick11.Items.AddRange(new object[] {
"n.a.",
"js1",
"js2",
"js3",
"js4",
"js5",
"js6",
"js7",
"js8",
"js9",
"js10",
"js11",
"js12"});
this.cbxStick11.Location = new System.Drawing.Point(562, 301);
this.cbxStick11.Name = "cbxStick11";
this.cbxStick11.Size = new System.Drawing.Size(84, 21);
this.cbxStick11.TabIndex = 40;
//
// cbxStick10
//
this.cbxStick10.FormattingEnabled = true;
this.cbxStick10.Items.AddRange(new object[] {
"n.a.",
"js1",
"js2",
"js3",
"js4",
"js5",
"js6",
"js7",
"js8",
"js9",
"js10",
"js11",
"js12"});
this.cbxStick10.Location = new System.Drawing.Point(562, 273);
this.cbxStick10.Name = "cbxStick10";
this.cbxStick10.Size = new System.Drawing.Size(84, 21);
this.cbxStick10.TabIndex = 39;
//
// cbxStick9
//
this.cbxStick9.FormattingEnabled = true;
this.cbxStick9.Items.AddRange(new object[] {
"n.a.",
"js1",
"js2",
"js3",
"js4",
"js5",
"js6",
"js7",
"js8",
"js9",
"js10",
"js11",
"js12"});
this.cbxStick9.Location = new System.Drawing.Point(562, 245);
this.cbxStick9.Name = "cbxStick9";
this.cbxStick9.Size = new System.Drawing.Size(84, 21);
this.cbxStick9.TabIndex = 38;
//
// txJS11
//
this.txJS11.Location = new System.Drawing.Point(77, 301);
this.txJS11.Name = "txJS11";
this.txJS11.Size = new System.Drawing.Size(466, 22);
this.txJS11.TabIndex = 34;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(7, 332);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(63, 13);
this.label1.TabIndex = 37;
this.label1.Text = "Joystick 12";
//
// txJS12
//
this.txJS12.Location = new System.Drawing.Point(77, 329);
this.txJS12.Name = "txJS12";
this.txJS12.Size = new System.Drawing.Size(466, 22);
this.txJS12.TabIndex = 36;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(7, 304);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(63, 13);
this.label2.TabIndex = 35;
this.label2.Text = "Joystick 11";
//
// label11
//
this.label11.AutoSize = true;
this.label11.Location = new System.Drawing.Point(7, 276);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(63, 13);
this.label11.TabIndex = 33;
this.label11.Text = "Joystick 10";
//
// txJS10
//
this.txJS10.Location = new System.Drawing.Point(77, 273);
this.txJS10.Name = "txJS10";
this.txJS10.Size = new System.Drawing.Size(466, 22);
this.txJS10.TabIndex = 32;
//
// label12
//
this.label12.AutoSize = true;
this.label12.Location = new System.Drawing.Point(7, 248);
this.label12.Name = "label12";
this.label12.Size = new System.Drawing.Size(57, 13);
this.label12.TabIndex = 31;
this.label12.Text = "Joystick 9";
//
// txJS9
//
this.txJS9.Location = new System.Drawing.Point(77, 245);
this.txJS9.Name = "txJS9";
this.txJS9.Size = new System.Drawing.Size(466, 22);
this.txJS9.TabIndex = 30;
//
// cbxStick8
//
this.cbxStick8.FormattingEnabled = true;
@ -125,7 +301,11 @@
"js5",
"js6",
"js7",
"js8"});
"js8",
"js9",
"js10",
"js11",
"js12"});
this.cbxStick8.Location = new System.Drawing.Point(562, 217);
this.cbxStick8.Name = "cbxStick8";
this.cbxStick8.Size = new System.Drawing.Size(84, 21);
@ -143,7 +323,11 @@
"js5",
"js6",
"js7",
"js8"});
"js8",
"js9",
"js10",
"js11",
"js12"});
this.cbxStick7.Location = new System.Drawing.Point(562, 189);
this.cbxStick7.Name = "cbxStick7";
this.cbxStick7.Size = new System.Drawing.Size(84, 21);
@ -161,7 +345,11 @@
"js5",
"js6",
"js7",
"js8"});
"js8",
"js9",
"js10",
"js11",
"js12"});
this.cbxStick6.Location = new System.Drawing.Point(562, 161);
this.cbxStick6.Name = "cbxStick6";
this.cbxStick6.Size = new System.Drawing.Size(84, 21);
@ -179,7 +367,11 @@
"js5",
"js6",
"js7",
"js8"});
"js8",
"js9",
"js10",
"js11",
"js12"});
this.cbxStick5.Location = new System.Drawing.Point(562, 133);
this.cbxStick5.Name = "cbxStick5";
this.cbxStick5.Size = new System.Drawing.Size(84, 21);
@ -197,7 +389,11 @@
"js5",
"js6",
"js7",
"js8"});
"js8",
"js9",
"js10",
"js11",
"js12"});
this.cbxStick4.Location = new System.Drawing.Point(562, 105);
this.cbxStick4.Name = "cbxStick4";
this.cbxStick4.Size = new System.Drawing.Size(84, 21);
@ -215,7 +411,11 @@
"js5",
"js6",
"js7",
"js8"});
"js8",
"js9",
"js10",
"js11",
"js12"});
this.cbxStick3.Location = new System.Drawing.Point(562, 77);
this.cbxStick3.Name = "cbxStick3";
this.cbxStick3.Size = new System.Drawing.Size(84, 21);
@ -233,7 +433,11 @@
"js5",
"js6",
"js7",
"js8"});
"js8",
"js9",
"js10",
"js11",
"js12"});
this.cbxStick2.Location = new System.Drawing.Point(562, 49);
this.cbxStick2.Name = "cbxStick2";
this.cbxStick2.Size = new System.Drawing.Size(84, 21);
@ -251,7 +455,11 @@
"js5",
"js6",
"js7",
"js8"});
"js8",
"js9",
"js10",
"js11",
"js12"});
this.cbxStick1.Location = new System.Drawing.Point(562, 21);
this.cbxStick1.Name = "cbxStick1";
this.cbxStick1.Size = new System.Drawing.Size(84, 21);
@ -389,7 +597,7 @@
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(682, 326);
this.ClientSize = new System.Drawing.Size(682, 419);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.btCancel);
this.Controls.Add(this.btDone);
@ -435,5 +643,17 @@
private System.Windows.Forms.ComboBox cbxStick5;
private System.Windows.Forms.ComboBox cbxStick4;
private System.Windows.Forms.ComboBox cbxStick3;
private System.Windows.Forms.ComboBox cbxStick12;
private System.Windows.Forms.ComboBox cbxStick11;
private System.Windows.Forms.ComboBox cbxStick10;
private System.Windows.Forms.ComboBox cbxStick9;
private System.Windows.Forms.TextBox txJS11;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox txJS12;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label11;
private System.Windows.Forms.TextBox txJS10;
private System.Windows.Forms.Label label12;
private System.Windows.Forms.TextBox txJS9;
}
}

@ -12,8 +12,8 @@ namespace SCJMapper_V2
partial class FormReassign : Form
{
private readonly JoystickList m_owner = null; // owner class - access to settings
private TextBox[] m_tb = new TextBox[] { null, null, null, null, null, null, null, null, };
private ComboBox[] m_cb = new ComboBox[] { null, null, null, null, null, null, null, null, };
private TextBox[] m_tb = new TextBox[] { null, null, null, null, null, null, null, null, null, null, null, null, };
private ComboBox[] m_cb = new ComboBox[] { null, null, null, null, null, null, null, null, null, null, null, null, };
public Boolean Canceled { get; set; }
@ -29,9 +29,11 @@ namespace SCJMapper_V2
m_tb[0] = txJS1; m_tb[1] = txJS2; m_tb[2] = txJS3; m_tb[3] = txJS4;
m_tb[4] = txJS5; m_tb[5] = txJS6; m_tb[6] = txJS7; m_tb[7] = txJS8;
m_tb[8] = txJS9; m_tb[9] = txJS10; m_tb[10] = txJS11; m_tb[11] = txJS12;
m_cb[0] = cbxStick1; m_cb[1] = cbxStick2; m_cb[2] = cbxStick3; m_cb[3] = cbxStick4;
m_cb[4] = cbxStick5; m_cb[5] = cbxStick6; m_cb[6] = cbxStick7; m_cb[7] = cbxStick8;
m_cb[8] = cbxStick9; m_cb[9] = cbxStick10; m_cb[10] = cbxStick11; m_cb[11] = cbxStick12;
}
@ -52,7 +54,7 @@ namespace SCJMapper_V2
m_owner.JsReassingList.Clear( );
m_owner.NewJsList.Clear( );
foreach ( JoystickCls j in m_owner ) {
m_cb[textIdx].SelectedIndex = ( j.JSAssignment <= 8 ) ? j.JSAssignment : 0;
m_cb[textIdx].SelectedIndex = ( j.JSAssignment <= JoystickCls.JSnum_MAX ) ? j.JSAssignment : 0;
m_owner.NewJsList.Add( m_cb[textIdx].SelectedIndex ); // old for now - new depends on Leave Button
textIdx++;
}
@ -77,12 +79,14 @@ namespace SCJMapper_V2
private Boolean IsOK( )
{
int[] jsx = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
int[] jsx = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
foreach ( ComboBox cb in m_cb ) {
if ( cb.SelectedIndex>0) jsx[cb.SelectedIndex]++;
}
return ( ( jsx[1] < 2 ) && ( jsx[2] < 2 ) && ( jsx[3] < 2 ) && ( jsx[4] < 2 ) && ( jsx[5] < 2 ) && ( jsx[6] < 2 ) && ( jsx[7] < 2 ) && ( jsx[8] < 2 ) ); // each Js can be set only once
return ( ( jsx[1] < 2 ) && ( jsx[2] < 2 ) && ( jsx[3] < 2 ) && ( jsx[4] < 2 )
&& ( jsx[5] < 2 ) && ( jsx[6] < 2 ) && ( jsx[7] < 2 ) && ( jsx[8] < 2 )
&& ( jsx[9] < 2 ) && ( jsx[10] < 2 ) && ( jsx[11] < 2 ) && ( jsx[12] < 2 ) ); // each Js can be set only once
}

@ -28,7 +28,7 @@ namespace SCJMapper_V2
static public int JSnum_UNKNOWN = 0;
static public int JSnum_MAX = 8;
static public int JSnum_MAX = 12; // Get to 12 for 'freaks' ..
public const String JsUnknown = "jsx_";
@ -186,19 +186,27 @@ namespace SCJMapper_V2
// find jsN start
int jsPos = jsTag.IndexOf( "+js" );
if ( jsPos > 0 ) {
if ( !int.TryParse( jsTag.Substring( jsPos+3, 1 ), out retNum ) ) {
retNum = JSnum_UNKNOWN;
if ( !int.TryParse( ( jsTag + "XX" ).Substring( jsPos + 3, 2 ), out retNum ) ) { // cheap .. test for double digits
if ( !int.TryParse( jsTag.Substring( jsPos + 3, 1 ), out retNum ) ) { // now for only single ones
retNum = JSnum_UNKNOWN; // neither double nor single digit found
}
}
}
else {
if ( ! ( jsTag.StartsWith("js") && int.TryParse( jsTag.Substring( 2, 1 ), out retNum ) ) ) {
retNum = JSnum_UNKNOWN;
else if ( jsTag.StartsWith( "js" ) ) {
if ( !int.TryParse( (jsTag+"XX").Substring( 2, 2 ), out retNum ) ) { // cheap .. test for double digits ( have to extend the string to parse)
if ( !int.TryParse( jsTag.Substring( 2, 1 ), out retNum ) ) { // now for only single ones
retNum = JSnum_UNKNOWN; // neither double nor single digit found
}
}
}
else {
retNum = JSnum_UNKNOWN; // neither double nor single digit found
}
}
return retNum;
}
/// <summary>
/// Returns the validity of a JSnumber
/// Done here to maintain the ownership of how things are done
@ -210,7 +218,7 @@ namespace SCJMapper_V2
return ( jsNum > JSnum_UNKNOWN ) && ( jsNum <= JSnum_MAX );
}
const string js_pattern = @"^js\d_*";
const string js_pattern = @"^js\d{1,2}_*";
static Regex rgx_js = new Regex( js_pattern, RegexOptions.IgnoreCase );
/// <summary>
/// Returns true if the input starts with a valid jsN_ formatting
@ -233,7 +241,14 @@ namespace SCJMapper_V2
{
// find jsN start
if ( IsJsN( input ) ) {
return input.Replace( input.Substring( 0, 3 ), JSTag( newJsN ) ); // jsPos=-1 + 1 => 0 (case of no modifier)
int inJsN = JSNum( input );
if ( inJsN < 10 ) {
return input.Replace( input.Substring( 0, 3 ), JSTag( newJsN ) );
}
else {
// 2 digit input JsN
return input.Replace( input.Substring( 0, 4 ), JSTag( newJsN ) );
}
}
else {
return input;
@ -242,9 +257,9 @@ namespace SCJMapper_V2
const string jsl_pattern = @"^js\d_[xyz]$";
const string jsl_pattern = @"^js\d{1,2}_[xyz]$";
static Regex rgx_jsl = new Regex( jsl_pattern, RegexOptions.IgnoreCase );
const string jsr_pattern = @"^js\d_rot[xyz]$";
const string jsr_pattern = @"^js\d{1,2}_rot[xyz]$";
static Regex rgx_jsr = new Regex( jsr_pattern, RegexOptions.IgnoreCase );
/// <summary>
/// Makes a throttle from the given ctrl
@ -260,7 +275,14 @@ namespace SCJMapper_V2
String retVal = control;
if ( rgx_jsl.IsMatch( control ) ) {
retVal = retVal.Insert( 4, "throttle" );
int inJsN = JSNum( control );
if ( inJsN < 10 ) {
retVal = retVal.Insert( 4, "throttle" );
}
else {
// 2 digit input JsN
retVal = retVal.Insert( 5, "throttle" );
}
}
/* THIS IS WRONG.... don't know if rot can get a throttle...
else if ( rgx_jsr.IsMatch( control ) ) {
@ -282,7 +304,7 @@ namespace SCJMapper_V2
}
const string jsb_pattern = @"^js\d_button\d{1,3}$";
const string jsb_pattern = @"^js\d{1,2}_button\d{1,3}$";
static Regex rgx_jsb = new Regex( jsb_pattern, RegexOptions.IgnoreCase );
/// <summary>
/// Returns True if devInput seems to be a valid Modifier
@ -374,12 +396,14 @@ namespace SCJMapper_V2
public int ButtonCount { get { return m_device.Capabilities.ButtonCount; } }
public int POVCount { get { return m_device.Capabilities.PovCount; } }
public override Boolean Activated
{
get { return m_activated;}
set { m_activated = value;
if ( m_activated == false ) m_device.Unacquire( ); // explicitely if not longer active
}
public override Boolean Activated
{
get { return m_activated; }
set
{
m_activated = value;
if ( m_activated == false ) m_device.Unacquire( ); // explicitely if not longer active
}
}
@ -442,7 +466,7 @@ namespace SCJMapper_V2
ApplySettings( ); // get whatever is needed here from Settings
JoystickCls.RegisteredDevices++;
Activated = true;
Activated = true;
}
@ -497,7 +521,7 @@ namespace SCJMapper_V2
}
private void ResetButtons( bool[] bt)
private void ResetButtons( bool[] bt )
{
for ( int i = 0; i < bt.Length; i++ ) bt[i] = false;
}
@ -605,7 +629,7 @@ namespace SCJMapper_V2
{
{"X","x"},
{"Y","y"},
{"Z","z"},
{"Z","z"},
{"RotationX","rotx"},
{"RotationY","roty"},
{"RotationZ","rotz"}
@ -780,7 +804,7 @@ namespace SCJMapper_V2
{
{"x","X"},
{"y","Y"},
{"z","Z"},
{"z","Z"},
{"rotx","RotationX"},
{"roty","RotationY"},
{"rotz","RotationZ"}

@ -62,8 +62,8 @@
this.label3 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.label1 = new System.Windows.Forms.Label();
this.lblJsAssignment = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.gBox.SuspendLayout();
this.gBoxCap.SuspendLayout();
this.groupBox1.SuspendLayout();
@ -99,14 +99,14 @@
this.gBox.Controls.Add(this.lX);
this.gBox.Location = new System.Drawing.Point(3, 69);
this.gBox.Name = "gBox";
this.gBox.Size = new System.Drawing.Size(232, 161);
this.gBox.Size = new System.Drawing.Size(232, 151);
this.gBox.TabIndex = 3;
this.gBox.TabStop = false;
this.gBox.Text = "Joystick State";
//
// lbl1Buttons
//
this.lbl1Buttons.Location = new System.Drawing.Point(65, 141);
this.lbl1Buttons.Location = new System.Drawing.Point(65, 132);
this.lbl1Buttons.Name = "lbl1Buttons";
this.lbl1Buttons.Size = new System.Drawing.Size(154, 13);
this.lbl1Buttons.TabIndex = 25;
@ -114,7 +114,7 @@
// lB
//
this.lB.AutoSize = true;
this.lB.Location = new System.Drawing.Point(9, 141);
this.lB.Location = new System.Drawing.Point(9, 132);
this.lB.Name = "lB";
this.lB.Size = new System.Drawing.Size(46, 13);
this.lB.TabIndex = 24;
@ -433,22 +433,13 @@
//
this.groupBox1.Controls.Add(this.lblJsAssignment);
this.groupBox1.Controls.Add(this.label1);
this.groupBox1.Location = new System.Drawing.Point(3, 236);
this.groupBox1.Location = new System.Drawing.Point(3, 226);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(232, 46);
this.groupBox1.TabIndex = 5;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "jsN - Assignment";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(9, 21);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(119, 13);
this.label1.TabIndex = 0;
this.label1.Text = "This device is listed as: ";
//
// lblJsAssignment
//
this.lblJsAssignment.AutoSize = true;
@ -459,6 +450,15 @@
this.lblJsAssignment.TabIndex = 1;
this.lblJsAssignment.Text = "jsx";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(9, 21);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(119, 13);
this.label1.TabIndex = 0;
this.label1.Text = "This device is listed as: ";
//
// UC_JoyPanel
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@ -467,7 +467,7 @@
this.Controls.Add(this.gBoxCap);
this.Controls.Add(this.gBox);
this.Name = "UC_JoyPanel";
this.Size = new System.Drawing.Size(239, 295);
this.Size = new System.Drawing.Size(239, 278);
this.gBox.ResumeLayout(false);
this.gBox.PerformLayout();
this.gBoxCap.ResumeLayout(false);

@ -265,7 +265,7 @@ namespace SCJMapper_V2
set
{
m_jsAssignment = value;
if ( ( m_jsAssignment >= 1 ) && ( m_jsAssignment <= 8 ) ) {
if ( ( m_jsAssignment >= 1 ) && ( m_jsAssignment <= JoystickCls.JSnum_MAX ) ) {
lblJsAssignment.Text = String.Format( "js{0}", m_jsAssignment );
}
else {

@ -229,6 +229,19 @@ namespace SCJMapper_V2
return key.TrimEnd( new char[] { '+' } ); // return killing the last +
}
/// <summary>
/// Format the various parts to a valid ctrl entry
/// </summary>
/// <param name="input">The input by the user</param>
/// <param name="modifiers">Modifiers to be applied</param>
/// <returns></returns>
static public String MakeCtrl( String input, String modifiers )
{
return DeviceID + modifiers + input;
}
#endregion
private Keyboard m_device;

@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration( "" )]
[assembly: AssemblyCompany( "Cassini (SC handle)" )]
[assembly: AssemblyProduct( "SCJMapper" )]
[assembly: AssemblyCopyright( "Copyright (c) 2015 M.Burri" )]
[assembly: AssemblyCopyright( "Copyright (c) 2016 M.Burri" )]
[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.19.0.52" )]
[assembly: AssemblyFileVersion( "2.19.0.52" )]
[assembly: AssemblyVersion( "2.21.0.55" )]
[assembly: AssemblyFileVersion( "2.21.0.55" )]

@ -0,0 +1,97 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace SCJMapper_V2.CryXMLlib
{
internal static class Extensions
{
/// <summary>
/// Get the array slice between the two indexes.
/// ... Inclusive for start index, exclusive end
/// </summary>
public static T[] SliceE<T>( this T[] source, UInt32 start, UInt32 end )
{
// Handles negative ends.
if ( end < 0 ) {
end = ( UInt32 )source.Length + end;
}
UInt32 len = end - start;
// Return new array.
T[] res = new T[len];
for ( int i = 0; i < len; i++ ) {
res[i] = source[i + start];
}
return res;
}
/// <summary>
/// Get the array slice between the two indexes.
/// ... Inclusive for start index, length.
/// </summary>
public static T[] SliceL<T>( this T[] source, UInt32 offset, UInt32 length )
{
UInt32 end = offset + length;
// Handles negative ends.
if ( end < 0 ) {
end = ( UInt32 )source.Length + end;
}
UInt32 len = end - offset;
// Return new array.
T[] res = new T[len];
for ( int i = 0; i < len; i++ ) {
res[i] = source[i + offset];
}
return res;
}
}
internal class Conversions
{
/// <summary>
/// Converts a number of ASCII chars into a String
/// </summary>
/// <param name="bPtr">Mem Location of the ASCII Chars</param>
/// <param name="size">Max number of ASCII chars to convert, stops at \0 however</param>
/// <returns>The converted string</returns>
static public string ToString( byte[] byteArr, uint size = 999 )
{
String s = "";
for ( uint i = 0; i < size; i++ ) {
if ( byteArr[i] != 0 )
s += Char.ConvertFromUtf32( byteArr[i] );
else
break; // stop at char 0
}
return s;
}
/// <summary>
/// Allocates and reads bytes of the size of one record
/// and returns the allocated bytes are structure - allowing structured access to binary data
/// Note: there is no error checking whatsoever here - so better make sure everything is OK
/// </summary>
/// <typeparam name="T">The record type to read</typeparam>
/// <param name="reader">A binary reader</param>
/// <returns>The read record</returns>
public static T ByteToType<T>( byte[] bytes, UInt32 offset = 0 )
{
byte[] _bytes = bytes.SliceL( offset, ( UInt32 )Marshal.SizeOf( typeof( T ) ) ); // lets see if this works with Alloc below..
GCHandle handle = GCHandle.Alloc( _bytes, GCHandleType.Pinned );
T theStructure = ( T )Marshal.PtrToStructure( handle.AddrOfPinnedObject( ), typeof( T ) );
handle.Free( );
return theStructure;
}
}
}

@ -0,0 +1,171 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SCJMapper_V2.CryXMLlib
{
/// <summary>
/// Derived work from CryEngine: IXml.h:
///
/// Crytek Engine Source File.
/// Copyright (C), Crytek Studios, 2002.
/// -------------------------------------------------------------------------
/// File name: ixml.h
/// Version: v1.00
/// Created: 16/7/2002 by Timur.
/// Compilers: Visual Studio.NET
/// Description:
// -------------------------------------------------------------------------
/// </summary>
/// <summary>
/// kind of typedef (curtesy http://www.codeproject.com/Questions/141385/typedef-in-C)
// Summary:
// Special string wrapper for xml nodes.
/// </summary>
public struct XmlString
{
// A struct's fields should not be exposed
private string value;
// As we are using implicit conversions we can keep the constructor private
private XmlString( string value )
{
this.value = value;
}
/// <summary>
/// Implicitly converts a XmlString to a <see cref="System.string"/>.
/// </summary>
/// <param name="value">The <see cref="System.string"/> to convert.</param>
/// <returns>A new XmlString with the specified value.</returns>
public static implicit operator XmlString( string value )
{
return new XmlString( value );
}
/// <summary>
/// Implicitly converts a XmlString to a <see cref="System.string"/>.
/// </summary>
/// <param name="record">The XmlString to convert.</param>
/// <returns>
/// A <see cref="System.string"/> that is the specified XmlString's value.
/// </returns>
public static implicit operator string( XmlString record )
{
return record.value;
}
public static XmlString c_str( byte[] sz, uint len = 999 )
{
return Conversions.ToString( sz, len );
}
}
/// <summary>
/// Abstract IXmlNode class
/// Notes:
/// Never use IXmlNode directly instead use reference counted XmlNodeRef.
/// See also:
/// XmlNodeRef
/// </summary>
public abstract class IXmlNode
{
/// <summary>
/// Gets XML node tag.
/// </summary>
/// <returns></returns>
public abstract string getTag( );
/// <summary>
/// Returns true if a given tag equal to node tag.
/// </summary>
/// <param name="tag">The tag</param>
/// <returns>True if it is the tag of the node</returns>
public abstract bool isTag( string tag );
/// <summary>
/// Checks if attributes with specified key exist.
/// </summary>
/// <param name="key">The attribute key</param>
/// <returns>True if this attribute exists</returns>
public abstract bool haveAttr( string key );
//
/// <summary>
/// Gets XML Node attributes count
/// </summary>
/// <returns>The number of attributes of this node</returns>
public abstract int getNumAttributes( );
/// <summary>
/// Returns attribute key and value by attribute index.
/// </summary>
/// <param name="index">The attribute index 0..</param>
/// <param name="key">Out: the attribute key</param>
/// <param name="value">Out: the attribute value</param>
/// <returns>True if returned key and value are valid</returns>
public abstract bool getAttributeByIndex( int index, out string key, out string value );
/// <summary>
/// Gets XML Node attribute for specified key.
/// </summary>
/// <param name="key">The attribute key</param>
/// <returns>The attribute value or an empty string if it does not exist</returns>
public abstract string getAttr( string key );
/// <summary>
/// Gets XML Node attribute for specified key.
/// </summary>
/// <param name="key">The attribute key</param>
/// <param name="value">Out: the attribute value</param>
/// <returns>True if the attribute with key exists and the returned value is valid</returns>
public abstract bool getAttr( string key, out string value );
/// <summary>
/// Gets attribute value of node.
/// </summary>
/// <param name="key">The attribute key</param>
/// <param name="value">Out: the attribute value as XmlString</param>
/// <returns>True if the attribute with key exists and the returned value is valid</returns>
public abstract bool getAttr( string key, out XmlString value );
/// <summary>
/// Gets number of child XML nodes.
/// </summary>
/// <returns>The number of child nodes of this node</returns>
public abstract int getChildCount( );
/// <summary>
/// Gets XML Node child nodes.
/// </summary>
/// <param name="i">The child index of the node to return</param>
/// <returns>A valid nodeRef or null if the element does not exist</returns>
public abstract CryXmlNodeRef getChild( int i );
/// <summary>
/// Finds node with specified tag.
/// </summary>
/// <param name="tag">The node tag of the child node to return</param>
/// <returns>A valid nodeRef or null if the element does not exist</returns>
public abstract CryXmlNodeRef findChild( string tag );
/// <summary>
/// Gets parent XML node.
/// </summary>
/// <returns>A valid nodeRef or null if the element does not exist</returns>
public abstract CryXmlNodeRef getParent( );
/// <summary>
/// Returns content of this node.
/// </summary>
/// <returns>The node content as string</returns>
public abstract string getContent( );
}
}

@ -0,0 +1,51 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SCJMapper_V2.CryXMLlib
{
/// <summary>
/// Derived work from CryEngine: XMLBinaryHeaders.h:
/// CryEngine Source File.
/// Copyright (C), Crytek Studios, 2001-2006.
/// -------------------------------------------------------------------------
/// File name: xml.h
/// Created: 21/04/2006 by Timur.
/// Description:
/// -------------------------------------------------------------------------
/// </summary>
///
/// <summary>
/// Memory context of the binary XML file
/// </summary>
internal class CryXmlBinContext // CBinaryXmlData
{
~CryXmlBinContext( )
{
pBinaryNodes = null; // TODO check later for proper dealloc
}
public CryXMLNode[] pNodes = null; // gets a copy of all Node entries
public CryXMLAttribute[] pAttributes= null; // gets a copy of all Attribute entries
public CryXMLNodeIndex[] pChildIndices= null; // gets a copy of all Note relations
public byte[] pStringData = null; // gets a copy of the string data
public UInt32 pStringDataLength = 0; // length of the string data
/// <summary>
/// Returns an XMLString from the stringData area
/// </summary>
/// <param name="sOffset">The start offset of the string to return</param>
/// <returns>The string</returns>
public XmlString _string( UInt32 sOffset )
{
return Conversions.ToString( pStringData.SliceE( sOffset, pStringDataLength ) );
}
public List<CryXmlBinNode> pBinaryNodes= null; // list of binary nodes - one to one with the real nodes
}
}

@ -0,0 +1,154 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace SCJMapper_V2.CryXMLlib
{
/// <summary>
/// Derived (file structure) work from CryEngine: XMLBinaryHeaders.h:
/// ---------------------------------------------------------------------------
/// Copyright 2006 Crytek GmbH
/// Created by: Michael Smith
///---------------------------------------------------------------------------
/// </summary>
/// <summary>
/// kind of typedef (curtesy http://www.codeproject.com/Questions/141385/typedef-in-C)
/// A wrapper around <see cref="System.UInt32"/>.
/// </summary>
internal struct CryXMLNodeIndex
{
static public UInt32 MySize( ) { return ( UInt32 )Marshal.SizeOf( typeof( CryXMLNodeIndex ) ); }
private UInt32 value;
// As we are using implicit conversions we can keep the constructor private
private CryXMLNodeIndex( UInt32 value )
{
this.value = value;
}
private CryXMLNodeIndex( int value )
{
this.value = ( CryXMLNodeIndex )value;
}
/// <summary>
/// Implicitly converts a <see cref="System.UInt32"/> to a Record.
/// </summary>
/// <param name="value">The <see cref="System.UInt32"/> to convert.</param>
/// <returns>A new Record with the specified value.</returns>
public static implicit operator CryXMLNodeIndex( UInt32 value )
{
return new CryXMLNodeIndex( value );
}
public static implicit operator CryXMLNodeIndex( int value )
{
return new CryXMLNodeIndex( value );
}
/// <summary>
/// Implicitly converts a Record to a <see cref="System.UInt32"/>.
/// </summary>
/// <param name="record">The Record to convert.</param>
/// <returns>
/// A <see cref="System.UInt32"/> that is the specified Record's value.
/// </returns>
public static implicit operator UInt32( CryXMLNodeIndex record )
{
return record.value;
}
public static implicit operator int( CryXMLNodeIndex record )
{
return ( int )record.value;
}
}
/// <summary>
/// Maps the Node from binary file to memory
/// </summary>
[StructLayout( LayoutKind.Sequential, Pack = 1 )] //, Size = 5 * 4 + 2 * 2 = 24 (28 according to dump)
internal struct CryXMLNode
{
static public UInt32 MySize( ) { return ( UInt32 )Marshal.SizeOf( typeof( CryXMLNode ) ); }
public CryXMLNodeIndex nParentIndex { get { return _nParentIndex; } } // type conversion only
public CryXMLNodeIndex nFirstAttributeIndex { get { return _nFirstAttributeIndex; } } // type conversion only
public CryXMLNodeIndex nFirstChildIndex { get { return _nFirstChildIndex; } } // type conversion only
[MarshalAs( UnmanagedType.U4 )]
public UInt32 nTagStringOffset; // offset in CBinaryXmlData::pStringData
[MarshalAs( UnmanagedType.U4 )]
public UInt32 nContentStringOffset; // offset in CBinaryXmlData::pStringData
[MarshalAs( UnmanagedType.U2 )]
public UInt16 nAttributeCount;
[MarshalAs( UnmanagedType.U2 )]
public UInt16 nChildCount;
[MarshalAs( UnmanagedType.U4 )]
private UInt32 _nParentIndex;
[MarshalAs( UnmanagedType.U4 )]
private UInt32 _nFirstAttributeIndex;
[MarshalAs( UnmanagedType.U4 )]
private UInt32 _nFirstChildIndex;
[MarshalAs( UnmanagedType.U4 )]
private UInt32 _PAD; // according to hex analysis we have a 4 byte pad at the end of each node
}
/// <summary>
/// Maps the Attribute from binary file to memory
/// </summary>
[StructLayout( LayoutKind.Sequential, Pack = 1 )] //, Size = 2 * 4 = 8 (OK)
internal struct CryXMLAttribute
{
static public UInt32 MySize( ) { return ( UInt32 )Marshal.SizeOf( typeof( CryXMLAttribute ) ); }
[MarshalAs( UnmanagedType.U4 )]
public UInt32 nKeyStringOffset; // offset in CBinaryXmlData::pStringData
[MarshalAs( UnmanagedType.U4 )]
public UInt32 nValueStringOffset; // offset in CBinaryXmlData::pStringData
}
/// <summary>
/// Maps the Header from binary file to memory
/// </summary>
[StructLayout( LayoutKind.Sequential, Pack = 1 )] //, Size = 9 * 4 + 8 = 44
internal struct CryXMLHeader
{
static public UInt32 MySize( ) { return ( UInt32 )Marshal.SizeOf( typeof( CryXMLHeader ) ); }
public bool HasCorrectSignature { get { return ( szSignature == "CryXmlB" ); } }
public string szSignature { get { return Conversions.ToString( _szSignature, 8 ); } } // from ASCIIZ
[MarshalAs( UnmanagedType.ByValArray, SizeConst = 8 )]
private byte[] _szSignature;
[MarshalAs( UnmanagedType.U4 )]
public UInt32 nXMLSize;
[MarshalAs( UnmanagedType.U4 )]
public UInt32 nNodeTablePosition;
[MarshalAs( UnmanagedType.U4 )]
public UInt32 nNodeCount;
[MarshalAs( UnmanagedType.U4 )]
public UInt32 nAttributeTablePosition;
[MarshalAs( UnmanagedType.U4 )]
public UInt32 nAttributeCount;
[MarshalAs( UnmanagedType.U4 )]
public UInt32 nChildTablePosition;
[MarshalAs( UnmanagedType.U4 )]
public UInt32 nChildCount;
[MarshalAs( UnmanagedType.U4 )]
public UInt32 nStringDataPosition;
[MarshalAs( UnmanagedType.U4 )]
public UInt32 nStringDataSize;
}
}

@ -0,0 +1,180 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SCJMapper_V2.CryXMLlib
{
/// <summary>
/// Derived work from CryEngine: XMLBinaryHeaders.h:
/// CryEngine Source File.
/// Copyright (C), Crytek Studios, 2001-2006.
/// -------------------------------------------------------------------------
/// File name: xml.h
/// Created: 21/04/2006 by Timur.
/// Description:
/// -------------------------------------------------------------------------
/// </summary>
///
/// <summary>
/// Implemented IXmlNode
/// </summary>
internal class CryXmlBinNode : IXmlNode // CBinaryXmlNode
{
internal CryXmlBinContext m_pData = null; // ref to the binary data area
internal UInt32 m_pNodeIndex = 0; // Index of ourself
// Return current node in binary data.
private CryXMLNode _node( )
{
return m_pData.pNodes[m_pNodeIndex];
}
private XmlString _string( UInt32 nIndex )
{
return m_pData._string( nIndex );
}
private string GetValue( string key )
{
CryXMLNodeIndex nFirst = _node( ).nFirstAttributeIndex;
CryXMLNodeIndex nLast = nFirst + _node( ).nAttributeCount;
for ( CryXMLNodeIndex i = nFirst; i < nLast; i++ ) {
XmlString attrKey = _string( m_pData.pAttributes[i].nKeyStringOffset );
if ( key == attrKey ) {
string attrValue = _string( m_pData.pAttributes[i].nValueStringOffset );
return attrValue;
}
}
return "";
}
// Get XML node tag.
public override string getTag( )
{
return _string( _node( ).nTagStringOffset );
}
// Return true if given tag is equal to node tag.
public override bool isTag( string tag )
{
return ( tag == getTag( ) );
}
// Check if attributes with specified key exist.
public override bool haveAttr( string key )
{
return ( !string.IsNullOrEmpty( GetValue( key ) ) );
}
// Get XML Node attributes.
public override int getNumAttributes( ) { return ( int )_node( ).nAttributeCount; }
// Return attribute key and value by attribute index.
public override bool getAttributeByIndex( int index, out string key, out string value )
{
key = ""; value = "";
CryXMLNode pNode = _node( );
if ( index >= 0 && index < pNode.nAttributeCount ) {
CryXMLAttribute attr = m_pData.pAttributes[pNode.nFirstAttributeIndex + index];
key = _string( attr.nKeyStringOffset );
value = _string( attr.nValueStringOffset );
return true;
}
return false;
}
// Return attribute key and value by attribute index, string version.
public virtual bool getAttributeByIndex( int index, out XmlString key, out XmlString value )
{
string _key, _value;
bool retVal = getAttributeByIndex( index, out _key, out _value );
key = ( XmlString )_key; value = ( XmlString )_value;
return retVal;
}
// Get XML Node attribute for specified key.
public override string getAttr( string key )
{
return GetValue( key );
}
// Get XML Node attribute for specified key.
// Returns true if the attribute exists, false otherwise.
public override bool getAttr( string key, out string value )
{
string svalue = GetValue( key );
if ( !string.IsNullOrEmpty( svalue ) ) {
value = svalue;
return true;
}
else {
value = "";
return false;
}
}
// Get attribute value of node.
public override bool getAttr( string key, out XmlString value )
{
string v = "";
bool boHasAttribute = getAttr( key, out v );
value = v;
return boHasAttribute;
}
// Get number of child XML nodes.
public override int getChildCount( ) { return ( int )_node( ).nChildCount; }
// Get XML Node child nodes.
public override CryXmlNodeRef getChild( int i )
{
CryXMLNode pNode = _node( );
if ( i < 0 || i > ( int )pNode.nChildCount ) {
return null;
}
CryXmlNodeRef n = m_pData.pBinaryNodes[m_pData.pChildIndices[pNode.nFirstChildIndex + i]];
return n;
}
// Find node with specified tag.
public override CryXmlNodeRef findChild( string tag )
{
CryXMLNode pNode = _node( );
CryXMLNodeIndex nFirst = pNode.nFirstChildIndex;
CryXMLNodeIndex nAfterLast = pNode.nFirstChildIndex + pNode.nChildCount;
for ( CryXMLNodeIndex i = nFirst; i < nAfterLast; i++ ) {
string sChildTag = _string( m_pData.pNodes[m_pData.pChildIndices[i]].nTagStringOffset );
if ( tag == sChildTag ) {
CryXmlNodeRef n = m_pData.pBinaryNodes[m_pData.pChildIndices[i]];
return n;
}
}
return null;
}
// Get parent XML node.
public override CryXmlNodeRef getParent( )
{
CryXMLNode pNode = _node( );
if ( pNode.nParentIndex != ( CryXMLNodeIndex )( -1 ) ) { // murks..
CryXmlNodeRef n = m_pData.pBinaryNodes[pNode.nParentIndex];
return n;
}
// has no parent i.e. toplevel
return this;
}
// Returns content of this node.
public override string getContent( ) { return _string( _node( ).nContentStringOffset ); }
}
}

@ -0,0 +1,232 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;
namespace SCJMapper_V2.CryXMLlib
{
/// <summary>
/// Inspired... by work from CryEngine: XMLBinaryReader.h/.cpp:
/// ---------------------------------------------------------------------------
/// Copyright 2006 Crytek GmbH
/// Created by: Michael Smith
/// ---------------------------------------------------------------------------
///
/// BUT uses a complete different memory management and processing eliminating extensive Ptr juggling from C++
/// </summary>
public class CryXmlBinReader
{
/// <summary>
/// The processing result Enum
/// </summary>
public enum EResult
{
Success,
NotBinXml,
Error,
}
private String m_errorDescription = "";
private void SetErrorDescription( String text )
{
m_errorDescription = text;
}
/// <summary>
/// Get error information if something goes wrong
/// </summary>
/// <returns>The error description</returns>
public String GetErrorDescription( ) { return m_errorDescription; }
/// <summary>
/// Load a Cry Binary XML file into memory and return the NodeRef for the root element
/// </summary>
/// <param name="filename">The file to read</param>
/// <param name="result">Read result</param>
/// <returns>The NodeRef of the root element or NULL</returns>
public CryXmlNodeRef LoadFromFile( String filename, out EResult result )
{
m_errorDescription = "";
result = EResult.Error;
if ( !File.Exists( filename ) ) {
SetErrorDescription( "Can't open file (file not found)." );
return null;
}
BinaryReader binReader = new BinaryReader( File.Open( filename, FileMode.Open ) );
try {
UInt32 fileSize = ( UInt32 )binReader.BaseStream.Length;
if ( fileSize < CryXMLHeader.MySize( ) ) {
result = EResult.NotBinXml;
SetErrorDescription( "File is not a binary XML file (file size is too small)." );
return null;
}
// read from binary file and map the content into the memory
CryXmlBinContext pData = Create( binReader, fileSize, out result );
if ( result != EResult.Success ) return null; // Well...
// Return first node
CryXmlNodeRef n = pData.pBinaryNodes[0];
return n;
}
catch {
result = EResult.NotBinXml;
SetErrorDescription( "Exception in BinaryReader." );
return null;
}
}
/// <summary>
/// Load a Cry Binary XML buffer into memory and return the NodeRef for the root element
/// </summary>
/// <param name="filename">The byte buffer to read</param>
/// <param name="result">Read result</param>
/// <returns>The NodeRef of the root element or NULL</returns>
public CryXmlNodeRef LoadFromBuffer( byte[] binBuffer, out EResult result )
{
m_errorDescription = "";
result = EResult.Error;
UInt32 fileSize = ( UInt32 )binBuffer.Length;
try {
if ( fileSize < CryXMLHeader.MySize( ) ) {
result = EResult.NotBinXml;
SetErrorDescription( "File is not a binary XML file (file size is too small)." );
return null;
}
// read from binary file and map the content into the memory
CryXmlBinContext pData = Create( binBuffer, out result );
if ( result != EResult.Success ) return null; // Well...
// Return first node
CryXmlNodeRef n = pData.pBinaryNodes[0];
return n;
}
catch {
result = EResult.NotBinXml;
SetErrorDescription( "Exception in buffer reader" );
return null;
}
}
/// <summary>
/// Reads the binary file into the internal structures
/// Note: use GetErrorDescription() if the result is not Success
/// </summary>
/// <param name="bReader">An open binary reader</param>
/// <param name="size">The length to read</param>
/// <param name="result">Out: the result of the collection of file content</param>
/// <returns>A valid memory context or null</returns>
private CryXmlBinContext Create( BinaryReader bReader, UInt32 size, out EResult result )
{
result = EResult.Error;
// read data from file into a local buffer
byte[] fileContents = bReader.ReadBytes( ( int )size ); // get all from the reader
return Create( fileContents, out result );
}
/// <summary>
/// Reads the binary buffer into the internal structures
/// Note: use GetErrorDescription() if the result is not Success
/// </summary>
/// <param name="fileContents">An filled byte buffer</param>
/// <param name="result">Out: the result of the collection of file content</param>
/// <returns>A valid memory context or null</returns>
private CryXmlBinContext Create( byte[] fileContents, out EResult result )
{
result = EResult.Error;
CryXmlBinContext pData = new CryXmlBinContext( );
if ( pData == null ) {
SetErrorDescription( "Can't allocate memory for binary XML object." );
return null;
}
CryXMLHeader header = Conversions.ByteToType<CryXMLHeader>( fileContents ); // reads the header, mapping from binary to struct
if ( !header.HasCorrectSignature ) {
SetErrorDescription( "File is not a binary XML object (wrong header signature)." );
return null;
}
// Create binary nodes to wrap the ones to read later
pData.pBinaryNodes = new List<CryXmlBinNode>( ); // dynamic list used, not an array
for ( int i=0; i < header.nNodeCount; i++ ) { pData.pBinaryNodes.Add( new CryXmlBinNode( ) ); }
// map file content to binary.. here we really allocate arrays of elements and copy rather than the original which worked well with ptrs in c++
try {
pData.pAttributes = ( CryXMLAttribute[] )Array.CreateInstance( typeof( CryXMLAttribute ), header.nAttributeCount ); // alloc enough
UInt32 incr = CryXMLAttribute.MySize( ); // size of one element to read
for ( UInt32 aIdx=0; aIdx < header.nAttributeCount; aIdx++ ) {
pData.pAttributes[aIdx] = Conversions.ByteToType<CryXMLAttribute>( fileContents, header.nAttributeTablePosition + aIdx * incr );
}
}
catch ( Exception e ) {
SetErrorDescription( string.Format( "EXC Attributes: {0}", e.Message ) );
return null;
}
try {
pData.pChildIndices = ( CryXMLNodeIndex[] )Array.CreateInstance( typeof( CryXMLNodeIndex ), header.nChildCount ); // alloc enough
UInt32 incr = CryXMLNodeIndex.MySize( ); // size of one element to read
for ( UInt32 aIdx=0; aIdx < header.nChildCount; aIdx++ ) {
pData.pChildIndices[aIdx] = Conversions.ByteToType<CryXMLNodeIndex>( fileContents, header.nChildTablePosition + aIdx * incr );
}
}
catch ( Exception e ) {
SetErrorDescription( string.Format( "EXC ChildIndices: {0}", e.Message ) );
return null;
}
try {
pData.pNodes = ( CryXMLNode[] )Array.CreateInstance( typeof( CryXMLNode ), header.nNodeCount ); // alloc enough
UInt32 incr = CryXMLNode.MySize( ); // size of one element to read
for ( UInt32 aIdx=0; aIdx < header.nNodeCount; aIdx++ ) {
pData.pNodes[aIdx] = Conversions.ByteToType<CryXMLNode>( fileContents, header.nNodeTablePosition + aIdx * incr );
}
}
catch ( Exception e ) {
SetErrorDescription( string.Format( "EXC Nodes: {0}", e.Message ) );
return null;
}
try {
pData.pStringDataLength = header.nStringDataSize;
pData.pStringData = fileContents.SliceL( header.nStringDataPosition, header.nStringDataSize );
}
catch ( Exception e ) {
SetErrorDescription( string.Format( "EXC StringData: {0}", e.Message ) );
return null;
}
// init binary nodes
for ( UInt32 nNode = 0; nNode < header.nNodeCount; ++nNode ) {
pData.pBinaryNodes[( int )nNode].m_pData = pData; // add data space
pData.pBinaryNodes[( int )nNode].m_pNodeIndex = nNode; // self ref..
}
// and back..
result = EResult.Success;
return pData;
}
}
}

@ -0,0 +1,120 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SCJMapper_V2.CryXMLlib
{
/// <summary>
/// Derived work from CryEngine: IXml.h:
///
/// Crytek Engine Source File.
/// Copyright (C), Crytek Studios, 2002.
/// -------------------------------------------------------------------------
/// File name: ixml.h
/// Version: v1.00
/// Created: 16/7/2002 by Timur.
/// Compilers: Visual Studio.NET
/// Description:
// -------------------------------------------------------------------------
/// </summary>
// Summary:
// XmlNodeRef, wrapper class IXmlNode.
// See also:
// IXmlNode
public class CryXmlNodeRef
{
// CLASS
private IXmlNode p = null;
public CryXmlNodeRef( ) { }
public CryXmlNodeRef( IXmlNode p_ )
{
p = p_;
}
public CryXmlNodeRef( CryXmlNodeRef p_ )
{
p = p_.p;
}
~CryXmlNodeRef( )
{
p = null;
}
// conversions
/// <summary>
/// Implicitly converts a XmlString to a IXmlNode.
/// </summary>
/// <param name="value">The IXmlNode to convert.</param>
/// <returns>A new XmlString with the specified value.</returns>
public static implicit operator CryXmlNodeRef( IXmlNode value )
{
return new CryXmlNodeRef( value );
}
/// <summary>
/// Implicitly converts a IXmlNode to a XmlNodeRef.
/// </summary>
/// <param name="value">The XmlNodeRef to convert.</param>
/// <returns>A new IXmlNode with the specified value.</returns>
public static implicit operator IXmlNode( CryXmlNodeRef value )
{
return value.p;
}
// Misc compare functions.
public static bool operator ==( CryXmlNodeRef p1, CryXmlNodeRef p2 )
{
// If both are null, or both are same instance, return true.
if ( System.Object.ReferenceEquals( p1, p2 ) ) {
return true;
}
// If one is null, but not both, return false.
if ( ( ( object )p1 == null ) || ( ( object )p2 == null ) ) {
return false;
}
// Return true if the fields match:
return p1 == p2;
}
public static bool operator !=( CryXmlNodeRef p1, CryXmlNodeRef p2 ) { return p1 != p2; }
public override bool Equals( System.Object obj )
{
// If parameter is null return false.
if ( obj == null ) {
return false;
}
// If parameter cannot be cast to Point return false.
CryXmlNodeRef objP = obj as CryXmlNodeRef;
if ( ( System.Object )p == null ) {
return false;
}
// Return true if the fields match:
return ( p == objP.p );
}
public bool Equals( CryXmlNodeRef objP )
{
// If parameter is null return false:
if ( ( object )objP == null ) {
return false;
}
// Return true if the fields match:
return ( p == objP.p );
}
public override int GetHashCode( )
{
return base.GetHashCode( ) ^ p.GetHashCode( );
}
}
}

@ -0,0 +1,101 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SCJMapper_V2.CryXMLlib
{
/// <summary>
/// Processes a CryXmlNodeRef and reports the node and its childs as XML string list
/// </summary>
public class XmlTree
{
private List<string> m_doc = new List<string>( ); // internal list of strings
/// <summary>
/// Return the derived XML text as List of strings
/// </summary>
public List<string> XML_list { get { return m_doc; } }
/// <summary>
/// Return the derived XML text as string
/// </summary>
public string XML_string
{
get {
string xml = "";
foreach ( string s in m_doc ) xml += string.Format( "{0}\n", s );
return xml;
}
}
/// <summary>
/// Processes all attributed of a node
/// </summary>
/// <param name="nodeRef">The node to process</param>
/// <returns>an string containing all attributes in XML compatible format ( key="value" )</returns>
private string DoAttribute( CryXmlNodeRef nodeRef )
{
IXmlNode node = nodeRef;
string xml = "";
// collect all attributes into one line
for ( int ac=0; ac < node.getNumAttributes( ); ac++ ) {
string key = ""; string value = "";
node.getAttributeByIndex(ac, out key, out value );
xml += string.Format( " {0}=\"{1}\" ", key, value);
}
return xml;
}
/// <summary>
/// Processes a node and it's children
/// </summary>
/// <param name="nodeRef">The node to process</param>
/// <param name="level">The depth of the node to indent the XML text</param>
private void DoNode( CryXmlNodeRef nodeRef, int level )
{
string tabs = "".PadRight(level, '\t'); // level is depth - will be left padded with Tabs on Add()
string xml = "";
IXmlNode node = nodeRef;
// first gather and handle the attributes
string attr = DoAttribute( nodeRef );
xml = string.Format( "<{0} {1} ", node.getTag( ), attr );
// then do some formatting dependent of child nodes to be printed
if ( node.getChildCount( ) < 1 ) {
// no child - close with end tag immediately
xml += string.Format( "/>" ); m_doc.Add( tabs + xml ); // add line w/o NL
}
else {
// with children - close tag only
xml += string.Format( ">" ); m_doc.Add( tabs + xml ); // add line w/o NL
// do the children
for ( int cc=0; cc < node.getChildCount( ); cc++ ) {
CryXmlNodeRef childRef = node.getChild( cc );
DoNode( childRef, level+1 ); // recursion
}
xml = string.Format( "</{0}>\n", node.getTag( ) ); m_doc.Add( tabs + xml ); // add line with NL to space them
}
}
/// <summary>
/// Processes a CryXmlNodeRef to derive the XML formatted structure
/// Note: the created XML text can be retrieved through the XML property of this object
/// </summary>
/// <param name="rootRef">The node to start from</param>
public void BuildXML( CryXmlNodeRef rootRef )
{
m_doc.Clear( );
DoNode( rootRef, 0 );
}
}
}

@ -5,6 +5,8 @@ using System.Text;
using Ionic.Zip;
using System.IO;
using SCJMapper_V2.CryXMLlib;
namespace SCJMapper_V2
{
@ -16,6 +18,11 @@ namespace SCJMapper_V2
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod( ).DeclaringType );
/// <summary>
/// Ref to the used defaultProfile to inform the user about it.
/// </summary>
public static String UsedDefProfile = "n.a.";
/// <summary>
/// Returns a list of files found that match 'defaultProfile*.xml'
/// 20151220BM: return only the single defaultProfile name
@ -28,6 +35,7 @@ namespace SCJMapper_V2
/// <summary>
/// Returns the sought default profile as string from GameData.pak
/// SC Alpha 2.2: Have to find the new one in E:\G\StarCitizen\StarCitizen\Public\Data\DataXML.pak (contains the binary XML now)
/// </summary>
/// <param name="defaultProfileName">The filename of the profile to be extracted </param>
/// <returns>A string containing the file contents</returns>
@ -37,29 +45,89 @@ namespace SCJMapper_V2
String retVal = "";
// first choice a defaultProfile.xml in the app dir distributed with the application ??? to be deleted ???
// first choice a defaultProfile.xml in the app dir distributed with the application ??? to be deleted ???
if ( File.Exists( SCPath.DefaultProfileName ) ) {
using ( StreamReader sr = new StreamReader( SCPath.DefaultProfileName ) ) {
retVal = sr.ReadToEnd( );
log.Info( "- Use AppDirectory defaultProfile" );
UsedDefProfile = "AppDirectory defaultProfile";
log.InfoFormat( "- Use {0}", UsedDefProfile );
return retVal; // EXIT
}
}
else {
// second try to get the SC defaultProfile from the GameData.pak
retVal = ExtractDefaultProfile( defaultProfileName );
if ( !String.IsNullOrEmpty( retVal ) ) {
log.Info( "- Use GamePack defaultProfile" );
}
else {
// last resort is the built in one
retVal = SCJMapper_V2.Properties.Resources.defaultProfile;
log.Info( "- Use built in defaultProfile" );
// second try to get the SC defaultProfile from the GameData.pak
retVal = ExtractDefaultBinProfile( defaultProfileName );
if ( !String.IsNullOrEmpty( retVal ) ) {
UsedDefProfile = "DataXML defaultProfile";
log.InfoFormat( "- Use {0}", UsedDefProfile );
return retVal; // EXIT
}
// third try to get the SC defaultProfile from the GameData.pak
retVal = ExtractDefaultProfile( defaultProfileName );
if ( !String.IsNullOrEmpty( retVal ) ) {
UsedDefProfile = "GamePack defaultProfile";
log.InfoFormat( "- Use {0}", UsedDefProfile );
return retVal; // EXIT
}
// last resort is the built in one
retVal = SCJMapper_V2.Properties.Resources.defaultProfile;
UsedDefProfile = "App Resource defaultProfile";
log.InfoFormat( "- Use {0}", UsedDefProfile );
return retVal; // EXIT
}
/// <summary>
/// Zip Extracts the file to a string
/// SC Alpha 2.2: Have to find the new one in E:\G\StarCitizen\StarCitizen\Public\Data\DataXML.pak (contains the binary XML now)
/// </summary>
static private String ExtractDefaultBinProfile( String defaultProfileName )
{
log.Debug( "ExtractDefaultBinProfile - Entry" );
String retVal = "";
if ( File.Exists( SCPath.SCDataXML_pak ) ) {
using ( ZipFile zip = ZipFile.Read( SCPath.SCDataXML_pak ) ) {
zip.CaseSensitiveRetrieval = false;
try {
ICollection<ZipEntry> gdpak = zip.SelectEntries( "name = " + "'" + defaultProfileName + "'", SCPath.DefaultProfilePath_rel );
if ( gdpak != null ) {
try {
MemoryStream mst = new MemoryStream( );
gdpak.FirstOrDefault( ).Extract( mst );
// use the binary XML reader
CryXmlNodeRef ROOT = null;
CryXmlBinReader.EResult readResult = CryXmlBinReader.EResult.Error;
CryXmlBinReader cbr = new CryXmlBinReader( );
ROOT = cbr.LoadFromBuffer( mst.ToArray( ), out readResult );
if ( readResult == CryXmlBinReader.EResult.Success ) {
XmlTree tree = new XmlTree( );
tree.BuildXML( ROOT );
retVal = tree.XML_string;
}
else {
log.ErrorFormat( " Error in CryXmlBinReader: {0}", cbr.GetErrorDescription() );
retVal = ""; // clear any remanents
}
}
catch {
retVal = ""; // clear any remanents
}
}
}
catch ( Exception ex ) {
log.Error( " Unexpected ", ex );
}
}
}
return retVal;
}
/// <summary>
/// Zip Extracts the file to a string
/// </summary>
@ -86,7 +154,7 @@ namespace SCJMapper_V2
}
}
catch ( Exception ex ) {
log.Error( "Unexpected", ex );
log.Error( " Unexpected", ex );
}
}

@ -306,6 +306,27 @@ namespace SCJMapper_V2
}
/// <summary>
/// Returns the SC DataXML.pak file path
/// SC Alpha 2.2: E:\G\StarCitizen\StarCitizen\Public\Data\DataXML.pak (contains the binary XML now)
/// </summary>
static public String SCDataXML_pak
{
get
{
log.Debug( "SCDataXML_pak - Entry" );
String scp = SCClientDataPath;
if ( String.IsNullOrEmpty( scp ) ) return "";
//
scp = Path.Combine( scp, "DataXML.pak" );
if ( File.Exists( scp ) ) return scp;
log.WarnFormat( "SCDataXML_pak - StarCitizen\\Public\\Data\\DataXML.pak file does not exist: {0}", scp );
return "";
}
}
/// <summary>
/// Returns the SC log file path to the latest logfile
/// AC 1.1.6: E:\G\StarCitizen\StarCitizen\Public\Game.log NOTE: 1.1.6 does not longer contain the needed entries .-((
@ -343,6 +364,7 @@ namespace SCJMapper_V2
/// <summary>
/// Returns the relative path of DefaultProfile.xml
/// SC Alpha 2.2: still true .. but contains the binary XML now
/// </summary>
static public String DefaultProfilePath_rel
{
@ -355,6 +377,7 @@ namespace SCJMapper_V2
/// <summary>
/// Returns the name part of the DefaultProfile w/o extension...
/// SC Alpha 2.2: still true .. but contains the binary XML now
/// </summary>
static public String DefaultProfileName
{

@ -26,8 +26,8 @@
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>52</ApplicationRevision>
<ApplicationVersion>2.19.0.%2a</ApplicationVersion>
<ApplicationRevision>55</ApplicationRevision>
<ApplicationVersion>2.21.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
@ -165,6 +165,14 @@
<Compile Include="actions\ActionMapsCls.cs" />
<Compile Include="actions\ActionTree.cs" />
<Compile Include="SC\ActivationModes.cs" />
<Compile Include="SC\CryXMLlib\Conversions.cs" />
<Compile Include="SC\CryXMLlib\CryIXml.cs" />
<Compile Include="SC\CryXMLlib\CryXmlBinContext.cs" />
<Compile Include="SC\CryXMLlib\CryXmlBinHeader.cs" />
<Compile Include="SC\CryXMLlib\CryXmlBinNode.cs" />
<Compile Include="SC\CryXMLlib\CryXmlBinReader.cs" />
<Compile Include="SC\CryXMLlib\CryXmlNodeRef.cs" />
<Compile Include="SC\CryXMLlib\XmlTree.cs" />
<Compile Include="SC\DProfileReader.cs" />
<Compile Include="Joystick\JoystickCls.cs" />
<Compile Include="actions\MyColors.cs" />

@ -56,10 +56,14 @@ namespace SCJMapper_V2
if ( string.IsNullOrEmpty( value ) ) { // no Input - insert input empty
Input = ""; // empty one
}
else if ( value.IndexOf( "_" ) == 3 ) { // fully qualified only if both exist
else if ( value.IndexOf( "_" ) == 3 ) { // fully qualified only if both exist single digit number
DevID = value.Substring( 0, 3 );
Input = value.Substring( 4 );
}
else if ( value.IndexOf( "_" ) == 4 ) { // fully qualified only if both exist 2 digit number
DevID = value.Substring( 0, 4 );
Input = value.Substring( 5 );
}
else { // no device - insert input empty
// treat as input only
Input = value;

@ -545,7 +545,7 @@ namespace SCJMapper_V2
Dirty = false;
// finally apply the filter and make it visible
FilterTree( );
ReloadTreeView( ); // performs the complete job..
}
@ -557,8 +557,8 @@ namespace SCJMapper_V2
{
ActivationModes am = new ActivationModes( ActivationMode.Default ); am.Add( ActivationMode.Default );// dummy answer Default is Default and selected is Default
if ( ( Ctrl.SelectedNode.Level == 0 ) || ( Ctrl.SelectedNode.Level > 2 ) ) return am;
if ( Ctrl.SelectedNode == null ) return am; // ERROR exit
if ( ( Ctrl.SelectedNode.Level == 0 ) || ( Ctrl.SelectedNode.Level > 2 ) ) return am;
if ( Ctrl.SelectedNode.Parent == null ) return am; // ERROR exit
// has a parent - must be level 1 or 2
@ -588,8 +588,8 @@ namespace SCJMapper_V2
/// </summary>
public void UpdateActivationModeSelectedItem( string newActivationModeName )
{
if ( ( Ctrl.SelectedNode.Level == 0 ) || ( Ctrl.SelectedNode.Level > 2 ) ) return;
if ( Ctrl.SelectedNode == null ) return; // ERROR exit
if ( ( Ctrl.SelectedNode.Level == 0 ) || ( Ctrl.SelectedNode.Level > 2 ) ) return;
if ( Ctrl.SelectedNode.Parent == null ) return; // ERROR exit
// has a parent - must be level 1 or 2
@ -634,8 +634,8 @@ namespace SCJMapper_V2
/// <param name="input">The new Text property</param>
public Boolean UpdateSelectedItem( String input, ActionCls.ActionDevice inKind, Boolean checkKind )
{
if ( ( Ctrl.SelectedNode.Level == 0 ) || ( Ctrl.SelectedNode.Level > 2 ) ) return false; // ERROR exit
if ( Ctrl.SelectedNode == null ) return false; // ERROR exit
if ( ( Ctrl.SelectedNode.Level == 0 ) || ( Ctrl.SelectedNode.Level > 2 ) ) return false; // ERROR exit
if ( Ctrl.SelectedNode.Parent == null ) return false; // ERROR exit
// has a parent - must be level 1 or 2
@ -1067,10 +1067,11 @@ namespace SCJMapper_V2
}
// now the mapped actions
const int padAction = 42;
const int padDevice = 4;
const int padInput = 25;
repList += String.Format( "\n" );
repList += String.Format( " {0}+- {1} _ {2}#-[{4}] {3}\n\n", "Action".PadRight( padAction ), "Dev", "Binding".PadRight( padInput ), "Activation", "T" ); // col description line
repList += String.Format( " {0}+- {1} _ {2}#-[{4}] {3}\n\n", "Action".PadRight( padAction ), "Dev".PadRight( padDevice ), "Binding".PadRight( padInput ), "Activation", "T" ); // col description line
foreach ( ActionMapCls acm in ActionMaps ) {
String rep = String.Format( "*** {0}\n", acm.name );
@ -1080,10 +1081,10 @@ namespace SCJMapper_V2
if ( ShowAction( ac.actionDevice, acc.Input ) ) {
if ( !String.IsNullOrEmpty( acc.Input ) /* && !( acc.Input == DeviceCls.BlendedInput )*/ ) {
if ( acc.DevInput == ac.defBinding ) {
rep = String.Format( " {0} . {1} _ {2}", ac.name.PadRight( padAction ), acc.DevID, acc.Input.PadRight( padInput ) );
rep = String.Format( " {0} . {1} _ {2}", ac.name.PadRight( padAction ), acc.DevID.PadRight( padDevice ), acc.Input.PadRight( padInput ) );
}
else {
rep = String.Format( " {0} + {1} _ {2}", ac.name.PadRight( padAction ), acc.DevID, acc.Input.PadRight( padInput ) ); // my binding
rep = String.Format( " {0} + {1} _ {2}", ac.name.PadRight( padAction ), acc.DevID.PadRight( padDevice ), acc.Input.PadRight( padInput ) ); // my binding
}
if ( acc.ActivationMode == ActivationMode.Default ) {
rep += String.Format( " . [{1}] {0}\n", ac.defActivationMode.Name, ac.defActivationMode.MultiTap );

@ -10,8 +10,10 @@ namespace SCJMapper_V2
/// </summary>
class MyColors
{
static public Color[] TabColor = { Color.LightGreen, Color.LightBlue, Color.Khaki, Color.LightSalmon, Color.Beige, Color.Yellow, Color.Plum, Color.MintCream };
static public Color GamepadColorDefault = Color.Pink; // will be changed on init (else we see pink..)
static public Color[] TabColor = { Color.LightGreen, Color.LightBlue, Color.Khaki, Color.LightSalmon,
Color.Beige, Color.Yellow, Color.Plum, Color.MintCream,
Color.LightCyan, Color.MistyRose, Color.Wheat, Color.Pink };
static public Color GamepadColorDefault = Color.Fuchsia; // will be changed on init (else we see pink..)
static public Color[] MapColor = ( System.Drawing.Color[] )TabColor.Clone( );
static public Color GamepadColor = GamepadColorDefault;

File diff suppressed because it is too large Load Diff

@ -1,10 +1,10 @@
SC Joystick Mapper V 2.18 - Build 51 BETA
(c) Cassini, StandardToaster - 02-January-2016
SC Joystick Mapper V 2.21 - Build 55 BETA
(c) Cassini, StandardToaster - 06-March-2016
Contains 9 files:
SCJMapper.exe The program (V2.18)
SCJMapper.exe.config Program config (V2.18) - MUST be in the same folder as the Exe file
SCJMapper.exe The program (V2.21)
SCJMapper.exe.config Program config (V2.21) - 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
SharpDX.dll Managed DirectX Assembly - MUST be in the same folder as the Exe file
OpenTK.dll Managed OpenGL Assembly - MUST be in the same folder as the Exe file
@ -13,7 +13,7 @@ Ionic.Zip.Reduced.dll Managed Zip Assembly - MUST be in th
log4net.dll Managed Logging Assembly - MUST be in the same folder as the Exe file
log4net.config.OFF Config file for logging - To use it - rename as log4net.config and run the program
then look for trace.log in the same folder
SCJMapper_QGuide V2.18beta.pdf Quick Guide
SCJMapper_QGuide V2.21beta.pdf Quick Guide
ReadMe.txt This file
graphics folder Skybox Images - graphics folder MUST be in the same folder as the Exe file
@ -29,6 +29,19 @@ Scanned for viruses before packing...
cassini@burri-web.org
Changelog:
V 2.21 - BETA Build 55
- fix #40 added Tab entry in Ctrl. context menu
- fix - try to fix Win10 scaling issues (hidden assignment area)
- fix - profile tree color indication also applied when re-reading defaultProfile
- improvement - enumerates up to 12 devices now (though not tested as I don't have 12 ..)
- add - use of SCA 2.2 provided defaultProfile (new location and format)
- add - indication of the used defaultProfile
- add - built in defaultProfile updated to SCA 2.2
V 2.19 - BETA Build 52
- fix #37 improved defaultProfile Parsing
- fix #38 locale issue - changed App number formatting to US
- fix #39 changed equal to equals string for kbd entry
- add - default actionmap to choose from (it is on the ignore list)
V 2.18 - BETA Build 51
- fix - layout works now for Win10
- fix - uses game defaultProfile again

Binary file not shown.
Loading…
Cancel
Save