DEADSOFTWARE

sfs, wadreader: much better searching for files inside archives with extra dirs in...
[d2df-sdl.git] / src / game / g_map.pas
index de8bc5baae5f0f60e350bc020db24bc15859eb2e..2c611442025585a94d1c42d998ff5c900c6d2f6d 100644 (file)
@@ -1,10 +1,11 @@
+{$MODE DELPHI}
 unit g_map;
 
 interface
 
 uses
   e_graphics, g_basic, MAPSTRUCT, g_textures, Classes,
-  g_phys, WADEDITOR, BinEditor, g_panel, md5;
+  g_phys, wadreader, BinEditor, g_panel, md5;
 
 type
   TMapInfo = record
@@ -363,11 +364,9 @@ end;
 
 function CreateTexture(RecName: String; Map: string; log: Boolean): Integer;
 var
-  WAD: TWADEditor_1;
+  WAD: TWADFile;
   TextureData: Pointer;
   WADName: String;
-  SectionName: String;
-  TextureName: String;
   a, ResLength: Integer;
 begin
   Result := -1;
@@ -408,9 +407,9 @@ begin
   end;
 
 // Çàãðóæàåì ðåñóðñ òåêñòóðû â ïàìÿòü èç WAD'à:
-  g_ProcessResourceStr(RecName, WADName, SectionName, TextureName);
+  WADName := g_ExtractWadName(RecName);
 
-  WAD := TWADEditor_1.Create();
+  WAD := TWADFile.Create();
 
   if WADName <> '' then
     WADName := GameDir+'/wads/'+WADName
@@ -419,10 +418,10 @@ begin
 
   WAD.ReadFile(WADName);
 
-  if WAD.GetResource(SectionName, TextureName, TextureData, ResLength) then
+  if WAD.GetResource(g_ExtractFilePathName(RecName), TextureData, ResLength) then
     begin
       SetLength(Textures, Length(Textures)+1);
