1 Star 0 Fork 0

JonK/cheat-engine

Create your Gitee Account
Explore and code with more than 14 million developers,Free private repositories !:)
Sign up
文件
This repository doesn't specify license. Please pay attention to the specific project description and its upstream code dependency when using it.
Clone or Download
trainergenerator.pas 59.52 KB
Copy Edit Raw Blame History
Dark Byte authored 2023-02-09 04:32 +08:00 . Commit files for release of 7.5
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980
unit trainergenerator;
{$mode delphi}
interface
uses
{$ifdef darwin}
macport,
{$endif}
{$ifdef windows}
windows,
{$endif}
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics,
Dialogs, ceguicomponents, lclintf, StdCtrls, EditBtn, ExtCtrls, ExtDlgs,
ComCtrls, Buttons, Menus, ExtraTrainerComponents, CEFuncProc, HotkeyHandler,
HotKeys, symbolhandler, luacaller, formdesignerunit, opensave, luafile,
frmAdConfigUnit, cesupport, IconStuff, memoryrecordunit, frmSelectionlistunit,
MainUnit2, lua, luahandler, commonTypeDefs, math, CECustomButton, betterControls;
type
TTrainerForm=class(TCEForm)
public
defaultTrainer: boolean;
end; //so it's uniquely identifyable
{ TfrmTrainerGenerator }
TfrmTrainerGenerator = class(TForm)
btnAddSounds: TButton;
btnDelete: TButton;
btnAddHotkey: TButton;
btnDesignForm: TButton;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button5: TButton;
cbActivateSound: TComboBox;
cbCanResize: TCheckBox;
cbConfigD3DHook: TButton;
cbDeactivateSound: TComboBox;
cbOutput: TComboBox;
cbPlaySoundOnAction: TCheckBox;
cbPlayXM: TCheckBox;
cbPopupOnKeypress: TCheckBox;
cbProtect: TCheckBox;
cbStopPlaying: TCheckBox;
cbSupportCheatEngine: TCheckBox;
cbUseD3DHook: TCheckBox;
comboProcesslist: TComboBox;
CTSaveDialog: TSaveDialog;
edtCaption: TEdit;
edtFreezeInterval: TEdit;
edtPopupHotkey: TEdit;
fnXM: TFileNameEdit;
GroupBox2: TGroupBox;
tgImageList: TImageList;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
lblActivateSound: TLabel;
lblDeactivateSound: TLabel;
lvCheats: TListView;
mAbout: TMemo;
MenuItem1: TMenuItem;
MenuItem2: TMenuItem;
miEditHotkey: TMenuItem;
odWave: TOpenDialog;
OpenDialog1: TOpenDialog;
OpenDialog2: TOpenDialog;
OpenPictureDialog1: TOpenPictureDialog;
Panel1: TPanel;
Panel10: TPanel;
Panel2: TPanel;
Panel3: TPanel;
Panel4: TPanel;
Panel5: TPanel;
Panel6: TPanel;
Panel7: TPanel;
Panel8: TPanel;
Panel9: TPanel;
PopupMenu1: TPopupMenu;
CETRAINERSaveDialog: TSaveDialog;
EXESaveDialog: TSaveDialog;
PopupMenu2: TPopupMenu;
rbStopWhenAttached: TRadioButton;
rbStopWhenFocusLost: TRadioButton;
sbPlayActivate: TSpeedButton;
sbPlayDeactivate: TSpeedButton;
sbPlayStopXM: TSpeedButton;
spbDown: TSpeedButton;
spbUp: TSpeedButton;
procedure btnDeleteClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure btnAddSoundsClick(Sender: TObject);
procedure cbPlaySoundOnActionChange(Sender: TObject);
procedure cbConfigD3DHookClick(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure btnDesignFormClick(Sender: TObject);
procedure btnAddHotkeyClick(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure cbCanResizeChange(Sender: TObject);
procedure cbOutputChange(Sender: TObject);
procedure cbOutputSelect(Sender: TObject);
procedure cbPlayXMChange(Sender: TObject);
procedure cbStopPlayingChange(Sender: TObject);
procedure cbSupportCheatEngineChange(Sender: TObject);
procedure cbUseD3DHookChange(Sender: TObject);
procedure edtCaptionChange(Sender: TObject);
procedure edtPopupHotkeyKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FileNameEdit1Change(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure lvCheatsDblClick(Sender: TObject);
procedure lvCheatsSelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
procedure MenuItem1Click(Sender: TObject);
procedure MenuItem2Click(Sender: TObject);
procedure miEditHotkeyClick(Sender: TObject);
procedure Panel2Resize(Sender: TObject);
procedure RadioButton2Change(Sender: TObject);
procedure sbPlayActivateClick(Sender: TObject);
procedure sbPlayDeactivateClick(Sender: TObject);
procedure sbPlayStopXMClick(Sender: TObject);
procedure spbDownClick(Sender: TObject);
procedure spbUpClick(Sender: TObject);
private
{ private declarations }
popupkeys: TKeycombo;
restoretimer: ttimer;
adconfig: TfrmAdConfig;
playbitmap: TBitmap;
stopbitmap: TBitmap;
shown: boolean;
procedure editHotkey(m: Tmemoryrecord; hotkey: TMemoryrecordhotkey);
procedure AddHotkey(hk: TMemoryrecordHotkey);
procedure buildcheatlist;
procedure fillHotkeyList;
procedure FillSound;
procedure generateScript;
procedure generateScript2;
procedure RestoreSupportCE(sender: tobject);
procedure RefreshHotkeyItem(li: TListitem);
public
trainerform: TTrainerForm;
extrapanel: TCEPanel;
//cheatpanel: TCEPanel;
aboutbutton: TCECustomButton;
image: TCEImage;
closebutton: TCECustomButton;
seperator: TCESplitter;
hotkeylabel, descriptionlabel: tcelabel;
{ public declarations }
canceled: boolean;
end;
procedure FillSoundList(list: Tstrings);
var
frmTrainerGenerator: TfrmTrainerGenerator;
implementation
uses mainunit, frmD3DTrainerGeneratorOptionsunit, xmplayer_server,
ProcessHandlerUnit, ProcessList, DPIHelper;
{ TfrmTrainerGenerator }
resourcestring
rsDeActive = '(De)active';
rsUnFreeze = '(Un)Freeze';
rsSet = 'Set';
rsIncrease = 'Increase';
rsDecrease = 'Decrease';
rsDoSomethingWith = 'Do something with';
rsButAllowIncrease = 'but allow increase';
rsButAllowDecrease = 'but allow decrease';
rsTo = 'to';
rsBy = 'by';
rsOnCloseWarning = 'This form had an onClose event. Good thing this was only a stub, else '+strCheatEngine+' would have terminated';
rsAlreadyATrainerFormDefined =
'There is already a trainer form defined. '
+'Continuing will erase the current trainerscript and cheats in the '
+'trainer and replace them with the current hotkeys defined in your '
+'current cheat table (Layout and images will remain unchanged). Continue ?';
rsNoCheatPanel = 'The current trainer form does not have a panel '
+'named ''CHEATPANEL'' so can not be reused by the automated trainer '
+'generator.%sDo you want to start from scratch? (If you want to create a '
+'trainer from your current script you can just save your table as .EXE '
+'instead of using the automated trainer generator)';
rsAreYouSure = 'Are you sure?';
rsInvalidTrainerScript = 'The current lua script only has a half '
+'TRAINERGENERATORSTART/TRAINERGENERATORSTOP block. Please fix this '
+'first (Removing is the easiest option)';
rsTipYouDontHaveToUseTheTrainerGeneratorIfYouDontWantTo = 'Tip: You don''t '
+'have to use the trainer generator if you don''t want to. You can just '
+'save your table as .EXE or CETRAINER';
rsGoBackToGeneratedDesigner = 'Go back to generated designer';
rsDesignUserinterfaceManually = 'Design userinterface manually';
rsCheatEntries = 'Cheat Entries';
rsSelectTheCheatEntryYouWantToSetTheHotkeyFor = 'Select the cheat entry you '
+'want to set the hotkey for';
rsYouNeedACheatTableWithCheatEntries = 'You need a cheat table with cheat '
+'entries';
rsDonTSupportCheatEngineOrYourself = 'Don''t support '+strCheatEngine+' (or '
+'yourself)';
rsThankYou = 'Thank you! :)';
rsAaaaw = 'aaaaw :(';
rsAutogenwarningPart1 = 'This is autogenerated code. Changing code in this block will';
rsAutoGenWarningPart2 = 'get erased and rewritten if you regenerate the trainer code';
rsPleaseSelectTypeInaProcessname = 'Please select/type in a processname';
rsAbout = 'About';
rsHotkey = 'Hotkey';
rsEffect = 'Effect';
rsClose = 'Close';
procedure TfrmTrainerGenerator.RefreshHotkeyItem(li: TListitem);
var hk: TMemoryrecordhotkey;
mr: TMemoryrecord;
begin
hk:=TMemoryrecordhotkey(li.data);
mr:=hk.owner;
li.caption:=ConvertKeyComboToString(hk.keys);
li.SubItems.clear;
if hk.description='' then
begin
//try to guess that it does
case hk.action of
mrhToggleActivation: li.SubItems.Add(rsDeActive+' '+mr.description);
mrhToggleActivationAllowIncrease: li.SubItems.Add(rsUnFreeze+' '+ mr.description+' '+rsButAllowIncrease);
mrhToggleActivationAllowDecrease: li.SubItems.Add(rsUnFreeze+' '+ mr.description+' '+rsButAllowDecrease);
mrhSetValue: li.SubItems.Add(rsSet+' '+mr.description+' '+rsTo+' '+ hk.value);
mrhIncreaseValue: li.SubItems.Add(rsIncrease+' '+mr.description+' '+rsBy+ ' '+ hk.value);
mrhDecreaseValue: li.SubItems.Add(rsDecrease+' '+mr.description+' '+rsBy+ ' '+ hk.value);
else
li.SubItems.Add(rsDoSomethingWith+' '+mr.description);
end;
end else
li.SubItems.Add(hk.description);
end;
procedure TfrmTrainerGenerator.AddHotkey(hk: TMemoryrecordHotkey);
var li: TListitem;
mr: TMemoryRecord;
begin
li:=lvCheats.Items.Add;
li.Data:=hk;
RefreshHotkeyItem(li);
end;
procedure TfrmTrainerGenerator.buildcheatlist;
var cheatpanel: TScrollBox;
i: integer;
currentcheat, lastcheat: TCheat;
hk: TMemoryRecordHotkey;
begin
cheatpanel:=TScrollBox(trainerform.FindComponent('CHEATPANEL'));
if cheatpanel<>nil then
begin
//clear the old list (only the TCheat objects)
i:=0;
while i<cheatpanel.ControlCount do
begin
if cheatpanel.controls[i].Tag<>0 then
cheatpanel.Controls[i].Free
else
inc(i);
end;
currentCheat:=nil;
for i:=0 to lvCheats.Items.Count-1 do
begin
lastCheat:=currentCheat;
currentcheat:=tcheat.create(trainerform);
currentcheat.parent:=cheatpanel;
currentcheat.name:='CHEAT'+inttostr(i);
currentcheat.cheatnr:=i;
currentcheat.tag:=i+1;
currentcheat.AutoSize:=true;
if lastcheat=nil then
begin
//top
currentcheat.left:=scalex(10,96);
currentcheat.top:=scaley(40,96);
end
else
begin
//next one
currentcheat.top:=lastcheat.Top+lastcheat.height+scaley(10,96);
currentcheat.left:=lastcheat.left;
end;
currentcheat.hotkeyleft:=hotkeylabel.left-currentcheat.left;
currentcheat.descriptionleft:=descriptionlabel.left-currentcheat.left;
currentcheat.width:=cheatpanel.clientwidth-currentcheat.Left-scalex(2,96);
currentcheat.anchors:=currentcheat.anchors+[akRight];
currentcheat.Hotkey:=lvCheats.Items[i].Caption;
currentcheat.Description:=lvCheats.Items[i].SubItems[0];
end;
end;
end;
procedure TfrmTrainerGenerator.FillHotkeyList;
var i,j: integer;
mr: TMemoryRecord;
h: TMemoryRecordHotkey;
begin
lvCheats.Clear;
for i:=0 to mainform.addresslist.Count-1 do
begin
mr:=mainform.addresslist.MemRecItems[i];
if mr.hasHotkeys then
begin
for j:=0 to mr.HotkeyCount-1 do
AddHotkey(mr.Hotkey[j]);
end;
end;
end;
procedure TfrmTrainerGenerator.FormCreate(Sender: TObject);
var i,j: integer;
f: TCEForm;
temp: TObject;
mr: Tmemoryrecord;
cheatnr: integer;
currentcheat: tcheat;
lastcheat: tcheat;
r: integer;
reusedWindow: boolean;
fname: string;
hotkeynamename, memrecname: string;
cheatpanel: TScrollBox;
begin
//get the processlist
GetProcessList(comboProcesslist.Items, true);
//find the current process in the processlist
{$IFDEF WINDOWS}
for i:=0 to comboProcesslist.Items.Count-1 do
if PProcessListInfo(comboProcesslist.Items.Objects[i]).processID=processid then
begin
//found it
comboProcesslist.ItemIndex:=i;
break;
end;
{$ENDIF}
//first check if there is already a trainerform
reusedWindow:=false;
for i:=0 to mainform.LuaForms.count-1 do
begin
temp:=TObject(mainform.luaforms[i]) ;
if (temp is TTrainerform) then
begin
r:=messagedlg(rsAlreadyATrainerFormDefined, mtConfirmation, [mbok, mbcancel], 0);
if r=mrok then
begin
trainerform:=TTrainerForm(mainform.luaforms[i]);
extrapanel:=TCEPanel(trainerform.FindComponent('EXTRAPANEL'));
cheatpanel:=TScrollBox(trainerform.FindComponent('CHEATPANEL'));
aboutbutton:=TCECustomButton(trainerform.FindComponent('ABOUTBUTTON'));
image:=TCEImage(trainerform.FindComponent('IMAGE'));
closebutton:=TCECustomButton(trainerform.FindComponent('CLOSEBUTTON'));
seperator:=TCESplitter(trainerform.FindComponent('SEPERATOR'));
hotkeylabel:=TCELabel(trainerform.FindComponent('HOTKEYLABEL'));
descriptionlabel:=TCELabel(trainerform.FindComponent('DESCRIPTIONLABEL'));
if seperator<>nil then
seperator.Enabled:=true; //in case the script disabled it
if cheatpanel=nil then
begin
if messagedlg(Format(rsNoCheatPanel, [#13#10]), mtError, [mbyes, mbno], 0)=mryes then
trainerform:=nil;
end;
reusedWindow:=true;
end
else
begin
canceled:=true;
exit;
end;
break;
end;
end;
if trainerform=nil then
begin
//create it
trainerform:=TTrainerForm.CreateNew(nil);
trainerform.scaled:=false;
trainerform.AutoSize:=false;
trainerform.defaultTrainer:=true;
trainerform.DesignTimePPI:=screen.PixelsPerInch;
trainerform.width:=scalex(350,96);
trainerform.height:=scaley(240,96);
mainform.luaforms.add(trainerform);
//now initialize the form to it's default
trainerform.name:='CETrainer';
trainerform.Position:=poScreenCenter;
seperator:=TCESplitter.create(trainerform);
seperator.Align:=alLeft;
seperator.name:='SEPERATOR';
seperator.parent:=trainerform;
extrapanel:=Tcepanel.create(trainerform);
extrapanel.align:=alleft;
extrapanel.width:=100;
extrapanel.name:='EXTRAPANEL';
extrapanel.caption:='';
extrapanel.bevelinner:=bvLowered;
extrapanel.bevelouter:=bvLowered;
extrapanel.parent:=trainerform;
cheatpanel:=TScrollBox.create(trainerform);
cheatpanel.BorderStyle:=bsNone;
cheatpanel.name:='CHEATPANEL';
cheatpanel.caption:='';
cheatpanel.parent:=trainerform;
cheatpanel.AnchorSideTop.Control:=trainerform;
cheatpanel.AnchorSideTop.side:=asrTop;
cheatpanel.AnchorSideLeft.Control:=extrapanel;
cheatpanel.AnchorSideLeft.side:=asrRight;
cheatpanel.AnchorSideRight.Control:=trainerform;
cheatpanel.AnchorSideRight.side:=asrRight;
aboutbutton:=TCECustomButton.create(trainerform);
aboutbutton.autosize:=true;
aboutbutton.name:='ABOUTBUTTON';
aboutbutton.caption:=rsAbout;
aboutbutton.align:=albottom;
aboutbutton.Parent:=extrapanel;
aboutbutton.RoundingX:=ScaleX(10,96);
aboutbutton.RoundingY:=ScaleX(10,96);
aboutbutton.DrawFocusRect:=false;
with TLuaCaller.create do
begin
luaroutine:='AboutClick';
aboutbutton.onclick:=NotifyEvent;
end;
image:=TCEImage.create(trainerform);
image.name:='IMAGE';
image.align:=alclient;
image.stretch:=true;
image.parent:=extrapanel;
//these are part of the cheatpanel which has ben destroyed or just created
hotkeylabel:=Tcelabel.create(trainerform);
hotkeylabel.name:='HOTKEYLABEL';
hotkeylabel.caption:=rsHotkey;
hotkeylabel.left:=scalex(10,96);
hotkeylabel.top:=scaley(10,96);
hotkeylabel.parent:=cheatpanel;
descriptionlabel:=Tcelabel.create(trainerform);
descriptionlabel.name:='DESCRIPTIONLABEL';
descriptionlabel.caption:=rsEffect;
descriptionlabel.left:=100; //gets adjusted automatically
descriptionlabel.top:=hotkeylabel.top;
descriptionlabel.parent:=cheatpanel;
closebutton:=TCECustomButton.create(trainerform);
closebutton.name:='CLOSEBUTTON';
closebutton.caption:=rsClose;
// closebutton.top:=cheatpanel.clientheight - closebutton.height-8;
// closebutton.left:=cheatpanel.clientwidth div 2 - closebutton.width div 2;
closebutton.AnchorSideLeft.Control:=cheatpanel;
closebutton.AnchorSideLeft.Side:=asrCenter;
closebutton.AnchorSideBottom.Control:=trainerform;
closebutton.AnchorSideBottom.Side:=asrBottom;
closebutton.RoundingX:=ScaleX(10,96);
closebutton.RoundingY:=ScaleX(10,96);
closebutton.parent:=trainerform;
closebutton.autosize:=true;
closebutton.DrawFocusRect:=false;
closebutton.anchors:=[akLeft, akBottom];
cheatpanel.AnchorSideBottom.Control:=closebutton;
cheatpanel.AnchorSideBottom.side:=asrTop;
cheatpanel.anchors:=[akTop, akLeft, akRight, akBottom];
with TLuaCaller.create do
begin
luaroutine:='CloseClick';
closebutton.onclick:=NotifyEvent;
trainerform.OnClose:=CloseEvent; //same routine
end;
// LUA_DoScript('function CloseClick(s) showMessage('''+rsOnCloseWarning+''') return caHide end');
LUA_DoScript('function CloseClick(s) showMessage('''+rsOnCloseWarning+''') return caHide end');
end;
fillHotkeyList;
buildcheatlist;
FillSound;
playbitmap:=TBitmap.Create;
stopbitmap:=TBitmap.Create;
tgImageList.GetBitmap(0, playbitmap);
tgImageList.GetBitmap(1, stopbitmap);
sbPlayStopXM.Glyph:=playbitmap;
end;
procedure TfrmTrainerGenerator.FormShow(Sender: TObject);
var
br: trect;
begin
if not shown then
begin
DPIHelper.AdjustSpeedButtonSize(spbUp);
DPIHelper.AdjustSpeedButtonSize(spbDown);
DPIHelper.AdjustSpeedButtonSize(sbPlayActivate);
DPIHelper.AdjustSpeedButtonSize(sbPlayDeactivate);
DPIHelper.AdjustSpeedButtonSize(sbPlayStopXM);
DPIHelper.AdjustComboboxSize(cbOutput, self.canvas);
DPIHelper.AdjustComboboxSize(cbActivateSound, self.canvas);
DPIHelper.AdjustComboboxSize(cbDeactivateSound, self.canvas);
shown:=true;
end;
if trainerform<>nil then
begin
trainerform.show;
if LCLIntf.GetWindowRect(frmTrainerGenerator.handle, br)>0 then
begin
trainerform.left:=br.Right+5;
trainerform.top:=br.top;
end;
end;
Constraints.MinHeight:=panel9.top+button5.top+button5.height+label6.height+5;
end;
procedure TfrmTrainerGenerator.lvCheatsDblClick(Sender: TObject);
begin
miEditHotkey.Click;
end;
procedure TfrmTrainerGenerator.lvCheatsSelectItem(Sender: TObject;
Item: TListItem; Selected: Boolean);
begin
btnDelete.enabled:=selected;
if selected then
begin
spbDown.enabled:=item.index<lvcheats.items.count-1;
spbUp.enabled:=item.index>0;
end
else
begin
spbUp.enabled:=false;
spbDown.enabled:=false;
end;
end;
procedure TfrmTrainerGenerator.MenuItem1Click(Sender: TObject);
begin
buildcheatlist;
end;
procedure TfrmTrainerGenerator.MenuItem2Click(Sender: TObject);
begin
generateScript
end;
procedure TfrmTrainerGenerator.miEditHotkeyClick(Sender: TObject);
var mh: TMemoryrecordhotkey;
mr: TMemoryrecord;
begin
if lvcheats.selected<>nil then
begin
mh:=TMemoryrecordhotkey(lvcheats.selected.data);
mr:=mh.owner;
editHotkey(mr,mh);
RefreshHotkeyItem(lvcheats.selected);
end;
end;
procedure TfrmTrainerGenerator.Panel2Resize(Sender: TObject);
begin
lvCheats.Column[1].Width:=lvCheats.clientwidth-lvCheats.Column[0].Width-3;
end;
procedure TfrmTrainerGenerator.RadioButton2Change(Sender: TObject);
begin
end;
procedure TfrmTrainerGenerator.sbPlayActivateClick(Sender: TObject);
begin
LUA_DoScript('playSound(findTableFile([['+cbActivateSound.Text+']]))');
end;
procedure TfrmTrainerGenerator.sbPlayDeactivateClick(Sender: TObject);
begin
LUA_DoScript('playSound(findTableFile([['+cbDeactivateSound.Text+']]))');
end;
procedure TfrmTrainerGenerator.sbPlayStopXMClick(Sender: TObject);
begin
if sbPlayStopXM.tag=0 then //not yet playing
begin
xmplayer.playXM(fnXM.FileName);
sbPlayStopXM.glyph:=stopbitmap;
sbPlayStopXM.tag:=1;
end
else
begin
xmplayer.stop;
sbPlayStopXM.glyph:=playbitmap;
sbPlayStopXM.tag:=0;
end;
end;
procedure TfrmTrainerGenerator.spbDownClick(Sender: TObject);
var
i: integer;
temphotkey: string;
tempdescription: string;
tempdata: pointer;
begin
if lvcheats.ItemIndex<>-1 then
begin
if lvcheats.ItemIndex<lvcheats.items.count-1 then
begin
temphotkey:=lvcheats.items[lvcheats.ItemIndex].Caption;
tempdescription:=lvcheats.items[lvcheats.ItemIndex].SubItems[0];
tempdata:=lvcheats.items[lvcheats.ItemIndex].data;
lvcheats.items[lvcheats.ItemIndex].Caption:=lvcheats.items[lvcheats.ItemIndex+1].Caption;
lvcheats.items[lvcheats.ItemIndex].subitems[0]:=lvcheats.items[lvcheats.ItemIndex+1].subitems[0];
lvcheats.items[lvcheats.ItemIndex].data:=lvcheats.items[lvcheats.ItemIndex+1].data;
lvcheats.items[lvcheats.ItemIndex+1].Caption:=temphotkey;
lvcheats.items[lvcheats.ItemIndex+1].subitems[0]:=tempdescription;
lvcheats.items[lvcheats.ItemIndex+1].data:=tempdata;
lvcheats.itemindex:=lvcheats.itemindex+1;
buildcheatlist;
end;
end;
end;
procedure TfrmTrainerGenerator.spbUpClick(Sender: TObject);
var
i: integer;
temphotkey: string;
tempdescription: string;
tempdata: pointer;
begin
if lvcheats.ItemIndex>=1 then
begin
temphotkey:=lvcheats.items[lvcheats.ItemIndex-1].Caption;
tempdescription:=lvcheats.items[lvcheats.ItemIndex-1].SubItems[0];
tempdata:=lvcheats.items[lvcheats.ItemIndex-1].data;
lvcheats.items[lvcheats.ItemIndex-1].Caption:=lvcheats.items[lvcheats.ItemIndex].Caption;
lvcheats.items[lvcheats.ItemIndex-1].subitems[0]:=lvcheats.items[lvcheats.ItemIndex].subitems[0];
lvcheats.items[lvcheats.ItemIndex-1].data:=lvcheats.items[lvcheats.ItemIndex].data;
lvcheats.items[lvcheats.ItemIndex].Caption:=temphotkey;
lvcheats.items[lvcheats.ItemIndex].subitems[0]:=tempdescription;
lvcheats.items[lvcheats.ItemIndex].data:=tempdata;
lvcheats.itemindex:=lvcheats.itemindex-1;
buildcheatlist;
end;
end;
procedure TfrmTrainerGenerator.FormClose(Sender: TObject;
var CloseAction: TCloseAction);
begin
try
xmplayer.stop; //can raise an not initialized exception
except
//deal with it by ignoring it
end;
if not cbSupportCheatEngine.checked then
cbSupportCheatEngine.checked:=true;
cleanProcessList(comboProcesslist.items);
closeaction:=cafree;
frmTrainerGenerator:=nil;
if trainerform<>nil then
begin
if (btnDesignForm.Tag=1) and (formdesigner<>nil) then
formdesigner.Close;
trainerform.hide;
end;
end;
procedure TfrmTrainerGenerator.cbConfigD3DHookClick(Sender: TObject);
begin
frmD3DTrainerGeneratorOptions.show;
end;
procedure TfrmTrainerGenerator.Button3Click(Sender: TObject);
begin
zeromemory(@popupkeys,sizeof(TKeyCombo));
edtPopupHotkey.Text:=ConvertKeyComboToString(popupkeys);
edtPopupHotkey.SetFocus;
end;
procedure FillSoundList(list: Tstrings);
var
i: integer;
riff: pchar;
begin
getmem(riff,5);
for i:=0 to mainform.LuaFiles.Count-1 do
begin
if mainform.LuaFiles[i].stream.size>4 then
begin
CopyMemory(riff, mainform.LuaFiles[i].stream.Memory,4);
riff[4]:=#0;
if riff='RIFF' then //good enough (could still be wrong, but better than random)
list.add(mainform.LuaFiles[i].name);
end;
end;
FreeMemAndNil(riff);
for i:=0 to mainform.InternalLuaFiles.Count-1 do
begin
if list.IndexOf(mainform.InternalLuaFiles[i].name)=-1 then //not overriden
list.add(mainform.InternalLuaFiles[i].name);
end;
end;
procedure TfrmTrainerGenerator.FillSound;
var i: integer;
s: tstringlist;
riff: pchar;
oldcbActivateSound: string;
oldcbDeactivateSound:string;
begin
s:=tstringlist.create;
FillSoundList(s);
oldcbActivateSound:=cbActivateSound.text;
oldcbDeactivateSound:=cbDeactivateSound.text;
cbActivateSound.Items.Assign(s);
cbActivateSound.DropDownCount:=max(16, s.count);
cbDeactivateSound.Items.Assign(s);
cbDeactivateSound.DropDownCount:=max(16, s.count);
cbActivateSound.itemindex:=cbActivateSound.Items.IndexOf(oldcbActivateSound);
cbDeactivateSound.itemindex:=cbDeactivateSound.Items.IndexOf(oldcbDeactivateSound);
s.free;
end;
procedure TfrmTrainerGenerator.btnAddSoundsClick(Sender: TObject);
var
i: integer;
s: tmemorystream;
lf: TLuafile;
begin
odwave.InitialDir:=GetCEdir;
if odwave.execute then
begin
for i:=0 to odwave.Files.Count-1 do
begin
s := TMemorystream.Create;
try
s.LoadFromFile(odwave.files[i]);
lf := TLuaFile.Create(extractfilename(odwave.files[i]), s);
MainForm.LuaFiles.Add(lf);
finally
s.free;
end;
end;
FillSound;
end;
end;
procedure TfrmTrainerGenerator.cbPlaySoundOnActionChange(Sender: TObject);
begin
lblActivateSound.enabled:=cbPlaySoundOnAction.checked;
lblDeactivateSound.enabled:=cbPlaySoundOnAction.checked;
cbActivateSound.enabled:=cbPlaySoundOnAction.checked;
cbDeactivateSound.enabled:=cbPlaySoundOnAction.checked;
sbPlayActivate.enabled:=cbPlaySoundOnAction.checked;
sbPlayDeactivate.enabled:=cbPlaySoundOnAction.checked;
btnAddSounds.enabled:=cbPlaySoundOnAction.checked;
end;
procedure TfrmTrainerGenerator.Button1Click(Sender: TObject);
var
i: integer;
nextpos: integer;
maxheight: integer;
p: TImage;
// iconlist: array of Hicon;
z: Ticon;
e: THandle;
hr: THandle;
r: pointer;
aaa: TFPResourceHMODULE;
wee: HGlobal;
rs: TResourceStream;
size: integer;
modulehandle: THandle;
m: tmemorystream;
begin
trainerform.icon:=pickIcon;
end;
procedure TfrmTrainerGenerator.btnDeleteClick(Sender: TObject);
var hk : TMemoryRecordHotkey;
begin
if lvCheats.Selected<>nil then
begin
if messagedlg(rsAreYouSure, mtConfirmation, [mbyes, mbno], 0)=mryes then
begin
hk:=TMemoryRecordHotkey(lvCheats.selected.data);
hk.Free;
lvCheats.Selected.Delete;
buildcheatlist;
end;
end;
end;
procedure TfrmTrainerGenerator.Button2Click(Sender: TObject);
begin
image:=TCEImage(trainerform.FindComponent('IMAGE'));//in case the image object got replaced
if openpicturedialog1.execute then
image.Picture.LoadFromFile(openpicturedialog1.FileName);
end;
procedure TfrmTrainerGenerator.generateScript2;
begin
end;
procedure TfrmTrainerGenerator.generateScript;
var generated: tstringlist;
start,stop: integer;
i: integer;
l: tstrings;
keyparams: string;
f: TMemorystream;
s: string;
currentcheat: TCheat;
currenthk: TMemoryRecordHotkey;
currentmr: TMemoryrecord;
fname: string;
memrecname,hotkeyname: string;
screwit: tstringlist;
checked, unchecked: tbitmap;
CHECKBOXIMAGE_UNCHECKED: integer;
CHECKBOXIMAGE_CHECKED: integer;
d3dfontlabel: tcelabel;
cheatpanel: TCEPanel;
begin
trainerform.active:=false;
trainerform.SaveCurrentStateasDesign;
//add to the script routine an auto attach registration
if comboprocesslist.text<>'' then
comboProcesslist.text
else
raise exception.create(rsPleaseSelectTypeInaProcessname);
//erase the --TRAINERGENERATOR part of the luascript
l:=mainform.frmLuaTableScript.assemblescreen.Lines;
start:=l.IndexOf('--TRAINERGENERATORSTART--');
stop:=l.IndexOf('--TRAINERGENERATORSTOP--');
if ((start=-1) or (stop=-1)) and (start<>stop) then
raise exception.create(rsInvalidTrainerScript);
if start<>-1 then
for i:=start to stop do
l.Delete(start);
//now write
l.add('--TRAINERGENERATORSTART--');
l.add('--'+rsAutogenwarningPart1);
l.add('--'+rsAutoGenWarningPart2);
l.add('');
l.add('--Uncomment the following line if this is a Cheat Table format trainer and you don''t want CE to show (Tip, save as .CETRAINER alternatively)');
l.add('--hideAllCEWindows()');
l.add('');
l.add('RequiredCEVersion='+floattostr(ceversion));
l.add('if (getCEVersion==nil) or (getCEVersion()<RequiredCEVersion) then');
l.add(' messageDialog(''Please install '+strCheatEngine+' ''..RequiredCEVersion, mtError, mbOK)');
l.add(' closeCE()');
l.add('end');
try
if cbUseD3DHook.checked then
l.add('d3dcheats={} --table containing the information to build the cheat lines for d3d');
cheatpanel:=TCEPanel(trainerform.FindComponent('CHEATPANEL'));
if cheatpanel<>nil then
begin
//create the routines for these cheats
l.add('addresslist=getAddressList()');
//fill the memrec list
for i:=0 to mainform.addresslist.count-1 do
if mainform.addresslist.MemRecItems[i].hasHotkeys then
l.add('memrec'+inttostr( mainform.addresslist.MemRecItems[i].id)+'=addresslist.getMemoryRecordByID('+inttostr(mainform.addresslist.MemRecItems[i].id)+')');
l.add('');
//fill the hotkey list
for i:=0 to lvCheats.Items.Count-1 do
begin
currenthk:=TMemoryRecordHotkey(lvcheats.Items[i].Data);
currentmr:=currenthk.owner;
memrecname:='memrec'+inttostr(currentmr.id);
hotkeyname:=memrecname+'_hotkey'+inttostr(currenthk.id);
l.add(hotkeyname+'='+memrecname+'.getHotkeyByID('+inttostr(currenthk.id)+')');
end;
l.add('');
//now go through the actual cheatlist on the form itself and give it it's functions
for i:=0 to cheatpanel.ControlCount-1 do
begin
if cheatpanel.Controls[i] is TCheat then
begin
currentcheat:=TCheat(cheatpanel.Controls[i]);
currenthk:=TMemoryRecordHotkey(lvcheats.Items[currentcheat.cheatnr].Data);
currentmr:=currenthk.owner;
if cbUseD3DHook.checked then
begin
l.add('d3dcheats['+inttostr(currentcheat.cheatnr+1)+']={}');
l.add('d3dcheats['+inttostr(currentcheat.cheatnr+1)+'].description=[['+currentcheat.Description+']]');
l.add('d3dcheats['+inttostr(currentcheat.cheatnr+1)+'].hotkeys=[['+currentcheat.Hotkey+']]');
l.add('d3dcheats['+inttostr(currentcheat.cheatnr+1)+'].top='+inttostr(currentcheat.Top));
l.add('d3dcheats['+inttostr(currentcheat.cheatnr+1)+'].left='+inttostr(currentcheat.Left));
l.add('d3dcheats['+inttostr(currentcheat.cheatnr+1)+'].memrecid='+inttostr(currentmr.id));
l.add('d3dcheats['+inttostr(currentcheat.cheatnr+1)+'].hotkeyid='+inttostr(currenthk.id));
end;
//get the memrecname
memrecname:='memrec'+inttostr(currentmr.id);
//get the hotkey name
hotkeyname:=memrecname+'_hotkey'+inttostr(currenthk.id);
case currenthk.action of
mrhToggleActivation,
mrhToggleActivationAllowIncrease,
mrhToggleActivationAllowDecrease:
begin
//constantly enabled
fname:='onPostHotkey'+inttostr(currentcheat.cheatnr);
l.Add('function '+fname+'(Hotkey)');
l.add(' --Executed after the "toggle*" cheat got executed');
l.add(' local memrec=Hotkey.Owner');
l.add(' local isActive=memrec.Active --get the state after the hotkey got triggered');
l.add(' '+trainerform.name+'.'+currentcheat.name+'.setActive(isActive) --gui update, nothing else');
l.add(' if gPlaySoundOnAction then');
l.add(' if isActive then');
l.add(' playSound(gActivateSound)');
l.add(' else');
l.add(' playSound(gDeactivateSound)');
l.add(' end');
l.add(' end');
if cbUseD3DHook.checked and (frmD3DTrainerGeneratorOptions<>nil) and (frmD3DTrainerGeneratorOptions.cbHasCheckbox.checked) then
begin
l.add(' ');
l.add(' local newcbtexture=nil');
l.add(' if isActive then');
l.add(' newcbtexture=CheckedTexture');
l.add(' else');
l.add(' newcbtexture=UncheckedTexture');
l.add(' end');
l.add(' d3dcheats['+inttostr(currentcheat.cheatnr+1)+'].CheckboxSprite.Texture=newcbtexture');
end;
l.add('end');
l.add('');
l.add(hotkeyname+'.onPostHotkey='+fname);
l.add('');
end;
else
begin
//one time only
fname:='onHotkey'+inttostr(currentcheat.cheatnr);
l.Add('function '+fname+'(Hotkey)');
l.add(' --Executed before the hotkey is handled');
if currentcheat.HasEditBox then
begin
l.add(' local memrec=Hotkey.Owner');
l.add(' memrec.Value='+trainerform.name+'.'+currentcheat.name+'.Editvalue --this will also update the ''frozen'' value');
end;
l.add(' '+trainerform.name+'.'+currentcheat.name+'.setActive(true, 1500)');
l.add(' if gPlaySoundOnAction then');
if currenthk.action=mrhDeactivate then
l.add(' playSound(gDeactivateSound)')
else
l.add(' playSound(gActivateSound)');
l.add(' end');
l.add('end');
l.add('');
l.add(hotkeyname+'.onHotkey='+fname);
end;
end;
end;
end;
end
else //the user deleted the cheat panel
showmessage(rsTipYouDontHaveToUseTheTrainerGeneratorIfYouDontWantTo);
seperator:=TCESplitter(trainerform.FindComponent('SEPERATOR'));
if seperator<>nil then
l.Add(trainerform.name+'.SEPERATOR.Visible=false');
l.add('');
l.add('getAutoAttachList().add("'+comboProcesslist.text+'")');
if (cbPopupOnKeypress.checked) and (edtPopupHotkey.text<>'') then
begin
l.add('function popupTrainerHotkeyFunction()');
l.add(' '+trainerform.Name+'.show()');
l.add('end');
keyparams:='';
for i:=0 to length(popupkeys)-1 do
begin
if popupkeys[i]=0 then break;
keyparams:=keyparams+inttostr(popupkeys[i])+',';
end;
if keyparams<>'' then
keyparams:=copy(keyparams, 1,length(keyparams)-1);
l.add('createHotkey(popupTrainerHotkeyFunction, '+keyparams+')');
l.add('getFreezeTimer().Interval='+edtFreezeInterval.text);
end;
if cbPlaySoundOnAction.checked then
begin
l.add('gPlaySoundOnAction=true');
l.add('gActivateSound=findTableFile([['+cbActivateSound.text+']])');
l.add('gDeactivateSound=findTableFile([['+cbDeactivateSound.text+']])');
end
else
l.add('gPlaySoundOnAction=false');
l.add(trainerform.Name+'.fixDPI() --remove this if you have already taken care of DPI issues yourself');
l.add(trainerform.Name+'.show()');
if mAbout.lines.count>0 then
begin
l.add('function AboutClick()');
l.add(' showMessage(gAboutText)');
l.add('end');
s:='';
screwit:=tstringlist.create;
screwit.AddStrings(mabout.lines);
if screwit.Count>0 then
begin
screwit[0]:='gAboutText=[['+screwit[0];
screwit[screwit.count-1]:=screwit[screwit.count-1]+']]';
l.AddStrings(screwit);
end
else
l.add('gAboutText=""');
screwit.free;
l.add('');
end;
l.add('function CloseClick()');
l.add(' --called by the close button onClick event, and when closing the form');
l.add(' closeCE()');
l.add(' return caFree --onClick doesn''t care, but onClose would like a result');
l.add('end');
l.add('');
if cbPlayXM.checked then
begin
f:=TMemoryStream.Create;
f.LoadFromFile(fnXM.FileName);
//check if there is already a TRAINERXM file
//if so, delete
for i:=0 to mainform.LuaFiles.count-1 do
if mainform.LuaFiles[i].name='TRAINERXM' then
begin
mainform.LuaFiles[i].free;
mainform.LuaFiles.Delete(i);
break;
end;
mainform.LuaFiles.add(TLuafile.create('TRAINERXM',f));
f.free;
l.add('');
l.add('XMFILE=findTableFile(''TRAINERXM'')');
l.add('xmplayer.playXM(XMFILE)');
l.add('');
if rbStopWhenAttached.checked then
begin
l.add('function onOpenProcess_xmplayer(processid)');
l.add(' xmplayer.stop()');
l.add(' if xmplayer_originalOnOpenProcess~=nil then');
l.add(' xmplayer_originalOnOpenProcess(processid)');
l.add(' end');
l.add('end');
l.add('xmplayer_originalOnOpenProcess=onOpenProcess');
l.add('onOpenProcess=onOpenProcess_xmplayer');
end
else
begin
l.add('function focusCheck(sender)');
l.add(' if ('+trainerform.Name+'.isForegroundWindow('+trainerform.Name+')) then');
l.add(' if (xmplayer.isPlaying()==false) then');
l.add(' xmplayer.resume()');
l.add(' end');
l.add(' else');
l.add(' if (xmplayer.isPlaying()) then');
l.add(' xmplayer.pause()');
l.add(' end');
l.add(' end');
l.add('end');
l.add('');
l.add('focusTimer=createTimer(nil)');
l.add('focusTimer.onTimer=focusCheck');
l.add('focusTimer.Interval=250');
l.add('focusTimer.Enabled=true');
l.add('');
end;
end;
if not cbSupportCheatEngine.checked then
begin
if adconfig<>nil then
begin
l.add('supportCheatEngine('+trainerform.name+', '+BoolToStr(adconfig.cbCanClose.checked,'true','false')+', '+adconfig.edtWidth.text+', '+adconfig.edtHeight.text+', '+inttostr(adconfig.adposition)+', '+QuotedStr(adconfig.ownurl)+', '+QuotedStr(adconfig.extraparam)+', '+inttostr(adconfig.percentage)+')');
l.add('--Thank you from Dark Byte--');
end;
end;
if cbUseD3DHook.checked then
begin
//create a label with the specified font in the trainer form
l.add('');
l.add('-- Direct 3D Hook Function --');
l.add('');
if frmD3DTrainerGeneratorOptions<>nil then
begin
d3dfontlabel:=TCELabel(trainerform.FindComponent('D3DFONTLABEL'));
if d3dfontlabel=nil then
begin
d3dfontlabel:=tcelabel.create(trainerform);
d3dfontlabel.parent:=trainerform;
d3dfontlabel.name:='D3DFONTLABEL';
end;
d3dfontlabel.Font.assign(frmD3DTrainerGeneratorOptions.lblTextColor.Font);
d3dfontlabel.Visible:=false;
trainerform.SaveCurrentStateasDesign;
l.add('D3DHook={} --config options');
l.add('D3DHook.oldOnOpenProcess=onOpenProcess --easy and compatible way for different scripts to make use of onOpenProcess');
l.add('D3DHook.transparency='+inttostr(frmD3DTrainerGeneratorOptions.TrackBar1.Position));
l.add('D3DHook.textFont='+trainerform.name+'.D3DFONTLABEL.font');
//l.add('D3DHook.allowDrag='+BoolToStr(frmD3DTrainerGeneratorOptions.cbAllowDrag.checked, 'true','false'));
l.add('D3DHook.showHotkeys='+BoolToStr(frmD3DTrainerGeneratorOptions.cbShowHotkeys.checked, 'true', 'false'));
l.add('D3DHook.hasCheckbox='+BoolToStr(frmD3DTrainerGeneratorOptions.cbHasCheckbox.checked, 'true', 'false'));
l.add('D3DHook.stretch='+BoolToStr(frmD3DTrainerGeneratorOptions.cbStretch.checked, 'true',' false'));
l.add('D3DHook.distanceBetweenLines='+frmD3DTrainerGeneratorOptions.edtDistanceBetweenLines.text);
l.add('D3DHook.distanceFromTop='+frmD3DTrainerGeneratorOptions.edtDistanceFromTop.text);
l.add('D3DHook.distanceFromBorder='+frmD3DTrainerGeneratorOptions.edtDistanceFromBorder.text);
if frmD3DTrainerGeneratorOptions.rbTopLeft.checked then
l.add('D3DHook.position=1')
else
if frmD3DTrainerGeneratorOptions.rbTopRight.checked then
l.add('D3DHook.position=2')
else
if frmD3DTrainerGeneratorOptions.rbBottomLeft.checked then
l.add('D3DHook.position=3')
else
if frmD3DTrainerGeneratorOptions.rbBottomRight.checked then
l.add('D3DHook.position=4')
else
if frmD3DTrainerGeneratorOptions.rbTopRight.checked then
l.add('D3DHook.position=5');
l.add('');
l.add('function D3DHook.UpdatePosition()');
l.add(' if D3DHook.position==2 then --Top Right');
l.add(' SetD3DMenuPosition(h.Width-BackgroundSprite.Width, 0)');
l.add(' elseif D3DHook.position==3 then --Bottom Left');
l.add(' SetD3DMenuPosition(0, h.Height-BackgroundSprite.Height)');
l.add(' elseif D3DHook.position==4 then --Bottom Right');
l.add(' SetD3DMenuPosition(h.Width-BackgroundSprite.Width, h.Height-BackgroundSprite.Height)');
l.add(' elseif D3DHook.position==5 then --Center');
l.add(' SetD3DMenuPosition((h.Width / 2)-(BackgroundSprite.Width / 2), (h.Height / 2)-(BackgroundSprite.Height/2))');
l.add(' end');
l.add('end');
l.add('');
l.add('function onOpenProcess()');
l.add(' if (D3DHook.oldOnOpenProcess~=nil) then');
l.add(' D3DHook.oldOnOpenProcess() --call the original onOpenProcess if needed');
l.add(' end');
l.add(' h=createD3DHook()');
l.add(' if (h~=nil) then');
if frmD3DTrainerGeneratorOptions.cbHasCheckbox.checked then
begin
//create a checkbox luafile resource if it doesn't exist yet
//check if there is already a CHECKBOXIMAGE_CHECKED/UNCHECKED
CHECKBOXIMAGE_UNCHECKED:=-1;
CHECKBOXIMAGE_CHECKED:=-1;
for i:=0 to mainform.LuaFiles.count-1 do
begin
if mainform.LuaFiles[i].name='CHECKBOXIMAGE_UNCHECKED' then
CHECKBOXIMAGE_UNCHECKED:=i;
if mainform.LuaFiles[i].name='CHECKBOXIMAGE_CHECKED' then
CHECKBOXIMAGE_CHECKED:=i;
end;
if (CHECKBOXIMAGE_UNCHECKED=-1) or (CHECKBOXIMAGE_CHECKED=-1) then
begin
//if none, or only one is defined create new checkbox images
//first cleanup. At max only one gets deleted so no need to worry about the index changing
if CHECKBOXIMAGE_UNCHECKED<>-1 then //destroy the old one
begin
MainForm.LuaFiles[CHECKBOXIMAGE_UNCHECKED].Free;
MainForm.LuaFiles.Delete(CHECKBOXIMAGE_UNCHECKED);
end;
if CHECKBOXIMAGE_CHECKED<>-1 then //destroy the old one
begin
MainForm.LuaFiles[CHECKBOXIMAGE_CHECKED].Free;
MainForm.LuaFiles.Delete(CHECKBOXIMAGE_CHECKED);
end;
checked:=frmD3DTrainerGeneratorOptions.imgChecked.Picture.Bitmap;
unchecked:=frmD3DTrainerGeneratorOptions.imgUnchecked.Picture.Bitmap;
f:=TMemoryStream.create;
checked.SaveToStream(f);
mainform.LuaFiles.Add(TLuafile.create('CHECKBOXIMAGE_CHECKED', f));
f.free;
f:=TMemoryStream.create;
unchecked.SaveToStream(f);
mainform.LuaFiles.Add(TLuafile.create('CHECKBOXIMAGE_UNCHECKED', f));
f.free;
end;
l.add(' --First get a "Picture" object to the checkbox images');
l.add(' CheckedPicture=createPicture()');
l.add(' UncheckedPicture=createPicture()');
l.add(' CheckedPicture.loadFromStream(findTableFile("CHECKBOXIMAGE_CHECKED").Stream)');
l.add(' UncheckedPicture.loadFromStream(findTableFile("CHECKBOXIMAGE_UNCHECKED").Stream)');
l.add(' --create the textures for the the checked and unchecked checkbox with these pictures');
l.add(' CheckedTexture=h.createTexture(CheckedPicture)');
l.add(' UncheckedTexture=h.createTexture(UncheckedPicture)');
l.add(' CheckedPicture.destroy() --Not needed anymore');
l.add(' CheckedPicture=nil');
l.add(' UncheckedPicture.destroy() ');
l.add(' UncheckedPicture=nil');
end;
//save the background image as a luafile
f:=TMemoryStream.create;
frmD3DTrainerGeneratorOptions.imgPreview.Picture.SaveToStream(f);
for i:=0 to mainform.LuaFiles.count-1 do
if MainForm.LuaFiles[i].name='D3DTRAINERBACKGROUND' then
begin
mainform.LuaFiles[i].Free;
mainform.LuaFiles.delete(i);
break;
end;
mainform.LuaFiles.Add(TLuafile.create('D3DTRAINERBACKGROUND', f));
f.free;
l.add(' --create the texture for the background');
l.add(' BackgroundPicture=createPicture()');
l.add(' BackgroundPicture.loadFromStream(findTableFile("D3DTRAINERBACKGROUND").Stream)');
l.add(' BackgroundTexture=h.createTexture(BackgroundPicture)');
l.add(' BackgroundPicture.destroy() --Not needed anymore (The texture has everything we need)');
l.add(' BackgroundPicture=nil');
l.add('');
l.add(' BackgroundSprite=h.createSprite(BackgroundTexture)');
l.add(' BackgroundSprite.Alphablend=1.0-D3DHook.transparency / 100 --alphablend takes a value between 0.0 and 1.0 where 1.0 is fully visible, and transparency is a percentage from 0 to 100 where 100 is invisible');
l.add('');
l.add(' --create the cheat entry lines');
l.add(' for i,info in ipairs(d3dcheats) do');
l.add(' local pic=createPicture()');
l.add(' local text=info.description');
l.add(' if D3DHook.showHotkeys then --add the hotkey as well');
l.add(' text=text.." ("..info.hotkeys..")"');
l.add(' end');
l.add(' pic.Bitmap.Canvas.Font.assign(D3DHook.textFont)');
l.add(' local width=pic.Bitmap.Canvas.getTextWidth(text)');
l.add(' local height=pic.Bitmap.Canvas.getTextHeight(text)');
l.add(' pic.Bitmap.Canvas.Brush.Color=0x010101');
l.add(' pic.Bitmap.Width=width');
l.add(' pic.Bitmap.Height=height');
l.add(' pic.Bitmap.Canvas.textOut(0,0,text)');
l.add(' info.TextTexture=h.createTexture(pic, 0x010101)');
l.add(' pic.destroy()');
l.add('');
l.add(' info.TextSprite=h.createSprite(info.TextTexture)');
l.add(' info.TextSprite.Alphablend=1.0-D3DHook.transparency / 100');
l.add(' if D3DHook.hasCheckbox then');
l.add(' info.CheckboxSprite=h.createSprite(UncheckedTexture)');
l.add(' info.CheckboxSprite.Alphablend=1.0-D3DHook.transparency / 100');
l.add(' end');
l.add('');
l.add(' end'); //end of for loop
l.add('');
l.add(' D3DHook.UpdatePosition()');
l.add(' --create a timer to update the position');
l.add(' local t=createTimer()');
l.add(' t.OnTimer=D3DHook.UpdatePosition');
l.add(' t.Interval=2000 --every 2 seconds');
l.add(' t.Enabled=true');
l.add('');
l.add(' if D3DHook.hasCheckbox then');
l.add(' h.OnClick=D3DHookSpriteClick');
l.add(' end');
l.add(' end'); //end of h~=nil
l.add('end');
l.add('');
l.add('function D3DHookSpriteClick(d3dhook_sprite, x, y)');
l.add(' for i,info in ipairs(d3dcheats) do');
l.add(' if (d3dhook_sprite==info.CheckboxSprite) or (d3dhook_sprite==info.TextSprite) then');
l.add(' --clicked on a cheat entry. Execute the hotkey event');
l.add(' local mr=getAddressList().getMemoryRecordByID(info.memrecid)');
l.add(' mr.getHotkeyByID(info.hotkeyid).doHotkey() --execute the hotkey event');
l.add(' break');
l.add(' end');
l.add(' end');
l.add('end');
l.add('');
l.add('function SetD3DMenuPosition(x,y)');
l.add(' --Sets up the trainer window and position');
l.add(' --set the background position and go through the d3dcheats. Optionally also stretching the background sprite');
l.add(' local maxX=0');
l.add(' local startY=y');
l.add('');
l.add(' BackgroundSprite.X=math.floor(x)');
l.add(' BackgroundSprite.Y=math.floor(y)');
l.add('');
l.add(' x=x+D3DHook.distanceFromBorder');
l.add(' y=y+D3DHook.distanceFromTop');
l.add(' for i,info in ipairs(d3dcheats) do');
l.add(' local _x=x');
l.add(' local lineheight=info.TextSprite.Height');
l.add('');
l.add(' if D3DHook.hasCheckbox then');
l.add(' if info.CheckboxSprite.Height>lineheight then');
l.add(' lineheight=info.CheckboxSprite.Height');
l.add(' end');
l.add(' info.CheckboxSprite.X=math.floor(_x)');
l.add(' _x=_x+info.CheckboxSprite.Width+2');
l.add(' info.CheckboxSprite.Y=math.floor(y+ (lineheight / 2) - (info.CheckboxSprite.Height /2))');
l.add(' end');
l.add(' info.TextSprite.X=math.floor(_x)');
l.add(' info.TextSprite.Y=math.floor(y+ (lineheight / 2) - (info.TextSprite.Height /2))');
l.add('');
l.add(' if maxX<info.TextSprite.X+info.TextSprite.Width+4 then');
l.add(' maxX=info.TextSprite.X+info.TextSprite.Width+4');
l.add(' end');
l.add(' y=y+lineheight+D3DHook.distanceBetweenLines');
l.add(' end');
l.add('');
l.add(' if D3DHook.stretch then');
l.add(' BackgroundSprite.Width=maxX-x+D3DHook.distanceFromBorder');
l.add(' BackgroundSprite.Height=y-startY+D3DHook.distanceFromBorder');
l.add(' end');
l.add('end');
if frmD3DTrainerGeneratorOptions.cbUseD3DKeys.checked then
begin
l.add('');
l.add('D3DHook.visible=true');
l.add('function D3DToggleMenuVisible()');
l.add(' D3DHook.visible=not D3DHook.visible');
l.add('');
l.add(' BackgroundSprite.visible=D3DHook.visible');
l.add(' for i,info in ipairs(d3dcheats) do');
l.add(' if D3DHook.hasCheckbox then');
l.add(' info.CheckboxSprite.visible=D3DHook.visible');
l.add(' end');
l.add(' info.TextSprite.visible=D3DHook.visible');
l.add(' end');
l.add('end');
s:='';
//build a key list
for i:=0 to length(frmD3DTrainerGeneratorOptions.d3dkeys)-1 do
begin
if frmD3DTrainerGeneratorOptions.d3dkeys[i]=0 then break;
s:=s+', '+inttostr(frmD3DTrainerGeneratorOptions.d3dkeys[i]);
end;
l.add('createHotkey(D3DToggleMenuVisible'+s+')');
end;
end
else
l.add('--WTF?--');
end;
finally
l.add('--TRAINERGENERATORSTOP--');
end;
end;
procedure TfrmTrainerGenerator.Button5Click(Sender: TObject);
var f: string;
protect: boolean;
begin
protect:=false;
generateScript;
// generateScript2;
case cbOutput.ItemIndex of
0:
begin
MainForm.miShowLuaScript.click;
exit;
end;
1:
begin
if not EXESaveDialog.Execute then exit;
f:=EXESaveDialog.FileName;
if uppercase(ExtractFileName(f))=uppercase(comboProcesslist.Text) then
begin
messagedlg('You may not name your trainer .EXE the same as the process you wish to cheat on', mtError, [mbok],0);
exit;
end;
protect:=true;
end;
2:
begin
if not CETRAINERSaveDialog.Execute then exit;
f:=CETRAINERSaveDialog.FileName;
protect:=cbProtect.checked;
end;
3:
begin
if not CTSaveDialog.Execute then exit;
f:=CTSaveDialog.FileName;
protect:=cbProtect.checked;
end;
else
raise exception.create('Invalid option');
end;
savetable(f, protect); //always protect
end;
procedure TfrmTrainerGenerator.btnDesignFormClick(Sender: TObject);
var i: integer;
currentcheat: TCheat;
begin
if btnDesignForm.tag=0 then
begin
mainform.createFormdesigner;
formdesigner.designForm(trainerform);
formdesigner.show;
trainerform.show;
edtCaption.enabled:=false;
btnDesignForm.caption:=rsGoBackToGeneratedDesigner;
btnDesignForm.tag:=1;
end
else
begin
if formdesigner<>nil then
formdesigner.Close;
btnDesignForm.tag:=0;
btnDesignForm.caption:=rsDesignUserinterfaceManually;
end;
end;
procedure TfrmTrainerGenerator.editHotkey(m: Tmemoryrecord; hotkey: TMemoryrecordhotkey);
var
i,j: integer;
oldlist: tlist;
found: boolean;
hkf: THotkeyform;
begin
oldlist:=tlist.create;
for i:=0 to m.HotkeyCount-1 do
oldlist.Add(m.Hotkey[i]);
hkf:=THotKeyForm.Create(self);
with hkf do
begin
memrec:=m;
memrec.beginEdit;
if hotkey=nil then
btnCreateHotkey.Click
else
begin
//select the editable hotkey
for i:=0 to hkf.ListView1.Items.Count-1 do
if hkf.ListView1.items[i].Data=hotkey then
begin
//found it
hkf.ListView1.Selected:=hkf.ListView1.items[i];
hkf.ListView1.ItemIndex:=i;
hkf.ListView1.Items[i].Selected:=true;
hkf.btnEditHotkey.Click;
break;
end;
end;
showmodal;
end;
//recheck the hotkey list and check which ones have been added OR deleted
//remove the entries that got deleted
for i:=0 to oldlist.count-1 do
begin
found:=false;
for j:=0 to m.HotkeyCount-1 do
if oldlist[i]=m.Hotkey[i] then
begin
found:=true;
break;
end;
if not found then
begin
//delete from lvcheats
for j:=0 to lvCheats.items.count-1 do
if lvcheats.items[j].Data=oldlist[i] then
begin
//found it
lvCheats.Items.Delete(j);
break;
end;
end;
end;
//now add the entries that are not present in the oldlist
for i:=0 to m.Hotkeycount-1 do
begin
if oldlist.IndexOf(m.Hotkey[i])=-1 then //not in the list
AddHotkey(m.Hotkey[i]);
end;
oldlist.free;
//now update the hotkey and description texts
for i:=0 to lvCheats.items.count-1 do
RefreshHotkeyItem(lvCheats.items[i]);
//and update the trainerform
buildcheatlist;
end;
procedure TfrmTrainerGenerator.btnAddHotkeyClick(Sender: TObject);
var l: TfrmSelectionList;
s: tstringlist;
i,j: integer;
m: TMemoryRecord;
found: boolean;
begin
// add hotkey
if mainform.addresslist.Count>0 then
begin
s:=tstringlist.create;
for i:=0 to mainform.addresslist.Count-1 do
s.add(mainform.addresslist.MemRecItems[i].Description);
l:=TfrmSelectionList.create(self,s);
l.Caption:=rsCheatEntries;
l.label1.caption:=rsSelectTheCheatEntryYouWantToSetTheHotkeyFor;
l.itemindex:=0;
if (l.showmodal=mrok) and (l.itemindex<>-1) then
edithotkey(mainform.addresslist.MemRecItems[l.itemindex], nil);
s.free;
end
else
raise exception.create(rsYouNeedACheatTableWithCheatEntries);
end;
procedure TfrmTrainerGenerator.Button8Click(Sender: TObject);
begin
end;
procedure TfrmTrainerGenerator.cbCanResizeChange(Sender: TObject);
begin
if cbCanResize.checked then
trainerform.BorderStyle:=bsSizeable
else
trainerform.BorderStyle:=bsSingle;
end;
procedure TfrmTrainerGenerator.cbOutputChange(Sender: TObject);
begin
end;
procedure TfrmTrainerGenerator.cbOutputSelect(Sender: TObject);
var oldprotect: boolean;
begin
oldprotect:=cbProtect.enabled and cbProtect.checked and (cbOutput.itemindex=1);
cbProtect.enabled:=cbOutput.itemindex=1;
cbProtect.checked:=(cbOutput.itemindex=0) or oldprotect;
end;
procedure TfrmTrainerGenerator.cbPlayXMChange(Sender: TObject);
begin
fnXM.enabled:=cbPlayXM.checked;
cbStopPlaying.enabled:=cbPlayXM.checked;
rbStopWhenAttached.enabled:=cbPlayXM.checked and cbStopPlaying.checked;
rbStopWhenFocusLost.enabled:=cbPlayXM.checked and cbStopPlaying.checked;
sbPlayStopXM.enabled:=cbPlayXM.checked;
end;
procedure TfrmTrainerGenerator.cbStopPlayingChange(Sender: TObject);
begin
rbStopWhenAttached.enabled:=cbPlayXM.checked and cbStopPlaying.checked;
rbStopWhenFocusLost.enabled:=cbPlayXM.checked and cbStopPlaying.checked;
end;
procedure TfrmTrainerGenerator.RestoreSupportCE(sender: tobject);
begin
cbSupportCheatEngine.caption:=rsDonTSupportCheatEngineOrYourself;
if restoretimer<>nil then
restoretimer.enabled:=false;
end;
procedure TfrmTrainerGenerator.cbSupportCheatEngineChange(Sender: TObject);
begin
//Guilt procedure
if not cbSupportCheatEngine.checked then
begin
cbSupportCheatEngine.caption:=rsThankYou;
//show the ad config window
if adwindow=nil then
adwindow:=TADWindow.Create2(application, true);
adwindow.Width:=468;
adwindow.height:=60;
adwindow.show;
adwindow.AttachToForm(trainerform);
adwindow.setPosition(akBottom);
if adconfig=nil then
adconfig:=TfrmAdConfig.create(self);
if left>adconfig.width then
begin
adconfig.left:=left-adconfig.width-20;
adconfig.top:=top;
end
else
begin
adconfig.Left:=left;
adconfig.top:=top+height;
end;
adconfig.show;
adwindow.optional:='designer=1';
adwindow.LoadAd;
end
else
begin
cbSupportCheatEngine.caption:=rsAaaaw;
if adwindow<>nil then
begin
adwindow.AttachToForm(nil);
adwindow.hide;
end;
if adconfig<>nil then
adconfig.hide;
end;
if restoretimer=nil then
begin
restoretimer:=TTimer.create(self);
restoretimer.ontimer:=RestoreSupportCE;
restoretimer.interval:=1500;
end;
restoretimer.enabled:=true;
end;
procedure TfrmTrainerGenerator.cbUseD3DHookChange(Sender: TObject);
begin
cbConfigD3DHook.enabled:=cbUseD3DHook.checked;
if cbConfigD3DHook.enabled and (frmD3DTrainerGeneratorOptions=nil) then
frmD3DTrainerGeneratorOptions:=tfrmD3DTrainerGeneratorOptions.create(application);
if (cbConfigD3DHook.enabled=false) and frmD3DTrainerGeneratorOptions.visible then
frmD3DTrainerGeneratorOptions.hide;
end;
procedure TfrmTrainerGenerator.edtCaptionChange(Sender: TObject);
begin
trainerform.caption:=edtcaption.text;
end;
procedure TfrmTrainerGenerator.edtPopupHotkeyKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
var i: integer;
begin
if popupkeys[4]=0 then
begin
for i:=0 to 4 do
if popupkeys[i]=0 then
begin
popupkeys[i]:=key;
break;
end else
if popupkeys[i]=key then break;
end;
edtPopupHotkey.Text:=ConvertKeyComboToString(popupkeys);
key:=0;
end;
procedure TfrmTrainerGenerator.FileNameEdit1Change(Sender: TObject);
begin
end;
initialization
RegisterClass(TTrainerForm);
{$I trainergenerator.lrs}
end.
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/JonDO/cheat-engine.git
git@gitee.com:JonDO/cheat-engine.git
JonDO
cheat-engine
cheat-engine
master

Search