DEADSOFTWARE

proper (i hope) support for '.wad', '.pk3' and '.zip' extensions
authorKetmar Dark <ketmar@ketmar.no-ip.org>
Fri, 8 Apr 2016 03:21:19 +0000 (06:21 +0300)
committerKetmar Dark <ketmar@ketmar.no-ip.org>
Fri, 8 Apr 2016 03:22:13 +0000 (06:22 +0300)
src/game/Doom2DF.dpr
src/game/g_game.pas
src/game/g_map.pas
src/shared/utils.pas [new file with mode: 0644]

index e72de94e0ba79020a72ee529f7d9e1c84622dc2b..57f516d65c367b608fdc4144f855048467fd1182 100644 (file)
@@ -45,6 +45,7 @@ uses
   sfsZipFS in '../sfs/sfsZipFS.pas',
   sfsMemFS in '../sfs/sfsMemFS.pas',
   xstreams in '../sfs/xstreams.pas',
+  utils in '../shared/utils.pas',
   WADEDITOR in '../shared/WADEDITOR.pas',
   WADSTRUCT in '../shared/WADSTRUCT.pas',
   MAPSTRUCT in '../shared/MAPSTRUCT.pas',
index 9cca04c27ce31af3f73ea6daa86c801c7a33e004..40760c69eeb6c78d2ec0f81196bc8a1588c806d7 100644 (file)
@@ -294,7 +294,8 @@ uses
   g_playermodel, g_gfx, g_options, g_weapons, Math,
   g_triggers, MAPDEF, g_monsters, e_sound, CONFIG,
   BinEditor, g_language, g_net, SDL,
-  ENet, e_fixedbuffer, g_netmsg, g_netmaster, GL, GLExt;
+  ENet, e_fixedbuffer, g_netmsg, g_netmaster, GL, GLExt,
+  utils;
 
 type
   TEndCustomGameStat = record
@@ -1052,6 +1053,13 @@ begin
     until FindNext(SR) <> 0;
   FindClose(SR);
 
+  if FindFirst(ModelsDir+'*.zip', faAnyFile, SR) = 0 then
+    repeat
+      if not g_PlayerModel_Load(ModelsDir+SR.Name) then
+        e_WriteLog(Format('Error loading model %s', [SR.Name]), MSG_WARNING);
+    until FindNext(SR) <> 0;
+  FindClose(SR);
+
   gGameOn := False;
   gPause := False;
   gTime := 0;
@@ -5180,9 +5188,7 @@ begin
       Exit;
     end;
     // Èãðà åù¸ íå çàïóùåíà, ñíà÷àëà íàì íàäî çàãðóçèòü êàêîé-òî WAD
-    if (Pos('.wad', LowerCase(P[1])) = 0) and (Pos('.pk3', LowerCase(P[1])) = 0) then
-      P[1] := P[1] + '.wad';
-
+    P[1] := addWadExtension(P[1]);
     if FileExists(MapsDir + P[1]) then
     begin
       // Åñëè êàðòà íå óêàçàíà, áåð¸ì ïåðâóþ êàðòó â ôàéëå
@@ -5236,9 +5242,7 @@ begin
       Exit;
     prt := StrToIntDef(P[2], 25666);
 
-    if (Pos('.wad', LowerCase(P[3])) = 0) and (Pos('.pk3', LowerCase(P[3])) = 0) then
-      P[3] := P[3] + '.wad';
-
+    P[3] := addWadExtension(P[3]);
     if FileExists(MapsDir + P[3]) then
     begin
       // Åñëè êàðòà íå óêàçàíà, áåð¸ì ïåðâóþ êàðòó â ôàéëå
@@ -5308,9 +5312,7 @@ begin
           begin
             g_Console_Add(Format(_lc[I_MSG_NO_MAP], [s]));
             // Òàêîé êàðòû íåò, èùåì WAD ôàéë
-            if (Pos('.wad', LowerCase(P[1])) = 0) and (Pos('.pk3', LowerCase(P[1])) = 0) then
-              P[1] := P[1] + '.wad';
-
+            P[1] := addWadExtension(P[1]);
             if FileExists(MapsDir + P[1]) then
             begin
               // Ïàðàìåòðà êàðòû íåò, ïîýòîìó ñòàâèì ïåðâóþ èç ôàéëà
@@ -5340,9 +5342,7 @@ begin
         end else
         begin
           // Óêàçàíî äâà ïàðàìåòðà, çíà÷èò ïåðâûé - WAD ôàéë, à âòîðîé - êàðòà
-          if (Pos('.wad', LowerCase(P[1])) = 0) and (Pos('.pk3', LowerCase(P[1])) = 0) then
-            P[1] := P[1] + '.wad';
-
+          P[1] := addWadExtension(P[1]);
           if FileExists(MapsDir + P[1]) then
           begin
             // Íàøëè WAD ôàéë
