Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 51 additions & 20 deletions Mo3RegUI/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,43 +2,74 @@
{
public static class Constants
{
public const string GameName = "心灵终结 3.3.6";
public const string EnglishGameName = "Mental Omega 3.3.6";
public const string GameName = "Tiberium Crisis 2";
public const string EnglishGameName = "Tiberium Crisis 2";

public const string AppName = GameName + " 注册机";
public const string EnglishAppName = "Register for " + EnglishGameName;

public const string Version = "v2.4.1";
public const string AssemblyVersion = "2.4.1.0";
public const string Version = "v2.4.2";
public const string AssemblyVersion = "2.4.2.0";

public const string CopyrightYearFrom = "2019";
public const string CopyrightYearTo = "2023";
public const string CopyrightYearTo = "2025";

public const string AuthorName = "伤心的笔"; // You are not supposed to remove the name here. Append your name if you have made significant changes.
public const string EnglishAuthorName = "Sad Pencil"; // You are not supposed to remove the name here. Append your name if you have made significant changes.
public const string EnglishAuthorName = "SadPencil"; // You are not supposed to remove the name here. Append your name if you have made significant changes.
public const string RepoUri = "https://github.com/SadPencil/Mo3RegUI"; // Change to your repo if you have forked it. Note: this is REQUIRED by GPLv3.

public const string NeutralResourcesLanguage = "zh-CN";

public const string GameConfigIniName = "RA2MO.ini";
public const string LauncherExeName = "MentalOmegaClient.exe";
public const string GameConfigIniName = "RA2MD.ini";
public const string LauncherExeName = "TiberiumCrisis.exe";
public const string GameExeName = "gamemd.exe";
public const string SecondaryGameExeName = "Syringe.exe";
public const string SecondaryGameExeName = "GotoTC.exe";

public static readonly string[] VulnerableAvExes = new string[] {
"cncnet5.dll",
"cncnet5mo.dll",
"ares.dll",
LauncherExeName,
//GameExeName,
SecondaryGameExeName,
"Ares.dll",
"Ares.dll.inj",
"AxionGear.ext",
"cncnet5.ext",
"Crisis.ext",
"Crisis.ext.inc",
"GScript.ext",
"Phobos.ext",
"d3dx9_29.ext",
"ra2md.csf",
"stringtable02.csf",
"stringtable03.csf",
"Resources/d3d9.ext",
"Resources/mainexecutable.exe",
"Resources/mainexecutable2.exe",
"Resources/mainexecutable3.exe",
"Resources/cnc_ddraw.dll",
"Resources/clientdx.exe",
"Resources/clientxna.exe",
"Resources/clientogl.exe",
"GameShaders/BaseShared/tchelper/tchelper.exe",
"GameShaders/BaseShared/tchelper/TCHelper.dll",
"gamemd.exe",
"BINKW32.dll",
"Blowfish.dll",
"Syringe.exe",
"Map Editor/FinalAlert2MO.exe",
"Map Editor/Syringe.exe",
"Resources/ddraw_dxwnd.dll",
};

public const bool CheckDirectXRuntime = false;
public const string CnCDDrawDllName = "cnc-ddraw.dll";
public const string CnCDDrawIniName = "cnc-ddraw.ini";
public const bool LauncherExeDpiUnaware = true;
public const bool DirectXRuntimeTaskEnabled = true;
public const bool ChinaNetworkTaskEnabled = false;
public const bool RendererTaskEnabled = false;
public const bool ResolutionTaskEnabled = false;
public const bool FirstRunTaskEnabled = false;
public const bool UserNameTaskEnabled = false;

public const string CnCDDrawSectionName = "CNC_DDRAW";
public const string CnCDDrawDllName = "cnc_ddraw.dll";
public const string CnCDDrawIniName = "cnc_ddraw.ini";

public const bool LauncherExeDpiUnaware = false;

public const bool DetectDotNet35 = false;
public const bool DetectXna40 = false;
}
}
2 changes: 1 addition & 1 deletion Mo3RegUI/MainWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Orientation="Horizontal" HorizontalAlignment="Center">
<Image Source="soviet.png" Height="22" VerticalAlignment="Center"/>
<Image Source="tc2icon.png" Height="22" VerticalAlignment="Center"/>
<TextBlock Margin="5" Text="{x:Static local:Constants.AppName}" FontSize="22" VerticalAlignment="Bottom"/>
<TextBlock Margin="5" Text="{x:Static local:Constants.Version}" FontSize="20" VerticalAlignment="Bottom"/>

