unit Unit5; {$MODE Delphi} interface uses LCLIntf, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls,math, Buttons, LResources; type TForm5 = class(TForm) Memo1: TMemo; Button2: TButton; Button1: TButton; Label1: TLabel; Label2: TLabel; Timer1: TTimer; Label3: TLabel; Label4: TLabel; Button3: TButton; Label5: TLabel; Label6: TLabel; SpeedButton1: TSpeedButton; procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Button3Click(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure SpeedButton1Click(Sender: TObject); private { Private declarations } health: single; ammo: double; public { Public declarations } end; var Form5: TForm5; implementation uses Unit4, Unit6; resourcestring rsStep4FloatingPointsPW = 'Step 4: Floating points (PW='; rsOutOfAmmo = 'Out of ammo!%sPress ok to stock up on some ammo'; rsDead = 'I think you''re dead!%sPress ok to become a brain eating zombie'; rsConfirmClose5 = 'Come on. This step is simple. For health do a float scan, and for ammo a double type. (don''t forget to disable fastscan for double in ' +'this case) Just ignore the fact that it looks different because it has a "." in the value. You sure you want to quit?'; rsLOSER = 'BOO'; rsTutorialStep4= 'In the previous tutorial we used bytes to scan, but some games store information in so called ''floating point'' notations. '+#13#10+ '(probably to prevent simple memory scanners from finding it the easy way)'+#13#10+ 'a floating point is a value with some digits behind the point. (like 5.12 or 11321.1)'+#13#10+ ''+#13#10+ 'Below you see your health and ammo. Both are stored as Floating point notations, but health is stored as a float and '+ 'ammo is stored as a double.'+#13#10+ 'Click on hit me to lose some health, and on shoot to decrease your ammo with 0.5'+#13#10+ ' '+#13#10+ 'You have to set BOTH values to 5000 or higher to proceed.'+#13#10+ ''+#13#10+ 'Exact value scan will work fine here, but you may want to experiment with other types too.'+#13#10+ ''+#13#10+ ''+#13#10+ ''+#13#10+ ''+#13#10+ ''+#13#10+ ''+#13#10+ ''+#13#10+ ''+#13#10+ ''+#13#10+ ''+#13#10+ ''+#13#10+ ''+#13#10+ ''+#13#10+ ''+#13#10+ 'Hint: It is recommended to disable "Fast Scan" for type double'; procedure TForm5.Button2Click(Sender: TObject); begin hide; form6:=tform6.create(self); form6.width:=width; form6.height:=height; form6.left:=left; form6.top:=top; form6.show; end; procedure TForm5.FormCreate(Sender: TObject); begin health:=100.0; ammo:=100.0; memo1.lines.text:=rsTutorialStep4; memo1.Lines.Insert(0, rsStep4FloatingPointsPW+inttostr(890124)+')'); memo1.SelStart:=0; font.size:=12; end; procedure TForm5.Button1Click(Sender: TObject); var temp: double; i: integer; begin i:=1+random(10); if i=0 then i:=1; temp:=0.5; ammo:=ammo-temp; label1.caption:=FloatToStrF(ammo,ffGeneral,4,4); application.ProcessMessages; if ammo<=0 then begin showmessage(Format(rsOutOfAmmo, [#13#10])); ammo:=100; label1.caption:=FloatToStrF(ammo,ffGeneral,4,4); end; end; procedure TForm5.Timer1Timer(Sender: TObject); begin if (health>=5000) and (ammo>=5000) then begin button2.Enabled:=true; timer1.enabled:=false; end; end; procedure TForm5.Button3Click(Sender: TObject); var temp: single; i,j: integer; begin i:=1+random(10); if i=0 then i:=1; temp:=random(4)+(1+random(10)/i); health:=health-temp; label4.caption:=FloatToStrF(health,ffGeneral,4,4); if health<=0 then begin showmessage(Format(rsDead, [#13#10])); health:=4000; label4.caption:=FloatToStrF(health,ffGeneral,4,4); end; end; procedure TForm5.FormClose(Sender: TObject; var Action: TCloseAction); begin application.Terminate; end; procedure TForm5.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin canclose:=MessageDlg(rsConfirmClose5, mtconfirmation, [mbyes, mbno], 0)=mryes; end; procedure TForm5.SpeedButton1Click(Sender: TObject); begin showmessage(rsLOSER); button2.Click; end; initialization {$i Unit5.lrs} {$i Unit5.lrs} end.