hedgewars/uVisualGears.pas
changeset 2985 d268a7fbb868
parent 2982 4213c6a8aceb
child 2986 c0c91cd3f423
equal deleted inserted replaced
2984:f6834fc9fe7b 2985:d268a7fbb868
    35         FrameTicks: Longword;
    35         FrameTicks: Longword;
    36         X : hwFloat;
    36         X : hwFloat;
    37         Y : hwFloat;
    37         Y : hwFloat;
    38         dX: hwFloat;
    38         dX: hwFloat;
    39         dY: hwFloat;
    39         dY: hwFloat;
       
    40         tdX: hwFloat;
       
    41         tdY: hwFloat;
    40         mdY: QWord;
    42         mdY: QWord;
    41         Timer: Longword;
    43         Timer: Longword;
    42         Angle, dAngle: real;
    44         Angle, dAngle: real;
    43         Kind: TVisualGearType;
    45         Kind: TVisualGearType;
    44         doStep: TVGearStepProcedure;
    46         doStep: TVGearStepProcedure;
    51 procedure init_uVisualGears;
    53 procedure init_uVisualGears;
    52 procedure free_uVisualGears;
    54 procedure free_uVisualGears;
    53 
    55 
    54 function  AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear;
    56 function  AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear;
    55 procedure ProcessVisualGears(Steps: Longword);
    57 procedure ProcessVisualGears(Steps: Longword);
       
    58 procedure KickFlakes(dmgRadius, X, Y: LongInt);
    56 procedure DrawVisualGears(Layer: LongWord);
    59 procedure DrawVisualGears(Layer: LongWord);
    57 procedure DeleteVisualGear(Gear: PVisualGear);
    60 procedure DeleteVisualGear(Gear: PVisualGear);
    58 procedure AddClouds;
    61 procedure AddClouds;
    59 procedure AddDamageTag(X, Y, Damage, Color: LongWord);
    62 procedure AddDamageTag(X, Y, Damage, Color: LongWord);
    60 
    63 
    92     if FrameTicks > vobFrameTicks then
    95     if FrameTicks > vobFrameTicks then
    93         begin
    96         begin
    94         dec(FrameTicks, vobFrameTicks);
    97         dec(FrameTicks, vobFrameTicks);
    95         inc(Frame);
    98         inc(Frame);
    96         if Frame = vobFramesCount then Frame:= 0
    99         if Frame = vobFramesCount then Frame:= 0
    97         end
   100         end;
       
   101     X:= X + (cWindSpeed * 200 + dX + tdX) * Steps;
       
   102     Y:= Y + (dY + tdY + cGravity * vobFallSpeed) * Steps;
       
   103     Angle:= Angle + dAngle * Steps;
       
   104   
       
   105     if hwRound(X) < -cScreenWidth - 64 then X:= int2hwFloat(cScreenWidth + LAND_WIDTH) else
       
   106     if hwRound(X) > cScreenWidth + LAND_WIDTH then X:= int2hwFloat(-cScreenWidth - 64);
       
   107     // if hwRound(Y) < (LAND_HEIGHT - 1024 - 75) then Y:= Y + int2hwFloat(25); // For if flag is set for flakes rising upwards?
       
   108     if hwRound(Y) > (LAND_HEIGHT + 75) then Y:= Y - int2hwFloat(1024 + 150); // TODO - configure in theme (jellies for example could use limited range)
       
   109     if (Timer > 0) and (Timer-Steps > 0) then dec(Timer, Steps)
       
   110     else
       
   111         begin
       
   112         Timer:= 0;
       
   113         tdX:= _0;
       
   114         tdY:= _0
       
   115         end;
    98     end;
   116     end;
    99 
   117 
   100 Gear^.X:= Gear^.X + (cWindSpeed * 200 + Gear^.dX) * Steps;
       
   101 Gear^.Y:= Gear^.Y + (Gear^.dY + cGravity * vobFallSpeed) * Steps;
       
   102 Gear^.Angle:= Gear^.Angle + Gear^.dAngle * Steps;
       
   103 
       
   104 if hwRound(Gear^.X) < -cScreenWidth - 64 then Gear^.X:= int2hwFloat(cScreenWidth + LAND_WIDTH) else
       
   105 if hwRound(Gear^.X) > cScreenWidth + LAND_WIDTH then Gear^.X:= int2hwFloat(-cScreenWidth - 64);
       
   106 // if hwRound(Gear^.Y) < (LAND_HEIGHT - 1024 - 75) then Gear^.Y:= Gear^.Y + int2hwFloat(25); // For if flag is set for flakes rising upwards?
       
   107 if hwRound(Gear^.Y) > (LAND_HEIGHT + 75) then Gear^.Y:= Gear^.Y - int2hwFloat(1024 + 150) // TODO - configure in theme (jellies for example could use limited range)
       
   108 end;
   118 end;
   109 
   119 
   110 procedure doStepCloud(Gear: PVisualGear; Steps: Longword);
   120 procedure doStepCloud(Gear: PVisualGear; Steps: Longword);
   111 var i: Longword;
   121 var i: Longword;
   112 begin
   122 begin
   456 gear^.doStep:= doStepHandlers[Kind];
   466 gear^.doStep:= doStepHandlers[Kind];
   457 
   467 
   458 with gear^ do
   468 with gear^ do
   459     case Kind of
   469     case Kind of
   460     vgtFlake: begin
   470     vgtFlake: begin
       
   471                 Timer:= 0;
       
   472                 tdX:= _0;
       
   473                 tdY:= _0;
   461                 FrameTicks:= random(vobFrameTicks);
   474                 FrameTicks:= random(vobFrameTicks);
   462                 Frame:= random(vobFramesCount);
   475                 Frame:= random(vobFramesCount);
   463                 Angle:= random * 360;
   476                 Angle:= random * 360;
   464                 dx.isNegative:= random(2) = 0;
   477                 dx.isNegative:= random(2) = 0;
   465                 dx.QWordValue:= random(100000000);
   478                 dx.QWordValue:= random(100000000);
   591 while t <> nil do
   604 while t <> nil do
   592       begin
   605       begin
   593       Gear:= t;
   606       Gear:= t;
   594       t:= Gear^.NextGear;
   607       t:= Gear^.NextGear;
   595       Gear^.doStep(Gear, Steps)
   608       Gear^.doStep(Gear, Steps)
       
   609       end
       
   610 end;
       
   611 
       
   612 procedure KickFlakes(dmgRadius, X, Y: LongInt);
       
   613 var Gear, t: PVisualGear;
       
   614     dmg: LongInt;
       
   615 begin
       
   616 if dmgRadius = 0 then exit;
       
   617 
       
   618 t:= VisualGearsList;
       
   619 while t <> nil do
       
   620       begin
       
   621       Gear:= t;
       
   622       if Gear^.Kind = vgtFlake then
       
   623           begin
       
   624           // Damage calc from doMakeExplosion
       
   625           dmg:= dmgRadius  + cHHRadius div 2 - hwRound(Distance(Gear^.X - int2hwFloat(X), Gear^.Y - int2hwFloat(Y)));
       
   626           if dmg > 1 then
       
   627               begin
       
   628               Gear^.tdX:= Gear^.dX + SignAs(_0_01 * dmg + cHHKick, Gear^.X - int2hwFloat(X));
       
   629               Gear^.tdY:= Gear^.dY + SignAs(_0_01 * dmg + cHHKick, Gear^.Y - int2hwFloat(Y));
       
   630               Gear^.Timer:= 100
       
   631               end
       
   632           end;
       
   633       t:= Gear^.NextGear
   596       end
   634       end
   597 end;
   635 end;
   598 
   636 
   599 procedure DrawVisualGears(Layer: LongWord);
   637 procedure DrawVisualGears(Layer: LongWord);
   600 var Gear: PVisualGear;
   638 var Gear: PVisualGear;