Current News
Archived News
Search News
Discussion Forum


Old Forum
Install Programs More Downloads...
Troubleshooting
Source Code
Format Specs.
Misc. Information
Non-SF Stuff
Links




CommitLineData
b31da37a 1Attribute VB_Name = "MpqStuff"\r
2Option Explicit\r
3\r
4Type SHELLEXECUTEINFO\r
5 cbSize As Long\r
6 fMask As Long\r
7 hWnd As Long\r
8 lpVerb As String\r
9 lpFile As String\r
10 lpParameters As String\r
11 lpDirectory As String\r
12 nShow As Long\r
13 hInstApp As Long\r
14 \r
15 ' Optional members\r
16 lpIDList As Long\r
17 lpClass As String\r
18 hkeyClass As Long\r
19 dwHotKey As Long\r
20 hIcon As Long\r
21 hProcess As Long\r
22End Type\r
23\r
24Public Declare Function ShellExecute Lib _\r
25 "Shell32.dll" Alias "ShellExecuteA" _\r
26 (ByVal hWnd As Long, _\r
27 ByVal lpOperation As String, _\r
28 ByVal lpFile As String, _\r
29 ByVal lpParameters As String, _\r
30 ByVal lpDirectory As String, _\r
31 ByVal nShowCmd As Long) As Long\r
32Public Declare Function ShellExecuteEx Lib _\r
33 "Shell32.dll" Alias "ShellExecuteExA" _\r
34 (sei As SHELLEXECUTEINFO) As Long\r
35Public Declare Sub SHChangeNotify Lib _\r
36 "Shell32.dll" (ByVal wEventId As Long, _\r
37 ByVal uFlags As Integer, _\r
38 ByVal dwItem1 As Any, _\r
39 ByVal dwItem2 As Any)\r
40Public Declare Function SendMessageA Lib _\r
41 "User32.dll" _\r
42 (ByVal hWnd As Long, _\r
43 ByVal Msg As Long, _\r
44 ByVal Wp As Long, _\r
45 Lp As Any) As Long\r
46Declare Function GetLongPathName Lib "Kernel32" Alias "GetLongPathNameA" (ByVal lpszShortPath As String, ByVal lpszLongPath As String, ByVal cchBuffer As Long) As Long\r
47Private Declare Sub CopyMemory Lib "Kernel32.dll" _\r
48 Alias "RtlMoveMemory" ( _\r
49 ByRef Destination As Any, _\r
50 ByRef Source As Any, _\r
51 ByVal Length As Long)\r
52\r
53Public CD As OPENFILENAME, PathInput As BROWSEINFO\r
54Public GlobalFileList() As String, FileList() As String, CX As Single, CY As Single, NewFile As Boolean, LocaleID As Long, ListFile As String, AddFolderName As String, ExtractPathNum As Long, CopyPathNum As Long, GlobalEncrypt As Boolean, DefaultCompress As Long, DefaultCompressID As Long, DefaultCompressLevel As Long, DefaultMaxFiles As Long, DefaultBlockSize As Long\r
55Public Const AppKey As String = "HKEY_CURRENT_USER\Software\ShadowFlare\WinMPQ\", SharedAppKey As String = "HKEY_LOCAL_MACHINE\Software\ShadowFlare\WinMPQ\"\r
56Public Const MPQ_ERROR_INIT_FAILED As Long = &H85000001 'Unspecified error\r
57Public Const MPQ_ERROR_NO_STAREDIT As Long = &H85000002 'Can't find StarEdit.exe\r
58Public Const MPQ_ERROR_BAD_STAREDIT As Long = &H85000003 'Bad version of StarEdit.exe. Need SC/BW 1.07\r
59Public Const MPQ_ERROR_STAREDIT_RUNNING As Long = &H85000004 'StarEdit.exe is running. Must be closed\r
60Public Const SHCNE_ASSOCCHANGED As Long = &H8000000\r
61Public Const SHCNF_IDLIST As Long = &H0\r
62Public Const WM_SETREDRAW As Long = &HB\r
63Public Const WM_PAINT As Long = &HF\r
64Const gintMAX_SIZE% = 255\r
65Public Const SEE_MASK_CLASSNAME As Long = &H1\r
98c42f1b 66\r
b31da37a 67Sub GetCompressFlags(File As String, ByRef cType As Integer, ByRef dwFlags As Long)\r
68Dim bNum As Long, fExt As String\r
69dwFlags = MAFA_REPLACE_EXISTING\r
70If GlobalEncrypt Then dwFlags = dwFlags Or MAFA_ENCRYPT\r
71For bNum = 1 To Len(File)\r
72 If InStr(bNum, File, ".") > 0 Then\r
73 bNum = InStr(bNum, File, ".")\r
74 Else\r
75 Exit For\r
76 End If\r
77Next bNum\r
78If bNum > 1 Then\r
79 fExt = Mid(File, bNum - 1)\r
80Else\r
81 fExt = File\r
82End If\r
83If LCase(fExt) = ".bik" Then\r
84 cType = CInt(GetReg(AppKey + "Compression\.bik", "-2"))\r
85 dwFlags = dwFlags And (-1& Xor MAFA_ENCRYPT)\r
86ElseIf LCase(fExt) = ".smk" Then\r
87 cType = CInt(GetReg(AppKey + "Compression\.smk", "-2"))\r
88 dwFlags = dwFlags And (-1& Xor MAFA_ENCRYPT)\r
89ElseIf LCase(fExt) = ".mp3" Then\r
90 cType = CInt(GetReg(AppKey + "Compression\.mp3", "-2"))\r
91 dwFlags = dwFlags And (-1& Xor MAFA_ENCRYPT)\r
92ElseIf LCase(fExt) = ".mpq" Then\r
93 cType = CInt(GetReg(AppKey + "Compression\.mpq", "-2"))\r
94 dwFlags = dwFlags And (-1& Xor MAFA_ENCRYPT)\r
95ElseIf LCase(fExt) = ".scm" Then\r
96 cType = CInt(GetReg(AppKey + "Compression\.scm", "-2"))\r
97 dwFlags = dwFlags And (-1& Xor MAFA_ENCRYPT)\r
98ElseIf LCase(fExt) = ".scx" Then\r
99 cType = CInt(GetReg(AppKey + "Compression\.scx", "-2"))\r
100 dwFlags = dwFlags And (-1& Xor MAFA_ENCRYPT)\r
101ElseIf LCase(fExt) = ".w3m" Then\r
102 cType = CInt(GetReg(AppKey + "Compression\.w3m", "-2"))\r
103 dwFlags = dwFlags And (-1& Xor MAFA_ENCRYPT)\r
104ElseIf LCase(fExt) = ".w3x" Then\r
105 cType = CInt(GetReg(AppKey + "Compression\.w3x", "-2"))\r
106 dwFlags = dwFlags And (-1& Xor MAFA_ENCRYPT)\r
107ElseIf LCase(fExt) = ".wav" Then\r
108 cType = CInt(GetReg(AppKey + "Compression\.wav", "0"))\r
109Else\r
110 cType = CInt(GetReg(AppKey + "Compression\" + fExt, CStr(DefaultCompressID)))\r
111End If\r
112End Sub\r
113\r
114Function mOpenMpq(FileName As String) As Long\r
115Dim hMPQ As Long\r
116mOpenMpq = 0\r
117hMPQ = MpqOpenArchiveForUpdateEx(FileName, MOAU_OPEN_EXISTING Or MOAU_MAINTAIN_LISTFILE, DefaultMaxFiles, DefaultBlockSize)\r
118If hMPQ = 0 Or hMPQ = INVALID_HANDLE_VALUE Then\r
119 hMPQ = MpqOpenArchiveForUpdateEx(FileName, MOAU_CREATE_NEW Or MOAU_MAINTAIN_LISTFILE, DefaultMaxFiles, DefaultBlockSize)\r
120End If\r
121If hMPQ <> 0 And hMPQ <> INVALID_HANDLE_VALUE Then\r
122 mOpenMpq = hMPQ\r
123End If\r
124End Function\r
125Function PathInputBox(lpFolderDialog As BROWSEINFO, pCaption As String, StartFolder As String) As String\r
126lpFolderDialog.Title = pCaption\r
127Dim result As Long\r
128result = ShowFolder(lpFolderDialog)\r
129If result = 0 Then Exit Function\r
130PathInputBox = GetPathFromID(result)\r
131End Function\r
132Function GetLongPath(Path As String) As String\r
133 Dim strBuf As String, StrLength As Long\r
134 strBuf = Space$(gintMAX_SIZE)\r
135 StrLength = GetLongPathName(Path, strBuf, gintMAX_SIZE)\r
136 strBuf = Left(strBuf, StrLength)\r
137 If strBuf <> "" Then\r
138 GetLongPath = strBuf\r
139 Else\r
140 GetLongPath = Path\r
141 End If\r
142End Function\r
143Sub AddScriptOutput(sOutput As String)\r
144SendMessageA ScriptOut.oText.hWnd, WM_SETREDRAW, 0, ByVal 0&\r
145ScriptOut.oText = ScriptOut.oText + sOutput\r
146SendMessageA ScriptOut.oText.hWnd, WM_SETREDRAW, 1, ByVal 0&\r
147ScriptOut.oText.SelStart = Len(ScriptOut.oText)\r
148End Sub\r
149Function GetFileTitle(FileName As String) As String\r
150Dim bNum As Long\r
151If InStr(FileName, "\") > 0 Then\r
152 For bNum = 1 To Len(FileName)\r
153 If InStr(bNum, FileName, "\") > 0 Then\r
154 bNum = InStr(bNum, FileName, "\")\r
155 Else\r
156 Exit For\r
157 End If\r
158 Next bNum\r
159 GetFileTitle = Mid(FileName, bNum)\r
160Else\r
161 GetFileTitle = FileName\r
162End If\r
163End Function\r
164Function sGetFile(hMPQ As Long, ByVal FileName As String, OutPath As String, ByVal UseFullPath As Long)\r
165Dim hFile As Long, buffer() As Byte, fLen As Long, cNum As Long\r
166If SFileOpenFileEx(hMPQ, FileName, 0, hFile) Then\r
167 fLen = SFileGetFileSize(hFile, 0)\r
168 If fLen > 0 Then\r
169 ReDim buffer(fLen - 1)\r
170 Else\r
171 ReDim buffer(0)\r
172 End If\r
173 SFileReadFile hFile, buffer(0), fLen, ByVal 0, ByVal 0\r
174 SFileCloseFile hFile\r
175 If UseFullPath = 0 Then FileName = GetFileTitle(FileName)\r
176 FileName = FullPath(OutPath, FileName)\r
177 On Error Resume Next\r
178 For cNum = 1 To Len(FileName)\r
179 cNum = InStr(cNum, FileName, "\")\r
180 If cNum > 0 Then\r
181 MkDir Left(FileName, cNum)\r
182 Else\r
183 Exit For\r
184 End If\r
185 Next cNum\r
186 If FileExists(FileName) Then Kill FileName\r
187 On Error GoTo 0\r
188 cNum = FreeFile\r
189 On Error GoTo WriteError\r
190 Open FileName For Binary As #cNum\r
191 If fLen > 0 Then Put #cNum, 1, buffer\r
192 Close #cNum\r
193 On Error GoTo 0\r
194End If\r
195Exit Function\r
196WriteError:\r
197MsgBox "Error writing file. File may be in use.", vbCritical, "WinMPQ"\r
198Close #cNum\r
199End Function\r
200Function sListFiles(MpqName As String, hMPQ As Long, ByVal FileLists As String, ByRef ListedFiles() As FILELISTENTRY) As Boolean\r
201Dim NewFileLists As String, nFileLists() As String, ListName As String, cNum As Long, cNum2 As Long, cNum3 As Long, cNum4 As Long, MpqList1 As String, MpqList2 As String, Path As String, ListLen As Long, OldLists() As String, UseOnlyAutoList As Boolean, nHash As Long, nHashEntries As Long\r
202sListFiles = False\r
203ReDim ListedFiles(0)\r
204ListedFiles(0).dwFileExists = 0\r
205If GetReg(AppKey + "AutofindFileLists", 0) = 0 Then\r
206 NewFileLists = FileLists\r
207Else\r
208 UseOnlyAutoList = GetReg(AppKey + "UseOnlyAutofindLists", 1)\r
209 MpqList2 = GetExtension(MpqName)\r
210 MpqList1 = GetFileTitle(Left(MpqName, Len(MpqName) - Len(MpqList2))) + ".txt"\r
211 MpqList2 = GetFileTitle(MpqName) + ".txt"\r
212 Path = GetLongPath(App.Path)\r
213 If Right(Path, 1) <> "\" Then Path = Path + "\"\r
214 If UseOnlyAutoList Then ListLen = Len(FileLists)\r
215 If FileLists <> "" Then\r
216 FileLists = FileLists + vbCrLf + Path + App.EXEName + ".exe" + vbCrLf + MpqName\r
217 Else\r
218 FileLists = Path + App.EXEName + ".exe" + vbCrLf + MpqName\r
219 End If\r
220 ReDim nFileLists(0) As String\r
221 If UseOnlyAutoList Then ReDim OldLists(0) As String\r
222 For cNum = 1 To Len(FileLists)\r
223 cNum2 = InStr(cNum, FileLists, vbCrLf)\r
224 If cNum2 = 0 Then\r
225 cNum2 = Len(FileLists) + 1\r
226 End If\r
227 If cNum2 - cNum > 0 Then\r
228 ListName = Mid(FileLists, cNum, cNum2 - cNum)\r
229 If Not IsDir(ListName) Then\r
230 If UseOnlyAutoList And cNum < ListLen Then\r
231 ReDim Preserve OldLists(UBound(OldLists) + 1) As String\r
232 OldLists(UBound(OldLists)) = GetLongPath(ListName)\r
233 End If\r
234 For cNum3 = 1 To Len(ListName)\r
235 If InStr(cNum3, ListName, "\") Then\r
236 cNum3 = InStr(cNum3, ListName, "\")\r
237 If FileExists(Left(ListName, cNum3) + MpqList1) Then\r
238 ReDim Preserve nFileLists(UBound(nFileLists) + 1) As String\r
239 nFileLists(UBound(nFileLists)) = GetLongPath(Left(ListName, cNum3) + MpqList1)\r
240 End If\r
241 If FileExists(Left(ListName, cNum3) + MpqList2) Then\r
242 ReDim Preserve nFileLists(UBound(nFileLists) + 1) As String\r
243 nFileLists(UBound(nFileLists)) = GetLongPath(Left(ListName, cNum3) + MpqList2)\r
244 End If\r
245 Else\r
246 Exit For\r
247 End If\r
248 Next cNum3\r
249 If FileExists(ListName) And ListName <> Path + App.EXEName + ".exe" And ListName <> MpqName Then\r
250 ReDim Preserve nFileLists(UBound(nFileLists) + 1) As String\r
251 nFileLists(UBound(nFileLists)) = GetLongPath(ListName)\r
252 End If\r
253 Else\r
254 ListName = DirEx(ListName, MpqList1, 6, True) _\r
255 + DirEx(ListName, MpqList2, 6, True)\r
256 For cNum3 = 1 To Len(ListName)\r
257 cNum4 = InStr(cNum3, ListName, vbCrLf)\r
258 If cNum4 = 0 Then\r
259 cNum4 = Len(ListName) + 1\r
260 End If\r
261 If cNum4 - cNum3 > 0 Then\r
262 ReDim Preserve nFileLists(UBound(nFileLists) + 1) As String\r
263 nFileLists(UBound(nFileLists)) = GetLongPath(Mid(ListName, cNum3, cNum4 - cNum3))\r
264 End If\r
265 cNum3 = cNum4 + 1\r
266 Next cNum3\r
267 End If\r
268 End If\r
269 cNum = cNum2 + 1\r
270 Next cNum\r
271 If UseOnlyAutoList Then\r
272 For cNum = 1 To UBound(nFileLists)\r
273 For cNum2 = 1 To UBound(OldLists)\r
274 If LCase(nFileLists(cNum)) <> LCase(OldLists(cNum2)) Then\r
275 GoTo StartSearch\r
276 End If\r
277 Next cNum2\r
278 Next cNum\r
279 UseOnlyAutoList = False\r
280 End If\r
281StartSearch:\r
282 For cNum = 1 To UBound(nFileLists)\r
283 If nFileLists(cNum) <> "" Then\r
284 For cNum2 = 1 To UBound(nFileLists)\r
285 If LCase(nFileLists(cNum)) = LCase(nFileLists(cNum2)) And cNum <> cNum2 Then\r
286 nFileLists(cNum2) = ""\r
287 End If\r
288 Next cNum2\r
289 End If\r
290 If UseOnlyAutoList Then\r
291 If nFileLists(cNum) <> "" Then\r
292 For cNum2 = 1 To UBound(OldLists)\r
293 If LCase(nFileLists(cNum)) = LCase(OldLists(cNum2)) And LCase(GetFileTitle(nFileLists(cNum))) <> LCase(MpqList1) And LCase(GetFileTitle(nFileLists(cNum))) <> LCase(MpqList2) Then\r
294 nFileLists(cNum) = ""\r
295 Exit For\r
296 End If\r
297 Next cNum2\r
298 End If\r
299 End If\r
300 If nFileLists(cNum) <> "" Then\r
301 NewFileLists = NewFileLists + nFileLists(cNum) + vbCrLf\r
302 End If\r
303 Next cNum\r
304 If Right(NewFileLists, 2) = vbCrLf Then NewFileLists = Left(NewFileLists, Len(NewFileLists) - 2)\r
305End If\r
306nHashEntries = SFileGetFileInfo(hMPQ, SFILE_INFO_HASH_TABLE_SIZE)\r
307If nHashEntries - 1 < 0 Then Exit Function\r
308ReDim ListedFiles(nHashEntries - 1)\r
309sListFiles = SFileListFiles(hMPQ, NewFileLists, ListedFiles(0), 0)\r
310End Function\r
311Sub mAddAutoFile(hMPQ As Long, File As String, MpqPath As String)\r
312Dim cType As Integer, dwFlags As Long\r
313\r
314GetCompressFlags File, cType, dwFlags\r
315\r
316Select Case cType\r
317Case -2\r
318MpqAddFileToArchiveEx hMPQ, File, MpqPath, dwFlags, 0, 0\r
319Case -1\r
320MpqAddFileToArchiveEx hMPQ, File, MpqPath, dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_STANDARD, 0\r
321Case -3\r
322MpqAddFileToArchiveEx hMPQ, File, MpqPath, dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_DEFLATE, DefaultCompressLevel\r
323Case -4\r
324MpqAddFileToArchiveEx hMPQ, File, MpqPath, dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_BZIP2, 0\r
325Case 0, 1, 2\r
326MpqAddWaveToArchive hMPQ, File, MpqPath, dwFlags Or MAFA_COMPRESS, cType\r
327Case Else\r
328If DefaultCompress = MAFA_COMPRESS_DEFLATE Then\r
329 MpqAddFileToArchiveEx hMPQ, File, MpqPath, dwFlags Or MAFA_COMPRESS, DefaultCompress, DefaultCompressLevel\r
330Else\r
331 MpqAddFileToArchiveEx hMPQ, File, MpqPath, dwFlags Or MAFA_COMPRESS, DefaultCompress, 0\r
332End If\r
333End Select\r
334End Sub\r
335Sub mAddAutoFromBuffer(hMPQ As Long, ByRef buffer As Byte, BufSize As Long, MpqPath As String)\r
336Dim cType As Integer, dwFlags As Long\r
337\r
338GetCompressFlags MpqPath, cType, dwFlags\r
339\r
340Select Case cType\r
341Case -2\r
342MpqAddFileFromBufferEx hMPQ, buffer, BufSize, MpqPath, dwFlags, 0, 0\r
343Case -1\r
344MpqAddFileFromBufferEx hMPQ, buffer, BufSize, MpqPath, dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_STANDARD, 0\r
345Case -3\r
346MpqAddFileFromBufferEx hMPQ, buffer, BufSize, MpqPath, dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_DEFLATE, DefaultCompressLevel\r
347Case -4\r
348MpqAddFileFromBufferEx hMPQ, buffer, BufSize, MpqPath, dwFlags Or MAFA_COMPRESS, MAFA_COMPRESS_BZIP2, 0\r
349Case 0, 1, 2\r
350MpqAddWaveFromBuffer hMPQ, buffer, BufSize, MpqPath, dwFlags Or MAFA_COMPRESS, cType\r
351Case Else\r
352If DefaultCompress = MAFA_COMPRESS_DEFLATE Then\r
353 MpqAddFileFromBufferEx hMPQ, buffer, BufSize, MpqPath, dwFlags Or MAFA_COMPRESS, DefaultCompress, DefaultCompressLevel\r
354Else\r
355 MpqAddFileFromBufferEx hMPQ, buffer, BufSize, MpqPath, dwFlags Or MAFA_COMPRESS, DefaultCompress, 0\r
356End If\r
357End Select\r
358End Sub\r
359\r
360Function DirEx(ByVal Path As String, Filter As String, Attributes, Recurse As Boolean) As String\r
361Dim Files() As String, lNum As Long, Folders() As String\r
362If Right(Path, 1) <> "\" And Path <> "" Then Path = Path + "\"\r
363ReDim Files(0) As String\r
364Files(0) = Dir(Path + Filter, Attributes)\r
365If Files(0) <> "" Then\r
366 Do\r
367 ReDim Preserve Files(UBound(Files) + 1) As String\r
368 Files(UBound(Files)) = Dir\r
369 Loop Until Files(UBound(Files)) = ""\r
370 ReDim Preserve Files(UBound(Files) - 1) As String\r
371End If\r
372For lNum = 0 To UBound(Files)\r
373 If Files(lNum) <> "" Then\r
374 If IsDir(Path + Files(lNum)) = False And (Attributes And vbDirectory) <> vbDirectory Then\r
375 DirEx = DirEx + Path + Files(lNum) + vbCrLf\r
376 ElseIf IsDir(Path + Files(lNum)) = True And (Attributes And vbDirectory) Then\r
377 DirEx = DirEx + Path + Files(lNum) + vbCrLf\r
378 End If\r
379 End If\r
380Next lNum\r
381If Recurse = True And (InStr(Filter, "?") > 0 Or InStr(Filter, "*") > 0) Then\r
382 ReDim Folders(0) As String\r
383 Folders(0) = Dir(Path, vbDirectory)\r
384 If Folders(0) = "." Or Folders(0) = ".." Then Folders(0) = Dir\r
385 If Folders(0) = "." Or Folders(0) = ".." Then Folders(0) = Dir\r
386 If Folders(0) <> "" Then\r
387 Do\r
388 ReDim Preserve Folders(UBound(Folders) + 1) As String\r
389 Folders(UBound(Folders)) = Dir\r
390 If Folders(UBound(Folders)) = "." Or Folders(UBound(Folders)) = ".." Then\r
391 ReDim Preserve Folders(UBound(Folders) - 1) As String\r
392 End If\r
393 Loop Until Folders(UBound(Folders)) = ""\r
394 ReDim Preserve Folders(UBound(Folders) - 1) As String\r
395 End If\r
396 For lNum = 0 To UBound(Folders)\r
397 If Folders(lNum) <> "" Then\r
398 If IsDir(Path + Folders(lNum)) Then\r
399 DirEx = DirEx + DirEx(Path + Folders(lNum), Filter, Attributes, Recurse)\r
400 End If\r
401 End If\r
402 Next lNum\r
403End If\r
404End Function\r
405Function GetExtension(FileName As String) As String\r
406Dim bNum As Long\r
407If InStr(FileName, ".") > 0 Then\r
408 For bNum = 1 To Len(FileName)\r
409 If InStr(bNum, FileName, ".") > 0 Then\r
410 bNum = InStr(bNum, FileName, ".")\r
411 Else\r
412 Exit For\r
413 End If\r
414 Next bNum\r
415 GetExtension = Mid(FileName, bNum - 1)\r
416Else\r
417 GetExtension = ""\r
418End If\r
419End Function\r
420Function IsDir(DirPath As String) As Boolean\r
421On Error GoTo IsNotDir\r
422If GetAttr(DirPath) And vbDirectory Then\r
423 IsDir = True\r
424Else\r
425 IsDir = False\r
426End If\r
427Exit Function\r
428IsNotDir:\r
429IsDir = False\r
430End Function\r
431Function FileExists(FileName As String) As Boolean\r
432On Error GoTo NoFile\r
433If (GetAttr(FileName) And vbDirectory) <> vbDirectory Then\r
434 FileExists = True\r
435Else\r
436 FileExists = False\r
437End If\r
438Exit Function\r
439NoFile:\r
440FileExists = False\r
441End Function\r
442Function IsMPQ(MpqFile As String) As Boolean\r
443If FindMpqHeader(MpqFile) <> -1 Then\r
444 IsMPQ = True\r
445Else\r
446 IsMPQ = False\r
447End If\r
448End Function\r
449Sub KillEx(ByVal Path As String, Filter As String, Attributes, Recurse As Boolean)\r
450Dim Files() As String, lNum As Long, Folders() As String\r
451If Right(Path, 1) <> "\" And Path <> "" Then Path = Path + "\"\r
452ReDim Files(0) As String\r
453Files(0) = Dir(Path + Filter, Attributes)\r
454If Files(0) <> "" Then\r
455 Do\r
456 ReDim Preserve Files(UBound(Files) + 1) As String\r
457 Files(UBound(Files)) = Dir\r
458 Loop Until Files(UBound(Files)) = ""\r
459 ReDim Preserve Files(UBound(Files) - 1) As String\r
460End If\r
461For lNum = 0 To UBound(Files)\r
462 If Files(lNum) <> "" Then\r
463 If IsDir(Path + Files(lNum)) = False Then\r
464 On Error Resume Next\r
465 Kill Path + Files(lNum)\r
466 On Error GoTo 0\r
467 End If\r
468 End If\r
469Next lNum\r
470If Recurse = True And (InStr(Filter, "?") > 0 Or InStr(Filter, "*") > 0) Then\r
471 ReDim Folders(0) As String\r
472 Folders(0) = Dir(Path, vbDirectory)\r
473 If Folders(0) = "." Or Folders(0) = ".." Then Folders(0) = Dir\r
474 If Folders(0) = "." Or Folders(0) = ".." Then Folders(0) = Dir\r
475 If Folders(0) <> "" Then\r
476 Do\r
477 ReDim Preserve Folders(UBound(Folders) + 1) As String\r
478 Folders(UBound(Folders)) = Dir\r
479 If Folders(UBound(Folders)) = "." Or Folders(UBound(Folders)) = ".." Then\r
480 ReDim Preserve Folders(UBound(Folders) - 1) As String\r
481 End If\r
482 Loop Until Folders(UBound(Folders)) = ""\r
483 ReDim Preserve Folders(UBound(Folders) - 1) As String\r
484 End If\r
485 For lNum = 0 To UBound(Folders)\r
486 If Folders(lNum) <> "" Then\r
487 If IsDir(Path + Folders(lNum)) Then\r
488 KillEx Path + Folders(lNum), Filter, Attributes, Recurse\r
489 On Error Resume Next\r
490 RmDir Path + Folders(lNum)\r
491 End If\r
492 On Error GoTo 0\r
493 End If\r
494 Next lNum\r
495End If\r
496End Sub\r
497Function FullPath(ByVal BasePath As String, File As String) As String\r
498If Right(BasePath, 1) <> "\" Then BasePath = BasePath + "\"\r
499If Mid(File, 2, 1) = ":" Or Left(File, 2) = "\\" Then\r
500 FullPath = File\r
501ElseIf Left(File, 1) = "\" Then\r
502 FullPath = Left(BasePath, 2) + File\r
503Else\r
504 FullPath = BasePath + File\r
505End If\r
506End Function\r
507Function MatchesFilter(FileName As String, ByVal Filters As String) As Boolean\r
508Dim bNum As Long, Filter As String\r
509If InStr(Filters, ";") Then\r
510 If Right(Filters, 1) <> ";" Then Filters = Filters + ";"\r
511 For bNum = 1 To Len(Filters)\r
512 Filter = Mid(Filters, bNum, InStr(bNum, Filters, ";") - bNum)\r
513 If Right(Filter, 3) = "*.*" Then Filter = Left(Filter, Len(Filter) - 2)\r
514 If LCase(FileName) Like LCase(Filter) Then\r
515 MatchesFilter = True\r
516 Exit Function\r
517 End If\r
518 bNum = InStr(bNum, Filters, ";")\r
519 Next bNum\r
520Else\r
521 If Right(Filters, 3) = "*.*" Then Filters = Left(Filters, Len(Filters) - 2)\r
522 If LCase(FileName) Like LCase(Filters) Then MatchesFilter = True\r
523End If\r
524End Function\r
525Function RenameWithFilter(FileName As String, OldFilter As String, NewFilter As String) As String\r
526Dim bNum As Long, Filters() As String, NewFileName As String, bNum2 As Long, bNum3 As Long, bNum4 As Long, bNum5 As Long\r
527If Right(OldFilter, 3) = "*.*" Then OldFilter = Left(OldFilter, Len(OldFilter) - 2)\r
528If Right(NewFilter, 3) = "*.*" Then NewFilter = Left(NewFilter, Len(NewFilter) - 2)\r
529ReDim Filters(0) As String\r
530bNum4 = 1\r
531For bNum = 1 To Len(OldFilter)\r
532 Select Case Mid(OldFilter, bNum, 1)\r
533 Case "*"\r
534 bNum2 = InStr(bNum + 1, OldFilter, "*")\r
535 bNum3 = InStr(bNum + 1, OldFilter, "?")\r
536 If bNum2 = 0 And bNum3 = 0 Then\r
537 bNum2 = Len(OldFilter) + 1\r
538 ElseIf (bNum3 < bNum2 Or bNum2 = 0) And bNum3 > 0 Then\r
539 bNum2 = bNum3\r
540 End If\r
541 bNum5 = InStr(bNum4, FileName, Mid(OldFilter, bNum + 1, bNum2 - bNum - 1), 1)\r
542 If bNum = Len(OldFilter) Then\r
543 bNum5 = Len(FileName) + 1\r
544 End If\r
545 If bNum5 = 0 Then\r
546 RenameWithFilter = FileName\r
547 Exit Function\r
548 End If\r
549 If bNum > 1 Then\r
550 If Mid(OldFilter, bNum - 1, 1) <> "*" And Mid(OldFilter, bNum - 1, 1) <> "?" Then\r
551 ReDim Preserve Filters(UBound(Filters) + 1) As String\r
552 End If\r
553 Else\r
554 ReDim Preserve Filters(UBound(Filters) + 1) As String\r
555 End If\r
556 Filters(UBound(Filters)) = Filters(UBound(Filters)) + Mid(FileName, bNum4, bNum5 - bNum4)\r
557 bNum4 = bNum5\r
558 Case "?"\r
559 bNum2 = bNum + 1\r
560 bNum5 = bNum4 + 1\r
561 If bNum > 1 Then\r
562 If Mid(OldFilter, bNum - 1, 1) <> "*" And Mid(OldFilter, bNum - 1, 1) <> "?" Then\r
563 ReDim Preserve Filters(UBound(Filters) + 1) As String\r
564 End If\r
565 Else\r
566 ReDim Preserve Filters(UBound(Filters) + 1) As String\r
567 End If\r
568 Filters(UBound(Filters)) = Filters(UBound(Filters)) + Mid(FileName, bNum4, 1)\r
569 bNum4 = bNum5\r
570 Case Else\r
571 bNum4 = bNum4 + 1\r
572 End Select\r
573 If bNum4 > Len(FileName) Then\r
574 If (Right(OldFilter, 1) <> "*" Or bNum + 1 < Len(OldFilter)) And bNum < Len(OldFilter) Then\r
575 RenameWithFilter = FileName\r
576 Exit Function\r
577 Else\r
578 Exit For\r
579 End If\r
580 End If\r
581Next bNum\r
582NewFileName = NewFilter\r
583For bNum = 1 To UBound(Filters)\r
584 bNum2 = InStr(bNum, NewFileName, "*")\r
585 bNum3 = InStr(bNum, NewFileName, "?")\r
586 If bNum2 = 0 And bNum3 = 0 Then\r
587 bNum2 = Len(NewFileName) + 1\r
588 ElseIf (bNum3 < bNum2 Or bNum2 = 0) And bNum3 > 0 Then\r
589 bNum2 = bNum3\r
590 End If\r
591 If bNum2 > Len(NewFileName) Then\r
592 RenameWithFilter = NewFileName\r
593 Exit Function\r
594 End If\r
595 bNum4 = 0\r
596 For bNum3 = bNum2 To Len(NewFileName)\r
597 Select Case Mid(NewFileName, bNum3, 1)\r
598 Case "*"\r
599 bNum4 = Len(Filters(bNum))\r
600 bNum3 = bNum3 + 1\r
601 Exit For\r
602 Case "?"\r
603 bNum4 = bNum4 + 1\r
604 Case Else\r
605 Exit For\r
606 End Select\r
607 Next bNum3\r
608 NewFileName = Left(NewFileName, bNum2 - 1) + Left(Filters(bNum), bNum4) + Mid(NewFileName, bNum3)\r
609Next bNum\r
610Do Until InStr(NewFileName, "*") = 0\r
611 NewFileName = Left(NewFileName, InStr(NewFileName, "*") - 1) + Mid(NewFileName, InStr(NewFileName, "*") + 1)\r
612Loop\r
613Do Until InStr(NewFileName, "?") = 0\r
614 NewFileName = Left(NewFileName, InStr(NewFileName, "?") - 1) + Mid(NewFileName, InStr(NewFileName, "?") + 1)\r
615Loop\r
616RenameWithFilter = NewFileName\r
617End Function\r
618Function MpqDir(MpqFile As String, Filters As String)\r
619Dim Files() As FILELISTENTRY, fNum As Long, szFileList As String, NamePos As Long, CurFileName As String\r
620Dim hMPQ As Long\r
621If SFileOpenArchive(MpqFile, 0, 0, hMPQ) Then\r
622 If sListFiles(MpqFile, hMPQ, ListFile, Files) Then\r
623 SFileCloseArchive hMPQ\r
624 For fNum = 0 To UBound(Files)\r
625 If Files(fNum).dwFileExists Then\r
626 CurFileName = StrConv(Files(fNum).szFileName, vbUnicode)\r
627 If MatchesFilter(CurFileName, Filters) Then\r
628 NamePos = InStr(1, szFileList, CurFileName + vbCrLf, 1)\r
629 If NamePos > 1 Then\r
630 NamePos = InStr(1, szFileList, vbCrLf + CurFileName + vbCrLf, 1)\r
631 End If\r
632 If NamePos > 0 Then _\r
633 szFileList = szFileList + CurFileName\r
634 End If\r
635 End If\r
636 Next fNum\r
637 MpqDir = MpqDir + CurFileName + vbCrLf\r
638 Else\r
639 SFileCloseArchive hMPQ\r
640 End If\r
641End If\r
642End Function\r
643Sub RunScript(ScriptName As String)\r
644Dim fNum As Long, Script As String, sLine As String, Param() As String, bNum As Long, EndLine As Long, pNum As Long, EndParam As Long, MpqFile As String, OldDefaultMaxFiles As Long, cType As Integer, lNum As Long, OldPath As String, NewPath As String, Rswitch As Boolean, Files As String, fCount As Long, fEndLine As Long, fLine As String, ScriptNewFile As Boolean, CurPath As String, fLine2 As String, fLineTitle As String, hMPQ As Long, hFile As Long, dwFlags\r
645If FileExists(ScriptName) = False Then\r
646 ScriptOut.Show\r
647 AddScriptOutput "Could not find script " + ScriptName + vbCrLf\r
648 Exit Sub\r
649End If\r
650fNum = FreeFile\r
651Open ScriptName For Binary As #fNum\r
652Script = String(LOF(fNum), Chr(0))\r
653Get #fNum, 1, Script\r
654Close #fNum\r
655OldPath = CurDir\r
656If InStr(ScriptName, "\") > 0 Then\r
657 For bNum = 1 To Len(ScriptName)\r
658 If InStr(bNum, ScriptName, "\") > 0 Then\r
659 bNum = InStr(bNum, ScriptName, "\")\r
660 NewPath = Left(ScriptName, bNum)\r
661 End If\r
662 Next bNum\r
663 If Mid(NewPath, 2, 1) = ":" Then ChDrive Left(NewPath, 1)\r
664 ChDir NewPath\r
665End If\r
666CurPath = CurDir\r
667If Right(Script, 2) <> vbCrLf Then Script = Script + vbCrLf\r
668ScriptOut.Show\r
669AddScriptOutput "Script: " + ScriptName + vbCrLf + vbCrLf\r
670OldDefaultMaxFiles = DefaultMaxFiles\r
671lNum = 1\r
672For bNum = 1 To Len(Script)\r
673 EndLine = InStr(bNum, Script, vbCrLf)\r
674 sLine = Mid(Script, bNum, EndLine - bNum)\r
675 If Right(sLine, 1) <> " " Then sLine = sLine + " "\r
676 If sLine <> "" Then\r
677 AddScriptOutput "Line " + CStr(lNum) + ": "\r
678 ReDim Param(0) As String\r
679 For pNum = 1 To Len(sLine)\r
680 If Mid(sLine, pNum, 1) = Chr(34) Then\r
681 pNum = pNum + 1\r
682 EndParam = InStr(pNum, sLine, Chr(34))\r
683 Else\r
684 EndParam = InStr(pNum, sLine, " ")\r
685 End If\r
686 If EndParam = 0 Then EndParam = Len(sLine) + 1\r
687 If pNum <> EndParam Then\r
688 If Trim(Mid(sLine, pNum, EndParam - pNum)) <> "" Then\r
689 ReDim Preserve Param(UBound(Param) + 1) As String\r
690 Param(UBound(Param)) = Trim(Mid(sLine, pNum, EndParam - pNum))\r
691 End If\r
692 End If\r
693 pNum = EndParam\r
694 Next pNum\r
695 If UBound(Param) < 3 Then ReDim Preserve Param(3) As String\r
696 Select Case LCase(Param(1))\r
697 Case "o", "open"\r
698 If Param(2) <> "" Then\r
699 MpqFile = Param(2)\r
700 If Param(3) <> "" And FileExists(MpqFile) = False Then\r
701 DefaultMaxFiles = Param(3)\r
702 End If\r
703 If FileExists(MpqFile) Then\r
704 AddScriptOutput "Opened " + MpqFile + vbCrLf\r
705 Else\r
706 AddScriptOutput "Created new " + MpqFile + vbCrLf\r
707 End If\r
708 NewPath = CurPath\r
709 Else\r
710 AddScriptOutput "Required parameter missing" + vbCrLf\r
711 End If\r
712 Case "n", "new"\r
713 If Param(2) <> "" Then\r
714 MpqFile = Param(2)\r
715 If Param(3) <> "" Then\r
716 DefaultMaxFiles = Param(3)\r
717 End If\r
718 ScriptNewFile = True\r
719 AddScriptOutput "Created new " + MpqFile + vbCrLf\r
720 NewPath = CurPath\r
721 Else\r
722 AddScriptOutput "Required parameter missing" + vbCrLf\r
723 End If\r
724 Case "c", "close"\r
725 If MpqFile <> "" Then\r
726 If LCase(CD.FileName) = LCase(FullPath(NewPath, MpqFile)) Then MpqEx.Timer1.Enabled = True\r
727 AddScriptOutput "Closed " + MpqFile + vbCrLf\r
728 MpqFile = ""\r
729 Else\r
730 AddScriptOutput "No archive open" + vbCrLf\r
731 End If\r
732 Case "p", "pause"\r
733 AddScriptOutput "Pause not supported" + vbCrLf\r
734 Case "a", "add"\r
735 If MpqFile <> "" Then\r
736 cType = 0\r
737 Rswitch = False\r
738 fCount = 0\r
739 Files = ""\r
740 fEndLine = 0\r
741 fLine = ""\r
742 dwFlags = MAFA_REPLACE_EXISTING\r
743 If GlobalEncrypt Then dwFlags = dwFlags Or MAFA_ENCRYPT\r
744 For pNum = 3 To UBound(Param)\r
745 If LCase(Param(pNum)) = "/wav" Then\r
746 cType = 2\r
747 dwFlags = dwFlags Or MAFA_COMPRESS\r
748 ElseIf LCase(Param(pNum)) = "/c" And cType < 2 Then\r
749 cType = 1\r
750 dwFlags = dwFlags Or MAFA_COMPRESS\r
751 ElseIf LCase(Param(pNum)) = "/auto" And cType < 1 Then\r
752 cType = -1\r
753 ElseIf LCase(Param(pNum)) = "/r" Then\r
754 Rswitch = True\r
755 End If\r
756 Next pNum\r
757 If Left(Param(3), 1) = "/" Or Param(3) = "" Then\r
758 If InStr(Param(2), "*") <> 0 Or InStr(Param(2), "?") <> 0 Then\r
759 Param(3) = ""\r
760 Else\r
761 Param(3) = Param(2)\r
762 End If\r
763 End If\r
764 If Left(Param(2), 1) <> "/" And Param(2) <> "" Then\r
765 If InStr(Param(2), "\") > 0 Then\r
766 For pNum = 1 To Len(Param(2))\r
767 If InStr(pNum, Param(2), "\") > 0 Then\r
768 pNum = InStr(pNum, Param(2), "\")\r
769 Files = Left(Param(2), pNum)\r
770 End If\r
771 Next pNum\r
772 End If\r
773 If ScriptNewFile = True Then\r
774 If FileExists(FullPath(NewPath, MpqFile)) Then Kill FullPath(NewPath, MpqFile)\r
775 ScriptNewFile = False\r
776 End If\r
777 Files = DirEx(Files, Mid(Param(2), Len(Files) + 1), 6, Rswitch)\r
778 hMPQ = mOpenMpq(FullPath(NewPath, MpqFile))\r
779 If hMPQ = 0 Then\r
780 AddScriptOutput "Can't create archive " + MpqFile + vbCrLf\r
781 GoTo CommandError\r
782 End If\r
783 For pNum = 1 To Len(Files)\r
784 fEndLine = InStr(pNum, Files, vbCrLf)\r
785 fLine = Mid(Files, pNum, fEndLine - pNum)\r
786 If pNum > 1 Then\r
787 AddScriptOutput "Line " + CStr(lNum) + ": "\r
788 End If\r
789 If cType = 0 Then\r
790 AddScriptOutput "Adding " + fLine + "..."\r
791 ElseIf cType = 1 Then\r
792 AddScriptOutput "Adding compressed " + fLine + "..."\r
793 ElseIf cType = 2 Then\r
794 AddScriptOutput "Adding compressed WAV " + fLine + "..."\r
795 ElseIf cType = -1 Then\r
796 AddScriptOutput "Adding " + fLine + " (compression auto-select)..."\r
797 End If\r
798 If InStr(Param(2), "*") <> 0 Or InStr(Param(2), "?") <> 0 Then\r
799 If Right(Param(3), 1) <> "\" And Param(3) <> "" Then Param(3) = Param(3) + "\"\r
800 If cType = 2 Then\r
801 MpqAddWaveToArchive hMPQ, FullPath(CurPath, fLine), Param(3) + fLine, dwFlags, 0\r
802 ElseIf cType = -1 Then\r
803 mAddAutoFile hMPQ, FullPath(CurPath, fLine), Param(3) + fLine\r
804 ElseIf cType = 1 Then\r
805 If DefaultCompress = MAFA_COMPRESS_DEFLATE Then\r
806 MpqAddFileToArchiveEx hMPQ, FullPath(CurPath, fLine), Param(3) + fLine, dwFlags, DefaultCompress, DefaultCompressLevel\r
807 Else\r
808 MpqAddFileToArchiveEx hMPQ, FullPath(CurPath, fLine), Param(3) + fLine, dwFlags, DefaultCompress, 0\r
809 End If\r
810 Else\r
811 MpqAddFileToArchiveEx hMPQ, FullPath(CurPath, fLine), Param(3) + fLine, dwFlags, 0, 0\r
812 End If\r
813 Else\r
814 If cType = 2 Then\r
815 MpqAddWaveToArchive hMPQ, FullPath(CurPath, fLine), Param(3), dwFlags, 0\r
816 ElseIf cType = -1 Then\r
817 mAddAutoFile hMPQ, FullPath(CurPath, fLine), Param(3)\r
818 ElseIf cType = 1 Then\r
819 If DefaultCompress = MAFA_COMPRESS_DEFLATE Then\r
820 MpqAddFileToArchiveEx hMPQ, FullPath(CurPath, fLine), Param(3), dwFlags, DefaultCompress, DefaultCompressLevel\r
821 Else\r
822 MpqAddFileToArchiveEx hMPQ, FullPath(CurPath, fLine), Param(3), dwFlags, DefaultCompress, 0\r
823 End If\r
824 Else\r
825 MpqAddFileToArchiveEx hMPQ, FullPath(CurPath, fLine), Param(3), dwFlags, 0, 0\r
826 End If\r
827 End If\r
828 AddScriptOutput " Done" + vbCrLf\r
829 SendMessageA ScriptOut.oText.hWnd, WM_PAINT, 0, &O0\r
830 fCount = fCount + 1\r
831 pNum = fEndLine + 1\r
832 Next pNum\r
833 MpqCloseUpdatedArchive hMPQ, 0\r
834 If fCount > 1 Then\r
835 AddScriptOutput "Line " + CStr(lNum) + ": " + CStr(fCount) + " files of " + Param(2) + " added" + vbCrLf\r
836 End If\r
837 Else\r
838 AddScriptOutput " Required parameter missing" + vbCrLf\r
839 End If\r
840 Else\r
841 AddScriptOutput "No archive open" + vbCrLf\r
842 End If\r
843 Case "e", "extract"\r
844 If MpqFile <> "" Then\r
845 If InStr(Param(2), "*") = 0 And InStr(Param(2), "?") = 0 Then AddScriptOutput "Extracting " + Param(2) + "..."\r
846 cType = 0\r
847 For pNum = 3 To UBound(Param)\r
848 If LCase(Param(pNum)) = "/fp" Then\r
849 cType = 1\r
850 Exit For\r
851 End If\r
852 Next pNum\r
853 If Left(Param(3), 1) = "/" Then Param(3) = ""\r
854 If Param(3) = "" Then Param(3) = "."\r
855 If Left(Param(2), 1) <> "/" And Param(2) <> "" Then\r
856 If InStr(Param(2), "*") <> 0 Or InStr(Param(2), "?") <> 0 Then\r
857 Files = MpqDir(FullPath(NewPath, MpqFile), Param(2))\r
858 If SFileOpenArchive(FullPath(NewPath, MpqFile), 0, 0, hMPQ) = 0 Then\r
859 AddScriptOutput "Can't open archive " + FullPath(NewPath, MpqFile) + vbCrLf\r
860 GoTo CommandError\r
861 End If\r
862 For pNum = 1 To Len(Files)\r
863 fEndLine = InStr(pNum, Files, vbCrLf)\r
864 fLine = Mid(Files, pNum, fEndLine - pNum)\r
865 If pNum > 1 Then\r
866 AddScriptOutput "Line " + CStr(lNum) + ": "\r
867 End If\r
868 AddScriptOutput "Extracting " + fLine + "..."\r
869 sGetFile hMPQ, fLine, FullPath(CurPath, Param(3)), cType\r
870 AddScriptOutput " Done" + vbCrLf\r
871 \r
872 fCount = fCount + 1\r
873 pNum = fEndLine + 1\r
874 Next pNum\r
875 SFileCloseArchive hMPQ\r
876 If fCount > 1 Then\r
877 AddScriptOutput "Line " + CStr(lNum) + ": " + CStr(fCount) + " files of " + Param(2) + " extracted" + vbCrLf\r
878 End If\r
879 Else\r
880 If SFileOpenArchive(FullPath(NewPath, MpqFile), 0, 0, hMPQ) = 0 Then\r
881 AddScriptOutput "Can't open archive " + FullPath(NewPath, MpqFile) + vbCrLf\r
882 GoTo CommandError\r
883 End If\r
884 sGetFile hMPQ, Param(2), FullPath(CurPath, Param(3)), cType\r
885 SFileCloseArchive hMPQ\r
886 AddScriptOutput " Done" + vbCrLf\r
887 End If\r
888 Else\r
889 AddScriptOutput " Required parameter missing" + vbCrLf\r
890 End If\r
891 Else\r
892 AddScriptOutput "No archive open" + vbCrLf\r
893 End If\r
894 Case "r", "ren", "rename"\r
895 If MpqFile <> "" Then\r
896 If InStr(Param(2), "*") = 0 And InStr(Param(2), "?") = 0 Then AddScriptOutput "Renaming " + Param(2) + " => " + Param(3) + "..."\r
897 If Param(2) <> "" And Param(3) <> "" Then\r
898 If InStr(Param(2), "*") <> 0 Or InStr(Param(2), "?") <> 0 Then\r
899 If InStr(Param(3), "*") <> 0 Or InStr(Param(3), "?") <> 0 Then\r
900 Files = MpqDir(FullPath(NewPath, MpqFile), Param(2))\r
901 hMPQ = mOpenMpq(FullPath(NewPath, MpqFile))\r
902 If hMPQ Then\r
903 For pNum = 1 To Len(Files)\r
904 fEndLine = InStr(pNum, Files, vbCrLf)\r
905 fLine = Mid(Files, pNum, fEndLine - pNum)\r
906 If pNum > 1 Then\r
907 AddScriptOutput "Line " + CStr(lNum) + ": "\r
908 End If\r
909 fLine2 = RenameWithFilter(fLine, Param(2), Param(3))\r
910 AddScriptOutput "Renaming " + fLine + " => " + fLine2 + "..."\r
911 If SFileOpenFileEx(hMPQ, fLine2, 0, hFile) Then\r
912 SFileCloseFile hFile\r
913 MpqDeleteFile hMPQ, fLine2\r
914 MpqRenameFile hMPQ, fLine, fLine2\r
915 Else\r
916 MpqRenameFile hMPQ, fLine, fLine2\r
917 End If\r
918 AddScriptOutput " Done" + vbCrLf\r
919 fCount = fCount + 1\r
920 pNum = fEndLine + 1\r
921 Next pNum\r
922 MpqCloseUpdatedArchive hMPQ, 0\r
923 End If\r
924 If fCount > 1 Then\r
925 AddScriptOutput "Line " + CStr(lNum) + ": " + CStr(fCount) + " files of " + Param(2) + " renamed" + vbCrLf\r
926 End If\r
927 Else\r
928 AddScriptOutput "You must use wildcards with new name" + vbCrLf\r
929 End If\r
930 Else\r
931 hMPQ = mOpenMpq(FullPath(NewPath, MpqFile))\r
932 If hMPQ Then\r
933 If SFileOpenFileEx(hMPQ, Param(3), 0, hFile) Then\r
934 SFileCloseFile hFile\r
935 MpqDeleteFile hMPQ, Param(3)\r
936 MpqRenameFile hMPQ, Param(2), Param(3)\r
937 Else\r
938 MpqRenameFile hMPQ, Param(2), Param(3)\r
939 End If\r
940 MpqCloseUpdatedArchive hMPQ, 0\r
941 End If\r
942 AddScriptOutput " Done" + vbCrLf\r
943 End If\r
944 Else\r
945 AddScriptOutput " Required parameter missing" + vbCrLf\r
946 End If\r
947 Else\r
948 AddScriptOutput "No archive open" + vbCrLf\r
949 End If\r
950 Case "m", "move"\r
951 If MpqFile <> "" Then\r
952 For pNum = 1 To Len(Param(2))\r
953 If InStr(bNum, Param(2), "\") Then\r
954 bNum = InStr(bNum, Param(2), "\")\r
955 Else\r
956 Exit For\r
957 End If\r
958 Next pNum\r
959 fLineTitle = Mid(Param(2), bNum)\r
960 If Right(Param(3), 1) <> "\" And Param(3) <> "" Then Param(3) = Param(3) + "\"\r
961 Param(3) = Param(3) + fLineTitle\r
962 If InStr(Param(2), "*") = 0 And InStr(Param(2), "?") = 0 Then AddScriptOutput "Moving " + Param(2) + " => " + Param(3) + "..."\r
963 If (Left(Param(2), 1) <> "/" And Param(2) <> "") And (Left(Param(3), 1) <> "/") Then\r
964 If InStr(Param(2), "*") <> 0 Or InStr(Param(2), "?") <> 0 Then\r
965 Files = MpqDir(FullPath(NewPath, MpqFile), Param(2))\r
966 hMPQ = mOpenMpq(FullPath(NewPath, MpqFile))\r
967 If hMPQ Then\r
968 For pNum = 1 To Len(Files)\r
969 fEndLine = InStr(pNum, Files, vbCrLf)\r
970 fLine = Mid(Files, pNum, fEndLine - pNum)\r
971 If pNum > 1 Then\r
972 AddScriptOutput "Line " + CStr(lNum) + ": "\r
973 End If\r
974 fLine2 = RenameWithFilter(fLine, Param(2), Param(3))\r
975 AddScriptOutput "Moving " + fLine + " => " + fLine2 + "..."\r
976 If SFileOpenFileEx(hMPQ, fLine2, 0, hFile) Then\r
977 SFileCloseFile hFile\r
978 MpqDeleteFile hMPQ, fLine2\r
979 MpqRenameFile hMPQ, fLine, fLine2\r
980 Else\r
981 MpqRenameFile hMPQ, fLine, fLine2\r
982 End If\r
983 AddScriptOutput " Done" + vbCrLf\r
984 fCount = fCount + 1\r
985 pNum = fEndLine + 1\r
986 Next pNum\r
987 MpqCloseUpdatedArchive hMPQ, 0\r
988 End If\r
989 If fCount > 1 Then\r
990 AddScriptOutput "Line " + CStr(lNum) + ": " + CStr(fCount) + " files of " + Param(2) + " moved" + vbCrLf\r
991 End If\r
992 Else\r
993 hMPQ = mOpenMpq(FullPath(NewPath, MpqFile))\r
994 If hMPQ Then\r
995 If SFileOpenFileEx(hMPQ, Param(3), 0, hFile) Then\r
996 SFileCloseFile hFile\r
997 MpqDeleteFile hMPQ, Param(3)\r
998 MpqRenameFile hMPQ, Param(2), Param(3)\r
999 Else\r
1000 MpqRenameFile hMPQ, Param(2), Param(3)\r
1001 End If\r
1002 MpqCloseUpdatedArchive hMPQ, 0\r
1003 End If\r
1004 AddScriptOutput " Done" + vbCrLf\r
1005 End If\r
1006 Else\r
1007 AddScriptOutput " Required parameter missing" + vbCrLf\r
1008 End If\r
1009 Else\r
1010 AddScriptOutput "No archive open" + vbCrLf\r
1011 End If\r
1012 Case "d", "del", "delete"\r
1013 If MpqFile <> "" Then\r
1014 If InStr(Param(2), "*") = 0 And InStr(Param(2), "?") = 0 Then AddScriptOutput "Deleting " + Param(2) + "..."\r
1015 If Left(Param(2), 1) <> "/" And Param(2) <> "" Then\r
1016 If InStr(Param(2), "*") <> 0 Or InStr(Param(2), "?") <> 0 Then\r
1017 Files = MpqDir(FullPath(NewPath, MpqFile), Param(2))\r
1018 hMPQ = mOpenMpq(FullPath(NewPath, MpqFile))\r
1019 If hMPQ Then\r
1020 For pNum = 1 To Len(Files)\r
1021 fEndLine = InStr(pNum, Files, vbCrLf)\r
1022 fLine = Mid(Files, pNum, fEndLine - pNum)\r
1023 If pNum > 1 Then\r
1024 AddScriptOutput "Line " + CStr(lNum) + ": "\r
1025 End If\r
1026 AddScriptOutput "Deleting " + fLine + "..."\r
1027 MpqDeleteFile hMPQ, fLine\r
1028 AddScriptOutput " Done" + vbCrLf\r
1029 fCount = fCount + 1\r
1030 pNum = fEndLine + 1\r
1031 Next pNum\r
1032 MpqCloseUpdatedArchive hMPQ, 0\r
1033 End If\r
1034 If fCount > 1 Then\r
1035 AddScriptOutput "Line " + CStr(lNum) + ": " + CStr(fCount) + " files of " + Param(2) + " deleted" + vbCrLf\r
1036 End If\r
1037 Else\r
1038 hMPQ = mOpenMpq(FullPath(NewPath, MpqFile))\r
1039 If hMPQ Then\r
1040 MpqDeleteFile hMPQ, Param(2)\r
1041 MpqCloseUpdatedArchive hMPQ, 0\r
1042 End If\r
1043 AddScriptOutput " Done" + vbCrLf\r
1044 End If\r
1045 Else\r
1046 AddScriptOutput " Required parameter missing" + vbCrLf\r
1047 End If\r
1048 Else\r
1049 AddScriptOutput "No archive open" + vbCrLf\r
1050 End If\r
1051 Case "f", "flush", "compact"\r
1052 If MpqFile <> "" Then\r
1053 AddScriptOutput "Flushing " + MpqFile + "..."\r
1054 hMPQ = mOpenMpq(FullPath(NewPath, MpqFile))\r
1055 If hMPQ Then\r
1056 MpqCompactArchive hMPQ\r
1057 MpqCloseUpdatedArchive hMPQ, 0\r
1058 End If\r
1059 AddScriptOutput " Done" + vbCrLf\r
1060 Else\r
1061 AddScriptOutput "No archive open" + vbCrLf\r
1062 End If\r
1063 Case "l", "list"\r
1064 If MpqFile <> "" Then\r
1065 If Param(2) <> "" Then\r
1066 AddScriptOutput "Creating list..."\r
1067 If (InStr(Param(2), "*") <> 0 Or InStr(Param(2), "?") <> 0) And Param(3) <> "" Then\r
1068 Files = MpqDir(FullPath(NewPath, MpqFile), Param(2))\r
1069 Param(2) = Param(3)\r
1070 Else\r
1071 Files = MpqDir(FullPath(NewPath, MpqFile), "*")\r
1072 End If\r
1073 fNum = FreeFile\r
1074 Open FullPath(CurPath, Param(2)) For Binary As #fNum\r
1075 Put #fNum, 1, Files\r
1076 Close #fNum\r
1077 AddScriptOutput " Done" + vbCrLf\r
1078 Else\r
1079 AddScriptOutput " Required parameter missing" + vbCrLf\r
1080 End If\r
1081 Else\r
1082 AddScriptOutput "No archive open" + vbCrLf\r
1083 End If\r
1084 Case "s", "script"\r
1085 AddScriptOutput "Running script " + Param(2) + "..." + vbCrLf + vbCrLf\r
1086 If Param(2) <> "" Then\r
1087 RunScript FullPath(CurPath, Param(2))\r
1088 Else\r
1089 AddScriptOutput " Required parameter missing" + vbCrLf\r
1090 End If\r
1091 AddScriptOutput vbCrLf + "Continuing with previous script..." + vbCrLf\r
1092 Case "x", "exit", "quit"\r
1093 Unload MpqEx\r
1094 Case Else\r
1095 If Left(Param(1), 1) <> ";" Then\r
1096 If LCase(Param(1)) = "cd" Or LCase(Param(1)) = "chdir" Then\r
1097 On Error Resume Next\r
1098 ChDir Param(2)\r
1099 On Error GoTo 0\r
1100 CurPath = CurDir\r
1101 AddScriptOutput "Current directory is " + CurPath + vbCrLf\r
1102 ElseIf Left(LCase(Param(1)), 3) = "cd." Or Left(LCase(Param(1)), 3) = "cd\" Then\r
1103 On Error Resume Next\r
1104 ChDir Mid(Param(1), 3)\r
1105 On Error GoTo 0\r
1106 CurPath = CurDir\r
1107 AddScriptOutput "Current directory is " + CurPath + vbCrLf\r
1108 ElseIf Left(LCase(Param(1)), 6) = "chdir." Or Left(LCase(Param(1)), 6) = "chdir\" Then\r
1109 On Error Resume Next\r
1110 ChDir Mid(Param(1), 6)\r
1111 On Error GoTo 0\r
1112 CurPath = CurDir\r
1113 AddScriptOutput "Current directory is " + CurPath + vbCrLf\r
1114 ElseIf Mid(Param(1), 2, 1) = ":" And (Len(Param(1)) = 2 Or Right(Param(1), 1) = "\") Then\r
1115 On Error Resume Next\r
1116 ChDrive Left(Param(1), 2)\r
1117 On Error GoTo 0\r
1118 CurPath = CurDir\r
1119 AddScriptOutput "Current directory is " + CurPath + vbCrLf\r
1120 Else\r
1121 AddScriptOutput "Running command " + sLine + "..."\r
1122 Shell "command.com /c " + sLine, 1\r
1123 AddScriptOutput " Done" + vbCrLf\r
1124 End If\r
1125 Else\r
1126 AddScriptOutput "Comment " + sLine + vbCrLf\r
1127 End If\r
1128 End Select\r
1129 End If\r
1130CommandError:\r
1131 lNum = lNum + 1\r
1132 bNum = EndLine + 1\r
1133Next bNum\r
1134DefaultMaxFiles = OldDefaultMaxFiles\r
1135If Mid(OldPath, 2, 1) = ":" Then ChDrive Left(OldPath, 1)\r
1136ChDir OldPath\r
1137End Sub\r
1138Function FindMpqHeader(MpqFile As String) As Long\r
1859bb9b 1139 FindMpqHeader = -1\r
b31da37a 1140 If FileExists(MpqFile) = False Then\r
b31da37a 1141 Exit Function\r
1142 End If\r
1859bb9b 1143 Dim hMPQ As Long, hFile As Long\r
1144 If SFileOpenArchive(MpqFile, 0, 0, hMPQ) Then\r
1145 CopyMemory hFile, ByVal hMPQ + 268, 4\r
1146 FindMpqHeader = SFileFindMpqHeader(hFile)\r
1147 SFileCloseArchive hMPQ\r
1148 End If\r
b31da37a 1149End Function\r
1150Function GetNumMpqFiles(MpqFile As String) As Long\r
1859bb9b 1151 GetNumMpqFiles = 0\r
1152 If FileExists(MpqFile) = False Then\r
1153 Exit Function\r
1154 End If\r
1155 Dim hMPQ As Long\r
1156 If SFileOpenArchive(MpqFile, 0, 0, hMPQ) Then\r
1157 GetNumMpqFiles = SFileGetFileInfo(hMPQ, SFILE_INFO_NUM_FILES)\r
1158 SFileCloseArchive hMPQ\r
1159 End If\r
b31da37a 1160End Function\r