# HG changeset patch # User alfadur # Date 1527635573 14400 # Node ID 419c5eab88ebdaa990f12b33f55f739fc28ad725 # Parent 06792533ef91bd1006c406d681271eac5635c0a6 bullet bubbles diff -r 06792533ef91 -r 419c5eab88eb hedgewars/uGearsHandlersMess.pas --- a/hedgewars/uGearsHandlersMess.pas Mon May 28 19:50:15 2018 -0400 +++ b/hedgewars/uGearsHandlersMess.pas Tue May 29 19:12:53 2018 -0400 @@ -1392,6 +1392,31 @@ end; end; +procedure CreateBubblesForBullet(Gear: PGear); +var i, iInit: LongWord; +begin +if ((Gear^.State and gstDrowning) <> 0) and (Gear^.Health > 0) then + begin + // draw bubbles + if (not SuddenDeathDmg and (WaterOpacity < $FF)) or (SuddenDeathDmg and (SDWaterOpacity < $FF)) then + begin + case Gear^.Kind of + gtMinigunBullet: iInit:= Gear^.Health * 100; + gtDEagleShot, gtSniperRifleShot: iInit:= Gear^.Health * 4 + end; + for i:=iInit downto 0 do + begin + if Random(6) = 0 then + AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtBubble); + Gear^.X := Gear^.X + Gear^.dX; + Gear^.Y := Gear^.Y + Gear^.dY; + end; + end; + // bullet dies underwater + Gear^.Health:= 0; + end; +end; + procedure doStepBulletWork(Gear: PGear); var i, x, y, iInit: LongWord; @@ -1476,60 +1501,61 @@ LineShoveHelp(Gear, oX, oY, Gear^.X, Gear^.Y, Gear^.dX, Gear^.dY, iInit + 2 - i); - if ((Gear^.State and gstDrowning) <> 0) and (Gear^.Health > 0) then - begin - // draw bubbles - if (not SuddenDeathDmg and (WaterOpacity < $FF)) or (SuddenDeathDmg and (SDWaterOpacity < $FF)) then - begin - case Gear^.Kind of - gtMinigunBullet: iInit:= Gear^.Health * 100; - gtDEagleShot, gtSniperRifleShot: iInit:= Gear^.Health * 4 - end; - for i:=iInit downto 0 do + CreateBubblesForBullet(Gear); + + x := hwRound(Gear^.X); + y := hwRound(Gear^.Y); + if (isDead) or (x and LAND_WIDTH_MASK <> 0) or (y and LAND_HEIGHT_MASK <> 0) then + begin + if (Gear^.Kind = gtSniperRifleShot) then + cLaserSightingSniper := false; + if (Ammoz[Gear^.AmmoType].Ammo.NumPerTurn <= CurrentHedgehog^.MultiShootAttacks) and (CurrentHedgehog^.Effects[heArtillery] = 2) then + CurrentHedgehog^.Effects[heArtillery]:= 0; + + // Bullet Hit + if ((Gear^.State and gstDrowning) = 0) and (x and LAND_WIDTH_MASK = 0) and (y and LAND_HEIGHT_MASK = 0) then + begin + if Gear^.Kind = gtMinigunBullet then begin - if Random(6) = 0 then - AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtBubble); - Gear^.X := Gear^.X + Gear^.dX; - Gear^.Y := Gear^.Y + Gear^.dY; + doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 5, + Gear^.Hedgehog, EXPLNoDamage{ or EXPLDontDraw or EXPLNoGfx}); + VGear := AddVisualGear(hwRound(Gear^.X + Gear^.dX * 5), hwRound(Gear^.Y + Gear^.dY * 5), vgtBulletHit); + end + else + VGear := AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtBulletHit); + + if VGear <> nil then + begin + VGear^.Angle := DxDy2Angle(-Gear^.dX, Gear^.dY); end; end; - // bullet dies underwater - Gear^.Health:= 0; - end; - - if (isDead) - or (hwRound(Gear^.X) and LAND_WIDTH_MASK <> 0) - or (hwRound(Gear^.Y) and LAND_HEIGHT_MASK <> 0) then - begin - if (Gear^.Kind = gtSniperRifleShot) then - cLaserSightingSniper := false; - if (Ammoz[Gear^.AmmoType].Ammo.NumPerTurn <= CurrentHedgehog^.MultiShootAttacks) and (CurrentHedgehog^.Effects[heArtillery] = 2) then - CurrentHedgehog^.Effects[heArtillery]:= 0; - - // Bullet Hit - if ((Gear^.State and gstDrowning) = 0) and (hwRound(Gear^.X) and LAND_WIDTH_MASK = 0) and (hwRound(Gear^.Y) and LAND_HEIGHT_MASK = 0) then + + spawnBulletTrail(Gear, Gear^.X, Gear^.Y, Gear^.FlightTime = 0); + Gear^.FlightTime:= 1; + if Gear^.Kind = gtMinigunBullet then + ClearHitOrderLeq(Gear^.Tag); + + if (worldEdge = weSea) and (Gear^.Kind = gtMinigunBullet) + and Gear^.Y.isNegative and Gear^.dY.isNegative + and (Gear^.Health > 0) and (not isZero(Gear^.dX)) then + begin + if Gear^.dX.isNegative then begin - if Gear^.Kind = gtMinigunBullet then - begin - doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 5, - Gear^.Hedgehog, EXPLNoDamage{ or EXPLDontDraw or EXPLNoGfx}); - VGear := AddVisualGear(hwRound(Gear^.X + Gear^.dX * 5), hwRound(Gear^.Y + Gear^.dY * 5), vgtBulletHit); - end - else - VGear := AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtBulletHit); - - if VGear <> nil then - begin - VGear^.Angle := DxDy2Angle(-Gear^.dX, Gear^.dY); - end; + + Gear^.X:= int2hwFloat(-1); + iInit:= x - leftX; + end + else + begin + Gear^.X:= int2hwFloat(LAND_WIDTH); + iInit:= rightX - x - 1; end; - - spawnBulletTrail(Gear, Gear^.X, Gear^.Y, Gear^.FlightTime = 0); - Gear^.FlightTime:= 1; - if Gear^.Kind = gtMinigunBullet then - ClearHitOrderLeq(Gear^.Tag); - Gear^.doStep := @doStepShotIdle - end; + Gear^.Y:= Gear^.Y + Gear^.dY * hwAbs(int2hwFloat(iInit) / Gear^.dX); + CheckGearDrowning(Gear); + CreateBubblesForBullet(Gear); + end; + Gear^.doStep := @doStepShotIdle + end; end; procedure doStepDEagleShot(Gear: PGear);