Skip to content

Commit 58ce749

Browse files
authored
Merge pull request #2 from richcfno1/master
1.0.8 更新
2 parents d875404 + 248e72c commit 58ce749

9 files changed

+154
-48
lines changed

RA3.Tools.Test/Program.cs

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using RA3.Tools;
2+
3+
var ra3 = new RA3Instance();
4+
foreach (var i in ra3.Profiles)
5+
{
6+
Console.WriteLine(i);
7+
}
8+
Console.WriteLine(ra3.GetCurrentProfile());

RA3.Tools.Test/RA3.Tools.Test.csproj

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>net6.0</TargetFramework>
6+
<ImplicitUsings>enable</ImplicitUsings>
7+
<Nullable>enable</Nullable>
8+
</PropertyGroup>
9+
10+
<ItemGroup>
11+
<ProjectReference Include="..\RA3.Tools\RA3.Tools.csproj" />
12+
</ItemGroup>
13+
14+
</Project>

RA3.Tools.sln

+13-7
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,26 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio Version 16
4-
VisualStudioVersion = 16.0.30406.217
3+
# Visual Studio Version 17
4+
VisualStudioVersion = 17.0.31903.59
55
MinimumVisualStudioVersion = 10.0.40219.1
6-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RA3.Tools", "RA3.Tools.csproj", "{59019855-DB0A-49D1-BB13-C05452AC8633}"
6+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RA3.Tools", "RA3.Tools\RA3.Tools.csproj", "{11DE0411-8EE2-47AA-90EB-7890CCBA7156}"
7+
EndProject
8+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RA3.Tools.Test", "RA3.Tools.Test\RA3.Tools.Test.csproj", "{D3B91C28-E395-4EEF-A463-C06121FFB892}"
79
EndProject
810
Global
911
GlobalSection(SolutionConfigurationPlatforms) = preSolution
1012
Debug|Any CPU = Debug|Any CPU
1113
Release|Any CPU = Release|Any CPU
1214
EndGlobalSection
1315
GlobalSection(ProjectConfigurationPlatforms) = postSolution
14-
{59019855-DB0A-49D1-BB13-C05452AC8633}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15-
{59019855-DB0A-49D1-BB13-C05452AC8633}.Debug|Any CPU.Build.0 = Debug|Any CPU
16-
{59019855-DB0A-49D1-BB13-C05452AC8633}.Release|Any CPU.ActiveCfg = Release|Any CPU
17-
{59019855-DB0A-49D1-BB13-C05452AC8633}.Release|Any CPU.Build.0 = Release|Any CPU
16+
{11DE0411-8EE2-47AA-90EB-7890CCBA7156}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
17+
{11DE0411-8EE2-47AA-90EB-7890CCBA7156}.Debug|Any CPU.Build.0 = Debug|Any CPU
18+
{11DE0411-8EE2-47AA-90EB-7890CCBA7156}.Release|Any CPU.ActiveCfg = Release|Any CPU
19+
{11DE0411-8EE2-47AA-90EB-7890CCBA7156}.Release|Any CPU.Build.0 = Release|Any CPU
20+
{D3B91C28-E395-4EEF-A463-C06121FFB892}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
21+
{D3B91C28-E395-4EEF-A463-C06121FFB892}.Debug|Any CPU.Build.0 = Debug|Any CPU
22+
{D3B91C28-E395-4EEF-A463-C06121FFB892}.Release|Any CPU.ActiveCfg = Release|Any CPU
23+
{D3B91C28-E395-4EEF-A463-C06121FFB892}.Release|Any CPU.Build.0 = Release|Any CPU
1824
EndGlobalSection
1925
GlobalSection(SolutionProperties) = preSolution
2026
HideSolutionNode = FALSE

LICENSE RA3.Tools/LICENSE

File renamed without changes.

RA3.Tools.csproj RA3.Tools/RA3.Tools.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>netstandard2.0</TargetFramework>
4+
<TargetFramework>netstandard2.1</TargetFramework>
55
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
66
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
77
<Authors>MrBBBaiXue</Authors>
File renamed without changes.

RA3Instance.cs RA3.Tools/RA3Instance.cs

