DEADSOFTWARE

gl: fix typo
[d2df-sdl.git] / src / game / renders / opengl / r_map.pas
index 927d251f4075f6081af9e7eb989ab51adcc0cace..407431e8a4e7517cfb9e759924c10c85afd4b41d 100644 (file)
@@ -42,6 +42,7 @@ interface
   procedure r_Map_Update;
 
   procedure r_Map_Draw (x, y, w, h, camx, camy: Integer; player: TPlayer; out acx, acy: Integer);
+  procedure r_Map_GetSpectatorLimits (out x0, y0, x1, y1: Integer);
 
 implementation
 
@@ -69,6 +70,11 @@ implementation
   ;
 
   const
+    MAXGIBW = 32;
+    MAXGIBH = 32;
+
+    MAXMONW = 256;
+    MAXMONH = 128;
     MTABLE: array [0..MONSTER_MAN] of record
       w, h: Integer;
     end = (
@@ -97,6 +103,8 @@ implementation
     VILEFIRE_DX = 32;
     VILEFIRE_DY = 128;
 
+    MAXITEMW = 64;
+    MAXITEMH = 64;
     ItemAnim: array [0..ITEM_LAST] of record
       name: AnsiString;
       w, h: Integer;
@@ -462,7 +470,7 @@ implementation
       end;
     {$ENDIF}
     // --------- shots --------- //
-    r_Common_SetLoading('Weapon splahses', WEAPON_LAST + 1);
+    r_Common_SetLoading('Weapon splashes', WEAPON_LAST + 1);
     for i := 0 to WEAPON_LAST do
     begin
       if ShotAnim[i].anim.frames > 0 then
@@ -584,20 +592,19 @@ implementation
   end;
 
   procedure r_Map_DrawPanel (p: TPanel);
-    var Texture, spec: Integer; t: TGLMultiTexture; count, frame: LongInt; a: TAnimInfo;
+    var Texture, x, y, w, h: Integer; t: TGLMultiTexture; count, frame: LongInt; a: TAnimInfo;
   begin
     ASSERT(p <> nil);
-
-    spec := -1;
+    ASSERT(p.FCurTexture >= -1); (* p.FCurTexture = -1 -> invisible texture *)
     if p.FCurTexture >= 0 then
     begin
+      r_Common_GetPanelPos(p, x, y, w, h);
       ASSERT(p.FCurTexture <= High(p.TextureIDs));
       Texture := p.TextureIDs[p.FCurTexture].Texture;
-      ASSERT(Texture >= -1);
+      ASSERT(Texture >= -1); (* Texture = -1 -> texture not found *)
       if Texture >= 0 then
       begin
         ASSERT(Texture <= High(RenTextures));
-        spec := RenTextures[Texture].spec;
         t := RenTextures[Texture].tex;
         if t <> nil then
         begin
@@ -608,32 +615,23 @@ implementation
             a.loop := p.AnimLoop;
             g_Anim_GetFrameByTime(a, (gTime - p.AnimTime) DIV GAME_TICK, count, frame);
           end;
-          r_Draw_TextureRepeat(t.GetTexture(frame), p.x, p.y, p.width, p.height, false, 255, 255, 255, 255 - p.alpha, p.blending);
+          r_Draw_TextureRepeat(t.GetTexture(frame), x, y, w, h, false, 255, 255, 255, 255 - p.alpha, p.blending);
         end
         else if RenTextures[Texture].spec = 0 then
         begin
-          r_Draw_TextureRepeat(nil, p.x, p.y, p.width, p.height, false, 255, 255, 255, 255, false);
+          r_Draw_TextureRepeat(nil, x, y, w, h, false, 255, 255, 255, 255, false);
         end;
+        case RenTextures[Texture].spec of
+          TEXTURE_SPECIAL_WATER: r_Draw_Filter(x, y, x + w, y + h, 0, 0, 255, 255);
+          TEXTURE_SPECIAL_ACID1: r_Draw_Filter(x, y, x + w, y + h, 0, 230, 0, 255);
+          TEXTURE_SPECIAL_ACID2: r_Draw_Filter(x, y, x + w, y + h, 230, 0, 0, 255);
+        end;
+      end
+      else
+      begin
+        r_Draw_TextureRepeat(nil, x, y, w, h, false, 255, 255, 255, 255, false);
       end;
     end;
-
-    // legacy support:
-    // older maps may omit textures for fluid panels
-    // in such case default filters must be used automatically
-    if spec = -1 then
-    begin
-      case p.PanelType of
-        PANEL_WATER: spec := TEXTURE_SPECIAL_WATER;
-        PANEL_ACID1: spec := TEXTURE_SPECIAL_ACID1;
-        PANEL_ACID2: spec := TEXTURE_SPECIAL_ACID2;
-      end;
-    end;
-
-    case spec of
-      TEXTURE_SPECIAL_WATER: r_Draw_Filter(p.x, p.y, p.x + p.width, p.y + p.height, 0, 0, 255, 255);
-      TEXTURE_SPECIAL_ACID1: r_Draw_Filter(p.x, p.y, p.x + p.width, p.y + p.height, 0, 230, 0, 255);
-      TEXTURE_SPECIAL_ACID2: r_Draw_Filter(p.x, p.y, p.x + p.width, p.y + p.height, 230, 0, 0, 255);
-    end;
   end;
 
   procedure r_Map_DrawPanels (constref panels: TPanelArray; drawDoors: Boolean = false);
@@ -685,15 +683,20 @@ implementation
   begin
     if ggItems <> nil then
     begin
+      (* hack: prevent visual disappearance *)
+      x := x - MAXITEMW;
+      y := y - MAXITEMH;
+      w := w + MAXITEMW*2;
+      h := h + MAXITEMH*2;
       for i := 0 to High(ggItems) do
       begin
         it := @ggItems[i];
         if it.used and it.alive and (it.dropped = drop) and (it.ItemType > ITEM_NONE) and (it.ItemType <= ITEM_LAST) then
         begin
-          t := Items[it.ItemType].tex;
-          if g_Collide(it.obj.x, it.obj.y, t.width, t.height, x, y, w, h) then
+          r_Common_GetObjectPos(it.obj, xx, yy);
+          if g_Collide(xx + it.obj.rect.x, yy + it.obj.rect.y, it.obj.rect.width, it.obj.rect.height, x, y, w, h) then
           begin
-            r_Common_GetObjectPos(it.obj, xx, yy);
+            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
@@ -713,7 +716,7 @@ implementation
   end;
 
   function r_Map_GetMonsterTexture (m, a: Integer; d: TDirection; out t: TGLMultiTexture; out dx, dy: Integer; out flip: Boolean): Boolean;
-    // var c: Integer;
+    var w: Integer;
   begin
     t := nil; dx := 0; dy := 0; flip := false;
     result := MonTextures[m, a, d] <> nil;
@@ -738,9 +741,8 @@ implementation
       end;
       if flip then
       begin
-//        c := (MONSTERTABLE[MonsterType].Rect.X - dx) + MONSTERTABLE[MonsterType].Rect.Width;
-//        dx := MTABLE[m].width - c - MONSTERTABLE[MonsterType].Rect.X;
-        dx := -dx;
+        if (m = MONSTER_SOUL) and (a = ANIM_DIE) then w := 64 else w := 0;
+        dx := -dx - w;
       end;
     end;
   end;
@@ -763,16 +765,20 @@ implementation
   end;
 
   procedure r_Map_DrawMonster (constref mon: TMonster);
-    var m, a, xx, yy, dx, dy: Integer; d: TDirection; flip: Boolean; t: TGLMultiTexture;
+    var m, a, xx, yy, dx, dy: Integer; d, da: TDirection; flip: Boolean; t: TGLMultiTexture;
   begin
     m := mon.MonsterType;
     a := mon.MonsterAnim;
     d := mon.GameDirection;
 
+    (* hack: barrel tracks player, fix it in game logic *)
+    if m = MONSTER_BARREL then d := TDirection.D_LEFT;
+
     r_Common_GetObjectPos(mon.obj, xx, yy);
     if r_Map_GetMonsterTexture(m, a, d, t, dx, dy, flip) then
     begin
-      r_Draw_MultiTextureRepeat(t, mon.DirAnim[a, d], false, xx + dx, yy + dy, t.width, t.height, flip, 255, 255, 255, 255, false);
+      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
     begin
@@ -802,6 +808,11 @@ implementation
   begin
     if gMonsters <> nil then
     begin
+      (* hack: prevent visual disappearance *)
+      x := x - MAXMONW;
+      y := y - MAXMONH;
+      w := w + MAXMONW*2;
+      h := h + MAXMONH*2;
       for i := 0 to High(gMonsters) do
       begin
         m := gMonsters[i];
@@ -1079,6 +1090,11 @@ implementation
   begin
     if gGibs <> nil then
     begin
+      (* hack: prevent visual disappearance *)
+      x := x - MAXGIBW;
+      y := y - MAXGIBH;
+      w := w + MAXGIBW*2;
+      h := h + MAXGIBH*2;
       for i := 0 to High(gGibs) do
       begin
         if gGibs[i].alive then
@@ -1718,6 +1734,34 @@ implementation
     g_Anim_GetFrameByTime(FlagAnim, tick, count, FlagFrame);
   end;
 
+  procedure r_Map_GetSpectatorLimits (out x0, y0, x1, y1: Integer);
+    var w, h: Integer;
+  begin
+    w := Round(gScreenWidth / g_dbg_scale);
+    if gMapInfo.Width > w then
+    begin
+      x0 := w div 2;
+      x1 := gMapInfo.Width - w div 2 - 1;
+    end
+    else
+    begin
+      x0 := gMapInfo.Width div 2;
+      x1 := gMapInfo.Width div 2;
+    end;
+
+    h := Round(gScreenHeight / g_dbg_scale);
+    if gMapInfo.Height > h then
+    begin
+      y0 := h div 2;
+      y1 := gMapInfo.Height - h div 2 - 1;
+    end
+    else
+    begin
+      y0 := gMapInfo.Height div 2;
+      y1 := gMapInfo.Height div 2;
+    end;
+  end;
+
 initialization
   conRegVar('r_sq_draw', @UseAccel, 'accelerated spatial queries in rendering', 'accelerated rendering');
   conRegVar('r_debug_camera_scale', @DebugCameraScale, 0.0001, 1000.0, '', '');