index 55a02104f4a56e602de638d507b13490936100cf..ca7ec00e32e8be568d538f6020515c42dbfcc9e6 100644 (file)
--- a/src/game/g_monsters.pas
+++ b/src/game/g_monsters.pas
uses
g_basic, e_graphics, g_phys, g_textures,
- g_saveload, BinEditor, g_panel;
+ g_saveload, BinEditor, g_panel, z_aabbtree;
const
MONSTATE_SLEEP = 0;
function findNewPrey(): Boolean;
procedure ActivateTriggers();
+ function getMapAABB (): AABB2D; inline;
+
public
FNoRespawn: Boolean;
FFireTime: Integer;
property GameAccelY: Integer read FObj.Accel.Y write FObj.Accel.Y;
property GameDirection: TDirection read FDirection write FDirection;
+ property mapAABB: AABB2D read getMapAABB;
+
property StartID: Integer read FStartID;
end;
type
- TEachMonsterCB = function (monidx: Integer; mon: TMonster): Boolean is nested; // return `true` to stop
+ TEachMonsterCB = function (mon: TMonster): Boolean is nested; // return `true` to stop
// throws on invalid uid
function g_Mons_ByIdx (uid: Integer): TMonster; inline;
e_log, g_main, g_sound, g_gfx, g_player, g_game,
g_weapons, g_triggers, MAPDEF, g_items, g_options,
g_console, g_map, Math, SysUtils, g_menu, wadreader,
- g_language, g_netmsg, z_aabbtree;
+ g_language, g_netmsg;
// ////////////////////////////////////////////////////////////////////////// //
monCheckTrapLastFrameId: DWord;
+function TMonster.getMapAABB (): AABB2D; inline;
+begin
+ result := AABB2D.CreateWH(FObj.X+FObj.Rect.X, FObj.Y+FObj.Rect.Y, FObj.Rect.Width, FObj.Rect.Height);
+end;
+
+
// ////////////////////////////////////////////////////////////////////////// //
type
TDynAABBTreeMonsBase = specialize TDynAABBTreeBase<TMonster>;
result := false;
if (flesh = nil) then raise Exception.Create('DynTree: trying to get dimensions of inexistant monsters');
if (flesh.Obj.Rect.Width < 1) or (flesh.Obj.Rect.Height < 1) then raise Exception.Create('DynTree: monster without size, wtf?!');
- aabb := AABB2D.CreateWH(flesh.Obj.X+flesh.Obj.Rect.X, flesh.Obj.Y+flesh.Obj.Rect.Y, flesh.Obj.Rect.Width, flesh.Obj.Rect.Height);
+ //aabb := AABB2D.CreateWH(flesh.Obj.X+flesh.Obj.Rect.X, flesh.Obj.Y+flesh.Obj.Rect.Y, flesh.Obj.Rect.Width, flesh.Obj.Rect.Height);
+ aabb := flesh.getMapAABB();
if not aabb.valid then raise Exception.Create('wutafuuuuuuu?!');
result := true;
end;
Result := False;
end;
+
function BehaviourDamage(SpawnerUID: Word; BH, SelfType: Byte): Boolean;
var
m: TMonster;
end;
end;
+
function canShoot(m: Byte): Boolean;
begin
Result := False;
end;
end;
-function isCorpse(o: PObj; immediately: Boolean): Integer;
+
+function isCorpse (o: PObj; immediately: Boolean): Integer;
function monsCollCheck (mon: TMonster; atag: Integer): Boolean;
begin
mon := gMonsters[idx];
if (mon <> nil) then
begin
- result := cb(idx, gMonsters[idx]);
+ result := cb(mon);
if result then exit;
end;
end;
mon := gMonsters[idx];
if (mon <> nil) and mon.Live then
begin
- result := cb(idx, gMonsters[idx]);
+ result := cb(mon);
if result then exit;
end;
end;
@@ -4513,7 +4527,7 @@ function g_Mons_ForEachAt (x, y: Integer; width, height: Integer; cb: TEachMonst
function monsCollCheck (mon: TMonster; atag: Integer): Boolean;
begin
result := false;
- if g_Obj_Collide(x, y, width, height, @mon.Obj) then result := cb(mon.arrIdx, mon);
+ if g_Obj_Collide(x, y, width, height, @mon.Obj) then result := cb(mon);
end;
var
begin
if g_Obj_Collide(x, y, width, height, @mon.Obj) then
begin
- result := cb(idx, mon);
+ result := cb(mon);
if result then exit;
end;
end;
@@ -4549,7 +4563,7 @@ function g_Mons_ForEachAliveAt (x, y: Integer; width, height: Integer; cb: TEach
function monsCollCheck (mon: TMonster; atag: Integer): Boolean;
begin
result := false;
- if mon.Live and g_Obj_Collide(x, y, width, height, @mon.Obj) then result := cb(mon.arrIdx, mon);
+ if mon.Live and g_Obj_Collide(x, y, width, height, @mon.Obj) then result := cb(mon);
end;
var
begin
if g_Obj_Collide(x, y, width, height, @mon.Obj) then
begin
- result := cb(idx, mon);
+ result := cb(mon);
if result then exit;
end;
end;