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