hedgewars/GearDrawing.inc
changeset 3390 1d4926d10a9e
parent 3387 733f4001b8b9
child 3392 9d5d01b52ae8
equal deleted inserted replaced
3389:9b97b9240c22 3390:1d4926d10a9e
     2 var i, t: LongInt;
     2 var i, t: LongInt;
     3     amt: TAmmoType;
     3     amt: TAmmoType;
     4     hx, hy, cx, cy, tx, ty, sx, sy, m: LongInt;  // hedgehog, crosshair, temp, sprite, direction
     4     hx, hy, cx, cy, tx, ty, sx, sy, m: LongInt;  // hedgehog, crosshair, temp, sprite, direction
     5     lx, ly, dx, dy, ax, ay, aAngle, dAngle, hAngle: real;  // laser, change
     5     lx, ly, dx, dy, ax, ay, aAngle, dAngle, hAngle: real;  // laser, change
     6     defaultPos, HatVisible: boolean;
     6     defaultPos, HatVisible: boolean;
     7     VertexBuffer: array [0..1] of TVertex2f;
       
     8     HH: PHedgehog;
     7     HH: PHedgehog;
     9 begin
     8 begin
    10 HH:= PHedgehog(Gear^.Hedgehog);
     9 HH:= PHedgehog(Gear^.Hedgehog);
    11 if HH^.Unplaced then exit;
    10 if HH^.Unplaced then exit;
    12 m:= 1;
    11 m:= 1;
    28 sx:= hwRound(Gear^.X) + 1 + WorldDx;
    27 sx:= hwRound(Gear^.X) + 1 + WorldDx;
    29 sy:= hwRound(Gear^.Y) - 3 + WorldDy;
    28 sy:= hwRound(Gear^.Y) - 3 + WorldDy;
    30 
    29 
    31 if HH^.Effects[hePoisoned] then
    30 if HH^.Effects[hePoisoned] then
    32     begin
    31     begin
    33     Tint($4040FF00);
    32     Tint($40, $FF, $00, $40);
    34     DrawRotatedTextureF(SpritesData[sprSmokeWhite].texture, 2, 0, 0, sx, sy, 0, 1, 22, 22, (RealTicks shr 36) mod 360);
    33     DrawRotatedTextureF(SpritesData[sprSmokeWhite].texture, 2, 0, 0, sx, sy, 0, 1, 22, 22, (RealTicks shr 36) mod 360);
    35     Tint($FFFFFFFF)
    34     Tint($FF, $FF, $FF, $FF)
    36     end;
    35     end;
    37 
    36 
    38 if ((Gear^.State and gstWinner) <> 0) and
    37 if ((Gear^.State and gstWinner) <> 0) and
    39    ((CurAmmoGear = nil) or (CurAmmoGear^.Kind <> gtPickHammer)) then
    38    ((CurAmmoGear = nil) or (CurAmmoGear^.Kind <> gtPickHammer)) then
    40     begin
    39     begin
   108                 ty:= round(ly + ay * (LAND_WIDTH div 4));
   107                 ty:= round(ly + ay * (LAND_WIDTH div 4));
   109                 end;
   108                 end;
   110 
   109 
   111             //if (abs(lx-tx)>8) or (abs(ly-ty)>8) then
   110             //if (abs(lx-tx)>8) or (abs(ly-ty)>8) then
   112                 begin
   111                 begin
       
   112                 glEnable(GL_LINE_SMOOTH);
   113                 glDisable(GL_TEXTURE_2D);
   113                 glDisable(GL_TEXTURE_2D);
   114                 glEnable(GL_LINE_SMOOTH);
       
   115 
       
   116                 glLineWidth(1.0);
   114                 glLineWidth(1.0);
   117 
   115                 Tint($FF, $00, $00, $C0);
   118                 Tint($C0FF0000);
   116                 glBegin(GL_LINES);
   119                 VertexBuffer[0].X:= hx + WorldDx;
   117                 glVertex3f(hx + WorldDx, hy + WorldDy, 0);
   120                 VertexBuffer[0].Y:= hy + WorldDy;
   118                 glVertex3f(tx + WorldDx, ty + WorldDy, 0);
   121                 VertexBuffer[1].X:= tx + WorldDx;
   119                 glEnd();
   122                 VertexBuffer[1].Y:= ty + WorldDy;
   120                 glLineWidth(5.0);
   123 
   121                 glBegin(GL_LINES);
   124                 glEnableClientState(GL_VERTEX_ARRAY);
   122                 glVertex3f(tx + WorldDx - 0.5, ty + WorldDy, 0);
   125                 glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
   123                 glVertex3f(tx + WorldDx + 0.5, ty + WorldDy, 0);
   126                 glDrawArrays(GL_LINES, 0, Length(VertexBuffer));
   124                 glEnd();
   127                 Tint($FFFFFFFF);
   125                 Tint($FF, $FF, $FF, $FF);
       
   126                 glDisable(GL_LINE_SMOOTH);
   128                 glEnable(GL_TEXTURE_2D);
   127                 glEnable(GL_TEXTURE_2D);
   129                 glDisable(GL_LINE_SMOOTH);
       
   130                 end;
   128                 end;
   131             end;
   129             end;
   132         // draw crosshair
   130         // draw crosshair
   133         cx:= Round(hwRound(Gear^.X) + dx * 80);
   131         cx:= Round(hwRound(Gear^.X) + dx * 80);
   134         cy:= Round(hwRound(Gear^.Y) + dy * 80);
   132         cy:= Round(hwRound(Gear^.Y) + dy * 80);
   522     if ((Gear^.State and not gstWinner) = 0)
   520     if ((Gear^.State and not gstWinner) = 0)
   523         or (bShowFinger and ((Gear^.State and gstHHDriven) <> 0)) then
   521         or (bShowFinger and ((Gear^.State and gstHHDriven) <> 0)) then
   524         begin
   522         begin
   525         t:= hwRound(Gear^.Y) - cHHRadius - 12 + WorldDy;
   523         t:= hwRound(Gear^.Y) - cHHRadius - 12 + WorldDy;
   526         if (cTagsMask and htTransparent) <> 0 then
   524         if (cTagsMask and htTransparent) <> 0 then
   527             Tint($80FFFFFF);
   525             Tint($FF, $FF, $FF, $80);
   528         if ((cTagsMask and htHealth) <> 0) then
   526         if ((cTagsMask and htHealth) <> 0) then
   529             begin
   527             begin
   530             dec(t, HealthTagTex^.h + 2);
   528             dec(t, HealthTagTex^.h + 2);
   531             DrawCentered(hwRound(Gear^.X) + WorldDx, t, HealthTagTex)
   529             DrawCentered(hwRound(Gear^.X) + WorldDx, t, HealthTagTex)
   532             end;
   530             end;
   539             begin
   537             begin
   540             dec(t, Team^.NameTagTex^.h + 2);
   538             dec(t, Team^.NameTagTex^.h + 2);
   541             DrawCentered(hwRound(Gear^.X) + WorldDx, t, Team^.NameTagTex)
   539             DrawCentered(hwRound(Gear^.X) + WorldDx, t, Team^.NameTagTex)
   542             end;
   540             end;
   543         if (cTagsMask and htTransparent) <> 0 then
   541         if (cTagsMask and htTransparent) <> 0 then
   544             Tint($FFFFFFFF)
   542             Tint($FF, $FF, $FF, $FF)
   545         end;
   543         end;
   546     if (Gear^.State and gstHHDriven) <> 0 then // Current hedgehog
   544     if (Gear^.State and gstHHDriven) <> 0 then // Current hedgehog
   547         begin
   545         begin
   548         if bShowFinger and ((Gear^.State and gstHHDriven) <> 0) then
   546         if bShowFinger and ((Gear^.State and gstHHDriven) <> 0) then
   549             DrawSprite(sprFinger, hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 64 + WorldDy,
   547             DrawSprite(sprFinger, hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 64 + WorldDy,
   555         end
   553         end
   556     end;
   554     end;
   557 
   555 
   558 if HH^.Effects[hePoisoned] then
   556 if HH^.Effects[hePoisoned] then
   559     begin
   557     begin
   560     Tint($8040FF00);
   558     Tint($40, $FF, $00, $80);
   561     DrawRotatedTextureF(SpritesData[sprSmokeWhite].texture, 1.5, 0, 0, sx, sy, 0, 1, 22, 22, 360 - (RealTicks shr 37) mod 360);
   559     DrawRotatedTextureF(SpritesData[sprSmokeWhite].texture, 1.5, 0, 0, sx, sy, 0, 1, 22, 22, 360 - (RealTicks shr 37) mod 360);
   562     end;
   560     end;
   563 
   561 
   564 if Gear^.Invulnerable then
   562 if Gear^.Invulnerable then
   565     begin
   563     begin
   571    (CurrentHedgehog^.Gear = Gear) then
   569    (CurrentHedgehog^.Gear = Gear) then
   572     begin
   570     begin
   573     Tint($FF, $FF, $FF, max($40, floor($FF * abs(1 - (RealTicks mod 1500) / 750))));
   571     Tint($FF, $FF, $FF, max($40, floor($FF * abs(1 - (RealTicks mod 1500) / 750))));
   574     DrawSprite(sprVampiric, sx - 24, sy - 24, 0);
   572     DrawSprite(sprVampiric, sx - 24, sy - 24, 0);
   575     end;
   573     end;
   576     Tint($FFFFFFFF)
   574     Tint($FF, $FF, $FF, $FF)
   577 end;
   575 end;
   578 
   576 
   579 procedure DrawGears;
   577 procedure DrawGears;
   580 var Gear, HHGear: PGear;
   578 var Gear, HHGear: PGear;
   581     i: Longword;
   579     i: Longword;
   671                     end;
   669                     end;
   672         gtSwitcher: DrawSprite(sprSwitch, hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 56 + WorldDy, (GameTicks shr 6) mod 12);
   670         gtSwitcher: DrawSprite(sprSwitch, hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 56 + WorldDy, (GameTicks shr 6) mod 12);
   673           gtTarget: begin
   671           gtTarget: begin
   674                     Tint($FF, $FF, $FF, floor($FF * Gear^.Timer / 1000));
   672                     Tint($FF, $FF, $FF, floor($FF * Gear^.Timer / 1000));
   675                     DrawSprite(sprTarget, hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 16 + WorldDy, 0);
   673                     DrawSprite(sprTarget, hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 16 + WorldDy, 0);
   676                     Tint($FFFFFFFF);
   674                     Tint($FF, $FF, $FF, $FF);
   677                     end;
   675                     end;
   678           gtMortar: DrawRotated(sprMortar, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, DxDy2Angle(Gear^.dY, Gear^.dX));
   676           gtMortar: DrawRotated(sprMortar, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, DxDy2Angle(Gear^.dY, Gear^.dX));
   679           gtCake: if Gear^.Pos = 6 then
   677           gtCake: if Gear^.Pos = 6 then
   680                      DrawRotatedf(sprCakeWalk, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, (GameTicks div 40) mod 6, hwSign(Gear^.dX), Gear^.DirAngle * hwSign(Gear^.dX) + 90)
   678                      DrawRotatedf(sprCakeWalk, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, (GameTicks div 40) mod 6, hwSign(Gear^.dX), Gear^.DirAngle * hwSign(Gear^.dX) + 90)
   681                   else
   679                   else
   715                         DrawTextureF(SpritesData[sprBirdy].Texture, 1, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, ((Gear^.Pos shr 6) or (RealTicks shr 8)) mod 2, Gear^.Tag, 75, 75);
   713                         DrawTextureF(SpritesData[sprBirdy].Texture, 1, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, ((Gear^.Pos shr 6) or (RealTicks shr 8)) mod 2, Gear^.Tag, 75, 75);
   716                     end;
   714                     end;
   717     gtBigExplosion: begin
   715     gtBigExplosion: begin
   718                     Tint($FF, $FF, $FF, floor($FF * (1 - power(Gear^.Timer / 250, 4))));
   716                     Tint($FF, $FF, $FF, floor($FF * (1 - power(Gear^.Timer / 250, 4))));
   719                     DrawRotatedTextureF(SpritesData[sprBigExplosion].Texture, 0.85 * (-power(2, -10 * Int(Gear^.Timer)/250) + 1) + 0.4, 0, 0, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, 1, 385, 385, Gear^.Angle);
   717                     DrawRotatedTextureF(SpritesData[sprBigExplosion].Texture, 0.85 * (-power(2, -10 * Int(Gear^.Timer)/250) + 1) + 0.4, 0, 0, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, 1, 385, 385, Gear^.Angle);
   720                     Tint($FFFFFFFF);
   718                     Tint($FF, $FF, $FF, $FF);
   721                     end;
   719                     end;
   722              gtEgg: DrawRotatedTextureF(SpritesData[sprEgg].Texture, 1, 0, 0, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, 1, 16, 16, Gear^.DirAngle);
   720              gtEgg: DrawRotatedTextureF(SpritesData[sprEgg].Texture, 1, 0, 0, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, 1, 16, 16, Gear^.DirAngle);
   723            gtPiano: begin
   721            gtPiano: begin
   724                     if (Gear^.State and gstDrowning) = 0 then
   722                     if (Gear^.State and gstDrowning) = 0 then
   725                         begin
   723                         begin
   726                         Tint($10FFFFFF);
   724                         Tint($FF, $FF, $FF, $10);
   727                         for i:= 8 downto 1 do
   725                         for i:= 8 downto 1 do
   728                             DrawRotatedTextureF(SpritesData[sprPiano].Texture, 1, 0, 0, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy - hwRound(Gear^.dY * 4 * i), 0, 1, 128, 128, 0);
   726                             DrawRotatedTextureF(SpritesData[sprPiano].Texture, 1, 0, 0, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy - hwRound(Gear^.dY * 4 * i), 0, 1, 128, 128, 0);
   729                         Tint($FFFFFFFF)
   727                         Tint($FF, $FF, $FF, $FF)
   730                         end;
   728                         end;
   731                     DrawRotatedTextureF(SpritesData[sprPiano].Texture, 1, 0, 0, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, 1, 128, 128, 0);
   729                     DrawRotatedTextureF(SpritesData[sprPiano].Texture, 1, 0, 0, hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, 0, 1, 128, 128, 0);
   732                     end;
   730                     end;
   733          end;
   731          end;
   734       if Gear^.RenderTimer and (Gear^.Tex <> nil) then DrawCentered(hwRound(Gear^.X) + 8 + WorldDx, hwRound(Gear^.Y) + 8 + WorldDy, Gear^.Tex);
   732       if Gear^.RenderTimer and (Gear^.Tex <> nil) then DrawCentered(hwRound(Gear^.X) + 8 + WorldDx, hwRound(Gear^.Y) + 8 + WorldDy, Gear^.Tex);