DEADSOFTWARE

holmes: added outline for map position
[d2df-sdl.git] / src / game / g_holmes.pas
index 142e2be2a4f1933ef463ead57b5256bae6574503..34fac81284217c51e8303d09c2a0ffd89f2d9855 100644 (file)
@@ -48,8 +48,9 @@ var
 implementation
 
 uses
+  {$INCLUDE ../nogl/noGLuses.inc}
   {rttiobj,} typinfo, e_texture,
-  SysUtils, Classes, GL, SDL2,
+  SysUtils, Classes, SDL2,
   MAPDEF, g_main, g_options,
   utils, hashtable, xparser;
 
@@ -951,7 +952,7 @@ procedure plrDebugDraw ();
     pdy := pmsCurMapY-(py+ph div 2);
     hlmContext.color := TGxRGBA.Create(255, 0, 255, 200);
     hlmContext.line(px+pw div 2, py+ph div 2, px+pw div 2+pdx, py+ph div 2+pdy);
-    pan := mapGrid.traceBox(ex, ey, px, py, pw, ph, pdx, pdy, nil, GridTagObstacle);
+    pan := mapGrid.traceBox(ex, ey, px, py, pw, ph, pdx, pdy, GridTagObstacle);
     if (pan = nil) then
     begin
       hlmContext.color := TGxRGBA.Create(255, 255, 255, 180);
@@ -972,6 +973,17 @@ procedure plrDebugDraw ();
     hlmContext.fillRect(cx, cy, monsGrid.tileSize, monsGrid.tileSize);
   end;
 
+  procedure hilightBodyCells (proxyId: Integer);
+  var
+    it: CellCoordIter;
+    pcellxy: PGridCellCoord;
+  begin
+    //monsGrid.forEachBodyCell(mon.proxyId, hilightCell);
+    it := monsGrid.forEachBodyCell(proxyId);
+    for pcellxy in it do hilightCell(pcellxy^.x, pcellxy^.y);
+    it.release();
+  end;
+
   procedure hilightCell1 (cx, cy: Integer);
   begin
     //e_WriteLog(Format('h1: (%d,%d)', [cx, cy]), MSG_NOTIFY);
@@ -990,12 +1002,11 @@ procedure plrDebugDraw ();
     hlmContext.fillRect(pan.X, pan.Y, pan.Width, pan.Height);
   end;
 
-  function monsCollector (mon: TMonster; tag: Integer): Boolean;
+  procedure monsCollector (mon: TMonster);
   var
     ex, ey: Integer;
     mx, my, mw, mh: Integer;
   begin
-    result := false;
     mon.getMapBox(mx, my, mw, mh);
     hlmContext.color := TGxRGBA.Create(255, 255, 0, 160);
     hlmContext.rect(mx, my, mw, mh);
@@ -1074,7 +1085,8 @@ procedure plrDebugDraw ();
     mon.getMapBox(mx, my, mw, mh);
     //mx += mw div 2;
 
-    monsGrid.forEachBodyCell(mon.proxyId, hilightCell);
+    //monsGrid.forEachBodyCell(mon.proxyId, hilightCell);
+    hilightBodyCells(mon.proxyId);
 
     if showMonsInfo then
     begin
@@ -1113,7 +1125,8 @@ procedure plrDebugDraw ();
   function highlightAllMonsterCells (mon: TMonster): Boolean;
   begin
     result := false; // don't stop
-    monsGrid.forEachBodyCell(mon.proxyId, hilightCell);
+    //monsGrid.forEachBodyCell(mon.proxyId, hilightCell);
+    hilightBodyCells(mon.proxyId);
   end;
 
   procedure drawSelectedPlatformCells ();
@@ -1123,7 +1136,8 @@ procedure plrDebugDraw ();
     if not showGrid then exit;
     pan := g_Map_PanelByGUID(platMarkedGUID);
     if (pan = nil) then exit;
-    mapGrid.forEachBodyCell(pan.proxyId, hilightCell);
+    //mapGrid.forEachBodyCell(pan.proxyId, hilightCell);
+    hilightBodyCells(pan.proxyId);
     hlmContext.color := TGxRGBA.Create(0, 200, 0, 200);
     hlmContext.rect(pan.x, pan.y, pan.width, pan.height);
   end;
@@ -1231,9 +1245,13 @@ procedure plrDebugDraw ();
 
 var
   mon: TMonster;
+  mit: PMonster;
+  it: TMonsterGrid.Iter;
   mx, my, mw, mh: Integer;
   //pan: TPanel;
   //ex, ey: Integer;
+  s: AnsiString;
+  dx, dy: Integer;
 begin
   if (gPlayer1 = nil) then exit;
 
@@ -1255,7 +1273,13 @@ begin
     if (showGrid) then drawTileGrid();
     drawOutlines();
 
-    if (laserSet) then g_Mons_AlongLine(laserX0, laserY0, laserX1, laserY1, monsCollector, true);
+    if (laserSet) then
+    begin
+      //g_Mons_AlongLine(laserX0, laserY0, laserX1, laserY1, monsCollector, true);
+      it := monsGrid.forEachAlongLine(laserX0, laserY0, laserX1, laserY1, -1, true);
+      for mit in it do monsCollector(mit^);
+      it.release();
+    end;
 
     if (monMarkedUID <> -1) then
     begin
@@ -1302,10 +1326,19 @@ begin
 
   if showMapCurPos then
   begin
