root/Cheat Engine/formMemoryModifier.pas @ 314

Revision 314, 31.4 kB (checked in by dark_byte, 7 months ago)

commiting all minor fixes

Line 
1unit formMemoryModifier;
2
3interface
4
5uses
6  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7  Dialogs, StdCtrls, Menus, ExtDlgs, ComCtrls, Buttons, ExtCtrls,shellapi,tlhelp32,
8  cefuncproc,ExtraTrainerComponents, jpeg, KIcon;
9
10const trainerversion=8;
11
12type TcodeEntry = record
13  address: dword;
14  modulename: string;
15  moduleoffset: dword;
16  originalopcode: array of byte;
17end;
18
19type TAddressEntry = record
20  address: dword;
21  interpretableaddress: string;
22  ispointer: boolean;
23  pointers: array of TCEPointer;
24  bit: byte;
25  memtyp: integer;
26  frozen: boolean;
27  frozendirection: byte;
28  setvalue: boolean;
29  userinput: boolean;
30  value: string;
31  autoassemblescript: string;         
32end;
33
34type Ttrainerdata = record
35  description: string;
36  hotkeytext: string;
37  hotkey: TKeyCombo;
38  hasedit: boolean;
39  editvalue: string;
40
41  codeentrys: array of TCodeEntry;
42  addressentrys: array of TAddressEntry;
43end;
44
45type
46  TfrmMemoryModifier = class(TForm)
47    Button1: TButton;
48    Button2: TButton;
49    lblWidthHeight: TLabel;
50    OpenPictureDialog1: TOpenPictureDialog;
51    SaveDialog1: TSaveDialog;
52    Panel1: TPanel;
53    Label1: TLabel;
54    spbUp: TSpeedButton;
55    spbDown: TSpeedButton;
56    recordview: TListView;
57    PopupMenu1: TPopupMenu;
58    Delete1: TMenuItem;
59    OpenDialog1: TOpenDialog;
60    Button3: TButton;
61    Icon: TImage;
62    Label4: TLabel;
63    Button5: TButton;
64    editTitle: TEdit;
65    OpenDialog2: TOpenDialog;
66    Edit2: TEdit;
67    Label2: TLabel;
68    ComboBox1: TComboBox;
69    Label3: TLabel;
70    LoadButton: TSpeedButton;
71    Button4: TButton;
72    Button6: TButton;
73    OpenDialog3: TOpenDialog;
74    CheckBox1: TCheckBox;
75    EditHotkey: TEdit;
76    Button7: TButton;
77    CheckBox2: TCheckBox;
78    Memo1: TMemo;
79    editFreezeInterval: TEdit;
80    Label5: TLabel;
81    Label6: TLabel;
82    cbPreventReopening: TCheckBox;
83    Button8: TButton;
84    procedure FormClose(Sender: TObject; var Action: TCloseAction);
85    procedure Button2Click(Sender: TObject);
86    procedure Button4Click(Sender: TObject);
87    procedure recordviewClick(Sender: TObject);
88    procedure Button1Click(Sender: TObject);
89    procedure Button5Click(Sender: TObject);
90    procedure editTitleChange(Sender: TObject);
91    procedure Button6Click(Sender: TObject);
92    procedure spbUpClick(Sender: TObject);
93    procedure spbDownClick(Sender: TObject);
94    procedure LoadButtonClick(Sender: TObject);
95    procedure FormCreate(Sender: TObject);
96    procedure Edit2Change(Sender: TObject);
97    procedure ComboBox1Change(Sender: TObject);
98    procedure Button3Click(Sender: TObject);
99    procedure Button7Click(Sender: TObject);
100    procedure EditHotkeyKeyDown(Sender: TObject; var Key: Word;
101      Shift: TShiftState);
102    procedure CheckBox1Click(Sender: TObject);
103    procedure FormShow(Sender: TObject);
104    procedure EditHotkeyKeyPress(Sender: TObject; var Key: Char);
105    procedure recordviewDblClick(Sender: TObject);
106    procedure Button8Click(Sender: TObject);
107  private
108    { Private declarations }
109
110    procedure changeicon(filename: string);
111  public
112    { Public declarations }
113    currentIcon: TKIcon;
114    trainerdata: array of TTrainerdata;
115    changed: boolean;
116    popuphotkey: tkeycombo;
117    dontshowdefault:boolean;
118    leftimage: tmemorystream;
119    leftimageext: string;
120  end;
121
122var
123  frmMemoryModifier: TfrmMemoryModifier;
124
125implementation
126
127uses formMemoryTrainerUnit, formMemoryTrainerAddEntry, MainUnit,
128  MemoryTrainerDesignUnit;
129
130{$R *.dfm}
131
132procedure TfrmMemoryModifier.FormClose(Sender: TObject;
133  var Action: TCloseAction);
134begin
135  action:=cafree;
136  frmMemoryModifier:=nil;
137  frmMemoryTrainerPreview.Close;
138  frmMemoryTrainerPreview.free;
139  frmMemoryTrainerPreview:=nil;
140  currentIcon.free;
141end;
142
143procedure TfrmMemoryModifier.Button2Click(Sender: TObject);
144begin
145  if openpicturedialog1.execute then
146  begin
147    frmMemorytrainerpreview.Image1.Picture.LoadFromFile(openpicturedialog1.filename);
148
149    //no error
150    if leftimage=nil then
151      freeandnil(leftimage);
152
153    leftimage:=tmemorystream.create;
154    leftimage.loadfromfile(openpicturedialog1.filename);
155    leftimageext:=ExtractFileExt(openpicturedialog1.filename);
156
157    changed:=true;
158  end;
159end;
160
161procedure TfrmMemoryModifier.Button4Click(Sender: TObject);
162begin
163  FrmMemoryTrainerAddEntry:=tFrmMemoryTrainerAddEntry.create(self);
164  FrmMemoryTrainerAddEntry.showmodal;
165
166  frmMemoryTrainerPreview.UpdateScreen;
167  if frmTrainerDesigner<>nil then
168    frmTrainerDesigner.UpdateCheats;
169end;
170
171procedure TfrmMemoryModifier.changeicon(filename: string);
172var resh: thandle;
173    s: tmemorystream;
174    tid: TIconData;
175begin
176    resh:=BeginUpdateResource(pchar(filename),false);
177    if (resh<>0) then
178    begin
179      try
180        // icon.p
181        s:=tmemorystream.Create;
182        try
183          //writeicon2(s, icon.Picture.Icon.Handle, false);
184          CurrentIcon.SaveToStream(s);
185
186          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
187            showmessage('Error changing the icon');
188        finally
189          s.Free;
190        end;
191      finally
192        EndUpdateResource(resh,false);
193      end;
194    end;
195   
196end;
197
198procedure TfrmMemoryModifier.recordviewClick(Sender: TObject);
199begin
200  if recordview.ItemIndex<>-1 then
201  begin
202    spbUp.Enabled:=recordview.itemindex>0;
203    spbDown.enabled:=recordview.itemindex<(recordview.Items.Count-1);
204  end
205  else
206  begin
207    spbUp.Enabled:=false;
208    spbDown.enabled:=false;
209  end;
210end;
211
212procedure TfrmMemoryModifier.Button1Click(Sender: TObject);
213var res: TResourceStream;
214    trainer,iconstream,imagestream: TMemorystream;
215    searcher: ^char;
216    scanstring: string;
217    i,j,k,l: integer;
218    iconbuf,x: pchar;
219    temp: dword;
220    tempi: integer;
221    tempb: boolean;
222    temps: string;
223
224    protect: boolean;
225
226    iconsize: integer;
227begin
228  protect:=cbPreventReopening.checked;
229  if combobox1.Text='' then raise exception.Create('At least fill in a processname');
230
231  if savedialog1.execute then
232  begin
233    //exctract exe
234    res:=TResourceStream.Create(hinstance,'TRAINER','CEINCEXE');
235
236    trainer:=TMemorystream.Create;
237    res.SaveToFile(savedialog1.FileName);
238    res.free;
239
240    //change the icon
241    changeicon(savedialog1.FileName);
242
243    //load back in memory
244    trainer.LoadFromFile(savedialog1.FileName);
245
246    temp:=trainer.Size;
247    trainer.position:=80;
248    trainer.Writebuffer(temp,4);
249
250    //write the trainerdata to the end of the file
251    trainer.position:=trainer.size;
252
253    if protect then
254      temp:=$22322
255    else
256      temp:=$22222;  //kind of trainer
257     
258    trainer.WriteBuffer(temp,4);
259
260    temp:=trainerversion;
261    trainer.WriteBuffer(temp,4);
262
263    temp:=length(trainerdata);   //point to start of trainerdata
264
265    trainer.WriteBuffer(temp,4);
266
267    for i:=0 to length(trainerdata)-1 do
268    begin
269      temp:=length(trainerdata[i].description);
270      trainer.WriteBuffer(temp,4);
271
272      x:=pchar(trainerdata[i].description);
273      trainer.WriteBuffer(pointer(x)^,temp);
274
275      temp:=length(trainerdata[i].hotkeytext);
276      trainer.WriteBuffer(temp,4);
277
278      x:=pchar(trainerdata[i].hotkeytext);
279      trainer.WriteBuffer(pointer(x)^,temp);
280
281      trainer.WriteBuffer(trainerdata[i].hotkey,sizeof(trainerdata[i].hotkey));
282
283      temp:=length(Trainerdata[i].codeEntrys);
284      trainer.WriteBuffer(temp,4);
285      for j:=0 to length(trainerdata[i].codeentrys)-1 do
286      begin
287        //address
288        temp:=trainerdata[i].codeentrys[j].address;
289        if protect then temp:=temp xor $11221122;
290
291        trainer.WriteBuffer(temp,4);
292
293        //modulename
294        temp:=length(trainerdata[i].codeentrys[j].modulename);
295        trainer.WriteBuffer(temp,4);
296
297        x:=pchar(trainerdata[i].codeentrys[j].modulename);
298        trainer.WriteBuffer(pointer(x)^,temp);
299
300        temp:=trainerdata[i].codeentrys[j].moduleoffset;
301        if protect then temp:=temp xor $22112211;
302        trainer.WriteBuffer(temp,4);
303
304
305
306        //original opcode
307        temp:=length(trainerdata[i].codeentrys[j].originalopcode);
308        trainer.WriteBuffer(temp,4);
309        trainer.WriteBuffer(pointer(trainerdata[i].codeentrys[j].originalopcode)^,temp);
310      end;
311
312      temp:=length(Trainerdata[i].addressentrys);
313      trainer.WriteBuffer(temp,4);
314      for j:=0 to length(trainerdata[i].addressentrys)-1 do
315      begin
316        temp:=trainerdata[i].addressentrys[j].address;
317        if protect then temp:=temp xor $dead1337;
318
319        trainer.WriteBuffer(temp,sizeof(trainerdata[i].addressentrys[j].address));
320
321
322        //interpretableaddress
323        temp:=length(trainerdata[i].addressentrys[j].interpretableaddress);
324        trainer.writebuffer(temp,sizeof(temps));
325
326        temps:=trainerdata[i].addressentrys[j].interpretableaddress;
327        if protect then //encrypt temps
328          for k:=1 to length(temps) do
329            temps[k]:=chr(ord(temps[k]) xor (k+1));
330           
331        trainer.writebuffer(temps[1],temp);
332
333
334
335
336        trainer.WriteBuffer(trainerdata[i].addressentrys[j].ispointer,sizeof(trainerdata[i].addressentrys[j].ispointer));
337
338        tempi:=length(trainerdata[i].addressentrys[j].pointers);
339        trainer.WriteBuffer(tempi,4);
340        for k:=0 to tempi-1 do
341        begin
342          trainer.WriteBuffer(trainerdata[i].addressentrys[j].pointers[k].address,sizeof(trainerdata[i].addressentrys[j].pointers[k].address));
343
344          //interpretableaddress for pointer
345
346          temp:=length(trainerdata[i].addressentrys[j].pointers[k].Interpretableaddress);
347          trainer.writebuffer(temp,sizeof(temps));
348
349          temps:=trainerdata[i].addressentrys[j].pointers[k].Interpretableaddress;
350          if protect then //encrypt temps
351            for l:=1 to length(temps) do
352              temps[l]:=chr(ord(temps[l]) xor (l+2));
353
354          trainer.writebuffer(temps[1],temp);
355
356          trainer.WriteBuffer(trainerdata[i].addressentrys[j].pointers[k].offset,sizeof(trainerdata[i].addressentrys[j].pointers[k].offset));
357        end;
358
359        trainer.WriteBuffer(trainerdata[i].addressentrys[j].bit,sizeof(trainerdata[i].addressentrys[j].bit));
360        trainer.WriteBuffer(trainerdata[i].addressentrys[j].memtyp,sizeof(trainerdata[i].addressentrys[j].memtyp));
361        trainer.writebuffer(trainerdata[i].addressentrys[j].frozen,sizeof(trainerdata[i].addressentrys[j].frozen));
362        trainer.writebuffer(trainerdata[i].addressentrys[j].frozendirection,sizeof(trainerdata[i].addressentrys[j].frozendirection));
363        trainer.writebuffer(trainerdata[i].addressentrys[j].setvalue,sizeof(trainerdata[i].addressentrys[j].setvalue));
364        trainer.WriteBuffer(trainerdata[i].addressentrys[j].userinput,sizeof(trainerdata[i].addressentrys[j].userinput));
365        temp:=length(trainerdata[i].addressentrys[j].value);
366        trainer.writebuffer(temp,4);
367        trainer.writebuffer(trainerdata[i].addressentrys[j].value[1],temp);
368       
369
370        temp:=length(trainerdata[i].addressentrys[j].autoassemblescript);
371        trainer.writebuffer(temp,sizeof(temp));
372
373        temps:=trainerdata[i].addressentrys[j].autoassemblescript;
374        if protect then //encrypt temps
375          for k:=1 to length(temps) do
376            temps[k]:=chr(ord(temps[k]) xor k);
377
378        trainer.writebuffer(temps[1],temp);
379      end;
380    end;
381
382    //title
383    temp:=length(editTitle.text);
384    trainer.writebuffer(temp,4);
385
386    temps:=edittitle.text;
387    if protect then
388    begin
389      for i:=1 to temp do
390        temps[i]:=chr(ord(temps[i]) xor 56);
391    end;
392
393    x:=pchar(temps);
394    trainer.writebuffer(pointer(x)^,temp);
395
396    //launch filename
397    temp:=length(edit2.text);
398    trainer.writebuffer(temp,4);
399    x:=pchar(edit2.text);
400    trainer.writebuffer(pointer(x)^,temp);
401
402    //autolaunch
403    tempb:=checkbox2.checked;
404    trainer.writebuffer(tempb,sizeof(tempb));
405
406    //popup on keypress
407    tempb:=checkbox1.Checked;
408    trainer.writebuffer(tempb,sizeof(tempb));
409
410    //process to modify
411    temp:=length(combobox1.text);
412    trainer.writebuffer(temp,4);
413    x:=pchar(combobox1.text);
414    trainer.writebuffer(pointer(x)^,temp);
415
416    //hotkeytext
417    temp:=length(edithotkey.text);
418    trainer.writebuffer(temp,4);
419    x:=pchar(edithotkey.text);
420    trainer.writebuffer(pointer(x)^,temp);
421
422    //hotkey
423    trainer.WriteBuffer(popuphotkey,sizeof(popuphotkey));
424
425    //aboutbox
426    temp:=length(memo1.text);
427    trainer.writebuffer(temp,4);
428
429    temps:=memo1.Text;
430    if protect then
431    begin
432      for i:=1 to temp do
433        temps[i]:=chr(ord(temps[i]) xor 166);
434    end;
435
436    x:=pchar(temps);
437    trainer.writebuffer(pointer(x)^,temp);
438
439    //freeze interval
440    tempi:=strtoint(editfreezeinterval.text);
441    trainer.WriteBuffer(tempi,sizeof(tempi));
442
443    if frmTrainerDesigner=nil then
444    begin
445      //default uid
446      temp:=$666;
447      trainer.WriteBuffer(temp,4);
448
449
450      //leftside image
451      //size of extension
452      temp:=length(leftimageext);
453      trainer.WriteBuffer(temp,4);
454      trainer.WriteBuffer(leftimageext[1],temp);
455
456      if leftimage<>nil then
457        temp:=leftimage.Size
458      else
459        temp:=0;
460
461      trainer.WriteBuffer(temp,4);
462
463      if leftimage<>nil then
464        leftimage.SaveToStream(trainer);
465
466
467      //windowwidth
468      trainer.writebuffer(frmMemorytrainerpreview.Width,sizeof(frmMemorytrainerpreview.Width));
469
470      //windowheight
471      trainer.writebuffer(frmMemorytrainerpreview.height,sizeof(frmMemorytrainerpreview.height));
472
473      //leftsidewidth
474      trainer.writebuffer(frmMemorytrainerpreview.Panel1.Width,sizeof(frmMemorytrainerpreview.Panel1.Width));
475
476      //leftsideheight
477      trainer.writebuffer(frmMemorytrainerpreview.Panel1.height,sizeof(frmMemorytrainerpreview.Panel1.height));
478    end
479    else
480    begin
481      //user defined UID
482      temp:=$777;
483      trainer.WriteBuffer(temp,4);
484
485      //windowwidth
486      trainer.writebuffer(frmTrainerDesigner.Width,sizeof(frmTrainerDesigner.Width));
487
488      //windowheight
489      trainer.writebuffer(frmTrainerDesigner.height,sizeof(frmTrainerDesigner.height));
490
491
492      //note:make this oop
493
494      for i:=0 to frmtrainerdesigner.ComponentCount-1 do
495      begin
496        if (frmtrainerdesigner.Components[i] is tbutton2) then
497        begin
498          temp:=0;      //tbutton
499          trainer.WriteBuffer(temp,4);
500          trainer.WriteBuffer(tbutton2(frmtrainerdesigner.Components[i]).left,sizeof(integer));
501          trainer.WriteBuffer(tbutton2(frmtrainerdesigner.Components[i]).top,sizeof(integer));
502          trainer.WriteBuffer(tbutton2(frmtrainerdesigner.Components[i]).width,sizeof(integer));
503          trainer.WriteBuffer(tbutton2(frmtrainerdesigner.Components[i]).height,sizeof(integer));
504
505          //caption
506          temp:=length(tbutton2(frmtrainerdesigner.Components[i]).Caption);
507          trainer.writebuffer(temp,4);
508          x:=pchar(tbutton2(frmtrainerdesigner.Components[i]).Caption);
509          trainer.writebuffer(pointer(x)^,temp);
510
511          trainer.WriteBuffer(tbutton2(frmtrainerdesigner.Components[i]).wordwrap,sizeof(boolean));
512
513          //onclick
514          temp:=tbutton2(frmtrainerdesigner.Components[i]).Tag;
515          trainer.WriteBuffer(temp,4);
516
517          //command
518          temp:=length(tbutton2(frmtrainerdesigner.Components[i]).Command);
519          trainer.writebuffer(temp,4);
520          x:=pchar(tbutton2(frmtrainerdesigner.Components[i]).Command);
521          trainer.writebuffer(pointer(x)^,temp);
522        end;
523
524        if (frmtrainerdesigner.Components[i] is tcheatlist) then
525        begin
526          temp:=1;      //tcheatlist
527          trainer.WriteBuffer(temp,4);
528          trainer.WriteBuffer(tcheatlist(frmtrainerdesigner.Components[i]).left,sizeof(integer));
529          trainer.WriteBuffer(tcheatlist(frmtrainerdesigner.Components[i]).top,sizeof(integer));
530          trainer.WriteBuffer(tcheatlist(frmtrainerdesigner.Components[i]).width,sizeof(integer));
531          trainer.WriteBuffer(tcheatlist(frmtrainerdesigner.Components[i]).height,sizeof(integer));
532
533          trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).activationcolor,sizeof(tcolor));
534          trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).color,sizeof(tcolor));
535          trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).textcolor,sizeof(tcolor));
536          trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).hotkeyleft,sizeof(integer));
537          trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).descriptionleft,sizeof(integer));
538          trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).editleft,sizeof(integer));
539          trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).editwidth,sizeof(integer));
540
541          trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).BevelInner,sizeof(Tbevelcut));
542          trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).BevelOuter,sizeof(Tbevelcut));
543          trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).BevelWidth,sizeof(integer));
544          trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).bevelkind,sizeof(tbevelkind));
545
546          trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).HasCheckbox,sizeof(boolean));
547          trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).beepOnActivate,sizeof(boolean));
548          trainer.Writebuffer(tcheatlist(frmtrainerdesigner.Components[i]).ShowHotkeys,sizeof(boolean));         
549        end;
550
551        if (frmtrainerdesigner.Components[i] is tcheat) then
552        begin
553          temp:=2;      //tcheat
554          trainer.WriteBuffer(temp,4);
555          trainer.WriteBuffer(tcheat(frmtrainerdesigner.Components[i]).left,sizeof(integer));
556          trainer.WriteBuffer(tcheat(frmtrainerdesigner.Components[i]).top,sizeof(integer));
557          trainer.WriteBuffer(tcheat(frmtrainerdesigner.Components[i]).width,sizeof(integer));
558          trainer.WriteBuffer(tcheat(frmtrainerdesigner.Components[i]).height,sizeof(integer));
559
560          trainer.WriteBuffer(tcheat(frmtrainerdesigner.Components[i]).cheatnr,sizeof(integer));
561          trainer.Writebuffer(tcheat(frmtrainerdesigner.Components[i]).activationcolor,sizeof(tcolor));
562          trainer.Writebuffer(tcheat(frmtrainerdesigner.Components[i]).color,sizeof(tcolor));
563          trainer.Writebuffer(tcheat(frmtrainerdesigner.Components[i]).textcolor,sizeof(tcolor));
564
565          temp:=tcheat(frmtrainerdesigner.Components[i]).hotkeyleft;
566          trainer.Writebuffer(temp,4);
567          temp:=tcheat(frmtrainerdesigner.Components[i]).descriptionleft;
568          trainer.Writebuffer(temp,4);
569          temp:=tcheat(frmtrainerdesigner.Components[i]).editleft;
570          trainer.Writebuffer(temp,4);
571          temp:=tcheat(frmtrainerdesigner.Components[i]).editwidth;
572          trainer.Writebuffer(temp,4);
573
574          trainer.Writebuffer(tcheat(frmtrainerdesigner.Components[i]).HasCheckbox,sizeof(boolean));
575          trainer.Writebuffer(tcheat(frmtrainerdesigner.Components[i]).beeponActivate,sizeof(boolean));         
576          trainer.Writebuffer(tcheat(frmtrainerdesigner.Components[i]).ShowHotkey,sizeof(boolean));
577        end;
578
579        if (frmtrainerdesigner.Components[i] is timage2) then
580        begin
581          temp:=3;      //image
582          trainer.WriteBuffer(temp,4);
583          trainer.WriteBuffer(timage2(frmtrainerdesigner.Components[i]).left,sizeof(integer));
584          trainer.WriteBuffer(timage2(frmtrainerdesigner.Components[i]).top,sizeof(integer));
585          trainer.WriteBuffer(timage2(frmtrainerdesigner.Components[i]).width,sizeof(integer));
586          trainer.WriteBuffer(timage2(frmtrainerdesigner.Components[i]).height,sizeof(integer));
587
588          trainer.WriteBuffer(timage2(frmtrainerdesigner.Components[i]).cursor,sizeof(tcursor));
589          trainer.WriteBuffer(timage2(frmtrainerdesigner.Components[i]).stretch,sizeof(boolean));
590          trainer.WriteBuffer(timage2(frmtrainerdesigner.Components[i]).transparent,sizeof(boolean));
591          trainer.WriteBuffer(timage2(frmtrainerdesigner.Components[i]).tag,sizeof(integer));
592
593          //image extension
594          temp:=length(timage2(frmtrainerdesigner.Components[i]).extension);
595          trainer.writebuffer(temp,4);         //size of extension
596          x:=pchar(timage2(frmtrainerdesigner.Components[i]).extension);
597          trainer.writebuffer(pointer(x)^,temp); //ext
598
599          temp:=timage2(frmtrainerdesigner.Components[i]).imagedata.size;  //size of imagedata
600          trainer.WriteBuffer(temp,4);
601          timage2(frmtrainerdesigner.Components[i]).imagedata.savetostream(trainer); //imagedata
602
603
604
605
606          //command
607          temp:=length(timage2(frmtrainerdesigner.Components[i]).Command);
608          trainer.writebuffer(temp,4);
609          x:=pchar(timage2(frmtrainerdesigner.Components[i]).Command);
610          trainer.writebuffer(pointer(x)^,temp);
611        end;
612
613        if (frmtrainerdesigner.Components[i] is tlabel2) then
614        begin
615          temp:=4;      //tlabel
616          trainer.WriteBuffer(temp,4);
617          trainer.WriteBuffer(tlabel2(frmtrainerdesigner.Components[i]).left,sizeof(integer));
618          trainer.WriteBuffer(tlabel2(frmtrainerdesigner.Components[i]).top,sizeof(integer));
619          trainer.WriteBuffer(tlabel2(frmtrainerdesigner.Components[i]).width,sizeof(integer));
620          trainer.WriteBuffer(tlabel2(frmtrainerdesigner.Components[i]).height,sizeof(integer));
621
622          //caption
623          temp:=length(tlabel2(frmtrainerdesigner.Components[i]).Caption);
624          trainer.writebuffer(temp,4);
625          x:=pchar(tlabel2(frmtrainerdesigner.Components[i]).Caption);
626          trainer.writebuffer(pointer(x)^,temp);
627
628          //wordwrap
629          trainer.WriteBuffer(tlabel2(frmtrainerdesigner.Components[i]).wordwrap,sizeof(boolean));
630
631
632          //color
633          trainer.Writebuffer(tlabel2(frmtrainerdesigner.Components[i]).Font.color,sizeof(tcolor));
634
635          //command
636          temp:=length(tlabel2(frmtrainerdesigner.Components[i]).Command);
637          trainer.writebuffer(temp,4);
638          x:=pchar(tlabel2(frmtrainerdesigner.Components[i]).Command);
639          trainer.writebuffer(pointer(x)^,temp);
640
641          //cursor
642          trainer.WriteBuffer(tlabel2(frmtrainerdesigner.Components[i]).cursor,sizeof(tcursor));
643
644          //tag
645          trainer.WriteBuffer(tlabel2(frmtrainerdesigner.Components[i]).tag,sizeof(integer));
646
647          //fontstyle
648          tempb:=tlabel2(frmtrainerdesigner.Components[i]).Font.Style=[fsUnderline];
649          trainer.WriteBuffer(tempb,sizeof(tempb));
650        end;
651
652      end;
653
654      temp:=$ffffffff;  //indicate no other objects (although the eof would be a good indication too...)
655      trainer.WriteBuffer(temp,4);
656    end;
657
658    //save to file
659    trainer.SaveToFile(savedialog1.filename);
660    trainer.free;
661
662    {  //commented out because the trainer can't handle this
663    if cefuncproc.GetSystemType >=4 then //nt+
664      changeicon(savedialog1.filename);
665      }
666
667    showmessage('Trainer generated');
668  end;
669end;
670
671procedure TfrmMemoryModifier.Button5Click(Sender: TObject);
672var HI: HICON;
673    test: TMemorystream;
674    resp: pointer;
675
676
677begin
678
679  if opendialog2.execute then
680  begin
681    HI:=ExtractIcon(hinstance,pchar(opendialog2.filename),0);
682    if hi=1 then
683      raise exception.Create('This file type is not supported');
684
685    if hi=0 then
686      raise exception.Create('No icon found in this file');
687
688
689
690    CurrentIcon.LoadFromHandle(hi); //meh...
691
692
693    CurrentIcon.MaskFromColor(0,clBlack);
694    //CurrentIcon.SaveToFile('c:\bla.ico');
695
696    icon.Picture.Icon.Handle:=HI;
697    {test:=TMemoryStream.Create;
698    icon.Picture.Icon.SaveToStream(test);
699
700    ic.SaveToStream(test);
701
702    try
703      if test.Size<>766 then
704        raise exception.Create('The size of this icon is '+IntToStr(test.size)+'. It should be 766');
705    finally
706      test.free;
707    end; }
708
709    frmMemoryTrainerPreview.Icon:=icon.Picture.Icon;
710    if frmTrainerDesigner<>nil then frmtrainerdesigner.Icon:=icon.Picture.Icon;
711  end;
712end;
713
714procedure TfrmMemoryModifier.editTitleChange(Sender: TObject);
715begin
716  frmMemoryTrainerPreview.Caption:=edittitle.Text;
717  if frmTrainerDesigner<>nil then frmTrainerdesigner.Caption:=edittitle.Text;
718  changed:=true;
719end;
720
721procedure TfrmMemoryModifier.Button6Click(Sender: TObject);
722var index: integer;
723    i,j: integer;
724begin
725  index:=recordview.ItemIndex;
726  if index<>-1 then
727  begin
728    for i:=0 to length(trainerdata[index].codeentrys)-1 do
729      setlength(trainerdata[index].codeentrys[i].originalopcode,0);
730
731    setlength(trainerdata[index].codeentrys,0);
732    setlength(trainerdata[index].addressentrys,0);
733
734    for i:=index to length(trainerdata)-2 do
735      trainerdata[i]:=trainerdata[i+1];
736
737    setlength(trainerdata,length(trainerdata)-1);
738    recordview.DeleteSelected;
739  end;
740
741  frmMemoryTrainerPreview.UpdateScreen;
742  if frmtrainerdesigner<>nil then frmtrainerdesigner.updatecheats
743end;
744
745procedure TfrmMemoryModifier.spbUpClick(Sender: TObject);
746var temp:TTrainerdata;
747    indeX: integer;
748    desc,hotkey: string;
749begin
750  index:=recordview.ItemIndex;
751  if index>=1 then
752  begin
753    temp:=trainerdata[index];
754    trainerdata[index]:=trainerdata[index-1];
755    trainerdata[index-1]:=temp;
756
757    desc:=recordview.Items[index].Caption;
758    hotkey:=recordview.Items[index].SubItems[0];
759    recordview.Items[index]:=recordview.items[index-1];
760
761    recordview.Items[index-1].Caption:=desc;
762    recordview.Items[index-1].SubItems[0]:=hotkey;
763
764    recordview.Items[index-1].Selected:=true;
765  end;
766
767  spbUp.Enabled:=recordview.itemindex>0;
768  spbDown.enabled:=recordview.itemindex<(recordview.Items.Count-1);
769
770  frmMemoryTrainerPreview.UpdateScreen;
771  if frmtrainerdesigner<>nil then frmtrainerdesigner.updatecheats
772end;
773
774procedure TfrmMemoryModifier.spbDownClick(Sender: TObject);
775var temp:TTrainerdata;
776    indeX: integer;
777    desc,hotkey: string;
778begin
779  index:=recordview.ItemIndex;
780  if index<recordview.Items.Count-1 then
781  begin
782    temp:=trainerdata[index];
783    trainerdata[index]:=trainerdata[index+1];
784    trainerdata[index+1]:=temp;
785
786    desc:=recordview.Items[index].Caption;
787    hotkey:=recordview.Items[index].SubItems[0];
788    recordview.Items[index]:=recordview.items[index+1];
789
790    recordview.Items[index+1].Caption:=desc;
791    recordview.Items[index+1].SubItems[0]:=hotkey;
792
793    recordview.Items[index+1].Selected:=true;
794  end;
795
796  spbUp.Enabled:=recordview.itemindex>0;
797  spbDown.enabled:=recordview.itemindex<(recordview.Items.Count-1);
798
799  frmMemoryTrainerPreview.UpdateScreen;
800  if frmtrainerdesigner<>nil then frmtrainerdesigner.updatecheats
801end;
802
803procedure TfrmMemoryModifier.LoadButtonClick(Sender: TObject);
804begin
805  if opendialog3.Execute then
806    edit2.text:=extractfilename(opendialog3.filename);
807end;
808
809procedure TfrmMemoryModifier.FormCreate(Sender: TObject);
810Var SNAPHandle: THandle;
811    ProcessEntry: ProcessEntry32;
812    Check: Boolean;
813    FullProcessName,ProcessName: String;
814    I: Integer;
815begin
816  currentIcon:=TKIcon.Create;
817 
818  changed:=false;
819
820  left:=mainform.left-180;
821  if left<0 then left:=0;
822
823  top:=mainform.top+( (mainform.clientheight div 2)-(height div 2));
824
825  combobox1.clear;
826  SNAPHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
827  If SnapHandle>0 then
828  begin
829    ProcessEntry.dwSize:=SizeOf(ProcessEntry);
830    Check:=Process32First(SnapHandle,ProcessEntry);
831    while check=true do
832    begin
833      ProcessName:='';
834      FullProcessName:='';
835      FullProcessName:=processentry.szExeFile;
836      i:=Length(FullProcessName);
837      while (i>0) and (FullProcessname[i-1]<>'\') do dec(i);
838      processname:=copy(FullProcessName,i,length(FullProcessname)-i+1);
839      combobox1.Items.Add(processname);
840      check:=Process32Next(SnapHandle,ProcessEntry);
841    end;
842  end else raise exception.Create('I can''t get the process list.');
843
844  frmMemoryTrainerPreview:=tfrmMemoryTrainerPreview.create(self);
845  frmMemoryTrainerPreview.left:=left+width;
846  frmMemoryTrainerPreview.Top:=top;
847  frmMemoryTrainerPreview.Height:=height;
848 
849
850end;
851
852procedure TfrmMemoryModifier.Edit2Change(Sender: TObject);
853begin
854  changed:=true;
855end;
856
857procedure TfrmMemoryModifier.ComboBox1Change(Sender: TObject);
858begin
859  changed:=true;
860end;
861
862procedure TfrmMemoryModifier.Button3Click(Sender: TObject);
863begin
864  if changed or (recordview.items.count>0) then
865  begin
866    if messagedlg('Are you sure?',mtConfirmation,[mbyes,mbno],0)=mrYes then modalresult:=mrcancel;
867  end else modalresult:=mrcancel;
868
869  if modalresult=mrcancel then close;
870end;
871
872procedure TfrmMemoryModifier.Button7Click(Sender: TObject);
873begin
874  if frmTrainerDesigner<>nil then
875  begin
876    frmTrainerDesigner.Close;
877    exit;
878  end;
879
880  button2.Enabled:=false;
881
882  frmMemoryTrainerPreview.Visible:=false;
883  frmTrainerDesigner:=Tfrmtrainerdesigner.create(self);
884  frmTrainerdesigner.Caption:=edittitle.Text;
885  frmtrainerdesigner.Icon:=frmMemoryTrainerPreview.Icon;
886  frmTrainerDesigner.BoundsRect:=frmMemoryTrainerPreview.BoundsRect;
887  frmTrainerDesigner.show;
888
889  button7.Caption:='Use default trainer layout';
890end;
891
892procedure TfrmMemoryModifier.EditHotkeyKeyDown(Sender: TObject; var Key: Word;
893  Shift: TShiftState);
894var i: integer;
895begin
896  if popuphotkey[4]=0 then
897  begin
898    for i:=0 to 4 do
899      if popuphotkey[i]=0 then
900      begin
901        popuphotkey[i]:=key;
902        break;
903      end else
904      if popuphotkey[i]=key then break;  //already in list
905  end;
906
907  editHotkey.Text:=ConvertKeyComboToString(popuphotkey);
908end;
909
910procedure TfrmMemoryModifier.CheckBox1Click(Sender: TObject);
911begin
912  edithotkey.Enabled:=checkbox1.Checked;
913end;
914
915procedure TfrmMemoryModifier.FormShow(Sender: TObject);
916begin
917  if not dontshowdefault then frmMemoryTrainerPreview.Show;
918end;
919
920procedure TfrmMemoryModifier.EditHotkeyKeyPress(Sender: TObject;
921  var Key: Char);
922begin
923  key:=#0;
924end;
925
926procedure TfrmMemoryModifier.recordviewDblClick(Sender: TObject);
927var i,j: integer;
928begin
929{  i:=recordview.ItemIndex;
930  if i<>-1 then
931  begin
932    FrmMemoryTrainerAddEntry:=tFrmMemoryTrainerAddEntry.create(self);
933    FrmMemoryTrainerAddEntry.editmode:=true;
934
935    with FrmMemoryTrainerAddEntry do
936    begin
937      editDescription.Text:=trainerdata[i].description;
938      edithotkey.Text:=trainerdata[i].hotkeytext;
939      laststate:=trainerdata[i].hotkey;
940      lastshiftstate:=[];
941
942      if (trainerdata[i].hotshift and MOD_CONTROL)=MOD_CONTROL then lastshiftstate:=lastshiftstate+[ssctrl];
943      if (trainerdata[i].hotshift and MOD_ALT)=MOD_ALT then lastshiftstate:=lastshiftstate+[ssalt];
944      if (trainerdata[i].hotshift and MOD_Shift)=MOD_Shift then lastshiftstate:=lastshiftstate+[ssshift];
945
946      for j:=0 to length(trainerdata[i].codeentrys)-1 do
947      begin
948        trainerdata[i].codeentrys[j].address
949        trainerdata[i].codeentrys[j].originalopcode
950
951
952      end;
953    end;
954
955    FrmMemoryTrainerAddEntry.showmodal;
956
957    frmMemoryTrainerPreview.UpdateScreen;
958    if frmTrainerDesigner<>nil then
959      frmTrainerDesigner.UpdateCheats;
960  end;}
961end;
962
963procedure TfrmMemoryModifier.Button8Click(Sender: TObject);
964begin
965  zeromemory(@popuphotkey[0],10);
966  editHotkey.Text:=ConvertKeyComboToString(popuphotkey);
967  edithotkey.SetFocus;
968end;
969
970end.
971
972
973
974
Note: See TracBrowser for help on using the browser.