diff -r ae2950c5465c -r 0e27949850e3 hedgewars/uGears.pas --- a/hedgewars/uGears.pas Sun Jan 15 23:56:47 2006 +0000 +++ b/hedgewars/uGears.pas Thu Jan 19 21:12:20 2006 +0000 @@ -50,7 +50,7 @@ Kind: TGearType; Pos: Longword; doStep: TGearStepProcedure; - HalfWidth, HalfHeight: integer; + Radius: integer; Angle, Power : Cardinal; DirAngle: real; Timer : LongWord; @@ -89,7 +89,7 @@ procedure DeleteGear(Gear: PGear); forward; procedure doMakeExplosion(X, Y, Radius: integer; Mask: LongWord); forward; -procedure AmmoShove(Ammo, Gear: PGear; Power: Longword); forward; +procedure AmmoShove(Ammo: PGear; Power: integer); forward; function CheckGearNear(Gear: PGear; Kind: TGearType; rX, rY: integer): PGear; forward; procedure SpawnBoxOfSmth; forward; procedure AfterAttack; forward; @@ -137,47 +137,40 @@ Result.Hedgehog:= @CurrentTeam.Hedgehogs[CurrentTeam.CurrHedgehog]; case Kind of gtAmmo_Bomb: begin - Result.HalfWidth:= 4; - Result.HalfHeight:= 4; + Result.Radius:= 4; Result.Elasticity:= 0.6; Result.Friction:= 0.995; Result.Timer:= Timer end; gtHedgehog: begin - Result.HalfWidth:= 6; - Result.HalfHeight:= cHHHalfHeight; + Result.Radius:= cHHRadius; Result.Elasticity:= 0.002; Result.Friction:= 0.999; end; gtAmmo_Grenade: begin - Result.HalfWidth:= 4; - Result.HalfHeight:= 4; + Result.Radius:= 4; end; gtHealthTag: begin Result.Timer:= 1500; end; gtGrave: begin - Result.HalfWidth:= 10; - Result.HalfHeight:= 10; + Result.Radius:= 10; Result.Elasticity:= 0.6; end; gtUFO: begin - Result.HalfWidth:= 5; - Result.HalfHeight:= 2; + Result.Radius:= 5; Result.Timer:= 500; Result.Elasticity:= 0.9 end; gtShotgunShot: begin Result.Timer:= 900; - Result.HalfWidth:= 2; - Result.HalfHeight:= 2 + Result.Radius:= 2 end; gtActionTimer: begin Result.Timer:= Timer end; gtPickHammer: begin - Result.HalfWidth:= 10; - Result.HalfHeight:= 2; + Result.Radius:= 10; Result.Timer:= 4000 end; gtSmokeTrace: begin @@ -186,8 +179,7 @@ Result.State:= 8 end; gtRope: begin - Result.HalfWidth:= 3; - Result.HalfHeight:= 3; + Result.Radius:= 3; Result.Friction:= 500; RopePoints.Count:= 0; end; @@ -196,25 +188,22 @@ Result.Y:= Result.Y - 25; end; gtMine: begin - Result.HalfWidth:= 3; - Result.HalfHeight:= 3; + Result.Radius:= 3; Result.Elasticity:= 0.55; Result.Friction:= 0.995; Result.Timer:= 3000; end; gtCase: begin - Result.HalfWidth:= 14; - Result.HalfHeight:= 14; + Result.Radius:= 14; Result.Elasticity:= 0.6 end; gtDEagleShot: begin - Result.HalfWidth:= 1; - Result.HalfHeight:= 1; + Result.Radius:= 1; + Result.Radius:= 1; Result.Health:= 50 end; gtDynamite: begin - Result.HalfWidth:= 3; - Result.HalfHeight:= 3; + Result.Radius:= 3; Result.Elasticity:= 0.03; Result.Friction:= 0.03; Result.Timer:= 5000; @@ -231,7 +220,7 @@ procedure DeleteGear(Gear: PGear); var team: PTeam; begin -if Gear.CollIndex < High(Longword) then DeleteCR(Gear); +if Gear.CollIndex < High(Longword) then DeleteCI(Gear); if Gear.Kind = gtHedgehog then if CurAmmoGear <> nil then begin @@ -579,19 +568,28 @@ end end; -procedure AmmoShove(Ammo, Gear: PGear; Power: Longword); +procedure AmmoShove(Ammo: PGear; Power: integer); +var t: PGearArray; + i: integer; begin -case Gear.Kind of - gtHedgehog, - gtMine, - gtCase: begin - inc(Gear.Damage, Power); - Gear.dX:= Ammo.dX * Power * 0.01; - Gear.dY:= Ammo.dY * Power * 0.01; - Gear.Active:= true; - FollowGear:= Gear - end; - end; +t:= CheckGearsCollision(Ammo); +i:= t.Count; +while i > 0 do + begin + dec(i); + case t.ar[i].Kind of + gtHedgehog, + gtMine, + gtCase: begin + inc(t.ar[i].Damage, Power); + t.ar[i].dX:= Ammo.dX * Power * 0.01; + t.ar[i].dY:= Ammo.dY * Power * 0.01; + t.ar[i].Active:= true; + DeleteCI(t.ar[i]); + FollowGear:= t.ar[i] + end; + end + end end; procedure AssignHHCoords; @@ -676,7 +674,7 @@ begin inc(y); i:= x - 13; - while (i <= x + 13) and not b do // 13 is gtCase HalfWidth-1 + while (i <= x + 13) and not b do // 13 is gtCase Radius-1 begin if Land[y, i] <> 0 then begin