source: OniTrainer/current/Unit4.pas @ 251

Last change on this file since 251 was 251, checked in by alloc, 14 years ago
File size: 8.1 KB
Line 
1UNIT Unit4;
2INTERFACE
3USES
4  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
5  Dialogs, StdCtrls, ExtCtrls, ComCtrls, StrUtils;
6TYPE
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;
33VAR
34  Form4: TForm4;
35
36IMPLEMENTATION
37USES Unit1, Unit2, Unit8;
38VAR
39  demo_active:Boolean=False;
40  first_global:LongWord;
41  first_local:LongWord;
42{$R *.dfm}
43
44PROCEDURE TForm4.check_freezeClick(Sender: TObject);
45  BEGIN
46    btn_demo.Caption:='Start demo';
47    demo_active:=False;
48  END;
49
50FUNCTION 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
58FUNCTION 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
85PROCEDURE 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
117PROCEDURE 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
126PROCEDURE 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
133PROCEDURE 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
159PROCEDURE 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
166PROCEDURE TForm4.FormCreate(Sender: TObject);
167  BEGIN
168    load_anim_list(animations_l0);
169    list.ItemIndex:=0;
170    updown.Max:=ais_controlled;
171  END;
172
173PROCEDURE TForm4.updownClick(Sender: TObject; Button: TUDBtnType);
174  BEGIN
175    Form4.edit_char.Text:=IntToStr(updown.Position);
176  END;
177
178PROCEDURE 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
205PROCEDURE 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
246END.
Note: See TracBrowser for help on using the repository browser.