hedgewars/uGearsHandlers.pas
changeset 9969 f27921b31b61
parent 9706 5178d2263521
child 9998 736015b847e3
equal deleted inserted replaced
9967:40750e72514b 9969:f27921b31b61
    21 unit uGearsHandlers;
    21 unit uGearsHandlers;
    22 interface
    22 interface
    23 
    23 
    24 uses uTypes;
    24 uses uTypes;
    25 
    25 
    26 procedure cakeStep(Gear: PGear);
    26 function cakeStep(Gear: PGear): boolean;
    27 
    27 
    28 implementation
    28 implementation
    29 
    29 
    30 uses SDLh, uFloat, uCollisions;
    30 uses SDLh, uFloat, uCollisions;
    31 
    31 
    33 
    33 
    34 const dirs: array[0..3] of TPoint =   ((X: 0; Y: -1), (X: 1; Y: 0),(X: 0; Y: 1),(X: -1; Y: 0));
    34 const dirs: array[0..3] of TPoint =   ((X: 0; Y: -1), (X: 1; Y: 0),(X: 0; Y: 1),(X: -1; Y: 0));
    35 
    35 
    36 procedure PrevAngle(Gear: PGear; dA: LongInt); inline;
    36 procedure PrevAngle(Gear: PGear; dA: LongInt); inline;
    37 begin
    37 begin
       
    38     inc(Gear^.WDTimer);
    38     Gear^.Angle := (LongInt(Gear^.Angle) - dA) and 3
    39     Gear^.Angle := (LongInt(Gear^.Angle) - dA) and 3
    39 end;
    40 end;
    40 
    41 
    41 procedure NextAngle(Gear: PGear; dA: LongInt); inline;
    42 procedure NextAngle(Gear: PGear; dA: LongInt); inline;
    42 begin
    43 begin
       
    44     inc(Gear^.WDTimer);
    43     Gear^.Angle := (LongInt(Gear^.Angle) + dA) and 3
    45     Gear^.Angle := (LongInt(Gear^.Angle) + dA) and 3
    44 end;
    46 end;
    45 
    47 
    46 procedure cakeStep(Gear: PGear);
    48 function cakeStep(Gear: PGear): boolean;
    47 var
    49 var
    48     xx, yy, xxn, yyn: LongInt;
    50     xx, yy, xxn, yyn: LongInt;
    49     dA: LongInt;
    51     dA: LongInt;
    50 begin
    52 begin
    51     dA := hwSign(Gear^.dX);
    53     dA := hwSign(Gear^.dX);
    55     yyn := dirs[(LongInt(Gear^.Angle) + dA) and 3].y;
    57     yyn := dirs[(LongInt(Gear^.Angle) + dA) and 3].y;
    56 
    58 
    57     if (xx = 0) then
    59     if (xx = 0) then
    58         if TestCollisionYwithGear(Gear, yy) <> 0 then
    60         if TestCollisionYwithGear(Gear, yy) <> 0 then
    59             PrevAngle(Gear, dA)
    61             PrevAngle(Gear, dA)
    60     else
    62         else
    61         begin
       
    62         Gear^.Tag := 0;
       
    63         Gear^.Y := Gear^.Y + int2hwFloat(yy);
       
    64         if TestCollisionXwithGear(Gear, xxn) = 0 then
       
    65             begin
    63             begin
    66             Gear^.X := Gear^.X + int2hwFloat(xxn);
    64             Gear^.Tag := 0;
    67             NextAngle(Gear, dA)
    65 
       
    66             if TestCollisionXwithGear(Gear, xxn) <> 0 then
       
    67                 Gear^.WDTimer:= 0;
       
    68 
       
    69             Gear^.Y := Gear^.Y + int2hwFloat(yy);
       
    70             if TestCollisionXwithGear(Gear, xxn) = 0 then
       
    71                 begin
       
    72                 Gear^.X := Gear^.X + int2hwFloat(xxn);
       
    73                 NextAngle(Gear, dA)
       
    74                 end
    68             end;
    75             end;
    69         end;
       
    70 
    76 
    71     if (yy = 0) then
    77     if (yy = 0) then
    72         if TestCollisionXwithGear(Gear, xx) <> 0 then
    78         if TestCollisionXwithGear(Gear, xx) <> 0 then
    73             PrevAngle(Gear, dA)
    79             PrevAngle(Gear, dA)
    74     else
    80         else
    75         begin
       
    76         Gear^.Tag := 0;
       
    77         Gear^.X := Gear^.X + int2hwFloat(xx);
       
    78         if TestCollisionYwithGear(Gear, yyn) = 0 then
       
    79             begin
    81             begin
    80             Gear^.Y := Gear^.Y + int2hwFloat(yyn);
    82             Gear^.Tag := 0;
    81             NextAngle(Gear, dA)
    83 
       
    84             if TestCollisionYwithGear(Gear, yyn) <> 0 then
       
    85                 Gear^.WDTimer:= 0;
       
    86 
       
    87             Gear^.X := Gear^.X + int2hwFloat(xx);
       
    88             if TestCollisionYwithGear(Gear, yyn) = 0 then
       
    89                 begin
       
    90                 Gear^.Y := Gear^.Y + int2hwFloat(yyn);
       
    91                 NextAngle(Gear, dA)
       
    92                 end
    82             end;
    93             end;
    83         end;
    94 
       
    95     cakeStep:= Gear^.WDTimer < 4
    84 end;
    96 end;
    85 
    97 
    86 end.
    98 end.