- new feature #16 - allow reassignment of the jsN group

- improvement - uniquely identified devices with the same name (use GUID)
- improvement - shows jsN assignment in Joystick tab
- improvement - detection of the SC install path extended to one more Registry entry
- fix - blend unmapped works properly now
- fix #16 - manual entry of SC directory works now
- update doc
pull/20/head v2.3
bm98 10 years ago
parent 837c2c9e8b
commit 8e46f91780

219
Form1.Designer.cs generated

@ -46,14 +46,6 @@
this.tsiSaveAs = new System.Windows.Forms.ToolStripMenuItem();
this.btGrab = new System.Windows.Forms.Button();
this.btDump = new System.Windows.Forms.Button();
this.panel3 = new System.Windows.Forms.Panel();
this.label56 = new System.Windows.Forms.Label();
this.label55 = new System.Windows.Forms.Label();
this.label57 = new System.Windows.Forms.Label();
this.label54 = new System.Windows.Forms.Label();
this.cbJs3 = new System.Windows.Forms.ComboBox();
this.cbJs2 = new System.Windows.Forms.ComboBox();
this.cbJs1 = new System.Windows.Forms.ComboBox();
this.panel2 = new System.Windows.Forms.Panel();
this.cbxThrottle = new System.Windows.Forms.CheckBox();
this.btFind = new System.Windows.Forms.Button();
@ -80,11 +72,12 @@
this.tlpanel = new System.Windows.Forms.TableLayoutPanel();
this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.cbxBlendUnmapped = new System.Windows.Forms.CheckBox();
this.txFilter = new System.Windows.Forms.TextBox();
this.btClearFilter = new System.Windows.Forms.Button();
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.btSettings = new System.Windows.Forms.Button();
this.cbxBlendUnmapped = new System.Windows.Forms.CheckBox();
this.btJsReassign = new System.Windows.Forms.Button();
this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();
this.btSaveMyMapping = new System.Windows.Forms.Button();
this.btLoadMyMapping = new System.Windows.Forms.Button();
@ -107,7 +100,6 @@
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
this.UC_JoyPanel = new SCJMapper_V2.UC_JoyPanel();
this.cmCopyPaste.SuspendLayout();
this.panel3.SuspendLayout();
this.panel2.SuspendLayout();
this.tc1.SuspendLayout();
this.tabJS1.SuspendLayout();
@ -143,7 +135,6 @@
// rtb
//
this.rtb.AcceptsTab = true;
this.rtb.BackColor = System.Drawing.Color.Ivory;
this.rtb.ContextMenuStrip = this.cmCopyPaste;
this.rtb.DetectUrls = false;
this.rtb.Dock = System.Windows.Forms.DockStyle.Fill;
@ -151,7 +142,7 @@
this.rtb.Location = new System.Drawing.Point(606, 81);
this.rtb.Name = "rtb";
this.tlpanel.SetRowSpan(this.rtb, 2);
this.rtb.Size = new System.Drawing.Size(372, 667);
this.rtb.Size = new System.Drawing.Size(372, 653);
this.rtb.TabIndex = 21;
this.rtb.Text = "";
this.rtb.WordWrap = false;
@ -237,102 +228,6 @@
this.btDump.UseVisualStyleBackColor = true;
this.btDump.Click += new System.EventHandler(this.btDump_Click);
//
// panel3
//
this.panel3.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panel3.Controls.Add(this.label56);
this.panel3.Controls.Add(this.label55);
this.panel3.Controls.Add(this.label57);
this.panel3.Controls.Add(this.label54);
this.panel3.Controls.Add(this.cbJs3);
this.panel3.Controls.Add(this.cbJs2);
this.panel3.Controls.Add(this.cbJs1);
this.panel3.Location = new System.Drawing.Point(3, 294);
this.panel3.Name = "panel3";
this.panel3.Size = new System.Drawing.Size(289, 118);
this.panel3.TabIndex = 18;
//
// label56
//
this.label56.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label56.Location = new System.Drawing.Point(7, 89);
this.label56.Name = "label56";
this.label56.Size = new System.Drawing.Size(39, 20);
this.label56.TabIndex = 2;
this.label56.Text = "js3";
//
// label55
//
this.label55.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label55.Location = new System.Drawing.Point(7, 62);
this.label55.Name = "label55";
this.label55.Size = new System.Drawing.Size(39, 20);
this.label55.TabIndex = 2;
this.label55.Text = "js2";
//
// label57
//
this.label57.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label57.Location = new System.Drawing.Point(7, 9);
this.label57.Name = "label57";
this.label57.Size = new System.Drawing.Size(267, 20);
this.label57.TabIndex = 2;
this.label57.Text = "SC-Device to Joystick Mapping";
//
// label54
//
this.label54.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label54.Location = new System.Drawing.Point(7, 35);
this.label54.Name = "label54";
this.label54.Size = new System.Drawing.Size(39, 20);
this.label54.TabIndex = 2;
this.label54.Text = "js1";
//
// cbJs3
//
this.cbJs3.DisplayMember = "js1";
this.cbJs3.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.cbJs3.FormattingEnabled = true;
this.cbJs3.Items.AddRange(new object[] {
"Joystick 1",
"Joystick 2",
"Joystick 3"});
this.cbJs3.Location = new System.Drawing.Point(52, 86);
this.cbJs3.MaxDropDownItems = 4;
this.cbJs3.Name = "cbJs3";
this.cbJs3.Size = new System.Drawing.Size(233, 25);
this.cbJs3.TabIndex = 0;
//
// cbJs2
//
this.cbJs2.DisplayMember = "js1";
this.cbJs2.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.cbJs2.FormattingEnabled = true;
this.cbJs2.Items.AddRange(new object[] {
"Joystick 1",
"Joystick 2",
"Joystick 3"});
this.cbJs2.Location = new System.Drawing.Point(52, 59);
this.cbJs2.MaxDropDownItems = 4;
this.cbJs2.Name = "cbJs2";
this.cbJs2.Size = new System.Drawing.Size(233, 25);
this.cbJs2.TabIndex = 0;
//
// cbJs1
//
this.cbJs1.DisplayMember = "js1";
this.cbJs1.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.cbJs1.FormattingEnabled = true;
this.cbJs1.Items.AddRange(new object[] {
"Joystick 1",
"Joystick 2",
"Joystick 3"});
this.cbJs1.Location = new System.Drawing.Point(52, 32);
this.cbJs1.MaxDropDownItems = 4;
this.cbJs1.Name = "cbJs1";
this.cbJs1.Size = new System.Drawing.Size(233, 25);
this.cbJs1.TabIndex = 0;
//
// panel2
//
this.panel2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
@ -344,7 +239,7 @@
this.panel2.Controls.Add(this.lblLastJ);
this.panel2.Controls.Add(this.lblAction);
this.panel2.Controls.Add(this.btAssign);
this.panel2.Location = new System.Drawing.Point(3, 418);
this.panel2.Location = new System.Drawing.Point(3, 358);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(289, 103);
this.panel2.TabIndex = 17;
@ -354,7 +249,7 @@
this.cbxThrottle.AutoSize = true;
this.cbxThrottle.Location = new System.Drawing.Point(110, 72);
this.cbxThrottle.Name = "cbxThrottle";
this.cbxThrottle.Size = new System.Drawing.Size(62, 17);
this.cbxThrottle.Size = new System.Drawing.Size(66, 17);
this.cbxThrottle.TabIndex = 13;
this.cbxThrottle.Text = "Throttle";
this.cbxThrottle.UseVisualStyleBackColor = true;
@ -374,7 +269,7 @@
this.label7.AutoSize = true;
this.label7.Location = new System.Drawing.Point(7, 37);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(25, 13);
this.label7.Size = new System.Drawing.Size(28, 13);
this.label7.TabIndex = 3;
this.label7.Text = "Ctrl.";
//
@ -383,7 +278,7 @@
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(7, 17);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(31, 13);
this.label6.Size = new System.Drawing.Size(33, 13);
this.label6.TabIndex = 3;
this.label6.Text = "Cmd.";
//
@ -464,7 +359,7 @@
this.tc1.Multiline = true;
this.tc1.Name = "tc1";
this.tc1.SelectedIndex = 0;
this.tc1.Size = new System.Drawing.Size(289, 285);
this.tc1.Size = new System.Drawing.Size(289, 349);
this.tc1.TabIndex = 15;
this.tc1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.tc1_DrawItem);
//
@ -474,7 +369,7 @@
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, 257);
this.tabJS1.Size = new System.Drawing.Size(281, 321);
this.tabJS1.TabIndex = 0;
this.tabJS1.Text = "Joystick 1";
//
@ -496,16 +391,16 @@
//
this.txRebind.Location = new System.Drawing.Point(603, 39);
this.txRebind.Name = "txRebind";
this.txRebind.Size = new System.Drawing.Size(361, 20);
this.txRebind.Size = new System.Drawing.Size(361, 22);
this.txRebind.TabIndex = 4;
this.txRebind.Text = "pp_rebindkeys";
//
// linkLblReleases
//
this.linkLblReleases.AutoSize = true;
this.linkLblReleases.Location = new System.Drawing.Point(731, 17);
this.linkLblReleases.Location = new System.Drawing.Point(672, 17);
this.linkLblReleases.Name = "linkLblReleases";
this.linkLblReleases.Size = new System.Drawing.Size(233, 13);
this.linkLblReleases.Size = new System.Drawing.Size(259, 13);
this.linkLblReleases.TabIndex = 3;
this.linkLblReleases.TabStop = true;
this.linkLblReleases.Text = "For information and updates visit us @ Github ...";
@ -516,7 +411,7 @@
this.label8.AutoSize = true;
this.label8.Location = new System.Drawing.Point(353, 42);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(54, 13);
this.label8.Size = new System.Drawing.Size(58, 13);
this.label8.TabIndex = 2;
this.label8.Text = "by Cassini";
//
@ -542,7 +437,7 @@
// buttonExit
//
this.buttonExit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.buttonExit.Location = new System.Drawing.Point(171, 39);
this.buttonExit.Location = new System.Drawing.Point(171, 53);
this.buttonExit.Name = "buttonExit";
this.buttonExit.Size = new System.Drawing.Size(120, 24);
this.buttonExit.TabIndex = 13;
@ -588,7 +483,7 @@
this.tlpanel.Padding = new System.Windows.Forms.Padding(3);
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.Absolute, 540F));
this.tlpanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 500F));
this.tlpanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 65F));
this.tlpanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 35F));
this.tlpanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 35F));
@ -598,13 +493,12 @@
// flowLayoutPanel1
//
this.flowLayoutPanel1.Controls.Add(this.tc1);
this.flowLayoutPanel1.Controls.Add(this.panel3);
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(306, 81);
this.flowLayoutPanel1.Name = "flowLayoutPanel1";
this.flowLayoutPanel1.Size = new System.Drawing.Size(294, 534);
this.flowLayoutPanel1.Size = new System.Drawing.Size(294, 494);
this.flowLayoutPanel1.TabIndex = 22;
//
// tableLayoutPanel1
@ -615,11 +509,12 @@
this.tableLayoutPanel1.Controls.Add(this.btDump, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.btGrab, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.btDumpList, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.cbxBlendUnmapped, 0, 4);
this.tableLayoutPanel1.Controls.Add(this.txFilter, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.btClearFilter, 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(306, 621);
this.tableLayoutPanel1.Location = new System.Drawing.Point(306, 581);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 5;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
@ -627,15 +522,26 @@
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, 127);
this.tableLayoutPanel1.Size = new System.Drawing.Size(294, 153);
this.tableLayoutPanel1.TabIndex = 23;
//
// cbxBlendUnmapped
//
this.cbxBlendUnmapped.AutoSize = true;
this.cbxBlendUnmapped.Location = new System.Drawing.Point(3, 123);
this.cbxBlendUnmapped.Name = "cbxBlendUnmapped";
this.cbxBlendUnmapped.Size = new System.Drawing.Size(115, 17);
this.cbxBlendUnmapped.TabIndex = 15;
this.cbxBlendUnmapped.Text = "Blend unmapped";
this.cbxBlendUnmapped.UseVisualStyleBackColor = true;
this.cbxBlendUnmapped.CheckedChanged += new System.EventHandler(this.cbxBlendUnmapped_CheckedChanged);
//
// txFilter
//
this.txFilter.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.txFilter.Location = new System.Drawing.Point(3, 67);
this.txFilter.Location = new System.Drawing.Point(3, 65);
this.txFilter.Name = "txFilter";
this.txFilter.Size = new System.Drawing.Size(120, 20);
this.txFilter.Size = new System.Drawing.Size(120, 22);
this.txFilter.TabIndex = 25;
this.txFilter.WordWrap = false;
this.txFilter.TextChanged += new System.EventHandler(this.txFilter_TextChanged);
@ -657,38 +563,36 @@
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel2.Controls.Add(this.buttonExit, 1, 1);
this.tableLayoutPanel2.Controls.Add(this.btSettings, 0, 1);
this.tableLayoutPanel2.Controls.Add(this.cbxBlendUnmapped, 0, 0);
this.tableLayoutPanel2.Controls.Add(this.btJsReassign, 0, 0);
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel2.GrowStyle = System.Windows.Forms.TableLayoutPanelGrowStyle.FixedSize;
this.tableLayoutPanel2.Location = new System.Drawing.Point(306, 754);
this.tableLayoutPanel2.Location = new System.Drawing.Point(306, 740);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.RowCount = 2;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel2.Size = new System.Drawing.Size(294, 66);
this.tableLayoutPanel2.Size = new System.Drawing.Size(294, 80);
this.tableLayoutPanel2.TabIndex = 24;
//
// btSettings
//
this.btSettings.Location = new System.Drawing.Point(3, 39);
this.btSettings.Location = new System.Drawing.Point(3, 53);
this.btSettings.Name = "btSettings";
this.btSettings.Size = new System.Drawing.Size(120, 24);
this.btSettings.TabIndex = 14;
this.btSettings.Text = "Settings";
this.btSettings.Text = "Settings...";
this.btSettings.Click += new System.EventHandler(this.btSettings_Click);
//
// cbxBlendUnmapped
// btJsReassign
//
this.cbxBlendUnmapped.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.cbxBlendUnmapped.AutoSize = true;
this.cbxBlendUnmapped.Location = new System.Drawing.Point(3, 16);
this.cbxBlendUnmapped.Name = "cbxBlendUnmapped";
this.cbxBlendUnmapped.Size = new System.Drawing.Size(106, 17);
this.cbxBlendUnmapped.TabIndex = 15;
this.cbxBlendUnmapped.Text = "Blend unmapped";
this.cbxBlendUnmapped.UseVisualStyleBackColor = true;
this.cbxBlendUnmapped.CheckedChanged += new System.EventHandler(this.cbxBlendUnmapped_CheckedChanged);
this.btJsReassign.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.btJsReassign.Location = new System.Drawing.Point(3, 23);
this.btJsReassign.Name = "btJsReassign";
this.btJsReassign.Size = new System.Drawing.Size(120, 24);
this.btJsReassign.TabIndex = 16;
this.btJsReassign.Text = "Js Reassign...";
this.btJsReassign.Click += new System.EventHandler(this.btJsReassign_Click);
//
// tableLayoutPanel3
//
@ -701,21 +605,21 @@
this.tableLayoutPanel3.Controls.Add(this.label1, 0, 0);
this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel3.GrowStyle = System.Windows.Forms.TableLayoutPanelGrowStyle.FixedSize;
this.tableLayoutPanel3.Location = new System.Drawing.Point(606, 754);
this.tableLayoutPanel3.Location = new System.Drawing.Point(606, 740);
this.tableLayoutPanel3.Name = "tableLayoutPanel3";
this.tableLayoutPanel3.RowCount = 2;
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
this.tableLayoutPanel3.Size = new System.Drawing.Size(372, 66);
this.tableLayoutPanel3.Size = new System.Drawing.Size(372, 80);
this.tableLayoutPanel3.TabIndex = 25;
//
// btSaveMyMapping
//
this.btSaveMyMapping.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btSaveMyMapping.Image = ((System.Drawing.Image)(resources.GetObject("btSaveMyMapping.Image")));
this.btSaveMyMapping.Location = new System.Drawing.Point(191, 39);
this.btSaveMyMapping.Location = new System.Drawing.Point(164, 53);
this.btSaveMyMapping.Name = "btSaveMyMapping";
this.btSaveMyMapping.Size = new System.Drawing.Size(178, 24);
this.btSaveMyMapping.Size = new System.Drawing.Size(205, 24);
this.btSaveMyMapping.TabIndex = 15;
this.btSaveMyMapping.Text = "Dump and Save my Mapping";
this.btSaveMyMapping.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
@ -724,7 +628,7 @@
//
// btLoadMyMapping
//
this.btLoadMyMapping.Location = new System.Drawing.Point(3, 39);
this.btLoadMyMapping.Location = new System.Drawing.Point(3, 53);
this.btLoadMyMapping.Name = "btLoadMyMapping";
this.btLoadMyMapping.Size = new System.Drawing.Size(120, 24);
this.btLoadMyMapping.TabIndex = 14;
@ -736,9 +640,9 @@
//
this.txMappingName.Anchor = System.Windows.Forms.AnchorStyles.Right;
this.txMappingName.CharacterCasing = System.Windows.Forms.CharacterCasing.Lower;
this.txMappingName.Location = new System.Drawing.Point(135, 8);
this.txMappingName.Location = new System.Drawing.Point(135, 14);
this.txMappingName.Name = "txMappingName";
this.txMappingName.Size = new System.Drawing.Size(234, 20);
this.txMappingName.Size = new System.Drawing.Size(234, 22);
this.txMappingName.TabIndex = 0;
this.txMappingName.WordWrap = false;
this.txMappingName.TextChanged += new System.EventHandler(this.txMappingName_TextChanged);
@ -747,9 +651,9 @@
//
this.label1.Anchor = System.Windows.Forms.AnchorStyles.Right;
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(49, 11);
this.label1.Location = new System.Drawing.Point(41, 18);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(80, 13);
this.label1.Size = new System.Drawing.Size(88, 13);
this.label1.TabIndex = 16;
this.label1.Text = "Mapping name:";
//
@ -901,9 +805,10 @@
// 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, 251);
this.UC_JoyPanel.Size = new System.Drawing.Size(275, 315);
this.UC_JoyPanel.TabIndex = 0;
//
// MainForm
@ -913,6 +818,7 @@
this.ClientSize = new System.Drawing.Size(984, 862);
this.Controls.Add(this.statusStrip1);
this.Controls.Add(this.tlpanel);
this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MinimumSize = new System.Drawing.Size(1000, 900);
this.Name = "MainForm";
@ -920,7 +826,6 @@
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
this.Load += new System.EventHandler(this.MainForm_Load);
this.cmCopyPaste.ResumeLayout(false);
this.panel3.ResumeLayout(false);
this.panel2.ResumeLayout(false);
this.panel2.PerformLayout();
this.tc1.ResumeLayout(false);
@ -932,7 +837,6 @@
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.tableLayoutPanel2.ResumeLayout(false);
this.tableLayoutPanel2.PerformLayout();
this.tableLayoutPanel3.ResumeLayout(false);
this.tableLayoutPanel3.PerformLayout();
this.statusStrip1.ResumeLayout(false);
@ -949,14 +853,6 @@
private System.Windows.Forms.RichTextBox rtb;
private System.Windows.Forms.Button btGrab;
private System.Windows.Forms.Button btDump;
private System.Windows.Forms.Panel panel3;
private System.Windows.Forms.Label label56;
private System.Windows.Forms.Label label55;
private System.Windows.Forms.Label label57;
private System.Windows.Forms.Label label54;
private System.Windows.Forms.ComboBox cbJs3;
private System.Windows.Forms.ComboBox cbJs2;
private System.Windows.Forms.ComboBox cbJs1;
private System.Windows.Forms.Panel panel2;
private System.Windows.Forms.Button btFind;
private System.Windows.Forms.Label label7;
@ -1017,6 +913,7 @@
private System.Windows.Forms.TextBox txRebind;
private System.Windows.Forms.Button btSettings;
private System.Windows.Forms.CheckBox cbxBlendUnmapped;
private System.Windows.Forms.Button btJsReassign;
}
}

