[251] | 1 | UNIT Unit4;
|
---|
| 2 | INTERFACE
|
---|
| 3 | USES
|
---|
| 4 | Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
---|
| 5 | Dialogs, StdCtrls, ExtCtrls, ComCtrls, StrUtils;
|
---|
| 6 | TYPE
|
---|
| 7 | TForm4 = Class(TForm)
|
---|
| 8 | Label1: TLabel;
|
---|
| 9 | edit_char: TEdit;
|
---|
| 10 | list: TListBox;
|
---|
| 11 | Label2: TLabel;
|
---|
| 12 | btn_demo: TButton;
|
---|
| 13 | check_freeze: TCheckBox;
|
---|
| 14 | timer_anim: TTimer;
|
---|
| 15 | check_global: TRadioButton;
|
---|
| 16 | check_local: TRadioButton;
|
---|
| 17 | updown: TUpDown;
|
---|
| 18 | group_anim: TGroupBox;
|
---|
| 19 | lbl_lvl: TLabel;
|
---|
| 20 | memo: TMemo;
|
---|
| 21 | PROCEDURE listClick(Sender: TObject);
|
---|
| 22 | PROCEDURE btn_demoClick(Sender: TObject);
|
---|
| 23 | PROCEDURE updownClick(Sender: TObject; Button: TUDBtnType);
|
---|
| 24 | PROCEDURE FormCreate(Sender: TObject);
|
---|
| 25 | PROCEDURE FormCloseQuery(Sender: TObject; var CanClose: Boolean);
|
---|
| 26 | PROCEDURE check_localClick(Sender: TObject);
|
---|
| 27 | PROCEDURE check_globalClick(Sender: TObject);
|
---|
| 28 | PROCEDURE timer_animTimer(Sender: TObject);
|
---|
| 29 | PROCEDURE check_freezeClick(Sender: TObject);
|
---|
| 30 | PRIVATE
|
---|
| 31 | PUBLIC
|
---|
| 32 | END;
|
---|
| 33 | VAR
|
---|
| 34 | Form4: TForm4;
|
---|
| 35 |
|
---|
| 36 | IMPLEMENTATION
|
---|
| 37 | USES Unit1, Unit2, Unit8;
|
---|
| 38 | VAR
|
---|
| 39 | demo_active:Boolean=False;
|
---|
| 40 | first_global:LongWord;
|
---|
| 41 | first_local:LongWord;
|
---|
| 42 | {$R *.dfm}
|
---|
| 43 |
|
---|
| 44 | PROCEDURE TForm4.check_freezeClick(Sender: TObject);
|
---|
| 45 | BEGIN
|
---|
| 46 | btn_demo.Caption:='Start demo';
|
---|
| 47 | demo_active:=False;
|
---|
| 48 | END;
|
---|
| 49 |
|
---|
| 50 | FUNCTION patch_loader_loaded:Boolean;
|
---|
| 51 | CONST check_for:LongWord=$0010656EE9;
|
---|
| 52 | address_at:LongWord=$4228ED;
|
---|
| 53 | BEGIN
|
---|
| 54 | IF Decode_Int(ReadMem(address_at,4))=check_for THEN result:=True
|
---|
| 55 | ELSE result:=False;
|
---|
| 56 | END;
|
---|
| 57 |
|
---|
| 58 | FUNCTION GetAnimAddress:LongWord;
|
---|
| 59 | VAR offset:LongWord;
|
---|
| 60 | BEGIN
|
---|
| 61 | IF Form4.check_global.Checked THEN BEGIN
|
---|
| 62 | offset:=animations_l0[Form4.list.ItemIndex+1].offset;
|
---|
| 63 | result:=first_global+offset;
|
---|
| 64 | END ELSE BEGIN
|
---|
| 65 | CASE lvlnumber OF
|
---|
| 66 | 1: offset:=animations_l1[Form4.list.ItemIndex+1].offset;
|
---|
| 67 | 2: offset:=animations_l2[Form4.list.ItemIndex+1].offset;
|
---|
| 68 | 3: offset:=animations_l3[Form4.list.ItemIndex+1].offset;
|
---|
| 69 | 4: offset:=animations_l4[Form4.list.ItemIndex+1].offset;
|
---|
| 70 | 5: offset:=animations_l5[Form4.list.ItemIndex+1].offset;
|
---|
| 71 | 6: offset:=animations_l6[Form4.list.ItemIndex+1].offset;
|
---|
| 72 | 7: offset:=animations_l7[Form4.list.ItemIndex+1].offset;
|
---|
| 73 | 8: offset:=animations_l8[Form4.list.ItemIndex+1].offset;
|
---|
| 74 | 9: offset:=animations_l9[Form4.list.ItemIndex+1].offset;
|
---|
| 75 | 10: offset:=animations_l10[Form4.list.ItemIndex+1].offset;
|
---|
| 76 | 11: offset:=animations_l11[Form4.list.ItemIndex+1].offset;
|
---|
| 77 | 12: offset:=animations_l12[Form4.list.ItemIndex+1].offset;
|
---|
| 78 | 13: offset:=animations_l13[Form4.list.ItemIndex+1].offset;
|
---|
| 79 | 14: offset:=animations_l14[Form4.list.ItemIndex+1].offset;
|
---|
| 80 | END;
|
---|
| 81 | result:=first_local+offset;
|
---|
| 82 | END;
|
---|
| 83 | END;
|
---|
| 84 |
|
---|
| 85 | PROCEDURE TForm4.timer_animTimer(Sender: TObject);
|
---|
| 86 | VAR struct3:LongWord;
|
---|
| 87 | buffer:byte_array;
|
---|
| 88 | address:LongWord;
|
---|
| 89 | BEGIN
|
---|
| 90 | IF _connected AND (lvlnumber>0) AND patch_loader_loaded THEN BEGIN
|
---|
| 91 | first_global:=Decode_Int(ReadMem($10F08,4));
|
---|
| 92 | first_local:=Decode_Int(ReadMem($10F0C,4));
|
---|
| 93 | struct3:=Decode_Int(ReadMem(PointerStruct3,4))+StrToInt(Form4.edit_char.Text)*$2838;
|
---|
| 94 | address:=GetAnimAddress;
|
---|
| 95 |
|
---|
| 96 | IF demo_active THEN BEGIN
|
---|
| 97 | IF Decode_Int(ReadMem(struct3+$1AF8,4))<>address THEN BEGIN
|
---|
| 98 | REPEAT
|
---|
| 99 | Form4.list.ItemIndex:=Form4.list.ItemIndex+1;
|
---|
| 100 | UNTIL (Pos('_tgt',Form4.list.Items.Strings[Form4.list.ItemIndex])=0);
|
---|
| 101 | address:=GetAnimAddress;
|
---|
| 102 | buffer:=Encode_Int(address);
|
---|
| 103 | WriteMem(struct3+$1AF8,4,buffer);
|
---|
| 104 | END;
|
---|
| 105 | END;
|
---|
| 106 | IF check_freeze.Checked THEN BEGIN
|
---|
| 107 | buffer:=Encode_Int(address);
|
---|
| 108 | WriteMem(struct3+$1AF8,4,buffer);
|
---|
| 109 | END;
|
---|
| 110 | END ELSE BEGIN
|
---|
| 111 | IF _connected AND (lvlnumber>0) AND (demo_active OR check_freeze.Checked) THEN BEGIN
|
---|
| 112 | MessageBox(Form4.Handle,PChar('Oni.exe is not patched.'),PChar('Error'),MB_OK);
|
---|
| 113 | END;
|
---|
| 114 | END;
|
---|
| 115 | END;
|
---|
| 116 |
|
---|
| 117 | PROCEDURE load_anim_list(anims:Array OF animation);
|
---|
| 118 | VAR i:Word;
|
---|
| 119 | BEGIN
|
---|
| 120 | Form4.list.Items.Clear;
|
---|
| 121 | FOR i:=0 TO High(anims) DO BEGIN
|
---|
| 122 | Form4.list.Items.Add(anims[i].name);
|
---|
| 123 | END;
|
---|
| 124 | END;
|
---|
| 125 |
|
---|
| 126 | PROCEDURE TForm4.check_globalClick(Sender: TObject);
|
---|
| 127 | BEGIN
|
---|
| 128 | IF check_global.Checked THEN BEGIN
|
---|
| 129 | load_anim_list(animations_l0);
|
---|
| 130 | END;
|
---|
| 131 | END;
|
---|
| 132 |
|
---|
| 133 | PROCEDURE TForm4.check_localClick(Sender: TObject);
|
---|
| 134 | BEGIN
|
---|
| 135 | IF check_local.Checked THEN BEGIN
|
---|
| 136 | IF lvlnumber>0 THEN BEGIN
|
---|
| 137 | CASE lvlnumber OF
|
---|
| 138 | 1: load_anim_list(animations_l1);
|
---|
| 139 | 2: load_anim_list(animations_l2);
|
---|
| 140 | 3: load_anim_list(animations_l3);
|
---|
| 141 | 4: load_anim_list(animations_l4);
|
---|
| 142 | 5: load_anim_list(animations_l5);
|
---|
| 143 | 6: load_anim_list(animations_l6);
|
---|
| 144 | 7: load_anim_list(animations_l7);
|
---|
| 145 | 8: load_anim_list(animations_l8);
|
---|
| 146 | 9: load_anim_list(animations_l9);
|
---|
| 147 | 10: load_anim_list(animations_l10);
|
---|
| 148 | 11: load_anim_list(animations_l11);
|
---|
| 149 | 12: load_anim_list(animations_l12);
|
---|
| 150 | 13: load_anim_list(animations_l13);
|
---|
| 151 | 14: load_anim_list(animations_l14);
|
---|
| 152 | END;
|
---|
| 153 | END ELSE BEGIN
|
---|
| 154 | check_global.Checked:=True;
|
---|
| 155 | END;
|
---|
| 156 | END;
|
---|
| 157 | END;
|
---|
| 158 |
|
---|
| 159 | PROCEDURE TForm4.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
|
---|
| 160 | BEGIN
|
---|
| 161 | Self.Visible:=False;
|
---|
| 162 | CanClose:=False;
|
---|
| 163 | Form1.menu_Anims.Checked:=False;
|
---|
| 164 | END;
|
---|
| 165 |
|
---|
| 166 | PROCEDURE TForm4.FormCreate(Sender: TObject);
|
---|
| 167 | BEGIN
|
---|
| 168 | load_anim_list(animations_l0);
|
---|
| 169 | list.ItemIndex:=0;
|
---|
| 170 | updown.Max:=ais_controlled;
|
---|
| 171 | END;
|
---|
| 172 |
|
---|
| 173 | PROCEDURE TForm4.updownClick(Sender: TObject; Button: TUDBtnType);
|
---|
| 174 | BEGIN
|
---|
| 175 | Form4.edit_char.Text:=IntToStr(updown.Position);
|
---|
| 176 | END;
|
---|
| 177 |
|
---|
| 178 | PROCEDURE TForm4.btn_demoClick(Sender: TObject);
|
---|
| 179 | VAR struct3,address:LongWord;
|
---|
| 180 | buffer:byte_array;
|
---|
| 181 | BEGIN
|
---|
| 182 | IF demo_active THEN BEGIN
|
---|
| 183 | check_freeze.Checked:=False;
|
---|
| 184 | btn_demo.Caption:='Start demo';
|
---|
| 185 | demo_active:=False;
|
---|
| 186 | END ELSE BEGIN
|
---|
| 187 | check_freeze.Checked:=False;
|
---|
| 188 | btn_demo.Caption:='Stop demo';
|
---|
| 189 | demo_active:=True;
|
---|
| 190 | IF _connected AND (lvlnumber>0) AND patch_loader_loaded THEN BEGIN
|
---|
| 191 | first_global:=Decode_Int(ReadMem($10F08,4));
|
---|
| 192 | first_local:=Decode_Int(ReadMem($10F0C,4));
|
---|
| 193 | struct3:=Decode_Int(ReadMem(PointerStruct3,4))+StrToInt(Form4.edit_char.Text)*$2838;
|
---|
| 194 | address:=GetAnimAddress;
|
---|
| 195 | buffer:=Encode_Int(address);
|
---|
| 196 | WriteMem(struct3+$1AF8,4,buffer);
|
---|
| 197 | END ELSE BEGIN
|
---|
| 198 | IF _connected AND (lvlnumber>0) THEN BEGIN
|
---|
| 199 | MessageBox(Form4.Handle,PChar('Oni.exe is not patched.'),PChar('Error'),MB_OK);
|
---|
| 200 | END;
|
---|
| 201 | END;
|
---|
| 202 | END;
|
---|
| 203 | END;
|
---|
| 204 |
|
---|
| 205 | PROCEDURE TForm4.listClick(Sender: TObject);
|
---|
| 206 | VAR address:LongWord;
|
---|
| 207 | buffer:byte_array;
|
---|
| 208 | i:Byte;
|
---|
| 209 | temp:String;
|
---|
| 210 | old:LongWord;
|
---|
| 211 | BEGIN
|
---|
| 212 | IF _connected AND (lvlnumber>0) AND patch_loader_loaded THEN BEGIN
|
---|
| 213 | first_global:=Decode_Int(ReadMem($10F08,4));
|
---|
| 214 | first_local:=Decode_Int(ReadMem($10F0C,4));
|
---|
| 215 | address:=GetAnimAddress;
|
---|
| 216 | Form4.lbl_lvl.Caption:='Lvl required (@'+IntToHex(address,8)+'): '+IntToStr(Decode_Int(ReadMem(address+$176,1)));
|
---|
| 217 | // VirtualProtectEx(_ProcessHandle,address+$176,2,PAGE_READWRITE,old);
|
---|
| 218 | // MessageBox(Form4.Handle,PChar('BLA: '+IntToStr(GetLastError)+'#'+IntToHex(GetLastError,8)),PChar('Error'),MB_OK);
|
---|
| 219 | WriteMem(address+$176,1,Encode_Int(0));
|
---|
| 220 | // MessageBox(Form4.Handle,PChar('BLA: '+IntToStr(GetLastError)+'#'+IntToHex(GetLastError,8)),PChar('Error'),MB_OK);
|
---|
| 221 | Form4.memo.Lines.Clear;
|
---|
| 222 | temp:='';
|
---|
| 223 | buffer:=ReadMem(address,$D0);
|
---|
| 224 | FOR i:=0 TO ($D0 - 1) DO BEGIN
|
---|
| 225 | temp:=temp+IntToHex(buffer[i],2);
|
---|
| 226 | IF ((i+1) MOD $10)=0 THEN BEGIN
|
---|
| 227 | Form4.memo.Lines.Add(temp);
|
---|
| 228 | temp:='';
|
---|
| 229 | END;
|
---|
| 230 | END;
|
---|
| 231 | buffer:=ReadMem(address+$D0,$D0);
|
---|
| 232 | FOR i:=0 TO ($D0 - 1) DO BEGIN
|
---|
| 233 | temp:=temp+IntToHex(buffer[i],2);
|
---|
| 234 | IF ((i+1) MOD $10)=0 THEN BEGIN
|
---|
| 235 | Form4.memo.Lines.Add(temp);
|
---|
| 236 | temp:='';
|
---|
| 237 | END;
|
---|
| 238 | END;
|
---|
| 239 | END ELSE BEGIN
|
---|
| 240 | IF _connected AND (lvlnumber>0) THEN BEGIN
|
---|
| 241 | MessageBox(Form4.Handle,PChar('Oni.exe is not patched.'),PChar('Error'),MB_OK);
|
---|
| 242 | END;
|
---|
| 243 | END;
|
---|
| 244 | END;
|
---|
| 245 |
|
---|
| 246 | END.
|
---|