diff --git a/Master/NucleusCoopTool/Forms/DownloadPrompt.cs b/Master/NucleusCoopTool/Forms/DownloadPrompt.cs index d60af691..7bc49eb3 100644 --- a/Master/NucleusCoopTool/Forms/DownloadPrompt.cs +++ b/Master/NucleusCoopTool/Forms/DownloadPrompt.cs @@ -64,6 +64,11 @@ public DownloadPrompt(Handler handler, MainForm mf, string zipFileName) if (zipFileName == null) { + if (handler == null) + { + return; + } + Text = "Downloading Game Handler"; zipFile = string.Format("handler-{0}-v{1}.nc", Handler.Id, Handler.CurrentVersion); BeginDownload(); diff --git a/Master/NucleusCoopTool/Forms/MainForm.Designer.cs b/Master/NucleusCoopTool/Forms/MainForm.Designer.cs index ff0f0edb..c495e63f 100644 --- a/Master/NucleusCoopTool/Forms/MainForm.Designer.cs +++ b/Master/NucleusCoopTool/Forms/MainForm.Designer.cs @@ -38,11 +38,6 @@ private void InitializeComponent() this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); - this.btn_faq = new System.Windows.Forms.Button(); - this.btn_reddit = new System.Windows.Forms.Button(); - this.btn_Discord = new System.Windows.Forms.Button(); - this.btn_SplitCalculator = new System.Windows.Forms.Button(); - this.btn_thirdPartytools = new System.Windows.Forms.Button(); this.linkLabel4 = new System.Windows.Forms.LinkLabel(); this.linkLabel3 = new System.Windows.Forms.LinkLabel(); this.linkLabel2 = new System.Windows.Forms.LinkLabel(); @@ -52,6 +47,11 @@ private void InitializeComponent() this.btn_downloadAssets = new System.Windows.Forms.Button(); this.btn_settings = new System.Windows.Forms.Button(); this.logo = new System.Windows.Forms.PictureBox(); + this.btn_faq = new System.Windows.Forms.Button(); + this.btn_reddit = new System.Windows.Forms.Button(); + this.btn_Discord = new System.Windows.Forms.Button(); + this.btn_SplitCalculator = new System.Windows.Forms.Button(); + this.btn_thirdPartytools = new System.Windows.Forms.Button(); this.gameContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.nullToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.scriptNotesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -73,28 +73,24 @@ private void InitializeComponent() this.changeIconToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.deleteContentFolderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.splash = new System.Windows.Forms.PictureBox(); this.btn_Links = new System.Windows.Forms.Button(); this.glowingLine0 = new System.Windows.Forms.PictureBox(); - this.linksPanel = new BufferedClientAreaPanel(); this.third_party_tools_container = new System.Windows.Forms.Panel(); this.clientAreaPanel = new BufferedClientAreaPanel(); - this.stepPanelPictureBox = new System.Windows.Forms.PictureBox(); this.StepPanel = new BufferedClientAreaPanel(); this.game_listSizer = new BufferedClientAreaPanel(); this.list_Games = new Nucleus.Gaming.ControlListBox(); this.rightFrame = new BufferedClientAreaPanel(); - this.buttonContainer = new BufferedClientAreaPanel(); - this.btn_GameDesc = new System.Windows.Forms.Button(); + this.icons_Container = new System.Windows.Forms.FlowLayoutPanel(); this.btn_gameOptions = new System.Windows.Forms.Button(); - this.btn_scriptAuthorTxt = new System.Windows.Forms.Button(); - this.button_UpdateAvailable = new System.Windows.Forms.Button(); this.scriptAuthorTxtSizer = new BufferedClientAreaPanel(); + this.btn_textSwitcher = new System.Windows.Forms.Button(); this.btn_magnifier = new System.Windows.Forms.PictureBox(); this.HandlerNoteTitle = new System.Windows.Forms.Label(); this.scriptAuthorTxt = new System.Windows.Forms.RichTextBox(); this.cover = new BufferedClientAreaPanel(); this.coverFrame = new BufferedClientAreaPanel(); + this.button_UpdateAvailable = new System.Windows.Forms.Button(); this.txt_GameDescSizer = new BufferedClientAreaPanel(); this.txt_GameDesc = new System.Windows.Forms.TextBox(); this.mainButtonFrame = new BufferedClientAreaPanel(); @@ -106,138 +102,36 @@ private void InitializeComponent() this.btn_Play = new System.Windows.Forms.Button(); this.btn_Next = new System.Windows.Forms.Button(); this.btnAutoSearch = new System.Windows.Forms.Button(); + this.stepPanelPictureBox = new System.Windows.Forms.PictureBox(); this.txt_version = new System.Windows.Forms.Label(); this.closeBtn = new System.Windows.Forms.Button(); this.minimizeBtn = new System.Windows.Forms.Button(); this.maximizeBtn = new System.Windows.Forms.Button(); + this.splash = new System.Windows.Forms.PictureBox(); + this.linksPanel = new BufferedClientAreaPanel(); ((System.ComponentModel.ISupportInitialize)(this.logo)).BeginInit(); this.gameContextMenuStrip.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.splash)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.glowingLine0)).BeginInit(); - this.linksPanel.SuspendLayout(); this.third_party_tools_container.SuspendLayout(); this.clientAreaPanel.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.stepPanelPictureBox)).BeginInit(); this.game_listSizer.SuspendLayout(); this.rightFrame.SuspendLayout(); - this.buttonContainer.SuspendLayout(); this.scriptAuthorTxtSizer.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.btn_magnifier)).BeginInit(); this.cover.SuspendLayout(); + this.coverFrame.SuspendLayout(); this.txt_GameDescSizer.SuspendLayout(); this.mainButtonFrame.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.stepPanelPictureBox)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.splash)).BeginInit(); + this.linksPanel.SuspendLayout(); this.SuspendLayout(); // - // btn_faq - // - this.btn_faq.BackColor = System.Drawing.Color.Transparent; - this.btn_faq.BackgroundImage = global::Nucleus.Coop.Properties.Resources.faq; - this.btn_faq.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.btn_faq.Cursor = System.Windows.Forms.Cursors.Hand; - this.btn_faq.FlatAppearance.BorderSize = 0; - this.btn_faq.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; - this.btn_faq.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btn_faq.ForeColor = System.Drawing.Color.White; - this.btn_faq.Location = new System.Drawing.Point(4, 2); - this.btn_faq.Name = "btn_faq"; - this.btn_faq.Size = new System.Drawing.Size(25, 23); - this.btn_faq.TabIndex = 36; - this.btn_faq.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - this.toolTip1.SetToolTip(this.btn_faq, "Nucleus Co-op FAQ."); - this.btn_faq.UseVisualStyleBackColor = false; - this.btn_faq.Click += new System.EventHandler(this.link_faq_Click); - this.btn_faq.MouseEnter += new System.EventHandler(this.btn_faq_MouseEnter); - this.btn_faq.MouseLeave += new System.EventHandler(this.btn_faq_MouseLeave); - // - // btn_reddit - // - this.btn_reddit.BackColor = System.Drawing.Color.Transparent; - this.btn_reddit.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btn_reddit.BackgroundImage"))); - this.btn_reddit.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.btn_reddit.Cursor = System.Windows.Forms.Cursors.Hand; - this.btn_reddit.FlatAppearance.BorderSize = 0; - this.btn_reddit.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; - this.btn_reddit.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btn_reddit.ForeColor = System.Drawing.Color.White; - this.btn_reddit.Location = new System.Drawing.Point(4, 25); - this.btn_reddit.Name = "btn_reddit"; - this.btn_reddit.Size = new System.Drawing.Size(25, 22); - this.btn_reddit.TabIndex = 40; - this.btn_reddit.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - this.toolTip1.SetToolTip(this.btn_reddit, "Official Nucleus Co-op Subreddit."); - this.btn_reddit.UseVisualStyleBackColor = false; - this.btn_reddit.Click += new System.EventHandler(this.button2_Click); - this.btn_reddit.MouseEnter += new System.EventHandler(this.btn_reddit_MouseEnter); - this.btn_reddit.MouseLeave += new System.EventHandler(this.btn_reddit_MouseLeave); - // - // btn_Discord - // - this.btn_Discord.BackColor = System.Drawing.Color.Transparent; - this.btn_Discord.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btn_Discord.BackgroundImage"))); - this.btn_Discord.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.btn_Discord.Cursor = System.Windows.Forms.Cursors.Hand; - this.btn_Discord.FlatAppearance.BorderSize = 0; - this.btn_Discord.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; - this.btn_Discord.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btn_Discord.ForeColor = System.Drawing.Color.White; - this.btn_Discord.Location = new System.Drawing.Point(3, 53); - this.btn_Discord.Name = "btn_Discord"; - this.btn_Discord.Size = new System.Drawing.Size(25, 20); - this.btn_Discord.TabIndex = 39; - this.btn_Discord.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - this.toolTip1.SetToolTip(this.btn_Discord, "Join the official Nucleus Co-op discord server."); - this.btn_Discord.UseVisualStyleBackColor = false; - this.btn_Discord.Click += new System.EventHandler(this.button1_Click); - this.btn_Discord.MouseEnter += new System.EventHandler(this.btn_Discord_MouseEnter); - this.btn_Discord.MouseLeave += new System.EventHandler(this.btn_Discord_MouseLeave); - // - // btn_SplitCalculator - // - this.btn_SplitCalculator.BackColor = System.Drawing.Color.Transparent; - this.btn_SplitCalculator.BackgroundImage = global::Nucleus.Coop.Properties.Resources.SplitCalculator; - this.btn_SplitCalculator.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.btn_SplitCalculator.Cursor = System.Windows.Forms.Cursors.Hand; - this.btn_SplitCalculator.FlatAppearance.BorderSize = 0; - this.btn_SplitCalculator.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; - this.btn_SplitCalculator.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btn_SplitCalculator.ForeColor = System.Drawing.Color.White; - this.btn_SplitCalculator.Location = new System.Drawing.Point(6, 79); - this.btn_SplitCalculator.Name = "btn_SplitCalculator"; - this.btn_SplitCalculator.Size = new System.Drawing.Size(20, 20); - this.btn_SplitCalculator.TabIndex = 38; - this.btn_SplitCalculator.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - this.toolTip1.SetToolTip(this.btn_SplitCalculator, "This program can estimate the system requirements needed\r\nto run a game in split-" + - "screen."); - this.btn_SplitCalculator.UseVisualStyleBackColor = false; - this.btn_SplitCalculator.Click += new System.EventHandler(this.btn_SplitCalculator_Click); - this.btn_SplitCalculator.MouseEnter += new System.EventHandler(this.btn_SplitCalculator_MouseEnter); - this.btn_SplitCalculator.MouseLeave += new System.EventHandler(this.btn_SplitCalculator_MouseLeave); - // - // btn_thirdPartytools - // - this.btn_thirdPartytools.BackColor = System.Drawing.Color.Transparent; - this.btn_thirdPartytools.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btn_thirdPartytools.BackgroundImage"))); - this.btn_thirdPartytools.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.btn_thirdPartytools.Cursor = System.Windows.Forms.Cursors.Hand; - this.btn_thirdPartytools.FlatAppearance.BorderSize = 0; - this.btn_thirdPartytools.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; - this.btn_thirdPartytools.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btn_thirdPartytools.ForeColor = System.Drawing.Color.White; - this.btn_thirdPartytools.Location = new System.Drawing.Point(6, 105); - this.btn_thirdPartytools.Name = "btn_thirdPartytools"; - this.btn_thirdPartytools.Size = new System.Drawing.Size(20, 20); - this.btn_thirdPartytools.TabIndex = 37; - this.btn_thirdPartytools.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - this.toolTip1.SetToolTip(this.btn_thirdPartytools, "Third party tools useful to make non xinput controllers work with Nucleus Co-op."); - this.btn_thirdPartytools.UseVisualStyleBackColor = false; - this.btn_thirdPartytools.Click += new System.EventHandler(this.btn_thirdPartytools_Click); - this.btn_thirdPartytools.MouseEnter += new System.EventHandler(this.btn_thirdPartytools_MouseEnter); - this.btn_thirdPartytools.MouseLeave += new System.EventHandler(this.btn_thirdPartytools_MouseLeave); - // // linkLabel4 // this.linkLabel4.ActiveLinkColor = System.Drawing.Color.Aqua; this.linkLabel4.Dock = System.Windows.Forms.DockStyle.Top; + this.linkLabel4.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.linkLabel4.LinkColor = System.Drawing.Color.DeepSkyBlue; this.linkLabel4.Location = new System.Drawing.Point(0, 45); this.linkLabel4.Name = "linkLabel4"; @@ -254,6 +148,7 @@ private void InitializeComponent() // this.linkLabel3.ActiveLinkColor = System.Drawing.Color.Aqua; this.linkLabel3.Dock = System.Windows.Forms.DockStyle.Top; + this.linkLabel3.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.linkLabel3.LinkColor = System.Drawing.Color.DeepSkyBlue; this.linkLabel3.Location = new System.Drawing.Point(0, 30); this.linkLabel3.Name = "linkLabel3"; @@ -272,6 +167,7 @@ private void InitializeComponent() this.linkLabel2.ActiveLinkColor = System.Drawing.Color.Aqua; this.linkLabel2.BackColor = System.Drawing.Color.Transparent; this.linkLabel2.Dock = System.Windows.Forms.DockStyle.Top; + this.linkLabel2.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.linkLabel2.LinkColor = System.Drawing.Color.DeepSkyBlue; this.linkLabel2.Location = new System.Drawing.Point(0, 15); this.linkLabel2.Name = "linkLabel2"; @@ -289,6 +185,7 @@ private void InitializeComponent() this.linkLabel1.ActiveLinkColor = System.Drawing.Color.Aqua; this.linkLabel1.BackColor = System.Drawing.Color.Transparent; this.linkLabel1.Dock = System.Windows.Forms.DockStyle.Top; + this.linkLabel1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.linkLabel1.LinkColor = System.Drawing.Color.DeepSkyBlue; this.linkLabel1.Location = new System.Drawing.Point(0, 0); this.linkLabel1.Name = "linkLabel1"; @@ -311,12 +208,12 @@ private void InitializeComponent() this.btn_dlFromHub.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; this.btn_dlFromHub.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btn_dlFromHub.ForeColor = System.Drawing.Color.Transparent; - this.btn_dlFromHub.Location = new System.Drawing.Point(353, 4); - this.btn_dlFromHub.Margin = new System.Windows.Forms.Padding(0); + this.btn_dlFromHub.Location = new System.Drawing.Point(409, 3); + this.btn_dlFromHub.Margin = new System.Windows.Forms.Padding(2); this.btn_dlFromHub.Name = "btn_dlFromHub"; - this.btn_dlFromHub.Size = new System.Drawing.Size(25, 25); + this.btn_dlFromHub.Size = new System.Drawing.Size(131, 25); this.btn_dlFromHub.TabIndex = 42; - this.btn_dlFromHub.Text = " "; + this.btn_dlFromHub.Text = "Hub Splitscreen.me"; this.toolTip1.SetToolTip(this.btn_dlFromHub, "Download handlers (.nc) directly from the handlers hub, use the extract handler o" + "ption to install them."); this.btn_dlFromHub.UseVisualStyleBackColor = false; @@ -400,6 +297,112 @@ private void InitializeComponent() this.toolTip1.SetToolTip(this.logo, "Nucleus Co-op Github release page."); this.logo.DoubleClick += new System.EventHandler(this.logo_Click); // + // btn_faq + // + this.btn_faq.BackColor = System.Drawing.Color.Transparent; + this.btn_faq.BackgroundImage = global::Nucleus.Coop.Properties.Resources.faq; + this.btn_faq.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.btn_faq.Cursor = System.Windows.Forms.Cursors.Hand; + this.btn_faq.FlatAppearance.BorderSize = 0; + this.btn_faq.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_faq.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_faq.ForeColor = System.Drawing.Color.White; + this.btn_faq.Location = new System.Drawing.Point(4, 2); + this.btn_faq.Name = "btn_faq"; + this.btn_faq.Size = new System.Drawing.Size(25, 23); + this.btn_faq.TabIndex = 36; + this.btn_faq.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.toolTip1.SetToolTip(this.btn_faq, "Nucleus Co-op FAQ."); + this.btn_faq.UseVisualStyleBackColor = false; + this.btn_faq.Click += new System.EventHandler(this.link_faq_Click); + this.btn_faq.MouseEnter += new System.EventHandler(this.btn_faq_MouseEnter); + this.btn_faq.MouseLeave += new System.EventHandler(this.btn_faq_MouseLeave); + // + // btn_reddit + // + this.btn_reddit.BackColor = System.Drawing.Color.Transparent; + this.btn_reddit.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btn_reddit.BackgroundImage"))); + this.btn_reddit.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.btn_reddit.Cursor = System.Windows.Forms.Cursors.Hand; + this.btn_reddit.FlatAppearance.BorderSize = 0; + this.btn_reddit.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_reddit.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_reddit.ForeColor = System.Drawing.Color.White; + this.btn_reddit.Location = new System.Drawing.Point(4, 25); + this.btn_reddit.Name = "btn_reddit"; + this.btn_reddit.Size = new System.Drawing.Size(25, 22); + this.btn_reddit.TabIndex = 40; + this.btn_reddit.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.toolTip1.SetToolTip(this.btn_reddit, "Official Nucleus Co-op Subreddit."); + this.btn_reddit.UseVisualStyleBackColor = false; + this.btn_reddit.Click += new System.EventHandler(this.button2_Click); + this.btn_reddit.MouseEnter += new System.EventHandler(this.btn_reddit_MouseEnter); + this.btn_reddit.MouseLeave += new System.EventHandler(this.btn_reddit_MouseLeave); + // + // btn_Discord + // + this.btn_Discord.BackColor = System.Drawing.Color.Transparent; + this.btn_Discord.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btn_Discord.BackgroundImage"))); + this.btn_Discord.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.btn_Discord.Cursor = System.Windows.Forms.Cursors.Hand; + this.btn_Discord.FlatAppearance.BorderSize = 0; + this.btn_Discord.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_Discord.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Discord.ForeColor = System.Drawing.Color.White; + this.btn_Discord.Location = new System.Drawing.Point(3, 53); + this.btn_Discord.Name = "btn_Discord"; + this.btn_Discord.Size = new System.Drawing.Size(25, 20); + this.btn_Discord.TabIndex = 39; + this.btn_Discord.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.toolTip1.SetToolTip(this.btn_Discord, "Join the official Nucleus Co-op discord server."); + this.btn_Discord.UseVisualStyleBackColor = false; + this.btn_Discord.Click += new System.EventHandler(this.button1_Click); + this.btn_Discord.MouseEnter += new System.EventHandler(this.btn_Discord_MouseEnter); + this.btn_Discord.MouseLeave += new System.EventHandler(this.btn_Discord_MouseLeave); + // + // btn_SplitCalculator + // + this.btn_SplitCalculator.BackColor = System.Drawing.Color.Transparent; + this.btn_SplitCalculator.BackgroundImage = global::Nucleus.Coop.Properties.Resources.SplitCalculator; + this.btn_SplitCalculator.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.btn_SplitCalculator.Cursor = System.Windows.Forms.Cursors.Hand; + this.btn_SplitCalculator.FlatAppearance.BorderSize = 0; + this.btn_SplitCalculator.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_SplitCalculator.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_SplitCalculator.ForeColor = System.Drawing.Color.White; + this.btn_SplitCalculator.Location = new System.Drawing.Point(6, 79); + this.btn_SplitCalculator.Name = "btn_SplitCalculator"; + this.btn_SplitCalculator.Size = new System.Drawing.Size(20, 20); + this.btn_SplitCalculator.TabIndex = 38; + this.btn_SplitCalculator.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.toolTip1.SetToolTip(this.btn_SplitCalculator, "This program can estimate the system requirements needed\r\nto run a game in split-" + + "screen."); + this.btn_SplitCalculator.UseVisualStyleBackColor = false; + this.btn_SplitCalculator.Click += new System.EventHandler(this.btn_SplitCalculator_Click); + this.btn_SplitCalculator.MouseEnter += new System.EventHandler(this.btn_SplitCalculator_MouseEnter); + this.btn_SplitCalculator.MouseLeave += new System.EventHandler(this.btn_SplitCalculator_MouseLeave); + // + // btn_thirdPartytools + // + this.btn_thirdPartytools.BackColor = System.Drawing.Color.Transparent; + this.btn_thirdPartytools.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("btn_thirdPartytools.BackgroundImage"))); + this.btn_thirdPartytools.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.btn_thirdPartytools.Cursor = System.Windows.Forms.Cursors.Hand; + this.btn_thirdPartytools.FlatAppearance.BorderSize = 0; + this.btn_thirdPartytools.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_thirdPartytools.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_thirdPartytools.ForeColor = System.Drawing.Color.White; + this.btn_thirdPartytools.Location = new System.Drawing.Point(6, 105); + this.btn_thirdPartytools.Name = "btn_thirdPartytools"; + this.btn_thirdPartytools.Size = new System.Drawing.Size(20, 20); + this.btn_thirdPartytools.TabIndex = 37; + this.btn_thirdPartytools.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.toolTip1.SetToolTip(this.btn_thirdPartytools, "Third party tools useful to make non xinput controllers work with Nucleus Co-op."); + this.btn_thirdPartytools.UseVisualStyleBackColor = false; + this.btn_thirdPartytools.Click += new System.EventHandler(this.btn_thirdPartytools_Click); + this.btn_thirdPartytools.MouseEnter += new System.EventHandler(this.btn_thirdPartytools_MouseEnter); + this.btn_thirdPartytools.MouseLeave += new System.EventHandler(this.btn_thirdPartytools_MouseLeave); + // // gameContextMenuStrip // this.gameContextMenuStrip.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; @@ -565,23 +568,6 @@ private void InitializeComponent() this.deleteToolStripMenuItem.Text = "Remove Game from List"; this.deleteToolStripMenuItem.Click += new System.EventHandler(this.DeleteToolStripMenuItem_Click); // - // splash - // - this.splash.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.splash.BackColor = System.Drawing.Color.Black; - this.splash.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.splash.Cursor = System.Windows.Forms.Cursors.WaitCursor; - this.splash.Location = new System.Drawing.Point(0, 0); - this.splash.Margin = new System.Windows.Forms.Padding(0); - this.splash.Name = "splash"; - this.splash.Size = new System.Drawing.Size(1050, 602); - this.splash.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.splash.TabIndex = 1; - this.splash.TabStop = false; - this.splash.Click += new System.EventHandler(this.splash_Click); - // // btn_Links // this.btn_Links.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); @@ -612,21 +598,6 @@ private void InitializeComponent() this.glowingLine0.TabIndex = 36; this.glowingLine0.TabStop = false; // - // linksPanel - // - this.linksPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.linksPanel.BackColor = System.Drawing.Color.Black; - this.linksPanel.Controls.Add(this.btn_faq); - this.linksPanel.Controls.Add(this.btn_reddit); - this.linksPanel.Controls.Add(this.btn_Discord); - this.linksPanel.Controls.Add(this.btn_SplitCalculator); - this.linksPanel.Controls.Add(this.btn_thirdPartytools); - this.linksPanel.Location = new System.Drawing.Point(896, 32); - this.linksPanel.Name = "linksPanel"; - this.linksPanel.Size = new System.Drawing.Size(33, 127); - this.linksPanel.TabIndex = 0; - this.linksPanel.Visible = false; - // // third_party_tools_container // this.third_party_tools_container.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); @@ -651,32 +622,17 @@ private void InitializeComponent() | System.Windows.Forms.AnchorStyles.Right))); this.clientAreaPanel.BackColor = System.Drawing.Color.Black; this.clientAreaPanel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.clientAreaPanel.Controls.Add(this.stepPanelPictureBox); this.clientAreaPanel.Controls.Add(this.StepPanel); this.clientAreaPanel.Controls.Add(this.game_listSizer); this.clientAreaPanel.Controls.Add(this.rightFrame); this.clientAreaPanel.Controls.Add(this.mainButtonFrame); + this.clientAreaPanel.Controls.Add(this.stepPanelPictureBox); this.clientAreaPanel.Location = new System.Drawing.Point(0, 35); this.clientAreaPanel.Margin = new System.Windows.Forms.Padding(0); this.clientAreaPanel.Name = "clientAreaPanel"; this.clientAreaPanel.Size = new System.Drawing.Size(1050, 565); this.clientAreaPanel.TabIndex = 34; // - // stepPanelPictureBox - // - this.stepPanelPictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.stepPanelPictureBox.BackColor = System.Drawing.Color.Transparent; - this.stepPanelPictureBox.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.stepPanelPictureBox.Location = new System.Drawing.Point(353, 140); - this.stepPanelPictureBox.Margin = new System.Windows.Forms.Padding(0); - this.stepPanelPictureBox.Name = "stepPanelPictureBox"; - this.stepPanelPictureBox.Size = new System.Drawing.Size(550, 311); - this.stepPanelPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; - this.stepPanelPictureBox.TabIndex = 15; - this.stepPanelPictureBox.TabStop = false; - // // StepPanel // this.StepPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) @@ -687,10 +643,10 @@ private void InitializeComponent() this.StepPanel.BackColor = System.Drawing.Color.Transparent; this.StepPanel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; this.StepPanel.Cursor = System.Windows.Forms.Cursors.Default; - this.StepPanel.Location = new System.Drawing.Point(202, 31); + this.StepPanel.Location = new System.Drawing.Point(209, 33); this.StepPanel.Margin = new System.Windows.Forms.Padding(0); this.StepPanel.Name = "StepPanel"; - this.StepPanel.Size = new System.Drawing.Size(655, 537); + this.StepPanel.Size = new System.Drawing.Size(646, 535); this.StepPanel.TabIndex = 0; this.StepPanel.Visible = false; // @@ -704,7 +660,7 @@ private void InitializeComponent() this.game_listSizer.Location = new System.Drawing.Point(0, 33); this.game_listSizer.Margin = new System.Windows.Forms.Padding(0); this.game_listSizer.Name = "game_listSizer"; - this.game_listSizer.Size = new System.Drawing.Size(202, 534); + this.game_listSizer.Size = new System.Drawing.Size(209, 534); this.game_listSizer.TabIndex = 35; // // list_Games @@ -724,7 +680,7 @@ private void InitializeComponent() this.list_Games.Name = "list_Games"; this.list_Games.Offset = new System.Drawing.Size(0, 0); this.list_Games.RightToLeft = System.Windows.Forms.RightToLeft.No; - this.list_Games.Size = new System.Drawing.Size(220, 535); + this.list_Games.Size = new System.Drawing.Size(230, 535); this.list_Games.TabIndex = 2; this.list_Games.SelectedChanged += new System.Action(this.list_Games_SelectedChanged); // @@ -734,131 +690,83 @@ private void InitializeComponent() | System.Windows.Forms.AnchorStyles.Right))); this.rightFrame.BackColor = System.Drawing.Color.Transparent; this.rightFrame.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.rightFrame.Controls.Add(this.buttonContainer); + this.rightFrame.Controls.Add(this.icons_Container); + this.rightFrame.Controls.Add(this.btn_gameOptions); this.rightFrame.Controls.Add(this.scriptAuthorTxtSizer); this.rightFrame.Controls.Add(this.cover); this.rightFrame.Controls.Add(this.txt_GameDescSizer); - this.rightFrame.Location = new System.Drawing.Point(857, 31); + this.rightFrame.Location = new System.Drawing.Point(855, 33); this.rightFrame.Margin = new System.Windows.Forms.Padding(0); this.rightFrame.Name = "rightFrame"; - this.rightFrame.Size = new System.Drawing.Size(193, 537); + this.rightFrame.Size = new System.Drawing.Size(195, 535); this.rightFrame.TabIndex = 34; this.rightFrame.Visible = false; // - // buttonContainer + // icons_Container // - this.buttonContainer.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.buttonContainer.Controls.Add(this.btn_GameDesc); - this.buttonContainer.Controls.Add(this.btn_gameOptions); - this.buttonContainer.Controls.Add(this.btn_scriptAuthorTxt); - this.buttonContainer.Controls.Add(this.button_UpdateAvailable); - this.buttonContainer.Cursor = System.Windows.Forms.Cursors.Default; - this.buttonContainer.Location = new System.Drawing.Point(0, 470); - this.buttonContainer.Name = "buttonContainer"; - this.buttonContainer.Size = new System.Drawing.Size(192, 64); - this.buttonContainer.TabIndex = 0; - // - // btn_GameDesc - // - this.btn_GameDesc.Anchor = System.Windows.Forms.AnchorStyles.Bottom; - this.btn_GameDesc.BackColor = System.Drawing.Color.Transparent; - this.btn_GameDesc.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.btn_GameDesc.Cursor = System.Windows.Forms.Cursors.Hand; - this.btn_GameDesc.Enabled = false; - this.btn_GameDesc.FlatAppearance.BorderColor = System.Drawing.Color.Silver; - this.btn_GameDesc.FlatAppearance.BorderSize = 0; - this.btn_GameDesc.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btn_GameDesc.Location = new System.Drawing.Point(187, -19); - this.btn_GameDesc.Margin = new System.Windows.Forms.Padding(2); - this.btn_GameDesc.Name = "btn_GameDesc"; - this.btn_GameDesc.Size = new System.Drawing.Size(166, 13); - this.btn_GameDesc.TabIndex = 29; - this.btn_GameDesc.Text = "Game Description"; - this.btn_GameDesc.UseVisualStyleBackColor = false; - this.btn_GameDesc.Visible = false; - this.btn_GameDesc.Click += new System.EventHandler(this.btn_GameDesc_Click); + this.icons_Container.Location = new System.Drawing.Point(11, 12); + this.icons_Container.Name = "icons_Container"; + this.icons_Container.Size = new System.Drawing.Size(143, 17); + this.icons_Container.TabIndex = 32; // // btn_gameOptions // - this.btn_gameOptions.Anchor = System.Windows.Forms.AnchorStyles.Bottom; + this.btn_gameOptions.Anchor = System.Windows.Forms.AnchorStyles.Top; this.btn_gameOptions.BackColor = System.Drawing.Color.Transparent; this.btn_gameOptions.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; this.btn_gameOptions.Cursor = System.Windows.Forms.Cursors.Hand; this.btn_gameOptions.FlatAppearance.BorderColor = System.Drawing.Color.Silver; this.btn_gameOptions.FlatAppearance.BorderSize = 0; this.btn_gameOptions.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btn_gameOptions.Location = new System.Drawing.Point(10, 1); + this.btn_gameOptions.Location = new System.Drawing.Point(160, 14); this.btn_gameOptions.Margin = new System.Windows.Forms.Padding(2); this.btn_gameOptions.Name = "btn_gameOptions"; - this.btn_gameOptions.Size = new System.Drawing.Size(172, 25); + this.btn_gameOptions.Size = new System.Drawing.Size(20, 17); this.btn_gameOptions.TabIndex = 21; - this.btn_gameOptions.Text = "Game Options"; this.btn_gameOptions.UseVisualStyleBackColor = false; this.btn_gameOptions.Visible = false; this.btn_gameOptions.Click += new System.EventHandler(this.GameOptions_Click); // - // btn_scriptAuthorTxt - // - this.btn_scriptAuthorTxt.Anchor = System.Windows.Forms.AnchorStyles.Bottom; - this.btn_scriptAuthorTxt.BackColor = System.Drawing.Color.Transparent; - this.btn_scriptAuthorTxt.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.btn_scriptAuthorTxt.Cursor = System.Windows.Forms.Cursors.Hand; - this.btn_scriptAuthorTxt.Enabled = false; - this.btn_scriptAuthorTxt.FlatAppearance.BorderColor = System.Drawing.Color.Silver; - this.btn_scriptAuthorTxt.FlatAppearance.BorderSize = 0; - this.btn_scriptAuthorTxt.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btn_scriptAuthorTxt.Location = new System.Drawing.Point(12, -34); - this.btn_scriptAuthorTxt.Margin = new System.Windows.Forms.Padding(2); - this.btn_scriptAuthorTxt.Name = "btn_scriptAuthorTxt"; - this.btn_scriptAuthorTxt.Size = new System.Drawing.Size(166, 11); - this.btn_scriptAuthorTxt.TabIndex = 30; - this.btn_scriptAuthorTxt.Text = "Game Handler Instructions"; - this.btn_scriptAuthorTxt.UseVisualStyleBackColor = false; - this.btn_scriptAuthorTxt.Visible = false; - this.btn_scriptAuthorTxt.Click += new System.EventHandler(this.btn_scriptAuthorTxt_Click); - // - // button_UpdateAvailable - // - this.button_UpdateAvailable.Anchor = System.Windows.Forms.AnchorStyles.Bottom; - this.button_UpdateAvailable.BackColor = System.Drawing.Color.Transparent; - this.button_UpdateAvailable.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.button_UpdateAvailable.Cursor = System.Windows.Forms.Cursors.Hand; - this.button_UpdateAvailable.FlatAppearance.BorderColor = System.Drawing.Color.Silver; - this.button_UpdateAvailable.FlatAppearance.BorderSize = 0; - this.button_UpdateAvailable.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.button_UpdateAvailable.ForeColor = System.Drawing.Color.Yellow; - this.button_UpdateAvailable.Location = new System.Drawing.Point(10, 30); - this.button_UpdateAvailable.Margin = new System.Windows.Forms.Padding(2); - this.button_UpdateAvailable.Name = "button_UpdateAvailable"; - this.button_UpdateAvailable.Size = new System.Drawing.Size(172, 25); - this.button_UpdateAvailable.TabIndex = 23; - this.button_UpdateAvailable.Text = "New Handler Available!"; - this.button_UpdateAvailable.UseVisualStyleBackColor = false; - this.button_UpdateAvailable.Visible = false; - this.button_UpdateAvailable.Click += new System.EventHandler(this.button_UpdateAvailable_Click); - // // scriptAuthorTxtSizer // - this.scriptAuthorTxtSizer.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); + this.scriptAuthorTxtSizer.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.scriptAuthorTxtSizer.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.scriptAuthorTxtSizer.BackColor = System.Drawing.Color.Transparent; this.scriptAuthorTxtSizer.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; this.scriptAuthorTxtSizer.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.scriptAuthorTxtSizer.Controls.Add(this.btn_textSwitcher); this.scriptAuthorTxtSizer.Controls.Add(this.btn_magnifier); this.scriptAuthorTxtSizer.Controls.Add(this.HandlerNoteTitle); this.scriptAuthorTxtSizer.Controls.Add(this.scriptAuthorTxt); - this.scriptAuthorTxtSizer.Location = new System.Drawing.Point(10, 242); + this.scriptAuthorTxtSizer.Location = new System.Drawing.Point(11, 283); this.scriptAuthorTxtSizer.Margin = new System.Windows.Forms.Padding(5); this.scriptAuthorTxtSizer.Name = "scriptAuthorTxtSizer"; - this.scriptAuthorTxtSizer.Size = new System.Drawing.Size(172, 220); + this.scriptAuthorTxtSizer.Size = new System.Drawing.Size(172, 237); this.scriptAuthorTxtSizer.TabIndex = 31; // + // btn_textSwitcher + // + this.btn_textSwitcher.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btn_textSwitcher.BackColor = System.Drawing.Color.Transparent; + this.btn_textSwitcher.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.btn_textSwitcher.Cursor = System.Windows.Forms.Cursors.Hand; + this.btn_textSwitcher.FlatAppearance.BorderSize = 0; + this.btn_textSwitcher.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Transparent; + this.btn_textSwitcher.FlatAppearance.MouseOverBackColor = System.Drawing.Color.Transparent; + this.btn_textSwitcher.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_textSwitcher.Location = new System.Drawing.Point(150, 3); + this.btn_textSwitcher.Name = "btn_textSwitcher"; + this.btn_textSwitcher.Size = new System.Drawing.Size(17, 18); + this.btn_textSwitcher.TabIndex = 44; + this.btn_textSwitcher.UseVisualStyleBackColor = false; + this.btn_textSwitcher.Visible = false; + this.btn_textSwitcher.Click += new System.EventHandler(this.btn_textSwitcher_Click); + // // btn_magnifier // this.btn_magnifier.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; this.btn_magnifier.Cursor = System.Windows.Forms.Cursors.Hand; - this.btn_magnifier.Location = new System.Drawing.Point(0, 2); + this.btn_magnifier.Location = new System.Drawing.Point(2, 2); this.btn_magnifier.Name = "btn_magnifier"; this.btn_magnifier.Size = new System.Drawing.Size(20, 20); this.btn_magnifier.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; @@ -868,13 +776,14 @@ private void InitializeComponent() // // HandlerNoteTitle // + this.HandlerNoteTitle.Dock = System.Windows.Forms.DockStyle.Top; this.HandlerNoteTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.HandlerNoteTitle.Location = new System.Drawing.Point(44, 0); + this.HandlerNoteTitle.Location = new System.Drawing.Point(0, 0); this.HandlerNoteTitle.Name = "HandlerNoteTitle"; - this.HandlerNoteTitle.Size = new System.Drawing.Size(128, 20); + this.HandlerNoteTitle.Size = new System.Drawing.Size(170, 20); this.HandlerNoteTitle.TabIndex = 33; this.HandlerNoteTitle.Text = "Handler Notes"; - this.HandlerNoteTitle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.HandlerNoteTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // scriptAuthorTxt // @@ -886,12 +795,12 @@ private void InitializeComponent() this.scriptAuthorTxt.BulletIndent = 1; this.scriptAuthorTxt.Cursor = System.Windows.Forms.Cursors.IBeam; this.scriptAuthorTxt.ForeColor = System.Drawing.Color.White; - this.scriptAuthorTxt.Location = new System.Drawing.Point(0, 22); + this.scriptAuthorTxt.Location = new System.Drawing.Point(0, 24); this.scriptAuthorTxt.Margin = new System.Windows.Forms.Padding(0); this.scriptAuthorTxt.Name = "scriptAuthorTxt"; this.scriptAuthorTxt.ReadOnly = true; this.scriptAuthorTxt.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.ForcedVertical; - this.scriptAuthorTxt.Size = new System.Drawing.Size(187, 196); + this.scriptAuthorTxt.Size = new System.Drawing.Size(187, 191); this.scriptAuthorTxt.TabIndex = 13; this.scriptAuthorTxt.Text = ""; this.scriptAuthorTxt.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.scriptAuthorTxt_LinkClicked); @@ -904,7 +813,7 @@ private void InitializeComponent() this.cover.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; this.cover.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.cover.Controls.Add(this.coverFrame); - this.cover.Location = new System.Drawing.Point(10, 5); + this.cover.Location = new System.Drawing.Point(11, 43); this.cover.Name = "cover"; this.cover.Size = new System.Drawing.Size(172, 229); this.cover.TabIndex = 27; @@ -916,6 +825,7 @@ private void InitializeComponent() | System.Windows.Forms.AnchorStyles.Right))); this.coverFrame.BackColor = System.Drawing.Color.Transparent; this.coverFrame.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.coverFrame.Controls.Add(this.button_UpdateAvailable); this.coverFrame.Location = new System.Drawing.Point(0, 0); this.coverFrame.Margin = new System.Windows.Forms.Padding(0); this.coverFrame.Name = "coverFrame"; @@ -923,6 +833,26 @@ private void InitializeComponent() this.coverFrame.TabIndex = 26; this.coverFrame.Visible = false; // + // button_UpdateAvailable + // + this.button_UpdateAvailable.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(27)))), ((int)(((byte)(27)))), ((int)(((byte)(27))))); + this.button_UpdateAvailable.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.button_UpdateAvailable.Cursor = System.Windows.Forms.Cursors.Hand; + this.button_UpdateAvailable.FlatAppearance.BorderColor = System.Drawing.Color.Silver; + this.button_UpdateAvailable.FlatAppearance.BorderSize = 0; + this.button_UpdateAvailable.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.button_UpdateAvailable.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.button_UpdateAvailable.ForeColor = System.Drawing.Color.Yellow; + this.button_UpdateAvailable.Location = new System.Drawing.Point(-1, 204); + this.button_UpdateAvailable.Margin = new System.Windows.Forms.Padding(2); + this.button_UpdateAvailable.Name = "button_UpdateAvailable"; + this.button_UpdateAvailable.Size = new System.Drawing.Size(173, 25); + this.button_UpdateAvailable.TabIndex = 23; + this.button_UpdateAvailable.Text = "New Handler Available!"; + this.button_UpdateAvailable.UseVisualStyleBackColor = false; + this.button_UpdateAvailable.Visible = false; + this.button_UpdateAvailable.Click += new System.EventHandler(this.button_UpdateAvailable_Click); + // // txt_GameDescSizer // this.txt_GameDescSizer.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) @@ -933,10 +863,10 @@ private void InitializeComponent() this.txt_GameDescSizer.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; this.txt_GameDescSizer.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.txt_GameDescSizer.Controls.Add(this.txt_GameDesc); - this.txt_GameDescSizer.Location = new System.Drawing.Point(198, 240); + this.txt_GameDescSizer.Location = new System.Drawing.Point(200, 240); this.txt_GameDescSizer.Margin = new System.Windows.Forms.Padding(5); this.txt_GameDescSizer.Name = "txt_GameDescSizer"; - this.txt_GameDescSizer.Size = new System.Drawing.Size(103, 207); + this.txt_GameDescSizer.Size = new System.Drawing.Size(103, 205); this.txt_GameDescSizer.TabIndex = 28; this.txt_GameDescSizer.Visible = false; // @@ -955,7 +885,7 @@ private void InitializeComponent() this.txt_GameDesc.Name = "txt_GameDesc"; this.txt_GameDesc.ReadOnly = true; this.txt_GameDesc.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.txt_GameDesc.Size = new System.Drawing.Size(59, 207); + this.txt_GameDesc.Size = new System.Drawing.Size(59, 205); this.txt_GameDesc.TabIndex = 27; this.txt_GameDesc.Visible = false; // @@ -989,7 +919,8 @@ private void InitializeComponent() this.btn_Download.FlatAppearance.BorderColor = System.Drawing.Color.Silver; this.btn_Download.FlatAppearance.BorderSize = 0; this.btn_Download.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btn_Download.Location = new System.Drawing.Point(381, 4); + this.btn_Download.ForeColor = System.Drawing.Color.White; + this.btn_Download.Location = new System.Drawing.Point(246, 3); this.btn_Download.Margin = new System.Windows.Forms.Padding(2); this.btn_Download.Name = "btn_Download"; this.btn_Download.Size = new System.Drawing.Size(159, 25); @@ -1007,7 +938,8 @@ private void InitializeComponent() this.btn_Extract.FlatAppearance.BorderColor = System.Drawing.Color.Silver; this.btn_Extract.FlatAppearance.BorderSize = 0; this.btn_Extract.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btn_Extract.Location = new System.Drawing.Point(545, 4); + this.btn_Extract.ForeColor = System.Drawing.Color.White; + this.btn_Extract.Location = new System.Drawing.Point(545, 3); this.btn_Extract.Name = "btn_Extract"; this.btn_Extract.Size = new System.Drawing.Size(110, 25); this.btn_Extract.TabIndex = 0; @@ -1021,13 +953,14 @@ private void InitializeComponent() this.label_StepTitle.BackColor = System.Drawing.Color.Transparent; this.label_StepTitle.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; this.label_StepTitle.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.label_StepTitle.Location = new System.Drawing.Point(6, 5); + this.label_StepTitle.Location = new System.Drawing.Point(6, 9); this.label_StepTitle.Margin = new System.Windows.Forms.Padding(0); this.label_StepTitle.Name = "label_StepTitle"; this.label_StepTitle.Size = new System.Drawing.Size(75, 13); this.label_StepTitle.TabIndex = 3; this.label_StepTitle.Text = "Select a game"; this.label_StepTitle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.label_StepTitle.Visible = false; // // btnSearch // @@ -1038,7 +971,8 @@ private void InitializeComponent() this.btnSearch.FlatAppearance.BorderColor = System.Drawing.Color.Silver; this.btnSearch.FlatAppearance.BorderSize = 0; this.btnSearch.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btnSearch.Location = new System.Drawing.Point(660, 4); + this.btnSearch.ForeColor = System.Drawing.Color.White; + this.btnSearch.Location = new System.Drawing.Point(660, 3); this.btnSearch.Margin = new System.Windows.Forms.Padding(2); this.btnSearch.Name = "btnSearch"; this.btnSearch.Size = new System.Drawing.Size(106, 25); @@ -1057,7 +991,7 @@ private void InitializeComponent() this.btnBack.FlatAppearance.BorderColor = System.Drawing.Color.Silver; this.btnBack.FlatAppearance.BorderSize = 0; this.btnBack.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btnBack.Location = new System.Drawing.Point(896, 4); + this.btnBack.Location = new System.Drawing.Point(892, 5); this.btnBack.Margin = new System.Windows.Forms.Padding(2); this.btnBack.Name = "btnBack"; this.btnBack.Size = new System.Drawing.Size(25, 25); @@ -1077,8 +1011,9 @@ private void InitializeComponent() this.btn_Play.FlatAppearance.BorderColor = System.Drawing.Color.Silver; this.btn_Play.FlatAppearance.BorderSize = 0; this.btn_Play.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btn_Play.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.btn_Play.ForeColor = System.Drawing.Color.Lime; - this.btn_Play.Location = new System.Drawing.Point(922, 4); + this.btn_Play.Location = new System.Drawing.Point(921, 3); this.btn_Play.Margin = new System.Windows.Forms.Padding(2); this.btn_Play.Name = "btn_Play"; this.btn_Play.Size = new System.Drawing.Size(100, 25); @@ -1097,7 +1032,7 @@ private void InitializeComponent() this.btn_Next.FlatAppearance.BorderColor = System.Drawing.Color.Silver; this.btn_Next.FlatAppearance.BorderSize = 0; this.btn_Next.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btn_Next.Location = new System.Drawing.Point(1024, 4); + this.btn_Next.Location = new System.Drawing.Point(1025, 3); this.btn_Next.Margin = new System.Windows.Forms.Padding(2); this.btn_Next.Name = "btn_Next"; this.btn_Next.Size = new System.Drawing.Size(25, 25); @@ -1117,7 +1052,8 @@ private void InitializeComponent() this.btnAutoSearch.FlatAppearance.BorderColor = System.Drawing.Color.Silver; this.btnAutoSearch.FlatAppearance.BorderSize = 0; this.btnAutoSearch.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.btnAutoSearch.Location = new System.Drawing.Point(770, 4); + this.btnAutoSearch.ForeColor = System.Drawing.Color.White; + this.btnAutoSearch.Location = new System.Drawing.Point(770, 3); this.btnAutoSearch.Margin = new System.Windows.Forms.Padding(2); this.btnAutoSearch.Name = "btnAutoSearch"; this.btnAutoSearch.Size = new System.Drawing.Size(121, 25); @@ -1126,18 +1062,34 @@ private void InitializeComponent() this.btnAutoSearch.UseVisualStyleBackColor = false; this.btnAutoSearch.Click += new System.EventHandler(this.btnAutoSearch_Click); // + // stepPanelPictureBox + // + this.stepPanelPictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.stepPanelPictureBox.BackColor = System.Drawing.Color.Transparent; + this.stepPanelPictureBox.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.stepPanelPictureBox.Location = new System.Drawing.Point(353, 140); + this.stepPanelPictureBox.Margin = new System.Windows.Forms.Padding(0); + this.stepPanelPictureBox.Name = "stepPanelPictureBox"; + this.stepPanelPictureBox.Size = new System.Drawing.Size(550, 311); + this.stepPanelPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.stepPanelPictureBox.TabIndex = 15; + this.stepPanelPictureBox.TabStop = false; + // // txt_version // this.txt_version.AutoSize = true; this.txt_version.BackColor = System.Drawing.Color.Transparent; this.txt_version.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.txt_version.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.txt_version.ForeColor = System.Drawing.Color.White; this.txt_version.Location = new System.Drawing.Point(159, 11); this.txt_version.Margin = new System.Windows.Forms.Padding(0); this.txt_version.Name = "txt_version"; this.txt_version.Size = new System.Drawing.Size(28, 13); this.txt_version.TabIndex = 35; - this.txt_version.Text = "v2.1"; + this.txt_version.Text = "vxxx"; this.txt_version.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // closeBtn @@ -1197,6 +1149,38 @@ private void InitializeComponent() this.maximizeBtn.MouseEnter += new System.EventHandler(this.maximizeBtn_MouseEnter); this.maximizeBtn.MouseLeave += new System.EventHandler(this.maximizeBtn_MouseLeave); // + // splash + // + this.splash.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.splash.BackColor = System.Drawing.Color.Black; + this.splash.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.splash.Cursor = System.Windows.Forms.Cursors.WaitCursor; + this.splash.Location = new System.Drawing.Point(0, 0); + this.splash.Margin = new System.Windows.Forms.Padding(0); + this.splash.Name = "splash"; + this.splash.Size = new System.Drawing.Size(1050, 602); + this.splash.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.splash.TabIndex = 1; + this.splash.TabStop = false; + this.splash.Click += new System.EventHandler(this.splash_Click); + // + // linksPanel + // + this.linksPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.linksPanel.BackColor = System.Drawing.Color.Black; + this.linksPanel.Controls.Add(this.btn_faq); + this.linksPanel.Controls.Add(this.btn_reddit); + this.linksPanel.Controls.Add(this.btn_Discord); + this.linksPanel.Controls.Add(this.btn_SplitCalculator); + this.linksPanel.Controls.Add(this.btn_thirdPartytools); + this.linksPanel.Location = new System.Drawing.Point(896, 29); + this.linksPanel.Name = "linksPanel"; + this.linksPanel.Size = new System.Drawing.Size(33, 127); + this.linksPanel.TabIndex = 0; + this.linksPanel.Visible = false; + // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); @@ -1208,7 +1192,6 @@ private void InitializeComponent() this.Controls.Add(this.splash); this.Controls.Add(this.btn_Links); this.Controls.Add(this.glowingLine0); - this.Controls.Add(this.linksPanel); this.Controls.Add(this.third_party_tools_container); this.Controls.Add(this.clientAreaPanel); this.Controls.Add(this.btn_noHub); @@ -1219,6 +1202,7 @@ private void InitializeComponent() this.Controls.Add(this.minimizeBtn); this.Controls.Add(this.logo); this.Controls.Add(this.maximizeBtn); + this.Controls.Add(this.linksPanel); this.Cursor = System.Windows.Forms.Cursors.Default; this.DoubleBuffered = true; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; @@ -1230,25 +1214,26 @@ private void InitializeComponent() this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "Nucleus Co-op"; this.Load += new System.EventHandler(this.MainForm_Load); + this.ClientSizeChanged += new System.EventHandler(this.MainForm_ClientSizeChanged); this.MouseHover += new System.EventHandler(this.MainForm_MouseHover); ((System.ComponentModel.ISupportInitialize)(this.logo)).EndInit(); this.gameContextMenuStrip.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.splash)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.glowingLine0)).EndInit(); - this.linksPanel.ResumeLayout(false); this.third_party_tools_container.ResumeLayout(false); this.clientAreaPanel.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.stepPanelPictureBox)).EndInit(); this.game_listSizer.ResumeLayout(false); this.rightFrame.ResumeLayout(false); - this.buttonContainer.ResumeLayout(false); this.scriptAuthorTxtSizer.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.btn_magnifier)).EndInit(); this.cover.ResumeLayout(false); + this.coverFrame.ResumeLayout(false); this.txt_GameDescSizer.ResumeLayout(false); this.txt_GameDescSizer.PerformLayout(); this.mainButtonFrame.ResumeLayout(false); this.mainButtonFrame.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.stepPanelPictureBox)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.splash)).EndInit(); + this.linksPanel.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); @@ -1297,13 +1282,11 @@ private void InitializeComponent() private PictureBox logo; private PictureBox splash; private BufferedClientAreaPanel coverFrame; - private Button btn_scriptAuthorTxt; private BufferedClientAreaPanel scriptAuthorTxtSizer; private BufferedClientAreaPanel mainButtonFrame; private BufferedClientAreaPanel rightFrame; private BufferedClientAreaPanel game_listSizer; private BufferedClientAreaPanel cover; - private BufferedClientAreaPanel buttonContainer; private Button btn_downloadAssets; private Label txt_version; public PictureBox glowingLine0; @@ -1321,12 +1304,13 @@ private void InitializeComponent() private Button btn_noHub; public TextBox txt_GameDesc; public BufferedClientAreaPanel txt_GameDescSizer; - public Button btn_GameDesc; public BufferedClientAreaPanel clientAreaPanel; private Button btn_dlFromHub; private BufferedClientAreaPanel linksPanel; private Button btn_Links; private Label HandlerNoteTitle; private PictureBox btn_magnifier; + private Button btn_textSwitcher; + private FlowLayoutPanel icons_Container; } } \ No newline at end of file diff --git a/Master/NucleusCoopTool/Forms/MainForm.cs b/Master/NucleusCoopTool/Forms/MainForm.cs index d0a33199..0fa51964 100644 --- a/Master/NucleusCoopTool/Forms/MainForm.cs +++ b/Master/NucleusCoopTool/Forms/MainForm.cs @@ -33,9 +33,8 @@ public partial class MainForm : BaseForm, IDynamicSized { private readonly IniFile ini = new IniFile(Path.Combine(Directory.GetCurrentDirectory(), "Settings.ini")); private IniFile iconsIni; - public string version = "v2.1"; + public string version = "v"+ Globals.Version; private string faq_link = "https://www.splitscreen.me/docs/faq"; - private string gameDescription; protected string api = "https://hub.splitscreen.me/api/v1/"; private string NucleusEnvironmentRoot = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); private string DocumentsRoot = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); @@ -70,7 +69,7 @@ public partial class MainForm : BaseForm, IDynamicSized private int TopMost_HotkeyID = 2; private int StopSession_HotkeyID = 3; private int currentStepIndex; - + public int blurValue; private List profilePaths = new List(); private List ctrls = new List(); private List
backgroundForms = new List(); @@ -82,6 +81,10 @@ public partial class MainForm : BaseForm, IDynamicSized private Bitmap coverImg; private Bitmap screenshotImg; public Bitmap AppButtons; + private Bitmap k_Icon; + private Bitmap xinputGamepad_Icon; + private Bitmap dinputGamepad_Icon; + public bool connected; private bool currentlyUpdatingScript = false; private bool Splash_On; @@ -110,8 +113,8 @@ public partial class MainForm : BaseForm, IDynamicSized public string[] rgb_ButtonsBorderColor; public string[] rgb_ThirdPartyToolsLinks; public string[] rgb_HandlerNoteBackColor; - public string[] rgb_HandlerNoteTitleBackColor; - + public string[] rgb_HandlerNoteMagnifierTitleBackColor; + public Color TitleBarColor; public Color MouseOverBackColor; public Color MenuStripBackColor; @@ -119,10 +122,17 @@ public partial class MainForm : BaseForm, IDynamicSized public Color ButtonsBorderColor; private Color HandlerNoteBackColor; private Color HandlerNoteFontColor; - private Color HandlerNoteTitleBackColor; + private Color HandlerNoteMagnifierTitleBackColor; private Color HandlerNoteTitleFont; public FileInfo fontPath; + private Label inputsIconsDesc; + private UI.InputIcons icon1; + private UI.InputIcons icon2; + private UI.InputIcons icon3; + private UI.InputIcons icon4; + private UI.InputIcons icon5; + private UI.InputIcons icon6; public void CheckNetCon() { @@ -294,9 +304,12 @@ private void minimizeButton(object sender, EventArgs e) private void maximizeButton(object sender, EventArgs e) { - SuspendLayout(); WindowState = WindowState == FormWindowState.Maximized ? FormWindowState.Normal : FormWindowState.Maximized; + } + private void MainForm_ClientSizeChanged(object sender, EventArgs e) + { + SuspendLayout(); if (roundedcorners) { if (WindowState == FormWindowState.Maximized) @@ -309,8 +322,14 @@ private void maximizeButton(object sender, EventArgs e) } } - positionsControl.handlerNoteZoom.Visible = false; - btn_magnifier.Image = new Bitmap(themePath + "\\magnifier.png"); + if (settingsForm != null) settingsForm.Visible = false; + + if (positionsControl != null) + { + positionsControl.textZoomContainer.Visible = false; + btn_magnifier.Image = new Bitmap(themePath + "\\magnifier.png"); + } + ResumeLayout(); } @@ -371,8 +390,9 @@ public MainForm() rgb_HandlerNoteBackColor = theme.IniReadValue("Colors", "HandlerNoteBack").Split(','); rgb_HandlerNoteFontColor = theme.IniReadValue("Colors", "HandlerNoteFont").Split(','); rgb_HandlerNoteTitleFontColor = theme.IniReadValue("Colors", "HandlerNoteTitleFont").Split(','); - rgb_HandlerNoteTitleBackColor = theme.IniReadValue("Colors", "HandlerNoteTitleBackColor").Split(','); rgb_ButtonsBorderColor = theme.IniReadValue("Colors", "ButtonsBorder").Split(','); + rgb_HandlerNoteMagnifierTitleBackColor = theme.IniReadValue("Colors", "HandlerNoteMagnifierTitleBackColor ").Split(','); + blurValue = Convert.ToInt32(ini.IniReadValue("Dev", "Blur")); float fontSize = float.Parse(theme.IniReadValue("Font", "MainFontSize")); bool coverBorderOff = Convert.ToBoolean(theme.IniReadValue("Misc", "DisableCoverBorder")); @@ -384,7 +404,7 @@ public MainForm() MenuStripFontColor = Color.FromArgb(Convert.ToInt32(rgb_MenuStripFontColor[0]), Convert.ToInt32(rgb_MenuStripFontColor[1]), Convert.ToInt32(rgb_MenuStripFontColor[2])); HandlerNoteBackColor = Color.FromArgb(Convert.ToInt32(rgb_HandlerNoteBackColor[0]), Convert.ToInt32(rgb_HandlerNoteBackColor[1]), Convert.ToInt32(rgb_HandlerNoteBackColor[2])); HandlerNoteFontColor = Color.FromArgb(Convert.ToInt32(rgb_HandlerNoteFontColor[0]), Convert.ToInt32(rgb_HandlerNoteFontColor[1]), Convert.ToInt32(rgb_HandlerNoteFontColor[2])); - HandlerNoteTitleBackColor = Color.FromArgb(Convert.ToInt32(rgb_HandlerNoteTitleBackColor[0]), Convert.ToInt32(rgb_HandlerNoteTitleBackColor[1]), Convert.ToInt32(rgb_HandlerNoteTitleBackColor[2])); + HandlerNoteMagnifierTitleBackColor = Color.FromArgb(Convert.ToInt32(rgb_HandlerNoteMagnifierTitleBackColor[0]), Convert.ToInt32(rgb_HandlerNoteMagnifierTitleBackColor[1]), Convert.ToInt32(rgb_HandlerNoteMagnifierTitleBackColor[2])); HandlerNoteTitleFont = Color.FromArgb(Convert.ToInt32(rgb_HandlerNoteTitleFontColor[0]), Convert.ToInt32(rgb_HandlerNoteTitleFontColor[1]), Convert.ToInt32(rgb_HandlerNoteTitleFontColor[2])); ButtonsBorderColor = Color.FromArgb(Convert.ToInt32(rgb_ButtonsBorderColor[0]), Convert.ToInt32(rgb_ButtonsBorderColor[1]), Convert.ToInt32(rgb_ButtonsBorderColor[2])); @@ -405,9 +425,10 @@ public MainForm() ForeColor = Color.FromArgb(Convert.ToInt32(rgb_font[0]), Convert.ToInt32(rgb_font[1]), Convert.ToInt32(rgb_font[2])); scriptAuthorTxt.BackColor = HandlerNoteBackColor; scriptAuthorTxt.ForeColor = HandlerNoteFontColor; - scriptAuthorTxtSizer.BackColor = HandlerNoteTitleBackColor; + scriptAuthorTxtSizer.BackColor = Color.Transparent;// HandlerNoteTitleBackColor; + scriptAuthorTxtSizer.BackgroundImage = new Bitmap(themePath + "\\handlerNote_background.png"); HandlerNoteTitle.ForeColor = HandlerNoteTitleFont; - + //Controls Pictures AppButtons = new Bitmap(themePath + "\\button.png"); @@ -416,6 +437,8 @@ public MainForm() mainButtonFrame.BackgroundImage = new Bitmap(themePath + "\\main_buttons_frame.png"); rightFrame.BackgroundImage = new Bitmap(themePath + "\\right_panel.png"); game_listSizer.BackgroundImage = new Bitmap(themePath + "\\game_list.png"); + btn_textSwitcher.BackgroundImage = new Bitmap(themePath + "\\text_switcher.png"); + btnAutoSearch.BackgroundImage = AppButtons; button_UpdateAvailable.BackgroundImage = AppButtons; btnSearch.BackgroundImage = AppButtons; @@ -423,8 +446,7 @@ public MainForm() btn_Download.BackgroundImage = AppButtons; btn_Play.BackgroundImage = AppButtons; btn_Extract.BackgroundImage = AppButtons; - btn_GameDesc.BackgroundImage = AppButtons; - btn_scriptAuthorTxt.BackgroundImage = AppButtons; + btn_gameOptions.BackgroundImage = new Bitmap(themePath + "\\game_options.png"); btnBack.BackgroundImage = new Bitmap(themePath + "\\arrow_left.png"); btn_Next.BackgroundImage = new Bitmap(themePath + "\\arrow_right.png"); coverFrame.BackgroundImage = new Bitmap(themePath + "\\cover_layer.png"); @@ -442,11 +464,14 @@ public MainForm() maximizeBtn.BackgroundImage = new Bitmap(themePath + "\\title_maximize.png"); minimizeBtn.BackgroundImage = new Bitmap(themePath + "\\title_minimize.png"); btn_settings.BackgroundImage = new Bitmap(themePath + "\\title_settings.png"); - btn_dlFromHub.BackgroundImage = new Bitmap(themePath + "\\dlhub_btn.png"); + btn_dlFromHub.BackgroundImage = AppButtons; // new Bitmap(themePath + "\\dlhub_btn.png"); glowingLine0.Image = new Bitmap(themePath + "\\lightbar_top.gif"); StepPanel.BackgroundImage = new Bitmap(themePath + "\\setup_screen.png"); btn_magnifier.Image = new Bitmap(themePath + "\\magnifier.png"); - // + k_Icon = new Bitmap(themePath + "\\keyboard_icon.png"); + xinputGamepad_Icon = new Bitmap(themePath + "\\xinput_icon.png"); + dinputGamepad_Icon = new Bitmap(themePath + "\\dinput_icon.png"); + btn_Extract.FlatAppearance.MouseOverBackColor = MouseOverBackColor; btnAutoSearch.FlatAppearance.MouseOverBackColor = MouseOverBackColor; button_UpdateAvailable.FlatAppearance.MouseOverBackColor = MouseOverBackColor; @@ -456,8 +481,6 @@ public MainForm() btn_Play.FlatAppearance.MouseOverBackColor = MouseOverBackColor; btnBack.FlatAppearance.MouseOverBackColor = MouseOverBackColor; btn_Next.FlatAppearance.MouseOverBackColor = MouseOverBackColor; - btn_GameDesc.FlatAppearance.MouseOverBackColor = MouseOverBackColor; - btn_scriptAuthorTxt.FlatAppearance.MouseOverBackColor = MouseOverBackColor; btn_dlFromHub.FlatAppearance.MouseOverBackColor = MouseOverBackColor; gameContextMenuStrip.BackColor = MenuStripBackColor; gameContextMenuStrip.ForeColor = MenuStripFontColor; @@ -466,7 +489,6 @@ public MainForm() { btnAutoSearch.FlatAppearance.BorderSize = 1; btnAutoSearch.FlatAppearance.BorderColor = ButtonsBorderColor; - button_UpdateAvailable.FlatAppearance.BorderSize = 1; button_UpdateAvailable.FlatAppearance.BorderColor = ButtonsBorderColor; btnSearch.FlatAppearance.BorderSize = 1; @@ -479,10 +501,6 @@ public MainForm() btn_Play.FlatAppearance.BorderColor = ButtonsBorderColor; btn_Extract.FlatAppearance.BorderSize = 1; btn_Extract.FlatAppearance.BorderColor = ButtonsBorderColor; - btn_GameDesc.FlatAppearance.BorderSize = 1; - btn_GameDesc.FlatAppearance.BorderColor = ButtonsBorderColor; - btn_scriptAuthorTxt.FlatAppearance.BorderSize = 1; - btn_scriptAuthorTxt.FlatAppearance.BorderColor = ButtonsBorderColor; btnBack.FlatAppearance.BorderSize = 1; btnBack.FlatAppearance.BorderColor = ButtonsBorderColor; btn_Next.FlatAppearance.BorderSize = 1; @@ -491,6 +509,8 @@ public MainForm() btn_dlFromHub.FlatAppearance.BorderColor = ButtonsBorderColor; } + linksPanel.Region = Region.FromHrgn(CreateRoundRectRgn(0, 0, linksPanel.Width, linksPanel.Height, 15, 15)); + scriptAuthorTxtSizer.Region = Region.FromHrgn(CreateRoundRectRgn(0, 0, scriptAuthorTxtSizer.Width, scriptAuthorTxtSizer.Height, 20, 20)); if (coverBorderOff) { @@ -525,7 +545,8 @@ public MainForm() } } - + txt_version.Text = version; + ResumeLayout(); minimizeBtn.Click += new EventHandler(this.minimizeButton); @@ -538,7 +559,13 @@ public MainForm() positionsControl = new PositionsControl(); - Settings settingsForm = new Settings(this, positionsControl); + positionsControl.textZoomContainer.BackColor = HandlerNoteMagnifierTitleBackColor;// Color.Black; + positionsControl.handlerNoteZoom.BackColor = HandlerNoteBackColor; + positionsControl.handlerNoteZoom.ForeColor = HandlerNoteFontColor; + + settingsForm = new Settings(this, positionsControl); + clientAreaPanel.Controls.Add(settingsForm); + positionsControl.Paint += PositionsControl_Paint; settingsForm.RegHotkeys(this); @@ -556,7 +583,18 @@ public MainForm() getId = new ScriptDownloader(this); downloadPrompt = new DownloadPrompt(hubHandler, this, null, true); - + + inputsIconsDesc = new Label(); + inputsIconsDesc.AutoSize = true; + inputsIconsDesc.Visible = false; + inputsIconsDesc.BackColor = Color.Transparent; + inputsIconsDesc.ForeColor = Color.FromArgb(Convert.ToInt32(rgb_font[0]), Convert.ToInt32(rgb_font[1]), Convert.ToInt32(rgb_font[2])); + inputsIconsDesc.Anchor = AnchorStyles.Top | AnchorStyles.Left; + inputsIconsDesc.Font = new Font(customFont, 9.25f, FontStyle.Regular, GraphicsUnit.Pixel, 0); + + inputsIconsDesc.Text = ""; + rightFrame.Controls.Add(inputsIconsDesc); + hubShowcase = new HubShowcase(this) { Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right, @@ -648,12 +686,13 @@ private void SplashTimerTick(Object Object, EventArgs EventArgs) if (connected) { - //stepPanelPictureBox.Visible = false; + btn_noHub.Visible = false; btn_downloadAssets.Enabled = true; btn_Download.Enabled = true; - DisposeTimer.Dispose(); //Showcase_UI(); + DisposeTimer.Dispose(); + } else { @@ -898,6 +937,7 @@ private void Showcase_UI()//(Control dllabel) try { getId.Main_Showcase(); + stepPanelPictureBox.Visible = false; } catch (Exception ex) { @@ -960,11 +1000,29 @@ private void CheckForCovers(Control dllabel) try { hubHandler = getId.GetHandler(game.Game.GetHubId()); + string _covers = $@"https://images.igdb.com/igdb/image/upload/t_cover_big/{hubHandler.GameCover}.jpg"; if (hubHandler.Id != null) { getAssets.SaveCovers(_covers, game.GameGuid); + try + { + if (!File.Exists(Path.Combine(Application.StartupPath, $@"gui\descriptions\" + game.GameGuid + ".txt"))) + { + using (FileStream stream = new FileStream(Path.Combine(Application.StartupPath, $@"gui\descriptions\" + game.GameGuid + ".txt"), FileMode.Create)) + { + using (StreamWriter writer = new StreamWriter(stream)) + { + string json = JsonConvert.SerializeObject(hubHandler.GameDescription); + writer.Write(json); + stream.Flush(); + } + } + } + + } + catch { } } } catch (Exception) @@ -1008,6 +1066,8 @@ private void list_Games_SelectedChanged(object arg1, Control arg2) currentGameInfo = currentControl.UserGameInfo; positionsControl.handlerNoteZoom.Visible = false; btn_magnifier.Image = new Bitmap(themePath + "\\magnifier.png"); + btn_textSwitcher.Visible = false; + if (currentGameInfo == null) { btn_gameOptions.Visible = false; @@ -1017,22 +1077,21 @@ private void list_Games_SelectedChanged(object arg1, Control arg2) else { currentGame = currentGameInfo.Game; + HandlerNoteTitle.Text = "Handler Notes"; hubShowcase.Dispose(); - + positionsControl.textZoomContainer.Visible = false; if (!stepPanelPictureBoxDispose) { stepPanelPictureBox.Dispose(); rightFrame.Visible = true; btn_gameOptions.Visible = true; - btn_scriptAuthorTxt.Visible = true; stepPanelPictureBoxDispose = true; StepPanel.Visible = true; } + icons_Container.Controls.Clear(); button_UpdateAvailable.Visible = false; - gameDescription = ""; - string name = currentGame.GUID; try { @@ -1063,53 +1122,79 @@ private void list_Games_SelectedChanged(object arg1, Control arg2) string[] imgsPath = Directory.GetFiles((Path.Combine(Application.StartupPath, @"gui\screenshots\" + name))); Random rNum = new Random(); int RandomIndex = rNum.Next(0, imgsPath.Count()); + screenshotImg = new Bitmap(Path.Combine(Application.StartupPath, @"gui\screenshots\" + name + "\\" + RandomIndex + "_" + name + ".jpeg")); //name(1) => directory name ; name(2) = partial image name + var blur = new GaussianBlur(screenshotImg as Bitmap); + var result = blur.Process(blurValue); + clientAreaPanel.BackgroundImage = result; clientAreaPanel.SuspendLayout(); - clientAreaPanel.BackgroundImage = screenshotImg; + clientAreaPanel.BackgroundImage = result; clientAreaPanel.ResumeLayout(); } else { + var blur = new GaussianBlur(defBackground as Bitmap); + var result = blur.Process(blurValue); clientAreaPanel.SuspendLayout(); - clientAreaPanel.BackgroundImage = defBackground; + clientAreaPanel.BackgroundImage = result; clientAreaPanel.ResumeLayout(); } + + + Size iconsSize = new Size(icons_Container.Height + 6, icons_Container.Height - 2); + Size playersIconsSize = new Size(icons_Container.Height, icons_Container.Height); + + if ((currentGame.Hook.XInputEnabled && !currentGame.Hook.XInputReroute && !currentGame.ProtoInput.DinputDeviceHook) || currentGame.ProtoInput.XinputHook) + { + icon1 = new UI.InputIcons(iconsSize, xinputGamepad_Icon); + icon1.MouseEnter += inputIcons_MouseEnter; + icon1.MouseLeave += inputIcons_MouseLeave; + icons_Container.Controls.Add(icon1); + } + + if ((currentGame.Hook.DInputEnabled || currentGame.Hook.XInputReroute || currentGame.ProtoInput.DinputDeviceHook) && (currentGame.Hook.XInputEnabled || currentGame.ProtoInput.XinputHook)) + { + icon2 = new UI.InputIcons(iconsSize, dinputGamepad_Icon); + icon2.MouseEnter += inputIcons_MouseEnter; + icon2.MouseLeave += inputIcons_MouseLeave; + icons_Container.Controls.Add(icon2); + } + else if ((currentGame.Hook.DInputEnabled || currentGame.Hook.XInputReroute || currentGame.ProtoInput.DinputDeviceHook) && (!currentGame.Hook.XInputEnabled || !currentGame.ProtoInput.XinputHook)) + { + icon3 = new UI.InputIcons(iconsSize, dinputGamepad_Icon); + icon3.MouseEnter += inputIcons_MouseEnter; + icon3.MouseLeave += inputIcons_MouseLeave; + icons_Container.Controls.Add(icon3); + } + + if (currentGame.SupportsKeyboard) + { + icon4 = new UI.InputIcons(iconsSize, k_Icon); + icon4.MouseEnter += inputIcons_MouseEnter; + icon4.MouseLeave += inputIcons_MouseLeave; + icons_Container.Controls.Add(icon4); + } + + if (currentGame.SupportsMultipleKeyboardsAndMice) //Raw mice/keyboards + { + icon5 = new UI.InputIcons(iconsSize, k_Icon); + icon6 = new UI.InputIcons(iconsSize, k_Icon); + icon5.MouseEnter += inputIcons_MouseEnter; + icon5.MouseLeave += inputIcons_MouseLeave; + icon6.MouseEnter += inputIcons_MouseEnter; + icon6.MouseLeave += inputIcons_MouseLeave; + icons_Container.Controls.Add(icon5); + icons_Container.Controls.Add(icon6); + } + + } catch (Exception) { } } - //if (connected) - //{ - // try//get game description (online) - // { - // hubHandler = getId.GetHandler(currentGameInfo.Game.GetHubId()); - // gameDescription = hubHandler.GameDescription; - - // if (gameDescription.EndsWith(".")) - // { - // txt_GameDesc.Text = hubHandler.GameDescription; - // btn_GameDesc.Enabled = true; - // btn_GameDesc.Visible = true; - // } - // else - // { - // btn_GameDesc.Enabled = false; - // txt_GameDescSizer.Visible = false; - // txt_GameDesc.Visible = false; - // } - // } - // catch (Exception) - // { - // btn_GameDesc.Enabled = false; - // txt_GameDescSizer.Visible = false; - // txt_GameDesc.Visible = false; - // } - // } - - btn_Play.Enabled = false; stepsList = new List @@ -1134,7 +1219,6 @@ private void list_Games_SelectedChanged(object arg1, Control arg2) if (currentGame.Description?.Length > 0) { - btn_scriptAuthorTxt.Enabled = true; SuspendLayout(); scriptAuthorTxt.Text = currentGame.Description; ResumeLayout(); @@ -1143,10 +1227,13 @@ private void list_Games_SelectedChanged(object arg1, Control arg2) } else { - btn_scriptAuthorTxt.Enabled = false; scriptAuthorTxtSizer.Visible = false; scriptAuthorTxt.Visible = false; } + if (File.Exists(Path.Combine(Application.StartupPath, $@"gui\descriptions\" + currentGame.GUID + ".txt"))) + { + btn_textSwitcher.Visible = true; + } if (content != null) { @@ -1158,6 +1245,36 @@ private void list_Games_SelectedChanged(object arg1, Control arg2) GoToStep(0); } + private void inputIcons_MouseLeave(object sender, EventArgs e) + { + inputsIconsDesc.Visible = false; + inputsIconsDesc.Text = ""; + } + private void inputIcons_MouseEnter(object sender, EventArgs e) + { + PictureBox inputIcon = sender as PictureBox; + + if (inputIcon.Equals(icon1)) + { + inputsIconsDesc.Text = "Supports xinput gamepads (e.g., X360)"; + } + else if (inputIcon.Equals(icon2) || inputIcon.Equals(icon3)) + { + inputsIconsDesc.Text = "Supports dinput gamepads (e.g., Ps3)"; + } + else if (inputIcon.Equals(icon4)) + { + inputsIconsDesc.Text = @"Supports 1 keyboard\mouse"; + } + else if (inputIcon.Equals(icon5) || inputIcon.Equals(icon6)) + { + inputsIconsDesc.Text = @"Supports multiple keyboards/mice"; + } + + inputsIconsDesc.Location = new Point((int)icons_Container.Left - 5, icons_Container.Bottom); + inputsIconsDesc.BringToFront(); + inputsIconsDesc.Visible = true; + } private void EnablePlay() { @@ -1195,21 +1312,9 @@ private void btnNext_Click(object sender, EventArgs e) private void KillCurrentStep() { - - if (currentGameInfo.Game.Description?.Length > 0) - { - btn_scriptAuthorTxt.Visible = true; - } - - if (gameDescription?.Length > 0 && connected) - { - txt_GameDesc.Text = hubHandler.GameDescription; - btn_GameDesc.Enabled = true; - } - foreach (Control c in StepPanel.Controls) { - if (!c.Name.Equals("btn_GameDesc") && !c.Name.Equals("scriptAuthorTxt") && !c.Name.Equals("txt_GameDescSizer")) + if (!c.Name.Equals("scriptAuthorTxtSizer")) { StepPanel.Controls.Remove(c); } @@ -1664,16 +1769,16 @@ private void btnShowTaskbar_Click(object sender, EventArgs e) private void SettingsBtn_Click(object sender, EventArgs e) { - if (!SettingsLoaded) - { - settingsForm = new Settings(this, positionsControl); - settingsForm.Show(); - SettingsLoaded = true; + if (!settingsForm.Visible) + { + settingsForm.Location = new Point(Width / 2 - settingsForm.Width / 2, Height / 2 - settingsForm.Height / 2); + settingsForm.BringToFront(); + settingsForm.Visible = true; } else { - settingsForm.Location = new Point(Location.X + Width / 2 - settingsForm.Width / 2, Location.Y + Height / 2 - settingsForm.Height / 2); - settingsForm.Visible = true; + + settingsForm.Visible = false; } } @@ -2293,9 +2398,11 @@ private void OpenRawGameScript() } } - catch + catch(Exception ex) { Process.Start("notepad.exe", Path.Combine(gameManager.GetJsScriptsPath(), currentGameInfo.Game.JsFileName)); + Console.WriteLine(ex); + Console.WriteLine($"{ini.IniReadValue("Dev", "TextEditorPath")}", "\"" + Path.Combine(gameManager.GetJsScriptsPath(), currentGameInfo.Game.JsFileName) + "\""); } } @@ -2417,28 +2524,6 @@ private void deleteContentFolderToolStripMenuItem_Click(object sender, EventArgs } } - private void btn_scriptAuthorTxt_Click(object sender, EventArgs e) - { - if (scriptAuthorTxtSizer.Visible) - { - scriptAuthorTxtSizer.Visible = false; - scriptAuthorTxt.Visible = false; - txt_GameDescSizer.Visible = true; - txt_GameDesc.Visible = true; - } - } - - private void btn_GameDesc_Click(object sender, EventArgs e) - { - if (txt_GameDescSizer.Visible) - { - scriptAuthorTxtSizer.Visible = true; - scriptAuthorTxt.Visible = true; - txt_GameDescSizer.Visible = false; - txt_GameDesc.Visible = false; - } - } - private void btn_Download_Click(object sender, EventArgs e) { getId.ShowDialog(); @@ -2528,6 +2613,7 @@ private void btn_Links_Click(object sender, EventArgs e) } else { + linksPanel.BringToFront(); linksPanel.Visible = true; btn_Links.BackgroundImage = new Bitmap(themePath + "\\title_dropdown_opened.png"); } @@ -2542,7 +2628,6 @@ private void splash_Click(object sender, EventArgs e) private void this_Click(object sender, System.EventArgs e) { - linksPanel.Visible = false; btn_Links.BackgroundImage = new Bitmap(themePath + "\\title_dropdown_closed.png"); @@ -2746,19 +2831,39 @@ private void btnBack_MouseLeave(object sender, EventArgs e) private void btn_magnifier_Click(object sender, EventArgs e) { - if (!positionsControl.handlerNoteZoom.Visible) + if (!positionsControl.textZoomContainer.Visible) { - positionsControl.handlerNoteZoom.Text = currentGame.Description; - positionsControl.handlerNoteZoom.Location = new Point(positionsControl.Width / 2 - positionsControl.handlerNoteZoom.Width / 2, positionsControl.instruction.Height + 10); - positionsControl.handlerNoteZoom.Region = Region.FromHrgn(CreateRoundRectRgn(0, 0, positionsControl.handlerNoteZoom.Width, positionsControl.handlerNoteZoom.Height, 15, 15)); + positionsControl.textZoomContainer.Region = Region.FromHrgn(CreateRoundRectRgn(0, 0, positionsControl.textZoomContainer.Width, positionsControl.textZoomContainer.Height, 15, 15)); + positionsControl.handlerNoteZoom.Text = scriptAuthorTxt.Text; positionsControl.handlerNoteZoom.Visible = true; + positionsControl.textZoomContainer.Visible = true; btn_magnifier.Image = new Bitmap(themePath + "\\magnifier_close.png"); } else { - positionsControl.handlerNoteZoom.Visible = false; + positionsControl.textZoomContainer.Visible = false; btn_magnifier.Image = new Bitmap(themePath + "\\magnifier.png"); } } + + private void btn_textSwitcher_Click(object sender, EventArgs e) + { + if (!positionsControl.textZoomContainer.Visible && File.Exists(Path.Combine(Application.StartupPath, $@"gui\descriptions\" + currentGame.GUID + ".txt"))) + { + StreamReader desc = new StreamReader(Path.Combine(Application.StartupPath, $@"gui\descriptions\" + currentGame.GUID + ".txt")); + if (HandlerNoteTitle.Text == "Handler Notes") + { + HandlerNoteTitle.Text = "Game Description"; + scriptAuthorTxt.Text = desc.ReadToEnd(); + } + else + { + HandlerNoteTitle.Text = "Handler Notes"; + scriptAuthorTxt.Text = currentGame.Description; + } + } + + } + } } diff --git a/Master/NucleusCoopTool/Forms/MainForm.resx b/Master/NucleusCoopTool/Forms/MainForm.resx index 3773834c..014f3a66 100644 --- a/Master/NucleusCoopTool/Forms/MainForm.resx +++ b/Master/NucleusCoopTool/Forms/MainForm.resx @@ -121,6 +121,95 @@ 17, 17 + + + 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 + YII= + + + + Connection with the game handlers hub couldn't be +established from the app, handlers, covers and screenshots downloader +will be unavailable. Click this button to refresh, if the problem persist, +click the FAQ button or ask for help on the official Nucleus Co-op Discord/SubReddit. + iVBORw0KGgoAAAANSUhEUgAAAJ8AAAB9CAYAAAC8l7FpAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKM+VkTtI @@ -697,95 +786,6 @@ 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 - YII= - - - - Connection with the game handlers hub couldn't be -established from the app, handlers, covers and screenshots downloader -will be unavailable. Click this button to refresh, if the problem persist, -click the FAQ button or ask for help on the official Nucleus Co-op Discord/SubReddit. 114, 17 diff --git a/Master/NucleusCoopTool/Forms/ScriptDownloader.cs b/Master/NucleusCoopTool/Forms/ScriptDownloader.cs index 94e0500e..4b7b9a9a 100644 --- a/Master/NucleusCoopTool/Forms/ScriptDownloader.cs +++ b/Master/NucleusCoopTool/Forms/ScriptDownloader.cs @@ -11,6 +11,7 @@ using System.Windows.Forms; using Nucleus.Gaming; using System.Media; +using System.Runtime.InteropServices; namespace Nucleus.Coop.Forms { @@ -45,6 +46,16 @@ public partial class ScriptDownloader : BaseForm, IDynamicSized private SortOrder sortOrder = SortOrder.Ascending; + [DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")] + private static extern IntPtr CreateRoundRectRgn + ( + int nLeftRect, // x-coordinate of upper-left corner + int nTopRect, // y-coordinate of upper-left corner + int nRightRect, // x-coordinate of lower-right corner + int nBottomRect, // y-coordinate of lower-right corner + int nWidthEllipse, // width of ellipse + int nHeightEllipse // height of ellipse + ); private void controlscollect() { @@ -89,7 +100,7 @@ public ScriptDownloader(MainForm mf) entriesPerPage = Convert.ToInt32(cmb_NumResults.SelectedItem); SuspendLayout(); - + Region = Region.FromHrgn(CreateRoundRectRgn(0, 0, Width, Height, 20, 20)); ForeColor = Color.FromArgb(Convert.ToInt32(mf.rgb_font[0]), Convert.ToInt32(mf.rgb_font[1]), Convert.ToInt32(mf.rgb_font[2])); BackgroundImage = new Bitmap(mf.themePath + "\\other_backgrounds.jpg"); //Controls Pictures diff --git a/Master/NucleusCoopTool/Forms/SearchDisksForm.cs b/Master/NucleusCoopTool/Forms/SearchDisksForm.cs index 25daee34..e9e822d9 100644 --- a/Master/NucleusCoopTool/Forms/SearchDisksForm.cs +++ b/Master/NucleusCoopTool/Forms/SearchDisksForm.cs @@ -10,6 +10,7 @@ using System.Windows.Forms; using System.Media; using System.Reflection; +using System.Runtime.InteropServices; namespace Nucleus.Coop { @@ -36,6 +37,17 @@ public override string ToString() private MainForm main; private float fontSize; + [DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")] + private static extern IntPtr CreateRoundRectRgn + ( + int nLeftRect, // x-coordinate of upper-left corner + int nTopRect, // y-coordinate of upper-left corner + int nRightRect, // x-coordinate of lower-right corner + int nBottomRect, // y-coordinate of lower-right corner + int nWidthEllipse, // width of ellipse + int nHeightEllipse // height of ellipse + ); + private void controlscollect() { foreach (Control control in Controls) @@ -74,6 +86,7 @@ public SearchDisksForm(MainForm main) InitializeComponent(); SuspendLayout(); + Region = Region.FromHrgn(CreateRoundRectRgn(0, 0, Width, Height, 20, 20)); fontSize = float.Parse(main.theme.IniReadValue("Font", "AutoSearchFontSize")); ForeColor = Color.FromArgb(Convert.ToInt32(main.rgb_font[0]), Convert.ToInt32(main.rgb_font[1]), Convert.ToInt32(main.rgb_font[2])); diff --git a/Master/NucleusCoopTool/Forms/Settings.Designer.cs b/Master/NucleusCoopTool/Forms/Settings.Designer.cs index f28495d3..02d50afa 100644 --- a/Master/NucleusCoopTool/Forms/Settings.Designer.cs +++ b/Master/NucleusCoopTool/Forms/Settings.Designer.cs @@ -48,7 +48,6 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Settings)); this.tabControl2 = new System.Windows.Forms.TabControl(); this.tabPage3 = new System.Windows.Forms.TabPage(); this.panel1 = new System.Windows.Forms.Panel(); @@ -601,7 +600,7 @@ private void InitializeComponent() "Numpad 7", "Numpad 8", "Numpad 9"}); - this.comboBox_lockKey.Location = new System.Drawing.Point(102, 89); + this.comboBox_lockKey.Location = new System.Drawing.Point(102, 92); this.comboBox_lockKey.Margin = new System.Windows.Forms.Padding(2); this.comboBox_lockKey.Name = "comboBox_lockKey"; this.comboBox_lockKey.Size = new System.Drawing.Size(123, 21); @@ -610,7 +609,7 @@ private void InitializeComponent() // // label_lockKey // - this.label_lockKey.Location = new System.Drawing.Point(8, 90); + this.label_lockKey.Location = new System.Drawing.Point(8, 93); this.label_lockKey.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.label_lockKey.Name = "label_lockKey"; this.label_lockKey.Size = new System.Drawing.Size(86, 15); @@ -1984,28 +1983,17 @@ private void InitializeComponent() // this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; - this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(50)))), ((int)(((byte)(50)))), ((int)(((byte)(50))))); + this.BackColor = System.Drawing.Color.Transparent; this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; - this.ClientSize = new System.Drawing.Size(572, 336); - this.ControlBox = false; this.Controls.Add(this.setting_Label); this.Controls.Add(this.settingsSaveBtn); this.Controls.Add(this.tabControl2); this.Controls.Add(this.settingsCloseBtn); this.Controls.Add(this.btn_credits); - this.DoubleBuffered = true; this.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); - this.MaximizeBox = false; - this.MinimizeBox = false; this.Name = "Settings"; - this.ShowIcon = false; - this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show; - this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; - this.Text = "Settings"; - this.TopMost = true; + this.Size = new System.Drawing.Size(572, 336); this.tabControl2.ResumeLayout(false); this.tabPage3.ResumeLayout(false); this.tabPage3.PerformLayout(); diff --git a/Master/NucleusCoopTool/Forms/Settings.cs b/Master/NucleusCoopTool/Forms/Settings.cs index 465e8eef..3d8738ec 100644 --- a/Master/NucleusCoopTool/Forms/Settings.cs +++ b/Master/NucleusCoopTool/Forms/Settings.cs @@ -11,16 +11,18 @@ using System.Linq; using System.Net.NetworkInformation; using System.Net.Sockets; +using System.Runtime.InteropServices; using System.Text.RegularExpressions; using System.Windows.Forms; namespace Nucleus.Coop { - public partial class Settings : BaseForm, IDynamicSized + public partial class Settings : UserControl, IDynamicSized { private MainForm mainForm = null; + private IniFile ini; private PositionsControl positionsControl; private ComboBox[] controllerNicks; private List nicksList = new List(); @@ -36,6 +38,17 @@ public partial class Settings : BaseForm, IDynamicSized private string epicLang; private string epicLangText; private string prevTheme; + + [DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")] + private static extern IntPtr CreateRoundRectRgn + ( + int nLeftRect, // x-coordinate of upper-left corner + int nTopRect, // y-coordinate of upper-left corner + int nRightRect, // x-coordinate of lower-right corner + int nBottomRect, // y-coordinate of lower-right corner + int nWidthEllipse, // width of ellipse + int nHeightEllipse // height of ellipse + ); protected override CreateParams CreateParams { get @@ -74,24 +87,28 @@ public void button_Click(object sender, EventArgs e) public Settings(MainForm mf, PositionsControl pc) { - + ini = mf.ini; fontSize = float.Parse(mf.theme.IniReadValue("Font", "SettingsFontSize")); - + InitializeComponent(); - - SuspendLayout(); + SuspendLayout(); + Region = Region.FromHrgn(CreateRoundRectRgn(0, 0, Width, Height, 20, 20)); + tabControl2.Region = Region.FromHrgn(CreateRoundRectRgn(0, 0, tabControl2.Width, tabControl2.Height, 5, 5)); Location = new Point(mf.Location.X + mf.Width / 2 - Width / 2, mf.Location.Y + mf.Height / 2 - Height / 2); + Visible = false; //form Fore Color controlscollect(); + foreach (Control control in ctrls) { - control.Font = new Font(mf.customFont, fontSize, FontStyle.Regular, GraphicsUnit.Pixel, 0); + control.Font = new Font(mf.customFont, fontSize, FontStyle.Regular, GraphicsUnit.Pixel, 0); } - ForeColor = Color.FromArgb(Convert.ToInt32(mf.rgb_font[0]), Convert.ToInt32(mf.rgb_font[1]), Convert.ToInt32(mf.rgb_font[2])); + + ForeColor = Color.FromArgb(Convert.ToInt32(mf.rgb_font[0]), Convert.ToInt32(mf.rgb_font[1]), Convert.ToInt32(mf.rgb_font[2])); // BackgroundImage = new Bitmap(mf.themePath + "\\other_backgrounds.jpg"); - + tabPage1.BackgroundImage = new Bitmap(mf.themePath + "\\other_backgrounds.jpg"); tabPage3.BackgroundImage = new Bitmap(mf.themePath + "\\other_backgrounds.jpg"); tabPage4.BackgroundImage = new Bitmap(mf.themePath + "\\other_backgrounds.jpg"); @@ -376,7 +393,7 @@ public Settings(MainForm mf, PositionsControl pc) RefreshAudioList(); DPIManager.Register(this); - DPIManager.AddForm(this); + // DPIManager.AddForm(this); DPIManager.Update(this); } @@ -475,11 +492,11 @@ public void UpdateSize(float scale) ResumeLayout(); } - protected override void OnShown(EventArgs e) - { - base.OnShown(e); - DPIManager.Register(this); - } + //protected override void OnShown(EventArgs e) + //{ + // base.OnShown(e); + // DPIManager.Register(this); + //} private void GetPlayersNickName() { diff --git a/Master/NucleusCoopTool/Forms/Settings.resx b/Master/NucleusCoopTool/Forms/Settings.resx index 091e3e42..1af7de15 100644 --- a/Master/NucleusCoopTool/Forms/Settings.resx +++ b/Master/NucleusCoopTool/Forms/Settings.resx @@ -117,54 +117,4 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - AAABAAEAQEAQAAEABABoCgAAFgAAACgAAABAAAAAgAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABHTyYAFDnQAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAMzMzMzMzMzMzMzMzMiIiIiIiIiMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMiIiIiIiIiIiMz - MzMzMzMzMzMzMzMzMzMzMzMzMzMzMiIiIiACIiIiIjMzMzMzMzMzMzMzMzMzMzMzMzMzMzMiIiIAAAAA - IiIiMzMzMzMzMzMzMzMzMzMzMzMzMzMzMiIiIAAAAAACIiIjMzMzMzMzMzMzMzMzMzMzMyIiIiIiIiIA - AAAAAAAiIiIiIiIiMzMzMzMzMzMzMzMiIiIiIiIiIAAAAAAAAAIiIiIiIiIiMzMzMzMzMzMzMiIiIiIi - IiIiAAAAAAAAIiIiIiIiIiIjMzMzMzMzMzMiIiIiICIiIiIgAAAAAAIiIiIiAiIiIiIzMzMzMzMzMiIi - IgAAAiIiIiIAAAAAIiIiIgAAACIiIiMzMzMzMzMyIiIAAAACIiIiIiAAAAIiIiIiIAAAACIiIjMzMzMz - MyIiIAAAAAIiICIiIgAAIiIiAiIgAAAAAiIiMzMzMzMzIiIAAAAAAiIgAiIiIAIiIiACIiAAAAAAIiIz - MzMzMzIiIgAAAAACIiAAIiIiIiIiAAIiIAAAAAAiIiMzMzMzMiIgAAAAAAIiIAACIiIiIiAAAiIgAAAA - AAIiIzMzMzMyIiAAAAAAAiIgAAAiIiIiAAACIiAAAAAAAiIjMzMzMzIiAAAAAAACIiAAAAIiIiAAAAIi - IAAAAAACIiMzMzMzMiIAAAAAAAIiIAAAIiIiIgAAAiIgAAAAAAIiIzMzMzMyIiAAAAAAAiIgAAIiIiIi - IAACIiAAAAAAAiIjMzMzMzIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiMzMzMzMiIiIiIiIiIiIiIi - IiIiIiIiIiIiIiIiIiIiIzMzMzMiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiMzMzMiIiIiIiIiIi - IiIiIiIiIiIiIiIiIiIiIiIiIiIiMzMiIiIiIAAAAAIiIiIiERERESIiIiIgAAAAAiIiIiIzMiIiIiIi - AAAAAiIiIiEREREREiIiIiAAAAAiIiIiIiMiIiICIiIgAAACIiIiERERERERIiIiIAAAAiIiICIiIiIi - IAAiIiIAAAIiIiERERERERESIiIgAAAiIiIAAiIiIiIAAAIiIiAAIiIiEREREREREREiIiIAAiIiIAAA - IiIiIAAAACIiIgIiIiERERERERERERIiIiAiIiIAAAACIiIgAAAAAiIiIiIiIREREREREREREiIiIiIi - IAAAAAIiIiAAAAAAIiIiIiIhERERERERERESIiIiIiIAAAAAAiIiAAAAAAACIiIiIiERERERERERERIi - IiIiIAAAAAAAIiIAAAAAAAIiIiIiIREREREREREREiIiIiIgAAAAAAAiIiAAAAAAIiIiIiIhERERERER - ERESIiIiIiIAAAAAAiIiIAAAAAIiIiIiIiERERERERERERIiIiIiIiAAAAACIiIgAAAAIiIiAiIiIRER - EREREREREiIiICIiIgAAAAIiIiIAAAIiIiAAIiIiEREREREREREiIiIAAiIiIAAAIiIiIiAAIiIiAAAC - IiIhEREREREREiIiIAAAIiIiAAIiIiIiIgIiIiAAAAIiIiIREREREREiIiIgAAACIiIgIiIiMiIiIiIi - AAAAAiIiIiEREREREiIiIiAAAAAiIiIiIiMzIiIiIiAAAAACIiIiIhEREREiIiIiIAAAAAIiIiIiMzMy - IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiMzMzMiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi - MzMzMzIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiMzMzMzMiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi - IiIiIzMzMzMyIgAAAAAAAiIgAAIiIiIiIAACIiAAAAAAAiIjMzMzMzIiAAAAAAACIiAAACIiIiIAAAIi - IAAAAAACIiMzMzMzMiIAAAAAAAIiIAAAAiIiIAAAAiIgAAAAAAIiIzMzMzMyIiAAAAAAAiIgAAAiIiIi - AAACIiAAAAAAAiIjMzMzMzIiIAAAAAACIiAAAiIiIiIgAAIiIAAAAAACIiMzMzMzMiIiAAAAAAIiIAAi - IiIiIiIAAiIgAAAAACIiIzMzMzMzIiIAAAAAAiIgAiIiIAIiIiACIiAAAAAAIiIzMzMzMzMiIiAAAAAC - IiAiIiIAACIiIgIiIAAAAAIiIjMzMzMzMzIiIgAAAAIiIiIiIAAAAiIiIiIgAAAAIiIjMzMzMzMzMiIi - IgAAAiIiIiIAAAAAIiIiIgAAACIiIiMzMzMzMzMzIiIiIgAiIiIiIAAAAAACIiIiIgIiIiIiMzMzMzMz - MzMyIiIiIiIiIiIAAAAAAAAiIiIiIiIiIiMzMzMzMzMzMzMyIiIiIiIiIAAAAAAAAAIiIiIiIiIjMzMz - MzMzMzMzMzMyIiIiIiIiAAAAAAAAIiIiIiIiIzMzMzMzMzMzMzMzMzMzMzMyIiIgAAAAAAIiIiMzMzMz - MzMzMzMzMzMzMzMzMzMzMzMiIiIAAAAAIiIiMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzIiIiIiIiIiIiMz - MzMzMzMzMzMzMzMzMzMzMzMzMzMzMyIiIiIiIiIiMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMiIiIiIi - IiMzMzMzMzMzMzMzMzP///+AAf///////wAAf//////+AAA///////wAAD//////+AAAH/////AAAAAA - D///wAAAAAAD//+AAAAAAAH//wAAAAAAAP/+AAAAAAAAf/4AAAAAAAA//AAAAAAAAD/8AAAAAAAAP/gA - AAAAAAAf+AAAAAAAAB/4AAAAAAAAH/gAAAAAAAAf+AAAAAAAAB/4AAAAAAAAH/gAAAAAAAAf+AAAAAAA - AB/wAAAAAAAAD+AAAAAAAAADwAAAAAAAAAOAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAcAAAAAAAAAD4AAAAAAAAAfwAAAAAAAAD/gA - AAAAAAAf+AAAAAAAAB/4AAAAAAAAH/gAAAAAAAAf+AAAAAAAAB/4AAAAAAAAH/gAAAAAAAAf+AAAAAAA - AB/8AAAAAAAAP/wAAAAAAAA//gAAAAAAAH/+AAAAAAAAf/8AAAAAAAD//4AAAAAAAf//4AAAAAAH///4 - AAAAAB/////4AAAf//////wAAD///////gAAf///////AAD///////+AAf///w== - - \ No newline at end of file diff --git a/Master/NucleusCoopTool/HubShowcase.cs b/Master/NucleusCoopTool/HubShowcase.cs index 768836ce..138ee033 100644 --- a/Master/NucleusCoopTool/HubShowcase.cs +++ b/Master/NucleusCoopTool/HubShowcase.cs @@ -17,9 +17,10 @@ public partial class HubShowcase : UserControl///, IDynamicSized public HubShowcase(MainForm mainForm) { - InitializeComponent(); - // showcaseBanner1.BackgroundImage = new Bitmap(mainForm.themePath + "\\setup_screen.png"); - + InitializeComponent(); + titleBackground.Location = new Point(Width / 2 - titleBackground.Width / 2, (Container1.Top-titleBackground.Height)+6); + titleBackground.BackgroundImage = new Bitmap(mainForm.themePath + "\\showcase_title-back.png"); + titleBackground.BackgroundImageLayout = ImageLayout.Stretch; } private void showcaseBanner1_Paint(object sender, PaintEventArgs e) diff --git a/Master/NucleusCoopTool/HubShowcase.designer.cs b/Master/NucleusCoopTool/HubShowcase.designer.cs index 5a3f4f37..13eaa038 100644 --- a/Master/NucleusCoopTool/HubShowcase.designer.cs +++ b/Master/NucleusCoopTool/HubShowcase.designer.cs @@ -30,6 +30,7 @@ protected override void Dispose(bool disposing) private void InitializeComponent() { this.showcase_Label = new System.Windows.Forms.Label(); + this.titleBackground = new System.Windows.Forms.Panel(); this.Container1 = new BufferedClientAreaPanel(); this.showcaseBanner1 = new System.Windows.Forms.FlowLayoutPanel(); this.last_Updated_0 = new BufferedClientAreaPanel(); @@ -48,6 +49,7 @@ private void InitializeComponent() this.last_Updated_13 = new BufferedClientAreaPanel(); this.last_Updated_14 = new BufferedClientAreaPanel(); this.last_Updated_15 = new BufferedClientAreaPanel(); + this.titleBackground.SuspendLayout(); this.Container1.SuspendLayout(); this.showcaseBanner1.SuspendLayout(); this.SuspendLayout(); @@ -58,13 +60,23 @@ private void InitializeComponent() | System.Windows.Forms.AnchorStyles.Right))); this.showcase_Label.BackColor = System.Drawing.Color.Transparent; this.showcase_Label.Font = new System.Drawing.Font("Microsoft Sans Serif", 27.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.showcase_Label.Location = new System.Drawing.Point(238, 83); + this.showcase_Label.Location = new System.Drawing.Point(0, 0); this.showcase_Label.Name = "showcase_Label"; - this.showcase_Label.Size = new System.Drawing.Size(391, 39); + this.showcase_Label.Size = new System.Drawing.Size(425, 39); this.showcase_Label.TabIndex = 68; this.showcase_Label.Text = "What\'s New?"; this.showcase_Label.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // + // titleBackground + // + this.titleBackground.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.titleBackground.Controls.Add(this.showcase_Label); + this.titleBackground.Location = new System.Drawing.Point(225, 99); + this.titleBackground.Name = "titleBackground"; + this.titleBackground.Size = new System.Drawing.Size(425, 39); + this.titleBackground.TabIndex = 71; + // // Container1 // this.Container1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) @@ -286,11 +298,12 @@ private void InitializeComponent() this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.BackColor = System.Drawing.Color.Transparent; + this.Controls.Add(this.titleBackground); this.Controls.Add(this.Container1); - this.Controls.Add(this.showcase_Label); this.DoubleBuffered = true; this.Name = "HubShowcase"; this.Size = new System.Drawing.Size(874, 532); + this.titleBackground.ResumeLayout(false); this.Container1.ResumeLayout(false); this.showcaseBanner1.ResumeLayout(false); this.ResumeLayout(false); @@ -320,6 +333,6 @@ private void InitializeComponent() private BufferedClientAreaPanel Container1; private System.Windows.Forms.Label showcase_Label; private System.Windows.Forms.FlowLayoutPanel showcaseBanner1; - + private System.Windows.Forms.Panel titleBackground; } } diff --git a/Master/NucleusCoopTool/InputIcons.cs b/Master/NucleusCoopTool/InputIcons.cs new file mode 100644 index 00000000..9ebd376f --- /dev/null +++ b/Master/NucleusCoopTool/InputIcons.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Nucleus.Coop.UI +{ + + public partial class InputIcons : PictureBox + { + + public InputIcons(Size size, Bitmap image) + { + InitializeComponent(); + Size = size; + SizeMode = PictureBoxSizeMode.StretchImage; + Image = image; + } + + protected override void OnPaint(PaintEventArgs pe) + { + base.OnPaint(pe); + } + } +} diff --git a/Master/NucleusCoopTool/InputIcons.designer.cs b/Master/NucleusCoopTool/InputIcons.designer.cs new file mode 100644 index 00000000..68ca1af9 --- /dev/null +++ b/Master/NucleusCoopTool/InputIcons.designer.cs @@ -0,0 +1,37 @@ + +namespace Nucleus.Coop.UI +{ + partial class InputIcons + { + /// + /// Variable nécessaire au concepteur. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Nettoyage des ressources utilisées. + /// + /// true si les ressources managées doivent être supprimées ; sinon, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Code généré par le Concepteur de composants + + /// + /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas + /// le contenu de cette méthode avec l'éditeur de code. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Master/NucleusCoopTool/Nucleus.Coop.csproj b/Master/NucleusCoopTool/Nucleus.Coop.csproj index c259a9d9..09e90737 100644 --- a/Master/NucleusCoopTool/Nucleus.Coop.csproj +++ b/Master/NucleusCoopTool/Nucleus.Coop.csproj @@ -130,6 +130,7 @@ + Component @@ -177,7 +178,7 @@ SearchDisksForm.cs - Form + UserControl Settings.cs @@ -188,6 +189,12 @@ HubShowcase.cs + + Component + + + InputIcons.cs + @@ -430,6 +437,17 @@ + + + + + + + + + + + @@ -453,15 +471,9 @@ - - Always - PreserveNewest - - Always - Always @@ -540,6 +552,12 @@ Always + + Always + + + Always + Always @@ -609,6 +627,9 @@ Always + + Always + Always @@ -618,6 +639,9 @@ Always + + Always + Always @@ -666,6 +690,9 @@ Always + + Always + Always diff --git a/Master/NucleusCoopTool/Program.cs b/Master/NucleusCoopTool/Program.cs index 0c591cae..ec1cf935 100644 --- a/Master/NucleusCoopTool/Program.cs +++ b/Master/NucleusCoopTool/Program.cs @@ -29,6 +29,7 @@ static void Main() StartChecks.CheckFilesIntegrity(); StartChecks.CheckUserEnvironment(); + //StartChecks.CheckForUpdate(); //Uncomment to run Pizzo's Python nc updater on startup // initialize DPIManager BEFORE setting // the application to be DPI aware DPIManager.PreInitialize(); @@ -41,7 +42,7 @@ static void Main() DPIManager.AddForm(form); DPIManager.ForceUpdate(); Settings sform = new Settings(); - DPIManager.AddForm(sform); + // DPIManager.AddForm(sform); DPIManager.ForceUpdate(); SearchDisksForm sdf = new SearchDisksForm(form); DPIManager.AddForm(sdf); diff --git a/Master/NucleusCoopTool/StartChecks.cs b/Master/NucleusCoopTool/StartChecks.cs index 66587eb9..714edca2 100644 --- a/Master/NucleusCoopTool/StartChecks.cs +++ b/Master/NucleusCoopTool/StartChecks.cs @@ -10,7 +10,7 @@ namespace Nucleus.Coop { internal static class StartChecks { - + static bool isRunning = false; private static void ExportRegistry(string strKey, string filepath) { @@ -32,7 +32,6 @@ private static void ExportRegistry(string strKey, string filepath) } catch (Exception) { - // handle exception } } @@ -76,6 +75,11 @@ public static void CheckFilesIntegrity() { Directory.CreateDirectory((Path.Combine(Application.StartupPath, @"gui\screenshots"))); } + + if (!Directory.Exists(Path.Combine(Application.StartupPath, @"gui\descriptions"))) + { + Directory.CreateDirectory((Path.Combine(Application.StartupPath, @"gui\descriptions"))); + } } public static void CheckUserEnvironment() @@ -199,5 +203,31 @@ private static bool CheckInstallFolder() return true; } + public static void CheckForUpdate() + { + try + { + + using (Process proc = new Process()) + { + proc.StartInfo.FileName = Path.Combine(Application.StartupPath, @"utils\NC_Updater\NC_Updater.exe"); + proc.StartInfo.UseShellExecute = false; + //proc.StartInfo.RedirectStandardOutput = true; + // proc.StartInfo.RedirectStandardError = true; + proc.StartInfo.CreateNoWindow = false; + //proc.StartInfo.Arguments = "-quiet"; + proc.Start(); + Console.WriteLine(proc.ProcessName); + //string stdout = proc.StandardOutput.ReadToEnd(); + //string stderr = proc.StandardError.ReadToEnd(); + //proc.WaitForExit(); + } + Console.WriteLine("Checking for update"); + + } + catch (Exception) + { } + + } } } diff --git a/Master/NucleusCoopTool/blur.cs b/Master/NucleusCoopTool/blur.cs new file mode 100644 index 00000000..4b0ed3f7 --- /dev/null +++ b/Master/NucleusCoopTool/blur.cs @@ -0,0 +1,183 @@ +//https://github.com/mdymel/superfastblur + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.Runtime.InteropServices; +using System.Threading.Tasks; + +namespace Nucleus.Coop +{ + public class GaussianBlur + { + private readonly int[] _alpha; + private readonly int[] _red; + private readonly int[] _green; + private readonly int[] _blue; + + private readonly int _width; + private readonly int _height; + + private readonly ParallelOptions _pOptions = new ParallelOptions { MaxDegreeOfParallelism = 16 }; + + public GaussianBlur(Bitmap image) + { + var rct = new Rectangle(0, 0, image.Width, image.Height); + var source = new int[rct.Width * rct.Height]; + var bits = image.LockBits(rct, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); + Marshal.Copy(bits.Scan0, source, 0, source.Length); + image.UnlockBits(bits); + + _width = image.Width; + _height = image.Height; + + _alpha = new int[_width * _height]; + _red = new int[_width * _height]; + _green = new int[_width * _height]; + _blue = new int[_width * _height]; + + Parallel.For(0, source.Length, _pOptions, i => + { + _alpha[i] = (int)((source[i] & 0xff000000) >> 24); + _red[i] = (source[i] & 0xff0000) >> 16; + _green[i] = (source[i] & 0x00ff00) >> 8; + _blue[i] = (source[i] & 0x0000ff); + }); + } + + public Bitmap Process(int radial) + { + var newAlpha = new int[_width * _height]; + var newRed = new int[_width * _height]; + var newGreen = new int[_width * _height]; + var newBlue = new int[_width * _height]; + var dest = new int[_width * _height]; + + Parallel.Invoke( + () => gaussBlur_4(_alpha, newAlpha, radial), + () => gaussBlur_4(_red, newRed, radial), + () => gaussBlur_4(_green, newGreen, radial), + () => gaussBlur_4(_blue, newBlue, radial)); + + Parallel.For(0, dest.Length, _pOptions, i => + { + if (newAlpha[i] > 255) newAlpha[i] = 255; + if (newRed[i] > 255) newRed[i] = 255; + if (newGreen[i] > 255) newGreen[i] = 255; + if (newBlue[i] > 255) newBlue[i] = 255; + + if (newAlpha[i] < 0) newAlpha[i] = 0; + if (newRed[i] < 0) newRed[i] = 0; + if (newGreen[i] < 0) newGreen[i] = 0; + if (newBlue[i] < 0) newBlue[i] = 0; + + dest[i] = (int)((uint)(newAlpha[i] << 24) | (uint)(newRed[i] << 16) | (uint)(newGreen[i] << 8) | (uint)newBlue[i]); + }); + + var image = new Bitmap(_width, _height); + var rct = new Rectangle(0, 0, image.Width, image.Height); + var bits2 = image.LockBits(rct, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); + Marshal.Copy(dest, 0, bits2.Scan0, dest.Length); + image.UnlockBits(bits2); + return image; + } + + private void gaussBlur_4(int[] source, int[] dest, int r) + { + var bxs = boxesForGauss(r, 3); + boxBlur_4(source, dest, _width, _height, (bxs[0] - 1) / 2); + boxBlur_4(dest, source, _width, _height, (bxs[1] - 1) / 2); + boxBlur_4(source, dest, _width, _height, (bxs[2] - 1) / 2); + } + + private int[] boxesForGauss(int sigma, int n) + { + var wIdeal = Math.Sqrt((12 * sigma * sigma / n) + 1); + var wl = (int)Math.Floor(wIdeal); + if (wl % 2 == 0) wl--; + var wu = wl + 2; + + var mIdeal = (double)(12 * sigma * sigma - n * wl * wl - 4 * n * wl - 3 * n) / (-4 * wl - 4); + var m = Math.Round(mIdeal); + + var sizes = new List(); + for (var i = 0; i < n; i++) sizes.Add(i < m ? wl : wu); + return sizes.ToArray(); + } + + private void boxBlur_4(int[] source, int[] dest, int w, int h, int r) + { + for (var i = 0; i < source.Length; i++) dest[i] = source[i]; + boxBlurH_4(dest, source, w, h, r); + boxBlurT_4(source, dest, w, h, r); + } + + private void boxBlurH_4(int[] source, int[] dest, int w, int h, int r) + { + var iar = (double)1 / (r + r + 1); + Parallel.For(0, h, _pOptions, i => + { + var ti = i * w; + var li = ti; + var ri = ti + r; + var fv = source[ti]; + var lv = source[ti + w - 1]; + var val = (r + 1) * fv; + for (var j = 0; j < r; j++) val += source[ti + j]; + for (var j = 0; j <= r; j++) + { + val += source[ri++] - fv; + dest[ti++] = (int)Math.Round(val * iar); + } + for (var j = r + 1; j < w - r; j++) + { + val += source[ri++] - source[li++]; + dest[ti++] = (int)Math.Round(val * iar); + } + for (var j = w - r; j < w; j++) + { + val += lv - source[li++]; + dest[ti++] = (int)Math.Round(val * iar); + } + }); + } + + private void boxBlurT_4(int[] source, int[] dest, int w, int h, int r) + { + var iar = (double)1 / (r + r + 1); + Parallel.For(0, w, _pOptions, i => + { + var ti = i; + var li = ti; + var ri = ti + r * w; + var fv = source[ti]; + var lv = source[ti + w * (h - 1)]; + var val = (r + 1) * fv; + for (var j = 0; j < r; j++) val += source[ti + j * w]; + for (var j = 0; j <= r; j++) + { + val += source[ri] - fv; + dest[ti] = (int)Math.Round(val * iar); + ri += w; + ti += w; + } + for (var j = r + 1; j < h - r; j++) + { + val += source[ri] - source[li]; + dest[ti] = (int)Math.Round(val * iar); + li += w; + ri += w; + ti += w; + } + for (var j = h - r; j < h; j++) + { + val += lv - source[li]; + dest[ti] = (int)Math.Round(val * iar); + li += w; + ti += w; + } + }); + } + } +} \ No newline at end of file diff --git a/Master/NucleusCoopTool/copyoutput/Settings.ini b/Master/NucleusCoopTool/copyoutput/Settings.ini index 9f4e6c60..62b01f6f 100644 --- a/Master/NucleusCoopTool/copyoutput/Settings.ini +++ b/Master/NucleusCoopTool/copyoutput/Settings.ini @@ -5,16 +5,16 @@ TopMost=Ctrl+T LockKey=Default(End key) [Misc] UseNicksInGame=True -DebugLog=False +DebugLog=True Network=Automatic SteamLang=Automatic EpicLang=English ShowStatus=False KeepAccounts=False NucleusAccountPassword=12345 -IgnoreInputLockReminder=False +IgnoreInputLockReminder=True AutoDesktopScaling=True -NucleusMultiInstances=False +NucleusMultiInstances=True [CustomLayout] SplitDiv=False SplitDivColor=Black @@ -39,6 +39,8 @@ AudioInstance1=Default Theme=default [Dev] SplashScreen_On=False -MouseClick=False +MouseClick=True DisableOfflineIcon=False -TextEditorPath= Default #Must be full path of the executable.(eg., C:\Users\Fifou\AppData\Local\Programs\Microsoft VS Code\Code.exe) \ No newline at end of file +TextEditorPath= Default +Blur = 5 +#Must be full path of the executable.(eg.,TextEditorPath= C:\Users\Fifou\AppData\Local\Programs\Microsoft VS Code\Code.exe) \ No newline at end of file diff --git a/Master/NucleusCoopTool/copyoutput/readme.txt b/Master/NucleusCoopTool/copyoutput/readme.txt index 64da2e0f..bd2cec56 100644 --- a/Master/NucleusCoopTool/copyoutput/readme.txt +++ b/Master/NucleusCoopTool/copyoutput/readme.txt @@ -1,4 +1,4 @@ -Nucleus Co-op - version 2.1 +Nucleus Co-op - version 2.1.1 Nucleus Co-op is a free and open source tool for Windows that allows split-screen play on many games that do not initially support it, the app purpose is to make it as easy as possible for the average user to play games locally using only one PC and one game copy. @@ -173,7 +173,7 @@ Game.GoldbergNeedSteamInterface = false; //Some older games require a steam_int Game.GoldbergLanguage = "english"; //Manually specify what language you want Goldberg to use for the game | by default, Goldberg will use the language you chose in Steam. Game.OrigSteamDllPath = "C:\full path\steam_api.dll"; //If steam_interface.txt is required, provide full path here to the original steam_api(64).dll and Nucleus will create one if it can't find an existing copy. Game.GoldbergIgnoreSteamAppId = false; //When set to true, Goldberg will not create a steam_appid.txt file. -Game.PlayerSteamIDs = [ "1234","5678" ]; //A list of steam IDs to be used instead of the pre-defined ones Nucleuses uses | IDs will be used in order they are placed, i.e. instance 1 will be first non-empty string in array. +Game.PlayerSteamIDs = ["76561198134585131","76561198134585132"]; //A list of steam IDs to be used instead of the pre-defined ones Nucleuses uses | IDs will be used in order they are placed, i.e. instance 1 will be first non-empty string in array. Game.GoldbergExperimentalRename = false; //Set to true to have Goldberg Experimental rename instanced steam_api(64).dll to cracksteam_api(64).dll. Game.GoldbergWriteSteamIDAndAccount = false; //Force Goldberg to write account_name.txt and user_steam_id.txt | Requires Game.UseGoldberg; @@ -243,6 +243,9 @@ NemirtingasGalxyEmu.json edition from a handler example: #################### Additional Tools #################### +Game.UseSteamless = true; //Use atom0s' Steamless app to remove Steam Stub DRM from a protected executable. +Game.SteamlessArgs = "--quiet --keepbind"; //Use this when using Game.UseSteamless = true; always, the command line version of Steamless allows for different launch arguments to be used. +Game.SteamlessTiming = 2500; //The time in milliseconds to give Steamless to patch the game .exe. 2500 is the default value and will be applied even if the timing line has not been added in a handler. Game.UseSteamStubDRMPatcher = false; //Use UberPsyX's Steam Stub DRM Patcher to remove Steam Stub DRM from a protected executable. Game.SteamStubDRMPatcherArch = "64"; //Force Steam Stub DRM Patcher to use either the x64 or x86 dll | Values: "64" or "86". Game.UseEACBypass = false; //Replace any EasyAntiCheat_(x86)(x64).dll with a bypass dll. @@ -369,6 +372,7 @@ Context.CreateRegKey(string baseKey, string sKey, string subKey) //Create a r Context.DeleteRegKey(string baseKey, string sKey, string subKey) //Delete a registry key for current user, baseKey can either be "HKEY_LOCAL_MACHINE" or "HKEY_CURRENT_USER". Context.EditRegKey(string baseKey, string sKey, string name, object data, RegType type) //Edit a registry key for current user, baseKey can either be "HKEY_LOCAL_MACHINE" or "HKEY_CURRENT_USER". EditRegKey uses a custom registry data type to use, by using Nucleus.RegType.DWord for example. The last word can be of the same name of RegistryValueKind enum. +Context.EditRegKeyNoBackup //Edit a registry key for current user without Nucleus creating a backup of the registry or before it creates one. Must be placed before any "Context.EditRegKey" line in handler for it to work. Context.Nickname //Use this in a game handler to get the player's nickname Context.EpicLang //Can be use to edit NemirtingasEpicEmu.json //Can be use in start argument to setup user Epic language parameter //ex: Context.StartArguments = ' -AlwaysFocus -nosplash -nomoviestartup -nomouse' + Context.EpicLang; (if Epic Language is set to "en" return => "-epiclocale=en", Should not be necessary in most cases) Context.GamepadGuid //Get the raw gamepad guid @@ -450,7 +454,19 @@ Known Issues: ------------------------------------------------------------------ Changelog: ----------------------------------------------------------------------------------------- -v2.1 - xx +v2.1.1 - May X, 2022 + + - Added Steamless command line version support: "Game.UseSteamless = true;", "Game.SteamlessArgs = "";", "Game.SteamlessTiming = 2500;". + - Fixed nicknames not working when using "Game.GoldbergExperimentalSteamClient = true;". + - Fixed Player Steam IDs setting to 0 when using "Game.PlayerSteamIDs = [];". + - Added game descriptions, they get downloaded to gui\descriptions. + - Added new line Context.EditRegKeyNoBackup, will not create a backup of the registry when editing. + - Fixed an unknown bug breaking the Nucleus window shape in some cases (maximizing without using the app maximizing button). + - Fixed changing the default text editor in Settings.ini not working. + - Added blur to background images, the blur can be disabled by setting Blur = 0 in Settings.ini. + - Other minor UI improvements and changes. + +v2.1 - May 5, 2022 - Added Context.HandlersFolder (path to the root of Nucleus Co-op handlers folder: NucleusCo-op\handlers). - Fixed app crash when a handler throws an error (sometimes on app close). - Fixed random crashes while clicking on the game list. @@ -486,8 +502,11 @@ v2.1 - xx - Added new supported inputs UI icons, display what input devices a handler supports. - Added Player Steam IDs fields to the Nucleus Nicknames settings tab (now named Players), you can change the instances Player Steam IDs when a handler uses goldberg or SSE via the UI now. - Added new Nicknames/Player Steam IDs switcher, you can quickly switch the order of the nicknames and Player Steam IDs you set up. + - Fixed minor UI glitch. + - Last hooks prompt will show now when only using `Game.PromptBetweenInstances=true; `with` Game.SetTopMostAtEnd = true;` + - Added option in Settings.ini to change the default text editor. + - Selection not working and scaling issues fixed for Nucleus UI options that use images. - v2.0 - February 25, 2022 - New overhauled and customizable user interface with support for themes, game covers and screenshots. - Fixed ui scaling issues at more than 100% desktop scale (and all other issues/bugs related to it). @@ -918,16 +937,16 @@ v0.9a - August 1, 2019 Credits: ----------------------------------------------------------------------------------------- -Official Nucleus Co-op 2.0: Mikou27/nene27. +Official Nucleus Co-op 2.0 and Up: Mikou27/nene27. Original Nucleus Co-op Project: Lucas Assis (lucasassislar). Nucleus Co-op Alpha 8 Mod : ZeroFox. Proto Input, USS, multiple keyboards/mice & hooks: Ilyaki. Website & handler API: r-mach. Handlers development and general testing: Talos91, PoundlandBacon, Pizzo, dr.oldboi and many more. -Nucleus Co-op 2.0 UI assets creation: dr.oldboi, Mikou27, PoundlandBacon. +Nucleus Co-op 2.0+ UI assets creation: dr.oldboi, Mikou27, PoundlandBacon. Additional credits to all the original developers of the third party utilities Nucleus Co-op uses: -Mr_Goldberg (Goldberg Emulator), syahmixp (SmartSteamEmu), EJocys (x360ce), 0dd14 Lab (Xinput Plus), r1ch (ForceBindIP), HaYDeN (Flawless Widescreen), briankendall (devreorder), VerGreeneyes (DirectXWrapper), wizark952 (dinput8 blocker), Nemirtingas (Epic\Galaxy Emulator & OpenXinput), Josivan88 (SplitCalculator). +Mr_Goldberg (Goldberg Emulator), syahmixp (SmartSteamEmu), atom0s (Steamless), EJocys (x360ce), 0dd14 Lab (Xinput Plus), r1ch (ForceBindIP), HaYDeN (Flawless Widescreen), briankendall (devreorder), VerGreeneyes (DirectXWrapper), wizark952 (dinput8 blocker), Nemirtingas (Epic\Galaxy Emulator & OpenXinput), Josivan88 (SplitCalculator). Special thanks to the SplitScreenDreams discord community, this wouldn't have been possible without all your contributions. \ No newline at end of file diff --git a/Master/NucleusCoopTool/copyoutput/utils/Credits.txt b/Master/NucleusCoopTool/copyoutput/utils/Credits.txt index 678c252a..ac63e8e7 100644 --- a/Master/NucleusCoopTool/copyoutput/utils/Credits.txt +++ b/Master/NucleusCoopTool/copyoutput/utils/Credits.txt @@ -1,3 +1,25 @@ These utilities are third party applications and were not designed by the Nucleus Co-op team. Credit goes to each respective developer. -Mr_Goldberg (Goldberg Emulator), syahmixp (SmartSteamEmu), EJocys (x360ce), 0dd14 Lab (Xinput Plus), r1ch (ForceBindIP), HaYDeN (Flawless Widescreen), briankendall (devreorder), VerGreeneyes (DirectXWrapper), wizark952 (dinput8 blocker), Nemirtingas (Epic\Galaxy Emulator), Josivan88 (SplitCalculator) \ No newline at end of file +Mr_Goldberg (Goldberg Emulator): https://mr_goldberg.gitlab.io/goldberg_emulator/ + +syahmixp (SmartSteamEmu), + +atom0s (Steamless): https://github.com/atom0s/Steamless + +EJocys (x360ce): https://github.com/x360ce/x360ce + +0dd14 Lab (Xinput Plus): https://sites.google.com/site/0dd14lab/xinput-plus + +r1ch (ForceBindIP): https://r1ch.net/projects/forcebindip + +HaYDeN (Flawless Widescreen): https://www.flawlesswidescreen.org/ + +briankendall (devreorder): https://github.com/briankendall/devreorder + +VerGreeneyes (DirectXWrapper): https://community.pcgamingwiki.com/files/file/87-the-bards-tale-2005-windowed-mode/ + +wizark952 (dinput8 blocker), + +Nemirtingas (Epic\Galaxy Emulator): https://nemirtingas.gitlab.io/nemirtingas_epic_emu/ / https://nemirtingas.gitlab.io/nemirtingas_galaxy_emu/ + +Josivan88 (SplitCalculator). \ No newline at end of file diff --git a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/debug_experimental/steam_api.dll b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/debug_experimental/steam_api.dll index 33bf5df2..76d2a56b 100644 Binary files a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/debug_experimental/steam_api.dll and b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/debug_experimental/steam_api.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/debug_experimental/steam_api64.dll b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/debug_experimental/steam_api64.dll index 67823382..155d2bee 100644 Binary files a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/debug_experimental/steam_api64.dll and b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/debug_experimental/steam_api64.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/debug_experimental_steamclient/steamclient.dll b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/debug_experimental_steamclient/steamclient.dll index e1614249..780b13fe 100644 Binary files a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/debug_experimental_steamclient/steamclient.dll and b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/debug_experimental_steamclient/steamclient.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/debug_experimental_steamclient/steamclient64.dll b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/debug_experimental_steamclient/steamclient64.dll index 9ad55afc..744e9003 100644 Binary files a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/debug_experimental_steamclient/steamclient64.dll and b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/debug_experimental_steamclient/steamclient64.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental/steam_api.dll b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental/steam_api.dll index 4ba2c85d..b80fcda1 100644 Binary files a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental/steam_api.dll and b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental/steam_api.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental/steam_api64.dll b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental/steam_api64.dll index 38b69051..40aed1ee 100644 Binary files a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental/steam_api64.dll and b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental/steam_api64.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental/steamclient.dll b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental/steamclient.dll index cc304fd2..3db7c2db 100644 Binary files a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental/steamclient.dll and b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental/steamclient.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental/steamclient64.dll b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental/steamclient64.dll index 7805c362..a6a27022 100644 Binary files a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental/steamclient64.dll and b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental/steamclient64.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental_steamclient/steamclient.dll b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental_steamclient/steamclient.dll index 1b4097f1..3d900479 100644 Binary files a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental_steamclient/steamclient.dll and b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental_steamclient/steamclient.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental_steamclient/steamclient64.dll b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental_steamclient/steamclient64.dll index 1a26b346..a3244473 100644 Binary files a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental_steamclient/steamclient64.dll and b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental_steamclient/steamclient64.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental_steamclient/steamclient_loader.exe b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental_steamclient/steamclient_loader.exe index fc4ef3ff..c76bb7b4 100644 Binary files a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental_steamclient/steamclient_loader.exe and b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/experimental_steamclient/steamclient_loader.exe differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/job_id b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/job_id index df615286..6f450b0b 100644 --- a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/job_id +++ b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/job_id @@ -1 +1 @@ -2019508570 +2491271945 diff --git a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/linux/lobby_connect/lobby_connect_x64 b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/linux/lobby_connect/lobby_connect_x64 index e963fe4a..2f2e178f 100644 Binary files a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/linux/lobby_connect/lobby_connect_x64 and b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/linux/lobby_connect/lobby_connect_x64 differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/linux/lobby_connect/lobby_connect_x86 b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/linux/lobby_connect/lobby_connect_x86 index 0bd691f4..f5cf1dcf 100644 Binary files a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/linux/lobby_connect/lobby_connect_x86 and b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/linux/lobby_connect/lobby_connect_x86 differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/linux/x86_64/libsteam_api.so b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/linux/x86_64/libsteam_api.so index ef588365..60fe27d9 100644 Binary files a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/linux/x86_64/libsteam_api.so and b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/linux/x86_64/libsteam_api.so differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/linux/x86_64/steamclient.so b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/linux/x86_64/steamclient.so index 5cddb82b..11eb65f9 100644 Binary files a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/linux/x86_64/steamclient.so and b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/linux/x86_64/steamclient.so differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/lobby_connect/lobby_connect.exe b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/lobby_connect/lobby_connect.exe index de557dd7..73280ccf 100644 Binary files a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/lobby_connect/lobby_connect.exe and b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/lobby_connect/lobby_connect.exe differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/source_code/source_code.bundle b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/source_code/source_code.bundle index 56413851..bfc07247 100644 Binary files a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/source_code/source_code.bundle and b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/source_code/source_code.bundle differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/steam_api.dll b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/steam_api.dll index 89bd2450..86d7f95d 100644 Binary files a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/steam_api.dll and b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/steam_api.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/steam_api64.dll b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/steam_api64.dll index e31dcb27..9d63eb9a 100644 Binary files a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/steam_api64.dll and b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/steam_api64.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/tools/generate_interfaces_file.exe b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/tools/generate_interfaces_file.exe index 19fa0054..de228687 100644 Binary files a/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/tools/generate_interfaces_file.exe and b/Master/NucleusCoopTool/copyoutput/utils/GoldbergEmu/tools/generate_interfaces_file.exe differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/ExamplePlugin.dll b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/ExamplePlugin.dll new file mode 100644 index 00000000..37579392 Binary files /dev/null and b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/ExamplePlugin.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/SharpDisasm.dll b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/SharpDisasm.dll new file mode 100644 index 00000000..bbddf493 Binary files /dev/null and b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/SharpDisasm.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.API.dll b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.API.dll new file mode 100644 index 00000000..9655bf63 Binary files /dev/null and b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.API.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.Unpacker.Variant10.x86.dll b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.Unpacker.Variant10.x86.dll new file mode 100644 index 00000000..3377aa4b Binary files /dev/null and b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.Unpacker.Variant10.x86.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.Unpacker.Variant20.x86.dll b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.Unpacker.Variant20.x86.dll new file mode 100644 index 00000000..78c346b3 Binary files /dev/null and b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.Unpacker.Variant20.x86.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.Unpacker.Variant21.x86.dll b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.Unpacker.Variant21.x86.dll new file mode 100644 index 00000000..edf14c07 Binary files /dev/null and b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.Unpacker.Variant21.x86.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.Unpacker.Variant30.x64.dll b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.Unpacker.Variant30.x64.dll new file mode 100644 index 00000000..e22567b8 Binary files /dev/null and b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.Unpacker.Variant30.x64.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.Unpacker.Variant30.x86.dll b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.Unpacker.Variant30.x86.dll new file mode 100644 index 00000000..0c34ac04 Binary files /dev/null and b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.Unpacker.Variant30.x86.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.Unpacker.Variant31.x64.dll b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.Unpacker.Variant31.x64.dll new file mode 100644 index 00000000..78f44fb9 Binary files /dev/null and b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.Unpacker.Variant31.x64.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.Unpacker.Variant31.x86.dll b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.Unpacker.Variant31.x86.dll new file mode 100644 index 00000000..567469d9 Binary files /dev/null and b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Plugins/Steamless.Unpacker.Variant31.x86.dll differ diff --git a/Master/NucleusCoopTool/copyoutput/utils/Steamless/Steamless.CLI.exe b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Steamless.CLI.exe new file mode 100644 index 00000000..aa41080b Binary files /dev/null and b/Master/NucleusCoopTool/copyoutput/utils/Steamless/Steamless.CLI.exe differ diff --git a/Master/NucleusCoopTool/gui/cover_layer.png b/Master/NucleusCoopTool/gui/cover_layer.png deleted file mode 100644 index 2f0000d6..00000000 Binary files a/Master/NucleusCoopTool/gui/cover_layer.png and /dev/null differ diff --git a/Master/NucleusCoopTool/gui/covers/covers here.txt b/Master/NucleusCoopTool/gui/covers/covers here.txt deleted file mode 100644 index 5f282702..00000000 --- a/Master/NucleusCoopTool/gui/covers/covers here.txt +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/Master/NucleusCoopTool/gui/no_cover.png b/Master/NucleusCoopTool/gui/no_cover.png index 89ad01ec..ba657e01 100644 Binary files a/Master/NucleusCoopTool/gui/no_cover.png and b/Master/NucleusCoopTool/gui/no_cover.png differ diff --git a/Master/NucleusCoopTool/gui/screenshots/screenshots here.txt b/Master/NucleusCoopTool/gui/screenshots/screenshots here.txt deleted file mode 100644 index 5f282702..00000000 --- a/Master/NucleusCoopTool/gui/screenshots/screenshots here.txt +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/Master/NucleusCoopTool/gui/theme/default/cover_layer.png b/Master/NucleusCoopTool/gui/theme/default/cover_layer.png index 2f0000d6..d4819557 100644 Binary files a/Master/NucleusCoopTool/gui/theme/default/cover_layer.png and b/Master/NucleusCoopTool/gui/theme/default/cover_layer.png differ diff --git a/Master/NucleusCoopTool/gui/theme/default/game_list.png b/Master/NucleusCoopTool/gui/theme/default/game_list.png index 728aa557..4f055412 100644 Binary files a/Master/NucleusCoopTool/gui/theme/default/game_list.png and b/Master/NucleusCoopTool/gui/theme/default/game_list.png differ diff --git a/Master/NucleusCoopTool/gui/theme/default/game_options.png b/Master/NucleusCoopTool/gui/theme/default/game_options.png new file mode 100644 index 00000000..8e33e107 Binary files /dev/null and b/Master/NucleusCoopTool/gui/theme/default/game_options.png differ diff --git a/Master/NucleusCoopTool/gui/theme/default/handlernote_background.png b/Master/NucleusCoopTool/gui/theme/default/handlernote_background.png new file mode 100644 index 00000000..34733626 Binary files /dev/null and b/Master/NucleusCoopTool/gui/theme/default/handlernote_background.png differ diff --git a/Master/NucleusCoopTool/gui/theme/default/other_backgrounds.jpg b/Master/NucleusCoopTool/gui/theme/default/other_backgrounds.jpg index d6fd5e17..c15d8858 100644 Binary files a/Master/NucleusCoopTool/gui/theme/default/other_backgrounds.jpg and b/Master/NucleusCoopTool/gui/theme/default/other_backgrounds.jpg differ diff --git a/Master/NucleusCoopTool/gui/theme/default/right_panel.png b/Master/NucleusCoopTool/gui/theme/default/right_panel.png index aee00349..4f055412 100644 Binary files a/Master/NucleusCoopTool/gui/theme/default/right_panel.png and b/Master/NucleusCoopTool/gui/theme/default/right_panel.png differ diff --git a/Master/NucleusCoopTool/gui/theme/default/setup_screen.png b/Master/NucleusCoopTool/gui/theme/default/setup_screen.png index dfd44fdf..70e3a726 100644 Binary files a/Master/NucleusCoopTool/gui/theme/default/setup_screen.png and b/Master/NucleusCoopTool/gui/theme/default/setup_screen.png differ diff --git a/Master/NucleusCoopTool/gui/theme/default/showcase_cover_layer.png b/Master/NucleusCoopTool/gui/theme/default/showcase_cover_layer.png new file mode 100644 index 00000000..165f6e78 Binary files /dev/null and b/Master/NucleusCoopTool/gui/theme/default/showcase_cover_layer.png differ diff --git a/Master/NucleusCoopTool/gui/theme/default/showcase_title-back.png b/Master/NucleusCoopTool/gui/theme/default/showcase_title-back.png new file mode 100644 index 00000000..245ab308 Binary files /dev/null and b/Master/NucleusCoopTool/gui/theme/default/showcase_title-back.png differ diff --git a/Master/NucleusCoopTool/gui/theme/default/text_switcher.png b/Master/NucleusCoopTool/gui/theme/default/text_switcher.png new file mode 100644 index 00000000..3789ad59 Binary files /dev/null and b/Master/NucleusCoopTool/gui/theme/default/text_switcher.png differ diff --git a/Master/NucleusCoopTool/gui/theme/default/theme.ini b/Master/NucleusCoopTool/gui/theme/default/theme.ini index a5e55950..57f9765d 100644 --- a/Master/NucleusCoopTool/gui/theme/default/theme.ini +++ b/Master/NucleusCoopTool/gui/theme/default/theme.ini @@ -10,12 +10,11 @@ SetupScreenFont=255,255,255 SetupScreenBorder=255,255,255 SetupScreenPlayerBorder=255,255,255 HandlerNoteTitleFont=255,255,255 -HandlerNoteTitleBackColor=27,27,27 HandlerNoteBack=0,0,0 HandlerNoteFont=255,255,255 -HandlerNoteMagnifierFont = 255,255,255 +HandlerNoteMagnifierTitleBackColor =50,50,50 [Misc] -DisableCoverBorder=False +DisableCoverBorder=True DisableNoteBorder=True ControllerIdentificationOn=True UseSetupScreenBorder=True diff --git a/Master/NucleusCoopTool/gui/theme/default/update_available.png b/Master/NucleusCoopTool/gui/theme/default/update_available.png new file mode 100644 index 00000000..72f59457 Binary files /dev/null and b/Master/NucleusCoopTool/gui/theme/default/update_available.png differ diff --git a/Master/NucleusGaming/Coop/GameManager.cs b/Master/NucleusGaming/Coop/GameManager.cs index 2bd32456..fb3c9e4e 100644 --- a/Master/NucleusGaming/Coop/GameManager.cs +++ b/Master/NucleusGaming/Coop/GameManager.cs @@ -712,7 +712,10 @@ private void play(object state) proc.Dispose(); } - File.Delete(regFilePath); + if (!regFilePath.Contains("User Shell Folders")) + { + File.Delete(regFilePath); + } } } diff --git a/Master/NucleusGaming/Coop/Generic/GenericContext.cs b/Master/NucleusGaming/Coop/Generic/GenericContext.cs index fc2cd538..778c92e3 100644 --- a/Master/NucleusGaming/Coop/Generic/GenericContext.cs +++ b/Master/NucleusGaming/Coop/Generic/GenericContext.cs @@ -108,7 +108,8 @@ public class GenericContext public string[] PlayerSteamIDs; public int NumControllers = 0; public int NumKeyboards = 0; - + public bool KeepEditedRegKeys; + private List regKeyPaths = new List(); public string NucleusEnvironmentRoot = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); @@ -237,7 +238,7 @@ public string GetFolder(Folder folder) public string GamepadGuid => pInfo.GamepadGuid.ToString(); public bool IsKeyboardPlayer => pInfo.IsKeyboardPlayer; - public int GamepadId => pInfo.GamepadId+1; + public int GamepadId => pInfo.GamepadId + 1; public float OrigAspectRatioDecimal => (float)profile.Screens[pInfo.PlayerID].display.Width / profile.Screens[pInfo.PlayerID].display.Height; public string OrigAspectRatio @@ -270,14 +271,14 @@ public void ProceedSymlink() string s = filesToSymlink[f].ToLower(); // make sure it's lower case CmdUtil.MkLinkFile(Path.Combine(OrigRootFolder, s), Path.Combine(RootFolder, s), out int exitCode); - Console.WriteLine(OrigRootFolder+ s + " => Instance folder " + RootFolder+s); + Console.WriteLine(OrigRootFolder + s + " => Instance folder " + RootFolder + s); } } - private string epicLang; + private string epicLang; public string EpicLang - { + { get { IniFile ini = new IniFile(Path.Combine(Directory.GetCurrentDirectory(), "Settings.ini")); @@ -316,9 +317,9 @@ public string EpicLang foreach (KeyValuePair lang in epiclangs) { if (lang.Key == ini.IniReadValue("Misc", "EpicLang")) - { - epicLang = lang.Value; - } + { + epicLang = lang.Value; + } } return epicLang; } @@ -1681,7 +1682,9 @@ public void EditRegKey(string baseKey, string sKey, string subKey, object value, break; } + string fullKeyPath = baseKey + "\\" + sKey; + if (!regKeyPaths.Contains(fullKeyPath) && key != null) { string regPath = Directory.GetCurrentDirectory() + "\\utils\\backup\\" + sKey.Substring(sKey.LastIndexOf('\\') + 1) + ".reg"; @@ -1692,7 +1695,60 @@ public void EditRegKey(string baseKey, string sKey, string subKey, object value, ExportRegistry(baseKey + "\\" + sKey, regPath); } } + + + if (key == null) + { + switch (baseKey) + { + case "HKEY_LOCAL_MACHINE": + key = Registry.LocalMachine.CreateSubKey(sKey, true); + break; + case "HKEY_CURRENT_USER": + key = Registry.CurrentUser.CreateSubKey(sKey, true); + break; + case "HKEY_USERS": + key = Registry.Users.CreateSubKey(sKey, true); + break; + } + } + + if (regType == RegType.Binary) + { + byte[] bytes = Encoding.UTF8.GetBytes(val); + key.SetValue(subKey, bytes, (RegistryValueKind)(int)regType); + } + else + { + key.SetValue(subKey, value, (RegistryValueKind)(int)regType); + } + key.Close(); + } + public void EditRegKeyNoBackup(string baseKey, string sKey, string subKey, object value, RegType regType) + { + if ((baseKey != "HKEY_LOCAL_MACHINE" && baseKey != "HKEY_CURRENT_USER" && baseKey != "HKEY_USERS") || value == null) + { + return; + } + string val = value.ToString(); + + RegistryKey key = null; + switch (baseKey) + { + case "HKEY_LOCAL_MACHINE": + key = Registry.LocalMachine.OpenSubKey(sKey, true); + break; + case "HKEY_CURRENT_USER": + key = Registry.CurrentUser.OpenSubKey(sKey, true); + break; + case "HKEY_USERS": + key = Registry.Users.OpenSubKey(sKey, true); + break; + } + + Log("Registry key : " + baseKey + "\\" + sKey + "\\" + subKey + " -Value= " + value + " -RegType= " + regType + " will not be deleted from registry on Nucleus Co-op close"); + if (key == null) { switch (baseKey) @@ -1718,6 +1774,7 @@ public void EditRegKey(string baseKey, string sKey, string subKey, object value, { key.SetValue(subKey, value, (RegistryValueKind)(int)regType); } + key.Close(); } diff --git a/Master/NucleusGaming/Coop/Generic/GenericGameHandler.cs b/Master/NucleusGaming/Coop/Generic/GenericGameHandler.cs index 70e8b97c..51e4cd22 100644 --- a/Master/NucleusGaming/Coop/Generic/GenericGameHandler.cs +++ b/Master/NucleusGaming/Coop/Generic/GenericGameHandler.cs @@ -640,7 +640,7 @@ public void End(bool fromStopButton) Log("No Nucleus backed up files found"); } - Thread.Sleep(1000); // Commented to keep the registry key backup (user paths documents, appdata etc) in the 2.0 hotfix #1 + Thread.Sleep(1000); string[] regFiles = Directory.GetFiles(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "utils\\backup"), "*.reg", SearchOption.AllDirectories); if (regFiles.Length > 0) @@ -1662,11 +1662,11 @@ public string Play() if (isDebug) { - Log("Nucleus Co-op version: 2.1"); + Log("Nucleus Co-op version: " + Globals.Version); Log("########## START OF HANDLER ##########"); string line; - + StreamReader file = new StreamReader(Path.Combine(GameManager.Instance.GetJsScriptsPath(), gen.JsFileName)); while ((line = file.ReadLine()) != null) { @@ -1983,21 +1983,6 @@ public string Play() if ((i == 0 && (gen.SymlinkGame || gen.HardlinkGame)) || gen.HardcopyGame) { - - //Log("Starting symlink and copies"); - //if (gen.SymlinkFiles != null) - //{ - // Log("Symlinking " + gen.SymlinkFiles.Length + " files in Game.SymlinkFiles"); - // string[] filesToSymlink = gen.SymlinkFiles; - // for (int f = 0; f < filesToSymlink.Length; f++) - // { - // string s = filesToSymlink[f].ToLower(); - // // make sure it's lower case - // CmdUtil.MkLinkFile(Path.Combine(rootFolder, s), Path.Combine(linkFolder, s), out int exitCode); - // Console.WriteLine(Path.Combine(rootFolder, s) +" "+ Path.Combine(linkFolder, s)); - // } - //} - if (gen.CopyFiles != null) { Log("Copying " + gen.CopyFiles.Length + " files in Game.CopyFiles"); @@ -2010,6 +1995,7 @@ public string Play() } } + origRootFolder = rootFolder; instanceExeFolder = linkBinFolder; @@ -2021,7 +2007,7 @@ public string Play() // some games have save files inside their game folder, so we need to access them inside the loop jsData[Folder.InstancedGameFolder.ToString()] = linkFolder; - + Thread.Sleep(1000); if (i == 0 && (gen.LauncherExe?.Length > 0 && gen.LauncherExe.EndsWith("NucleusDefined"))) { @@ -2220,17 +2206,11 @@ public string Play() { Log(string.Format("Symlinking game folder and files at {0} to {1}, for each instance", rootFolder, tempDir)); int exitCode; - //CmdUtil.LinkDirectory(rootFolder, new DirectoryInfo(rootFolder), linkFolder, out exitCode, dirExclusions.ToArray(), fileExclusionsArr, fileCopiesArr, true, true); - //Nucleus.Gaming.Platform.Windows.IO.WinDirectoryUtil.LinkDirectory(rootFolder, new DirectoryInfo(rootFolder), linkFolder, out exitCode, dirExclusions.ToArray(), fileExclusionsArr, fileCopiesArr, true); + while (!StartGameUtil.SymlinkGame(rootFolder, linkFolder, out exitCode, dirExclusions.ToArray(), fileExclusionsArr, fileCopiesArr, false, gen.SymlinkFolders, players.Count)) { Thread.Sleep(25); } - - //if (!gen.SymlinkExe) - //{ - //File.Copy(userGame.ExePath, exePath, true); - //} } } } @@ -2239,7 +2219,7 @@ public string Play() skipped = true; Log("Skipping linking or copying files as it is not needed"); } - + if (gen.LauncherExe?.Length > 0) { if (gen.LauncherExe.Contains(':') && gen.LauncherExe.Contains('\\')) @@ -2362,7 +2342,7 @@ public string Play() } } } - + if (!skipped) { Log("File operations complete"); @@ -2414,6 +2394,7 @@ public string Play() } + if (processingExit) { return string.Empty; @@ -2627,10 +2608,8 @@ public string Play() Log("ERROR - " + ex.Message); } } - } - bool userConfigPathConverted = false; if (gen.UserProfileConfigPath?.Length > 0 && gen.UserProfileConfigPath.ToLower().StartsWith(@"documents\")) { @@ -2743,6 +2722,9 @@ public string Play() context.OrigRootFolder = rootFolder; context.UserProfileConfigPath = gen.UserProfileConfigPath; context.UserProfileSavePath = gen.UserProfileSavePath; + context.KeepEditedRegKeys = gen.KeepEditedRegKeys; + + if (gen.SymlinkFiles != null) { @@ -2752,7 +2734,6 @@ public string Play() if (gen.ForceLauncherExeIgnoreFileCheck) { - Log("Force ignoring validation check of launcher exe. Will use filepath: " + Path.GetDirectoryName(userGame.ExePath).ToLower()); linkFolder = Path.GetDirectoryName(userGame.ExePath).ToLower(); exePath = Path.Combine(Path.GetDirectoryName(userGame.ExePath).ToLower(), gen.LauncherExe); @@ -3115,11 +3096,21 @@ public string Play() } bool setupDll = true; + if (!gen.SymlinkGame && !gen.HardlinkGame && !gen.HardcopyGame && i > 0) { setupDll = false; } + if (gen.UseSteamless) + { + Log("Apply Steamless patch for " + gen.ExecutableName); + Log("Steamless patch timing = " + gen.SteamlessTiming+"ms"); + Tools.Steamless.Steamless steamless = new Tools.Steamless.Steamless(); + steamless.SteamlessProc(exePath, linkFolder, gen.ExecutableName,gen.SteamlessArgs,gen.SteamlessTiming); + Thread.Sleep(gen.SteamlessTiming+2000); + } + if (processingExit) { return string.Empty; @@ -3296,6 +3287,22 @@ public string Play() } } + foreach (string nameFile in files) + { + if (!string.IsNullOrEmpty(player.Nickname)) + { + Log(string.Format("Writing nickname {0} in account_name.txt", player.Nickname)); + File.Delete(nameFile); + File.WriteAllText(nameFile, player.Nickname); + } + else + { + Log("Writing nickname {0} in account_name.txt " + "Player" + (i + 1)); + File.Delete(nameFile); + File.WriteAllText(nameFile, "Player" + (i + 1)); + } + } + saFiles = Directory.GetFiles(linkFolder, "user_steam_id.txt", SearchOption.AllDirectories); files = saFiles.ToList(); if (saFiles.Length > 0) @@ -3320,35 +3327,26 @@ public string Play() foreach (string nameFile in files) { - long steamID = 0; + long steamID = random_steam_id + i; + bool useSettingsSID = false; + if (ini.IniReadValue("SteamIDs", "Player_" + (i + 1)) != "") { - Log("Using steam ID from Nucleus settings"); - steamID = Convert.ToInt64(ini.IniReadValue("SteamIDs", "Player_" + (i + 1))); + Log("Using steam ID from Nucleus settings "); + steamID = Convert.ToInt64(ini.IniReadValue("SteamIDs", "Player_" + (i + 1)));//ToString? + useSettingsSID = true; } - else if(gen.PlayerSteamIDs != null) + + if (gen.PlayerSteamIDs != null && !useSettingsSID) { if (i < gen.PlayerSteamIDs.Length && !string.IsNullOrEmpty(gen.PlayerSteamIDs[i])) { - Log("Usingsteam ID from handler"); + Log("Using steam ID from handler"); steamID = long.Parse(gen.PlayerSteamIDs[i]); } + } - else - { - Log("Using default Nucleus steam ID"); - steamID = random_steam_id + i; - } - - //if (gen.PlayerSteamIDs != null) - //{ - // if (i < gen.PlayerSteamIDs.Length && !string.IsNullOrEmpty(gen.PlayerSteamIDs[i])) - // { - // Log("Using a manually entered steam ID"); - // steamID = long.Parse(gen.PlayerSteamIDs[i]); - // } - //} Log("Generating user_steam_id.txt with user steam ID " + (steamID).ToString()); File.Delete(nameFile); @@ -3366,7 +3364,6 @@ public string Play() if (gen.LauncherExe?.Length > 0) { //Force no starting arguments as a launcher is being used - //Log("Removing starting arguments as a launcher is being used"); if (gen.HookInit || gen.RenameNotKillMutex || gen.SetWindowHookStart || gen.BlockRawInput || gen.CreateSingleDeviceFile) { @@ -3427,7 +3424,6 @@ public string Play() sseLoader = "SmartSteamLoader.exe"; } - string emuExe = Path.Combine(steamEmu, sseLoader); string emuIni = Path.Combine(steamEmu, "SmartSteamEmu.ini"); IniFile emu = new IniFile(emuIni); @@ -3554,12 +3550,9 @@ public string Play() byte[] envBytes = Encoding.Unicode.GetBytes(sb.ToString()); envPtr = Marshal.AllocHGlobal(envBytes.Length); Marshal.Copy(envBytes, 0, envPtr, envBytes.Length); - } - } - if (!gen.ThirdPartyLaunch) { if (context.KillMutex?.Length > 0) @@ -3633,7 +3626,6 @@ public string Play() startup.cb = Marshal.SizeOf(startup); bool success = CreateProcess(null, emuExe, IntPtr.Zero, IntPtr.Zero, false, (uint)ProcessCreationFlags.CREATE_UNICODE_ENVIRONMENT, envPtr, Path.GetDirectoryName(exePath), ref startup, out PROCESS_INFORMATION processInformation); - //Log(string.Format("Launching game directly at {0} with args {1}", exePath, startArgs)); if (!success) { @@ -3650,7 +3642,6 @@ public string Play() Log("Skipping launching of game via Nucleus for third party launch"); } - Log("SmartSteamEmu setup complete"); proc = null; @@ -3782,7 +3773,6 @@ public string Play() byte[] envBytes = Encoding.Unicode.GetBytes(sb.ToString()); envPtr = Marshal.AllocHGlobal(envBytes.Length); Marshal.Copy(envBytes, 0, envPtr, envBytes.Length); - } ProtoInputLauncher.InjectStartup(exePath, @@ -3807,7 +3797,6 @@ public string Play() } else if ((gen.HookInit || (gen.RenameNotKillMutex && context.KillMutex?.Length > 0) || gen.SetWindowHookStart || gen.BlockRawInput || gen.CreateSingleDeviceFile) && !gen.CMDLaunch && !gen.UseForceBindIP && !gen.LaunchAsDifferentUsers && !gen.LaunchAsDifferentUsersAlt) /*|| (gen.CMDLaunch && i==0))*/ { - string mu = ""; if (gen.RenameNotKillMutex && context.KillMutex?.Length > 0) { @@ -3832,7 +3821,6 @@ public string Play() } } - Log(string.Format("Launching game located at {0} through StartGameUtil", exePath)); uint sguOutPID = StartGameUtil.StartGame(exePath, startArgs, gen.HookInit, gen.HookInitDelay, gen.RenameNotKillMutex, mu, gen.SetWindowHookStart, isDebug, nucleusRootFolder, gen.BlockRawInput, gen.UseNucleusEnvironment, player.Nickname, startupHooksEnabled, gen.CreateSingleDeviceFile, player.RawHID, player.MonitorBounds.Width, player.MonitorBounds.Height, player.MonitorBounds.X @@ -3867,7 +3855,6 @@ public string Play() cmd.StartInfo.Arguments = cmdLine; - string username = WindowsIdentity.GetCurrent().Name.Split('\\')[1]; if (gen.UseNucleusEnvironment) @@ -3884,7 +3871,6 @@ public string Play() Directory.CreateDirectory(NucleusEnvironmentRoot + $@"\NucleusCoop\{player.Nickname}\AppData\Roaming"); Directory.CreateDirectory(NucleusEnvironmentRoot + $@"\NucleusCoop\{player.Nickname}\AppData\Local"); - Directory.CreateDirectory(Path.GetDirectoryName(DocumentsRoot) + $@"\NucleusCoop\{player.Nickname}\Documents"); if (gen.DocumentsConfigPath?.Length > 0 || gen.DocumentsSavePath?.Length > 0) @@ -3927,9 +3913,7 @@ public string Play() else if (gen.LaunchAsDifferentUsers) { IntPtr envPtr = IntPtr.Zero; - string username = WindowsIdentity.GetCurrent().Name.Split('\\')[1]; - var sb = new StringBuilder(); IDictionary envVars = Environment.GetEnvironmentVariables(); @@ -3984,15 +3968,7 @@ public string Play() else if (gen.UseCurrentUserEnvironment) { Log("Setting environment to current user"); - //envVars["APPDATA"] = $@"C:\Users\{username}\AppData\Roaming"; - //envVars["LOCALAPPDATA"] = $@"C:\Users\{username}\AppData\Local"; - //envVars["USERPROFILE"] = $@"C:\Users\{username}\"; - //envVars["HOMEPATH"] = $@"\Users\{username}\"; - - //Directory.CreateDirectory($@"C:\Users\{username}"); - //Directory.CreateDirectory($@"C:\Users\{username}\Documents"); - //Directory.CreateDirectory($@"C:\Users\{username}\AppData\Roaming"); - //Directory.CreateDirectory($@"C:\Users\{username}\AppData\Local"); + envVars["APPDATA"] = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); //$@"C:\Users\{username}\AppData\Roaming"; envVars["LOCALAPPDATA"] = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); //$@"C:\Users\{username}\AppData\Local"; envVars["USERPROFILE"] = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); //$@"C:\Users\{username}\"; @@ -4043,10 +4019,7 @@ public string Play() catch { proc = null; - } - - //SecureString sPass = new NetworkCredential("", "12345").SecurePassword; - //proc = Process.Start(exePath, startArgs, $"nucleusplayer{i + 1}", sPass, Environment.UserDomainName); + } } else if (gen.CMDLaunch /*&& i >= 1*/ || (gen.UseForceBindIP && i > 0)) { @@ -4055,7 +4028,6 @@ public string Play() cmd.StartInfo.FileName = "cmd.exe"; cmd.StartInfo.RedirectStandardInput = true; cmd.StartInfo.RedirectStandardOutput = true; - //cmd.StartInfo.CreateNoWindow = true; cmd.StartInfo.UseShellExecute = false; if (gen.UseForceBindIP) @@ -4070,7 +4042,7 @@ public string Play() if (gen.UseNucleusEnvironment) { Log("Setting up Nucleus environment"); - //var username = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile).Replace(@"C:\Users\", ""); + string username = Environment.UserName; try { @@ -4122,7 +4094,6 @@ public string Play() if (gen.CMDBatchBefore?.Length > 0) { - for (int x = 0; x < gen.CMDBatchBefore.Length; x++) { if (!gen.CMDBatchBefore[x].Contains("|")) @@ -4165,7 +4136,6 @@ public string Play() Log(string.Format("Launching game via command prompt with the following line: {0}", cmdLine)); cmd.StandardInput.WriteLine(cmdLine); - if (gen.CMDBatchAfter?.Length > 0) { for (int x = 0; x < gen.CMDBatchAfter.Length; x++) @@ -4197,7 +4167,6 @@ public string Play() { string forceBindexe = string.Empty; - if (gameIs64) { forceBindexe = "ForceBindIP64.exe"; @@ -4409,7 +4378,7 @@ public string Play() else { Log("Skipping launching of game via Nucleus for third party launch"); - //MessageBox.Show("Press Ok when game has launched.", "Nucleus - Third Party Launch"); + if (!gen.IgnoreThirdPartyPrompt) { Forms.Prompt prompt = new Forms.Prompt("Press OK when game has launched."); @@ -4417,6 +4386,8 @@ public string Play() } } + + if (gen.LauncherExe?.Length > 0) { //Force process to be null as we don't want launcher process @@ -4467,8 +4438,7 @@ public string Play() if (gen.PromptProcessChangesAtEnd) { - Log("Prompted user before processing end changes"); - //MessageBox.Show("Press OK when ready to make changes to game processes.", "Nucleus - Prompt Process Changes At End", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly); + Log("Prompted user before processing end changes"); Forms.Prompt prompt = new Forms.Prompt("Press OK when ready to make changes to game processes."); prompt.ShowDialog(); } @@ -4478,7 +4448,6 @@ public string Play() } else { - if (gen.PromptAfterFirstInstance && i == 0) { Log("Prompted user after first instance"); @@ -4509,7 +4478,6 @@ public string Play() } } } - continue; } } @@ -4517,7 +4485,7 @@ public string Play() if (gen.PromptBeforeProcessGrab) { Log("Prompted user before searching for game process"); - //MessageBox.Show("Press OK when ready for Nucleus to search for game process.", "Nucleus - Prompt Before Process Grab", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly); + Forms.Prompt prompt = new Forms.Prompt("Press OK when ready for Nucleus to search for game process."); prompt.ShowDialog(); } @@ -4599,7 +4567,6 @@ public string Play() Thread.Sleep(1000); } } - Thread.Sleep(10000); } @@ -4682,7 +4649,6 @@ public string Play() { proc = LaunchProcessPick(player); } - } else { @@ -4788,10 +4754,7 @@ public string Play() data.KilledMutexes = context.KillMutex?.Length == 0; player.ProcessData = data; - - first = false; - //InjectDLLs(proc); if (gen.ProcessorPriorityClass?.Length > 0) { @@ -4823,7 +4786,6 @@ public string Play() } } - if ((gen.UseProcessor != null ? (gen.UseProcessor.Length > 0 ? 1 : 0) : 0) != 0) { Log(string.Format("Assigning processors {0}", gen.UseProcessor)); @@ -4934,7 +4896,6 @@ public string Play() Thread.Sleep(TimeSpan.FromSeconds(gen.PauseBetweenStarts)); } Log(string.Format("Prompted user for Instance {0}", (i + 2))); - //MessageBox.Show("Press OK when ready to launch instance " + (i + 2) + ".", "Nucleus - Prompt Between Instances", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly); Forms.Prompt prompt = new Forms.Prompt("Press OK when ready to launch instance " + (i + 2) + "."); prompt.ShowDialog(); } @@ -4946,7 +4907,6 @@ public string Play() Thread.Sleep(TimeSpan.FromSeconds(gen.PauseBetweenStarts)); } Log("Prompted user to install post hooks"); - //MessageBox.Show("Press OK when ready to install hooks and/or start sending fake messages.", "Nucleus - Prompt Between Instances", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly); Forms.Prompt prompt = new Forms.Prompt("Press OK when ready to install hooks and/or start sending fake messages."); prompt.ShowDialog(); foreach (Process aproc in attached) @@ -4978,9 +4938,6 @@ public string Play() { Log("Process found, " + process.ProcessName + " pid (" + process.Id + ")"); proc = process; - //data.AssignProcess(proc); - //player.ProcessData.AssignProcess(proc); - //attachedIds.RemoveAt(attachedIds.Count - 1); attached.Add(proc); attachedIds.Add(proc.Id); player.ProcessID = proc.Id; @@ -5029,7 +4986,7 @@ public string Play() } } } - + //Set up raw input window //if (player.IsRawKeyboard || player.IsRawMouse) { @@ -5117,12 +5074,7 @@ public string Play() if ((int)aproc.NucleusGetMainWindowHandle() > 0) { break; - } - //if (times == 199 && (int)aproc.NucleusGetMainWindowHandle() == 0) - //{ - // Log(string.Format("ERROR - ChangeWindowTitle could not find main window handle for {0} (pid:{1})", aproc.ProcessName, aproc.Id)); - // MessageBox.Show(string.Format("ChangeWindowTitle: Could not find main window handle for {0} (pid:{1})", aproc.ProcessName, aproc.Id), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - //} + } } } if ((int)aproc.NucleusGetMainWindowHandle() > 0) @@ -5239,9 +5191,7 @@ public string Play() //Window setup foreach (var window in RawInputManager.windows) { - var hWnd = window.hWnd; - - //Logger.WriteLine($"hWnd={hWnd}, mouse={window.MouseAttached}, kb={window.KeyboardAttached}"); + var hWnd = window.hWnd; //Borderlands 2 (and some other games) requires WM_INPUT to be sent to a window named DIEmWin, not the main hWnd. foreach (ProcessThread thread in Process.GetProcessById(window.pid).Threads) @@ -5252,8 +5202,7 @@ int WindowEnum(IntPtr _hWnd, int lParam) var threadId = WinApi.GetWindowThreadProcessId(_hWnd, out int pid); if (threadId == lParam) { - string windowText = WinApi.GetWindowText(_hWnd); - //Logger.WriteLine($" - thread id=0x{threadId:x}, _hWnd=0x{_hWnd:x}, window text={windowText}"); + string windowText = WinApi.GetWindowText(_hWnd); if (windowText != null && windowText.ToLower().Contains("DIEmWin".ToLower())) { @@ -5324,11 +5273,6 @@ int WindowEnum(IntPtr _hWnd, int lParam) gen.ProtoInput.OnInputUnlocked?.Invoke(); } - //if(statusForm != null) - //{ - // statusForm.Close(); - // Thread.Sleep(200); - //} if (gen.SetTopMostAtEnd) { if (!gen.PromptBetweenInstances) @@ -5341,7 +5285,7 @@ int WindowEnum(IntPtr _hWnd, int lParam) ProcessData data = p.ProcessData; - Log("Setting game window to top most"); + Log("Set game window to top most"); data.HWnd.TopMost = true; } } @@ -5496,23 +5440,11 @@ private void DeleteFiles(string linkFolder, int i) } indexOffset = 0; } - //else if (deleteSplit.Length <= 1) - //{ - // Log("Invalid # of parameters provided for: " + deleteLine + ", skipping"); - // continue; - //} string fullFilePath = Path.Combine(linkFolder, deleteSplit[1 - indexOffset]); - //FileInfo pathInfo = new FileInfo(fullFilePath); - //if (pathInfo.Attributes.HasFlag(FileAttributes.ReparsePoint)) - //{ - // Log("Skipping HexEditFileAddress, " + Path.GetFileName(renameSplit[1 - indexOffset]) + " is symlinked"); - // continue; - //} if (File.Exists(fullFilePath)) { - if (!gen.IgnoreDeleteFilesPrompt) { DialogResult dialogResult = MessageBox.Show("Are you sure you want to delete '" + fullFilePath + "'?", "Nucleus - Delete Files In Config Path", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); @@ -5552,12 +5484,6 @@ private void RenameOrMoveFiles(string linkFolder, int i) } string fullFilePath = Path.Combine(linkFolder, renameSplit[1 - indexOffset]); - //FileInfo pathInfo = new FileInfo(fullFilePath); - //if (pathInfo.Attributes.HasFlag(FileAttributes.ReparsePoint)) - //{ - // Log("Skipping HexEditFileAddress, " + Path.GetFileName(renameSplit[1 - indexOffset]) + " is symlinked"); - // continue; - //} if (File.Exists(fullFilePath)) { @@ -5581,7 +5507,6 @@ private void UseFlawlessWidescreen(int i) bool pcIs64 = Environment.Is64BitOperatingSystem; string pcArch = pcIs64 ? "x64" : "x86"; - string utilFolder = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "utils\\FlawlessWidescreen\\" + pcArch); if (gen.FlawlessWidescreenOverrideDisplay) @@ -5644,17 +5569,10 @@ private void UseFlawlessWidescreen(int i) startInfo.FileName = Path.Combine(utilFolder, "FlawlessWidescreen.exe"); Process util = Process.Start(startInfo); util.WaitForExit(); - // - //if (!Directory.Exists(fwGameFolder)) - //{ - // MessageBox.Show("Nucleus still unable to find folder. Skipping Flawless Widescreen setup.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - // return; - //} } if (Directory.Exists(fwGameFolder)) { - if (File.Exists(Path.Combine(fwGameFolder, "Dependencies\\Scripts\\" + gen.FlawlessWidescreen + ".lua"))) { List otextChanges = new List(); @@ -5739,15 +5657,11 @@ private void UseFlawlessWidescreen(int i) newNode.Attributes.SetNamedItem(attr); newNode["FriendlyName"].InnerText = newNode["FriendlyName"].InnerText + " - Nucleus Instance " + (i + 1); - - // append new node to DocumentElement, not XmlDocument - //doc.DocumentElement.AppendChild(newNode); doc.DocumentElement["Modules"].AppendChild(newNode); } doc.Save(path); - if (i == (numPlayers - 1)) { //bool appRunning = false; @@ -5760,22 +5674,16 @@ private void UseFlawlessWidescreen(int i) } } - //if (!appRunning) - //{ Log("Starting Flawless Widescreen process"); ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.UseShellExecute = true; startInfo.WorkingDirectory = utilFolder; startInfo.FileName = Path.Combine(utilFolder, "FlawlessWidescreen.exe"); Process.Start(startInfo); - //} + } Log("Flawless Widescreen setup complete"); - //if (util != null) - //{ - //ShowWindow(util.NucleusGetMainWindowHandle(), SW_MINIMIZE); - //} } } @@ -5877,8 +5785,6 @@ private void ProcessEnd() { List players = profile.PlayerData; - //int playerCount = 0; - Log("Starting process end changes"); for (int i = 0; i < players.Count; i++) @@ -5920,7 +5826,7 @@ private void ProcessEnd() if (gen.PromptBetweenInstancesEnd) { Log(string.Format("Prompted user for Instance {0}", (i + 1))); - //MessageBox.Show("Press OK when game instance " + (i + 1) + " has been launched and/or you wish to continue.", "Nucleus - Prompt Between Instances End", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly); + Forms.Prompt prompt = new Forms.Prompt("Press OK when game instance " + (i + 1) + " has been launched and/or you wish to continue."); prompt.ShowDialog(); } @@ -5975,8 +5881,6 @@ private void ProcessEnd() if (gen.HookFocus || gen.SetWindowHook || gen.HideCursor || gen.PreventWindowDeactivation || gen.SupportsMultipleKeyboardsAndMice) { Log("Injecting post-launch hooks for process " + proc.ProcessName + " (pid " + proc.Id + ")"); - //InjectDLLs(proc, window); - //Thread.Sleep(1000); if (gen.PreventWindowDeactivation && !isPrevent) { @@ -6020,14 +5924,11 @@ private void ProcessEnd() Thread.Sleep(1000); ChangeGameWindow(proc, players, i); - //playerIndex++; Thread.Sleep(1000); if (gen.KillMutexAtEnd) { - - //PlayerInfo before = players[i]; for (; ; ) { Thread.Sleep(1000); @@ -6069,10 +5970,8 @@ private void ProcessEnd() ResetWindows(players[i].ProcessData, players[i].MonitorBounds.X, players[i].MonitorBounds.Y, players[i].MonitorBounds.Width, players[i].MonitorBounds.Height, i + 1); } - //playerCount++; Thread.Sleep(3000); - if (gen.HideTaskbar && ini.IniReadValue("CustomLayout", "SplitDiv") != "True") { User32Util.HideTaskbar(); @@ -6105,8 +6004,6 @@ private void ProcessEnd() } } - - if (gen.FakeFocus) { Log("Start sending fake focus messages every 1000 ms"); @@ -6126,14 +6023,8 @@ private void ProcessEnd() } } } - private void ChangeGameWindow(Process proc, List players, int playerIndex) { - //Log(string.Format("Found process {0} (pid {1})", proc.ProcessName, proc.Id)); - //attached.Add(proc); - //attachedIds.Add(proc.Id); - //players[playerIndex].ProcessID = proc.Id; - var hwnd = WaitForProcWindowHandleNotZero(proc); Point loc = new Point(players[playerIndex].MonitorBounds.X, players[playerIndex].MonitorBounds.Y); @@ -6171,8 +6062,6 @@ private void ChangeGameWindow(Process proc, List players, int player lStyle &= ~User32_WS.WS_BORDER; } int resultCode = User32Interop.SetWindowLong(hwnd, User32_WS.GWL_STYLE, lStyle); - //Log($"TEMP: RESLT CODE {resultCode}"); - //Log($"TEMP2: last error {Marshal.GetLastWin32Error().ToString()}"); lStyle = User32Interop.GetWindowLong(hwnd, User32_WS.GWL_EXSTYLE); if (gen.ExtWindowStyleValues?.Length > 0) @@ -6198,8 +6087,6 @@ private void ChangeGameWindow(Process proc, List players, int player } int resultCode2 = User32Interop.SetWindowLong(hwnd, User32_WS.GWL_EXSTYLE, lStyle); - //Log($"TEMP: RESLT CODE {resultCode2}"); - //Log($"TEMP2: last error {Marshal.GetLastWin32Error().ToString()}"); User32Interop.SetWindowPos(hwnd, IntPtr.Zero, 0, 0, 0, 0, (uint)(PositioningFlags.SWP_FRAMECHANGED | PositioningFlags.SWP_NOMOVE | PositioningFlags.SWP_NOSIZE | PositioningFlags.SWP_NOZORDER | PositioningFlags.SWP_NOOWNERZORDER)); } @@ -6277,7 +6164,6 @@ private void ChangeGameWindow(Process proc, List players, int player WindowScrape.Static.HwndInterface.SetHwndPos(hwnd, loc.X, loc.Y); } - //User32Util.HideTaskbar(); if (!gen.NotTopMost) { Log("Setting this game window to top most"); @@ -6289,7 +6175,7 @@ public string GetLocalIP() { var dadada = GetBestInterface(BitConverter.ToUInt32(IPAddress.Parse("8.8.8.8").GetAddressBytes(), 0), out uint interfaceIndex); IPAddress xxxd = NetworkInterface.GetAllNetworkInterfaces() - .Where(netInterface => netInterface.GetIPProperties().GetIPv4Properties().Index == BitConverter.ToInt32(BitConverter.GetBytes(interfaceIndex), 0)).First().GetIPProperties().UnicastAddresses.Where(ipAdd => ipAdd.Address.AddressFamily == AddressFamily.InterNetwork).First().Address; + .Where(netInterface => netInterface.GetIPProperties().GetIPv4Properties().Index == BitConverter.ToInt32(BitConverter.GetBytes(interfaceIndex), 0)).First().GetIPProperties().UnicastAddresses.Where(ipAdd => ipAdd.Address.AddressFamily == AddressFamily.InterNetwork).First().Address; return xxxd.ToString(); } @@ -6403,12 +6289,6 @@ private void ChangeIPPerInstance(int i, string networkInterfaceOverride = null) { SetIP(iniNetworkInterface, ipNetwork + shostAddr, currentSubnetMask, currentGateway); } - - //if(isDynamicDns) - //{ - // SetDNS(iniNetworkInterface, false); - //} - //hostAddr++; } private bool SetIP(string networkInterfaceName, string ipAddress, string subnetMask, string gateway = null) @@ -6422,45 +6302,12 @@ private bool SetIP(string networkInterfaceName, string ipAddress, string subnetM if (!isDHCPenabled && currentIPaddress == ipAddress && currentSubnetMask == subnetMask) { - return true; // no change necessary + return true; } - //string dnsArg = string.Empty; - //if (dnsAddresses.Count > 0) - //{ - // for(int i=0;i < dnsAddresses.Count; i++) - // { - // if(i==0) - // { - // dnsArg += $";interface ip set dnsservers {networkInterfaceName} static {dnsAddresses[i]} primary"; - // } - // else - // { - // dnsArg += $";interface ip set dnsservers {networkInterfaceName} static {dnsAddresses[i]}"; - // } - // } - //} - - //string args = $"interface ip set address \"{networkInterfaceName}\" static {ipAddress} {subnetMask} " + (string.IsNullOrWhiteSpace(gateway) ? "" : $"{gateway} 1" + dnsArg); - - //var process = new Process - //{ - // StartInfo = new ProcessStartInfo("netsh", args) { Verb = "runas", UseShellExecute = false, RedirectStandardOutput = true } - //}; - - //process.Start(); - //string stdOut = process.StandardOutput.ReadToEnd(); - //Log("SetIP output " + stdOut); - //process.WaitForExit(); - //var successful = process.ExitCode == 0; - //process.Dispose(); - //return successful; - Process netsh = new Process(); netsh.StartInfo.FileName = "netsh"; netsh.StartInfo.RedirectStandardInput = true; - //netsh.StartInfo.RedirectStandardOutput = true; - //cmd.StartInfo.CreateNoWindow = true; netsh.StartInfo.UseShellExecute = false; netsh.StartInfo.Verb = "runas"; netsh.Start(); @@ -6484,15 +6331,6 @@ private bool SetIP(string networkInterfaceName, string ipAddress, string subnetM netsh.StandardInput.Flush(); netsh.StandardInput.Close(); - - //string stdOut = netsh.StandardOutput.ReadToEnd(); - //Log("SetIP output " + stdOut); - - //netsh.StandardOutput.Close(); - //netsh.WaitForExit(); - //netsh.Close(); - //Thread.Sleep(5000); - //netsh.Kill(); netsh.WaitForExit(); var successful = netsh.ExitCode == 0; netsh.Dispose(); @@ -6511,18 +6349,6 @@ private bool SetDHCP(string networkInterfaceName) return true; // no change necessary } - //string dnsArg = $";interface ip set dnsservers {networkInterfaceName} dhcp"; - - //var process = new Process - //{ - // StartInfo = new ProcessStartInfo("netsh", $"interface ip set address \"{networkInterfaceName}\" dhcp" + dnsArg) { Verb = "runas" } - //}; - //process.Start(); - //process.WaitForExit(); - //var successful = process.ExitCode == 0; - //process.Dispose(); - //return successful; - Process netsh = new Process(); netsh.StartInfo.FileName = "netsh"; netsh.StartInfo.RedirectStandardInput = true; @@ -6537,48 +6363,13 @@ private bool SetDHCP(string networkInterfaceName) netsh.StandardInput.Flush(); netsh.StandardInput.Close(); - - //string stdOut = netsh.StandardOutput.ReadToEnd(); - //Log("SetDHCP output " + stdOut); - - //netsh.StandardOutput.Close(); - //netsh.WaitForExit(); - //netsh.Close(); - //Thread.Sleep(5000); - //netsh.Kill(); netsh.WaitForExit(); var successful = netsh.ExitCode == 0; netsh.Dispose(); return successful; } - - //private bool SetDNS(string networkInterfaceName, bool useDhcp) - //{ - // var networkInterface = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(nw => nw.Name == networkInterfaceName); - // var ipProperties = networkInterface.GetIPProperties(); - // var isDHCPenabled = ipProperties.GetIPv4Properties().IsDhcpEnabled; - - // if (isDHCPenabled) - // return true; // no change necessary - - // string args = $"interface ip set dns \"{networkInterfaceName}\" static {dnsAddresses[0]}"; - // if (useDhcp) - // { - // args = $"interface ip set dns \"{networkInterfaceName}\" dhcp"; - // } - - // var process = new Process - // { - // StartInfo = new ProcessStartInfo("netsh", args) { Verb = "runas" } - // }; - // process.Start(); - // process.WaitForExit(); - // var successful = process.ExitCode == 0; - // process.Dispose(); - // return successful; - //} - + public void SelBtn_Click(object sender, EventArgs e) { Control control = (Control)sender; @@ -6661,8 +6452,6 @@ public void RefrshBtn_Click(object sender, EventArgs e) } } - - } } } @@ -6705,14 +6494,8 @@ private void InjectDLLs(Process proc, Window window, PlayerInfo player) bool is64 = EasyHook.RemoteHooking.IsX64Process(proc.Id); string currDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); //Directory.GetCurrentDirectory(); - bool windowNull = (window == null); - //using (StreamWriter writer = new StreamWriter("important.txt", true)) - //{ - // writer.WriteLine("aproc id: {0}, aproc procname: {1}, title: {2}, handle: {3}, handleint: {4}, bytefour: {5}, byteeight: {6}, datatosend[8]: {7}, datatosend[9]: {8}, intptr: {9}", proc.Id, proc.ProcessName, proc.MainWindowTitle, proc.NucleusGetMainWindowHandle(), (int)proc.NucleusGetMainWindowHandle(), BitConverter.ToUInt32(dataToSend, 0), BitConverter.ToUInt64(dataToSend, 0), dataToSend[8], dataToSend[9], intPtr); - //} - try { string injectorPath = Path.Combine(currDir, $"Nucleus.IJ{(is64 ? "x64" : "x86")}.exe"); @@ -6788,7 +6571,6 @@ private void InjectDLLs(Process proc, Window window, PlayerInfo player) Log(string.Format("ERROR - {0}", ex.Message)); } } - private void SendFocusMsgs() { List players = profile.PlayerData; @@ -6859,8 +6641,7 @@ private void SendFocusMsgs() continue; } else if (players[p].ProcessID == proc.Id) - { - //User32Interop.SendMessage(proc.NucleusGetMainWindowHandle(), (int) FocusMessages.WM_ACTIVATE, (IntPtr) 0x00000001, (IntPtr) proc.NucleusGetMainWindowHandle()); + { User32Interop.SendMessage(proc.NucleusGetMainWindowHandle(), (int)FocusMessages.WM_ACTIVATE, (IntPtr)0x00000002, IntPtr.Zero); break; } @@ -7038,7 +6819,6 @@ public void Update(double delayMS) } } - if (data.Status == 2) { @@ -7073,9 +6853,7 @@ public void Update(double delayMS) lStyle &= ~User32_WS.WS_BORDER; } int resultCode = User32Interop.SetWindowLong(data.HWnd.NativePtr, User32_WS.GWL_STYLE, lStyle); - //Log($"(Update) TEMP: RESLT CODE {resultCode}"); - //Log($"(Update) TEMP2: last error {Marshal.GetLastWin32Error().ToString()}"); - + lStyle = User32Interop.GetWindowLong(data.HWnd.NativePtr, User32_WS.GWL_EXSTYLE); if (gen.ExtWindowStyleValues?.Length > 0) @@ -7101,12 +6879,8 @@ public void Update(double delayMS) } int resultCode2 = User32Interop.SetWindowLong(data.HWnd.NativePtr, User32_WS.GWL_EXSTYLE, lStyle); - //Log($"(Update) TEMP: RESLT CODE {resultCode2}"); - //Log($"(Update) TEMP2: last error {Marshal.GetLastWin32Error().ToString()}"); - User32Interop.SetWindowPos(data.HWnd.NativePtr, IntPtr.Zero, 0, 0, 0, 0, (uint)(PositioningFlags.SWP_FRAMECHANGED | PositioningFlags.SWP_NOMOVE | PositioningFlags.SWP_NOSIZE | PositioningFlags.SWP_NOZORDER | PositioningFlags.SWP_NOOWNERZORDER)); - //User32Interop.SetForegroundWindow(data.HWnd.NativePtr); - //User32Interop.SetWindowPos(data.HWnd.NativePtr, new IntPtr(-2), 0, 0, 0, 0, (uint)(PositioningFlags.SWP_NOSIZE | PositioningFlags.SWP_NOMOVE)); - + + User32Interop.SetWindowPos(data.HWnd.NativePtr, IntPtr.Zero, 0, 0, 0, 0, (uint)(PositioningFlags.SWP_FRAMECHANGED | PositioningFlags.SWP_NOMOVE | PositioningFlags.SWP_NOSIZE | PositioningFlags.SWP_NOZORDER | PositioningFlags.SWP_NOOWNERZORDER)); } if (gen.EnableWindows) @@ -7127,35 +6901,13 @@ public void Update(double delayMS) WindowStyleChanges(data, i); } - - //User32Interop.SetWindowPos(data.HWnd.NativePtr, IntPtr.Zero, 0, 0, 0, 0, (uint)(PositioningFlags.SWP_NOSIZE | PositioningFlags.SWP_NOMOVE)); - data.Finished = true; - - Debug.WriteLine("State 2"); Log("Update State 2"); if (i == (players.Count - 1)) { - //last screen setuped - - //FormCollection fc = Application.OpenForms; - - //foreach (Form frm in fc) - //{ - // //iterate through - // if (frm.Name == "Nucleus Coop - Status") - // { - // statusForm.Close(); - // } - //} - //if (statusForm != null) - //{ - // statusForm.Close(); - //} - if (gen.LockMouse) { _cursorModule.SetActiveWindow(); @@ -7178,12 +6930,9 @@ public void Update(double delayMS) Log(string.Format("(Update) Repostioning game window for pid {0} to coords x:{1},y:{2}", data.Process.Id, data.Position.X, data.Position.Y)); data.HWnd.Location = data.Position; } - - } data.Status++; - //Debug.WriteLine("State 1"); Log("Update State 1"); if (gen.LockMouse) @@ -7308,7 +7057,6 @@ public void Update(double delayMS) data.Status++; - //Debug.WriteLine("State 0"); Log("Update State 0"); } } @@ -7335,11 +7083,7 @@ public void Update(double delayMS) Process pro = Process.GetProcessById(id); if (!attached.Contains(pro)) - { - //using (StreamWriter writer = new StreamWriter("important.txt", true)) - //{ - // writer.WriteLine("GotLauncher found process name: " + pro.ProcessName + " pid: " + pro.Id); - //} + { attached.Add(pro); attachedIds.Add(pro.Id); p.ProcessID = pro.Id; @@ -7369,10 +7113,6 @@ public void Update(double delayMS) if (!attachedIds.Contains(pro.Id)) { - //using (StreamWriter writer = new StreamWriter("important.txt", true)) - //{ - // writer.WriteLine("!GotLauncher found process name: " + pro.ProcessName + " pid: " + pro.Id); - //} attached.Add(pro); attachedIds.Add(pro.Id); p.ProcessID = pro.Id; @@ -7445,19 +7185,7 @@ private void Log(string logMessage) try { logMsg = logMessage; - //if(statusWinThread.IsAlive)//statusForm != null && statusLbl != null) - //{ - // statusForm.TopMost = true; - // statusForm.TopMost = false; - // statusForm.TopMost = true; - // statusLbl.Text = logMessage; - - // Application.DoEvents(); - - // WindowScrape.Static.HwndInterface.MakeTopMost(statusForm.Handle); - // statusForm.Refresh(); - //} - + if (ini.IniReadValue("Misc", "DebugLog") == "True") { using (StreamWriter writer = new StreamWriter("debug-log.txt", true)) @@ -7486,9 +7214,7 @@ private IntPtr WaitForProcWindowHandleNotZero(Process proc) if (times == 199 && (int)proc.NucleusGetMainWindowHandle() == 0) { - Log(string.Format( - "ERROR - WaitForProcWindowHandleNotZero could not find main window handle for {0} (pid {1})", - proc.ProcessName, proc.Id)); + Log(string.Format( "ERROR - WaitForProcWindowHandleNotZero could not find main window handle for {0} (pid {1})", proc.ProcessName, proc.Id)); } } } @@ -7560,7 +7286,6 @@ private string CheckFor45PlusVersion(int releaseKey) private void GoldbergLobbyConnect() { - //MessageBox.Show("Goldberg Lobby Connect: Press OK after you are hosting a game.", "Nucleus - Goldberg Lobby Connect", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly); Forms.Prompt prompt = new Forms.Prompt("Goldberg Lobby Connect: Press OK after you are hosting a game."); prompt.ShowDialog(); @@ -7585,10 +7310,8 @@ private void GoldbergLobbyConnect() catch (Exception ex) { MessageBox.Show(ex.Message); } - if (!string.IsNullOrEmpty(lobbyConnectArg)) { - //MessageBox.Show(lobbyConnectArg); Log("Goldberg Lobby Connect: Setting lobby ID to " + lobbyConnectArg.Substring(15)); } else @@ -7601,8 +7324,7 @@ private void GoldbergLobbyConnect() private void ResetWindows(ProcessData processData, int x, int y, int w, int h, int i) { - Log("Attempting to reposition, resize and strip borders for instance " + (i - 1) + $" - {processData.Process.ProcessName} (pid {processData.Process.Id})"); - //MessageBox.Show("Going to attempt to reposition and resize instance " + (i - 1)); + Log("Attempting to reposition, resize and strip borders for instance " + (i - 1) + $" - {processData.Process.ProcessName} (pid {processData.Process.Id})"); try { if (!gen.DontRemoveBorders) @@ -7635,8 +7357,6 @@ private void ResetWindows(ProcessData processData, int x, int y, int w, int h, i lStyle &= ~User32_WS.WS_BORDER; } int resultCode = User32Interop.SetWindowLong(processData.HWnd.NativePtr, User32_WS.GWL_STYLE, lStyle); - //Log($"RESET TEMP: RESLT CODE {resultCode}"); - //Log($"RESET TEMP2: last error {Marshal.GetLastWin32Error().ToString()}"); lStyle = User32Interop.GetWindowLong(processData.HWnd.NativePtr, User32_WS.GWL_EXSTYLE); @@ -7664,8 +7384,6 @@ private void ResetWindows(ProcessData processData, int x, int y, int w, int h, i int resultCode2 = User32Interop.SetWindowLong(processData.HWnd.NativePtr, User32_WS.GWL_EXSTYLE, lStyle); - //Log($"RESET TEMP: RESLT CODE {resultCode2}"); - //Log($"RESET TEMP2: last error {Marshal.GetLastWin32Error().ToString()}"); User32Interop.SetWindowPos(processData.HWnd.NativePtr, IntPtr.Zero, 0, 0, 0, 0, (uint)(PositioningFlags.SWP_FRAMECHANGED | PositioningFlags.SWP_NOMOVE | PositioningFlags.SWP_NOSIZE | PositioningFlags.SWP_NOZORDER | PositioningFlags.SWP_NOOWNERZORDER)); } @@ -7723,11 +7441,6 @@ private void CustomDllEnabled(GenericContext context, PlayerInfo player, Rectang { xdata = Properties.Resources.xinput1_3_a10; } - //else - //{ - // xdata = null; - // Log(string.Format("ERROR - Machine type {0} not implemented", GetDllMachineType(exePath))); - //} } if (context.Hook.XInputNames == null) @@ -7770,11 +7483,6 @@ private void CustomDllEnabled(GenericContext context, PlayerInfo player, Rectang } FileCheck(Path.Combine(instanceExeFolder, "ncoop.ini")); - //if (File.Exists(Path.Combine(instanceExeFolder, "ncoop.ini")) && !gen.SymlinkGame && !gen.HardlinkGame && !gen.HardcopyGame) - //{ - // Log($"ncoop.ini will be deleted upon ending session"); - // addedFiles.Add(Path.Combine(instanceExeFolder, "ncoop.ini")); - //} IniFile x360 = new IniFile(ncoopIni); x360.IniWriteValue("Options", "Log", "0"); @@ -7880,23 +7588,6 @@ private void CustomDllEnabled(GenericContext context, PlayerInfo player, Rectang x360.IniWriteValue("Options", "DInputGuid", player.GamepadGuid.ToString().ToUpper()); x360.IniWriteValue("Options", "DInputForceDisable", context.Hook.DInputForceDisable.ToString()); - //force feedback - //x360.IniWriteValue("Options", "ProductGUID", player.GamepadProductGuid.ToString()); - //x360.IniWriteValue("Options", "InstanceGUID", player.GamepadGuid.ToString()); - //x360.IniWriteValue("Options", "UseForceFeedback", "1"); - //x360.IniWriteValue("Options", "ForcePercent", "100"); - //x360.IniWriteValue("Options", "ForcesPassThrough", "1"); - //x360.IniWriteValue("Options", "PassThrough", "0"); - //x360.IniWriteValue("Options", "PassThroughIndex", "0"); - //x360.IniWriteValue("Options", "ControllerType", "1"); - //x360.IniWriteValue("Options", "SwapMotor", "0"); - //x360.IniWriteValue("Options", "FFBType", "0"); - //x360.IniWriteValue("Options", "LeftMotorPeriod", "120"); - //x360.IniWriteValue("Options", "LeftMotorStrength", "0"); - //x360.IniWriteValue("Options", "LeftMotorDirection", "0"); - //x360.IniWriteValue("Options", "RightMotorPeriod", "60"); - //x360.IniWriteValue("Options", "RightMotorStrength", "0"); - //x360.IniWriteValue("Options", "RightMotorDirection", "0"); Log("Custom DLL setup complete"); } @@ -7949,19 +7640,10 @@ private void CopyCustomUtils(int i, string linkFolder, bool setupDll) else //file { FileCheck(Path.Combine(linkFolder.TrimEnd('\\') + '\\' + utilPath, Path.GetFileName(utilName))); - //if (File.Exists(Path.Combine(linkFolder.TrimEnd('\\') + '\\' + utilPath, Path.GetFileName(utilName)))) - //{ - // File.Delete(Path.Combine(linkFolder.TrimEnd('\\') + '\\' + utilPath, Path.GetFileName(utilName))); - //} + Log("Copying " + utilName + " to " + "Instance" + i + "\\" + utilPath); File.Copy(Path.Combine(utilFolder, utilName), Path.Combine(linkFolder.TrimEnd('\\') + '\\' + utilPath, Path.GetFileName(utilName)), true); } - - //if (File.Exists(Path.Combine(linkFolder.TrimEnd('\\') + '\\' + utilPath, Path.GetFileName(utilName))) && !gen.SymlinkGame && !gen.HardlinkGame && !gen.HardcopyGame) - //{ - // Log($"{Path.GetFileName(utilName)} doesn't exist, will be deleted upon ending session"); - // addedFiles.Add(Path.Combine(linkFolder.TrimEnd('\\') + '\\' + utilPath, Path.GetFileName(utilName))); - //} } Log("Copying custom files complete"); } @@ -7976,46 +7658,7 @@ private void UseDirectX9Wrapper(bool setupDll) string ogFile = Path.Combine(instanceExeFolder, "d3d9.dll"); FileCheck(ogFile); - - - //if (!gen.SymlinkGame && !gen.HardlinkGame && !gen.HardcopyGame) - //{ - // if (File.Exists(ogFile)) - // { - // string fileBackup = Path.Combine(Path.GetDirectoryName(ogFile), Path.GetFileNameWithoutExtension(ogFile) + "_NUCLEUS_BACKUP" + Path.GetExtension(ogFile)); - // if (File.Exists(ogFile) && !File.Exists(fileBackup)) - // { - // try - // { - // File.Move(ogFile, fileBackup); - // backupFiles.Add(fileBackup); - // Log($"Backing up file {Path.GetFileName(ogFile)} as {Path.GetFileName(fileBackup)}"); - // } - // catch - // { } - // } - // } - // else - // { - // Log($"{Path.GetFileName(ogFile)} doesn't exist, will be deleted upon ending session"); - // addedFiles.Add(ogFile); - // } - //} - //else - //{ - // if (File.Exists(Path.Combine(instanceExeFolder, "d3d9.dll"))) - // { - // File.Delete(Path.Combine(instanceExeFolder, "d3d9.dll")); - // } - //} - - - File.Copy(Path.Combine(utilFolder, "d3d9.dll"), ogFile, true); - //if (File.Exists(Path.Combine(instanceExeFolder, "d3d9.dll"))) - //{ - // addedFiles.Add(Path.Combine(instanceExeFolder, "d3d9.dll")); - //} } } @@ -8027,11 +7670,6 @@ private void UseX360ce(int i, List players, PlayerInfo player, Gener string x360dll = ""; string utilFolder = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "utils\\x360ce"); - //else - //{ - // Log(string.Format("ERROR - Machine type {0} not implemented", GetDllMachineType(exePath))); - //} - string[] x360cedlls = { "xinput1_3.dll" }; if (gen.X360ceDll?.Length > 0) { @@ -8109,30 +7747,18 @@ private void UseX360ce(int i, List players, PlayerInfo player, Gener if (gen.SymlinkGame || gen.HardlinkGame || gen.HardcopyGame) { Log("Carrying over " + x360ceDllName + " from Instance0"); - //if (File.Exists(Path.Combine(instanceExeFolder, x360ceDllName))) - //{ - // File.Delete(Path.Combine(instanceExeFolder, x360ceDllName)); - //} FileCheck(Path.Combine(instanceExeFolder, x360ceDllName)); File.Copy(Path.Combine(instanceExeFolder.Substring(0, instanceExeFolder.LastIndexOf('\\') + 1) + "Instance0", x360ceDllName), Path.Combine(instanceExeFolder, x360ceDllName), true); } } - - //if (File.Exists(Path.Combine(instanceExeFolder, x360ceDllName))) - //{ - // addedFiles.Add(Path.Combine(instanceExeFolder, x360ceDllName)); - //} } } if (i > 0 && (gen.SymlinkGame || gen.HardlinkGame || gen.HardcopyGame)) { Log("Carrying over x360ce.ini from Instance0"); - //if (File.Exists(Path.Combine(instanceExeFolder, "x360ce.ini"))) - //{ - // File.Delete(Path.Combine(instanceExeFolder, "x360ce.ini")); - //} + FileCheck(Path.Combine(instanceExeFolder, "x360ce.ini")); File.Copy(Path.Combine(instanceExeFolder.Substring(0, instanceExeFolder.LastIndexOf('\\') + 1) + "Instance0", "x360ce.ini"), Path.Combine(instanceExeFolder, "x360ce.ini"), true); } @@ -8143,23 +7769,11 @@ private void UseX360ce(int i, List players, PlayerInfo player, Gener startInfo.UseShellExecute = true; startInfo.WorkingDirectory = instanceExeFolder; startInfo.FileName = Path.Combine(instanceExeFolder, x360exe); - //if (gen.RunAsAdmin) - //{ - // startInfo.Verb = "runas"; - //} Process util = Process.Start(startInfo); Log("Waiting until x360ce process is exited"); util.WaitForExit(); } - - //string[] change = new string[] { - // context.FindLineNumberInTextFile(Path.Combine(instanceExeFolder, "x360ce.ini"), "PAD1=", SearchType.StartsWith) + "|PAD1=" + context.x360ceGamepadGuid, - // context.FindLineNumberInTextFile(Path.Combine(instanceExeFolder, "x360ce.ini"), "PAD2=", SearchType.StartsWith) + "|PAD2=", - // context.FindLineNumberInTextFile(Path.Combine(instanceExeFolder, "x360ce.ini"), "PAD3=", SearchType.StartsWith) + "|PAD3=", - // context.FindLineNumberInTextFile(Path.Combine(instanceExeFolder, "x360ce.ini"), "PAD4=", SearchType.StartsWith) + "|PAD4=" - //}; - if (!File.Exists(Path.Combine(instanceExeFolder, "x360ce.ini"))) { Log("x360ce.ini has not been generated. Copying default x360ce.ini from utils"); @@ -8208,16 +7822,7 @@ private void UseX360ce(int i, List players, PlayerInfo player, Gener { Thread.Sleep(1000); Log("Implementing Xbox One controller fix"); - //change = new string[] { context.FindLineNumberInTextFile(Path.Combine(instanceExeFolder, "x360ce.ini"), "HookMode=1", SearchType.Full) + "|" + - // "HookLL=0\n" + - // "HookCOM=1\n" + - // "HookSA=0\n" + - // "HookWT=0\n" + - // "HOOKDI=1\n" + - // "HOOKPIDVID=1\n" + - // "HookName=0\n" + - // "HookMode=0\n" - //}; + textChanges.Clear(); textChanges.Add(context.FindLineNumberInTextFile(Path.Combine(instanceExeFolder, "x360ce.ini"), "HookMode=1", SearchType.Full) + "|" + "HookLL=0\n" + @@ -8245,19 +7850,6 @@ private void UseDInputBlocker(string garch, bool setupDll) { Log("Setting up DInput blocker"); string utilFolder = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "utils\\dinput8.blocker"); - //string arch = string.Empty; - //if (Is64Bit(exePath) == true) - //{ - // arch = "x64"; - //} - //else if (Is64Bit(exePath) == false) - //{ - // arch = "x86"; - //} - //else - //{ - // Log(string.Format("ERROR - Machine type {0} not implemented", GetDllMachineType(exePath))); - //} if (setupDll) { @@ -8265,13 +7857,8 @@ private void UseDInputBlocker(string garch, bool setupDll) string ogFile = Path.Combine(instanceExeFolder, "dinput8.dll"); FileCheck(ogFile); - Log("Copying dinput8.dll"); File.Copy(Path.Combine(utilFolder, garch + "\\dinput8.dll"), Path.Combine(instanceExeFolder, "dinput8.dll"), true); - //if (File.Exists(Path.Combine(instanceExeFolder, "dinput8.dll"))) - //{ - // addedFiles.Add(Path.Combine(instanceExeFolder, "dinput8.dll")); - //} } } @@ -8279,19 +7866,6 @@ private void UseDevReorder(string garch, PlayerInfo player, List pla { Log("Setting up Devreorder"); string utilFolder = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "utils\\devreorder"); - //string arch = string.Empty; - //if (Is64Bit(exePath) == true) - //{ - // arch = "x64"; - //} - //else if (Is64Bit(exePath) == false) - //{ - // arch = "x86"; - //} - //else - //{ - // Log(string.Format("ERROR - Machine type {0} not implemented", GetDllMachineType(exePath))); - //} if (setupDll) { @@ -8300,23 +7874,13 @@ private void UseDevReorder(string garch, PlayerInfo player, List pla Log("Copying dinput8.dll"); File.Copy(Path.Combine(utilFolder, garch + "\\dinput8.dll"), Path.Combine(instanceExeFolder, "dinput8.dll"), true); - //if (File.Exists(Path.Combine(instanceExeFolder, "dinput8.dll"))) - //{ - // addedFiles.Add(Path.Combine(instanceExeFolder, "dinput8.dll")); - //} } - //FileCheck(Path.Combine(instanceExeFolder, "devreorder.ini")); if (setupDll) { addedFiles.Add(Path.Combine(instanceExeFolder, "devreorder.ini")); } - //if (File.Exists(Path.Combine(instanceExeFolder, "devreorder.ini"))) - //{ - // File.Delete(Path.Combine(instanceExeFolder, "devreorder.ini")); - //} - List iniConfig = new List(); iniConfig.Add("[order]"); iniConfig.Add("{" + player.GamepadGuid + "}"); @@ -8332,10 +7896,6 @@ private void UseDevReorder(string garch, PlayerInfo player, List pla } Log("Writing devreorder.ini with the only visible gamepad guid: " + player.GamepadGuid); File.WriteAllLines(Path.Combine(instanceExeFolder, "devreorder.ini"), iniConfig.ToArray()); - //if (File.Exists(Path.Combine(instanceExeFolder, "devreorder.ini"))) - //{ - // addedFiles.Add(Path.Combine(instanceExeFolder, "devreorder.ini")); - //} Log("devreorder setup complete"); } @@ -8348,19 +7908,6 @@ private void SetupXInputPlusDll(string garch, PlayerInfo player, GenericContext utilFolder = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "utils\\XInputPlus\\old"); } - //string arch = string.Empty; - //if (Is64Bit(exePath) == true) - //{ - // arch = "x64"; - //} - //else if (Is64Bit(exePath) == false) - //{ - // arch = "x86"; - //} - //else - //{ - // Log(string.Format("ERROR - Machine type {0} not implemented", GetDllMachineType(exePath))); - //} if (setupDll) { foreach (string xinputDllName in gen.XInputPlusDll) @@ -8369,11 +7916,6 @@ private void SetupXInputPlusDll(string garch, PlayerInfo player, GenericContext FileCheck(Path.Combine(instanceExeFolder, xinputDllName)); try { - //if (File.Exists(Path.Combine(instanceExeFolder, xinputDllName))) - //{ - // File.Delete(Path.Combine(instanceExeFolder, xinputDllName)); - //} - if (xinputDllName.ToLower().StartsWith("dinput.")) { xinputDll = "Dinput.dl_"; @@ -8392,10 +7934,6 @@ private void SetupXInputPlusDll(string garch, PlayerInfo player, GenericContext Log("Using alternative copy method for " + xinputDll); CmdUtil.ExecuteCommand(utilFolder, out int exitCode, "copy \"" + Path.Combine(utilFolder, garch + "\\" + xinputDll) + "\" \"" + Path.Combine(instanceExeFolder, xinputDllName) + "\""); } - //if(File.Exists(Path.Combine(instanceExeFolder, xinputDllName))) - //{ - // addedFiles.Add(Path.Combine(instanceExeFolder, xinputDllName)); - //} } } @@ -8404,23 +7942,14 @@ private void SetupXInputPlusDll(string garch, PlayerInfo player, GenericContext List textChanges = new List(); if (!player.IsKeyboardPlayer || (player.IsKeyboardPlayer && gen.PlayersPerInstance <= 1)) { - ///FileCheck(Path.Combine(instanceExeFolder, "XInputPlus.ini")); if (setupDll) { addedFiles.Add(Path.Combine(instanceExeFolder, "XInputPlus.ini")); } - //if (File.Exists(Path.Combine(instanceExeFolder, "XInputPlus.ini"))) - //{ - // File.Delete(Path.Combine(instanceExeFolder, "XInputPlus.ini")); - //} + Log("Copying XInputPlus.ini"); File.Copy(Path.Combine(utilFolder, "XInputPlus.ini"), Path.Combine(instanceExeFolder, "XInputPlus.ini"), true); - //if (File.Exists(Path.Combine(instanceExeFolder, "XInputPlus.ini"))) - //{ - // addedFiles.Add(Path.Combine(instanceExeFolder, "XInputPlus.ini")); - //} - Log("Making changes to the lines in XInputPlus.ini; FileVersion and Controller values"); gen.XInputPlusDll = Array.ConvertAll(gen.XInputPlusDll, x => x.ToLower()); @@ -8473,7 +8002,6 @@ private void CreateSteamAppIdByExe(bool setupDll) addedFiles.Add(Path.Combine(instanceExeFolder, "steam_appid.txt")); } } - private void UseEACBypass(string linkFolder, bool setupDll) { if (setupDll) @@ -8647,7 +8175,6 @@ private void UseNemirtingasEpicEmu(string rootFolder, string linkFolder, bool Ep } } } - // Console.WriteLine("Player id => " + player.PlayerID); Log("Epic Emu setup complete"); } @@ -8773,7 +8300,6 @@ private void UseNemirtingasGalaxyEmu(string rootFolder, string linkFolder, int i } } - Log("Galaxy Emu setup complete"); } @@ -8786,7 +8312,6 @@ private void UseGoldberg(string rootFolder, string nucleusRootFolder, string lin string steamDllFolder = string.Empty; string instanceSteamDllFolder = string.Empty; string instanceSteamSettingsFolder = string.Empty; - //string instanceSteam_SettingsFolder = string.Empty; string prevSteamDllFilePath = string.Empty; @@ -8801,8 +8326,6 @@ private void UseGoldberg(string rootFolder, string nucleusRootFolder, string lin steam64Dll += "steam_api64.dll"; steamDll += "steam_api.dll"; - //if (setupDll) - //{ if (gen.GoldbergExperimentalSteamClient) { Log("Using Goldberg Experimental Steam Client"); @@ -8883,10 +8406,12 @@ private void UseGoldberg(string rootFolder, string nucleusRootFolder, string lin addedFiles.Add(Path.Combine(settingsFolder, "account_name.txt")); string lang = "english"; + if (ini.IniReadValue("Misc", "SteamLang") != "" && ini.IniReadValue("Misc", "SteamLang") != "Automatic") { gen.GoldbergLanguage = ini.IniReadValue("Misc", "SteamLang").ToLower(); } + if (gen.GoldbergLanguage?.Length > 0) { lang = gen.GoldbergLanguage; @@ -8913,7 +8438,6 @@ private void UseGoldberg(string rootFolder, string nucleusRootFolder, string lin tempRootFolder = tempRootFolder.Substring(0, tempRootFolder.Length - 1); } steamDllFolder = steamDllrootFolder.Remove(0, (tempRootFolder.Length)); - //instanceSteamDllFolder = Path.Combine(linkFolder, steamDllFolder); instanceSteamDllFolder = linkFolder.TrimEnd('\\') + "\\" + steamDllFolder.TrimStart('\\'); @@ -8926,13 +8450,6 @@ private void UseGoldberg(string rootFolder, string nucleusRootFolder, string lin instanceSteamSettingsFolder = Path.Combine(instanceSteamDllFolder, "settings"); } - //instanceSteam_SettingsFolder = Path.Combine(instanceSteamDllFolder, "steam_settings"); - - //if(Directory.Exists(instanceSteamSettingsFolder)) - //{ - // Directory.Delete(instanceSteamSettingsFolder); - //} - Directory.CreateDirectory(instanceSteamSettingsFolder); //Directory.CreateDirectory(instanceSteam_SettingsFolder); @@ -8947,18 +8464,13 @@ private void UseGoldberg(string rootFolder, string nucleusRootFolder, string lin if (gen.GoldbergExperimental && gen.GoldbergExperimentalRename) { FileCheck(Path.Combine(instanceSteamDllFolder, "cracksteam_api64.dll")); - //if (File.Exists(Path.Combine(instanceSteamDllFolder, "cracksteam_api64.dll"))) - //{ - // Log("cracksteam_api64.dll already exists in instance folder, deleting"); - // File.Delete(Path.Combine(instanceSteamDllFolder, "cracksteam_api64.dll")); - //} + Log("Renaming steam_api64.dll to cracksteam_api64.dll"); File.Move(Path.Combine(instanceSteamDllFolder, "steam_api64.dll"), Path.Combine(instanceSteamDllFolder, "cracksteam_api64.dll")); } else { - FileCheck(Path.Combine(instanceSteamDllFolder, "steam_api64.dll")); - //File.Delete(Path.Combine(instanceSteamDllFolder, "steam_api64.dll")); + FileCheck(Path.Combine(instanceSteamDllFolder, "steam_api64.dll")); } } Log("Placing Goldberg steam_api64.dll in instance steam dll folder"); @@ -8981,18 +8493,13 @@ private void UseGoldberg(string rootFolder, string nucleusRootFolder, string lin if (gen.GoldbergExperimental && gen.GoldbergExperimentalRename) { FileCheck(Path.Combine(instanceSteamDllFolder, "cracksteam_api.dll")); - //if (File.Exists(Path.Combine(instanceSteamDllFolder, "cracksteam_api.dll"))) - //{ - // Log("cracksteam_api.dll already exists in instance folder, deleting it and then renaming"); - // File.Delete(Path.Combine(instanceSteamDllFolder, "cracksteam_api.dll")); - //} + Log("Renaming steam_api.dll to cracksteam_api.dll"); File.Move(Path.Combine(instanceSteamDllFolder, "steam_api.dll"), Path.Combine(instanceSteamDllFolder, "cracksteam_api.dll")); } else { - FileCheck(Path.Combine(instanceSteamDllFolder, "steam_api.dll")); - //File.Delete(Path.Combine(instanceSteamDllFolder, "steam_api.dll")); + FileCheck(Path.Combine(instanceSteamDllFolder, "steam_api.dll")); } } Log("Placing Goldberg steam_api.dll in instance steam dll folder"); @@ -9009,24 +8516,15 @@ private void UseGoldberg(string rootFolder, string nucleusRootFolder, string lin if (gen.GoldbergExperimental) { FileCheck(Path.Combine(instanceSteamDllFolder, "steamclient.dll")); - //if (File.Exists(Path.Combine(instanceSteamDllFolder, "steamclient.dll"))) - //{ - // File.Delete(Path.Combine(instanceSteamDllFolder, "steamclient.dll")); - //} + Log("Placing Goldberg steamclient.dll in instance steam dll folder"); File.Copy(Path.Combine(utilFolder, "experimental\\steamclient.dll"), Path.Combine(instanceSteamDllFolder, "steamclient.dll"), true); - FileCheck(Path.Combine(instanceSteamDllFolder, "steamclient64.dll")); - //if (File.Exists(Path.Combine(instanceSteamDllFolder, "steamclient64.dll"))) - //{ - // File.Delete(Path.Combine(instanceSteamDllFolder, "steamclient64.dll")); - //} Log("Placing Goldberg steamclient64.dll in instance steam dll folder"); File.Copy(Path.Combine(utilFolder, "experimental\\steamclient64.dll"), Path.Combine(instanceSteamDllFolder, "steamclient64.dll"), true); } } - if (!string.IsNullOrEmpty(prevSteamDllFilePath)) { if (prevSteamDllFilePath == Path.GetDirectoryName(nameFile)) @@ -9035,36 +8533,25 @@ private void UseGoldberg(string rootFolder, string nucleusRootFolder, string lin } } Log("New steam api folder found"); - prevSteamDllFilePath = Path.GetDirectoryName(nameFile); - - //File.WriteAllText(Path.Combine(instanceSteam_SettingsFolder, "offline.txt"), ""); + prevSteamDllFilePath = Path.GetDirectoryName(nameFile); if (ini.IniReadValue("Misc", "UseNicksInGame") == "True" && !string.IsNullOrEmpty(player.Nickname)) - { - //FileCheck(Path.Combine(instanceSteamSettingsFolder, "account_name.txt")); + { if (setupDll) { addedFiles.Add(Path.Combine(instanceSteamSettingsFolder, "account_name.txt")); } - //if (File.Exists(Path.Combine(instanceSteamSettingsFolder, "account_name.txt"))) - //{ - // File.Delete(Path.Combine(instanceSteamSettingsFolder, "account_name.txt")); - //} + File.WriteAllText(Path.Combine(instanceSteamSettingsFolder, "account_name.txt"), player.Nickname); Log("Generating account_name.txt with nickname " + player.Nickname); } else - { - //FileCheck(Path.Combine(instanceSteamSettingsFolder, "account_name.txt")); + { if (setupDll) { addedFiles.Add(Path.Combine(instanceSteamSettingsFolder, "account_name.txt")); } - //if (File.Exists(Path.Combine(instanceSteamSettingsFolder, "account_name.txt"))) - //{ - // File.Delete(Path.Combine(instanceSteamSettingsFolder, "account_name.txt")); - //} - + if (ini.IniReadValue("Misc", "UseNicksInGame") == "True" && ini.IniReadValue("ControllerMapping", "Player_" + (i + 1)) != "") { File.WriteAllText(Path.Combine(instanceSteamSettingsFolder, "account_name.txt"), player.Nickname); @@ -9077,35 +8564,29 @@ private void UseGoldberg(string rootFolder, string nucleusRootFolder, string lin } } - long steamID = 0; + long steamID = random_steam_id + i; + + bool useSettingsSID = false; if (ini.IniReadValue("SteamIDs", "Player_" + (i + 1)) != "") { Log("Using steam ID from Nucleus settings "); steamID = Convert.ToInt64(ini.IniReadValue("SteamIDs", "Player_" + (i + 1)));//ToString? + useSettingsSID = true; } - else if (gen.PlayerSteamIDs != null) + + if (gen.PlayerSteamIDs != null && !useSettingsSID) { if (i < gen.PlayerSteamIDs.Length && !string.IsNullOrEmpty(gen.PlayerSteamIDs[i])) { - Log("Usingsteam ID from handler"); + Log("Using steam ID from handler"); steamID = long.Parse(gen.PlayerSteamIDs[i]); } } - else - { - Log("Using default Nucleus steam ID"); - steamID = random_steam_id + i; - } - - - + + Console.WriteLine(steamID); Log("Generating user_steam_id.txt with user steam ID " + (steamID).ToString()); - //if (File.Exists(Path. Combine(instanceSteamSettingsFolder, "user_steam_id.txt"))) - //{ - // File.Delete(Path.Combine(instanceSteamSettingsFolder, "user_steam_id.txt")); - //} - //FileCheck(Path.Combine(instanceSteamSettingsFolder)); + if (setupDll) { addedFiles.Add(Path.Combine(instanceSteamSettingsFolder, "user_steam_id.txt")); @@ -9129,12 +8610,6 @@ private void UseGoldberg(string rootFolder, string nucleusRootFolder, string lin lang = gen.GetSteamLanguage(); } Log("Generating language.txt with language set to " + lang); - //if (File.Exists(Path.Combine(instanceSteamSettingsFolder, "language.txt"))) - //{ - // File.Delete(Path.Combine(instanceSteamSettingsFolder, "language.txt")); - //} - //FileCheck(Path.Combine(instanceSteamSettingsFolder, "language.txt")); - //if (setupDll) addedFiles.Add(Path.Combine(instanceSteamSettingsFolder, "language.txt")); File.WriteAllText(Path.Combine(instanceSteamSettingsFolder, "language.txt"), lang); @@ -9145,23 +8620,10 @@ private void UseGoldberg(string rootFolder, string nucleusRootFolder, string lin else { Log("Generating steam_appid.txt using game steam ID " + gen.SteamID); - //if (File.Exists(Path.Combine(instanceSteamDllFolder, "steam_appid.txt"))) - //{ - // File.Delete(Path.Combine(instanceSteamDllFolder, "steam_appid.txt")); - //} - //FileCheck(Path.Combine(instanceSteamDllFolder, "steam_appid.txt")); - //if (setupDll) addedFiles.Add(Path.Combine(instanceSteamDllFolder, "steam_appid.txt")); File.WriteAllText(Path.Combine(instanceSteamDllFolder, "steam_appid.txt"), gen.SteamID); } - - //if (File.Exists(Path.Combine(instanceSteamDllFolder, "local_save.txt"))) - //{ - // File.Delete(Path.Combine(instanceSteamDllFolder, "local_save.txt")); - //} - //FileCheck(Path.Combine(instanceSteamDllFolder, "local_save.txt")); - //if (setupDll) addedFiles.Add(Path.Combine(instanceSteamDllFolder, "local_save.txt")); if (!gen.GoldbergNoLocalSave) { @@ -9170,42 +8632,21 @@ private void UseGoldberg(string rootFolder, string nucleusRootFolder, string lin if (gen.GoldbergNeedSteamInterface) { - //if (File.Exists(Path.Combine(instanceSteamDllFolder, "steam_interfaces.txt"))) - //{ - // Log("steam_interfaces.txt already exists in instance folder, deleting that file first then copying"); - // File.Delete(Path.Combine(instanceSteamDllFolder, "steam_interfaces.txt")); - //} - //FileCheck(Path.Combine(instanceSteamDllFolder, "steam_interfaces.txt")); - //if (setupDll) addedFiles.Add(Path.Combine(instanceSteamDllFolder, "steam_interfaces.txt")); if (File.Exists(Path.Combine(utilFolder, "tools\\steam_interfaces.txt"))) { Log("Found generated steam_interfaces.txt file in Nucleus util folder, copying this file"); - //if (File.Exists(Path.Combine(instanceSteamDllFolder, "steam_interfaces.txt"))) - //{ - // Log("steam_interfaces.txt already exists in instance folder, deleting that file first then copying"); - // File.Delete(Path.Combine(instanceSteamDllFolder, "steam_interfaces.txt")); - //} + File.Copy(Path.Combine(utilFolder, "tools\\steam_interfaces.txt"), Path.Combine(instanceSteamDllFolder, "steam_interfaces.txt"), true); } else if (File.Exists(Path.Combine(steamDllrootFolder, "steam_interfaces.txt"))) { Log("Found steam_interfaces.txt in original game folder, copying this file"); - //if (File.Exists(Path.Combine(instanceSteamDllFolder, "steam_interfaces.txt"))) - //{ - // Log("steam_interfaces.txt already exists in instance folder, deleting that file first then copying"); - // File.Delete(Path.Combine(instanceSteamDllFolder, "steam_interfaces.txt")); - //} File.Copy(Path.Combine(steamDllrootFolder, "steam_interfaces.txt"), Path.Combine(instanceSteamDllFolder, "steam_interfaces.txt"), true); } else if (File.Exists(nucleusRootFolder.TrimEnd('\\') + "\\handlers\\" + gen.JsFileName.Substring(0, gen.JsFileName.Length - 3) + "\\steam_interfaces.txt")) { Log("Found steam_interfaces.txt in Nucleus game folder"); - //if (File.Exists(Path.Combine(instanceSteamDllFolder, "steam_interfaces.txt"))) - //{ - // Log("steam_interfaces.txt already exists in instance folder, deleting that file first then copying"); - // File.Delete(Path.Combine(instanceSteamDllFolder, "steam_interfaces.txt")); - //} File.Copy(nucleusRootFolder.TrimEnd('\\') + "\\handlers\\" + gen.JsFileName.Substring(0, gen.JsFileName.Length - 3) + "\\steam_interfaces.txt", Path.Combine(instanceSteamDllFolder, "steam_interfaces.txt"), true); } else if (gen.OrigSteamDllPath?.Length > 0 && File.Exists(gen.OrigSteamDllPath)) @@ -9215,7 +8656,6 @@ private void UseGoldberg(string rootFolder, string nucleusRootFolder, string lin cmd.StartInfo.FileName = "cmd.exe"; cmd.StartInfo.RedirectStandardInput = true; cmd.StartInfo.RedirectStandardOutput = true; - //cmd.StartInfo.CreateNoWindow = true; cmd.StartInfo.UseShellExecute = false; cmd.StartInfo.WorkingDirectory = Path.Combine(utilFolder, "tools"); cmd.Start(); @@ -9224,13 +8664,6 @@ private void UseGoldberg(string rootFolder, string nucleusRootFolder, string lin cmd.StandardInput.Flush(); cmd.StandardInput.Close(); cmd.WaitForExit(); - //if (File.Exists(Path.Combine(instanceSteamDllFolder, "steam_interfaces.txt"))) - //{ - // Log("steam_interfaces.txt already exists in instance folder, deleting that file first then copying"); - // File.Delete(Path.Combine(instanceSteamDllFolder, "steam_interfaces.txt")); - //} - //FileCheck(Path.Combine(instanceSteamDllFolder, "steam_interfaces.txt")); - //if (setupDll) addedFiles.Add(Path.Combine(instanceSteamDllFolder, "steam_intterfaces.txt")); Log("Copying over generated steam_interfaces.txt"); File.Copy(Path.Combine(Path.Combine(utilFolder, "tools"), "steam_interfaces.txt"), Path.Combine(instanceSteamDllFolder, "steam_interfaces.txt"), true); @@ -9243,7 +8676,6 @@ private void UseGoldberg(string rootFolder, string nucleusRootFolder, string lin } else { - //MessageBox.Show(string.Format("Directories\n\nnucleusRootFolder={0}\n\nformatted js filename={1}\n\nsteamDllrootFolder={2}", nucleusRootFolder,gen.JsFileName.Substring(0, gen.JsFileName.Length - 3),steamDllrootFolder)); Log("Unable to locate steam_interfaces.txt or create one, skipping this file"); if (i == 0) { @@ -9260,7 +8692,6 @@ private void UseGoldberg(string rootFolder, string nucleusRootFolder, string lin MessageBox.Show("Goldberg was unable to locate a steam_api(64).dll file. The built-in Goldberg will not be used.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } - //} Log("Goldberg setup complete"); } @@ -9280,11 +8711,6 @@ private void UseSteamStubDRMPatcher(string garch, bool setupDll) FileCheck(Path.Combine(instanceExeFolder, "winmm.dll")); try { - - //if (File.Exists(Path.Combine(instanceExeFolder, "winmm.dll"))) - //{ - // File.Delete(Path.Combine(instanceExeFolder, "winmm.dll")); - //} Log(string.Format("Copying over winmm.dll ({0})", archToUse)); File.Copy(Path.Combine(utilFolder, archToUse + "\\winmm.dll"), Path.Combine(instanceExeFolder, "winmm.dll"), true); } @@ -9295,11 +8721,6 @@ private void UseSteamStubDRMPatcher(string garch, bool setupDll) Log("Using alternative copy method for winmm.dll"); CmdUtil.ExecuteCommand(utilFolder, out int exitCode, "copy \"" + Path.Combine(utilFolder, archToUse + "\\winmm.dll") + "\" \"" + Path.Combine(instanceExeFolder, "winmm.dll") + "\""); } - - //if (File.Exists(Path.Combine(instanceExeFolder, "winmm.dll"))) - //{ - // addedFiles.Add(Path.Combine(instanceExeFolder, "winmm.dll")); - //} } } @@ -9319,7 +8740,6 @@ private void HexEditFile(GenericContext context, int i, string linkFolder) if (File.Exists(Path.GetDirectoryName(fullPath) + "\\" + Path.GetFileNameWithoutExtension(fullPath) + "-ORIG" + Path.GetExtension(filePath))) { origExists = true; - //File.Delete(Path.Combine(Path.GetDirectoryName(exePath), Path.GetFileNameWithoutExtension(exePath) + "-ORIG.exe")); } if (origExists) @@ -9360,19 +8780,10 @@ private void HexEditAllFiles(GenericContext context, string linkFolder) string replacedStr = splitValues[2]; Log(string.Format("HexEditAllFiles - Patching file: {0}", filePath)); - //if(!File.Exists(Path.GetFileNameWithoutExtension(fullPath))) - //{ - // if (File.Exists(Path.Combine(rootFolder, filePath))) - // { - // File.Copy(Path.Combine(rootFolder, filePath), fullPath, true); - // } - //} - bool origExists = false; if (File.Exists(Path.GetDirectoryName(fullPath) + "\\" + Path.GetFileNameWithoutExtension(fullPath) + "-ORIG" + Path.GetExtension(filePath))) { origExists = true; - //File.Delete(Path.Combine(Path.GetDirectoryName(exePath), Path.GetFileNameWithoutExtension(exePath) + "-ORIG.exe")); } if (origExists) @@ -9402,19 +8813,15 @@ private void HexEditAllFiles(GenericContext context, string linkFolder) private void HexEditExe(GenericContext context, int i) { - //foreach (string asciiValues in gen.HexEditExe) - //{ Log("HexEditExe - Patching individual executable"); bool origExists = false; if (File.Exists(Path.Combine(Path.GetDirectoryName(exePath), Path.GetFileNameWithoutExtension(exePath) + "-ORIG.exe"))) { origExists = true; - //File.Delete(Path.Combine(Path.GetDirectoryName(exePath), Path.GetFileNameWithoutExtension(exePath) + "-ORIG.exe")); } if (origExists) { - string[] splitValues = gen.HexEditExe[i].Split('|'); if (splitValues.Length == 2) { @@ -9436,11 +8843,9 @@ private void HexEditExe(GenericContext context, int i) Log("Invalid # of parameters provided for: " + gen.HexEditFile[i] + ", skipping"); } } - } else { - string[] splitValues = gen.HexEditExe[i].Split('|'); if (splitValues.Length == 2) { @@ -9461,9 +8866,7 @@ private void HexEditExe(GenericContext context, int i) } } } - Log("Patching executable complete"); - //} } private void HexEditAllExes(GenericContext context, int i) @@ -9474,15 +8877,12 @@ private void HexEditAllExes(GenericContext context, int i) if (File.Exists(Path.Combine(Path.GetDirectoryName(exePath), Path.GetFileNameWithoutExtension(exePath) + "-ORIG.exe"))) { origExists = true; - //File.Delete(Path.Combine(Path.GetDirectoryName(exePath), Path.GetFileNameWithoutExtension(exePath) + "-ORIG.exe")); } foreach (string asciiValues in gen.HexEditAllExes) { if (origExists) { - - string[] splitValues = asciiValues.Split('|'); if (splitValues.Length == 2) { @@ -9500,8 +8900,6 @@ private void HexEditAllExes(GenericContext context, int i) } else { - - string[] splitValues = asciiValues.Split('|'); if (splitValues.Length == 2) { @@ -9515,13 +8913,6 @@ private void HexEditAllExes(GenericContext context, int i) Log("Invalid # of parameters provided for: " + asciiValues + ", skipping"); } } - - //File.Move(exePath, Path.Combine(Path.GetDirectoryName(exePath), Path.GetFileNameWithoutExtension(exePath) + "-ORIG.exe")); - //string[] splitValues = asciiValues.Split('|'); - //if (splitValues.Length > 1) - //{ - // context.PatchFile(exePath.Substring(0, exePath.Length - 4) + "-ORIG.exe", exePath, splitValues[0], splitValues[1]); - //} } Log("Patching executable complete"); } @@ -9570,20 +8961,6 @@ private void HexEditExeAddress(string exePath, int i) continue; } - //bool origExists = false; - //string exeSuffix = "-ORIG.exe"; - //if (File.Exists(Path.Combine(Path.GetDirectoryName(exePath), Path.GetFileNameWithoutExtension(exePath) + "-ORIG.exe"))) - //{ - // origExists = true; - // exeSuffix = "-TEMP.exe"; - //} - - //if(File.Exists(exePath)) - //{ - // Log(string.Format("Renaming original executable {0} to {1}", Path.GetFileName(exePath), Path.GetFileNameWithoutExtension(exePath) + exeSuffix)); - // File.Move(exePath, Path.Combine(Path.GetDirectoryName(exePath), Path.GetFileNameWithoutExtension(exePath) + exeSuffix)); - //} - Log(string.Format("Bytes at address '{0}' to be replaced with '{1}'", hexSplit[1 - indexOffset], hexSplit[2 - indexOffset])); List bytesConv = new List(); for (int s = 0; s < hexSplit[2 - indexOffset].Length; s += 2) @@ -9597,19 +8974,11 @@ private void HexEditExeAddress(string exePath, int i) stream.Position = long.Parse(hexSplit[1 - indexOffset], NumberStyles.HexNumber); stream.Write(bArray, 0, bArray.Length); } - - //if(origExists) - //{ - // Log(string.Format("Deleting temporary executable {0}", Path.GetFileNameWithoutExtension(exePath) + "-TEMP.exe")); - // File.Delete(Path.Combine(Path.GetDirectoryName(exePath), Path.GetFileNameWithoutExtension(exePath) + "-TEMP.exe")); - //} } } private void HexEditFileAddress(string linkFolder, int i) { - - foreach (string hexSplitLine in gen.HexEditFileAddress) { string[] hexSplit = hexSplitLine.Split('|'); @@ -9636,20 +9005,6 @@ private void HexEditFileAddress(string linkFolder, int i) continue; } - //bool origExists = false; - //string exeSuffix = "-ORIG.exe"; - //if (File.Exists(Path.Combine(Path.GetDirectoryName(exePath), Path.GetFileNameWithoutExtension(exePath) + "-ORIG.exe"))) - //{ - // origExists = true; - // exeSuffix = "-TEMP.exe"; - //} - - //if(File.Exists(exePath)) - //{ - // Log(string.Format("Renaming original executable {0} to {1}", Path.GetFileName(exePath), Path.GetFileNameWithoutExtension(exePath) + exeSuffix)); - // File.Move(exePath, Path.Combine(Path.GetDirectoryName(exePath), Path.GetFileNameWithoutExtension(exePath) + exeSuffix)); - //} - if (File.Exists(fullFilePath)) { if (!gen.SymlinkGame && !gen.HardlinkGame && !gen.HardcopyGame) @@ -9687,18 +9042,11 @@ private void HexEditFileAddress(string linkFolder, int i) { Log("ERROR - Could not find file: " + fullFilePath + " to patch"); } - - //if(origExists) - //{ - // Log(string.Format("Deleting temporary executable {0}", Path.GetFileNameWithoutExtension(exePath) + "-TEMP.exe")); - // File.Delete(Path.Combine(Path.GetDirectoryName(exePath), Path.GetFileNameWithoutExtension(exePath) + "-TEMP.exe")); - //} } } private void UserProfileConfigCopy(PlayerInfo player) { - //UserProfileConfigPath = gen.UserProfileConfigPath; string nucConfigPath = Path.Combine($@"{NucleusEnvironmentRoot}\NucleusCoop\{player.Nickname}\", gen.UserProfileConfigPath); string realConfigPath = Path.Combine(NucleusEnvironmentRoot, gen.UserProfileConfigPath); if ((!Directory.Exists(nucConfigPath) && Directory.Exists(realConfigPath)) || (Directory.Exists(realConfigPath) && gen.ForceUserProfileConfigCopy)) @@ -9720,7 +9068,6 @@ private void UserProfileConfigCopy(PlayerInfo player) } catch { - //Log("ERROR - " + ex.Message); Log("Using alternative copy method for " + file_name); CmdUtil.ExecuteCommand(Path.GetDirectoryName(Path.Combine(nucConfigPath, file_name.Substring(realConfigPath.Length + 1))), out int exitCode, "copy \"" + file_name + "\" \"" + Path.Combine(nucConfigPath, file_name.Substring(realConfigPath.Length + 1)) + "\"", false); } @@ -9730,7 +9077,6 @@ private void UserProfileConfigCopy(PlayerInfo player) private void UserProfileSaveCopy(PlayerInfo player) { - //UserProfileSavePath = gen.UserProfileSavePath; string nucSavePath = Path.Combine($@"{NucleusEnvironmentRoot}\NucleusCoop\{player.Nickname}\", gen.UserProfileSavePath); string realSavePath = Path.Combine(NucleusEnvironmentRoot, gen.UserProfileSavePath); if ((!Directory.Exists(nucSavePath) && Directory.Exists(realSavePath)) || (Directory.Exists(realSavePath) && gen.ForceUserProfileSaveCopy)) @@ -9762,7 +9108,6 @@ private void UserProfileSaveCopy(PlayerInfo player) private void DocumentsConfigCopy(PlayerInfo player) { - //UserProfileConfigPath = gen.UserProfileConfigPath; string nucConfigPath = Path.Combine($@"{Path.GetDirectoryName(DocumentsRoot)}\NucleusCoop\{player.Nickname}\Documents\", gen.DocumentsConfigPath); string realConfigPath = Path.Combine(DocumentsRoot, gen.DocumentsConfigPath); if ((!Directory.Exists(nucConfigPath) && Directory.Exists(realConfigPath)) || (Directory.Exists(realConfigPath) && gen.ForceDocumentsConfigCopy)) @@ -9794,7 +9139,6 @@ private void DocumentsConfigCopy(PlayerInfo player) private void DocumentsSaveCopy(PlayerInfo player) { - //DocumentsSavePath = gen.DocumentsSavePath; string nucSavePath = Path.Combine($@"{Path.GetDirectoryName(DocumentsRoot)}\NucleusCoop\{player.Nickname}\Documents\", gen.DocumentsSavePath); string realSavePath = Path.Combine(DocumentsRoot, gen.DocumentsSavePath); if ((!Directory.Exists(nucSavePath) && Directory.Exists(realSavePath)) || (Directory.Exists(realSavePath) && gen.ForceDocumentsSaveCopy)) @@ -9816,7 +9160,6 @@ private void DocumentsSaveCopy(PlayerInfo player) } catch { - //Log("ERROR - " + ex.Message); Log("Using alternative copy method for " + file_name); CmdUtil.ExecuteCommand(Path.GetDirectoryName(Path.Combine(nucSavePath, file_name.Substring(realSavePath.Length + 1))), out int exitCode, "copy \"" + file_name + "\" \"" + Path.Combine(nucSavePath, file_name.Substring(realSavePath.Length + 1)) + "\"", false); } @@ -9856,7 +9199,6 @@ private void ChangeExe(int i) } } } - } public string GetUserSID(string userName) @@ -9947,7 +9289,6 @@ void ExportRegistry(string strKey, string filepath) } catch (Exception) { - // handle exception } } @@ -10002,15 +9343,6 @@ public void SwitchProcessTo(string deviceId, ERole role, EDataFlow flow, uint pr ComThread.Invoke((() => { - //var currentEndpoint = roles.Select(eRole => ExtendPolicyClient.GetDefaultEndPoint(flow, eRole, processId)).FirstOrDefault(endpoint => !string.IsNullOrEmpty(endpoint)); - ////var enumerator = new MMDeviceEnumerator(); - ////var currentEndpoint = enumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Console); - //if (deviceId.Equals(currentEndpoint)) - //{ - // LogManager.Log($"Default endpoint for {processId} already {deviceId}"); - // return; - //} - ExtendPolicyClient.SetDefaultEndPoint(deviceId, flow, roles, processId); })); } @@ -10105,7 +9437,6 @@ protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQu internal static class ComThread { private static bool InvokeRequired => Thread.CurrentThread.ManagedThreadId != Scheduler.ThreadId; - private static ComTaskScheduler Scheduler { get; } = new ComTaskScheduler(); /// @@ -10248,7 +9579,6 @@ internal class ExtendedPolicyClient private const string MMDEVAPI_TOKEN = @"\\?\SWD#MMDEVAPI#"; private IAudioPolicyConfigFactory _sharedPolicyConfig; - private IAudioPolicyConfigFactory PolicyConfig { get diff --git a/Master/NucleusGaming/Coop/Generic/GenericGameInfo.cs b/Master/NucleusGaming/Coop/Generic/GenericGameInfo.cs index 7abb5df3..fd7dc059 100644 --- a/Master/NucleusGaming/Coop/Generic/GenericGameInfo.cs +++ b/Master/NucleusGaming/Coop/Generic/GenericGameInfo.cs @@ -266,8 +266,8 @@ public void AddOption(string name, string desc, string key, object value) public string ForceGameArch; public string[] SSEAdditionalLines; public string[] DeleteOnClose; - - + public int SteamlessTiming = 2500; + public bool KeepEditedRegKeys; // -- From USS //Effectively a switch for all of USS features public bool SupportsMultipleKeyboardsAndMice; @@ -288,7 +288,7 @@ public void AddOption(string name, string desc, string key, object value) public bool HookReRegisterRawInputKeyboard = true; public bool InjectHookXinput = false; public bool InjectDinputToXinputTranslation = false; - + //Not hooks public bool SendNormalMouseInput = true; public bool SendNormalKeyboardInput = true; @@ -302,8 +302,9 @@ public void AddOption(string name, string desc, string key, object value) public bool PreventGameFocus = false; public int LockInputToggleKey = 0x23;//End by default. Keys: https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes public bool ForceEnvironmentUse; - public bool ForceLauncherExeIgnoreFileCheck; - + public bool ForceLauncherExeIgnoreFileCheck; + public bool UseSteamless = false; + public string SteamlessArgs; // Proto Input public ProtoInputOptions ProtoInput = new ProtoInputOptions(); public bool LockInputSuspendsExplorer = false; @@ -320,10 +321,10 @@ public GenericGameInfo(string fileName, string folderPath, Stream str) { while (!sr.EndOfStream) { - + string line = sr.ReadLine(); { - js += "\r\n" + line + "\r\n"; + js += "\r\n" + line + "\r\n"; } } } @@ -347,7 +348,7 @@ public GenericGameInfo(string fileName, string folderPath, Stream str) string splited = lineSplit[0]; string[] getNum = splited.Split(' '); int numLine = Convert.ToInt32(getNum[1]); - MessageBox.Show(string.Format("There is an error in the game handler {0}. The game this handler is for will not appear in the list. If the issue has been fixed, please try re-adding the game.\n\nCommon errors include:\n- A syntax error (such as a \',\' \';\' or \']\' missing)\n- Another handler has this GUID (must be unique!)\n- Code is not in the right place or format (for example: methods using Context must be within the Game.Play function)\n\n{1} {2}", fileName,"", "Error at line: " ) + numLine / 2, "Error in handler", MessageBoxButtons.OK, MessageBoxIcon.Information); + MessageBox.Show(string.Format("There is an error in the game handler {0}. The game this handler is for will not appear in the list. If the issue has been fixed, please try re-adding the game.\n\nCommon errors include:\n- A syntax error (such as a \',\' \';\' or \']\' missing)\n- Another handler has this GUID (must be unique!)\n- Code is not in the right place or format (for example: methods using Context must be within the Game.Play function)\n\n{1} {2}", fileName, "", "Error at line: ") + numLine / 2, "Error in handler", MessageBoxButtons.OK, MessageBoxIcon.Information); }); } @@ -364,7 +365,7 @@ public GenericGameInfo(string fileName, string folderPath, Stream str) public CustomStep ShowOptionAsStep(string optionKey, bool required, string title) { GameOption option = Options.First(c => c.Key == optionKey); - option.Hidden = true; + option.Hidden = true; CustomStep step = new CustomStep { @@ -456,39 +457,39 @@ public GenericContext CreateContext(GameProfile profile, PlayerInfo info, Generi } private string EpicLang; - + public string GetEpicLanguage() { IniFile ini = new IniFile(Path.Combine(Directory.GetCurrentDirectory(), "Settings.ini")); IDictionary epiclangs = new Dictionary(); - epiclangs.Add("Arabic", "ar"); - epiclangs.Add("Brazilian", "pt-BR"); - epiclangs.Add("Bulgarian", "bg"); - epiclangs.Add("Chinese", "zh"); - epiclangs.Add("Czech", "cs"); - epiclangs.Add("Danish", "da"); - epiclangs.Add("Dutch", "nl"); - epiclangs.Add("English", "en"); - epiclangs.Add("Finnish", "fi"); - epiclangs.Add("French", "fr"); - epiclangs.Add("German", "de"); - epiclangs.Add("Greek", "el"); - epiclangs.Add("Hungarian", "hu"); - epiclangs.Add("Italian", "it"); - epiclangs.Add("Japanese", "ja"); - epiclangs.Add("Koreana", "ko"); - epiclangs.Add("Norwegian", "no"); - epiclangs.Add("Polish", "pl"); - epiclangs.Add("Portuguese", "pt"); - epiclangs.Add("Romanian", "ro"); - epiclangs.Add("Russian", "ru"); - epiclangs.Add("Spanish", "es"); - epiclangs.Add("Swedish", "sv"); - epiclangs.Add("Thai", "th"); - epiclangs.Add("Turkish", "tr"); - epiclangs.Add("Ukrainian", "uk"); - + epiclangs.Add("Arabic", "ar"); + epiclangs.Add("Brazilian", "pt-BR"); + epiclangs.Add("Bulgarian", "bg"); + epiclangs.Add("Chinese", "zh"); + epiclangs.Add("Czech", "cs"); + epiclangs.Add("Danish", "da"); + epiclangs.Add("Dutch", "nl"); + epiclangs.Add("English", "en"); + epiclangs.Add("Finnish", "fi"); + epiclangs.Add("French", "fr"); + epiclangs.Add("German", "de"); + epiclangs.Add("Greek", "el"); + epiclangs.Add("Hungarian", "hu"); + epiclangs.Add("Italian", "it"); + epiclangs.Add("Japanese", "ja"); + epiclangs.Add("Koreana", "ko"); + epiclangs.Add("Norwegian", "no"); + epiclangs.Add("Polish", "pl"); + epiclangs.Add("Portuguese", "pt"); + epiclangs.Add("Romanian", "ro"); + epiclangs.Add("Russian", "ru"); + epiclangs.Add("Spanish", "es"); + epiclangs.Add("Swedish", "sv"); + epiclangs.Add("Thai", "th"); + epiclangs.Add("Turkish", "tr"); + epiclangs.Add("Ukrainian", "uk"); + foreach (KeyValuePair lang in epiclangs) { if (lang.Key == ini.IniReadValue("Misc", "EpicLang")) diff --git a/Master/NucleusGaming/Coop/Generic/ProcessPicker.cs b/Master/NucleusGaming/Coop/Generic/ProcessPicker.cs index 3cd914b1..47a8187f 100644 --- a/Master/NucleusGaming/Coop/Generic/ProcessPicker.cs +++ b/Master/NucleusGaming/Coop/Generic/ProcessPicker.cs @@ -7,7 +7,6 @@ namespace Nucleus.Gaming.Coop.Generic { public partial class ProcessPicker : Form, IDynamicSized { - private float oldScale; public ProcessPicker() @@ -31,6 +30,7 @@ public void UpdateSize(float scale) } if (!scaled) { + Height *= (int)scale; oldScale = scale; scaled = true; } @@ -52,8 +52,6 @@ public void ScaleList() } } } - - } } diff --git a/Master/NucleusGaming/Coop/InputManagement/Logger.cs b/Master/NucleusGaming/Coop/InputManagement/Logger.cs index d1ee3ff2..2c6cb8de 100644 --- a/Master/NucleusGaming/Coop/InputManagement/Logger.cs +++ b/Master/NucleusGaming/Coop/InputManagement/Logger.cs @@ -1,4 +1,8 @@ -namespace Nucleus.Gaming.Coop.InputManagement.Logging +using System; +using System.Diagnostics; +using System.IO; + +namespace Nucleus.Gaming.Coop.InputManagement.Logging { internal static class Logger { diff --git a/Master/NucleusGaming/Globals.cs b/Master/NucleusGaming/Globals.cs index 7ef49699..0f048982 100644 --- a/Master/NucleusGaming/Globals.cs +++ b/Master/NucleusGaming/Globals.cs @@ -2,6 +2,6 @@ { public static class Globals { - public const double Version = 2.1; + public const string Version = "2.1.1"; } } diff --git a/Master/NucleusGaming/New/PositionsControl.cs b/Master/NucleusGaming/New/PositionsControl.cs index 1ae74cb6..e3028ec0 100644 --- a/Master/NucleusGaming/New/PositionsControl.cs +++ b/Master/NucleusGaming/New/PositionsControl.cs @@ -78,16 +78,11 @@ public class PositionsControl : UserInputControl, IDynamicSized public PictureBox instruction; private PictureBox instructionImg; - private PictureBox inputPic1; - private PictureBox inputPic2; - private PictureBox inputPic3; - private PictureBox inputPic4; private ImageAttributes flashImageAttributes; private Bitmap instructionCloseImg; private Bitmap instructionOpenImg; - private Bitmap xinputPic; private Bitmap dinputPic; private Bitmap keyboardPic; @@ -104,14 +99,7 @@ public class PositionsControl : UserInputControl, IDynamicSized private Bitmap players6; private Bitmap players8; private Bitmap players16; - private Bitmap customLayout; - private Bitmap k_Icon; - private Bitmap xinputGamepad_Icon; - private Bitmap dinputGamepad_Icon; - - private Color otherTextsColor; - private Color handlerNoteZoomFontColor; private Brush[] colors; private SolidBrush myBrush; @@ -119,7 +107,7 @@ public class PositionsControl : UserInputControl, IDynamicSized private Pen PositionScreenPen; public RichTextBox handlerNoteZoom; - private Label inputsIconsDesc; + public Panel textZoomContainer; private string customFont; public override string Title => "Position Players"; @@ -130,17 +118,13 @@ public PositionsControl() } private void Initialize() - { - + { string ChoosenTheme = ini.IniReadValue("Theme", "Theme"); IniFile theme = new IniFile(Path.Combine(Directory.GetCurrentDirectory() + "\\gui\\theme\\" + ChoosenTheme, "theme.ini")); string themePath = Path.Combine(Application.StartupPath, @"gui\theme\" + ChoosenTheme); string[] rgb_PositionControlsFontColor = theme.IniReadValue("Colors", "SetupScreenFont").Split(','); string[] rgb_PositionScreenColor = theme.IniReadValue("Colors", "SetupScreenBorder").Split(','); - string[] rgb_PositionPlayerScreenColor = theme.IniReadValue("Colors", "SetupScreenPlayerBorder").Split(','); - string[] rgb_handlerNoteZoomFontColor = theme.IniReadValue("Colors", "HandlerNoteMagnifierFont").Split(','); - handlerNoteZoomFontColor = (Color.FromArgb(Convert.ToInt32(rgb_handlerNoteZoomFontColor[0]), Convert.ToInt32(rgb_handlerNoteZoomFontColor[1]), Convert.ToInt32(rgb_handlerNoteZoomFontColor[2]))); - otherTextsColor = (Color.FromArgb(Convert.ToInt32(rgb_PositionControlsFontColor[0]), Convert.ToInt32(rgb_PositionControlsFontColor[1]), Convert.ToInt32(rgb_PositionControlsFontColor[2]))); + string[] rgb_PositionPlayerScreenColor = theme.IniReadValue("Colors", "SetupScreenPlayerBorder").Split(','); controllerIdentification = Convert.ToBoolean(theme.IniReadValue("Misc", "ControllerIdentificationOn")); UseSetupScreenBorder = Convert.ToBoolean(theme.IniReadValue("Misc", "UseSetupScreenBorder")); UseLayoutSelectionBorder = Convert.ToBoolean(theme.IniReadValue("Misc", "UseLayoutSelectionBorder")); @@ -192,9 +176,6 @@ private void Initialize() players8 = new Bitmap(themePath + "\\8players.png"); players16 = new Bitmap(themePath + "\\16players.png"); customLayout = new Bitmap(themePath + "\\customLayout.png"); - k_Icon = new Bitmap(themePath + "\\keyboard_icon.png"); - xinputGamepad_Icon = new Bitmap(themePath + "\\xinput_icon.png"); - dinputGamepad_Icon = new Bitmap(themePath + "\\dinput_icon.png"); instruction = new PictureBox();//using a button cause focus issues instruction.Anchor = AnchorStyles.Top | AnchorStyles.Right; @@ -206,48 +187,7 @@ private void Initialize() instruction.BackgroundImageLayout = ImageLayout.Stretch; instruction.Cursor = Cursors.Hand; instruction.Click += new EventHandler(this.instruction_Click); - - this.MouseEnter += inputIcons_MouseEnter; - - inputPic1 = new PictureBox(); - inputPic1.Name = "inputPic1"; - inputPic1.Anchor = AnchorStyles.Top | AnchorStyles.Right; - inputPic1.BackColor = Color.Transparent; - inputPic1.SizeMode = PictureBoxSizeMode.StretchImage; - inputPic1.Cursor = Cursors.Help; - inputPic1.MouseEnter += inputIcons_MouseEnter; - - inputPic2 = new PictureBox(); - inputPic2.Name = "inputPic2"; - inputPic2.Anchor = AnchorStyles.Top | AnchorStyles.Right; - inputPic2.BackColor = Color.Transparent; - inputPic2.SizeMode = PictureBoxSizeMode.StretchImage; - inputPic2.Cursor = Cursors.Help; - inputPic2.MouseEnter += inputIcons_MouseEnter; - - inputPic3 = new PictureBox(); - inputPic3.Name = "inputPic3"; - inputPic3.Anchor = AnchorStyles.Top | AnchorStyles.Right; - inputPic3.BackColor = Color.Transparent; - inputPic3.SizeMode = PictureBoxSizeMode.StretchImage; - inputPic3.Cursor = Cursors.Help; - inputPic3.MouseEnter += inputIcons_MouseEnter; - - inputPic4 = new PictureBox(); - inputPic4.Name = "inputPic4"; - inputPic4.Anchor = AnchorStyles.Top | AnchorStyles.Right; - inputPic4.BackColor = Color.Transparent; - inputPic4.SizeMode = PictureBoxSizeMode.StretchImage; - inputPic4.Cursor = Cursors.Help; - inputPic4.MouseEnter += inputIcons_MouseEnter; - - inputsIconsDesc = new Label(); - inputsIconsDesc.AutoSize = true; - inputsIconsDesc.Visible = false; - inputsIconsDesc.BackColor = Color.Transparent; - inputsIconsDesc.ForeColor = otherTextsColor; - inputsIconsDesc.Anchor = AnchorStyles.Top | AnchorStyles.Right; - + instructionImg = new PictureBox() { Anchor = AnchorStyles.Top | AnchorStyles.Right, @@ -261,16 +201,22 @@ private void Initialize() }; handlerNoteZoom = new RichTextBox(); - handlerNoteZoom.Visible = false; - handlerNoteZoom.Anchor = AnchorStyles.Top | AnchorStyles.Left| AnchorStyles.Right| AnchorStyles.Bottom; + handlerNoteZoom.Visible = true; + handlerNoteZoom.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom; handlerNoteZoom.BorderStyle = BorderStyle.None; - handlerNoteZoom.BackColor = Color.Black; - handlerNoteZoom.ForeColor = handlerNoteZoomFontColor; + handlerNoteZoom.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.ForcedVertical; + handlerNoteZoom.ReadOnly = true; handlerNoteZoom.WordWrap = true; - handlerNoteZoom.LinkClicked += new LinkClickedEventHandler(handlerNoteZoom_LinkClicked); handlerNoteZoom.Text = ""; - + + textZoomContainer = new Panel(); + textZoomContainer.Visible = false; + textZoomContainer.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom; + textZoomContainer.BorderStyle = BorderStyle.None; + textZoomContainer.BackgroundImageLayout = ImageLayout.Stretch; + + ResumeLayout(); colors = new Brush[] @@ -280,13 +226,9 @@ private void Initialize() Brushes.OrangeRed, Brushes.Olive, Brushes.DarkRed, Brushes.Lavender }; - Controls.Add(handlerNoteZoom); - Controls.Add(inputPic1); - Controls.Add(inputPic2); - Controls.Add(inputPic3); - Controls.Add(inputPic4); + textZoomContainer.Controls.Add(handlerNoteZoom); + Controls.Add(textZoomContainer); Controls.Add(instruction); - Controls.Add(inputsIconsDesc); Controls.Add(instructionImg); //Flash image attributes @@ -309,49 +251,6 @@ private void Initialize() RemoveFlicker(); } - private void inputIcons_MouseEnter(object sender, EventArgs e) - { - PictureBox inputIcon = sender as PictureBox; - Control parent = sender as Control; - - if (inputIcon == inputPic4 && inputIcon.Image != null || inputIcon == inputPic3 && inputIcon.Image != null) - { - if(inputIcon == inputPic3 && inputPic4.Image == null) - { - inputsIconsDesc.Text = @"Supports 1 keyboard\mouse"; - inputsIconsDesc.Visible = true; - } - else - { - inputsIconsDesc.Text = @"Supports multiple keyboards/mice"; - inputsIconsDesc.Visible = true; - } - } - else if (inputIcon == inputPic2 && inputIcon.Image != null) - { - if (inputIcon.Image.Equals(xinputGamepad_Icon)) - { - inputsIconsDesc.Text = "Supports xinput gamepads (e.g., X360)"; - inputsIconsDesc.Visible = true; - } - else - { - inputsIconsDesc.Text = "Supports dinput gamepads (e.g., Ps3)"; - inputsIconsDesc.Visible = true; - } - } - else if (inputIcon == inputPic1 && inputIcon.Image != null) - { - inputsIconsDesc.Text = "Supports dinput gamepads (e.g., Ps3)"; - inputsIconsDesc.Visible = true; - } - else if (parent == this) - { - inputsIconsDesc.Text = ""; - inputsIconsDesc.Visible = false; - } - } - private void handlerNoteZoom_LinkClicked(object sender, LinkClickedEventArgs e) { Process.Start(e.LinkText); @@ -407,25 +306,16 @@ public void UpdateSize(float scale) float instructionW = instruction.Width * scale; float instructionH = instruction.Height * scale; - float inputBoxWidth = 28*scale; - float inputBoxHeight = 20*scale; - - inputPic1.Size = new Size((int)inputBoxWidth, (int)inputBoxHeight); - inputPic2.Size = new Size((int)inputBoxWidth, (int)inputBoxHeight); - inputPic3.Size = new Size((int)inputBoxWidth, (int)inputBoxHeight); - inputPic4.Size = new Size((int)inputBoxWidth, (int)inputBoxHeight); - - inputPic1.Location = new Point((instruction.Left - inputPic1.Width) - Convert.ToInt32(30*scale), instruction.Location.Y); - inputPic2.Location = new Point((inputPic1.Left - inputPic1.Width) - Convert.ToInt32(5 * scale), inputPic1.Location.Y); - inputPic3.Location = new Point((inputPic2.Left - inputPic2.Width) - Convert.ToInt32(5 * scale), inputPic2.Location.Y); - inputPic4.Location = new Point((inputPic3.Left - inputPic3.Width) - Convert.ToInt32(5 * scale), inputPic3.Location.Y); - - inputsIconsDesc.Font = new Font(customFont, 10.0f - 2, FontStyle.Regular, GraphicsUnit.Point, 0); - inputsIconsDesc.Location = - new Point((int)(inputPic4.Location.X - inputsIconsDesc.Width) - Convert.ToInt32(35 *scale), inputPic1.Bottom + inputsIconsDesc.Height); + + instruction.Width = (int)instructionW; instruction.Height = (int)instructionH; instruction.Location = new Point((Width - instruction.Width) - 5, 5); + + textZoomContainer.Size = new Size(Width - (int)(60 * scale), Height - (int)(50 * scale)); + textZoomContainer.Location = new Point(Width / 2 - textZoomContainer.Width / 2, instruction.Height + (int)(10 * scale)); + handlerNoteZoom.Size = new Size(textZoomContainer.Width + (int)(18*scale), textZoomContainer.Height - 40); + handlerNoteZoom.Location = new Point(0, 20); appStart = true; } @@ -471,7 +361,6 @@ public override void Ended() gamepadPollTimer.Dispose(); } - private void GamepadPollTimer_Tick(object state) { if (profile == null) @@ -921,30 +810,6 @@ public void UpdatePlayers() if (playerData.Count == 0) { - if ((g.Hook.XInputEnabled && !g.Hook.XInputReroute && !g.ProtoInput.DinputDeviceHook) || g.ProtoInput.XinputHook) - { - inputPic2.Image = xinputGamepad_Icon; - } - else - { - inputPic2.Image = null; - } - - if ((g.Hook.DInputEnabled || g.Hook.XInputReroute || g.ProtoInput.DinputDeviceHook) && (g.Hook.XInputEnabled || g.ProtoInput.XinputHook)) - { - - inputPic1.Image = dinputGamepad_Icon; - } - else if ((g.Hook.DInputEnabled || g.Hook.XInputReroute || g.ProtoInput.DinputDeviceHook) && (!g.Hook.XInputEnabled || !g.ProtoInput.XinputHook)) - { - inputPic1.Image = null; - inputPic2.Image = dinputGamepad_Icon; - } - else - { - inputPic1.Image = null; - } - if (game.Game.SupportsKeyboard) { // add keyboard data @@ -954,25 +819,13 @@ public void UpdatePlayers() GamepadId = 99, IsInputUsed = true }; - inputPic3.Image = k_Icon; + //inputPic3.Image = k_Icon; playerData.Add(kbPlayer); } if (game.Game.SupportsMultipleKeyboardsAndMice) //Raw mice/keyboards { playerData.AddRange(RawInputManager.GetDeviceInputInfos()); - inputPic3.Image = k_Icon; - inputPic4.Image = k_Icon; - } - else - { - inputPic4.Image = null; - } - - - if(!game.Game.SupportsMultipleKeyboardsAndMice && !game.Game.SupportsKeyboard) - { - inputPic3.Image = null; } if (testDinputPlayers != -1) // make fake data if needed diff --git a/Master/NucleusGaming/Nucleus.Gaming.csproj b/Master/NucleusGaming/Nucleus.Gaming.csproj index 77e7418b..31bc9d86 100644 --- a/Master/NucleusGaming/Nucleus.Gaming.csproj +++ b/Master/NucleusGaming/Nucleus.Gaming.csproj @@ -303,6 +303,7 @@ True Resources.resx + diff --git a/Master/NucleusGaming/Tools/Steamless/Steamless.cs b/Master/NucleusGaming/Tools/Steamless/Steamless.cs new file mode 100644 index 00000000..740ef6cf --- /dev/null +++ b/Master/NucleusGaming/Tools/Steamless/Steamless.cs @@ -0,0 +1,39 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Threading; + +namespace Nucleus.Gaming.Tools.Steamless +{ + class Steamless + { + private string steamlessExePath; + public void SteamlessProc(string symlinkedGamePath, string symlinkedGameFolder, string exeName, string args,int timing) + { + try + { + steamlessExePath = Path.Combine(Directory.GetCurrentDirectory() + @"\utils\Steamless\Steamless.CLI.exe"); + + string steamlessArgs = $"{args}" + " \"" + symlinkedGamePath + "\""; + + ProcessStartInfo sl = new ProcessStartInfo(steamlessExePath); + sl.WorkingDirectory = symlinkedGameFolder; + sl.UseShellExecute = true; + sl.WindowStyle = ProcessWindowStyle.Hidden; + sl.Arguments = steamlessArgs; + Process.Start(sl); + Thread.Sleep(timing); + + if (System.IO.File.Exists(symlinkedGameFolder + @"\" + exeName + ".unpacked.exe")) + { + System.IO.File.Delete(symlinkedGameFolder + @"\" + exeName); + System.IO.File.Move(symlinkedGameFolder + @"\" + exeName + ".unpacked.exe", symlinkedGameFolder + @"\" + exeName); + } + } + catch (Exception ex) + { + Console.WriteLine(ex); + }; + } + } +} \ No newline at end of file