1 |
unit SUBT; |
2 |
|
3 |
interface |
4 |
|
5 |
uses |
6 |
_FileTypes, Grids, StdCtrls, ExtCtrls; |
7 |
|
8 |
type |
9 |
TFile_SUBT = class(TResource) |
10 |
procedure SetOpened(Opened: Boolean); override; |
11 |
private |
12 |
grid: TStringGrid; |
13 |
panel: TPanel; |
14 |
save: TButton; |
15 |
procedure saveclick(Sender: TObject); |
16 |
public |
17 |
procedure InitDataFields; override; |
18 |
procedure InitEditor; override; |
19 |
end; |
20 |
|
21 |
implementation |
22 |
|
23 |
uses |
24 |
ConnectionManager, Math, Classes, TypeDefs, _DataTypes, Forms, |
25 |
Controls; |
26 |
|
27 |
procedure TFile_SUBT.InitDataFields; |
28 |
begin |
29 |
inherited; |
30 |
FDataFields := TBlock.Create(Self, nil, 'Base', '', []); |
31 |
with FDataFields do |
32 |
begin |
33 |
AddField(TResourceID, 'FileID', '', []); |
34 |
AddField(TLevelID, 'LevelID', '', []); |
35 |
AddField(TUnused, 'Unused data', '', [16]); |
36 |
|
37 |
AddField(TRawLink, 'Raw Address', '', ['SUBT']); |
38 |
|
39 |
with TArray(AddField(TArray, 'SUBT offsets array', '', [4])) do |
40 |
begin |
41 |
AddField(TInt, 'Offset', '', [4]); |
42 |
SetCount; |
43 |
end; |
44 |
end; |
45 |
FDataFields.Update(0, -1); |
46 |
|
47 |
FFileStream.Free; |
48 |
FFileStream := nil; |
49 |
end; |
50 |
|
51 |
procedure TFile_SUBT.InitEditor; |
52 |
begin |
53 |
FEditor := TFrame.Create(nil); |
54 |
grid := TStringGrid.Create(FEditor); |
55 |
grid.Align := alClient; |
56 |
grid.DefaultRowHeight := 18; |
57 |
grid.DefaultColWidth := 100; |
58 |
grid.ColCount := 2; |
59 |
grid.RowCount := 4; |
60 |
grid.FixedRows := 1; |
61 |
grid.FixedCols := 0; |
62 |
grid.ColWidths[0] := 80; |
63 |
grid.ColWidths[1] := 200; |
64 |
grid.Cells[0, 0] := 'Name'; |
65 |
grid.Cells[1, 0] := 'Content'; |
66 |
grid.Options := [goColSizing,goEditing, |
67 |
goVertLine,goHorzLine,goFixedVertLine,goFixedHorzLine]; |
68 |
grid.Parent := FEditor; |
69 |
panel := TPanel.Create(FEditor); |
70 |
panel.Align := alBottom; |
71 |
panel.Height := 30; |
72 |
panel.Parent := FEditor; |
73 |
save := TButton.Create(panel); |
74 |
save.Top := 2; |
75 |
save.Left := 2; |
76 |
save.Width := 100; |
77 |
save.Height := 26; |
78 |
save.Caption := 'Save'; |
79 |
save.OnClick := saveclick; |
80 |
save.Parent := panel; |
81 |
end; |
82 |
|
83 |
procedure TFile_SUBT.saveclick(Sender: TObject); |
84 |
var |
85 |
i,j: Integer; |
86 |
temps: String; |
87 |
fs: TFileStream; |
88 |
offset: Integer; |
89 |
begin |
90 |
fs := TFileStream.Create('C:\Spiele\Oni\GameDataFolder\tests\messages_raw_recreated.hex', fmCreate); |
91 |
|
92 |
i := grid.RowCount - 2; |
93 |
FFileStream.Seek($1C, soFromBeginning); |
94 |
FFileStream.Write(i, 4); |
95 |
FFileStream.Size := $20 + i * 4; |
96 |
|
97 |
for i := 0 to grid.RowCount - 2 do |
98 |
begin |
99 |
for j := 0 to 1 do |
100 |
begin |
101 |
if j = 0 then |
102 |
begin |
103 |
offset := fs.Size; |
104 |
FFileStream.Seek($20 + i*4, soFromBeginning); |
105 |
FFileStream.Write(offset, 4); |
106 |
end; |
107 |
temps := grid.Cells[j, i+1]; |
108 |
SetLength(temps, Length(temps)+1); |
109 |
temps[Length(temps)] := #0; |
110 |
fs.Write(temps[1], Length(temps)); |
111 |
end; |
112 |
end; |
113 |
fs.Free; |
114 |
fs := TFileStream.Create('C:\Spiele\Oni\GameDataFolder\tests\messages_dat_recreated.hex', fmCreate); |
115 |
ReCreateFile(fs); |
116 |
fs.Free; |
117 |
end; |
118 |
|
119 |
|
120 |
procedure TFile_SUBT.SetOpened(Opened: Boolean); |
121 |
var |
122 |
i,j: Integer; |
123 |
offset: Integer; |
124 |
temps: String; |
125 |
pos: Integer; |
126 |
begin |
127 |
inherited; |
128 |
if Opened then |
129 |
begin |
130 |
CacheFile; |
131 |
CacheAllRawFiles; |
132 |
|
133 |
FFileStream.Seek($1C, soFromBeginning); |
134 |
FFileStream.Read(i, 4); |
135 |
|
136 |
grid.RowCount := 1 + i; |
137 |
|
138 |
for i := 0 to grid.RowCount - 2 do |
139 |
begin |
140 |
for j := 0 to 1 do |
141 |
begin |
142 |
if j = 0 then |
143 |
begin |
144 |
FFileStream.Seek($20 + i*4, soFromBeginning); |
145 |
FFileStream.Read(offset, 4); |
146 |
FRawCaches[0].RawStream.Seek(offset, soFromBeginning); |
147 |
end; |
148 |
SetLength(temps, 200); |
149 |
pos := 0; |
150 |
repeat |
151 |
Inc(pos); |
152 |
FRawCaches[0].RawStream.Read(temps[pos], 1); |
153 |
until temps[pos] = #0; |
154 |
SetLength(temps, pos - 1); |
155 |
grid.Cells[j, i+1] := temps; |
156 |
end; |
157 |
end; |
158 |
|
159 |
end else |
160 |
begin |
161 |
Exit; |
162 |
end; |
163 |
end; |
164 |
|
165 |
end. |