📄 unit1.pas
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, Buttons;
type
TForm1 = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
TabSheet3: TTabSheet;
ListView1: TListView;
Label1: TLabel;
Edit1: TEdit;
SpeedButton1: TSpeedButton;
Button1: TButton;
OpenDialog1: TOpenDialog;
ListView2: TListView;
Label2: TLabel;
Edit2: TEdit;
SpeedButton2: TSpeedButton;
Button2: TButton;
OpenDialog2: TOpenDialog;
OpenDialog3: TOpenDialog;
ListView3: TListView;
Label3: TLabel;
Edit3: TEdit;
SpeedButton3: TSpeedButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
procedure SpeedButton1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure SpeedButton3Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if OpenDialog1.Execute then Edit1.Text := OpenDialog1.FileName;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
fs: TFileStream;
ObjectId: DWORD;
ObjectName: string;
ObjectDesc: string;
Address: Integer;
Data: array[0..99] of Byte;
begin
ListView1.Items.Clear;
fs := TFileStream.Create(Edit1.Text, fmOpenRead);
Address := $00000008;
while(Address < $00004448) do
begin
fs.Seek(Address, soFromBeginning);
fs.Read(Data, 4);
ObjectId := Data[3] shl 24 + Data[2] shl 16 + Data[1] shl 8 + Data[0];
fs.Seek(Address + $00A0, soFromBeginning);
fs.Read(Data, 100);
ObjectDesc := Copy(WideCharToString(@(Data[0])),1, 100);
fs.Seek(Address + $04A0, soFromBeginning);
fs.Read(Data, 100);
ObjectName := Copy(WideCharToString(@(Data[0])),1, 100);
with ListView1.Items.Add do
begin
Caption := IntToHex(Address, 8);
SubItems.Add(IntToHex(ObjectId, 8));
SubItems.Add(ObjectName);
end;
Address := Address + $04E0
end;
fs.Free;
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
if OpenDialog2.Execute then Edit2.Text := OpenDialog2.FileName;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
fs: TFileStream;
DataSize: DWORD;
DataCount: DWORD;
ObjectId: DWORD;
ObjectName: string;
i, j, n: Integer;
Address: Integer;
Data: array[0..10240] of Byte;
begin
ListView2.Items.Clear;
fs := TFileStream.Create(Edit2.Text, fmOpenRead);
N := 0;
Address := $00000008;
while(N < 87) do
begin
fs.Seek(Address, soFromBeginning);
fs.Read(Data, 4);
Address := Address + 4;
DataSize := Data[3] shl 24 + Data[2] shl 16 + Data[1] shl 8 + Data[0];
fs.Read(Data, 4);
Address := Address + 4;
DataCount := Data[3] shl 24 + Data[2] shl 16 + Data[1] shl 8 + Data[0];
for i := 0 to DataCount - 1 do
begin
fs.Seek(Address, soFromBeginning);
fs.Read(Data, 4);
ObjectId := Data[3] shl 24 + Data[2] shl 16 + Data[1] shl 8 + Data[0];
fs.Read(Data, DataSize - 4);
j := 0;
case N of
3, 7, 10, 40, 60: j := 8;
19, 21, 36, 48: j := 4;
end;
ObjectName := Copy(WideCharToString(@(Data[j])),1, DataSize - 4 - j);
with ListView2.Items.Add do
begin
Caption := IntToHex(Address, 8);
SubItems.Add(IntToHex(ObjectId, 8));
SubItems.Add(ObjectName);
end;
Address := Address + DataSize;
if Address = $0025F4CC then Address := Address + $69;
end;
Inc(N);
end;
fs.Free;
end;
procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
if OpenDialog3.Execute then Edit3.Text := OpenDialog3.FileName;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
fs: TFileStream;
TaskAddr: DWORD;
TaskId: DWORD;
TaskName: string;
Address: Integer;
Data: array[0..29] of Byte;
begin
ListView3.Items.Clear;
fs := TFileStream.Create(Edit3.Text, fmOpenRead);
Address := $00000010;
while(Address < $00001584) do
begin
fs.Seek(Address, soFromBeginning);
fs.Read(Data, 4);
TaskAddr := Data[3] shl 24 + Data[2] shl 16 + Data[1] shl 8 + Data[0];
fs.Seek(TaskAddr, soFromBeginning);
fs.Read(Data, 4);
TaskId := Data[3] shl 24 + Data[2] shl 16 + Data[1] shl 8 + Data[0];
fs.Seek(TaskAddr + 4, soFromBeginning);
fs.Read(Data, 30);
TaskName := Copy(WideCharToString(@(Data[0])),1, 30);
with ListView3.Items.Add do
begin
Caption := IntToHex(TaskAddr, 8);
SubItems.Add(IntToHex(TaskId, 8));
SubItems.Add(TaskName);
end;
Address := Address + $04
end;
fs.Free;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
i: Integer;
f: TStrings;
begin
f := TStringList.Create;
for i:= 0 to ListView2.Items.Count - 1 do
f.Add(ListView2.Items[i].Caption + ' ' + ListView2.Items[i].SubItems.Strings[0] + ' ' + ListView2.Items[i].SubItems.Strings[1]);
f.SaveToFile(ExtractFilePath(Edit2.Text) + '\elements.txt');
f.Free;
end;
procedure TForm1.Button5Click(Sender: TObject);
var
i: Integer;
f: TStrings;
begin
f := TStringList.Create;
for i:= 0 to ListView3.Items.Count - 1 do
f.Add(ListView3.Items[i].Caption + ' ' + ListView3.Items[i].SubItems.Strings[0] + ' ' + ListView3.Items[i].SubItems.Strings[1]);
f.SaveToFile(ExtractFilePath(Edit3.Text) + '\tasks.txt');
f.Free;
end;
procedure TForm1.Button6Click(Sender: TObject);
var
i: Integer;
f: TStrings;
begin
f := TStringList.Create;
for i:= 0 to ListView1.Items.Count - 1 do
f.Add(ListView1.Items[i].Caption + ' ' + ListView1.Items[i].SubItems.Strings[0] + ' ' + ListView1.Items[i].SubItems.Strings[1]);
f.SaveToFile(ExtractFilePath(Edit1.Text) + '\gshop.txt');
f.Free;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -