添加项目文件。
This commit is contained in:
31
ChunithmAssetsTools.sln
Normal file
31
ChunithmAssetsTools.sln
Normal file
@ -0,0 +1,31 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.14.36301.6 d17.14
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "DDSExtractor", "DDSExtractor\DDSExtractor.vbproj", "{0DD02AD4-2897-1D77-5B9B-8CCC916BBF1E}"
|
||||
EndProject
|
||||
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "DDSPatcher", "DDSPatcher\DDSPatcher.vbproj", "{D6481E89-DAEE-6DB9-D614-6F5A6FEA610C}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{0DD02AD4-2897-1D77-5B9B-8CCC916BBF1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{0DD02AD4-2897-1D77-5B9B-8CCC916BBF1E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{0DD02AD4-2897-1D77-5B9B-8CCC916BBF1E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{0DD02AD4-2897-1D77-5B9B-8CCC916BBF1E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{D6481E89-DAEE-6DB9-D614-6F5A6FEA610C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{D6481E89-DAEE-6DB9-D614-6F5A6FEA610C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{D6481E89-DAEE-6DB9-D614-6F5A6FEA610C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{D6481E89-DAEE-6DB9-D614-6F5A6FEA610C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {2B6624E1-E624-495A-9AA4-A8FB25EF041D}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
9
DDSExtractor/DDSExtractor.vbproj
Normal file
9
DDSExtractor/DDSExtractor.vbproj
Normal file
@ -0,0 +1,9 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<RootNamespace>DDSExtractor</RootNamespace>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
232
DDSExtractor/Program.vb
Normal file
232
DDSExtractor/Program.vb
Normal file
@ -0,0 +1,232 @@
|
||||
Imports System
|
||||
Imports System.IO
|
||||
Imports System.Collections.Generic
|
||||
Imports System.Diagnostics
|
||||
|
||||
Module DdsExtractor
|
||||
' DDS <20>ļ<EFBFBD>ͷ<EFBFBD><CDB7>ʶ
|
||||
Private ReadOnly DDS_HEADER As Byte() = {&H44, &H44, &H53, &H20} ' "DDS "
|
||||
Private ReadOnly POF_MARKER As String = "POF"
|
||||
Public Const Version As String = "v1.1.2"
|
||||
Dim currentPath As String = AppDomain.CurrentDomain.BaseDirectory
|
||||
Dim targetExePath As String = Path.Combine(currentPath, "DDSPatcher.exe")
|
||||
|
||||
Sub Main()
|
||||
Console.ForegroundColor = ConsoleColor.DarkCyan
|
||||
Console.WriteLine($"DDS <20>ļ<EFBFBD><C4BC><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> {Version} by ChilorXN.")
|
||||
Console.ForegroundColor = ConsoleColor.DarkYellow
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> .afb <20><> .svo <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7>(֧<>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD>ļ<EFBFBD>)")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 'Patcher' <20><><EFBFBD><EFBFBD>ͬĿ¼<C4BF>µ<EFBFBD>DDS<44><EFBFBD><DEB2><EFBFBD><EFBFBD><EFBFBD>")
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 'exit' <20>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>")
|
||||
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>
|
||||
While True
|
||||
Console.WriteLine()
|
||||
Console.ForegroundColor = ConsoleColor.Blue
|
||||
Console.Write("[Extractor]")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Console.Write("> ")
|
||||
Dim input As String = Console.ReadLine()
|
||||
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
Select Case input.Trim().ToLower()
|
||||
Case "patcher"
|
||||
Console.WriteLine($"<EFBFBD><EFBFBD>ǰ·<EFBFBD><EFBFBD><EFBFBD><EFBFBD>{currentPath}")
|
||||
If File.Exists(targetExePath) Then
|
||||
Console.ForegroundColor = ConsoleColor.Green
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Try
|
||||
' ʹ<><CAB9>Process<73><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F2A3A8B2>ȴ<EFBFBD><C8B4>˳<EFBFBD><CBB3><EFBFBD>
|
||||
Dim processInfo As New ProcessStartInfo() With {
|
||||
.FileName = targetExePath,
|
||||
.UseShellExecute = True ' ʹ<><CAB9>Shellִ<6C>п<EFBFBD><D0BF>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
|
||||
Process.Start(processInfo)
|
||||
Console.WriteLine("<EFBFBD>ѳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DDSPatcher")
|
||||
Catch ex As Exception
|
||||
Console.ForegroundColor = ConsoleColor.Red
|
||||
Console.WriteLine($"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>DDS<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{ex.Message}")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
End Try
|
||||
Else
|
||||
Console.ForegroundColor = ConsoleColor.Red
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ǰĿ¼<EFBFBD><EFBFBD>δ<EFBFBD>ҵ<EFBFBD>DDSPatcher.exe<78><65><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DDSExtractor<6F><72><EFBFBD>ڵ<EFBFBD><DAB5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
End If
|
||||
Continue While
|
||||
Case "clear"
|
||||
Console.Clear()
|
||||
Continue While
|
||||
Case "help", "about", "version"
|
||||
Console.ForegroundColor = ConsoleColor.DarkCyan
|
||||
Console.WriteLine($"DDS <20>ļ<EFBFBD><C4BC><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> {Version} by ChilorXN.")
|
||||
Console.ForegroundColor = ConsoleColor.DarkYellow
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> .afb <20><> .svo <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7>(֧<>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD>ļ<EFBFBD>)")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 'Patcher' <20><><EFBFBD><EFBFBD>ͬĿ¼<C4BF>µ<EFBFBD>DDS<44><EFBFBD><DEB2><EFBFBD><EFBFBD><EFBFBD>")
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 'clear' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ")
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 'help' <20>ٴβ鿴<CEB2><E9BFB4><EFBFBD><EFBFBD>")
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 'exit' <20>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>")
|
||||
Continue While
|
||||
Case "exit", "quit"
|
||||
Exit While
|
||||
End Select
|
||||
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
||||
ProcessInputFiles(input)
|
||||
End While
|
||||
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>")
|
||||
End Sub
|
||||
|
||||
Private Sub ProcessInputFiles(input As String)
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD>Ϸŵ<CFB7><C5B5>ļ<EFBFBD>·<EFBFBD><C2B7>(Windows<77>ն˻<D5B6><CBBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ո<EFBFBD><D5B8><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7>)
|
||||
Dim filePaths As New List(Of String)()
|
||||
Dim inQuotes As Boolean = False
|
||||
Dim currentPath As New System.Text.StringBuilder()
|
||||
|
||||
For Each c As Char In input
|
||||
If c = """"c Then
|
||||
If inQuotes Then
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7>
|
||||
filePaths.Add(currentPath.ToString())
|
||||
currentPath.Clear()
|
||||
inQuotes = False
|
||||
Else
|
||||
' <20><>ʼ<EFBFBD><CABC><EFBFBD>Ű<EFBFBD><C5B0><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7>
|
||||
inQuotes = True
|
||||
End If
|
||||
ElseIf Not inQuotes AndAlso Char.IsWhiteSpace(c) Then
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0><EFBFBD><EFBFBD>Ŀո<C4BF><D5B8>ָ<EFBFBD><D6B8><EFBFBD>
|
||||
If currentPath.Length > 0 Then
|
||||
filePaths.Add(currentPath.ToString())
|
||||
currentPath.Clear()
|
||||
End If
|
||||
Else
|
||||
' <20><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD>ǰ·<C7B0><C2B7>
|
||||
currentPath.Append(c)
|
||||
End If
|
||||
Next
|
||||
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>·<EFBFBD><C2B7>
|
||||
If currentPath.Length > 0 Then
|
||||
filePaths.Add(currentPath.ToString())
|
||||
End If
|
||||
|
||||
' <20><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>ļ<EFBFBD>
|
||||
For Each filePath In filePaths
|
||||
If Not String.IsNullOrWhiteSpace(filePath) Then
|
||||
Try
|
||||
ProcessFile(filePath)
|
||||
Catch ex As Exception
|
||||
Console.ForegroundColor = ConsoleColor.Red
|
||||
Console.WriteLine($"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD> {filePath} ʱ<><CAB1><EFBFBD><EFBFBD>: {ex.Message}")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
End Try
|
||||
End If
|
||||
Next
|
||||
End Sub
|
||||
|
||||
Private Sub ProcessFile(filePath As String)
|
||||
If Not File.Exists(filePath) Then
|
||||
Console.ForegroundColor = ConsoleColor.Red
|
||||
Console.WriteLine($"<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {filePath}")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Return
|
||||
End If
|
||||
|
||||
Dim extension As String = Path.GetExtension(filePath).ToLower()
|
||||
If extension <> ".afb" AndAlso extension <> ".svo" Then
|
||||
Console.ForegroundColor = ConsoleColor.Red
|
||||
Console.WriteLine($"<EFBFBD><EFBFBD>֧<EFBFBD>ֵ<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {filePath} (<28><>֧<EFBFBD><D6A7> .afb <20><> .svo)")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Return
|
||||
End If
|
||||
|
||||
Console.WriteLine($"<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>: {filePath}")
|
||||
|
||||
Dim fileData As Byte() = File.ReadAllBytes(filePath)
|
||||
Dim ddsList As List(Of Byte()) = ExtractDdsFiles(fileData, extension = ".afb")
|
||||
|
||||
Console.WriteLine($"<EFBFBD>ҵ<EFBFBD> {ddsList.Count} <20><> DDS <20>ļ<EFBFBD>")
|
||||
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1> DDS <20>ļ<EFBFBD>
|
||||
Dim baseName As String = Path.GetFileNameWithoutExtension(filePath)
|
||||
Dim outputDir As String = Path.Combine(Path.GetDirectoryName(filePath), $"{baseName}_extracted")
|
||||
|
||||
Directory.CreateDirectory(outputDir)
|
||||
|
||||
For i As Integer = 0 To ddsList.Count - 1
|
||||
Dim outputPath As String = Path.Combine(outputDir, $"{baseName}_{i + 1}.dds")
|
||||
File.WriteAllBytes(outputPath, ddsList(i))
|
||||
Console.ForegroundColor = ConsoleColor.Green
|
||||
Console.WriteLine($"<EFBFBD>ѱ<EFBFBD><EFBFBD><EFBFBD>: {outputPath}")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Next
|
||||
End Sub
|
||||
|
||||
Private Function ExtractDdsFiles(fileData As Byte(), isAfbFile As Boolean) As List(Of Byte())
|
||||
Dim ddsFiles As New List(Of Byte())()
|
||||
Dim position As Integer = 0
|
||||
|
||||
While position < fileData.Length - 4
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD> DDS <20>ļ<EFBFBD>ͷ
|
||||
If fileData(position) = DDS_HEADER(0) AndAlso
|
||||
fileData(position + 1) = DDS_HEADER(1) AndAlso
|
||||
fileData(position + 2) = DDS_HEADER(2) AndAlso
|
||||
fileData(position + 3) = DDS_HEADER(3) Then
|
||||
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> DDS <20>ļ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
Dim nextDdsPos As Integer = FindNextDdsHeader(fileData, position + 4)
|
||||
Dim endPos As Integer = If(nextDdsPos <> -1, nextDdsPos, fileData.Length)
|
||||
|
||||
' <20><><EFBFBD><EFBFBD> AFB <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD> POF <20><><EFBFBD><EFBFBD>
|
||||
If isAfbFile AndAlso nextDdsPos = -1 Then
|
||||
Dim pofPos As Integer = FindPofMarker(fileData, position + 4)
|
||||
If pofPos <> -1 Then
|
||||
endPos = pofPos
|
||||
End If
|
||||
End If
|
||||
|
||||
' <20><>ȡ DDS <20><><EFBFBD><EFBFBD>
|
||||
Dim ddsLength As Integer = endPos - position
|
||||
Dim ddsData(ddsLength - 1) As Byte
|
||||
Array.Copy(fileData, position, ddsData, 0, ddsLength)
|
||||
ddsFiles.Add(ddsData)
|
||||
|
||||
position = endPos
|
||||
Else
|
||||
position += 1
|
||||
End If
|
||||
End While
|
||||
|
||||
Return ddsFiles
|
||||
End Function
|
||||
|
||||
Private Function FindNextDdsHeader(data As Byte(), startPos As Integer) As Integer
|
||||
For i As Integer = startPos To data.Length - 4
|
||||
If data(i) = DDS_HEADER(0) AndAlso
|
||||
data(i + 1) = DDS_HEADER(1) AndAlso
|
||||
data(i + 2) = DDS_HEADER(2) AndAlso
|
||||
data(i + 3) = DDS_HEADER(3) Then
|
||||
Return i
|
||||
End If
|
||||
Next
|
||||
Return -1
|
||||
End Function
|
||||
|
||||
Private Function FindPofMarker(data As Byte(), startPos As Integer) As Integer
|
||||
' POF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ASCII <20>ַ<EFBFBD><D6B7><EFBFBD> "POF"
|
||||
For i As Integer = startPos To data.Length - 3
|
||||
If data(i) = AscW("P"c) AndAlso
|
||||
data(i + 1) = AscW("O"c) AndAlso
|
||||
data(i + 2) = AscW("F"c) Then
|
||||
Return i
|
||||
End If
|
||||
Next
|
||||
Return -1
|
||||
End Function
|
||||
End Module
|
9
DDSPatcher/DDSPatcher.vbproj
Normal file
9
DDSPatcher/DDSPatcher.vbproj
Normal file
@ -0,0 +1,9 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<RootNamespace>DDSPatcher</RootNamespace>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
385
DDSPatcher/Program.vb
Normal file
385
DDSPatcher/Program.vb
Normal file
@ -0,0 +1,385 @@
|
||||
Imports System
|
||||
Imports System.IO
|
||||
Imports System.Text
|
||||
Imports System.Threading
|
||||
Imports System.Diagnostics
|
||||
|
||||
Module DdsPatcher
|
||||
' DDS <20>ļ<EFBFBD>ͷ<EFBFBD><CDB7>ʶ
|
||||
Private ReadOnly DDS_HEADER As Byte() = {&H44, &H44, &H53, &H20} ' "DDS "
|
||||
Private ReadOnly POF_MARKER As String = "POF"
|
||||
Private autoPatchMode As Boolean = False
|
||||
Private ignoreWarn As Boolean = False
|
||||
Public Const Version As String = "v1.2.2"
|
||||
Dim currentPath As String = AppDomain.CurrentDomain.BaseDirectory
|
||||
Dim targetExePath As String = Path.Combine(currentPath, "DDSExtractor.exe")
|
||||
|
||||
Sub Main()
|
||||
Console.ForegroundColor = ConsoleColor.DarkCyan
|
||||
Console.WriteLine($"DDS <20>ļ<EFBFBD><C4BC><EFBFBD><DEB2><EFBFBD><EFBFBD><EFBFBD> {Version} by ChilorXN.")
|
||||
Console.ForegroundColor = ConsoleColor.DarkYellow
|
||||
Console.WriteLine("ʹ<EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>: Դ<>ļ<EFBFBD>·<EFBFBD><C2B7> <20>ĵ<DEB8>DDS·<53><C2B7> DDS<44><53><EFBFBD><EFBFBD>(<28><>1<EFBFBD><31>ʼ)")
|
||||
Console.WriteLine("ʾ<EFBFBD><EFBFBD>: ""C:\files\model.afb"" ""C:\modified\dds_1.dds"" 1")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 'EnableAutoPatch' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>")
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 'DisableAutoPatch' <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>")
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 'Extractor' <20><><EFBFBD><EFBFBD>ͬĿ¼<C4BF>µ<EFBFBD>DDS<44><53>ȡ<EFBFBD><C8A1>")
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 'exit' <20>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>")
|
||||
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>
|
||||
While True
|
||||
Console.WriteLine()
|
||||
If autoPatchMode Then
|
||||
If Not ignoreWarn Then
|
||||
Console.ForegroundColor = ConsoleColor.DarkYellow
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>ֱ<EFBFBD>ӽ<EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>")
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>ʹ<EFBFBD>øù<EFBFBD><EFBFBD>ܵı<EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD> 'DisableAutoPatch' <20><><EFBFBD><EFBFBD><EFBFBD>رոù<D5B8><C3B9><EFBFBD>")
|
||||
End If
|
||||
Console.ForegroundColor = ConsoleColor.Red
|
||||
Else
|
||||
Console.ForegroundColor = ConsoleColor.Green
|
||||
End If
|
||||
Console.Write($"[{(If(autoPatchMode, "<EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>ģʽ", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ"))}]")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Console.Write("> ")
|
||||
Dim input As String = Console.ReadLine()
|
||||
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
Select Case input.Trim().ToLower()
|
||||
Case "exit", "quit"
|
||||
Exit While
|
||||
Case "enableautopatch"
|
||||
autoPatchMode = True
|
||||
Console.ForegroundColor = ConsoleColor.Red
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>ֱ<EFBFBD>ӽ<EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Continue While
|
||||
Case "disableautopatch"
|
||||
autoPatchMode = False
|
||||
Console.ForegroundColor = ConsoleColor.Green
|
||||
Console.WriteLine("<EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Continue While
|
||||
Case "extractor"
|
||||
Console.WriteLine($"<EFBFBD><EFBFBD>ǰ·<EFBFBD><EFBFBD><EFBFBD><EFBFBD>{currentPath}")
|
||||
If File.Exists(targetExePath) Then
|
||||
Console.ForegroundColor = ConsoleColor.Green
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Try
|
||||
' ʹ<><CAB9>Process<73><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F2A3A8B2>ȴ<EFBFBD><C8B4>˳<EFBFBD><CBB3><EFBFBD>
|
||||
Dim processInfo As New ProcessStartInfo() With {
|
||||
.FileName = targetExePath,
|
||||
.UseShellExecute = True ' ʹ<><CAB9>Shellִ<6C>п<EFBFBD><D0BF>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
|
||||
Process.Start(processInfo)
|
||||
Console.WriteLine("<EFBFBD>ѳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DDSExtractor")
|
||||
Catch ex As Exception
|
||||
Console.ForegroundColor = ConsoleColor.Red
|
||||
Console.WriteLine($"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>DDS<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{ex.Message}")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
End Try
|
||||
Else
|
||||
Console.ForegroundColor = ConsoleColor.Red
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ǰĿ¼<EFBFBD><EFBFBD>δ<EFBFBD>ҵ<EFBFBD>DDSExtractor.exe<78><65><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DDSPatcher<65><72><EFBFBD>ڵ<EFBFBD><DAB5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
End If
|
||||
Continue While
|
||||
Case "ignorewarn"
|
||||
ignoreWarn = True
|
||||
Console.ForegroundColor = ConsoleColor.Red
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><EFBFBD>Ծ<EFBFBD><EFBFBD>湦<EFBFBD>ܣ<EFBFBD><EFBFBD>˴<EFBFBD>ʹ<EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٴγ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Enterǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>")
|
||||
Console.ForegroundColor = ConsoleColor.DarkYellow
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 'Reset' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Continue While
|
||||
Case "clear"
|
||||
Console.Clear()
|
||||
Continue While
|
||||
Case "reset"
|
||||
autoPatchMode = False
|
||||
ignoreWarn = False
|
||||
Console.ForegroundColor = ConsoleColor.DarkCyan
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Thread.Sleep(3000)
|
||||
Console.Clear()
|
||||
Continue While
|
||||
Case "help", "about", "version"
|
||||
Console.ForegroundColor = ConsoleColor.DarkCyan
|
||||
Console.WriteLine($"DDS <20>ļ<EFBFBD><C4BC><EFBFBD><DEB2><EFBFBD><EFBFBD><EFBFBD> {Version} by ChilorXN.")
|
||||
Console.ForegroundColor = ConsoleColor.DarkYellow
|
||||
Console.WriteLine("ʹ<EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>: Դ<>ļ<EFBFBD>·<EFBFBD><C2B7> <20>ĵ<DEB8>DDS·<53><C2B7> DDS<44><53><EFBFBD><EFBFBD>(<28><>1<EFBFBD><31>ʼ)")
|
||||
Console.WriteLine("ʾ<EFBFBD><EFBFBD>: ""C:\files\model.afb"" ""C:\modified\dds_1.dds"" 1")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 'EnableAutoPatch' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>")
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 'DisableAutoPatch' <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>")
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 'Extractor' <20><><EFBFBD><EFBFBD>ͬĿ¼<C4BF>µ<EFBFBD>DDS<44><53>ȡ<EFBFBD><C8A1>(<28><><EFBFBD><EFBFBD>)")
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 'clear' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ")
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 'reset' <20><><EFBFBD><EFBFBD><EFBFBD>趨")
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 'help' <20>ٴβ鿴<CEB2><E9BFB4><EFBFBD><EFBFBD>")
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 'exit' <20>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>")
|
||||
Continue While
|
||||
End Select
|
||||
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
ProcessPatchCommand(input)
|
||||
End While
|
||||
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD>")
|
||||
End Sub
|
||||
|
||||
Private Sub ProcessPatchCommand(input As String)
|
||||
Dim args As String() = ParseCommandLine(input)
|
||||
|
||||
If args.Length <> 3 Then
|
||||
Console.ForegroundColor = ConsoleColor.Red
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>Ҫ3<D2AA><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - Դ<>ļ<EFBFBD>·<EFBFBD><C2B7> <20>ĵ<DEB8>DDS·<53><C2B7> DDS<44><53><EFBFBD><EFBFBD>")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Return
|
||||
End If
|
||||
|
||||
Dim sourceFile As String = args(0)
|
||||
Dim modifiedDdsFile As String = args(1)
|
||||
Dim ddsIndex As Integer
|
||||
|
||||
' <20><>֤DDS<44><53><EFBFBD><EFBFBD>
|
||||
If Not Integer.TryParse(args(2), ddsIndex) OrElse ddsIndex < 1 Then
|
||||
Console.ForegroundColor = ConsoleColor.Red
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: DDS<44><53><EFBFBD>ű<EFBFBD><C5B1><EFBFBD><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Return
|
||||
End If
|
||||
|
||||
' <20><>֤<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
If Not File.Exists(sourceFile) Then
|
||||
Console.ForegroundColor = ConsoleColor.Red
|
||||
Console.WriteLine($"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Դ<>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - {sourceFile}")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Return
|
||||
End If
|
||||
|
||||
If Not File.Exists(modifiedDdsFile) Then
|
||||
Console.ForegroundColor = ConsoleColor.Red
|
||||
Console.WriteLine($"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20>ĵ<DEB8>DDS<44>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - {modifiedDdsFile}")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Return
|
||||
End If
|
||||
|
||||
' <20><>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>չ<EFBFBD><D5B9>
|
||||
Dim extension As String = Path.GetExtension(sourceFile).ToLower()
|
||||
If extension <> ".afb" AndAlso extension <> ".svo" Then
|
||||
Console.ForegroundColor = ConsoleColor.Red
|
||||
Console.WriteLine($"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>֧<EFBFBD>ֵ<EFBFBD><D6B5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> - {extension} (<28><>֧<EFBFBD><D6A7> .afb <20><> .svo)")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Return
|
||||
End If
|
||||
|
||||
Try
|
||||
PatchDdsFile(sourceFile, modifiedDdsFile, ddsIndex, extension = ".afb")
|
||||
Catch ex As Exception
|
||||
Console.ForegroundColor = ConsoleColor.Red
|
||||
Console.WriteLine($"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><EFBFBD><EFBFBD>: {ex.Message}")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
End Try
|
||||
End Sub
|
||||
|
||||
Private Sub PatchDdsFile(sourceFile As String, modifiedDdsFile As String, ddsIndex As Integer, isAfbFile As Boolean)
|
||||
' <20><>ȡԴ<C8A1>ļ<EFBFBD>
|
||||
Dim sourceData As Byte() = File.ReadAllBytes(sourceFile)
|
||||
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DDSλ<53><CEBB>
|
||||
Dim ddsPositions As List(Of DdsInfo) = LocateAllDdsFiles(sourceData, isAfbFile)
|
||||
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DDS<44><53><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
|
||||
If ddsIndex > ddsPositions.Count Then
|
||||
Console.ForegroundColor = ConsoleColor.Red
|
||||
Console.WriteLine($"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20>ļ<EFBFBD><C4BC><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD> {ddsPositions.Count} <20><>DDS<44>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><DEB7><EFBFBD><EFBFBD>ʵ<EFBFBD> {ddsIndex} <20><>")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Return
|
||||
End If
|
||||
|
||||
Dim targetDds As DdsInfo = ddsPositions(ddsIndex - 1)
|
||||
|
||||
' <20><>ȡ<EFBFBD>ĺ<DEB8><C4BA><EFBFBD>DDS<44>ļ<EFBFBD>
|
||||
Dim modifiedDdsData As Byte() = File.ReadAllBytes(modifiedDdsFile)
|
||||
|
||||
' <20><>֤DDSͷ
|
||||
If modifiedDdsData.Length < 4 OrElse
|
||||
Not (modifiedDdsData(0) = DDS_HEADER(0) AndAlso
|
||||
modifiedDdsData(1) = DDS_HEADER(1) AndAlso
|
||||
modifiedDdsData(2) = DDS_HEADER(2) AndAlso
|
||||
modifiedDdsData(3) = DDS_HEADER(3)) Then
|
||||
Console.ForegroundColor = ConsoleColor.Red
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20>ĵ<DEB8>DDS<44>ļ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>DDSͷ")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Return
|
||||
End If
|
||||
|
||||
' <20><>֤<EFBFBD><D6A4>С
|
||||
If modifiedDdsData.Length <> targetDds.Length Then
|
||||
Console.ForegroundColor = ConsoleColor.DarkYellow
|
||||
Console.WriteLine($"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: DDS<44><53>С<EFBFBD><D0A1>ƥ<EFBFBD><C6A5> (ԭ: {targetDds.Length} <20>ֽ<EFBFBD>, <20><>: {modifiedDdsData.Length} <20>ֽ<EFBFBD>, <20><><EFBFBD><EFBFBD> {modifiedDdsData.Length - targetDds.Length} <20>ֽ<EFBFBD>)")
|
||||
Console.WriteLine($"ԭDDSλ<EFBFBD><EFBFBD>: <20>ļ<EFBFBD>ƫ<EFBFBD><C6AB> 0x{targetDds.StartOffset:X8}")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DDS<44><53>ԭDDS<44><53><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӿܾ<D3BE>
|
||||
If modifiedDdsData.Length > targetDds.Length Then
|
||||
Console.ForegroundColor = ConsoleColor.Red
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>DDS<44><53>ԭDDS<44><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DEB7><EFBFBD>")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Return
|
||||
End If
|
||||
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DDS<44><53>ԭDDSС<53><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>
|
||||
If Not autoPatchMode Then
|
||||
Console.WriteLine("<EFBFBD><EFBFBD>Ϣ: <20><><EFBFBD><EFBFBD><E2B5BD>DDS<44><53>ԭDDSС<53><D0A1><EFBFBD>ɳ<EFBFBD><C9B3><EFBFBD>ʹ<EFBFBD><CAB9>ǿ<EFBFBD><C7BF><EFBFBD><EFBFBD>")
|
||||
Console.ForegroundColor = ConsoleColor.DarkYellow
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ǿ<><C7BF><EFBFBD><EFBFBD><DEB2><EFBFBD><EFBFBD>ܻᵼ<DCBB><E1B5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Console.WriteLine("<EFBFBD>Ƿ<EFBFBD>Ҫʹ<EFBFBD><EFBFBD>ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>? (y/n)")
|
||||
Dim response As String = Console.ReadLine().Trim().ToLower()
|
||||
|
||||
If response <> "y" AndAlso response <> "yes" Then
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>")
|
||||
Return
|
||||
End If
|
||||
|
||||
' <20><><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>
|
||||
Console.ForegroundColor = ConsoleColor.Red
|
||||
Console.WriteLine("ȷ<EFBFBD><EFBFBD>Ҫʹ<EFBFBD><EFBFBD>ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20><><EFBFBD><EFBFBD><EFBFBD>ܻ<EFBFBD><DCBB>ƻ<EFBFBD><C6BB>ļ<EFBFBD><C4BC>ṹ! (yes/no)")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Dim confirm As String = Console.ReadLine().Trim().ToLower()
|
||||
|
||||
If confirm <> "yes" Then
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>")
|
||||
Return
|
||||
End If
|
||||
Else
|
||||
Console.ForegroundColor = ConsoleColor.DarkYellow
|
||||
Console.WriteLine("<EFBFBD><EFBFBD><EFBFBD>棺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>ֱ<EFBFBD>ӽ<EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
End If
|
||||
End If
|
||||
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
Dim backupFile As String = sourceFile & ".bak"
|
||||
If Not File.Exists(backupFile) Then
|
||||
File.Copy(sourceFile, backupFile)
|
||||
Console.ForegroundColor = ConsoleColor.Green
|
||||
Console.WriteLine($"<EFBFBD>Ѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>: {backupFile}")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
End If
|
||||
|
||||
' ִ<><D6B4><EFBFBD><EFBFBD>
|
||||
If modifiedDdsData.Length < targetDds.Length Then
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĺ<DEB8><C4BA><EFBFBD>DDS<44><53><EFBFBD>֣<EFBFBD><D6A3><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>ಿ<EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD>
|
||||
Array.Copy(modifiedDdsData, 0, sourceData, targetDds.StartOffset, modifiedDdsData.Length)
|
||||
Console.ForegroundColor = ConsoleColor.DarkYellow
|
||||
Console.WriteLine($"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><DEB2><EFBFBD>ǰ {modifiedDdsData.Length} <20>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭDDS<44><53> {targetDds.Length - modifiedDdsData.Length} <20>ֽ<EFBFBD>δ<EFBFBD><EFBFBD>")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
Else
|
||||
' <20><>ȫ<EFBFBD>滻
|
||||
Array.Copy(modifiedDdsData, 0, sourceData, targetDds.StartOffset, targetDds.Length)
|
||||
End If
|
||||
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD>ĺ<DEB8><C4BA><EFBFBD><EFBFBD>ļ<EFBFBD>
|
||||
File.WriteAllBytes(sourceFile, sourceData)
|
||||
Console.ForegroundColor = ConsoleColor.Green
|
||||
Console.WriteLine($"<EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> {ddsIndex} <20><>DDS<44><EFBFBD><DEB2><EFBFBD> {sourceFile}")
|
||||
Console.ForegroundColor = ConsoleColor.White
|
||||
End Sub
|
||||
|
||||
Private Function LocateAllDdsFiles(fileData As Byte(), isAfbFile As Boolean) As List(Of DdsInfo)
|
||||
Dim ddsList As New List(Of DdsInfo)()
|
||||
Dim position As Integer = 0
|
||||
|
||||
While position < fileData.Length - 4
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD> DDS <20>ļ<EFBFBD>ͷ
|
||||
If fileData(position) = DDS_HEADER(0) AndAlso
|
||||
fileData(position + 1) = DDS_HEADER(1) AndAlso
|
||||
fileData(position + 2) = DDS_HEADER(2) AndAlso
|
||||
fileData(position + 3) = DDS_HEADER(3) Then
|
||||
|
||||
' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> DDS <20>ļ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
Dim nextDdsPos As Integer = FindNextDdsHeader(fileData, position + 4)
|
||||
Dim endPos As Integer = If(nextDdsPos <> -1, nextDdsPos, fileData.Length)
|
||||
|
||||
' <20><><EFBFBD><EFBFBD> AFB <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD> POF <20><><EFBFBD><EFBFBD>
|
||||
If isAfbFile AndAlso nextDdsPos = -1 Then
|
||||
Dim pofPos As Integer = FindPofMarker(fileData, position + 4)
|
||||
If pofPos <> -1 Then
|
||||
endPos = pofPos
|
||||
End If
|
||||
End If
|
||||
|
||||
' <20><>¼DDS<44><53>Ϣ
|
||||
ddsList.Add(New DdsInfo With {
|
||||
.StartOffset = position,
|
||||
.Length = endPos - position
|
||||
})
|
||||
|
||||
position = endPos
|
||||
Else
|
||||
position += 1
|
||||
End If
|
||||
End While
|
||||
|
||||
Return ddsList
|
||||
End Function
|
||||
|
||||
Private Function FindNextDdsHeader(data As Byte(), startPos As Integer) As Integer
|
||||
For i As Integer = startPos To data.Length - 4
|
||||
If data(i) = DDS_HEADER(0) AndAlso
|
||||
data(i + 1) = DDS_HEADER(1) AndAlso
|
||||
data(i + 2) = DDS_HEADER(2) AndAlso
|
||||
data(i + 3) = DDS_HEADER(3) Then
|
||||
Return i
|
||||
End If
|
||||
Next
|
||||
Return -1
|
||||
End Function
|
||||
|
||||
Private Function FindPofMarker(data As Byte(), startPos As Integer) As Integer
|
||||
' POF <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ASCII <20>ַ<EFBFBD><D6B7><EFBFBD> "POF"
|
||||
For i As Integer = startPos To data.Length - 3
|
||||
If data(i) = AscW("P"c) AndAlso
|
||||
data(i + 1) = AscW("O"c) AndAlso
|
||||
data(i + 2) = AscW("F"c) Then
|
||||
Return i
|
||||
End If
|
||||
Next
|
||||
Return -1
|
||||
End Function
|
||||
|
||||
Private Function ParseCommandLine(input As String) As String()
|
||||
Dim args As New List(Of String)()
|
||||
Dim currentArg As New StringBuilder()
|
||||
Dim inQuotes As Boolean = False
|
||||
|
||||
For Each c As Char In input
|
||||
If c = """"c Then
|
||||
inQuotes = Not inQuotes
|
||||
ElseIf Not inQuotes AndAlso Char.IsWhiteSpace(c) Then
|
||||
If currentArg.Length > 0 Then
|
||||
args.Add(currentArg.ToString())
|
||||
currentArg.Clear()
|
||||
End If
|
||||
Else
|
||||
currentArg.Append(c)
|
||||
End If
|
||||
Next
|
||||
|
||||
If currentArg.Length > 0 Then
|
||||
args.Add(currentArg.ToString())
|
||||
End If
|
||||
|
||||
Return args.ToArray()
|
||||
End Function
|
||||
|
||||
Private Structure DdsInfo
|
||||
Public StartOffset As Integer
|
||||
Public Length As Integer
|
||||
End Structure
|
||||
End Module
|
Reference in New Issue
Block a user