X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_map.pas;h=f6921131b3be776cfa1b30f8d248b8fc5593e760;hb=4cf7f08ed4f5baf7e0161b87fab446b5b3391154;hp=0dc5090c2f123848164d467cdcdf56745d736529;hpb=8eea4becb53e1531c8d539c37a2809a8de9965b2;p=d2df-sdl.git diff --git a/src/game/g_map.pas b/src/game/g_map.pas index 0dc5090..f692113 100644 --- a/src/game/g_map.pas +++ b/src/game/g_map.pas @@ -202,6 +202,14 @@ const GridDrawableMask = (GridTagBack or GridTagStep or GridTagWall or GridTagDoor or GridTagAcid1 or GridTagAcid2 or GridTagWater or GridTagFore); +type + TBinHeapPanelDrawCmp = class + public + class function less (const a, b: TPanel): Boolean; inline; + end; + + TBinHeapPanelDraw = specialize TBinaryHeapBase; + var gWalls: TPanelArray; gRenderBackgrounds: TPanelArray; @@ -224,10 +232,11 @@ var gdbg_map_use_accel_render: Boolean = true; gdbg_map_use_accel_coldet: Boolean = true; profMapCollision: TProfiler = nil; //WARNING: FOR DEBUGGING ONLY! - gDrawPanelList: TBinaryHeapObj = nil; // binary heap of all walls we have to render, populated by `g_Map_CollectDrawPanels()` + gDrawPanelList: TBinHeapPanelDraw = nil; // binary heap of all walls we have to render, populated by `g_Map_CollectDrawPanels()` gCurrentMap: TDynRecord = nil; gCurrentMapFileName: AnsiString = ''; // so we can skip texture reloading + gTestMap: String = ''; function panelTypeToTag (panelType: Word): Integer; // returns GridTagXXX @@ -506,20 +515,16 @@ begin end; -function dplLess (a, b: TObject): Boolean; -var - pa, pb: TPanel; +class function TBinHeapPanelDrawCmp.less (const a, b: TPanel): Boolean; inline; begin - pa := TPanel(a); - pb := TPanel(b); - if (pa.tag < pb.tag) then begin result := true; exit; end; - if (pa.tag > pb.tag) then begin result := false; exit; end; - result := (pa.arrIdx < pb.arrIdx); + if (a.tag < b.tag) then begin result := true; exit; end; + if (a.tag > b.tag) then begin result := false; exit; end; + result := (a.arrIdx < b.arrIdx); end; procedure dplClear (); begin - if (gDrawPanelList = nil) then gDrawPanelList := TBinaryHeapObj.Create(@dplLess) else gDrawPanelList.clear(); + if (gDrawPanelList = nil) then gDrawPanelList := TBinHeapPanelDraw.Create() else gDrawPanelList.clear(); end; @@ -1609,7 +1614,7 @@ type actPanel: TDynRecord; end; var - WAD: TWADFile; + WAD, TestWAD: TWADFile; //mapReader: TDynRecord = nil; mapTextureList: TDynField = nil; //TTexturesRec1Array; tagInt: texture index panels: TDynField = nil; //TPanelsRec1Array; @@ -1638,6 +1643,8 @@ var begin mapGrid.Free(); mapGrid := nil; + TestWAD := nil; + Data := nil; //gCurrentMap.Free(); //gCurrentMap := nil; @@ -1666,13 +1673,41 @@ begin Exit; end; - //k8: why loader ignores path here? - mapResName := g_ExtractFileName(Res); - if not WAD.GetMapResource(mapResName, Data, Len) then + if gTestMap <> '' then begin - g_FatalError(Format(_lc[I_GAME_ERROR_MAP_RES], [mapResName])); - WAD.Free(); - Exit; + s := g_ExtractWadName(gTestMap); + TestWAD := TWADFile.Create(); + if not TestWAD.ReadFile(s) then + begin + g_SimpleError(Format(_lc[I_GAME_ERROR_MAP_WAD], [s])); + TestWAD.Free(); + TestWAD := nil; + end; + end; + + if TestWAD <> nil then + begin + mapResName := g_ExtractFileName(gTestMap); + if not TestWAD.GetMapResource(mapResName, Data, Len) then + begin + g_SimpleError(Format(_lc[I_GAME_ERROR_MAP_RES], [mapResName])); + Data := nil; + end else + e_WriteLog('Using test map: '+gTestMap, TMsgType.Notify); + TestWAD.Free(); + TestWAD := nil; + end; + + if Data = nil then + begin + //k8: why loader ignores path here? + mapResName := g_ExtractFileName(Res); + if not WAD.GetMapResource(mapResName, Data, Len) then + begin + g_FatalError(Format(_lc[I_GAME_ERROR_MAP_RES], [mapResName])); + WAD.Free(); + Exit; + end; end; WAD.Free();