# HG changeset patch # User Wuzzy # Date 1547396913 -3600 # Node ID 85921db6f7c38bcd25487f40bd25cc194b757a7b # Parent 833ab5b359e51d8cfb66b5c25741051d10f4182c Disallow placement of piano beyond bounce world edge diff -r 833ab5b359e5 -r 85921db6f7c3 ChangeLog.txt --- a/ChangeLog.txt Sun Jan 13 17:02:15 2019 +0100 +++ b/ChangeLog.txt Sun Jan 13 17:28:33 2019 +0100 @@ -13,6 +13,9 @@ * Fix poison damage not working in first round * Use player-chosen team identity in campaigns and singleplayer missions * Fix player-chosen teams ignoring custom team controls in campaigns + * Fix broken behaviour of airborne attacks when placed near bounce world edge + * Deny placement of airborne attack in “impossible” places in maps with bounce world edge + * Deny placement of piano beyond bounce world edge Styles and schemes: + The Specialists: Unlock game scheme 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; diff -r 833ab5b359e5 -r 85921db6f7c3 hedgewars/uGearsHedgehog.pas --- a/hedgewars/uGearsHedgehog.pas Sun Jan 13 17:02:15 2019 +0100 +++ b/hedgewars/uGearsHedgehog.pas Sun Jan 13 17:28:33 2019 +0100 @@ -487,14 +487,7 @@ PlaySoundV(sndOw1, Team^.voicepack); cVampiric:= true; end; - amPiano: begin - // Tuck the hedgehog away until the piano attack is completed - Unplaced:= true; - X:= _0; - Y:= _0; - newGear:= AddGear(TargetPoint.X, -1024, gtPiano, 0, _0, _0, 0); - PauseMusic - end; + amPiano: newGear:= AddGear(TargetPoint.X, -1024, gtPiano, 0, _0, _0, 0); amFlamethrower: newGear:= AddGear(hwRound(X), hwRound(Y), gtFlamethrower, 0, xx * _0_5, yy * _0_5, 0); amLandGun: newGear:= AddGear(hwRound(X), hwRound(Y), gtLandGun, 0, xx * _0_5, yy * _0_5, 0); amResurrector: begin diff -r 833ab5b359e5 -r 85921db6f7c3 hedgewars/uVariables.pas --- a/hedgewars/uVariables.pas Sun Jan 13 17:02:15 2019 +0100 +++ b/hedgewars/uVariables.pas Sun Jan 13 17:28:33 2019 +0100 @@ -2027,7 +2027,7 @@ NumberInCase: 1; Ammo: (Propz: ammoprop_NoCrosshair or ammoprop_NeedTarget or - ammoprop_NoTargetAfter or + // NoTargetAfter is handled manually in doStepPiano ammoprop_AttackingPut or ammoprop_DontHold or ammoprop_NotBorder or @@ -2037,7 +2037,7 @@ Timer: 0; Pos: 0; AmmoType: amPiano; - AttackVoice: sndIncoming; + AttackVoice: sndNone; // handled in doStepPiano Bounciness: defaultBounciness); Slot: 5; TimeAfterTurn: 0;