hedgewars/uGearsHandlersMess.pas
changeset 13147 7040506c831f
parent 13140 e330feceb662
child 13151 deab88f1f6f7
equal deleted inserted replaced
13146:9655072d0286 13147:7040506c831f
  1136         DeleteGear(Gear);
  1136         DeleteGear(Gear);
  1137         AfterAttack
  1137         AfterAttack
  1138         end
  1138         end
  1139 end;
  1139 end;
  1140 
  1140 
       
  1141 procedure CreateShellForGear(Gear: PGear; startFrame: Longword);
       
  1142 var
       
  1143     shell: PVisualGear;
       
  1144 begin
       
  1145     shell := AddVisualGear(hwRound(Gear^.x), hwRound(Gear^.y), vgtShell);
       
  1146     if shell <> nil then
       
  1147     begin
       
  1148         shell^.dX := gear^.dX.QWordValue / -17179869184;
       
  1149         if (gear^.dX.isNegative) then
       
  1150             shell^.dX := -shell^.dX;
       
  1151         shell^.dY := gear^.dY.QWordValue / -17179869184;
       
  1152         shell^.Frame := startFrame;
       
  1153     end;
       
  1154 end;
       
  1155 
  1141 procedure doStepShotgunShot(Gear: PGear);
  1156 procedure doStepShotgunShot(Gear: PGear);
  1142 var
  1157 var
  1143     i: LongWord;
  1158     i: LongWord;
  1144     shell: PVisualGear;
       
  1145 begin
  1159 begin
  1146     AllInactive := false;
  1160     AllInactive := false;
  1147 
  1161 
  1148     if ((Gear^.State and gstAnimation) = 0) then
  1162     if ((Gear^.State and gstAnimation) = 0) then
  1149         begin
  1163         begin
  1150         dec(Gear^.Timer);
  1164         dec(Gear^.Timer);
  1151         if Gear^.Timer = 0 then
  1165         if Gear^.Timer = 0 then
  1152             begin
  1166             begin
  1153             PlaySound(sndShotgunFire);
  1167             PlaySound(sndShotgunFire);
  1154             shell := AddVisualGear(hwRound(Gear^.x), hwRound(Gear^.y), vgtShell);
  1168             CreateShellForGear(Gear, 0);
  1155             if shell <> nil then
       
  1156                 begin
       
  1157                 shell^.dX := gear^.dX.QWordValue / -17179869184;
       
  1158                 shell^.dY := gear^.dY.QWordValue / -17179869184;
       
  1159                 shell^.Frame := 0
       
  1160                 end;
       
  1161             Gear^.State := Gear^.State or gstAnimation
  1169             Gear^.State := Gear^.State or gstAnimation
  1162             end;
  1170             end;
  1163             exit
  1171             exit
  1164         end else
  1172         end else
  1165         if(Gear^.Hedgehog^.Gear = nil) or ((Gear^.Hedgehog^.Gear^.State and gstMoving) <> 0) then
  1173         if(Gear^.Hedgehog^.Gear = nil) or ((Gear^.Hedgehog^.Gear^.State and gstMoving) <> 0) then
  1406     Gear^.doStep := @doStepBulletWork
  1414     Gear^.doStep := @doStepBulletWork
  1407 end;
  1415 end;
  1408 
  1416 
  1409 procedure doStepSniperRifleShot(Gear: PGear);
  1417 procedure doStepSniperRifleShot(Gear: PGear);
  1410 var HHGear: PGear;
  1418 var HHGear: PGear;
  1411     shell: PVisualGear;
       
  1412 begin
  1419 begin
  1413 
  1420 
  1414     HHGear := Gear^.Hedgehog^.Gear;
  1421     HHGear := Gear^.Hedgehog^.Gear;
  1415     if (Gear^.Hedgehog^.Effects[heArtillery] <> 1) then
  1422     if (Gear^.Hedgehog^.Effects[heArtillery] <> 1) then
  1416         Gear^.Hedgehog^.Effects[heArtillery]:= 2;
  1423         Gear^.Hedgehog^.Effects[heArtillery]:= 2;
  1435             dec(HHGear^.Angle,32)
  1442             dec(HHGear^.Angle,32)
  1436         end;
  1443         end;
  1437 
  1444 
  1438     if (HHGear^.Message and gmAttack) <> 0 then
  1445     if (HHGear^.Message and gmAttack) <> 0 then
  1439         begin
  1446         begin
  1440         shell := AddVisualGear(hwRound(Gear^.x), hwRound(Gear^.y), vgtShell);
  1447         CreateShellForGear(Gear, 1);
  1441         if shell <> nil then
       
  1442             begin
       
  1443             shell^.dX := gear^.dX.QWordValue / -8589934592;
       
  1444             shell^.dY := gear^.dY.QWordValue / -8589934592;
       
  1445             shell^.Frame := 1
       
  1446             end;
       
  1447         Gear^.State := Gear^.State or gstAnimation;
  1448         Gear^.State := Gear^.State or gstAnimation;
  1448         Gear^.dX := SignAs(AngleSin(HHGear^.Angle), HHGear^.dX) * _0_5;
  1449         Gear^.dX := SignAs(AngleSin(HHGear^.Angle), HHGear^.dX) * _0_5;
  1449         Gear^.dY := -AngleCos(HHGear^.Angle) * _0_5;
  1450         Gear^.dY := -AngleCos(HHGear^.Angle) * _0_5;
  1450         PlaySound(sndGun);
  1451         PlaySound(sndGun);
  1451         // add 2 initial steps to avoid problem with ammoshove related to calculation of radius + 1 radius as gear widths, and also just weird angles
  1452         // add 2 initial steps to avoid problem with ammoshove related to calculation of radius + 1 radius as gear widths, and also just weird angles
  6624 end;
  6625 end;
  6625 
  6626 
  6626 ////////////////////////////////////////////////////////////////////////////////
  6627 ////////////////////////////////////////////////////////////////////////////////
  6627 procedure doStepMinigunWork(Gear: PGear);
  6628 procedure doStepMinigunWork(Gear: PGear);
  6628 var HHGear: PGear;
  6629 var HHGear: PGear;
  6629     shell: PVisualGear;
       
  6630     bullet: PGear;
  6630     bullet: PGear;
  6631     rx, ry: hwFloat;
  6631     rx, ry: hwFloat;
  6632     gX, gY: LongInt;
  6632     gX, gY: LongInt;
  6633 begin
  6633 begin
  6634     AllInactive:= false;
  6634     AllInactive:= false;
  6655         bullet:= AddGear(gx, gy, gtMinigunBullet, 0, SignAs(AngleSin(HHGear^.Angle) * _0_8, HHGear^.dX) + rx, AngleCos(HHGear^.Angle) * ( - _0_8) + ry, 0);
  6655         bullet:= AddGear(gx, gy, gtMinigunBullet, 0, SignAs(AngleSin(HHGear^.Angle) * _0_8, HHGear^.dX) + rx, AngleCos(HHGear^.Angle) * ( - _0_8) + ry, 0);
  6656         bullet^.CollisionMask:= lfNotCurrentMask;
  6656         bullet^.CollisionMask:= lfNotCurrentMask;
  6657         bullet^.WDTimer := Gear^.WDTimer;
  6657         bullet^.WDTimer := Gear^.WDTimer;
  6658         Inc(Gear^.WDTimer);
  6658         Inc(Gear^.WDTimer);
  6659 
  6659 
  6660         shell := AddVisualGear(hwRound(Gear^.x), hwRound(Gear^.y), vgtShell);
  6660         CreateShellForGear(Gear, Gear^.Tag and 1);
  6661         if shell <> nil then
       
  6662         begin
       
  6663             shell^.dX := gear^.dX.QWordValue / -17179869184;
       
  6664             shell^.dY := gear^.dY.QWordValue / -17179869184;
       
  6665             shell^.Frame := 0
       
  6666         end;
       
  6667     end;
  6661     end;
  6668 
  6662 
  6669     if (Gear^.Timer = 0) or ((HHGear^.State and gstHHDriven) = 0) then
  6663     if (Gear^.Timer = 0) or ((HHGear^.State and gstHHDriven) = 0) then
  6670     begin
  6664     begin
  6671         HHGear^.State := HHGear^.State and (not gstNotKickable);
  6665         HHGear^.State := HHGear^.State and (not gstNotKickable);