DEADSOFTWARE

better hitscan tracer; no more level trace bitmap (but no more particles too, alas)
[d2df-sdl.git] / src / game / g_basic.pas
index 67285caa60e8cb5349cdd9f606ca1a66dc7f70ca..8e1ae926769f02fa83676e5a685bd9274417d124 100644 (file)
@@ -47,10 +47,8 @@ function g_CollideLevel(X, Y: Integer; Width, Height: Word): Boolean;
 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;
-function g_CollideItem(X, Y: Integer; Width, Height: Word): Boolean;
 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;
@@ -102,6 +100,10 @@ begin
 end;
 
 function g_CollideLevel(X, Y: Integer; Width, Height: Word): Boolean;
+begin
+  result := g_Map_CollidePanel(X, Y, Width, Height, (PANEL_WALL or PANEL_CLOSEDOOR or PANEL_OPENDOOR), false);
+end;
+(*
 var
   a: Integer;
 begin
@@ -121,6 +123,7 @@ begin
       Exit;
     end;
 end;
+*)
 
 function g_CollidePlayer(X, Y: Integer; Width, Height: Word): Boolean;
 var
@@ -139,50 +142,21 @@ begin
       end;
 end;
 
-function g_CollideMonster(X, Y: Integer; Width, Height: Word): Boolean;
-var
-  a: Integer;
-begin
-  Result := False;
-
-  if gMonsters = nil then Exit;
-
-  for a := 0 to High(gMonsters) do
-    if (gMonsters[a] <> nil) and gMonsters[a].Live then
-      if g_Obj_Collide(X, Y, Width, Height, @gMonsters[a].Obj) then
-      begin
-        Result := True;
-        Exit;
-      end;
-end;
-
-function g_CollideItem(X, Y: Integer; Width, Height: Word): Boolean;
-var
-  a: Integer;
-begin
-  Result := False;
-
-  if gItems = nil then
-    Exit;
-
-  for a := 0 to High(gItems) do
-    if gItems[a].Live then
-      if g_Obj_Collide(X, Y, Width, Height, @gItems[a].Obj) then
-        begin
-          Result := True;
-          Exit;
-        end;
-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');
 
@@ -225,8 +199,21 @@ begin
   end;
 
   Result := True;
+  *)
+
+  if (g_Map_traceToNearestWall(x1, y1, x2, y2, @wallHitX, @wallHitY) >= 0) then
+  begin
+    // check distance
+    //result := ((wallHitX-x1)*(wallHitX-x1)+(wallHitY-y1)*(wallHitY-y1) > (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
+    result := false;
+  end
+  else
+  begin
+    result := true; // no obstacles
+  end;
 end;
 
+
 function g_CreateUID(UIDType: Byte): Word;
 var
   ok: Boolean;
@@ -254,19 +241,12 @@ begin
 
     UID_MONSTER:
     begin
-      repeat
-        Result := UID_MAX_PLAYER+$1+Random(UID_MAX_MONSTER-UID_MAX_GAME-UID_MAX_PLAYER+$1);
-
-        ok := True;
-        if gMonsters <> nil then
-          for i := 0 to High(gMonsters) do
-            if gMonsters[i] <> nil then
-              if Result = gMonsters[i].UID then
-              begin
-                ok := False;
-                Break;
-              end;
-      until ok;
+      //FIXME!!!
+      while true do
+      begin
+        result := UID_MAX_PLAYER+$1+Random(UID_MAX_MONSTER-UID_MAX_GAME-UID_MAX_PLAYER+$1);
+        if (g_Monsters_ByUID(result) = nil) then break;
+      end;
     end;
   end;
 end;
@@ -986,7 +966,7 @@ begin
 
     UID_MONSTER:
     begin
-      m := g_Monsters_Get(UID);
+      m := g_Monsters_ByUID(UID);
       if m = nil then Exit;
       if not m.Live then Exit;