hedgewars/uVisualGears.pas
changeset 6580 6155187bf599
parent 6553 91365db8b82c
child 6700 e04da46ee43c
equal deleted inserted replaced
6579:fc52f7c22c9b 6580:6155187bf599
   118     t: Longword;
   118     t: Longword;
   119     sp: real;
   119     sp: real;
   120 begin
   120 begin
   121 AddVisualGear:= nil;
   121 AddVisualGear:= nil;
   122 if ((GameType = gmtSave) or (fastUntilLag and (GameType = gmtNet))) and // we are scrolling now
   122 if ((GameType = gmtSave) or (fastUntilLag and (GameType = gmtNet))) and // we are scrolling now
   123    ((Kind <> vgtCloud) and (not Critical)) then exit;
   123    ((Kind <> vgtCloud) and (not Critical)) then
       
   124        exit;
   124 
   125 
   125 if ((cReducedQuality and rqAntiBoom) <> 0) and
   126 if ((cReducedQuality and rqAntiBoom) <> 0) and
   126    (not Critical) and
   127    (not Critical) and
   127    (not (Kind in
   128    (not (Kind in
   128    [vgtTeamHealthSorter,
   129    [vgtTeamHealthSorter,
   131     vgtHealthTag,
   132     vgtHealthTag,
   132     vgtExplosion,
   133     vgtExplosion,
   133     vgtSmokeTrace,
   134     vgtSmokeTrace,
   134     vgtEvilTrace,
   135     vgtEvilTrace,
   135     vgtNote,
   136     vgtNote,
   136     vgtSmoothWindBar])) then exit;
   137     vgtSmoothWindBar])) then
       
   138     
       
   139         exit;
   137 
   140 
   138 inc(VGCounter);
   141 inc(VGCounter);
   139 New(gear);
   142 New(gear);
   140 FillChar(gear^, sizeof(TVisualGear), 0);
   143 FillChar(gear^, sizeof(TVisualGear), 0);
   141 gear^.X:= real(X);
   144 gear^.X:= real(X);
   147 gear^.uid:= VGCounter;
   150 gear^.uid:= VGCounter;
   148 gear^.Layer:= 0;
   151 gear^.Layer:= 0;
   149 
   152 
   150 with gear^ do
   153 with gear^ do
   151     case Kind of
   154     case Kind of
   152     vgtFlake: begin
   155     vgtFlake:
       
   156                 begin
   153                 Timer:= 0;
   157                 Timer:= 0;
   154                 tdX:= 0;
   158                 tdX:= 0;
   155                 tdY:= 0;
   159                 tdY:= 0;
   156                 Scale:= 1.0;
   160                 Scale:= 1.0;
   157                 if SuddenDeathDmg then
   161                 if SuddenDeathDmg then
   165                     Frame:= random(vobFramesCount);
   169                     Frame:= random(vobFramesCount);
   166                     end;
   170                     end;
   167                 Angle:= random * 360;
   171                 Angle:= random * 360;
   168                 dx:= 0.0000038654705 * random(10000);
   172                 dx:= 0.0000038654705 * random(10000);
   169                 dy:= 0.000003506096 * random(7000);
   173                 dy:= 0.000003506096 * random(7000);
   170                 if random(2) = 0 then dx := -dx;
   174                 if random(2) = 0 then
   171                 if SuddenDeathDmg then dAngle:= (random(2) * 2 - 1) * (1 + random) * vobSDVelocity / 1000
   175                     dx := -dx;
   172                 else dAngle:= (random(2) * 2 - 1) * (1 + random) * vobVelocity / 1000
   176                 if SuddenDeathDmg then
   173                 end;
   177                     dAngle:= (random(2) * 2 - 1) * (1 + random) * vobSDVelocity / 1000
   174     vgtCloud: begin
   178                 else
       
   179                     dAngle:= (random(2) * 2 - 1) * (1 + random) * vobVelocity / 1000
       
   180                 end;
       
   181     vgtCloud:
       
   182                 begin
   175                 Frame:= random(4);
   183                 Frame:= random(4);
   176                 dx:= 0.5 + 0.1 * random(5); // how much the cloud will be affected by wind
   184                 dx:= 0.5 + 0.1 * random(5); // how much the cloud will be affected by wind
   177                 timer:= random(4096);
   185                 timer:= random(4096);
   178                 Scale:= 1.0
   186                 Scale:= 1.0
   179                 end;
   187                 end;
   180     vgtExplPart,
   188     vgtExplPart,
   181     vgtExplPart2: begin
   189     vgtExplPart2:
       
   190                 begin
   182                 t:= random(1024);
   191                 t:= random(1024);
   183                 sp:= 0.001 * (random(95) + 70);
   192                 sp:= 0.001 * (random(95) + 70);
   184                 dx:= hwFloat2Float(AngleSin(t)) * sp;
   193                 dx:= hwFloat2Float(AngleSin(t)) * sp;
   185                 dy:= hwFloat2Float(AngleCos(t)) * sp;
   194                 dy:= hwFloat2Float(AngleCos(t)) * sp;
   186                 if random(2) = 0 then dx := -dx;
   195                 if random(2) = 0 then
   187                 if random(2) = 0 then dy := -dy;
   196                     dx := -dx;
       
   197                 if random(2) = 0 then
       
   198                     dy := -dy;
   188                 Frame:= 7 - random(3);
   199                 Frame:= 7 - random(3);
   189                 FrameTicks:= cExplFrameTicks
   200                 FrameTicks:= cExplFrameTicks
   190                 end;
   201                 end;
   191         vgtFire: begin
   202         vgtFire:
       
   203                 begin
   192                 t:= random(1024);
   204                 t:= random(1024);
   193                 sp:= 0.001 * (random(85) + 95);
   205                 sp:= 0.001 * (random(85) + 95);
   194                 dx:= hwFloat2Float(AngleSin(t)) * sp;
   206                 dx:= hwFloat2Float(AngleSin(t)) * sp;
   195                 dy:= hwFloat2Float(AngleCos(t)) * sp;
   207                 dy:= hwFloat2Float(AngleCos(t)) * sp;
   196                 if random(2) = 0 then dx := -dx;
   208                 if random(2) = 0 then
   197                 if random(2) = 0 then dy := -dy;
   209                     dx := -dx;
       
   210                 if random(2) = 0 then
       
   211                     dy := -dy;
   198                 FrameTicks:= 650 + random(250);
   212                 FrameTicks:= 650 + random(250);
   199                 Frame:= random(8)
   213                 Frame:= random(8)
   200                 end;
   214                 end;
   201          vgtEgg: begin
   215          vgtEgg:
       
   216                 begin
   202                 t:= random(1024);
   217                 t:= random(1024);
   203                 sp:= 0.001 * (random(85) + 95);
   218                 sp:= 0.001 * (random(85) + 95);
   204                 dx:= hwFloat2Float(AngleSin(t)) * sp;
   219                 dx:= hwFloat2Float(AngleSin(t)) * sp;
   205                 dy:= hwFloat2Float(AngleCos(t)) * sp;
   220                 dy:= hwFloat2Float(AngleCos(t)) * sp;
   206                 if random(2) = 0 then dx := -dx;
   221                 if random(2) = 0 then
   207                 if random(2) = 0 then dy := -dy;
   222                     dx := -dx;
       
   223                 if random(2) = 0 then
       
   224                     dy := -dy;
   208                 FrameTicks:= 650 + random(250);
   225                 FrameTicks:= 650 + random(250);
   209                 Frame:= 1
   226                 Frame:= 1
   210                 end;
   227                 end;
   211         vgtShell: FrameTicks:= 500;
   228         vgtShell: FrameTicks:= 500;
   212     vgtSmallDamageTag: begin
   229     vgtSmallDamageTag:
       
   230                 begin
   213                 gear^.FrameTicks:= 1100
   231                 gear^.FrameTicks:= 1100
   214                 end;
   232                 end;
   215     vgtBubble: begin
   233     vgtBubble:
       
   234                 begin
   216                 dx:= 0.0000038654705 * random(10000);
   235                 dx:= 0.0000038654705 * random(10000);
   217                 dy:= 0;
   236                 dy:= 0;
   218                 if random(2) = 0 then dx := -dx;
   237                 if random(2) = 0 then
       
   238                     dx := -dx;
   219                 FrameTicks:= 250 + random(1751);
   239                 FrameTicks:= 250 + random(1751);
   220                 Frame:= random(5)
   240                 Frame:= random(5)
   221                 end;
   241                 end;
   222     vgtSteam: begin
   242     vgtSteam:
       
   243                 begin
   223                 dx:= 0.0000038654705 * random(10000);
   244                 dx:= 0.0000038654705 * random(10000);
   224                 dy:= 0.001 * (random(85) + 95);
   245                 dy:= 0.001 * (random(85) + 95);
   225                 if random(2) = 0 then dx := -dx;
   246                 if random(2) = 0 then
       
   247                     dx := -dx;
   226                 Frame:= 7 - random(3);
   248                 Frame:= 7 - random(3);
   227                 FrameTicks:= cExplFrameTicks * 2;
   249                 FrameTicks:= cExplFrameTicks * 2;
   228                 end;
   250                 end;
   229     vgtAmmo: begin
   251     vgtAmmo:
       
   252                 begin
   230                 alpha:= 1.0;
   253                 alpha:= 1.0;
   231                 scale:= 1.0
   254                 scale:= 1.0
   232                 end;
   255                 end;
   233   vgtSmokeWhite,
   256   vgtSmokeWhite,
   234   vgtSmoke: begin
   257   vgtSmoke:
       
   258                 begin
   235                 Scale:= 1.0;
   259                 Scale:= 1.0;
   236                 dx:= 0.0002 * (random(45) + 10);
   260                 dx:= 0.0002 * (random(45) + 10);
   237                 dy:= 0.0002 * (random(45) + 10);
   261                 dy:= 0.0002 * (random(45) + 10);
   238                 if random(2) = 0 then dx := -dx;
   262                 if random(2) = 0 then
       
   263                     dx := -dx;
   239                 Frame:= 7 - random(2);
   264                 Frame:= 7 - random(2);
   240                 FrameTicks:= cExplFrameTicks * 2;
   265                 FrameTicks:= cExplFrameTicks * 2;
   241                 end;
   266                 end;
   242   vgtDust: begin
   267   vgtDust:
       
   268                 begin
   243                 dx:= 0.005 * (random(15) + 10);
   269                 dx:= 0.005 * (random(15) + 10);
   244                 dy:= 0.001 * (random(40) + 20);
   270                 dy:= 0.001 * (random(40) + 20);
   245                 if random(2) = 0 then dx := -dx;
   271                 if random(2) = 0 then
       
   272                     dx := -dx;
   246                 Frame:= 7 - random(2);
   273                 Frame:= 7 - random(2);
   247                 FrameTicks:= random(20) + 15;
   274                 FrameTicks:= random(20) + 15;
   248                 end;
   275                 end;
   249   vgtSplash: begin
   276   vgtSplash:
       
   277                 begin
   250                 dx:= 0;
   278                 dx:= 0;
   251                 dy:= 0;
   279                 dy:= 0;
   252                 FrameTicks:= 740;
   280                 FrameTicks:= 740;
   253                 Frame:= 19;
   281                 Frame:= 19;
   254                 end;
   282                 end;
   255     vgtDroplet: begin
   283     vgtDroplet:
       
   284                 begin
   256                 dx:= 0.001 * (random(75) + 15);
   285                 dx:= 0.001 * (random(75) + 15);
   257                 dy:= -0.001 * (random(80) + 120);
   286                 dy:= -0.001 * (random(80) + 120);
   258                 if random(2) = 0 then dx := -dx;
   287                 if random(2) = 0 then
       
   288                     dx := -dx;
   259                 FrameTicks:= 250 + random(1751);
   289                 FrameTicks:= 250 + random(1751);
   260                 Frame:= random(3)
   290                 Frame:= random(3)
   261                 end;
   291                 end;
   262    vgtBeeTrace: begin
   292    vgtBeeTrace:
       
   293                 begin
   263                 FrameTicks:= 1000;
   294                 FrameTicks:= 1000;
   264                 Frame:= random(16);
   295                 Frame:= random(16);
   265                 end;
   296                 end;
   266     vgtSmokeRing: begin
   297     vgtSmokeRing:
       
   298                 begin
   267                 dx:= 0;
   299                 dx:= 0;
   268                 dy:= 0;
   300                 dy:= 0;
   269                 FrameTicks:= 600;
   301                 FrameTicks:= 600;
   270                 Timer:= 0;
   302                 Timer:= 0;
   271                 Frame:= 0;
   303                 Frame:= 0;
   272                 scale:= 0.6;
   304                 scale:= 0.6;
   273                 alpha:= 1;
   305                 alpha:= 1;
   274                 angle:= random(360);
   306                 angle:= random(360);
   275                 end;
   307                 end;
   276      vgtFeather: begin
   308      vgtFeather:
       
   309                 begin
   277                 t:= random(1024);
   310                 t:= random(1024);
   278                 sp:= 0.001 * (random(85) + 95);
   311                 sp:= 0.001 * (random(85) + 95);
   279                 dx:= hwFloat2Float(AngleSin(t)) * sp;
   312                 dx:= hwFloat2Float(AngleSin(t)) * sp;
   280                 dy:= hwFloat2Float(AngleCos(t)) * sp;
   313                 dy:= hwFloat2Float(AngleCos(t)) * sp;
   281                 if random(2) = 0 then dx := -dx;
   314                 if random(2) = 0 then
   282                 if random(2) = 0 then dy := -dy;
   315                     dx := -dx;
       
   316                 if random(2) = 0 then
       
   317                     dy := -dy;
   283                 FrameTicks:= 650 + random(250);
   318                 FrameTicks:= 650 + random(250);
   284                 Frame:= 1
   319                 Frame:= 1
   285                 end;
   320                 end;
   286   vgtHealthTag: begin
   321   vgtHealthTag:
       
   322                 begin
   287                 Frame:= 0;
   323                 Frame:= 0;
   288                 Timer:= 1500;
   324                 Timer:= 1500;
   289                 dY:= -0.08;
   325                 dY:= -0.08;
   290                 dX:= 0;
   326                 dX:= 0;
   291                 //gear^.Z:= 2002;
   327                 //gear^.Z:= 2002;
   292                 end;
   328                 end;
   293   vgtSmokeTrace,
   329   vgtSmokeTrace,
   294   vgtEvilTrace: begin
   330   vgtEvilTrace:
       
   331                 begin
   295                 gear^.X:= gear^.X - 16;
   332                 gear^.X:= gear^.X - 16;
   296                 gear^.Y:= gear^.Y - 16;
   333                 gear^.Y:= gear^.Y - 16;
   297                 gear^.State:= 8;
   334                 gear^.State:= 8;
   298                 //gear^.Z:= cSmokeZ
   335                 //gear^.Z:= cSmokeZ
   299                 end;
   336                 end;
   300 vgtBigExplosion: begin
   337 vgtBigExplosion:
       
   338                 begin
   301                 gear^.Angle:= random(360);
   339                 gear^.Angle:= random(360);
   302                 end;
   340                 end;
   303       vgtChunk: begin
   341       vgtChunk:
       
   342                 begin
   304                 gear^.Frame:= random(4);
   343                 gear^.Frame:= random(4);
   305                 t:= random(1024);
   344                 t:= random(1024);
   306                 sp:= 0.001 * (random(85) + 47);
   345                 sp:= 0.001 * (random(85) + 47);
   307                 dx:= hwFloat2Float(AngleSin(t)) * sp;
   346                 dx:= hwFloat2Float(AngleSin(t)) * sp;
   308                 dy:= hwFloat2Float(AngleCos(t)) * sp * -2;
   347                 dy:= hwFloat2Float(AngleCos(t)) * sp * -2;
   309                 if random(2) = 0 then dx := -dx;
   348                 if random(2) = 0 then
   310                 end;
   349                     dx := -dx;
   311       vgtNote: begin
   350                 end;
       
   351       vgtNote: 
       
   352                 begin
   312                 dx:= 0.005 * (random(15) + 10);
   353                 dx:= 0.005 * (random(15) + 10);
   313                 dy:= -0.001 * (random(40) + 20);
   354                 dy:= -0.001 * (random(40) + 20);
   314                 if random(2) = 0 then dx := -dx;
   355                 if random(2) = 0 then
       
   356                     dx := -dx;
   315                 Frame:= random(4);
   357                 Frame:= random(4);
   316                 FrameTicks:= random(2000) + 1500;
   358                 FrameTicks:= random(2000) + 1500;
   317                 end;
   359                 end;
   318   vgtBulletHit: begin
   360   vgtBulletHit:
       
   361                 begin
   319                 dx:= 0;
   362                 dx:= 0;
   320                 dy:= 0;
   363                 dy:= 0;
   321                 FrameTicks:= 350;
   364                 FrameTicks:= 350;
   322                 Frame:= 7;
   365                 Frame:= 7;
   323                 Angle:= 0;
   366                 Angle:= 0;
   324                 end;
   367                 end;
   325 vgtSmoothWindBar: Tag:= hwRound(cWindSpeed * 72 / cMaxWindSpeed);
   368 vgtSmoothWindBar: Tag:= hwRound(cWindSpeed * 72 / cMaxWindSpeed);
   326  vgtStraightShot: begin
   369  vgtStraightShot:
       
   370                 begin
   327                 Angle:= 0;
   371                 Angle:= 0;
   328                 Scale:= 1.0;
   372                 Scale:= 1.0;
   329                 dx:= 0.001 * random(45);
   373                 dx:= 0.001 * random(45);
   330                 dy:= 0.001 * (random(20) + 25);
   374                 dy:= 0.001 * (random(20) + 25);
   331                 State:= ord(sprHealth);
   375                 State:= ord(sprHealth);
   332                 if random(2) = 0 then dx := -dx;
   376                 if random(2) = 0 then
       
   377                     dx := -dx;
   333                 Frame:= 0;
   378                 Frame:= 0;
   334                 FrameTicks:= random(750) + 1250;
   379                 FrameTicks:= random(750) + 1250;
   335                 State:= ord(sprSnowDust);
   380                 State:= ord(sprSnowDust);
   336                 end;
   381                 end;
   337         end;
   382         end;
   338 
   383 
   339 if State <> 0 then gear^.State:= State;
   384 if State <> 0 then
       
   385     gear^.State:= State;
   340 
   386 
   341 case Gear^.Kind of
   387 case Gear^.Kind of
   342     vgtFlake: if cFlattenFlakes then gear^.Layer:= 0
   388     vgtFlake: if cFlattenFlakes then
       
   389         gear^.Layer:= 0
   343               else if random(3) = 0 then 
   390               else if random(3) = 0 then 
   344                   begin
   391                   begin
   345                   gear^.Scale:= 0.5;
   392                   gear^.Scale:= 0.5;
   346                   gear^.Layer:= 0   // 33% - far back
   393                   gear^.Layer:= 0   // 33% - far back
   347                   end
   394                   end
   348               else if random(3) = 0 then
   395               else if random(3) = 0 then
   349                   begin
   396                   begin
   350                   gear^.Scale:= 0.8;
   397                   gear^.Scale:= 0.8;
   351                   gear^.Layer:= 4   // 22% - mid-distance
   398                   gear^.Layer:= 4   // 22% - mid-distance
   352                   end
   399                   end
   353               else if random(3) <> 0 then gear^.Layer:= 5  // 30% - just behind land
   400               else if random(3) <> 0 then
   354               else if random(2) = 0 then gear^.Layer:= 6   // 7% - just in front of land
   401                   gear^.Layer:= 5  // 30% - just behind land
   355               else begin
   402               else if random(2) = 0 then
   356                    gear^.Scale:= 1.5;
   403                   gear^.Layer:= 6   // 7% - just in front of land
   357                    gear^.Layer:= 2;  // 7% - close up
   404               else
   358                    end;
   405                   begin
       
   406                   gear^.Scale:= 1.5;
       
   407                   gear^.Layer:= 2;  // 7% - close up
       
   408                   end;
   359 
   409 
   360     vgtCloud: if cFlattenClouds then gear^.Layer:= 5
   410     vgtCloud: if cFlattenClouds then gear^.Layer:= 5
   361               else if random(3) = 0 then
   411               else if random(3) = 0 then
   362                   begin
   412                   begin
   363                   gear^.Scale:= 0.25;
   413                   gear^.Scale:= 0.25;
   364                   gear^.Layer:= 0
   414                   gear^.Layer:= 0
   365                   end
   415                   end
   366               else if random(2) = 0 then gear^.Layer:= 5
   416               else if random(2) = 0 then
   367               else begin
   417                   gear^.Layer:= 5
   368                    gear^.Scale:= 0.4;
   418               else
   369                    gear^.Layer:= 4
   419                   begin
   370                    end;
   420                   gear^.Scale:= 0.4;
       
   421                   gear^.Layer:= 4
       
   422                   end;
   371 
   423 
   372     // 0: this layer is very distant in the background when in stereo
   424     // 0: this layer is very distant in the background when in stereo
   373     vgtTeamHealthSorter,
   425     vgtTeamHealthSorter,
   374     vgtSmoothWindBar: gear^.Layer:= 0;
   426     vgtSmoothWindBar: gear^.Layer:= 0;
   375 
   427 
   423 procedure DeleteVisualGear(Gear: PVisualGear);
   475 procedure DeleteVisualGear(Gear: PVisualGear);
   424 begin
   476 begin
   425     FreeTexture(Gear^.Tex);
   477     FreeTexture(Gear^.Tex);
   426     Gear^.Tex:= nil;
   478     Gear^.Tex:= nil;
   427 
   479 
   428     if Gear^.NextGear <> nil then Gear^.NextGear^.PrevGear:= Gear^.PrevGear;
   480     if Gear^.NextGear <> nil then
   429     if Gear^.PrevGear <> nil then Gear^.PrevGear^.NextGear:= Gear^.NextGear
   481         Gear^.NextGear^.PrevGear:= Gear^.PrevGear;
   430     else VisualGearLayers[Gear^.Layer]:= Gear^.NextGear;
   482     if Gear^.PrevGear <> nil then
   431 
   483         Gear^.PrevGear^.NextGear:= Gear^.NextGear
   432     if lastVisualGearByUID = Gear then lastVisualGearByUID:= nil;
   484     else
       
   485         VisualGearLayers[Gear^.Layer]:= Gear^.NextGear;
       
   486 
       
   487     if lastVisualGearByUID = Gear then
       
   488         lastVisualGearByUID:= nil;
   433 
   489 
   434     Dispose(Gear);
   490     Dispose(Gear);
   435 end;
   491 end;
   436 
   492 
   437 procedure ProcessVisualGears(Steps: Longword);
   493 procedure ProcessVisualGears(Steps: Longword);
   438 var Gear, t: PVisualGear;
   494 var Gear, t: PVisualGear;
   439     i: LongWord;
   495     i: LongWord;
   440 begin
   496 begin
   441 if Steps = 0 then exit;
   497 if Steps = 0 then
       
   498     exit;
   442 
   499 
   443 for i:= 0 to 6 do
   500 for i:= 0 to 6 do
   444     begin
   501     begin
   445     t:= VisualGearLayers[i];
   502     t:= VisualGearLayers[i];
   446     while t <> nil do
   503     while t <> nil do
   447           begin
   504         begin
   448           Gear:= t;
   505         Gear:= t;
   449           t:= Gear^.NextGear;
   506         t:= Gear^.NextGear;
   450           Gear^.doStep(Gear, Steps)
   507         Gear^.doStep(Gear, Steps)
   451           end;
   508         end;
   452     end
   509     end
   453 end;
   510 end;
   454 
   511 
   455 procedure KickFlakes(Radius, X, Y: LongInt);
   512 procedure KickFlakes(Radius, X, Y: LongInt);
   456 var Gear, t: PVisualGear;
   513 var Gear, t: PVisualGear;
   457     dmg, i: LongInt;
   514     dmg, i: LongInt;
   458 begin
   515 begin
   459 if (vobCount = 0) or (vobCount > 200) then exit;
   516 if (vobCount = 0) or (vobCount > 200) then
       
   517     exit;
   460 for i:= 2 to 6 do
   518 for i:= 2 to 6 do
   461     if i <> 3 then
   519     if i <> 3 then
   462         begin
   520         begin
   463         t:= VisualGearLayers[i];
   521         t:= VisualGearLayers[i];
   464         while t <> nil do
   522         while t <> nil do
   465               begin
   523             begin
   466               Gear:= t;
   524             Gear:= t;
   467               if Gear^.Kind = vgtFlake then
   525             if Gear^.Kind = vgtFlake then
   468                   begin
   526                 begin
   469                   // Damage calc from doMakeExplosion
   527                 // Damage calc from doMakeExplosion
   470                   dmg:= Min(101, Radius + cHHRadius div 2 - LongInt(abs(round(Gear^.X) - X) + abs(round(Gear^.Y) - Y)) div 5);
   528                 dmg:= Min(101, Radius + cHHRadius div 2 - LongInt(abs(round(Gear^.X) - X) + abs(round(Gear^.Y) - Y)) div 5);
   471                   if dmg > 1 then
   529                 if dmg > 1 then
   472                       begin
   530                     begin
   473                       Gear^.tdX:= 0.02 * dmg + 0.01;
   531                     Gear^.tdX:= 0.02 * dmg + 0.01;
   474                       if Gear^.X - X < 0 then Gear^.tdX := -Gear^.tdX;
   532                     if Gear^.X - X < 0 then
   475                       Gear^.tdY:= 0.02 * dmg + 0.01;
   533                         Gear^.tdX := -Gear^.tdX;
   476                       if Gear^.Y - Y < 0 then Gear^.tdY := -Gear^.tdY;
   534                     Gear^.tdY:= 0.02 * dmg + 0.01;
   477                       Gear^.Timer:= 200
   535                     if Gear^.Y - Y < 0 then
   478                       end
   536                         Gear^.tdY := -Gear^.tdY;
   479                   end;
   537                     Gear^.Timer:= 200
   480               t:= Gear^.NextGear
   538                     end
   481               end
   539                 end;
   482          end
   540             t:= Gear^.NextGear
       
   541             end
       
   542         end
   483 end;
   543 end;
   484 
   544 
   485 procedure DrawVisualGears(Layer: LongWord);
   545 procedure DrawVisualGears(Layer: LongWord);
   486 var Gear: PVisualGear;
   546 var Gear: PVisualGear;
   487     tinted: boolean;
   547     tinted: boolean;
   489     i: LongInt;
   549     i: LongInt;
   490 begin
   550 begin
   491 case Layer of
   551 case Layer of
   492     // this layer is very distant in the background when stereo
   552     // this layer is very distant in the background when stereo
   493     0: begin
   553     0: begin
   494        Gear:= VisualGearLayers[0];
   554         Gear:= VisualGearLayers[0];
   495        while Gear <> nil do
   555         while Gear <> nil do
   496            begin
   556             begin
   497            if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
   557             if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
   498            case Gear^.Kind of
   558             case Gear^.Kind of
   499               vgtCloud: if SuddenDeathDmg then
   559               vgtCloud: if SuddenDeathDmg then
   500                              DrawTextureF(SpritesData[sprSDCloud].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 2, SpritesData[sprCloud].Width, SpritesData[sprCloud].Height)
   560                              DrawTextureF(SpritesData[sprSDCloud].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 2, SpritesData[sprCloud].Width, SpritesData[sprCloud].Height)
   501                          else
   561                          else
   502                             DrawTextureF(SpritesData[sprCloud].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 2, SpritesData[sprCloud].Width, SpritesData[sprCloud].Height);
   562                             DrawTextureF(SpritesData[sprCloud].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 2, SpritesData[sprCloud].Width, SpritesData[sprCloud].Height);
   503                vgtFlake: if cFlattenFlakes then
   563                vgtFlake: if cFlattenFlakes then
   525                                      DrawTextureF(SpritesData[sprFlake].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height)
   585                                      DrawTextureF(SpritesData[sprFlake].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height)
   526                                  else
   586                                  else
   527                                      DrawRotatedTextureF(SpritesData[sprFlake].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height, Gear^.Angle)
   587                                      DrawRotatedTextureF(SpritesData[sprFlake].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height, Gear^.Angle)
   528                              end;
   588                              end;
   529                end;
   589                end;
   530            if Gear^.Tint <> $FFFFFFFF then Tint($FF,$FF,$FF,$FF);
   590            if Gear^.Tint <> $FFFFFFFF then
       
   591                Tint($FF,$FF,$FF,$FF);
   531            Gear:= Gear^.NextGear
   592            Gear:= Gear^.NextGear
   532            end
   593            end
   533        end;
   594        end;
   534     // this layer is on the land level (which is close but behind the screen plane) when stereo
   595     // this layer is on the land level (which is close but behind the screen plane) when stereo
   535     1: begin
   596     1: begin
   536        Gear:= VisualGearLayers[1];
   597        Gear:= VisualGearLayers[1];
   537        while Gear <> nil do
   598        while Gear <> nil do
   538           begin
   599           begin
   539           //tinted:= false;
   600           //tinted:= false;
   540           if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
   601           if Gear^.Tint <> $FFFFFFFF then
       
   602               Tint(Gear^.Tint);
   541           case Gear^.Kind of
   603           case Gear^.Kind of
   542               vgtFlake: if SuddenDeathDmg then
   604               vgtFlake: if SuddenDeathDmg then
   543                              if vobSDVelocity = 0 then
   605                              if vobSDVelocity = 0 then
   544                                  DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   606                                  DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   545                              else
   607                              else
   547                          else
   609                          else
   548                              if vobVelocity = 0 then
   610                              if vobVelocity = 0 then
   549                                  DrawSprite(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   611                                  DrawSprite(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   550                              else
   612                              else
   551                                  DrawRotatedF(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle);
   613                                  DrawRotatedF(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle);
   552               vgtSmokeTrace: if Gear^.State < 8 then DrawSprite(sprSmokeTrace, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State);
   614               vgtSmokeTrace: if Gear^.State < 8 then
   553               vgtEvilTrace: if Gear^.State < 8 then DrawSprite(sprEvilTrace, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State);
   615                   DrawSprite(sprSmokeTrace, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State);
       
   616               vgtEvilTrace: if Gear^.State < 8 then
       
   617                   DrawSprite(sprEvilTrace, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State);
   554               vgtLineTrail: DrawLine(Gear^.X, Gear^.Y, Gear^.dX, Gear^.dY, 1.0, $FF, min(Gear^.Timer, $C0), min(Gear^.Timer, $80), min(Gear^.Timer, $FF));
   618               vgtLineTrail: DrawLine(Gear^.X, Gear^.Y, Gear^.dX, Gear^.dY, 1.0, $FF, min(Gear^.Timer, $C0), min(Gear^.Timer, $80), min(Gear^.Timer, $FF));
   555           end;
   619           end;
   556           if (cReducedQuality and rqAntiBoom) = 0 then
   620           if (cReducedQuality and rqAntiBoom) = 0 then
   557               case Gear^.Kind of
   621               case Gear^.Kind of
   558                   vgtSmoke: DrawTextureF(SpritesData[sprSmoke].Texture, Gear^.scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, 7 - Gear^.Frame, 1, SpritesData[sprSmoke].Width, SpritesData[sprSmoke].Height);
   622                   vgtSmoke: DrawTextureF(SpritesData[sprSmoke].Texture, Gear^.scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, 7 - Gear^.Frame, 1, SpritesData[sprSmoke].Width, SpritesData[sprSmoke].Height);
   574                               else
   638                               else
   575                                   DrawSprite(sprDroplet, round(Gear^.X) + WorldDx - 8, round(Gear^.Y) + WorldDy - 8, Gear^.Frame);
   639                                   DrawSprite(sprDroplet, round(Gear^.X) + WorldDx - 8, round(Gear^.Y) + WorldDy - 8, Gear^.Frame);
   576                   vgtBubble: DrawSprite(sprBubbles, round(Gear^.X) + WorldDx - 8, round(Gear^.Y) + WorldDy - 8, Gear^.Frame);//(RealTicks div 64 + Gear^.Frame) mod 8);
   640                   vgtBubble: DrawSprite(sprBubbles, round(Gear^.X) + WorldDx - 8, round(Gear^.Y) + WorldDy - 8, Gear^.Frame);//(RealTicks div 64 + Gear^.Frame) mod 8);
   577               end;
   641               end;
   578           //if (Gear^.Tint <> $FFFFFFFF) or tinted then Tint($FF,$FF,$FF,$FF);
   642           //if (Gear^.Tint <> $FFFFFFFF) or tinted then Tint($FF,$FF,$FF,$FF);
   579           if (Gear^.Tint <> $FFFFFFFF) then Tint($FF,$FF,$FF,$FF);
   643           if (Gear^.Tint <> $FFFFFFFF) then
       
   644               Tint($FF,$FF,$FF,$FF);
   580           Gear:= Gear^.NextGear
   645           Gear:= Gear^.NextGear
   581           end
   646           end
   582        end;
   647        end;
   583     // this layer is on the screen plane (depth = 0) when stereo
   648     // this layer is on the screen plane (depth = 0) when stereo
   584     3: begin
   649     3: begin
   585        Gear:= VisualGearLayers[3];
   650        Gear:= VisualGearLayers[3];
   586        while Gear <> nil do
   651        while Gear <> nil do
   587            begin
   652            begin
   588            tinted:= false;
   653            tinted:= false;
   589            if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
   654            if Gear^.Tint <> $FFFFFFFF then
       
   655                Tint(Gear^.Tint);
   590            case Gear^.Kind of
   656            case Gear^.Kind of
   591 (*
   657 (*
   592               vgtFlake: if SuddenDeathDmg then
   658               vgtFlake: if SuddenDeathDmg then
   593                              if vobSDVelocity = 0 then
   659                              if vobSDVelocity = 0 then
   594                                  DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   660                                  DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   615                                if Gear^.Frame = 0 then 
   681                                if Gear^.Frame = 0 then 
   616                                    DrawCentered(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Tex)
   682                                    DrawCentered(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Tex)
   617                                else
   683                                else
   618                                    begin
   684                                    begin
   619                                    SetScale(cDefaultZoomLevel);
   685                                    SetScale(cDefaultZoomLevel);
   620                                    if Gear^.Angle = 0 then DrawTexture(round(Gear^.X), round(Gear^.Y), Gear^.Tex)
   686                                    if Gear^.Angle = 0 then
   621                                    else DrawTexture(round(Gear^.X), round(Gear^.Y), Gear^.Tex, Gear^.Angle); 
   687                                        DrawTexture(round(Gear^.X), round(Gear^.Y), Gear^.Tex)
       
   688                                    else
       
   689                                        DrawTexture(round(Gear^.X), round(Gear^.Y), Gear^.Tex, Gear^.Angle); 
   622                                    SetScale(zoom)
   690                                    SetScale(zoom)
   623                                    end
   691                                    end
   624                                end;
   692                                end;
   625                vgtStraightShot: begin 
   693                vgtStraightShot: begin 
   626                                 if Gear^.dX < 0 then i:= -1 else i:= 1;
   694                                 if Gear^.dX < 0 then
       
   695                                     i:= -1
       
   696                                 else
       
   697                                     i:= 1;
   627                                 DrawRotatedTextureF(SpritesData[TSprite(Gear^.State)].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, i, SpritesData[TSprite(Gear^.State)].Width, SpritesData[TSprite(Gear^.State)].Height, Gear^.Angle);
   698                                 DrawRotatedTextureF(SpritesData[TSprite(Gear^.State)].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, i, SpritesData[TSprite(Gear^.State)].Width, SpritesData[TSprite(Gear^.State)].Height, Gear^.Angle);
   628                                 end;
   699                                 end;
   629            end;
   700            end;
   630            if (cReducedQuality and rqAntiBoom) = 0 then
   701            if (cReducedQuality and rqAntiBoom) = 0 then
   631                case Gear^.Kind of
   702                case Gear^.Kind of
   632                    vgtChunk: DrawRotatedF(sprChunk, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
   703                    vgtChunk: DrawRotatedF(sprChunk, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
   633                end;
   704                end;
   634            if (Gear^.Tint <> $FFFFFFFF) or tinted then Tint($FF,$FF,$FF,$FF);
   705            if (Gear^.Tint <> $FFFFFFFF) or tinted then
       
   706                Tint($FF,$FF,$FF,$FF);
   635            Gear:= Gear^.NextGear
   707            Gear:= Gear^.NextGear
   636            end
   708            end
   637        end;
   709        end;
   638     // this layer is outside the screen when stereo
   710     // this layer is outside the screen when stereo
   639     2: begin
   711     2: begin
   640        Gear:= VisualGearLayers[2];
   712        Gear:= VisualGearLayers[2];
   641        while Gear <> nil do
   713        while Gear <> nil do
   642            begin
   714            begin
   643            tinted:= false;
   715            tinted:= false;
   644            if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
   716            if Gear^.Tint <> $FFFFFFFF then
       
   717                Tint(Gear^.Tint);
   645            case Gear^.Kind of
   718            case Gear^.Kind of
   646                vgtExplosion: DrawSprite(sprExplosion50, round(Gear^.X) - 32 + WorldDx, round(Gear^.Y) - 32 + WorldDy, Gear^.State);
   719                vgtExplosion: DrawSprite(sprExplosion50, round(Gear^.X) - 32 + WorldDx, round(Gear^.Y) - 32 + WorldDy, Gear^.State);
   647                vgtBigExplosion: begin
   720                vgtBigExplosion: begin
   648                                 tinted:= true;
   721                                 tinted:= true;
   649                                 Tint($FF, $FF, $FF, round($FF * (1 - power(Gear^.Timer / 250, 4))));
   722                                 Tint($FF, $FF, $FF, round($FF * (1 - power(Gear^.Timer / 250, 4))));
   708                vgtCircle: if gear^.Angle = 1 then
   781                vgtCircle: if gear^.Angle = 1 then
   709                               begin
   782                               begin
   710                               tmp:= Gear^.State / 100;
   783                               tmp:= Gear^.State / 100;
   711                               DrawTexture(round(Gear^.X-24*tmp) + WorldDx, round(Gear^.Y-24*tmp) + WorldDy, SpritesData[sprVampiric].Texture, tmp)
   784                               DrawTexture(round(Gear^.X-24*tmp) + WorldDx, round(Gear^.Y-24*tmp) + WorldDy, SpritesData[sprVampiric].Texture, tmp)
   712                               end
   785                               end
   713                           else DrawCircle(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State, Gear^.Timer);
   786                           else
       
   787                               DrawCircle(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State, Gear^.Timer);
   714            end;
   788            end;
   715            if (Gear^.Tint <> $FFFFFFFF) or tinted then Tint($FF,$FF,$FF,$FF);
   789            if (Gear^.Tint <> $FFFFFFFF) or tinted then
       
   790                Tint($FF,$FF,$FF,$FF);
   716            Gear:= Gear^.NextGear
   791            Gear:= Gear^.NextGear
   717            end
   792            end
   718        end;
   793        end;
   719     // this layer is half-way between the screen plane (depth = 0) when in stereo, and the land
   794      // this layer is half-way between the screen plane (depth = 0) when in stereo, and the land
   720     4: begin
   795      4: begin
   721        Gear:= VisualGearLayers[4];
   796         Gear:= VisualGearLayers[4];
   722        while Gear <> nil do
   797         while Gear <> nil do
   723            begin
   798             begin
   724            if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
   799             if Gear^.Tint <> $FFFFFFFF then
   725            case Gear^.Kind of
   800                 Tint(Gear^.Tint);
   726               vgtCloud: if SuddenDeathDmg then
   801             case Gear^.Kind of
   727                              DrawTextureF(SpritesData[sprSDCloud].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 2, SpritesData[sprCloud].Width, SpritesData[sprCloud].Height)
   802                vgtCloud: if SuddenDeathDmg then
   728                          else
   803                             DrawTextureF(SpritesData[sprSDCloud].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 2, SpritesData[sprCloud].Width, SpritesData[sprCloud].Height)
       
   804                         else
   729                             DrawTextureF(SpritesData[sprCloud].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 2, SpritesData[sprCloud].Width, SpritesData[sprCloud].Height);
   805                             DrawTextureF(SpritesData[sprCloud].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 2, SpritesData[sprCloud].Width, SpritesData[sprCloud].Height);
   730               vgtFlake: if SuddenDeathDmg then
   806               vgtFlake: if SuddenDeathDmg then
   731                              if vobSDVelocity = 0 then
   807                             if vobSDVelocity = 0 then
   732                                  DrawTextureF(SpritesData[sprSDFlake].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height)
   808                                 DrawTextureF(SpritesData[sprSDFlake].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height)
   733                              else
   809                             else
   734                                  DrawRotatedTextureF(SpritesData[sprSDFlake].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height, Gear^.Angle)
   810                                 DrawRotatedTextureF(SpritesData[sprSDFlake].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height, Gear^.Angle)
   735                          else
   811                         else
   736                              if vobVelocity = 0 then
   812                             if vobVelocity = 0 then
   737                                  DrawTextureF(SpritesData[sprFlake].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height)
   813                                 DrawTextureF(SpritesData[sprFlake].Texture, Gear^.Scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height)
   738                              else
   814                             else
   739                                  DrawRotatedTextureF(SpritesData[sprFlake].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height, Gear^.Angle);
   815                                 DrawRotatedTextureF(SpritesData[sprFlake].Texture, Gear^.Scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height, Gear^.Angle);
   740                end;
   816             end;
   741            if (Gear^.Tint <> $FFFFFFFF) then Tint($FF,$FF,$FF,$FF);
   817             if (Gear^.Tint <> $FFFFFFFF) then
   742            Gear:= Gear^.NextGear
   818                 Tint($FF,$FF,$FF,$FF);
   743            end
   819             Gear:= Gear^.NextGear
   744        end;
   820             end
   745     // this layer is on the screen plane (depth = 0) when stereo, but just behind the land
   821         end;
   746     5: begin
   822      // this layer is on the screen plane (depth = 0) when stereo, but just behind the land
   747        Gear:= VisualGearLayers[5];
   823      5: begin
   748        while Gear <> nil do
   824         Gear:= VisualGearLayers[5];
   749            begin
   825         while Gear <> nil do
   750            if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
   826             begin
   751            case Gear^.Kind of
   827             if Gear^.Tint <> $FFFFFFFF then
   752                vgtCloud: if SuddenDeathDmg then
   828                 Tint(Gear^.Tint);
   753                              DrawSprite(sprSDCloud, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   829             case Gear^.Kind of
   754                          else
   830                 vgtCloud: if SuddenDeathDmg then
   755                              DrawSprite(sprCloud, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame);
   831                             DrawSprite(sprSDCloud, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
       
   832                           else
       
   833                             DrawSprite(sprCloud, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame);
   756               vgtFlake: if SuddenDeathDmg then
   834               vgtFlake: if SuddenDeathDmg then
   757                              if vobSDVelocity = 0 then
   835                             if vobSDVelocity = 0 then
   758                                  DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   836                                 DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   759                              else
   837                             else
   760                                  DrawRotatedF(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle)
   838                                 DrawRotatedF(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle)
   761                          else
   839                           else
   762                              if vobVelocity = 0 then
   840                             if vobVelocity = 0 then
   763                                  DrawSprite(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   841                                 DrawSprite(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   764                              else
   842                             else
   765                                  DrawRotatedF(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle);
   843                                 DrawRotatedF(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle);
   766                end;
   844                 end;
   767            if (Gear^.Tint <> $FFFFFFFF) then Tint($FF,$FF,$FF,$FF);
   845             if (Gear^.Tint <> $FFFFFFFF) then
   768            Gear:= Gear^.NextGear
   846                 Tint($FF,$FF,$FF,$FF);
   769            end
   847             Gear:= Gear^.NextGear
   770        end;
   848             end
   771     // this layer is on the screen plane (depth = 0) when stereo, but just in front of the land
   849         end;
       
   850      // this layer is on the screen plane (depth = 0) when stereo, but just in front of the land
   772     6: begin
   851     6: begin
   773        Gear:= VisualGearLayers[6];
   852         Gear:= VisualGearLayers[6];
   774        while Gear <> nil do
   853         while Gear <> nil do
   775            begin
   854             begin
   776            if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
   855             if Gear^.Tint <> $FFFFFFFF then
   777            case Gear^.Kind of
   856                 Tint(Gear^.Tint);
   778               vgtFlake: if SuddenDeathDmg then
   857             case Gear^.Kind of
   779                              if vobSDVelocity = 0 then
   858                 vgtFlake: if SuddenDeathDmg then
   780                                  DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   859                             if vobSDVelocity = 0 then
   781                              else
   860                                 DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   782                                  DrawRotatedF(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle)
   861                             else
   783                          else
   862                                 DrawRotatedF(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle)
   784                              if vobVelocity = 0 then
   863                           else
   785                                  DrawSprite(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   864                             if vobVelocity = 0 then
   786                              else
   865                                 DrawSprite(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   787                                  DrawRotatedF(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle);
   866                             else
   788                end;
   867                                 DrawRotatedF(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle);
   789            if (Gear^.Tint <> $FFFFFFFF) then Tint($FF,$FF,$FF,$FF);
   868                 end;
   790            Gear:= Gear^.NextGear
   869             if (Gear^.Tint <> $FFFFFFFF) then
   791            end
   870                 Tint($FF,$FF,$FF,$FF);
   792        end;
   871             Gear:= Gear^.NextGear
       
   872             end
       
   873         end;
   793     end;
   874     end;
   794 end;
   875 end;
   795 
   876 
   796 function  VisualGearByUID(uid : Longword) : PVisualGear;
   877 function  VisualGearByUID(uid : Longword) : PVisualGear;
   797 var vg: PVisualGear;
   878 var vg: PVisualGear;
   798     i: LongWord;
   879     i: LongWord;
   799 begin
   880 begin
   800 VisualGearByUID:= nil;
   881 VisualGearByUID:= nil;
   801 if uid = 0 then exit;
   882 if uid = 0 then
       
   883     exit;
   802 if (lastVisualGearByUID <> nil) and (lastVisualGearByUID^.uid = uid) then
   884 if (lastVisualGearByUID <> nil) and (lastVisualGearByUID^.uid = uid) then
   803     begin
   885     begin
   804     VisualGearByUID:= lastVisualGearByUID;
   886     VisualGearByUID:= lastVisualGearByUID;
   805     exit
   887     exit
   806     end;
   888     end;
   809     begin
   891     begin
   810     vg:= VisualGearLayers[i mod 4];
   892     vg:= VisualGearLayers[i mod 4];
   811     while vg <> nil do
   893     while vg <> nil do
   812         begin
   894         begin
   813         if vg^.uid = uid then
   895         if vg^.uid = uid then
   814     	    begin
   896             begin
   815     	    lastVisualGearByUID:= vg;
   897             lastVisualGearByUID:= vg;
   816     	    VisualGearByUID:= vg;
   898             VisualGearByUID:= vg;
   817     	    exit
   899             exit
   818     	    end;
   900             end;
   819         vg:= vg^.NextGear
   901         vg:= vg^.NextGear
   820         end
   902         end
   821     end
   903     end
   822 end;
   904 end;
   823 
   905 
   830 
   912 
   831 procedure ChangeToSDClouds;
   913 procedure ChangeToSDClouds;
   832 var       i: LongInt;
   914 var       i: LongInt;
   833     vg, tmp: PVisualGear;
   915     vg, tmp: PVisualGear;
   834 begin
   916 begin
   835 if cCloudsNumber = cSDCloudsNumber then exit;
   917 if cCloudsNumber = cSDCloudsNumber then
       
   918     exit;
   836 vg:= VisualGearLayers[0];
   919 vg:= VisualGearLayers[0];
   837 while vg <> nil do
   920 while vg <> nil do
   838     if vg^.Kind = vgtCloud then
   921     if vg^.Kind = vgtCloud then
   839         begin
   922         begin
   840         tmp:= vg^.NextGear;
   923         tmp:= vg^.NextGear;
   847 end;
   930 end;
   848 
   931 
   849 procedure AddFlakes;
   932 procedure AddFlakes;
   850 var i: LongInt;
   933 var i: LongInt;
   851 begin
   934 begin
   852 if (cReducedQuality and rqKillFlakes) <> 0 then exit;
   935 if (cReducedQuality and rqKillFlakes) <> 0 then
       
   936     exit;
   853 
   937 
   854 if hasBorder or ((Theme <> 'Snow') and (Theme <> 'Christmas')) then
   938 if hasBorder or ((Theme <> 'Snow') and (Theme <> 'Christmas')) then
   855     for i:= 0 to Pred(vobCount * cScreenSpace div LAND_WIDTH) do
   939     for i:= 0 to Pred(vobCount * cScreenSpace div LAND_WIDTH) do
   856         AddVisualGear(cLeftScreenBorder + random(cScreenSpace), random(1024+200) - 100 + LAND_HEIGHT, vgtFlake)
   940         AddVisualGear(cLeftScreenBorder + random(cScreenSpace), random(1024+200) - 100 + LAND_HEIGHT, vgtFlake)
   857 else
   941 else
   861 
   945 
   862 procedure ChangeToSDFlakes;
   946 procedure ChangeToSDFlakes;
   863 var       i: LongInt;
   947 var       i: LongInt;
   864     vg, tmp: PVisualGear;
   948     vg, tmp: PVisualGear;
   865 begin
   949 begin
   866 if (cReducedQuality and rqKillFlakes) <> 0 then exit;
   950 if (cReducedQuality and rqKillFlakes) <> 0 then
   867 if vobCount = vobSDCount then exit;
   951     exit;
       
   952 if vobCount = vobSDCount then
       
   953     exit;
   868 for i:= 0 to 6 do
   954 for i:= 0 to 6 do
   869     begin
   955     begin
   870     vg:= VisualGearLayers[i];
   956     vg:= VisualGearLayers[i];
   871     while vg <> nil do
   957     while vg <> nil do
   872         if vg^.Kind = vgtFlake then
   958         if vg^.Kind = vgtFlake then