diff -r 010ec2fa7d7b -r bced12412f94 hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Wed Nov 30 12:19:10 2011 +0100 +++ b/hedgewars/GSHandlers.inc Wed Nov 30 23:16:44 2011 +0100 @@ -398,7 +398,7 @@ //////////////////////////////////////////////////////////////////////////////// procedure doStepMolotov(Gear: PGear); var - s: Longword; + s: Longword; i, gX, gY: LongInt; dX, dY: hwFloat; smoke, glass: PVisualGear; @@ -4941,8 +4941,12 @@ //////////////////////////////////////////////////////////////////////////////// procedure doStepStructure(Gear: PGear); var - x, y: LongInt; + x, y, i: LongInt; + HH: PHedgehog; + t: PGear; begin + HH:= Gear^.Hedgehog; + if (Gear^.State and gstMoving) <> 0 then begin AddGearCI(Gear); @@ -4951,44 +4955,66 @@ Gear^.State:= Gear^.State and (not gstMoving); end; - if CurAmmoGear = Gear then + dec(Gear^.Health, Gear^.Damage); + Gear^.Damage:= 0; + + if Gear^.Pos = 1 then begin - if (CurrentHedgehog = nil) or (CurrentHedgehog^.Gear = nil) then + AddGearCI(Gear); + AfterAttack; + if Gear = CurAmmoGear then CurAmmoGear:= nil; + if HH^.Gear <> nil then HideHog(HH); + Gear^.Pos:= 2 + end; + + if Gear^.Pos = 2 then + begin + if ((GameTicks mod 100) = 0) and (Gear^.Timer < 1000) then begin - DeleteGear(Gear); - exit + if (Gear^.Timer mod 10) = 0 then + begin + DeleteCI(Gear); + Gear^.Y:= Gear^.Y - _0_5; + AddGearCI(Gear); + end; + inc(Gear^.Timer); end; - if Gear = CurAmmoGear then CurAmmoGear := nil; - Gear^.Hedgehog:= CurrentHedgehog; - RemoveGearFromList(CurrentHedgehog^.Gear); - CurrentHedgehog^.Gear^.Z := cHHZ; - CurrentHedgehog^.Gear^.Active := false; - CurrentHedgehog^.Gear^.State:= CurrentHedgehog^.Gear^.State and (not gstHHDriven); - CurrentHedgehog^.GearHidden:= CurrentHedgehog^.Gear; - CurrentHedgehog^.Gear:= nil; - Gear^.Tag:= TotalRounds + Gear^.Tag; - AddGearCI(Gear); + if Gear^.Tag <= TotalRounds then Gear^.Pos:= 3; end; - - dec(Gear^.Health, Gear^.Damage); - Gear^.Damage := 0; - if (Gear^.Tag = TotalRounds) or (Gear^.Health <= 0) then - begin - if Gear^.Hedgehog <> nil then + if Gear^.Pos = 3 then + if Gear^.Timer < 1000 then + begin + if (Gear^.Timer mod 10) = 0 then + begin + DeleteCI(Gear); + Gear^.Y:= Gear^.Y - _0_5; + AddGearCI(Gear); + end; + inc(Gear^.Timer); + end + else begin - Gear^.Hedgehog^.Gear:= Gear^.Hedgehog^.GearHidden; - Gear^.Hedgehog^.GearHidden:= nil; - Gear^.Hedgehog^.Gear^.X:= Gear^.X; - Gear^.Hedgehog^.Gear^.Y:= Gear^.Y - int2hwFloat(Gear^.Radius + cHHRadius); - InsertGearToList(Gear^.Hedgehog^.Gear); - Gear^.Hedgehog:= nil; - SetAllHHToActive; + if HH^.GearHidden <> nil then RestoreHog(HH); + Gear^.Pos:= 4; end; - end; + + if Gear^.Pos = 4 then + if ((GameTicks mod 1000) = 0) and ((GameFlags And gfInvulnerable) = 0) then + begin + t:= GearsList; + while t <> nil do + begin + if (t^.Kind = gtHedgehog) and (t^.Hedgehog^.Team^.Clan = HH^.Team^.Clan) then + t^.Invulnerable:= true; + t:= t^.NextGear; + end; + end; if Gear^.Health <= 0 then begin + if HH^.GearHidden <> nil then RestoreHog(HH); + x := hwRound(Gear^.X); y := hwRound(Gear^.Y); @@ -5052,10 +5078,10 @@ ((HH^.Gear^.State and (gstMoving or gstHHDeath or gstHHGone)) = 0) then with HH^.Gear^ do begin - State:= State or gstAnimation; - Tag:= 2; - Timer:= 0; - Pos:= 0 + State:= State or gstAnimation; + Tag:= 2; + Timer:= 0; + Pos:= 0 end end; if (Gear^.Pos = 3) and (GameTicks and $1F = 0) and (Gear^.Power > 0) then dec(Gear^.Power);