X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_triggers.pas;h=3b1f911bf133db08b97b0c1f50da8e5a1732fed1;hb=836fd31457a6f741815605633f2fbfa157e37418;hp=999db6b3ad32f1dad2dd127da468182a24abcdd6;hpb=ae5dd5cd82a0c9548c27d2e646de1492e66d98df;p=d2df-sdl.git diff --git a/src/game/g_triggers.pas b/src/game/g_triggers.pas index 999db6b..3b1f911 100644 --- a/src/game/g_triggers.pas +++ b/src/game/g_triggers.pas @@ -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; + +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; // "Ìîíñòðîâ íåò"