# HG changeset patch # User koda # Date 1285556306 -7200 # Node ID f9cb69eecefea907833dd1bdb0a56bd9c97a5aee # Parent e11df2de6af2b0574210ba45d08916f9e4fd88d3# Parent 4ba25a3d15aff6c03d57ee846cd88b7326166841 merge diff -r e11df2de6af2 -r f9cb69eecefe hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Mon Sep 27 04:58:15 2010 +0200 +++ b/hedgewars/GSHandlers.inc Mon Sep 27 04:58:26 2010 +0200 @@ -2959,9 +2959,12 @@ procedure doStepJetpackWork(Gear: PGear); var HHGear: PGear; - fuel: LongInt; + fuel, i: LongInt; move: hwFloat; + isUnderwater: Boolean; + bubble: PVisualGear; begin + isUnderwater:= cWaterLine < hwRound(Gear^.Y) + Gear^.Radius; if Gear^.Pos > 0 then dec(Gear^.Pos); AllInactive := false; HHGear := PHedgehog(Gear^.Hedgehog)^.Gear; @@ -2979,15 +2982,43 @@ if (HHGear^.Message and gmUp) <> 0 then begin if (not HHGear^.dY.isNegative) or (HHGear^.Y > -_256) then - HHGear^.dY := HHGear^.dY - move; + begin + if isUnderwater then + begin + HHGear^.dY := HHGear^.dY - (move * _0_7); + for i:= random(10)+10 downto 0 do + begin + bubble := AddVisualGear(hwRound(HHGear^.X) - 8 + random(16), hwRound(HHGear^.Y) + 16 + random(8), vgtBubble); + if bubble <> nil then bubble^.dY:= random(20)/10+0.1; + end + end + else HHGear^.dY := HHGear^.dY - move; + end; dec(Gear^.Health, fuel); Gear^.MsgParam := Gear^.MsgParam or gmUp; Gear^.Timer := GameTicks end; - if (HHGear^.Message and gmLeft) <> 0 then move.isNegative := true; + move.isNegative := (HHGear^.Message and gmLeft) <> 0; if (HHGear^.Message and (gmLeft or gmRight)) <> 0 then begin HHGear^.dX := HHGear^.dX + (move * _0_1); + if isUnderwater then + begin + for i:= random(5)+5 downto 0 do + begin + bubble := AddVisualGear(hwRound(HHGear^.X)+random(8), hwRound(HHGear^.Y) - 8 + random(16), vgtBubble); + if bubble <> nil then + begin + bubble^.dX:= (random(10)/10 + 0.02) * -1; + if (move.isNegative) then + begin + bubble^.X := bubble^.X + 28; + bubble^.dX *= -1 + end + else bubble^.X := bubble^.X - 28; + end; + end + end; dec(Gear^.Health, fuel div 5); Gear^.MsgParam := Gear^.MsgParam or (HHGear^.Message and (gmLeft or gmRight)); Gear^.Timer := GameTicks diff -r e11df2de6af2 -r f9cb69eecefe hedgewars/GearDrawing.inc --- a/hedgewars/GearDrawing.inc Mon Sep 27 04:58:15 2010 +0200 +++ b/hedgewars/GearDrawing.inc Mon Sep 27 04:58:26 2010 +0200 @@ -599,9 +599,12 @@ case CurAmmoGear^.Kind of gtJetpack: begin DrawSprite(sprJetpack, sx-32, sy-32, 0); - if (CurAmmoGear^.MsgParam and gmUp) <> 0 then DrawSprite(sprJetpack, sx-32, sy-32, 1); - if (CurAmmoGear^.MsgParam and gmLeft) <> 0 then DrawSprite(sprJetpack, sx-32, sy-32, 2); - if (CurAmmoGear^.MsgParam and gmRight) <> 0 then DrawSprite(sprJetpack, sx-32, sy-32, 3); + if cWaterLine > hwRound(Gear^.Y) + Gear^.Radius then + begin + if (CurAmmoGear^.MsgParam and gmUp) <> 0 then DrawSprite(sprJetpack, sx-32, sy-28, 1); + if (CurAmmoGear^.MsgParam and gmLeft) <> 0 then DrawSprite(sprJetpack, sx-28, sy-28, 2); + if (CurAmmoGear^.MsgParam and gmRight) <> 0 then DrawSprite(sprJetpack, sx-36, sy-28, 3) + end; if CurAmmoGear^.Tex <> nil then DrawCentered(sx, sy - 40, CurAmmoGear^.Tex); DrawAltWeapon(Gear, sx, sy) end; diff -r e11df2de6af2 -r f9cb69eecefe hedgewars/HHHandlers.inc --- a/hedgewars/HHHandlers.inc Mon Sep 27 04:58:15 2010 +0200 +++ b/hedgewars/HHHandlers.inc Mon Sep 27 04:58:26 2010 +0200 @@ -621,8 +621,10 @@ begin if (Gear^.dY.isNegative) and TestCollisionYKick(Gear, -1) then Gear^.dY:= _0; Gear^.State:= Gear^.State or gstMoving; - Gear^.dY:= Gear^.dY + cGravity - end else + if isUnderwater then Gear^.dY:= Gear^.dY + cGravity / _2 + else Gear^.dY:= Gear^.dY + cGravity + end +else begin if ((hwAbs(Gear^.dX) + hwAbs(Gear^.dY)) < _0_55) and ((Gear^.State and gstHHJumping) <> 0) then SetLittle(Gear^.dX); diff -r e11df2de6af2 -r f9cb69eecefe hedgewars/VGSHandlers.inc --- a/hedgewars/VGSHandlers.inc Mon Sep 27 04:58:15 2010 +0200 +++ b/hedgewars/VGSHandlers.inc Mon Sep 27 04:58:26 2010 +0200 @@ -201,9 +201,13 @@ //////////////////////////////////////////////////////////////////////////////// procedure doStepBubble(Gear: PVisualGear; Steps: Longword); begin - Gear^.X:= Gear^.X + (cWindSpeedf * 100 + Gear^.dX) * Steps; + Gear^.X:= Gear^.X + Gear^.dX * Steps; + Gear^.Y:= Gear^.Y + Gear^.dY * Steps; Gear^.Y:= Gear^.Y - cDrownSpeedf * Steps; + Gear^.dX /= (1.001 * Steps); + Gear^.dY /= (1.001 * Steps); + if (Gear^.FrameTicks <= Steps) or (round(Gear^.Y) < cWaterLine) then DeleteVisualGear(Gear) else diff -r e11df2de6af2 -r f9cb69eecefe hedgewars/uVisualGears.pas --- a/hedgewars/uVisualGears.pas Mon Sep 27 04:58:15 2010 +0200 +++ b/hedgewars/uVisualGears.pas Mon Sep 27 04:58:26 2010 +0200 @@ -213,7 +213,7 @@ end; vgtBubble: begin dx:= 0.0000038654705 * random(10000); - dy:= 0.001 * (random(85) + 95); + dy:= 0; if random(2) = 0 then dx := -dx; FrameTicks:= 250 + random(1751); Frame:= random(5)