DEADSOFTWARE

game should write stack trace on exceptions now
[d2df-sdl.git] / src / game / g_player.pas
index 1c9996dc526f307bfadbf96abf618f1108bdf441..04719fccc88dca671b0e98a9838a388f55d7170f 100644 (file)
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *)
 {$INCLUDE ../shared/a_modes.inc}
+{$M+}
 unit g_player;
 
 interface
 
 uses
   e_graphics, g_playermodel, g_basic, g_textures,
-  g_weapons, g_phys, g_sound, g_saveload, MAPSTRUCT,
+  g_weapons, g_phys, g_sound, g_saveload, MAPDEF,
   BinEditor, g_panel;
 
 const
@@ -249,6 +250,11 @@ type
     FDummy:     Boolean;
     FFireTime:  Integer;
 
+    // debug: viewport offset
+    viewPortX, viewPortY, viewPortW, viewPortH: Integer;
+
+    function isValidViewPort (): Boolean; inline;
+
     constructor Create(); virtual;
     destructor  Destroy(); override;
     procedure   Respawn(Silent: Boolean; Force: Boolean = False); virtual;
@@ -316,6 +322,11 @@ type
 
     procedure getMapBox (out x, y, w, h: Integer); inline;
 
+  public
+    property    Vel: TPoint2i read FObj.Vel;
+    property    Obj: TObj read FObj;
+
+  published
     property    Name: String read FName write FName;
     property    Model: TPlayerModel read FModel;
     property    Health: Integer read FHealth write FHealth;
@@ -342,8 +353,6 @@ type
     property    GameVelY: Integer read FObj.Vel.Y write FObj.Vel.Y;
     property    GameAccelX: Integer read FObj.Accel.X write FObj.Accel.X;
     property    GameAccelY: Integer read FObj.Accel.Y write FObj.Accel.Y;
-    property    Vel: TPoint2i read FObj.Vel;
-    property    Obj: TObj read FObj;
     property    IncCam: Integer read FIncCam write FIncCam;
     property    UID: Word read FUID write FUID;
     property    JustTeleported: Boolean read FJustTeleported write FJustTeleported;
@@ -519,9 +528,9 @@ implementation
 
 uses
   e_log, g_map, g_items, g_console, SysUtils, g_gfx, Math,
-  g_options, g_triggers, g_menu, MAPDEF, g_game, g_grid,
+  g_options, g_triggers, g_menu, g_game, g_grid,
   wadreader, g_main, g_monsters, CONFIG, g_language,
-  g_net, g_netmsg;
+  g_net, g_netmsg, g_window, GL, g_holmes;
 
 type
   TBotProfile = record
@@ -558,7 +567,7 @@ const
   ANGLE_LEFTUP    = 125;
   ANGLE_LEFTDOWN  = -145;
   PLAYER_HEADRECT: TRectWH = (X:24; Y:12; Width:20; Height:12);
-  WEAPONPOINT: Array [TDirection] of TPoint = ((X:16; Y:32), (X:47; Y:32));
+  WEAPONPOINT: Array [TDirection] of TDFPoint = ((X:16; Y:32), (X:47; Y:32));
   BOT_MAXJUMP = 84;
   BOT_LONGDIST   = 300;
   BOT_UNSAFEDIST = 128;
@@ -1706,7 +1715,7 @@ end;
 procedure g_Player_DrawCorpses();
 var
   i: Integer;
-  a: TPoint;
+  a: TDFPoint;
 begin
   if gGibs <> nil then
     for i := 0 to High(gGibs) do
@@ -1737,7 +1746,7 @@ end;
 procedure g_Player_DrawShells();
 var
   i: Integer;
-  a: TPoint;
+  a: TDFPoint;
 begin
   if gShells <> nil then
     for i := 0 to High(gShells) do
@@ -1845,6 +1854,8 @@ end;
 
 { T P l a y e r : }
 
+function TPlayer.isValidViewPort (): Boolean; inline; begin result := (viewPortW > 0) and (viewPortH > 0); end;
+
 procedure TPlayer.BFGHit();
 begin
   g_Weapon_BFGHit(FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2),
@@ -1988,6 +1999,11 @@ end;
 
 constructor TPlayer.Create();
 begin
+  viewPortX := 0;
+  viewPortY := 0;
+  viewPortW := 0;
+  viewPortH := 0;
+
   FIamBot := False;
   FDummy := False;
   FSpawned := False;