@@ -5401,9 +5401,7 @@ begin
             begin
               g_Console_Add(Format(_lc[I_MSG_NO_MAP], [s]));
               // Òàêîé êàðòû íåò, èùåì WAD ôàéë
-              if (Pos('.wad', LowerCase(P[1])) = 0) and (Pos('.pk3', LowerCase(P[1])) = 0) then
-                P[1] := P[1] + '.wad';
-
+              P[1] := addWadExtension(P[1]);
               if FileExists(MapsDir + P[1]) then
               begin
                 // Ïàðàìåòðà êàðòû íåò, ïîýòîìó ñòàâèì ïåðâóþ èç ôàéëà
@@ -5428,9 +5426,7 @@ begin
           end else
           begin
             // Óêàçàíî äâà ïàðàìåòðà, çíà÷èò ïåðâûé - WAD ôàéë, à âòîðîé - êàðòà
-            if (Pos('.wad', LowerCase(P[1])) = 0) and (Pos('.pk3', LowerCase(P[1])) = 0) then
-              P[1] := P[1] + '.wad';
-
+            P[1] := addWadExtension(P[1]);
             if FileExists(MapsDir + P[1]) then
             begin
               // Íàøëè WAD ôàéë
@@ -6257,7 +6253,7 @@ begin
 
 // Start map when game loads:
   map := LowerCase(Find_Param_Value(pars, '-map'));
-  if (map <> '') and ((Pos('.wad:\', map) > 0) or (Pos('.pk3:\', map) > 0)) then
+  if isWadPath(map) then
   begin
   // Game mode:
     s := Find_Param_Value(pars, '-gm');
index 358b16d15e44d7ec97e9eb3e63c6af22871e29dc..84ebb9555b11ddee98d22ace33c0c02a025a5097 100644 (file)
@@ -116,7 +116,8 @@ uses
   g_main, e_log, SysUtils, g_items, g_gfx, g_console,
   GL, GLExt, g_weapons, g_game, g_sound, e_sound, CONFIG,
   g_options, MAPREADER, g_triggers, g_player, MAPDEF,
-  Math, g_monsters, g_saveload, g_language, g_netmsg;
+  Math, g_monsters, g_saveload, g_language, g_netmsg,
+  utils;
 
 const
   FLAGRECT: TRectWH = (X:15; Y:12; Width:33; Height:52);
@@ -1325,7 +1326,7 @@ begin
 
   g_ProcessResourceStr(Res, FileName, SectionName, ResName);
 
-  if (Pos('.wad', LowerCase(FileName)) = 0) and (Pos('.pk3', LowerCase(FileName)) = 0) then FileName := FileName+'.wad';
+  FileName := addWadExtension(FileName);
 
   WAD := TWADEditor_1.Create;
   if not WAD.ReadFile(FileName) then
diff --git a/src/shared/utils.pas b/src/shared/utils.pas
new file mode 100644 (file)
index 0000000..76edd1f
--- /dev/null
@@ -0,0 +1,60 @@
+{$MODE DELPHI}
+unit utils;
+
+interface
+
+// does filename have one of ".wad", ".pk3", ".zip" extensions?
+function hasWadExtension (fn: string): Boolean;
+
+// does filepath have ".XXX:\" in it?
+function isWadPath (fn: string): Boolean;
+
+// adds ".wad" extension if filename doesn't have one of ".wad", ".pk3", ".zip"
+function addWadExtension (fn: string): string;
+
+
+implementation
+
+uses
+  SysUtils, sfs;
+
+
+function hasWadExtension (fn: string): Boolean;
+begin
+  fn := ExtractFileExt(fn);
+  result := SFSStrEqu(fn, '.wad') or SFSStrEqu(fn, '.pk3') or SFSStrEqu(fn, '.zip');
+end;
+
+
+function addWadExtension (fn: string): string;
+begin
+  result := fn;
+  if not hasWadExtension(result) then result := result+'.wad';
+end;
+
+
+function isWadPath (fn: string): Boolean;
+var
+  p: Integer;
+  s: string;
+begin
+  result := false;
+  while true do
+  begin
+    p := Pos(':', fn);
+    if (p = 0) or (length(fn)-p < 1) then break;
+    if (p-4 > 1) and (fn[p-4] = '.') and ((fn[p+1] = '\') or (fn[p+1] = '/')) then
+    begin
+      s := Copy(fn, p-4, 4);
+      if SFSStrEqu(s, '.wad') or SFSStrEqu(s, '.pk3') or SFSStrEqu(s, '.zip') then
+      begin
+        result := true;
+        exit;
+      end;
+    end;
+    Delete(fn, 1, p);
+  end;
+end;
+
+
+end.