Expand Down
27 changes: 23 additions & 4 deletions Mo3RegUI/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,23 +64,42 @@ private void Window_Initialized(object sender, EventArgs e)
new TaskInstance(){Task = new FirstRunTask(), Parameter = new FirstRunTaskParameter(){ GameDir = gameDir}},
new TaskInstance(){Task = new UserNameTask(), Parameter = new UserNameTaskParameter(){ GameDir = gameDir}},
new TaskInstance(){Task = new ResolutionTask(), Parameter = new ResolutionTaskParameter(){ GameDir = gameDir}},
new TaskInstance(){Task = new RendererTask(), Parameter = new RendererTaskParameter(){ GameDir = gameDir}},
//new TaskInstance(){Task = new RendererTask(), Parameter = new RendererTaskParameter(){ GameDir = gameDir}},
new TaskInstance(){Task = new SpeakerNumTask(), Parameter = new SpeakerNumTaskParameter()},
new TaskInstance(){Task = new DDrawDLLTask(), Parameter = new DDrawDLLTaskParameter()},
new TaskInstance(){Task = new RemoveObsoleteFilesTask(), Parameter = new RemoveObsoleteFilesTaskParameter(){ GameDir = gameDir}},
new TaskInstance(){Task = new XboxGameBarTask(), Parameter = new XboxGameBarTaskParameter()},
//new TaskInstance(){Task = new XboxGameBarTask(), Parameter = new XboxGameBarTaskParameter()},
new TaskInstance(){Task = new ForegroundLockTimeoutTask(), Parameter = new ForegroundLockTimeoutTaskParameter()},
new TaskInstance(){Task = new CompatibilitySettingTask(), Parameter = new CompatibilitySettingTaskParameter(){ GameDir = gameDir}},
new TaskInstance(){Task = new ChinaNetworkTask(), Parameter = new ChinaNetworkTaskParameter(){ GameDir = gameDir}},
new TaskInstance(){Task = new AffinityTask(), Parameter = new AffinityTaskParameter(){ GameDir = gameDir}},
new TaskInstance(){Task = new NetworkInterfaceTask(), Parameter = new NetworkInterfaceTaskParameter()},
new TaskInstance(){Task = new FalsePositiveTask(), Parameter = new FalsePositiveTaskParameter(){ GameDir = gameDir}},
};

if (Constants.CheckDirectXRuntime)
if (Constants.DirectXRuntimeTaskEnabled)
{
tasks.Add(new TaskInstance() { Task = new DirectXRuntimeTask(), Parameter = new DirectXRuntimeTaskParameter() });
}
if (Constants.FirstRunTaskEnabled)
{
tasks.Add(new TaskInstance() { Task = new FirstRunTask(), Parameter = new FirstRunTaskParameter() { GameDir = gameDir } });
}
if (Constants.ChinaNetworkTaskEnabled)
{
tasks.Add(new TaskInstance() { Task = new ChinaNetworkTask(), Parameter = new ChinaNetworkTaskParameter() { GameDir = gameDir } });
}
if (Constants.RendererTaskEnabled)
{
tasks.Add(new TaskInstance() { Task = new RendererTask(), Parameter = new RendererTaskParameter() { GameDir = gameDir } });
}
if (Constants.ResolutionTaskEnabled)
{
tasks.Add(new TaskInstance() { Task = new ResolutionTask(), Parameter = new ResolutionTaskParameter() { GameDir = gameDir } });
}
if (Constants.UserNameTaskEnabled)
{
tasks.Add(new TaskInstance() { Task = new UserNameTask(), Parameter = new UserNameTaskParameter() { GameDir = gameDir } });
}

