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

Comparing oup/current/FileClasses/SUBT.pas (file contents):
Revision 239 by alloc, Fri Jun 29 12:38:24 2007 UTC vs.
Revision 240 by alloc, Sat Jul 14 23:12:26 2007 UTC

# Line 3 | Line 3 | unit SUBT;
3   interface
4  
5   uses
6 <  _FileTypes;
6 >  _FileTypes, Grids, StdCtrls, ExtCtrls;
7  
8   type
9    TFile_SUBT = class(TFile)
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;
# Line 15 | Line 21 | type
21   implementation
22  
23   uses
24 <  ConnectionManager, Math, Classes, TypeDefs, _DataTypes, Forms, StdCtrls, Grids;
24 >  ConnectionManager, Math, Classes, TypeDefs, _DataTypes, Forms,
25 >  Controls;
26  
27   procedure TFile_SUBT.InitDataFields;
21 var
22  tempi: Integer;
28   begin
29    inherited;
30 <  FDataFields := TBlock.Create(Self, nil, 0, 'Base', '', nil);
30 >  FDataFields := TBlock.Create(Self, nil, 'Base', '', []);
31    with FDataFields do
32    begin
33 <    AddField(TFileID, $00, 'FileID', '', nil);
34 <
35 <    AddField(TLevelID, $04, 'LevelID', '', nil);
33 >    AddField(TFileID, 'FileID', '', []);
34 >    AddField(TLevelID, 'LevelID', '', []);
35 >    AddField(TUnused, 'Unused data', '', [16]);
36  
37 <    tempi := 16;
33 <    AddField(TUnused, $08, 'Unused data', '', @tempi);
37 >    AddField(TRawLink, 'Raw Address', '', []);
38  
39 <    AddField(TRawLink, $18, 'Raw Address', '', nil);
36 <
37 <    tempi := 4;
38 <    with AddField(TArray, $1C, 'SUBT offsets array', '', @tempi) do
39 >    with TArray(AddField(TArray, 'SUBT offsets array', '', [4])) do
40      begin
41 <      tempi := 4;
42 <      AddField(TInt, $00, 'Offset', '', @tempi);
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  
48
51   procedure TFile_SUBT.InitEditor;
50 var
51  grid: TStringGrid;
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 +    CacheRawFile($18);
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].Seek(offset, soFromBeginning);
147 +        end;
148 +        SetLength(temps, 200);
149 +        pos := 0;
150 +        repeat
151 +          Inc(pos);
152 +          FRawCaches[0].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.

Diff Legend

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