feat(all): add game SDK and harden client login and game rules

- Add costume burst upgrades with durable replay and fix permanent SR equipment gacha.
- Add server game.json rules for optional collaboration UR weapons, with packaging and documentation.
- Add GameNames/GameSdk NuGet tooling, readable types, reobfuscation, complete source/PDB navigation and shared-runtime installation.
- Split plugin responsibilities, prefer typeof/nameof, centralize MSBuild settings and ignore local paths; remove the unused LoginUI test project.
- Fix login recovery and TLS through native platform HTTP and a private game relay; read device region directly from the OS time zone.

Validation: go test ./... -count=1, go vet ./..., plugin Release builds, SDK/runtime self-tests, Roslyn embedded-source navigation, gofmt check and git diff --check.
This commit is contained in:
2026-10-03 23:04:32 +08:00
parent 5600f10b31
commit 992fa47fd5
83 changed files with 8970 additions and 2828 deletions
+8 -1
View File
@@ -43,11 +43,13 @@ $exe = Join-Path $GameDir 'BrownDust II.exe'
$pluginDir = Join-Path $GameDir 'BepInEx\plugins'
$localRes = Join-Path $pluginDir 'PluginLocalRes.dll'
$capturePlugin = Join-Path $pluginDir 'BD2CaptureEnvironment.dll'
$gameNamesLibrary = Join-Path $pluginDir 'BD2.GameNames.dll'
$identityPlugin = Join-Path $pluginDir 'BD2LocalIdentity.dll'
$loginUIPlugin = Join-Path $pluginDir 'BD2LoginUI.dll'
$doorstop = Join-Path $GameDir 'doorstop_config.ini'
$isolatedData = Join-Path $GameDir 'IsolatedUserData'
$stagedCapturePlugin = Join-Path $PSScriptRoot '..\..\plugins\CaptureEnvironment\bin\Release\netstandard2.1\BD2CaptureEnvironment.dll'
$stagedGameNamesLibrary = Join-Path (Split-Path -Parent $stagedCapturePlugin) 'BD2.GameNames.dll'
$stagedLocalResConfig = Join-Path $PSScriptRoot '..\..\plugins\CaptureEnvironment\bd2.localres.cfg'
$localResConfig = Join-Path $GameDir 'BepInEx\config\bd2.localres.cfg'
@@ -62,6 +64,11 @@ foreach ($requiredDirectory in @($GameDir, $ResourceRoot, $SharedDataDir)) {
}
if (Test-Path -LiteralPath $stagedCapturePlugin -PathType Leaf) {
if (-not (Test-Path -LiteralPath $stagedGameNamesLibrary -PathType Leaf)) {
throw "Capture build is missing its shared runtime: $stagedGameNamesLibrary"
}
New-Item -ItemType Directory -Force -Path $pluginDir | Out-Null
Copy-Item -LiteralPath $stagedGameNamesLibrary -Destination $gameNamesLibrary -Force
$installedHash = if (Test-Path -LiteralPath $capturePlugin -PathType Leaf) {
(Get-FileHash -LiteralPath $capturePlugin -Algorithm SHA256).Hash
}
@@ -73,7 +80,7 @@ if (Test-Path -LiteralPath $stagedCapturePlugin -PathType Leaf) {
}
}
foreach ($required in @($exe, $doorstop, $localRes, $capturePlugin)) {
foreach ($required in @($exe, $doorstop, $localRes, $capturePlugin, $gameNamesLibrary)) {
if (-not (Test-Path -LiteralPath $required -PathType Leaf)) {
throw "Required file is missing: $required"
}