+    s := Format('mappos:(%d,%d)', [pmsCurMapX, pmsCurMapY]);
     gxSetContext(hlmContext);
     hlmContext.font := 'win8';
+    hlmContext.color := TGxRGBA.Create(0, 0, 0);
+    for dy := -1 to 1 do
+    begin
+      for dx := -1 to 1 do
+      begin
+        if (dx <> 0) or (dy <> 0) then hlmContext.drawText(4+dx, gWinSizeY-10+dy, s);
+      end;
+    end;
     hlmContext.color := TGxRGBA.Create(255, 255, 0);
-    hlmContext.drawText(4, gWinSizeY-10, Format('mappos:(%d,%d)', [pmsCurMapX, pmsCurMapY]));
+    hlmContext.drawText(4, gWinSizeY-10, s);
     gxSetContext(nil);
   end;
 end;
@@ -1525,9 +1558,8 @@ procedure cbAtcurSelectMonster ();
 var
   plr: TPlayer;
   x, y, w, h: Integer;
-  pmark: PoolMark;
-  hitcount: Integer;
-  pmon: PMonster;
+  mit: PMonster;
+  it: TMonsterGrid.Iter;
 begin
   monMarkedUID := -1;
   if (Length(gPlayers) > 0) then
@@ -1543,16 +1575,9 @@ begin
     end;
   end;
   //e_WriteLog('===========================', MSG_NOTIFY);
-  pmark := framePool.mark();
-  hitcount := monsGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY);
-  pmon := PMonster(framePool.getPtr(pmark));
-  while (hitcount > 0) do
-  begin
-    monsAtDump(pmon^);
-    Inc(pmon);
-    Dec(hitcount);
-  end;
-  framePool.release(pmark);
+  it := monsGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY);
+  for mit in it do monsAtDump(mit^);
+  it.release();
   //e_WriteLog('---------------------------', MSG_NOTIFY);
 end;
 
@@ -1563,25 +1588,17 @@ procedure cbAtcurDumpMonsters ();
     e_WriteLog(Format('monster #%d (UID:%u) (proxyid:%d)', [mon.arrIdx, mon.UID, mon.proxyId]), TMsgType.Notify);
   end;
 var
-  pmark: PoolMark;
-  hitcount: Integer;
-  pmon: PMonster;
+  mit: PMonster;
+  it: TMonsterGrid.Iter;
 begin
-  pmark := framePool.mark();
-  hitcount := monsGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY);
-  if (hitcount > 0) then
+  it := monsGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY);
+  if (it.length > 0) then
   begin
     e_WriteLog('===========================', TMsgType.Notify);
-    pmon := PMonster(framePool.getPtr(pmark));
-    while (hitcount > 0) do
-    begin
-      monsAtDump(pmon^);
-      Inc(pmon);
-      Dec(hitcount);
-    end;
+    for mit in it do monsAtDump(mit^);
     e_WriteLog('---------------------------', TMsgType.Notify);
   end;
-  framePool.release(pmark);
+  it.release();
 end;
 
 procedure cbAtcurDumpWalls ();
@@ -1596,26 +1613,18 @@ var
   hasTrigs: Boolean = false;
   f: Integer;
   trig: PTrigger;
-  pmark: PoolMark;
-  hitcount: Integer;
-  ppan: PPanel;
+  mwit: PPanel;
+  it: TPanelGrid.Iter;
 begin
   platMarkedGUID := -1;
-  pmark := framePool.mark();
-  hitcount := mapGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY, (GridTagWall or GridTagDoor));
-  if (hitcount > 0) then
+  it := mapGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY, (GridTagWall or GridTagDoor));
+  if (it.length > 0) then
   begin
     e_WriteLog('=== TOGGLE WALL ===', TMsgType.Notify);
-    ppan := PPanel(framePool.getPtr(pmark));
-    while (hitcount > 0) do
-    begin
-      wallToggle(ppan^);
-      Inc(ppan);
-      Dec(hitcount);
-    end;
+    for mwit in it do wallToggle(mwit^);
     e_WriteLog('--- toggle wall ---', TMsgType.Notify);
   end;
-  framePool.release(pmark);
+  it.release();
   if showTriggers then
   begin
     for f := 0 to High(gTriggers) do
@@ -1639,22 +1648,14 @@ procedure cbAtcurToggleWalls ();
     if pan.Enabled then g_Map_DisableWallGUID(pan.guid) else g_Map_EnableWallGUID(pan.guid);
   end;
 var
-  pmark: PoolMark;
-  hitcount: Integer;
-  ppan: PPanel;
+  mwit: PPanel;
+  it: TPanelGrid.Iter;
 begin
   //e_WriteLog('=== TOGGLE WALL ===', MSG_NOTIFY);
   //e_WriteLog('--- toggle wall ---', MSG_NOTIFY);
-  pmark := framePool.mark();
-  hitcount := mapGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY, (GridTagWall or GridTagDoor));
-  ppan := PPanel(framePool.getPtr(pmark));
-  while (hitcount > 0) do
-  begin
-    wallToggle(ppan^);
-    Inc(ppan);
-    Dec(hitcount);
-  end;
-  framePool.release(pmark);
+  it := mapGrid.forEachAtPoint(pmsCurMapX, pmsCurMapY, (GridTagWall or GridTagDoor));
+  for mwit in it do wallToggle(mwit^);
+  it.release();
 end;