22using System . Collections . Generic ;
33using System . IO ;
44using System . Linq ;
5- using ReplayMod . Core ;
65using ReplayMod . Replay . Serialization ;
76using ReplayMod . Replay . UI ;
87using static UnityEngine . Mathf ;
8+ using Main = ReplayMod . Core . Main ;
99
1010namespace ReplayMod . Replay . Files ;
1111
@@ -50,7 +50,7 @@ public ReplayExplorer(string root)
5050
5151 public void Refresh ( )
5252 {
53- Enum . TryParse ( ( string ) Main . instance . ExplorerSorting . SavedValue , true , out SortingType sortingType ) ;
53+ Enum . TryParse ( ( string ) Main . instance . ExplorerSorting . Value , true , out SortingType sortingType ) ;
5454 currentReplayEntries = GetEntries ( sortingType ) ;
5555
5656 currentIndex = Clamp ( currentIndex , - 1 , currentReplayEntries . Count - 1 ) ;
@@ -71,12 +71,26 @@ public List<Entry> GetEntries(SortingType sorting = SortingType.Date)
7171
7272 var files = Directory
7373 . GetFiles ( CurrentFolderPath , "*.replay" )
74- . Select ( file => new Entry
74+ . Select ( file =>
7575 {
76- Name = Path . GetFileNameWithoutExtension ( file ) ,
77- FullPath = file ,
78- header = ReplayArchive . GetManifest ( file ) ,
79- IsFolder = false ,
76+ ReplaySerializer . ReplayHeader header ;
77+
78+ try
79+ {
80+ header = ReplayArchive . GetManifest ( file ) ;
81+ }
82+ catch
83+ {
84+ return null ;
85+ }
86+
87+ return new Entry
88+ {
89+ Name = Path . GetFileNameWithoutExtension ( file ) ,
90+ FullPath = file ,
91+ header = header ,
92+ IsFolder = false
93+ } ;
8094 } )
8195 . ToList ( ) ;
8296
@@ -102,26 +116,29 @@ public List<Entry> GetEntries(SortingType sorting = SortingType.Date)
102116
103117 private List < Entry > SortFiles ( List < Entry > files , SortingType sorting )
104118 {
105- if ( ( bool ) Main . instance . FavoritesFirst . SavedValue )
106- files = files . OrderByDescending ( f => f . header . isFavorited ) . ToList ( ) ;
119+ IOrderedEnumerable < Entry > query =
120+ ( bool ) Main . instance . FavoritesFirst . SavedValue
121+ ? files . OrderByDescending ( f => f . header ? . isFavorited ?? false )
122+ : files . OrderBy ( f => 0 ) ;
107123
108- var newFiles = sorting switch
124+ query = sorting switch
109125 {
110- SortingType . Name => files . OrderBy ( f => f . Name ) . ToList ( ) ,
111- SortingType . Date => files . OrderByDescending ( f => File . GetLastWriteTimeUtc ( f . FullPath ) ) . ToList ( ) ,
112- SortingType . Duration => files . OrderByDescending ( f => f . header . Duration ) . ToList ( ) ,
113- SortingType . Map => files . OrderBy ( f => ReplayFormatting . GetMapName ( header : f . header ) , StringComparer . OrdinalIgnoreCase ) . ToList ( ) ,
114- SortingType . PlayerCount => files . OrderByDescending ( f => f . header . Players ? . Length ) . ToList ( ) ,
115- SortingType . OpponentBP => files . OrderByDescending ( f => f . header . Players
126+ SortingType . Name => query . ThenBy ( f => f . Name ) ,
127+ SortingType . Date => query . ThenByDescending ( f => File . GetLastWriteTimeUtc ( f . FullPath ) ) ,
128+ SortingType . Duration => query . ThenByDescending ( f => f . header ? . Duration ?? 0 ) ,
129+ SortingType . Map => query . ThenBy ( f => ReplayFormatting . GetMapName ( header : f . header ) , StringComparer . OrdinalIgnoreCase ) ,
130+ SortingType . PlayerCount => query . ThenByDescending ( f => f . header ? . Players ? . Length ?? 0 ) ,
131+ SortingType . OpponentBP => query . ThenByDescending ( f => f . header ? . Players
116132 . Where ( p => ! p . IsLocal )
117133 . Select ( p => p . BattlePoints )
118- . DefaultIfEmpty ( 0 ) . Max ( )
119- ) . ToList ( ) ,
120-
121- _ => files
134+ . DefaultIfEmpty ( 0 )
135+ . Max ( ) ) ,
136+ _ => query
122137 } ;
123138
124- if ( ( bool ) Main . instance . SortingDirection . SavedValue )
139+ var newFiles = query . ToList ( ) ;
140+
141+ if ( ( bool ) Main . instance . SortingDirection . Value )
125142 newFiles . Reverse ( ) ;
126143
127144 return newFiles ;
0 commit comments