22 begin |
22 begin |
23 with Gear^, |
23 with Gear^, |
24 PHedgehog(Gear^.Hedgehog)^ do |
24 PHedgehog(Gear^.Hedgehog)^ do |
25 begin |
25 begin |
26 if ((State and gstHHDriven) <> 0)and |
26 if ((State and gstHHDriven) <> 0)and |
27 // (((State and gstAttacking) <> 0) or ((Message and gm_Attack) <> 0))and |
27 ((State and (gstAttacked or gstHHChooseTarget)) = 0)and |
28 ((State and (gstAttacked or gstMoving or gstHHChooseTarget)) = 0)and |
28 (((State and gstMoving) = 0)or((Ammo^[CurSlot, CurAmmo].Propz and ammoprop_AttackInMove) <> 0))and |
29 (((State and gstFalling ) = 0)or((Ammo^[CurSlot, CurAmmo].Propz and ammoprop_AttackInFall) <> 0))and |
29 ((TargetPoint.X <> NoPointX) or ((Ammo^[CurSlot, CurAmmo].Propz and ammoprop_NeedTarget) = 0)) then |
30 (((State and gstHHJumping) = 0)or((Ammo^[CurSlot, CurAmmo].Propz and ammoprop_AttackInJump) <> 0))and |
|
31 ((TargetPoint.X <> NoPointX) or((Ammo^[CurSlot, CurAmmo].Propz and ammoprop_NeedTarget) = 0)) then |
|
32 begin |
30 begin |
33 State:= State or gstAttacking; |
31 State:= State or gstAttacking; |
34 if Power = cMaxPower then Message:= Message and not gm_Attack |
32 if Power = cMaxPower then Message:= Message and not gm_Attack |
35 else if (Ammo^[CurSlot, CurAmmo].Propz and ammoprop_Power) = 0 then Message:= Message and not gm_Attack |
33 else if (Ammo^[CurSlot, CurAmmo].Propz and ammoprop_Power) = 0 then Message:= Message and not gm_Attack |
36 else begin |
34 else begin |
133 const StepTicks: LongWord = 0; |
131 const StepTicks: LongWord = 0; |
134 |
132 |
135 procedure HedgehogStep(Gear: PGear); |
133 procedure HedgehogStep(Gear: PGear); |
136 var PrevdX: LongInt; |
134 var PrevdX: LongInt; |
137 begin |
135 begin |
138 if ((Gear^.State and (gstAttacking or gstMoving or gstFalling)) = 0) then |
136 if ((Gear^.State and (gstAttacking or gstMoving)) = 0) then |
139 begin |
137 begin |
140 if isCursorVisible then |
138 if isCursorVisible then |
141 with PHedgehog(Gear^.Hedgehog)^ do |
139 with PHedgehog(Gear^.Hedgehog)^ do |
142 with Ammo^[CurSlot, CurAmmo] do |
140 with Ammo^[CurSlot, CurAmmo] do |
143 begin |
141 begin |
144 if (Gear^.Message and gm_Left )<>0 then |
142 if (Gear^.Message and gm_Left ) <> 0 then |
145 Pos:= (Pos + Ammoz[AmmoType].PosCount - 1) mod Ammoz[AmmoType].PosCount |
143 Pos:= (Pos + Ammoz[AmmoType].PosCount - 1) mod Ammoz[AmmoType].PosCount |
146 else |
144 else |
147 if (Gear^.Message and gm_Right )<>0 then |
145 if (Gear^.Message and gm_Right ) <> 0 then |
148 Pos:= (Pos + 1) mod Ammoz[AmmoType].PosCount |
146 Pos:= (Pos + 1) mod Ammoz[AmmoType].PosCount |
149 else exit; |
147 else exit; |
150 StepTicks:= 200; |
148 StepTicks:= 200; |
151 exit |
149 exit |
152 end; |
150 end; |
153 |
151 |
154 if ((Gear^.Message and gm_LJump ) <> 0) then |
152 if ((Gear^.Message and gm_LJump ) <> 0) then |
155 begin |
153 begin |
156 Gear^.Message:= 0; |
154 Gear^.Message:= Gear^.Message and not gm_LJump; |
157 DeleteCI(Gear); |
155 DeleteCI(Gear); |
158 if not TestCollisionYwithGear(Gear, -1) then |
156 if not TestCollisionYwithGear(Gear, -1) then |
159 if not TestCollisionXwithXYShift(Gear, _0, -2, hwSign(Gear^.dX)) then Gear^.Y:= Gear^.Y - _2 else |
157 if not TestCollisionXwithXYShift(Gear, _0, -2, hwSign(Gear^.dX)) then Gear^.Y:= Gear^.Y - _2 else |
160 if not TestCollisionXwithXYShift(Gear, _0, -1, hwSign(Gear^.dX)) then Gear^.Y:= Gear^.Y - _1; |
158 if not TestCollisionXwithXYShift(Gear, _0, -1, hwSign(Gear^.dX)) then Gear^.Y:= Gear^.Y - _1; |
161 if not (TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) |
159 if not (TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) |
162 or TestCollisionYwithGear(Gear, -1)) then |
160 or TestCollisionYwithGear(Gear, -1)) then |
163 begin |
161 begin |
164 Gear^.dY:= -_0_15; |
162 Gear^.dY:= -_0_15; |
165 Gear^.dX:= SignAs(_0_15, Gear^.dX); |
163 Gear^.dX:= SignAs(_0_15, Gear^.dX); |
166 Gear^.State:= Gear^.State or gstFalling or gstHHJumping; |
164 Gear^.State:= Gear^.State or gstMoving or gstHHJumping; |
167 exit |
165 exit |
168 end; |
166 end; |
169 end; |
167 end; |
170 |
168 |
171 if ((Gear^.Message and gm_HJump ) <> 0) then |
169 if ((Gear^.Message and gm_HJump ) <> 0) then |
172 begin |
170 begin |
173 DeleteCI(Gear); |
171 DeleteCI(Gear); |
174 Gear^.Message:= 0; |
172 Gear^.Message:= Gear^.Message and not gm_HJump; |
175 if not TestCollisionYwithGear(Gear, -1) then |
173 if not TestCollisionYwithGear(Gear, -1) then |
176 begin |
174 begin |
177 Gear^.dY:= -_0_2; |
175 Gear^.dY:= -_0_2; |
178 SetLittle(Gear^.dX); |
176 SetLittle(Gear^.dX); |
179 Gear^.State:= Gear^.State or gstFalling or gstHHJumping; |
177 Gear^.State:= Gear^.State or gstMoving or gstHHJumping; |
180 exit |
178 exit |
181 end; |
179 end; |
182 end; |
180 end; |
183 |
181 |
184 PrevdX:= hwSign(Gear^.dX); |
182 PrevdX:= hwSign(Gear^.dX); |
244 end |
242 end |
245 end; |
243 end; |
246 |
244 |
247 procedure HedgehogChAngle(Gear: PGear); |
245 procedure HedgehogChAngle(Gear: PGear); |
248 begin |
246 begin |
249 if ((Gear^.State and (gstMoving or gstFalling)) = 0) then |
247 if ((Gear^.State and gstMoving) = 0) then |
250 if (Gear^.Message and gm_Up )<>0 then if Gear^.Angle > CurMinAngle then dec(Gear^.Angle) |
248 if (Gear^.Message and gm_Up )<>0 then if Gear^.Angle > CurMinAngle then dec(Gear^.Angle) |
251 else else |
249 else else |
252 if (Gear^.Message and gm_Down )<>0 then if Gear^.Angle < CurMaxAngle then inc(Gear^.Angle); |
250 if (Gear^.Message and gm_Down )<>0 then if Gear^.Angle < CurMaxAngle then inc(Gear^.Angle); |
253 end; |
251 end; |
254 |
252 |
255 procedure doStepHedgehog(Gear: PGear); forward; |
253 procedure doStepHedgehog(Gear: PGear); forward; |
256 //////////////////////////////////////////////////////////////////////////////// |
254 //////////////////////////////////////////////////////////////////////////////// |
257 procedure doStepHedgehogMoving(Gear: PGear); |
255 procedure doStepHedgehogMoving(Gear: PGear); |
258 var prevState: Longword; |
256 var prevState: Longword; |
|
257 isFalling: boolean; |
259 begin |
258 begin |
260 prevState:= Gear^.State; |
259 prevState:= Gear^.State; |
261 if not TestCollisionYKick(Gear, 1) then |
260 isFalling:= not TestCollisionYKick(Gear, 1); |
|
261 if isFalling then |
262 begin |
262 begin |
263 if (Gear^.dY.isNegative) and TestCollisionYKick(Gear, -1) then Gear^.dY:= _0; |
263 if (Gear^.dY.isNegative) and TestCollisionYKick(Gear, -1) then Gear^.dY:= _0; |
264 Gear^.State:= Gear^.State or gstFalling or gstMoving; |
264 Gear^.State:= Gear^.State or gstMoving; |
265 Gear^.dY:= Gear^.dY + cGravity |
265 Gear^.dY:= Gear^.dY + cGravity |
266 end else |
266 end else |
267 begin |
267 begin |
268 if ((hwAbs(Gear^.dX) + hwAbs(Gear^.dY)) < _0_55) |
268 if ((hwAbs(Gear^.dX) + hwAbs(Gear^.dY)) < _0_55) |
269 and ((Gear^.State and gstHHJumping) <> 0) then SetLittle(Gear^.dX); |
269 and ((Gear^.State and gstHHJumping) <> 0) then SetLittle(Gear^.dX); |
270 |
270 |
271 if not Gear^.dY.isNegative then |
271 if not Gear^.dY.isNegative then |
272 begin |
272 begin |
273 CheckHHDamage(Gear); |
273 CheckHHDamage(Gear); |
274 Gear^.State:= Gear^.State and not (gstFalling or gstHHJumping or gstHHHJump); |
274 Gear^.State:= Gear^.State and not (gstHHJumping or gstHHHJump); |
275 Gear^.dY:= _0; |
275 Gear^.dY:= _0; |
276 end else Gear^.dY:= Gear^.dY + cGravity; |
276 end else Gear^.dY:= Gear^.dY + cGravity; |
277 |
277 |
278 if ((Gear^.State and gstMoving) <> 0) then Gear^.dX:= Gear^.dX * Gear^.Friction |
278 if ((Gear^.State and gstMoving) <> 0) then Gear^.dX:= Gear^.dX * Gear^.Friction |
279 end; |
279 end; |
280 |
280 |
281 if (Gear^.State <> 0) then DeleteCI(Gear); |
281 if (Gear^.State <> 0) then DeleteCI(Gear); |
282 |
282 |
283 if (Gear^.State and gstMoving) <> 0 then |
283 if (Gear^.State and gstMoving) <> 0 then |
284 if TestCollisionXKick(Gear, hwSign(Gear^.dX)) then |
284 if TestCollisionXKick(Gear, hwSign(Gear^.dX)) then |
285 if ((Gear^.State and gstFalling) = 0) then |
285 if not isFalling then |
286 if hwAbs(Gear^.dX) > _0_01 then |
286 if hwAbs(Gear^.dX) > _0_01 then |
287 if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -1, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_96; Gear^.Y:= Gear^.Y - _1 end else |
287 if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -1, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_96; Gear^.Y:= Gear^.Y - _1 end else |
288 if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -2, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_93; Gear^.Y:= Gear^.Y - _2 end else |
288 if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -2, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_93; Gear^.Y:= Gear^.Y - _2 end else |
289 if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -3, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_9 ; Gear^.Y:= Gear^.Y - _3 end else |
289 if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -3, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_9 ; Gear^.Y:= Gear^.Y - _3 end else |
290 if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -4, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_87; Gear^.Y:= Gear^.Y - _4 end else |
290 if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -4, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_87; Gear^.Y:= Gear^.Y - _4 end else |
341 Gear^.State:= Gear^.State and not gstHHDriven; |
341 Gear^.State:= Gear^.State and not gstHHDriven; |
342 if Gear^.Damage > 0 then |
342 if Gear^.Damage > 0 then |
343 Gear^.State:= Gear^.State and not (gstHHJumping or gstHHHJump); |
343 Gear^.State:= Gear^.State and not (gstHHJumping or gstHHHJump); |
344 exit |
344 exit |
345 end; |
345 end; |
346 |
346 |
347 if ((Gear^.State and (gstFalling or gstMoving)) <> 0) |
347 if ((Gear^.State and gstMoving) <> 0) |
348 or (StepTicks = cHHStepTicks) |
348 or (StepTicks = cHHStepTicks) |
349 or (CurAmmoGear <> nil) then // we're moving |
349 or (CurAmmoGear <> nil) then // we're moving |
350 begin |
350 begin |
351 // check for case with ammo |
351 // check for case with ammo |
352 t:= CheckGearNear(Gear, gtCase, 36, 36); |
352 t:= CheckGearNear(Gear, gtCase, 36, 36); |
359 CurAmmoGear^.Message:= Gear^.Message; |
359 CurAmmoGear^.Message:= Gear^.Message; |
360 exit |
360 exit |
361 end; |
361 end; |
362 |
362 |
363 if ((Gear^.Message and gm_Attack) <> 0) or |
363 if ((Gear^.Message and gm_Attack) <> 0) or |
364 ((Gear^.State and gstAttacking) <> 0)then Attack(Gear); |
364 ((Gear^.State and gstAttacking) <> 0) then Attack(Gear); |
365 |
365 |
366 if (Gear^.State and (gstFalling or gstMoving)) <> 0 then |
366 if (Gear^.State and gstMoving) <> 0 then |
367 begin |
367 begin |
368 if ((Gear^.Message and gm_HJump) <> 0) and |
368 if ((Gear^.Message and gm_HJump) <> 0) and |
369 ((Gear^.State and gstHHJumping) <> 0) and |
369 ((Gear^.State and gstHHJumping) <> 0) and |
370 ((Gear^.State and gstHHHJump) = 0) then |
370 ((Gear^.State and gstHHHJump) = 0) then |
371 if (not (hwAbs(Gear^.dX) > cLittle)) and (Gear^.dY < -_0_02) then |
371 if (not (hwAbs(Gear^.dX) > cLittle)) and (Gear^.dY < -_0_02) then |
372 begin |
372 begin |
373 Gear^.State:= Gear^.State or gstHHHJump; |
373 Gear^.State:= Gear^.State or gstHHHJump or gstMoving; |
374 Gear^.dY:= -_0_25; |
374 Gear^.dY:= -_0_25; |
375 Gear^.dX:= SignAs(_0_02, Gear^.dX) |
375 Gear^.dX:= SignAs(_0_02, Gear^.dX) |
376 end; |
376 end; |
377 Gear^.Message:= Gear^.Message and not (gm_LJump or gm_HJump); |
377 Gear^.Message:= Gear^.Message and not (gm_LJump or gm_HJump); |
378 |
378 |
379 if ((Gear^.State and gstHHJumping) <> 0) and |
379 if ((Gear^.State and gstHHJumping) <> 0) and |
380 TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then SetLittle(Gear^.dX); |
380 TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then SetLittle(Gear^.dX); |
381 |
381 |
382 doStepHedgehogMoving(Gear); |
382 doStepHedgehogMoving(Gear); |
383 |
383 |
384 if (Gear^.State and (gstFalling or gstMoving)) = 0 then |
384 if (Gear^.State and gstMoving) = 0 then |
385 begin |
385 begin |
386 AddGearCI(Gear); |
386 AddGearCI(Gear); |
387 StepTicks:= 300 |
387 StepTicks:= 350 |
388 end; |
388 end; |
389 exit |
389 exit |
390 end; |
390 end; |
391 |
391 |
392 HedgehogChAngle(Gear); |
392 HedgehogChAngle(Gear); |