X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_map.pas;h=ae8ee105f42f3bc783b26d62a6ec4ac7ff08d70f;hb=89b25c381542119e51cf5278f29a8bbd68cc4f9e;hp=577891f59bbd8ef187dfa536aa3b2406b22a8bdb;hpb=91adc12c8717ef13ca9e86ed040a42c3c0d73ca7;p=d2df-sdl.git diff --git a/src/game/g_map.pas b/src/game/g_map.pas index 577891f..ae8ee10 100644 --- a/src/game/g_map.pas +++ b/src/game/g_map.pas @@ -125,6 +125,12 @@ procedure g_Map_ProfilersEnd (); function g_Map_ParseMap (data: Pointer; dataLen: Integer): TDynRecord; + +function g_Map_MinX (): Integer; inline; +function g_Map_MinY (): Integer; inline; +function g_Map_MaxX (): Integer; inline; +function g_Map_MaxY (): Integer; inline; + const NNF_NO_NAME = 0; NNF_NAME_BEFORE = 1; @@ -183,6 +189,9 @@ const GridTagLift = 1 shl 8; // gLifts GridTagBlockMon = 1 shl 9; // gBlockMon + GridTagObstacle = (GridTagStep or GridTagWall or GridTagDoor); + GridTagLiquid = (GridTagAcid1 or GridTagAcid2 or GridTagWater); + GridDrawableMask = (GridTagBack or GridTagStep or GridTagWall or GridTagDoor or GridTagAcid1 or GridTagAcid2 or GridTagWater or GridTagFore); @@ -253,10 +262,18 @@ begin end; +// ////////////////////////////////////////////////////////////////////////// // +function g_Map_MinX (): Integer; inline; begin if (mapGrid <> nil) then result := mapGrid.gridX0 else result := 0; end; +function g_Map_MinY (): Integer; inline; begin if (mapGrid <> nil) then result := mapGrid.gridY0 else result := 0; end; +function g_Map_MaxX (): Integer; inline; begin if (mapGrid <> nil) then result := mapGrid.gridX0+mapGrid.gridWidth-1 else result := 0; end; +function g_Map_MaxY (): Integer; inline; begin if (mapGrid <> nil) then result := mapGrid.gridY0+mapGrid.gridHeight-1 else result := 0; end; + + // ////////////////////////////////////////////////////////////////////////// // var dfmapdef: TDynMapDef = nil; + procedure loadMapDefinition (); var pr: TTextParser = nil; @@ -264,13 +281,15 @@ var WAD: TWADFile = nil; begin if (dfmapdef <> nil) then exit; + try e_LogWritefln('parsing "mapdef.txt"...', []); st := openDiskFileRO(DataDir+'mapdef.txt'); + e_LogWritefln('found local "%smapdef.txt"', [DataDir]); except st := nil; - e_LogWritefln('local "%smapdef.txt" not found', [DataDir]); end; + if (st = nil) then begin WAD := TWADFile.Create(); @@ -285,15 +304,22 @@ begin end; end; - if (st = nil) then - begin - //raise Exception.Create('cannot open "mapdef.txt"'); - e_LogWritefln('using default "mapdef.txt"...', [], MSG_WARNING); - pr := TStrTextParser.Create(defaultMapDef); - end - else - begin - pr := TFileTextParser.Create(st); + try + if (st = nil) then + begin + //raise Exception.Create('cannot open "mapdef.txt"'); + e_LogWriteln('using default "mapdef.txt"...'); + pr := TStrTextParser.Create(defaultMapDef); + end + else + begin + pr := TFileTextParser.Create(st); + end; + except on e: Exception do + begin + e_LogWritefln('something is VERY wrong here! -- ', [e.message]); + raise; + end; end; try @@ -315,6 +341,8 @@ var begin result := nil; if (dataLen < 4) then exit; + + if (dfmapdef = nil) then writeln('need to load mapdef'); loadMapDefinition(); if (dfmapdef = nil) then raise Exception.Create('internal map loader error'); @@ -324,6 +352,7 @@ begin begin // binary map try + //e_LogWriteln('parsing binary map...'); result := dfmapdef.parseBinMap(wst); except on e: Exception do begin @@ -340,6 +369,7 @@ begin // text map pr := TFileTextParser.Create(wst); try + //e_LogWriteln('parsing text map...'); result := dfmapdef.parseMap(pr); except on e: Exception do begin @@ -352,6 +382,7 @@ begin end; pr.Free(); // will free `wst` end; + //e_LogWriteln('map parsed.'); end; @@ -1297,7 +1328,7 @@ begin end else begin - trigData := Trigger.trigRec.clone(); + trigData := Trigger.trigRec.clone(nil); end; end; @@ -2187,6 +2218,8 @@ begin mapReader := g_Map_ParseMap(Data, Len); except mapReader := nil; + FreeMem(Data); + exit; end; FreeMem(Data);