DEADSOFTWARE

field namefix: `FLive` -> `FAlive`; `live` -> `alive`
[d2df-sdl.git] / src / game / g_basic.pas
index e001f8567a3af1ad810da064330ec9cb595d0183..530bf8e4c2ea873385be3eb3403a548122bfdd8f 100644 (file)
@@ -40,16 +40,15 @@ type
 function g_CreateUID(UIDType: Byte): Word;
 function g_GetUIDType(UID: Word): Byte;
 function g_Collide(X1, Y1: Integer; Width1, Height1: Word;
-                   X2, Y2: Integer; Width2, Height2: Word): Boolean;
+                   X2, Y2: Integer; Width2, Height2: Word): Boolean; inline;
 function g_CollideLine(x1, y1, x2, y2, rX, rY: Integer; rWidth, rHeight: Word): Boolean;
-function g_CollidePoint(X, Y, X2, Y2: Integer; Width, Height: Word): Boolean;
-function g_CollideLevel(X, Y: Integer; Width, Height: Word): Boolean;
+function g_CollidePoint(X, Y, X2, Y2: Integer; Width, Height: Word): Boolean; inline;
+function g_CollideLevel(X, Y: Integer; Width, Height: Word): Boolean; inline;
 function g_CollideAround(X1, Y1: Integer; Width1, Height1: Word;
-                         X2, Y2: Integer; Width2, Height2: Word): Boolean;
-function g_CollidePlayer(X, Y: Integer; Width, Height: Word): Boolean;
-function g_CollideMonster(X, Y: Integer; Width, Height: Word): Boolean;
+                         X2, Y2: Integer; Width2, Height2: Word): Boolean; inline;
+function g_CollidePlayer(X, Y: Integer; Width, Height: Word): Boolean; inline;
 function g_PatchLength(X1, Y1, X2, Y2: Integer): Word;
-function g_TraceVector(X1, Y1, X2, Y2: Integer): Boolean;
+function g_TraceVector(X1, Y1, X2, Y2: Integer): Boolean; // `true`: no wall hit
 function g_GetAcidHit(X, Y: Integer; Width, Height: Word): Byte;
 function g_Look(a, b: PObj; d: TDirection): Boolean;
 procedure IncMax(var A: Integer; B, Max: Integer); overload;
@@ -89,18 +88,22 @@ procedure SortSArray(var S: SArray);
 function b_Text_Format(S: string): string;
 function b_Text_Unformat(S: string): string;
 
+
+var
+  gmon_dbg_los_enabled: Boolean = true;
+
 implementation
 
 uses
-  Math, g_map, g_gfx, g_player, SysUtils, MAPDEF,
-  StrUtils, e_graphics, g_monsters, g_items;
+  Math, e_log, g_map, g_gfx, g_player, SysUtils, MAPDEF,
+  StrUtils, e_graphics, g_monsters, g_items, g_game;
 
 function g_PatchLength(X1, Y1, X2, Y2: Integer): Word;
 begin
   Result := Min(Round(Hypot(Abs(X2-X1), Abs(Y2-Y1))), 65535);
 end;
 
-function g_CollideLevel(X, Y: Integer; Width, Height: Word): Boolean;
+function g_CollideLevel(X, Y: Integer; Width, Height: Word): Boolean; inline;
 begin
   result := g_Map_CollidePanel(X, Y, Width, Height, (PANEL_WALL or PANEL_CLOSEDOOR or PANEL_OPENDOOR), false);
 end;
@@ -126,7 +129,7 @@ begin
 end;
 *)
 
-function g_CollidePlayer(X, Y: Integer; Width, Height: Word): Boolean;
+function g_CollidePlayer(X, Y: Integer; Width, Height: Word): Boolean; inline;
 var
   a: Integer;
 begin
@@ -135,7 +138,7 @@ begin
   if gPlayers = nil then Exit;
 
   for a := 0 to High(gPlayers) do
-    if (gPlayers[a] <> nil) and gPlayers[a].Live then
+    if (gPlayers[a] <> nil) and gPlayers[a].alive then
       if gPlayers[a].Collide(X, Y, Width, Height) then
       begin
         Result := True;
@@ -143,20 +146,21 @@ begin
       end;
 end;
 
-function g_CollideMonster(X, Y: Integer; Width, Height: Word): Boolean;
-begin
-  result := g_Mons_AnyAt(X, Y, Width, Height);
-end;
 
 function g_TraceVector(X1, Y1, X2, Y2: Integer): Boolean;
 var
