# HG changeset patch # User unc0rr # Date 1178742761 0 # Node ID 2b5b9e00419d629d5ad6502cc3dcb0d55a9510cc # Parent 4e994e1b7abbaa1258299a8c17f2b0b1db051623 - Further work on new collisions implementation diff -r 4e994e1b7abb -r 2b5b9e00419d hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Mon May 07 21:12:06 2007 +0000 +++ b/hedgewars/GSHandlers.inc Wed May 09 20:32:41 2007 +0000 @@ -476,13 +476,13 @@ HHGear^.State:= HHGear^.State or gstAttacking; inc(BTSteps); - if BTSteps = 11 then + if BTSteps = 7 then begin BTSteps:= 0; - Gear^.X:= HHGear^.X + Gear^.dX * cHHRadius * 2; - Gear^.Y:= HHGear^.Y + Gear^.dY * cHHRadius * 2; + Gear^.X:= HHGear^.X + Gear^.dX * (cHHRadius + cBlowTorchC); + Gear^.Y:= HHGear^.Y + Gear^.dY * (cHHRadius + cBlowTorchC); HHGear^.State:= HHGear^.State or gstNoDamage; - AmmoShove(Gear, 3, 14); + AmmoShove(Gear, 2, 14); HHGear^.State:= HHGear^.State and not gstNoDamage end; @@ -821,8 +821,8 @@ CheckGearDrowning(Gear); end; -if (Gear^.CollIndex = High(Longword)) and (Gear^.dY.QWordValue = 0) then AddGearCI(Gear) - else if (Gear^.CollIndex < High(Longword)) and (Gear^.dY.QWordValue <> 0) then DeleteCI(Gear); +if (Gear^.dY.QWordValue = 0) then AddGearCI(Gear) + else if (Gear^.dY.QWordValue <> 0) then DeleteCI(Gear) end; //////////////////////////////////////////////////////////////////////////////// diff -r 4e994e1b7abb -r 2b5b9e00419d hedgewars/HHHandlers.inc --- a/hedgewars/HHHandlers.inc Mon May 07 21:12:06 2007 +0000 +++ b/hedgewars/HHHandlers.inc Wed May 09 20:32:41 2007 +0000 @@ -325,8 +325,9 @@ //////////////////////////////////////////////////////////////////////////////// procedure doStepHedgehogFree(Gear: PGear); +var prevState: Longword; begin -//DeleteCI(Gear); +prevState:= Gear^.State; if not TestCollisionYwithGear(Gear, 1) then begin if (Gear^.dY.isNegative) and TestCollisionYwithGear(Gear, -1) then Gear^.dY:= _0; @@ -373,6 +374,7 @@ 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 (Gear^.dY > _0) and not TestCollisionYwithGear(Gear, 1) and TestCollisionYwithXYShift(Gear, 0, 1, 1) then @@ -399,11 +401,20 @@ if (not CheckGearDrowning(Gear)) and ((Gear^.State and gstMoving) = 0) then + if ((Gear^.State and gstAnimation) = 0) and + (prevState <> Gear^.State) then begin - Gear^.State:= 0; - Gear^.Active:= false; - AddGearCI(Gear); - exit + Gear^.State:= gstAnimation; + Gear^.Timer:= 150 + end else + begin + if Gear^.Timer = 0 then + begin + Gear^.State:= 0; + Gear^.Active:= false; + AddGearCI(Gear); + exit + end else dec(Gear^.Timer) end end; @@ -416,5 +427,5 @@ exit end; if (Gear^.State and gstHHDriven) = 0 then doStepHedgehogFree(Gear) - else doStepHedgehogDriven(Gear) + else doStepHedgehogDriven(Gear) end; diff -r 4e994e1b7abb -r 2b5b9e00419d hedgewars/uCollisions.pas --- a/hedgewars/uCollisions.pas Mon May 07 21:12:06 2007 +0000 +++ b/hedgewars/uCollisions.pas Wed May 09 20:32:41 2007 +0000 @@ -38,7 +38,7 @@ function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: LongInt; Dir: LongInt): boolean; implementation -uses uMisc, uConsts, uLand, uLandGraphics; +uses uMisc, uConsts, uLand, uLandGraphics, uConsole; type TCollisionEntry = record X, Y, Radius: LongInt; @@ -52,29 +52,29 @@ procedure AddGearCI(Gear: PGear); begin -if Gear^.CollIndex < High(Longword) then exit; +if Gear^.CollisionIndex >= 0 then exit; TryDo(Count <= MAXRECTSINDEX, 'Collision rects array overflow', true); with cinfos[Count] do begin X:= hwRound(Gear^.X); Y:= hwRound(Gear^.Y); Radius:= Gear^.Radius; - ChangeRoundInLand(X, Y, Radius - 1, +1); + ChangeRoundInLand(X, Y, Radius - 1, true); cGear:= Gear end; -Gear^.CollIndex:= Count; +Gear^.CollisionIndex:= Count; inc(Count) end; procedure DeleteCI(Gear: PGear); begin -if Gear^.CollIndex < Count then +if Gear^.CollisionIndex >= 0 then begin - with cinfos[Gear^.CollIndex] do - ChangeRoundInLand(X, Y, Radius - 1, -1); - cinfos[Gear^.CollIndex]:= cinfos[Pred(Count)]; - cinfos[Gear^.CollIndex].cGear^.CollIndex:= Gear^.CollIndex; - Gear^.CollIndex:= High(Longword); + with cinfos[Gear^.CollisionIndex] do + ChangeRoundInLand(X, Y, Radius - 1, false); + cinfos[Gear^.CollisionIndex]:= cinfos[Pred(Count)]; + cinfos[Gear^.CollisionIndex].cGear^.CollisionIndex:= Gear^.CollisionIndex; + Gear^.CollisionIndex:= -1; dec(Count) end; end; @@ -93,7 +93,7 @@ for i:= 0 to Pred(Count) do with cinfos[i] do if (Gear <> cGear) and - (sqrt(sqr(mx - x) + sqr(my - y)) <= Radius + Gear^.Radius) then + (sqr(mx - x) + sqr(my - y) <= sqr(Radius + Gear^.Radius)) then begin ga.ar[ga.Count]:= cinfos[i].cGear; inc(ga.Count) diff -r 4e994e1b7abb -r 2b5b9e00419d hedgewars/uConsts.pas --- a/hedgewars/uConsts.pas Mon May 07 21:12:06 2007 +0000 +++ b/hedgewars/uConsts.pas Wed May 09 20:32:41 2007 +0000 @@ -126,6 +126,7 @@ cCurrHHZ = Succ(cHHZ); cShotgunRadius = 22; + cBlowTorchC = 6; cKeyMaxIndex = 1023; @@ -148,6 +149,7 @@ gstHHThinking = $00000800; gstNoDamage = $00001000; gstHHHJump = $00002000; + gstAnimation = $00004000; gm_Left = $00000001; gm_Right = $00000002; diff -r 4e994e1b7abb -r 2b5b9e00419d hedgewars/uGears.pas --- a/hedgewars/uGears.pas Mon May 07 21:12:06 2007 +0000 +++ b/hedgewars/uGears.pas Wed May 09 20:32:41 2007 +0000 @@ -44,7 +44,7 @@ Message : Longword; Hedgehog: pointer; Health, Damage: LongInt; - CollIndex: Longword; + CollisionIndex: LongInt; Tag: LongInt; Surf: PSDL_Surface; Z: Longword; @@ -175,7 +175,7 @@ Result^.dX:= dX; Result^.dY:= dY; Result^.doStep:= doStepHandlers[Kind]; -Result^.CollIndex:= High(Longword); +Result^.CollisionIndex:= -1; Result^.Timer:= Timer; if CurrentTeam <> nil then @@ -277,7 +277,7 @@ Result^.Radius:= 10; end; gtBlowTorch: begin - Result^.Radius:= cHHRadius; + Result^.Radius:= cHHRadius + cBlowTorchC; Result^.Timer:= 7500; end; end; @@ -464,7 +464,7 @@ Surface); with PHedgehog(Gear^.Hedgehog)^ do - if Gear^.State = 0 then + if (Gear^.State and not gstAnimation) = 0 then begin t:= hwRound(Gear^.Y) - cHHRadius - 10 + WorldDy; dec(t, HealthTag^.h + 2); diff -r 4e994e1b7abb -r 2b5b9e00419d hedgewars/uLandGraphics.pas --- a/hedgewars/uLandGraphics.pas Mon May 07 21:12:06 2007 +0000 +++ b/hedgewars/uLandGraphics.pas Wed May 09 20:32:41 2007 +0000 @@ -30,7 +30,7 @@ procedure DrawHLinesExplosions(ar: PRangeArray; Radius: LongInt; y, dY: LongInt; Count: Byte); procedure DrawTunnel(X, Y, dX, dY: hwFloat; ticks, HalfWidth: LongInt); procedure FillRoundInLand(X, Y, Radius: LongInt; Value: Longword); -procedure ChangeRoundInLand(X, Y, Radius: LongInt; Delta: LongInt); +procedure ChangeRoundInLand(X, Y, Radius: LongInt; doSet: boolean); function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt): boolean; @@ -50,17 +50,34 @@ for i:= max(x - dy, 0) to min(x + dy, 2047) do Land[y - dx, i]:= Value; end; -procedure ChangeCircleLines(x, y, dx, dy: LongInt; Delta: LongInt); +procedure ChangeCircleLines(x, y, dx, dy: LongInt; doSet: boolean); var i: LongInt; begin -if ((y + dy) and $FFFFFC00) = 0 then - for i:= max(x - dx, 0) to min(x + dx, 2047) do inc(Land[y + dy, i], Delta); -if ((y - dy) and $FFFFFC00) = 0 then - for i:= max(x - dx, 0) to min(x + dx, 2047) do inc(Land[y - dy, i], Delta); -if ((y + dx) and $FFFFFC00) = 0 then - for i:= max(x - dy, 0) to min(x + dy, 2047) do inc(Land[y + dx, i], Delta); -if ((y - dx) and $FFFFFC00) = 0 then - for i:= max(x - dy, 0) to min(x + dy, 2047) do inc(Land[y - dx, i], Delta); +if not doSet then + begin + if ((y + dy) and $FFFFFC00) = 0 then + for i:= max(x - dx, 0) to min(x + dx, 2047) do + if (Land[y + dy, i] > 0) then dec(Land[y + dy, i]); + if ((y - dy) and $FFFFFC00) = 0 then + for i:= max(x - dx, 0) to min(x + dx, 2047) do + if (Land[y - dy, i] > 0) then dec(Land[y - dy, i]); + if ((y + dx) and $FFFFFC00) = 0 then + for i:= max(x - dy, 0) to min(x + dy, 2047) do + if (Land[y + dx, i] > 0) then dec(Land[y + dx, i]); + if ((y - dx) and $FFFFFC00) = 0 then + for i:= max(x - dy, 0) to min(x + dy, 2047) do + if (Land[y - dx, i] > 0) then dec(Land[y - dx, i]); + end else + begin + if ((y + dy) and $FFFFFC00) = 0 then + for i:= max(x - dx, 0) to min(x + dx, 2047) do inc(Land[y + dy, i]); + if ((y - dy) and $FFFFFC00) = 0 then + for i:= max(x - dx, 0) to min(x + dx, 2047) do inc(Land[y - dy, i]); + if ((y + dx) and $FFFFFC00) = 0 then + for i:= max(x - dy, 0) to min(x + dy, 2047) do inc(Land[y + dx, i]); + if ((y - dx) and $FFFFFC00) = 0 then + for i:= max(x - dy, 0) to min(x + dy, 2047) do inc(Land[y - dx, i]); + end end; procedure FillRoundInLand(X, Y, Radius: LongInt; Value: Longword); @@ -83,7 +100,7 @@ if (dx = dy) then FillCircleLines(x, y, dx, dy, Value); end; -procedure ChangeRoundInLand(X, Y, Radius: LongInt; Delta: LongInt); +procedure ChangeRoundInLand(X, Y, Radius: LongInt; doSet: boolean); var dx, dy, d: LongInt; begin dx:= 0; @@ -91,7 +108,7 @@ d:= 3 - 2 * Radius; while (dx < dy) do begin - ChangeCircleLines(x, y, dx, dy, Delta); + ChangeCircleLines(x, y, dx, dy, doSet); if (d < 0) then d:= d + 4 * dx + 6 else begin @@ -100,7 +117,7 @@ end; inc(dx) end; - if (dx = dy) then ChangeCircleLines(x, y, dx, dy, Delta); + if (dx = dy) then ChangeCircleLines(x, y, dx, dy, doSet) end; procedure ClearLandPixel(y, x: LongInt); @@ -277,6 +294,7 @@ tx:= hwRound(X); ty:= hwRound(Y); if ((ty and $FFFFFC00) = 0) and ((tx and $FFFFF800) = 0) then + if Land[ty, tx] = COLOR_LAND then begin Land[ty, tx]:= 0; ClearLandPixel(ty, tx);