@ -24,7 +24,8 @@ namespace SCJMapper_V2
///<remarks>
/// Holds the DXInput Joystick List
///</remarks>
private List<JoystickCls> m_JS = new List<JoystickCls>( );
private JoystickList m_JS = new JoystickList( );
///<remarks>
/// Holds the ActionTree that manages the TreeView and the action lists
///</remarks>
@ -50,14 +51,36 @@ namespace SCJMapper_V2
}
private void LoadProfileDD( )
{
tsDDbtProfiles.DropDownItems.Clear( );
foreach ( String s in SCDefaultProfile.DefaultProfileNames ) {
tsDDbtProfiles.DropDownItems.Add( Path.GetFileNameWithoutExtension( s ) );
}
}
private void LoadMappingDD( )
{
SCMappings.UpdateMappingNames( );
tsDDbtMappings.DropDownItems.Clear( );
foreach ( String s in SCMappings.MappingNames ) {
tsDDbtMappings.DropDownItems.Add( Path.GetFileNameWithoutExtension( s ) );
}
}
/// <summary>
/// Indicates if the SC directory is a valid one
/// </summary>
private void SCFileIndication( )
{
if ( String.IsNullOrEmpty( SCPath.SCGameData_pak ) ) tsDDbtProfiles.BackColor = MyColors.InvalidColor;
else tsDDbtProfiles.BackColor = MyColors.ProfileColor;
if ( String.IsNullOrEmpty( SCPath.SCClientMappingPath ) ) tsDDbtMappings.BackColor = MyColors.InvalidColor;
else tsDDbtMappings.BackColor = MyColors.MappingColor;
}
/// <summary>
/// Handle the load event
/// </summary>
@ -88,9 +111,7 @@ namespace SCJMapper_V2
// load profiles
log.Debug( "Loading Profiles" );
foreach ( String s in SCDefaultProfile.DefaultProfileNames ) {
tsDDbtProfiles.DropDownItems.Add( Path.GetFileNameWithoutExtension( s ) );
}
LoadProfileDD( );
tsDDbtProfiles.Text = m_AppSettings.DefProfileName;
// load mappings
@ -98,6 +119,8 @@ namespace SCJMapper_V2
LoadMappingDD( );
tsDDbtMappings.Text = m_AppSettings.DefMappingName;
SCFileIndication( );
// load other defaults
log.Debug( "Loading Other" );
txMappingName.Text = m_AppSettings.MyMappingName;
@ -221,14 +244,14 @@ namespace SCJMapper_V2
m_AT.LoadTree( m_AppSettings.DefProfileName, addDefaultBinding ); // Init with default profile filepath
// default JS to Joystick mapping - can be changed and reloaded from XML
if ( tc1.TabCount > 0 ) { cbJs1.SelectedIndex = 0; m_AT.ActionMaps.js1 = cbJs1.Text; }
if ( tc1.TabCount > 1 ) { cbJs2.SelectedIndex = 1; m_AT.ActionMaps.js2 = cbJs2.Text; }
if ( tc1.TabCount > 2 ) { cbJs3.SelectedIndex = 2; m_AT.ActionMaps.js3 = cbJs3.Text; }
if ( tc1.TabCount > 3 ) { m_AT.ActionMaps.js4 = ( String )tc1.TabPages[3].Tag; }
if ( tc1.TabCount > 4 ) { m_AT.ActionMaps.js5 = ( String )tc1.TabPages[4].Tag; }
if ( tc1.TabCount > 5 ) { m_AT.ActionMaps.js6 = ( String )tc1.TabPages[5].Tag; }
if ( tc1.TabCount > 6 ) { m_AT.ActionMaps.js7 = ( String )tc1.TabPages[6].Tag; }
if ( tc1.TabCount > 7 ) { m_AT.ActionMaps.js8 = ( String )tc1.TabPages[7].Tag; }
if ( m_JS.Count > 0 ) { m_JS[0].JSAssignment = 1; m_AT.ActionMaps.js1 = m_JS[0].DevName; m_AT.ActionMaps.js1GUID = m_JS[0].DevInstanceGUID; }
if ( m_JS.Count > 1 ) { m_JS[1].JSAssignment = 2; m_AT.ActionMaps.js2 = m_JS[1].DevName; m_AT.ActionMaps.js2GUID = m_JS[1].DevInstanceGUID; }
if ( m_JS.Count > 2 ) { m_JS[2].JSAssignment = 0; } // unmapped ones go with default 0
if ( m_JS.Count > 3 ) { m_JS[3].JSAssignment = 0; }
if ( m_JS.Count > 4 ) { m_JS[4].JSAssignment = 0; }
if ( m_JS.Count > 5 ) { m_JS[5].JSAssignment = 0; }
if ( m_JS.Count > 6 ) { m_JS[6].JSAssignment = 0; }
if ( m_JS.Count > 7 ) { m_JS[7].JSAssignment = 0; }
}
@ -242,7 +265,6 @@ namespace SCJMapper_V2
// Enumerate joysticks in the system.
int tabs = 0;
cbJs1.Items.Clear( ); cbJs2.Items.Clear( ); cbJs3.Items.Clear( ); // JS dropdowns init
try {
// Initialize DirectInput
@ -255,7 +277,7 @@ namespace SCJMapper_V2
// Create the device interface
log.Debug( "Create the device interface" );
Joystick jsDevice = new Joystick( directInput, instance.InstanceGuid );
SharpDX.DirectInput.Joystick jsDevice = new Joystick( directInput, instance.InstanceGuid );
JoystickCls js = null;
log.DebugFormat( "Create the device interface for: {0}", jsDevice.Information.ProductName );
@ -263,7 +285,7 @@ namespace SCJMapper_V2
if ( tabs == 0 ) {
// first panel - The Tab content exists already
log.Debug( "Add first Joystick panel" );
js = new JoystickCls( jsDevice, this, tabs + 1, UC_JoyPanel ); // does all device related activities for that particular item
js = new JoystickCls( jsDevice, this, tabs + 1, UC_JoyPanel, tc1.TabPages[0] ); // does all device related activities for that particular item
}
else {
log.Debug( "Add next Joystick panel" );
@ -274,13 +296,12 @@ namespace SCJMapper_V2
uUC_JoyPanelNew.Size = UC_JoyPanel.Size;
uUC_JoyPanelNew.Location = UC_JoyPanel.Location;
log.Debug( "Create Joystick instance" );
js = new JoystickCls( jsDevice, this, tabs + 1, uUC_JoyPanelNew ); // does all device related activities for that particular item
js = new JoystickCls( jsDevice, this, tabs + 1, uUC_JoyPanelNew, tc1.TabPages[tabs] ); // does all device related activities for that particular item
}
m_JS.Add( js ); // add to joystick list
tc1.TabPages[tabs].Tag = js.DevName; // used to find the tab via JS mapping
tc1.TabPages[tabs].BackColor = MyColors.JColor[tabs]; // each tab has its own color
cbJs1.Items.Add( js.DevName ); cbJs2.Items.Add( js.DevName ); cbJs3.Items.Add( js.DevName ); // populate DropDowns with the JS name
// next tab
tabs++;
@ -297,7 +318,7 @@ namespace SCJMapper_V2
if ( tabs == 0 ) {
log.Warn( "Unable to find and/or create any joystick devices." );
MessageBox.Show( "Unable to create a joystick device. Program will exit.", "No joystick found", MessageBoxButtons.OK, MessageBoxIcon.Information );
MessageBox.Show( "Unable to create a joystick device. Program will exit.", "No joystick found", MessageBoxButtons.OK, MessageBoxIcon.Information );
return false;
}
@ -317,19 +338,16 @@ namespace SCJMapper_V2
/// <summary>
/// Create the jsN Joystick string from mapping (or from the JS index above item 3)
/// Get the current JsTag for the active device tab
/// </summary>
/// <returns></returns>
private String JSStr( )
{
if ( ( String )tc1.SelectedTab.Tag == ( string )cbJs1.SelectedItem ) return JoystickCls.JSTag( 1 );
if ( ( String )tc1.SelectedTab.Tag == ( string )cbJs2.SelectedItem ) return JoystickCls.JSTag( 2 );
if ( ( String )tc1.SelectedTab.Tag == ( string )cbJs3.SelectedItem ) return JoystickCls.JSTag( 3 );
return JoystickCls.JSTag( tc1.SelectedIndex + 1 ); // return the Joystick number
UC_JoyPanel jp = ( UC_JoyPanel )( tc1.SelectedTab.Controls["UC_JoyPanel"] );
return jp.JsName;
}
/// <summary>
/// Grab the rtb data and load them into config
/// </summary>
@ -337,35 +355,67 @@ namespace SCJMapper_V2
{
log.Debug( "Grab - Entry" );
m_JS.ResetJsNAssignment( );
m_AT.ActionMaps.fromXML( rtb.Text );
m_AT.ReloadCtrl( );
// JS mapping for the first 3 items can be changed and reloaded from XML
if ( !String.IsNullOrEmpty( m_AT.ActionMaps.js1 ) ) {
int i = cbJs1.FindString( m_AT.ActionMaps.js1 );
if ( i >= 0 ) cbJs1.SelectedIndex = i;
// JS mapping for js1 .. js4 can be changed and reloaded from XML
// note - unmapped ones remain what they were
// This is includes similar procedures as reassigning of the jsN items
JoystickCls j = null;
if ( !String.IsNullOrEmpty( m_AT.ActionMaps.js1GUID ) ) {
j = m_JS.Find_jsInstance( m_AT.ActionMaps.js1GUID );
}
else {
if ( tc1.TabCount > 0 ) { cbJs1.SelectedIndex = 0; m_AT.ActionMaps.js1 = cbJs1.Text; }
else if ( !String.IsNullOrEmpty( m_AT.ActionMaps.js1 ) ) {
j = m_JS.Find_jsDev( m_AT.ActionMaps.js1 );
}
if ( !String.IsNullOrEmpty( m_AT.ActionMaps.js2 ) ) {
int i = cbJs2.FindString( m_AT.ActionMaps.js2 );
if ( i >= 0 ) cbJs2.SelectedIndex = i;
if ( j != null ) {
m_AT.ActionMaps.js1GUID = j.DevInstanceGUID; // subst for missing one (version up etc.)
j.JSAssignment = 1;
}
else {
if ( tc1.TabCount > 1 ) { cbJs2.SelectedIndex = 1; m_AT.ActionMaps.js2 = cbJs2.Text; }
j = null; ;
if ( !String.IsNullOrEmpty( m_AT.ActionMaps.js2GUID ) ) {
j = m_JS.Find_jsInstance( m_AT.ActionMaps.js2GUID );
}
if ( !String.IsNullOrEmpty( m_AT.ActionMaps.js3 ) ) {
int i = cbJs3.FindString( m_AT.ActionMaps.js3 );
if ( i >= 0 ) cbJs3.SelectedIndex = i;
else if ( !String.IsNullOrEmpty( m_AT.ActionMaps.js2 ) ) {
j = m_JS.Find_jsDev( m_AT.ActionMaps.js2 );
}
else {
if ( tc1.TabCount > 2 ) { cbJs3.SelectedIndex = 2; m_AT.ActionMaps.js3 = cbJs3.Text; }
if ( j != null ) {
m_AT.ActionMaps.js2GUID = j.DevInstanceGUID; // subst for missing one (version up etc.)
j.JSAssignment = 2;
}
j = null; ;
if ( !String.IsNullOrEmpty( m_AT.ActionMaps.js3GUID ) ) {
j = m_JS.Find_jsInstance( m_AT.ActionMaps.js3GUID );
}
else if ( !String.IsNullOrEmpty( m_AT.ActionMaps.js3 ) ) {
j = m_JS.Find_jsDev( m_AT.ActionMaps.js3 );
}
if ( j != null ) {
m_AT.ActionMaps.js3GUID = j.DevInstanceGUID; // subst for missing one (version up etc.)
j.JSAssignment = 3;
}
j = null; ;
if ( !String.IsNullOrEmpty( m_AT.ActionMaps.js4GUID ) ) {
j = m_JS.Find_jsInstance( m_AT.ActionMaps.js4GUID );
}
if ( tc1.TabCount > 3 ) { m_AT.ActionMaps.js4 = ( String )tc1.TabPages[3].Tag; }
if ( tc1.TabCount > 4 ) { m_AT.ActionMaps.js5 = ( String )tc1.TabPages[4].Tag; }
if ( tc1.TabCount > 5 ) { m_AT.ActionMaps.js6 = ( String )tc1.TabPages[5].Tag; }
if ( tc1.TabCount > 6 ) { m_AT.ActionMaps.js7 = ( String )tc1.TabPages[6].Tag; }
if ( tc1.TabCount > 7 ) { m_AT.ActionMaps.js8 = ( String )tc1.TabPages[7].Tag; }
else if ( !String.IsNullOrEmpty( m_AT.ActionMaps.js4 ) ) {
j = m_JS.Find_jsDev( m_AT.ActionMaps.js4 );
}
if ( j != null ) {
m_AT.ActionMaps.js4GUID = j.DevInstanceGUID; // subst for missing one (version up etc.)
j.JSAssignment = 4;
}
// maintain the new JsN assignment and update the colorlist
List<int> newL = new List<int>( );
foreach ( JoystickCls jj in m_JS ) {
newL.Add(jj.JSAssignment);
}
JoystickCls.ReassignJsColor( newL );
m_AT.ReloadCtrl( ); // finally reload things into the tree
btDump.BackColor = btClear.BackColor; btDump.UseVisualStyleBackColor = btClear.UseVisualStyleBackColor; // neutral again
btGrab.BackColor = btClear.BackColor; btGrab.UseVisualStyleBackColor = btClear.UseVisualStyleBackColor; // neutral again
@ -445,7 +495,7 @@ namespace SCJMapper_V2
private void btAssign_Click( object sender, EventArgs e )
{
m_AT.UpdateSelectedItem( JoystickCls.MakeThrottle( lblLastJ.Text, cbxThrottle.Checked) );
m_AT.UpdateSelectedItem( JoystickCls.MakeThrottle( lblLastJ.Text, cbxThrottle.Checked ) );
if ( m_AT.Dirty ) btDump.BackColor = MyColors.DirtyColor;
}
@ -671,15 +721,15 @@ namespace SCJMapper_V2
if ( SCMappings.IsValidMappingName( txMappingName.Text ) ) {
Dump( );
if ( SCMappings.MappingFileExists( txMappingName.Text ) ) {
cancel = ( MessageBox.Show( "File exists, shall we overwrite ?", "Save XML", MessageBoxButtons.YesNo ) == System.Windows.Forms.DialogResult.No);
cancel = ( MessageBox.Show( "File exists, shall we overwrite ?", "Save XML", MessageBoxButtons.YesNo ) == System.Windows.Forms.DialogResult.No );
}
if ( !cancel ) {
rtb.SaveFile( SCMappings.MappingFileName( txMappingName.Text ), RichTextBoxStreamType.PlainText );
rtb.SaveFile( TheUser.MappingFileName( txMappingName.Text ), RichTextBoxStreamType.PlainText ); // backup copy
TheUser.BackupMappingFile( txMappingName.Text ); // backup copy of the old one
rtb.SaveFile( TheUser.MappingFileName( txMappingName.Text ), RichTextBoxStreamType.PlainText ); // also save the new one in the user space
SetRebindField( txMappingName.Text );
// get the new one into the list
SCMappings.UpdateMappingNames( );
LoadMappingDD( );
m_AppSettings.MyMappingName = txMappingName.Text; // last used - persist
txMappingName.BackColor = MyColors.SuccessColor;
@ -716,14 +766,69 @@ namespace SCJMapper_V2
// have to stop polling while the Settings window is open
timer1.Enabled = false;
if ( m_AppSettings.ShowSettings( ) != System.Windows.Forms.DialogResult.Cancel ) {
m_AppSettings.Reload( ); // must reload in case of any changes in the form
// then reload the profile and mappings
LoadProfileDD( );
LoadMappingDD( );
// indicates (in)valid folders
SCFileIndication( );
// now update the contents according to new settings
foreach ( JoystickCls j in m_JS ) j.ApplySettings( ); // update Seetings
m_AT.IgnoreMaps = m_AppSettings.IgnoreActionmaps;
// and start over with an empty tree
InitActionTree( false );
}
timer1.Enabled = true;
}
private void btJsReassign_Click( object sender, EventArgs e )
{
// have to stop polling while the Reassign window is open
timer1.Enabled = false;
if ( m_JS.ShowReassign( ) != System.Windows.Forms.DialogResult.Cancel ) {
// copy the action tree while reassigning the jsN mappings from OLD to NEW
ActionTree newTree = m_AT.ReassignJsN( m_JS.JsReassingList );
// we have still the old assignment in the ActionMap - change it here (map does not know about the devices)
JoystickCls j = null;
j = m_JS.Find_jsN( 1 );
if ( j != null ) {
newTree.ActionMaps.js1 = j.DevName; newTree.ActionMaps.js1GUID = j.DevInstanceGUID;
}
else {
newTree.ActionMaps.js1 = ""; newTree.ActionMaps.js1GUID = "";
}
j = m_JS.Find_jsN( 2 );
if ( j != null ) {
newTree.ActionMaps.js2 = j.DevName; newTree.ActionMaps.js2GUID = j.DevInstanceGUID;
}
else {
newTree.ActionMaps.js2 = ""; newTree.ActionMaps.js2GUID = "";
}
j = m_JS.Find_jsN( 3 );
if ( j != null ) {
newTree.ActionMaps.js3 = j.DevName; newTree.ActionMaps.js3GUID = j.DevInstanceGUID;
}
else {
newTree.ActionMaps.js3 = ""; newTree.ActionMaps.js3GUID = "";
}
j = m_JS.Find_jsN( 4 );
if ( j != null ) {
newTree.ActionMaps.js4 = j.DevName; newTree.ActionMaps.js4GUID = j.DevInstanceGUID;
}
else {
newTree.ActionMaps.js4 = ""; newTree.ActionMaps.js4GUID = "";
}
m_AT = newTree; // make it the valid one
m_AT.ReloadCtrl( );
if ( m_AT.Dirty ) btDump.BackColor = MyColors.DirtyColor;
}
timer1.Enabled = true;
}
// Blend Unmapped
private void cbxBlendUnmapped_CheckedChanged( object sender, EventArgs e )
@ -740,7 +845,8 @@ namespace SCJMapper_V2
#endregion
}
}

@ -392,7 +392,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAQ
DgAAAk1TRnQBSQFMAgEBBwEAAYABCQGAAQkBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
DgAAAk1TRnQBSQFMAgEBBwEAAdABCQHQAQkBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA

@ -40,8 +40,8 @@ namespace SCJMapper_V2
private void LoadSettings( )
{
// SC path
m_owner.UserSCPath = txSCPath.Text;
m_owner.UserSCPathUsed = cbxUsePath.Checked;
txSCPath.Text = m_owner.UserSCPath;
cbxUsePath.Checked = m_owner.UserSCPathUsed;
//Ignore Buttons
txJS1.Text = m_owner.IgnoreJS1;
@ -65,8 +65,8 @@ namespace SCJMapper_V2
private void SaveSettings( )
{
// SC path
txSCPath.Text = m_owner.UserSCPath;
cbxUsePath.Checked = m_owner.UserSCPathUsed;
m_owner.UserSCPath = txSCPath.Text;
m_owner.UserSCPathUsed = cbxUsePath.Checked;
//Ignore Buttons
m_owner.IgnoreJS1 = txJS1.Text;

@ -68,6 +68,32 @@ namespace SCJMapper_V2
device = JoystickCls.DeviceName;
}
/// <summary>
/// Copy return the action while reassigning the JsN Tag
/// </summary>
/// <param name="newJsList">The JsN reassign list</param>
/// <returns>The action copy with reassigned input</returns>
public ActionCls ReassignJsN( Dictionary<int,int> newJsList )
{
ActionCls newAc = new ActionCls( );
// full copy from 'this'
newAc.key = this.key;
newAc.name = this.name;
newAc.device = this.device;
newAc.defBinding = this.defBinding;
newAc.input = this.input;
// reassign the jsX part
int oldJsN = JoystickCls.JSNum(this.input);
if ( JoystickCls.IsJSValid( oldJsN ) ) {
if ( newJsList.ContainsKey(oldJsN) ) newAc.input = JoystickCls.ReassignJSTag( this.input, newJsList[oldJsN] );
}
return newAc;
}
/// <summary>
/// Merge action is simply copying the new input control
/// </summary>
@ -117,6 +143,7 @@ namespace SCJMapper_V2
if ( reader.HasAttributes ) {
device = reader["device"];
input = reader["input"];
if ( input == JoystickCls.BlendedJsInput ) input = ""; // don't carry jsx reserved into the action
key = DevID( device ) + name; // unique id of the action
// Move the reader back to the element node.
reader.ReadStartElement( "rebind" );

@ -24,6 +24,25 @@ namespace SCJMapper_V2
public String name { get; set; }
/// <summary>
/// Copy return the complete ActionMap while reassigning the JsN Tag
/// </summary>
/// <param name="newJsList">The JsN reassign list</param>
/// <returns>The ActionMap copy with reassigned input</returns>
public ActionMapCls ReassignJsN( Dictionary<int, int> newJsList )
{
ActionMapCls newMap = new ActionMapCls( );
// full copy from 'this'
newMap.name = this.name;
foreach ( ActionCls ac in this ) {
newMap.Add( ac.ReassignJsN( newJsList ) );
}
return newMap;
}
/// <summary>
/// Merge the given Map with this Map
/// new ones are ignored - we don't learn from XML input for the time beeing

@ -34,10 +34,11 @@ namespace SCJMapper_V2
public String js2 { get; set; }
public String js3 { get; set; }
public String js4 { get; set; }
public String js5 { get; set; }
public String js6 { get; set; }
public String js7 { get; set; }
public String js8 { get; set; }
public String js1GUID { get; set; }
public String js2GUID { get; set; }
public String js3GUID { get; set; }
public String js4GUID { get; set; }
/// <summary>
/// ctor
@ -45,7 +46,30 @@ namespace SCJMapper_V2
public ActionMapsCls( )
{
version = "0";
js1 = ""; js2 = ""; js3 = ""; js4 = ""; js5 = ""; js6 = ""; js7 = ""; js8 = "";
js1 = ""; js2 = ""; js3 = ""; js4 = "";
js1GUID = ""; js2GUID = ""; js3GUID = ""; js4GUID = "";
}
/// <summary>
/// Copy return all ActionMaps while reassigning the JsN Tag
/// </summary>
/// <param name="newJsList">The JsN reassign list</param>
/// <returns>The ActionMaps copy with reassigned input</returns>
public ActionMapsCls ReassignJsN( Dictionary<int, int> newJsList )
{
ActionMapsCls newMaps = new ActionMapsCls( );
// full copy from 'this'
newMaps.js1 = this.js1; newMaps.js1GUID = this.js1GUID;
newMaps.js2 = this.js2; newMaps.js2GUID = this.js2GUID;
newMaps.js3 = this.js3; newMaps.js3GUID = this.js3GUID;
newMaps.js4 = this.js4; newMaps.js4GUID = this.js4GUID;
foreach ( ActionMapCls am in this ) {
newMaps.Add( am.ReassignJsN( newJsList ) );
}
return newMaps;
}
/// <summary>
@ -79,14 +103,14 @@ namespace SCJMapper_V2
log.Debug( "toXML - Entry" );
String r = String.Format( "<ActionMaps version=\"{0}\" \n", version );
if ( !String.IsNullOrEmpty( js1 ) ) r += String.Format( "js1=\"{0}\" ", js1 );
if ( !String.IsNullOrEmpty( js2 ) ) r += String.Format( "js2=\"{0}\" ", js2 );
if ( !String.IsNullOrEmpty( js3 ) ) r += String.Format( "js3=\"{0}\" ", js3 );
if ( !String.IsNullOrEmpty( js4 ) ) r += String.Format( "js4=\"{0}\" ", js4 );
if ( !String.IsNullOrEmpty( js5 ) ) r += String.Format( "js5=\"{0}\" ", js5 );
if ( !String.IsNullOrEmpty( js6 ) ) r += String.Format( "js6=\"{0}\" ", js6 );
if ( !String.IsNullOrEmpty( js7 ) ) r += String.Format( "js7=\"{0}\" ", js7 );
if ( !String.IsNullOrEmpty( js8 ) ) r += String.Format( "js8=\"{0}\" ", js8 );
if ( !String.IsNullOrEmpty( js1 ) ) r += String.Format( "\tjs1=\"{0}\" ", js1 );
if ( !String.IsNullOrEmpty( js1GUID ) ) r += String.Format( "js1G=\"{0}\" ", js1GUID ); r += String.Format( "\n" );
if ( !String.IsNullOrEmpty( js2 ) ) r += String.Format( "\tjs2=\"{0}\" ", js2 );
if ( !String.IsNullOrEmpty( js2GUID ) ) r += String.Format( "js2G=\"{0}\" ", js2GUID ); r += String.Format( "\n" );
if ( !String.IsNullOrEmpty( js3 ) ) r += String.Format( "\tjs3=\"{0}\" ", js3 );
if ( !String.IsNullOrEmpty( js3GUID ) ) r += String.Format( "js3G=\"{0}\" ", js3GUID ); r += String.Format( "\n" );
if ( !String.IsNullOrEmpty( js4 ) ) r += String.Format( "\tjs4=\"{0}\" ", js4 );
if ( !String.IsNullOrEmpty( js4GUID ) ) r += String.Format( "js4G=\"{0}\" ", js4GUID ); r += String.Format( "\n" );
r += String.Format( ">\n");
foreach ( ActionMapCls amc in this ) {
r += String.Format( "{0}\n", amc.toXML( ) );
@ -123,10 +147,10 @@ namespace SCJMapper_V2
js2 = reader["js2"];
js3 = reader["js3"];
js4 = reader["js4"];
js5 = reader["js5"];
js6 = reader["js6"];
js7 = reader["js7"];
js8 = reader["js8"];
js1GUID = reader["js1G"];
js2GUID = reader["js2G"];
js3GUID = reader["js3G"];
js4GUID = reader["js4G"];
}
else {
return false;

@ -60,6 +60,26 @@ namespace SCJMapper_V2
}
/// <summary>
/// Copy return the complete ActionTree while reassigning JsN
/// </summary>
/// <param name="newJsList">The JsN reassign list</param>
/// <returns>The ActionTree Copy with reassigned input</returns>
public ActionTree ReassignJsN( Dictionary<int, int> newJsList )
{
ActionTree nTree = new ActionTree( BlendUnmapped );
// full copy from 'this'
nTree.m_MasterTree = this.m_MasterTree;
nTree.m_ctrl = this.m_ctrl;
nTree.IgnoreMaps = this.IgnoreMaps;
nTree.m_Filter = this.m_Filter;
nTree.ActionMaps = this.ActionMaps.ReassignJsN( newJsList );
nTree.Dirty = true;
return nTree;
}
/// <summary>
/// Instantiates a copy of the node - copies only the needed properties
/// </summary>
@ -209,7 +229,7 @@ namespace SCJMapper_V2
if ( JoystickCls.IsJSValid( jNum ) ) {
ac.input = ac.defBinding;
cn.Text += " - " + ac.defBinding;
cn.BackColor = MyColors.JColor[jNum - 1]; // color list is 0 based
cn.BackColor = JoystickCls.JColor[jNum - 1]; // color list is 0 based
}
else {
if ( BlendUnmapped ) {
@ -306,7 +326,7 @@ namespace SCJMapper_V2
// mapped
Ctrl.SelectedNode.Text = elements[0] + " - " + input;
int jNum = JoystickCls.JSNum( input );
Ctrl.SelectedNode.BackColor = MyColors.JColor[jNum - 1]; // color list is 0 based
Ctrl.SelectedNode.BackColor = JoystickCls.JColor[jNum - 1]; // color list is 0 based
}
// copy to master node
@ -339,15 +359,21 @@ namespace SCJMapper_V2
String[] elements = tnl.Text.Split( );
if ( String.IsNullOrEmpty( ac.input ) || ( ac.input == JoystickCls.BlendedJsInput ) ) {
// grabed input is not mapped
if ( JoystickCls.IsJoystick( ac.device ) && BlendUnmapped ) tnl.Text = elements[0] + " - " + JoystickCls.BlendedJsInput;
else tnl.Text = elements[0];
if ( JoystickCls.IsJoystick( ac.device ) && BlendUnmapped ) {
ac.input = JoystickCls.BlendedJsInput;
tnl.Text = elements[0] + " - " + JoystickCls.BlendedJsInput;
}
else {
ac.input = "";
tnl.Text = elements[0];
}
tnl.BackColor = Color.White;
}
else {
// mapped
int jNum = JoystickCls.JSNum( ac.input );
tnl.Text = elements[0] + " - " + ac.input;
tnl.BackColor = MyColors.JColor[jNum - 1]; // color list is 0 based
tnl.BackColor = JoystickCls.JColor[jNum - 1]; // color list is 0 based
}
}
catch {
@ -404,10 +430,6 @@ namespace SCJMapper_V2
if ( !String.IsNullOrEmpty( ActionMaps.js2 ) ) repList += String.Format( "** js2 = {0}\n", ActionMaps.js2 );
if ( !String.IsNullOrEmpty( ActionMaps.js3 ) ) repList += String.Format( "** js3 = {0}\n", ActionMaps.js3 );
if ( !String.IsNullOrEmpty( ActionMaps.js4 ) ) repList += String.Format( "** js4 = {0}\n", ActionMaps.js4 );
if ( !String.IsNullOrEmpty( ActionMaps.js5 ) ) repList += String.Format( "** js5 = {0}\n", ActionMaps.js5 );
if ( !String.IsNullOrEmpty( ActionMaps.js6 ) ) repList += String.Format( "** js6 = {0}\n", ActionMaps.js6 );
if ( !String.IsNullOrEmpty( ActionMaps.js7 ) ) repList += String.Format( "** js7 = {0}\n", ActionMaps.js7 );
if ( !String.IsNullOrEmpty( ActionMaps.js8 ) ) repList += String.Format( "** js8 = {0}\n", ActionMaps.js8 );
// now the mapped actions
repList += String.Format( "\n" );
foreach ( ActionMapCls acm in ActionMaps ) {

@ -0,0 +1,407 @@
namespace SCJMapper_V2
{
partial class FormReassign
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose( bool disposing )
{
if ( disposing && ( components != null ) ) {
components.Dispose( );
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent( )
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormReassign));
this.btCancel = new System.Windows.Forms.Button();
this.btDone = new System.Windows.Forms.Button();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.cbxStick8 = new System.Windows.Forms.ComboBox();
this.cbxStick7 = new System.Windows.Forms.ComboBox();
this.cbxStick6 = new System.Windows.Forms.ComboBox();
this.cbxStick5 = new System.Windows.Forms.ComboBox();
this.cbxStick4 = new System.Windows.Forms.ComboBox();
this.cbxStick3 = new System.Windows.Forms.ComboBox();
this.cbxStick2 = new System.Windows.Forms.ComboBox();
this.cbxStick1 = new System.Windows.Forms.ComboBox();
this.txJS7 = new System.Windows.Forms.TextBox();
this.label10 = new System.Windows.Forms.Label();
this.txJS1 = new System.Windows.Forms.TextBox();
this.txJS8 = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.label9 = new System.Windows.Forms.Label();
this.txJS2 = new System.Windows.Forms.TextBox();
this.label4 = new System.Windows.Forms.Label();
this.label8 = new System.Windows.Forms.Label();
this.txJS3 = new System.Windows.Forms.TextBox();
this.txJS6 = new System.Windows.Forms.TextBox();
this.label5 = new System.Windows.Forms.Label();
this.label7 = new System.Windows.Forms.Label();
this.txJS4 = new System.Windows.Forms.TextBox();
this.txJS5 = new System.Windows.Forms.TextBox();
this.label6 = new System.Windows.Forms.Label();
this.groupBox1.SuspendLayout();
this.SuspendLayout();
//
// btCancel
//
this.btCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.btCancel.Location = new System.Drawing.Point(565, 284);
this.btCancel.Name = "btCancel";
this.btCancel.Size = new System.Drawing.Size(108, 31);
this.btCancel.TabIndex = 27;
this.btCancel.Text = "Cancel";
this.btCancel.UseVisualStyleBackColor = true;
this.btCancel.Click += new System.EventHandler(this.btCancel_Click);
//
// btDone
//
this.btDone.Location = new System.Drawing.Point(449, 284);
this.btDone.Name = "btDone";
this.btDone.Size = new System.Drawing.Size(108, 31);
this.btDone.TabIndex = 26;
this.btDone.Text = "Accept";
this.btDone.UseVisualStyleBackColor = true;
this.btDone.Click += new System.EventHandler(this.btDone_Click);
//
// groupBox1
//
this.groupBox1.Controls.Add(this.cbxStick8);
this.groupBox1.Controls.Add(this.cbxStick7);
this.groupBox1.Controls.Add(this.cbxStick6);
this.groupBox1.Controls.Add(this.cbxStick5);
this.groupBox1.Controls.Add(this.cbxStick4);
this.groupBox1.Controls.Add(this.cbxStick3);
this.groupBox1.Controls.Add(this.cbxStick2);
this.groupBox1.Controls.Add(this.cbxStick1);
this.groupBox1.Controls.Add(this.txJS7);
this.groupBox1.Controls.Add(this.label10);
this.groupBox1.Controls.Add(this.txJS1);
this.groupBox1.Controls.Add(this.txJS8);
this.groupBox1.Controls.Add(this.label3);
this.groupBox1.Controls.Add(this.label9);
this.groupBox1.Controls.Add(this.txJS2);
this.groupBox1.Controls.Add(this.label4);
this.groupBox1.Controls.Add(this.label8);
this.groupBox1.Controls.Add(this.txJS3);
this.groupBox1.Controls.Add(this.txJS6);
this.groupBox1.Controls.Add(this.label5);
this.groupBox1.Controls.Add(this.label7);
this.groupBox1.Controls.Add(this.txJS4);
this.groupBox1.Controls.Add(this.txJS5);
this.groupBox1.Controls.Add(this.label6);
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.TabIndex = 28;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "jsN - Assginment";
//
// cbxStick8
//
this.cbxStick8.FormattingEnabled = true;
this.cbxStick8.Items.AddRange(new object[] {
"n.a.",
"js1",
"js2",
"js3",
"js4"});
this.cbxStick8.Location = new System.Drawing.Point(562, 217);
this.cbxStick8.Name = "cbxStick8";
this.cbxStick8.Size = new System.Drawing.Size(84, 21);
this.cbxStick8.TabIndex = 29;
//
// cbxStick7
//
this.cbxStick7.FormattingEnabled = true;
this.cbxStick7.Items.AddRange(new object[] {
"n.a.",
"js1",
"js2",
"js3",
"js4"});
this.cbxStick7.Location = new System.Drawing.Point(562, 189);
this.cbxStick7.Name = "cbxStick7";
this.cbxStick7.Size = new System.Drawing.Size(84, 21);
this.cbxStick7.TabIndex = 28;
//
// cbxStick6
//
this.cbxStick6.FormattingEnabled = true;
this.cbxStick6.Items.AddRange(new object[] {
"n.a.",
"js1",
"js2",
"js3",
"js4"});
this.cbxStick6.Location = new System.Drawing.Point(562, 161);
this.cbxStick6.Name = "cbxStick6";
this.cbxStick6.Size = new System.Drawing.Size(84, 21);
this.cbxStick6.TabIndex = 27;
//
// cbxStick5
//
this.cbxStick5.FormattingEnabled = true;
this.cbxStick5.Items.AddRange(new object[] {
"n.a.",
"js1",
"js2",
"js3",
"js4"});
this.cbxStick5.Location = new System.Drawing.Point(562, 133);
this.cbxStick5.Name = "cbxStick5";
this.cbxStick5.Size = new System.Drawing.Size(84, 21);
this.cbxStick5.TabIndex = 26;
//
// cbxStick4
//
this.cbxStick4.FormattingEnabled = true;
this.cbxStick4.Items.AddRange(new object[] {
"n.a.",
"js1",
"js2",
"js3",
"js4"});
this.cbxStick4.Location = new System.Drawing.Point(562, 105);
this.cbxStick4.Name = "cbxStick4";
this.cbxStick4.Size = new System.Drawing.Size(84, 21);
this.cbxStick4.TabIndex = 25;
//
// cbxStick3
//
this.cbxStick3.FormattingEnabled = true;
this.cbxStick3.Items.AddRange(new object[] {
"n.a.",
"js1",
"js2",
"js3",
"js4"});
this.cbxStick3.Location = new System.Drawing.Point(562, 77);
this.cbxStick3.Name = "cbxStick3";
this.cbxStick3.Size = new System.Drawing.Size(84, 21);
this.cbxStick3.TabIndex = 24;
//
// cbxStick2
//
this.cbxStick2.FormattingEnabled = true;
this.cbxStick2.Items.AddRange(new object[] {
"n.a.",
"js1",
"js2",
"js3",
"js4"});
this.cbxStick2.Location = new System.Drawing.Point(562, 49);
this.cbxStick2.Name = "cbxStick2";
this.cbxStick2.Size = new System.Drawing.Size(84, 21);
this.cbxStick2.TabIndex = 23;
//
// cbxStick1
//
this.cbxStick1.FormattingEnabled = true;
this.cbxStick1.Items.AddRange(new object[] {
"n.a.",
"js1",
"js2",
"js3",
"js4"});
this.cbxStick1.Location = new System.Drawing.Point(562, 21);
this.cbxStick1.Name = "cbxStick1";
this.cbxStick1.Size = new System.Drawing.Size(84, 21);
this.cbxStick1.TabIndex = 22;
//
// txJS7
//
this.txJS7.Location = new System.Drawing.Point(77, 189);
this.txJS7.Name = "txJS7";
this.txJS7.Size = new System.Drawing.Size(466, 22);
this.txJS7.TabIndex = 18;
//
// label10
//
this.label10.AutoSize = true;
this.label10.Location = new System.Drawing.Point(7, 220);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(57, 13);
this.label10.TabIndex = 21;
this.label10.Text = "Joystick 8";
//
// txJS1
//
this.txJS1.Location = new System.Drawing.Point(77, 21);
this.txJS1.Name = "txJS1";
this.txJS1.Size = new System.Drawing.Size(466, 22);
this.txJS1.TabIndex = 6;
//
// txJS8
//
this.txJS8.Location = new System.Drawing.Point(77, 217);
this.txJS8.Name = "txJS8";
this.txJS8.Size = new System.Drawing.Size(466, 22);
this.txJS8.TabIndex = 20;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(7, 24);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(57, 13);
this.label3.TabIndex = 7;
this.label3.Text = "Joystick 1";
//
// label9
//
this.label9.AutoSize = true;
this.label9.Location = new System.Drawing.Point(7, 192);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(57, 13);
this.label9.TabIndex = 19;
this.label9.Text = "Joystick 7";
//
// txJS2
//
this.txJS2.Location = new System.Drawing.Point(77, 49);
this.txJS2.Name = "txJS2";
this.txJS2.Size = new System.Drawing.Size(466, 22);
this.txJS2.TabIndex = 8;
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(7, 52);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(57, 13);
this.label4.TabIndex = 9;
this.label4.Text = "Joystick 2";
//
// label8
//
this.label8.AutoSize = true;
this.label8.Location = new System.Drawing.Point(7, 164);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(57, 13);
this.label8.TabIndex = 17;
this.label8.Text = "Joystick 6";
//
// txJS3
//
this.txJS3.Location = new System.Drawing.Point(77, 77);
this.txJS3.Name = "txJS3";
this.txJS3.Size = new System.Drawing.Size(466, 22);
this.txJS3.TabIndex = 10;
//
// txJS6
//
this.txJS6.Location = new System.Drawing.Point(77, 161);
this.txJS6.Name = "txJS6";
this.txJS6.Size = new System.Drawing.Size(466, 22);
this.txJS6.TabIndex = 16;
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(7, 80);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(57, 13);
this.label5.TabIndex = 11;
this.label5.Text = "Joystick 3";
//
// label7
//
this.label7.AutoSize = true;
this.label7.Location = new System.Drawing.Point(7, 136);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(57, 13);
this.label7.TabIndex = 15;
this.label7.Text = "Joystick 5";
//
// txJS4
//
this.txJS4.Location = new System.Drawing.Point(77, 105);
this.txJS4.Name = "txJS4";
this.txJS4.Size = new System.Drawing.Size(466, 22);
this.txJS4.TabIndex = 12;
//
// txJS5
//
this.txJS5.Location = new System.Drawing.Point(77, 133);
this.txJS5.Name = "txJS5";
this.txJS5.Size = new System.Drawing.Size(466, 22);
this.txJS5.TabIndex = 14;
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(7, 108);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(57, 13);
this.label6.TabIndex = 13;
this.label6.Text = "Joystick 4";
//
// FormReassign
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(682, 326);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.btCancel);
this.Controls.Add(this.btDone);
this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FormReassign";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Reassign Joystick Numbers";
this.Load += new System.EventHandler(this.FormReassign_Load);
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Button btCancel;
private System.Windows.Forms.Button btDone;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.TextBox txJS7;
private System.Windows.Forms.Label label10;
private System.Windows.Forms.TextBox txJS1;
private System.Windows.Forms.TextBox txJS8;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label9;
private System.Windows.Forms.TextBox txJS2;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label label8;
private System.Windows.Forms.TextBox txJS3;
private System.Windows.Forms.TextBox txJS6;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.TextBox txJS4;
private System.Windows.Forms.TextBox txJS5;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.ComboBox cbxStick2;
private System.Windows.Forms.ComboBox cbxStick1;
private System.Windows.Forms.ComboBox cbxStick8;
private System.Windows.Forms.ComboBox cbxStick7;
private System.Windows.Forms.ComboBox cbxStick6;
private System.Windows.Forms.ComboBox cbxStick5;
private System.Windows.Forms.ComboBox cbxStick4;
private System.Windows.Forms.ComboBox cbxStick3;
}
}

@ -0,0 +1,120 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
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, };
public Boolean Canceled { get; set; }
/// <summary>
/// ctor - gets the owning class instance
/// </summary>
/// <param name="owner"></param>
public FormReassign( JoystickList owner )
{
InitializeComponent( );
m_owner = owner;
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_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;
}
private void FormReassign_Load( object sender, EventArgs e )
{
int textIdx = 0;
foreach ( JoystickCls j in m_owner ) {
m_tb[textIdx++].Text = j.DevName;
}
LoadSettings( );
}
private void LoadSettings( )
{
int textIdx = 0;
m_owner.JsReassingList.Clear( );
m_owner.NewJsList.Clear( );
foreach ( JoystickCls j in m_owner ) {
m_cb[textIdx].SelectedIndex = ( j.JSAssignment <= 4 ) ? j.JSAssignment : 0;
m_owner.NewJsList.Add( m_cb[textIdx].SelectedIndex ); // old for now - new depends on Leave Button
textIdx++;
}
}
private void SaveSettings( )
{
int textIdx = 0;
m_owner.JsReassingList.Clear( );
foreach ( JoystickCls j in m_owner ) {
try {
m_owner.JsReassingList.Add( m_owner.NewJsList[textIdx], m_cb[textIdx].SelectedIndex );
m_owner.NewJsList[textIdx] = m_cb[textIdx].SelectedIndex; // save with new JsN
}
catch {
; // nothing - this is a double Old jsN (legacy without instances)
}
textIdx++;
}
}
private Boolean IsOK( )
{
int[] jsx = {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 ) ); // each Js can be set only once
}
private void btDone_Click( object sender, EventArgs e )
{
if ( IsOK( ) ) {
SaveSettings( );
Canceled = false;
this.Hide( );
}
else {
MessageBox.Show( "the same jsN was assigned to more than one Joystick - either fix it or exit with Cancel", "Accept Reassignment", MessageBoxButtons.OK );
}
}
private void btCancel_Click( object sender, EventArgs e )
{
LoadSettings( );
Canceled = true;
this.Hide( );
}
private void FormSettings_FormClosing( object sender, FormClosingEventArgs e )
{
SaveSettings( );
if ( e.CloseReason == CloseReason.UserClosing ) {
e.Cancel = true;
this.Hide( );
}
}
}
}

@ -0,0 +1,408 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAQEAAAAEAIAAoQgAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANvc
3yTb2+Ak29viJNvb4iTb2+Mk29rlJNvb5iTb3OYk29zmJNvd5yTb3uck293nJNvd5yTb3egk29vgJNvb
3STb2+Ak29vhJNvb4STb2+Ak29vhJNvb4CTb298k29vgJNvb3yTb294k29vfJNvb3STb290k29veJNvb
3STb298k29vhJNvb5CTb2+Yk29vmJNvb5CTb2+Ik29viJNvb4STb294k29vbJNvb2yTb29sk29vbJNvb
2yTb29sk29vbJNvb3STb294k29vcJNvb3iTb294k29vfJNvb3yTb298k29vfJNvb3STb29sk29vbJNvb
2yTb29sk29vbJNvb3CQHCDn6BQU/+gUFRvoFBE36BQlW+gUTYfoFHGj6BR1q+gUjbvoFKnX6BSp0+gUp
cvoFKXP6BSh0+gUWVPoFBDD6BQU7+gUFQfoFBUn6BQVE+gUFR/oFBUP6BQU7+gUFP/oFBTz6BQU4+gUF
NvoFBS36BQUv+gUFM/oFBTb6BQVB+gUFUvoFBWL6BQdx+gUGcfoFBVv6BQVO+gUFTPoFBUb6BQU1+gUF
KPoFBRr6BQUQ+gUFDvoFBQj6BQUG+gUFDfoFBSH6BQUw+gUFK/oFBTP6BQU4+gUFOfoFBT36BQU++gUF
NvoFBSX6BQUR+gUFCPoFBQX6BQUF+gUFBfoFBQb6AABE/wAASv8AAFH/AApZ/wAWZv8AI2//ACh2/wAn
dv8AL33/ADWD/wA1gv8AMX7/ADN//wAwfP8AKHT/AANI/wAAP/8AAEf/AABR/wAATf8AAEr/AABM/wAA
T/8AAE3/AABD/wAAQf8AAD7/AAA9/wAAOv8AADz/AABC/wAAUP8AAGX/AAB2/wAOhP8ACYD/AABj/wAA
Vv8AAFH/AABM/wAAQv8AADP/AAAg/wAAD/8AAAb/AAAH/wAADP8AABP/AAAj/wAALP8AADH/AAA4/wAA
P/8AAEL/AABE/wAAP/8AAB//AAAF/wAABP8AAAD/AAAA/wAAAP8AAAD/AAAA/wIDU/8AA1b/ABRh/wAk
bv8AMHj/ADR9/wA1gf8ANYH/ADiF/wA/if8AQor/AD2G/wA+h/8AOoT/ADaA/wAcZv8AAEz/AABU/wAA
Vv8AAFP/AABS/wAAVP8AAF3/AABZ/wAAT/8AAEr/AABK/wAAUP8AAEz/AABL/wAAVP8AAGX/AAB0/wAO
g/8AIJL/ABiL/wADcf8AAF7/AABV/wAATv8AAEj/AAA5/wAAI/8AABH/AAAH/wAADP8AABX/AAAk/wAA
Lv8AADb/AAA4/wAAOf8AADf/AAA5/wAAN/8AAC3/AAAM/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
Af8CC13/AA5f/wAhbP8ALXn/ADWA/wA5hP8AOob/AD6K/wBCjP8ASI//AEqS/wBFjf8AQIn/ADqD/wA3
gP8AMXv/AAZX/wAAVv8AAFP/AABS/wAAVP8AAFf/AABc/wAAW/8AAFj/AABX/wAAW/8AAGL/AABd/wAA
X/8AAmn/AAZ5/wAMgv8AHI7/AC2e/wAnl/8ACnv/AABl/wAAW/8AAFH/AABK/wAAPf8AACn/AAAd/wAA
Ev8AABH/AAAY/wAAKv8AADf/AAA8/wAAOP8AAC7/AAAe/wAAFv8AABD/AAAI/wAAAv8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAH/Ahln/wAYaP8AHmz/AC55/wA2gv8AOIX/ADqG/wBBi/8AR5D/AEuS/wBM
lP8ASpP/AEKL/wA6hP8AN4L/ADeB/wAaY/8AAEz/AABW/wAAUf8AAFT/AABa/wAAXf8AAFz/AABe/wAG
bf8ABG7/AAZv/wAGbv8AB3P/ABaB/wAaiv8AH5L/AC2e/wBArf8AOan/AByM/wAHc/8AAWr/AABg/wAA
Wf8AAFb/AABG/wAAL/8AACP/AAAn/wAAM/8AADX/AAA5/wAAOP8AADr/AAA2/wAAH/8AAA//AAAC/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAB/wIYZ/8AFmn/ABlo/wAjb/8AMHv/ADSB/wA8
hv8ARI3/AEqT/wBNlf8ATZb/AEyT/wBEi/8APYb/ADuE/wA+hv8AM33/AAJJ/wAATv8AAFP/AABU/wAA
XP8AAF3/AABj/wAAZ/8ADHX/AA95/wATfP8AGIH/ABuE/wAmlP8ALJz/ADGi/wBArv8AVL3/AFC5/wAy
n/8AHIb/ABV//wAQev8AA2//AABn/wAAXv8AAEv/AABE/wAARf8AAEj/AAA//wAAPf8AADz/AABD/wAA
Pv8AACf/AAAW/wAACv8AAAf/AAAQ/wAADP8AAAP/AAAA/wAAAP8AAAD/AAAA/wAAAf8CHGv/AB1r/wAh
bf8AJ3D/ADF4/wAzfP8AOYD/AEKJ/wBJkv8AS5P/AE2U/wBNk/8ASY//AESM/wBGjP8ASI7/AESM/wAT
W/8AAEj/AABS/wAAXf8AAGH/AABn/wAAb/8AAnL/AAt8/wAQfv8AIYn/ACyV/wA1m/8AO6T/AESt/wBM
tf8AWL//AG3K/wBuyP8AULT/ADyd/wA3lv8ALpP/AByH/wAPe/8ACnX/AAlt/wAIZ/8ABGH/AAJb/wAB
WP8AAFb/AABQ/wAARf8AADb/AAAn/wAAH/8AABf/AAAV/wAAG/8AAAv/AAAB/wAAAP8AAAD/AAAA/wAA
AP8AAAH/Ai13/wAod/8AKXf/AC54/wA1fP8AO4H/ADuC/wBFif8AUJX/AFWX/wBZmf8AXJr/AFyY/wBZ
mP8AV5j/AFWY/wBRlv8AMHz/AABS/wAAXv8AAGf/AABt/wAAc/8ABXj/AA5+/wAUhf8AGoj/AC2V/wA7
of8ARKj/AFK0/wBjwf8Ab8v/AHnT/wCR3P8Ak9z/AHrN/wBmuv8AWrH/AE2p/wBAov8AO5v/ADiX/wA1
k/8ALYr/ACSA/wAVeP8ABnD/AAFi/wAAU/8AAEX/AAAw/wAAKv8AACf/AAAi/wAAGv8AABX/AAAE/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAB/wITQf8AEUD/ABRH/wAUTv8AGlX/ACJh/wAnav8AOHj/AFCK/wVj
mf8QcKL/EnWn/wxzpv8Gbab/AGSi/wBhoP8AXqD/AFWZ/wARc/8ACXT/ABF7/wATgP8AFYH/AB2K/wAg
jv8AI5H/ACeU/wA2nv8AQqb/AFWw/wBuxv8AUrv/ADKs/wBDs/8AcM//BJLb/wCD0/8AaMH/AHXF/wBw
wf8Abb3/AGu7/wBkuP8AWbD/AEql/wA2lf8AIYH/AA1z/wABZf8AAFL/AABE/wAAM/8AACz/AAAm/wAA
Jf8AACf/AAAv/wAAHf8AAAj/AAAA/wAAAP8AAAD/AAAA/wAAAf8BABP/AAAP/wAAF/8AACL/AAAt/wAA
PP8ADE//AClm/wBEfP8BWIz/BGOW/wRlmv8CWpf/AU2R/wBHk/8APY//AEaV/wBUnf8AUJz/AFWh/wBi
q/8AZq//AF6s/wBarP8AWK3/AFCq/wBQq/8AUq//AF60/wBww/8AQ63/ABaM/wEnmf8AP6r/Ale8/xOG
0v8KbsH/B2q1/wKZ0/8AoNr/AJrY/wCO0/8AgMr/AGq//wBSrv8APZz/ACqK/wAXeP8ABWf/AABZ/wAA
Tf8AAD7/AAA1/wAALf8AACn/AAAf/wAAG/8AABD/AAAE/wAAAP8AAAD/AAAA/wAAAP8AAAH/AQIH/wAA
B/8AAAz/AAAT/wAAHv8AATf/ABJR/wAmYf8AN3L/ADt4/wA1d/8AMHf/ADF6/wAtef8AMoD/ADaG/wBB
k/8ATJv/AF6n/wBys/8CicP/CpfO/w2Z0P8Jlc7/BZHN/wKNzf8Aicv/AIvM/wCOz/8AUKf/ADWS/wBi
tP8Hh87/AIjU/zW75/+Q7vv/auH3/1bZ9f9Kz/D/Ncft/xm36P8Fotz/AIrR/wB1xf8AXrb/AEyn/wA7
mf8AJ4j/ABZ3/wADa/8AAF3/AABQ/wAAQP8AAC//AAAj/wAAFP8AAA7/AAAF/wAADP8AABj/AAAK/wAA
AP8AAAD/AAAB/wICHP8AABz/AAAp/wABM/8ACj7/ABhS/wAgWv8AJGH/ACZn/wAhZP8AIWP/ACtt/wA7
ff8AQ4X/AFCP/wBbmv8AWZz/AFuf/wBco/8AVKL/AGWu/wN5u/8Ih8T/CpTL/w+e0/8Podb/CaDW/w+l
2/8Bcrv/AFWh/wBwt/8Ag8j/AJrZ/wKx5/9S2fT/5v7//8D1/v+g7Pv/geT5/2DX8/87xez/GLLj/wKg
2v8AjdL/AHzE/wBsuf8AW67/AEqf/wA5kv8AJYP/ABZz/wASbv8AClz/AAVG/wACOf8AASX/AAAQ/wAA
F/8AACT/AAAe/wAABf8AAAD/AAAA/wAAAf8BAiP/AAAo/wAAOv8AC0n/ABxZ/wAqZP8ALmf/ACNj/wAd
Yf8AJmX/ADFt/wA/ev8ATIj/AE2O/wBRkv8AYJ7/AnGr/wd7s/8MgLn/D4O9/wyFv/8Dg7//BonD/xmZ
zv8jpNb/KKnZ/yWs2/8Fi8v/BHm6/wuUy/8Qo9f/Hq3e/xm45/820/T/w/T8///////p/v7/sO/8/37g
9v9X0PD/Nb/o/xuv4f8En9j/AI/O/wB7wv8Aa7j/AF+w/wBVpv8ASZv/ADuR/wAxiP8AJnz/ABtx/wAQ
Zf8AB1f/AARN/wAAP/8AAkn/AAFC/wAALP8AABP/AAAC/wAAAf8AAAP/AQIZ/wAAKv8ABEL/ABtX/wAo
Y/8ALmf/AChh/wAeWv8AE1P/ABFV/wATWv8AFWH/ABpn/wAca/8AIXH/ADCA/wBNl/8BaKr/Bn65/xaR
xf8hmsz/HJvO/xyczv81rNj/R7je/1fB4/8tr9v/IaLQ/0G43f9BwOX/YdHu/4zo+f9x5fj/uvX9////
////////9v///7vy/P+C4Pb/Vc3u/zK85f8Tqdz/BZTS/wGGxv8AdL7/AGW0/wBdrv8ATqL/AESY/wA+
j/8ANoj/AC5+/wAldP8AGmn/AAxd/wAEVP8AAVL/AABM/wAAQP8AADP/AAAi/wAADP8AAAb/AgIM/wEB
Cv8AAB3/AAQ9/wAMS/8AFlL/ABlT/wASTP8ADkb/AA9J/wAOTf8ABkf/AAA7/wAARP8ABlj/ABhs/wAp
e/8APov/AFCb/wBfp/8AcbL/BoO9/xaSx/8uodD/SrHa/2PA4v9Etd7/PK/X/1m93/9vyuf/Ycjo/4XZ
8f9g1PH/feD2//b9/////////////+7+///B9P3/kOX5/2nW8v9Ox+v/Lrbk/xOm3P8Jntb/AI3N/wB6
v/8AbLX/AFWk/wBHmP8AOo7/ACyC/wAgdf8AFmr/AA5g/wAJVv8AA0j/AANK/wABRP8AADn/AAAx/wAA
K/8AACP/AAAZ/wICGf8BAB//AAA1/wAUU/8AHlv/AB9c/wAYVv8ABUX/AAE+/wABPv8AADb/AAAo/wAD
MP8ABUv/AApf/wAOZv8AEGj/ABxz/wAuhP8AQpL/AFSd/wBqq/8Lgrn/NJvJ/0+s1f8+p9P/QqfQ/3TC
4P+Ayub/gc7p/3/M5/990u3/XMrr/7zs+P/9////+v////T////Y+f7/sO/8/4ji9/9m1PL/SMXr/yay
4v8IoNf/ApXS/wCIy/8AfML/AG+5/wBeqP8AVJ7/AEuW/wBAif8ANHz/ACZv/wAbZf8AFlr/AAtH/wAH
O/8AAy//AAEn/wAAHv8AACD/AAAp/wAAMP8CAzX/Aixn/wAybP8AQHf/AEl//wBIgf8AN3P/ACFe/wAb
WP8AE1X/AAxP/wANUf8AEFz/AA5g/wAKX/8AC2H/ABxw/wAyhf8APo//AEqW/wBgov8OerL/LJDA/zCT
xv8pksP/UabP/3/B3/+Ozef/gszn/3TF4/+Z1uz/e87r/5TZ8P/p/P7/8v///+/////c+v7/wvP9/6Ho
+P932fP/Scbr/y+45f8Uq93/AJrU/wCJyv8AecD/AGu0/wBZpv8ATJj/AEWQ/wBAjP8AOIP/ADF5/wAs
cP8AKG3/ACRn/wAaYP8ADU//AAM//wABOP8AAjP/AAU7/wAIPf8AAi7/AQMe/wJYkP8AX5T/AGaX/wBr
nf8Ab6H/AGue/wBjlv8DZ5f/C2uc/wFPjP8ANnn/ACZv/wAfa/8AIW//ACNw/wAsdP8AO4D/AEaJ/wBa
mP8Jcaj/JYW3/zeWxP85k8L/Z6/P/4DB3/9qutz/OaHO/yyZyf+Ax+L/i9Tr/1jA5P9JvOT/WsHn/6fh
8v+m4PT/xvP8/7rw/f+T4fX/Zs3u/ze35P8TpNn/AJXQ/wCMzP8Ahcb/AH3B/wBos/8AVaL/AEaT/wA3
hP8ALnn/ACVv/wAgZv8AHGD/ACNm/wAhZv8AF1z/AApJ/wAEPv8AAz3/AANC/wACQ/8AA0D/AAI+/wIE
Nv8CVov/AFuP/wBhlv8AYZj/AGGY/wBil/8FaJr/HHqp/xlonP8CSon/AEqI/wBSj/8AWJP/AFuV/wBa
k/8AVo7/AFqR/wBHgf8AMGv/AlOI/x56qf9Mm8L/dLPT/4TC3f9Op87/EHiy/wBZnv8AXaD/F4i//xuM
xf8QgsL/AHG7/wBgt/8Aa7z/AG/B/ziZ0v+b3PL/jN/2/1HB5/8jqtz/CprS/wCBxP8Ab7n/AGaw/wBm
r/8AXav/AFWi/wBKl/8AOIX/ACly/wAeZv8AFFv/AA1S/wAPU/8ADVL/AAVH/wACQP8AATz/AAI6/wAC
Of8AADT/AAAw/wAAMv8CAzP/AluP/wBjkv8AbJr/AGyd/wBnmv8BYJT/GmmW/y5/p/8ocpr/JWiS/x5g
jv8XXYv/EF2L/wdcjP8GXoz/CGqV/wBEcv8ADDf/AClc/xpsmP9DkLb/cK/O/3O31P8/nMf/BVub/wAv
eP8AR4z/Bmqp/wBNmf8ARJP/ADuR/wAtif8AN5b/AE+o/wBetP8AW7L/E2qz/1as1f9Vv+T/KKjY/wiT
zf8Aer7/AFyp/wBHlf8AQI7/ADyM/wA+i/8APIf/ADV//wArdP8AHmb/ABFY/wAITP8ABkf/AApK/wAL
Sv8ACEX/AAI//wABNv8AAC7/AAAr/wAAKf8AACv/AgMu/wJck/8AZ5j/AHGd/wByn/8Abp//AGea/w5h
lf8cZpX/JWqS/zZ6mv9Ii6P/V5mp/2Kjr/9hoq3/hbK3/2+arf8AABD/ABRA/wFBb/8wf6H/Wp29/1yl
xv8lgrL/AEOC/wAVXP8AIGb/AC52/wpgov8BLn7/ABZp/wAIYf8AGnb/ADGF/wBYp/8AZrL/AGCy/wBF
mf8AQ5D/Qp/L/ziw2v8OlMv/AHy7/wBhp/8ASpP/ADOA/wAjcv8AGmb/ABpj/wAeZv8AHmP/ABpc/wAT
Vv8AC07/AAhL/wALTv8ACEj/AAlF/wAGQ/8ABD3/AAAw/wAAKP8AACL/AAAi/wIDKf8CWJL/AGeb/wBv
nv8AdKP/AXGi/w5qnP8acKD/G26f/xZfkv8PToP/DEp+/wxNf/8XXoj/PICa/4a1v/87U2P/AAAJ/wAZ
Rf8HUHj/MXqf/y2Bp/8HWo3/ACNh/wABPP8AAz3/ABVW/wAsdv8AE1D/AAlB/wAAN/8AAEb/AAZg/wAa
cP8APY//Alun/wFVpv8AMYX/BDB6/0ijy/83rNj/Do7G/wB1tP8AZKf/AFGZ/wA9if8AJHP/ABJe/wAG
Uf8AAkX/AAZH/wALSf8ACkf/AAtL/wAPVf8AD1X/AAVJ/wAGR/8AB0X/AAI9/wAANv8AACv/AAAg/wAA
HP8CAx//AVeQ/whpm/8ui7T/M4+4/yB9qv8aapz/GWeY/xhqmf8XZpX/FVuN/xZakf8SVI3/CU2G/wpU
iv8LVIf/AAQN/wAAB/8AHEX/DFt//xRpkP8BQXX/ABFE/wAAGf8AABv/AAAO/wAJL/8ACUD/AAAV/wAA
Cv8AABb/AAAo/wAAPP8ABFH/ABJt/wAjfv8ANoz/AAth/wIITf9JnMP/RbLd/yKbzf8LicL/A3u4/wBt
r/8AX6j/AEiW/wA9if8AI3D/ABJY/wAJTP8AB0f/AAZH/wAFR/8ACk//AApS/wAFTf8ABEn/AAJE/wAC
Q/8AADz/AAAu/wAAIv8AABv/AgMd/wVTj/8cbJz/VqLG/ziNuP8ieKP/FWWU/xNhk/8VY5L/FF6M/xBQ
gP8QS37/E1OJ/xRTiP8QVIb/BEZ+/wAACf8AAA//AB9L/wFNd/8BSHX/ABxR/wABKf8AAAH/AAAA/wAA
AP8AAAr/AAAC/wAAAP8AAAD/AAAF/wAGMv8AATf/AABF/wABV/8AEmv/ABZw/wAAQv8ZMGX/UbLa/0Kt
2P8wptP/HpzP/wuQyP8AgcD/AG6v/wBgp/8AWqH/AFOb/wBGjf8AMnz/ACl2/wATXP8ACVH/AAtT/wAQ
Wf8AGmD/ABhf/wARWP8ADFH/AABA/wAAOP8AADX/AAAv/wICL/8HUIr/FGCU/zqNtv8ziLb/Kn2m/xxy
nf8TYZD/FV6I/xVhjP8VXYz/EUx//w9Fef8IPnD/AjZg/wAWKv8AAAb/AAEa/wATQf8AGkn/ABM//wAm
U/8AF0f/AAAD/wAAAP8AAAP/AAAC/wAAAP8AAAD/AAAA/wAAB/8AAxb/AAEX/wAALf8AAED/AAJX/wAA
VP8IFFj/O5C8/z6o0/8zo8//HpbI/w2Oxf8Ci8T/AIC+/wBxr/8AaKr/AGut/wBprP8AYKf/AGCm/wBW
nv8AKnX/ABVe/wAUYP8AGWL/ACRp/wAqcv8AHGT/AAtQ/wAGS/8ADlP/AAxQ/wAITf8CC0//AkV+/whG
eP8aaZX/KoCs/yp8pP8oeqD/F2WO/xFSef8SVnz/F2CH/xdii/8OWYX/AS9R/wAFDf8AAAD/AAAA/wAA
Bv8AAA7/Aw8v/wI5Yv8AKVr/AAQr/wAAA/8AAAL/AAEG/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAX/AAgz/wMGVv8UMHj/KYKz/x+Nuv8Nfa//BXet/wBzq/8AdK3/AH64/wB0rf8AZKL/AGCi/wBu
rv8AcK//AGus/wBmp/8AX6D/AFab/wBIjv8ARY3/AC12/wAtcv8AIGb/ABJX/wAKSf8ABUP/AAxM/wAJ
S/8ACU3/AhNV/wJKif8AOW3/BUpz/xppk/8gc53/InKZ/xttkv8UWYD/EUx0/xFTd/8LV3v/Ai5F/wAB
A/8AAAD/AAAA/wAAAP8AAAD/BRIg/yttkf8CKVv/AAAg/wAACP8AAAD/AAcO/wAECv8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAK/wADMv8GM3X/LpfC/y2YxP8Sfq7/AHGk/wBsov8AbqX/AG6m/wBp
pP8AZZ//AGGf/wBamv8AVZP/AFSO/wBSjv8AU5T/AE6P/wBMjf8AV5j/AEiJ/wA5ff8AMnP/ACNk/wAY
WP8ADEn/AAQ7/wACNv8ABDL/AAQp/wIFJv8CWJn/ADp2/wA6af8QU3z/F2CL/xVdh/8WYIT/F2SI/xFa
g/8DOVn/AA0X/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAUJ/x5kff9HncD/GkRz/wAAAP8AAAD/AAAA/wIS
IP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAf8AAAD/AAAC/wAPNf8AIF//KoO0/zqjz/8njLz/DXir/wBr
nv8AZpv/AGmh/wBrpf8AaaP/AGOc/wBdmf8AW5X/AFeQ/wBVjv8AVo//AFiW/wBbm/8AW5r/AFWW/wBQ
jv8AR4L/ADV3/wAlaf8AFlb/AAtA/wAGMP8ABDD/AAIv/wAAKv8CAi3/Aj96/wAuZf8AJ1f/BDhi/w9M
df8RT3j/Dkty/w9UeP8ENU7/AAQI/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAB/wcNEf8OLDr/L3mZ/zuI
ov8eUG3/Bhov/wIJEP8CERv/AAML/wAAAP8AAAD/AAAA/wAAAP8AAAX/AQkP/wIcNf8VSHj/NI27/z2g
zP8okcL/FICx/wRuov8AZpn/AGSY/wBnnf8AaqP/AGym/wBnn/8AZJv/AGOa/wBimP8BXpb/AVyW/wBa
lv8AV5P/AFKM/wBOh/8ATIb/AEiD/wA/ff8ANHT/ACtn/wAhXP8AGFj/AAxS/wACSv8AADz/AgMx/wIi
WP8AHE//AB9O/wAmVv8BOmT/Bj1o/wQsV/8AFCX/AAAA/wAAAP8AAAD/AAMJ/wABCP8GAgH/BgoL/wAD
CP8KJS3/ByU3/xYzSf8waoH/LnOW/0aMrv9Nian/OWuI/yJPbv8TLUL/Chgm/wkZIv8hQVb/O3CO/0aL
r/8+irH/P5O9/zWTvv8ki7v/GYK2/whwo/8AXpL/AFWK/wBPhv8AU4r/AFiR/wFYk/8AUo7/AE6I/wBN
h/8ATYn/AE+M/wBUjf8AVpL/AFaS/wBWjP8AVov/AFeM/wBTif8ASIH/ADt0/wApZf8AGFX/AA1E/wAE
NP8AACf/AAAa/wEBEv8CHlX/ABpR/wAeU/8AH1L/AB9I/wAaPv8ABhT/AAAA/wAAAP8DCxP/ABkv/wBE
b/8AQHL/Ay5X/wMLGP8AAAD/AAAA/wALFf8TRWP/JWqM/y54mf82fJ3/OH2c/z2Bof8+g6b/PYWp/zuB
p/87g6f/RpC1/0GMs/8ygqn/J3un/xpyo/8QbaP/CW2k/wVnoP8BU4z/AER7/wBCd/8AQXn/AEaB/wBR
iv8AWI7/AFiP/wBVjf8AU4v/AFOL/wBOiP8ASoX/AEmG/wBCgP8AN3P/AC9q/wAmX/8AHlX/ABNH/wAK
Pv8ABC//AAEY/wAABP8AAAD/AAAA/wAAAP8AAAD/AhlY/wAVT/8AEUL/AAg2/wACFv8AAAP/AAAA/wAA
AP8AAQH/CDha/wA8cf8APWT/ADJN/wAXIf8AAAD/AAMJ/wAZLv8ANlr/Bkxv/wtFaf8HPmb/BkJp/wNB
Z/8ERmz/B091/wxagf8WZYr/G2qP/xhskf8WbJX/D2qW/wdpl/8DZZn/AGGW/wBgmf8AWpf/AEeB/wA5
b/8ANGr/AC9o/wAuav8AL27/ACxq/wAmZP8AIF3/ABlW/wATUP8ADUX/AAhE/wAFRf8AA0X/AAA7/wAA
Mv8AACX/AAAd/wAAGf8AABv/AAAR/wAAAf8AAAD/AAAA/wAAAP8AAAD/AAAB/wIZYf8ACEf/AAEx/wAB
Nv8AACb/AAAM/wAAAP8ACSj/AAs6/wAIGf8AECn/AAYJ/wAAAP8AAAL/AA4k/wAiRP8ALlP/AC1R/wAr
Tf8AHz//ACBA/wAjRf8AJkf/ACtK/wAvUv8BNFn/AjRb/wIxXP8BL1//ASxg/wAqY/8AJWL/AB5b/wAY
W/8AFmX/ABFk/wAHRf8AAi//AAEn/wAALP8AAC//AAAz/wAANP8AADH/AAAu/wAAJ/8AACP/AAAe/wAA
Hv8AACD/AAAe/wAAGP8AABb/AAAU/wAADP8AAAb/AAAC/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
Af8CJ3X/AA5c/wAGTP8ADlb/AApS/wAAHv8AAAD/AAYQ/wAJJf8AAAD/AAAA/wAABf8ACSb/ABVD/wAe
SP8AIUb/ACNK/wAkTP8AHT//AAAG/wAAAv8AAAL/AAAC/wAAAf8AAAT/AAAK/wAADv8AABP/AAAb/wAA
If8AACf/AAAl/wAAJ/8AADH/AABG/wAASP8AACv/AAAX/wAAFv8AABz/AAAh/wAAJv8AACj/AAAl/wAA
If8AAB3/AAAa/wAAGv8AABr/AAAX/wAAD/8AAAf/AAAB/wAABP8AAAL/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAH/AiJy/wAZa/8AF2f/ABdo/wAGOP8AAAD/AAED/wADGP8AAAD/AAAH/wAI
Kv8AE0n/ABxT/wAeUP8AHk//ACBN/wAiTf8AI1H/ABYz/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAv8AAAn/AAAN/wAADP8AABH/AAAf/wAANv8AADn/AAAg/wAAE/8AABf/AAAc/wAA
HP8AAB7/AAAf/wAAHv8AABz/AAAa/wAAHf8AAB7/AAAf/wAAIv8AAB7/AAAV/wAAC/8AAAb/AAAB/wAA
Af8AAAX/AAAC/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAB/wIcbv8AFmn/ABFf/wATYv8DD0n/ChIe/wAB
AP8AEEH/AAtD/wAVUf8AGlz/ABpX/wAcUv8AH1T/AB9W/wAiV/8AI1X/ACFV/wALIP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAC/wAAEf8AACn/AAAu/wAA
Gf8AAA//AAAW/wAAIP8AAB//AAAa/wAAGv8AAB3/AAAb/wAAHf8AACr/AAAs/wAALP8AAC//AAAk/wAA
Hv8AABj/AAAN/wAAB/8AAAT/AAAE/wAAAv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAf8CEWf/AAlf/wAI
WP8AC1j/AxVc/wgZXP8AACL/AAYl/wAVXv8AG13/ABdY/wAVVP8AF1H/ABtT/wAdVP8AHlT/ABxQ/wAX
Sf8AAgv/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAv/AAAf/wAAI/8AAA//AAAG/wAAD/8AABn/AAAh/wAAGf8AABH/AAAQ/wAAEf8AAB7/AAAt/wAA
Lv8AADH/AAAn/wAAG/8AABT/AAAQ/wAAC/8AAAz/AAAJ/wAAB/8AAAH/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAH/AgRc/wAAU/8AAFD/AABN/wACTf8AAEX/AABC/wADQv8ADlL/ABFS/wAPUP8ADlD/ABFM/wAW
Tv8AF0z/ABZK/wAVSf8ACzH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAF/wAAGP8AABn/AAAD/wAAAP8AAAX/AAAN/wAAGP8AAA3/AAAD/wAA
AP8AAAr/AAAb/wAAFP8AABf/AAAk/wAAGP8AAAz/AAAJ/wAAB/8AAAb/AAAL/wAACP8AAAb/AAAD/wAA
Af8AAAD/AAAA/wAAAP8AAAD/AAAB/wAAQ/8AADv/AAAy/wAALv8AACr/AAAl/wAAKv8AADj/AABA/wAA
QP8AAEH/AABA/wAEQP8ABD//AAM7/wACOv8AAjX/AAAM/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAb/AAAG/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAv8AAAD/AAAA/wAACf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
Af8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8fIUnlHR9D5R0fPOUdHznlHR855R0f
PuUdH0blHR9M5R0fVOUdH1XlHR9S5R0fUuUeIVXlHiJU5R4gTuUeH0zlHR495RoaHOUaGhvlGhob5Roa
G+UaGhvlGhob5RoaG+UaGhvlGhob5RoaG+UaGhvlGhsc5RobHOUaGxzlGhsc5RobHOUaGxzlGhse5Rob
IeUaGxzlGhsb5RobHOUaGxvlGhsb5RobG+UaGxzlGhsc5RobG+UaGxvlGhob5R0hJuUbHB7lGhsb5Rob
HOUaGxzlGhsc5RobHOUaGx3lGhsc5RobHeUaGxzlGhsc5RobHOUaGxzlGhob5RoaG+UaGhvl9fb3DPX2
9wz19vcM9fb3DPX29wz19vgM9fb4DPX2+Az19vgM9fb4DPX2+Az19vgM9fb4DPX2+Az19vcM9fb3DPX1
9Qzz8/MM8/PzDPPz8wzz8/MM8/P0DPPz9Azz8/QM8/P0DPPz9Azz8/QM8/P0DPPz9Azz8/QM8/P0DPPz
9Azz8/QM8/P0DPP09Azz9PQM8/P0DPPz9Azz8/QM8/P0DPPz9Azz8/QM8/P0DPPz9Azz8/QM8/T0DPPz
9Az19/gM8/T1DPPz9Azz8/QM8/P0DPPz9Azz9PQM8/T0DPPz9Azz8/QM8/P0DPPz9Azz8/QM8/P0DPPz
9Azz8/QM8/PzDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////8=
</value>
</data>
</root>

@ -5,6 +5,7 @@ using System.Collections.Generic;
using System.Reflection;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Text.RegularExpressions;
namespace SCJMapper_V2
@ -27,6 +28,20 @@ namespace SCJMapper_V2
public const String BlendedJsInput = JsUnknown + "reserved"; // the device name used throughout this app
static private int JSnum_UNKNOWN = 0;
static private int JSnum_MAX = 4; // can only assign 4 jsN devices in SC
static public System.Drawing.Color[] JColor = (System.Drawing.Color[])MyColors.JColor.Clone(); // default
static public void ReassignJsColor( List<int> newJsList )
{
int idx = 0;
foreach ( int i in newJsList ) {
if ( i > 0 ) {
JColor[i - 1] = MyColors.JColor[idx++];
}
}
}
/// <summary>
/// Returns true if the devicename is a joystick
@ -46,9 +61,8 @@ namespace SCJMapper_V2
/// <returns>The formatted JS name for the CryEngine XML</returns>
static public String JSTag( int jsNum )
{
if ( jsNum == JSnum_UNKNOWN ) return JsUnknown;
if ( IsJSValid( jsNum ) ) return "js" + jsNum.ToString( ) + "_";
else return "";
return JsUnknown;
}
@ -76,11 +90,42 @@ namespace SCJMapper_V2
/// <returns>True if it is a valid one</returns>
static public Boolean IsJSValid( int jsNum )
{
return ( jsNum > JSnum_UNKNOWN );
return ( jsNum > JSnum_UNKNOWN ) && ( jsNum <= JSnum_MAX );
}
const string js_pattern = @"^js\d_[xyz]$";
const string js_pattern = @"^js\d_*";
static Regex rgx_js = new Regex( js_pattern, RegexOptions.IgnoreCase );
/// <summary>
/// Returns true if the input starts with a valid jsN_ formatting
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
static public Bool IsJsN( String input )
{
return rgx_js.IsMatch( input );
}
/// <summary>
/// Returns an adjusted jsN_ tag with the new number
/// </summary>
/// <param name="input">An input directive</param>
/// <param name="newJsN">the new JsN number</param>
/// <returns>The modified js directive or the directive if no mod can be done</returns>
static public String ReassignJSTag( String input, int newJsN )
{
if ( IsJsN( input ) ) {
return input.Replace( input.Substring( 0, 4 ), JSTag( newJsN ) );
}
else {
return input;
}
}
const string jsl_pattern = @"^js\d_[xyz]$";
static Regex rgx_jsl = new Regex( jsl_pattern, RegexOptions.IgnoreCase );
const string jsr_pattern = @"^js\d_rot[xyz]$";
static Regex rgx_jsr = new Regex( jsr_pattern, RegexOptions.IgnoreCase );
/// <summary>
@ -96,7 +141,7 @@ namespace SCJMapper_V2
if ( control.Length < 5 ) return control;
String retVal = control;
if ( rgx_js.IsMatch( control ) ) {
if ( rgx_jsl.IsMatch( control ) ) {
retVal = retVal.Insert( 4, "throttle" );
}
/* THIS IS WRONG.... don't know if rot can get a throttle...
@ -115,7 +160,7 @@ namespace SCJMapper_V2
/// <returns></returns>
static public Boolean CanThrottle( String control )
{
return rgx_js.IsMatch( control ) || rgx_jsr.IsMatch( control );
return rgx_jsl.IsMatch( control ) || rgx_jsr.IsMatch( control );
}
@ -131,11 +176,11 @@ namespace SCJMapper_V2
private int m_sliderCount = 0; // static counter for UpdateControls
private String m_lastItem = "";
private int m_senseLimit = 150; // axis jitter avoidance...
private int m_joystickNumber = 0;
private int m_joystickNumber = 0; // seq number of the enumerated joystick
private bool[] m_ignoreButtons;
private UC_JoyPanel m_jPanel = null; // the GUI panel
private TabPage m_jTab = null;
/// <summary>
/// Returns a CryEngine compatible hat direction
@ -154,9 +199,27 @@ namespace SCJMapper_V2
/// <summary>
/// The povides the JS ProductName property
/// The JS ProductName property
/// </summary>
public String DevName { get { return m_device.Properties.ProductName; } }
/// <summary>
/// The JS Instance GUID for multiple device support (VJoy gets 2 of the same name)
/// </summary>
public String DevInstanceGUID { get { return m_device.Information.InstanceGuid.ToString( ); } }
/// <summary>
/// The sequence number of the enumerated devices
/// </summary>
public int DevNumber { get { return m_joystickNumber; } }
/// <summary>
/// The assigned jsN number for this device
/// </summary>
public int JSAssignment
{
get { return m_jPanel.JsAssignment; }
set { m_jPanel.JsAssignment = value; }
}
// device props
public int AxisCount { get { return m_device.Capabilities.AxeCount; } }
public int ButtonCount { get { return m_device.Capabilities.ButtonCount; } }
public int POVCount { get { return m_device.Capabilities.PovCount; } }
@ -168,7 +231,7 @@ namespace SCJMapper_V2
/// <param name="device">A DXInput device</param>
/// <param name="hwnd">The WinHandle of the main window</param>
/// <param name="panel">The respective JS panel to show the properties</param>
public JoystickCls( Joystick device, Control hwnd, int joystickNum, UC_JoyPanel panel )
public JoystickCls( Joystick device, Control hwnd, int joystickNum, UC_JoyPanel panel, TabPage tab )
{
log.DebugFormat( "ctor - Entry with {0}", device.Information.ProductName );
@ -176,6 +239,7 @@ namespace SCJMapper_V2
m_hwnd = hwnd;
m_joystickNumber = joystickNum;
m_jPanel = panel;
m_jTab = tab;
m_senseLimit = AppConfiguration.AppConfig.jsSenseLimit; // can be changed in the app.config file if it is still too little
@ -186,8 +250,9 @@ namespace SCJMapper_V2
m_jPanel.nAxis = AxisCount.ToString( );
m_jPanel.nButtons = ButtonCount.ToString( );
m_jPanel.nPOVs = POVCount.ToString( );
m_jPanel.JsAssignment = 0; // default is no assignment
m_ignoreButtons = new bool[m_state.Buttons.Length];
m_ignoreButtons = new bool[m_state.Buttons.Length];
ResetIgnoreButtons( );
log.Debug( "Get JS Objects" );

@ -0,0 +1,88 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace SCJMapper_V2
{
class JoystickList : List<JoystickCls>
{
private FormReassign FR = null;
public Dictionary<int, int> JsReassingList { get; set; } // oldJs, newJs
public List<int> NewJsList { get; set; } // index is this[idx]
/// <summary>
/// Show the jsN Reassign Dialog
/// </summary>
public DialogResult ShowReassign( )
{
if ( FR == null ) {
FR = new FormReassign( this );
JsReassingList = new Dictionary<int, int>( );
NewJsList = new List<int>( );
}
FR.ShowDialog( );
if ( FR.Canceled == false ) {
int jIdx = 0;
// update the new js indication in the tabs
foreach ( JoystickCls j in this ) j.JSAssignment = NewJsList[jIdx++];
JoystickCls.ReassignJsColor( NewJsList );
}
return ( FR.Canceled ) ? DialogResult.Cancel : DialogResult.OK;
}
public void ResetJsNAssignment( )
{
foreach ( JoystickCls j in this ) j.JSAssignment = 0;
if ( this.Count > 0 ) this[0].JSAssignment = 1;
if ( this.Count > 1 ) this[1].JSAssignment = 2;
}
/// <summary>
/// Returns the Joystick instance for the given jsN
/// </summary>
/// <param name="n">The JsN</param>
/// <returns>The instance or null if not found</returns>
public JoystickCls Find_jsN( int n )
{
foreach ( JoystickCls j in this ) {
if ( j.JSAssignment == n ) return j;
}
return null;
}
/// <summary>
/// Returns the Joystick instance for the given device name
/// </summary>
/// <param name="n">The device name</param>
/// <returns>The instance or null if not found</returns>
public JoystickCls Find_jsDev( String devName )
{
foreach ( JoystickCls j in this ) {
if ( j.DevName == devName ) return j;
}
return null;
}
/// <summary>
/// Returns the Joystick instance for the given device instance GUID
/// </summary>
/// <param name="n">The instance GUID</param>
/// <returns>The instance or null if not found</returns>
public JoystickCls Find_jsInstance( String instGUID )
{
foreach ( JoystickCls j in this ) {
if ( j.DevInstanceGUID == instGUID ) return j;
}
return null;
}
}
}

@ -11,6 +11,8 @@ namespace SCJMapper_V2
class MyColors
{
static public Color[] JColor = { Color.LightGreen, Color.LightBlue, Color.Khaki, Color.LightSalmon, Color.Beige, Color.Yellow, Color.Plum, Color.Lavender };
static public Color UnassignedColor = Color.WhiteSmoke;
static public Color DirtyColor = Color.Tomato;
static public Color SuccessColor = Color.GreenYellow;
@ -18,5 +20,7 @@ namespace SCJMapper_V2
static public Color InvalidColor = Color.Tomato;
static public Color ErrorColor = Color.Gold;
static public Color ProfileColor = Color.DarkKhaki;
static public Color MappingColor = Color.DarkSeaGreen;
}
}

@ -61,8 +61,15 @@
this.label5 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.rbJsNA = new System.Windows.Forms.RadioButton();
this.rbJs4 = new System.Windows.Forms.RadioButton();
this.rbJs3 = new System.Windows.Forms.RadioButton();
this.rbJs2 = new System.Windows.Forms.RadioButton();
this.rbJs1 = new System.Windows.Forms.RadioButton();
this.gBox.SuspendLayout();
this.gBoxCap.SuspendLayout();
this.groupBox1.SuspendLayout();
this.SuspendLayout();
//
// gBox
@ -425,18 +432,92 @@
this.label2.TabIndex = 13;
this.label2.Text = "# Axis:";
//
// groupBox1
//
this.groupBox1.Controls.Add(this.rbJsNA);
this.groupBox1.Controls.Add(this.rbJs4);
this.groupBox1.Controls.Add(this.rbJs3);
this.groupBox1.Controls.Add(this.rbJs2);
this.groupBox1.Controls.Add(this.rbJs1);
this.groupBox1.Location = new System.Drawing.Point(3, 236);
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";
//
// rbJsNA
//
this.rbJsNA.AutoSize = true;
this.rbJsNA.Checked = true;
this.rbJsNA.Enabled = false;
this.rbJsNA.Location = new System.Drawing.Point(182, 19);
this.rbJsNA.Name = "rbJsNA";
this.rbJsNA.Size = new System.Drawing.Size(37, 17);
this.rbJsNA.TabIndex = 4;
this.rbJsNA.TabStop = true;
this.rbJsNA.Text = "jsx";
this.rbJsNA.UseVisualStyleBackColor = true;
//
// rbJs4
//
this.rbJs4.AutoSize = true;
this.rbJs4.Enabled = false;
this.rbJs4.Location = new System.Drawing.Point(138, 19);
this.rbJs4.Name = "rbJs4";
this.rbJs4.Size = new System.Drawing.Size(38, 17);
this.rbJs4.TabIndex = 3;
this.rbJs4.Text = "js4";
this.rbJs4.UseVisualStyleBackColor = true;
//
// rbJs3
//
this.rbJs3.AutoSize = true;
this.rbJs3.Enabled = false;
this.rbJs3.Location = new System.Drawing.Point(94, 19);
this.rbJs3.Name = "rbJs3";
this.rbJs3.Size = new System.Drawing.Size(38, 17);
this.rbJs3.TabIndex = 2;
this.rbJs3.Text = "js3";
this.rbJs3.UseVisualStyleBackColor = true;
//
// rbJs2
//
this.rbJs2.AutoSize = true;
this.rbJs2.Enabled = false;
this.rbJs2.Location = new System.Drawing.Point(50, 19);
this.rbJs2.Name = "rbJs2";
this.rbJs2.Size = new System.Drawing.Size(38, 17);
this.rbJs2.TabIndex = 1;
this.rbJs2.Text = "js2";
this.rbJs2.UseVisualStyleBackColor = true;
//
// rbJs1
//
this.rbJs1.AutoSize = true;
this.rbJs1.Enabled = false;
this.rbJs1.Location = new System.Drawing.Point(6, 19);
this.rbJs1.Name = "rbJs1";
this.rbJs1.Size = new System.Drawing.Size(38, 17);
this.rbJs1.TabIndex = 0;
this.rbJs1.Text = "js1";
this.rbJs1.UseVisualStyleBackColor = true;
//
// UC_JoyPanel
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.gBoxCap);
this.Controls.Add(this.gBox);
this.Name = "UC_JoyPanel";
this.Size = new System.Drawing.Size(239, 234);
this.Size = new System.Drawing.Size(239, 295);
this.gBox.ResumeLayout(false);
this.gBox.PerformLayout();
this.gBoxCap.ResumeLayout(false);
this.gBoxCap.PerformLayout();
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.ResumeLayout(false);
}
@ -477,5 +558,11 @@
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.RadioButton rbJsNA;
private System.Windows.Forms.RadioButton rbJs4;
private System.Windows.Forms.RadioButton rbJs3;
private System.Windows.Forms.RadioButton rbJs2;
private System.Windows.Forms.RadioButton rbJs1;
}
}

@ -16,6 +16,8 @@ namespace SCJMapper_V2
InitializeComponent( );
}
private int m_jsAssignment = 0; // na
#region Strings
@ -25,7 +27,7 @@ namespace SCJMapper_V2
/// <param name="s">String to return if length less than 12</param>
/// <param name="d">String to return if s length more than 12</param>
/// <returns>A string</returns>
private String Chk( String s, String d )
private String Chk( String s, String d )
{
if ( s.Length > 12 ) return d; else return s;
}
@ -174,7 +176,7 @@ namespace SCJMapper_V2
public String nPOVs
{
set { lblnPOVs .Text = value; }
set { lblnPOVs.Text = value; }
}
@ -251,5 +253,36 @@ namespace SCJMapper_V2
#endregion
#region jsAsignment
/// <summary>
/// jsN assignment
/// Note: this is supposed to be either 1..4 for assigned ones or 0 for unassigned ones
/// </summary>
public int JsAssignment
{
get { return m_jsAssignment; }
set
{
m_jsAssignment = value;
switch ( m_jsAssignment ) {
case 1: rbJs1.Checked = true; break;
case 2: rbJs2.Checked = true; break;
case 3: rbJs3.Checked = true; break;
case 4: rbJs4.Checked = true; break;
default:
rbJsNA.Checked = true;
m_jsAssignment = value;
break;
}
}
}
public String JsName
{
get { return JoystickCls.JSTag(m_jsAssignment); }
}
#endregion
}
}

@ -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.2.0.22" )]
[assembly: AssemblyFileVersion( "2.2.0.22" )]
[assembly: AssemblyVersion( "2.3.0.23" )]
[assembly: AssemblyFileVersion( "2.3.0.23" )]

@ -18,17 +18,23 @@ namespace SCJMapper_V2
/// <summary>
/// Try to locate the launcher under "App Paths"
/// </summary>
static private String SCLauncherPath1
static private String SCLauncherFile1
{
get
{
log.Debug( "SCLauncherPath1 - Entry" );
String scpath = ( String )Registry.GetValue( @"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\App Paths\StarCitizen Launcher.exe", "", null );
if ( scpath != null ) {
log.Info( "SCLauncherPath1 - Found HKLM - AppPath - Launcher.exe" );
return scpath;
log.Debug( "SCLauncherFile1 - Entry" );
String scLauncher = ( String )Registry.GetValue( @"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\App Paths\StarCitizen Launcher.exe", "", null );
if ( scLauncher != null ) {
log.Info( "SCLauncherFile1 - Found HKLM - AppPath - Launcher.exe" );
if ( File.Exists( scLauncher ) ) {
return scLauncher;
}
else {
log.WarnFormat( "SCLauncherFile1 - file does not exist: {0}", scLauncher );
return "";
}
}
log.Warn( "SCLauncherPath1 - did not found HKLM - AppPath - Launcher.exe" );
log.Warn( "SCLauncherFile1 - did not found HKLM - AppPath - Launcher.exe" );
return "";
}
}
@ -36,17 +42,48 @@ namespace SCJMapper_V2
/// <summary>
/// Try to locate the launcher under "Uninstall"
/// </summary>
static private String SCLauncherPath2
static private String SCLauncherFile2
{
get
{
log.Debug( "SCLauncherPath2 - Entry" );
String scpath = ( String )Registry.GetValue( @"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\StarCitizen", "DisplayIcon", null );
if ( scpath != null ) {
log.Info( "SCLauncherPath2 - Found HKLM - Uninstall - StarCitizen" );
return scpath;
log.Debug( "SCLauncherFile2 - Entry" );
String scLauncher = ( String )Registry.GetValue( @"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\StarCitizen", "DisplayIcon", null );
if ( scLauncher != null ) {
log.Info( "SCLauncherFile2 - Found HKLM - Uninstall - StarCitizen" );
if ( File.Exists( scLauncher ) ) {
return scLauncher;
}
else {
log.WarnFormat( "SCLauncherFile2 - file does not exist: {0}", scLauncher );
return "";
}
}
log.Warn( "SCLauncherFile2 - did not found HKLM - Uninstall - StarCitizen" );
return "";
}
}
/// <summary>
/// Try to locate the launcher under "Uninstall"
/// </summary>
static private String SCLauncherFile3
{
get
{
log.Debug( "SCLauncherFile3 - Entry" );
String scLauncher = ( String )Registry.GetValue( @"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Cloud Imperium Games\StarCitizen Launcher.exe", "", null );
if ( scLauncher != null ) {
log.Info( "SCLauncherFile3 - Found HKLM - CIG - Launcher.exe" );
if ( File.Exists( scLauncher ) ) {
return scLauncher;
}
else {
log.WarnFormat( "SCLauncherFile3 - file does not exist: {0}", scLauncher );
return "";
}
}
log.Warn( "SCLauncherPath2 - did not found HKLM - Uninstall - StarCitizen" );
log.Warn( "SCLauncherFile3 - did not found HKLM - CIG - Launcher.exe" );
return "";
}
}
@ -60,26 +97,34 @@ namespace SCJMapper_V2
get
{
log.Debug( "SCBasePath - Entry" );
appSettings.Reload( ); // local instance - reload as it might be changed outside
String scp = "";
if ( appSettings.UserSCPathUsed ) {
// User has priority
scp = appSettings.UserSCPath;
if ( !Directory.Exists( scp ) ) return ""; // sorry path does not exist
if ( !Directory.Exists( scp ) ) {
log.WarnFormat( "SCBasePath - user defined folder does not exist: {0}", scp );
return ""; // sorry path does not exist
}
}
else {
// start the registry search
scp = SCLauncherPath1;
scp = SCLauncherFile1;
if ( String.IsNullOrEmpty( scp ) ) {
scp = SCLauncherPath2;
scp = SCLauncherFile2;
if ( String.IsNullOrEmpty( scp ) ) {
return ""; // sorry did not found a thing..
scp = SCLauncherFile3;
if ( String.IsNullOrEmpty( scp ) ) {
log.Warn( "SCBasePath - cannot find any valid SC path" );
return ""; // sorry did not found a thing..
}
}
}
// found the launcher.exe file - path adjust
scp = Path.GetDirectoryName( scp ); // "E:\G\StarCitizen\Launcher"
scp = Path.GetDirectoryName( scp ); // "E:\G\StarCitizen"
}
// found the launcher
scp = Path.GetDirectoryName( scp ); // "E:\G\StarCitizen\Launcher"
scp = Path.GetDirectoryName( scp ); // "E:\G\StarCitizen"
return scp;
}
}
@ -87,7 +132,7 @@ namespace SCJMapper_V2
/// <summary>
/// Returns the SC installation path
/// Returns the SC installation path or ""
/// </summary>
static public String SCInstallPath
{
@ -108,11 +153,14 @@ namespace SCJMapper_V2
{
log.Debug( "SCClientDataPath - Entry" );
String scp = SCBasePath;
if ( String.IsNullOrEmpty( scp ) ) return "";
if ( String.IsNullOrEmpty( scp ) ) return ""; // no valid one can be found
//
scp = Path.Combine( scp, "CitizenClient" );
scp = Path.Combine( scp, "Data" );
return scp;
if ( Directory.Exists( scp ) ) return scp;
log.WarnFormat( "SCClientDataPath - CitizenClient.Data subfolder does not exist: {0}", scp );
return "";
}
}
@ -130,7 +178,10 @@ namespace SCJMapper_V2
//
scp = Path.Combine( scp, "CitizenClient" );
scp = Path.Combine( scp, "USER" );
return scp;
if ( Directory.Exists( scp ) ) return scp;
log.WarnFormat( "SCClientUSERPath - CitizenClient.USER subfolder does not exist: {0}", scp );
return "";
}
}
@ -148,7 +199,10 @@ namespace SCJMapper_V2
//
scp = Path.Combine( scp, "Controls" );
scp = Path.Combine( scp, "Mappings" );
return scp;
if ( Directory.Exists( scp ) ) return scp;
log.WarnFormat( "SCClientMappingPath - CitizenClient.Data.Controls.Mappings subfolder does not exist: {0}", scp );
return "";
}
}
@ -165,7 +219,10 @@ namespace SCJMapper_V2
if ( String.IsNullOrEmpty( scp ) ) return "";
//
scp = Path.Combine( scp, "GameData.pak" );
return scp;
if ( File.Exists( scp ) ) return scp;
log.WarnFormat( "SCGameData_pak - CitizenClient.Data.GameData.pak file does not exist: {0}", scp );
return "";
}
}

@ -26,8 +26,8 @@
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>22</ApplicationRevision>
<ApplicationVersion>2.2.0.%2a</ApplicationVersion>
<ApplicationRevision>23</ApplicationRevision>
<ApplicationVersion>2.3.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
@ -111,12 +111,19 @@
<Compile Include="Form1.Designer.cs">
<DependentUpon>Form1.cs</DependentUpon>
</Compile>
<Compile Include="Joystick\FormReassign.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Joystick\FormReassign.Designer.cs">
<DependentUpon>FormReassign.cs</DependentUpon>
</Compile>
<Compile Include="FormSettings.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FormSettings.Designer.cs">
<DependentUpon>FormSettings.cs</DependentUpon>
</Compile>
<Compile Include="Joystick\JoystickList.cs" />
<Compile Include="Joystick\ActionCls.cs" />
<Compile Include="Joystick\ActionMapCls.cs" />
<Compile Include="Joystick\ActionMapsCls.cs" />
@ -139,6 +146,9 @@
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Joystick\FormReassign.resx">
<DependentUpon>FormReassign.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FormSettings.resx">
<DependentUpon>FormSettings.cs</DependentUpon>
</EmbeddedResource>

@ -44,6 +44,17 @@ namespace SCJMapper_V2
}
/// <summary>
/// Create a backupfile from the given file
/// </summary>
/// <param name="mapName">The mapping name</param>
static public void BackupMappingFile( String mapName )
{
log.Debug( "BackupMappingFile - Entry" );
String mf = MappingFileName( mapName );
if ( File.Exists( mf ) ) File.Copy( mf, mf + ".backup", true );
}
}
}

@ -0,0 +1,82 @@
SC Joystick Mapper V 2.3
(c) Cassini, StandardToaster - 31-August-2014
Contains 9 files:
SCJMapper.exe The program
SCJMapper.exe.config Program config - 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
Ionic.Zip.Reduced.dll Managed Zip Assembly - MUST be in the same folder as the Exe file
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.3.pdf Quick Guide
ReadMe.txt This file
Read the Guide first RTFM ;-)
Put all files into one folder and hit SCJMapper.exe to run it
For Updates and information visit:
https://github.com/SCToolsfactory/SCJMapper-V2/releases
Scanned for viruses before packing...
cassini@burri-web.org
Changelog:
V 2.3
- new feature - allow reassignment of the jsN group
- improvement - uniquely identified devices with the same name (use GUID)
- improvement - shows jsN assignment in Joystick tab
- improvement - detection of the SC install path extended to one more Registry entry
- fix - blend unmapped works properly now
- fix - manual entry of SC directory works now
V 2.2
- new feature - option to ignore actionmaps in Settings
- improvement - add actionmaps for multiplayer, singleplayer, player
- improvement - GUI layout of Joystick tabs for more than 4 devices
V 2.1
- program is maintained at "https://github.com/SCToolsfactory/SCJMapper-V2/releases"
- new feature - option to blend unmapped actions
- improvement - ignore buttons in Settings
- improvement - override the built in detection of the SC folder in Settings
- added - trace log for resolving crash and other issues
- Update of the Guide for V2.0
V 2.0
- program is maintained at "https://github.com/bm98/SCJMapper-V2/releases"
- new feature - get defaultProfile.xml from game assets
- new feature - get actionsmaps from game assets
- new feature - reset to defaults
- new feature - load and save own maps to gamefolders (makes backup in My Documents\SCJMapper)
- new feature - filter the action tree
- new feature - drag and drop an mapping file into the XML window
- new feature - make throttle assignment for any axis
- improved joystick detection (jitter avoidance, limit can be set in Program config file)
- improved button detection (blend buttons that are always on)
- improved sizeable window
- improved settings persist between sessions
- Update of the Guide for V2.0
- removed defaultProfile.xml from distribution (REMOVE IT FROM YOUR FOLDER - else it will be taken as action list)
V 1.4PRE
- using a new Managed DirectX assembly and built with .Net4 (Hope this works for Win8.1)
- added Joystick properties and Axis Names from the Joystick driver
V 1.3
- new feature - read the original defaultProfile.xml from SC to derive the actions (must be in the EXE folder)
- added support for up to 8 devices
- added multibinding i.e. bind the same action to multiple buttons, one for kbd, one for xbox etc. if the profile supports it
- added Dump List - a readable list of the commands (can be saved as txt file - using Save as)
- fixed "Find 1st"
- Update of the Guide
- removed MappingVars file from distribution (REMOVE IT FROM YOUR FOLDER - else it will be taken as action list)
V 1.2
- added support for rebinding xboxpad and ps3pad
- added Find 1st for a Control
- fixed Hat direction not maintained as last Control used
- some GUI refinements
- Update of the Guide (incl MappingVar.csv format)
MappingVar file
- added commands that where missing
- changed from keyboard to xboxpad rebinding where possible to leave kbd intact
V 1.1
- fixed issue with less than 3 joysticks attached
V 1.0 initial

Binary file not shown.

Binary file not shown.
Loading…
Cancel
Save