mirror of
https://github.com/cheat-engine/cheat-engine
synced 2026-08-15 02:26:08 -04:00
329 lines
9 KiB
ObjectPascal
Executable file
329 lines
9 KiB
ObjectPascal
Executable file
unit Unit10;
|
|
{Shared code tutorial}
|
|
|
|
{$MODE Delphi}
|
|
|
|
interface
|
|
|
|
uses
|
|
{$ifdef windows}windows,{$endif} LCLIntf, Messages, SysUtils, Classes, Graphics, Controls, Forms,
|
|
Dialogs, Unit8, StdCtrls, Buttons, LResources, ExtCtrls, math, betterControls;
|
|
|
|
type
|
|
TPlayer=class
|
|
private
|
|
public
|
|
health: Single;
|
|
boguscrap: dword;
|
|
unrelatedrandomlychangingthing: integer;
|
|
team: integer;
|
|
name: string[63];
|
|
teammate: TPlayer;
|
|
healthlabel: TLabel;
|
|
wasteofspace: array [0..99123] of byte;
|
|
procedure Hit(damage: integer);
|
|
end;
|
|
|
|
type
|
|
|
|
{ TForm10 }
|
|
|
|
TForm10 = class(TForm8)
|
|
Button3: TButton;
|
|
Button4: TButton;
|
|
Button5: TButton;
|
|
Button6: TButton;
|
|
Button7: TButton;
|
|
Button8: TButton;
|
|
Label10: TLabel;
|
|
Label2: TLabel;
|
|
Label3: TLabel;
|
|
Label4: TLabel;
|
|
Label5: TLabel;
|
|
Label6: TLabel;
|
|
Label7: TLabel;
|
|
Label8: TLabel;
|
|
Label9: TLabel;
|
|
Panel1: TPanel;
|
|
Panel2: TPanel;
|
|
Panel3: TPanel;
|
|
Panel4: TPanel;
|
|
Panel5: TPanel;
|
|
procedure Button2Click(Sender: TObject);
|
|
procedure Button1Click(Sender: TObject);
|
|
procedure Button3Click(Sender: TObject);
|
|
procedure Button4Click(Sender: TObject);
|
|
procedure Button5Click(Sender: TObject);
|
|
procedure Button6Click(Sender: TObject);
|
|
procedure Button7Click(Sender: TObject);
|
|
procedure Button8Click(Sender: TObject);
|
|
procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure SpeedButton1Click(Sender: TObject);
|
|
private
|
|
{ Private declarations }
|
|
p1, p2, p3,p4: TPlayer;
|
|
{$ifdef windows}
|
|
procedure LaunchGraphicalTut;
|
|
{$endif}
|
|
public
|
|
{ Public declarations }
|
|
end;
|
|
|
|
var
|
|
Form10: TForm10;
|
|
|
|
implementation
|
|
|
|
uses Unit4, frmHelpUnit, cetranslator;
|
|
|
|
resourcestring
|
|
rsThisPlayerIsAlreadyDeadRestartTheGame = 'This player is already dead. Restart the game';
|
|
rsDEAD = 'DEAD';
|
|
rsHealth = 'Health: %s';
|
|
rsStop = 'Stop';
|
|
rsRestartGameAndAutoplay = 'Restart game and autoplay';
|
|
rsFailureYourTeamDied = 'Failure. Your team died';
|
|
rsTryAgain10 = 'Can''t figure out how to do this? Don''t worry. Try asking in the forum at cheatengine.org or perhaps someone already explained it better '
|
|
+'there. Are you sure you want to quit?';
|
|
rsStep9SharedCodePW = 'Step 9: Shared code: (PW=%s)';
|
|
|
|
rsTutorialStep9=
|
|
'This step will explain how to deal with code that is used for other object of the same type'+#13#10+
|
|
''+#13#10+
|
|
'Often when you''ve found health of a unit or your own player, you will find that if you remove the code, it affects '+
|
|
'enemies as well.'+#13#10+
|
|
'In these cases you must find out how to distinguish between your and the enemies objects.'+#13#10+
|
|
'Sometimes this is as easy as checking the first 4 bytes (Function pointer table) which often point to a unique location '+
|
|
'for the player, and sometimes it''s a team number, or a pointer to a pointer to a pointer to a pointer to a pointer to a '+
|
|
'playername. It all depends on the complexity of the game, and your luck'+#13#10+
|
|
''+#13#10+
|
|
'The easiest method is finding what addresses the code you found writes to and then use the dissect data feature to '+
|
|
'compare against two structures. (Your unit(s)/player and the enemies) And then see if you can find out a way to '+
|
|
'distinguish between them.'+#13#10+
|
|
'When you have found out how to distinguish between you and the computer you can inject an assembler script that '+
|
|
'checks for the condition and then either do not execute the code or do something else. (One hit kills for example)'+#13#10+
|
|
'Alternatively, you can also use this to build a so called "Array of byte" string which you can use to search which will '+
|
|
'result in a list of all your or the enemies players'+
|
|
''+#13#10+
|
|
'In this tutorial I have implemented the most amazing game you will ever play.'+#13#10+
|
|
'It has 4 players. 2 Players belong to your team, and 2 Players belong to the computer. '+#13#10+
|
|
'Your task is to find the code that writes the health and make it so you win the game WITHOUT freezing your health'+#13#10+
|
|
'To continue, press "Restart game and autoplay" to test that your code is correct'+#13#10+
|
|
''+#13#10+
|
|
''+#13#10+
|
|
'Tip: Health is a float'+#13#10+
|
|
'Tip2: There are multiple solutions';
|
|
rsU10ThisWasTheLastTutorial = 'This was the last tutorial and you skipped it. You lose';
|
|
|
|
procedure TPlayer.Hit(damage: integer);
|
|
var x: single;
|
|
begin
|
|
if health=0 then
|
|
begin
|
|
showmessage(rsThisPlayerIsAlreadyDeadRestartTheGame);
|
|
exit;
|
|
end;
|
|
|
|
x:=max(0, health-damage);
|
|
health:=x;
|
|
|
|
if health=0 then
|
|
healthlabel.Caption:=rsDEAD
|
|
else
|
|
healthlabel.caption:=Format(rsHealth, [FloatToStr(health)]);
|
|
|
|
unrelatedrandomlychangingthing:=random(5000000);
|
|
end;
|
|
|
|
|
|
{$ifdef windows}
|
|
procedure TForm10.LaunchGraphicalTut;
|
|
var nexttut: string;
|
|
filename: string;
|
|
begin
|
|
filename:='gtutorial-'+{$ifdef cpu32}'i386'{$else}'x86_64'{$endif}+'.exe';
|
|
nexttut:=ExtractFilePath(application.ExeName)+filename;
|
|
|
|
if fileexists(nexttut) then
|
|
begin
|
|
//launch the graphical tutorial
|
|
|
|
ShellExecute(0, PChar('open'), PChar(nexttut),PChar(''), PChar(extractfilepath(nexttut)), SW_SHOW);
|
|
ExitProcess(0);
|
|
end;
|
|
|
|
|
|
nexttut:=ExtractFileDir(application.ExeName);
|
|
|
|
if ExtractFileName(nexttut)='bin' then
|
|
begin
|
|
nexttut:=ExtractFilePath(nexttut)+'tutorial\graphical\'+filename;
|
|
|
|
if fileexists(nexttut) then
|
|
begin
|
|
//launch the graphical tutorial
|
|
ShellExecute(0, PChar('open'), PChar(nexttut),PChar(''), PChar(extractfilepath(nexttut)), SW_SHOW);
|
|
ExitProcess(0);
|
|
end;
|
|
end;
|
|
end;
|
|
{$endif}
|
|
|
|
procedure TForm10.Button2Click(Sender: TObject);
|
|
begin
|
|
{$ifdef windows}
|
|
LaunchGraphicalTut;
|
|
{$endif}
|
|
hide;
|
|
form4:=tform4.create(self);
|
|
form4.show;
|
|
|
|
frmHelp.free;
|
|
frmHelp:=nil;
|
|
|
|
end;
|
|
|
|
procedure TForm10.Button1Click(Sender: TObject);
|
|
begin
|
|
|
|
|
|
|
|
end;
|
|
|
|
procedure TForm10.Button3Click(Sender: TObject);
|
|
var z: pchar;
|
|
begin
|
|
//memoryleak on purpose
|
|
p1:=TPlayer.Create;
|
|
p1.name:='Dave';
|
|
p1.health:=100;
|
|
p1.boguscrap:=random(10000);
|
|
p1.team:=1;
|
|
p1.healthlabel:=Label4;
|
|
p1.healthlabel.caption:=Format(rsHealth, [FloatToStr(p1.health)]);
|
|
|
|
getmem(z, 1+random(90000));
|
|
|
|
p2:=TPlayer.Create;
|
|
p2.name:='Eric';
|
|
p2.health:=100;
|
|
p2.boguscrap:=random(10000);
|
|
p2.team:=1;
|
|
p2.healthlabel:=Label6;
|
|
p2.healthlabel.caption:=Format(rsHealth, [FloatToStr(p2.health)]);
|
|
|
|
p1.teammate:=p2;
|
|
p2.teammate:=p1;
|
|
|
|
getmem(z, 1+random(90000));
|
|
|
|
p3:=TPlayer.Create;
|
|
p3.name:='HAL';
|
|
p3.health:=500;
|
|
p3.boguscrap:=random(10000);
|
|
p3.team:=2;
|
|
p3.healthlabel:=label8;
|
|
p3.healthlabel.caption:=Format(rsHealth, [FloatToStr(p3.health)]);
|
|
|
|
getmem(z, 1+random(90000));
|
|
|
|
p4:=TPlayer.Create;
|
|
p4.name:='KITT';
|
|
p4.health:=500;
|
|
p4.boguscrap:=random(10000);
|
|
p4.team:=2;
|
|
p4.healthlabel:=label10;
|
|
p4.healthlabel.caption:=Format(rsHealth, [FloatToStr(p4.health)]);
|
|
|
|
p3.teammate:=p4;
|
|
p4.teammate:=p3;
|
|
end;
|
|
|
|
procedure TForm10.Button4Click(Sender: TObject);
|
|
begin
|
|
p3.Hit(1+random(1));
|
|
end;
|
|
|
|
procedure TForm10.Button5Click(Sender: TObject);
|
|
begin
|
|
p4.Hit(1+random(1));
|
|
end;
|
|
|
|
procedure TForm10.Button6Click(Sender: TObject);
|
|
begin
|
|
if button6.Caption=rsStop then
|
|
begin
|
|
button6.Caption:=rsRestartGameAndAutoplay;
|
|
exit;
|
|
end;
|
|
|
|
button3.Click;
|
|
button6.Caption:=rsStop;
|
|
|
|
while button6.Caption=rsStop do
|
|
begin
|
|
if p1.health>0 then p1.Hit(2+random(5));
|
|
if p2.health>0 then p2.Hit(2+random(5));
|
|
if p3.health>0 then p3.Hit(1+random(1));
|
|
if p4.health>0 then p4.Hit(1+random(1));
|
|
|
|
application.ProcessMessages;
|
|
|
|
if (p1.health=0) and (p2.health=0) then
|
|
begin
|
|
ShowMessage(rsFailureYourTeamDied);
|
|
button6.Caption:=rsRestartGameAndAutoplay;
|
|
break;
|
|
end;
|
|
|
|
if (p3.health=0) and (p4.health=0) then
|
|
begin
|
|
button2.enabled:=true;
|
|
button6.Caption:=rsRestartGameAndAutoplay;
|
|
break;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TForm10.Button7Click(Sender: TObject);
|
|
begin
|
|
p2.Hit(2+random(5));
|
|
end;
|
|
|
|
procedure TForm10.Button8Click(Sender: TObject);
|
|
begin
|
|
p1.Hit(2+random(5));
|
|
end;
|
|
|
|
procedure TForm10.FormCloseQuery(Sender: TObject; var CanClose: boolean);
|
|
begin
|
|
canclose:=MessageDlg(rsTryAgain10, mtconfirmation, [mbyes, mbno], 0)=mryes;
|
|
end;
|
|
|
|
procedure TForm10.FormCreate(Sender: TObject);
|
|
begin
|
|
|
|
//31337157
|
|
caption:=altnamer(caption);
|
|
memo1.lines.text:=altnamer(rsTutorialStep9);
|
|
memo1.Lines.Insert(0, Format(rsStep9SharedCodePW, [inttostr(313)+inttostr(37157)]));
|
|
|
|
button3.Click;
|
|
font.size:=12;
|
|
frmHelp.attach(self,'9');
|
|
end;
|
|
|
|
procedure TForm10.SpeedButton1Click(Sender: TObject);
|
|
begin
|
|
{$ifdef windows}
|
|
LaunchGraphicalTut;
|
|
{$endif}
|
|
showmessage(rsU10ThisWasTheLastTutorial);
|
|
Application.Terminate;
|
|
end;
|
|
|
|
initialization
|
|
{$i Unit10.lrs}
|
|
|
|
end.
|