DEADSOFTWARE

gl: disable visual cheats at network game
[d2df-sdl.git] / src / game / renders / opengl / r_map.pas
index 407431e8a4e7517cfb9e759924c10c85afd4b41d..e04405795493fda75933b7d211339e470ec91ad2 100644 (file)
@@ -182,36 +182,37 @@ implementation
 
     ShotAnim: array [0..WEAPON_LAST] of record
       name: AnsiString;
+      x, y: Integer;
       w, h: Integer;
       anim: TAnimInfo;
     end = (
-      (name: '';            w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 0  KASTET
-      (name: '';            w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 1  SAW
-      (name: '';            w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 2  PISTOL
-      (name: '';            w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 3  SHOTGUN1
-      (name: '';            w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 4  SHOTGUN2
-      (name: '';            w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 5  CHAINGUN
-      (name: 'BROCKET';     w: 64; h: 32; anim: (loop: true; delay: 1; frames: 1; back: false)),  // 6  ROCKETLAUNCHER
-      (name: 'BPLASMA';     w: 16; h: 16; anim: (loop: true; delay: 5; frames: 2; back: false)),  // 7  PLASMA
-      (name: 'BBFG';        w: 64; h: 64; anim: (loop: true; delay: 6; frames: 2; back: false)),  // 8  BFG
-      (name: '';            w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 9  SUPERPULEMET
-      (name: 'FLAME';       w: 32; h: 32; anim: (loop: true; delay: 6; frames: 0{11}; back: false)), // 10 FLAMETHROWER
-      (name: '';            w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 11
-      (name: '';            w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 12
-      (name: '';            w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 13
-      (name: '';            w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 14
-      (name: '';            w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 15
-      (name: '';            w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 16
-      (name: '';            w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 17
-      (name: '';            w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 18
-      (name: '';            w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 19
-      (name: '';            w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 20 ZOMPY_PISTOL
-      (name: 'BIMPFIRE';    w: 16; h: 16; anim: (loop: true; delay: 4; frames: 2; back: false)),  // 21 IMP_FIRE
-      (name: 'BBSPFIRE';    w: 16; h: 16; anim: (loop: true; delay: 4; frames: 2; back: false)),  // 22 BSP_FIRE
-      (name: 'BCACOFIRE';   w: 16; h: 16; anim: (loop: true; delay: 4; frames: 2; back: false)),  // 23 CACO_FIRE
-      (name: 'BBARONFIRE';  w: 64; h: 16; anim: (loop: true; delay: 4; frames: 2; back: false)),  // 24 BARON_FIRE
-      (name: 'BMANCUBFIRE'; w: 64; h: 32; anim: (loop: true; delay: 4; frames: 2; back: false)),  // 25 MANCUB_FIRE
-      (name: 'BSKELFIRE';   w: 64; h: 64; anim: (loop: true; delay: 5; frames: 2; back: false))   // 26 SKEL_FIRE
+      (name: '';            x: 0; y: 0; w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 0  KASTET
+      (name: '';            x: 0; y: 0; w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 1  SAW
+      (name: '';            x: 0; y: 0; w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 2  PISTOL
+      (name: '';            x: 0; y: 0; w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 3  SHOTGUN1
+      (name: '';            x: 0; y: 0; w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 4  SHOTGUN2
+      (name: '';            x: 0; y: 0; w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 5  CHAINGUN
+      (name: 'BROCKET';     x: 0; y: 0; w: 64; h: 32; anim: (loop: true; delay: 1; frames: 1; back: false)),  // 6  ROCKETLAUNCHER
+      (name: 'BPLASMA';     x: 0; y: 0; w: 16; h: 16; anim: (loop: true; delay: 5; frames: 2; back: false)),  // 7  PLASMA
+      (name: 'BBFG';        x: 6; y: 7; w: 64; h: 64; anim: (loop: true; delay: 6; frames: 2; back: false)),  // 8  BFG
+      (name: '';            x: 0; y: 0; w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 9  SUPERPULEMET
+      (name: 'FLAME';       x: 0; y: 0; w: 32; h: 32; anim: (loop: true; delay: 6; frames: 0{11}; back: false)), // 10 FLAMETHROWER
+      (name: '';            x: 0; y: 0; w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 11
+      (name: '';            x: 0; y: 0; w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 12
+      (name: '';            x: 0; y: 0; w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 13
+      (name: '';            x: 0; y: 0; w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 14
+      (name: '';            x: 0; y: 0; w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 15
+      (name: '';            x: 0; y: 0; w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 16
+      (name: '';            x: 0; y: 0; w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 17
+      (name: '';            x: 0; y: 0; w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 18
+      (name: '';            x: 0; y: 0; w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 19
+      (name: '';            x: 0; y: 0; w: 0;  h: 0;  anim: (loop: true; delay: 0; frames: 0; back: false)),  // 20 ZOMPY_PISTOL
+      (name: 'BIMPFIRE';    x: 0; y: 0; w: 16; h: 16; anim: (loop: true; delay: 4; frames: 2; back: false)),  // 21 IMP_FIRE
+      (name: 'BBSPFIRE';    x: 0; y: 0; w: 16; h: 16; anim: (loop: true; delay: 4; frames: 2; back: false)),  // 22 BSP_FIRE
+      (name: 'BCACOFIRE';   x: 0; y: 0; w: 16; h: 16; anim: (loop: true; delay: 4; frames: 2; back: false)),  // 23 CACO_FIRE
+      (name: 'BBARONFIRE';  x: 0; y: 0; w: 64; h: 16; anim: (loop: true; delay: 4; frames: 2; back: false)),  // 24 BARON_FIRE
+      (name: 'BMANCUBFIRE'; x: 0; y: 0; w: 64; h: 32; anim: (loop: true; delay: 4; frames: 2; back: false)),  // 25 MANCUB_FIRE
+      (name: 'BSKELFIRE';   x: 0; y: 0; w: 64; h: 64; anim: (loop: true; delay: 5; frames: 2; back: false))   // 26 SKEL_FIRE
     );
 
 {$IFDEF ENABLE_SHELLS}
@@ -699,7 +700,7 @@ implementation
             t := Items[it.ItemType].tex;
             tex := t.GetTexture(Items[it.ItemType].frame);
             r_Draw_TextureRepeat(tex, xx, yy, tex.width, tex.height, false, 255, 255, 255, 255, false);
-            if DebugFrames then
+            if DebugFrames and not (gGameSettings.GameType in [GT_SERVER, GT_CLIENT]) then
             begin
               r_Draw_Rect(
                 xx + it.obj.rect.x, // it.obj.x + it.obj.rect.x,
@@ -780,7 +781,7 @@ implementation
       da := mon.GameDirection;
       r_Draw_MultiTextureRepeat(t, mon.DirAnim[a, da], false, xx + dx, yy + dy, t.width, t.height, flip, 255, 255, 255, 255, false);
     end;
-    if DebugFrames then
+    if DebugFrames and not (gGameSettings.GameType in [GT_SERVER, GT_CLIENT]) then
     begin
       r_Draw_Rect(
         xx + mon.obj.rect.x, // mon.obj.x + mon.obj.rect.x,
@@ -790,7 +791,7 @@ implementation
         0, 255, 0, 255
       );
     end;
-    if DebugHealth and mon.alive then
+    if DebugHealth and mon.alive and not (gGameSettings.GameType in [GT_SERVER, GT_CLIENT]) then
     begin
       r_Common_DrawText(
         IntToStr(mon.MonsterHealth),
@@ -983,6 +984,46 @@ implementation
     end;
   end;
 
+  procedure r_Map_DrawAim (p: TPlayer);
+    var x0, y0, x1, y1, a, len: Integer;
+  begin
+    ASSERT(p <> nil);
+    r_Common_GetPlayerPos(p, x0, y0);
+    x0 := x0 + WEAPONPOINT[p.Direction].X + IfThen(p.Direction = TDirection.D_LEFT, 7, -7);
+    y0 := y0 + WEAPONPOINT[p.Direction].Y;
+    a := p.Angle_;
+    len := 1024;
+    case p.CurrWeap of
+      WEAPON_KASTET: len := 12;
+      WEAPON_SAW: len := 24;
+      WEAPON_PISTOL, WEAPON_SHOTGUN1, WEAPON_SHOTGUN2, WEAPON_CHAINGUN,
+      WEAPON_ROCKETLAUNCHER, WEAPON_SUPERPULEMET, WEAPON_FLAMETHROWER:
+      begin
+        if a = ANGLE_RIGHTUP then DEC(a, 2);
+        if a = ANGLE_RIGHTDOWN then INC(a, 4);
+        if a = ANGLE_LEFTUP then INC(a, 2);
+        if a = ANGLE_LEFTDOWN then DEC(a, 4);
+      end;
+      WEAPON_PLASMA:
+      begin
+        if a = ANGLE_RIGHTUP then DEC(a, 1);
+        if a = ANGLE_RIGHTDOWN then INC(a, 3);
+        if a = ANGLE_LEFTUP then INC(a, 1);
+        if a = ANGLE_LEFTDOWN then DEC(a, 3);
+      end;
+      WEAPON_BFG:
+      begin
+        if a = ANGLE_RIGHTUP then DEC(a, 1);
+        if a = ANGLE_RIGHTDOWN then INC(a, 2);
+        if a = ANGLE_LEFTUP then INC(a, 1);
+        if a = ANGLE_LEFTDOWN then DEC(a, 2);
+      end;
+    end;
+    x1 := x0 + Trunc(Cos(-DegToRad(a)) * len);
+    y1 := y0 + Trunc(Sin(-DegToRad(a)) * len);
+    r_Draw_Line(x0, y0, x1, y1, 255, 0, 0, 158);
+  end;
+
   procedure r_Map_DrawPlayer (p, drawed: TPlayer);
     var x, y, ax, ay, w, h: Integer; b, flip: Boolean; t: TGLMultiTexture; tex: TGLTexture; alpha: Byte; count, frame: LongInt;
   begin
@@ -1040,7 +1081,7 @@ implementation
       r_Map_DrawPlayerModel(p.Model, x, y, alpha);
     end;
 
-    if DebugFrames then
+    if DebugFrames and not (gGameSettings.GameType in [GT_SERVER, GT_CLIENT]) then
     begin
       r_Draw_Rect(
         x + p.obj.rect.x, // p.obj.x + p.obj.rect.x,
@@ -1051,7 +1092,7 @@ implementation
       );
     end;
 
-    if DebugHealth and p.alive then
+    if DebugHealth and p.alive and not (gGameSettings.GameType in [GT_SERVER, GT_CLIENT]) then
     begin
       r_Common_DrawText(
         IntToStr(p.health) + '/' + IntToStr(p.armor),
@@ -1067,7 +1108,8 @@ implementation
       if (p.FMegaRulez[MR_INVIS] <= gTime) or ((drawed <> nil) and ((p = drawed) or (p.Team = drawed.Team) and (gGameSettings.GameMode <> GM_DM))) then
         r_Map_DrawTalkBubble(p);
 
-    // TODO draw aim
+    if gAimLine and p.alive and ((p = gPlayer1) or (p = gPlayer2)) then
+      r_Map_DrawAim(p);
   end;
 
   procedure r_Map_DrawPlayers (x, y, w, h: Integer; player: TPlayer);
@@ -1301,8 +1343,8 @@ implementation
             pY := Shots[i].Obj.Rect.Height div 2;
             g_Anim_GetFrameByTime(ShotAnim[typ].anim, (gTime - Shots[i].time) DIV GAME_TICK, count, frame);
             tex := t.GetTexture(frame);
-            r_Draw_TextureRepeatRotate(tex, xx, yy, tex.width, tex.height, false, 255, 255, 255, 255, false, pX, pY, a);
-            if DebugFrames then
+            r_Draw_TextureRepeatRotate(tex, xx - ShotAnim[typ].x, yy - ShotAnim[typ].y, tex.width, tex.height, false, 255, 255, 255, 255, false, pX, pY, a);
+            if DebugFrames and not (gGameSettings.GameType in [GT_SERVER, GT_CLIENT]) then
             begin
               r_Draw_Rect(
                 xx + Shots[i].obj.rect.x, // Shots[i].obj.x + Shots[i].obj.rect.x,
@@ -1333,7 +1375,7 @@ implementation
           t := FlagTextures[i];
           tex := t.GetTexture(FlagFrame);
           r_Draw_TextureRepeat(tex, xx + dx, yy + 1, tex.width, tex.height, flip, 255, 255, 255, 255, false);
-          if DebugFrames then
+          if DebugFrames and not (gGameSettings.GameType in [GT_SERVER, GT_CLIENT]) then
           begin
             r_Draw_Rect(
               xx + gFlags[i].obj.rect.x, // gFlags[i].obj.x + gFlags[i].obj.rect.x,
@@ -1669,6 +1711,7 @@ implementation
     if gDrawBackGround and (SkyTexture <> nil) then
     begin
       r_Map_CalcSkyParallax(cx, cy, w, h, SkyTexture.width, SkyTexture.height, gMapInfo.Width, gMapInfo.Height, sx, sy, sw, sh);
+      r_Draw_SetFilter(SkyTexture, gTextureFilter);
       r_Draw_Texture(SkyTexture, sx, sy, sw, sh, false, 255, 255, 255, 255, false);
     end;