| 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. |