ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/oup/current/FileClasses/BINA.pas
(Generate patch)

Comparing oup/current/FileClasses/BINA.pas (file contents):
Revision 244 by alloc, Fri Jun 29 12:38:24 2007 UTC vs.
Revision 245 by alloc, Sat Aug 18 15:51:42 2007 UTC

# Line 3 | Line 3 | unit BINA;
3   interface
4  
5   uses
6 <  _FileTypes;
6 >  _FileTypes, Grids;
7  
8   type
9    TFile_BINA = class(TFile)
10 +      procedure SetOpened(Opened: Boolean); override;
11 +    private
12 +      maintype: String;
13 +      subtype: String;
14 +      grid: TStringGrid;
15 + (*      panel: TPanel;
16 +      save: TButton; *)
17 +      procedure saveclick(Sender: TObject);
18      public
19        procedure InitDataFields; override;
20 +      procedure InitEditor; override;
21    end;
22  
23   implementation
24  
25   uses
26 <  ConnectionManager, Math, Classes, TypeDefs, _DataTypes, Forms, StdCtrls;
26 >  ConnectionManager, Math, Classes, TypeDefs, _DataTypes, Forms, StdCtrls,
27 >  Controls, StrUtils, Functions, SysUtils;
28  
29   procedure TFile_BINA.InitDataFields;
20 var
21  tempi: Integer;
30   begin
31    inherited;
32 <  FDataFields := TBlock.Create(Self, nil, 0, 'Base', '', nil);
32 >  FDataFields := TBlock.Create(Self, nil, 'Base', '', []);
33    with FDataFields do
34    begin
35 <    AddField(TFileID, $00, 'FileID', '', nil);
36 <    AddField(TLevelID, $04, 'LevelID', '', nil);
35 >    AddField(TFileID, 'FileID', '', []);
36 >    AddField(TLevelID, 'LevelID', '', []);
37 >
38 >    AddField(TInt, 'RawSize', 'Size of the part in the raw file', [4]);
39 >    AddField(TRawLink, 'RawOffset', 'At this position starts the part in the raw/sep file', []);
40 >
41 >    AddField(TUnused, 'Not used', '', [16]);
42    end;
43 +  FDataFields.Update(0, -1);
44    FFileStream.Free;
45    FFileStream := nil;
46   end;
47  
48 + procedure TFile_BINA.InitEditor;
49 + var
50 +  subsize: Integer;
51 + begin
52 +  CacheAllRawFiles;
53 +  SetLength(maintype, 4);
54 +  FRawCaches[0].RawStream.Read(maintype[1], 4);
55 +  maintype := ReverseString(maintype);
56 +  if maintype = 'OBJC' then
57 +  begin
58 +    FRawCaches[0].RawStream.Seek($0C, soFromBeginning);
59 +    FRawCaches[0].RawStream.Read(subsize, 4);
60 +    if subsize > 0 then
61 +    begin
62 +      SetLength(subtype, 4);
63 +      FRawCaches[0].RawStream.Seek($10, soFromBeginning);
64 +      FRawCaches[0].RawStream.Read(subtype[1], 4);
65 +      subtype := ReverseString(subtype);
66 +      if subtype = 'CHAR' then
67 +      begin
68 +      end
69 +      else if subtype = 'CMBT' then
70 +      begin
71 +      end
72 +      else if subtype = 'CONS' then
73 +      begin
74 +      end
75 +      else if subtype = 'DOOR' then
76 +      begin
77 +      end
78 +      else if subtype = 'FLAG' then
79 +      begin
80 +      end
81 +      else if subtype = 'FURN' then
82 +      begin
83 +      end
84 +      else if subtype = 'MELE' then
85 +      begin
86 +      end
87 +      else if subtype = 'NEUT' then
88 +      begin
89 +      end
90 +      else if subtype = 'PART' then
91 +      begin
92 +      end
93 +      else if subtype = 'PATR' then
94 +      begin
95 +      end
96 +      else if subtype = 'PWRU' then
97 +      begin
98 +      end
99 +      else if subtype = 'SNDG' then
100 +      begin
101 +      end
102 +      else if subtype = 'TRGV' then
103 +      begin
104 +        FEditor := TFrame.Create(nil);
105 +        grid := TStringGrid.Create(FEditor);
106 +        grid.Align := alClient;
107 +        grid.DefaultRowHeight := 18;
108 +        grid.DefaultColWidth := 100;
109 +        grid.ColCount := 8;
110 +        grid.RowCount := 2;
111 +        grid.FixedRows := 1;
112 +        grid.FixedCols := 0;
113 +        grid.ColWidths[0] := 150;
114 +        grid.ColWidths[1] := 125;
115 +        grid.ColWidths[2] := 125;
116 +        grid.ColWidths[3] := 125;
117 +        grid.Cells[0, 0] := 'TrgName';
118 +        grid.Cells[1, 0] := 'FuncName Enter';
119 +        grid.Cells[2, 0] := 'FuncName Inside';
120 +        grid.Cells[3, 0] := 'FuncName Leave';
121 +        grid.Cells[4, 0] := 'Teams';
122 +        grid.Cells[5, 0] := 'Settings';
123 +        grid.Cells[6, 0] := 'X, Y, Z';
124 +        grid.Cells[7, 0] := 'Size X, Y, Z';
125 +        grid.Options := [goColSizing,goEditing,
126 +            goVertLine,goHorzLine,goFixedVertLine,goFixedHorzLine];
127 +        grid.Parent := FEditor;
128 +      end
129 +      else if subtype = 'TRIG' then
130 +      begin
131 +      end
132 +      else if subtype = 'TURR' then
133 +      begin
134 +      end
135 +      else if subtype = 'WEAP' then
136 +      begin
137 +      end;
138 +    end;
139 +  end
140 +  else if maintype = 'ONIE' then
141 +  begin
142 +  end
143 +  else if maintype = 'PAR3' then
144 +  begin
145 +  end
146 +  else if maintype = 'SABD' then
147 +  begin
148 +  end
149 +  else if maintype = 'TMBD' then
150 +  begin
151 +  end;
152 +
153 +  DiscardAllRawCaches;
154 +
155 + (*
156 +  panel := TPanel.Create(FEditor);
157 +  panel.Align := alBottom;
158 +  panel.Height := 30;
159 +  panel.Parent := FEditor;
160 +  save := TButton.Create(panel);
161 +  save.Top := 2;
162 +  save.Left := 2;
163 +  save.Width := 100;
164 +  save.Height := 26;
165 +  save.Caption := 'Save';
166 +  save.OnClick := saveclick;
167 +  save.Parent := panel;    *)
168 + end;
169 +
170 + procedure TFile_BINA.saveclick(Sender: TObject);
171 + var
172 +  i,j: Integer;
173 +  temps: String;
174 +  fs: TFileStream;
175 +  offset: Integer;
176 + begin
177 + (*  fs := TFileStream.Create('C:\Spiele\Oni\GameDataFolder\tests\messages_raw_recreated.hex', fmCreate);
178 +
179 +  i := grid.RowCount - 2;
180 +  FFileStream.Seek($1C, soFromBeginning);
181 +  FFileStream.Write(i, 4);
182 +  FFileStream.Size := $20 + i * 4;
183 +  
184 +  for i := 0 to grid.RowCount - 2 do
185 +  begin
186 +    for j := 0 to 1 do
187 +    begin
188 +      if j = 0 then
189 +      begin
190 +        offset := fs.Size;
191 +        FFileStream.Seek($20 + i*4, soFromBeginning);
192 +        FFileStream.Write(offset, 4);
193 +      end;
194 +      temps := grid.Cells[j, i+1];
195 +      SetLength(temps, Length(temps)+1);
196 +      temps[Length(temps)] := #0;
197 +      fs.Write(temps[1], Length(temps));
198 +    end;
199 +  end;
200 +  fs.Free;
201 +  fs := TFileStream.Create('C:\Spiele\Oni\GameDataFolder\tests\messages_dat_recreated.hex', fmCreate);
202 +  ReCreateFile(fs);
203 +  fs.Free;
204 + *)end;
205 +
206 +
207 + procedure TFile_BINA.SetOpened(Opened: Boolean);
208 + var
209 +  i: Integer;
210 +  cursize: Integer;
211 +  curoffset: Integer;
212 +  raw: TMemoryStream;
213 +  tempi: Integer;
214 +  temps: String;
215 +  j: Integer;
216 +  tempf: Single;
217 + begin
218 +  inherited;
219 +  if Opened then
220 +  begin
221 +    CacheAllRawFiles;
222 +    raw := FRawCaches[0].RawStream;
223 +
224 +    if maintype = 'OBJC' then
225 +    begin
226 +      if subtype = 'TRGV' then
227 +      begin
228 +        i := 0;
229 +        curoffset := $0C;
230 +        raw.Seek(curoffset, soFromBeginning);
231 +        raw.Read(cursize, 4);
232 +
233 +        while cursize > 0 do
234 +        begin
235 +          Inc(i);
236 +          grid.RowCount := 1 + i;
237 +          grid.Cells[0, i] := ReadString(raw, curoffset + 4 + $24);
238 +          grid.Cells[1, i] := ReadString(raw, curoffset + 4 + $63);
239 +          grid.Cells[2, i] := ReadString(raw, curoffset + 4 + $83);
240 +          grid.Cells[3, i] := ReadString(raw, curoffset + 4 + $A3);
241 +
242 +          raw.Seek(curoffset + 4 + $C3, soFromBeginning);
243 +          tempi := 0;
244 +          raw.Read(tempi, 1);
245 +          if tempi > 0 then
246 +          begin
247 +            temps := '';
248 +            for j := 0 to 7 do
249 +            begin
250 +              if tempi and (1 shl j) > 0 then
251 +              begin
252 +                if Length(temps) > 0 then
253 +                  temps := temps + ', ' + IntToStr(1 shl j)
254 +                else
255 +                  temps := IntToStr(1 shl j);
256 +              end;
257 +            end;
258 +          end
259 +          else
260 +            temps := '0';
261 +          grid.Cells[4, i] := temps;
262 +
263 +          raw.Seek(curoffset + 4 + $15C, soFromBeginning);
264 +          tempi := 0;
265 +          raw.Read(tempi, 1);
266 +          if tempi > 0 then
267 +          begin
268 +            temps := '';
269 +            for j := 0 to 7 do
270 +            begin
271 +              if tempi and (1 shl j) > 0 then
272 +              begin
273 +                if Length(temps) > 0 then
274 +                  temps := temps + ', ' + IntToStr(1 shl j)
275 +                else
276 +                  temps := IntToStr(1 shl j);
277 +              end;
278 +            end;
279 +          end
280 +          else
281 +            temps := '0';
282 +          grid.Cells[5, i] := temps;
283 +
284 +          raw.Seek(curoffset + 4 + $0C, soFromBeginning);
285 +          raw.Read(tempf, 4);
286 +          temps := FormatFloat('#0', tempf);
287 +          raw.Seek(curoffset + 4 + $10, soFromBeginning);
288 +          raw.Read(tempf, 4);
289 +          temps := temps + ', ' + FormatFloat('#0', tempf);
290 +          raw.Seek(curoffset + 4 + $14, soFromBeginning);
291 +          raw.Read(tempf, 4);
292 +          temps := temps + ', ' + FormatFloat('#0', tempf);
293 +          grid.Cells[6, i] := temps;
294 +
295 +          raw.Seek(curoffset + 4 + $C7, soFromBeginning);
296 +          raw.Read(tempf, 4);
297 +          temps := FormatFloat('#0', tempf);
298 +          raw.Seek(curoffset + 4 + $CB, soFromBeginning);
299 +          raw.Read(tempf, 4);
300 +          temps := temps + ', ' + FormatFloat('#0', tempf);
301 +          raw.Seek(curoffset + 4 + $CF, soFromBeginning);
302 +          raw.Read(tempf, 4);
303 +          temps := temps + ', ' + FormatFloat('#0', tempf);
304 +          grid.Cells[7, i] := temps;
305 +
306 +          curoffset := curoffset + cursize + 4;
307 +          raw.Seek(curoffset, soFromBeginning);
308 +          raw.Read(cursize, 4);
309 +        end;
310 +      end;
311 +    end;
312 +  end else
313 +  begin
314 +    Exit;
315 +  end;
316 + end;
317  
318   end.

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)