From: Ketmar Dark Date: Sun, 20 Oct 2019 21:11:50 +0000 (+0300) Subject: game: better (somewhat) scanning for player models X-Git-Url: http://deadsoftware.ru/gitweb?a=commitdiff_plain;h=4ee9edff7adfcf0f2cbd3cf32b1cb1790061fe14;p=d2df-sdl.git game: better (somewhat) scanning for player models --- diff --git a/src/engine/e_res.pas b/src/engine/e_res.pas index db32879..e5d4756 100644 --- a/src/engine/e_res.pas +++ b/src/engine/e_res.pas @@ -52,7 +52,7 @@ interface function e_GetResourcePath (dirs: SSArray; path: AnsiString; defWad: AnsiString): AnsiString; {--- same as SysUtils.FinFirst ---} - function e_FindFirst (dirs: SSArray; name: AnsiString; attr: LongInt; out Rslt: TRawbyteSearchRec): LongInt; + function e_FindFirst (dirs: SSArray; name: AnsiString; attr: LongInt; out Rslt: TSearchRec): LongInt; {--- try to create directory from list, throws if no one directory created ---} function e_GetDir (dirs: SSArray): AnsiString; @@ -226,7 +226,7 @@ implementation e_LogWritefln(' this>>> %s', [result]); end; - function e_FindFirst (dirs: SSArray; name: AnsiString; attr: LongInt; out Rslt: TRawbyteSearchRec): LongInt; + function e_FindFirst (dirs: SSArray; name: AnsiString; attr: LongInt; out Rslt: TSearchRec): LongInt; var i: Integer; dir: AnsiString; begin if debug_e_res then @@ -240,7 +240,7 @@ implementation result := FindFirst(dir, attr, Rslt); if debug_e_res then e_LogWritefln(' %s: %s -- %s', [i, dir, result]); - Dec(i); + Dec(i); end end; diff --git a/src/game/g_game.pas b/src/game/g_game.pas index 0505dce..4fd6057 100644 --- a/src/game/g_game.pas +++ b/src/game/g_game.pas @@ -1273,6 +1273,10 @@ end; procedure g_Game_Init(); var SR: TSearchRec; + knownFiles: array of AnsiString = nil; + found: Boolean; + wext, s: AnsiString; + f: Integer; begin gExit := 0; gMapToDelete := ''; @@ -1302,26 +1306,42 @@ begin g_Game_SetLoadingText(_lc[I_LOAD_MODELS], 0, False); g_PlayerModel_LoadData(); - if e_FindFirst(ModelDirs, '*.wad', faAnyFile, SR) = 0 then - repeat - if not g_PlayerModel_Load(e_FindWad(ModelDirs, SR.Name)) then - e_WriteLog(Format('Error loading model %s', [SR.Name]), TMsgType.Warning); - until FindNext(SR) <> 0; - FindClose(SR); - - if e_FindFirst(ModelDirs, '*.pk3', faAnyFile, SR) = 0 then - repeat - if not g_PlayerModel_Load(e_FindWad(ModelDirs, SR.Name)) then - e_WriteLog(Format('Error loading model %s', [SR.Name]), TMsgType.Warning); - until FindNext(SR) <> 0; - FindClose(SR); - - if e_FindFirst(ModelDirs, '*.zip', faAnyFile, SR) = 0 then - repeat - if not g_PlayerModel_Load(e_FindWad(ModelDirs, SR.Name)) then - e_WriteLog(Format('Error loading model %s', [SR.Name]), TMsgType.Warning); - until FindNext(SR) <> 0; - FindClose(SR); + // load models from all possible wad types, in all known directories + // this does a loosy job (linear search, ooph!), but meh + for wext in wadExtensions do + begin + for f := High(ModelDirs) downto Low(ModelDirs) do + begin + if (FindFirst(ModelDirs[f]+DirectorySeparator+'*'+wext, faAnyFile, SR) = 0) then + begin + repeat + found := false; + for s in knownFiles do + begin + if (strEquCI1251(forceFilenameExt(SR.Name, ''), forceFilenameExt(ExtractFileName(s), ''))) then + begin + found := true; + break; + end; + end; + if not found then + begin + SetLength(knownFiles, length(knownFiles)+1); + knownFiles[High(knownFiles)] := ModelDirs[f]+DirectorySeparator+SR.Name; + end; + until (FindNext(SR) <> 0); + end; + FindClose(SR); + end; + end; + + if (length(knownFiles) = 0) then raise Exception.Create('no player models found!'); + + if (length(knownFiles) = 1) then e_LogWriteln('1 player model found.', TMsgType.Notify) else e_LogWritefln('%d player models found.', [Integer(length(knownFiles))], TMsgType.Notify); + for s in knownFiles do + begin + if not g_PlayerModel_Load(s) then e_LogWritefln('Error loading model "%s"', [s], TMsgType.Warning); + end; gGameOn := false; gPauseMain := false; diff --git a/src/game/g_playermodel.pas b/src/game/g_playermodel.pas index 612644f..6ffea1f 100644 --- a/src/game/g_playermodel.pas +++ b/src/game/g_playermodel.pas @@ -397,7 +397,7 @@ var prefix: string; ok, chk: Boolean; begin - e_WriteLog(Format('Loading player model: %s', [ExtractFileName(FileName)]), TMsgType.Notify); + e_WriteLog(Format('Loading player model "%s"...', [FileName]), TMsgType.Notify); Result := False;