DEADSOFTWARE

Cosmetic: DooM 2D:Forever -> Doom 2D: Forever
[d2df-sdl.git] / src / game / g_map.pas
index 745f26166a931226c604f90871e2213d1291f288..8b41389dd9d0800aedae01db5b15718eb52cce86 100644 (file)
@@ -1,4 +1,4 @@
-(* Copyright (C)  DooM 2D:Forever Developers
+(* Copyright (C)  Doom 2D: Forever Developers
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -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;
 
 
@@ -869,7 +874,7 @@ end;
 function CreateNullTexture(RecName: String): Integer;
 begin
   RecName := toLowerCase1251(RecName);
-  if (TextNameHash = nil) then TextNameHash := hashNewStrInt();
+  if (TextNameHash = nil) then TextNameHash := THashStrInt.Create();
   if TextNameHash.get(RecName, result) then exit; // i found her!
 
   SetLength(Textures, Length(Textures)+1);
@@ -896,7 +901,7 @@ var
   a, ResLength: Integer;
 begin
   RecName := toLowerCase1251(RecName);
-  if (TextNameHash = nil) then TextNameHash := hashNewStrInt();
+  if (TextNameHash = nil) then TextNameHash := THashStrInt.Create();
   if TextNameHash.get(RecName, result) then
   begin
     // i found her!
@@ -984,7 +989,7 @@ begin
   else // Íåò òàêîãî ðåóñðñà â WAD'å
   begin
     //e_WriteLog(Format('SHIT! Error loading texture %s : %s', [RecName, g_ExtractFilePathName(RecName)]), MSG_WARNING);
-    if (BadTextNameHash = nil) then BadTextNameHash := hashNewStrInt();
+    if (BadTextNameHash = nil) then BadTextNameHash := THashStrInt.Create();
     if log and (not BadTextNameHash.get(RecName, a)) then
     begin
       e_WriteLog(Format('Error loading texture %s', [RecName]), TMsgType.Warning);
@@ -1014,7 +1019,7 @@ var
   f, c, frdelay, frloop: Integer;
 begin
   RecName := toLowerCase1251(RecName);
-  if (TextNameHash = nil) then TextNameHash := hashNewStrInt();
+  if (TextNameHash = nil) then TextNameHash := THashStrInt.Create();
   if TextNameHash.get(RecName, result) then
   begin
     // i found her!
@@ -1026,7 +1031,7 @@ begin
 
   //e_LogWritefln('*** Loading animated texture "%s"', [RecName]);
 
-  if (BadTextNameHash = nil) then BadTextNameHash := hashNewStrInt();
+  if (BadTextNameHash = nil) then BadTextNameHash := THashStrInt.Create();
   if BadTextNameHash.get(RecName, f) then
   begin
     //e_WriteLog(Format('no animation texture %s (don''t worry)', [RecName]), MSG_NOTIFY);
@@ -1044,7 +1049,7 @@ begin
 
     if not WAD.GetResource(g_ExtractFilePathName(RecName), TextureWAD, ResLength, log) then
     begin
-      if (BadTextNameHash = nil) then BadTextNameHash := hashNewStrInt();
+      if (BadTextNameHash = nil) then BadTextNameHash := THashStrInt.Create();
       if log and (not BadTextNameHash.get(RecName, f)) then
       begin
         e_WriteLog(Format('Error loading animation texture %s', [RecName]), TMsgType.Warning);
@@ -1138,7 +1143,7 @@ begin
         end
         else
         begin
-          if (BadTextNameHash = nil) then BadTextNameHash := hashNewStrInt();
+          if (BadTextNameHash = nil) then BadTextNameHash := THashStrInt.Create();
           if log and (not BadTextNameHash.get(RecName, f)) then
           begin
             e_WriteLog(Format('Error loading animation texture %s', [RecName]), TMsgType.Warning);
@@ -1230,7 +1235,7 @@ begin
       end
       else
       begin
-        if (BadTextNameHash = nil) then BadTextNameHash := hashNewStrInt();
+        if (BadTextNameHash = nil) then BadTextNameHash := THashStrInt.Create();
         if log  and (not BadTextNameHash.get(RecName, f)) then
         begin
           e_WriteLog(Format('Error loading animation texture "%s" images', [RecName]), TMsgType.Warning);
@@ -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();
@@ -1749,7 +1784,7 @@ begin
       g_Game_SetLoadingText(_lc[I_LOAD_TEXTURES], mapTextureList.count-1, False);
 
       // find used textures
-      usedTextures := hashNewStrInt();
+      usedTextures := THashStrInt.Create();
       try
         if (panels <> nil) and (panels.count > 0) then
         begin