DEADSOFTWARE

raycast jumper (bad)
[d2df-sdl.git] / src / game / g_player.pas
index c1b7c087645cce6d7e413ff3237812e18e5a06ca..8981721df6bbddeb5e0cde76baa242b1e8c0cab6 100644 (file)
@@ -314,6 +314,8 @@ type
     //WARNING! this does nothing for now, but still call it!
     procedure positionChanged (); //WARNING! call this after monster position was changed, or coldet will not work right!
 
+    procedure getMapBox (out x, y, w, h: Integer); inline;
+
     property    Name: String read FName write FName;
     property    Model: TPlayerModel read FModel;
     property    Health: Integer read FHealth write FHealth;
@@ -517,8 +519,9 @@ implementation
 
 uses
   e_log, g_map, g_items, g_console, SysUtils, g_gfx, Math,
-  g_options, g_triggers, g_menu, MAPDEF, g_game,
-  wadreader, g_main, g_monsters, CONFIG, g_language, g_net, g_netmsg;
+  g_options, g_triggers, g_menu, MAPDEF, g_game, g_grid,
+  wadreader, g_main, g_monsters, CONFIG, g_language,
+  g_net, g_netmsg;
 
 type
   TBotProfile = record
@@ -2301,6 +2304,58 @@ begin
 end;
 
 procedure TPlayer.DrawAim();
+  procedure drawCast (sz: Integer; ax0, ay0, ax1, ay1: Integer);
+
+    function monsCollector (mon: TMonster; tag: Integer): Boolean;
+    var
+      ex, ey: Integer;
+      mx, my, mw, mh: Integer;
+    begin
+      result := false;
+      mon.getMapBox(mx, my, mw, mh);
+      e_DrawQuad(mx, my, mx+mw-1, my+mh-1, 255, 255, 0, 96);
+      if lineAABBIntersects(ax0, ay0, ax1, ay1, mx, my, mw, mh, ex, ey) then
+      begin
+        e_DrawPoint(8, ex, ey, 0, 255, 0);
+      end;
+    end;
+
+  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
+    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);
+    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
+    begin
+      e_DrawLine(2, ax0, ay0, ex, ey, 255, 255, 0, 96);
+    end
+    else
+    begin
+      e_DrawLine(2, ax0, ay0, ex, ey, 255, 127, 0, 96);
+    end;
+    }
+
+    g_Mons_AlongLine(ax0, ay0, ax1, ay1, monsCollector, true);
+  end;
+
 var
   wx, wy, xx, yy: Integer;
   angle: SmallInt;
@@ -2387,7 +2442,11 @@ 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}
+  drawCast(sz, wx, wy, xx, yy);
+  {$ENDIF}
 end;
 
 procedure TPlayer.DrawGUI();
@@ -3121,7 +3180,7 @@ begin
       end
     else if g_GetUIDType(SpawnerUID) = UID_MONSTER then
       begin // Óáèò ìîíñòðîì
-        mon := g_Monsters_Get(SpawnerUID);
+        mon := g_Monsters_ByUID(SpawnerUID);
         if mon = nil then
           s := '?'
         else
@@ -4813,7 +4872,7 @@ begin
   DecMin(FPain, 5, 0);
   DecMin(FPickup, 1, 0);
 
-  if FLive and (FObj.Y > gMapInfo.Height+128) and AnyServer then
+  if FLive and (FObj.Y > Integer(gMapInfo.Height)+128) and AnyServer then
   begin
     // Îáíóëèòü äåéñòâèÿ ïðèìî÷åê, ÷òîáû ôîí ïðîïàë
     FMegaRulez[MR_SUIT] := 0;
@@ -4998,6 +5057,14 @@ begin
     if FKeys[b].Time = 0 then FKeys[b].Pressed := False else Dec(FKeys[b].Time);
 end;
 
+procedure TPlayer.getMapBox (out x, y, w, h: Integer); inline;
+begin
+  x := FObj.X+PLAYER_RECT.X;
+  y := FObj.Y+PLAYER_RECT.Y;
+  w := PLAYER_RECT.Width;
+  h := PLAYER_RECT.Height;
+end;
+
 function TPlayer.Collide(X, Y: Integer; Width, Height: Word): Boolean;
 begin
   Result := g_Collide(FObj.X+PLAYER_RECT.X,
@@ -6304,10 +6371,10 @@ var
   vsPlayer, vsMonster, ok: Boolean;
 
 
-  function monsUpdate (monidx: Integer; mon: TMonster): Boolean;
+  function monsUpdate (mon: TMonster): Boolean;
   begin
     result := false; // don't stop
-    if (mon <> nil) and (mon.Live) and (mon.MonsterType <> MONSTER_BARREL) then
+    if mon.Live and (mon.MonsterType <> MONSTER_BARREL) then
     begin
       if not TargetOnScreen(mon.Obj.X+mon.Obj.Rect.X, mon.Obj.Y+mon.Obj.Rect.Y) then exit;
 
@@ -6393,7 +6460,7 @@ begin
         if (g_GetUIDType(Target.UID) = UID_MONSTER) and
             vsMonster then
           begin // Ìîíñòð
-            mon := g_Monsters_Get(Target.UID);
+            mon := g_Monsters_ByUID(Target.UID);
             if mon <> nil then
               begin
                 Target.X := mon.Obj.X;
@@ -6626,7 +6693,7 @@ begin
             end
           else
             begin // Öåëü - ìîíñòð
-              mon := g_Monsters_Get(Target.UID);
+              mon := g_Monsters_ByUID(Target.UID);
               if (mon = nil) or (not mon.Live) then
                 Target.UID := 0; // òî çàáûòü öåëü
             end;
@@ -7378,7 +7445,7 @@ begin
         if (g_GetUIDType(FLastSpawnerUID) = UID_MONSTER) and
            LongBool(gGameSettings.Options and GAME_OPTION_BOTVSMONSTER) then
         begin // Ìîíñòð
-          mon := g_Monsters_Get(FLastSpawnerUID);
+          mon := g_Monsters_ByUID(FLastSpawnerUID);
           ok := not TargetOnScreen(mon.Obj.X + mon.Obj.Rect.X,
                                    mon.Obj.Y + mon.Obj.Rect.Y);
         end;