this.mainTaskManager = new TaskManager(tasks);
this.mainTaskManager.ReportMessage += (task_sender, task_e) =>
Expand Down
1 change: 1 addition & 0 deletions Mo3RegUI/Mo3RegUI.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@
<Compile Include="MessageLevelToBrushConverter.cs" />
<Compile Include="MessageLevelToFontWeightConverter.cs" />
<Compile Include="MessagesViewModel.cs" />
<Compile Include="NativeConstants.cs" />
<Compile Include="Tasks\DDrawDLLTask.cs" />
<Compile Include="Tasks\DirectXRuntimeTask.cs" />
<Compile Include="Tasks\ForegroundLockTimeoutTask.cs" />
Expand Down
11 changes: 11 additions & 0 deletions Mo3RegUI/NativeConstants.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace Mo3RegUI
{
public class NativeConstants
{
/// SM_CXSCREEN -> 0
public const int SM_CXSCREEN = 0;

/// SM_CYSCREEN -> 1
public const int SM_CYSCREEN = 1;
}
}
30 changes: 3 additions & 27 deletions Mo3RegUI/NativeMethods.cs
Original file line number Diff line number Diff line change
@@ -1,42 +1,18 @@
namespace Mo3RegUI
{

public partial class NativeMethods
{
/// Return Type: int
///nIndex: int
[System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "GetSystemMetrics")]
[System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "GetSystemMetrics")]
public static extern int GetSystemMetrics(int nIndex);
}

public partial class NativeConstants
{
/// SM_CXSCREEN -> 0
public const int SM_CXSCREEN = 0;
}

public partial class NativeConstants
{
/// SM_CYSCREEN -> 1
public const int SM_CYSCREEN = 1;
}

public partial class NativeMethods
{

/// Return Type: UINT->unsigned int
[System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint = "GetACP")]
[System.Runtime.InteropServices.DllImport("kernel32.dll", EntryPoint = "GetACP")]
public static extern uint GetACP();

}

public partial class NativeMethods
{

/// Return Type: UINT->unsigned int
[System.Runtime.InteropServices.DllImportAttribute("winmm.dll", EntryPoint = "waveOutGetNumDevs")]
[System.Runtime.InteropServices.DllImport("winmm.dll", EntryPoint = "waveOutGetNumDevs")]
public static extern uint waveOutGetNumDevs();

}

}
2 changes: 1 addition & 1 deletion Mo3RegUI/Tasks/RendererTask.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ private void _DoWork(RendererTaskParameter p)
MyIniParserHelper.EditIniFile(Path.Combine(p.GameDir, Constants.GameConfigIniName), ini =>
{
var section = MyIniParserHelper.GetSectionOrNew(ini, "Compatibility");
section["Renderer"] = "CnC_DDraw";
section["Renderer"] = Constants.CnCDDrawSectionName;
});
}
}
Expand Down
4 changes: 2 additions & 2 deletions Mo3RegUI/Tasks/ResolutionTask.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ private void _DoWork(ResolutionTaskParameter p)
MyIniParserHelper.EditIniFile(Path.Combine(p.GameDir, Constants.GameConfigIniName), ini =>
{
var videoSection = MyIniParserHelper.GetSectionOrNew(ini, "Video");
videoSection["ScreenWidth"] = Resolution.Width.ToString(CultureInfo.InvariantCulture);
videoSection["ScreenHeight"] = Resolution.Height.ToString(CultureInfo.InvariantCulture);
videoSection["FakeScreenWidth"] = Resolution.Width.ToString(CultureInfo.InvariantCulture);
videoSection["FakeScreenHeight"] = Resolution.Height.ToString(CultureInfo.InvariantCulture);
});
}
ReportMessage(this, new TaskMessageEventArgs() { Level = MessageLevel.Info, Text = "设置游戏分辨率为 " + Resolution.Width.ToString() + "×" + Resolution.Height.ToString() + "。" });
Expand Down
90 changes: 48 additions & 42 deletions Mo3RegUI/Tasks/RuntimeComponentTask.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,23 +35,26 @@ public void DoWork(ITaskParameter p)

