From: Ketmar Dark Date: Fri, 8 Apr 2016 03:21:19 +0000 (+0300) Subject: proper (i hope) support for '.wad', '.pk3' and '.zip' extensions X-Git-Url: http://deadsoftware.ru/gitweb?p=d2df-sdl.git;a=commitdiff_plain;h=1fb71d901f9824644dc7cc750da7b6507cca3486 proper (i hope) support for '.wad', '.pk3' and '.zip' extensions --- diff --git a/src/game/Doom2DF.dpr b/src/game/Doom2DF.dpr index e72de94..57f516d 100644 --- a/src/game/Doom2DF.dpr +++ b/src/game/Doom2DF.dpr @@ -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', diff --git a/src/game/g_game.pas b/src/game/g_game.pas index 9cca04c..40760c6 100644 --- a/src/game/g_game.pas +++ b/src/game/g_game.pas @@ -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'); diff --git a/src/game/g_map.pas b/src/game/g_map.pas index 358b16d..84ebb95 100644 --- a/src/game/g_map.pas +++ b/src/game/g_map.pas @@ -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 index 0000000..76edd1f --- /dev/null +++ b/src/shared/utils.pas @@ -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.