40 AllInactive:= false; |
40 AllInactive:= false; |
41 if (TurnTimeLeft = 0) or (Gear.Damage > 0) then |
41 if (TurnTimeLeft = 0) or (Gear.Damage > 0) then |
42 begin |
42 begin |
43 if ((Gear.State and (gstMoving or gstFalling)) = 0) |
43 if ((Gear.State and (gstMoving or gstFalling)) = 0) |
44 and (CurAmmoGear = nil) then Gear.dX:= 0.0000001 * Sign(Gear.dX); |
44 and (CurAmmoGear = nil) then Gear.dX:= 0.0000001 * Sign(Gear.dX); |
45 {$WARNINGS OFF}Gear.State:= Gear.State and not gstHHDriven;{$WARNINGS ON} |
45 Gear.State:= Gear.State and not gstHHDriven; |
|
46 if Gear.Damage > 0 then |
|
47 Gear.State:= Gear.State and not gstHHJumping; |
46 exit |
48 exit |
47 end; |
49 end; |
48 |
50 |
49 if CurAmmoGear <> nil then |
51 if CurAmmoGear <> nil then |
50 begin |
52 begin |
74 end else Gear.Message:= Gear.Message and not gm_Attack; |
76 end else Gear.Message:= Gear.Message and not gm_Attack; |
75 |
77 |
76 |
78 |
77 if (Gear.State and gstFalling) <> 0 then |
79 if (Gear.State and gstFalling) <> 0 then |
78 begin |
80 begin |
|
81 // it could be the source to trick: double-backspace jump -> vertical wall |
|
82 // collision - > (abs(Gear.dX) < 0.0000002) -> backspace -> even more high jump |
79 if ((Gear.Message and gm_HJump) <> 0) and ((Gear.State and gstHHJumping) <> 0) then |
83 if ((Gear.Message and gm_HJump) <> 0) and ((Gear.State and gstHHJumping) <> 0) then |
80 if (abs(Gear.dX) < 0.0000002) and (Gear.dY < -0.02) then |
84 if (abs(Gear.dX) < 0.0000002) and (Gear.dY < -0.02) then |
81 begin |
85 begin |
82 Gear.dY:= -0.25; |
86 Gear.dY:= -0.25; |
83 Gear.dX:= Sign(Gear.dX) * 0.02 |
87 Gear.dX:= Sign(Gear.dX) * 0.02 |
84 end; |
88 end; |
85 Gear.Message:= Gear.Message and not (gm_LJump or gm_HJump); |
89 Gear.Message:= Gear.Message and not (gm_LJump or gm_HJump); |
86 if TestCollisionXwithGear(Gear, Sign(Gear.dX)) then Gear.dX:= 0.0000001 * Sign(Gear.dX); |
90 if TestCollisionXwithGear(Gear, Sign(Gear.dX)) then Gear.dX:= 0.0000001 * Sign(Gear.dX); |
87 Gear.X:= Gear.X + Gear.dX; |
91 Gear.X:= Gear.X + Gear.dX; |
88 Gear.dY:= Gear.dY + cGravity; |
92 Gear.dY:= Gear.dY + cGravity; |
89 if (Gear.dY < 0)and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0; |
93 if (Gear.dY < 0)and TestCollisionYwithGear(Gear, -1) then Gear.dY:= 0; |
90 Gear.Y:= Gear.Y + Gear.dY; |
94 Gear.Y:= Gear.Y + Gear.dY; |
201 if (Gear.dY < 0) and HHTestCollisionYwithGear(Gear, -1) then Gear.dY:= 0; |
205 if (Gear.dY < 0) and HHTestCollisionYwithGear(Gear, -1) then Gear.dY:= 0; |
202 Gear.State:= Gear.State or gstFalling or gstMoving; |
206 Gear.State:= Gear.State or gstFalling or gstMoving; |
203 Gear.dY:= Gear.dY + cGravity |
207 Gear.dY:= Gear.dY + cGravity |
204 end else begin |
208 end else begin |
205 CheckHHDamage(Gear); |
209 CheckHHDamage(Gear); |
|
210 if ((abs(Gear.dX) + abs(Gear.dY)) < 0.55) |
|
211 and ((Gear.State and gstHHJumping) <> 0) then Gear.dX:= 0.0000001 * Sign(Gear.dX); |
|
212 Gear.State:= Gear.State and not (gstFalling or gstHHJumping); |
206 if Gear.dY > 0 then Gear.dY:= 0; |
213 if Gear.dY > 0 then Gear.dY:= 0; |
207 Gear.State:= Gear.State and not gstFalling; |
|
208 if ((Gear.State and gstMoving) <> 0) then Gear.dX:= Gear.dX * Gear.Friction |
214 if ((Gear.State and gstMoving) <> 0) then Gear.dX:= Gear.dX * Gear.Friction |
209 end; |
215 end; |
210 |
216 |
211 |
217 |
212 if (Gear.State and gstMoving) <> 0 then |
218 if (Gear.State and gstMoving) <> 0 then |
249 doMakeExplosion(round(Gear.X), round(Gear.Y), 30, EXPLAutoSound); |
255 doMakeExplosion(round(Gear.X), round(Gear.Y), 30, EXPLAutoSound); |
250 AddGear(round(Gear.X), round(Gear.Y), gtGrave, 0).Hedgehog:= Gear.Hedgehog; |
256 AddGear(round(Gear.X), round(Gear.Y), gtGrave, 0).Hedgehog:= Gear.Hedgehog; |
251 DeleteGear(Gear); |
257 DeleteGear(Gear); |
252 SetAllToActive |
258 SetAllToActive |
253 end; |
259 end; |
254 AllInactive:= false; (* почему этого тут не было? *) |
260 AllInactive:= false; |
255 exit |
261 exit |
256 end; |
262 end; |
257 |
263 |
258 AllInactive:= false; |
264 AllInactive:= false; |
259 |
265 |