+51-24
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.ComponentModel;
43
using System.Diagnostics;
4+
using System.Globalization;
55
using System.IO;
66
using System.Linq;
7-
using System.Linq.Expressions;
8-
using System.Security.Principal;
9-
using Microsoft.Win32;
7+
using System.Text;
108

119
namespace RA3.Tools
1210
{
@@ -17,7 +15,10 @@ public class RA3Instance
1715
public string GamePath;
1816
public string LaunchParamter;
1917
public bool UseBarLauncher;
20-
public List<string> Profiles;
18+
public List<string> Profiles
19+
{
20+
get { return GetProfilesList(); }
21+
}
2122
//
2223
public readonly ResourceFolder ModFolder = new ResourceFolder(System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\Red Alert 3\\Mods\\");
2324
public readonly ResourceFolder ReplayFolder = new ResourceFolder(System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\Red Alert 3\\Replays\\");
@@ -32,7 +33,7 @@ public RA3Instance(string gamePath = "")
3233
//Read GamePath
3334
if (string.IsNullOrWhiteSpace(gamePath))
3435
{
35-
GamePath = Utility.GetGamePathFromRegistry();
36+
GamePath = Registry.GetRA3Path();
3637
}
3738
else
3839
{
@@ -43,8 +44,6 @@ public RA3Instance(string gamePath = "")
4344
{
4445
UseBarLauncher = true;
4546
}
46-
//Read Profiles
47-
Profiles = GetProfilesList();
4847
}
4948

5049
#region Check Files
@@ -148,37 +147,57 @@ public void GeneratePatchedParFile()
148147
#endregion
149148

150149
#region Profile Operations
150+
// Parse string encoded by EA similar to UTF-8 in directory.ini
151+
private string ParseDirectoryString(string s)
152+
{
153+
var bytes = new List<byte>();
154+
for (int i = 0; i < s.Length; i++)
155+
{
156+
var c = s[i];
157+
if (c != '_')
158+
{
159+
bytes.Add(Convert.ToByte(c));
160+
}
161+
else
162+
{
163+
var hex = new char[] { s[i + 1], s[i + 2] };
164+
var n = int.Parse(hex, NumberStyles.HexNumber);
165+
bytes.Add(Convert.ToByte(n));
166+
i += 2;
167+
}
168+
}
169+
return Encoding.Unicode.GetString(bytes.ToArray());
170+
}
171+
151172
private List<string> GetProfilesList()
152173
{
174+
var original = ParseDirectoryString(File.ReadAllLines($"{ProfileFolder.Path}\\directory.ini")[0]);
153175
string[] directories = Directory.GetDirectories(ProfileFolder.Path);
154176
List<string> profiles = new List<string>();
155177
foreach (string profile in directories)
156178
{
157-
profiles.Add(Path.GetFileNameWithoutExtension(profile));
179+
// verify if the profile exist in directory.ini
180+
if (original.Contains(Path.GetFileNameWithoutExtension(profile)))
181+
{
182+
profiles.Add(Path.GetFileNameWithoutExtension(profile));
183+
}
158184
}
159185
return profiles;
160186
}
161-
public string GetCurrentProfile(List<string> profiles)
187+
188+
public string GetCurrentProfile()
162189
{
163-
string[] allLines = File.ReadAllLines($"{ProfileFolder.Path}\\directory.ini");
164-
string rawCurrentProfile = "ERROR!";
165-
foreach (string line in allLines)
190+
try
166191
{
167-
//UTF-16
168-
if (line.Contains("C_00u_00r_00r_00e_00n_00t_00P_00r_00o_00f_00i_00l_00e_00_3D_00"))
169-
{
170-
rawCurrentProfile = line;
171-
break;
172-
}
192+
var original = File.ReadAllLines($"{ProfileFolder.Path}\\directory.ini")[1];
193+
return ParseDirectoryString(original)[15..];
173194
}
174-
//Operate with currentProfileLine.
175-
if (rawCurrentProfile == "ERROR!")
195+
catch
176196
{
177-
return rawCurrentProfile;
197+
return null;
178198
}
179-
rawCurrentProfile = rawCurrentProfile.Substring(62).Replace("_00","");
180-
return rawCurrentProfile;
181199
}
200+
182201
public void DeleteSkirmishINI(string profile)
183202
{
184203
try
@@ -187,6 +206,14 @@ public void DeleteSkirmishINI(string profile)
187206
}
188207
catch { }
189208
}
209+
210+
public void DeleteAllSkirmishINI()
211+
{
212+
foreach (var i in Profiles)
213+
{
214+
DeleteSkirmishINI(i);
215+
}
216+
}
190217
#endregion
191218

192219
//ToDo:1.完善检测文件完整的函数

RA3.Tools/Registry.cs

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
using Microsoft.Win32;
2+
3+
namespace RA3.Tools
4+
{
5+
public static class Registry
6+
{
7+
public static bool IsRegistryExist()
8+
{
9+
using var view32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
10+
using var ra3 = view32.OpenSubKey("Software\\Electronic Arts\\Electronic Arts\\Red Alert 3", writable: true);
11+
return ra3 != null;
12+
}
13+
14+
public static int IsRegistryValid()
15+
{
16+
return 0;
17+
}
18+
19+
public static string GetRA3Path()
20+
{
21+
using var view32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
22+
using var ra3 = view32.OpenSubKey("Software\\Electronic Arts\\Electronic Arts\\Red Alert 3");
23+
return ra3?.GetValue("Install Dir") as string ?? string.Empty;
24+
}
25+
26+
public static void SetRA3Path(string path)
27+
{
28+
using var view32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
29+
using var ra3 = view32.OpenSubKey("Software\\Electronic Arts\\Electronic Arts\\Red Alert 3", writable: true);
30+
if (ra3 == null)
31+
{
32+
using var newra3 = view32.CreateSubKey("Software\\Electronic Arts\\Electronic Arts\\Red Alert 3", writable: true);
33+
newra3.SetValue("UseLocalUserMap", 0, RegistryValueKind.DWord);
34+
return;
35+
}
36+
ra3.SetValue("UseLocalUserMap", 0, RegistryValueKind.DWord);
37+
}
38+
39+
public static void EnableMapSync()
40+
{
41+
using var view32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
42+
using var ra3 = view32.OpenSubKey("Software\\Electronic Arts\\Electronic Arts\\Red Alert 3", writable: true);
43+
if (ra3 == null)
44+
{
45+
using var newra3 = view32.CreateSubKey("Software\\Electronic Arts\\Electronic Arts\\Red Alert 3", writable: true);
46+
newra3.SetValue("UseLocalUserMap", 0, RegistryValueKind.DWord);
47+
return;
48+
}
49+
ra3.SetValue("UseLocalUserMap", 0, RegistryValueKind.DWord);
50+
}
51+
52+
public static void ResetRegistry(string path)
53+
{
54+
using var view32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
55+
using var ra3 = view32.OpenSubKey("Software\\Electronic Arts\\Electronic Arts\\Red Alert 3", writable: true);
56+
if (ra3 == null)
57+
{
58+
using var newra3 = view32.CreateSubKey("Software\\Electronic Arts\\Electronic Arts\\Red Alert 3", writable: true);
59+
newra3.SetValue("Install Dir", path, RegistryValueKind.String);
60+
newra3.SetValue("UseLocalUserMap", 0, RegistryValueKind.DWord);
61+
return;
62+
}
63+
ra3.SetValue("Install Dir", path);
64+
ra3.SetValue("UseLocalUserMap", 0, RegistryValueKind.DWord);
65+
}
66+
}
67+
}

Utility.cs RA3.Tools/Utility.cs

-16
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,6 @@ namespace RA3.Tools
1212
{
1313
public static class Utility
1414
{
15-
public static string GetGamePathFromRegistry()
16-
{
17-
try
18-
{
19-
using (var view32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32))
20-
using (var ra3 = view32.OpenSubKey("Software\\Electronic Arts\\Electronic Arts\\Red Alert 3"))
21-
{
22-
return (string)ra3.GetValue("Install Dir");
23-
}
24-
}
25-
catch
26-
{
27-
return string.Empty;
28-
}
29-
30-
}
3115
//From CSDN. (From https://github.com/MrBBBaiXue/CoronaLauncher/)
3216
private static long GetDirectoryLength(string directoryPath)
3317
{

0 commit comments

Comments
 (0)