# HG changeset patch # User unc0rr # Date 1181165232 0 # Node ID 74219eadab5e271b60429abde050d15dfb023fb8 # Parent 4d2e60623e4470818c4f52e04fd0a1d2e991b110 - Various small fixes - Current hh moves like others (fixes some issues of new collision system) diff -r 4d2e60623e44 -r 74219eadab5e hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Mon Jun 04 21:29:05 2007 +0000 +++ b/hedgewars/GSHandlers.inc Wed Jun 06 21:27:12 2007 +0000 @@ -1177,10 +1177,11 @@ HHGear:= PHedgehog(Gear^.Hedgehog)^.Gear; Msg:= Gear^.Message and not gm_Switch; DeleteGear(Gear); - OnUsedAmmo(PHedgehog(Gear^.Hedgehog)^); + OnUsedAmmo(PHedgehog(HHGear^.Hedgehog)^); + ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^); HHGear:= CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear; - ApplyAmmoChanges(PHedgehog(Gear^.Hedgehog)^); + ApplyAmmoChanges(PHedgehog(HHGear^.Hedgehog)^); HHGear^.Message:= Msg; exit end; diff -r 4d2e60623e44 -r 74219eadab5e hedgewars/HHHandlers.inc --- a/hedgewars/HHHandlers.inc Mon Jun 04 21:29:05 2007 +0000 +++ b/hedgewars/HHHandlers.inc Wed Jun 06 21:27:12 2007 +0000 @@ -254,6 +254,76 @@ procedure doStepHedgehog(Gear: PGear); forward; //////////////////////////////////////////////////////////////////////////////// +procedure doStepHedgehogMoving(Gear: PGear); +var prevState: Longword; +begin +prevState:= Gear^.State; +if not TestCollisionYKick(Gear, 1) then + begin + if (Gear^.dY.isNegative) and TestCollisionYKick(Gear, -1) then Gear^.dY:= _0; + Gear^.State:= Gear^.State or gstFalling or gstMoving; + Gear^.dY:= Gear^.dY + cGravity + end else + if (not Gear^.dY.isNegative) then + begin + CheckHHDamage(Gear); + if ((hwAbs(Gear^.dX) + hwAbs(Gear^.dY)) < _0_55) + and ((Gear^.State and gstHHJumping) <> 0) then SetLittle(Gear^.dX); + + Gear^.State:= Gear^.State and not (gstFalling or gstHHJumping or gstHHHJump); + + if Gear^.dY > _0 then Gear^.dY:= _0; + if ((Gear^.State and gstMoving) <> 0) then Gear^.dX:= Gear^.dX * Gear^.Friction + end; + +if (Gear^.State <> 0) then DeleteCI(Gear); + +if (Gear^.State and gstMoving) <> 0 then + if TestCollisionXKick(Gear, hwSign(Gear^.dX)) then + if ((Gear^.State and gstFalling) = 0) then + if hwAbs(Gear^.dX) > _0_01 then + if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -1, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_96; Gear^.Y:= Gear^.Y - _1 end else + if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -2, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_93; Gear^.Y:= Gear^.Y - _2 end else + if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -3, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_9 ; Gear^.Y:= Gear^.Y - _3 end else + if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -4, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_87; Gear^.Y:= Gear^.Y - _4 end else + 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; + SetLittle(Gear^.dX) + end + else begin + Gear^.State:= Gear^.State and not gstMoving; + SetLittle(Gear^.dX) + end + else if hwAbs(Gear^.dX) > cLittle then Gear^.dX:= -Gear^.Elasticity * Gear^.dX + else SetLittle(Gear^.dX); + +if ((Gear^.State and gstFalling) = 0)and + (hwAbs(Gear^.dX) + hwAbs(Gear^.dY) < _0_03) then + begin + Gear^.State:= Gear^.State and not gstMoving; + SetLittle(Gear^.dX); + Gear^.dY:= _0 + end else Gear^.State:= Gear^.State or gstMoving; + +if (Gear^.State and gstMoving) <> 0 then + begin + Gear^.State:= Gear^.State and not gstAnimation; + Gear^.X:= Gear^.X + Gear^.dX; + Gear^.Y:= Gear^.Y + Gear^.dY; + if (not Gear^.dY.isNegative) and + (not TestCollisionYKick(Gear, 1)) and + TestCollisionYwithXYShift(Gear, 0, 1, 1) then + begin + CheckHHDamage(Gear); + Gear^.dY:= _0; + Gear^.Y:= Gear^.Y + _1 + end; + CheckGearDrowning(Gear) + end +end; + procedure doStepHedgehogDriven(Gear: PGear); var t: PGear; begin @@ -303,24 +373,20 @@ Gear^.dX:= SignAs(_0_02, Gear^.dX) end; Gear^.Message:= Gear^.Message and not (gm_LJump or gm_HJump); - if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then SetLittle(Gear^.dX); - Gear^.X:= Gear^.X + Gear^.dX; - Gear^.dY:= Gear^.dY + cGravity; - if (Gear^.dY.isNegative)and TestCollisionYwithGear(Gear, -1) then Gear^.dY:= _0; - Gear^.Y:= Gear^.Y + Gear^.dY; - if (not Gear^.dY.isNegative)and TestCollisionYwithGear(Gear, 1) then + + + if ((Gear^.State and gstHHJumping) <> 0) and + TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then SetLittle(Gear^.dX); + + doStepHedgehogMoving(Gear); + + if (Gear^.State and (gstFalling or gstMoving)) = 0 then begin - CheckHHDamage(Gear); - if ((hwAbs(Gear^.dX) + hwAbs(Gear^.dY)) < _0_55) - and ((Gear^.State and gstHHJumping) <> 0) then SetLittle(Gear^.dX); - Gear^.State:= Gear^.State and not (gstFalling or gstHHJumping or gstHHHJump); AddGearCI(Gear); - StepTicks:= 300; - Gear^.dY:= _0 + StepTicks:= 300 end; - CheckGearDrowning(Gear); exit - end ;//else if Gear^.CollIndex = High(Longword) then AddIntersectorsCR(Gear); + end; HedgehogChAngle(Gear); if StepTicks > 0 then dec(StepTicks); @@ -332,64 +398,10 @@ var prevState: Longword; begin prevState:= Gear^.State; -if not TestCollisionYKick(Gear, 1) then - begin - if (Gear^.dY.isNegative) and TestCollisionYKick(Gear, -1) then Gear^.dY:= _0; - Gear^.State:= Gear^.State or gstFalling or gstMoving; - Gear^.dY:= Gear^.dY + cGravity - end else begin - CheckHHDamage(Gear); - if ((hwAbs(Gear^.dX) + hwAbs(Gear^.dY)) < _0_55) - and ((Gear^.State and gstHHJumping) <> 0) then SetLittle(Gear^.dX); - Gear^.State:= Gear^.State and not (gstFalling or gstHHJumping); - if Gear^.dY > _0 then Gear^.dY:= _0; - if ((Gear^.State and gstMoving) <> 0) then Gear^.dX:= Gear^.dX * Gear^.Friction - end; - -if (Gear^.State <> 0) then DeleteCI(Gear); -if (Gear^.State and gstMoving) <> 0 then - if TestCollisionXKick(Gear, hwSign(Gear^.dX)) then - if ((Gear^.State and gstFalling) = 0) then - if hwAbs(Gear^.dX) > _0_01 then - if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -1, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_96; Gear^.Y:= Gear^.Y - _1 end else - if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -2, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_93; Gear^.Y:= Gear^.Y - _2 end else - if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -3, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_9 ; Gear^.Y:= Gear^.Y - _3 end else - if not TestCollisionXwithXYShift(Gear, int2hwFloat(hwSign(Gear^.dX)) - Gear^.dX, -4, hwSign(Gear^.dX)) then begin Gear^.X:= Gear^.X + Gear^.dX; Gear^.dX:= Gear^.dX * _0_87; Gear^.Y:= Gear^.Y - _4 end else - 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; - SetLittle(Gear^.dX) - end - else begin - Gear^.State:= Gear^.State and not gstMoving; - SetLittle(Gear^.dX) - end - else Gear^.dX:= -Gear^.Elasticity * Gear^.dX; +doStepHedgehogMoving(Gear); -if ((Gear^.State and gstFalling) = 0)and - (hwAbs(Gear^.dX) + hwAbs(Gear^.dY) < _0_03) then - begin - Gear^.State:= Gear^.State and not gstMoving; - SetLittle(Gear^.dX); - Gear^.dY:= _0 - end else Gear^.State:= Gear^.State or gstMoving; - -if (Gear^.State and gstMoving) <> 0 then - begin - Gear^.State:= Gear^.State and not gstAnimation; - Gear^.X:= Gear^.X + Gear^.dX; - Gear^.Y:= Gear^.Y + Gear^.dY; - if (not Gear^.dY.isNegative) and - (not TestCollisionYKick(Gear, 1)) and - TestCollisionYwithXYShift(Gear, 0, 1, 1) then - begin - CheckHHDamage(Gear); - Gear^.dY:= _0; - Gear^.Y:= Gear^.Y + _1 - end; - end else +if (Gear^.State and gstMoving) = 0 then if Gear^.Health = 0 then begin if AllInactive then @@ -406,8 +418,7 @@ AllInactive:= false; -if (not CheckGearDrowning(Gear)) and - ((Gear^.State and gstMoving) = 0) then +if ((Gear^.State and gstMoving) = 0) then if ((Gear^.State and gstAnimation) = 0) and (prevState <> Gear^.State) then begin diff -r 4d2e60623e44 -r 74219eadab5e hedgewars/uCollisions.pas --- a/hedgewars/uCollisions.pas Mon Jun 04 21:29:05 2007 +0000 +++ b/hedgewars/uCollisions.pas Wed Jun 06 21:27:12 2007 +0000 @@ -189,12 +189,11 @@ inc(y) until (y > i); end; -TestCollisionXKick:= false; +TestCollisionXKick:= flag; if flag then begin - if hwAbs(Gear^.dX) < cHHKick then exit(true); - if Count = 0 then exit; + if hwAbs(Gear^.dX) < cHHKick then exit; mx:= hwRound(Gear^.X); my:= hwRound(Gear^.Y); @@ -213,8 +212,8 @@ Active:= true end; DeleteCI(cGear); - exit - end else exit(true) + exit(false) + end end end; @@ -238,12 +237,11 @@ inc(x) until (x > i); end; -TestCollisionYKick:= false; +TestCollisionYKick:= flag; if flag then begin if hwAbs(Gear^.dX) < cHHKick then exit(true); - if Count = 0 then exit; mx:= hwRound(Gear^.X); my:= hwRound(Gear^.Y); @@ -257,13 +255,13 @@ with cGear^ do begin dX:= Gear^.dX; - dY:= Gear^.dY; + dY:= Gear^.dY * _0_5; State:= State or gstMoving; Active:= true end; DeleteCI(cGear); - exit - end else exit(true) + exit(false) + end end end; diff -r 4d2e60623e44 -r 74219eadab5e hedgewars/uFloat.pas --- a/hedgewars/uFloat.pas Mon Jun 04 21:29:05 2007 +0000 +++ b/hedgewars/uFloat.pas Wed Jun 06 21:27:12 2007 +0000 @@ -61,6 +61,7 @@ function AngleCos(const Angle: Longword): hwFloat; function SignAs(const num, signum: hwFloat): hwFloat; +{$J-} const _1div1024: hwFloat = (isNegative: false; QWordValue: 4194304); _1div10000: hwFloat = (isNegative: false; QWordValue: 429496); _1div50000: hwFloat = (isNegative: false; QWordValue: 85899); @@ -119,7 +120,7 @@ _10000: hwFloat = (isNegative: false; QWordValue: 4294967296 * 10000); cLittle: hwFloat = (isNegative: false; QWordValue: 1); - cHHKick: hwFloat = (isNegative: false; QWordValue: 128849018); + cHHKick: hwFloat = (isNegative: false; QWordValue: 128849018); // _0_03 {$ENDIF} {$IFNDEF FPC} diff -r 4d2e60623e44 -r 74219eadab5e hedgewars/uGears.pas --- a/hedgewars/uGears.pas Mon Jun 04 21:29:05 2007 +0000 +++ b/hedgewars/uGears.pas Wed Jun 06 21:27:12 2007 +0000 @@ -447,7 +447,7 @@ Surface); with PHedgehog(Gear^.Hedgehog)^ do - if (Gear^.State and not gstAnimation) = 0 then + if (Gear^.State{ and not gstAnimation}) = 0 then begin t:= hwRound(Gear^.Y) - cHHRadius - 10 + WorldDy; dec(t, HealthTag^.h + 2); @@ -457,6 +457,7 @@ dec(t, Team^.NameTag^.h + 2); DrawCentered(hwRound(Gear^.X) + WorldDx, t, Team^.NameTag, Surface) end else // Current hedgehog + if (Gear^.State and gstHHDriven) <> 0 then begin if bShowFinger and ((Gear^.State and gstHHDriven) <> 0) then DrawSprite(sprFinger, hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 64 + WorldDy, @@ -649,7 +650,7 @@ while Gear <> nil do begin dmg:= dmgRadius - hwRound(Distance(Gear^.X - int2hwFloat(X), Gear^.Y - int2hwFloat(Y))); - if (dmg > 0) and + if (dmg > 1) and ((Gear^.State and gstNoDamage) = 0) then begin dmg:= dmg div 2; @@ -698,7 +699,7 @@ while t <> nil do begin dmg:= min(Gear^.Radius + t^.Radius - hwRound(Distance(Gear^.X - t^.X, Gear^.Y - t^.Y)), 25); - if dmg >= 0 then + if dmg > 0 then case t^.Kind of gtHedgehog, gtMine, @@ -748,11 +749,11 @@ AddDamageTag(hwRound(t^.ar[i]^.X), hwRound(t^.ar[i]^.Y), Damage, t^.ar[i]); inc(hh^.DamageGiven, Damage) end; + DeleteCI(t^.ar[i]); t^.ar[i]^.dX:= Ammo^.dX * Power * _0_01; t^.ar[i]^.dY:= Ammo^.dY * Power * _0_01; t^.ar[i]^.Active:= true; t^.ar[i]^.State:= t^.ar[i]^.State or gstMoving; - DeleteCI(t^.ar[i]); FollowGear:= t^.ar[i] end; end