hedgewars/uVisualGears.pas
changeset 6302 db8bdbb34e03
parent 6291 cfd2483b8c97
child 6306 553680d78546
equal deleted inserted replaced
6301:1259736c0134 6302:db8bdbb34e03
   336 
   336 
   337 if State <> 0 then gear^.State:= State;
   337 if State <> 0 then gear^.State:= State;
   338 
   338 
   339 case Gear^.Kind of
   339 case Gear^.Kind of
   340     vgtFlake: if cFlattenFlakes then gear^.Layer:= 0
   340     vgtFlake: if cFlattenFlakes then gear^.Layer:= 0
   341               else if random(3) <> 0 then gear^.Layer:= 0   // 67%
   341               else if random(3) = 0 then gear^.Layer:= 0   // 33% - far back
   342               else if random(3) <> 0 then gear^.Layer:= 1  // 22%
   342               else if random(3) = 0 then gear^.Layer:= 4   // 22% - mid-distance
   343               else gear^.Layer:= random(2)+2;  // 6% each
   343               else if random(2) = 0 then gear^.Layer:= 5   // 22% - just behind land
   344 
   344               else if random(4) = 0 then gear^.Layer:= 6   // 15% - just in front of land
   345     // 0: this layer is very distant in the background when stereo
   345               else gear^.Layer:= 2;  // 7% - close up
       
   346 
       
   347     vgtCloud: if cFlattenClouds then gear^.Layer:= 5
       
   348               else if random(3) = 0 then gear^.Layer:= 0
       
   349               else gear^.Layer:= random(2) + 4;
       
   350 
       
   351     // 0: this layer is very distant in the background when in stereo
   346     vgtTeamHealthSorter,
   352     vgtTeamHealthSorter,
   347     vgtSmoothWindBar,
   353     vgtSmoothWindBar: gear^.Layer:= 0;
   348     vgtCloud: gear^.Layer:= 0;
   354 
   349 
   355 
   350     // 1: this layer is on the land level (which is close but behind the screen plane) when stereo
   356     // 1: this layer is on the land level (which is close but behind the screen plane) when stereo
   351     vgtSmokeTrace,
   357     vgtSmokeTrace,
   352     vgtEvilTrace,
   358     vgtEvilTrace,
   353     vgtLineTrail,
   359     vgtLineTrail,
   412 var Gear, t: PVisualGear;
   418 var Gear, t: PVisualGear;
   413     i: LongWord;
   419     i: LongWord;
   414 begin
   420 begin
   415 if Steps = 0 then exit;
   421 if Steps = 0 then exit;
   416 
   422 
   417 for i:= 0 to 3 do
   423 for i:= 0 to 6 do
   418     begin
   424     begin
   419     t:= VisualGearLayers[i];
   425     t:= VisualGearLayers[i];
   420     while t <> nil do
   426     while t <> nil do
   421           begin
   427           begin
   422           Gear:= t;
   428           Gear:= t;
   426     end
   432     end
   427 end;
   433 end;
   428 
   434 
   429 procedure KickFlakes(Radius, X, Y: LongInt);
   435 procedure KickFlakes(Radius, X, Y: LongInt);
   430 var Gear, t: PVisualGear;
   436 var Gear, t: PVisualGear;
   431     dmg: LongInt;
   437     dmg, i: LongInt;
   432 begin
   438 begin
   433 if (vobCount = 0) or (vobCount > 200) then exit;
   439 if (vobCount = 0) or (vobCount > 200) then exit;
   434 t:= VisualGearLayers[1];
   440 t:= VisualGearLayers[1];
   435 while t <> nil do
   441 while t <> nil do
   436       begin
   442       begin
   448               Gear^.Timer:= 200
   454               Gear^.Timer:= 200
   449               end
   455               end
   450           end;
   456           end;
   451       t:= Gear^.NextGear
   457       t:= Gear^.NextGear
   452       end;
   458       end;
   453 t:= VisualGearLayers[3];
   459 for i:= 3 to 6 do
   454 while t <> nil do
   460     begin
   455       begin
   461     t:= VisualGearLayers[i];
   456       Gear:= t;
   462     while t <> nil do
   457       if Gear^.Kind = vgtFlake then
       
   458           begin
   463           begin
   459           // Damage calc from doMakeExplosion
   464           Gear:= t;
   460           dmg:= Min(101, Radius + cHHRadius div 2 - LongInt(abs(round(Gear^.X) - X) + abs(round(Gear^.Y) - Y)) div 5);
   465           if Gear^.Kind = vgtFlake then
   461           if dmg > 1 then
       
   462               begin
   466               begin
   463               Gear^.tdX:= 0.02 * dmg + 0.01;
   467               // Damage calc from doMakeExplosion
   464               if Gear^.X - X < 0 then Gear^.tdX := -Gear^.tdX;
   468               dmg:= Min(101, Radius + cHHRadius div 2 - LongInt(abs(round(Gear^.X) - X) + abs(round(Gear^.Y) - Y)) div 5);
   465               Gear^.tdY:= 0.02 * dmg + 0.01;
   469               if dmg > 1 then
   466               if Gear^.Y - Y < 0 then Gear^.tdY := -Gear^.tdY;
   470                   begin
   467               Gear^.Timer:= 200
   471                   Gear^.tdX:= 0.02 * dmg + 0.01;
   468               end
   472                   if Gear^.X - X < 0 then Gear^.tdX := -Gear^.tdX;
   469           end;
   473                   Gear^.tdY:= 0.02 * dmg + 0.01;
   470       t:= Gear^.NextGear
   474                   if Gear^.Y - Y < 0 then Gear^.tdY := -Gear^.tdY;
   471       end
   475                   Gear^.Timer:= 200
       
   476                   end
       
   477               end;
       
   478           t:= Gear^.NextGear
       
   479           end
       
   480      end
   472 end;
   481 end;
   473 
   482 
   474 procedure DrawVisualGears(Layer: LongWord);
   483 procedure DrawVisualGears(Layer: LongWord);
   475 var Gear: PVisualGear;
   484 var Gear: PVisualGear;
   476     tinted: boolean;
   485     tinted: boolean;
   483        Gear:= VisualGearLayers[0];
   492        Gear:= VisualGearLayers[0];
   484        while Gear <> nil do
   493        while Gear <> nil do
   485            begin
   494            begin
   486            if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
   495            if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
   487            case Gear^.Kind of
   496            case Gear^.Kind of
       
   497               vgtCloud: if SuddenDeathDmg then
       
   498                              DrawTextureF(SpritesData[sprSDCloud].Texture, 0.5, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprCloud].Width, SpritesData[sprCloud].Height)
       
   499                          else
       
   500                             DrawTextureF(SpritesData[sprCloud].Texture, 0.5, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprCloud].Width, SpritesData[sprCloud].Height);
   488                vgtFlake: if cFlattenFlakes then
   501                vgtFlake: if cFlattenFlakes then
   489                              begin
   502                              begin
   490                              if SuddenDeathDmg then
   503                              if SuddenDeathDmg then
   491                                  if vobSDVelocity = 0 then
   504                                  if vobSDVelocity = 0 then
   492                                      DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   505                                      DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   509                                  if vobVelocity = 0 then
   522                                  if vobVelocity = 0 then
   510                                      DrawTextureF(SpritesData[sprFlake].Texture, 0.5, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height)
   523                                      DrawTextureF(SpritesData[sprFlake].Texture, 0.5, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height)
   511                                  else
   524                                  else
   512                                      DrawRotatedTextureF(SpritesData[sprFlake].Texture, 0.5, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height, Gear^.Angle)
   525                                      DrawRotatedTextureF(SpritesData[sprFlake].Texture, 0.5, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height, Gear^.Angle)
   513                              end;
   526                              end;
   514                vgtCloud: if SuddenDeathDmg then
       
   515                              DrawSprite(sprSDCloud, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
       
   516                          else
       
   517                              DrawSprite(sprCloud, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame);
       
   518                end;
   527                end;
   519            if Gear^.Tint <> $FFFFFFFF then Tint($FF,$FF,$FF,$FF);
   528            if Gear^.Tint <> $FFFFFFFF then Tint($FF,$FF,$FF,$FF);
   520            Gear:= Gear^.NextGear
   529            Gear:= Gear^.NextGear
   521            end
   530            end
   522        end;
   531        end;
   575        while Gear <> nil do
   584        while Gear <> nil do
   576            begin
   585            begin
   577            tinted:= false;
   586            tinted:= false;
   578            if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
   587            if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
   579            case Gear^.Kind of
   588            case Gear^.Kind of
       
   589 (*
   580               vgtFlake: if SuddenDeathDmg then
   590               vgtFlake: if SuddenDeathDmg then
   581                              if vobSDVelocity = 0 then
   591                              if vobSDVelocity = 0 then
   582                                  DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   592                                  DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   583                              else
   593                              else
   584                                  DrawRotatedF(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle)
   594                                  DrawRotatedF(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle)
   585                          else
   595                          else
   586                              if vobVelocity = 0 then
   596                              if vobVelocity = 0 then
   587                                  DrawSprite(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   597                                  DrawSprite(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
   588                              else
   598                              else
   589                                  DrawRotatedF(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle);
   599                                  DrawRotatedF(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle);*)
   590                vgtSpeechBubble: begin
   600                vgtSpeechBubble: begin
   591                                 if (Gear^.Tex <> nil) and (((Gear^.State = 0) and (Gear^.Hedgehog^.Team <> CurrentTeam)) or (Gear^.State = 1)) then
   601                                 if (Gear^.Tex <> nil) and (((Gear^.State = 0) and (Gear^.Hedgehog^.Team <> CurrentTeam)) or (Gear^.State = 1)) then
   592                                     begin
   602                                     begin
   593                                     tinted:= true;
   603                                     tinted:= true;
   594                                     Tint($FF, $FF, $FF,  $66);
   604                                     Tint($FF, $FF, $FF,  $66);
   701                           else DrawCircle(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State, Gear^.Timer);
   711                           else DrawCircle(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State, Gear^.Timer);
   702            end;
   712            end;
   703            if (Gear^.Tint <> $FFFFFFFF) or tinted then Tint($FF,$FF,$FF,$FF);
   713            if (Gear^.Tint <> $FFFFFFFF) or tinted then Tint($FF,$FF,$FF,$FF);
   704            Gear:= Gear^.NextGear
   714            Gear:= Gear^.NextGear
   705            end
   715            end
   706        end
   716        end;
       
   717     // this layer is half-way between the screen plane (depth = 0) when in stereo, and the land
       
   718     4: begin
       
   719        Gear:= VisualGearLayers[4];
       
   720        while Gear <> nil do
       
   721            begin
       
   722            if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
       
   723            case Gear^.Kind of
       
   724               vgtCloud: if SuddenDeathDmg then
       
   725                              DrawTextureF(SpritesData[sprSDCloud].Texture, 0.8, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprCloud].Width, SpritesData[sprCloud].Height)
       
   726                          else
       
   727                             DrawTextureF(SpritesData[sprCloud].Texture, 0.8, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprCloud].Width, SpritesData[sprCloud].Height);
       
   728               vgtFlake: if SuddenDeathDmg then
       
   729                              if vobSDVelocity = 0 then
       
   730                                  DrawTextureF(SpritesData[sprSDFlake].Texture, 0.8, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height)
       
   731                              else
       
   732                                  DrawRotatedTextureF(SpritesData[sprSDFlake].Texture, 0.8, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height, Gear^.Angle)
       
   733                          else
       
   734                              if vobVelocity = 0 then
       
   735                                  DrawTextureF(SpritesData[sprFlake].Texture, 0.8, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height)
       
   736                              else
       
   737                                  DrawRotatedTextureF(SpritesData[sprFlake].Texture, 0.8, 0, 0, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, SpritesData[sprFlake].Width, SpritesData[sprFlake].Height, Gear^.Angle);
       
   738                end;
       
   739            if (Gear^.Tint <> $FFFFFFFF) then Tint($FF,$FF,$FF,$FF);
       
   740            Gear:= Gear^.NextGear
       
   741            end
       
   742        end;
       
   743     // this layer is on the screen plane (depth = 0) when stereo, but just behind the land
       
   744     5: begin
       
   745        Gear:= VisualGearLayers[5];
       
   746        while Gear <> nil do
       
   747            begin
       
   748            if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
       
   749            case Gear^.Kind of
       
   750                vgtCloud: if SuddenDeathDmg then
       
   751                              DrawSprite(sprSDCloud, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
       
   752                          else
       
   753                              DrawSprite(sprCloud, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame);
       
   754               vgtFlake: if SuddenDeathDmg then
       
   755                              if vobSDVelocity = 0 then
       
   756                                  DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
       
   757                              else
       
   758                                  DrawRotatedF(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle)
       
   759                          else
       
   760                              if vobVelocity = 0 then
       
   761                                  DrawSprite(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
       
   762                              else
       
   763                                  DrawRotatedF(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle);
       
   764                end;
       
   765            if (Gear^.Tint <> $FFFFFFFF) then Tint($FF,$FF,$FF,$FF);
       
   766            Gear:= Gear^.NextGear
       
   767            end
       
   768        end;
       
   769     // this layer is on the screen plane (depth = 0) when stereo, but just in front of the land
       
   770     6: begin
       
   771        Gear:= VisualGearLayers[6];
       
   772        while Gear <> nil do
       
   773            begin
       
   774            if Gear^.Tint <> $FFFFFFFF then Tint(Gear^.Tint);
       
   775            case Gear^.Kind of
       
   776               vgtFlake: if SuddenDeathDmg then
       
   777                              if vobSDVelocity = 0 then
       
   778                                  DrawSprite(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
       
   779                              else
       
   780                                  DrawRotatedF(sprSDFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle)
       
   781                          else
       
   782                              if vobVelocity = 0 then
       
   783                                  DrawSprite(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame)
       
   784                              else
       
   785                                  DrawRotatedF(sprFlake, round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy + SkyOffset, Gear^.Frame, 1, Gear^.Angle);
       
   786                end;
       
   787            if (Gear^.Tint <> $FFFFFFFF) then Tint($FF,$FF,$FF,$FF);
       
   788            Gear:= Gear^.NextGear
       
   789            end
       
   790        end;
   707     end;
   791     end;
   708 end;
   792 end;
   709 
   793 
   710 function  VisualGearByUID(uid : Longword) : PVisualGear;
   794 function  VisualGearByUID(uid : Longword) : PVisualGear;
   711 var vg: PVisualGear;
   795 var vg: PVisualGear;
   777 var       i: LongInt;
   861 var       i: LongInt;
   778     vg, tmp: PVisualGear;
   862     vg, tmp: PVisualGear;
   779 begin
   863 begin
   780 if (cReducedQuality and rqKillFlakes) <> 0 then exit;
   864 if (cReducedQuality and rqKillFlakes) <> 0 then exit;
   781 if vobCount = vobSDCount then exit;
   865 if vobCount = vobSDCount then exit;
   782 for i:= 0 to 3 do
   866 for i:= 0 to 6 do
   783     begin
   867     begin
   784     vg:= VisualGearLayers[i];
   868     vg:= VisualGearLayers[i];
   785     while vg <> nil do
   869     while vg <> nil do
   786         if vg^.Kind = vgtFlake then
   870         if vg^.Kind = vgtFlake then
   787         begin
   871         begin
   800 end;
   884 end;
   801 
   885 
   802 procedure initModule;
   886 procedure initModule;
   803 var i: LongWord;
   887 var i: LongWord;
   804 begin
   888 begin
   805 for i:= 0 to 3 do
   889 for i:= 0 to 6 do
   806     VisualGearLayers[i]:= nil;
   890     VisualGearLayers[i]:= nil;
   807 end;
   891 end;
   808 
   892 
   809 procedure freeModule;
   893 procedure freeModule;
   810 var i: LongWord;
   894 var i: LongWord;
   811 begin
   895 begin
   812 for i:= 0 to 3 do
   896 for i:= 0 to 6 do
   813     while VisualGearLayers[i] <> nil do DeleteVisualGear(VisualGearLayers[i]);
   897     while VisualGearLayers[i] <> nil do DeleteVisualGear(VisualGearLayers[i]);
   814 end;
   898 end;
   815 
   899 
   816 end.
   900 end.