DEADSOFTWARE

Map: Add test map override feature
[d2df-sdl.git] / src / game / g_map.pas
index 0dc5090c2f123848164d467cdcdf56745d736529..f6921131b3be776cfa1b30f8d248b8fc5593e760 100644 (file)
@@ -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<TPanel, TBinHeapPanelDrawCmp>;
+
 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();