-      if not e_CreateTextureMem(TextureData, Textures[High(Textures)].TextureID) then
+      if not e_CreateTextureMem(TextureData, ResLength, Textures[High(Textures)].TextureID) then
         Exit;
       e_GetTextureSize(Textures[High(Textures)].TextureID,
                        @Textures[High(Textures)].Width,
@@ -445,14 +444,12 @@ end;
 
 function CreateAnimTexture(RecName: String; Map: string; log: Boolean): Integer;
 var
-  WAD: TWADEditor_1;
+  WAD: TWADFile;
   TextureWAD: Pointer;
   TextData: Pointer;
   TextureData: Pointer;
   cfg: TConfig;
   WADName: String;
-  SectionName: String;
-  TextureName: String;
   ResLength: Integer;
   TextureResource: String;
   _width, _height, _framecount, _speed: Integer;
@@ -461,9 +458,9 @@ begin
   Result := -1;
 
 // ×èòàåì WAD-ðåñóðñ àíèì.òåêñòóðû èç WAD'à â ïàìÿòü:
-  g_ProcessResourceStr(RecName, WADName, SectionName, TextureName);
+  WADName := g_ExtractWadName(RecName);
 
-  WAD := TWADEditor_1.Create();
+  WAD := TWADFile.Create();
 
   if WADName <> '' then
     WADName := GameDir+'/wads/'+WADName
@@ -472,7 +469,7 @@ begin
 
   WAD.ReadFile(WADName);
 
-  if not WAD.GetResource(SectionName, TextureName, TextureWAD, ResLength) then
+  if not WAD.GetResource(g_ExtractFilePathName(RecName), TextureWAD, ResLength) then
   begin
     if log then
     begin
@@ -493,7 +490,7 @@ begin
   end;
 
 // ×èòàåì INI-ðåñóðñ àíèì. òåêñòóðû è çàïîìèíàåì åãî óñòàíîâêè:
-  if not WAD.GetResource('TEXT', 'ANIM', TextData, ResLength) then
+  if not WAD.GetResource('TEXT/ANIM', TextData, ResLength) then
   begin
     FreeMem(TextureWAD);
     WAD.Free();
@@ -522,7 +519,7 @@ begin
   cfg.Free();
 
 // ×èòàåì ðåñóðñ òåêñòóð (êàäðîâ) àíèì. òåêñòóðû â ïàìÿòü:
-  if not WAD.GetResource('TEXTURES', TextureResource, TextureData, ResLength) then
+  if not WAD.GetResource('TEXTURES/'+TextureResource, TextureData, ResLength) then
   begin
     FreeMem(TextureWAD);
     FreeMem(TextData);
@@ -536,7 +533,7 @@ begin
   with Textures[High(Textures)] do
   begin
   // Ñîçäàåì êàäðû àíèì. òåêñòóðû èç ïàìÿòè:
-    if g_Frames_CreateMemory(@FramesID, '', TextureData,
+    if g_Frames_CreateMemory(@FramesID, '', TextureData, ResLength,
          _width, _height, _framecount, _backanimation) then
       begin
         TextureName := RecName;
@@ -755,7 +752,7 @@ const
   DefaultMusRes = 'Standart.wad:STDMUS\MUS1';
   DefaultSkyRes = 'Standart.wad:STDSKY\SKY0';
 var
-  WAD: TWADEditor_1;
+  WAD: TWADFile;
   MapReader: TMapReader_1;
   Header: TMapHeaderRec_1;
   _textures: TTexturesRec1Array;
@@ -775,8 +772,7 @@ var
                            DoorPanel: Integer;
                            ShotPanel: Integer;
                           end;
-  FileName, SectionName, ResName,
-  FileName2, s, TexName: String;
+  FileName, mapResName, s, TexName: String;
   Data: Pointer;
   Len: Integer;
   ok, isAnim, trigRef: Boolean;
@@ -790,27 +786,29 @@ begin
   sfsGCDisable(); // temporary disable removing of temporary volumes
   try
   // Çàãðóçêà WAD:
-    g_ProcessResourceStr(Res, FileName, SectionName, ResName);
-    e_WriteLog('Loading map WAD: ' + FileName, MSG_NOTIFY);
+    FileName := g_ExtractWadName(Res);
+    e_WriteLog('Loading map WAD: '+FileName, MSG_NOTIFY);
     g_Game_SetLoadingText(_lc[I_LOAD_WAD_FILE], 0, False);
 
-    WAD := TWADEditor_1.Create();
+    WAD := TWADFile.Create();
     if not WAD.ReadFile(FileName) then
     begin
       g_FatalError(Format(_lc[I_GAME_ERROR_MAP_WAD], [FileName]));
       WAD.Free();
       Exit;
     end;
-    if not WAD.GetResource('', ResName, Data, Len) then
+    //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], [ResName]));
+      g_FatalError(Format(_lc[I_GAME_ERROR_MAP_RES], [mapResName]));
       WAD.Free();
       Exit;
     end;
     WAD.Free();
 
   // Çàãðóçêà êàðòû:
-    e_WriteLog('Loading map: ' + ResName, MSG_NOTIFY);
+    e_WriteLog('Loading map: '+mapResName, MSG_NOTIFY);
     g_Game_SetLoadingText(_lc[I_LOAD_MAP], 0, False);
     MapReader := TMapReader_1.Create();
 
@@ -1172,17 +1170,16 @@ begin
     begin
       e_WriteLog('  Loading sky: ' + gMapInfo.SkyName, MSG_NOTIFY);
       g_Game_SetLoadingText(_lc[I_LOAD_SKY], 0, False);
-      g_ProcessResourceStr(gMapInfo.SkyName, FileName, SectionName, ResName);
+      FileName := g_ExtractWadName(gMapInfo.SkyName);
 
       if FileName <> '' then
         FileName := GameDir+'/wads/'+FileName
       else
         begin
-          g_ProcessResourceStr(Res, @FileName2, nil, nil);
-          FileName := FileName2;
+          FileName := g_ExtractWadName(Res);
         end;
 
-      s := FileName+':'+SectionName+'/'+ResName;
+      s := FileName+':'+g_ExtractFilePathName(gMapInfo.SkyName);
       if g_Texture_CreateWAD(BackID, s) then
         begin
           g_Game_SetupScreenSize();
@@ -1197,17 +1194,16 @@ begin
     begin
       e_WriteLog('  Loading music: ' + gMapInfo.MusicName, MSG_NOTIFY);
       g_Game_SetLoadingText(_lc[I_LOAD_MUSIC], 0, False);
-      g_ProcessResourceStr(gMapInfo.MusicName, FileName, SectionName, ResName);
+      FileName := g_ExtractWadName(gMapInfo.MusicName);
 
       if FileName <> '' then
         FileName := GameDir+'/wads/'+FileName
       else
         begin
-          g_ProcessResourceStr(Res, @FileName2, nil, nil);
-          FileName := FileName2;
+          FileName := g_ExtractWadName(Res);
         end;
 
-      s := FileName+':'+SectionName+'/'+ResName;
+      s := FileName+':'+g_ExtractFilePathName(gMapInfo.MusicName);
       if g_Sound_CreateWADEx(gMapInfo.MusicName, s, True) then
         ok := True
       else
@@ -1253,24 +1249,25 @@ end;
 
 function g_Map_GetMapInfo(Res: String): TMapInfo;
 var
-  WAD: TWADEditor_1;
+  WAD: TWADFile;
   MapReader: TMapReader_1;
   Header: TMapHeaderRec_1;
-  FileName, SectionName, ResName: String;
+  FileName: String;
   Data: Pointer;
   Len: Integer;
 begin
   FillChar(Result, SizeOf(Result), 0);
-  g_ProcessResourceStr(Res, FileName, SectionName, ResName);
+  FileName := g_ExtractWadName(Res);
 
-  WAD := TWADEditor_1.Create();
+  WAD := TWADFile.Create();
   if not WAD.ReadFile(FileName) then
   begin
     WAD.Free();
     Exit;
   end;
 
-  if not WAD.GetResource('', ResName, Data, Len) then
+  //k8: it ignores path again
+  if not WAD.GetMapResource(g_ExtractFileName(Res), Data, Len) then
   begin
     WAD.Free();
     Exit;
@@ -1305,68 +1302,53 @@ end;
 
 function g_Map_GetMapsList(WADName: string): SArray;
 var
-  WAD: TWADEditor_1;
+  WAD: TWADFile;
   a: Integer;
   ResList: SArray;
-  Data: Pointer;
-  Len: Integer;
-  Sign: Array [0..2] of Char;
 begin
   Result := nil;
-
-  WAD := TWADEditor_1.Create();
+  WAD := TWADFile.Create();
   if not WAD.ReadFile(WADName) then
   begin
     WAD.Free();
     Exit;
   end;
-
-  ResList := WAD.GetResourcesList('');
-
+  ResList := WAD.GetMapResources();
   if ResList <> nil then
+  begin
     for a := 0 to High(ResList) do
     begin
-      if not WAD.GetResource('', ResList[a], Data, Len) then Continue;
-      CopyMemory(@Sign[0], Data, 3);
-      FreeMem(Data);
-
-      if Sign = MAP_SIGNATURE then
-      begin
-        SetLength(Result, Length(Result)+1);
-        Result[High(Result)] := ResList[a];
-      end;
-
-      Sign := '';
+      SetLength(Result, Length(Result)+1);
+      Result[High(Result)] := ResList[a];
     end;
-
+  end;
   WAD.Free();
 end;
 
 function g_Map_Exist(Res: string): Boolean;
 var
-  WAD: TWADEditor_1;
-  FileName, SectionName, ResName: string;
+  WAD: TWADFile;
+  FileName, mnn: string;
   ResList: SArray;
   a: Integer;
 begin
   Result := False;
 
-  g_ProcessResourceStr(Res, FileName, SectionName, ResName);
-
-  FileName := addWadExtension(FileName);
+  FileName := addWadExtension(g_ExtractWadName(Res));
 
-  WAD := TWADEditor_1.Create;
+  WAD := TWADFile.Create;
   if not WAD.ReadFile(FileName) then
   begin
     WAD.Free();
     Exit;
   end;
 
-  ResList := WAD.GetResourcesList('');
+  ResList := WAD.GetMapResources();
   WAD.Free();
 
+  mnn := g_ExtractFileName(Res);
   if ResList <> nil then
-    for a := 0 to High(ResList) do if ResList[a] = ResName then
+    for a := 0 to High(ResList) do if StrEquCI1251(ResList[a], mnn) then
     begin
       Result := True;
       Exit;