hedgewars/GSHandlers.inc
changeset 4365 4f2b1a152979
parent 4337 85e02b1a8e8f
child 4372 3836973380b9
equal deleted inserted replaced
4363:e944cc43f7a4 4365:4f2b1a152979
   129                 Gear^.State := gstDrowning;
   129                 Gear^.State := gstDrowning;
   130                 Gear^.RenderTimer := false;
   130                 Gear^.RenderTimer := false;
   131                 if (Gear^.Kind <> gtSniperRifleShot) and (Gear^.Kind <> gtShotgunShot) and (Gear^.Kind <> gtDEagleShot) and (Gear^.Kind <> gtSineGunShot) then
   131                 if (Gear^.Kind <> gtSniperRifleShot) and (Gear^.Kind <> gtShotgunShot) and (Gear^.Kind <> gtDEagleShot) and (Gear^.Kind <> gtSineGunShot) then
   132                     if Gear^.Kind = gtHedgehog then 
   132                     if Gear^.Kind = gtHedgehog then 
   133                         begin
   133                         begin
   134                         if PHedgehog(Gear^.Hedgehog)^.Effects[heResurrectable] then
   134                         if Gear^.Hedgehog^.Effects[heResurrectable] then
   135                             ResurrectHedgehog(Gear)
   135                             ResurrectHedgehog(Gear)
   136                         else
   136                         else
   137                             begin
   137                             begin
   138                             Gear^.doStep := @doStepDrowningGear;
   138                             Gear^.doStep := @doStepDrowningGear;
   139                             Gear^.State := Gear^.State and (not gstHHDriven);
   139                             Gear^.State := Gear^.State and (not gstHHDriven);
   140                             AddCaption(Format(GetEventString(eidDrowned), PHedgehog(Gear^.Hedgehog)^.Name), cWhiteColor, capgrpMessage);
   140                             AddCaption(Format(GetEventString(eidDrowned), Gear^.Hedgehog^.Name), cWhiteColor, capgrpMessage);
   141                             end
   141                             end
   142                         end
   142                         end
   143                     else
   143                     else
   144                         Gear^.doStep := @doStepDrowningGear
   144                         Gear^.doStep := @doStepDrowningGear
   145             end;
   145             end;
   201         end;
   201         end;
   202 
   202 
   203         if (Gear^.Invulnerable) then exit;
   203         if (Gear^.Invulnerable) then exit;
   204 
   204 
   205         //if _0_6 < Gear^.dY then
   205         //if _0_6 < Gear^.dY then
   206         //    PlaySound(sndOw4, PHedgehog(Gear^.Hedgehog)^.Team^.voicepack)
   206         //    PlaySound(sndOw4, Gear^.Hedgehog^.Team^.voicepack)
   207         //else
   207         //else
   208         //    PlaySound(sndOw1, PHedgehog(Gear^.Hedgehog)^.Team^.voicepack);
   208         //    PlaySound(sndOw1, Gear^.Hedgehog^.Team^.voicepack);
   209 
   209 
   210         ApplyDamage(Gear, dmg, dsFall);
   210         ApplyDamage(Gear, dmg, dsFall);
   211     end
   211     end
   212 end;
   212 end;
   213 
   213 
   624         exit
   624         exit
   625     end;
   625     end;
   626     dec(Gear^.Timer);
   626     dec(Gear^.Timer);
   627     if Gear^.Timer = 0 then
   627     if Gear^.Timer = 0 then
   628     begin
   628     begin
   629         PHedgehog(Gear^.Hedgehog)^.Gear^.Message:= PHedgehog(Gear^.Hedgehog)^.Gear^.Message and not gmAttack;
   629         Gear^.Hedgehog^.Gear^.Message:= Gear^.Hedgehog^.Gear^.Message and not gmAttack;
   630         PHedgehog(Gear^.Hedgehog)^.Gear^.State:= PHedgehog(Gear^.Hedgehog)^.Gear^.State and not gstAttacking;
   630         Gear^.Hedgehog^.Gear^.State:= Gear^.Hedgehog^.Gear^.State and not gstAttacking;
   631         AttackBar:= 0;
   631         AttackBar:= 0;
   632         
   632         
   633         Gear^.SoundChannel := LoopSound(sndBee);
   633         Gear^.SoundChannel := LoopSound(sndBee);
   634         Gear^.Timer := 5000;
   634         Gear^.Timer := 5000;
   635         // save initial speed in otherwise unused Friction variable
   635         // save initial speed in otherwise unused Friction variable
   804 var 
   804 var 
   805     HHGear: PGear;
   805     HHGear: PGear;
   806     shell: PVisualGear;
   806     shell: PVisualGear;
   807 begin
   807 begin
   808     cArtillery := true;
   808     cArtillery := true;
   809     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
   809     HHGear := Gear^.Hedgehog^.Gear;
   810     HHGear^.State := HHGear^.State or gstNotKickable;
   810     HHGear^.State := HHGear^.State or gstNotKickable;
   811     HedgehogChAngle(HHGear);
   811     HedgehogChAngle(HHGear);
   812     if not cLaserSighting then
   812     if not cLaserSighting then
   813         // game does not have default laser sight. turn it on and give them a chance to aim
   813         // game does not have default laser sight. turn it on and give them a chance to aim
   814     begin
   814     begin
   897 var 
   897 var 
   898     i, ei: LongInt;
   898     i, ei: LongInt;
   899     HHGear: PGear;
   899     HHGear: PGear;
   900 begin
   900 begin
   901     AllInactive := false;
   901     AllInactive := false;
   902     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
   902     HHGear := Gear^.Hedgehog^.Gear;
   903     dec(Gear^.Timer);
   903     dec(Gear^.Timer);
   904     if (Gear^.Timer = 0)or((Gear^.Message and gmDestroy) <> 0)or((HHGear^.State and gstHHDriven) =
   904     if (Gear^.Timer = 0)or((Gear^.Message and gmDestroy) <> 0)or((HHGear^.State and gstHHDriven) =
   905        0) then
   905        0) then
   906     begin
   906     begin
   907         StopSound(Gear^.SoundChannel);
   907         StopSound(Gear^.SoundChannel);
   971     i, y: LongInt;
   971     i, y: LongInt;
   972     ar: TRangeArray;
   972     ar: TRangeArray;
   973     HHGear: PGear;
   973     HHGear: PGear;
   974 begin
   974 begin
   975     i := 0;
   975     i := 0;
   976     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
   976     HHGear := Gear^.Hedgehog^.Gear;
   977 
   977 
   978     y := hwRound(Gear^.Y) - cHHRadius * 2;
   978     y := hwRound(Gear^.Y) - cHHRadius * 2;
   979     while y < hwRound(Gear^.Y) do
   979     while y < hwRound(Gear^.Y) do
   980     begin
   980     begin
   981         ar[i].Left := hwRound(Gear^.X) - Gear^.Radius - LongInt(GetRandom(2));
   981         ar[i].Left := hwRound(Gear^.X) - Gear^.Radius - LongInt(GetRandom(2));
  1003     b: boolean;
  1003     b: boolean;
  1004     prevX: LongInt;
  1004     prevX: LongInt;
  1005 begin
  1005 begin
  1006     AllInactive := false;
  1006     AllInactive := false;
  1007     dec(Gear^.Timer);
  1007     dec(Gear^.Timer);
  1008     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  1008     HHGear := Gear^.Hedgehog^.Gear;
  1009 
  1009 
  1010     HedgehogChAngle(HHGear);
  1010     HedgehogChAngle(HHGear);
  1011 
  1011 
  1012     b := false;
  1012     b := false;
  1013 
  1013 
  1085 var 
  1085 var 
  1086     HHGear: PGear;
  1086     HHGear: PGear;
  1087 begin
  1087 begin
  1088     BTPrevAngle := High(LongInt);
  1088     BTPrevAngle := High(LongInt);
  1089     BTSteps := 0;
  1089     BTSteps := 0;
  1090     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  1090     HHGear := Gear^.Hedgehog^.Gear;
  1091     HHGear^.Message := 0;
  1091     HHGear^.Message := 0;
  1092     HHGear^.State := HHGear^.State or gstNotKickable;
  1092     HHGear^.State := HHGear^.State or gstNotKickable;
  1093     Gear^.doStep := @doStepBlowTorchWork
  1093     Gear^.doStep := @doStepBlowTorchWork
  1094 end;
  1094 end;
  1095 
  1095 
  1100 
  1100 
  1101 procedure doStepRopeAfterAttack(Gear: PGear);
  1101 procedure doStepRopeAfterAttack(Gear: PGear);
  1102 var 
  1102 var 
  1103     HHGear: PGear;
  1103     HHGear: PGear;
  1104 begin
  1104 begin
  1105     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  1105     HHGear := Gear^.Hedgehog^.Gear;
  1106     if ((HHGear^.State and gstHHDriven) = 0)
  1106     if ((HHGear^.State and gstHHDriven) = 0)
  1107        or (CheckGearDrowning(HHGear))
  1107        or (CheckGearDrowning(HHGear))
  1108        or TestCollisionYwithGear(HHGear, 1) then
  1108        or TestCollisionYwithGear(HHGear, 1) then
  1109     begin
  1109     begin
  1110         DeleteGear(Gear);
  1110         DeleteGear(Gear);
  1126     if (Gear^.Message and gmAttack) <> 0 then
  1126     if (Gear^.Message and gmAttack) <> 0 then
  1127     begin
  1127     begin
  1128         Gear^.X := HHGear^.X;
  1128         Gear^.X := HHGear^.X;
  1129         Gear^.Y := HHGear^.Y;
  1129         Gear^.Y := HHGear^.Y;
  1130 
  1130 
  1131         ApplyAngleBounds(PHedgehog(Gear^.Hedgehog)^, amRope);
  1131         ApplyAngleBounds(Gear^.Hedgehog^, amRope);
  1132 
  1132 
  1133         Gear^.dX := SignAs(AngleSin(HHGear^.Angle), HHGear^.dX);
  1133         Gear^.dX := SignAs(AngleSin(HHGear^.Angle), HHGear^.dX);
  1134         Gear^.dY := -AngleCos(HHGear^.Angle);
  1134         Gear^.dY := -AngleCos(HHGear^.Angle);
  1135         Gear^.Friction := _450;
  1135         Gear^.Friction := _450;
  1136         Gear^.Elasticity := _0;
  1136         Gear^.Elasticity := _0;
  1168     Gear^.Elasticity := _0;
  1168     Gear^.Elasticity := _0;
  1169     Gear^.doStep := @doStepRopeAfterAttack
  1169     Gear^.doStep := @doStepRopeAfterAttack
  1170 end;
  1170 end;
  1171 
  1171 
  1172 begin
  1172 begin
  1173     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  1173     HHGear := Gear^.Hedgehog^.Gear;
  1174 
  1174 
  1175     if ((HHGear^.State and gstHHDriven) = 0)
  1175     if ((HHGear^.State and gstHHDriven) = 0)
  1176        or (CheckGearDrowning(HHGear)) then
  1176        or (CheckGearDrowning(HHGear)) then
  1177         begin
  1177         begin
  1178         PlaySound(sndRopeRelease);
  1178         PlaySound(sndRopeRelease);
  1331         end;
  1331         end;
  1332 
  1332 
  1333 
  1333 
  1334     if (Gear^.Message and gmAttack) <> 0 then
  1334     if (Gear^.Message and gmAttack) <> 0 then
  1335         if (Gear^.State and gsttmpFlag) <> 0 then
  1335         if (Gear^.State and gsttmpFlag) <> 0 then
  1336             with PHedgehog(Gear^.Hedgehog)^ do
  1336             with Gear^.Hedgehog^ do
  1337                 begin
  1337                 begin
  1338                 PlaySound(sndRopeRelease);
  1338                 PlaySound(sndRopeRelease);
  1339                 if CurAmmoType <> amParachute then
  1339                 if CurAmmoType <> amParachute then
  1340                     WaitCollision
  1340                     WaitCollision
  1341                 else
  1341                 else
  1365 begin
  1365 begin
  1366     Gear^.X := Gear^.X - Gear^.dX;
  1366     Gear^.X := Gear^.X - Gear^.dX;
  1367     Gear^.Y := Gear^.Y - Gear^.dY;
  1367     Gear^.Y := Gear^.Y - Gear^.dY;
  1368     Gear^.Elasticity := Gear^.Elasticity + _1;
  1368     Gear^.Elasticity := Gear^.Elasticity + _1;
  1369 
  1369 
  1370     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  1370     HHGear := Gear^.Hedgehog^.Gear;
  1371     DeleteCI(HHGear);
  1371     DeleteCI(HHGear);
  1372 
  1372 
  1373     if (HHGear^.State and gstMoving) <> 0 then
  1373     if (HHGear^.State and gstMoving) <> 0 then
  1374         begin
  1374         begin
  1375         if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then SetLittle(HHGear^.dX);
  1375         if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then SetLittle(HHGear^.dX);
  1445     if (Gear^.Elasticity > Gear^.Friction)
  1445     if (Gear^.Elasticity > Gear^.Friction)
  1446        or ((Gear^.Message and gmAttack) = 0)
  1446        or ((Gear^.Message and gmAttack) = 0)
  1447        or ((HHGear^.State and gstHHDriven) = 0)
  1447        or ((HHGear^.State and gstHHDriven) = 0)
  1448        or (HHGear^.Damage > 0) then
  1448        or (HHGear^.Damage > 0) then
  1449         begin
  1449         begin
  1450         with PHedgehog(Gear^.Hedgehog)^.Gear^ do
  1450         with Gear^.Hedgehog^.Gear^ do
  1451             begin
  1451             begin
  1452             State := State and not gstAttacking;
  1452             State := State and not gstAttacking;
  1453             Message := Message and not gmAttack
  1453             Message := Message and not gmAttack
  1454             end;
  1454             end;
  1455         DeleteGear(Gear)
  1455         DeleteGear(Gear)
  1806 
  1806 
  1807 procedure doStepShover(Gear: PGear);
  1807 procedure doStepShover(Gear: PGear);
  1808 var 
  1808 var 
  1809     HHGear: PGear;
  1809     HHGear: PGear;
  1810 begin
  1810 begin
  1811     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  1811     HHGear := Gear^.Hedgehog^.Gear;
  1812     HHGear^.State := HHGear^.State or gstNoDamage;
  1812     HHGear^.State := HHGear^.State or gstNoDamage;
  1813     DeleteCI(HHGear);
  1813     DeleteCI(HHGear);
  1814 
  1814 
  1815     AmmoShove(Gear, 30, 115);
  1815     AmmoShove(Gear, 30, 115);
  1816 
  1816 
  1823 procedure doStepWhip(Gear: PGear);
  1823 procedure doStepWhip(Gear: PGear);
  1824 var 
  1824 var 
  1825     HHGear: PGear;
  1825     HHGear: PGear;
  1826     i: LongInt;
  1826     i: LongInt;
  1827 begin
  1827 begin
  1828     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  1828     HHGear := Gear^.Hedgehog^.Gear;
  1829     HHGear^.State := HHGear^.State or gstNoDamage;
  1829     HHGear^.State := HHGear^.State or gstNoDamage;
  1830     DeleteCI(HHGear);
  1830     DeleteCI(HHGear);
  1831 
  1831 
  1832     for i:= 0 to 3 do
  1832     for i:= 0 to 3 do
  1833     begin
  1833     begin
  1976         DeleteGear(Gear);
  1976         DeleteGear(Gear);
  1977         AfterAttack;
  1977         AfterAttack;
  1978         exit
  1978         exit
  1979     end;
  1979     end;
  1980 
  1980 
  1981     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  1981     HHGear := Gear^.Hedgehog^.Gear;
  1982     if hwRound(HHGear^.Y) <= Gear^.Tag - 2 then
  1982     if hwRound(HHGear^.Y) <= Gear^.Tag - 2 then
  1983     begin
  1983     begin
  1984         Gear^.Tag := hwRound(HHGear^.Y);
  1984         Gear^.Tag := hwRound(HHGear^.Y);
  1985         DrawTunnel(HHGear^.X - int2hwFloat(cHHRadius), HHGear^.Y - _1, _0_5, _0, cHHRadius * 4, 2);
  1985         DrawTunnel(HHGear^.X - int2hwFloat(cHHRadius), HHGear^.Y - _1, _0_5, _0, cHHRadius * 4, 2);
  1986         HHGear^.State := HHGear^.State or gstNoDamage;
  1986         HHGear^.State := HHGear^.State or gstNoDamage;
  2006 procedure doStepFirePunch(Gear: PGear);
  2006 procedure doStepFirePunch(Gear: PGear);
  2007 var 
  2007 var 
  2008     HHGear: PGear;
  2008     HHGear: PGear;
  2009 begin
  2009 begin
  2010     AllInactive := false;
  2010     AllInactive := false;
  2011     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  2011     HHGear := Gear^.Hedgehog^.Gear;
  2012     DeleteCI(HHGear);
  2012     DeleteCI(HHGear);
  2013     HHGear^.X := int2hwFloat(hwRound(HHGear^.X)) - _0_5;
  2013     HHGear^.X := int2hwFloat(hwRound(HHGear^.X)) - _0_5;
  2014     HHGear^.dX := SignAs(cLittle, Gear^.dX);
  2014     HHGear^.dX := SignAs(cLittle, Gear^.dX);
  2015 
  2015 
  2016     HHGear^.dY := - _0_3;
  2016     HHGear^.dY := - _0_3;
  2029 
  2029 
  2030 procedure doStepParachuteWork(Gear: PGear);
  2030 procedure doStepParachuteWork(Gear: PGear);
  2031 var 
  2031 var 
  2032     HHGear: PGear;
  2032     HHGear: PGear;
  2033 begin
  2033 begin
  2034     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  2034     HHGear := Gear^.Hedgehog^.Gear;
  2035 
  2035 
  2036     inc(Gear^.Timer);
  2036     inc(Gear^.Timer);
  2037 
  2037 
  2038     if TestCollisionYwithGear(HHGear, 1)
  2038     if TestCollisionYwithGear(HHGear, 1)
  2039        or ((HHGear^.State and gstHHDriven) = 0)
  2039        or ((HHGear^.State and gstHHDriven) = 0)
  2068 
  2068 
  2069 procedure doStepParachute(Gear: PGear);
  2069 procedure doStepParachute(Gear: PGear);
  2070 var 
  2070 var 
  2071     HHGear: PGear;
  2071     HHGear: PGear;
  2072 begin
  2072 begin
  2073     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  2073     HHGear := Gear^.Hedgehog^.Gear;
  2074 
  2074 
  2075     DeleteCI(HHGear);
  2075     DeleteCI(HHGear);
  2076 
  2076 
  2077     AfterAttack;
  2077     AfterAttack;
  2078 
  2078 
  2165     HHGear: PGear;
  2165     HHGear: PGear;
  2166     x, y, tx, ty: hwFloat;
  2166     x, y, tx, ty: hwFloat;
  2167 begin
  2167 begin
  2168     AllInactive := false;
  2168     AllInactive := false;
  2169 
  2169 
  2170     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  2170     HHGear := Gear^.Hedgehog^.Gear;
  2171     tx := int2hwFloat(TargetPoint.X);
  2171     tx := int2hwFloat(TargetPoint.X);
  2172     ty := int2hwFloat(TargetPoint.Y);
  2172     ty := int2hwFloat(TargetPoint.Y);
  2173     x := HHGear^.X;
  2173     x := HHGear^.X;
  2174     y := HHGear^.Y;
  2174     y := HHGear^.Y;
  2175 
  2175 
  2200 ////////////////////////////////////////////////////////////////////////////////
  2200 ////////////////////////////////////////////////////////////////////////////////
  2201 procedure doStepTeleportAfter(Gear: PGear);
  2201 procedure doStepTeleportAfter(Gear: PGear);
  2202 var 
  2202 var 
  2203     HHGear: PGear;
  2203     HHGear: PGear;
  2204 begin
  2204 begin
  2205     PHedgehog(Gear^.Hedgehog)^.Unplaced := false;
  2205     Gear^.Hedgehog^.Unplaced := false;
  2206     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  2206     HHGear := Gear^.Hedgehog^.Gear;
  2207     HHGear^.Y := HHGear^.Y + HHGear^.dY;
  2207     HHGear^.Y := HHGear^.Y + HHGear^.dY;
  2208     // hedgehog falling to collect cases
  2208     // hedgehog falling to collect cases
  2209     HHGear^.dY := HHGear^.dY + cGravity;
  2209     HHGear^.dY := HHGear^.dY + cGravity;
  2210     if TestCollisionYwithGear(HHGear, 1)
  2210     if TestCollisionYwithGear(HHGear, 1)
  2211        or CheckGearDrowning(HHGear) then
  2211        or CheckGearDrowning(HHGear) then
  2231 var 
  2231 var 
  2232     HHGear: PGear;
  2232     HHGear: PGear;
  2233 begin
  2233 begin
  2234     AllInactive := false;
  2234     AllInactive := false;
  2235 
  2235 
  2236     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  2236     HHGear := Gear^.Hedgehog^.Gear;
  2237     if not TryPlaceOnLand(TargetPoint.X - SpritesData[sprHHTelepMask].Width div 2,
  2237     if not TryPlaceOnLand(TargetPoint.X - SpritesData[sprHHTelepMask].Width div 2,
  2238        TargetPoint.Y - SpritesData[sprHHTelepMask].Height div 2,
  2238        TargetPoint.Y - SpritesData[sprHHTelepMask].Height div 2,
  2239        sprHHTelepMask, 0, false) then
  2239        sprHHTelepMask, 0, false) then
  2240     begin
  2240     begin
  2241         HHGear^.Message := HHGear^.Message and not gmAttack;
  2241         HHGear^.Message := HHGear^.Message and not gmAttack;
  2273 begin
  2273 begin
  2274     AllInactive := false;
  2274     AllInactive := false;
  2275 
  2275 
  2276     if ((Gear^.Message and not gmSwitch) <> 0) or (TurnTimeLeft = 0) then
  2276     if ((Gear^.Message and not gmSwitch) <> 0) or (TurnTimeLeft = 0) then
  2277     begin
  2277     begin
  2278         HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  2278         HHGear := Gear^.Hedgehog^.Gear;
  2279         Msg := Gear^.Message and not gmSwitch;
  2279         Msg := Gear^.Message and not gmSwitch;
  2280         DeleteGear(Gear);
  2280         DeleteGear(Gear);
  2281         OnUsedAmmo(PHedgehog(HHGear^.Hedgehog)^);
  2281         OnUsedAmmo(PHedgehog(HHGear^.Hedgehog)^);
  2282         ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^);
  2282         ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^);
  2283 
  2283 
  2324 var 
  2324 var 
  2325     HHGear: PGear;
  2325     HHGear: PGear;
  2326 begin
  2326 begin
  2327     Gear^.doStep := @doStepSwitcherWork;
  2327     Gear^.doStep := @doStepSwitcherWork;
  2328 
  2328 
  2329     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  2329     HHGear := Gear^.Hedgehog^.Gear;
  2330     with HHGear^ do
  2330     with HHGear^ do
  2331     begin
  2331     begin
  2332         State := State and not gstAttacking;
  2332         State := State and not gstAttacking;
  2333         Message := Message and not gmAttack
  2333         Message := Message and not gmAttack
  2334     end
  2334     end
  2375     i: LongWord;
  2375     i: LongWord;
  2376     HHGear: PGear;
  2376     HHGear: PGear;
  2377 begin
  2377 begin
  2378     AllInactive := false;
  2378     AllInactive := false;
  2379 
  2379 
  2380     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  2380     HHGear := Gear^.Hedgehog^.Gear;
  2381     HHGear^.State := HHGear^.State or gstNoDamage;
  2381     HHGear^.State := HHGear^.State or gstNoDamage;
  2382     DeleteCI(HHGear);
  2382     DeleteCI(HHGear);
  2383 
  2383 
  2384     Gear^.X := HHGear^.X;
  2384     Gear^.X := HHGear^.X;
  2385     Gear^.Y := HHGear^.Y;
  2385     Gear^.Y := HHGear^.Y;
  2435     AllInactive := false;
  2435     AllInactive := false;
  2436     dec(Gear^.Timer);
  2436     dec(Gear^.Timer);
  2437     if Gear^.Timer = 0 then
  2437     if Gear^.Timer = 0 then
  2438     begin
  2438     begin
  2439         Gear^.Pos := 1;
  2439         Gear^.Pos := 1;
  2440         PlaySound(sndKamikaze, PHedgehog(Gear^.Hedgehog)^.Team^.voicepack);
  2440         PlaySound(sndKamikaze, Gear^.Hedgehog^.Team^.voicepack);
  2441         Gear^.doStep := @doStepKamikazeWork
  2441         Gear^.doStep := @doStepKamikazeWork
  2442     end
  2442     end
  2443 end;
  2443 end;
  2444 
  2444 
  2445 procedure doStepKamikaze(Gear: PGear);
  2445 procedure doStepKamikaze(Gear: PGear);
  2446 var 
  2446 var 
  2447     HHGear: PGear;
  2447     HHGear: PGear;
  2448 begin
  2448 begin
  2449     AllInactive := false;
  2449     AllInactive := false;
  2450 
  2450 
  2451     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  2451     HHGear := Gear^.Hedgehog^.Gear;
  2452 
  2452 
  2453     HHGear^.dX := Gear^.dX;
  2453     HHGear^.dX := Gear^.dX;
  2454     HHGear^.dY := Gear^.dY;
  2454     HHGear^.dY := Gear^.dY;
  2455 
  2455 
  2456     Gear^.dX := SignAs(_0_45, Gear^.dX);
  2456     Gear^.dX := SignAs(_0_45, Gear^.dX);
  2635 var 
  2635 var 
  2636     HHGear: PGear;
  2636     HHGear: PGear;
  2637 begin
  2637 begin
  2638     AllInactive := false;
  2638     AllInactive := false;
  2639 
  2639 
  2640     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  2640     HHGear := Gear^.Hedgehog^.Gear;
  2641     HHGear^.Message := HHGear^.Message and (not gmAttack);
  2641     HHGear^.Message := HHGear^.Message and (not gmAttack);
  2642     DeleteCI(HHGear);
  2642     DeleteCI(HHGear);
  2643     Gear^.IntersectGear:= nil;
  2643     Gear^.IntersectGear:= nil;
  2644 
  2644 
  2645     FollowGear := Gear;
  2645     FollowGear := Gear;
  2685     if Gear^.Timer > 250 then
  2685     if Gear^.Timer > 250 then
  2686     begin
  2686     begin
  2687         Gear^.Timer := 0;
  2687         Gear^.Timer := 0;
  2688         inc(Gear^.Pos);
  2688         inc(Gear^.Pos);
  2689         if Gear^.Pos = 5 then
  2689         if Gear^.Pos = 5 then
  2690             PlaySound(sndYoohoo, PHedgehog(Gear^.Hedgehog)^.Team^.voicepack)
  2690             PlaySound(sndYoohoo, Gear^.Hedgehog^.Team^.voicepack)
  2691     end;
  2691     end;
  2692 
  2692 
  2693     if Gear^.Pos = 14 then
  2693     if Gear^.Pos = 14 then
  2694         Gear^.doStep := @doStepSeductionWork
  2694         Gear^.doStep := @doStepSeductionWork
  2695 end;
  2695 end;
  2696 
  2696 
  2697 procedure doStepSeduction(Gear: PGear);
  2697 procedure doStepSeduction(Gear: PGear);
  2698 begin
  2698 begin
  2699     AllInactive := false;
  2699     AllInactive := false;
  2700     DeleteCI(PHedgehog(Gear^.Hedgehog)^.Gear);
  2700     DeleteCI(Gear^.Hedgehog^.Gear);
  2701     Gear^.doStep := @doStepSeductionWear
  2701     Gear^.doStep := @doStepSeductionWear
  2702 end;
  2702 end;
  2703 
  2703 
  2704 ////////////////////////////////////////////////////////////////////////////////
  2704 ////////////////////////////////////////////////////////////////////////////////
  2705 procedure doStepWaterUp(Gear: PGear);
  2705 procedure doStepWaterUp(Gear: PGear);
  2834     rx, ry: hwFloat;
  2834     rx, ry: hwFloat;
  2835     gX, gY: LongInt;
  2835     gX, gY: LongInt;
  2836 begin
  2836 begin
  2837     AllInactive := false;
  2837     AllInactive := false;
  2838     dec(Gear^.Timer);
  2838     dec(Gear^.Timer);
  2839     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  2839     HHGear := Gear^.Hedgehog^.Gear;
  2840     HedgehogChAngle(HHGear);
  2840     HedgehogChAngle(HHGear);
  2841     gX := hwRound(Gear^.X) + GetLaunchX(amBallgun, hwSign(HHGear^.dX), HHGear^.Angle);
  2841     gX := hwRound(Gear^.X) + GetLaunchX(amBallgun, hwSign(HHGear^.dX), HHGear^.Angle);
  2842     gY := hwRound(Gear^.Y) + GetLaunchY(amBallgun, HHGear^.Angle);
  2842     gY := hwRound(Gear^.Y) + GetLaunchY(amBallgun, HHGear^.Angle);
  2843     if (Gear^.Timer mod 100) = 0 then
  2843     if (Gear^.Timer mod 100) = 0 then
  2844     begin
  2844     begin
  2862 
  2862 
  2863 procedure doStepBallgun(Gear: PGear);
  2863 procedure doStepBallgun(Gear: PGear);
  2864 var 
  2864 var 
  2865     HHGear: PGear;
  2865     HHGear: PGear;
  2866 begin
  2866 begin
  2867     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  2867     HHGear := Gear^.Hedgehog^.Gear;
  2868     HHGear^.Message := HHGear^.Message and not (gmUp or gmDown);
  2868     HHGear^.Message := HHGear^.Message and not (gmUp or gmDown);
  2869     HHGear^.State := HHGear^.State or gstNotKickable;
  2869     HHGear^.State := HHGear^.State or gstNotKickable;
  2870     Gear^.doStep := @doStepBallgunWork
  2870     Gear^.doStep := @doStepBallgunWork
  2871 end;
  2871 end;
  2872 
  2872 
  2887     if ((TrainingFlags and tfRCPlane) = 0) and (Gear^.Timer > 0) then dec(Gear^.Timer);
  2887     if ((TrainingFlags and tfRCPlane) = 0) and (Gear^.Timer > 0) then dec(Gear^.Timer);
  2888 
  2888 
  2889     if ((TrainingFlags and tfRCPlane) <> 0) and ((TrainingFlags and tfTimeTrial) <> 0 ) and (
  2889     if ((TrainingFlags and tfRCPlane) <> 0) and ((TrainingFlags and tfTimeTrial) <> 0 ) and (
  2890        TimeTrialStartTime = 0) then TimeTrialStartTime := RealTicks;
  2890        TimeTrialStartTime = 0) then TimeTrialStartTime := RealTicks;
  2891 
  2891 
  2892     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  2892     HHGear := Gear^.Hedgehog^.Gear;
  2893     FollowGear := Gear;
  2893     FollowGear := Gear;
  2894 
  2894 
  2895     fChanged := false;
  2895     fChanged := false;
  2896     if ((HHGear^.State and gstHHDriven) = 0) or (Gear^.Timer = 0) then
  2896     if ((HHGear^.State and gstHHDriven) = 0) or (Gear^.Timer = 0) then
  2897     begin
  2897     begin
  3023 
  3023 
  3024 procedure doStepRCPlane(Gear: PGear);
  3024 procedure doStepRCPlane(Gear: PGear);
  3025 var 
  3025 var 
  3026     HHGear: PGear;
  3026     HHGear: PGear;
  3027 begin
  3027 begin
  3028     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  3028     HHGear := Gear^.Hedgehog^.Gear;
  3029     HHGear^.Message := 0;
  3029     HHGear^.Message := 0;
  3030     HHGear^.State := HHGear^.State or gstNotKickable;
  3030     HHGear^.State := HHGear^.State or gstNotKickable;
  3031     Gear^.Angle := HHGear^.Angle;
  3031     Gear^.Angle := HHGear^.Angle;
  3032     Gear^.Tag := hwSign(HHGear^.dX);
  3032     Gear^.Tag := hwSign(HHGear^.dX);
  3033     if HHGear^.dX.isNegative then Gear^.Angle := 4096 - Gear^.Angle;
  3033     if HHGear^.dX.isNegative then Gear^.Angle := 4096 - Gear^.Angle;
  3043     bubble: PVisualGear;
  3043     bubble: PVisualGear;
  3044 begin
  3044 begin
  3045     isUnderwater:= cWaterLine < hwRound(Gear^.Y) + Gear^.Radius;
  3045     isUnderwater:= cWaterLine < hwRound(Gear^.Y) + Gear^.Radius;
  3046     if Gear^.Pos > 0 then dec(Gear^.Pos);
  3046     if Gear^.Pos > 0 then dec(Gear^.Pos);
  3047     AllInactive := false;
  3047     AllInactive := false;
  3048     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  3048     HHGear := Gear^.Hedgehog^.Gear;
  3049     //dec(Gear^.Timer);
  3049     //dec(Gear^.Timer);
  3050     move := _0_2;
  3050     move := _0_2;
  3051     fuel := 50;
  3051     fuel := 50;
  3052 (*if (HHGear^.Message and gmPrecise) <> 0 then
  3052 (*if (HHGear^.Message and gmPrecise) <> 0 then
  3053     begin
  3053     begin
  3167     HHGear: PGear;
  3167     HHGear: PGear;
  3168 begin
  3168 begin
  3169     Gear^.Pos:= 0;
  3169     Gear^.Pos:= 0;
  3170     Gear^.doStep := @doStepJetpackWork;
  3170     Gear^.doStep := @doStepJetpackWork;
  3171 
  3171 
  3172     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  3172     HHGear := Gear^.Hedgehog^.Gear;
  3173     FollowGear := HHGear;
  3173     FollowGear := HHGear;
  3174     AfterAttack;
  3174     AfterAttack;
  3175     with HHGear^ do
  3175     with HHGear^ do
  3176     begin
  3176     begin
  3177         State := State and not gstAttacking;
  3177         State := State and not gstAttacking;
  3425     doPortalColorSwitch();
  3425     doPortalColorSwitch();
  3426 
  3426 
  3427     // destroy portal if ground it was attached too is gone
  3427     // destroy portal if ground it was attached too is gone
  3428     if ((Land[hwRound(Gear^.Y), hwRound(Gear^.X)] and $FF00) = 0)
  3428     if ((Land[hwRound(Gear^.Y), hwRound(Gear^.X)] and $FF00) = 0)
  3429        or (Gear^.Timer < 1)
  3429        or (Gear^.Timer < 1)
  3430        or (PHedgehog(Gear^.Hedgehog) <> CurrentHedgehog)
  3430        or (Gear^.Hedgehog <> CurrentHedgehog)
  3431        or (hwRound(Gear^.Y) > cWaterLine) then
  3431        or (hwRound(Gear^.Y) > cWaterLine) then
  3432     begin
  3432     begin
  3433         deleteGear(Gear);
  3433         deleteGear(Gear);
  3434         EXIT;
  3434         EXIT;
  3435     end;
  3435     end;
  3752 procedure doStepMovingPortal(Gear: PGear);
  3752 procedure doStepMovingPortal(Gear: PGear);
  3753 begin
  3753 begin
  3754     doPortalColorSwitch();
  3754     doPortalColorSwitch();
  3755     doStepPerPixel(Gear, @doStepMovingPortal_real, true);
  3755     doStepPerPixel(Gear, @doStepMovingPortal_real, true);
  3756     if (Gear^.Timer < 1)
  3756     if (Gear^.Timer < 1)
  3757        or (PHedgehog(Gear^.Hedgehog) <> CurrentHedgehog) then
  3757        or (Gear^.Hedgehog <> CurrentHedgehog) then
  3758             deleteGear(Gear);
  3758             deleteGear(Gear);
  3759 end;
  3759 end;
  3760 
  3760 
  3761 procedure doStepPortalShot(newPortal: PGear);
  3761 procedure doStepPortalShot(newPortal: PGear);
  3762 var 
  3762 var 
  4045     rx, ry, speed: hwFloat;
  4045     rx, ry, speed: hwFloat;
  4046     i, gX, gY: LongInt;
  4046     i, gX, gY: LongInt;
  4047     Fire: PGear;
  4047     Fire: PGear;
  4048 begin
  4048 begin
  4049     AllInactive := false;
  4049     AllInactive := false;
  4050     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  4050     HHGear := Gear^.Hedgehog^.Gear;
  4051     HedgehogChAngle(HHGear);
  4051     HedgehogChAngle(HHGear);
  4052     gX := hwRound(Gear^.X) + GetLaunchX(amBallgun, hwSign(HHGear^.dX), HHGear^.Angle);
  4052     gX := hwRound(Gear^.X) + GetLaunchX(amBallgun, hwSign(HHGear^.dX), HHGear^.Angle);
  4053     gY := hwRound(Gear^.Y) + GetLaunchY(amBallgun, HHGear^.Angle);
  4053     gY := hwRound(Gear^.Y) + GetLaunchY(amBallgun, HHGear^.Angle);
  4054     
  4054     
  4055     if (GameTicks and $FF) = 0 then
  4055     if (GameTicks and $FF) = 0 then
  4109 
  4109 
  4110 procedure doStepFlamethrower(Gear: PGear);
  4110 procedure doStepFlamethrower(Gear: PGear);
  4111 var 
  4111 var 
  4112     HHGear: PGear;
  4112     HHGear: PGear;
  4113 begin
  4113 begin
  4114     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  4114     HHGear := Gear^.Hedgehog^.Gear;
  4115     HHGear^.Message := HHGear^.Message and not (gmUp or gmDown or gmLeft or gmRight);
  4115     HHGear^.Message := HHGear^.Message and not (gmUp or gmDown or gmLeft or gmRight);
  4116     HHGear^.State := HHGear^.State or gstNotKickable;
  4116     HHGear^.State := HHGear^.State or gstNotKickable;
  4117     Gear^.doStep := @doStepFlamethrowerWork
  4117     Gear^.doStep := @doStepFlamethrowerWork
  4118 end;
  4118 end;
  4119 
  4119 
  4138 procedure doStepHammer(Gear: PGear);
  4138 procedure doStepHammer(Gear: PGear);
  4139 var HHGear, tmp, tmp2: PGear;
  4139 var HHGear, tmp, tmp2: PGear;
  4140          t: PGearArray;
  4140          t: PGearArray;
  4141          i: LongInt;
  4141          i: LongInt;
  4142 begin
  4142 begin
  4143 HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear;
  4143 HHGear:= Gear^.Hedgehog^.Gear;
  4144 HHGear^.State:= HHGear^.State or gstNoDamage;
  4144 HHGear^.State:= HHGear^.State or gstNoDamage;
  4145 DeleteCI(HHGear);
  4145 DeleteCI(HHGear);
  4146 
  4146 
  4147 t:= CheckGearsCollision(Gear);
  4147 t:= CheckGearsCollision(Gear);
  4148 
  4148 
  4179 var 
  4179 var 
  4180     i, ei: LongInt;
  4180     i, ei: LongInt;
  4181     HHGear: PGear;
  4181     HHGear: PGear;
  4182 begin
  4182 begin
  4183     AllInactive := false;
  4183     AllInactive := false;
  4184     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  4184     HHGear := Gear^.Hedgehog^.Gear;
  4185     dec(Gear^.Timer);
  4185     dec(Gear^.Timer);
  4186     if (HHGear = nil) or (Gear^.Timer = 0) or ((Gear^.Message and gmDestroy) <> 0) then
  4186     if (HHGear = nil) or (Gear^.Timer = 0) or ((Gear^.Message and gmDestroy) <> 0) then
  4187     begin
  4187     begin
  4188         DeleteGear(Gear);
  4188         DeleteGear(Gear);
  4189         exit
  4189         exit
  4232     i, y: LongInt;
  4232     i, y: LongInt;
  4233     ar: TRangeArray;
  4233     ar: TRangeArray;
  4234     HHGear: PGear;
  4234     HHGear: PGear;
  4235 begin
  4235 begin
  4236     i := 0;
  4236     i := 0;
  4237     HHGear := PHedgehog(Gear^.Hedgehog)^.Gear;
  4237     HHGear := Gear^.Hedgehog^.Gear;
  4238 
  4238 
  4239     y := hwRound(Gear^.Y) - cHHRadius * 2;
  4239     y := hwRound(Gear^.Y) - cHHRadius * 2;
  4240     while y < hwRound(Gear^.Y) do
  4240     while y < hwRound(Gear^.Y) do
  4241     begin
  4241     begin
  4242         ar[i].Left := hwRound(Gear^.X) - Gear^.Radius - LongInt(GetRandom(2));
  4242         ar[i].Left := hwRound(Gear^.X) - Gear^.Radius - LongInt(GetRandom(2));
  4263 begin
  4263 begin
  4264     if (TurnTimeLeft > 0) then
  4264     if (TurnTimeLeft > 0) then
  4265         dec(TurnTimeLeft);
  4265         dec(TurnTimeLeft);
  4266 
  4266 
  4267     AllInactive := false;
  4267     AllInactive := false;
  4268     hh := PHedgehog(Gear^.Hedgehog);
  4268     hh := Gear^.Hedgehog;
  4269     DrawCentered(hwRound(hh^.Gear^.X) + WorldDx, hwRound(hh^.Gear^.Y) + WorldDy -
  4269     DrawCentered(hwRound(hh^.Gear^.X) + WorldDx, hwRound(hh^.Gear^.Y) + WorldDy -
  4270             cHHRadius - 14 - hh^.HealthTagTex^.h, hh^.HealthTagTex);
  4270             cHHRadius - 14 - hh^.HealthTagTex^.h, hh^.HealthTagTex);
  4271     (*DrawCircle(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Radius, 1.5, 0, 0, $FF,
  4271     (*DrawCircle(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Radius, 1.5, 0, 0, $FF,
  4272             $FF);*)
  4272             $FF);*)
  4273 
  4273