DEADSOFTWARE

replaced manual pool walking with nice iterator (yet one should still call `.release...
[d2df-sdl.git] / src / game / g_monsters.pas
index bd4cd36be433fe2a7ec766052adb2dda140f19c2..bb3d293ded57dc0413327ff01394b2a2055f41f8 100644 (file)
@@ -22,7 +22,7 @@ interface
 
 uses
   SysUtils, Classes,
-  {$IFDEF USE_MEMPOOL}mempool,{$ENDIF}
+  mempool,
   g_basic, e_graphics, g_phys, g_textures, g_grid,
   g_saveload, g_panel, xprofiler;
 
@@ -50,6 +50,7 @@ const
 }
 
 type
+  PMonster = ^TMonster;
   TMonster = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
   private
     FMonsterType: Byte;
@@ -272,10 +273,12 @@ function g_Mons_getNewTrapFrameId (): DWord; inline;
 function g_Mons_getNewMPlatFrameId (): LongWord; inline;
 
 
+{
 type
   TMonsAlongLineCB = function (mon: TMonster; tag: Integer): Boolean is nested;
 
 function g_Mons_AlongLine (x0, y0, x1, y1: Integer; cb: TMonsAlongLineCB; log: Boolean=false): TMonster;
+}
 
 
 var
@@ -363,11 +366,13 @@ procedure TMonster.setDirty (); inline; begin mNeedSend := true; end;
 
 
 // ////////////////////////////////////////////////////////////////////////// //
+{
 function g_Mons_AlongLine (x0, y0, x1, y1: Integer; cb: TMonsAlongLineCB; log: Boolean=false): TMonster;
 begin
   if not assigned(cb) then begin result := nil; exit; end;
   result := monsGrid.forEachAlongLine(x0, y0, x1, y1, cb, -1, log);
 end;
+}
 
 
 //WARNING! call this after monster position was changed, or coldet will not work right!
@@ -757,6 +762,7 @@ end;
 
 function isCorpse (o: PObj; immediately: Boolean): Integer;
 
+  (*
   function monsCollCheck (mon: TMonster; atag: Integer): Boolean;
   begin
     atag := atag; // shut up, fpc!
@@ -771,10 +777,13 @@ function isCorpse (o: PObj; immediately: Boolean): Integer;
       result := true;
     end;
   end;
+  *)
 
 var
   a: Integer;
-  mon: TMonster;
+  mon: PMonster;
+  mres: TMonster = nil;
+  it: TMonsterGrid.Iter;
 begin
   result := -1;
 
@@ -784,8 +793,21 @@ begin
   // Èùåì ìåðòâûõ ìîíñòðîâ ïîáëèçîñòè
   if gmon_debug_use_sqaccel then
   begin
-    mon := monsGrid.forEachInAABB(o.X+o.Rect.X, o.Y+o.Rect.Y, o.Rect.Width, o.Rect.Height, monsCollCheck);
-    if (mon <> nil) then result := mon.mArrIdx;
+    //mon := monsGrid.forEachInAABB(o.X+o.Rect.X, o.Y+o.Rect.Y, o.Rect.Width, o.Rect.Height, monsCollCheck);
+    //if (mon <> nil) then result := mon.mArrIdx;
+    it := monsGrid.forEachInAABB(o.X+o.Rect.X, o.Y+o.Rect.Y, o.Rect.Width, o.Rect.Height);
+    for mon in it do
+    begin
+      case mon.FMonsterType of // Íå âîñêðåñèòü:
+        MONSTER_SOUL, MONSTER_PAIN, MONSTER_CYBER, MONSTER_SPIDER,
+        MONSTER_VILE, MONSTER_BARREL, MONSTER_ROBO: begin end;
+        // Îñòàëüíûõ ìîæíî âîñêðåñèòü
+        else mres := mon^;
+      end;
+      if (mres <> nil) then break;
+    end;
+    it.release();
+    if (mres <> nil) then result := mres.mArrIdx;
   end
   else
   begin
@@ -4688,21 +4710,26 @@ end;
 
 
 function g_Mons_IsAnyAliveAt (x, y: Integer; width, height: Integer): Boolean;
-
+  (*
   function monsCollCheck (mon: TMonster; atag: Integer): Boolean;
   begin
     result := mon.alive;// and g_Obj_Collide(x, y, width, height, @mon.Obj));
   end;
-
+  *)
 var
   idx: Integer;
   mon: TMonster;
+  mit: PMonster;
+  it: TMonsterGrid.Iter;
 begin
   result := false;
   if (width < 1) or (height < 1) then exit;
   if gmon_debug_use_sqaccel then
   begin
-    result := (monsGrid.forEachInAABB(x, y, width, height, monsCollCheck) <> nil);
+    //result := (monsGrid.forEachInAABB(x, y, width, height, monsCollCheck) <> nil);
+    it := monsGrid.forEachInAABB(x, y, width, height);
+    for mit in it do if (mit.alive) then begin result := true; break; end;
+    it.release();
   end
   else
   begin
@@ -4723,21 +4750,26 @@ end;
 
 
 function g_Mons_ForEachAt (x, y: Integer; width, height: Integer; cb: TEachMonsterCB): Boolean;
-
+  (*
   function monsCollCheck (mon: TMonster; atag: Integer): Boolean;
   begin
     result := cb(mon);
   end;
-
+  *)
 var
   idx: Integer;
   mon: TMonster;
+  mit: PMonster;
+  it: TMonsterGrid.Iter;
 begin
   result := false;
   if (width < 1) or (height < 1) then exit;
   if gmon_debug_use_sqaccel then
   begin
-    result := (monsGrid.forEachInAABB(x, y, width, height, monsCollCheck) <> nil);
+    //result := (monsGrid.forEachInAABB(x, y, width, height, monsCollCheck) <> nil);
+    it := monsGrid.forEachInAABB(x, y, width, height);
+    for mit in it do if (cb(mit^)) then begin result := true; break; end;
+    it.release();
   end
   else
   begin
@@ -4758,22 +4790,25 @@ end;
 
 
 function g_Mons_ForEachAliveAt (x, y: Integer; width, height: Integer; cb: TEachMonsterCB): Boolean;
-
+  (*
   function monsCollCheck (mon: TMonster; atag: Integer): Boolean;
   begin
     //result := false;
     //if mon.alive and g_Obj_Collide(x, y, width, height, @mon.Obj) then result := cb(mon);
     if mon.alive then result := cb(mon) else result := false;
   end;
-
+  *)
 var
   idx: Integer;
   mon: TMonster;
+  mit: PMonster;
+  it: TMonsterGrid.Iter;
 begin
   result := false;
   if (width < 1) or (height < 1) then exit;
   if gmon_debug_use_sqaccel then
   begin
+    {
     if (width = 1) and (height = 1) then
     begin
       result := (monsGrid.forEachAtPoint(x, y, monsCollCheck) <> nil);
@@ -4782,6 +4817,16 @@ begin
     begin
       result := (monsGrid.forEachInAABB(x, y, width, height, monsCollCheck) <> nil);
     end;
+    }
+    it := monsGrid.forEachInAABB(x, y, width, height);
+    for mit in it do
+    begin
+      if (mit^.alive) then
+      begin
+        if (cb(mit^)) then begin result := true; break; end;
+      end;
+    end;
+    it.release();
   end
   else
   begin