diff --git a/src/game/g_map.pas b/src/game/g_map.pas
index 746d85c2445815028759f26eb0b08e532d4e50df..d93f0aa8aec41cda0d3b6dc3d3ad5a7253e59ec9 100644 (file)
--- a/src/game/g_map.pas
+++ b/src/game/g_map.pas
procedure g_Map_DrawPanelShadowVolumes(lightX: Integer; lightY: Integer; radius: Integer);
-// returns wall index in `gWalls` or -1
+// returns panel or nil
+// sets `ex` and `ey` to `x1` and `y1` when no hit was detected
function g_Map_traceToNearestWall (x0, y0, x1, y1: Integer; hitx: PInteger=nil; hity: PInteger=nil): TPanel;
+// returns panel or nil
+// sets `ex` and `ey` to `x1` and `y1` when no hit was detected
+function g_Map_traceToNearest (x0, y0, x1, y1: Integer; tag: Integer; hitx: PInteger=nil; hity: PInteger=nil): TPanel;
+
type
TForEachPanelCB = function (pan: TPanel): Boolean; // return `true` to stop
function g_Map_HasAnyPanelAtPoint (x, y: Integer; panelType: Word): Boolean;
+function g_Map_PanelAtPoint (x, y: Integer; tagmask: Integer=-1): TPanel;
// trace liquid, stepping by `dx` and `dy`
// return last seen liquid coords, and `false` if we're started outside of the liquid
-function g_Map_TraceLiquid (x, y, dx, dy: Integer; out topx, topy: Integer): Boolean;
+function g_Map_TraceLiquidNonPrecise (x, y, dx, dy: Integer; out topx, topy: Integer): Boolean;
procedure g_Map_ProfilersBegin ();
TPanelGrid = specialize TBodyGridBase<TPanel>;
var
- mapGrid: TPanelGrid = nil;
+ mapGrid: TPanelGrid = nil; // DO NOT USE! public for debugging only!
implementation
end;
end;
+// returns panel or nil
+function g_Map_traceToNearest (x0, y0, x1, y1: Integer; tag: Integer; hitx: PInteger=nil; hity: PInteger=nil): TPanel;
+var
+ ex, ey: Integer;
+begin
+ result := mapGrid.traceRay(ex, ey, x0, y0, x1, y1, nil, tag);
+ if (result <> nil) then
+ begin
+ if (hitx <> nil) then hitx^ := ex;
+ if (hity <> nil) then hity^ := ey;
+ end
+ else
+ begin
+ if (hitx <> nil) then hitx^ := x1;
+ if (hity <> nil) then hity^ := y1;
+ end;
+end;
+
function g_Map_HasAnyPanelAtPoint (x, y: Integer; panelType: Word): Boolean;
end;
+function g_Map_PanelAtPoint (x, y: Integer; tagmask: Integer=-1): TPanel;
+begin
+ result := nil;
+ if (tagmask = 0) then exit;
+ result := mapGrid.forEachAtPoint(x, y, nil, tagmask);
+end;
+
+
function g_Map_IsSpecialTexture(Texture: String): Boolean;
begin
Result := (Texture = TEXTURE_NAME_WATER) or
end;
end;
- procedure addPanelsToGrid (constref panels: TPanelArray; tag: Integer);
+ procedure addPanelsToGrid (constref panels: TPanelArray);
var
idx: Integer;
pan: TPanel;
+ newtag: Integer;
begin
- tag := panelTypeToTag(tag);
+ //tag := panelTypeToTag(tag);
for idx := 0 to High(panels) do
begin
pan := panels[idx];
- pan.tag := tag;
if not pan.visvalid then continue;
- pan.proxyId := mapGrid.insertBody(pan, pan.X, pan.Y, pan.Width, pan.Height, tag);
+ if (pan.proxyId <> -1) then
+ begin
+ {$IF DEFINED(D2F_DEBUG)}
+ e_WriteLog(Format('DUPLICATE wall #%d(%d) enabled (%d); type:%08x', [Integer(idx), Integer(pan.proxyId), Integer(mapGrid.proxyEnabled[pan.proxyId]), pan.PanelType]), MSG_NOTIFY);
+ {$ENDIF}
+ continue;
+ end;
+ case pan.PanelType of
+ PANEL_WALL: newtag := GridTagWall;
+ PANEL_OPENDOOR, PANEL_CLOSEDOOR: newtag := GridTagDoor;
+ PANEL_BACK: newtag := GridTagBack;
+ PANEL_FORE: newtag := GridTagFore;
+ PANEL_WATER: newtag := GridTagWater;
+ PANEL_ACID1: newtag := GridTagAcid1;
+ PANEL_ACID2: newtag := GridTagAcid2;
+ PANEL_STEP: newtag := GridTagStep;
+ PANEL_LIFTUP, PANEL_LIFTDOWN, PANEL_LIFTLEFT, PANEL_LIFTRIGHT: newtag := GridTagLift;
+ PANEL_BLOCKMON: newtag := GridTagBlockMon;
+ else continue; // oops
+ end;
+ pan.tag := newtag;
+
+ pan.proxyId := mapGrid.insertBody(pan, pan.X, pan.Y, pan.Width, pan.Height, newtag);
// "enabled" flag has meaning only for doors and walls (engine assumes it); but meh...
mapGrid.proxyEnabled[pan.proxyId] := pan.Enabled;
{$IFDEF MAP_DEBUG_ENABLED_FLAG}
calcBoundingBox(gLifts);
calcBoundingBox(gBlockMon);
- e_WriteLog(Format('map dimensions: (%d,%d)-(%d,%d); editor size:(0,0)-(%d,%d)', [mapX0, mapY0, mapX1, mapY1, gMapInfo.Width, gMapInfo.Height]), MSG_WARNING);
+ e_LogWritefln('map dimensions: (%d,%d)-(%d,%d); editor size:(0,0)-(%d,%d)', [mapX0, mapY0, mapX1, mapY1, gMapInfo.Width, gMapInfo.Height]);
if (mapX0 > 0) then mapX0 := 0;
if (mapY0 > 0) then mapY0 := 0;
if (mapY1 < gMapInfo.Height-1) then mapY1 := gMapInfo.Height-1;
mapGrid := TPanelGrid.Create(mapX0-128, mapY0-128, mapX1-mapX0+1+128*2, mapY1-mapY0+1+128*2);
-
- addPanelsToGrid(gWalls, PANEL_WALL);
- addPanelsToGrid(gWalls, PANEL_CLOSEDOOR);
- addPanelsToGrid(gWalls, PANEL_OPENDOOR);
- addPanelsToGrid(gRenderBackgrounds, PANEL_BACK);
- addPanelsToGrid(gRenderForegrounds, PANEL_FORE);
- addPanelsToGrid(gWater, PANEL_WATER);
- addPanelsToGrid(gAcid1, PANEL_ACID1);
- addPanelsToGrid(gAcid2, PANEL_ACID2);
- addPanelsToGrid(gSteps, PANEL_STEP);
- addPanelsToGrid(gLifts, PANEL_LIFTUP); // it doesn't matter which LIFT type is used here
- addPanelsToGrid(gBlockMon, PANEL_BLOCKMON);
+ //mapGrid := TPanelGrid.Create(0, 0, gMapInfo.Width, gMapInfo.Height);
+
+ addPanelsToGrid(gWalls);
+ addPanelsToGrid(gRenderBackgrounds);
+ addPanelsToGrid(gRenderForegrounds);
+ addPanelsToGrid(gWater);
+ addPanelsToGrid(gAcid1);
+ addPanelsToGrid(gAcid2);
+ addPanelsToGrid(gSteps);
+ addPanelsToGrid(gLifts); // it doesn't matter which LIFT type is used here
+ addPanelsToGrid(gBlockMon);
mapGrid.dumpStats();
end
else}
begin
- mapGrid.forEachInAABB(x0, y0, wdt, hgt, checker, GridDrawableMask, true);
+ mapGrid.forEachInAABB(x0, y0, wdt, hgt, checker, GridDrawableMask);
end;
// list will be rendered in `g_game.DrawPlayer()`
end;
end
else}
begin
- mapGrid.forEachInAABB(lightX-radius, lightY-radius, radius*2, radius*2, checker, (GridTagWall or GridTagDoor), true);
+ mapGrid.forEachInAABB(lightX-radius, lightY-radius, radius*2, radius*2, checker, (GridTagWall or GridTagDoor));
end;
end;
if g_Game_IsServer and g_Game_IsNet then MH_SEND_PanelState(gWalls[ID].PanelType, ID);
{$IFDEF MAP_DEBUG_ENABLED_FLAG}
- //e_WriteLog(Format('wall #%d(%d) enabled (%d) (%d,%d)-(%d,%d)', [Integer(ID), Integer(pan.proxyId), Integer(mapGrid.proxyEnabled[pan.proxyId]), pan.x, pan.y, pan.width, pan.height]), MSG_NOTIFY);
+ //e_WriteLog(Format('ENABLE: wall #%d(%d) enabled (%d) (%d,%d)-(%d,%d)', [Integer(ID), Integer(pan.proxyId), Integer(mapGrid.proxyEnabled[pan.proxyId]), pan.x, pan.y, pan.width, pan.height]), MSG_NOTIFY);
{$ENDIF}
end;
if g_Game_IsServer and g_Game_IsNet then MH_SEND_PanelState(pan.PanelType, ID);
{$IFDEF MAP_DEBUG_ENABLED_FLAG}
- //e_WriteLog(Format('wall #%d(%d) disabled (%d) (%d,%d)-(%d,%d)', [Integer(ID), Integer(pan.proxyId), Integer(mapGrid.proxyEnabled[pan.proxyId]), pan.x, pan.y, pan.width, pan.height]), MSG_NOTIFY);
+ //e_WriteLog(Format('DISABLE: wall #%d(%d) disabled (%d) (%d,%d)-(%d,%d)', [Integer(ID), Integer(pan.proxyId), Integer(mapGrid.proxyEnabled[pan.proxyId]), pan.x, pan.y, pan.width, pan.height]), MSG_NOTIFY);
{$ENDIF}
end;
PAMem.LoadFromMemory(Mem);
for i := 0 to Length(panels)-1 do
+ begin
if panels[i].SaveIt then
begin
// ID ïàíåëè:
end;
// Çàãðóæàåì ïàíåëü:
panels[i].LoadState(PAMem);
+ panels[i].arrIdx := i;
end;
+ end;
// Ýòîò ñïèñîê ïàíåëåé çàãðóæåí:
PAMem.Free();
// Îáíîâëÿåì êàðòó ñòîëêíîâåíèé è ñåòêó:
g_GFX_Init();
- mapCreateGrid();
+ //mapCreateGrid();
///// Çàãðóæàåì ìóçûêó: /////
// Ñèãíàòóðà ìóçûêè:
// trace liquid, stepping by `dx` and `dy`
// return last seen liquid coords, and `false` if we're started outside of the liquid
-function g_Map_TraceLiquid (x, y, dx, dy: Integer; out topx, topy: Integer): Boolean;
+function g_Map_TraceLiquidNonPrecise (x, y, dx, dy: Integer; out topx, topy: Integer): Boolean;
const
MaskLiquid = GridTagWater or GridTagAcid1 or GridTagAcid2;
begin