├── .gitattributes
├── .gitignore
├── PrincessTool.sln
├── PrincessTool
├── App.config
├── Dialog.cs
├── Main.Designer.cs
├── Main.cs
├── Main.resx
├── PrincessTool.csproj
├── Program.cs
├── Progress.Designer.cs
├── Progress.cs
├── Progress.resx
├── Properties
│ ├── AssemblyInfo.cs
│ ├── Resources.Designer.cs
│ ├── Resources.resx
│ ├── Settings.Designer.cs
│ └── Settings.settings
├── Works
│ ├── ConvertSound.cs
│ ├── FileCopy.cs
│ ├── IWorkable.cs
│ └── RenameHashedFile.cs
└── packages.config
├── README.md
└── tools
└── vgmstream
├── COPYING
├── README.md
├── avcodec-vgmstream-58.dll
├── avformat-vgmstream-58.dll
├── avutil-vgmstream-56.dll
├── in_vgmstream.dll
├── libatrac9.dll
├── libcelt-0061.dll
├── libcelt-0110.dll
├── libg719_decode.dll
├── libmpg123-0.dll
├── libvorbis.dll
├── swresample-vgmstream-3.dll
├── test.exe
└── xmp-vgmstream.dll
/.gitattributes:
--------------------------------------------------------------------------------
1 | ###############################################################################
2 | # Set default behavior to automatically normalize line endings.
3 | ###############################################################################
4 | * text=auto
5 |
6 | ###############################################################################
7 | # Set default behavior for command prompt diff.
8 | #
9 | # This is need for earlier builds of msysgit that does not have it on by
10 | # default for csharp files.
11 | # Note: This is only used by command line
12 | ###############################################################################
13 | #*.cs diff=csharp
14 |
15 | ###############################################################################
16 | # Set the merge driver for project and solution files
17 | #
18 | # Merging from the command prompt will add diff markers to the files if there
19 | # are conflicts (Merging from VS is not affected by the settings below, in VS
20 | # the diff markers are never inserted). Diff markers may cause the following
21 | # file extensions to fail to load in VS. An alternative would be to treat
22 | # these files as binary and thus will always conflict and require user
23 | # intervention with every merge. To do so, just uncomment the entries below
24 | ###############################################################################
25 | #*.sln merge=binary
26 | #*.csproj merge=binary
27 | #*.vbproj merge=binary
28 | #*.vcxproj merge=binary
29 | #*.vcproj merge=binary
30 | #*.dbproj merge=binary
31 | #*.fsproj merge=binary
32 | #*.lsproj merge=binary
33 | #*.wixproj merge=binary
34 | #*.modelproj merge=binary
35 | #*.sqlproj merge=binary
36 | #*.wwaproj merge=binary
37 |
38 | ###############################################################################
39 | # behavior for image files
40 | #
41 | # image files are treated as binary by default.
42 | ###############################################################################
43 | #*.jpg binary
44 | #*.png binary
45 | #*.gif binary
46 |
47 | ###############################################################################
48 | # diff behavior for common document formats
49 | #
50 | # Convert binary document formats to text before diffing them. This feature
51 | # is only available from the command line. Turn it on by uncommenting the
52 | # entries below.
53 | ###############################################################################
54 | #*.doc diff=astextplain
55 | #*.DOC diff=astextplain
56 | #*.docx diff=astextplain
57 | #*.DOCX diff=astextplain
58 | #*.dot diff=astextplain
59 | #*.DOT diff=astextplain
60 | #*.pdf diff=astextplain
61 | #*.PDF diff=astextplain
62 | #*.rtf diff=astextplain
63 | #*.RTF diff=astextplain
64 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 | ##
4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
5 |
6 | # User-specific files
7 | *.rsuser
8 | *.suo
9 | *.user
10 | *.userosscache
11 | *.sln.docstates
12 |
13 | # User-specific files (MonoDevelop/Xamarin Studio)
14 | *.userprefs
15 |
16 | # Build results
17 | [Dd]ebug/
18 | [Dd]ebugPublic/
19 | [Rr]elease/
20 | [Rr]eleases/
21 | x64/
22 | x86/
23 | [Aa][Rr][Mm]/
24 | [Aa][Rr][Mm]64/
25 | bld/
26 | [Bb]in/
27 | [Oo]bj/
28 | [Ll]og/
29 |
30 | # Visual Studio 2015/2017 cache/options directory
31 | .vs/
32 | # Uncomment if you have tasks that create the project's static files in wwwroot
33 | #wwwroot/
34 |
35 | # Visual Studio 2017 auto generated files
36 | Generated\ Files/
37 |
38 | # MSTest test Results
39 | [Tt]est[Rr]esult*/
40 | [Bb]uild[Ll]og.*
41 |
42 | # NUNIT
43 | *.VisualState.xml
44 | TestResult.xml
45 |
46 | # Build Results of an ATL Project
47 | [Dd]ebugPS/
48 | [Rr]eleasePS/
49 | dlldata.c
50 |
51 | # Benchmark Results
52 | BenchmarkDotNet.Artifacts/
53 |
54 | # .NET Core
55 | project.lock.json
56 | project.fragment.lock.json
57 | artifacts/
58 |
59 | # StyleCop
60 | StyleCopReport.xml
61 |
62 | # Files built by Visual Studio
63 | *_i.c
64 | *_p.c
65 | *_h.h
66 | *.ilk
67 | *.meta
68 | *.obj
69 | *.iobj
70 | *.pch
71 | *.pdb
72 | *.ipdb
73 | *.pgc
74 | *.pgd
75 | *.rsp
76 | *.sbr
77 | *.tlb
78 | *.tli
79 | *.tlh
80 | *.tmp
81 | *.tmp_proj
82 | *_wpftmp.csproj
83 | *.log
84 | *.vspscc
85 | *.vssscc
86 | .builds
87 | *.pidb
88 | *.svclog
89 | *.scc
90 |
91 | # Chutzpah Test files
92 | _Chutzpah*
93 |
94 | # Visual C++ cache files
95 | ipch/
96 | *.aps
97 | *.ncb
98 | *.opendb
99 | *.opensdf
100 | *.sdf
101 | *.cachefile
102 | *.VC.db
103 | *.VC.VC.opendb
104 |
105 | # Visual Studio profiler
106 | *.psess
107 | *.vsp
108 | *.vspx
109 | *.sap
110 |
111 | # Visual Studio Trace Files
112 | *.e2e
113 |
114 | # TFS 2012 Local Workspace
115 | $tf/
116 |
117 | # Guidance Automation Toolkit
118 | *.gpState
119 |
120 | # ReSharper is a .NET coding add-in
121 | _ReSharper*/
122 | *.[Rr]e[Ss]harper
123 | *.DotSettings.user
124 |
125 | # JustCode is a .NET coding add-in
126 | .JustCode
127 |
128 | # TeamCity is a build add-in
129 | _TeamCity*
130 |
131 | # DotCover is a Code Coverage Tool
132 | *.dotCover
133 |
134 | # AxoCover is a Code Coverage Tool
135 | .axoCover/*
136 | !.axoCover/settings.json
137 |
138 | # Visual Studio code coverage results
139 | *.coverage
140 | *.coveragexml
141 |
142 | # NCrunch
143 | _NCrunch_*
144 | .*crunch*.local.xml
145 | nCrunchTemp_*
146 |
147 | # MightyMoose
148 | *.mm.*
149 | AutoTest.Net/
150 |
151 | # Web workbench (sass)
152 | .sass-cache/
153 |
154 | # Installshield output folder
155 | [Ee]xpress/
156 |
157 | # DocProject is a documentation generator add-in
158 | DocProject/buildhelp/
159 | DocProject/Help/*.HxT
160 | DocProject/Help/*.HxC
161 | DocProject/Help/*.hhc
162 | DocProject/Help/*.hhk
163 | DocProject/Help/*.hhp
164 | DocProject/Help/Html2
165 | DocProject/Help/html
166 |
167 | # Click-Once directory
168 | publish/
169 |
170 | # Publish Web Output
171 | *.[Pp]ublish.xml
172 | *.azurePubxml
173 | # Note: Comment the next line if you want to checkin your web deploy settings,
174 | # but database connection strings (with potential passwords) will be unencrypted
175 | *.pubxml
176 | *.publishproj
177 |
178 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
179 | # checkin your Azure Web App publish settings, but sensitive information contained
180 | # in these scripts will be unencrypted
181 | PublishScripts/
182 |
183 | # NuGet Packages
184 | *.nupkg
185 | # The packages folder can be ignored because of Package Restore
186 | **/[Pp]ackages/*
187 | # except build/, which is used as an MSBuild target.
188 | !**/[Pp]ackages/build/
189 | # Uncomment if necessary however generally it will be regenerated when needed
190 | #!**/[Pp]ackages/repositories.config
191 | # NuGet v3's project.json files produces more ignorable files
192 | *.nuget.props
193 | *.nuget.targets
194 |
195 | # Microsoft Azure Build Output
196 | csx/
197 | *.build.csdef
198 |
199 | # Microsoft Azure Emulator
200 | ecf/
201 | rcf/
202 |
203 | # Windows Store app package directories and files
204 | AppPackages/
205 | BundleArtifacts/
206 | Package.StoreAssociation.xml
207 | _pkginfo.txt
208 | *.appx
209 |
210 | # Visual Studio cache files
211 | # files ending in .cache can be ignored
212 | *.[Cc]ache
213 | # but keep track of directories ending in .cache
214 | !?*.[Cc]ache/
215 |
216 | # Others
217 | ClientBin/
218 | ~$*
219 | *~
220 | *.dbmdl
221 | *.dbproj.schemaview
222 | *.jfm
223 | *.pfx
224 | *.publishsettings
225 | orleans.codegen.cs
226 |
227 | # Including strong name files can present a security risk
228 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
229 | #*.snk
230 |
231 | # Since there are multiple workflows, uncomment next line to ignore bower_components
232 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
233 | #bower_components/
234 |
235 | # RIA/Silverlight projects
236 | Generated_Code/
237 |
238 | # Backup & report files from converting an old project file
239 | # to a newer Visual Studio version. Backup files are not needed,
240 | # because we have git ;-)
241 | _UpgradeReport_Files/
242 | Backup*/
243 | UpgradeLog*.XML
244 | UpgradeLog*.htm
245 | ServiceFabricBackup/
246 | *.rptproj.bak
247 |
248 | # SQL Server files
249 | *.mdf
250 | *.ldf
251 | *.ndf
252 |
253 | # Business Intelligence projects
254 | *.rdl.data
255 | *.bim.layout
256 | *.bim_*.settings
257 | *.rptproj.rsuser
258 | *- Backup*.rdl
259 |
260 | # Microsoft Fakes
261 | FakesAssemblies/
262 |
263 | # GhostDoc plugin setting file
264 | *.GhostDoc.xml
265 |
266 | # Node.js Tools for Visual Studio
267 | .ntvs_analysis.dat
268 | node_modules/
269 |
270 | # Visual Studio 6 build log
271 | *.plg
272 |
273 | # Visual Studio 6 workspace options file
274 | *.opt
275 |
276 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
277 | *.vbw
278 |
279 | # Visual Studio LightSwitch build output
280 | **/*.HTMLClient/GeneratedArtifacts
281 | **/*.DesktopClient/GeneratedArtifacts
282 | **/*.DesktopClient/ModelManifest.xml
283 | **/*.Server/GeneratedArtifacts
284 | **/*.Server/ModelManifest.xml
285 | _Pvt_Extensions
286 |
287 | # Paket dependency manager
288 | .paket/paket.exe
289 | paket-files/
290 |
291 | # FAKE - F# Make
292 | .fake/
293 |
294 | # JetBrains Rider
295 | .idea/
296 | *.sln.iml
297 |
298 | # CodeRush personal settings
299 | .cr/personal
300 |
301 | # Python Tools for Visual Studio (PTVS)
302 | __pycache__/
303 | *.pyc
304 |
305 | # Cake - Uncomment if you are using it
306 | # tools/**
307 | # !tools/packages.config
308 |
309 | # Tabs Studio
310 | *.tss
311 |
312 | # Telerik's JustMock configuration file
313 | *.jmconfig
314 |
315 | # BizTalk build output
316 | *.btp.cs
317 | *.btm.cs
318 | *.odx.cs
319 | *.xsd.cs
320 |
321 | # OpenCover UI analysis results
322 | OpenCover/
323 |
324 | # Azure Stream Analytics local run output
325 | ASALocalRun/
326 |
327 | # MSBuild Binary and Structured Log
328 | *.binlog
329 |
330 | # NVidia Nsight GPU debugger configuration file
331 | *.nvuser
332 |
333 | # MFractors (Xamarin productivity tool) working folder
334 | .mfractor/
335 |
336 | # Local History for Visual Studio
337 | .localhistory/
338 |
339 | # BeatPulse healthcheck temp database
340 | healthchecksdb
--------------------------------------------------------------------------------
/PrincessTool.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 16
4 | VisualStudioVersion = 16.0.29806.167
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrincessTool", "PrincessTool\PrincessTool.csproj", "{AB77825F-9987-447B-8D6F-E12D2B16D447}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {AB77825F-9987-447B-8D6F-E12D2B16D447}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {AB77825F-9987-447B-8D6F-E12D2B16D447}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {AB77825F-9987-447B-8D6F-E12D2B16D447}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {AB77825F-9987-447B-8D6F-E12D2B16D447}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | GlobalSection(ExtensibilityGlobals) = postSolution
23 | SolutionGuid = {49241CAF-C35F-4662-9333-6A4281F02F93}
24 | EndGlobalSection
25 | EndGlobal
26 |
--------------------------------------------------------------------------------
/PrincessTool/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/PrincessTool/Dialog.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Reflection;
3 | using Microsoft.WindowsAPICodePack.Dialogs;
4 |
5 | namespace AioiLight.PrincessTool
6 | {
7 | internal static class Dialog
8 | {
9 | internal static string Folder(string def, IntPtr handle)
10 | {
11 | var dialog = new CommonOpenFileDialog();
12 | dialog.IsFolderPicker = true;
13 | dialog.DefaultDirectory = def;
14 |
15 |
16 | if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
17 | {
18 | return dialog.FileName;
19 | }
20 | return null;
21 | }
22 |
23 | internal static void Error(string caption, string text, IntPtr handle)
24 | {
25 | var dialog = new TaskDialog();
26 | dialog.Icon = TaskDialogStandardIcon.Error;
27 | dialog.Text = text;
28 | dialog.InstructionText = caption;
29 | dialog.Caption = Assembly.GetExecutingAssembly().GetName().Name;
30 |
31 | dialog.OwnerWindowHandle = handle;
32 |
33 | dialog.Show();
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/PrincessTool/Main.Designer.cs:
--------------------------------------------------------------------------------
1 | namespace AioiLight.PrincessTool
2 | {
3 | partial class Main
4 | {
5 | ///
6 | /// 必要なデザイナー変数です。
7 | ///
8 | private System.ComponentModel.IContainer components = null;
9 |
10 | ///
11 | /// 使用中のリソースをすべてクリーンアップします。
12 | ///
13 | /// マネージド リソースを破棄する場合は true を指定し、その他の場合は false を指定します。
14 | protected override void Dispose(bool disposing)
15 | {
16 | if (disposing && (components != null))
17 | {
18 | components.Dispose();
19 | }
20 | base.Dispose(disposing);
21 | }
22 |
23 | #region Windows フォーム デザイナーで生成されたコード
24 |
25 | ///
26 | /// デザイナー サポートに必要なメソッドです。このメソッドの内容を
27 | /// コード エディターで変更しないでください。
28 | ///
29 | private void InitializeComponent()
30 | {
31 | this.Button_Origin_Open = new System.Windows.Forms.Button();
32 | this.TextBox_Origin_Folder = new System.Windows.Forms.TextBox();
33 | this.Label_Origin_Text = new System.Windows.Forms.Label();
34 | this.GroupBox_Options = new System.Windows.Forms.GroupBox();
35 | this.CheckBox_Rename = new System.Windows.Forms.CheckBox();
36 | this.Button_Extract = new System.Windows.Forms.Button();
37 | this.Label_Extract_Text = new System.Windows.Forms.Label();
38 | this.TextBox_Extract_Folder = new System.Windows.Forms.TextBox();
39 | this.Button_Extract_Open = new System.Windows.Forms.Button();
40 | this.CheckBox_Convert_Voice = new System.Windows.Forms.CheckBox();
41 | this.CheckBox_Convert_SE = new System.Windows.Forms.CheckBox();
42 | this.CheckBox_Convert_BGM = new System.Windows.Forms.CheckBox();
43 | this.GroupBox_Options.SuspendLayout();
44 | this.SuspendLayout();
45 | //
46 | // Button_Origin_Open
47 | //
48 | this.Button_Origin_Open.Location = new System.Drawing.Point(480, 12);
49 | this.Button_Origin_Open.Name = "Button_Origin_Open";
50 | this.Button_Origin_Open.Size = new System.Drawing.Size(92, 30);
51 | this.Button_Origin_Open.TabIndex = 0;
52 | this.Button_Origin_Open.Text = "Open...";
53 | this.Button_Origin_Open.UseVisualStyleBackColor = true;
54 | this.Button_Origin_Open.Click += new System.EventHandler(this.Button_Origin_Open_Click);
55 | //
56 | // TextBox_Origin_Folder
57 | //
58 | this.TextBox_Origin_Folder.Location = new System.Drawing.Point(135, 14);
59 | this.TextBox_Origin_Folder.Name = "TextBox_Origin_Folder";
60 | this.TextBox_Origin_Folder.ReadOnly = true;
61 | this.TextBox_Origin_Folder.Size = new System.Drawing.Size(339, 27);
62 | this.TextBox_Origin_Folder.TabIndex = 1;
63 | //
64 | // Label_Origin_Text
65 | //
66 | this.Label_Origin_Text.AutoSize = true;
67 | this.Label_Origin_Text.Location = new System.Drawing.Point(12, 17);
68 | this.Label_Origin_Text.Name = "Label_Origin_Text";
69 | this.Label_Origin_Text.Size = new System.Drawing.Size(117, 20);
70 | this.Label_Origin_Text.TabIndex = 2;
71 | this.Label_Origin_Text.Text = "Origin resources:";
72 | //
73 | // GroupBox_Options
74 | //
75 | this.GroupBox_Options.Controls.Add(this.CheckBox_Convert_BGM);
76 | this.GroupBox_Options.Controls.Add(this.CheckBox_Convert_SE);
77 | this.GroupBox_Options.Controls.Add(this.CheckBox_Convert_Voice);
78 | this.GroupBox_Options.Controls.Add(this.CheckBox_Rename);
79 | this.GroupBox_Options.Location = new System.Drawing.Point(12, 47);
80 | this.GroupBox_Options.Name = "GroupBox_Options";
81 | this.GroupBox_Options.Size = new System.Drawing.Size(560, 130);
82 | this.GroupBox_Options.TabIndex = 3;
83 | this.GroupBox_Options.TabStop = false;
84 | this.GroupBox_Options.Text = "Extract options:";
85 | //
86 | // CheckBox_Rename
87 | //
88 | this.CheckBox_Rename.AutoSize = true;
89 | this.CheckBox_Rename.Location = new System.Drawing.Point(6, 26);
90 | this.CheckBox_Rename.Name = "CheckBox_Rename";
91 | this.CheckBox_Rename.Size = new System.Drawing.Size(192, 24);
92 | this.CheckBox_Rename.TabIndex = 0;
93 | this.CheckBox_Rename.Text = "Rename Hashed filename";
94 | this.CheckBox_Rename.UseVisualStyleBackColor = true;
95 | //
96 | // Button_Extract
97 | //
98 | this.Button_Extract.Font = new System.Drawing.Font("メイリオ", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
99 | this.Button_Extract.Location = new System.Drawing.Point(452, 206);
100 | this.Button_Extract.Name = "Button_Extract";
101 | this.Button_Extract.Size = new System.Drawing.Size(120, 40);
102 | this.Button_Extract.TabIndex = 4;
103 | this.Button_Extract.Text = "Extract";
104 | this.Button_Extract.UseVisualStyleBackColor = true;
105 | this.Button_Extract.Click += new System.EventHandler(this.Button_Extract_Click);
106 | //
107 | // Label_Extract_Text
108 | //
109 | this.Label_Extract_Text.AutoSize = true;
110 | this.Label_Extract_Text.Location = new System.Drawing.Point(12, 222);
111 | this.Label_Extract_Text.Name = "Label_Extract_Text";
112 | this.Label_Extract_Text.Size = new System.Drawing.Size(64, 20);
113 | this.Label_Extract_Text.TabIndex = 5;
114 | this.Label_Extract_Text.Text = "Dest dir:";
115 | //
116 | // TextBox_Extract_Folder
117 | //
118 | this.TextBox_Extract_Folder.Location = new System.Drawing.Point(82, 219);
119 | this.TextBox_Extract_Folder.Name = "TextBox_Extract_Folder";
120 | this.TextBox_Extract_Folder.ReadOnly = true;
121 | this.TextBox_Extract_Folder.Size = new System.Drawing.Size(364, 27);
122 | this.TextBox_Extract_Folder.TabIndex = 6;
123 | //
124 | // Button_Extract_Open
125 | //
126 | this.Button_Extract_Open.Location = new System.Drawing.Point(354, 183);
127 | this.Button_Extract_Open.Name = "Button_Extract_Open";
128 | this.Button_Extract_Open.Size = new System.Drawing.Size(92, 30);
129 | this.Button_Extract_Open.TabIndex = 7;
130 | this.Button_Extract_Open.Text = "Open...";
131 | this.Button_Extract_Open.UseVisualStyleBackColor = true;
132 | this.Button_Extract_Open.Click += new System.EventHandler(this.Button_Extract_Open_Click);
133 | //
134 | // CheckBox_Convert_Voice
135 | //
136 | this.CheckBox_Convert_Voice.AutoSize = true;
137 | this.CheckBox_Convert_Voice.Location = new System.Drawing.Point(232, 26);
138 | this.CheckBox_Convert_Voice.Name = "CheckBox_Convert_Voice";
139 | this.CheckBox_Convert_Voice.Size = new System.Drawing.Size(224, 24);
140 | this.CheckBox_Convert_Voice.TabIndex = 1;
141 | this.CheckBox_Convert_Voice.Text = "Convert voice audio file (.wav)";
142 | this.CheckBox_Convert_Voice.UseVisualStyleBackColor = true;
143 | //
144 | // CheckBox_Convert_SE
145 | //
146 | this.CheckBox_Convert_SE.AutoSize = true;
147 | this.CheckBox_Convert_SE.Location = new System.Drawing.Point(6, 86);
148 | this.CheckBox_Convert_SE.Name = "CheckBox_Convert_SE";
149 | this.CheckBox_Convert_SE.Size = new System.Drawing.Size(207, 24);
150 | this.CheckBox_Convert_SE.TabIndex = 2;
151 | this.CheckBox_Convert_SE.Text = "Convert SE audio file (.wav)";
152 | this.CheckBox_Convert_SE.UseVisualStyleBackColor = true;
153 | //
154 | // CheckBox_Convert_BGM
155 | //
156 | this.CheckBox_Convert_BGM.AutoSize = true;
157 | this.CheckBox_Convert_BGM.Location = new System.Drawing.Point(6, 56);
158 | this.CheckBox_Convert_BGM.Name = "CheckBox_Convert_BGM";
159 | this.CheckBox_Convert_BGM.Size = new System.Drawing.Size(220, 24);
160 | this.CheckBox_Convert_BGM.TabIndex = 3;
161 | this.CheckBox_Convert_BGM.Text = "Convert BGM audio file (.wav)";
162 | this.CheckBox_Convert_BGM.UseVisualStyleBackColor = true;
163 | //
164 | // Main
165 | //
166 | this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
167 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
168 | this.ClientSize = new System.Drawing.Size(584, 258);
169 | this.Controls.Add(this.Button_Extract_Open);
170 | this.Controls.Add(this.TextBox_Extract_Folder);
171 | this.Controls.Add(this.Label_Extract_Text);
172 | this.Controls.Add(this.Button_Extract);
173 | this.Controls.Add(this.GroupBox_Options);
174 | this.Controls.Add(this.Label_Origin_Text);
175 | this.Controls.Add(this.Button_Origin_Open);
176 | this.Controls.Add(this.TextBox_Origin_Folder);
177 | this.Font = new System.Drawing.Font("メイリオ", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
178 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
179 | this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
180 | this.MaximizeBox = false;
181 | this.MinimizeBox = false;
182 | this.Name = "Main";
183 | this.Text = "PrincessTool";
184 | this.GroupBox_Options.ResumeLayout(false);
185 | this.GroupBox_Options.PerformLayout();
186 | this.ResumeLayout(false);
187 | this.PerformLayout();
188 |
189 | }
190 |
191 | #endregion
192 |
193 | private System.Windows.Forms.Button Button_Origin_Open;
194 | private System.Windows.Forms.TextBox TextBox_Origin_Folder;
195 | private System.Windows.Forms.Label Label_Origin_Text;
196 | private System.Windows.Forms.GroupBox GroupBox_Options;
197 | private System.Windows.Forms.CheckBox CheckBox_Rename;
198 | private System.Windows.Forms.Button Button_Extract;
199 | private System.Windows.Forms.Label Label_Extract_Text;
200 | private System.Windows.Forms.TextBox TextBox_Extract_Folder;
201 | private System.Windows.Forms.Button Button_Extract_Open;
202 | private System.Windows.Forms.CheckBox CheckBox_Convert_BGM;
203 | private System.Windows.Forms.CheckBox CheckBox_Convert_SE;
204 | private System.Windows.Forms.CheckBox CheckBox_Convert_Voice;
205 | }
206 | }
207 |
208 |
--------------------------------------------------------------------------------
/PrincessTool/Main.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.ComponentModel;
4 | using System.Data;
5 | using System.Drawing;
6 | using System.IO;
7 | using System.Linq;
8 | using System.Reflection;
9 | using System.Text;
10 | using System.Threading.Tasks;
11 | using System.Windows.Forms;
12 |
13 | namespace AioiLight.PrincessTool
14 | {
15 | public partial class Main : Form
16 | {
17 | public Main()
18 | {
19 | InitializeComponent();
20 |
21 | var localDir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
22 | var localLowDir = localDir += "Low";
23 | TextBox_Origin_Folder.Text = Path.Combine(localLowDir, @"Cygames\PrincessConnectReDive\");
24 |
25 | var appDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
26 | TextBox_Extract_Folder.Text = Path.Combine(appDir, @"dest\");
27 | }
28 |
29 | private void Button_Origin_Open_Click(object sender, EventArgs e)
30 | {
31 | var result = Dialog.Folder(TextBox_Origin_Folder.Text, Handle);
32 | if (result != null)
33 | {
34 | TextBox_Origin_Folder.Text = result;
35 | }
36 | }
37 |
38 | private void Button_Extract_Open_Click(object sender, EventArgs e)
39 | {
40 | var result = Dialog.Folder(TextBox_Extract_Folder.Text, Handle);
41 | if (result != null)
42 | {
43 | TextBox_Extract_Folder.Text = result;
44 | }
45 | }
46 |
47 | private void Button_Extract_Click(object sender, EventArgs e)
48 | {
49 | Program.Origin = TextBox_Origin_Folder.Text;
50 | Program.Dest = TextBox_Extract_Folder.Text;
51 | if (!Directory.Exists(Program.Origin))
52 | {
53 | Dialog.Error("Original directory is not found",
54 | "Original directory is not found.\n" +
55 | "Check path of directory.",
56 | Handle);
57 | }
58 |
59 | Directory.CreateDirectory(Program.Dest);
60 |
61 | new Works.FileCopy();
62 |
63 | if (CheckBox_Rename.Checked)
64 | {
65 | new Works.RenameHashedFile();
66 | }
67 | if (CheckBox_Convert_BGM.Checked)
68 | {
69 | new Works.ConvertSound("b", "Convert BGM audio");
70 | }
71 | if (CheckBox_Convert_SE.Checked)
72 | {
73 | new Works.ConvertSound("s", "Convert SE audio");
74 | }
75 | if (CheckBox_Convert_Voice.Checked)
76 | {
77 | new Works.ConvertSound("v", "Convert Voice audio");
78 | }
79 | }
80 | }
81 | }
82 |
--------------------------------------------------------------------------------
/PrincessTool/Main.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | text/microsoft-resx
110 |
111 |
112 | 2.0
113 |
114 |
115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
119 |
120 |
--------------------------------------------------------------------------------
/PrincessTool/PrincessTool.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {AB77825F-9987-447B-8D6F-E12D2B16D447}
8 | WinExe
9 | PrincessTool
10 | PrincessTool
11 | v4.6
12 | 512
13 | true
14 | true
15 |
16 |
17 |
18 |
19 | AnyCPU
20 | true
21 | full
22 | false
23 | bin\Debug\
24 | DEBUG;TRACE
25 | prompt
26 | 4
27 |
28 |
29 | AnyCPU
30 | none
31 | true
32 | bin\Release\
33 | TRACE
34 | prompt
35 | 4
36 |
37 |
38 |
39 | ..\packages\WindowsAPICodePack-Core.1.1.2\lib\Microsoft.WindowsAPICodePack.dll
40 |
41 |
42 | ..\packages\WindowsAPICodePack-Shell.1.1.1\lib\Microsoft.WindowsAPICodePack.Shell.dll
43 |
44 |
45 |
46 |
47 | ..\packages\System.Data.SQLite.Core.1.0.112.0\lib\net46\System.Data.SQLite.dll
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 | Form
63 |
64 |
65 | Main.cs
66 |
67 |
68 |
69 | Form
70 |
71 |
72 | Progress.cs
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 | Main.cs
81 |
82 |
83 | Progress.cs
84 |
85 |
86 | ResXFileCodeGenerator
87 | Resources.Designer.cs
88 | Designer
89 |
90 |
91 | True
92 | Resources.resx
93 |
94 |
95 |
96 | SettingsSingleFileGenerator
97 | Settings.Designer.cs
98 |
99 |
100 | True
101 | Settings.settings
102 | True
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 | このプロジェクトは、このコンピューター上にない NuGet パッケージを参照しています。それらのパッケージをダウンロードするには、[NuGet パッケージの復元] を使用します。詳細については、http://go.microsoft.com/fwlink/?LinkID=322105 を参照してください。見つからないファイルは {0} です。
113 |
114 |
115 |
116 |
117 | mkdir "$(TargetDir)tools"
118 | xcopy /s/e/y "$(SolutionDir)tools" "$(TargetDir)tools"
119 |
120 |
--------------------------------------------------------------------------------
/PrincessTool/Program.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Threading.Tasks;
5 | using System.Windows.Forms;
6 |
7 | namespace AioiLight.PrincessTool
8 | {
9 | internal static class Program
10 | {
11 | ///
12 | /// アプリケーションのメイン エントリ ポイントです。
13 | ///
14 | [STAThread]
15 | static void Main()
16 | {
17 | Application.EnableVisualStyles();
18 | Application.SetCompatibleTextRenderingDefault(false);
19 | MainWindow = new Main();
20 | Application.Run(MainWindow);
21 | }
22 |
23 | internal static string Origin { get; set; }
24 | internal static string Dest { get; set; }
25 | internal static Main MainWindow { get; set; }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/PrincessTool/Progress.Designer.cs:
--------------------------------------------------------------------------------
1 | namespace AioiLight.PrincessTool
2 | {
3 | partial class Progress
4 | {
5 | ///
6 | /// Required designer variable.
7 | ///
8 | private System.ComponentModel.IContainer components = null;
9 |
10 | ///
11 | /// Clean up any resources being used.
12 | ///
13 | /// true if managed resources should be disposed; otherwise, false.
14 | protected override void Dispose(bool disposing)
15 | {
16 | if (disposing && (components != null))
17 | {
18 | components.Dispose();
19 | }
20 | base.Dispose(disposing);
21 | }
22 |
23 | #region Windows Form Designer generated code
24 |
25 | ///
26 | /// Required method for Designer support - do not modify
27 | /// the contents of this method with the code editor.
28 | ///
29 | private void InitializeComponent()
30 | {
31 | this.Label_Desc = new System.Windows.Forms.Label();
32 | this.Bar_Progress = new System.Windows.Forms.ProgressBar();
33 | this.SuspendLayout();
34 | //
35 | // Label_Desc
36 | //
37 | this.Label_Desc.AutoSize = true;
38 | this.Label_Desc.Location = new System.Drawing.Point(12, 9);
39 | this.Label_Desc.Name = "Label_Desc";
40 | this.Label_Desc.Size = new System.Drawing.Size(88, 20);
41 | this.Label_Desc.TabIndex = 0;
42 | this.Label_Desc.Text = "Progressing:";
43 | //
44 | // Bar_Progress
45 | //
46 | this.Bar_Progress.Location = new System.Drawing.Point(12, 43);
47 | this.Bar_Progress.Name = "Bar_Progress";
48 | this.Bar_Progress.Size = new System.Drawing.Size(360, 23);
49 | this.Bar_Progress.TabIndex = 1;
50 | //
51 | // Progress
52 | //
53 | this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
54 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
55 | this.ClientSize = new System.Drawing.Size(384, 78);
56 | this.ControlBox = false;
57 | this.Controls.Add(this.Bar_Progress);
58 | this.Controls.Add(this.Label_Desc);
59 | this.Font = new System.Drawing.Font("メイリオ", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
60 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
61 | this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
62 | this.MaximizeBox = false;
63 | this.MinimizeBox = false;
64 | this.Name = "Progress";
65 | this.ShowInTaskbar = false;
66 | this.Text = "Progressing:";
67 | this.Load += new System.EventHandler(this.Progress_Load);
68 | this.ResumeLayout(false);
69 | this.PerformLayout();
70 |
71 | }
72 |
73 | #endregion
74 |
75 | private System.Windows.Forms.Label Label_Desc;
76 | private System.Windows.Forms.ProgressBar Bar_Progress;
77 | }
78 | }
--------------------------------------------------------------------------------
/PrincessTool/Progress.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Windows.Forms;
3 |
4 | namespace AioiLight.PrincessTool
5 | {
6 | public partial class Progress : Form
7 | {
8 | public Progress(string caption, int maxProg, Action> task)
9 | {
10 | InitializeComponent();
11 | MaxValue = maxProg;
12 |
13 | Bar_Progress.Maximum = MaxValue;
14 | Bar_Progress.Minimum = 0;
15 |
16 | Task = task;
17 |
18 | Text = $"Progressing: {caption}";
19 | Label_Desc.Text = $"Progressing: {caption}";
20 |
21 | ShowDialog(Program.MainWindow);
22 | }
23 |
24 | private int MaxValue { get; set; }
25 | private Action> Task { get; set; }
26 |
27 | private void Progress_Load(object sender, EventArgs e)
28 | {
29 | StartTask();
30 | }
31 |
32 | private async void StartTask()
33 | {
34 | var prog = new Progress(TickBar);
35 |
36 | var task = System.Threading.Tasks.Task.Run(() => { Task(prog); });
37 |
38 | await task;
39 |
40 | Close();
41 | }
42 |
43 | private void TickBar(int value)
44 | {
45 | Bar_Progress.Value = value;
46 | }
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/PrincessTool/Progress.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 | text/microsoft-resx
110 |
111 |
112 | 2.0
113 |
114 |
115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
119 |
120 |
--------------------------------------------------------------------------------
/PrincessTool/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // アセンブリに関する一般情報は以下の属性セットをとおして制御されます。
6 | // 制御されます。アセンブリに関連付けられている情報を変更するには、
7 | // これらの属性値を変更します。
8 | [assembly: AssemblyTitle("PrincessTool")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("PrincessTool")]
13 | [assembly: AssemblyCopyright("Copyright © 2020")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // ComVisible を false に設定すると、このアセンブリ内の型は COM コンポーネントから
18 | // 参照できなくなります。COM からこのアセンブリ内の型にアクセスする必要がある場合は、
19 | // その型の ComVisible 属性を true に設定してください。
20 | [assembly: ComVisible(false)]
21 |
22 | // このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります
23 | [assembly: Guid("ab77825f-9987-447b-8d6f-e12d2b16d447")]
24 |
25 | // アセンブリのバージョン情報は、以下の 4 つの値で構成されています:
26 | //
27 | // メジャー バージョン
28 | // マイナー バージョン
29 | // ビルド番号
30 | // リビジョン
31 | //
32 | // すべての値を指定するか、次を使用してビルド番号とリビジョン番号を既定に設定できます
33 | // 既定値にすることができます:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/PrincessTool/Properties/Resources.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // このコードはツールによって生成されました。
4 | // ランタイム バージョン:4.0.30319.42000
5 | //
6 | // このファイルへの変更は、以下の状況下で不正な動作の原因になったり、
7 | // コードが再生成されるときに損失したりします
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace PrincessTool.Properties
12 | {
13 |
14 |
15 | ///
16 | /// ローカライズされた文字列などを検索するための、厳密に型指定されたリソース クラスです。
17 | ///
18 | // このクラスは StronglyTypedResourceBuilder クラスが ResGen
19 | // または Visual Studio のようなツールを使用して自動生成されました。
20 | // メンバーを追加または削除するには、.ResX ファイルを編集して、/str オプションと共に
21 | // ResGen を実行し直すか、または VS プロジェクトをリビルドします。
22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
25 | internal class Resources
26 | {
27 |
28 | private static global::System.Resources.ResourceManager resourceMan;
29 |
30 | private static global::System.Globalization.CultureInfo resourceCulture;
31 |
32 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
33 | internal Resources()
34 | {
35 | }
36 |
37 | ///
38 | /// このクラスで使用されるキャッシュされた ResourceManager インスタンスを返します。
39 | ///
40 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
41 | internal static global::System.Resources.ResourceManager ResourceManager
42 | {
43 | get
44 | {
45 | if ((resourceMan == null))
46 | {
47 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PrincessTool.Properties.Resources", typeof(Resources).Assembly);
48 | resourceMan = temp;
49 | }
50 | return resourceMan;
51 | }
52 | }
53 |
54 | ///
55 | /// すべてについて、現在のスレッドの CurrentUICulture プロパティをオーバーライドします
56 | /// 現在のスレッドの CurrentUICulture プロパティをオーバーライドします。
57 | ///
58 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
59 | internal static global::System.Globalization.CultureInfo Culture
60 | {
61 | get
62 | {
63 | return resourceCulture;
64 | }
65 | set
66 | {
67 | resourceCulture = value;
68 | }
69 | }
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/PrincessTool/Properties/Resources.resx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 | text/microsoft-resx
107 |
108 |
109 | 2.0
110 |
111 |
112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
113 |
114 |
115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
116 |
117 |
--------------------------------------------------------------------------------
/PrincessTool/Properties/Settings.Designer.cs:
--------------------------------------------------------------------------------
1 | //------------------------------------------------------------------------------
2 | //
3 | // This code was generated by a tool.
4 | // Runtime Version:4.0.30319.42000
5 | //
6 | // Changes to this file may cause incorrect behavior and will be lost if
7 | // the code is regenerated.
8 | //
9 | //------------------------------------------------------------------------------
10 |
11 | namespace PrincessTool.Properties
12 | {
13 |
14 |
15 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
16 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
17 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
18 | {
19 |
20 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
21 |
22 | public static Settings Default
23 | {
24 | get
25 | {
26 | return defaultInstance;
27 | }
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/PrincessTool/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/PrincessTool/Works/ConvertSound.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Diagnostics;
3 | using System.IO;
4 | using System.Linq;
5 | using System.Reflection;
6 |
7 | namespace AioiLight.PrincessTool.Works
8 | {
9 | public class ConvertSound : IWorkable
10 | {
11 | public ConvertSound(string folder, string desc)
12 | {
13 | var targetFolder = Path.Combine(Program.Dest, folder);
14 |
15 | if (!Directory.Exists(targetFolder))
16 | {
17 | return;
18 | }
19 |
20 | // .awb, .acbファイルのみ該当させる。
21 | var files = Directory.GetFiles(targetFolder, "*.*", SearchOption.AllDirectories)
22 | .Where(f => f.EndsWith(".awb", StringComparison.OrdinalIgnoreCase)
23 | || f.EndsWith(".acb", StringComparison.OrdinalIgnoreCase))
24 | .ToArray();
25 | var filesAmount = files.Count();
26 | Folder = folder;
27 | new Progress(desc, filesAmount, Process);
28 |
29 | }
30 |
31 | public void Process(IProgress progress)
32 | {
33 | // .awb, .acbファイルのみ該当させる。
34 | var targetFolder = Path.Combine(Program.Dest, Folder);
35 | var files = Directory.GetFiles(targetFolder, "*.*", SearchOption.AllDirectories)
36 | .Where(f => f.EndsWith(".awb", StringComparison.OrdinalIgnoreCase)
37 | || f.EndsWith(".acb", StringComparison.OrdinalIgnoreCase))
38 | .ToArray();
39 |
40 | // コピー先フォルダの決定。
41 | var copyFolder = Path.Combine(Program.Dest, $@"convert-{Folder}");
42 |
43 | var cnt = 0;
44 | foreach (var item in files)
45 | {
46 | var itemFolder = Path.GetDirectoryName(item);
47 | var itemRelative = item.Substring(targetFolder.Length + 1);
48 |
49 | var itemConvertedPath = Path.Combine(copyFolder, itemRelative);
50 | var itemConvertedFolder = Path.GetDirectoryName(itemConvertedPath);
51 | if (!Directory.Exists(itemConvertedFolder))
52 | {
53 | // ディレクトリがなかったら作る。
54 | Directory.CreateDirectory(itemConvertedFolder);
55 | }
56 |
57 | var tracks = GetTracks(item);
58 | if (tracks != null)
59 | {
60 | foreach (var track in tracks)
61 | {
62 | Convert(item, Path.Combine(itemConvertedFolder,
63 | $"{track.Name}.wav"),
64 | track.TrackNum);
65 | }
66 | }
67 |
68 | cnt++;
69 | progress.Report(cnt);
70 | }
71 | }
72 |
73 | ///
74 | /// トラック情報の配列を生成する。
75 | ///
76 | /// ファイルパス。
77 | /// 場合によってはnullが返ることもある。
78 | private TrackInfo[] GetTracks(string filePath)
79 | {
80 | var info = GetInfo(filePath);
81 |
82 | var lines = info.Split(new char[] { '\r', '\n' });
83 | if (lines.Where(s => s.StartsWith("failed opening")).Any())
84 | {
85 | // ウェーブデータの無い.acbや、
86 | // その他変なファイルが投げられた。
87 | return null;
88 | }
89 |
90 |
91 | var findTrack = "stream count: ";
92 | var tracks = lines.Where(s => s.StartsWith(findTrack));
93 | if (tracks.Any())
94 | {
95 | // 複数のトラックがある。
96 | if (int.TryParse(tracks.First().Substring(findTrack.Length), out var number))
97 | {
98 | var trackInfo = new TrackInfo[number];
99 | for (int i = 0; i < number; i++)
100 | {
101 | var track = new TrackInfo();
102 |
103 | // もういちどトラック番号から情報を取得してみる。
104 | track.Name = GetTrackName(GetInfo(filePath, i + 1));
105 | track.TrackNum = i + 1;
106 |
107 | trackInfo[i] = track;
108 | }
109 | return trackInfo;
110 | }
111 | else
112 | {
113 | // トラック数が取得できなかった。
114 | return null;
115 | }
116 | }
117 | else
118 | {
119 | // 1つのトラックしか無い
120 | var trackInfo = new TrackInfo[1];
121 | var track = new TrackInfo();
122 |
123 | track.Name = GetTrackName(GetInfo(filePath));
124 |
125 | if (string.IsNullOrWhiteSpace(track.Name))
126 | {
127 | // エラーが出力で受け取れないのでここで処理する。
128 | return null;
129 | }
130 |
131 | track.TrackNum = 1;
132 |
133 | trackInfo[0] = track;
134 |
135 | return trackInfo;
136 | }
137 | }
138 |
139 | ///
140 | /// ファイル情報からトラック名を取得する。
141 | ///
142 | /// ファイル情報。
143 | /// トラック名。nullが返ることもある。
144 | private string GetTrackName(string info)
145 | {
146 | if (info == null)
147 | {
148 | // 情報がnull
149 | return null;
150 | }
151 |
152 | var lines = info.Split(new char[] { '\r', '\n' });
153 | if (lines.Where(s => s.StartsWith("failed opening")).Any())
154 | {
155 | // ウェーブデータの無い.acbや、
156 | // その他変なファイルが投げられた。
157 | return null;
158 | }
159 |
160 | // ストリーム名を取得。
161 | var findName = "stream name: ";
162 | var name = lines.Where(s => s.StartsWith(findName));
163 | if (!name.Any())
164 | {
165 | // 名前が取得できなかった
166 | return null;
167 | }
168 | var streamName = name.First().Substring(findName.Length);
169 |
170 | return streamName;
171 | }
172 |
173 | ///
174 | /// ファイルパスよりtest.exeを動かす。
175 | ///
176 | /// ファイルパス。
177 | /// トラック数。
178 | /// ファイル情報。
179 | private string GetInfo(string filePath, int? track = null)
180 | {
181 | var vgmstreamPath = GetVgmstream();
182 |
183 | var cmd = new Process();
184 | // cmd.exeの場所
185 | cmd.StartInfo.FileName = vgmstreamPath;
186 | // 引数
187 | if (track.HasValue)
188 | {
189 | cmd.StartInfo.Arguments = $"-m -s {track.Value} {filePath}";
190 | }
191 | else
192 | {
193 | cmd.StartInfo.Arguments = $"-m {filePath}";
194 | }
195 | cmd.StartInfo.UseShellExecute = false;
196 | cmd.StartInfo.RedirectStandardOutput = true;
197 | cmd.StartInfo.CreateNoWindow = true;
198 | cmd.Start();
199 |
200 | var result = cmd.StandardOutput.ReadToEnd();
201 | cmd.WaitForExit();
202 | cmd.Close();
203 |
204 |
205 | return result;
206 | }
207 |
208 | ///
209 | /// .acb、.awbから.wavに変換する。
210 | ///
211 | /// 入力パス。
212 | /// 出力パス。
213 | /// トラック数。
214 | private void Convert(string input, string output, int? track = null)
215 | {
216 | var vgmstreamPath = GetVgmstream();
217 |
218 | var cmd = new Process();
219 | // cmd.exeの場所
220 | cmd.StartInfo.FileName = vgmstreamPath;
221 | // 引数
222 | if (track.HasValue)
223 | {
224 | cmd.StartInfo.Arguments = $"-s {track.Value} -o {output} {input}";
225 | }
226 | else
227 | {
228 | cmd.StartInfo.Arguments = $"-o {output} {input}";
229 | }
230 | cmd.StartInfo.UseShellExecute = false;
231 | cmd.StartInfo.RedirectStandardOutput = true;
232 | cmd.StartInfo.CreateNoWindow = true;
233 |
234 | cmd.Start();
235 |
236 | cmd.StandardOutput.ReadToEnd();
237 | cmd.WaitForExit();
238 | cmd.Close();
239 | }
240 |
241 | private string GetVgmstream()
242 | {
243 | var appDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
244 | var path = Path.Combine(appDir, @"tools\vgmstream\test.exe");
245 | return path;
246 | }
247 |
248 | private string Folder { get; set; }
249 |
250 | private class TrackInfo
251 | {
252 | public string Name { get; set; }
253 | public int TrackNum { get; set; }
254 | }
255 | }
256 | }
257 |
--------------------------------------------------------------------------------
/PrincessTool/Works/FileCopy.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Linq;
4 |
5 | namespace AioiLight.PrincessTool.Works
6 | {
7 | public class FileCopy : IWorkable
8 | {
9 | public FileCopy()
10 | {
11 | var files = Directory.GetFiles(Program.Origin, "*.*", SearchOption.AllDirectories);
12 | var filesAmount = files.Count();
13 | new Progress("Copy all files", filesAmount, Process);
14 | }
15 |
16 | public void Process(IProgress progress)
17 | {
18 | var files = Directory.GetFiles(Program.Origin, "*.*", SearchOption.AllDirectories);
19 | var cnt = 0;
20 | foreach (var item in files)
21 | {
22 | // どこにコピーすべきか決定。
23 | var itemOriginFolder = Path.GetDirectoryName(item);
24 | var originFolder = Path.GetDirectoryName(Program.Origin);
25 | var itemRelative = item.Substring(originFolder.Length + 1);
26 |
27 | var itemDestPath = Path.Combine(Program.Dest, itemRelative);
28 | var itemDestFolder = Path.GetDirectoryName(itemDestPath);
29 | if (!Directory.Exists(itemDestFolder))
30 | {
31 | // ディレクトリがなかったら作る。
32 | Directory.CreateDirectory(itemDestFolder);
33 | }
34 |
35 | // コピーする。
36 | File.Copy(item, itemDestPath, true);
37 | cnt++;
38 | progress.Report(cnt);
39 | }
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/PrincessTool/Works/IWorkable.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace AioiLight.PrincessTool.Works
4 | {
5 | public interface IWorkable
6 | {
7 | void Process(IProgress progress);
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/PrincessTool/Works/RenameHashedFile.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Linq;
4 | using System.Data.SQLite;
5 | using System.Collections.Generic;
6 | using System.Security.Cryptography;
7 |
8 | namespace AioiLight.PrincessTool.Works
9 | {
10 | public class RenameHashedFile : IWorkable
11 | {
12 | public RenameHashedFile()
13 | {
14 | var files = Directory.GetFiles(Program.Dest, "*.*", SearchOption.AllDirectories);
15 | var filesAmount = files.Count();
16 |
17 | if (!File.Exists(Path.Combine(Program.Dest, @"manifest.db")))
18 | {
19 | return;
20 | }
21 |
22 | HashList = new Dictionary();
23 | var connection = new SQLiteConnection($"Data Source={Path.Combine(Program.Dest, @"manifest.db")};");
24 | connection.Open();
25 | try
26 | {
27 | // SQL文
28 | var sql = "SELECT * from t";
29 | var result = new SQLiteCommand(sql, connection).ExecuteReader();
30 | while (result.Read())
31 | {
32 | var hash = result.GetString(1);
33 | var filename = result.GetString(0);
34 | if (!HashList.ContainsKey(hash))
35 | {
36 | HashList.Add(hash, filename);
37 | }
38 | }
39 | result.Close();
40 | }
41 | finally
42 | {
43 | connection.Close();
44 | }
45 | new Progress("Rename hashed files", filesAmount, Process);
46 | }
47 |
48 | public void Process(IProgress progress)
49 | {
50 | var files = Directory.GetFiles(Program.Dest, "*.*", SearchOption.AllDirectories);
51 | var cnt = 0;
52 | foreach (var item in files)
53 | {
54 | // ファイルの相対パスを出す。
55 | var itemFolder = Path.GetDirectoryName(item);
56 | var itemRelative = item.Substring(Program.Dest.Length + 1);
57 |
58 | if (!File.Exists(item))
59 | {
60 | cnt++;
61 | progress.Report(cnt);
62 | continue;
63 | }
64 |
65 | if (!itemRelative.Contains("\\"))
66 | {
67 | // ルートのやつなので検索しない。
68 | cnt++;
69 | progress.Report(cnt);
70 | continue;
71 | }
72 |
73 | // SHA1ハッシュの計算。
74 | var fileStream = new FileStream(item,
75 | FileMode.Open,
76 | FileAccess.Read,
77 | FileShare.None);
78 | var md5 = MD5.Create();
79 | var fileMD5 = md5.ComputeHash(fileStream);
80 | var hash = BitConverter.ToString(fileMD5).ToLower().Replace("-", "");
81 |
82 | // 後片付け
83 | md5.Clear();
84 | fileStream.Close();
85 |
86 | if (!HashList.ContainsKey(hash))
87 | {
88 | cnt++;
89 | progress.Report(cnt);
90 | continue;
91 | }
92 |
93 | // リネームする。
94 | var result = Path.Combine(Path.GetDirectoryName(itemRelative), Path.GetFileName(HashList[hash]));
95 |
96 | try
97 | {
98 | // note:たまにファイル名が重複しているやつがある?
99 | File.Move(item, Path.Combine(Program.Dest, result));
100 | }
101 | catch (IOException)
102 | {
103 |
104 | }
105 | finally
106 | {
107 | cnt++;
108 | progress.Report(cnt);
109 | }
110 |
111 | }
112 | }
113 |
114 | private Dictionary HashList;
115 | }
116 | }
117 |
--------------------------------------------------------------------------------
/PrincessTool/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # PrincessTool
2 | プリンセスコネクト!Re:Dive のリソース抽出ツール
3 |
4 | ## これはなに?
5 |
6 | プリンセスコネクト!Re:Dive のリソースを抽出するツールです。
7 |
8 | DMM版のリソースを特定のフォルダにコピーして、そこから自動的にファイルをリネームしたり、音声をWAVEフォーマットに変換したりします。
9 |
10 | ## 注意事項
11 |
12 | すべてのリソースをコピー&変換すると30GB程度の容量になるので、ストレージに余裕があることを確認した後、実行してください。
13 |
--------------------------------------------------------------------------------
/tools/vgmstream/COPYING:
--------------------------------------------------------------------------------
1 | Copyright (c) 2008-2019 Adam Gashlin, Fastelbja, Ronny Elfert, bnnm,
2 | Christopher Snowhill, NicknineTheEagle, bxaimc,
3 | Thealexbarney, CyberBotX, et al
4 |
5 | Portions Copyright (c) 2004-2008, Marko Kreen
6 | Portions Copyright 2001-2007 jagarl / Kazunori Ueno
7 | Portions Copyright (c) 1998, Justin Frankel/Nullsoft Inc.
8 | Portions Copyright (C) 2006 Nullsoft, Inc.
9 | Portions Copyright (c) 2005-2007 Paul Hsieh
10 | Portions Public Domain originating with Sun Microsystems
11 |
12 | Permission to use, copy, modify, and distribute this software for any
13 | purpose with or without fee is hereby granted, provided that the above
14 | copyright notice and this permission notice appear in all copies.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
17 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
18 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
19 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
20 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
21 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
22 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 |
--------------------------------------------------------------------------------
/tools/vgmstream/README.md:
--------------------------------------------------------------------------------
1 | # vgmstream
2 |
3 | [](https://ci.appveyor.com/project/kode54/vgmstream/branch/master/artifacts)
4 |
5 |
6 | This is vgmstream, a library for playing streamed (pre-recorded) audio
7 | from video games.
8 |
9 | There are multiple end-user bits:
10 | - a command line decoder called "test.exe/vgmstream-cli"
11 | - a Winamp plugin called "in_vgmstream"
12 | - a foobar2000 component called "foo_input_vgmstream"
13 | - an XMPlay plugin called "xmp-vgmstream"
14 | - an Audacious plugin called "libvgmstream"
15 | - a command line player called "vgmstream123"
16 |
17 | Help and newest builds can be found here: https://www.hcs64.com/
18 |
19 | Latest development is usually here: https://github.com/losnoco/vgmstream/
20 |
21 | Latest releases are here: https://github.com/losnoco/vgmstream/releases
22 | Automated builds with the latest changes: https://ci.appveyor.com/project/kode54/vgmstream/branch/master/artifacts
23 |
24 | You can find further info about other details in https://github.com/losnoco/vgmstream/tree/master/doc
25 |
26 | ## Needed extra files (for Windows)
27 | Support for some codecs (Ogg Vorbis, MPEG audio, etc) is done with external
28 | libraries, so you will need to have certain DLL files.
29 |
30 | In the case of the foobar2000 component they are all bundled for convenience,
31 | or you can get them here: https://github.com/losnoco/vgmstream/tree/master/ext_libs
32 | (bundled here: https://f.losno.co/vgmstream-win32-deps.zip, may not be latest).
33 |
34 | Put the following files somewhere Windows can find them:
35 | - `libvorbis.dll`
36 | - `libmpg123-0.dll`
37 | - `libg719_decode.dll`
38 | - `avcodec-vgmstream-58.dll`
39 | - `avformat-vgmstream-58.dll`
40 | - `avutil-vgmstream-56.dll`
41 | - `swresample-vgmstream-3.dll`
42 | - `libatrac9.dll`
43 | - `libcelt-0061.dll`
44 | - `libcelt-0110.dll`
45 |
46 | For Winamp/XMPlay/command line this means in the directory with the main .exe,
47 | or in a system directory, or any other directory in the PATH variable.
48 |
49 |
50 | ## Components
51 |
52 | ### test.exe/vgmstream-cli
53 | *Installation*: unzip the file and follow the above instructions for installing
54 | the other files needed.
55 |
56 | Converts playable files to wav. Typical usage would be:
57 | - `test.exe -o happy.wav happy.adx` to decode `happy.adx` to `happy.wav`.
58 |
59 | If command-line isn't your thing you can also drag and drop files to the
60 | executable to decode them as (filename).wav
61 |
62 | There are multiple options that alter how the file is converted, for example:
63 | - `test.exe -m -o file.wav file.adx`: print info but don't decode
64 | - `test.exe -i -o file.wav file.hca`: convert without looping
65 | - `test.exe -s 2 -F -o file.wav file.fsb`: play 2nd subsong + ending after 2.0 loops
66 | - `test.exe -l 3.0 -f 5.0 -d 3.0 -o file.wav file.wem`: 3 loops, 3s delay, 5s fade
67 |
68 | Available commands are printed when run with no flags. Note that you can also
69 | achieve similar results for other plugins using TXTP, described later.
70 |
71 | With files multiple subsongs you need to specify manually subsong (by design, to avoid
72 | massive data dumps since some formats have hundred of subsongs), but you could do
73 | some command line tricks:
74 | ```
75 | REM extracts from subsong 5 to 10 in file.fsb
76 | for /L %A in (5,1,10) do test.exe -s %A -o file_%A.wav file.fsb
77 | ```
78 |
79 |
80 | ### in_vgmstream
81 | *Installation*: drop the ```in_vgmstream.dll``` in your Winamp plugins directory,
82 | and follow the above instructions for installing the other files needed.
83 |
84 | Once installed supported files should be playable.
85 |
86 | ### xmp-vgmstream
87 | *Installation*: drop the ```xmp-vgmstream.dll``` in your XMPlay plugins directory,
88 | and follow the above instructions for installing the other files needed.
89 |
90 | Note that this has less features compared to in_vgmstream and has no configuration.
91 | Since XMPlay supports Winamp plugins you may also use ```in_vgmstream.dll``` instead.
92 |
93 | Because the XMPlay MP3 decoder incorrectly tries to play some vgmstream exts,
94 | you need to manually fix it by going to **options > plugins > input > vgmstream**
95 | and in the "priority filetypes" put: `ahx,asf,awc,ckd,fsb,genh,msf,p3d,rak,scd,txth,xvag`
96 |
97 | ### foo_input_vgmstream
98 | *Installation*: every file should be installed automatically by the `.fb2k-component`
99 | bundle.
100 |
101 | A known quirk is that when loop options or tags change, playlist won't refresh
102 | automatically. You need to manually refresh it by selecting songs and doing
103 | **shift + right click > Tagging > Reload info from file(s)**.
104 |
105 | ### Audacious plugin
106 | *Installation*: needs to be manually built. Instructions can be found in the BUILD
107 | document in vgmstream's source code.
108 |
109 | ### vgmstream123
110 | *Installation*: needs to be manually built. Instructions can be found in the BUILD
111 | document in vgmstream's source code.
112 |
113 | Usage: `vgmstream123 [options] INFILE ...`
114 |
115 | The program is meant to be a simple stand-alone player, supporting playback
116 | of vgmstream files through libao. Files compressed with gzip/bzip2/xz also
117 | work, as identified by a .gz/.bz2/.xz extension. The file will be decompressed
118 | to a temp dir using the respective utility program (which must be installed
119 | and accessible) and then loaded.
120 |
121 | It also supports playlists, and will recognize a special extended-M3U tag
122 | specific to vgmstream of the following form:
123 | ```
124 | #EXT-X-VGMSTREAM:LOOPCOUNT=2,FADETIME=10.0,FADEDELAY=0.0,STREAMINDEX=0
125 | ```
126 | (Any subset of these four parameters may appear in the line, in any order)
127 |
128 | When this "magic comment" appears in the playlist before a vgmstream-compatible
129 | file, the given parameters will be applied to the playback of said file. This makes
130 | it feasible to play vgmstream files directly instead of needing to make "arranged"
131 | WAV/MP3 conversions ahead of time.
132 |
133 | The tag syntax follows the conventions established in Apple's HTTP Live Streaming
134 | standard, whose docs discuss extending M3U with arbitrary tags.
135 |
136 |
137 | ## Special cases
138 | vgmstream aims to support most audio formats as-is, but some files require extra
139 | handling.
140 |
141 | ### Renamed files
142 | A few extensions that vgmstream supports clash with common ones. Since players
143 | like foobar or Winamp don't react well to that, they may be renamed to make
144 | them playable through vgmstream.
145 | - .aac to .laac (tri-Ace games)
146 | - .ac3 to .lac3 (standard AC3)
147 | - .aif to .laif or .aiffl or .aifcl (standard Mac AIF, Asobo AIF, Ogg)
148 | - .aiff/aifc to .aiffl/aifcl (standard Mac AIF)
149 | - .asf to .lasf (EA games, Argonaut ASF)
150 | - .bin to .lbin (various)
151 | - .flac to .lflac (standard FLAC)
152 | - .mp2 to .lmp2 (standard MP2)
153 | - .mp3 to .lmp3 (standard MP3)
154 | - .mp4 to .lmp4 (standard M4A)
155 | - .mpc to .lmpc (standard MPC)
156 | - .ogg to .logg (standard OGG)
157 | - .opus to .lopus (standard OPUS or Switch OPUS)
158 | - .stm to .lstm (Rockstar STM)
159 | - .wav to .lwav (standard WAV)
160 | - .wma to .lwma (standard WMA)
161 | - .(any) to .vgmstream (FFmpeg formats or TXTH)
162 |
163 | Command line tools don't have this restriction and will accept the original
164 | filename.
165 |
166 | The main advantage to rename them is that vgmstream may use the file's
167 | internal loop info, or apply subtle fixes, but is also limited in some ways
168 | (like standard/player's tagging). .vgmstream is a catch-all extension that
169 | may work as a last resort to make a file playable.
170 |
171 | Some plugins have options that allow any extension (common or unknown) to be
172 | played, making renaming is unnecessary (may need to adjust plugin priority in
173 | player's options).
174 |
175 | Also be aware that some plugins can tell the player they handle some extension,
176 | then not actually play it. This makes the file unplayable as vgmstream doesn't
177 | even get the chance to parse that file, so you may need to disable the offending
178 | plugin or rename the file (for example this may happen with .asf and foobar).
179 |
180 | When extracting from a bigfile, sometimes internal files don't have an actual
181 | name+extension. Those should be renamed to its proper/common extension, as the
182 | extractor program may guess wrong (like .wav instead of .at3 or .wem). If
183 | there is no known extension, usually the header id string may be used instead.
184 |
185 | Note that vgmstream also accepts certain extension-less files too.
186 |
187 | ### Demuxed videos
188 | vgmstream also supports audio from videos, but usually must be demuxed (extracted
189 | without modification) first, since vgmstream doesn't attempt to support them.
190 |
191 | The easiest way to do this is using VGMToolBox's "Video Demultiplexer" option
192 | for common game video formats (.bik, .vp6, .pss, .pam, .pmf, .usm, .xmv, etc).
193 |
194 | For standard videos formats (.avi, .mp4, .webm, .m2v, .ogv, etc) not supported
195 | by VGMToolBox FFmpeg binary may work:
196 | - `ffmpeg.exe -i (input file) -vn -acodec copy (output file)`
197 | Output extension may need to be adjusted to some appropriate audio file depending
198 | on the audio codec used. ffprobe.exe can list this codec, though the correct audio
199 | extension depends on the video itself (like .avi to .wav/mp2/mp3 or .ogv to .ogg).
200 |
201 | Some games use custom video formats, demuxer scripts in .bms format may be found
202 | on the internet.
203 |
204 | ### Companion files
205 | Some formats have companion files with external looping info, and should be
206 | left together.
207 | - .mus (playlist for .acm)
208 | - .pos (loop info for .wav, and sometimes .ogg)
209 | - .ogg.sli or .sli (loop info for .ogg)
210 | - .ogg.sfl (loop info for .ogg)
211 | - .vgmstream.pos (loop info for FFmpeg formats)
212 | - also possible for certain extensions like .lflac.pos
213 |
214 | Similarly some formats split header and/or data in separate files (.sgh+sgd,
215 | .wav.str+.wav, (file)_L.dsp+(file)_R.dsp, etc). vgmstream will also detect
216 | and use those as needed and must be together, even if only one of the two
217 | will be used to play.
218 |
219 | .pos is a small file with 32 bit little endian values: loop start sample
220 | and loop end sample. For FFmpeg formats (.vgmstream.pos) it may optionally
221 | have total samples after those.
222 |
223 | ### Decryption keys
224 | Certain formats have encrypted data, and need a key to decrypt. vgmstream
225 | will try to find the correct key from a list, but it can be provided by
226 | a companion file:
227 | - .adx: .adxkey (keystring, 8 byte keycode, or derived 6 byte start/mult/add key)
228 | - .ahx: .ahxkey (derived 6 byte start/mult/add key)
229 | - .hca: .hcakey (8 byte decryption key, a 64-bit number)
230 | - May be followed by 2 byte AWB scramble key for newer HCA
231 | - .fsb: .fsbkey (decryption key, in hex)
232 | - .bnsf: .bnsfkey (decryption key, a string up to 24 chars)
233 |
234 | The key file can be ".(ext)key" (for the whole folder), or "(name).(ext)key"
235 | (for a single file). The format is made up to suit vgmstream.
236 |
237 | ### Artificial files
238 | In some cases a file only has raw data, while important header info (codec type,
239 | sample rate, channels, etc) is stored in the .exe or other hard to locate places.
240 |
241 | Those can be played using an artificial header with info vgmstream needs.
242 |
243 | **GENH**: a byte header placed right before the original data, modyfing it.
244 | The resulting file must be (name).genh. Contains static header data.
245 | Programs like VGMToolbox can help to create GENH.
246 |
247 | **TXTH**: a text header placed in an external file. The TXTH must be named
248 | `.txth` or `.(ext).txth` (for the whole folder), or `(name.ext).txth` (for a
249 | single file). Contains dynamic text commands to read data from the original
250 | file, or static values.
251 |
252 | *TXTH* is recomended over *GENH* as it's far easier to create and has many
253 | more functions.
254 |
255 |
256 | For files that already play, sometimes they are used by the game in various
257 | complex and non-standard ways, like playing multiple small songs as a single
258 | one, or using some channels as a section of the song. For those cases we
259 | can use create a *TXTP* file.
260 |
261 | **TXTP**: a text player configurator named `(name).txtp`. Text inside can
262 | contain a list of filenames to play as one (ex. `intro.vag(line)loop.vag`),
263 | list of separate channel files to join as a single multichannel file,
264 | subsong index (ex. `bgm.sxd#10`), per-file configurations like number of
265 | loops, remove unneeded channels, and many other features.
266 |
267 | Creation of those files is meant for advanced users, docs can be found in
268 | vgmstream source.
269 |
270 |
271 | ### Plugin conflicts
272 | Since vgmstream supports a huge amount of formats it's possibly that some of
273 | them are also supported in other plugins, and this sometimes causes conflicts.
274 | If a file that should isn't playing or looping, first make sure vgmstream is
275 | really opening it (should show "VGMSTREAM" somewhere in the file info), and
276 | try to remove a few other plugins.
277 |
278 | foobar's FFmpeg plugin and foo_adpcm are known to cause issues, but in
279 | recent versions (1.4.x) you can configure plugin priority.
280 |
281 | In Audacious, vgmstream is set with slightly higher priority than FFmpeg,
282 | since it steals many formats that you normally want to loop (like .adx).
283 | However other plugins may set themselves higher, stealing formats instead.
284 | If current Audacious version doesn't let to change plugin priority you may
285 | need to disable some plugins (requires restart) or set priority on compile
286 | time. Particularly, mpg123 plugin may steal formats that aren't even MP3,
287 | making impossible for vgmstream to play it properly.
288 |
289 |
290 | ### Channel issues
291 | Some games layer a huge number of channels, that are disabled or downmixed
292 | during gameplay. The player may be unable to play those files (for example
293 | foobar can only play up to 8 channels, and Winamp depends on your sound
294 | card). For those files you can set the "downmix" option in vgmstream, that
295 | can reduce the number of channels to a playable amount. Note that this type
296 | of downmixing is very generic, not meant to be used when converting to other
297 | formats.
298 |
299 | You can also choose which channels to play using *TXTP*. For example, create
300 | a file named `song.adx#C1,2.txtp` to play only channels 1 and 2 from `song.adx`.
301 |
302 | ## Tagging
303 | Some of vgmstream's plugins support simple read-only tagging via external files.
304 |
305 | Tags are loaded from a text/M3U-like file named *!tags.m3u* in the song folder.
306 | You don't have to load your songs with that M3U though (but you can, for pre-made
307 | ordering), the file itself just 'looks' like an M3U.
308 |
309 | Format is:
310 | ```
311 | # ignored comment
312 | # $GLOBAL_COMMAND (extra features)
313 | # @GLOBAL_TAG text (applies all following tracks)
314 |
315 | # %LOCAL_TAG text (applies to next track only)
316 | filename1
317 | # %LOCAL_TAG text (applies to next track only)
318 | filename2
319 | ```
320 | Accepted tags depend on the player (foobar: any; winamp: see ATF config),
321 | typically *ALBUM/ARTIST/TITLE/DISC/TRACK/COMPOSER/etc*, lower or uppercase,
322 | separated by one or multiple spaces. Repeated tags overwrite previous
323 | (ex.- may define *@COMPOSER* for multiple tracks). It only reads up to current
324 | *filename* though, so any *@TAG* below would be ignored.
325 |
326 | Playlist formatting should follow player's config. ASCII or UTF-8 tags work.
327 |
328 | *GLOBAL_COMMAND*s currently can be:
329 | - *AUTOTRACK*: sets *%TRACK* tag automatically (1..N as files are encountered
330 | in the tag file).
331 | - *AUTOALBUM*: sets *%ALBUM* tag automatically using the containing dir as album.
332 |
333 | Some players like foobar accept tags with spaces. To use them surround the tag
334 | with both characters.
335 | ```
336 | # @GLOBAL TAG WITH SPACES@ text
337 | # ...
338 | # %LOCAL TAG WITH SPACES% text
339 | filename1
340 | ```
341 | As a side effect if text has @/% inside you also need them: `# @ALBUMARTIST@ Tom-H@ck`
342 |
343 | Note that since you can use global tags don't need to put all files inside.
344 | This would be a perfectly valid *!tags.m3u*:
345 | ```
346 | # @ALBUM Game
347 | # @ARTIST Various Artists
348 | ```
349 |
350 | foobar2000/Winamp can apply the following replaygain tags (if ReplayGain is
351 | enabled in preferences):
352 | ```
353 | # %replaygain_track_gain N.NN dB
354 | # %replaygain_track_peak N.NNN
355 | # @replaygain_album_gain N.NN dB
356 | # @replaygain_album_peak N.NNN
357 | ```
358 |
359 | If your player isn't picking tags make sure vgmstream is detecting the song
360 | (as other plugins can steal its extensions, see above), .m3u is properly
361 | named and that filenames inside match the song filename. For Winamp you need
362 | to make sure *options > titles > advanced title formatting* checkbox is set and
363 | the format defined. For foobar2000 don't forget you need to force refresh when
364 | tags change (for reasons outside vgmstream's control):
365 | **select songs > shift + right click > Tagging > Reload info from file(s)**.
366 |
367 | Currently there is no tool to aid in the creation of there m3u, but you can create
368 | a base m3u and edit as a text file.
369 |
370 | If you are not satisfied with vgmstream's tagging format, foobar2000 has other
371 | plugins (with write support) that may be of use:
372 | - m-TAGS: http://www.m-tags.org/
373 | - foo_external_tags: https://foobar.hyv.fi/?view=foo_external_tags
374 |
375 | ## Virtual TXTP files
376 | Some of vgmstream's plugins allow you to use virtual .txtp files, that combined
377 | with playlists let you make quick song configs.
378 |
379 | Normally you can create a physical .txtp file that points to another file with
380 | config, and .txtp have a "mini-txtp" mode that configures files with only the
381 | filename.
382 |
383 | Instead of manually creating .txtp files you can put non-existing virtual .txtp
384 | in a `.m3u` playlist:
385 | ```
386 | # playlist that opens subsongs directly without having to create .txtp
387 | # notice the full filename, then #(config), then ".txtp" (spaces are optional)
388 | bank_bgm_full.nub #s1 .txtp
389 | bank_bgm_full.nub #s10 .txtp
390 | ```
391 |
392 | Combine with tagging (see above) for extra fun OST-like config.
393 | ```
394 | # @ALBUM GOD HAND
395 |
396 | # play 1 loop, delay and do a longer fade
397 | # %TITLE Too Hot !!
398 | circus_a_mix_ver2.adx #l 1.0 #d 5.0 #f 15.0 .txtp
399 |
400 | # play 1 loop instead of the default 2 then fade with the song's internal fading
401 | # %TITLE Yet... Oh see mind
402 | boss2_3ningumi_ver6.adx #l 1.0 #F .txtp
403 |
404 | ...
405 | ```
406 |
407 | You can also use it in CLI for quick access to some txtp-exclusive functions:
408 | ```
409 | # force change sample rate to 22050
410 | test.exe btl_koopa1_44k_lp.brstm #h22050.txtp -o btl_koopa1_44k_lp.wav
411 | ```
412 |
413 |
414 | ## Supported codec types
415 | Quick list of codecs vgmstream supports, including many obscure ones that
416 | are used in few games.
417 |
418 | - PCM 16-bit
419 | - PCM 8-bit (signed/unsigned)
420 | - PCM 4-bit (signed/unsigned)
421 | - PCM 32-bit float
422 | - u-Law/a-LAW
423 | - CRI ADX (standard, fixed, exponential, encrypted)
424 | - Nintendo DSP ADPCM a.k.a GC ADPCM
425 | - Nintendo DTK ADPCM
426 | - Nintendo AFC ADPCM
427 | - ITU-T G.721
428 | - CD-ROM XA ADPCM
429 | - Sony PSX ADPCM a.k.a VAG (standard, badflags, configurable, Pivotal)
430 | - Sony HEVAG
431 | - Electronic Arts EA-XA (stereo, mono, Maxis)
432 | - Electronic Arts EA-XAS (v0, v1)
433 | - DVI/IMA ADPCM (stereo/mono + high/low nibble, 3DS, Omikron, SNDS, etc)
434 | - Microsoft MS IMA ADPCM (standard, Xbox, NDS, Radical, Wwise, FSB, WV6, etc)
435 | - Microsoft MS ADPCM (standard, Cricket Audio)
436 | - Westwood VBR ADPCM
437 | - Yamaha ADPCM (AICA, Aska)
438 | - Procyon Studio ADPCM
439 | - Level-5 0x555 ADPCM
440 | - lsf ADPCM
441 | - Konami MTAF ADPCM
442 | - Konami MTA2 ADPCM
443 | - Paradigm MC3 ADPCM
444 | - FMOD FADPCM 4-bit ADPCM
445 | - Konami XMD 4-bit ADPCM
446 | - Platinum 4-bit ADPCM
447 | - Argonaut ASF 4-bit ADPCM
448 | - Ocean DSA 4-bit ADPCM
449 | - Circus XPCM ADPCM
450 | - OKI 4-bit ADPCM (16-bit output, 4-shift, PC-FX)
451 | - Ubisoft 4/6-bit ADPCM
452 | - Tiger Game.com ADPCM
453 | - SDX2 2:1 Squareroot-Delta-Exact compression DPCM
454 | - CBD2 2:1 Cuberoot-Delta-Exact compression DPCM
455 | - Activision EXAKT SASSC DPCM
456 | - Xilam DERF DPCM
457 | - InterPlay ACM
458 | - VisualArt's NWA
459 | - Electronic Arts MicroTalk a.k.a. UTK or UMT
460 | - Relic Codec
461 | - CRI HCA
462 | - Xiph Vorbis (Ogg, FSB5, Wwise, OGL, Silicon Knights)
463 | - MPEG MP1/2/3 (standard, AHX, XVAG, FSB, AWC, P3D, etc)
464 | - ITU-T G.722.1 annex C (Polycom Siren 14)
465 | - ITU-T G.719 annex B (Polycom Siren 22)
466 | - Electronic Arts EALayer3
467 | - Electronic Arts EA-XMA
468 | - Sony ATRAC3, ATRAC3plus
469 | - Sony ATRAC9
470 | - Microsoft XMA1/2
471 | - Microsoft WMA v1, WMA v2, WMAPro
472 | - AAC
473 | - Bink
474 | - AC3/SPDIF
475 | - Xiph Opus (Ogg, Switch, EA, UE4, Exient)
476 | - Xiph CELT (FSB)
477 | - Musepack
478 | - FLAC
479 | - Others
480 |
481 | Note that vgmstream doesn't (can't) reproduce in-game music 1:1, as internal
482 | resampling, filters, volume, etc, are not replicated. Some codecs are not
483 | fully accurate compared to the games due to minor bugs, but in most cases
484 | it isn't audible.
485 |
486 |
487 | ## Supported file types
488 | As manakoAT likes to say, the extension doesn't really mean anything, but it's
489 | the most obvious way to identify files.
490 |
491 | This list is not complete and many other files are supported.
492 |
493 | - PS2/PSX ADPCM:
494 | - .ads/.ss2
495 | - .ass
496 | - .ast
497 | - .bg00
498 | - .bmdx
499 | - .ccc
500 | - .cnk
501 | - .dxh
502 | - .enth
503 | - .fag
504 | - .filp
505 | - .gcm
506 | - .gms
507 | - .hgc1
508 | - .ikm
509 | - .ild
510 | - .ivb
511 | - .joe
512 | - .kces
513 | - .khv
514 | - .leg
515 | - .mcg
516 | - .mib, .mi4 (w/ or w/o .mih)
517 | - .mic
518 | - .mihb (merged mih+mib)
519 | - .msa
520 | - .msvp
521 | - .musc
522 | - .npsf
523 | - .pnb
524 | - .psh
525 | - .rkv
526 | - .rnd
527 | - .rstm
528 | - .rws
529 | - .rxw
530 | - .snd
531 | - .sfs
532 | - .sl3
533 | - .smpl (w/ bad flags)
534 | - .ster
535 | - .str+.sth
536 | - .str (MGAV blocked)
537 | - .sts
538 | - .svag
539 | - .svs
540 | - .tec (w/ bad flags)
541 | - .tk5 (w/ bad flags)
542 | - .vas
543 | - .vag
544 | - .vgs (w/ bad flags)
545 | - .vig
546 | - .vpk
547 | - .vs
548 | - .vsf
549 | - .wp2
550 | - .xa2
551 | - .xa30
552 | - .xwb+xwh
553 | - GC/Wii/3DS DSP ADPCM:
554 | - .aaap
555 | - .agsc
556 | - .asr
557 | - .bns
558 | - .bo2
559 | - .capdsp
560 | - .cfn
561 | - .ddsp
562 | - .dsp
563 | - standard, optional dual file stereo
564 | - RS03
565 | - Cstr
566 | - _lr.dsp
567 | - MPDS
568 | - .gca
569 | - .gcm
570 | - .gsp+.gsp
571 | - .hps
572 | - .idsp
573 | - .ish+.isd
574 | - .lps
575 | - .mca
576 | - .mpdsp
577 | - .mss
578 | - .mus (not quite right)
579 | - .ndp
580 | - .pdt
581 | - .sdt
582 | - .smp
583 | - .sns
584 | - .spt+.spd
585 | - .ssm
586 | - .stm/.dsp
587 | - .str
588 | - .str+.sth
589 | - .sts
590 | - .swd
591 | - .thp, .dsp
592 | - .tydsp
593 | - .vjdsp
594 | - .waa, .wac, .wad, .wam
595 | - .was
596 | - .wsd
597 | - .wsi
598 | - .ydsp
599 | - .ymf
600 | - .zwdsp
601 | - PCM:
602 | - .aiff (8 bit, 16 bit)
603 | - .asd (16 bit)
604 | - .baka (16 bit)
605 | - .bh2pcm (16 bit)
606 | - .dmsg (16 bit)
607 | - .gcsw (16 bit)
608 | - .gcw (16 bit)
609 | - .his (8 bit)
610 | - .int (16 bit)
611 | - .pcm (8 bit, 16 bit)
612 | - .kraw (16 bit)
613 | - .raw (16 bit)
614 | - .rwx (16 bit)
615 | - .sap (16 bit)
616 | - .snd (16 bit)
617 | - .sps (16 bit)
618 | - .str (16 bit)
619 | - .xss (16 bit)
620 | - .voi (16 bit)
621 | - .wb (16 bit)
622 | - .zsd (8 bit)
623 | - Xbox IMA ADPCM:
624 | - .matx
625 | - .wavm
626 | - .wvs
627 | - .xmu
628 | - .xvas
629 | - .xwav
630 | - Yamaha AICA ADPCM:
631 | - .adpcm
632 | - .dcs+.dcsw
633 | - .str
634 | - .spsd
635 | - IMA ADPCM:
636 | - .bar (IMA ADPCM)
637 | - .pcm/dvi (DVI IMA ADPCM)
638 | - .hwas (IMA ADPCM)
639 | - .dvi/idvi (DVI IMA ADPCM)
640 | - .ivaud (IMA ADPCM)
641 | - .myspd (IMA ADPCM)
642 | - .strm (IMA ADPCM)
643 | - multi:
644 | - .aifc (SDX2 DPCM, DVI IMA ADPCM)
645 | - .asf/as4 (8/16 bit PCM, DVI IMA ADPCM)
646 | - .ast (GC AFC ADPCM, 16 bit PCM)
647 | - .aud (IMA ADPCM, WS DPCM)
648 | - .aus (PSX ADPCM, Xbox IMA ADPCM)
649 | - .brstm (GC DSP ADPCM, 8/16 bit PCM)
650 | - .emff (PSX APDCM, GC DSP ADPCM)
651 | - .fsb/wii (PSX ADPCM, GC DSP ADPCM, Xbox IMA ADPCM, MPEG audio, FSB Vorbis, MS XMA)
652 | - .msf (PCM, PSX ADPCM, ATRAC3, MP3)
653 | - .musx (PSX ADPCM, Xbox IMA ADPCM, DAT4 IMA ADPCM)
654 | - .nwa (16 bit PCM, NWA DPCM)
655 | - .p3d (Radical ADPCM, Radical MP3, XMA2)
656 | - .psw (PSX ADPCM, GC DSP ADPCM)
657 | - .rwar, .rwav (GC DSP ADPCM, 8/16 bit PCM)
658 | - .rws (PSX ADPCM, XBOX IMA ADPCM, GC DSP ADPCM, 16 bit PCM)
659 | - .rwsd (GC DSP ADPCM, 8/16 bit PCM)
660 | - .rsd (PSX ADPCM, 16 bit PCM, GC DSP ADPCM, Xbox IMA ADPCM, Radical ADPCM)
661 | - .rrds (NDS IMA ADPCM)
662 | - .sad (GC DSP ADPCM, NDS IMA ADPCM, Procyon Studios NDS ADPCM)
663 | - .sgd/sgb+sgh/sgx (PSX ADPCM, ATRAC3plus, AC3)
664 | - .seg (Xbox IMA ADPCM, PS2 ADPCM)
665 | - .sng/asf/str/eam/aud (8/16 bit PCM, EA-XA ADPCM, PSX ADPCM, GC DSP ADPCM, XBOX IMA ADPCM, MPEG audio, EALayer3)
666 | - .strm (NDS IMA ADPCM, 8/16 bit PCM)
667 | - .sb0..7 (Ubi IMA ADPCM, GC DSP ADPCM, PSX ADPCM, Xbox IMA ADPCM, ATRAC3)
668 | - .swav (NDS IMA ADPCM, 8/16 bit PCM)
669 | - .xwb (PCM, Xbox IMA ADPCM, MS ADPCM, XMA, XWMA, ATRAC3)
670 | - .xwb+xwh (PCM, PSX ADPCM, ATRAC3)
671 | - .wav/lwav (unsigned 8 bit PCM, 16 bit PCM, GC DSP ADPCM, MS IMA ADPCM, XBOX IMA ADPCM)
672 | - .wem [lwav/logg/xma] (PCM, Wwise Vorbis, Wwise IMA ADPCM, XMA, XWMA, GC DSP ADPCM, Wwise Opus)
673 | - etc:
674 | - .2dx9 (MS ADPCM)
675 | - .aax (CRI ADX ADPCM)
676 | - .acm (InterPlay ACM)
677 | - .adp (GC DTK ADPCM)
678 | - .adx (CRI ADX ADPCM)
679 | - .afc (GC AFC ADPCM)
680 | - .ahx (MPEG-2 Layer II)
681 | - .aix (CRI ADX ADPCM)
682 | - .at3 (Sony ATRAC3 / ATRAC3plus)
683 | - .aud (Silicon Knights Vorbis)
684 | - .baf (PSX configurable ADPCM)
685 | - .bgw (PSX configurable ADPCM)
686 | - .bnsf (G.722.1)
687 | - .caf (Apple IMA4 ADPCM, others)
688 | - .dec/de2 (MS ADPCM)
689 | - .hca (CRI High Compression Audio)
690 | - .pcm/kcey (DVI IMA ADPCM)
691 | - .lsf (LSF ADPCM)
692 | - .mc3 (Paradigm MC3 ADPCM)
693 | - .mp4/lmp4 (AAC)
694 | - .msf (PCM, PSX ADPCM, ATRAC3, MP3)
695 | - .mtaf (Konami ADPCM)
696 | - .mta2 (Konami XAS-like ADPCM)
697 | - .mwv (Level-5 0x555 ADPCM)
698 | - .ogg/logg (Ogg Vorbis)
699 | - .ogl (Shin'en Vorbis)
700 | - .rsf (CCITT G.721 ADPCM)
701 | - .sab (Worms 4 soundpacks)
702 | - .s14/sss (G.722.1)
703 | - .sc (Activision EXAKT SASSC DPCM)
704 | - .scd (MS ADPCM, MPEG Audio, 16 bit PCM)
705 | - .sd9 (MS ADPCM)
706 | - .smp (MS ADPCM)
707 | - .spw (PSX configurable ADPCM)
708 | - .stm/lstm [amts/ps2stm/stma] (16 bit PCM, DVI IMA ADPCM, GC DSP ADPCM)
709 | - .str (SDX2 DPCM)
710 | - .stx (GC AFC ADPCM)
711 | - .ulw (u-Law PCM)
712 | - .um3 (Ogg Vorbis)
713 | - .xa (CD-ROM XA audio)
714 | - .xma (MS XMA/XMA2)
715 | - .sb0/sb1/sb2/sb3/sb4/sb5/sb6/sb7 (many)
716 | - .sm0/sm1/sm2/sm3/sm4/sm5/sm6/sm7 (many)
717 | - .bao/pk (many)
718 | - artificial/generic headers:
719 | - .genh (lots)
720 | - .txth (lots)
721 | - loop assists:
722 | - .mus (playlist for .acm)
723 | - .pos (loop info for .wav: 32 bit LE loop start sample + loop end sample)
724 | - .sli (loop info for .ogg)
725 | - .sfl (loop info for .ogg)
726 | - .vgmstream + .vgmstream.pos (FFmpeg formats + loop assist)
727 | - other:
728 | - .adxkey (decryption key for .adx)
729 | - .ahxkey (decryption key for .ahx)
730 | - .hcakey (decryption key for .hca)
731 | - .fsbkey (decryption key for .fsb)
732 | - .bnsfkey (decryption key for .bnsf)
733 | - .txtp (per song segment/layer handler and player configurator)
734 |
735 | Enjoy! *hcs*
736 |
--------------------------------------------------------------------------------
/tools/vgmstream/avcodec-vgmstream-58.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AioiLight/PrincessTool/d7578b9e809158804596b10a8407d09b460d7425/tools/vgmstream/avcodec-vgmstream-58.dll
--------------------------------------------------------------------------------
/tools/vgmstream/avformat-vgmstream-58.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AioiLight/PrincessTool/d7578b9e809158804596b10a8407d09b460d7425/tools/vgmstream/avformat-vgmstream-58.dll
--------------------------------------------------------------------------------
/tools/vgmstream/avutil-vgmstream-56.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AioiLight/PrincessTool/d7578b9e809158804596b10a8407d09b460d7425/tools/vgmstream/avutil-vgmstream-56.dll
--------------------------------------------------------------------------------
/tools/vgmstream/in_vgmstream.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AioiLight/PrincessTool/d7578b9e809158804596b10a8407d09b460d7425/tools/vgmstream/in_vgmstream.dll
--------------------------------------------------------------------------------
/tools/vgmstream/libatrac9.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AioiLight/PrincessTool/d7578b9e809158804596b10a8407d09b460d7425/tools/vgmstream/libatrac9.dll
--------------------------------------------------------------------------------
/tools/vgmstream/libcelt-0061.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AioiLight/PrincessTool/d7578b9e809158804596b10a8407d09b460d7425/tools/vgmstream/libcelt-0061.dll
--------------------------------------------------------------------------------
/tools/vgmstream/libcelt-0110.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AioiLight/PrincessTool/d7578b9e809158804596b10a8407d09b460d7425/tools/vgmstream/libcelt-0110.dll
--------------------------------------------------------------------------------
/tools/vgmstream/libg719_decode.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AioiLight/PrincessTool/d7578b9e809158804596b10a8407d09b460d7425/tools/vgmstream/libg719_decode.dll
--------------------------------------------------------------------------------
/tools/vgmstream/libmpg123-0.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AioiLight/PrincessTool/d7578b9e809158804596b10a8407d09b460d7425/tools/vgmstream/libmpg123-0.dll
--------------------------------------------------------------------------------
/tools/vgmstream/libvorbis.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AioiLight/PrincessTool/d7578b9e809158804596b10a8407d09b460d7425/tools/vgmstream/libvorbis.dll
--------------------------------------------------------------------------------
/tools/vgmstream/swresample-vgmstream-3.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AioiLight/PrincessTool/d7578b9e809158804596b10a8407d09b460d7425/tools/vgmstream/swresample-vgmstream-3.dll
--------------------------------------------------------------------------------
/tools/vgmstream/test.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AioiLight/PrincessTool/d7578b9e809158804596b10a8407d09b460d7425/tools/vgmstream/test.exe
--------------------------------------------------------------------------------
/tools/vgmstream/xmp-vgmstream.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AioiLight/PrincessTool/d7578b9e809158804596b10a8407d09b460d7425/tools/vgmstream/xmp-vgmstream.dll
--------------------------------------------------------------------------------