cheat-engine/formMemoryModifier.pas
cheatengine@gmail.com 4d297adfd2
2011-07-04 19:52:19 +00:00

975 lines
31 KiB
ObjectPascal

unit formMemoryModifier;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus, ExtDlgs, ComCtrls, Buttons, ExtCtrls,shellapi,tlhelp32,
cefuncproc,ExtraTrainerComponents, jpeg, KIcon;
const trainerversion=8;
type TcodeEntry = record
address: dword;
modulename: string;
moduleoffset: dword;
originalopcode: array of byte;
end;
type TAddressEntry = record
address: dword;
interpretableaddress: string;
ispointer: boolean;
pointers: array of TCEPointer;
bit: byte;
memtyp: integer;
frozen: boolean;
frozendirection: byte;
setvalue: boolean;
userinput: boolean;
value: string;
autoassemblescript: string;
end;
type Ttrainerdata = record
description: string;
hotkeytext: string;
hotkey: TKeyCombo;
hasedit: boolean;
editvalue: string;
codeentrys: array of TCodeEntry;
addressentrys: array of TAddressEntry;
end;
type
TfrmMemoryModifier = class(TForm)
Button1: TButton;
Button2: TButton;
lblWidthHeight: TLabel;
OpenPictureDialog1: TOpenPictureDialog;
SaveDialog1: TSaveDialog;
Panel1: TPanel;
Label1: TLabel;
spbUp: TSpeedButton;
spbDown: TSpeedButton;
recordview: TListView;
PopupMenu1: TPopupMenu;
Delete1: TMenuItem;
OpenDialog1: TOpenDialog;
Button3: TButton;
Icon: TImage;
Label4: TLabel;
Button5: TButton;
editTitle: TEdit;
OpenDialog2: TOpenDialog;
Edit2: TEdit;
Label2: TLabel;
ComboBox1: TComboBox;
Label3: TLabel;
LoadButton: TSpeedButton;
Button4: TButton;
Button6: TButton;
OpenDialog3: TOpenDialog;
CheckBox1: TCheckBox;
EditHotkey: TEdit;
Button7: TButton;
CheckBox2: TCheckBox;
Memo1: TMemo;
editFreezeInterval: TEdit;
Label5: TLabel;
Label6: TLabel;
cbPreventReopening: TCheckBox;
Button8: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure recordviewClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure editTitleChange(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure spbUpClick(Sender: TObject);
procedure spbDownClick(Sender: TObject);
procedure LoadButtonClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Edit2Change(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure EditHotkeyKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure CheckBox1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure EditHotkeyKeyPress(Sender: TObject; var Key: Char);
procedure recordviewDblClick(Sender: TObject);
procedure Button8Click(Sender: TObject);
private
{ Private declarations }
procedure changeicon(filename: string);
public
{ Public declarations }
currentIcon: TKIcon;
trainerdata: array of TTrainerdata;
changed: boolean;
popuphotkey: tkeycombo;
dontshowdefault:boolean;
leftimage: tmemorystream;
leftimageext: string;
end;
var
frmMemoryModifier: TfrmMemoryModifier;
implementation
uses formMemoryTrainerUnit, formMemoryTrainerAddEntry, MainUnit,
MemoryTrainerDesignUnit;
{$R *.dfm}
procedure TfrmMemoryModifier.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
action:=cafree;
frmMemoryModifier:=nil;
frmMemoryTrainerPreview.Close;
frmMemoryTrainerPreview.free;
frmMemoryTrainerPreview:=nil;
currentIcon.free;
end;
procedure TfrmMemoryModifier.Button2Click(Sender: TObject);
begin
if openpicturedialog1.execute then
begin
frmMemorytrainerpreview.Image1.Picture.LoadFromFile(openpicturedialog1.filename);
//no error
if leftimage=nil then
freeandnil(leftimage);
leftimage:=tmemorystream.create;
leftimage.loadfromfile(openpicturedialog1.filename);
leftimageext:=ExtractFileExt(openpicturedialog1.filename);
changed:=true;
end;
end;
procedure TfrmMemoryModifier.Button4Click(Sender: TObject);
begin
FrmMemoryTrainerAddEntry:=tFrmMemoryTrainerAddEntry.create(self);
FrmMemoryTrainerAddEntry.showmodal;
frmMemoryTrainerPreview.UpdateScreen;
if frmTrainerDesigner<>nil then
frmTrainerDesigner.UpdateCheats;
end;
procedure TfrmMemoryModifier.changeicon(filename: string);
var resh: thandle;
s: tmemorystream;
tid: TIconData;
begin
resh:=BeginUpdateResource(pchar(filename),false);
if (resh<>0) then
begin
try
// icon.p
s:=tmemorystream.Create;
try
//writeicon2(s, icon.Picture.Icon.Handle, false);
CurrentIcon.SaveToStream(s);
if not updateResource(resh,pchar(RT_ICON),pchar(1),1033, pointer(dword(s.Memory)+(s.size-CurrentIcon.IconData[0].BytesInRes)), s.size-(s.size-CurrentIcon.IconData[0].BytesInRes)) then
showmessage('Error changing the icon');
finally
s.Free;
end;
finally
EndUpdateResource(resh,false);
end;
end;
end;
procedure TfrmMemoryModifier.recordviewClick(Sender: TObject);
begin
if recordview.ItemIndex<>-1 then
begin
spbUp.Enabled:=recordview.itemindex>0;
spbDown.enabled:=recordview.itemindex<(recordview.Items.Count-1);
end
else
begin
spbUp.Enabled:=false;
spbDown.enabled:=false;
end;
end;
procedure TfrmMemoryModifier.Button1Click(Sender: TObject);
var res: TResourceStream;
trainer,iconstream,imagestream: TMemorystream;
searcher: ^char;
scanstring: string;
i,j,k,l: integer;
iconbuf,x: pchar;
temp: dword;
tempi: integer;
tempb: boolean;
temps: string;
protect: boolean;
iconsize: integer;
begin
protect:=cbPreventReopening.checked;
if combobox1.Text='' then raise exception.Create('At least fill in a processname');
if savedialog1.execute then
begin
//exctract exe
res:=TResourceStream.Create(hinstance,'TRAINER','CEINCEXE');
trainer:=TMemorystream.Create;
res.SaveToFile(savedialog1.FileName);
res.free;
//change the icon
changeicon(savedialog1.FileName);
//load back in memory
trainer.LoadFromFile(savedialog1.FileName);
temp:=trainer.Size;
trainer.position:=80;
trainer.Writebuffer(temp,4);
//write the trainerdata to the end of the file
trainer.position:=trainer.size;
if protect then
temp:=$22322
else
temp:=$22222; //kind of trainer
trainer.WriteBuffer(temp,4);
temp:=trainerversion;
trainer.WriteBuffer(temp,4);
temp:=length(trainerdata); //point to start of trainerdata
trainer.WriteBuffer(temp,4);
for i:=0 to length(trainerdata)-1 do
begin
temp:=length(trainerdata[i].description);
trainer.WriteBuffer(temp,4);
x:=pchar(trainerdata[i].description);
trainer.WriteBuffer(pointer(x)^,temp);
temp:=length(trainerdata[i].hotkeytext);
trainer.WriteBuffer(temp,4);
x:=pchar(trainerdata[i].hotkeytext);
trainer.WriteBuffer(pointer(x)^,temp);
trainer.WriteBuffer(trainerdata[i].hotkey,sizeof(trainerdata[i].hotkey));
temp:=length(Trainerdata[i].codeEntrys);
trainer.WriteBuffer(temp,4);
for j:=0 to length(trainerdata[i].codeentrys)-1 do
begin
//address
temp:=trainerdata[i].codeentrys[j].address;
if protect then temp:=temp xor $11221122;
trainer.WriteBuffer(temp,4);
//modulename
temp:=length(trainerdata[i].codeentrys[j].modulename);
trainer.WriteBuffer(temp,4);
x:=pchar(trainerdata[i].codeentrys[j].modulename);
trainer.WriteBuffer(pointer(x)^,temp);
temp:=trainerdata[i].codeentrys[j].moduleoffset;
if protect then temp:=temp xor $22112211;
trainer.WriteBuffer(temp,4);
//original opcode
temp:=length(trainerdata[i].codeentrys[j].originalopcode);
trainer.WriteBuffer(temp,4);
trainer.WriteBuffer(pointer(trainerdata[i].codeentrys[j].originalopcode)^,temp);
end;
temp:=length(Trainerdata[i].addressentrys);
trainer.WriteBuffer(temp,4);
for j:=0 to length(trainerdata[i].addressentrys)-1 do
begin
temp:=trainerdata[i].addressentrys[j].address;
if protect then temp:=temp xor $dead1337;
trainer.WriteBuffer(temp,sizeof(trainerdata[i].addressentrys[j].address));
//interpretableaddress
temp:=length(trainerdata[i].addressentrys[j].interpretableaddress);
trainer.writebuffer(temp,sizeof(temps));
temps:=trainerdata[i].addressentrys[j].interpretableaddress;
if protect then //encrypt temps
for k:=1 to length(temps) do
temps[k]:=chr(ord(temps[k]) xor (k+1));
trainer.writebuffer(temps[1],temp);
trainer.WriteBuffer(trainerdata[i].addressentrys[j].ispointer,sizeof(trainerdata[i].addressentrys[j].ispointer));
tempi:=length(trainerdata[i].addressentrys[j].pointers);
trainer.WriteBuffer(tempi,4);
for k:=0 to tempi-1 do
begin
trainer.WriteBuffer(trainerdata[i].addressentrys[j].pointers[k].address,sizeof(trainerdata[i].addressentrys[j].pointers[k].address));
//interpretableaddress for pointer
temp:=length(trainerdata[i].addressentrys[j].pointers[k].Interpretableaddress);
trainer.writebuffer(temp,sizeof(temps));
temps:=trainerdata[i].addressentrys[j].pointers[k].Interpretableaddress;
if protect then //encrypt temps
for l:=1 to length(temps) do
temps[l]:=chr(ord(temps[l]) xor (l+2));
trainer.writebuffer(temps[1],temp);
trainer.WriteBuffer(trainerdata[i].addressentrys[j].pointers[k].offset,sizeof(trainerdata[i].addressentrys[j].pointers[k].offset));
end;
trainer.WriteBuffer(trainerdata[i].addressentrys[j].bit,sizeof(trainerdata[i].addressentrys[j].bit));
trainer.WriteBuffer(trainerdata[i].addressentrys[j].memtyp,sizeof(trainerdata[i].addressentrys[j].memtyp));
trainer.writebuffer(trainerdata[i].addressentrys[j].frozen,sizeof(trainerdata[i].addressentrys[j].frozen));
trainer.writebuffer(trainerdata[i].addressentrys[j].frozendirection,sizeof(trainerdata[i].addressentrys[j].frozendirection));
trainer.writebuffer(trainerdata[i].addressentrys[j].setvalue,sizeof(trainerdata[i].addressentrys[j].setvalue));
trainer.WriteBuffer(trainerdata[i].addressentrys[j].userinput,sizeof(trainerdata[i].addressentrys[j].userinput));
temp:=length(trainerdata[i].addressentrys[j].value);
trainer.writebuffer(temp,4);
trainer.writebuffer(trainerdata[i].addressentrys[j].value[1],temp);
temp:=length(trainerdata[i].addressentrys[j].autoassemblescript);
trainer.writebuffer(temp,sizeof(temp));
temps:=trainerdata[i].addressentrys[j].autoassemblescript;
if protect then //encrypt temps
for k:=1 to length(temps) do
temps[k]:=chr(ord(temps[k]) xor k);
trainer.writebuffer(temps[1],temp);
end;
end;
//title
temp:=length(editTitle.text);
trainer.writebuffer(temp,4);
temps:=edittitle.text;
if protect then
begin
for i:=1 to temp do
temps[i]:=chr(ord(temps[i]) xor 56);
end;
x:=pchar(temps);
trainer.writebuffer(pointer(x)^,temp);
//launch filename
temp:=length(edit2.text);
trainer.writebuffer(temp,4);
x:=pchar(edit2.text);
trainer.writebuffer(pointer(x)^,temp);
//autolaunch
tempb:=checkbox2.checked;
trainer.writebuffer(tempb,sizeof(tempb));
//popup on keypress
tempb:=checkbox1.Checked;
trainer.writebuffer(tempb,sizeof(tempb));
//process to modify
temp:=length(combobox1.text);
trainer.writebuffer(temp,4);
x:=pchar(combobox1.text);
trainer.writebuffer(pointer(x)^,temp);
//hotkeytext
temp:=length(edithotkey.text);
trainer.writebuffer(temp,4);
x:=pchar(edithotkey.text);
trainer.writebuffer(pointer(x)^,temp);
//hotkey
trainer.WriteBuffer(popuphotkey,sizeof(popuphotkey));
//aboutbox
temp:=length(memo1.text);
trainer.writebuffer(temp,4);
temps:=memo1.Text;
if protect then
begin
for i:=1 to temp do
temps[i]:=chr(ord(temps[i]) xor 166);
end;
x:=pchar(temps);
trainer.writebuffer(pointer(x)^,temp);
//freeze interval
tempi:=strtoint(editfreezeinterval.text);
trainer.WriteBuffer(tempi,sizeof(tempi));
if frmTrainerDesigner=nil then
begin
//default uid
temp:=$666;
trainer.WriteBuffer(temp,4);
//leftside image
//size of extension
temp:=length(leftimageext);
trainer.WriteBuffer(temp,4);
trainer.WriteBuffer(leftimageext[1],temp);
if leftimage<>nil then
temp:=leftimage.Size
else
temp:=0;
trainer.WriteBuffer(temp,4);
if leftimage<>nil then
leftimage.SaveToStream(trainer);
//windowwidth
trainer.writebuffer(frmMemorytrainerpreview.Width,sizeof(frmMemorytrainerpreview.Width));
//windowheight
trainer.writebuffer(frmMemorytrainerpreview.height,sizeof(frmMemorytrainerpreview.height));
//leftsidewidth
trainer.writebuffer(frmMemorytrainerpreview.Panel1.Width,sizeof(frmMemorytrainerpreview.Panel1.Width));
//leftsideheight
trainer.writebuffer(frmMemorytrainerpreview.Panel1.height,sizeof(frmMemorytrainerpreview.Panel1.height));
end
else
begin
//user defined UID
temp:=$777;
trainer.WriteBuffer(temp,4);
//windowwidth
trainer.writebuffer(frmTrainerDesigner.Width,sizeof(frmTrainerDesigner.Width));
//windowheight
trainer.writebuffer(frmTrainerDesigner.height,sizeof(frmTrainerDesigner.height));
//note:make this oop
for i:=0 to frmtrainerdesigner.ComponentCount-1 do
begin
if (frmtrainerdesigner.Components[i] is tbutton2) then
begin
temp:=0; //tbutton
trainer.WriteBuffer(temp,4);
trainer.WriteBuffer(tbutton2(frmtrainerdesigner.Components[i]).left,sizeof(integer));
trainer.WriteBuffer(tbutton2(frmtrainerdesigner.Components[i]).top,sizeof(integer));
trainer.WriteBuffer(tbutton2(frmtrainerdesigner.Components[i]).width,sizeof(integer));
trainer.WriteBuffer(tbutton2(frmtrainerdesigner.Components[i]).height,sizeof(integer));
//caption
temp:=length(tbutton2(frmtrainerdesigner.Components[i]).Caption);
trainer.writebuffer(temp,4);
x:=pchar(tbutton2(frmtrainerdesigner.Components[i]).Caption);
trainer.writebuffer(pointer(x)^,temp);
trainer.WriteBuffer(tbutton2(frmtrainerdesigner.Components[i]).wordwrap,sizeof(boolean));
//onclick
temp:=tbutton2(frmtrainerdesigner.Components[i]).Tag;
trainer.WriteBuffer(temp,4);
//command
temp:=length(tbutton2(frmtrainerdesigner.Components[i]).Command);
trainer.writebuffer(temp,4);
x:=pchar(tbutton2(frmtrainerdesigner.Components[i]).Command);
trainer.writebuffer(pointer(x)^,temp);
end;
if (frmtrainerdesigner.Components[i] is tcheatlist) then
begin
temp:=1; //tcheatlist
trainer.WriteBuffer(temp,4);
trainer.WriteBuffer(tcheatlist(frmtrainerdesigner.Components[i]).left,sizeof(integer));
trainer.WriteBuffer(tcheatlist(frmtrainerdesigner.Components[i]).top,sizeof(integer));
trainer.WriteBuffer(tcheatlist(frmtrainerdesigner.Components[i]).width,sizeof(integer));
trainer.WriteBuffer(tcheatlist(frmtrainerdesigner.Components[i]).height,sizeof(integer));
trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).activationcolor,sizeof(tcolor));
trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).color,sizeof(tcolor));
trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).textcolor,sizeof(tcolor));
trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).hotkeyleft,sizeof(integer));
trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).descriptionleft,sizeof(integer));
trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).editleft,sizeof(integer));
trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).editwidth,sizeof(integer));
trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).BevelInner,sizeof(Tbevelcut));
trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).BevelOuter,sizeof(Tbevelcut));
trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).BevelWidth,sizeof(integer));
trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).bevelkind,sizeof(tbevelkind));
trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).HasCheckbox,sizeof(boolean));
trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).beepOnActivate,sizeof(boolean));
trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).ShowHotkeys,sizeof(boolean));
end;
if (frmtrainerdesigner.Components[i] is tcheat) then
begin
temp:=2; //tcheat
trainer.WriteBuffer(temp,4);
trainer.WriteBuffer(tcheat(frmtrainerdesigner.Components[i]).left,sizeof(integer));
trainer.WriteBuffer(tcheat(frmtrainerdesigner.Components[i]).top,sizeof(integer));
trainer.WriteBuffer(tcheat(frmtrainerdesigner.Components[i]).width,sizeof(integer));
trainer.WriteBuffer(tcheat(frmtrainerdesigner.Components[i]).height,sizeof(integer));
trainer.WriteBuffer(tcheat(frmtrainerdesigner.Components[i]).cheatnr,sizeof(integer));
trainer.Writebuffer(tcheat(frmtrainerdesigner.Components[i]).activationcolor,sizeof(tcolor));
trainer.Writebuffer(tcheat(frmtrainerdesigner.Components[i]).color,sizeof(tcolor));
trainer.Writebuffer(tcheat(frmtrainerdesigner.Components[i]).textcolor,sizeof(tcolor));
temp:=tcheat(frmtrainerdesigner.Components[i]).hotkeyleft;
trainer.Writebuffer(temp,4);
temp:=tcheat(frmtrainerdesigner.Components[i]).descriptionleft;
trainer.Writebuffer(temp,4);
temp:=tcheat(frmtrainerdesigner.Components[i]).editleft;
trainer.Writebuffer(temp,4);
temp:=tcheat(frmtrainerdesigner.Components[i]).editwidth;
trainer.Writebuffer(temp,4);
trainer.Writebuffer(tcheat(frmtrainerdesigner.Components[i]).HasCheckbox,sizeof(boolean));
trainer.Writebuffer(tcheat(frmtrainerdesigner.Components[i]).beeponActivate,sizeof(boolean));
trainer.Writebuffer(tcheat(frmtrainerdesigner.Components[i]).ShowHotkey,sizeof(boolean));
end;
if (frmtrainerdesigner.Components[i] is timage2) then
begin
temp:=3; //image
trainer.WriteBuffer(temp,4);
trainer.WriteBuffer(timage2(frmtrainerdesigner.Components[i]).left,sizeof(integer));
trainer.WriteBuffer(timage2(frmtrainerdesigner.Components[i]).top,sizeof(integer));
trainer.WriteBuffer(timage2(frmtrainerdesigner.Components[i]).width,sizeof(integer));
trainer.WriteBuffer(timage2(frmtrainerdesigner.Components[i]).height,sizeof(integer));
trainer.WriteBuffer(timage2(frmtrainerdesigner.Components[i]).cursor,sizeof(tcursor));
trainer.WriteBuffer(timage2(frmtrainerdesigner.Components[i]).stretch,sizeof(boolean));
trainer.WriteBuffer(timage2(frmtrainerdesigner.Components[i]).transparent,sizeof(boolean));
trainer.WriteBuffer(timage2(frmtrainerdesigner.Components[i]).tag,sizeof(integer));
//image extension
temp:=length(timage2(frmtrainerdesigner.Components[i]).extension);
trainer.writebuffer(temp,4); //size of extension
x:=pchar(timage2(frmtrainerdesigner.Components[i]).extension);
trainer.writebuffer(pointer(x)^,temp); //ext
temp:=timage2(frmtrainerdesigner.Components[i]).imagedata.size; //size of imagedata
trainer.WriteBuffer(temp,4);
timage2(frmtrainerdesigner.Components[i]).imagedata.savetostream(trainer); //imagedata
//command
temp:=length(timage2(frmtrainerdesigner.Components[i]).Command);
trainer.writebuffer(temp,4);
x:=pchar(timage2(frmtrainerdesigner.Components[i]).Command);
trainer.writebuffer(pointer(x)^,temp);
end;
if (frmtrainerdesigner.Components[i] is tlabel2) then
begin
temp:=4; //tlabel
trainer.WriteBuffer(temp,4);
trainer.WriteBuffer(tlabel2(frmtrainerdesigner.Components[i]).left,sizeof(integer));
trainer.WriteBuffer(tlabel2(frmtrainerdesigner.Components[i]).top,sizeof(integer));
trainer.WriteBuffer(tlabel2(frmtrainerdesigner.Components[i]).width,sizeof(integer));
trainer.WriteBuffer(tlabel2(frmtrainerdesigner.Components[i]).height,sizeof(integer));
//caption
temp:=length(tlabel2(frmtrainerdesigner.Components[i]).Caption);
trainer.writebuffer(temp,4);
x:=pchar(tlabel2(frmtrainerdesigner.Components[i]).Caption);
trainer.writebuffer(pointer(x)^,temp);
//wordwrap
trainer.WriteBuffer(tlabel2(frmtrainerdesigner.Components[i]).wordwrap,sizeof(boolean));
//color
trainer.Writebuffer(tlabel2(frmtrainerdesigner.Components[i]).Font.color,sizeof(tcolor));
//command
temp:=length(tlabel2(frmtrainerdesigner.Components[i]).Command);
trainer.writebuffer(temp,4);
x:=pchar(tlabel2(frmtrainerdesigner.Components[i]).Command);
trainer.writebuffer(pointer(x)^,temp);
//cursor
trainer.WriteBuffer(tlabel2(frmtrainerdesigner.Components[i]).cursor,sizeof(tcursor));
//tag
trainer.WriteBuffer(tlabel2(frmtrainerdesigner.Components[i]).tag,sizeof(integer));
//fontstyle
tempb:=tlabel2(frmtrainerdesigner.Components[i]).Font.Style=[fsUnderline];
trainer.WriteBuffer(tempb,sizeof(tempb));
end;
end;
temp:=$ffffffff; //indicate no other objects (although the eof would be a good indication too...)
trainer.WriteBuffer(temp,4);
end;
//save to file
trainer.SaveToFile(savedialog1.filename);
trainer.free;
{ //commented out because the trainer can't handle this
if cefuncproc.GetSystemType >=4 then //nt+
changeicon(savedialog1.filename);
}
showmessage('Trainer generated');
end;
end;
procedure TfrmMemoryModifier.Button5Click(Sender: TObject);
var HI: HICON;
test: TMemorystream;
resp: pointer;
begin
if opendialog2.execute then
begin
HI:=ExtractIcon(hinstance,pchar(opendialog2.filename),0);
if hi=1 then
raise exception.Create('This file type is not supported');
if hi=0 then
raise exception.Create('No icon found in this file');
CurrentIcon.LoadFromHandle(hi); //meh...
CurrentIcon.MaskFromColor(0,clBlack);
//CurrentIcon.SaveToFile('c:\bla.ico');
icon.Picture.Icon.Handle:=HI;
{test:=TMemoryStream.Create;
icon.Picture.Icon.SaveToStream(test);
ic.SaveToStream(test);
try
if test.Size<>766 then
raise exception.Create('The size of this icon is '+IntToStr(test.size)+'. It should be 766');
finally
test.free;
end; }
frmMemoryTrainerPreview.Icon:=icon.Picture.Icon;
if frmTrainerDesigner<>nil then frmtrainerdesigner.Icon:=icon.Picture.Icon;
end;
end;
procedure TfrmMemoryModifier.editTitleChange(Sender: TObject);
begin
frmMemoryTrainerPreview.Caption:=edittitle.Text;
if frmTrainerDesigner<>nil then frmTrainerdesigner.Caption:=edittitle.Text;
changed:=true;
end;
procedure TfrmMemoryModifier.Button6Click(Sender: TObject);
var index: integer;
i,j: integer;
begin
index:=recordview.ItemIndex;
if index<>-1 then
begin
for i:=0 to length(trainerdata[index].codeentrys)-1 do
setlength(trainerdata[index].codeentrys[i].originalopcode,0);
setlength(trainerdata[index].codeentrys,0);
setlength(trainerdata[index].addressentrys,0);
for i:=index to length(trainerdata)-2 do
trainerdata[i]:=trainerdata[i+1];
setlength(trainerdata,length(trainerdata)-1);
recordview.DeleteSelected;
end;
frmMemoryTrainerPreview.UpdateScreen;
if frmtrainerdesigner<>nil then frmtrainerdesigner.updatecheats
end;
procedure TfrmMemoryModifier.spbUpClick(Sender: TObject);
var temp:TTrainerdata;
indeX: integer;
desc,hotkey: string;
begin
index:=recordview.ItemIndex;
if index>=1 then
begin
temp:=trainerdata[index];
trainerdata[index]:=trainerdata[index-1];
trainerdata[index-1]:=temp;
desc:=recordview.Items[index].Caption;
hotkey:=recordview.Items[index].SubItems[0];
recordview.Items[index]:=recordview.items[index-1];
recordview.Items[index-1].Caption:=desc;
recordview.Items[index-1].SubItems[0]:=hotkey;
recordview.Items[index-1].Selected:=true;
end;
spbUp.Enabled:=recordview.itemindex>0;
spbDown.enabled:=recordview.itemindex<(recordview.Items.Count-1);
frmMemoryTrainerPreview.UpdateScreen;
if frmtrainerdesigner<>nil then frmtrainerdesigner.updatecheats
end;
procedure TfrmMemoryModifier.spbDownClick(Sender: TObject);
var temp:TTrainerdata;
indeX: integer;
desc,hotkey: string;
begin
index:=recordview.ItemIndex;
if index<recordview.Items.Count-1 then
begin
temp:=trainerdata[index];
trainerdata[index]:=trainerdata[index+1];
trainerdata[index+1]:=temp;
desc:=recordview.Items[index].Caption;
hotkey:=recordview.Items[index].SubItems[0];
recordview.Items[index]:=recordview.items[index+1];
recordview.Items[index+1].Caption:=desc;
recordview.Items[index+1].SubItems[0]:=hotkey;
recordview.Items[index+1].Selected:=true;
end;
spbUp.Enabled:=recordview.itemindex>0;
spbDown.enabled:=recordview.itemindex<(recordview.Items.Count-1);
frmMemoryTrainerPreview.UpdateScreen;
if frmtrainerdesigner<>nil then frmtrainerdesigner.updatecheats
end;
procedure TfrmMemoryModifier.LoadButtonClick(Sender: TObject);
begin
if opendialog3.Execute then
edit2.text:=extractfilename(opendialog3.filename);
end;
procedure TfrmMemoryModifier.FormCreate(Sender: TObject);
Var SNAPHandle: THandle;
ProcessEntry: ProcessEntry32;
Check: Boolean;
FullProcessName,ProcessName: String;
I: Integer;
begin
currentIcon:=TKIcon.Create;
changed:=false;
left:=mainform.left-180;
if left<0 then left:=0;
top:=mainform.top+( (mainform.clientheight div 2)-(height div 2));
combobox1.clear;
SNAPHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
If SnapHandle>0 then
begin
ProcessEntry.dwSize:=SizeOf(ProcessEntry);
Check:=Process32First(SnapHandle,ProcessEntry);
while check=true do
begin
ProcessName:='';
FullProcessName:='';
FullProcessName:=processentry.szExeFile;
i:=Length(FullProcessName);
while (i>0) and (FullProcessname[i-1]<>'\') do dec(i);
processname:=copy(FullProcessName,i,length(FullProcessname)-i+1);
combobox1.Items.Add(processname);
check:=Process32Next(SnapHandle,ProcessEntry);
end;
end else raise exception.Create('I can''t get the process list.');
frmMemoryTrainerPreview:=tfrmMemoryTrainerPreview.create(self);
frmMemoryTrainerPreview.left:=left+width;
frmMemoryTrainerPreview.Top:=top;
frmMemoryTrainerPreview.Height:=height;
end;
procedure TfrmMemoryModifier.Edit2Change(Sender: TObject);
begin
changed:=true;
end;
procedure TfrmMemoryModifier.ComboBox1Change(Sender: TObject);
begin
changed:=true;
end;
procedure TfrmMemoryModifier.Button3Click(Sender: TObject);
begin
if changed or (recordview.items.count>0) then
begin
if messagedlg('Are you sure?',mtConfirmation,[mbyes,mbno],0)=mrYes then modalresult:=mrcancel;
end else modalresult:=mrcancel;
if modalresult=mrcancel then close;
end;
procedure TfrmMemoryModifier.Button7Click(Sender: TObject);
begin
if frmTrainerDesigner<>nil then
begin
frmTrainerDesigner.Close;
exit;
end;
button2.Enabled:=false;
frmMemoryTrainerPreview.Visible:=false;
frmTrainerDesigner:=Tfrmtrainerdesigner.create(self);
frmTrainerdesigner.Caption:=edittitle.Text;
frmtrainerdesigner.Icon:=frmMemoryTrainerPreview.Icon;
frmTrainerDesigner.BoundsRect:=frmMemoryTrainerPreview.BoundsRect;
frmTrainerDesigner.show;
button7.Caption:='Use default trainer layout';
end;
procedure TfrmMemoryModifier.EditHotkeyKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var i: integer;
begin
if popuphotkey[4]=0 then
begin
for i:=0 to 4 do
if popuphotkey[i]=0 then
begin
popuphotkey[i]:=key;
break;
end else
if popuphotkey[i]=key then break; //already in list
end;
editHotkey.Text:=ConvertKeyComboToString(popuphotkey);
end;
procedure TfrmMemoryModifier.CheckBox1Click(Sender: TObject);
begin
edithotkey.Enabled:=checkbox1.Checked;
end;
procedure TfrmMemoryModifier.FormShow(Sender: TObject);
begin
if not dontshowdefault then frmMemoryTrainerPreview.Show;
end;
procedure TfrmMemoryModifier.EditHotkeyKeyPress(Sender: TObject;
var Key: Char);
begin
key:=#0;
end;
procedure TfrmMemoryModifier.recordviewDblClick(Sender: TObject);
var i,j: integer;
begin
{ i:=recordview.ItemIndex;
if i<>-1 then
begin
FrmMemoryTrainerAddEntry:=tFrmMemoryTrainerAddEntry.create(self);
FrmMemoryTrainerAddEntry.editmode:=true;
with FrmMemoryTrainerAddEntry do
begin
editDescription.Text:=trainerdata[i].description;
edithotkey.Text:=trainerdata[i].hotkeytext;
laststate:=trainerdata[i].hotkey;
lastshiftstate:=[];
if (trainerdata[i].hotshift and MOD_CONTROL)=MOD_CONTROL then lastshiftstate:=lastshiftstate+[ssctrl];
if (trainerdata[i].hotshift and MOD_ALT)=MOD_ALT then lastshiftstate:=lastshiftstate+[ssalt];
if (trainerdata[i].hotshift and MOD_Shift)=MOD_Shift then lastshiftstate:=lastshiftstate+[ssshift];
for j:=0 to length(trainerdata[i].codeentrys)-1 do
begin
trainerdata[i].codeentrys[j].address
trainerdata[i].codeentrys[j].originalopcode
end;
end;
FrmMemoryTrainerAddEntry.showmodal;
frmMemoryTrainerPreview.UpdateScreen;
if frmTrainerDesigner<>nil then
frmTrainerDesigner.UpdateCheats;
end;}
end;
procedure TfrmMemoryModifier.Button8Click(Sender: TObject);
begin
zeromemory(@popuphotkey[0],10);
editHotkey.Text:=ConvertKeyComboToString(popuphotkey);
edithotkey.SetFocus;
end;
end.