hedgewars/uVisualGears.pas
changeset 5585 c09f5b41644a
parent 5583 63b274a4fb01
child 5596 555c4fc1f3bd
equal deleted inserted replaced
5584:e0b9722bd653 5585:c09f5b41644a
   329                 end;
   329                 end;
   330         end;
   330         end;
   331 
   331 
   332 if State <> 0 then gear^.State:= State;
   332 if State <> 0 then gear^.State:= State;
   333 
   333 
   334 if VisualGearsList <> nil then
   334 case Gear^.Kind of
   335     begin
   335     // 0: this layer is very distant in the background when stereo
   336     VisualGearsList^.PrevGear:= gear;
   336     vgtTeamHealthSorter,
   337     gear^.NextGear:= VisualGearsList
   337     vgtSmoothWindBar,
   338     end;
   338     vgtFlake, 
   339 VisualGearsList:= gear;
   339     vgtCloud: begin
       
   340               if VisualGearsLayer0 <> nil then
       
   341                   begin
       
   342                   VisualGearsLayer0^.PrevGear:= gear;
       
   343                   gear^.NextGear:= VisualGearsLayer0
       
   344                   end;
       
   345               gear^.Layer:= 0;
       
   346               VisualGearsLayer0:= gear
       
   347               end; 
       
   348     // 1: this layer is on the land level (which is close but behind the screen plane) when stereo
       
   349     vgtSmokeTrace,
       
   350     vgtEvilTrace,
       
   351     vgtLineTrail,
       
   352     vgtSmoke,
       
   353     vgtSmokeWhite,
       
   354     vgtDust,
       
   355     vgtFire,
       
   356     vgtSplash,
       
   357     vgtDroplet,
       
   358     vgtBubble: begin
       
   359               if VisualGearsLayer1 <> nil then
       
   360                   begin
       
   361                   VisualGearsLayer1^.PrevGear:= gear;
       
   362                   gear^.NextGear:= VisualGearsLayer1
       
   363                   end;
       
   364               gear^.Layer:= 1;
       
   365               VisualGearsLayer1:= gear
       
   366               end; 
       
   367     // 3: this layer is on the screen plane (depth = 0) when stereo
       
   368     vgtSpeechBubble,
       
   369     vgtSmallDamageTag,
       
   370     vgtHealthTag,
       
   371     vgtStraightShot,
       
   372     vgtChunk: begin
       
   373               if VisualGearsLayer3 <> nil then
       
   374                   begin
       
   375                   VisualGearsLayer3^.PrevGear:= gear;
       
   376                   gear^.NextGear:= VisualGearsLayer3
       
   377                   end;
       
   378               gear^.Layer:= 3;
       
   379               VisualGearsLayer3:= gear
       
   380               end; 
       
   381     // 2: this layer is outside the screen when stereo
       
   382     vgtExplosion,
       
   383     vgtBigExplosion,
       
   384     vgtExplPart,
       
   385     vgtExplPart2,
       
   386     vgtSteam,
       
   387     vgtAmmo,
       
   388     vgtShell,
       
   389     vgtFeather,
       
   390     vgtEgg,
       
   391     vgtBeeTrace,
       
   392     vgtSmokeRing,
       
   393     vgtNote,
       
   394     vgtBulletHit,
       
   395     vgtCircle: begin
       
   396               if VisualGearsLayer2 <> nil then
       
   397                   begin
       
   398                   VisualGearsLayer2^.PrevGear:= gear;
       
   399                   gear^.NextGear:= VisualGearsLayer2
       
   400                   end;
       
   401               gear^.Layer:= 2;
       
   402               VisualGearsLayer2:= gear
       
   403               end; 
       
   404 end;
   340 
   405 
   341 AddVisualGear:= gear;
   406 AddVisualGear:= gear;
   342 end;
   407 end;
   343 
   408 
   344 procedure DeleteVisualGear(Gear: PVisualGear);
   409 procedure DeleteVisualGear(Gear: PVisualGear);
   347         FreeTexture(Gear^.Tex);
   412         FreeTexture(Gear^.Tex);
   348     Gear^.Tex:= nil;
   413     Gear^.Tex:= nil;
   349 
   414 
   350     if Gear^.NextGear <> nil then Gear^.NextGear^.PrevGear:= Gear^.PrevGear;
   415     if Gear^.NextGear <> nil then Gear^.NextGear^.PrevGear:= Gear^.PrevGear;
   351     if Gear^.PrevGear <> nil then Gear^.PrevGear^.NextGear:= Gear^.NextGear
   416     if Gear^.PrevGear <> nil then Gear^.PrevGear^.NextGear:= Gear^.NextGear
   352     else VisualGearsList:= Gear^.NextGear;
   417     else
       
   418         case Gear^.Layer of
       
   419             0: VisualGearsLayer0:= Gear^.NextGear;
       
   420             1: VisualGearsLayer1:= Gear^.NextGear;
       
   421             2: VisualGearsLayer2:= Gear^.NextGear;
       
   422             3: VisualGearsLayer3:= Gear^.NextGear;
       
   423         end;
   353 
   424 
   354     if lastVisualGearByUID = Gear then lastVisualGearByUID:= nil;
   425     if lastVisualGearByUID = Gear then lastVisualGearByUID:= nil;
   355 
   426 
   356     Dispose(Gear);
   427     Dispose(Gear);
   357 end;
   428 end;
   359 procedure ProcessVisualGears(Steps: Longword);
   430 procedure ProcessVisualGears(Steps: Longword);
   360 var Gear, t: PVisualGear;
   431 var Gear, t: PVisualGear;
   361 begin
   432 begin
   362 if Steps = 0 then exit;
   433 if Steps = 0 then exit;
   363 
   434 
   364 t:= VisualGearsList;
   435 t:= VisualGearsLayer0;
       
   436 while t <> nil do
       
   437       begin
       
   438       Gear:= t;
       
   439       t:= Gear^.NextGear;
       
   440       Gear^.doStep(Gear, Steps)
       
   441       end;
       
   442 t:= VisualGearsLayer1;
       
   443 while t <> nil do
       
   444       begin
       
   445       Gear:= t;
       
   446       t:= Gear^.NextGear;
       
   447       Gear^.doStep(Gear, Steps)
       
   448       end;
       
   449 t:= VisualGearsLayer2;
       
   450 while t <> nil do
       
   451       begin
       
   452       Gear:= t;
       
   453       t:= Gear^.NextGear;
       
   454       Gear^.doStep(Gear, Steps)
       
   455       end;
       
   456 t:= VisualGearsLayer3;
   365 while t <> nil do
   457 while t <> nil do
   366       begin
   458       begin
   367       Gear:= t;
   459       Gear:= t;
   368       t:= Gear^.NextGear;
   460       t:= Gear^.NextGear;
   369       Gear^.doStep(Gear, Steps)
   461       Gear^.doStep(Gear, Steps)
   373 procedure KickFlakes(Radius, X, Y: LongInt);
   465 procedure KickFlakes(Radius, X, Y: LongInt);
   374 var Gear, t: PVisualGear;
   466 var Gear, t: PVisualGear;
   375     dmg: LongInt;
   467     dmg: LongInt;
   376 begin
   468 begin
   377 if (vobCount = 0) or (vobCount > 200) then exit;
   469 if (vobCount = 0) or (vobCount > 200) then exit;
   378 t:= VisualGearsList;
   470 t:= VisualGearsLayer0;
   379 while t <> nil do
   471 while t <> nil do
   380       begin
   472       begin
   381       Gear:= t;
   473       Gear:= t;
   382       if Gear^.Kind = vgtFlake then
   474       if Gear^.Kind = vgtFlake then
   383           begin
   475           begin
   399 procedure DrawVisualGears(Layer: LongWord);
   491 procedure DrawVisualGears(Layer: LongWord);
   400 var Gear: PVisualGear;
   492 var Gear: PVisualGear;
   401     tinted: boolean;
   493     tinted: boolean;
   402     tmp: real;
   494     tmp: real;
   403 begin
   495 begin
   404 Gear:= VisualGearsList;
       
   405 case Layer of
   496 case Layer of
   406     // this layer is very distant in the background when stereo
   497     // this layer is very distant in the background when stereo
   407     0: while Gear <> nil do
   498     0: begin
   408         begin
   499        Gear:= VisualGearsLayer0;
   409         if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
   500        while Gear <> nil do
   410         case Gear^.Kind of
   501            begin
   411             vgtFlake: if SuddenDeathDmg then
   502            if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
   412                           if vobSDVelocity = 0 then
   503            case Gear^.Kind of
   413                               DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   504                vgtFlake: if SuddenDeathDmg then
   414                           else
   505                              if vobSDVelocity = 0 then
   415                               DrawRotatedF(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle)
   506                                  DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   416                       else
   507                              else
   417                           if vobVelocity = 0 then
   508                                  DrawRotatedF(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle)
   418                               DrawSprite(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   509                          else
   419                           else
   510                              if vobVelocity = 0 then
   420                               DrawRotatedF(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle);
   511                                  DrawSprite(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   421             vgtCloud: if SuddenDeathDmg then
   512                              else
   422                           DrawSprite(sprSDCloud, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   513                                  DrawRotatedF(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle);
   423                       else
   514                vgtCloud: if SuddenDeathDmg then
   424                           DrawSprite(sprCloud, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame);
   515                              DrawSprite(sprSDCloud, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   425             end;
   516                          else
   426         if Gear^.Tint <> $FFFFFFFF then Tint($FF,$FF,$FF,$FF);
   517                              DrawSprite(sprCloud, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame);
   427         Gear:= Gear^.NextGear
   518                end;
       
   519            if Gear^.Tint <> $FFFFFFFF then Tint($FF,$FF,$FF,$FF);
       
   520            Gear:= Gear^.NextGear
       
   521            end
   428        end;
   522        end;
   429     // this layer is on the land level (which is close but behind the screen plane) when stereo
   523     // this layer is on the land level (which is close but behind the screen plane) when stereo
   430     1: while Gear <> nil do
   524     1: begin
   431         begin
   525        Gear:= VisualGearsLayer1;
   432         //tinted:= false;
   526        while Gear <> nil do
   433         if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
   527           begin
   434         case Gear^.Kind of
   528           //tinted:= false;
   435             vgtSmokeTrace: if Gear^.State < 8 then DrawSprite(sprSmokeTrace, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State);
   529           if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
   436             vgtEvilTrace: if Gear^.State < 8 then DrawSprite(sprEvilTrace, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State);
   530           case Gear^.Kind of
   437             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));
   531               vgtSmokeTrace: if Gear^.State < 8 then DrawSprite(sprSmokeTrace, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State);
   438         end;
   532               vgtEvilTrace: if Gear^.State < 8 then DrawSprite(sprEvilTrace, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State);
   439         if (cReducedQuality and rqAntiBoom) = 0 then
   533               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));
   440             case Gear^.Kind of
   534           end;
   441                 vgtSmoke: DrawSprite(sprSmoke, round(Gear^.X) + WorldDx - 11, round(Gear^.Y) + WorldDy - 11, 7 - Gear^.Frame);
   535           if (cReducedQuality and rqAntiBoom) = 0 then
   442                 vgtSmokeWhite: DrawSprite(sprSmokeWhite, round(Gear^.X) + WorldDx - 11, round(Gear^.Y) + WorldDy - 11, 7 - Gear^.Frame);
   536               case Gear^.Kind of
   443                 vgtDust: if Gear^.State = 1 then
   537                   vgtSmoke: DrawSprite(sprSmoke, round(Gear^.X) + WorldDx - 11, round(Gear^.Y) + WorldDy - 11, 7 - Gear^.Frame);
   444                              DrawSprite(sprSnowDust, round(Gear^.X) + WorldDx - 11, round(Gear^.Y) + WorldDy - 11, 7 - Gear^.Frame)
   538                   vgtSmokeWhite: DrawSprite(sprSmokeWhite, round(Gear^.X) + WorldDx - 11, round(Gear^.Y) + WorldDy - 11, 7 - Gear^.Frame);
   445                          else
   539                   vgtDust: if Gear^.State = 1 then
   446                              DrawSprite(sprDust, round(Gear^.X) + WorldDx - 11, round(Gear^.Y) + WorldDy - 11, 7 - Gear^.Frame);
   540                                DrawSprite(sprSnowDust, round(Gear^.X) + WorldDx - 11, round(Gear^.Y) + WorldDy - 11, 7 - Gear^.Frame)
   447                 vgtFire: if (Gear^.State and gstTmpFlag) = 0 then
       
   448                              DrawSprite(sprFlame, round(Gear^.X) + WorldDx - 8, round(Gear^.Y) + WorldDy, (RealTicks shr 6 + Gear^.Frame) mod 8)
       
   449                          else
       
   450                              DrawTextureF(SpritesData[sprFlame].Texture, Gear^.FrameTicks / 900, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, (RealTicks shr 7 + Gear^.Frame) mod 8, 1, 16, 16);
       
   451                 vgtSplash: if SuddenDeathDmg then
       
   452                                DrawSprite(sprSDSplash, round(Gear^.X) + WorldDx - 40, round(Gear^.Y) + WorldDy - 58, 19 - (Gear^.FrameTicks div 37))
       
   453                            else
   541                            else
   454                                DrawSprite(sprSplash, round(Gear^.X) + WorldDx - 40, round(Gear^.Y) + WorldDy - 58, 19 - (Gear^.FrameTicks div 37));
   542                                DrawSprite(sprDust, round(Gear^.X) + WorldDx - 11, round(Gear^.Y) + WorldDy - 11, 7 - Gear^.Frame);
   455                 vgtDroplet: if SuddenDeathDmg then
   543                   vgtFire: if (Gear^.State and gstTmpFlag) = 0 then
   456                                 DrawSprite(sprSDDroplet, round(Gear^.X) + WorldDx - 8, round(Gear^.Y) + WorldDy - 8, Gear^.Frame)
   544                                DrawSprite(sprFlame, round(Gear^.X) + WorldDx - 8, round(Gear^.Y) + WorldDy, (RealTicks shr 6 + Gear^.Frame) mod 8)
   457                             else
   545                            else
   458                                 DrawSprite(sprDroplet, round(Gear^.X) + WorldDx - 8, round(Gear^.Y) + WorldDy - 8, Gear^.Frame);
   546                                DrawTextureF(SpritesData[sprFlame].Texture, Gear^.FrameTicks / 900, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, (RealTicks shr 7 + Gear^.Frame) mod 8, 1, 16, 16);
   459                 vgtBubble: DrawSprite(sprBubbles, round(Gear^.X) + WorldDx - 8, round(Gear^.Y) + WorldDy - 8, Gear^.Frame);//(RealTicks div 64 + Gear^.Frame) mod 8);
   547                   vgtSplash: if SuddenDeathDmg then
   460             end;
   548                                  DrawSprite(sprSDSplash, round(Gear^.X) + WorldDx - 40, round(Gear^.Y) + WorldDy - 58, 19 - (Gear^.FrameTicks div 37))
   461         //if (Gear^.Tint <> $FFFFFFFF) or tinted then Tint($FF,$FF,$FF,$FF);
   549                              else
   462         if (Gear^.Tint <> $FFFFFFFF) then Tint($FF,$FF,$FF,$FF);
   550                                  DrawSprite(sprSplash, round(Gear^.X) + WorldDx - 40, round(Gear^.Y) + WorldDy - 58, 19 - (Gear^.FrameTicks div 37));
   463         Gear:= Gear^.NextGear
   551                   vgtDroplet: if SuddenDeathDmg then
       
   552                                   DrawSprite(sprSDDroplet, round(Gear^.X) + WorldDx - 8, round(Gear^.Y) + WorldDy - 8, Gear^.Frame)
       
   553                               else
       
   554                                   DrawSprite(sprDroplet, round(Gear^.X) + WorldDx - 8, round(Gear^.Y) + WorldDy - 8, Gear^.Frame);
       
   555                   vgtBubble: DrawSprite(sprBubbles, round(Gear^.X) + WorldDx - 8, round(Gear^.Y) + WorldDy - 8, Gear^.Frame);//(RealTicks div 64 + Gear^.Frame) mod 8);
       
   556               end;
       
   557           //if (Gear^.Tint <> $FFFFFFFF) or tinted then Tint($FF,$FF,$FF,$FF);
       
   558           if (Gear^.Tint <> $FFFFFFFF) then Tint($FF,$FF,$FF,$FF);
       
   559           Gear:= Gear^.NextGear
       
   560           end
   464        end;
   561        end;
   465     // this layer is on the screen plane (depth = 0) when stereo
   562     // this layer is on the screen plane (depth = 0) when stereo
   466     3: while Gear <> nil do
   563     3: begin
   467         begin
   564        Gear:= VisualGearsLayer3;
   468         tinted:= false;
   565        while Gear <> nil do
   469         if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
   566            begin
   470         case Gear^.Kind of
   567            tinted:= false;
   471             vgtSpeechBubble: begin
   568            if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
   472                              if (Gear^.Tex <> nil) and (((Gear^.State = 0) and (Gear^.Hedgehog^.Team <> CurrentTeam)) or (Gear^.State = 1)) then
   569            case Gear^.Kind of
   473                                  begin
   570                vgtSpeechBubble: begin
   474                                  tinted:= true;
   571                                 if (Gear^.Tex <> nil) and (((Gear^.State = 0) and (Gear^.Hedgehog^.Team <> CurrentTeam)) or (Gear^.State = 1)) then
   475                                  Tint($FF, $FF, $FF,  $66);
   572                                     begin
   476                                  DrawCentered(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Tex)
   573                                     tinted:= true;
   477                                  end
   574                                     Tint($FF, $FF, $FF,  $66);
   478                              else if (Gear^.Tex <> nil) and (((Gear^.State = 0) and (Gear^.Hedgehog^.Team = CurrentTeam)) or (Gear^.State = 2)) then
   575                                     DrawCentered(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Tex)
   479                                  DrawCentered(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Tex);
   576                                     end
   480                              end;
   577                                 else if (Gear^.Tex <> nil) and (((Gear^.State = 0) and (Gear^.Hedgehog^.Team = CurrentTeam)) or (Gear^.State = 2)) then
   481             vgtSmallDamageTag: DrawCentered(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Tex);
   578                                     DrawCentered(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Tex);
   482             vgtHealthTag: if Gear^.Tex <> nil then 
   579                                 end;
   483                             begin
   580                vgtSmallDamageTag: DrawCentered(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Tex);
   484                             if Gear^.Frame = 0 then 
   581                vgtHealthTag: if Gear^.Tex <> nil then 
   485                                 DrawCentered(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Tex)
   582                                begin
   486                             else
   583                                if Gear^.Frame = 0 then 
   487                                 begin
   584                                    DrawCentered(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Tex)
   488                                 if Gear^.Angle <> 0 then SetScale(Gear^.Angle)
   585                                else
   489                                 else SetScale(cDefaultZoomLevel); 
   586                                    begin
   490                                 DrawTexture(round(Gear^.X), round(Gear^.Y), Gear^.Tex); 
   587                                    SetScale(cDefaultZoomLevel);
   491                                 SetScale(zoom)
   588                                    if Gear^.Angle = 0 then DrawTexture(round(Gear^.X), round(Gear^.Y), Gear^.Tex)
   492                                 end
   589                                    else DrawTexture(round(Gear^.X), round(Gear^.Y), Gear^.Tex, Gear^.Angle); 
   493                             end;
   590                                    SetScale(zoom)
   494 //if Gear^.Tex <> nil then DrawCentered(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Tex);
   591                                    end
   495             vgtStraightShot: DrawRotatedF(TSprite(Gear^.State), round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
   592                                end;
   496         end;
   593     //if Ger^.Tex <> nil then DrawCentered(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Tex);
   497         if (cReducedQuality and rqAntiBoom) = 0 then
   594                vgtStraightShot: DrawRotatedF(TSprite(Gear^.State), round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
   498             case Gear^.Kind of
   595            end;
   499                 vgtChunk: DrawRotatedF(sprChunk, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
   596            if (cReducedQuality and rqAntiBoom) = 0 then
   500             end;
   597                case Gear^.Kind of
   501         if (Gear^.Tint <> $FFFFFFFF) or tinted then Tint($FF,$FF,$FF,$FF);
   598                    vgtChunk: DrawRotatedF(sprChunk, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
   502         Gear:= Gear^.NextGear
   599                end;
       
   600            if (Gear^.Tint <> $FFFFFFFF) or tinted then Tint($FF,$FF,$FF,$FF);
       
   601            Gear:= Gear^.NextGear
       
   602            end
   503        end;
   603        end;
   504     // this layer is outside the screen when stereo
   604     // this layer is outside the screen when stereo
   505     2: while Gear <> nil do
   605     2: begin
   506         begin
   606        Gear:= VisualGearsLayer2;
   507         tinted:= false;
   607        while Gear <> nil do
   508         if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
   608            begin
   509         case Gear^.Kind of
   609            tinted:= false;
   510             vgtExplosion: DrawSprite(sprExplosion50, round(Gear^.X) - 32 + WorldDx, round(Gear^.Y) - 32 + WorldDy, Gear^.State);
   610            if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
   511             vgtBigExplosion: begin
   611            case Gear^.Kind of
   512                              tinted:= true;
   612                vgtExplosion: DrawSprite(sprExplosion50, round(Gear^.X) - 32 + WorldDx, round(Gear^.Y) - 32 + WorldDy, Gear^.State);
   513                              Tint($FF, $FF, $FF, round($FF * (1 - power(Gear^.Timer / 250, 4))));
   613                vgtBigExplosion: begin
   514                              DrawRotatedTextureF(SpritesData[sprBigExplosion].Texture, 0.85 * (-power(2, -10 * Int(Gear^.Timer)/250) + 1) + 0.4, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, 0, 1, 385, 385, Gear^.Angle);
   614                                 tinted:= true;
       
   615                                 Tint($FF, $FF, $FF, round($FF * (1 - power(Gear^.Timer / 250, 4))));
       
   616                                 DrawRotatedTextureF(SpritesData[sprBigExplosion].Texture, 0.85 * (-power(2, -10 * Int(Gear^.Timer)/250) + 1) + 0.4, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, 0, 1, 385, 385, Gear^.Angle);
       
   617                                 end;
       
   618            end;
       
   619            if (cReducedQuality and rqAntiBoom) = 0 then
       
   620                case Gear^.Kind of
       
   621                    vgtExplPart: DrawSprite(sprExplPart, round(Gear^.X) + WorldDx - 16, round(Gear^.Y) + WorldDy - 16, 7 - Gear^.Frame);
       
   622                    vgtExplPart2: DrawSprite(sprExplPart2, round(Gear^.X) + WorldDx - 16, round(Gear^.Y) + WorldDy - 16, 7 - Gear^.Frame);
       
   623                    vgtSteam: DrawSprite(sprSmokeWhite, round(Gear^.X) + WorldDx - 11, round(Gear^.Y) + WorldDy - 11, 7 - Gear^.Frame);
       
   624                    vgtAmmo: begin
       
   625                             tinted:= true;
       
   626                             Tint($FF, $FF, $FF, round(Gear^.alpha * $FF));
       
   627                             DrawTextureF(ropeIconTex, Gear^.scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, 0, 1, 32, 32);
       
   628                             DrawTextureF(SpritesData[sprAMAmmos].Texture, Gear^.scale * 0.90, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame - 1, 1, 32, 32);
       
   629                             end;
       
   630                    vgtShell: begin
       
   631                              if Gear^.FrameTicks < $FF then
       
   632                                  begin
       
   633                                  Tint($FF, $FF, $FF, Gear^.FrameTicks);
       
   634                                  tinted:= true
       
   635                                  end;
       
   636                              DrawRotatedF(sprShell, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
   515                              end;
   637                              end;
   516         end;
   638                    vgtFeather: begin
   517         if (cReducedQuality and rqAntiBoom) = 0 then
   639                                if Gear^.FrameTicks < 255 then
   518             case Gear^.Kind of
   640                                    begin
   519                 vgtExplPart: DrawSprite(sprExplPart, round(Gear^.X) + WorldDx - 16, round(Gear^.Y) + WorldDy - 16, 7 - Gear^.Frame);
   641                                    Tint($FF, $FF, $FF, Gear^.FrameTicks);
   520                 vgtExplPart2: DrawSprite(sprExplPart2, round(Gear^.X) + WorldDx - 16, round(Gear^.Y) + WorldDy - 16, 7 - Gear^.Frame);
   642                                    tinted:= true
   521                 vgtSteam: DrawSprite(sprSmokeWhite, round(Gear^.X) + WorldDx - 11, round(Gear^.Y) + WorldDy - 11, 7 - Gear^.Frame);
   643                                    end;
   522                 vgtAmmo: begin
   644                                DrawRotatedF(sprFeather, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
   523                          tinted:= true;
   645                              end;
   524                          Tint($FF, $FF, $FF, round(Gear^.alpha * $FF));
   646                    vgtEgg: begin
   525                          DrawTextureF(ropeIconTex, Gear^.scale, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, 0, 1, 32, 32);
   647                            if Gear^.FrameTicks < $FF then
   526                          DrawTextureF(SpritesData[sprAMAmmos].Texture, Gear^.scale * 0.90, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame - 1, 1, 32, 32);
   648                                begin
   527                          end;
   649                                    Tint($FF, $FF, $FF, Gear^.FrameTicks);
   528                 vgtShell: begin
   650                                    tinted:= true
   529                           if Gear^.FrameTicks < $FF then
   651                                end;
       
   652                            DrawRotatedF(sprEgg, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
       
   653                            end;
       
   654                    vgtBeeTrace: begin
       
   655                                 if Gear^.FrameTicks < $FF then
       
   656                                     Tint($FF, $FF, $FF, Gear^.FrameTicks div 2)
       
   657                                 else
       
   658                                     Tint($FF, $FF, $FF, $80);
       
   659                                 tinted:= true;
       
   660                                 DrawRotatedF(sprBeeTrace, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, (RealTicks shr 4) mod cMaxAngle);
       
   661                                 end;
       
   662                    vgtSmokeRing: begin
       
   663                                  tinted:= true;
       
   664                                  Tint($FF, $FF, $FF, round(Gear^.alpha * $FF));
       
   665                                  DrawRotatedTextureF(SpritesData[sprSmokeRing].Texture, Gear^.scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, 0, 1, 200, 200, Gear^.Angle);
       
   666                                  end;
       
   667                    vgtNote: DrawRotatedF(sprNote, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
       
   668                    vgtBulletHit: DrawRotatedF(sprBulletHit, round(Gear^.X) + WorldDx - 0, round(Gear^.Y) + WorldDy - 0, 7 - (Gear^.FrameTicks div 50), 1, Gear^.Angle);
       
   669                end;
       
   670            case Gear^.Kind of
       
   671                vgtCircle: if gear^.Angle = 1 then
   530                               begin
   672                               begin
   531                               Tint($FF, $FF, $FF, Gear^.FrameTicks);
   673                               tmp:= Gear^.State / 100;
   532                               tinted:= true
   674                               DrawTexture(round(Gear^.X-24*tmp) + WorldDx, round(Gear^.Y-24*tmp) + WorldDy, SpritesData[sprVampiric].Texture, tmp)
   533                               end;
   675                               end
   534                           DrawRotatedF(sprShell, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
   676                           else DrawCircle(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State, Gear^.Timer);
   535                           end;
   677            end;
   536                 vgtFeather: begin
   678            if (Gear^.Tint <> $FFFFFFFF) or tinted then Tint($FF,$FF,$FF,$FF);
   537                             if Gear^.FrameTicks < 255 then
   679            Gear:= Gear^.NextGear
   538                                 begin
   680            end
   539                                 Tint($FF, $FF, $FF, Gear^.FrameTicks);
       
   540                                 tinted:= true
       
   541                                 end;
       
   542                             DrawRotatedF(sprFeather, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
       
   543                           end;
       
   544                 vgtEgg: begin
       
   545                         if Gear^.FrameTicks < $FF then
       
   546                             begin
       
   547                                 Tint($FF, $FF, $FF, Gear^.FrameTicks);
       
   548                                 tinted:= true
       
   549                             end;
       
   550                         DrawRotatedF(sprEgg, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
       
   551                         end;
       
   552                 vgtBeeTrace: begin
       
   553                              if Gear^.FrameTicks < $FF then
       
   554                                  Tint($FF, $FF, $FF, Gear^.FrameTicks div 2)
       
   555                              else
       
   556                                  Tint($FF, $FF, $FF, $80);
       
   557                              tinted:= true;
       
   558                              DrawRotatedF(sprBeeTrace, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, (RealTicks shr 4) mod cMaxAngle);
       
   559                              end;
       
   560                 vgtSmokeRing: begin
       
   561                               tinted:= true;
       
   562                               Tint($FF, $FF, $FF, round(Gear^.alpha * $FF));
       
   563                               DrawRotatedTextureF(SpritesData[sprSmokeRing].Texture, Gear^.scale, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, 0, 1, 200, 200, Gear^.Angle);
       
   564                               end;
       
   565                 vgtNote: DrawRotatedF(sprNote, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Frame, 1, Gear^.Angle);
       
   566                 vgtBulletHit: DrawRotatedF(sprBulletHit, round(Gear^.X) + WorldDx - 0, round(Gear^.Y) + WorldDy - 0, 7 - (Gear^.FrameTicks div 50), 1, Gear^.Angle);
       
   567             end;
       
   568         case Gear^.Kind of
       
   569             vgtCircle: if gear^.Angle = 1 then
       
   570                            begin
       
   571                            tmp:= Gear^.State / 100;
       
   572                            DrawTexture(round(Gear^.X-24*tmp) + WorldDx, round(Gear^.Y-24*tmp) + WorldDy, SpritesData[sprVampiric].Texture, tmp)
       
   573                            end
       
   574                        else DrawCircle(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State, Gear^.Timer);
       
   575         end;
       
   576         if (Gear^.Tint <> $FFFFFFFF) or tinted then Tint($FF,$FF,$FF,$FF);
       
   577         Gear:= Gear^.NextGear
       
   578        end
   681        end
   579     end;
   682     end;
   580 end;
   683 end;
   581 
   684 
   582 function  VisualGearByUID(uid : Longword) : PVisualGear;
   685 function  VisualGearByUID(uid : Longword) : PVisualGear;
   587 if (lastVisualGearByUID <> nil) and (lastVisualGearByUID^.uid = uid) then
   690 if (lastVisualGearByUID <> nil) and (lastVisualGearByUID^.uid = uid) then
   588     begin
   691     begin
   589     VisualGearByUID:= lastVisualGearByUID;
   692     VisualGearByUID:= lastVisualGearByUID;
   590     exit
   693     exit
   591     end;
   694     end;
   592 vg:= VisualGearsList;
   695 vg:= VisualGearsLayer0;
       
   696 while vg <> nil do
       
   697     begin
       
   698     if vg^.uid = uid then
       
   699         begin
       
   700         lastVisualGearByUID:= vg;
       
   701         VisualGearByUID:= vg;
       
   702         exit
       
   703         end;
       
   704     vg:= vg^.NextGear
       
   705     end;
       
   706 vg:= VisualGearsLayer1;
       
   707 while vg <> nil do
       
   708     begin
       
   709     if vg^.uid = uid then
       
   710         begin
       
   711         lastVisualGearByUID:= vg;
       
   712         VisualGearByUID:= vg;
       
   713         exit
       
   714         end;
       
   715     vg:= vg^.NextGear
       
   716     end;
       
   717 vg:= VisualGearsLayer2;
       
   718 while vg <> nil do
       
   719     begin
       
   720     if vg^.uid = uid then
       
   721         begin
       
   722         lastVisualGearByUID:= vg;
       
   723         VisualGearByUID:= vg;
       
   724         exit
       
   725         end;
       
   726     vg:= vg^.NextGear
       
   727     end;
       
   728 vg:= VisualGearsLayer3;
   593 while vg <> nil do
   729 while vg <> nil do
   594     begin
   730     begin
   595     if vg^.uid = uid then
   731     if vg^.uid = uid then
   596         begin
   732         begin
   597         lastVisualGearByUID:= vg;
   733         lastVisualGearByUID:= vg;
   612 procedure ChangeToSDClouds;
   748 procedure ChangeToSDClouds;
   613 var       i: LongInt;
   749 var       i: LongInt;
   614     vg, tmp: PVisualGear;
   750     vg, tmp: PVisualGear;
   615 begin
   751 begin
   616 if cCloudsNumber = cSDCloudsNumber then exit;
   752 if cCloudsNumber = cSDCloudsNumber then exit;
   617 vg:= VisualGearsList;
   753 vg:= VisualGearsLayer0;
   618 while vg <> nil do
   754 while vg <> nil do
   619     if vg^.Kind = vgtCloud then
   755     if vg^.Kind = vgtCloud then
   620         begin
   756         begin
   621         tmp:= vg^.NextGear;
   757         tmp:= vg^.NextGear;
   622         DeleteVisualGear(vg);
   758         DeleteVisualGear(vg);
   644 var       i: LongInt;
   780 var       i: LongInt;
   645     vg, tmp: PVisualGear;
   781     vg, tmp: PVisualGear;
   646 begin
   782 begin
   647 if (cReducedQuality and rqKillFlakes) <> 0 then exit;
   783 if (cReducedQuality and rqKillFlakes) <> 0 then exit;
   648 if vobCount = vobSDCount then exit;
   784 if vobCount = vobSDCount then exit;
   649 vg:= VisualGearsList;
   785 vg:= VisualGearsLayer0;
   650 while vg <> nil do
   786 while vg <> nil do
   651     if vg^.Kind = vgtFlake then
   787     if vg^.Kind = vgtFlake then
   652         begin
   788         begin
   653         tmp:= vg^.NextGear;
   789         tmp:= vg^.NextGear;
   654         DeleteVisualGear(vg);
   790         DeleteVisualGear(vg);
   663         AddVisualGear(cLeftScreenBorder + random(cScreenSpace), random(1024+200) - 100 + LAND_HEIGHT, vgtFlake);
   799         AddVisualGear(cLeftScreenBorder + random(cScreenSpace), random(1024+200) - 100 + LAND_HEIGHT, vgtFlake);
   664 end;
   800 end;
   665 
   801 
   666 procedure initModule;
   802 procedure initModule;
   667 begin
   803 begin
   668     VisualGearsList:= nil;
   804     VisualGearsLayer0:= nil;
       
   805     VisualGearsLayer1:= nil;
       
   806     VisualGearsLayer2:= nil;
       
   807     VisualGearsLayer3:= nil;
   669 end;
   808 end;
   670 
   809 
   671 procedure freeModule;
   810 procedure freeModule;
   672 begin
   811 begin
   673     while VisualGearsList <> nil do DeleteVisualGear(VisualGearsList);
   812     while VisualGearsLayer0 <> nil do DeleteVisualGear(VisualGearsLayer0);
       
   813     while VisualGearsLayer1 <> nil do DeleteVisualGear(VisualGearsLayer1);
       
   814     while VisualGearsLayer2 <> nil do DeleteVisualGear(VisualGearsLayer2);
       
   815     while VisualGearsLayer3 <> nil do DeleteVisualGear(VisualGearsLayer3);
   674 end;
   816 end;
   675 
   817 
   676 end.
   818 end.