X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_map.pas;h=d93f0aa8aec41cda0d3b6dc3d3ad5a7253e59ec9;hb=fb2545cc618f2ffe256ab3bc0173b063382c8887;hp=bbe1d6c3c7dc535a53ed9b84e1ffd31d84e459c1;hpb=a17222535319cb4089e3f9a92711731c015819b3;p=d2df-sdl.git diff --git a/src/game/g_map.pas b/src/game/g_map.pas index bbe1d6c..d93f0aa 100644 --- a/src/game/g_map.pas +++ b/src/game/g_map.pas @@ -92,17 +92,23 @@ procedure g_Map_LoadState(Var Mem: TBinMemoryReader); 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 (); @@ -192,7 +198,7 @@ type TPanelGrid = specialize TBodyGridBase; var - mapGrid: TPanelGrid = nil; + mapGrid: TPanelGrid = nil; // DO NOT USE! public for debugging only! implementation @@ -299,6 +305,24 @@ begin 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; @@ -353,6 +377,14 @@ begin 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 @@ -1185,7 +1217,7 @@ begin 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; @@ -1194,6 +1226,7 @@ begin 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); + //mapGrid := TPanelGrid.Create(0, 0, gMapInfo.Width, gMapInfo.Height); addPanelsToGrid(gWalls); addPanelsToGrid(gRenderBackgrounds); @@ -2724,6 +2757,7 @@ var PAMem.LoadFromMemory(Mem); for i := 0 to Length(panels)-1 do + begin if panels[i].SaveIt then begin // ID ïàíåëè: @@ -2734,7 +2768,9 @@ var end; // Çàãðóæàåì ïàíåëü: panels[i].LoadState(PAMem); + panels[i].arrIdx := i; end; + end; // Ýòîò ñïèñîê ïàíåëåé çàãðóæåí: PAMem.Free(); @@ -2787,7 +2823,7 @@ begin // Îáíîâëÿåì êàðòó ñòîëêíîâåíèé è ñåòêó: g_GFX_Init(); - mapCreateGrid(); + //mapCreateGrid(); ///// Çàãðóæàåì ìóçûêó: ///// // Ñèãíàòóðà ìóçûêè: @@ -2850,7 +2886,7 @@ end; // 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