# HG changeset patch # User unc0rr # Date 1322394417 -10800 # Node ID 14224c9b459417ce29fbec475a48610f8da8603f # Parent 88e49851d814bf76b5c7658457aa67a751d23940 - Improvement to the parser - Help parser with 'not' prefix operator diff -r 88e49851d814 -r 14224c9b4594 hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Sun Nov 27 00:57:43 2011 +0100 +++ b/hedgewars/GSHandlers.inc Sun Nov 27 14:46:57 2011 +0300 @@ -84,7 +84,7 @@ if (gi^.Kind = gtHedgehog) then begin d := r - hwRound(Distance(gi^.X - x, gi^.Y - y)); - if (d > 1) and not gi^.Invulnerable and (GetRandom(2) = 0) then + if (d > 1) and (not gi^.Invulnerable) and (GetRandom(2) = 0) then begin if (CurrentHedgehog^.Gear = gi) then PlaySound(sndOops, gi^.Hedgehog^.Team^.voicepack) @@ -114,8 +114,8 @@ begin Z := cHHZ; Active := false; - State:= State and not (gstHHDriven or gstAttacking or gstAttacked); - Message := Message and not gmAttack; + State:= State and (not (gstHHDriven or gstAttacking or gstAttacked)); + Message := Message and (not gmAttack); end; HH^.GearHidden:= HH^.Gear; HH^.Gear:= nil @@ -126,7 +126,7 @@ HH^.Gear:=HH^.GearHidden; HH^.GearHidden:= nil; InsertGearToList(HH^.Gear); -HH^.Gear^.State:= (HH^.Gear^.State and not (gstHHDriven or gstInvisible or gstAttacking)) or gstAttacked; +HH^.Gear^.State:= (HH^.Gear^.State and (not (gstHHDriven or gstInvisible or gstAttacking))) or gstAttacked; AddGearCI(HH^.Gear); HH^.Gear^.Active:= true; ScriptCall('onHogRestore', HH^.Gear^.Uid) @@ -221,7 +221,7 @@ begin if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) or (TestCollisionYwithGear(Gear, hwSign(Gear^.dY)) <> 0) then Gear^.State := Gear^.State or gstCollision - else Gear^.State := Gear^.State and not gstCollision + else Gear^.State := Gear^.State and (not gstCollision) end; procedure CheckCollisionWithLand(Gear: PGear); inline; @@ -229,7 +229,7 @@ if TestCollisionX(Gear, hwSign(Gear^.dX)) or TestCollisionY(Gear, hwSign(Gear^.dY) ) then Gear^.State := Gear^.State or gstCollision - else Gear^.State := Gear^.State and not gstCollision + else Gear^.State := Gear^.State and (not gstCollision) end; procedure CheckHHDamage(Gear: PGear); @@ -307,7 +307,7 @@ // clip velocity at 1.9 - over 1 per pixel, but really shouldn't cause many actual problems. if Gear^.dX.QWordValue > 8160437862 then Gear^.dX.QWordValue:= 8160437862; if Gear^.dY.QWordValue > 8160437862 then Gear^.dY.QWordValue:= 8160437862; - Gear^.State := Gear^.State and not gstCollision; + Gear^.State := Gear^.State and (not gstCollision); collV := 0; collH := 0; tdX := Gear^.dX; @@ -348,7 +348,7 @@ else begin isFalling := true; - if (Gear^.AdvBounce=1) and not Gear^.dY.isNegative and (TestCollisionYwithGear(Gear, -1) <> 0) then + if (Gear^.AdvBounce=1) and (not Gear^.dY.isNegative) and (TestCollisionYwithGear(Gear, -1) <> 0) then collV := -1 end end; @@ -390,7 +390,7 @@ //if (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) < _0_0002) and if ((Gear^.dX.QWordValue + Gear^.dY.QWordValue) < _0_02.QWordValue) and (not isFalling) then - Gear^.State := Gear^.State and not gstMoving + Gear^.State := Gear^.State and (not gstMoving) else Gear^.State := Gear^.State or gstMoving; @@ -667,7 +667,7 @@ draw:= false; if gun then begin - Gear^.State:= Gear^.State and not gstInvisible; + Gear^.State:= Gear^.State and (not gstInvisible); doStepFallingGear(Gear); CheckCollision(Gear); if ((Gear^.State and gstCollision) <> 0) or ((Gear^.State and gstMoving) = 0) then draw:= true; @@ -678,7 +678,7 @@ begin with Gear^ do begin - State:= State and not gstInvisible; + State:= State and (not gstInvisible); X:= X + cWindSpeed * 3200 + dX; Y:= Y + dY + cGravity * vobFallSpeed * 8; // using same value as flakes to try and get similar results xx:= hwRound(X); @@ -775,7 +775,7 @@ end else Land[ly, lx]:= lf; if gun then - LandPixels[ry, rx]:= (cExplosionBorderColor and not AMask) or (p^[px] and AMask) + LandPixels[ry, rx]:= (cExplosionBorderColor and (not AMask)) or (p^[px] and AMask) else LandPixels[ry, rx]:= addBgColor(LandPixels[ry, rx], p^[px]); end else allpx:= false @@ -950,8 +950,8 @@ dec(Gear^.Timer); if Gear^.Timer = 0 then begin - Gear^.Hedgehog^.Gear^.Message:= Gear^.Hedgehog^.Gear^.Message and not gmAttack; - Gear^.Hedgehog^.Gear^.State:= Gear^.Hedgehog^.Gear^.State and not gstAttacking; + Gear^.Hedgehog^.Gear^.Message:= Gear^.Hedgehog^.Gear^.Message and (not gmAttack); + Gear^.Hedgehog^.Gear^.State:= Gear^.Hedgehog^.Gear^.State and (not gstAttacking); AttackBar:= 0; Gear^.SoundChannel := LoopSound(sndBee); @@ -1268,7 +1268,7 @@ begin HHGear^.State := HHGear^.State or gstNoDamage; doMakeExplosion(x, y + 7, 6, Gear^.Hedgehog, EXPLDontDraw); - HHGear^.State := HHGear^.State and not gstNoDamage + HHGear^.State := HHGear^.State and (not gstNoDamage) end; if (Gear^.Timer mod 47) = 0 then @@ -1398,7 +1398,7 @@ if ((HHGear^.State and gstMoving) = 0) then begin - HHGear^.State := HHGear^.State and not gstAttacking; + HHGear^.State := HHGear^.State and (not gstAttacking); prevX := hwRound(HHGear^.X); // why the call to HedgehogStep then a further increment of X? @@ -1425,7 +1425,7 @@ end; HHGear^.State := HHGear^.State or gstNoDamage; AmmoShove(Gear, 2, 15); - HHGear^.State := HHGear^.State and not gstNoDamage + HHGear^.State := HHGear^.State and (not gstNoDamage) end; end; @@ -1500,7 +1500,7 @@ Gear^.dY := -AngleCos(HHGear^.Angle); Gear^.Friction := _450 * _0_01 * cRopePercent; Gear^.Elasticity := _0; - Gear^.State := Gear^.State and not gsttmpflag; + Gear^.State := Gear^.State and (not gsttmpflag); Gear^.doStep := @doStepRope; end end; @@ -1517,8 +1517,8 @@ begin with HHGear^ do begin - Message := Message and not gmAttack; - State := (State or gstMoving) and not gstWinner; + Message := Message and (not gmAttack); + State := (State or gstMoving) and (not gstWinner); end; DeleteGear(Gear) end; @@ -1527,7 +1527,7 @@ begin with HHGear^ do begin - Message := Message and not gmAttack; + Message := Message and (not gmAttack); State := State or gstMoving; end; RopePoints.Count := 0; @@ -1546,10 +1546,10 @@ exit end; - if (Gear^.Message and gmLeft <> 0) and not TestCollisionXwithGear(HHGear, -1) then + if (Gear^.Message and gmLeft <> 0) and (not TestCollisionXwithGear(HHGear, -1)) then HHGear^.dX := HHGear^.dX - _0_0002; - if (Gear^.Message and gmRight <> 0) and not TestCollisionXwithGear(HHGear, 1) then + if (Gear^.Message and gmRight <> 0) and (not TestCollisionXwithGear(HHGear, 1)) then HHGear^.dX := HHGear^.dX + _0_0002; // vector between hedgehog and rope attaching point @@ -1801,7 +1801,7 @@ begin CheckHHDamage(HHGear); HHGear^.dY := _0 - //HHGear^.State:= HHGear^.State and not (gstHHJumping or gstHHHJump); + //HHGear^.State:= HHGear^.State and (not (gstHHJumping or gstHHHJump)); end else begin @@ -1825,8 +1825,8 @@ PlaySound(sndRopeAttach); with HHGear^ do begin - State := State and not (gstAttacking or gstHHJumping or gstHHHJump); - Message := Message and not gmAttack + State := State and (not (gstAttacking or gstHHJumping or gstHHHJump)); + Message := Message and (not gmAttack) end; RemoveFromAmmo; @@ -1851,8 +1851,8 @@ PlaySound(sndRopeAttach); with HHGear^ do begin - State := State and not (gstAttacking or gstHHJumping or gstHHHJump); - Message := Message and not gmAttack + State := State and (not (gstAttacking or gstHHJumping or gstHHHJump)); + Message := Message and (not gmAttack) end; RemoveFromAmmo; @@ -1867,8 +1867,8 @@ begin with Gear^.Hedgehog^.Gear^ do begin - State := State and not gstAttacking; - Message := Message and not gmAttack + State := State and (not gstAttacking); + Message := Message and (not gmAttack) end; DeleteGear(Gear) end; @@ -1955,7 +1955,7 @@ PlaySound(sndVaporize); Gear^.Health := 0; Gear^.Damage := 0; - Gear^.State := Gear^.State and not gstAttacking + Gear^.State := Gear^.State and (not gstAttacking) end; exit end; @@ -2128,7 +2128,7 @@ SetAllToActive; // something (hh, mine, etc...) could be on top of the case with CurrentHedgehog^ do - if Gear <> nil then Gear^.Message := Gear^.Message and not (gmLJump or gmHJump); + if Gear <> nil then Gear^.Message := Gear^.Message and (not (gmLJump or gmHJump)); exit end; @@ -2441,7 +2441,7 @@ HHGear^.State := HHGear^.State or gstNoDamage; Gear^.Y := HHGear^.Y; AmmoShove(Gear, 30, 40); - HHGear^.State := HHGear^.State and not gstNoDamage + HHGear^.State := HHGear^.State and (not gstNoDamage) end; HHGear^.dY := HHGear^.dY + cGravity; @@ -2532,8 +2532,8 @@ AfterAttack; - HHGear^.State := HHGear^.State and not (gstAttacking or gstAttacked or gstMoving); - HHGear^.Message := HHGear^.Message and not gmAttack; + HHGear^.State := HHGear^.State and (not (gstAttacking or gstAttacked or gstMoving)); + HHGear^.Message := HHGear^.Message and (not gmAttack); Gear^.doStep := @doStepParachuteWork; @@ -2642,13 +2642,13 @@ y := HHGear^.Y; if (Distance(tx - x, ty - y) > _256) or - not TryPlaceOnLand(Gear^.Target.X - SpritesData[sprAmGirder].Width div 2, + (not TryPlaceOnLand(Gear^.Target.X - SpritesData[sprAmGirder].Width div 2, Gear^.Target.Y - SpritesData[sprAmGirder].Height div 2, - sprAmGirder, Gear^.State, true, false) then + sprAmGirder, Gear^.State, true, false)) then begin PlaySound(sndDenied); - HHGear^.Message := HHGear^.Message and not gmAttack; - HHGear^.State := HHGear^.State and not gstAttacking; + HHGear^.Message := HHGear^.Message and (not gmAttack); + HHGear^.State := HHGear^.State and (not gstAttacking); HHGear^.State := HHGear^.State or gstHHChooseTarget; isCursorVisible := true; DeleteGear(Gear) @@ -2660,8 +2660,8 @@ AfterAttack; end; - HHGear^.State := HHGear^.State and not (gstAttacking or gstAttacked); - HHGear^.Message := HHGear^.Message and not gmAttack; + HHGear^.State := HHGear^.State and (not (gstAttacking or gstAttacked)); + HHGear^.Message := HHGear^.Message and (not gmAttack); end; //////////////////////////////////////////////////////////////////////////////// @@ -2706,8 +2706,8 @@ Gear^.Target.Y - SpritesData[sprHHTelepMask].Height div 2, sprHHTelepMask, 0, false, false) then begin - HHGear^.Message := HHGear^.Message and not gmAttack; - HHGear^.State := HHGear^.State and not gstAttacking; + HHGear^.Message := HHGear^.Message and (not gmAttack); + HHGear^.State := HHGear^.State and (not gstAttacking); HHGear^.State := HHGear^.State or gstHHChooseTarget; DeleteGear(Gear); isCursorVisible := true; @@ -2741,10 +2741,10 @@ begin AllInactive := false; - if ((Gear^.Message and not gmSwitch) <> 0) or (TurnTimeLeft = 0) then + if ((Gear^.Message and (not gmSwitch)) <> 0) or (TurnTimeLeft = 0) then begin HHGear := Gear^.Hedgehog^.Gear; - Msg := Gear^.Message and not gmSwitch; + Msg := Gear^.Message and (not gmSwitch); DeleteGear(Gear); ApplyAmmoChanges(HHGear^.Hedgehog^); @@ -2757,8 +2757,8 @@ if (Gear^.Message and gmSwitch) <> 0 then begin HHGear := CurrentHedgehog^.Gear; - HHGear^.Message := HHGear^.Message and not gmSwitch; - Gear^.Message := Gear^.Message and not gmSwitch; + HHGear^.Message := HHGear^.Message and (not gmSwitch); + Gear^.Message := Gear^.Message and (not gmSwitch); State := HHGear^.State; HHGear^.State := 0; HHGear^.Active := false; @@ -2797,8 +2797,8 @@ OnUsedAmmo(HHGear^.Hedgehog^); with HHGear^ do begin - State := State and not gstAttacking; - Message := Message and not gmAttack + State := State and (not gstAttacking); + Message := Message and (not gmAttack) end end; @@ -3299,9 +3299,9 @@ if (Gear^.Timer = 0) or (t^.Count <> 0) or ( ((Gear^.State and gsttmpFlag) = 0) and (TestCollisionYWithGear(Gear, hwSign(Gear^.dY)) = 0) - and not TestCollisionXWithGear(Gear, hwSign(Gear^.dX))) + and (not TestCollisionXWithGear(Gear, hwSign(Gear^.dX)))) // CheckLandValue returns true if the type isn't matched - or not CheckLandValue(hwRound(Gear^.X), hwRound(Gear^.Y), lfIndestructible) then + or (not CheckLandValue(hwRound(Gear^.X), hwRound(Gear^.Y), lfIndestructible)) then begin //out of time or exited ground StopSound(Gear^.SoundChannel); @@ -3312,7 +3312,7 @@ DeleteGear(Gear); exit end - else if (TestCollisionYWithGear(Gear, hwSign(Gear^.dY)) = 0) and not TestCollisionXWithGear(Gear, hwSign(Gear^.dX)) then + else if (TestCollisionYWithGear(Gear, hwSign(Gear^.dY)) = 0) and (not TestCollisionXWithGear(Gear, hwSign(Gear^.dX))) then begin StopSound(Gear^.SoundChannel); Gear^.Tag := 1; @@ -3422,7 +3422,7 @@ HHGear: PGear; begin HHGear := Gear^.Hedgehog^.Gear; - HHGear^.Message := HHGear^.Message and not (gmUp or gmDown); + HHGear^.Message := HHGear^.Message and (not (gmUp or gmDown)); HHGear^.State := HHGear^.State or gstNotKickable; Gear^.doStep := @doStepBallgunWork end; @@ -3493,7 +3493,7 @@ if ((HHGear^.Message and gmAttack) <> 0) and (Gear^.Health <> 0) then begin - HHGear^.Message := HHGear^.Message and not gmAttack; + HHGear^.Message := HHGear^.Message and (not gmAttack); AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtAirBomb, 0, Gear^.dX * _0_5, Gear^.dY * _0_5, 0); dec(Gear^.Health) @@ -3542,7 +3542,7 @@ end; HHGear^.Message := 0; - ParseCommand('/taunt '#1, true) + ParseCommand('/taunt ' + #1, true) end end; @@ -3647,9 +3647,9 @@ '%', cWhiteColor, fntSmall) end; - if HHGear^.Message and (gmAttack or gmUp or gmPrecise or gmLeft or gmRight) <> 0 then Gear^ - .State := Gear^.State and not gsttmpFlag; - HHGear^.Message := HHGear^.Message and not (gmUp or gmPrecise or gmLeft or gmRight); + if HHGear^.Message and (gmAttack or gmUp or gmPrecise or gmLeft or gmRight) <> 0 then + Gear^.State := Gear^.State and (not gsttmpFlag); + HHGear^.Message := HHGear^.Message and (not (gmUp or gmPrecise or gmLeft or gmRight)); HHGear^.State := HHGear^.State or gstMoving; Gear^.X := HHGear^.X; @@ -3699,8 +3699,8 @@ AfterAttack; with HHGear^ do begin - State := State and not gstAttacking; - Message := Message and not (gmAttack or gmUp or gmPrecise or gmLeft or gmRight); + State := State and (not gstAttacking); + Message := Message and (not (gmAttack or gmUp or gmPrecise or gmLeft or gmRight)); if (dY < _0_1) and (dY > -_0_1) then begin Gear^.State := Gear^.State or gsttmpFlag; @@ -3770,7 +3770,7 @@ if (HHGear^.Message and gmAttack <> 0) then begin - HHGear^.Message := HHGear^.Message and not gmAttack; + HHGear^.Message := HHGear^.Message and (not gmAttack); if Gear^.FlightTime > 0 then begin AddGear(hwRound(Gear^.X), hwRound(Gear^.Y) + 32, gtEgg, 0, Gear^.dX * _0_5, Gear^.dY, 0); @@ -3780,8 +3780,8 @@ end; if HHGear^.Message and (gmUp or gmPrecise or gmLeft or gmRight) <> 0 then - Gear^.State := Gear^.State and not gsttmpFlag; - HHGear^.Message := HHGear^.Message and not (gmUp or gmPrecise or gmLeft or gmRight); + Gear^.State := Gear^.State and (not gsttmpFlag); + HHGear^.Message := HHGear^.Message and (not (gmUp or gmPrecise or gmLeft or gmRight)); HHGear^.State := HHGear^.State or gstMoving; Gear^.X := HHGear^.X; @@ -3833,7 +3833,7 @@ exit end; HHGear := Gear^.Hedgehog^.Gear; - HHGear^.Message := HHGear^.Message and not (gmUp or gmPrecise or gmLeft or gmRight); + HHGear^.Message := HHGear^.Message and (not (gmUp or gmPrecise or gmLeft or gmRight)); if abs(hwRound(HHGear^.Y - Gear^.Y)) > 32 then begin if Gear^.Timer = 0 then @@ -3856,7 +3856,7 @@ Gear^.Timer := 500; Gear^.dX := _0; Gear^.dY := _0; - Gear^.State := Gear^.State and not gstAnimation; + Gear^.State := Gear^.State and (not gstAnimation); Gear^.doStep := @doStepBirdyDescend; end end; @@ -3865,7 +3865,7 @@ var HHGear: PGear; begin - gear^.State := gear^.State or gstAnimation and not gstTmpFlag; + gear^.State := gear^.State or gstAnimation and (not gstTmpFlag); Gear^.doStep := @doStepBirdyAppear; if CurrentHedgehog = nil then begin @@ -3884,8 +3884,8 @@ FollowGear := HHGear; with HHGear^ do begin - State := State and not gstAttacking; - Message := Message and not (gmAttack or gmUp or gmPrecise or gmLeft or gmRight) + State := State and (not gstAttacking); + Message := Message and (not (gmAttack or gmUp or gmPrecise or gmLeft or gmRight)) end end; @@ -3928,10 +3928,10 @@ if (CurrentHedgehog <> nil) and (CurrentHedgehog^.Gear <> nil) and ((CurrentHedgehog^.Gear^.Message and gmSwitch) <> 0) then - With CurrentHedgehog^ do + with CurrentHedgehog^ do if (CurAmmoType = amPortalGun) then begin - CurrentHedgehog^.Gear^.Message := CurrentHedgehog^.Gear^.Message and not gmSwitch; + CurrentHedgehog^.Gear^.Message := CurrentHedgehog^.Gear^.Message and (not gmSwitch); CurWeapon:= GetAmmoEntry(CurrentHedgehog^); if CurWeapon^.Pos <> 0 then @@ -4084,7 +4084,7 @@ continue; // only port bullets close to the portal - if isBullet and not (hwAbs(poffs) < _3) then + if isBullet and (not (hwAbs(poffs) < _3)) then continue; // @@ -4174,7 +4174,7 @@ iterator^.X := conPortal^.X + poffs * conPortal^.dX + noffs * nx; iterator^.Y := conPortal^.Y + poffs * conPortal^.dY + noffs * ny; - if not hasdxy and not (conPortal^.dY.isNegative) then + if not hasdxy and (not (conPortal^.dY.isNegative)) then begin iterator^.dY:= iterator^.dY + hwAbs(cGravity * (iterator^.Y - conPortal^.Y)) end; @@ -4229,7 +4229,7 @@ else begin inc(iterator^.PortalCounter); - iterator^.State:= iterator^.State and not gstHHHJump + iterator^.State:= iterator^.State and (not gstHHHJump) end; if not isbullet and (iterator^.Kind <> gtFlake) then @@ -4303,7 +4303,7 @@ if ((y and LAND_HEIGHT_MASK) = 0) and ((x and LAND_WIDTH_MASK) = 0) and (Land[y, x] > 255) then begin Gear^.State := Gear^.State or gstCollision; - Gear^.State := Gear^.State and not gstMoving; + Gear^.State := Gear^.State and (not gstMoving); if not CalcSlopeTangent(Gear, x, y, tx, ty, 255) or (DistanceI(tx,ty) < _12) then // reject shots at too irregular terrain begin @@ -4370,7 +4370,7 @@ // let's save the HH's dX's direction so we can decide where the "top" of the portal hole newPortal^.Elasticity.isNegative := CurrentHedgehog^.Gear^.dX.isNegative; // when doing a backjump the dx is the opposite of the facing direction - if ((Gear^.State and gstHHHJump) <> 0) and not cArtillery then + if ((Gear^.State and gstHHHJump) <> 0) and (not cArtillery) then newPortal^.Elasticity.isNegative := not newPortal^.Elasticity.isNegative; // make portal gun look unloaded @@ -4399,7 +4399,7 @@ iterator := iterator^.NextGear end; end; - newPortal^.State := newPortal^.State and not gstCollision; + newPortal^.State := newPortal^.State and (not gstCollision); newPortal^.State := newPortal^.State or gstMoving; newPortal^.doStep := @doStepMovingPortal; end; @@ -4427,7 +4427,7 @@ end; AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtNote); CurrentHedgehog^.Gear^.MsgParam := 0; - CurrentHedgehog^.Gear^.Message := CurrentHedgehog^.Gear^.Message and not gmSlot; + CurrentHedgehog^.Gear^.Message := CurrentHedgehog^.Gear^.Message and (not gmSlot); end; if (*((Gear^.Pos = 3) and ((GameFlags and gfSolidLand) <> 0)) or*) (Gear^.Pos = 5) then @@ -4698,7 +4698,7 @@ HHGear: PGear; begin HHGear := Gear^.Hedgehog^.Gear; - HHGear^.Message := HHGear^.Message and not (gmUp or gmDown or gmLeft or gmRight); + HHGear^.Message := HHGear^.Message and (not (gmUp or gmDown or gmLeft or gmRight)); HHGear^.State := HHGear^.State or gstNotKickable; Gear^.doStep := @doStepFlamethrowerWork end; @@ -4748,7 +4748,7 @@ if (Gear^.Health = 0) or (HHGear^.Damage <> 0) or ((HHGear^.Message and gmAttack) <> 0) then begin - HHGear^.Message:= HHGear^.Message and not gmAttack; + HHGear^.Message:= HHGear^.Message and (not gmAttack); DeleteGear(Gear); AfterAttack end @@ -4770,7 +4770,7 @@ HHGear: PGear; begin HHGear := Gear^.Hedgehog^.Gear; - HHGear^.Message := HHGear^.Message and not (gmUp or gmDown or gmLeft or gmRight or gmAttack); + HHGear^.Message := HHGear^.Message and (not (gmUp or gmDown or gmLeft or gmRight or gmAttack)); HHGear^.State := HHGear^.State or gstNotKickable; Gear^.doStep := @doStepLandGunWork end; @@ -4828,7 +4828,7 @@ end end; -HHGear^.State:= HHGear^.State and not gstNoDamage; +HHGear^.State:= HHGear^.State and (not gstNoDamage); Gear^.Timer:= 250; Gear^.doStep:= @doStepIdle end; @@ -5075,7 +5075,7 @@ AddGearCI(Gear); Gear^.dX:= _0; Gear^.dY:= _0; - Gear^.State:= Gear^.State and not gstMoving; + Gear^.State:= Gear^.State and (not gstMoving); end; if CurAmmoGear = Gear then @@ -5090,7 +5090,7 @@ RemoveGearFromList(CurrentHedgehog^.Gear); CurrentHedgehog^.Gear^.Z := cHHZ; CurrentHedgehog^.Gear^.Active := false; - CurrentHedgehog^.Gear^.State:= CurrentHedgehog^.Gear^.State and not gstHHDriven; + CurrentHedgehog^.Gear^.State:= CurrentHedgehog^.Gear^.State and (not gstHHDriven); CurrentHedgehog^.GearHidden:= CurrentHedgehog^.Gear; CurrentHedgehog^.Gear:= nil; Gear^.Tag:= TotalRounds + Gear^.Tag; @@ -5246,8 +5246,8 @@ begin if HH^.Gear <> nil then begin - HH^.Gear^.Message := HH^.Gear^.Message and not gmAttack; - HH^.Gear^.State:= HH^.Gear^.State and not gstAttacking; + HH^.Gear^.Message := HH^.Gear^.Message and (not gmAttack); + HH^.Gear^.State:= HH^.Gear^.State and (not gstAttacking); end; PlaySound(sndDenied); DeleteGear(gear); @@ -5264,8 +5264,8 @@ begin if HH^.Gear <> nil then begin - HH^.Gear^.Message := HH^.Gear^.Message and not gmAttack; - HH^.Gear^.State:= HH^.Gear^.State and not gstAttacking; + HH^.Gear^.Message := HH^.Gear^.Message and (not gmAttack); + HH^.Gear^.State:= HH^.Gear^.State and (not gstAttacking); end; PlaySound(sndDenied); DeleteGear(gear); diff -r 88e49851d814 -r 14224c9b4594 hedgewars/HHHandlers.inc --- a/hedgewars/HHHandlers.inc Sun Nov 27 00:57:43 2011 +0100 +++ b/hedgewars/HHHandlers.inc Sun Nov 27 14:46:57 2011 +0300 @@ -50,7 +50,7 @@ with HHGear^.Hedgehog^ do begin - HHGear^.Message:= HHGear^.Message and not gmSlot; + HHGear^.Message:= HHGear^.Message and (not gmSlot); ammoidx:= 0; if ((HHGear^.State and (gstAttacking or gstAttacked)) <> 0) or ((MultiShootAttacks > 0) and ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_NoRoundEnd) = 0)) or @@ -62,7 +62,7 @@ if ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_NoRoundEnd) <> 0) and (MultiShootAttacks > 0) then OnUsedAmmo(HHGear^.Hedgehog^); MultiShootAttacks:= 0; - HHGear^.Message:= HHGear^.Message and not (gmLJump or gmHJump); + HHGear^.Message:= HHGear^.Message and (not (gmLJump or gmHJump)); if Ammoz[CurAmmoType].Slot = slot then begin @@ -110,7 +110,7 @@ t:= cMaxSlotAmmoIndex; -HHGear^.Message:= HHGear^.Message and not gmWeapon; +HHGear^.Message:= HHGear^.Message and (not gmWeapon); with Hedgehog^ do while (CurAmmoType <> weap) and (t >= 0) do @@ -126,7 +126,7 @@ var CurWeapon: PAmmo; color: LongWord; begin -Gear^.Message:= Gear^.Message and not gmTimer; +Gear^.Message:= Gear^.Message and (not gmTimer); CurWeapon:= GetAmmoEntry(Gear^.Hedgehog^); with Gear^.Hedgehog^ do if ((Gear^.Message and gmPrecise) <> 0) and ((CurWeapon^.Propz and ammoprop_SetBounce) <> 0) then @@ -189,8 +189,8 @@ ((TargetPoint.X <> NoPointX) or ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_NeedTarget) = 0)) then begin State:= State or gstAttacking; - if Power = cMaxPower then Message:= Message and not gmAttack - else if (Ammoz[CurAmmoType].Ammo.Propz and ammoprop_Power) = 0 then Message:= Message and not gmAttack + if Power = cMaxPower then Message:= Message and (not gmAttack) + else if (Ammoz[CurAmmoType].Ammo.Propz and ammoprop_Power) = 0 then Message:= Message and (not gmAttack) else begin if Power = 0 then begin @@ -421,10 +421,10 @@ ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_Power) <> 0) then SendIPC('a'); AfterAttack; end - end else Message:= Message and not gmAttack; + end else Message:= Message and (not gmAttack); end; TargetPoint.X := NoPointX; - ScriptCall('onHogAttack'); + ScriptCall('onHogAttack'); end; procedure AfterAttack; @@ -435,7 +435,7 @@ CurrentHedgehog^ do begin a:= CurAmmoType; - State:= State and not gstAttacking; + State:= State and (not gstAttacking); if (Ammoz[a].Ammo.Propz and ammoprop_Effect) = 0 then begin Inc(MultiShootAttacks); @@ -637,7 +637,7 @@ if ((Gear^.Message and gmLJump ) <> 0) then begin - Gear^.Message:= Gear^.Message and not gmLJump; + Gear^.Message:= Gear^.Message and (not gmLJump); DeleteCI(Gear); if TestCollisionYwithGear(Gear, -1) = 0 then if not TestCollisionXwithXYShift(Gear, _0, -2, hwSign(Gear^.dX)) then Gear^.Y:= Gear^.Y - _2 else @@ -656,7 +656,7 @@ if ((Gear^.Message and gmHJump ) <> 0) then begin DeleteCI(Gear); - Gear^.Message:= Gear^.Message and not gmHJump; + Gear^.Message:= Gear^.Message and (not gmHJump); Gear^.dY:= -_0_2; SetLittle(Gear^.dX); @@ -770,7 +770,7 @@ begin Gear^.dY:= _0; Gear^.dX:= _0; - Gear^.State:= Gear^.State and not gstMoving; + Gear^.State:= Gear^.State and (not gstMoving); exit end; isFalling:= (Gear^.dY.isNegative) or not TestCollisionYKick(Gear, 1); @@ -810,7 +810,7 @@ if ((Gear^.State and gstHHHJump) <> 0) and (not cArtillery) and (Gear^.dX.QWordValue < _0_02.QWordValue) then Gear^.dX.isNegative:= not Gear^.dX.isNegative; // landing after high jump - Gear^.State:= Gear^.State and not (gstHHJumping or gstHHHJump); + Gear^.State:= Gear^.State and (not (gstHHJumping or gstHHHJump)); Gear^.dY:= _0; end else Gear^.dY:= Gear^.dY + cGravity; @@ -843,12 +843,12 @@ if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -5, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_84; Gear^.Y:= Gear^.Y - _5 end else if hwAbs(Gear^.dX) > _0_02 then Gear^.dX:= -Gear^.Elasticity * Gear^.dX else begin - Gear^.State:= Gear^.State and not gstMoving; + Gear^.State:= Gear^.State and (not gstMoving); while TestCollisionYWithGear(Gear,1) = 0 do Gear^.Y:= Gear^.Y+_1; SetLittle(Gear^.dX) end else begin - Gear^.State:= Gear^.State and not gstMoving; + Gear^.State:= Gear^.State and (not gstMoving); while TestCollisionYWithGear(Gear,1) = 0 do Gear^.Y:= Gear^.Y+_1; SetLittle(Gear^.dX) end @@ -860,8 +860,8 @@ if (not isFalling) and (hwAbs(Gear^.dX) + hwAbs(Gear^.dY) < _0_03) then begin - Gear^.State:= Gear^.State and not gstWinner; - Gear^.State:= Gear^.State and not gstMoving; + Gear^.State:= Gear^.State and (not gstWinner); + Gear^.State:= Gear^.State and (not gstMoving); while TestCollisionYWithGear(Gear,1) = 0 do Gear^.Y:= Gear^.Y+_1; SetLittle(Gear^.dX); Gear^.dY:= _0 @@ -869,7 +869,7 @@ if (Gear^.State and gstMoving) <> 0 then begin - Gear^.State:= Gear^.State and not gstAnimation; + Gear^.State:= Gear^.State and (not gstAnimation); // ARTILLERY but not being moved by explosions Gear^.X:= Gear^.X + Gear^.dX; Gear^.Y:= Gear^.Y + Gear^.dY; @@ -923,10 +923,10 @@ if TagTurnTimeLeft = 0 then TagTurnTimeLeft:= TurnTimeLeft; TurnTimeLeft:= 0; isCursorVisible:= false; - HHGear^.State:= HHGear^.State and not (gstHHDriven or gstAnimation or gstAttacking); + HHGear^.State:= HHGear^.State and (not (gstHHDriven or gstAnimation or gstAttacking)); AttackBar:= 0; if HHGear^.Damage > 0 then - HHGear^.State:= HHGear^.State and not (gstHHJumping or gstHHHJump); + HHGear^.State:= HHGear^.State and (not (gstHHJumping or gstHHHJump)); exit end; @@ -940,7 +940,7 @@ HHGear^.Timer:= 0; inc(HHGear^.Pos); if HHGear^.Pos = Wavez[TWave(HHGear^.Tag)].FramesCount then - HHGear^.State:= HHGear^.State and not gstAnimation + HHGear^.State:= HHGear^.State and (not gstAnimation) end; exit end; @@ -971,7 +971,7 @@ and ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_AltUse) <> 0) then begin Attack(HHGear); - HHGear^.Message:= HHGear^.Message and not gmLJump + HHGear^.Message:= HHGear^.Message and (not gmLJump) end; if (CurAmmoGear = nil) @@ -1010,7 +1010,7 @@ PlaySound(sndJump2, Hedgehog^.Team^.voicepack) end; - HHGear^.Message:= HHGear^.Message and not (gmLJump or gmHJump); + HHGear^.Message:= HHGear^.Message and (not (gmLJump or gmHJump)); if (not cArtillery) and wasJumping and TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then SetLittle(HHGear^.dX); @@ -1066,7 +1066,7 @@ ResurrectHedgehog(Gear); end else begin - Gear^.State:= (Gear^.State or gstHHDeath) and not gstAnimation; + Gear^.State:= (Gear^.State or gstHHDeath) and (not gstAnimation); Gear^.doStep:= @doStepHedgehogDead; // Death message AddCaption(Format(GetEventString(eidDied), Gear^.Hedgehog^.Name), cWhiteColor, capgrpMessage); @@ -1074,7 +1074,7 @@ end else begin - Gear^.State:= Gear^.State and not gstAnimation; + Gear^.State:= Gear^.State and (not gstAnimation); Gear^.doStep:= @doStepHedgehogGone; // Gone message @@ -1093,7 +1093,7 @@ begin if Gear^.Timer = 0 then begin - Gear^.State:= Gear^.State and not (gstWait or gstLoser or gstWinner or gstAttacked or gstNotKickable or gstHHChooseTarget); + Gear^.State:= Gear^.State and (not (gstWait or gstLoser or gstWinner or gstAttacked or gstNotKickable or gstHHChooseTarget)); Gear^.Active:= false; AddGearCI(Gear); exit diff -r 88e49851d814 -r 14224c9b4594 hedgewars/uCommands.pas --- a/hedgewars/uCommands.pas Sun Nov 27 00:57:43 2011 +0100 +++ b/hedgewars/uCommands.pas Sun Nov 27 14:46:57 2011 +0300 @@ -23,7 +23,7 @@ interface var isDeveloperMode: boolean; -type TVariableType = (vtCommand, vtLongInt, vthwFloat, vtBoolean); +type TVariableType = (vtCommand, vtLongInt, vtBoolean); TCommandHandler = procedure (var params: shortstring); procedure initModule; @@ -75,7 +75,7 @@ //WriteLnToConsole(CmdStr); if CmdStr[0]=#0 then exit; c:= CmdStr[1]; -if c in ['/', '$'] then Delete(CmdStr, 1, 1) else c:= '/'; +if (c = '/') or (c = '$') then Delete(CmdStr, 1, 1) else c:= '/'; s:= ''; SplitBySpace(CmdStr, s); AddFileLog('[Cmd] ' + c + CmdStr + ' (' + inttostr(length(s)) + ')'); @@ -96,12 +96,6 @@ str(PLongInt(t^.Handler)^, s); WriteLnToConsole('$' + CmdStr + ' is "' + s + '"'); end else val(s, PLongInt(t^.Handler)^); - vthwFloat: if c='$' then - if s[0]=#0 then - begin - //str(PhwFloat(t^.Handler)^:4:6, s); - WriteLnToConsole('$' + CmdStr + ' is "' + s + '"'); - end else; //val(s, PhwFloat(t^.Handler)^, i); vtBoolean: if c='$' then if s[0]=#0 then begin diff -r 88e49851d814 -r 14224c9b4594 hedgewars/uTeams.pas --- a/hedgewars/uTeams.pas Sun Nov 27 00:57:43 2011 +0100 +++ b/hedgewars/uTeams.pas Sun Nov 27 14:46:57 2011 +0300 @@ -142,7 +142,7 @@ c:= CurrentTeam^.Clan^.ClanIndex; repeat with ClansArray[c]^ do - if (CurrTeam = TagTeamIndex) and ((GameFlags And gfTagTeam) <> 0) then + if (CurrTeam = TagTeamIndex) and ((GameFlags and gfTagTeam) <> 0) then begin TagTeamIndex:= Pred(TagTeamIndex) mod TeamsNumber; CurrTeam:= Pred(CurrTeam) mod TeamsNumber; @@ -150,7 +150,7 @@ NextClan:= true; end; - if (GameFlags And gfTagTeam) = 0 then inc(c); + if (GameFlags and gfTagTeam) = 0 then inc(c); if c = ClansCount then begin @@ -171,7 +171,7 @@ CurrHedgehog:= Succ(CurrHedgehog) mod HedgehogsNumber; until (Hedgehogs[CurrHedgehog].Gear <> nil) or (CurrHedgehog = PrevHH) end - until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil) or (PrevTeam = CurrTeam) or ((CurrTeam = TagTeamIndex) and ((GameFlags And gfTagTeam) <> 0)); + until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil) or (PrevTeam = CurrTeam) or ((CurrTeam = TagTeamIndex) and ((GameFlags and gfTagTeam) <> 0)); end until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil); @@ -243,7 +243,7 @@ if CurrentHedgehog^.Unplaced then TurnTimeLeft:= 15000 else TurnTimeLeft:= 0 end -else if ((GameFlags And gfTagTeam) <> 0) and not NextClan then +else if ((GameFlags and gfTagTeam) <> 0) and (not NextClan) then begin if TagTurnTimeLeft <> 0 then TurnTimeLeft:= TagTurnTimeLeft; TagTurnTimeLeft:= 0; diff -r 88e49851d814 -r 14224c9b4594 tools/PascalBasics.hs --- a/tools/PascalBasics.hs Sun Nov 27 00:57:43 2011 +0100 +++ b/tools/PascalBasics.hs Sun Nov 27 14:46:57 2011 +0300 @@ -25,7 +25,7 @@ , "type", "var", "const", "out", "array", "packed" , "procedure", "function", "with", "for", "to" , "downto", "div", "mod", "record", "set", "nil" - , "string", "shortstring", "cdecl", "external" + , "string", "cdecl", "external", "if", "then", "else" ] ++ builtin , reservedOpNames= [] , caseSensitive = False diff -r 88e49851d814 -r 14224c9b4594 tools/PascalParser.hs --- a/tools/PascalParser.hs Sun Nov 27 00:57:43 2011 +0100 +++ b/tools/PascalParser.hs Sun Nov 27 14:46:57 2011 +0300 @@ -50,15 +50,16 @@ deriving Show data Uses = Uses [Identifier] deriving Show -data Phrase = ProcCall Identifier [Expression] +data Phrase = ProcCall Reference [Expression] | IfThenElse Expression Phrase (Maybe Phrase) | WhileCycle Expression Phrase | RepeatCycle Expression [Phrase] | ForCycle Identifier Expression Expression Phrase | WithBlock Reference Phrase | Phrases [Phrase] - | SwitchCase Expression [([Expression], Phrase)] (Maybe Phrase) + | SwitchCase Expression [([InitExpression], Phrase)] (Maybe Phrase) | Assignment Reference Expression + | NOP deriving Show data Expression = Expression String | BuiltInFunCall [Expression] Reference @@ -72,10 +73,12 @@ | FloatLiteral String | HexNumber String | Reference Reference + | SetExpression [Identifier] | Null deriving Show data Reference = ArrayElement [Expression] Reference | FunCall [Expression] Reference + | TypeCast Identifier Reference | SimpleReference Identifier | Dereference Reference | RecordField Reference Reference @@ -95,6 +98,8 @@ | InitSet [Identifier] | InitNull deriving Show + +knownTypes = ["shortstring"] pascalUnit = do comments @@ -122,7 +127,8 @@ where term = comments >> choice [ parens pas (reference >>= postfixes) >>= postfixes - , char '@' >> reference >>= postfixes >>= return . Address + , typeCast >>= postfixes + , char '@' >> liftM Address reference >>= postfixes , liftM SimpleReference iD >>= postfixes ] "simple reference" @@ -137,6 +143,12 @@ , (brackets pas) (commaSep1 pas $ expression) >>= return . ArrayElement ] + typeCast = do + t <- choice $ map (\s -> try $ caseInsensitiveString s >>= \i -> notFollowedBy alphaNum >> return i) knownTypes + r <- parens pas reference + comments + return $ TypeCast (Identifier t) r + varsDecl1 = varsParser sepEndBy1 varsDecl = varsParser sepEndBy @@ -420,6 +432,7 @@ term = comments >> choice [ builtInFunction expression >>= \(n, e) -> return $ BuiltInFunCall e (SimpleReference (Identifier n)) , parens pas $ expression + , brackets pas (commaSep pas iD) >>= return . SetExpression , try $ natural pas >>= \i -> notFollowedBy (char '.') >> (return . NumberLiteral . show) i , try $ float pas >>= return . FloatLiteral . show , try $ natural pas >>= return . NumberLiteral . show @@ -437,6 +450,7 @@ , Infix (char '/' >> return (BinOp "/")) AssocLeft , Infix (try (string "div") >> return (BinOp "div")) AssocLeft , Infix (try (string "mod") >> return (BinOp "mod")) AssocLeft + , Infix (try (string "in") >> return (BinOp "in")) AssocNone ] , [ Infix (char '+' >> return (BinOp "+")) AssocLeft , Infix (char '-' >> return (BinOp "-")) AssocLeft @@ -493,7 +507,7 @@ o2 <- optionMaybe $ do try $ string "else" >> space comments - o <- phrase + o <- option NOP phrase comments return o return $ IfThenElse e o1 o2 @@ -556,7 +570,7 @@ comments cs <- many1 aCase o2 <- optionMaybe $ do - try $ string "else" + try $ string "else" >> notFollowedBy alphaNum comments o <- phrase comments @@ -566,7 +580,7 @@ return $ SwitchCase e cs o2 where aCase = do - e <- (commaSep pas) expression + e <- (commaSep pas) initExpression comments char ':' comments @@ -575,9 +589,9 @@ return (e, p) procCall = do - i <- iD + r <- reference p <- option [] $ (parens pas) parameters - return $ ProcCall i p + return $ ProcCall r p parameters = (commaSep pas) expression "parameters" diff -r 88e49851d814 -r 14224c9b4594 tools/pas2c.hs --- a/tools/pas2c.hs Sun Nov 27 00:57:43 2011 +0100 +++ b/tools/pas2c.hs Sun Nov 27 14:46:57 2011 +0300 @@ -131,7 +131,7 @@ phrase2C :: Phrase -> Doc phrase2C (Phrases p) = text "{" $+$ (nest 4 . vcat . map phrase2C $ p) $+$ text "}" -phrase2C (ProcCall (Identifier name) params) = text name <> parens (hsep . punctuate (char ',') . map expr2C $ params) <> semi +phrase2C (ProcCall ref params) = ref2C ref <> parens (hsep . punctuate (char ',') . map expr2C $ params) <> semi phrase2C (IfThenElse (expr) phrase1 mphrase2) = text "if" <> parens (expr2C expr) $+$ (phrase2C . wrapPhrase) phrase1 $+$ elsePart where elsePart | isNothing mphrase2 = empty @@ -140,8 +140,8 @@ phrase2C (WhileCycle expr phrase) = text "while" <> parens (expr2C expr) $$ (phrase2C $ wrapPhrase phrase) phrase2C (SwitchCase expr cases mphrase) = text "switch" <> parens (expr2C expr) <> text "of" $+$ (nest 4 . vcat . map case2C) cases where - case2C :: ([Expression], Phrase) -> Doc - case2C (e, p) = text "case" <+> parens (hsep . punctuate (char ',') . map expr2C $ e) <> char ':' <> nest 4 (phrase2C p $+$ text "break;") + case2C :: ([InitExpression], Phrase) -> Doc + case2C (e, p) = text "case" <+> parens (hsep . punctuate (char ',') . map initExpr2C $ e) <> char ':' <> nest 4 (phrase2C p $+$ text "break;") phrase2C (WithBlock ref p) = text "namespace" <> parens (ref2C ref) $$ (phrase2C $ wrapPhrase p) phrase2C (ForCycle (Identifier i) e1 e2 p) = text "for" <> (parens . hsep . punctuate (char ';') $ [text i <+> text "=" <+> expr2C e1, text i <+> text "<=" <+> expr2C e2, text "++" <> text i])