添加项目文件。

This commit is contained in:
2025-08-02 01:55:10 +08:00
parent 66c6a1a7fe
commit 280f128a84
5 changed files with 666 additions and 0 deletions

31
ChunithmAssetsTools.sln Normal file
View 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

View 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
View 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

View 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
View 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