+  wallHitX: Integer = 0;
+  wallHitY: Integer = 0;
+(*
   i: Integer;
   dx, dy: Integer;
   Xerr, Yerr, d: LongWord;
   incX, incY: Integer;
   x, y: Integer;
+*)
 begin
-  Result := False;
+  (*
+  result := False;
 
   Assert(gCollideMap <> nil, 'g_TraceVector: gCollideMap = nil');
 
@@ -199,8 +203,15 @@ begin
   end;
 
   Result := True;
+  *)
+
+  // `true` if no obstacles
+  if (g_profile_los) then g_Mons_LOS_Start();
+  result := (g_Map_traceToNearestWall(x1, y1, x2, y2, @wallHitX, @wallHitY) = nil);
+  if (g_profile_los) then g_Mons_LOS_End();
 end;
 
+
 function g_CreateUID(UIDType: Byte): Word;
 var
   ok: Boolean;
@@ -232,7 +243,7 @@ begin
       while true do
       begin
         result := UID_MAX_PLAYER+$1+Random(UID_MAX_MONSTER-UID_MAX_GAME-UID_MAX_PLAYER+$1);
-        if (g_Monsters_Get(result) = nil) then break;
+        if (g_Monsters_ByUID(result) = nil) then break;
       end;
     end;
   end;
@@ -250,7 +261,7 @@ begin
 end;
 
 function g_Collide(X1, Y1: Integer; Width1, Height1: Word;
-                   X2, Y2: Integer; Width2, Height2: Word): Boolean;
+                   X2, Y2: Integer; Width2, Height2: Word): Boolean; inline;
 begin
   Result := not ( ((Y1 + Height1 <= Y2) or
                    (Y2 + Height2 <= Y1)) or
@@ -259,7 +270,7 @@ begin
 end;
 
 function g_CollideAround(X1, Y1: Integer; Width1, Height1: Word;
-                         X2, Y2: Integer; Width2, Height2: Word): Boolean;
+                         X2, Y2: Integer; Width2, Height2: Word): Boolean; inline;
 begin
   Result := g_Collide(X1, Y1, Width1, Height1, X2, Y2, Width2, Height2) or
             g_Collide(X1+1, Y1, Width1, Height1, X2, Y2, Width2, Height2) or
@@ -268,7 +279,7 @@ begin
             g_Collide(X1, Y1-1, Width1, Height1, X2, Y2, Width2, Height2);
 end;
 
-function c(X1, Y1, Width1, Height1, X2, Y2, Width2, Height2: Integer): Boolean;
+function c(X1, Y1, Width1, Height1, X2, Y2, Width2, Height2: Integer): Boolean; inline;
 begin
   Result := not (((Y1 + Height1 <= Y2) or
                   (Y1           >= Y2 + Height2)) or
@@ -276,13 +287,13 @@ begin
                    (X1          >= X2 + Width2)));
 end;
 
-function g_Collide2(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer): Boolean;
+function g_Collide2(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer): Boolean; inline;
 begin
   //Result :=  not (((Y2 <= Y3) or (Y1  >= Y4)) or ((X2 <= X3) or (X1  >= X4)));
   Result := c(X1, Y1, X2-X1, Y2-Y1, X3, Y3, X4-X3, Y4-Y3);
 end;
 
-function g_CollidePoint(X, Y, X2, Y2: Integer; Width, Height: Word): Boolean;
+function g_CollidePoint(X, Y, X2, Y2: Integer; Width, Height: Word): Boolean; inline;
 begin
   X := X-X2;
   Y := Y-Y2;
@@ -441,6 +452,8 @@ end;
 
 function g_Look(a, b: PObj; d: TDirection): Boolean;
 begin
+  if not gmon_dbg_los_enabled then begin result := false; exit; end; // always "wall hit"
+
   if ((b^.X > a^.X) and (d = D_LEFT)) or
      ((b^.X < a^.X) and (d = D_RIGHT)) then
   begin
@@ -946,16 +959,16 @@ begin
     begin
       p := g_Player_Get(UID);
       if p = nil then Exit;
-      if not p.Live then Exit;
+      if not p.alive then Exit;
 
       o^ := p.Obj;
     end;
 
     UID_MONSTER:
     begin
-      m := g_Monsters_Get(UID);
+      m := g_Monsters_ByUID(UID);
       if m = nil then Exit;
-      if not m.Live then Exit;
+      if not m.alive then Exit;
 
       o^ := m.Obj;
     end;