hedgewars/uGearsHandlersMess.pas
changeset 10145 67b255f839db
parent 10135 8fd3e38bd4f2
child 10164 0570d4b22187
equal deleted inserted replaced
10144:b9d5a91605c7 10145:67b255f839db
  2611 procedure doStepSwitcherWork(Gear: PGear);
  2611 procedure doStepSwitcherWork(Gear: PGear);
  2612 var
  2612 var
  2613     HHGear: PGear;
  2613     HHGear: PGear;
  2614     hedgehog: PHedgehog;
  2614     hedgehog: PHedgehog;
  2615     State: Longword;
  2615     State: Longword;
       
  2616     switchDir: LongInt;
  2616 begin
  2617 begin
  2617     AllInactive := false;
  2618     AllInactive := false;
  2618 
  2619 
  2619     if ((Gear^.Message and (not gmSwitch)) <> 0) or (TurnTimeLeft = 0) then
  2620     if ((Gear^.Message and (not (gmSwitch or gmPrecise))) <> 0) or (TurnTimeLeft = 0) then
  2620         begin
  2621         begin
  2621         hedgehog := Gear^.Hedgehog;
  2622         hedgehog := Gear^.Hedgehog;
  2622         //Msg := Gear^.Message and (not gmSwitch);
  2623         //Msg := Gear^.Message and (not gmSwitch);
  2623         DeleteGear(Gear);
  2624         DeleteGear(Gear);
  2624         ApplyAmmoChanges(hedgehog^);
  2625         ApplyAmmoChanges(hedgehog^);
  2632     if (Gear^.Message and gmSwitch) <> 0 then
  2633     if (Gear^.Message and gmSwitch) <> 0 then
  2633         begin
  2634         begin
  2634         HHGear := CurrentHedgehog^.Gear;
  2635         HHGear := CurrentHedgehog^.Gear;
  2635         HHGear^.Message := HHGear^.Message and (not gmSwitch);
  2636         HHGear^.Message := HHGear^.Message and (not gmSwitch);
  2636         Gear^.Message := Gear^.Message and (not gmSwitch);
  2637         Gear^.Message := Gear^.Message and (not gmSwitch);
       
  2638 
       
  2639         // switching in reverse direction
       
  2640         if (Gear^.Message and gmPrecise) <> 0 then
       
  2641             begin
       
  2642             HHGear^.Message := HHGear^.Message and (not gmPrecise);
       
  2643             switchDir:= CurrentTeam^.HedgehogsNumber - 1;
       
  2644             end
       
  2645         else
       
  2646             switchDir:=  1;
       
  2647 
  2637         State := HHGear^.State;
  2648         State := HHGear^.State;
  2638         HHGear^.State := 0;
  2649         HHGear^.State := 0;
  2639         HHGear^.Z := cHHZ;
  2650         HHGear^.Z := cHHZ;
  2640         HHGear^.Active := false;
  2651         HHGear^.Active := false;
  2641         HHGear^.Message:= HHGear^.Message or gmRemoveFromList or gmAddToList;
  2652         HHGear^.Message:= HHGear^.Message or gmRemoveFromList or gmAddToList;
  2642 
  2653 
  2643         PlaySound(sndSwitchHog);
  2654         PlaySound(sndSwitchHog);
  2644 
  2655 
  2645         repeat
  2656         repeat
  2646             CurrentTeam^.CurrHedgehog := Succ(CurrentTeam^.CurrHedgehog) mod (CurrentTeam^.HedgehogsNumber);
  2657             CurrentTeam^.CurrHedgehog := (CurrentTeam^.CurrHedgehog + switchDir) mod (CurrentTeam^.HedgehogsNumber);
  2647         until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil) and
  2658         until (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear <> nil) and
  2648               (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^.Damage = 0) and
  2659               (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Gear^.Damage = 0) and
  2649               (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen]=0);
  2660               (CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog].Effects[heFrozen]=0);
  2650 
  2661 
  2651         SwitchCurrentHedgehog(@CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog]);
  2662         SwitchCurrentHedgehog(@CurrentTeam^.Hedgehogs[CurrentTeam^.CurrHedgehog]);
  2654         HHGear := CurrentHedgehog^.Gear;
  2665         HHGear := CurrentHedgehog^.Gear;
  2655         HHGear^.State := State;
  2666         HHGear^.State := State;
  2656         HHGear^.Active := true;
  2667         HHGear^.Active := true;
  2657         FollowGear := HHGear;
  2668         FollowGear := HHGear;
  2658         HHGear^.Z := cCurrHHZ;
  2669         HHGear^.Z := cCurrHHZ;
       
  2670         // restore precise key
       
  2671         if (switchDir <> 1) then
       
  2672             HHGear^.Message:= HHGear^.Message or gmPrecise;
  2659         HHGear^.Message:= HHGear^.Message or gmRemoveFromList or gmAddToList;
  2673         HHGear^.Message:= HHGear^.Message or gmRemoveFromList or gmAddToList;
  2660         Gear^.X := HHGear^.X;
  2674         Gear^.X := HHGear^.X;
  2661         Gear^.Y := HHGear^.Y
  2675         Gear^.Y := HHGear^.Y
  2662         end;
  2676         end;
  2663 end;
  2677 end;