21 d: LongInt; |
21 d: LongInt; |
22 begin |
22 begin |
23 gi:= GearsList; |
23 gi:= GearsList; |
24 while gi <> nil do |
24 while gi <> nil do |
25 begin |
25 begin |
26 d:= r - hwRound(Distance(gi^.X - x, gi^.Y - y)); |
26 if (gi^.Kind = gtHedgehog) then |
27 if (d > 1) and (gi^.Kind = gtHedgehog) and not gi^.Invulnerable and (GetRandom(2) = 0) then |
|
28 begin |
27 begin |
29 if (CurrentHedgehog^.Gear = gi) then |
28 d:= r - hwRound(Distance(gi^.X - x, gi^.Y - y)); |
30 PlaySound(sndOops, PHedgehog(gi^.Hedgehog)^.Team^.voicepack) |
29 if (d > 1) and not gi^.Invulnerable and (GetRandom(2) = 0) then |
31 else |
|
32 begin |
30 begin |
33 if (gi^.State and gstMoving) = 0 then |
31 if (CurrentHedgehog^.Gear = gi) then |
34 gi^.State:= gi^.State or gstLoser; |
32 PlaySound(sndOops, PHedgehog(gi^.Hedgehog)^.Team^.voicepack) |
35 if d > r div 2 then |
|
36 PlaySound(sndNooo, PHedgehog(gi^.Hedgehog)^.Team^.voicepack) |
|
37 else |
33 else |
38 PlaySound(sndUhOh, PHedgehog(gi^.Hedgehog)^.Team^.voicepack); |
34 begin |
|
35 if (gi^.State and gstMoving) = 0 then |
|
36 gi^.State:= gi^.State or gstLoser; |
|
37 if d > r div 2 then |
|
38 PlaySound(sndNooo, PHedgehog(gi^.Hedgehog)^.Team^.voicepack) |
|
39 else |
|
40 PlaySound(sndUhOh, PHedgehog(gi^.Hedgehog)^.Team^.voicepack); |
|
41 end; |
39 end; |
42 end; |
40 end; |
43 end; |
41 gi:= gi^.NextGear |
44 gi:= gi^.NextGear |
42 end; |
45 end; |
43 end; |
46 end; |
136 //////////////////////////////////////////////////////////////////////////////// |
139 //////////////////////////////////////////////////////////////////////////////// |
137 //////////////////////////////////////////////////////////////////////////////// |
140 //////////////////////////////////////////////////////////////////////////////// |
138 procedure CalcRotationDirAngle(Gear: PGear); |
141 procedure CalcRotationDirAngle(Gear: PGear); |
139 var dAngle: real; |
142 var dAngle: real; |
140 begin |
143 begin |
141 dAngle:= (hwAbs(Gear^.dX) + hwAbs(Gear^.dY)).QWordValue / $80000000; |
144 dAngle:= (Gear^.dX.QWordValue + Gear^.dY.QWordValue) / $80000000; |
142 if not Gear^.dX.isNegative then |
145 if not Gear^.dX.isNegative then |
143 Gear^.DirAngle:= Gear^.DirAngle + dAngle |
146 Gear^.DirAngle:= Gear^.DirAngle + dAngle |
144 else |
147 else |
145 Gear^.DirAngle:= Gear^.DirAngle - dAngle; |
148 Gear^.DirAngle:= Gear^.DirAngle - dAngle; |
146 |
149 |
331 AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtEvilTrace, 0, _0, _0, 0); |
334 AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtEvilTrace, 0, _0, _0, 0); |
332 end; |
335 end; |
333 end; |
336 end; |
334 //////////////////////////////////////////////////////////////////////////////// |
337 //////////////////////////////////////////////////////////////////////////////// |
335 procedure doStepMolotov(Gear: PGear); |
338 procedure doStepMolotov(Gear: PGear); |
336 var i: LongInt; |
339 var i, gX, gY: LongInt; |
337 dX, dY: hwFloat; |
340 dX, dY: hwFloat; |
338 Fire: PGear; |
341 Fire: PGear; |
339 begin |
342 begin |
340 AllInactive:= false; |
343 AllInactive:= false; |
341 |
344 |
342 doStepFallingGear(Gear); |
345 doStepFallingGear(Gear); |
343 CalcRotationDirAngle(Gear); |
346 CalcRotationDirAngle(Gear); |
344 |
347 |
345 if (Gear^.State and gstCollision) <> 0 then begin |
348 if (Gear^.State and gstCollision) <> 0 then begin |
346 PlaySound(sndMolotov); |
349 PlaySound(sndMolotov); |
|
350 gX:= hwRound(Gear^.X); |
|
351 gY:= hwRound(Gear^.Y); |
347 //doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 5, EXPLAutoSound); |
352 //doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 5, EXPLAutoSound); |
348 for i:= 0 to 20 do begin |
353 for i:= 0 to 20 do begin |
349 dX:= AngleCos(i * 2) * ((_0_1*(i div 5))) * (GetRandom + _1); |
354 dX:= AngleCos(i * 2) * ((_0_1*(i div 5))) * (GetRandom + _1); |
350 dY:= AngleSin(i * 8) * _0_5 * (GetRandom + _1); |
355 dY:= AngleSin(i * 8) * _0_5 * (GetRandom + _1); |
351 Fire:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, dX, dY, 0); |
356 Fire:= AddGear(gX, gY, gtFlame, 0, dX, dY, 0); |
352 Fire^.State:= Fire^.State or gsttmpFlag; |
357 Fire^.State:= Fire^.State or gsttmpFlag; |
353 Fire:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, dX, -dY, 0); |
358 Fire:= AddGear(gX, gY, gtFlame, 0, dX, -dY, 0); |
354 Fire^.State:= Fire^.State or gsttmpFlag; |
359 Fire^.State:= Fire^.State or gsttmpFlag; |
355 Fire:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, -dX, dY, 0); |
360 Fire:= AddGear(gX, gY, gtFlame, 0, -dX, dY, 0); |
356 Fire^.State:= Fire^.State or gsttmpFlag; |
361 Fire^.State:= Fire^.State or gsttmpFlag; |
357 Fire:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, -dX, -dY, 0); |
362 Fire:= AddGear(gX, gY, gtFlame, 0, -dX, -dY, 0); |
358 Fire^.State:= Fire^.State or gsttmpFlag; |
363 Fire^.State:= Fire^.State or gsttmpFlag; |
359 end; |
364 end; |
360 DeleteGear(Gear); |
365 DeleteGear(Gear); |
361 exit |
366 exit |
362 end; |
367 end; |
470 end; |
475 end; |
471 |
476 |
472 //////////////////////////////////////////////////////////////////////////////// |
477 //////////////////////////////////////////////////////////////////////////////// |
473 procedure doStepBeeWork(Gear: PGear); |
478 procedure doStepBeeWork(Gear: PGear); |
474 var t: hwFloat; |
479 var t: hwFloat; |
|
480 gX,gY: LongInt; |
475 nuw: boolean; |
481 nuw: boolean; |
476 const uw: boolean = false; |
482 const uw: boolean = false; |
477 begin |
483 begin |
478 AllInactive:= false; |
484 AllInactive:= false; |
|
485 gX:= hwRound(Gear^.X); |
|
486 gY:= hwRound(Gear^.Y); |
479 nuw:= (cWaterLine < hwRound(Gear^.Y) + Gear^.Radius); |
487 nuw:= (cWaterLine < hwRound(Gear^.Y) + Gear^.Radius); |
480 if nuw and not uw then |
488 if nuw and not uw then |
481 begin |
489 begin |
482 AddVisualGear(hwRound(Gear^.X), cWaterLine, vgtSplash); |
490 AddVisualGear(gX, cWaterLine, vgtSplash); |
483 AddVisualGear(hwRound(Gear^.X) - 3 + Random(6), cWaterLine, vgtDroplet); |
491 AddVisualGear(gX - 3 + Random(6), cWaterLine, vgtDroplet); |
484 AddVisualGear(hwRound(Gear^.X) - 3 + Random(6), cWaterLine, vgtDroplet); |
492 AddVisualGear(gX - 3 + Random(6), cWaterLine, vgtDroplet); |
485 AddVisualGear(hwRound(Gear^.X) - 3 + Random(6), cWaterLine, vgtDroplet); |
493 AddVisualGear(gX - 3 + Random(6), cWaterLine, vgtDroplet); |
486 AddVisualGear(hwRound(Gear^.X) - 3 + Random(6), cWaterLine, vgtDroplet); |
494 AddVisualGear(gX - 3 + Random(6), cWaterLine, vgtDroplet); |
487 StopSound(Gear^.SoundChannel); |
495 StopSound(Gear^.SoundChannel); |
488 Gear^.SoundChannel:= LoopSound(sndBeeWater); |
496 Gear^.SoundChannel:= LoopSound(sndBeeWater); |
489 uw:= nuw |
497 uw:= nuw |
490 end |
498 end |
491 else if not nuw and uw then |
499 else if not nuw and uw then |
492 begin |
500 begin |
493 AddVisualGear(hwRound(Gear^.X), cWaterLine, vgtSplash); |
501 AddVisualGear(gX, cWaterLine, vgtSplash); |
494 StopSound(Gear^.SoundChannel); |
502 StopSound(Gear^.SoundChannel); |
495 Gear^.SoundChannel:= LoopSound(sndBee); |
503 Gear^.SoundChannel:= LoopSound(sndBee); |
496 uw:= nuw |
504 uw:= nuw |
497 end; |
505 end; |
498 |
506 |
499 |
507 |
500 t:= Distance(Gear^.dX, Gear^.dY); |
508 t:= Distance(Gear^.dX, Gear^.dY); |
501 Gear^.dX:= Gear^.Elasticity * (Gear^.dX + _0_000004 * (TargetPoint.X - hwRound(Gear^.X))); |
509 Gear^.dX:= Gear^.Elasticity * (Gear^.dX + _0_000004 * (TargetPoint.X - gX)); |
502 Gear^.dY:= Gear^.Elasticity * (Gear^.dY + _0_000004 * (TargetPoint.Y - hwRound(Gear^.Y))); |
510 Gear^.dY:= Gear^.Elasticity * (Gear^.dY + _0_000004 * (TargetPoint.Y - gY)); |
503 |
511 |
504 t:= t / Distance(Gear^.dX, Gear^.dY); |
512 t:= t / Distance(Gear^.dX, Gear^.dY); |
505 Gear^.dX:= Gear^.dX * t; |
513 Gear^.dX:= Gear^.dX * t; |
506 Gear^.dY:= Gear^.dY * t; |
514 Gear^.dY:= Gear^.dY * t; |
507 Gear^.X:= Gear^.X + Gear^.dX; |
515 Gear^.X:= Gear^.X + Gear^.dX; |
1602 end; |
1610 end; |
1603 |
1611 |
1604 //////////////////////////////////////////////////////////////////////////////// |
1612 //////////////////////////////////////////////////////////////////////////////// |
1605 procedure doStepFlame(Gear: PGear); |
1613 procedure doStepFlame(Gear: PGear); |
1606 var i: Integer; |
1614 var i: Integer; |
|
1615 gX,gY: LongInt; |
1607 begin |
1616 begin |
1608 if (Gear^.State and gsttmpFlag) = 0 then AllInactive:= false; |
1617 if (Gear^.State and gsttmpFlag) = 0 then AllInactive:= false; |
1609 |
1618 |
1610 if not TestCollisionYwithGear(Gear, 1) then |
1619 if not TestCollisionYwithGear(Gear, 1) then |
1611 begin |
1620 begin |
1612 AllInactive:= false; |
1621 AllInactive:= false; |
1613 if hwAbs(Gear^.dX) > _0_01 then |
1622 if Gear^.dX.QWordValue > _0_01.QWordValue then |
1614 Gear^.dX:= Gear^.dX * _0_995; |
1623 Gear^.dX:= Gear^.dX * _0_995; |
1615 if (Gear^.State and gsttmpFlag) <> 0 then Gear^.dY:= Gear^.dY + _2*cGravity else |
|
1616 Gear^.dY:= Gear^.dY + cGravity; |
1624 Gear^.dY:= Gear^.dY + cGravity; |
1617 if hwAbs(Gear^.dY) > _0_2 then Gear^.dY:= Gear^.dY * _0_995; |
1625 if (Gear^.State and gsttmpFlag) <> 0 then Gear^.dY:= Gear^.dY + cGravity; |
|
1626 if Gear^.dY.QWordValue > _0_2.QWordValue then Gear^.dY:= Gear^.dY * _0_995; |
1618 |
1627 |
1619 if (Gear^.State and gsttmpFlag) <> 0 then Gear^.X:= Gear^.X + Gear^.dX else |
1628 if (Gear^.State and gsttmpFlag) <> 0 then Gear^.X:= Gear^.X + Gear^.dX else |
1620 Gear^.X:= Gear^.X + Gear^.dX + cWindSpeed * 640; |
1629 Gear^.X:= Gear^.X + Gear^.dX + cWindSpeed * 640; |
1621 Gear^.Y:= Gear^.Y + Gear^.dY; |
1630 Gear^.Y:= Gear^.Y + Gear^.dY; |
1622 |
1631 |
1623 if (hwRound(Gear^.Y) > cWaterLine) then |
1632 if (hwRound(Gear^.Y) > cWaterLine) then |
1624 begin |
1633 begin |
|
1634 gX:= hwRound(Gear^.X); |
1625 for i:= 0 to 3 do |
1635 for i:= 0 to 3 do |
1626 AddVisualGear(hwRound(Gear^.X) - 16 + Random(32), cWaterLine - 16 + Random(16), vgtSteam); |
1636 AddVisualGear(gX - 16 + Random(32), cWaterLine - 16 + Random(16), vgtSteam); |
1627 PlaySound(sndVaporize); |
1637 PlaySound(sndVaporize); |
1628 DeleteGear(Gear); |
1638 DeleteGear(Gear); |
1629 exit |
1639 exit |
1630 end |
1640 end |
1631 end else begin |
1641 end else begin |
1644 // Standard fire |
1654 // Standard fire |
1645 if (Gear^.State and gsttmpFlag) = 0 then |
1655 if (Gear^.State and gsttmpFlag) = 0 then |
1646 begin |
1656 begin |
1647 Gear^.Radius:= 9; |
1657 Gear^.Radius:= 9; |
1648 AmmoShove(Gear, 4, 100); |
1658 AmmoShove(Gear, 4, 100); |
|
1659 gX:= hwRound(Gear^.X); |
|
1660 gY:= hwRound(Gear^.Y); |
1649 Gear^.Radius:= 1; |
1661 Gear^.Radius:= 1; |
1650 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 4, EXPLNoDamage); |
1662 doMakeExplosion(gX, gY, 4, EXPLNoDamage); |
1651 if ((GameTicks and $7) = 0) and (Random(2) = 0) then |
1663 if ((GameTicks and $7) = 0) and (Random(2) = 0) then |
1652 for i:= 1 to Random(2)+1 do |
1664 for i:= 1 to Random(2)+1 do |
1653 AddVisualGear(hwRound(Gear^.X) - 3 + Random(6), hwRound(Gear^.Y) - 2, vgtSmoke); |
1665 AddVisualGear(gX - 3 + Random(6), gY - 2, vgtSmoke); |
1654 if Gear^.Health > 0 then dec(Gear^.Health); |
1666 if Gear^.Health > 0 then dec(Gear^.Health); |
1655 Gear^.Timer:= 450 - Gear^.Tag * 8 |
1667 Gear^.Timer:= 450 - Gear^.Tag * 8 |
1656 end |
1668 end |
1657 else begin |
1669 else begin |
1658 // Modified fire |
1670 // Modified fire |
1659 if ((GameTicks and $7FF) = 0) and ((GameFlags and gfSolidLand) = 0) then begin |
1671 if ((GameTicks and $7FF) = 0) and ((GameFlags and gfSolidLand) = 0) then begin |
1660 DrawExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 4); |
1672 DrawExplosion(gX, gY, 4); |
1661 |
1673 |
1662 for i:= 0 to Random(3) do |
1674 for i:= 0 to Random(3) do |
1663 AddVisualGear(hwRound(Gear^.X) - 3 + Random(6), hwRound(Gear^.Y) - 2, vgtSmoke); |
1675 AddVisualGear(gX - 3 + Random(6), gY - 2, vgtSmoke); |
1664 end; |
1676 end; |
1665 // This one is interesting. I think I understand the purpose, but I wonder if a bit more fuzzy of kicking could be done with getrandom. |
1677 // This one is interesting. I think I understand the purpose, but I wonder if a bit more fuzzy of kicking could be done with getrandom. |
1666 Gear^.Timer:= 100 - Gear^.Tag * 3; |
1678 Gear^.Timer:= 100 - Gear^.Tag * 3; |
1667 if (Gear^.Damage > 3000+Gear^.Tag*1500) then Gear^.Health:= 0 |
1679 if (Gear^.Damage > 3000+Gear^.Tag*1500) then Gear^.Health:= 0 |
1668 end |
1680 end |
1669 end |
1681 end |
1670 end; |
1682 end; |
1671 if Gear^.Health = 0 then begin |
1683 if Gear^.Health = 0 then begin |
|
1684 gX:= hwRound(Gear^.X); |
|
1685 gY:= hwRound(Gear^.Y); |
1672 if (Gear^.State and gsttmpFlag) = 0 then begin |
1686 if (Gear^.State and gsttmpFlag) = 0 then begin |
1673 if ((GameTicks and $3) = 0) and (Random(1) = 0) then begin |
1687 if ((GameTicks and $3) = 0) and (Random(1) = 0) then begin |
1674 for i:= 1 to Random(2)+1 do begin |
1688 for i:= 1 to Random(2)+1 do begin |
1675 AddVisualGear(hwRound(Gear^.X) - 3 + Random(6), hwRound(Gear^.Y) - 2, vgtSmoke); |
1689 AddVisualGear(gX - 3 + Random(6), gY - 2, vgtSmoke); |
1676 end; |
1690 end; |
1677 end; |
1691 end; |
1678 end else begin |
1692 end else begin |
1679 for i:= 0 to Random(3) do begin |
1693 for i:= 0 to Random(3) do begin |
1680 AddVisualGear(hwRound(Gear^.X) - 3 + Random(6), hwRound(Gear^.Y) - 2, vgtSmoke); |
1694 AddVisualGear(gX - 3 + Random(6), gY - 2, vgtSmoke); |
1681 end; |
1695 end; |
1682 end; |
1696 end; |
1683 |
1697 |
1684 DeleteGear(Gear) |
1698 DeleteGear(Gear) |
1685 end; |
1699 end; |
2471 |
2485 |
2472 //////////////////////////////////////////////////////////////////////////////// |
2486 //////////////////////////////////////////////////////////////////////////////// |
2473 procedure doStepBallgunWork(Gear: PGear); |
2487 procedure doStepBallgunWork(Gear: PGear); |
2474 var HHGear: PGear; |
2488 var HHGear: PGear; |
2475 rx, ry: hwFloat; |
2489 rx, ry: hwFloat; |
|
2490 gX, gY: LongInt; |
2476 begin |
2491 begin |
2477 AllInactive:= false; |
2492 AllInactive:= false; |
2478 dec(Gear^.Timer); |
2493 dec(Gear^.Timer); |
2479 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; |
2494 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; |
2480 HedgehogChAngle(HHGear); |
2495 HedgehogChAngle(HHGear); |
|
2496 gX:= hwRound(Gear^.X); |
|
2497 gY:= hwRound(Gear^.Y); |
2481 if (Gear^.Timer mod 100) = 0 then |
2498 if (Gear^.Timer mod 100) = 0 then |
2482 begin |
2499 begin |
2483 rx:= rndSign(getRandom * _0_1); |
2500 rx:= rndSign(getRandom * _0_1); |
2484 ry:= rndSign(getRandom * _0_1); |
2501 ry:= rndSign(getRandom * _0_1); |
2485 |
2502 |
2486 AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtBall, 0, |
2503 AddGear(gx, gy, gtBall, 0, |
2487 SignAs(AngleSin(HHGear^.Angle) * _0_8, HHGear^.dX) + rx, |
2504 SignAs(AngleSin(HHGear^.Angle) * _0_8, HHGear^.dX) + rx, |
2488 AngleCos(HHGear^.Angle) * ( - _0_8) + ry, |
2505 AngleCos(HHGear^.Angle) * ( - _0_8) + ry, |
2489 0); |
2506 0); |
2490 |
2507 |
2491 PlaySound(sndGun); |
2508 PlaySound(sndGun); |
2927 if Gear^.Timer > 250 then DeleteGear(Gear); |
2944 if Gear^.Timer > 250 then DeleteGear(Gear); |
2928 end; |
2945 end; |
2929 |
2946 |
2930 procedure doStepBigExplosion(Gear: PGear); |
2947 procedure doStepBigExplosion(Gear: PGear); |
2931 var i: LongWord; |
2948 var i: LongWord; |
2932 begin |
2949 gX,gY: LongInt; |
2933 AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtSmokeRing); |
2950 begin |
2934 for i:= 0 to 46 do AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtFire); |
2951 gX:= hwRound(Gear^.X); |
2935 for i:= 0 to 15 do AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtExplPart); |
2952 gY:= hwRound(Gear^.Y); |
2936 for i:= 0 to 15 do AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtExplPart2); |
2953 AddVisualGear(gX, gY, vgtSmokeRing); |
|
2954 for i:= 0 to 46 do AddVisualGear(gX, gY, vgtFire); |
|
2955 for i:= 0 to 15 do AddVisualGear(gX, gY, vgtExplPart); |
|
2956 for i:= 0 to 15 do AddVisualGear(gX, gY, vgtExplPart2); |
2937 Gear^.doStep:= @doStepBigExplosionWork |
2957 Gear^.doStep:= @doStepBigExplosionWork |
2938 end; |
2958 end; |
2939 |
2959 |
2940 //////////////////////////////////////////////////////////////////////////////// |
2960 //////////////////////////////////////////////////////////////////////////////// |
2941 procedure doStepEggWork(Gear: PGear); |
2961 procedure doStepEggWork(Gear: PGear); |
2943 i: LongInt; |
2963 i: LongInt; |
2944 begin |
2964 begin |
2945 AllInactive:= false; |
2965 AllInactive:= false; |
2946 Gear^.dX:= Gear^.dX; |
2966 Gear^.dX:= Gear^.dX; |
2947 doStepFallingGear(Gear); |
2967 doStepFallingGear(Gear); |
2948 CheckGearDrowning(Gear); |
2968 // CheckGearDrowning(Gear); // already checked for in doStepFallingGear |
2949 CalcRotationDirAngle(Gear); |
2969 CalcRotationDirAngle(Gear); |
2950 |
2970 |
2951 if (Gear^.State and gstCollision) <> 0 then |
2971 if (Gear^.State and gstCollision) <> 0 then |
2952 begin |
2972 begin |
2953 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 10, EXPLPoisoned or EXPLNoGfx); |
2973 doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 10, EXPLPoisoned or EXPLNoGfx); |