From d8b5c1789af3a49b01c6e5032c8b7e717c5c8ffd Mon Sep 17 00:00:00 2001 From: FelisDiligens <47528453+FelisDiligens@users.noreply.github.com> Date: Sat, 11 Jul 2020 07:26:24 +0200 Subject: [PATCH 1/6] Bug fix: Wrong author name added to language template files. --- Fo76ini/Form1.Language.cs | 40 ++------------------------------------- 1 file changed, 2 insertions(+), 38 deletions(-) diff --git a/Fo76ini/Form1.Language.cs b/Fo76ini/Form1.Language.cs index 3f0ab0a..977184f 100644 --- a/Fo76ini/Form1.Language.cs +++ b/Fo76ini/Form1.Language.cs @@ -313,7 +313,7 @@ private void SerializeXMLFile(String name = null, String iso = null, String auth if (iso == null) iso = this.languageISOs[index]; if (author == null) - author = this.labelAuthorName.Text.Trim(); + author = this.labelTranslationAuthor.Text.Trim(); if (fileName == null) fileName = iso + ".template.xml"; @@ -366,43 +366,6 @@ private void SerializeXMLFile(String name = null, String iso = null, String auth private void GenerateEnglishXMLFile() { SerializeXMLFile("English (USA)", "en-US", "", "en-US.xml"); - /*// Create document and root: - XDocument xmlDoc = new XDocument(); - XElement xmlRoot = new XElement("Language"); - xmlRoot.Add(new XAttribute("name", "English (USA)")); - xmlRoot.Add(new XAttribute("iso", "en-US")); - xmlDoc.AddFirst(new XComment("\n This file is auto-generated on program start.\n Therefore any changes made to this file will be overriden.\n You can use this as a template for your own translation, though.\n")); - xmlDoc.Add(xmlRoot); - - // Serialize miscellaneous strings: - XElement xmlStrings = new XElement("Strings"); - foreach (KeyValuePair pair in Translation.localizedStrings) - xmlStrings.Add(new XElement("String", - new XAttribute("text", pair.Value), - new XAttribute("id", pair.Key))); - xmlRoot.Add(xmlStrings); - - // Create dropdowns: - XElement xmlDropDowns = new XElement("Dropdowns"); - foreach (KeyValuePair pair in this.comboBoxes) - SerializeDropDownOptions(xmlDropDowns, pair.Key, pair.Value.Items); - xmlRoot.Add(xmlDropDowns); - - // Create messageboxes: - xmlRoot.Add(MsgBox.Serialize()); - - // Serialize all control elements: - XElement xmlForm1 = new XElement("Form1", new XAttribute("title", this.Text)); - XElement xmlFormMods = new XElement("FormMods", new XAttribute("title", this.formMods.Text)); - SerializeControlText(xmlForm1, this.toolTip, this); - SerializeControlText(xmlFormMods, this.formMods.toolTip, this.formMods); - xmlRoot.Add(xmlForm1); - xmlRoot.Add(xmlFormMods); - - // Save it: - xmlDoc.Save(Path.Combine(languageFolder, "en-US.xml")); - //using (XmlTextWriter writer = new XmlTextWriter(Path.Combine(languageFolder, "en-US.xml"), new UTF8Encoding(false))) - // xmlDoc.Save(writer); */ } private void ChangeLanguage(string langFile) @@ -561,6 +524,7 @@ private void ChangeLanguage(string langFile) CheckVersion(); this.formMods.UpdateUI(); + Console.WriteLine(this.labelTranslationAuthor.Text); if (xmlDoc.Element("Language").Attribute("iso").Value != "en-US") SerializeXMLFile(); } From b9484d31a2441e5dc551d21f86e8d812bef99f09 Mon Sep 17 00:00:00 2001 From: FelisDiligens <47528453+FelisDiligens@users.noreply.github.com> Date: Sat, 11 Jul 2020 07:33:19 +0200 Subject: [PATCH 2/6] Bug fix: Enabling deny write-permission and NW mode resulted in UnauthorizedAccessException --- Fo76ini/IniFiles.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Fo76ini/IniFiles.cs b/Fo76ini/IniFiles.cs index a6a37eb..ae42689 100644 --- a/Fo76ini/IniFiles.cs +++ b/Fo76ini/IniFiles.cs @@ -162,6 +162,7 @@ public void SaveGameInis(bool readOnly = false) public void ResolveNWMode() { + SetNTFSWritePermission(true); if (this.nuclearWinterMode) { if (!File.Exists(this.fo76CustomPath)) @@ -179,6 +180,9 @@ public void ResolveNWMode() Utils.DeleteFile(this.fo76CustomPath + ".nwmodebak"); } UpdateLastModifiedDates(); + + if (this.GetBool(IniFile.Config, "Preferences", "bDenyNTFSWritePermission", false)) + SetNTFSWritePermission(false); } public bool FilesHaveBeenModified() @@ -453,17 +457,11 @@ public void SetNTFSWritePermission(bool writePermission) { dSecurity.RemoveAccessRule(new FileSystemAccessRule(sidUsers, rights, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Deny)); dSecurity.AddAccessRule(new FileSystemAccessRule(sidUsers, rights, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow)); - - //dSecurity.RemoveAccessRule(new FileSystemAccessRule(sidAdmins, rights, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Deny)); - //dSecurity.AddAccessRule(new FileSystemAccessRule(sidAdmins, rights, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow)); } else { dSecurity.AddAccessRule(new FileSystemAccessRule(sidUsers, rights, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Deny)); dSecurity.RemoveAccessRule(new FileSystemAccessRule(sidUsers, rights, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow)); - - //dSecurity.AddAccessRule(new FileSystemAccessRule(sidAdmins, rights, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Deny)); - //dSecurity.RemoveAccessRule(new FileSystemAccessRule(sidAdmins, rights, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow)); } dInfo.SetAccessControl(dSecurity); } From 231331390d1614e5ab6144bc042e6cd9fd38beb6 Mon Sep 17 00:00:00 2001 From: FelisDiligens <47528453+FelisDiligens@users.noreply.github.com> Date: Sat, 11 Jul 2020 07:35:43 +0200 Subject: [PATCH 3/6] Changed VERSION string --- Fo76ini/Form1.Language.cs | 1 - Fo76ini/Form1.cs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Fo76ini/Form1.Language.cs b/Fo76ini/Form1.Language.cs index 977184f..7ca1c25 100644 --- a/Fo76ini/Form1.Language.cs +++ b/Fo76ini/Form1.Language.cs @@ -524,7 +524,6 @@ private void ChangeLanguage(string langFile) CheckVersion(); this.formMods.UpdateUI(); - Console.WriteLine(this.labelTranslationAuthor.Text); if (xmlDoc.Element("Language").Attribute("iso").Value != "en-US") SerializeXMLFile(); } diff --git a/Fo76ini/Form1.cs b/Fo76ini/Form1.cs index 0f9b7b8..1c94c20 100644 --- a/Fo76ini/Form1.cs +++ b/Fo76ini/Form1.cs @@ -15,7 +15,7 @@ namespace Fo76ini { public partial class Form1 : Form { - public const String VERSION = "1.6.3"; + public const String VERSION = "1.7.0"; protected System.Globalization.CultureInfo enUS = System.Globalization.CultureInfo.CreateSpecificCulture("en-US"); From 032df9917f909323e9662f69e289d6fe3eeb0252 Mon Sep 17 00:00:00 2001 From: FelisDiligens <47528453+FelisDiligens@users.noreply.github.com> Date: Sat, 11 Jul 2020 21:33:27 +0200 Subject: [PATCH 4/6] Added Microsoft Store support among other things. --- Fo76ini/Fo76ini.csproj | 11 + Fo76ini/Form1.Designer.cs | 243 ++++++++++++++----- Fo76ini/Form1.Language.cs | 3 +- Fo76ini/Form1.cs | 153 ++++++++++-- Fo76ini/FormMods.Designer.cs | 3 +- Fo76ini/FormMods.resx | 9 +- Fo76ini/IniFiles.cs | 255 ++++++++++++-------- Fo76ini/Mods.cs | 54 ++++- Fo76ini/Properties/Resources.Designer.cs | 100 ++++++++ Fo76ini/Properties/Resources.resx | 30 +++ Fo76ini/Resources/bethesda-launcher-pts.png | Bin 0 -> 18090 bytes Fo76ini/Resources/bethesda-launcher.png | Bin 0 -> 6727 bytes Fo76ini/Resources/bethesda_24px.png | Bin 0 -> 6252 bytes Fo76ini/Resources/bethesdanet.png | Bin 0 -> 334 bytes Fo76ini/Resources/msstore.png | Bin 0 -> 2604 bytes Fo76ini/Resources/msstore_24px.png | Bin 0 -> 971 bytes Fo76ini/Resources/question_mark.png | Bin 0 -> 5743 bytes Fo76ini/Resources/steam.png | Bin 0 -> 7460 bytes Fo76ini/Resources/steam_24px.png | Bin 0 -> 1577 bytes Fo76ini/Resources/xbox.png | Bin 0 -> 5409 bytes Fo76ini/Resources/xbox_24px.png | Bin 0 -> 1352 bytes Fo76ini/languages/de-DE.xml | 16 +- Fo76ini/languages/en-US.xml | 16 +- Fo76ini/msgbox.cs | 23 +- 24 files changed, 702 insertions(+), 214 deletions(-) create mode 100644 Fo76ini/Resources/bethesda-launcher-pts.png create mode 100644 Fo76ini/Resources/bethesda-launcher.png create mode 100644 Fo76ini/Resources/bethesda_24px.png create mode 100644 Fo76ini/Resources/bethesdanet.png create mode 100644 Fo76ini/Resources/msstore.png create mode 100644 Fo76ini/Resources/msstore_24px.png create mode 100644 Fo76ini/Resources/question_mark.png create mode 100644 Fo76ini/Resources/steam.png create mode 100644 Fo76ini/Resources/steam_24px.png create mode 100644 Fo76ini/Resources/xbox.png create mode 100644 Fo76ini/Resources/xbox_24px.png diff --git a/Fo76ini/Fo76ini.csproj b/Fo76ini/Fo76ini.csproj index b989f19..a305980 100644 --- a/Fo76ini/Fo76ini.csproj +++ b/Fo76ini/Fo76ini.csproj @@ -202,6 +202,17 @@ + + + + + + + + + + + diff --git a/Fo76ini/Form1.Designer.cs b/Fo76ini/Form1.Designer.cs index 16cde99..d823c30 100644 --- a/Fo76ini/Form1.Designer.cs +++ b/Fo76ini/Form1.Designer.cs @@ -168,10 +168,17 @@ private void InitializeComponent() this.groupBoxInterface = new System.Windows.Forms.GroupBox(); this.groupBoxMainMenu = new System.Windows.Forms.GroupBox(); this.groupBoxGameEdition = new System.Windows.Forms.GroupBox(); + this.pictureBoxMSStore = new System.Windows.Forms.PictureBox(); + this.pictureBoxSteam = new System.Windows.Forms.PictureBox(); + this.pictureBoxBethesdaNetPTS = new System.Windows.Forms.PictureBox(); + this.pictureBoxBethesdaNet = new System.Windows.Forms.PictureBox(); + this.radioButtonEditionMSStore = new System.Windows.Forms.RadioButton(); this.radioButtonEditionBethesdaNetPTS = new System.Windows.Forms.RadioButton(); this.radioButtonEditionSteam = new System.Windows.Forms.RadioButton(); this.radioButtonEditionBethesdaNet = new System.Windows.Forms.RadioButton(); this.tabPageInfo = new System.Windows.Forms.TabPage(); + this.labelGameEdition = new System.Windows.Forms.Label(); + this.pictureBoxGameEdition = new System.Windows.Forms.PictureBox(); this.groupBoxUpdate = new System.Windows.Forms.GroupBox(); this.labelNewVersion = new System.Windows.Forms.Label(); this.buttonUpdateNow = new System.Windows.Forms.Button(); @@ -190,6 +197,7 @@ private void InitializeComponent() this.tabControl1 = new System.Windows.Forms.TabControl(); this.tabPageSettings = new System.Windows.Forms.TabPage(); this.groupBoxLaunchOptions = new System.Windows.Forms.GroupBox(); + this.labelLaunchOptionMSStoreNotice = new System.Windows.Forms.Label(); this.labelLaunchOptionTip = new System.Windows.Forms.Label(); this.radioButtonLaunchViaExecutable = new System.Windows.Forms.RadioButton(); this.radioButtonLaunchViaLink = new System.Windows.Forms.RadioButton(); @@ -249,7 +257,12 @@ private void InitializeComponent() this.groupBoxInterface.SuspendLayout(); this.groupBoxMainMenu.SuspendLayout(); this.groupBoxGameEdition.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxMSStore)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxSteam)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxBethesdaNetPTS)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxBethesdaNet)).BeginInit(); this.tabPageInfo.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxGameEdition)).BeginInit(); this.groupBoxUpdate.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); @@ -618,7 +631,7 @@ private void InitializeComponent() this.sliderShadowDistance.Location = new System.Drawing.Point(10, 94); this.sliderShadowDistance.Maximum = 200000; this.sliderShadowDistance.Name = "sliderShadowDistance"; - this.sliderShadowDistance.Size = new System.Drawing.Size(273, 23); + this.sliderShadowDistance.Size = new System.Drawing.Size(281, 23); this.sliderShadowDistance.SmallChange = 1000; this.sliderShadowDistance.TabIndex = 27; this.sliderShadowDistance.Text = "metroTrackBar1"; @@ -659,7 +672,7 @@ private void InitializeComponent() this.sliderLODObjects.Location = new System.Drawing.Point(103, 41); this.sliderLODObjects.Maximum = 600; this.sliderLODObjects.Name = "sliderLODObjects"; - this.sliderLODObjects.Size = new System.Drawing.Size(202, 23); + this.sliderLODObjects.Size = new System.Drawing.Size(210, 23); this.sliderLODObjects.SmallChange = 5; this.sliderLODObjects.TabIndex = 29; this.sliderLODObjects.Text = "metroTrackBar1"; @@ -676,7 +689,7 @@ private void InitializeComponent() this.sliderLODItems.Location = new System.Drawing.Point(104, 70); this.sliderLODItems.Maximum = 600; this.sliderLODItems.Name = "sliderLODItems"; - this.sliderLODItems.Size = new System.Drawing.Size(201, 23); + this.sliderLODItems.Size = new System.Drawing.Size(209, 23); this.sliderLODItems.SmallChange = 5; this.sliderLODItems.TabIndex = 30; this.sliderLODItems.Text = "metroTrackBar2"; @@ -693,7 +706,7 @@ private void InitializeComponent() this.sliderLODActors.Location = new System.Drawing.Point(103, 99); this.sliderLODActors.Maximum = 600; this.sliderLODActors.Name = "sliderLODActors"; - this.sliderLODActors.Size = new System.Drawing.Size(202, 23); + this.sliderLODActors.Size = new System.Drawing.Size(210, 23); this.sliderLODActors.SmallChange = 5; this.sliderLODActors.TabIndex = 32; this.sliderLODActors.Text = "metroTrackBar3"; @@ -724,7 +737,7 @@ private void InitializeComponent() this.sliderGrassFadeDistance.Location = new System.Drawing.Point(9, 66); this.sliderGrassFadeDistance.Maximum = 14000; this.sliderGrassFadeDistance.Name = "sliderGrassFadeDistance"; - this.sliderGrassFadeDistance.Size = new System.Drawing.Size(274, 23); + this.sliderGrassFadeDistance.Size = new System.Drawing.Size(282, 23); this.sliderGrassFadeDistance.SmallChange = 500; this.sliderGrassFadeDistance.TabIndex = 24; this.sliderGrassFadeDistance.Text = "metroTrackBar1"; @@ -975,7 +988,7 @@ private void InitializeComponent() this.sliderTAAPostOverlay.LargeChange = 1; this.sliderTAAPostOverlay.Location = new System.Drawing.Point(9, 41); this.sliderTAAPostOverlay.Name = "sliderTAAPostOverlay"; - this.sliderTAAPostOverlay.Size = new System.Drawing.Size(274, 23); + this.sliderTAAPostOverlay.Size = new System.Drawing.Size(282, 23); this.sliderTAAPostOverlay.TabIndex = 27; this.sliderTAAPostOverlay.Text = "metroTrackBar1"; this.toolTip.SetToolTip(this.sliderTAAPostOverlay, "Sharpens the image.\r\n\r\nRecommended: 0.2\r\nDefault: 0.2\r\n\r\nAffected values: fTAAPos" + @@ -991,7 +1004,7 @@ private void InitializeComponent() this.sliderTAAPostSharpen.Location = new System.Drawing.Point(9, 93); this.sliderTAAPostSharpen.Maximum = 200; this.sliderTAAPostSharpen.Name = "sliderTAAPostSharpen"; - this.sliderTAAPostSharpen.Size = new System.Drawing.Size(274, 23); + this.sliderTAAPostSharpen.Size = new System.Drawing.Size(282, 23); this.sliderTAAPostSharpen.TabIndex = 30; this.sliderTAAPostSharpen.Text = "metroTrackBar2"; this.toolTip.SetToolTip(this.sliderTAAPostSharpen, "Sharpens the image.\r\n\r\nDefault: 0.2\r\nRecommended: 0.4\r\n\r\nAffected values: fTAAPos" + @@ -1451,7 +1464,7 @@ private void InitializeComponent() this.groupBoxTAASharpening.Controls.Add(this.sliderTAAPostOverlay); this.groupBoxTAASharpening.Location = new System.Drawing.Point(9, 655); this.groupBoxTAASharpening.Name = "groupBoxTAASharpening"; - this.groupBoxTAASharpening.Size = new System.Drawing.Size(369, 134); + this.groupBoxTAASharpening.Size = new System.Drawing.Size(377, 134); this.groupBoxTAASharpening.TabIndex = 25; this.groupBoxTAASharpening.TabStop = false; this.groupBoxTAASharpening.Text = "TAA Sharpening"; @@ -1465,7 +1478,7 @@ private void InitializeComponent() 0, 0, 65536}); - this.numTAAPostSharpen.Location = new System.Drawing.Point(289, 93); + this.numTAAPostSharpen.Location = new System.Drawing.Point(297, 93); this.numTAAPostSharpen.Maximum = new decimal(new int[] { 9999999, 0, @@ -1498,7 +1511,7 @@ private void InitializeComponent() 0, 0, 65536}); - this.numTAAPostOverlay.Location = new System.Drawing.Point(289, 41); + this.numTAAPostOverlay.Location = new System.Drawing.Point(297, 41); this.numTAAPostOverlay.Maximum = new decimal(new int[] { 9999999, 0, @@ -1532,7 +1545,7 @@ private void InitializeComponent() this.groupBoxGrass.Controls.Add(this.checkBoxGrass); this.groupBoxGrass.Location = new System.Drawing.Point(9, 555); this.groupBoxGrass.Name = "groupBoxGrass"; - this.groupBoxGrass.Size = new System.Drawing.Size(369, 94); + this.groupBoxGrass.Size = new System.Drawing.Size(377, 94); this.groupBoxGrass.TabIndex = 23; this.groupBoxGrass.TabStop = false; this.groupBoxGrass.Text = "Grass"; @@ -1545,7 +1558,7 @@ private void InitializeComponent() 0, 0, 0}); - this.numGrassFadeDistance.Location = new System.Drawing.Point(289, 68); + this.numGrassFadeDistance.Location = new System.Drawing.Point(297, 68); this.numGrassFadeDistance.Maximum = new decimal(new int[] { 9999999, 0, @@ -1585,7 +1598,7 @@ private void InitializeComponent() this.groupBoxLOD.Controls.Add(this.labelLODObjects); this.groupBoxLOD.Location = new System.Drawing.Point(9, 419); this.groupBoxLOD.Name = "groupBoxLOD"; - this.groupBoxLOD.Size = new System.Drawing.Size(369, 130); + this.groupBoxLOD.Size = new System.Drawing.Size(377, 130); this.groupBoxLOD.TabIndex = 24; this.groupBoxLOD.TabStop = false; this.groupBoxLOD.Text = "LOD"; @@ -1603,7 +1616,7 @@ private void InitializeComponent() // this.numLODActors.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.numLODActors.DecimalPlaces = 1; - this.numLODActors.Location = new System.Drawing.Point(310, 100); + this.numLODActors.Location = new System.Drawing.Point(318, 100); this.numLODActors.Maximum = new decimal(new int[] { 9999999, 0, @@ -1622,7 +1635,7 @@ private void InitializeComponent() // this.numLODItems.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.numLODItems.DecimalPlaces = 1; - this.numLODItems.Location = new System.Drawing.Point(310, 71); + this.numLODItems.Location = new System.Drawing.Point(318, 71); this.numLODItems.Maximum = new decimal(new int[] { 9999999, 0, @@ -1641,7 +1654,7 @@ private void InitializeComponent() // this.numLODObjects.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.numLODObjects.DecimalPlaces = 1; - this.numLODObjects.Location = new System.Drawing.Point(310, 41); + this.numLODObjects.Location = new System.Drawing.Point(318, 41); this.numLODObjects.Maximum = new decimal(new int[] { 9999999, 0, @@ -1690,7 +1703,7 @@ private void InitializeComponent() this.groupBoxLighting.Controls.Add(this.checkBoxGodrays); this.groupBoxLighting.Location = new System.Drawing.Point(9, 233); this.groupBoxLighting.Name = "groupBoxLighting"; - this.groupBoxLighting.Size = new System.Drawing.Size(369, 46); + this.groupBoxLighting.Size = new System.Drawing.Size(377, 46); this.groupBoxLighting.TabIndex = 15; this.groupBoxLighting.TabStop = false; this.groupBoxLighting.Text = "Lighting"; @@ -1708,7 +1721,7 @@ private void InitializeComponent() this.groupBoxShadows.Controls.Add(this.labelShadowTextureResolution); this.groupBoxShadows.Location = new System.Drawing.Point(9, 285); this.groupBoxShadows.Name = "groupBoxShadows"; - this.groupBoxShadows.Size = new System.Drawing.Size(369, 128); + this.groupBoxShadows.Size = new System.Drawing.Size(377, 128); this.groupBoxShadows.TabIndex = 16; this.groupBoxShadows.TabStop = false; this.groupBoxShadows.Text = "Shadows"; @@ -1721,7 +1734,7 @@ private void InitializeComponent() this.comboBoxShadowBlurriness.FormattingEnabled = true; this.comboBoxShadowBlurriness.Location = new System.Drawing.Point(134, 47); this.comboBoxShadowBlurriness.Name = "comboBoxShadowBlurriness"; - this.comboBoxShadowBlurriness.Size = new System.Drawing.Size(229, 21); + this.comboBoxShadowBlurriness.Size = new System.Drawing.Size(237, 21); this.comboBoxShadowBlurriness.TabIndex = 30; // // numShadowDistance @@ -1732,7 +1745,7 @@ private void InitializeComponent() 0, 0, 0}); - this.numShadowDistance.Location = new System.Drawing.Point(289, 97); + this.numShadowDistance.Location = new System.Drawing.Point(297, 97); this.numShadowDistance.Maximum = new decimal(new int[] { 9999999, 0, @@ -1764,7 +1777,7 @@ private void InitializeComponent() this.comboBoxShadowTextureResolution.FormattingEnabled = true; this.comboBoxShadowTextureResolution.Location = new System.Drawing.Point(134, 20); this.comboBoxShadowTextureResolution.Name = "comboBoxShadowTextureResolution"; - this.comboBoxShadowTextureResolution.Size = new System.Drawing.Size(229, 21); + this.comboBoxShadowTextureResolution.Size = new System.Drawing.Size(237, 21); this.comboBoxShadowTextureResolution.TabIndex = 1; // // groupBoxWater @@ -1774,7 +1787,7 @@ private void InitializeComponent() this.groupBoxWater.Controls.Add(this.checkBoxWaterDisplacement); this.groupBoxWater.Location = new System.Drawing.Point(196, 89); this.groupBoxWater.Name = "groupBoxWater"; - this.groupBoxWater.Size = new System.Drawing.Size(182, 44); + this.groupBoxWater.Size = new System.Drawing.Size(190, 44); this.groupBoxWater.TabIndex = 17; this.groupBoxWater.TabStop = false; this.groupBoxWater.Text = "Water"; @@ -1802,7 +1815,7 @@ private void InitializeComponent() this.groupBoxWeather.Controls.Add(this.checkBoxWeatherRainOcclusion); this.groupBoxWeather.Location = new System.Drawing.Point(196, 139); this.groupBoxWeather.Name = "groupBoxWeather"; - this.groupBoxWeather.Size = new System.Drawing.Size(182, 88); + this.groupBoxWeather.Size = new System.Drawing.Size(190, 88); this.groupBoxWeather.TabIndex = 18; this.groupBoxWeather.TabStop = false; this.groupBoxWeather.Text = "Weather"; @@ -1815,7 +1828,7 @@ private void InitializeComponent() this.comboBoxAnisotropicFiltering.FormattingEnabled = true; this.comboBoxAnisotropicFiltering.Location = new System.Drawing.Point(152, 33); this.comboBoxAnisotropicFiltering.Name = "comboBoxAnisotropicFiltering"; - this.comboBoxAnisotropicFiltering.Size = new System.Drawing.Size(226, 21); + this.comboBoxAnisotropicFiltering.Size = new System.Drawing.Size(234, 21); this.comboBoxAnisotropicFiltering.TabIndex = 23; // // comboBoxAntiAliasing @@ -1826,7 +1839,7 @@ private void InitializeComponent() this.comboBoxAntiAliasing.FormattingEnabled = true; this.comboBoxAntiAliasing.Location = new System.Drawing.Point(152, 6); this.comboBoxAntiAliasing.Name = "comboBoxAntiAliasing"; - this.comboBoxAntiAliasing.Size = new System.Drawing.Size(226, 21); + this.comboBoxAntiAliasing.Size = new System.Drawing.Size(234, 21); this.comboBoxAntiAliasing.TabIndex = 8; // // tabPageDisplay @@ -2015,18 +2028,19 @@ private void InitializeComponent() this.labelCredentialsExplanation.AutoSize = true; this.labelCredentialsExplanation.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.labelCredentialsExplanation.ForeColor = System.Drawing.Color.DimGray; - this.labelCredentialsExplanation.Location = new System.Drawing.Point(6, 93); + this.labelCredentialsExplanation.Location = new System.Drawing.Point(6, 85); this.labelCredentialsExplanation.Name = "labelCredentialsExplanation"; - this.labelCredentialsExplanation.Size = new System.Drawing.Size(262, 39); + this.labelCredentialsExplanation.Size = new System.Drawing.Size(273, 52); this.labelCredentialsExplanation.TabIndex = 5; this.labelCredentialsExplanation.Text = "Your credentials are saved into Fallout76Custom.ini\r\nThis way, you don\'t have to " + - "login if you start Fallout 76\r\nwithout the launcher."; + "login if you start Fallout 76\r\nwithout the launcher.\r\nMight only work if the gam" + + "e is installed via Bethesda.net."; // // textBoxPassword // this.textBoxPassword.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxPassword.Location = new System.Drawing.Point(92, 47); + this.textBoxPassword.Location = new System.Drawing.Point(92, 41); this.textBoxPassword.Name = "textBoxPassword"; this.textBoxPassword.PasswordChar = '•'; this.textBoxPassword.Size = new System.Drawing.Size(272, 20); @@ -2037,7 +2051,7 @@ private void InitializeComponent() // this.textBoxUserName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.textBoxUserName.Location = new System.Drawing.Point(92, 22); + this.textBoxUserName.Location = new System.Drawing.Point(92, 16); this.textBoxUserName.Name = "textBoxUserName"; this.textBoxUserName.Size = new System.Drawing.Size(272, 20); this.textBoxUserName.TabIndex = 3; @@ -2045,7 +2059,7 @@ private void InitializeComponent() // checkBoxShowPassword // this.checkBoxShowPassword.AutoSize = true; - this.checkBoxShowPassword.Location = new System.Drawing.Point(92, 73); + this.checkBoxShowPassword.Location = new System.Drawing.Point(92, 67); this.checkBoxShowPassword.Name = "checkBoxShowPassword"; this.checkBoxShowPassword.Size = new System.Drawing.Size(101, 17); this.checkBoxShowPassword.TabIndex = 2; @@ -2056,7 +2070,7 @@ private void InitializeComponent() // labelPassword // this.labelPassword.AutoSize = true; - this.labelPassword.Location = new System.Drawing.Point(6, 50); + this.labelPassword.Location = new System.Drawing.Point(6, 44); this.labelPassword.Name = "labelPassword"; this.labelPassword.Size = new System.Drawing.Size(56, 13); this.labelPassword.TabIndex = 1; @@ -2065,7 +2079,7 @@ private void InitializeComponent() // labelUserName // this.labelUserName.AutoSize = true; - this.labelUserName.Location = new System.Drawing.Point(6, 25); + this.labelUserName.Location = new System.Drawing.Point(6, 19); this.labelUserName.Name = "labelUserName"; this.labelUserName.Size = new System.Drawing.Size(61, 13); this.labelUserName.TabIndex = 0; @@ -2105,20 +2119,76 @@ private void InitializeComponent() // this.groupBoxGameEdition.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxGameEdition.Controls.Add(this.pictureBoxMSStore); + this.groupBoxGameEdition.Controls.Add(this.pictureBoxSteam); + this.groupBoxGameEdition.Controls.Add(this.pictureBoxBethesdaNetPTS); + this.groupBoxGameEdition.Controls.Add(this.pictureBoxBethesdaNet); + this.groupBoxGameEdition.Controls.Add(this.radioButtonEditionMSStore); this.groupBoxGameEdition.Controls.Add(this.radioButtonEditionBethesdaNetPTS); this.groupBoxGameEdition.Controls.Add(this.radioButtonEditionSteam); this.groupBoxGameEdition.Controls.Add(this.radioButtonEditionBethesdaNet); this.groupBoxGameEdition.Location = new System.Drawing.Point(6, 123); this.groupBoxGameEdition.Name = "groupBoxGameEdition"; - this.groupBoxGameEdition.Size = new System.Drawing.Size(376, 93); + this.groupBoxGameEdition.Size = new System.Drawing.Size(383, 144); this.groupBoxGameEdition.TabIndex = 12; this.groupBoxGameEdition.TabStop = false; this.groupBoxGameEdition.Text = "Game edition"; // + // pictureBoxMSStore + // + this.pictureBoxMSStore.BackColor = System.Drawing.Color.Transparent; + this.pictureBoxMSStore.Image = global::Fo76ini.Properties.Resources.msstore_24px; + this.pictureBoxMSStore.Location = new System.Drawing.Point(11, 109); + this.pictureBoxMSStore.Name = "pictureBoxMSStore"; + this.pictureBoxMSStore.Size = new System.Drawing.Size(24, 24); + this.pictureBoxMSStore.TabIndex = 29; + this.pictureBoxMSStore.TabStop = false; + // + // pictureBoxSteam + // + this.pictureBoxSteam.BackColor = System.Drawing.Color.Transparent; + this.pictureBoxSteam.Image = global::Fo76ini.Properties.Resources.steam_24px; + this.pictureBoxSteam.Location = new System.Drawing.Point(11, 79); + this.pictureBoxSteam.Name = "pictureBoxSteam"; + this.pictureBoxSteam.Size = new System.Drawing.Size(24, 24); + this.pictureBoxSteam.TabIndex = 28; + this.pictureBoxSteam.TabStop = false; + // + // pictureBoxBethesdaNetPTS + // + this.pictureBoxBethesdaNetPTS.BackColor = System.Drawing.Color.Transparent; + this.pictureBoxBethesdaNetPTS.Image = global::Fo76ini.Properties.Resources.bethesda_24px; + this.pictureBoxBethesdaNetPTS.Location = new System.Drawing.Point(11, 49); + this.pictureBoxBethesdaNetPTS.Name = "pictureBoxBethesdaNetPTS"; + this.pictureBoxBethesdaNetPTS.Size = new System.Drawing.Size(24, 24); + this.pictureBoxBethesdaNetPTS.TabIndex = 27; + this.pictureBoxBethesdaNetPTS.TabStop = false; + // + // pictureBoxBethesdaNet + // + this.pictureBoxBethesdaNet.BackColor = System.Drawing.Color.Transparent; + this.pictureBoxBethesdaNet.Image = global::Fo76ini.Properties.Resources.bethesda_24px; + this.pictureBoxBethesdaNet.Location = new System.Drawing.Point(11, 19); + this.pictureBoxBethesdaNet.Name = "pictureBoxBethesdaNet"; + this.pictureBoxBethesdaNet.Size = new System.Drawing.Size(24, 24); + this.pictureBoxBethesdaNet.TabIndex = 26; + this.pictureBoxBethesdaNet.TabStop = false; + // + // radioButtonEditionMSStore + // + this.radioButtonEditionMSStore.AutoSize = true; + this.radioButtonEditionMSStore.Location = new System.Drawing.Point(43, 112); + this.radioButtonEditionMSStore.Name = "radioButtonEditionMSStore"; + this.radioButtonEditionMSStore.Size = new System.Drawing.Size(188, 17); + this.radioButtonEditionMSStore.TabIndex = 3; + this.radioButtonEditionMSStore.Text = "Microsoft Store / Xbox Game Pass"; + this.radioButtonEditionMSStore.UseVisualStyleBackColor = true; + this.radioButtonEditionMSStore.CheckedChanged += new System.EventHandler(this.radioButtonEditionMSStore_CheckedChanged); + // // radioButtonEditionBethesdaNetPTS // this.radioButtonEditionBethesdaNetPTS.AutoSize = true; - this.radioButtonEditionBethesdaNetPTS.Location = new System.Drawing.Point(10, 41); + this.radioButtonEditionBethesdaNetPTS.Location = new System.Drawing.Point(43, 52); this.radioButtonEditionBethesdaNetPTS.Name = "radioButtonEditionBethesdaNetPTS"; this.radioButtonEditionBethesdaNetPTS.Size = new System.Drawing.Size(118, 17); this.radioButtonEditionBethesdaNetPTS.TabIndex = 2; @@ -2129,7 +2199,7 @@ private void InitializeComponent() // radioButtonEditionSteam // this.radioButtonEditionSteam.AutoSize = true; - this.radioButtonEditionSteam.Location = new System.Drawing.Point(10, 64); + this.radioButtonEditionSteam.Location = new System.Drawing.Point(43, 82); this.radioButtonEditionSteam.Name = "radioButtonEditionSteam"; this.radioButtonEditionSteam.Size = new System.Drawing.Size(55, 17); this.radioButtonEditionSteam.TabIndex = 1; @@ -2140,7 +2210,7 @@ private void InitializeComponent() // radioButtonEditionBethesdaNet // this.radioButtonEditionBethesdaNet.AutoSize = true; - this.radioButtonEditionBethesdaNet.Location = new System.Drawing.Point(10, 18); + this.radioButtonEditionBethesdaNet.Location = new System.Drawing.Point(43, 22); this.radioButtonEditionBethesdaNet.Name = "radioButtonEditionBethesdaNet"; this.radioButtonEditionBethesdaNet.Size = new System.Drawing.Size(88, 17); this.radioButtonEditionBethesdaNet.TabIndex = 0; @@ -2150,6 +2220,8 @@ private void InitializeComponent() // // tabPageInfo // + this.tabPageInfo.Controls.Add(this.labelGameEdition); + this.tabPageInfo.Controls.Add(this.pictureBoxGameEdition); this.tabPageInfo.Controls.Add(this.groupBoxUpdate); this.tabPageInfo.Controls.Add(this.pictureBox1); this.tabPageInfo.Controls.Add(this.pictureBox2); @@ -2169,6 +2241,30 @@ private void InitializeComponent() this.tabPageInfo.Text = "Info"; this.tabPageInfo.UseVisualStyleBackColor = true; // + // labelGameEdition + // + this.labelGameEdition.BackColor = System.Drawing.Color.Black; + this.labelGameEdition.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelGameEdition.ForeColor = System.Drawing.Color.White; + this.labelGameEdition.Location = new System.Drawing.Point(0, 434); + this.labelGameEdition.Name = "labelGameEdition"; + this.labelGameEdition.Size = new System.Drawing.Size(73, 36); + this.labelGameEdition.TabIndex = 22; + this.labelGameEdition.Text = "Unknown"; + this.labelGameEdition.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // pictureBoxGameEdition + // + this.pictureBoxGameEdition.BackColor = System.Drawing.Color.Black; + this.pictureBoxGameEdition.Image = global::Fo76ini.Properties.Resources.question_mark; + this.pictureBoxGameEdition.Location = new System.Drawing.Point(6, 367); + this.pictureBoxGameEdition.Name = "pictureBoxGameEdition"; + this.pictureBoxGameEdition.Size = new System.Drawing.Size(60, 60); + this.pictureBoxGameEdition.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBoxGameEdition.TabIndex = 21; + this.pictureBoxGameEdition.TabStop = false; + this.pictureBoxGameEdition.Click += new System.EventHandler(this.pictureBoxGameEdition_Click); + // // groupBoxUpdate // this.groupBoxUpdate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) @@ -2176,7 +2272,7 @@ private void InitializeComponent() this.groupBoxUpdate.Controls.Add(this.labelNewVersion); this.groupBoxUpdate.Controls.Add(this.buttonUpdateNow); this.groupBoxUpdate.Controls.Add(this.linkLabelManualDownloadPage); - this.groupBoxUpdate.Location = new System.Drawing.Point(93, 215); + this.groupBoxUpdate.Location = new System.Drawing.Point(93, 367); this.groupBoxUpdate.Name = "groupBoxUpdate"; this.groupBoxUpdate.Size = new System.Drawing.Size(279, 94); this.groupBoxUpdate.TabIndex = 20; @@ -2271,9 +2367,10 @@ private void InitializeComponent() // labelConfigVersion // this.labelConfigVersion.AutoSize = true; + this.labelConfigVersion.Font = new System.Drawing.Font("Microsoft YaHei", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.labelConfigVersion.Location = new System.Drawing.Point(178, 128); this.labelConfigVersion.Name = "labelConfigVersion"; - this.labelConfigVersion.Size = new System.Drawing.Size(13, 13); + this.labelConfigVersion.Size = new System.Drawing.Size(13, 16); this.labelConfigVersion.TabIndex = 9; this.labelConfigVersion.Text = "?"; // @@ -2367,16 +2464,28 @@ private void InitializeComponent() // this.groupBoxLaunchOptions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); + this.groupBoxLaunchOptions.Controls.Add(this.labelLaunchOptionMSStoreNotice); this.groupBoxLaunchOptions.Controls.Add(this.labelLaunchOptionTip); this.groupBoxLaunchOptions.Controls.Add(this.radioButtonLaunchViaExecutable); this.groupBoxLaunchOptions.Controls.Add(this.radioButtonLaunchViaLink); - this.groupBoxLaunchOptions.Location = new System.Drawing.Point(6, 391); + this.groupBoxLaunchOptions.Location = new System.Drawing.Point(6, 446); this.groupBoxLaunchOptions.Name = "groupBoxLaunchOptions"; - this.groupBoxLaunchOptions.Size = new System.Drawing.Size(376, 93); + this.groupBoxLaunchOptions.Size = new System.Drawing.Size(383, 93); this.groupBoxLaunchOptions.TabIndex = 25; this.groupBoxLaunchOptions.TabStop = false; this.groupBoxLaunchOptions.Text = "Launch options"; // + // labelLaunchOptionMSStoreNotice + // + this.labelLaunchOptionMSStoreNotice.AutoSize = true; + this.labelLaunchOptionMSStoreNotice.ForeColor = System.Drawing.Color.Red; + this.labelLaunchOptionMSStoreNotice.Location = new System.Drawing.Point(12, 67); + this.labelLaunchOptionMSStoreNotice.Name = "labelLaunchOptionMSStoreNotice"; + this.labelLaunchOptionMSStoreNotice.Size = new System.Drawing.Size(344, 13); + this.labelLaunchOptionMSStoreNotice.TabIndex = 3; + this.labelLaunchOptionMSStoreNotice.Text = "Fallout 76 cannot be run directly, if installed through the Microsoft Store."; + this.labelLaunchOptionMSStoreNotice.Visible = false; + // // labelLaunchOptionTip // this.labelLaunchOptionTip.AutoSize = true; @@ -2405,10 +2514,10 @@ private void InitializeComponent() this.radioButtonLaunchViaLink.AutoSize = true; this.radioButtonLaunchViaLink.Location = new System.Drawing.Point(10, 20); this.radioButtonLaunchViaLink.Name = "radioButtonLaunchViaLink"; - this.radioButtonLaunchViaLink.Size = new System.Drawing.Size(261, 17); + this.radioButtonLaunchViaLink.Size = new System.Drawing.Size(316, 17); this.radioButtonLaunchViaLink.TabIndex = 0; this.radioButtonLaunchViaLink.TabStop = true; - this.radioButtonLaunchViaLink.Text = "Launch via Steam / Bethesda.net (recommended)"; + this.radioButtonLaunchViaLink.Text = "Launch via Steam / Bethesda.net / MS Store (recommended)"; this.radioButtonLaunchViaLink.UseVisualStyleBackColor = true; // // groupBoxGamePaths @@ -2418,9 +2527,9 @@ private void InitializeComponent() this.groupBoxGamePaths.Controls.Add(this.labelGamePath); this.groupBoxGamePaths.Controls.Add(this.textBoxGamePath); this.groupBoxGamePaths.Controls.Add(this.buttonPickGamePath); - this.groupBoxGamePaths.Location = new System.Drawing.Point(6, 218); + this.groupBoxGamePaths.Location = new System.Drawing.Point(6, 273); this.groupBoxGamePaths.Name = "groupBoxGamePaths"; - this.groupBoxGamePaths.Size = new System.Drawing.Size(376, 45); + this.groupBoxGamePaths.Size = new System.Drawing.Size(383, 45); this.groupBoxGamePaths.TabIndex = 24; this.groupBoxGamePaths.TabStop = false; this.groupBoxGamePaths.Text = "Paths"; @@ -2440,14 +2549,14 @@ private void InitializeComponent() | System.Windows.Forms.AnchorStyles.Right))); this.textBoxGamePath.Location = new System.Drawing.Point(111, 16); this.textBoxGamePath.Name = "textBoxGamePath"; - this.textBoxGamePath.Size = new System.Drawing.Size(224, 20); + this.textBoxGamePath.Size = new System.Drawing.Size(231, 20); this.textBoxGamePath.TabIndex = 18; this.textBoxGamePath.TextChanged += new System.EventHandler(this.textBoxGamePath_TextChanged); // // buttonPickGamePath // this.buttonPickGamePath.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.buttonPickGamePath.Location = new System.Drawing.Point(341, 14); + this.buttonPickGamePath.Location = new System.Drawing.Point(348, 14); this.buttonPickGamePath.Name = "buttonPickGamePath"; this.buttonPickGamePath.Size = new System.Drawing.Size(28, 23); this.buttonPickGamePath.TabIndex = 19; @@ -2459,9 +2568,9 @@ private void InitializeComponent() // this.buttonForceUpdate.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.buttonForceUpdate.Location = new System.Drawing.Point(6, 628); + this.buttonForceUpdate.Location = new System.Drawing.Point(6, 683); this.buttonForceUpdate.Name = "buttonForceUpdate"; - this.buttonForceUpdate.Size = new System.Drawing.Size(376, 23); + this.buttonForceUpdate.Size = new System.Drawing.Size(383, 23); this.buttonForceUpdate.TabIndex = 23; this.buttonForceUpdate.Text = "Force auto-update"; this.buttonForceUpdate.UseVisualStyleBackColor = true; @@ -2476,9 +2585,9 @@ private void InitializeComponent() this.groupBoxBehavior.Controls.Add(this.checkBoxQuitOnGameLaunch); this.groupBoxBehavior.Controls.Add(this.checkBoxSkipBackupQuestion); this.groupBoxBehavior.Controls.Add(this.checkBoxAutoApply); - this.groupBoxBehavior.Location = new System.Drawing.Point(6, 490); + this.groupBoxBehavior.Location = new System.Drawing.Point(6, 545); this.groupBoxBehavior.Name = "groupBoxBehavior"; - this.groupBoxBehavior.Size = new System.Drawing.Size(376, 132); + this.groupBoxBehavior.Size = new System.Drawing.Size(383, 132); this.groupBoxBehavior.TabIndex = 22; this.groupBoxBehavior.TabStop = false; this.groupBoxBehavior.Text = "Behavior"; @@ -2493,7 +2602,7 @@ private void InitializeComponent() this.groupBoxLocalization.Controls.Add(this.comboBoxLanguage); this.groupBoxLocalization.Location = new System.Drawing.Point(6, 6); this.groupBoxLocalization.Name = "groupBoxLocalization"; - this.groupBoxLocalization.Size = new System.Drawing.Size(376, 111); + this.groupBoxLocalization.Size = new System.Drawing.Size(383, 111); this.groupBoxLocalization.TabIndex = 21; this.groupBoxLocalization.TabStop = false; this.groupBoxLocalization.Text = "Localization"; @@ -2523,7 +2632,7 @@ private void InitializeComponent() | System.Windows.Forms.AnchorStyles.Right))); this.buttonDownloadLanguages.Location = new System.Drawing.Point(98, 49); this.buttonDownloadLanguages.Name = "buttonDownloadLanguages"; - this.buttonDownloadLanguages.Size = new System.Drawing.Size(271, 23); + this.buttonDownloadLanguages.Size = new System.Drawing.Size(278, 23); this.buttonDownloadLanguages.TabIndex = 20; this.buttonDownloadLanguages.Text = "Download / update language files"; this.buttonDownloadLanguages.UseVisualStyleBackColor = true; @@ -2537,7 +2646,7 @@ private void InitializeComponent() this.comboBoxLanguage.FormattingEnabled = true; this.comboBoxLanguage.Location = new System.Drawing.Point(98, 22); this.comboBoxLanguage.Name = "comboBoxLanguage"; - this.comboBoxLanguage.Size = new System.Drawing.Size(271, 21); + this.comboBoxLanguage.Size = new System.Drawing.Size(278, 21); this.comboBoxLanguage.TabIndex = 17; this.comboBoxLanguage.SelectedIndexChanged += new System.EventHandler(this.comboBoxLanguage_SelectedIndexChanged); // @@ -2549,9 +2658,9 @@ private void InitializeComponent() this.groupBoxOptions.Controls.Add(this.checkBoxMultipleGameEditionsUsed); this.groupBoxOptions.Controls.Add(this.checkBoxNWMode); this.groupBoxOptions.Controls.Add(this.checkBoxReadOnly); - this.groupBoxOptions.Location = new System.Drawing.Point(6, 269); + this.groupBoxOptions.Location = new System.Drawing.Point(6, 324); this.groupBoxOptions.Name = "groupBoxOptions"; - this.groupBoxOptions.Size = new System.Drawing.Size(376, 116); + this.groupBoxOptions.Size = new System.Drawing.Size(383, 116); this.groupBoxOptions.TabIndex = 15; this.groupBoxOptions.TabStop = false; this.groupBoxOptions.Text = "Options"; @@ -2560,9 +2669,9 @@ private void InitializeComponent() // this.buttonFixIssuesEarlierVersion.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.buttonFixIssuesEarlierVersion.Location = new System.Drawing.Point(6, 657); + this.buttonFixIssuesEarlierVersion.Location = new System.Drawing.Point(6, 712); this.buttonFixIssuesEarlierVersion.Name = "buttonFixIssuesEarlierVersion"; - this.buttonFixIssuesEarlierVersion.Size = new System.Drawing.Size(376, 23); + this.buttonFixIssuesEarlierVersion.Size = new System.Drawing.Size(383, 23); this.buttonFixIssuesEarlierVersion.TabIndex = 19; this.buttonFixIssuesEarlierVersion.Text = "Fix settings from v1.3.1 and earlier"; this.buttonFixIssuesEarlierVersion.UseVisualStyleBackColor = true; @@ -2576,7 +2685,8 @@ private void InitializeComponent() // openFileDialogGamePath // this.openFileDialogGamePath.FileName = "Fallout76.exe"; - this.openFileDialogGamePath.Filter = "Fallout76.exe|Fallout76.exe"; + this.openFileDialogGamePath.Filter = "Fallout 76 executable|Fallout76.exe;Project76_GamePass.exe"; + this.openFileDialogGamePath.FilterIndex = 2; // // Form1 // @@ -2655,8 +2765,13 @@ private void InitializeComponent() this.groupBoxMainMenu.PerformLayout(); this.groupBoxGameEdition.ResumeLayout(false); this.groupBoxGameEdition.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxMSStore)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxSteam)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxBethesdaNetPTS)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxBethesdaNet)).EndInit(); this.tabPageInfo.ResumeLayout(false); this.tabPageInfo.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxGameEdition)).EndInit(); this.groupBoxUpdate.ResumeLayout(false); this.groupBoxUpdate.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); @@ -2831,7 +2946,6 @@ private void InitializeComponent() private System.Windows.Forms.Button buttonFixIssuesEarlierVersion; private System.Windows.Forms.Label labelLanguage; private System.Windows.Forms.ComboBox comboBoxLanguage; - private System.Windows.Forms.PictureBox pictureBox1; private System.Windows.Forms.PictureBox pictureBox2; private System.Windows.Forms.CheckBox checkBoxAutoApply; private System.Windows.Forms.CheckBox checkBoxSkipBackupQuestion; @@ -2856,6 +2970,15 @@ private void InitializeComponent() private System.Windows.Forms.Label labelLaunchOptionTip; private System.Windows.Forms.OpenFileDialog openFileDialogGamePath; private System.Windows.Forms.CheckBox checkBoxDenyNTFSWritePermission; + private System.Windows.Forms.RadioButton radioButtonEditionMSStore; + private System.Windows.Forms.PictureBox pictureBoxGameEdition; + private System.Windows.Forms.PictureBox pictureBoxBethesdaNet; + private System.Windows.Forms.PictureBox pictureBoxMSStore; + private System.Windows.Forms.PictureBox pictureBoxSteam; + private System.Windows.Forms.PictureBox pictureBoxBethesdaNetPTS; + private System.Windows.Forms.Label labelGameEdition; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Label labelLaunchOptionMSStoreNotice; } } diff --git a/Fo76ini/Form1.Language.cs b/Fo76ini/Form1.Language.cs index 7ca1c25..18258f5 100644 --- a/Fo76ini/Form1.Language.cs +++ b/Fo76ini/Form1.Language.cs @@ -101,7 +101,8 @@ private int SerializeControlText(XElement element, ToolTip toolTip, Control cont subControl.Name != "labelTranslationAuthor" && subControl.Name != "groupBoxWIP" && subControl.Name != "labelNewVersion" && - subControl.Name != "labelModsDeploy") + subControl.Name != "labelModsDeploy" && + subControl.Name != "labelGameEdition") { // Get XElement name: String type = "Element"; diff --git a/Fo76ini/Form1.cs b/Fo76ini/Form1.cs index 1c94c20..f5ea9ae 100644 --- a/Fo76ini/Form1.cs +++ b/Fo76ini/Form1.cs @@ -161,7 +161,9 @@ private void Form1_Load(object sender, EventArgs e) // Load *.ini files: try { + IniFiles.Instance.GameEdition = (GameEdition)IniFiles.Instance.GetInt(IniFile.Config, "Preferences", "uGameEdition", 0); IniFiles.Instance.LoadGameInis(); + IniFiles.Instance.Set(IniFile.Config, "Preferences", "uGameEdition", (int)IniFiles.Instance.GameEdition); } catch (IniParser.Exceptions.ParsingException exc) { @@ -171,7 +173,7 @@ private void Form1_Load(object sender, EventArgs e) } catch (FileNotFoundException exc) { - MsgBox.Get("runGameToGenerateINI").Show(MessageBoxButtons.OK, MessageBoxIcon.Error); + MsgBox.Get("runGameToGenerateINI").FormatTitle(IniFiles.Instance.GetIniName(IniFile.F76), IniFiles.Instance.GetIniName(IniFile.F76Prefs)).Show(MessageBoxButtons.OK, MessageBoxIcon.Error); Application.Exit(); return; } @@ -300,8 +302,8 @@ private void AddAllEventHandler() // Game Edition uiLoader.LinkList( - new RadioButton[] { this.radioButtonEditionBethesdaNet, this.radioButtonEditionSteam, this.radioButtonEditionBethesdaNetPTS }, - new String[] { "1", "2", "3" }, + new RadioButton[] { this.radioButtonEditionBethesdaNet, this.radioButtonEditionSteam, this.radioButtonEditionBethesdaNetPTS, this.radioButtonEditionMSStore }, + new String[] { "1", "2", "3", "4" }, IniFile.Config, "Preferences", "uGameEdition", "0" ); @@ -831,6 +833,9 @@ private void buttonLaunchGame_Click(object sender, EventArgs e) case (uint)GameEdition.BethesdaNetPTS: process = "bethesdanet://run/57"; break; + case (uint)GameEdition.MSStore: + process = "ms-windows-store://pdp/?ProductId=9nkgnmnk3k3z"; + break; default: MsgBox.Get("chooseGameEdition").Show(MessageBoxButtons.OK, MessageBoxIcon.Information); return; @@ -843,15 +848,26 @@ private void buttonLaunchGame_Click(object sender, EventArgs e) MsgBox.Get("modsGamePathNotSet").Show(MessageBoxButtons.OK, MessageBoxIcon.Information); return; } - process = Path.GetFullPath(Path.Combine(ManagedMods.Instance.GamePath, "Fallout76.exe")); + process = Path.GetFullPath(Path.Combine(ManagedMods.Instance.GamePath, ManagedMods.Instance.GameEdition == GameEdition.MSStore ? "Project76_GamePass.exe" : "Fallout76.exe")); } if (process != null) { if (IniFiles.Instance.GetBool(IniFile.Config, "Preferences", "bAutoApply", false)) ApplyChanges(); - System.Diagnostics.Process.Start(process); - if (IniFiles.Instance.GetBool(IniFile.Config, "Preferences", "bQuitOnLaunch", false)) - this.Close(); + try + { + System.Diagnostics.Process.Start(process); + if (IniFiles.Instance.GetBool(IniFile.Config, "Preferences", "bQuitOnLaunch", false)) + this.Close(); + } + catch (Exception ex) + { + if (ManagedMods.Instance.GameEdition == GameEdition.MSStore) + { + MsgBox.Get("msstoreRunExecutableFailed").FormatTitle(ex.Message).Show(MessageBoxIcon.Error); + return; + } + } } } @@ -924,31 +940,102 @@ private void buttonFixIssuesEarlierVersion_Click(object sender, EventArgs e) * Game edition */ - private void radioButtonEditionSteam_CheckedChanged(object sender, EventArgs e) + private void ChangeGameEdition(GameEdition edition) { - if (this.radioButtonEditionSteam.Checked) + bool restartRequired = ManagedMods.Instance.GameEdition != GameEdition.Unknown && ((ManagedMods.Instance.GameEdition == GameEdition.MSStore && edition != GameEdition.MSStore) || (ManagedMods.Instance.GameEdition != GameEdition.MSStore && edition == GameEdition.MSStore)); + + if (restartRequired && MsgBox.Get("msstoreRestartRequired").Show(MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + { + switch (ManagedMods.Instance.GameEdition) + { + case GameEdition.Steam: + this.radioButtonEditionSteam.Checked = true; + break; + case GameEdition.BethesdaNet: + this.radioButtonEditionBethesdaNet.Checked = true; + break; + case GameEdition.BethesdaNetPTS: + this.radioButtonEditionBethesdaNetPTS.Checked = true; + break; + case GameEdition.MSStore: + this.radioButtonEditionMSStore.Checked = true; + break; + } + return; + } + + // Change image + switch (edition) + { + case GameEdition.Steam: + this.pictureBoxGameEdition.Image = Properties.Resources.steam; + this.labelGameEdition.Text = "Steam"; + break; + case GameEdition.BethesdaNet: + this.pictureBoxGameEdition.Image = Properties.Resources.bethesda; + this.labelGameEdition.Text = "Bethesda"; + break; + case GameEdition.BethesdaNetPTS: + this.pictureBoxGameEdition.Image = Properties.Resources.bethesda_pts; + this.labelGameEdition.Text = "Bethesda\n(PTS)"; + break; + case GameEdition.MSStore: + this.pictureBoxGameEdition.Image = Properties.Resources.msstore; + this.labelGameEdition.Text = "Microsoft\nStore"; + break; + default: + this.pictureBoxGameEdition.Image = Properties.Resources.question_mark; + this.labelGameEdition.Text = "Unknown"; + break; + } + + // Currently, no way to launch game executable, if installed via MS Store: + /*if (edition == GameEdition.MSStore) + { + IniFiles.Instance.Set(IniFile.Config, "Preferences", "uLaunchOption", 1); + + this.radioButtonLaunchViaExecutable.Checked = false; + this.radioButtonLaunchViaExecutable.Enabled = false; + this.radioButtonLaunchViaLink.Checked = true; + } + else + { + this.radioButtonLaunchViaExecutable.Enabled = true; + }*/ + + IniFiles.Instance.ChangeGameEdition(edition); + this.formMods.ChangeGameEdition(edition); + this.textBoxGamePath.Text = ManagedMods.Instance.GamePath; + + if (restartRequired) { - this.formMods.ChangeGameEdition(GameEdition.Steam); - this.textBoxGamePath.Text = ManagedMods.Instance.GamePath; + IniFiles.Instance.SaveWindowState("Form1", this); + Application.Restart(); } } + private void radioButtonEditionSteam_CheckedChanged(object sender, EventArgs e) + { + if (this.radioButtonEditionSteam.Checked) + ChangeGameEdition(GameEdition.Steam); + } + private void radioButtonEditionBethesdaNet_CheckedChanged(object sender, EventArgs e) { if (this.radioButtonEditionBethesdaNet.Checked) - { - this.formMods.ChangeGameEdition(GameEdition.BethesdaNet); - this.textBoxGamePath.Text = ManagedMods.Instance.GamePath; - } + ChangeGameEdition(GameEdition.BethesdaNet); } private void radioButtonEditionBethesdaNetPTS_CheckedChanged(object sender, EventArgs e) { if (this.radioButtonEditionBethesdaNetPTS.Checked) - { - this.formMods.ChangeGameEdition(GameEdition.BethesdaNetPTS); - this.textBoxGamePath.Text = ManagedMods.Instance.GamePath; - } + ChangeGameEdition(GameEdition.BethesdaNetPTS); + } + + private void radioButtonEditionMSStore_CheckedChanged(object sender, EventArgs e) + { + if (this.radioButtonEditionMSStore.Checked) + ChangeGameEdition(GameEdition.MSStore); } // Nuclear Winter mode @@ -959,13 +1046,30 @@ private void checkBoxNWMode_CheckedChanged(object sender, EventArgs e) { if (MsgBox.ShowID("nwModeEnabledButModsAreDeployed", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { - ManagedMods.Instance.nuclearWinterMode = IniFiles.Instance.nuclearWinterMode; + // Disable mods: + ManagedMods.Instance.nuclearWinterMode = true; + this.formMods.OpenUI(); + this.formMods.Deploy(); + } + } + else if (!IniFiles.Instance.nuclearWinterMode && ManagedMods.Instance.nuclearWinterMode && ManagedMods.Instance.Mods.Count() > 0) + { + if (MsgBox.ShowID("nwModeDisabledAndModsAreStillDisabled", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + // Enable mods: + ManagedMods.Instance.nuclearWinterMode = false; this.formMods.OpenUI(); this.formMods.Deploy(); } } } + private void pictureBoxGameEdition_Click(object sender, EventArgs e) + { + this.tabControl1.SelectTab(this.tabPageSettings); + this.groupBoxGameEdition.Focus(); + } + private void checkBoxShowPassword_CheckedChanged(object sender, EventArgs e) { // https://stackoverflow.com/questions/8185747/how-can-i-unmask-password-text-box-and-mask-it-back-to-password @@ -1131,7 +1235,14 @@ private void textBoxGamePath_TextChanged(object sender, EventArgs e) private void radioButtonLaunchViaExecutable_CheckedChanged(object sender, EventArgs e) { - this.labelLaunchOptionTip.Visible = this.radioButtonLaunchViaExecutable.Checked; + this.labelLaunchOptionTip.Visible = false; + this.labelLaunchOptionMSStoreNotice.Visible = false; + + if (ManagedMods.Instance.GameEdition == GameEdition.BethesdaNet || ManagedMods.Instance.GameEdition == GameEdition.BethesdaNetPTS) + this.labelLaunchOptionTip.Visible = this.radioButtonLaunchViaExecutable.Checked; + + else if (ManagedMods.Instance.GameEdition == GameEdition.MSStore) + this.labelLaunchOptionMSStoreNotice.Visible = this.radioButtonLaunchViaExecutable.Checked; } } } diff --git a/Fo76ini/FormMods.Designer.cs b/Fo76ini/FormMods.Designer.cs index c5f9e53..0de8466 100644 --- a/Fo76ini/FormMods.Designer.cs +++ b/Fo76ini/FormMods.Designer.cs @@ -676,8 +676,7 @@ private void InitializeComponent() // // openFileDialogGamePath // - this.openFileDialogGamePath.FileName = "Fallout76.exe"; - this.openFileDialogGamePath.Filter = "Fallout76.exe|Fallout76.exe"; + this.openFileDialogGamePath.Filter = "Fallout 76 executable|Fallout76.exe,Project76_GamePass.exe"; // // panel1 // diff --git a/Fo76ini/FormMods.resx b/Fo76ini/FormMods.resx index c0381ac..2c607a1 100644 --- a/Fo76ini/FormMods.resx +++ b/Fo76ini/FormMods.resx @@ -123,12 +123,6 @@ 222, 17 - - 132, 17 - - - 222, 17 - @@ -142,6 +136,9 @@ 132, 17 + + 132, 17 + 327, 17 diff --git a/Fo76ini/IniFiles.cs b/Fo76ini/IniFiles.cs index ae42689..50d7a70 100644 --- a/Fo76ini/IniFiles.cs +++ b/Fo76ini/IniFiles.cs @@ -25,7 +25,8 @@ public enum GameEdition Unknown = 0, BethesdaNet = 1, Steam = 2, - BethesdaNetPTS = 3 + BethesdaNetPTS = 3, + MSStore = 4 } public class IniFiles @@ -37,9 +38,9 @@ public class IniFiles protected IniData fo76CustomData = null; protected IniData configData = null; - protected String fo76Path; + /*protected String fo76Path; protected String fo76PrefsPath; - protected String fo76CustomPath; + protected String fo76CustomPath;*/ protected String configPath; protected DateTime fo76ModTime; @@ -57,6 +58,8 @@ public class IniFiles public bool nuclearWinterMode = false; + public GameEdition GameEdition; + public static IniFiles Instance { get @@ -72,6 +75,69 @@ public static IniFiles Instance } } + public String GetIniName(IniFile iniFile, GameEdition edition = GameEdition.Unknown) + { + if (edition == GameEdition.Unknown) + edition = this.GameEdition; + bool msstore = edition == GameEdition.MSStore; + switch (iniFile) + { + case IniFile.F76: + return msstore ? "Project76.ini" : "Fallout76.ini"; + case IniFile.F76Prefs: + return msstore ? "Project76Prefs.ini" : "Fallout76Prefs.ini"; + case IniFile.F76Custom: + return msstore ? "Project76Custom.ini" : "Fallout76Custom.ini"; + case IniFile.Config: + return "QuickConfiguration.ini"; + } + return null; + } + + public String GetIniPath(IniFile iniFile, GameEdition edition) + { + switch (iniFile) + { + case IniFile.F76: + case IniFile.F76Prefs: + case IniFile.F76Custom: + return Path.Combine(this.iniParentPath, GetIniName(iniFile, edition)); + case IniFile.Config: + return this.configPath; + } + return null; + } + + public String GetIniPath(IniFile iniFile) + { + switch (iniFile) + { + case IniFile.F76: + case IniFile.F76Prefs: + case IniFile.F76Custom: + return Path.Combine(this.iniParentPath, GetIniName(iniFile)); + case IniFile.Config: + return this.configPath; + } + return null; + } + + protected IniData GetIniData(IniFile iniFile) + { + switch (iniFile) + { + case IniFile.F76: + return this.fo76Data; + case IniFile.F76Prefs: + return this.fo76PrefsData; + case IniFile.F76Custom: + return this.fo76CustomData; + case IniFile.Config: + return this.configData; + } + return null; + } + private IniFiles() { // Get the paths: @@ -80,9 +146,9 @@ private IniFiles() @"My Games\Fallout 76\" ); - this.fo76Path = Path.Combine(this.iniParentPath, "Fallout76.ini"); - this.fo76PrefsPath = Path.Combine(this.iniParentPath, "Fallout76Prefs.ini"); - this.fo76CustomPath = Path.Combine(this.iniParentPath, "Fallout76Custom.ini"); + /*this.GetIniName(IniFile.F76) = Path.Combine(this.iniParentPath, "Fallout76.ini"); + this.GetIniName(IniFile.F76Prefs) = Path.Combine(this.iniParentPath, "Fallout76Prefs.ini"); + this.GetIniName(IniFile.F76Custom) = Path.Combine(this.iniParentPath, "Fallout76Custom.ini");*/ String oldConfigPath = Path.Combine(this.iniParentPath, "QuickConfiguration.ini"); this.configPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Fallout 76 Quick Configuration", "config.ini"); @@ -116,22 +182,39 @@ public void LoadGameInis() // Parse all INI files, if existing: // Do Fallout76.ini and Fallout76Prefs.ini exist? - if (!File.Exists(this.fo76Path) || !File.Exists(this.fo76PrefsPath)) - throw new FileNotFoundException("Fallout76.ini and Fallout76Prefs.ini not found"); + if (!File.Exists(GetIniPath(IniFile.F76)) || !File.Exists(GetIniPath(IniFile.F76Prefs))) + { + if (this.GameEdition == GameEdition.MSStore) + { + // Do Fallout76.ini and Fallout76Prefs.ini exist? + if (File.Exists(GetIniPath(IniFile.F76, GameEdition.Steam)) && File.Exists(GetIniPath(IniFile.F76Prefs, GameEdition.Steam))) + this.GameEdition = GameEdition.Steam; + else + throw new FileNotFoundException($"{GetIniName(IniFile.F76)} and {GetIniName(IniFile.F76Prefs)} not found"); + } + else + { + // Do Project76.ini and Project76Prefs.ini exist? + if (File.Exists(GetIniPath(IniFile.F76, GameEdition.MSStore)) && File.Exists(GetIniPath(IniFile.F76Prefs, GameEdition.MSStore))) + this.GameEdition = GameEdition.MSStore; + else + throw new FileNotFoundException($"{GetIniName(IniFile.F76)} and {GetIniName(IniFile.F76Prefs)} not found"); + } + } // Does Fallout76Custom.ini exist? If not, create it. - /*if (!File.Exists(this.fo76CustomPath)) - File.CreateText(this.fo76CustomPath).Close();*/ + /*if (!File.Exists(this.GetIniPath(IniFile.F76Custom))) + File.CreateText(this.GetIniPath(IniFile.F76Custom)).Close();*/ // Parse *.ini files: - this.fo76Data = LoadIni(this.fo76Path, false); - this.fo76ModTime = File.GetLastWriteTime(this.fo76Path); - this.fo76PrefsData = LoadIni(this.fo76PrefsPath, false); - this.fo76PrefsModTime = File.GetLastWriteTime(this.fo76PrefsPath); - if (File.Exists(this.fo76CustomPath)) - this.fo76CustomData = LoadIni(this.fo76CustomPath, false); - else if (File.Exists(this.fo76CustomPath + ".nwmodebak")) - this.fo76CustomData = LoadIni(this.fo76CustomPath + ".nwmodebak", false); + this.fo76Data = LoadIni(GetIniPath(IniFile.F76), false); + this.fo76ModTime = File.GetLastWriteTime(GetIniPath(IniFile.F76)); + this.fo76PrefsData = LoadIni(GetIniPath(IniFile.F76Prefs), false); + this.fo76PrefsModTime = File.GetLastWriteTime(GetIniPath(IniFile.F76Prefs)); + if (File.Exists(GetIniPath(IniFile.F76Custom))) + this.fo76CustomData = LoadIni(GetIniPath(IniFile.F76Custom), false); + else if (File.Exists(GetIniPath(IniFile.F76Custom) + ".nwmodebak")) + this.fo76CustomData = LoadIni(GetIniPath(IniFile.F76Custom) + ".nwmodebak", false); else this.fo76CustomData = new IniData(); @@ -149,14 +232,23 @@ public bool IsLoaded() this.configData != null; } + public void ChangeGameEdition(GameEdition edition) + { + //bool reloadRequired = (this.GameEdition == GameEdition.MSStore && edition != GameEdition.MSStore) || (this.GameEdition != GameEdition.MSStore && edition == GameEdition.MSStore); + this.GameEdition = edition; + /*if (reloadRequired) + LoadGameInis();*/ + UpdateLastModifiedDates(); + } + public void SaveGameInis(bool readOnly = false) { - SaveIni(this.fo76Path, this.fo76Data, readOnly); - SaveIni(this.fo76PrefsPath, this.fo76PrefsData, readOnly); + SaveIni(this.GetIniPath(IniFile.F76), this.fo76Data, readOnly); + SaveIni(this.GetIniPath(IniFile.F76Prefs), this.fo76PrefsData, readOnly); if (this.nuclearWinterMode) - SaveIni(this.fo76CustomPath + ".nwmodebak", this.fo76CustomData, readOnly); + SaveIni(this.GetIniPath(IniFile.F76Custom) + ".nwmodebak", this.fo76CustomData, readOnly); else - SaveIni(this.fo76CustomPath, this.fo76CustomData, readOnly); + SaveIni(this.GetIniPath(IniFile.F76Custom), this.fo76CustomData, readOnly); UpdateLastModifiedDates(); } @@ -165,19 +257,19 @@ public void ResolveNWMode() SetNTFSWritePermission(true); if (this.nuclearWinterMode) { - if (!File.Exists(this.fo76CustomPath)) + if (!File.Exists(this.GetIniPath(IniFile.F76Custom))) return; - if (!File.Exists(this.fo76CustomPath + ".nwmodebak")) - File.Copy(this.fo76CustomPath, this.fo76CustomPath + ".nwmodebak"); - Utils.DeleteFile(this.fo76CustomPath); + if (!File.Exists(this.GetIniPath(IniFile.F76Custom) + ".nwmodebak")) + File.Copy(this.GetIniPath(IniFile.F76Custom), this.GetIniPath(IniFile.F76Custom) + ".nwmodebak"); + Utils.DeleteFile(this.GetIniPath(IniFile.F76Custom)); } else { - if (!File.Exists(this.fo76CustomPath + ".nwmodebak")) + if (!File.Exists(this.GetIniPath(IniFile.F76Custom) + ".nwmodebak")) return; - if (!File.Exists(this.fo76CustomPath)) - File.Copy(this.fo76CustomPath + ".nwmodebak", this.fo76CustomPath); - Utils.DeleteFile(this.fo76CustomPath + ".nwmodebak"); + if (!File.Exists(this.GetIniPath(IniFile.F76Custom))) + File.Copy(this.GetIniPath(IniFile.F76Custom) + ".nwmodebak", this.GetIniPath(IniFile.F76Custom)); + Utils.DeleteFile(this.GetIniPath(IniFile.F76Custom) + ".nwmodebak"); } UpdateLastModifiedDates(); @@ -187,19 +279,19 @@ public void ResolveNWMode() public bool FilesHaveBeenModified() { - if (this.fo76ModTime != File.GetLastWriteTime(this.fo76Path)) + if (this.fo76ModTime != File.GetLastWriteTime(this.GetIniPath(IniFile.F76))) return true; - if (this.fo76PrefsModTime != File.GetLastWriteTime(this.fo76PrefsPath)) + if (this.fo76PrefsModTime != File.GetLastWriteTime(this.GetIniPath(IniFile.F76Prefs))) return true; - if (File.Exists(this.fo76CustomPath)) + if (File.Exists(this.GetIniPath(IniFile.F76Custom))) { - if (this.fo76CustomModTime != File.GetLastWriteTime(this.fo76CustomPath)) + if (this.fo76CustomModTime != File.GetLastWriteTime(this.GetIniPath(IniFile.F76Custom))) return true; } - else if (File.Exists(this.fo76CustomPath + ".nwmodebak")) + else if (File.Exists(this.GetIniPath(IniFile.F76Custom) + ".nwmodebak")) { - if (this.fo76CustomModTime != File.GetLastWriteTime(this.fo76CustomPath + ".nwmodebak")) + if (this.fo76CustomModTime != File.GetLastWriteTime(this.GetIniPath(IniFile.F76Custom) + ".nwmodebak")) return true; } return false; @@ -207,13 +299,13 @@ public bool FilesHaveBeenModified() public void UpdateLastModifiedDates() { - this.fo76ModTime = File.GetLastWriteTime(this.fo76Path); - this.fo76PrefsModTime = File.GetLastWriteTime(this.fo76PrefsPath); + this.fo76ModTime = File.GetLastWriteTime(this.GetIniPath(IniFile.F76)); + this.fo76PrefsModTime = File.GetLastWriteTime(this.GetIniPath(IniFile.F76Prefs)); - if (File.Exists(this.fo76CustomPath)) - this.fo76CustomModTime = File.GetLastWriteTime(this.fo76CustomPath); - else if (File.Exists(this.fo76CustomPath + ".nwmodebak")) - this.fo76CustomModTime = File.GetLastWriteTime(this.fo76CustomPath + ".nwmodebak"); + if (File.Exists(this.GetIniPath(IniFile.F76Custom))) + this.fo76CustomModTime = File.GetLastWriteTime(this.GetIniPath(IniFile.F76Custom)); + else if (File.Exists(this.GetIniPath(IniFile.F76Custom) + ".nwmodebak")) + this.fo76CustomModTime = File.GetLastWriteTime(this.GetIniPath(IniFile.F76Custom) + ".nwmodebak"); } public void LoadConfig() @@ -253,84 +345,35 @@ public void BackupAll(String backupFolder = null) Directory.CreateDirectory(backupPath); - if (File.Exists(this.fo76Path)) + if (File.Exists(this.GetIniPath(IniFile.F76))) { tempPath = Path.Combine(backupPath, "Fallout76.ini"); - File.Copy(this.fo76Path, tempPath); + File.Copy(this.GetIniPath(IniFile.F76), tempPath); SetFileReadOnlyAttribute(tempPath, false); } - if (File.Exists(this.fo76PrefsPath)) + if (File.Exists(this.GetIniPath(IniFile.F76Prefs))) { tempPath = Path.Combine(backupPath, "Fallout76Prefs.ini"); - File.Copy(this.fo76PrefsPath, tempPath); + File.Copy(this.GetIniPath(IniFile.F76Prefs), tempPath); SetFileReadOnlyAttribute(tempPath, false); } - if (File.Exists(this.fo76CustomPath)) + if (File.Exists(this.GetIniPath(IniFile.F76Custom))) { tempPath = Path.Combine(backupPath, "Fallout76Custom.ini"); - File.Copy(this.fo76CustomPath, tempPath); + File.Copy(this.GetIniPath(IniFile.F76Custom), tempPath); SetFileReadOnlyAttribute(tempPath, false); } - if (File.Exists(this.fo76CustomPath + ".nwmodebak")) + if (File.Exists(this.GetIniPath(IniFile.F76Custom) + ".nwmodebak")) { tempPath = Path.Combine(backupPath, "Fallout76Custom.ini.nwmodebak"); - File.Copy(this.fo76CustomPath + ".nwmodebak", tempPath); + File.Copy(this.GetIniPath(IniFile.F76Custom) + ".nwmodebak", tempPath); SetFileReadOnlyAttribute(tempPath, false); } } - - protected String GetIniName(IniFile iniFile) - { - switch (iniFile) - { - case IniFile.F76: - return "Fallout76.ini"; - case IniFile.F76Prefs: - return "Fallout76Prefs.ini"; - case IniFile.F76Custom: - return "Fallout76Custom.ini"; - case IniFile.Config: - return "QuickConfiguration.ini"; - } - return null; - } - - protected String GetIniPath(IniFile iniFile) - { - switch (iniFile) - { - case IniFile.F76: - return this.fo76Path; - case IniFile.F76Prefs: - return this.fo76PrefsPath; - case IniFile.F76Custom: - return this.fo76CustomPath; - case IniFile.Config: - return this.configPath; - } - return null; - } - - protected IniData GetIniData(IniFile iniFile) - { - switch (iniFile) - { - case IniFile.F76: - return this.fo76Data; - case IniFile.F76Prefs: - return this.fo76PrefsData; - case IniFile.F76Custom: - return this.fo76CustomData; - case IniFile.Config: - return this.configData; - } - return null; - } - protected void RemoveEmptySections(IniData data) { List sectionNames = new List(); @@ -416,17 +459,17 @@ protected void SetFileReadOnlyAttribute(String path, bool readOnly) public void SetINIsReadOnly(bool readOnly) { - SetFileReadOnlyAttribute(this.fo76Path, readOnly); - SetFileReadOnlyAttribute(this.fo76PrefsPath, readOnly); - SetFileReadOnlyAttribute(this.fo76CustomPath, readOnly); + SetFileReadOnlyAttribute(this.GetIniPath(IniFile.F76), readOnly); + SetFileReadOnlyAttribute(this.GetIniPath(IniFile.F76Prefs), readOnly); + SetFileReadOnlyAttribute(this.GetIniPath(IniFile.F76Custom), readOnly); } public bool AreINIsReadOnly() { - if (File.Exists(this.fo76Path) && File.Exists(this.fo76PrefsPath)) + if (File.Exists(this.GetIniPath(IniFile.F76)) && File.Exists(this.GetIniPath(IniFile.F76Prefs))) { - FileInfo fo76fi = new FileInfo(this.fo76Path); - FileInfo fo76Prefsfi = new FileInfo(this.fo76PrefsPath); + FileInfo fo76fi = new FileInfo(this.GetIniPath(IniFile.F76)); + FileInfo fo76Prefsfi = new FileInfo(this.GetIniPath(IniFile.F76Prefs)); return fo76fi.IsReadOnly && fo76Prefsfi.IsReadOnly; } return false; @@ -756,7 +799,7 @@ protected void FixDuplicateResourceLists() MergeLists(IniFile.F76Custom, "Archive", "sResourceArchive2List"); MergeLists(IniFile.F76Custom, "Archive", "sResourceDataDirsFinal"); - this.fo76CustomModTime = File.GetLastWriteTime(this.fo76CustomPath); + this.fo76CustomModTime = File.GetLastWriteTime(this.GetIniPath(IniFile.F76Custom)); } diff --git a/Fo76ini/Mods.cs b/Fo76ini/Mods.cs index 0551830..63b9c53 100644 --- a/Fo76ini/Mods.cs +++ b/Fo76ini/Mods.cs @@ -498,6 +498,8 @@ public static String GetEditionSuffix(GameEdition gameEdition) return "BethesdaNet"; case GameEdition.BethesdaNetPTS: return "BethesdaNetPTS"; + case GameEdition.MSStore: + return "MSStore"; default: return ""; } @@ -862,9 +864,6 @@ public void InstallModArchiveFrozen(String filePath, Action updateP return; } - if (!Directory.Exists(Path.Combine(this.gamePath, "Mods"))) - Directory.CreateDirectory(Path.Combine(this.gamePath, "Mods")); - if (!File.Exists(filePath)) { // Path too long? @@ -885,6 +884,10 @@ public void InstallModArchiveFrozen(String filePath, Action updateP try { + // Create Mods folder: + if (!Directory.Exists(Path.Combine(this.gamePath, "Mods"))) + Directory.CreateDirectory(Path.Combine(this.gamePath, "Mods")); + // Get paths: filePath = Path.GetFullPath(filePath); String fileName = Path.GetFileNameWithoutExtension(filePath); @@ -920,6 +923,14 @@ public void InstallModArchiveFrozen(String filePath, Action updateP if (done != null) done(true); } + catch (UnauthorizedAccessException ex) + { + MsgBox.Get("modsAccessDenied").FormatText("UnauthorizedAccessException: " + ex.Message).Show(MessageBoxIcon.Error); + this.logFile.WriteLine($"UnauthorizedAccessException occured while importing a folder: {ex.Message}\n{ex.StackTrace}\n"); + if (done != null) + done(false); + return; + } catch (Exception ex) { this.logFile.WriteLine($"Unhandled exception occured while importing a *.ba2 file: {ex.Message}\n{ex.StackTrace}\n"); @@ -947,9 +958,6 @@ public void InstallModArchive(String filePath, Action updateProgres return; } - if (!Directory.Exists(Path.Combine(this.gamePath, "Mods"))) - Directory.CreateDirectory(Path.Combine(this.gamePath, "Mods")); - if (!File.Exists(filePath)) { // Path too long? @@ -980,6 +988,10 @@ public void InstallModArchive(String filePath, Action updateProgres try { + // Create Mods folder: + if (!Directory.Exists(Path.Combine(this.gamePath, "Mods"))) + Directory.CreateDirectory(Path.Combine(this.gamePath, "Mods")); + // Get paths: filePath = Path.GetFullPath(filePath); String fileName = Path.GetFileNameWithoutExtension(filePath); @@ -1014,6 +1026,14 @@ public void InstallModArchive(String filePath, Action updateProgres if (done != null) done(true); } + catch (UnauthorizedAccessException ex) + { + MsgBox.Get("modsAccessDenied").FormatText("UnauthorizedAccessException: " + ex.Message).Show(MessageBoxIcon.Error); + this.logFile.WriteLine($"UnauthorizedAccessException occured while importing a folder: {ex.Message}\n{ex.StackTrace}\n"); + if (done != null) + done(false); + return; + } catch (Exception ex) { this.logFile.WriteLine($"Unhandled exception occured while importing a *.ba2 file: {ex.Message}\n{ex.StackTrace}\n"); @@ -1041,9 +1061,6 @@ public void InstallModFolder(String folderPath, Action updateProgre return; } - if (!Directory.Exists(Path.Combine(this.gamePath, "Mods"))) - Directory.CreateDirectory(Path.Combine(this.gamePath, "Mods")); - if (!Directory.Exists(folderPath)) { // Path too long? @@ -1074,6 +1091,10 @@ public void InstallModFolder(String folderPath, Action updateProgre try { + // Create Mods folder: + if (!Directory.Exists(Path.Combine(this.gamePath, "Mods"))) + Directory.CreateDirectory(Path.Combine(this.gamePath, "Mods")); + // Get paths: folderPath = Path.GetFullPath(folderPath); String folderName = Path.GetFileName(folderPath); @@ -1122,6 +1143,14 @@ public void InstallModFolder(String folderPath, Action updateProgre if (done != null) done(true); } + catch (UnauthorizedAccessException ex) + { + MsgBox.Get("modsAccessDenied").FormatText("UnauthorizedAccessException: " + ex.Message).Show(MessageBoxIcon.Error); + this.logFile.WriteLine($"UnauthorizedAccessException occured while importing a folder: {ex.Message}\n{ex.StackTrace}\n"); + if (done != null) + done(false); + return; + } catch (Exception ex) { this.logFile.WriteLine($"Unhandled exception occured while importing a folder: {ex.Message}\n{ex.StackTrace}\n"); @@ -1945,6 +1974,13 @@ public void Deploy(Action updateProgress = null, Action done if (done != null) done(true); } + catch (UnauthorizedAccessException ex) + { + MsgBox.Get("modsAccessDenied").FormatText("UnauthorizedAccessException: " + ex.Message).Show(MessageBoxIcon.Error); + this.logFile.WriteLine($"UnauthorizedAccessException occured while importing a folder: {ex.Message}\n{ex.StackTrace}\n"); + if (done != null) + done(false); + } catch (Exception ex) { this.logFile.WriteLine($"Unhandled exception occured: {ex.Message}\n{ex.StackTrace}"); diff --git a/Fo76ini/Properties/Resources.Designer.cs b/Fo76ini/Properties/Resources.Designer.cs index 38f81b0..05d5d00 100644 --- a/Fo76ini/Properties/Resources.Designer.cs +++ b/Fo76ini/Properties/Resources.Designer.cs @@ -80,6 +80,36 @@ internal static System.Drawing.Bitmap arrow_up { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap bethesda { + get { + object obj = ResourceManager.GetObject("bethesda", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap bethesda_24px { + get { + object obj = ResourceManager.GetObject("bethesda_24px", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap bethesda_pts { + get { + object obj = ResourceManager.GetObject("bethesda_pts", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -170,6 +200,26 @@ internal static System.Drawing.Bitmap info { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap msstore { + get { + object obj = ResourceManager.GetObject("msstore", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap msstore_24px { + get { + object obj = ResourceManager.GetObject("msstore_24px", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -190,6 +240,36 @@ internal static System.Drawing.Bitmap plus { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap question_mark { + get { + object obj = ResourceManager.GetObject("question_mark", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap steam { + get { + object obj = ResourceManager.GetObject("steam", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap steam_24px { + get { + object obj = ResourceManager.GetObject("steam_24px", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -199,5 +279,25 @@ internal static System.Drawing.Bitmap warning { return ((System.Drawing.Bitmap)(obj)); } } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap xbox { + get { + object obj = ResourceManager.GetObject("xbox", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap xbox_24px { + get { + object obj = ResourceManager.GetObject("xbox_24px", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } } } diff --git a/Fo76ini/Properties/Resources.resx b/Fo76ini/Properties/Resources.resx index 2dac1b0..18fcc8d 100644 --- a/Fo76ini/Properties/Resources.resx +++ b/Fo76ini/Properties/Resources.resx @@ -160,4 +160,34 @@ ..\icons\defrost.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\steam.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\xbox.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\bethesda-launcher.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\bethesda_24px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\bethesda-launcher-pts.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\msstore.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\msstore_24px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\question_mark.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\steam_24px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\xbox_24px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/Fo76ini/Resources/bethesda-launcher-pts.png b/Fo76ini/Resources/bethesda-launcher-pts.png new file mode 100644 index 0000000000000000000000000000000000000000..416569e9cace36343810cef259e912250117b892 GIT binary patch literal 18090 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 Ywl||dI`7HzDHlLNMn$?p(m3${0Z)`xNB{r; literal 0 HcmV?d00001 diff --git a/Fo76ini/Resources/bethesda-launcher.png b/Fo76ini/Resources/bethesda-launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c9a8f8ae25e646b35d3cf2167a346e0cd598ef9e GIT binary patch literal 6727 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 literal 0 HcmV?d00001 diff --git a/Fo76ini/Resources/msstore.png b/Fo76ini/Resources/msstore.png new file mode 100644 index 0000000000000000000000000000000000000000..de05ee646a89f61f7da5ee1d584e52ae57e7b912 GIT binary patch literal 2604 zcma)8S5y<|68@8H01@d5CNu$QQeAW<6e(dLbTpwOK@_A)mx~Z02m(sWN>S+oLNJlK z0+F^z4UlD}C?G|^NQ*!yA_$kg5BKFh+Xce3H{& zi*@KU7Gvneyd}ps^e3${55r>#xed z3b%ZL7w>N7RRyi=r7&&sCX=Q@4i zvF*Khg;j*2+?7xX_8On|fo$WA;LP@(YN8U>G*xn+kFYbUY+>1iDH7$6s9sI8m1;Py zx%~T&XupX8p|(RF7jOTVdPqNkbnUiph72B$Y-kAZ-H-@ugz@MulFn$63bJezz*nzL zOD+7`sV|Npd!wlCMOb>#HI-?=`Jl}qqh?HZ>f^@`uVZ|je(XV@Ho=iozh%ET@`dBN zxd|Ew0WUx=P)V;kVvYrxI))rsIQDly3>BV59Fd%%7)xW$dCud<;c^f7E=B>srGP;j zU?av?^ZXyV;7)fRG8%uDse2r~JorSLR;fb4l#XEauvlU88;pgeDc7&c1e-GsZi%n_ zxo2S-$#0d;-Wpcph^vPf*V7y94*f@Q;mmUeIjZeQDY|I)uRZ#g!+k zp|sk()%}x}2<-X=a`qLI=vYk#NA4=S@rQIR~z(cdab5 zSb9>@)RW`Jg9{Ilr%!t$kw}^W?y{_OHtY+TP3a(iFG=)c+&G^W8XhiD3PKVurA`-- z-C%*bME2lXXg6fv1>JI!@Hc&NbNj&q>TztPzK=RVC`=%JyE}jXHRbW$Faan_4%zv~aX_gO?om zvYrDqT(cZc2Na%jGr9AVl1D!;ZngZRU}8_R^hTWD#l7*+K2Ze1X(@LC;8loquOY_Q z!UtWE39|v*>UZ;EsuTCAT{Tt^o%G%ttelDkXJO-W*sVS3U`NWm4y~PoD81HfsAf)k zdwYCWPAiD0eI$jf!)XiaKXwrLkp#( z8QRS6kVjCWh8$Fi+*Hx!GZ*B$iVzqYqkQ@L)wJ}A$mZszSQ+qY8Em!0wKBCr6)+@v zna{joQTpP_${SboMQB4+*G2%6NLdX1oBHblpR z68#iv(aNTfS+GB^i7#j~RR@^ty)v%Pb|~iWz~Qs=+47}m49SnRx+<=h(lGNYaMtm^ zR7|G-p{|UZ&*Q_Vk*5#|vqA&IR8K0`OfHT7Zr5hSxom0wdiA$s%t=X~&;v%SRD`o= z!ks)TCQM&7dxCq0mT#0N9qfghvK44_MiT^#hf2jDRx!2m7NmJ&#v9s&Y1OHEMxy9_uaD43x_5(=NnuWF`$Wn9DD2R^;|Ebi_fCT0%3Kd2dCQ1^V_z3(h4UIFI$!` zH4D!SzuYd-U7|;PTbpI$ws;vuFKR!mlyR7mr8i7?r`dcdMUnOWg{?Ax;Y6F z-}9=N4}pl()jw-=ynvsFcAcE`Mh@CmQ?iW!&O9qA73Ge_SM)9fKbNk_UmXg*b7T!LnWe literal 0 HcmV?d00001 diff --git a/Fo76ini/Resources/msstore_24px.png b/Fo76ini/Resources/msstore_24px.png new file mode 100644 index 0000000000000000000000000000000000000000..819407f9b2f23868fb21411c669f77270b0bdda2 GIT binary patch literal 971 zcmV;+12p`JP)EX>4Tx04R}tkv&MmKp2MKrk09U9qb_DkfAzR5EXHhDi*;)X)CnqU~=gnG-*gu zTpR`0f`dPcRRbq^ok@1i`*yYA1?r{qlr_(bA4rW+RV2Jy_M zrE}gV4zrS^5T6r|8+1Y9N3P2*zi}=)Ebz>*kx9)Hhl#~v2g@DIN`^{2O&n2Fjq-)8 z%L?Z$&T6H`TKD8H4CS?zG}md3AdV#@kc0>sHIz|-g(&SBDJD{M9`o=IJN_iOWO9|k z$gzMbR7j2={11Nj)+|g-x=EoJ5O}fek5M4F3pDGt{e5iP%@e@?3|wh#f3*S3ev)2q zYmp;hU>mr&Zfo)$aJd5vJ?WAmIg+22P$&TJXY@@uVDJ{`S#$f=I>+e)kfB~J-v9@P zz*v#8*FE0d-PyN)Yg+yL0Rm8Rdft2X8_BeEs(GP000SaNLh0L z01ejw01ejxLMWSf00007bV*G`2jm9}3kD2#nXG9500GBIL_t(Y$L*9cXcKW5#eXlC zq_p8c?T`~UNpNbxB@h=yP!a3oY!|^nTpcQo08Avg%p{6jEG zO4Qce|8vRUok^NYbr5{pz3;pC{`Yv)Nn(?nyf1z3)nTU}hhKAXo)XOS<3bbSmw3yFN}MKgpm_ zC|oeJCqQ4)9pGpbMeSkvm2>Wy_x?Dr+-Nj5tJUgurZ4c`SIunGd%r5_Zn<1;|5`V* zmu7YZ=!Ic;D)WdW6@agjDrWY2L`#3z^Bt&;)Nszdo8Yks>t~ZUyRyu|g)PkDsn0pqV35mmt#&=Z)%JNV@|ap`p*@t{AU1gT zAxN4UTnaasPo-$<&<$*i)c+Li3OVO&T(O@DOF?2z+h9MEiOZE{`xljh-@=Pg1Qj!l tsQVWu^eGQq0d7j#|0k8r?6aAz{RHx-n#6VfZ@2&e002ovPDHLkV1n`Uyq^F7 literal 0 HcmV?d00001 diff --git a/Fo76ini/Resources/question_mark.png b/Fo76ini/Resources/question_mark.png new file mode 100644 index 0000000000000000000000000000000000000000..1bb0768e87ef31a8df95dee0a9404a282ea3e039 GIT binary patch literal 5743 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 literal 0 HcmV?d00001 diff --git a/Fo76ini/Resources/steam.png b/Fo76ini/Resources/steam.png new file mode 100644 index 0000000000000000000000000000000000000000..10eaa80d0c4e80269f857b794b81ed6a49ffa3c8 GIT binary patch literal 7460 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 b`eOVK6grP_s(H%m00000NkvXXu0mjf$LZ(S literal 0 HcmV?d00001 diff --git a/Fo76ini/Resources/xbox.png b/Fo76ini/Resources/xbox.png new file mode 100644 index 0000000000000000000000000000000000000000..b5b2403ee3a6bc6d41aa72c4ddfd765aae305b27 GIT binary patch literal 5409 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 KMNUMnLSTZ;pm^i} literal 0 HcmV?d00001 diff --git a/Fo76ini/languages/de-DE.xml b/Fo76ini/languages/de-DE.xml index c6b9adf..e66638b 100644 --- a/Fo76ini/languages/de-DE.xml +++ b/Fo76ini/languages/de-DE.xml @@ -1,5 +1,5 @@  - + @@ -102,6 +102,8 @@ Einige UI-Elemente könnten unter Umständen nicht korrekt funktionieren. Heruntergeladene Sprachdateien: {0} Das Herunterladen von Sprachen ist fehlgeschlagen. {0} + Das Wechseln von und zur Microsoft Store Edition erfordert einen Neustart des Tools. + Leider kann die Spiel aufgrund von "Sicherheitseinschränkungen" nicht direkt gestartet werden. Danke Microsoft, wir freuen uns. :( Mods wurden deaktiviert und vom Spiel entfernt. Mods wurden installiert. Mods könnten nicht installiert worden sein. @@ -140,8 +142,12 @@ Fehlermeldung: "{0}". Das kann lange dauern, abhängig von Dateigröße und Anzahl an Dateien. Möchtest du fortfahren? *.dds Dateien wurden repariert. - You've enabled the Nuclear Winter mode, but your mods are still deployed. -Do you want to disable them now? + {0} +Starte das Tool als Administrator und versuche es erneut. + Du hast den Nuclear Winter Modus aktiviert, aber deine Mods sind noch installiert. +Möchtest du sie jetzt deinstallieren? + Du hast den Nuclear Winter Modus deaktiviert, aber deine Mods wurden dadurch nicht reaktiviert. +Möchtest du sie jetzt wieder installieren? Bitte lade Archive2 runter und setze den Pfad, um *.ba2 Archive zu extrahieren. Ungültiger Pfad zu Archive2. Bitte wähle Archive2.exe @@ -164,6 +170,7 @@ Bitte wähle Archive2.exe +