private void _DoWork(RuntimeComponentTaskParameter p)
{
// Future: Remove .NET 3.5 check for MO 3.3.7
string net35 = GetInstalledNetFramework35VersionString();
if (net35 is null)
if (Constants.DetectDotNet35)
{
ReportMessage(this, new TaskMessageEventArgs()
// Future: Remove .NET 3.5 check for MO 3.3.7
string net35 = GetInstalledNetFramework35VersionString();
if (net35 is null)
{
Level = MessageLevel.Info,
Text = ".NET Framework 3.5 未安装。", // don't treat this as an error
});
}
else
{
ReportMessage(this, new TaskMessageEventArgs()
ReportMessage(this, new TaskMessageEventArgs()
{
Level = MessageLevel.Info,
Text = ".NET Framework 3.5 未安装。", // don't treat this as an error
});
}
else
{
Level = MessageLevel.Info,
Text = ".NET Framework " + net35 + " 已安装。",
});
ReportMessage(this, new TaskMessageEventArgs()
{
Level = MessageLevel.Info,
Text = ".NET Framework " + net35 + " 已安装。",
});
}
}

string net4 = GetInstalledNetFramework4VersionString();
Expand All @@ -72,54 +75,57 @@ private void _DoWork(RuntimeComponentTaskParameter p)
});
}

int? net45plus = GetInstalledNetFramework45VersionNumber();
bool isDotNet45Installed = net45plus.GetValueOrDefault() >= NET_FRAMEWORK_4_5_RELEASE_KEY;
// Future: Remove .NET 4.5 check for MO 3.3.7
if (!isDotNet45Installed && Environment.OSVersion.Version.Major < 6)
int? net46plus = GetInstalledNetFramework46VersionNumber();
bool isDotNet46Installed = net46plus.GetValueOrDefault() >= NET_FRAMEWORK_4_6_RELEASE_KEY;

if (!isDotNet46Installed && Environment.OSVersion.Version.Major < 6)
{
ReportMessage(this, new TaskMessageEventArgs()
{
Level = MessageLevel.Error,
Text = "当前 .NET Framework 4 的版本号低于 4.5。",
Text = "当前 .NET Framework 4 的版本号低于 4.6。",
});
}

// Future: Always require .NET 4.7.1 for MO 3.3.7
// Future: Always require .NET 4.7.1 for MO 3.3.7 Launcher

// Future: Always require .NET 7 for MO 3.3.7

bool isXna4Installed = IsXNAFramework4Installed();
if (isXna4Installed)
if (Constants.DetectXna40)
{
ReportMessage(this, new TaskMessageEventArgs()
bool isXna4Installed = IsXNAFramework4Installed();
if (isXna4Installed)
{
Level = MessageLevel.Info,
Text = "XNA Framework 4.0 已安装。",
});
}
else
{
ReportMessage(this, new TaskMessageEventArgs()
{
Level = (Environment.OSVersion.Version.Major < 6) ? MessageLevel.Error : MessageLevel.Info, // Future: Always prompt as Info for MO 3.3.7
Text = "XNA Framework 4.0 未安装。",
});
}

if (Environment.OSVersion.Version.Major < 6) // Future: Remove this part for MO 3.3.7
{
if (!isXna4Installed && !isDotNet45Installed)
ReportMessage(this, new TaskMessageEventArgs()
{
Level = MessageLevel.Info,
Text = "XNA Framework 4.0 已安装。",
});
}
else
{
ReportMessage(this, new TaskMessageEventArgs()
{
Level = MessageLevel.Error,
Text = "当前 .NET Framework 4 的版本号低于 4.5,且 XNA Framework 4.0 未安装。客户端可能无法正常运行。",
Level = (Environment.OSVersion.Version.Major < 6) ? MessageLevel.Error : MessageLevel.Info, // Future: Always prompt as Info for MO 3.3.7
Text = "XNA Framework 4.0 未安装。",
});
}
}

//if (Environment.OSVersion.Version.Major < 6) // Future: Remove this part for MO 3.3.7
//{
// if (!isXna4Installed && !isDotNet45Installed)
// {
// ReportMessage(this, new TaskMessageEventArgs()
// {
// Level = MessageLevel.Error,
// Text = "当前 .NET Framework 4 的版本号低于 4.5,且 XNA Framework 4.0 未安装。客户端可能无法正常运行。",
// });
// }
//}
}

private static int? GetInstalledNetFramework45VersionNumber()
private static int? GetInstalledNetFramework46VersionNumber()
{
try
{
Expand Down
Binary file added Mo3RegUI/tc2icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading