source: trunk/UPakFile.pas

Last change on this file was 2, checked in by chronos, 8 years ago
  • Added: TPakFile class for extraction PAK files from original game.
File size: 2.2 KB
Line 
1unit UPakFile;
2
3{$mode delphi}
4
5interface
6
7uses
8 Classes, SysUtils, Contnrs, UStreamHelper;
9
10type
11 TPakItem = class
12 Name: string;
13 Start: Integer;
14 Size: Integer;
15 end;
16
17 { TPakFile }
18
19 TPakFile = class
20 private
21 function GetOpenned: Boolean;
22 public
23 DataFile: TFileStream;
24 FileName: string;
25 Files: TObjectList;
26 procedure Open(FileName: string);
27 procedure Close;
28 procedure ExtractTo(Directory: string);
29 constructor Create;
30 destructor Destroy; override;
31 property Openned: Boolean read GetOpenned;
32 end;
33
34implementation
35
36{ TPakFile }
37
38function TPakFile.GetOpenned: Boolean;
39begin
40 Result := Assigned(DataFile);
41end;
42
43procedure TPakFile.Open(FileName: string);
44var
45 Buffer: array of Byte;
46 I: Integer;
47 NewItem: TPakItem;
48 Helper: TStreamHelper;
49begin
50 Close;
51 Self.FileName := FileName;
52 DataFile := TFileStream.Create(FileName, fmOpenRead);
53 Helper := TStreamHelper.Create(DataFile);
54
55 while Helper.Position < Helper.Size do begin
56 NewItem := TPakItem.Create;
57 NewItem.Start := Helper.ReadCardinal;
58 if NewItem.Start = 0 then begin
59 NewItem.Free;
60 TPakItem(Files.Last).Size := Datafile.Size - TPakItem(Files.Last).Start;
61 Break;
62 end;
63 NewItem.Name := Helper.ReadStringTerminated;
64 if Files.Count > 0 then
65 TPakItem(Files.Last).Size := NewItem.Start - TPakItem(Files.Last).Start;
66 Files.Add(NewItem);
67 end;
68 Helper.Free;
69end;
70
71procedure TPakFile.Close;
72begin
73 if Openned then begin
74 FreeAndNil(DataFile);
75 Files.Count := 0;
76 end;
77end;
78
79procedure TPakFile.ExtractTo(Directory: string);
80var
81 NewFile: TFileStream;
82 I: Integer;
83begin
84 for I := 0 to Files.Count - 1 do begin
85 ForceDirectories(Directory + DirectorySeparator + ExtractFileName(FileName));
86 NewFile := TFileStream.Create(Directory + DirectorySeparator + ExtractFileName(FileName) +
87 DirectorySeparator + TPakItem(Files[I]).Name, fmCreate);
88 DataFile.Position := TPakItem(Files[I]).Start;
89 NewFile.CopyFrom(DataFile, TPakItem(Files[I]).Size);
90 NewFile.Free;
91 end;
92end;
93
94constructor TPakFile.Create;
95begin
96 Files := TObjectList.Create;
97 DataFile := nil;
98 FileName := '';
99end;
100
101destructor TPakFile.Destroy;
102begin
103 Close;
104 FreeAndNil(Files);
105 inherited Destroy;
106end;
107
108end.
109
Note: See TracBrowser for help on using the repository browser.