@@ -2259,10 +2275,10 @@ begin
         e_GetTextureSize(ID, @w, @h);
         if FDirection = D_LEFT then
           e_Draw(ID, FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2)-(w div 2)+4,
-                     FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2)-(h div 2)-7, 0, True, False)
+                     FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2)-(h div 2)-7+FObj.slopeUpLeft, 0, True, False)
         else
           e_Draw(ID, FObj.X+FObj.Rect.X+(FObj.Rect.Width div 2)-(w div 2)-2,
-                     FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2)-(h div 2)-7, 0, True, False);
+                     FObj.Y+FObj.Rect.Y+(FObj.Rect.Height div 2)-(h div 2)-7+FObj.slopeUpLeft, 0, True, False);
       end;
 
     if FMegaRulez[MR_INVIS] > gTime then
@@ -2275,15 +2291,15 @@ begin
         else
           dr := True;
         if dr then
-          FModel.Draw(FObj.X, FObj.Y, 200)
+          FModel.Draw(FObj.X, FObj.Y+FObj.slopeUpLeft, 200)
         else
-          FModel.Draw(FObj.X, FObj.Y);
+          FModel.Draw(FObj.X, FObj.Y+FObj.slopeUpLeft);
       end
       else
-        FModel.Draw(FObj.X, FObj.Y, 254);
+        FModel.Draw(FObj.X, FObj.Y+FObj.slopeUpLeft, 254);
     end
     else
-      FModel.Draw(FObj.X, FObj.Y);
+      FModel.Draw(FObj.X, FObj.Y+FObj.slopeUpLeft);
   end;
 
   if g_debug_Frames then
@@ -2303,37 +2319,25 @@ begin
     DrawAim();
 end;
 
+
 procedure TPlayer.DrawAim();
   procedure drawCast (sz: Integer; ax0, ay0, ax1, ay1: Integer);
   var
     ex, ey: Integer;
-    mon: TMonster;
-    mx, my, mw, mh: Integer;
   begin
-    e_DrawLine(sz, ax0, ay0, ax1, ay1, 255, 0, 0, 96);
-    if g_Map_traceToNearestWall(ax0, ay0, ax1, ay1, @ex, @ey) then
+    if isValidViewPort and (self = gPlayer1) then
     begin
-      e_DrawLine(sz, ax0, ay0, ex, ey, 0, 255, 0, 96);
-      e_DrawPoint(4, ex, ey, 255, 127, 0);
-    end
-    else
-    begin
-      e_DrawLine(sz, ax0, ay0, ex, ey, 0, 0, 255, 96);
+      g_Holmes_plrLaser(ax0, ay0, ax1, ay1);
     end;
 
-    mon := g_Mons_ByIdx(0);
-    mon.getMapBox(mx, my, mw, mh);
-    ax1 := mx+mw div 2;
-    ay1 := my+mh div 2;
-    e_DrawLine(2, ax0, ay0, ax1, ay1, 0, 96, 96, 96);
-
-    if lineAABBIntersects(ax0, ay0, ax1, ay1,  mx, my, mw, mh, ex, ey) then
+    e_DrawLine(sz, ax0, ay0, ax1, ay1, 255, 0, 0, 96);
+    if (g_Map_traceToNearestWall(ax0, ay0, ax1, ay1, @ex, @ey) <> nil) then
     begin
-      e_DrawLine(2, ax0, ay0, ex, ey, 255, 255, 0, 96);
+      e_DrawLine(sz, ax0, ay0, ex, ey, 0, 255, 0, 96);
     end
     else
     begin
-      e_DrawLine(2, ax0, ay0, ex, ey, 255, 127, 0, 96);
+      e_DrawLine(sz, ax0, ay0, ex, ey, 0, 0, 255, 96);
     end;
   end;
 
@@ -2423,10 +2427,10 @@ begin
   end;
   xx := Trunc(Cos(-DegToRad(angle)) * len) + wx;
   yy := Trunc(Sin(-DegToRad(angle)) * len) + wy;
-  {$IF FALSE}
-  e_DrawLine(sz, wx, wy, xx, yy, 255, 0, 0, 96);
-  {$ELSE}
+  {$IF DEFINED(D2F_DEBUG)}
   drawCast(sz, wx, wy, xx, yy);
+  {$ELSE}
+  e_DrawLine(sz, wx, wy, xx, yy, 255, 0, 0, 96);
   {$ENDIF}
 end;