diff -r 833ab5b359e5 -r 85921db6f7c3 hedgewars/uGearsHandlersMess.pas --- a/hedgewars/uGearsHandlersMess.pas Sun Jan 13 17:02:15 2019 +0100 +++ b/hedgewars/uGearsHandlersMess.pas Sun Jan 13 17:28:33 2019 +0100 @@ -115,6 +115,7 @@ procedure doStepMovingPortal(Gear: PGear); procedure doStepPortalShot(newPortal: PGear); procedure doStepPiano(Gear: PGear); +procedure doStepPianoWork(Gear: PGear); procedure doStepSineGunShotWork(Gear: PGear); procedure doStepSineGunShot(Gear: PGear); procedure doStepFlamethrowerWork(Gear: PGear); @@ -5330,8 +5331,51 @@ newPortal^.doStep := @doStepMovingPortal; end; +procedure doStepPiano(Gear: PGear); +var valid: boolean; + HHGear: PGear; +begin + AllInactive := false; + valid := true; + + if (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) then + HHGear := Gear^.Hedgehog^.Gear; + + if (WorldEdge = weBounce) then + if (hwRound(Gear^.X) - Gear^.Radius < leftX) then + valid := false + else if (hwRound(Gear^.X) - Gear^.Radius > rightX) then + valid := false; + + if (not valid) then + begin + if (HHGear <> nil) then + begin + HHGear^.Message := HHGear^.Message and (not gmAttack); + HHGear^.State := HHGear^.State and (not gstAttacking); + HHGear^.State := HHGear^.State or gstChooseTarget; + isCursorVisible := true; + end; + DeleteGear(Gear); + PlaySound(sndDenied); + exit; + end; + + isCursorVisible := false; + if (HHGear <> nil) then + begin + PlaySoundV(sndIncoming, Gear^.Hedgehog^.Team^.voicepack); + // Tuck the hedgehog away until the piano attack is completed + Gear^.Hedgehog^.Unplaced:= true; + HHGear^.X:= _0; + HHGear^.Y:= _0; + end; + + PauseMusic; + Gear^.doStep:= @doStepPianoWork; +end; //////////////////////////////////////////////////////////////////////////////// -procedure doStepPiano(Gear: PGear); +procedure doStepPianoWork(Gear: PGear); var r0, r1: LongInt; odY: hwFloat;