DEADSOFTWARE

some fixes for recursive grid queries (grid doesn't support recursive queries, but...
[d2df-sdl.git] / src / game / g_triggers.pas
index 999db6b3ad32f1dad2dd127da468182a24abcdd6..3b1f911bf133db08b97b0c1f50da8e5a1732fed1 100644 (file)
@@ -101,7 +101,7 @@ uses
   g_player, g_map, Math, g_gfx, g_game, g_textures,
   g_console, g_monsters, g_items, g_phys, g_weapons,
   wadreader, g_main, SysUtils, e_log, g_language,
-  g_options, g_net, g_netmsg;
+  g_options, g_net, g_netmsg, utils;
 
 const
   TRIGGER_SIGNATURE = $52475254; // 'TRGR'
@@ -211,7 +211,7 @@ var
   a, b, c: Integer;
   wx, wy, wh, ww: Integer;
 
-  function monsDamage (monidx: Integer; mon: TMonster): Boolean;
+  function monsDamage (mon: TMonster): Boolean;
   begin
     result := false; // don't stop
     if g_Obj_Collide(wx, wy, ww, wh, @mon.Obj) then mon.Damage(TRAP_DAMAGE, 0, 0, 0, HIT_TRAP);
@@ -985,7 +985,7 @@ var
   it: PItem;
   mon: TMonster;
 
-  function monsShotTarget (monidx: Integer; mon: TMonster): Boolean;
+  function monsShotTarget (mon: TMonster): Boolean;
   begin
     result := false; // don't stop
     if mon.Live and tr_ShotAimCheck(Trigger, @(mon.Obj)) then
@@ -997,7 +997,7 @@ var
     end;
   end;
 
-  function monsShotTargetMonPlr (monidx: Integer; mon: TMonster): Boolean;
+  function monsShotTargetMonPlr (mon: TMonster): Boolean;
   begin
     result := false; // don't stop
     if mon.Live and tr_ShotAimCheck(Trigger, @(mon.Obj)) then
@@ -1009,7 +1009,7 @@ var
     end;
   end;
 
-  function monShotTargetPlrMon (monidx: Integer; mon: TMonster): Boolean;
+  function monShotTargetPlrMon (mon: TMonster): Boolean;
   begin
     result := false; // don't stop
     if mon.Live and tr_ShotAimCheck(Trigger, @(mon.Obj)) then
@@ -2196,29 +2196,34 @@ begin
   Result := find_id;
 end;
 
+
+// sorry; grid doesn't support recursive queries, so we have to do this
+type
+  TSimpleMonsterList = specialize TSimpleList<TMonster>;
+
+var
+  tgMonsList: TSimpleMonsterList = nil;
+
 procedure g_Triggers_Update();
 var
   a, b, i: Integer;
   Affected: array of Integer;
 
-  {function monsNear (monidx: Integer; mon: TMonster): Boolean;
-  begin
-    result := false; // don't stop
-    if mon.Collide(gTriggers[a].X, gTriggers[a].Y, gTriggers[a].Width, gTriggers[a].Height) then
-    begin
-      gTriggers[a].ActivateUID := mon.UID;
-      ActivateTrigger(gTriggers[a], ACTIVATE_MONSTERCOLLIDE);
-    end;
-  end;}
-
-  function monsNear (monidx: Integer; mon: TMonster): Boolean;
+  function monsNear (mon: TMonster): Boolean;
   begin
     result := false; // don't stop
+    {
     gTriggers[a].ActivateUID := mon.UID;
     ActivateTrigger(gTriggers[a], ACTIVATE_MONSTERCOLLIDE);
+    }
+    tgMonsList.append(mon);
   end;
 
+var
+  mon: TMonster;
 begin
+  if (tgMonsList = nil) then tgMonsList := TSimpleMonsterList.Create();
+
   if gTriggers = nil then
     Exit;
   SetLength(Affected, 0);
@@ -2454,7 +2459,14 @@ begin
           begin
             //g_Mons_ForEach(monsNear);
             //Alive?!
+            tgMonsList.reset();
             g_Mons_ForEachAt(gTriggers[a].X, gTriggers[a].Y, gTriggers[a].Width, gTriggers[a].Height, monsNear);
+            for mon in tgMonsList do
+            begin
+              gTriggers[a].ActivateUID := mon.UID;
+              ActivateTrigger(gTriggers[a], ACTIVATE_MONSTERCOLLIDE);
+            end;
+            tgMonsList.reset(); // just in case
           end;
 
           // "Ìîíñòðîâ íåò"