51 else Gear.State:= Gear.State and not gstCollision |
51 else Gear.State:= Gear.State and not gstCollision |
52 end; |
52 end; |
53 |
53 |
54 procedure CheckHHDamage(Gear: PGear); |
54 procedure CheckHHDamage(Gear: PGear); |
55 begin |
55 begin |
56 if Gear.dY > 0.35 then Gear.Damage:= Gear.Damage + round(25 * (abs(Gear.dY) - 0.35)); |
56 if Gear.dY > 0.35 then Gear.Damage:= Gear.Damage + round(75 * (abs(Gear.dY) - 0.35)); |
57 end; |
57 end; |
58 |
58 |
59 //////////////////////////////////////////////////////////////////////////////// |
59 //////////////////////////////////////////////////////////////////////////////// |
60 //////////////////////////////////////////////////////////////////////////////// |
60 //////////////////////////////////////////////////////////////////////////////// |
61 procedure CalcRotationDirAngle(Gear: PGear); |
61 procedure CalcRotationDirAngle(Gear: PGear); |
146 doStepFallingGear(Gear); |
145 doStepFallingGear(Gear); |
147 if (Gear.State and gstCollision) <> 0 then |
146 if (Gear.State and gstCollision) <> 0 then |
148 begin |
147 begin |
149 doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound); |
148 doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound); |
150 DeleteGear(Gear); |
149 DeleteGear(Gear); |
151 SetAllToActive; |
|
152 exit |
150 exit |
153 end; |
151 end; |
154 if (GameTicks and $3F) = 0 then |
152 if (GameTicks and $3F) = 0 then |
155 AddGear(round(Gear.X), round(Gear.Y), gtSmokeTrace, 0) |
153 AddGear(round(Gear.X), round(Gear.Y), gtSmokeTrace, 0) |
156 end; |
154 end; |
251 Gear.X:= Gear.X + Gear.dX; |
248 Gear.X:= Gear.X + Gear.dX; |
252 Gear.Y:= Gear.Y + Gear.dY; |
249 Gear.Y:= Gear.Y + Gear.dY; |
253 CheckCollision(Gear); |
250 CheckCollision(Gear); |
254 if (Gear.State and gstCollision) <> 0 then |
251 if (Gear.State and gstCollision) <> 0 then |
255 begin |
252 begin |
256 doMakeExplosion(round(Gear.X), round(Gear.Y), 25, EXPLAllDamageInRadius); |
253 t:= CheckGearsCollision(Gear, Sign(Gear.dX), true); |
257 DeleteGear(Gear); |
254 if t = nil then t:= CheckGearsCollision(Gear, Sign(Gear.dY), false); |
258 SetAllToActive; |
255 if t <> nil then |
|
256 AmmoShove(Gear, t, 25); |
|
257 doMakeExplosion(round(Gear.X), round(Gear.Y), 25, EXPLNoDamage); |
|
258 DeleteGear(Gear); |
259 exit |
259 exit |
260 end; |
260 end; |
261 dec(i) |
261 dec(i) |
262 until i = 0; |
262 until i = 0; |
263 if (Gear.X < 0) or (Gear.Y < 0) or (Gear.X > 2048) or (Gear.Y > 1024) then |
263 if (Gear.X < 0) or (Gear.Y < 0) or (Gear.X > 2048) or (Gear.Y > 1024) then |
264 DeleteGear(Gear) |
264 DeleteGear(Gear) |
265 end; |
265 end; |
266 |
266 |
267 //////////////////////////////////////////////////////////////////////////////// |
267 //////////////////////////////////////////////////////////////////////////////// |
268 procedure doStepDEagleShot(Gear: PGear); // сама идея такова, что должна как то образовываться выбоина от выстрела :) |
268 procedure doStepDEagleShot(Gear: PGear); |
269 var i: LongWord; // пуля и в африке пуля.. и демаж совсем другой.. и эксплоза никакого, можно даже |
269 var i, x, y: LongWord; |
270 begin // навылет сделать, типа через одного пролетела и в другого попала... опять же |
270 oX, oY: real; |
271 AllInactive:= false; // дальше летишь меньше урон.. ой скока сразу мыслей то :)) |
271 t: PGear; |
|
272 begin |
|
273 AllInactive:= false; |
272 i:= 80; |
274 i:= 80; |
|
275 oX:= Gear.X; |
|
276 oY:= Gear.Y; |
273 repeat |
277 repeat |
274 Gear.X:= Gear.X + Gear.dX; |
278 Gear.X:= Gear.X + Gear.dX; |
275 Gear.Y:= Gear.Y + Gear.dY; |
279 Gear.Y:= Gear.Y + Gear.dY; |
276 CheckCollision(Gear); |
280 x:= round(Gear.X); |
277 if (Gear.State and gstCollision) <> 0 then |
281 y:= round(Gear.Y); |
278 begin |
282 if ((y and $FFFFFC00) = 0) and ((x and $FFFFF800) = 0) |
279 inc(Gear.Damage); |
283 and (Land[y, x] <> 0) then inc(Gear.Damage); |
280 doMakeExplosion(round(Gear.X), round(Gear.Y), 2, EXPLAllDamageInRadius); |
284 t:= CheckGearsCollision(Gear, Sign(Gear.dX), true); |
281 end; |
285 if t = nil then t:= CheckGearsCollision(Gear, Sign(Gear.dY), false); |
282 dec(i) |
286 if t <> nil then |
283 until i = 0; |
287 begin |
284 if (Gear.Damage > 20) or (Gear.X < 0) or (Gear.Y < 0) or (Gear.X > 2048) or (Gear.Y > 1024) then |
288 AmmoShove(Gear, t, 12); |
|
289 if t.CollIndex < High(Longword) then DeleteCR(t) |
|
290 end; |
|
291 dec(i) |
|
292 until (i = 0) or (Gear.Damage > Gear.Health); |
|
293 if Gear.Damage > 0 then |
|
294 begin |
|
295 DrawTunnel(oX, oY, Gear.dX, Gear.dY, 82 - i, 1); |
|
296 dec(Gear.Health, Gear.Damage); |
|
297 Gear.Damage:= 0 |
|
298 end; |
|
299 if (Gear.Health <= 0) or (Gear.X < 0) or (Gear.Y < 0) or (Gear.X > 2048) or (Gear.Y > 1024) then |
285 DeleteGear(Gear) |
300 DeleteGear(Gear) |
286 end; |
301 end; |
287 |
302 |
288 //////////////////////////////////////////////////////////////////////////////// |
303 //////////////////////////////////////////////////////////////////////////////// |
289 procedure doStepActionTimer(Gear: PGear); |
304 procedure doStepActionTimer(Gear: PGear); |
371 ar[i].Left := round(Gear.X) - Gear.HalfWidth - GetRandom(2); |
384 ar[i].Left := round(Gear.X) - Gear.HalfWidth - GetRandom(2); |
372 ar[i].Right:= round(Gear.X) + Gear.HalfWidth + GetRandom(2); |
385 ar[i].Right:= round(Gear.X) + Gear.HalfWidth + GetRandom(2); |
373 inc(y, 2); |
386 inc(y, 2); |
374 inc(i) |
387 inc(i) |
375 end; |
388 end; |
376 DrawLineExplosions(@ar, 3, round(Gear.Y) - cHHHalfHeight*2, 2, Pred(i)); |
389 DrawHLineExplosions(@ar, 3, round(Gear.Y) - cHHHalfHeight*2, 2, Pred(i)); |
377 Gear.dY:= PHedgehog(Gear.Hedgehog).Gear.dY; |
390 Gear.dY:= PHedgehog(Gear.Hedgehog).Gear.dY; |
378 doStepPickHammerWork(Gear); |
391 doStepPickHammerWork(Gear); |
379 Gear.doStep:= doStepPickHammerWork |
392 Gear.doStep:= doStepPickHammerWork |
380 end; |
393 end; |
381 |
394 |
616 AllInactive:= false; |
629 AllInactive:= false; |
617 if (Gear.Timer and $FF) = 0 then PlaySound(sndMineTick); |
630 if (Gear.Timer and $FF) = 0 then PlaySound(sndMineTick); |
618 if Gear.Timer = 0 then |
631 if Gear.Timer = 0 then |
619 begin |
632 begin |
620 doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound); |
633 doMakeExplosion(round(Gear.X), round(Gear.Y), 50, EXPLAutoSound); |
621 SetAllToActive; |
|
622 DeleteGear(Gear) |
634 DeleteGear(Gear) |
623 end; |
635 end; |
624 dec(Gear.Timer); |
636 dec(Gear.Timer); |
625 end else // gsttmpFlag = 0 |
637 end else // gsttmpFlag = 0 |
626 if TurnTimeLeft = 0 then Gear.State:= Gear.State or gsttmpFlag; |
638 if TurnTimeLeft = 0 then Gear.State:= Gear.State or gsttmpFlag; |