hedgewars/uVisualGears.pas
changeset 1045 ea195268734f
parent 1041 362b95d49cf4
child 1046 c22d833c3ae2
equal deleted inserted replaced
1044:f759aae1062f 1045:ea195268734f
    38              doStep: TVGearStepProcedure;
    38              doStep: TVGearStepProcedure;
    39              end;
    39              end;
    40 
    40 
    41 function  AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear;
    41 function  AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear;
    42 procedure ProcessVisualGears(Steps: Longword);
    42 procedure ProcessVisualGears(Steps: Longword);
    43 procedure DrawVisualGears();
    43 procedure DrawVisualGears(Layer: LongWord);
    44 procedure DeleteVisualGear(Gear: PVisualGear);
    44 procedure DeleteVisualGear(Gear: PVisualGear);
    45 procedure AddClouds;
    45 procedure AddClouds;
    46 
    46 
    47 var VisualGearsList: PVisualGear = nil;
    47 var VisualGearsList: PVisualGear = nil;
    48     vobFrameTicks, vobFramesCount: Longword;
    48     vobFrameTicks, vobFramesCount: Longword;
    49     vobVelocity, vobFallSpeed: LongInt;
    49     vobVelocity, vobFallSpeed: LongInt;
    50 
    50 
    51 implementation
    51 implementation
    52 uses uWorld, uMisc, uStore;
    52 uses uWorld, uMisc, uStore;
       
    53 const cExplFrameTicks = 80;
    53 
    54 
    54 // ==================================================================
    55 // ==================================================================
    55 procedure doStepFlake(Gear: PVisualGear; Steps: Longword);
    56 procedure doStepFlake(Gear: PVisualGear; Steps: Longword);
    56 begin
    57 begin
    57 with Gear^ do
    58 with Gear^ do
    91 Gear^.X:= Gear^.X + Gear^.dX;
    92 Gear^.X:= Gear^.X + Gear^.dX;
    92 
    93 
    93 Gear^.Y:= Gear^.Y + Gear^.dY;
    94 Gear^.Y:= Gear^.Y + Gear^.dY;
    94 Gear^.dY:= Gear^.dY + cGravity;
    95 Gear^.dY:= Gear^.dY + cGravity;
    95 
    96 
    96 dec(Gear^.FrameTicks);
    97 if Gear^.FrameTicks <= Steps then
    97 if Gear^.FrameTicks = 0 then DeleteVisualGear(Gear)
    98 	if Gear^.Frame = 0 then DeleteVisualGear(Gear)
       
    99 	else
       
   100 		begin
       
   101 		dec(Gear^.Frame);
       
   102 		Gear^.FrameTicks:= cExplFrameTicks
       
   103 		end
       
   104 	else dec(Gear^.FrameTicks, Steps)
    98 end;
   105 end;
    99 
   106 
   100 // ==================================================================
   107 // ==================================================================
   101 const doStepHandlers: array[TVisualGearType] of TVGearStepProcedure =
   108 const doStepHandlers: array[TVisualGearType] of TVGearStepProcedure =
   102                         (
   109                         (
   105                           @doStepExpl
   112                           @doStepExpl
   106                         );
   113                         );
   107 
   114 
   108 function  AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear;
   115 function  AddVisualGear(X, Y: LongInt; Kind: TVisualGearType): PVisualGear;
   109 var Result: PVisualGear;
   116 var Result: PVisualGear;
       
   117 	t: Longword;
       
   118 	sp: hwFloat;
   110 begin
   119 begin
   111 New(Result);
   120 New(Result);
   112 FillChar(Result^, sizeof(TVisualGear), 0);
   121 FillChar(Result^, sizeof(TVisualGear), 0);
   113 Result^.X:= int2hwFloat(X);
   122 Result^.X:= int2hwFloat(X);
   114 Result^.Y:= int2hwFloat(Y);
   123 Result^.Y:= int2hwFloat(Y);
   136                dy.QWordValue:= 21474836 + random(64424509);
   145                dy.QWordValue:= 21474836 + random(64424509);
   137                mdY:= dy.QWordValue
   146                mdY:= dy.QWordValue
   138                end;
   147                end;
   139   vgtExplPart: with Result^ do
   148   vgtExplPart: with Result^ do
   140                begin
   149                begin
       
   150                t:= random(1024);
       
   151                sp:= _0_001 * (random(700) + 150);
       
   152                dx:= AngleSin(t) * sp;
   141                dx.isNegative:= random(2) = 0;
   153                dx.isNegative:= random(2) = 0;
   142                dx.QWordValue:= random(300000) + 1000000;
   154                dy:= AngleCos(t) * sp;
   143                dy.isNegative:= random(2) = 0;
   155                dy.isNegative:= random(2) = 0;
   144                dy.QWordValue:= random(300000) + 1000000;
   156                Frame:= 7 - random(3);
   145                FrameTicks:= 700
   157                FrameTicks:= cExplFrameTicks
   146                end;
   158                end;
   147      end;
   159      end;
   148 
   160 
   149 if VisualGearsList <> nil then
   161 if VisualGearsList <> nil then
   150    begin
   162    begin
   177       t:= Gear^.NextGear;
   189       t:= Gear^.NextGear;
   178       Gear^.doStep(Gear, Steps)
   190       Gear^.doStep(Gear, Steps)
   179       end
   191       end
   180 end;
   192 end;
   181 
   193 
   182 procedure DrawVisualGears();
   194 procedure DrawVisualGears(Layer: LongWord);
   183 var Gear: PVisualGear;
   195 var Gear: PVisualGear;
   184 begin
   196 begin
   185 Gear:= VisualGearsList;
   197 Gear:= VisualGearsList;
   186 while Gear <> nil do
   198 case Layer of
   187       begin
   199 	0: while Gear <> nil do
   188       case Gear^.Kind of
   200 		begin
   189            vgtFlake: if vobVelocity = 0 then
   201 		case Gear^.Kind of
   190                         DrawSprite(sprFlake, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Frame)
   202 			vgtFlake: if vobVelocity = 0 then
   191                      else
   203 						DrawSprite(sprFlake, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Frame)
   192                         DrawRotatedF(sprFlake, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
   204 					else
   193 
   205 						DrawRotatedF(sprFlake, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
   194            vgtCloud: DrawSprite(sprCloud, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Frame);
   206 			vgtCloud: DrawSprite(sprCloud, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Frame);
   195               end;
   207 			end;
   196       Gear:= Gear^.NextGear
   208 		Gear:= Gear^.NextGear
   197       end;
   209 		end;
       
   210 	1: while Gear <> nil do
       
   211 		begin
       
   212 		case Gear^.Kind of
       
   213 			vgtExplPart: DrawSprite(sprExplPart, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 7 - Gear^.Frame);
       
   214 			end;
       
   215 		Gear:= Gear^.NextGear
       
   216 		end
       
   217 	end
   198 end;
   218 end;
   199 
   219 
   200 procedure AddClouds;
   220 procedure AddClouds;
   201 var i: LongInt;
   221 var i: LongInt;
   202 begin
   222 begin