diff -r be6690c337fb -r 0b62498c201a hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Thu Oct 15 19:38:18 2009 +0000 +++ b/hedgewars/GSHandlers.inc Thu Oct 15 21:47:05 2009 +0000 @@ -228,10 +228,16 @@ if (Gear^.State and gstCollision) <> 0 then begin doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 5, EXPLAutoSound); for i:= 0 to 40 do begin - dX:= AngleCos(i * 16) * _0_5 * (GetRandom + _1); - dY:= AngleSin(i * 16) * _0_5 * (GetRandom + _1); - Fire:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, dX, dY, 0); - Fire^.State:= Fire^.State or gsttmpFlag; + dX:= AngleCos(i * 2) * ((_0_08*(i mod 10))) * (GetRandom + _1); + dY:= AngleSin(i * 8) * _0_5 * (GetRandom + _1); + Fire:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, dX, dY, 0); + Fire^.State:= Fire^.State or gsttmpFlag; + Fire:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, dX, -dY, 0); + Fire^.State:= Fire^.State or gsttmpFlag; + Fire:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, -dX, dY, 0); + Fire^.State:= Fire^.State or gsttmpFlag; + Fire:= AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, -dX, -dY, 0); + Fire^.State:= Fire^.State or gsttmpFlag; end; DeleteGear(Gear); exit @@ -1215,19 +1221,28 @@ if (Gear^.Tag = 0) and (Gear^.Timer < 1000) then inc(Gear^.Timer) else if Gear^.Tag = 1 then - if Gear^.Timer > 0 then - dec(Gear^.Timer) - else - begin - TrainingTargetGear:= AddGear(0, 0, gtTarget, 0, _0, _0, 0); - FindPlace(TrainingTargetGear, false, 0, LAND_WIDTH); + begin + Gear^.Tag:= 2; + if (TrainingFlags and tfTimeTrial) <> 0 then + begin inc(TurnTimeLeft, TrainingTimeInc); if TrainingTimeInc > TrainingTimeInM then dec(TrainingTimeInc, TrainingTimeInD); if TurnTimeLeft > TrainingTimeMax then TurnTimeLeft:= TrainingTimeMax; - + end; + end +else if Gear^.Tag = 2 then + if Gear^.Timer > 0 then + dec(Gear^.Timer) + else + begin + if (TrainingFlags and tfTargetRespawn) <> 0 then + begin + TrainingTargetGear:= AddGear(0, 0, gtTarget, 0, _0, _0, 0); + FindPlace(TrainingTargetGear, false, 0, LAND_WIDTH); + end; DeleteGear(Gear); exit; end; @@ -1291,10 +1306,11 @@ begin if hwAbs(Gear^.dX) > _0_01 then Gear^.dX:= Gear^.dX * _0_995; - + if (Gear^.State and gsttmpFlag) <> 0 then Gear^.dY:= Gear^.dY + _2*cGravity else Gear^.dY:= Gear^.dY + cGravity; if hwAbs(Gear^.dY) > _0_2 then Gear^.dY:= Gear^.dY * _0_995; + if (Gear^.State and gsttmpFlag) <> 0 then Gear^.X:= Gear^.X + Gear^.dX else Gear^.X:= Gear^.X + Gear^.dX + cWindSpeed * 640; Gear^.Y:= Gear^.Y + Gear^.dY; @@ -2252,7 +2268,7 @@ t:= CheckGearNear(Gear, gtTarget, 36, 36); if t <> nil then begin - if t^.Tag = 1 then // collect it only once + if t^.Tag <> 0 then // collect it only once exit; PlaySound(sndShotgunReload, false, nil); t^.Tag:= 1; @@ -2262,33 +2278,11 @@ if (TurnTimeLeft > 0) then dec(TurnTimeLeft) - else - begin - if ((TrainingFlags and tfTimeTrial) <>0) and (TimeTrialStopTime = 0) then TimeTrialStopTime:= RealTicks; - StopSound(sndRCPlane); - ResumeMusic; - doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 25, EXPLAutoSound); - for i:= 0 to 32 do - begin - dX:= AngleCos(i * 64) * _0_5 * (GetRandom + _1); - dY:= AngleSin(i * 64) * _0_5 * (GetRandom + _1); - AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, dX, dY, 0); - AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtFlame, 0, dX, -dY, 0); - end; - DeleteGear(Gear); - AfterAttack; - TurnTimeLeft:= 0; - CurAmmoGear:= nil; - HHGear^.Message:= 0; - ParseCommand('/taunt '#1, true); - exit; - end; - end; CheckCollision(Gear); -if ((Gear^.State and gstCollision) <> 0) +if ((Gear^.State and gstCollision) <> 0) or (((TrainingFlags and tfRCPlane) <> 0) and (TurnTimeLeft = 0)) or CheckGearDrowning(Gear) then begin if ((TrainingFlags and tfRCPlane) <> 0) and ((TrainingFlags and tfTimeTrial) <> 0 ) and (TimeTrialStopTime = 0) then TimeTrialStopTime:= RealTicks; @@ -2296,7 +2290,7 @@ StopSound(sndRideOfTheValkyries); ResumeMusic; - if ((Gear^.State and gstCollision) <> 0) then + if ((Gear^.State and gstCollision) <> 0) or (((TrainingFlags and tfRCPlane) <> 0) and (TurnTimeLeft = 0)) then begin doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 25, EXPLAutoSound); for i:= 0 to 32 do @@ -2312,6 +2306,10 @@ AfterAttack; CurAmmoGear:= nil; TurnTimeLeft:= 14 * 125; + + if (TrainingFlags and tfRCPlane) <> 0 then + TurnTimeLeft:= 0; // HACK: RCPlane training allows unlimited plane starts in last 2 seconds + HHGear^.Message:= 0; ParseCommand('/taunt '#1, true) end