OSDN Git Service

#27060 取り急ぎ、CapsLock=ONで、DTXファイルの検索をしないようにして、起動高速化。今後DTXファイル検索をバックグラウンドで実行するなどの対応を加える。
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / スコア、曲 / CSong管理.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Globalization;\r
4 using System.Text;\r
5 using System.Diagnostics;\r
6 using System.IO;\r
7 using System.Drawing;\r
8 using System.Runtime.Serialization.Formatters.Binary;\r
9 \r
10 namespace DTXMania\r
11 {\r
12         [Serializable]\r
13         internal class CSongs管理\r
14         {\r
15                 // プロパティ\r
16 \r
17                 public int nSongsDBから取得できたスコア数\r
18                 {\r
19                         get; \r
20                         set; \r
21                 }\r
22                 public int nSongsDBへ出力できたスコア数\r
23                 {\r
24                         get;\r
25                         set;\r
26                 }\r
27                 public int nスコアキャッシュから反映できたスコア数 \r
28                 {\r
29                         get;\r
30                         set; \r
31                 }\r
32                 public int nファイルから反映できたスコア数\r
33                 {\r
34                         get;\r
35                         set;\r
36                 }\r
37                 public int n検索されたスコア数 \r
38                 { \r
39                         get;\r
40                         set;\r
41                 }\r
42                 public int n検索された曲ノード数\r
43                 {\r
44                         get; \r
45                         set;\r
46                 }\r
47                 public List<Cスコア> listSongsDB;                                    // songs.dbから構築されるlist\r
48                 public List<C曲リストノード> list曲ルート;                   // 起動時にフォルダ検索して構築されるlist\r
49 \r
50 \r
51                 // コンストラクタ\r
52 \r
53                 public CSongs管理()\r
54                 {\r
55                         this.listSongsDB = new List<Cスコア>();\r
56                         this.list曲ルート = new List<C曲リストノード>();\r
57                         this.n検索された曲ノード数 = 0;\r
58                         this.n検索されたスコア数 = 0;\r
59                 }\r
60 \r
61 \r
62                 // メソッド\r
63 \r
64                 #region [ SongsDB(songs.db) を読み込む ]\r
65                 //-----------------\r
66                 public void tSongsDBを読み込む( string SongsDBファイル名 )\r
67                 {\r
68                         this.nSongsDBから取得できたスコア数 = 0;\r
69                         if( File.Exists( SongsDBファイル名 ) )\r
70                         {\r
71                                 BinaryReader br = null;\r
72                                 try\r
73                                 {\r
74                                         br = new BinaryReader( File.OpenRead( SongsDBファイル名 ) );\r
75                                         if ( !br.ReadString().Equals( SONGSDB_VERSION ) )\r
76                                         {\r
77                                                 throw new InvalidDataException( "ヘッダが異なります。" );\r
78                                         }\r
79                                         this.listSongsDB = new List<Cスコア>();\r
80 \r
81                                         while( true )\r
82                                         {\r
83                                                 try\r
84                                                 {\r
85                                                         Cスコア item = this.tSongsDBからスコアを1つ読み込む( br );\r
86                                                         this.listSongsDB.Add( item );\r
87                                                         this.nSongsDBから取得できたスコア数++;\r
88                                                 }\r
89                                                 catch( EndOfStreamException )\r
90                                                 {\r
91                                                         break;\r
92                                                 }\r
93                                         }\r
94                                 }\r
95                                 finally\r
96                                 {\r
97                                         if( br != null )\r
98                                                 br.Close();\r
99                                 }\r
100                         }\r
101                 }\r
102                 //-----------------\r
103                 #endregion\r
104                 #region [ 曲を検索してリストを作成する ]\r
105                 //-----------------\r
106                 public void t曲を検索してリストを作成する( string str基点フォルダ, bool b子BOXへ再帰する )\r
107                 {\r
108                         this.t曲を検索してリストを作成する( str基点フォルダ, b子BOXへ再帰する, this.list曲ルート, null );\r
109                 }\r
110                 private void t曲を検索してリストを作成する( string str基点フォルダ, bool b子BOXへ再帰する, List<C曲リストノード> listノードリスト, C曲リストノード node親 )\r
111                 {\r
112                         if( !str基点フォルダ.EndsWith( @"\" ) )\r
113                                 str基点フォルダ = str基点フォルダ + @"\";\r
114 \r
115                         DirectoryInfo info = new DirectoryInfo( str基点フォルダ );\r
116 \r
117                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
118                                 Trace.TraceInformation( "基点フォルダ: " + str基点フォルダ );\r
119 \r
120                         #region [ a.フォルダ内に set.def が存在する場合 → set.def からノード作成]\r
121                         //-----------------------------\r
122                         string path = str基点フォルダ + "set.def";\r
123                         if( File.Exists( path ) )\r
124                         {\r
125                                 CSetDef def = new CSetDef( path );\r
126                                 new FileInfo( path );\r
127                                 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
128                                 {\r
129                                         Trace.TraceInformation( "set.def検出 : {0}", new object[] { path } );\r
130                                         Trace.Indent();\r
131                                 }\r
132                                 try\r
133                                 {\r
134                                         for( int i = 0; i < def.blocks.Count; i++ )\r
135                                         {\r
136                                                 CSetDef.CBlock block = def.blocks[ i ];\r
137                                                 C曲リストノード item = new C曲リストノード();\r
138                                                 item.eノード種別 = C曲リストノード.Eノード種別.SCORE;\r
139                                                 item.strタイトル = block.Title;\r
140                                                 item.strジャンル = block.Genre;\r
141                                                 item.nスコア数 = 0;\r
142                                                 item.col文字色 = block.FontColor;\r
143                                                 item.SetDefのブロック番号 = i;\r
144                                                 item.pathSetDefの絶対パス = path;\r
145                                                 item.r親ノード = node親;\r
146                                                 for( int j = 0; j < 5; j++ )\r
147                                                 {\r
148                                                         if( !string.IsNullOrEmpty( block.File[ j ] ) )\r
149                                                         {\r
150                                                                 string str2 = str基点フォルダ + block.File[ j ];\r
151                                                                 if( File.Exists( str2 ) )\r
152                                                                 {\r
153                                                                         item.ar難易度ラベル[ j ] = block.Label[ j ];\r
154                                                                         item.arスコア[ j ] = new Cスコア();\r
155                                                                         item.arスコア[ j ].ファイル情報.ファイルの絶対パス = str2;\r
156                                                                         item.arスコア[ j ].ファイル情報.フォルダの絶対パス = Path.GetFullPath( Path.GetDirectoryName( str2 ) ) + @"\";\r
157                                                                         FileInfo info2 = new FileInfo( str2 );\r
158                                                                         item.arスコア[ j ].ファイル情報.ファイルサイズ = info2.Length;\r
159                                                                         item.arスコア[ j ].ファイル情報.最終更新日時 = info2.LastWriteTime;\r
160                                                                         string str3 = str2 + ".score.ini";\r
161                                                                         if( File.Exists( str3 ) )\r
162                                                                         {\r
163                                                                                 FileInfo info3 = new FileInfo( str3 );\r
164                                                                                 item.arスコア[ j ].ScoreIni情報.ファイルサイズ = info3.Length;\r
165                                                                                 item.arスコア[ j ].ScoreIni情報.最終更新日時 = info3.LastWriteTime;\r
166                                                                         }\r
167                                                                         item.nスコア数++;\r
168                                                                         this.n検索されたスコア数++;\r
169                                                                 }\r
170                                                                 else\r
171                                                                 {\r
172                                                                         item.arスコア[ j ] = null;\r
173                                                                 }\r
174                                                         }\r
175                                                 }\r
176                                                 if( item.nスコア数 > 0 )\r
177                                                 {\r
178                                                         listノードリスト.Add( item );\r
179                                                         this.n検索された曲ノード数++;\r
180                                                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
181                                                         {\r
182                                                                 StringBuilder builder = new StringBuilder( 0x200 );\r
183                                                                 builder.Append( string.Format( "nID#{0:D3}", item.nID ) );\r
184                                                                 if( item.r親ノード != null )\r
185                                                                 {\r
186                                                                         builder.Append( string.Format( "(in#{0:D3}):", item.r親ノード.nID ) );\r
187                                                                 }\r
188                                                                 else\r
189                                                                 {\r
190                                                                         builder.Append( "(onRoot):" );\r
191                                                                 }\r
192                                                                 if( ( item.strタイトル != null ) && ( item.strタイトル.Length > 0 ) )\r
193                                                                 {\r
194                                                                         builder.Append( " SONG, Title=" + item.strタイトル );\r
195                                                                 }\r
196                                                                 if( ( item.strジャンル != null ) && ( item.strジャンル.Length > 0 ) )\r
197                                                                 {\r
198                                                                         builder.Append( ", Genre=" + item.strジャンル );\r
199                                                                 }\r
200                                                                 if( item.col文字色 != Color.White )\r
201                                                                 {\r
202                                                                         builder.Append( ", FontColor=" + item.col文字色 );\r
203                                                                 }\r
204                                                                 Trace.TraceInformation( builder.ToString() );\r
205                                                                 Trace.Indent();\r
206                                                                 try\r
207                                                                 {\r
208                                                                         for( int k = 0; k < 5; k++ )\r
209                                                                         {\r
210                                                                                 if( item.arスコア[ k ] != null )\r
211                                                                                 {\r
212                                                                                         Cスコア cスコア = item.arスコア[ k ];\r
213                                                                                         builder.Remove( 0, builder.Length );\r
214                                                                                         builder.Append( string.Format( "ブロック{0}-{1}:", item.SetDefのブロック番号 + 1, k + 1 ) );\r
215                                                                                         builder.Append( " Label=" + item.ar難易度ラベル[ k ] );\r
216                                                                                         builder.Append( ", File=" + cスコア.ファイル情報.ファイルの絶対パス );\r
217                                                                                         builder.Append( ", Size=" + cスコア.ファイル情報.ファイルサイズ );\r
218                                                                                         builder.Append( ", LastUpdate=" + cスコア.ファイル情報.最終更新日時 );\r
219                                                                                         Trace.TraceInformation( builder.ToString() );\r
220                                                                                 }\r
221                                                                         }\r
222                                                                 }\r
223                                                                 finally\r
224                                                                 {\r
225                                                                         Trace.Unindent();\r
226                                                                 }\r
227                                                         }\r
228                                                 }\r
229                                         }\r
230                                 }\r
231                                 finally\r
232                                 {\r
233                                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
234                                         {\r
235                                                 Trace.Unindent();\r
236                                         }\r
237                                 }\r
238                         }\r
239                         //-----------------------------\r
240                         #endregion\r
241 \r
242                         #region [ b.フォルダ内に set.def が存在しない場合 → 個別ファイルからノード作成 ]\r
243                         //-----------------------------\r
244                         else\r
245                         {\r
246                                 foreach( FileInfo info4 in info.GetFiles() )\r
247                                 {\r
248                                         string str4 = info4.Extension.ToLower();\r
249                                         if( ( str4.Equals( ".dtx" ) || str4.Equals( ".gda" ) ) || ( ( str4.Equals( ".g2d" ) || str4.Equals( ".bms" ) ) || str4.Equals( ".bme" ) ) )\r
250                                         {\r
251                                                 C曲リストノード c曲リストノード2 = new C曲リストノード();\r
252                                                 c曲リストノード2.eノード種別 = C曲リストノード.Eノード種別.SCORE;\r
253                                                 c曲リストノード2.nスコア数 = 1;\r
254                                                 c曲リストノード2.r親ノード = node親;\r
255                                                 c曲リストノード2.arスコア[ 0 ] = new Cスコア();\r
256                                                 c曲リストノード2.arスコア[ 0 ].ファイル情報.ファイルの絶対パス = str基点フォルダ + info4.Name;\r
257                                                 c曲リストノード2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス = str基点フォルダ;\r
258                                                 c曲リストノード2.arスコア[ 0 ].ファイル情報.ファイルサイズ = info4.Length;\r
259                                                 c曲リストノード2.arスコア[ 0 ].ファイル情報.最終更新日時 = info4.LastWriteTime;\r
260                                                 string str5 = c曲リストノード2.arスコア[ 0 ].ファイル情報.ファイルの絶対パス + ".score.ini";\r
261                                                 if( File.Exists( str5 ) )\r
262                                                 {\r
263                                                         FileInfo info5 = new FileInfo( str5 );\r
264                                                         c曲リストノード2.arスコア[ 0 ].ScoreIni情報.ファイルサイズ = info5.Length;\r
265                                                         c曲リストノード2.arスコア[ 0 ].ScoreIni情報.最終更新日時 = info5.LastWriteTime;\r
266                                                 }\r
267                                                 this.n検索されたスコア数++;\r
268                                                 listノードリスト.Add( c曲リストノード2 );\r
269                                                 this.n検索された曲ノード数++;\r
270                                                 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
271                                                 {\r
272                                                         Trace.Indent();\r
273                                                         try\r
274                                                         {\r
275                                                                 StringBuilder builder2 = new StringBuilder( 0x100 );\r
276                                                                 builder2.Append( string.Format( "nID#{0:D3}", c曲リストノード2.nID ) );\r
277                                                                 if( c曲リストノード2.r親ノード != null )\r
278                                                                 {\r
279                                                                         builder2.Append( string.Format( "(in#{0:D3}):", c曲リストノード2.r親ノード.nID ) );\r
280                                                                 }\r
281                                                                 else\r
282                                                                 {\r
283                                                                         builder2.Append( "(onRoot):" );\r
284                                                                 }\r
285                                                                 builder2.Append( " SONG, File=" + c曲リストノード2.arスコア[ 0 ].ファイル情報.ファイルの絶対パス );\r
286                                                                 builder2.Append( ", Size=" + c曲リストノード2.arスコア[ 0 ].ファイル情報.ファイルサイズ );\r
287                                                                 builder2.Append( ", LastUpdate=" + c曲リストノード2.arスコア[ 0 ].ファイル情報.最終更新日時 );\r
288                                                                 Trace.TraceInformation( builder2.ToString() );\r
289                                                         }\r
290                                                         finally\r
291                                                         {\r
292                                                                 Trace.Unindent();\r
293                                                         }\r
294                                                 }\r
295                                         }\r
296                                         else if( !str4.Equals( ".mid" ) )\r
297                                         {\r
298                                                 str4.Equals( ".smf" );\r
299                                         }\r
300                                 }\r
301                         }\r
302                         //-----------------------------\r
303                         #endregion\r
304 \r
305                         foreach( DirectoryInfo info6 in info.GetDirectories() )\r
306                         {\r
307                                 #region [ a. "dtxfiles." で始まるフォルダの場合 ]\r
308                                 //-----------------------------\r
309                                 if( info6.Name.ToLower().StartsWith( "dtxfiles." ) )\r
310                                 {\r
311                                         C曲リストノード c曲リストノード3 = new C曲リストノード();\r
312                                         c曲リストノード3.eノード種別 = C曲リストノード.Eノード種別.BOX;\r
313                                         c曲リストノード3.bDTXFilesで始まるフォルダ名のBOXである = true;\r
314                                         c曲リストノード3.strタイトル = info6.Name.Substring( 9 );\r
315                                         c曲リストノード3.nスコア数 = 1;\r
316                                         c曲リストノード3.r親ノード = node親;\r
317                                         c曲リストノード3.list子リスト = new List<C曲リストノード>();\r
318                                         c曲リストノード3.arスコア[ 0 ] = new Cスコア();\r
319                                         c曲リストノード3.arスコア[ 0 ].ファイル情報.フォルダの絶対パス = info6.FullName + @"\";\r
320                                         c曲リストノード3.arスコア[ 0 ].譜面情報.タイトル = c曲リストノード3.strタイトル;\r
321                                         c曲リストノード3.arスコア[ 0 ].譜面情報.コメント =\r
322                                                 (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?\r
323                                                 "BOX に移動します。" :\r
324                                                 "Enter into the BOX.";\r
325                                         listノードリスト.Add(c曲リストノード3);\r
326                                         if( File.Exists( info6.FullName + @"\box.def" ) )\r
327                                         {\r
328                                                 CBoxDef def2 = new CBoxDef( info6.FullName + @"\box.def" );\r
329                                                 if( ( def2.Title != null ) && ( def2.Title.Length > 0 ) )\r
330                                                 {\r
331                                                         c曲リストノード3.strタイトル = def2.Title;\r
332                                                 }\r
333                                                 if( ( def2.Genre != null ) && ( def2.Genre.Length > 0 ) )\r
334                                                 {\r
335                                                         c曲リストノード3.strジャンル = def2.Genre;\r
336                                                 }\r
337                                                 if( def2.Color != Color.White )\r
338                                                 {\r
339                                                         c曲リストノード3.col文字色 = def2.Color;\r
340                                                 }\r
341                                                 if( ( def2.Artist != null ) && ( def2.Artist.Length > 0 ) )\r
342                                                 {\r
343                                                         c曲リストノード3.arスコア[ 0 ].譜面情報.アーティスト名 = def2.Artist;\r
344                                                 }\r
345                                                 if( ( def2.Comment != null ) && ( def2.Comment.Length > 0 ) )\r
346                                                 {\r
347                                                         c曲リストノード3.arスコア[ 0 ].譜面情報.コメント = def2.Comment;\r
348                                                 }\r
349                                                 if( ( def2.Preimage != null ) && ( def2.Preimage.Length > 0 ) )\r
350                                                 {\r
351                                                         c曲リストノード3.arスコア[ 0 ].譜面情報.Preimage = def2.Preimage;\r
352                                                 }\r
353                                                 if( ( def2.Premovie != null ) && ( def2.Premovie.Length > 0 ) )\r
354                                                 {\r
355                                                         c曲リストノード3.arスコア[ 0 ].譜面情報.Premovie = def2.Premovie;\r
356                                                 }\r
357                                                 if( ( def2.Presound != null ) && ( def2.Presound.Length > 0 ) )\r
358                                                 {\r
359                                                         c曲リストノード3.arスコア[ 0 ].譜面情報.Presound = def2.Presound;\r
360                                                 }\r
361                                                 if( def2.PerfectRange >= 0 )\r
362                                                 {\r
363                                                         c曲リストノード3.nPerfect範囲ms = def2.PerfectRange;\r
364                                                 }\r
365                                                 if( def2.GreatRange >= 0 )\r
366                                                 {\r
367                                                         c曲リストノード3.nGreat範囲ms = def2.GreatRange;\r
368                                                 }\r
369                                                 if( def2.GoodRange >= 0 )\r
370                                                 {\r
371                                                         c曲リストノード3.nGood範囲ms = def2.GoodRange;\r
372                                                 }\r
373                                                 if( def2.PoorRange >= 0 )\r
374                                                 {\r
375                                                         c曲リストノード3.nPoor範囲ms = def2.PoorRange;\r
376                                                 }\r
377                                         }\r
378                                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
379                                         {\r
380                                                 Trace.Indent();\r
381                                                 try\r
382                                                 {\r
383                                                         StringBuilder builder3 = new StringBuilder( 0x100 );\r
384                                                         builder3.Append( string.Format( "nID#{0:D3}", c曲リストノード3.nID ) );\r
385                                                         if( c曲リストノード3.r親ノード != null )\r
386                                                         {\r
387                                                                 builder3.Append( string.Format( "(in#{0:D3}):", c曲リストノード3.r親ノード.nID ) );\r
388                                                         }\r
389                                                         else\r
390                                                         {\r
391                                                                 builder3.Append( "(onRoot):" );\r
392                                                         }\r
393                                                         builder3.Append( " BOX, Title=" + c曲リストノード3.strタイトル );\r
394                                                         builder3.Append( ", Folder=" + c曲リストノード3.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );\r
395                                                         builder3.Append( ", Comment=" + c曲リストノード3.arスコア[ 0 ].譜面情報.コメント );\r
396                                                         Trace.TraceInformation( builder3.ToString() );\r
397                                                 }\r
398                                                 finally\r
399                                                 {\r
400                                                         Trace.Unindent();\r
401                                                 }\r
402                                         }\r
403                                         if( b子BOXへ再帰する )\r
404                                         {\r
405                                                 this.t曲を検索してリストを作成する( info6.FullName + @"\", b子BOXへ再帰する, c曲リストノード3.list子リスト, c曲リストノード3 );\r
406                                         }\r
407                                 }\r
408                                 //-----------------------------\r
409                                 #endregion\r
410 \r
411                                 #region [ b.box.def を含むフォルダの場合  ]\r
412                                 //-----------------------------\r
413                                 else if( File.Exists( info6.FullName + @"\box.def" ) )\r
414                                 {\r
415                                         CBoxDef def3 = new CBoxDef( info6.FullName + @"\box.def" );\r
416                                         C曲リストノード c曲リストノード4 = new C曲リストノード();\r
417                                         c曲リストノード4.eノード種別 = C曲リストノード.Eノード種別.BOX;\r
418                                         c曲リストノード4.bDTXFilesで始まるフォルダ名のBOXである = false;\r
419                                         c曲リストノード4.strタイトル = def3.Title;\r
420                                         c曲リストノード4.strジャンル = def3.Genre;\r
421                                         c曲リストノード4.col文字色 = def3.Color;\r
422                                         c曲リストノード4.nスコア数 = 1;\r
423                                         c曲リストノード4.arスコア[ 0 ] = new Cスコア();\r
424                                         c曲リストノード4.arスコア[ 0 ].ファイル情報.フォルダの絶対パス = info6.FullName + @"\";\r
425                                         c曲リストノード4.arスコア[ 0 ].譜面情報.タイトル = def3.Title;\r
426                                         c曲リストノード4.arスコア[ 0 ].譜面情報.ジャンル = def3.Genre;\r
427                                         c曲リストノード4.arスコア[ 0 ].譜面情報.アーティスト名 = def3.Artist;\r
428                                         c曲リストノード4.arスコア[ 0 ].譜面情報.コメント = def3.Comment;\r
429                                         c曲リストノード4.arスコア[ 0 ].譜面情報.Preimage = def3.Preimage;\r
430                                         c曲リストノード4.arスコア[ 0 ].譜面情報.Premovie = def3.Premovie;\r
431                                         c曲リストノード4.arスコア[ 0 ].譜面情報.Presound = def3.Presound;\r
432                                         c曲リストノード4.r親ノード = node親;\r
433                                         c曲リストノード4.list子リスト = new List<C曲リストノード>();\r
434                                         c曲リストノード4.nPerfect範囲ms = def3.PerfectRange;\r
435                                         c曲リストノード4.nGreat範囲ms = def3.GreatRange;\r
436                                         c曲リストノード4.nGood範囲ms = def3.GoodRange;\r
437                                         c曲リストノード4.nPoor範囲ms = def3.PoorRange;\r
438                                         listノードリスト.Add( c曲リストノード4 );\r
439                                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
440                                         {\r
441                                                 Trace.TraceInformation( "box.def検出 : {0}", new object[] { info6.FullName + @"\box.def" } );\r
442                                                 Trace.Indent();\r
443                                                 try\r
444                                                 {\r
445                                                         StringBuilder builder4 = new StringBuilder( 0x400 );\r
446                                                         builder4.Append( string.Format( "nID#{0:D3}", c曲リストノード4.nID ) );\r
447                                                         if( c曲リストノード4.r親ノード != null )\r
448                                                         {\r
449                                                                 builder4.Append( string.Format( "(in#{0:D3}):", c曲リストノード4.r親ノード.nID ) );\r
450                                                         }\r
451                                                         else\r
452                                                         {\r
453                                                                 builder4.Append( "(onRoot):" );\r
454                                                         }\r
455                                                         builder4.Append( "BOX, Title=" + c曲リストノード4.strタイトル );\r
456                                                         if( ( c曲リストノード4.strジャンル != null ) && ( c曲リストノード4.strジャンル.Length > 0 ) )\r
457                                                         {\r
458                                                                 builder4.Append( ", Genre=" + c曲リストノード4.strジャンル );\r
459                                                         }\r
460                                                         if( ( c曲リストノード4.arスコア[ 0 ].譜面情報.アーティスト名 != null ) && ( c曲リストノード4.arスコア[ 0 ].譜面情報.アーティスト名.Length > 0 ) )\r
461                                                         {\r
462                                                                 builder4.Append( ", Artist=" + c曲リストノード4.arスコア[ 0 ].譜面情報.アーティスト名 );\r
463                                                         }\r
464                                                         if( ( c曲リストノード4.arスコア[ 0 ].譜面情報.コメント != null ) && ( c曲リストノード4.arスコア[ 0 ].譜面情報.コメント.Length > 0 ) )\r
465                                                         {\r
466                                                                 builder4.Append( ", Comment=" + c曲リストノード4.arスコア[ 0 ].譜面情報.コメント );\r
467                                                         }\r
468                                                         if( ( c曲リストノード4.arスコア[ 0 ].譜面情報.Preimage != null ) && ( c曲リストノード4.arスコア[ 0 ].譜面情報.Preimage.Length > 0 ) )\r
469                                                         {\r
470                                                                 builder4.Append( ", Preimage=" + c曲リストノード4.arスコア[ 0 ].譜面情報.Preimage );\r
471                                                         }\r
472                                                         if( ( c曲リストノード4.arスコア[ 0 ].譜面情報.Premovie != null ) && ( c曲リストノード4.arスコア[ 0 ].譜面情報.Premovie.Length > 0 ) )\r
473                                                         {\r
474                                                                 builder4.Append( ", Premovie=" + c曲リストノード4.arスコア[ 0 ].譜面情報.Premovie );\r
475                                                         }\r
476                                                         if( ( c曲リストノード4.arスコア[ 0 ].譜面情報.Presound != null ) && ( c曲リストノード4.arスコア[ 0 ].譜面情報.Presound.Length > 0 ) )\r
477                                                         {\r
478                                                                 builder4.Append( ", Presound=" + c曲リストノード4.arスコア[ 0 ].譜面情報.Presound );\r
479                                                         }\r
480                                                         if( c曲リストノード4.col文字色 != ColorTranslator.FromHtml( "White" ) )\r
481                                                         {\r
482                                                                 builder4.Append( ", FontColor=" + c曲リストノード4.col文字色 );\r
483                                                         }\r
484                                                         if( c曲リストノード4.nPerfect範囲ms != -1 )\r
485                                                         {\r
486                                                                 builder4.Append( ", Perfect=" + c曲リストノード4.nPerfect範囲ms + "ms" );\r
487                                                         }\r
488                                                         if( c曲リストノード4.nGreat範囲ms != -1 )\r
489                                                         {\r
490                                                                 builder4.Append( ", Great=" + c曲リストノード4.nGreat範囲ms + "ms" );\r
491                                                         }\r
492                                                         if( c曲リストノード4.nGood範囲ms != -1 )\r
493                                                         {\r
494                                                                 builder4.Append( ", Good=" + c曲リストノード4.nGood範囲ms + "ms" );\r
495                                                         }\r
496                                                         if( c曲リストノード4.nPoor範囲ms != -1 )\r
497                                                         {\r
498                                                                 builder4.Append( ", Poor=" + c曲リストノード4.nPoor範囲ms + "ms" );\r
499                                                         }\r
500                                                         Trace.TraceInformation( builder4.ToString() );\r
501                                                 }\r
502                                                 finally\r
503                                                 {\r
504                                                         Trace.Unindent();\r
505                                                 }\r
506                                         }\r
507                                         if( b子BOXへ再帰する )\r
508                                         {\r
509                                                 this.t曲を検索してリストを作成する( info6.FullName + @"\", b子BOXへ再帰する, c曲リストノード4.list子リスト, c曲リストノード4 );\r
510                                         }\r
511                                 }\r
512                                 //-----------------------------\r
513                                 #endregion\r
514 \r
515                                 #region [ c.通常フォルダの場合 ]\r
516                                 //-----------------------------\r
517                                 else\r
518                                 {\r
519                                         this.t曲を検索してリストを作成する( info6.FullName + @"\", b子BOXへ再帰する, listノードリスト, node親 );\r
520                                 }\r
521                                 //-----------------------------\r
522                                 #endregion\r
523                         }\r
524                 }\r
525                 //-----------------\r
526                 #endregion\r
527                 #region [ スコアキャッシュを曲リストに反映する ]\r
528                 //-----------------\r
529                 public void tスコアキャッシュを曲リストに反映する()\r
530                 {\r
531                         this.nスコアキャッシュから反映できたスコア数 = 0;\r
532                         this.tスコアキャッシュを曲リストに反映する( this.list曲ルート );\r
533                 }\r
534                 private void tスコアキャッシュを曲リストに反映する( List<C曲リストノード> ノードリスト )\r
535                 {\r
536                         using( List<C曲リストノード>.Enumerator enumerator = ノードリスト.GetEnumerator() )\r
537                         {\r
538                                 while( enumerator.MoveNext() )\r
539                                 {\r
540                                         C曲リストノード node = enumerator.Current;\r
541                                         if( node.eノード種別 == C曲リストノード.Eノード種別.BOX )\r
542                                         {\r
543                                                 this.tスコアキャッシュを曲リストに反映する( node.list子リスト );\r
544                                         }\r
545                                         else if( ( node.eノード種別 == C曲リストノード.Eノード種別.SCORE ) || ( node.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) )\r
546                                         {\r
547                                                 Predicate<Cスコア> match = null;\r
548                                                 for( int lv = 0; lv < 5; lv++ )\r
549                                                 {\r
550                                                         if( node.arスコア[ lv ] != null )\r
551                                                         {\r
552                                                                 if( match == null )\r
553                                                                 {\r
554                                                                         match = delegate( Cスコア sc )\r
555                                                                         {\r
556                                                                                 return ( ( sc.ファイル情報.ファイルの絶対パス.Equals( node.arスコア[ lv ].ファイル情報.ファイルの絶対パス )\r
557                                                                                         && sc.ファイル情報.ファイルサイズ.Equals( node.arスコア[ lv ].ファイル情報.ファイルサイズ ) )\r
558                                                                                         && ( sc.ファイル情報.最終更新日時.Equals( node.arスコア[ lv ].ファイル情報.最終更新日時 )\r
559                                                                                         && sc.ScoreIni情報.ファイルサイズ.Equals( node.arスコア[ lv ].ScoreIni情報.ファイルサイズ ) ) )\r
560                                                                                         && sc.ScoreIni情報.最終更新日時.Equals( node.arスコア[ lv ].ScoreIni情報.最終更新日時 );\r
561                                                                         };\r
562                                                                 }\r
563                                                                 int num = this.listSongsDB.FindIndex( match );\r
564                                                                 if( num == -1 )\r
565                                                                 {\r
566                                                                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
567                                                                         {\r
568                                                                                 Trace.TraceInformation( "songs.db に存在しません。({0})", new object[] { node.arスコア[ lv ].ファイル情報.ファイルの絶対パス } );\r
569                                                                         }\r
570                                                                 }\r
571                                                                 else\r
572                                                                 {\r
573                                                                         node.arスコア[ lv ].譜面情報 = this.listSongsDB[ num ].譜面情報;\r
574                                                                         node.arスコア[ lv ].bSongDBにキャッシュがあった = true;\r
575                                                                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
576                                                                         {\r
577                                                                                 Trace.TraceInformation( "songs.db から転記しました。({0})", new object[] { node.arスコア[ lv ].ファイル情報.ファイルの絶対パス } );\r
578                                                                         }\r
579                                                                         this.nスコアキャッシュから反映できたスコア数++;\r
580                                                                         if( node.arスコア[ lv ].ScoreIni情報.最終更新日時 != this.listSongsDB[ num ].ScoreIni情報.最終更新日時 )\r
581                                                                         {\r
582                                                                                 string str = node.arスコア[ lv ].ファイル情報.ファイルの絶対パス + ".score.ini";\r
583                                                                                 try\r
584                                                                                 {\r
585                                                                                         CScoreIni ini = new CScoreIni( str );\r
586                                                                                         ini.t全演奏記録セクションの整合性をチェックし不整合があればリセットする();\r
587                                                                                         for( int i = 0; i < 3; i++ )\r
588                                                                                         {\r
589                                                                                                 int num3 = ( i * 2 ) + 1;\r
590                                                                                                 if( ( ini.stセクション[ num3 ].b演奏にMIDI入力を使用した || ini.stセクション[ num3 ].b演奏にキーボードを使用した ) || ( ini.stセクション[ num3 ].b演奏にジョイパッドを使用した || ini.stセクション[ num3 ].b演奏にマウスを使用した ) )\r
591                                                                                                 {\r
592                                                                                                         node.arスコア[ lv ].譜面情報.最大ランク[ i ] = \r
593                                                                                                                 (ini.stファイル.BestRank[i] != (int)CScoreIni.ERANK.UNKNOWN)?\r
594                                                                                                                 (int)ini.stファイル.BestRank[i] : CScoreIni.tランク値を計算して返す( ini.stセクション[ num3 ] );\r
595                                                                                                 }\r
596                                                                                                 else\r
597                                                                                                 {\r
598                                                                                                         node.arスコア[ lv ].譜面情報.最大ランク[ i ] = (int)CScoreIni.ERANK.UNKNOWN;\r
599                                                                                                 }\r
600                                                                                                 node.arスコア[ lv ].譜面情報.最大スキル[ i ] = ini.stセクション[ num3 ].db演奏型スキル値;\r
601                                                                                                 node.arスコア[ lv ].譜面情報.フルコンボ[ i ] = ini.stセクション[ num3 ].bフルコンボである;\r
602                                                                                         }\r
603                                                                                         node.arスコア[ lv ].譜面情報.演奏回数.Drums = ini.stファイル.PlayCountDrums;\r
604                                                                                         node.arスコア[ lv ].譜面情報.演奏回数.Guitar = ini.stファイル.PlayCountGuitar;\r
605                                                                                         node.arスコア[ lv ].譜面情報.演奏回数.Bass = ini.stファイル.PlayCountBass;\r
606                                                                                         for( int j = 0; j < 5; j++ )\r
607                                                                                         {\r
608                                                                                                 node.arスコア[ lv ].譜面情報.演奏履歴[ j ] = ini.stファイル.History[ j ];\r
609                                                                                         }\r
610                                                                                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
611                                                                                         {\r
612                                                                                                 Trace.TraceInformation( "演奏記録ファイルから HiSkill 情報と演奏履歴を取得しました。({0})", new object[] { str } );\r
613                                                                                         }\r
614                                                                                 }\r
615                                                                                 catch\r
616                                                                                 {\r
617                                                                                         Trace.TraceError( "演奏記録ファイルの読み込みに失敗しました。({0})", new object[] { str } );\r
618                                                                                 }\r
619                                                                         }\r
620                                                                 }\r
621                                                         }\r
622                                                 }\r
623                                         }\r
624                                 }\r
625                         }\r
626                 }\r
627                 private Cスコア tSongsDBからスコアを1つ読み込む( BinaryReader br )\r
628                 {\r
629                         Cスコア cスコア = new Cスコア();\r
630                         cスコア.ファイル情報.ファイルの絶対パス = br.ReadString();\r
631                         cスコア.ファイル情報.フォルダの絶対パス = br.ReadString();\r
632                         cスコア.ファイル情報.最終更新日時 = new DateTime( br.ReadInt64() );\r
633                         cスコア.ファイル情報.ファイルサイズ = br.ReadInt64();\r
634                         cスコア.ScoreIni情報.最終更新日時 = new DateTime( br.ReadInt64() );\r
635                         cスコア.ScoreIni情報.ファイルサイズ = br.ReadInt64();\r
636                         cスコア.譜面情報.タイトル = br.ReadString();\r
637                         cスコア.譜面情報.アーティスト名 = br.ReadString();\r
638                         cスコア.譜面情報.コメント = br.ReadString();\r
639                         cスコア.譜面情報.ジャンル = br.ReadString();\r
640                         cスコア.譜面情報.Preimage = br.ReadString();\r
641                         cスコア.譜面情報.Premovie = br.ReadString();\r
642                         cスコア.譜面情報.Presound = br.ReadString();\r
643                         cスコア.譜面情報.Backgound = br.ReadString();\r
644                         cスコア.譜面情報.レベル.Drums = br.ReadInt32();\r
645                         cスコア.譜面情報.レベル.Guitar = br.ReadInt32();\r
646                         cスコア.譜面情報.レベル.Bass = br.ReadInt32();\r
647                         cスコア.譜面情報.最大ランク.Drums = br.ReadInt32();\r
648                         cスコア.譜面情報.最大ランク.Guitar = br.ReadInt32();\r
649                         cスコア.譜面情報.最大ランク.Bass = br.ReadInt32();\r
650                         cスコア.譜面情報.最大スキル.Drums = br.ReadDouble();\r
651                         cスコア.譜面情報.最大スキル.Guitar = br.ReadDouble();\r
652                         cスコア.譜面情報.最大スキル.Bass = br.ReadDouble();\r
653                         cスコア.譜面情報.フルコンボ.Drums = br.ReadBoolean();\r
654                         cスコア.譜面情報.フルコンボ.Guitar = br.ReadBoolean();\r
655                         cスコア.譜面情報.フルコンボ.Bass = br.ReadBoolean();\r
656                         cスコア.譜面情報.演奏回数.Drums = br.ReadInt32();\r
657                         cスコア.譜面情報.演奏回数.Guitar = br.ReadInt32();\r
658                         cスコア.譜面情報.演奏回数.Bass = br.ReadInt32();\r
659                         cスコア.譜面情報.演奏履歴.行1 = br.ReadString();\r
660                         cスコア.譜面情報.演奏履歴.行2 = br.ReadString();\r
661                         cスコア.譜面情報.演奏履歴.行3 = br.ReadString();\r
662                         cスコア.譜面情報.演奏履歴.行4 = br.ReadString();\r
663                         cスコア.譜面情報.演奏履歴.行5 = br.ReadString();\r
664                         cスコア.譜面情報.レベルを非表示にする = br.ReadBoolean();\r
665                         cスコア.譜面情報.曲種別 = (CDTX.E種別) br.ReadInt32();\r
666 //                      cスコア.譜面情報.bpm = br.ReadDouble();\r
667                         return cスコア;\r
668                 }\r
669                 //-----------------\r
670                 #endregion\r
671                 #region [ SongsDBになかった曲をファイルから読み込んで反映する ]\r
672                 //-----------------\r
673                 public void tSongsDBになかった曲をファイルから読み込んで反映する()\r
674                 {\r
675                         this.nファイルから反映できたスコア数 = 0;\r
676                         this.tSongsDBになかった曲をファイルから読み込んで反映する( this.list曲ルート );\r
677                 }\r
678                 private void tSongsDBになかった曲をファイルから読み込んで反映する( List<C曲リストノード> ノードリスト )\r
679                 {\r
680                         foreach( C曲リストノード c曲リストノード in ノードリスト )\r
681                         {\r
682                                 if( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX )\r
683                                 {\r
684                                         this.tSongsDBになかった曲をファイルから読み込んで反映する( c曲リストノード.list子リスト );\r
685                                 }\r
686                                 else if( ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE ) || ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) )\r
687                                 {\r
688                                         for( int i = 0; i < 5; i++ )\r
689                                         {\r
690                                                 if( ( c曲リストノード.arスコア[ i ] != null ) && !c曲リストノード.arスコア[ i ].bSongDBにキャッシュがあった )\r
691                                                 {\r
692                                                         #region [ DTX ファイルのヘッダだけ読み込み、Cスコア.譜面情報 を設定する ]\r
693                                                         //-----------------\r
694                                                         string path = c曲リストノード.arスコア[ i ].ファイル情報.ファイルの絶対パス;\r
695                                                         if( File.Exists( path ) )\r
696                                                         {\r
697                                                                 try\r
698                                                                 {\r
699                                                                         CDTX cdtx = new CDTX( c曲リストノード.arスコア[ i ].ファイル情報.ファイルの絶対パス, true );\r
700                                                                         c曲リストノード.arスコア[ i ].譜面情報.タイトル = cdtx.TITLE;\r
701                                                                         c曲リストノード.arスコア[ i ].譜面情報.アーティスト名 = cdtx.ARTIST;\r
702                                                                         c曲リストノード.arスコア[ i ].譜面情報.コメント = cdtx.COMMENT;\r
703                                                                         c曲リストノード.arスコア[ i ].譜面情報.ジャンル = cdtx.GENRE;\r
704                                                                         c曲リストノード.arスコア[ i ].譜面情報.Preimage = cdtx.PREIMAGE;\r
705                                                                         c曲リストノード.arスコア[ i ].譜面情報.Premovie = cdtx.PREMOVIE;\r
706                                                                         c曲リストノード.arスコア[ i ].譜面情報.Presound = cdtx.PREVIEW;\r
707                                                                         c曲リストノード.arスコア[ i ].譜面情報.Backgound = ( ( cdtx.BACKGROUND != null ) && ( cdtx.BACKGROUND.Length > 0 ) ) ? cdtx.BACKGROUND : cdtx.BACKGROUND_GR;\r
708                                                                         c曲リストノード.arスコア[ i ].譜面情報.レベル.Drums = cdtx.LEVEL.Drums;\r
709                                                                         c曲リストノード.arスコア[ i ].譜面情報.レベル.Guitar = cdtx.LEVEL.Guitar;\r
710                                                                         c曲リストノード.arスコア[ i ].譜面情報.レベル.Bass = cdtx.LEVEL.Bass;\r
711                                                                         c曲リストノード.arスコア[ i ].譜面情報.レベルを非表示にする = cdtx.HIDDENLEVEL;\r
712                                                                         c曲リストノード.arスコア[ i ].譜面情報.曲種別 = cdtx.e種別;\r
713 //                                                                      c曲リストノード.arスコア[ i ].譜面情報.bpm = cdtx.BPM;\r
714                                                                         this.nファイルから反映できたスコア数++;\r
715                                                                         cdtx.On非活性化();\r
716 \r
717                                                                         #region [ 曲検索ログ出力 ]\r
718                                                                         //-----------------\r
719                                                                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
720                                                                         {\r
721                                                                                 StringBuilder builder = new StringBuilder( 0x400 );\r
722                                                                                 builder.Append( string.Format( "曲データファイルから譜面情報を転記しました。({0})", path ) );\r
723                                                                                 builder.Append( "(title=" + c曲リストノード.arスコア[ i ].譜面情報.タイトル );\r
724                                                                                 builder.Append( ", artist=" + c曲リストノード.arスコア[ i ].譜面情報.アーティスト名 );\r
725                                                                                 builder.Append( ", comment=" + c曲リストノード.arスコア[ i ].譜面情報.コメント );\r
726                                                                                 builder.Append( ", genre=" + c曲リストノード.arスコア[ i ].譜面情報.ジャンル );\r
727                                                                                 builder.Append( ", preimage=" + c曲リストノード.arスコア[ i ].譜面情報.Preimage );\r
728                                                                                 builder.Append( ", premovie=" + c曲リストノード.arスコア[ i ].譜面情報.Premovie );\r
729                                                                                 builder.Append( ", presound=" + c曲リストノード.arスコア[ i ].譜面情報.Presound );\r
730                                                                                 builder.Append( ", background=" + c曲リストノード.arスコア[ i ].譜面情報.Backgound );\r
731                                                                                 builder.Append( ", lvDr=" + c曲リストノード.arスコア[ i ].譜面情報.レベル.Drums );\r
732                                                                                 builder.Append( ", lvGt=" + c曲リストノード.arスコア[ i ].譜面情報.レベル.Guitar );\r
733                                                                                 builder.Append( ", lvBs=" + c曲リストノード.arスコア[ i ].譜面情報.レベル.Bass );\r
734                                                                                 builder.Append( ", lvHide=" + c曲リストノード.arスコア[ i ].譜面情報.レベルを非表示にする );\r
735                                                                                 builder.Append( ", type=" + c曲リストノード.arスコア[ i ].譜面情報.曲種別 );\r
736 //                                                                              builder.Append( ", bpm=" + c曲リストノード.arスコア[ i ].譜面情報.bpm );\r
737                                                                                 Trace.TraceInformation( builder.ToString() );\r
738                                                                         }\r
739                                                                         //-----------------\r
740                                                                         #endregion\r
741                                                                 }\r
742                                                                 catch( Exception exception )\r
743                                                                 {\r
744                                                                         Trace.TraceError( exception.Message );\r
745                                                                         c曲リストノード.arスコア[ i ] = null;\r
746                                                                         c曲リストノード.nスコア数--;\r
747                                                                         this.n検索されたスコア数--;\r
748                                                                         Trace.TraceError( "曲データファイルの読み込みに失敗しました。({0})", new object[] { path } );\r
749                                                                 }\r
750                                                         }\r
751                                                         //-----------------\r
752                                                         #endregion\r
753 \r
754                                                         #region [ 対応する .score.ini が存在していれば読み込み、Cスコア.譜面情報 に追加設定する ]\r
755                                                         //-----------------\r
756                                                         this.tScoreIniを読み込んで譜面情報を設定する( c曲リストノード.arスコア[ i ].ファイル情報.ファイルの絶対パス + ".score.ini", ref c曲リストノード.arスコア[ i ] );\r
757                                                         //-----------------\r
758                                                         #endregion\r
759                                                 }\r
760                                         }\r
761                                 }\r
762                         }\r
763                 }\r
764                 //-----------------\r
765                 #endregion\r
766                 #region [ 曲リストへ後処理を適用する ]\r
767                 //-----------------\r
768                 public void t曲リストへ後処理を適用する()\r
769                 {\r
770                         this.t曲リストへ後処理を適用する( this.list曲ルート );\r
771                 }\r
772                 private void t曲リストへ後処理を適用する( List<C曲リストノード> ノードリスト )\r
773                 {\r
774                         #region [ リストに1つ以上の曲があるなら RANDOM BOX を入れる ]\r
775                         //-----------------------------\r
776                         if( ノードリスト.Count > 0 )\r
777                         {\r
778                                 C曲リストノード item = new C曲リストノード();\r
779                                 item.eノード種別 = C曲リストノード.Eノード種別.RANDOM;\r
780                                 item.strタイトル = "< RANDOM SELECT >";\r
781                                 item.nスコア数 = 5;\r
782                                 item.r親ノード = ノードリスト[ 0 ].r親ノード;\r
783                                 for( int i = 0; i < 5; i++ )\r
784                                 {\r
785                                         item.arスコア[ i ] = new Cスコア();\r
786                                         item.arスコア[ i ].譜面情報.タイトル = string.Format( "< RANDOM SELECT Lv.{0} >", i + 1 );\r
787                                         item.arスコア[i].譜面情報.コメント =\r
788                                                  (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?\r
789                                                  string.Format("難易度レベル {0} 付近の曲をランダムに選択します。難易度レベルを持たない曲も選択候補となります。", i + 1) :\r
790                                                  string.Format("Random select from the songs which has the level about L{0}. Non-leveled songs may also selected.", i + 1);\r
791                                         item.ar難易度ラベル[ i ] = string.Format( "L{0}", i + 1 );\r
792                                 }\r
793                                 ノードリスト.Add( item );\r
794 \r
795                                 #region [ ログ出力 ]\r
796                                 //-----------------------------\r
797                                 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
798                                 {\r
799                                         StringBuilder builder = new StringBuilder( 0x100 );\r
800                                         builder.Append( string.Format( "nID#{0:D3}", item.nID ) );\r
801                                         if( item.r親ノード != null )\r
802                                         {\r
803                                                 builder.Append( string.Format( "(in#{0:D3}):", item.r親ノード.nID ) );\r
804                                         }\r
805                                         else\r
806                                         {\r
807                                                 builder.Append( "(onRoot):" );\r
808                                         }\r
809                                         builder.Append( " RANDOM" );\r
810                                         Trace.TraceInformation( builder.ToString() );\r
811                                 }\r
812                                 //-----------------------------\r
813                                 #endregion\r
814                         }\r
815                         //-----------------------------\r
816                         #endregion\r
817 \r
818                         // すべてのノードについて…\r
819                         foreach( C曲リストノード c曲リストノード2 in ノードリスト )\r
820                         {\r
821                                 #region [ BOXノードなら子リストに <<BACK を入れ、子リストに後処理を適用する ]\r
822                                 //-----------------------------\r
823                                 if( c曲リストノード2.eノード種別 == C曲リストノード.Eノード種別.BOX )\r
824                                 {\r
825                                         C曲リストノード c曲リストノード3 = new C曲リストノード();\r
826                                         c曲リストノード3.eノード種別 = C曲リストノード.Eノード種別.BACKBOX;\r
827                                         c曲リストノード3.strタイトル = "<< BACK";\r
828                                         c曲リストノード3.nスコア数 = 1;\r
829                                         c曲リストノード3.r親ノード = c曲リストノード2;\r
830                                         c曲リストノード3.arスコア[ 0 ] = new Cスコア();\r
831                                         c曲リストノード3.arスコア[ 0 ].ファイル情報.フォルダの絶対パス = "";\r
832                                         c曲リストノード3.arスコア[ 0 ].譜面情報.タイトル = c曲リストノード3.strタイトル;\r
833                                         c曲リストノード3.arスコア[ 0 ].譜面情報.コメント =\r
834                                                 (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?\r
835                                                 "BOX を出ます。" :\r
836                                                 "Exit from the BOX.";\r
837                                         c曲リストノード2.list子リスト.Insert( 0, c曲リストノード3 );\r
838 \r
839                                         #region [ ログ出力 ]\r
840                                         //-----------------------------\r
841                                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
842                                         {\r
843                                                 StringBuilder builder2 = new StringBuilder( 0x100 );\r
844                                                 builder2.Append( string.Format( "nID#{0:D3}", c曲リストノード3.nID ) );\r
845                                                 if( c曲リストノード3.r親ノード != null )\r
846                                                 {\r
847                                                         builder2.Append( string.Format( "(in#{0:D3}):", c曲リストノード3.r親ノード.nID ) );\r
848                                                 }\r
849                                                 else\r
850                                                 {\r
851                                                         builder2.Append( "(onRoot):" );\r
852                                                 }\r
853                                                 builder2.Append( " BACKBOX" );\r
854                                                 Trace.TraceInformation( builder2.ToString() );\r
855                                         }\r
856                                         //-----------------------------\r
857                                         #endregion\r
858 \r
859                                         this.t曲リストへ後処理を適用する( c曲リストノード2.list子リスト );\r
860                                         continue;\r
861                                 }\r
862                                 //-----------------------------\r
863                                 #endregion\r
864 \r
865                                 #region [ ノードにタイトルがないなら、最初に見つけたスコアのタイトルを設定する ]\r
866                                 //-----------------------------\r
867                                 if( string.IsNullOrEmpty( c曲リストノード2.strタイトル ) )\r
868                                 {\r
869                                         for( int j = 0; j < 5; j++ )\r
870                                         {\r
871                                                 if( ( c曲リストノード2.arスコア[ j ] != null ) && !string.IsNullOrEmpty( c曲リストノード2.arスコア[ j ].譜面情報.タイトル ) )\r
872                                                 {\r
873                                                         c曲リストノード2.strタイトル = c曲リストノード2.arスコア[ j ].譜面情報.タイトル;\r
874 \r
875                                                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
876                                                                 Trace.TraceInformation( "タイトルを設定しました。(nID#{0:D3}, title={1})", new object[] { c曲リストノード2.nID, c曲リストノード2.strタイトル } );\r
877 \r
878                                                         break;\r
879                                                 }\r
880                                         }\r
881                                 }\r
882                                 //-----------------------------\r
883                                 #endregion\r
884                         }\r
885 \r
886                         #region [ ノードをソートする ]\r
887                         //-----------------------------\r
888                         this.t曲リストのソート1_絶対パス順( ノードリスト );\r
889                         //-----------------------------\r
890                         #endregion\r
891                 }\r
892                 //-----------------\r
893                 #endregion\r
894                 #region [ スコアキャッシュをSongsDBに出力する ]\r
895                 //-----------------\r
896                 public void tスコアキャッシュをSongsDBに出力する( string SongsDBファイル名 )\r
897                 {\r
898                         this.nSongsDBへ出力できたスコア数 = 0;\r
899                         try\r
900                         {\r
901                                 BinaryWriter bw = new BinaryWriter( new FileStream( SongsDBファイル名, FileMode.Create, FileAccess.Write ) );\r
902                                 bw.Write( SONGSDB_VERSION );\r
903                                 this.tSongsDBにリストを1つ出力する( bw, this.list曲ルート );\r
904                                 bw.Close();\r
905                         }\r
906                         catch\r
907                         {\r
908                                 Trace.TraceError( "songs.dbの出力に失敗しました。" );\r
909                         }\r
910                 }\r
911                 private void tSongsDBにノードを1つ出力する( BinaryWriter bw, C曲リストノード node )\r
912                 {\r
913                         for( int i = 0; i < 5; i++ )\r
914                         {\r
915                                 if( node.arスコア[ i ] != null )\r
916                                 {\r
917                                         bw.Write( node.arスコア[ i ].ファイル情報.ファイルの絶対パス );\r
918                                         bw.Write( node.arスコア[ i ].ファイル情報.フォルダの絶対パス );\r
919                                         bw.Write( node.arスコア[ i ].ファイル情報.最終更新日時.Ticks );\r
920                                         bw.Write( node.arスコア[ i ].ファイル情報.ファイルサイズ );\r
921                                         bw.Write( node.arスコア[ i ].ScoreIni情報.最終更新日時.Ticks );\r
922                                         bw.Write( node.arスコア[ i ].ScoreIni情報.ファイルサイズ );\r
923                                         bw.Write( node.arスコア[ i ].譜面情報.タイトル );\r
924                                         bw.Write( node.arスコア[ i ].譜面情報.アーティスト名 );\r
925                                         bw.Write( node.arスコア[ i ].譜面情報.コメント );\r
926                                         bw.Write( node.arスコア[ i ].譜面情報.ジャンル );\r
927                                         bw.Write( node.arスコア[ i ].譜面情報.Preimage );\r
928                                         bw.Write( node.arスコア[ i ].譜面情報.Premovie );\r
929                                         bw.Write( node.arスコア[ i ].譜面情報.Presound );\r
930                                         bw.Write( node.arスコア[ i ].譜面情報.Backgound );\r
931                                         bw.Write( node.arスコア[ i ].譜面情報.レベル.Drums );\r
932                                         bw.Write( node.arスコア[ i ].譜面情報.レベル.Guitar );\r
933                                         bw.Write( node.arスコア[ i ].譜面情報.レベル.Bass );\r
934                                         bw.Write( node.arスコア[ i ].譜面情報.最大ランク.Drums );\r
935                                         bw.Write( node.arスコア[ i ].譜面情報.最大ランク.Guitar );\r
936                                         bw.Write( node.arスコア[ i ].譜面情報.最大ランク.Bass );\r
937                                         bw.Write( node.arスコア[ i ].譜面情報.最大スキル.Drums );\r
938                                         bw.Write( node.arスコア[ i ].譜面情報.最大スキル.Guitar );\r
939                                         bw.Write( node.arスコア[ i ].譜面情報.最大スキル.Bass );\r
940                                         bw.Write( node.arスコア[ i ].譜面情報.フルコンボ.Drums );\r
941                                         bw.Write( node.arスコア[ i ].譜面情報.フルコンボ.Guitar );\r
942                                         bw.Write( node.arスコア[ i ].譜面情報.フルコンボ.Bass );\r
943                                         bw.Write( node.arスコア[ i ].譜面情報.演奏回数.Drums );\r
944                                         bw.Write( node.arスコア[ i ].譜面情報.演奏回数.Guitar );\r
945                                         bw.Write( node.arスコア[ i ].譜面情報.演奏回数.Bass );\r
946                                         bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行1 );\r
947                                         bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行2 );\r
948                                         bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行3 );\r
949                                         bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行4 );\r
950                                         bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行5 );\r
951                                         bw.Write( node.arスコア[ i ].譜面情報.レベルを非表示にする );\r
952                                         bw.Write( (int) node.arスコア[ i ].譜面情報.曲種別 );\r
953 //                                      bw.Write( node.arスコア[ i ].譜面情報.bpm );\r
954                                         this.nSongsDBへ出力できたスコア数++;\r
955                                 }\r
956                         }\r
957                 }\r
958                 private void tSongsDBにリストを1つ出力する( BinaryWriter bw, List<C曲リストノード> list )\r
959                 {\r
960                         foreach( C曲リストノード c曲リストノード in list )\r
961                         {\r
962                                 if( ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE ) || ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) )\r
963                                 {\r
964                                         this.tSongsDBにノードを1つ出力する( bw, c曲リストノード );\r
965                                 }\r
966                                 if( c曲リストノード.list子リスト != null )\r
967                                 {\r
968                                         this.tSongsDBにリストを1つ出力する( bw, c曲リストノード.list子リスト );\r
969                                 }\r
970                         }\r
971                 }\r
972                 //-----------------\r
973                 #endregion\r
974                 \r
975                 #region [ 曲リストソート ]\r
976                 //-----------------\r
977                 public void t曲リストのソート1_絶対パス順( List<C曲リストノード> ノードリスト )\r
978                 {\r
979                         ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )\r
980                         {\r
981                                 #region [ 共通処理 ]\r
982                                 if ( n1 == n2 )\r
983                                 {\r
984                                         return 0;\r
985                                 }\r
986                                 int num = this.t比較0_共通( n1, n2 );\r
987                                 if( num != 0 )\r
988                                 {\r
989                                         return num;\r
990                                 }\r
991                                 if( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )\r
992                                 {\r
993                                         return n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );\r
994                                 }\r
995                                 #endregion\r
996                                 string str = "";\r
997                                 if( string.IsNullOrEmpty( n1.pathSetDefの絶対パス ) )\r
998                                 {\r
999                                         for( int i = 0; i < 5; i++ )\r
1000                                         {\r
1001                                                 if( n1.arスコア[ i ] != null )\r
1002                                                 {\r
1003                                                         str = n1.arスコア[ i ].ファイル情報.ファイルの絶対パス;\r
1004                                                         if( str == null )\r
1005                                                         {\r
1006                                                                 str = "";\r
1007                                                         }\r
1008                                                         break;\r
1009                                                 }\r
1010                                         }\r
1011                                 }\r
1012                                 else\r
1013                                 {\r
1014                                         str = n1.pathSetDefの絶対パス + n1.SetDefのブロック番号.ToString( "00" );\r
1015                                 }\r
1016                                 string strB = "";\r
1017                                 if( string.IsNullOrEmpty( n2.pathSetDefの絶対パス ) )\r
1018                                 {\r
1019                                         for( int j = 0; j < 5; j++ )\r
1020                                         {\r
1021                                                 if( n2.arスコア[ j ] != null )\r
1022                                                 {\r
1023                                                         strB = n2.arスコア[ j ].ファイル情報.ファイルの絶対パス;\r
1024                                                         if( strB == null )\r
1025                                                         {\r
1026                                                                 strB = "";\r
1027                                                         }\r
1028                                                         break;\r
1029                                                 }\r
1030                                         }\r
1031                                 }\r
1032                                 else\r
1033                                 {\r
1034                                         strB = n2.pathSetDefの絶対パス + n2.SetDefのブロック番号.ToString( "00" );\r
1035                                 }\r
1036                                 return str.CompareTo( strB );\r
1037                         } );\r
1038                         foreach( C曲リストノード c曲リストノード in ノードリスト )\r
1039                         {\r
1040                                 if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )\r
1041                                 {\r
1042                                         this.t曲リストのソート1_絶対パス順( c曲リストノード.list子リスト );\r
1043                                 }\r
1044                         }\r
1045                 }\r
1046                 public void t曲リストのソート2_タイトル順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )\r
1047                 {\r
1048                         ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )\r
1049                         {\r
1050                                 if( n1 == n2 )\r
1051                                 {\r
1052                                         return 0;\r
1053                                 }\r
1054                                 int num = this.t比較0_共通( n1, n2 );\r
1055                                 if( num != 0 )\r
1056                                 {\r
1057                                         return order * num;\r
1058                                 }\r
1059                                 return order * n1.strタイトル.CompareTo( n2.strタイトル );\r
1060                         } );\r
1061 //                      foreach( C曲リストノード c曲リストノード in ノードリスト )\r
1062 //                      {\r
1063 //                              if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )\r
1064 //                              {\r
1065 //                                      this.t曲リストのソート2_タイトル順( c曲リストノード.list子リスト, part, order );\r
1066 //                              }\r
1067 //                      }\r
1068                 }\r
1069                 /// <summary>\r
1070                 /// \r
1071                 /// </summary>\r
1072                 /// <param name="ノードリスト"></param>\r
1073                 /// <param name="part"></param>\r
1074                 /// <param name="order">1=Ascend -1=Descend</param>\r
1075                 public void t曲リストのソート3_演奏回数の多い順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )\r
1076                 {\r
1077                         order = -order;\r
1078                         int nL12345 = (int) p[ 0 ];\r
1079                         if ( part != E楽器パート.UNKNOWN )\r
1080                         {\r
1081                                 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )\r
1082                                 {\r
1083                                         #region [ 共通処理 ]\r
1084                                         if ( n1 == n2 )\r
1085                                         {\r
1086                                                 return 0;\r
1087                                         }\r
1088                                         int num = this.t比較0_共通( n1, n2 );\r
1089                                         if( num != 0 )\r
1090                                         {\r
1091                                                 return order * num;\r
1092                                         }\r
1093                                         if( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )\r
1094                                         {\r
1095                                                 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );\r
1096                                         }\r
1097                                         #endregion\r
1098                                         int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;\r
1099 //                                      for( int i = 0; i < 5; i++ )\r
1100 //                                      {\r
1101                                                 if( n1.arスコア[ nL12345 ] != null )\r
1102                                                 {\r
1103                                                         nSumPlayCountN1 += n1.arスコア[ nL12345 ].譜面情報.演奏回数[ (int) part ];\r
1104                                                 }\r
1105                                                 if( n2.arスコア[ nL12345 ] != null )\r
1106                                                 {\r
1107                                                         nSumPlayCountN2 += n2.arスコア[ nL12345 ].譜面情報.演奏回数[ (int) part ];\r
1108                                                 }\r
1109 //                                      }\r
1110                                         num = nSumPlayCountN2 - nSumPlayCountN1;\r
1111                                         if( num != 0 )\r
1112                                         {\r
1113                                                 return order * num;\r
1114                                         }\r
1115                                         return order * n1.strタイトル.CompareTo( n2.strタイトル );\r
1116                                 } );\r
1117                                 foreach ( C曲リストノード c曲リストノード in ノードリスト )\r
1118                                 {\r
1119                                         int nSumPlayCountN1 = 0;\r
1120 //                                      for ( int i = 0; i < 5; i++ )\r
1121 //                                      {\r
1122                                                 if ( c曲リストノード.arスコア[ nL12345 ] != null )\r
1123                                                 {\r
1124                                                         nSumPlayCountN1 += c曲リストノード.arスコア[ nL12345 ].譜面情報.演奏回数[ (int) part ];\r
1125                                                 }\r
1126 //                                      }\r
1127 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );\r
1128                                 }\r
1129 \r
1130 //                              foreach( C曲リストノード c曲リストノード in ノードリスト )\r
1131 //                              {\r
1132 //                                      if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )\r
1133 //                                      {\r
1134 //                                              this.t曲リストのソート3_演奏回数の多い順( c曲リストノード.list子リスト, part );\r
1135 //                                      }\r
1136 //                              }\r
1137                         }\r
1138                 }\r
1139                 public void t曲リストのソート4_LEVEL順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )\r
1140                 {\r
1141                         order = -order;\r
1142                         int nL12345 = (int)p[ 0 ];\r
1143                         if ( part != E楽器パート.UNKNOWN )\r
1144                         {\r
1145                                 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )\r
1146                                 {\r
1147                                         #region [ 共通処理 ]\r
1148                                         if ( n1 == n2 )\r
1149                                         {\r
1150                                                 return 0;\r
1151                                         }\r
1152                                         int num = this.t比較0_共通( n1, n2 );\r
1153                                         if ( num != 0 )\r
1154                                         {\r
1155                                                 return order * num;\r
1156                                         }\r
1157                                         if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )\r
1158                                         {\r
1159                                                 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );\r
1160                                         }\r
1161                                         #endregion\r
1162                                         int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;\r
1163                                         if ( n1.arスコア[ nL12345 ] != null )\r
1164                                         {\r
1165                                                 nSumPlayCountN1 = n1.arスコア[ nL12345 ].譜面情報.レベル[ (int) part ];\r
1166                                         }\r
1167                                         if ( n2.arスコア[ nL12345 ] != null )\r
1168                                         {\r
1169                                                 nSumPlayCountN2 = n2.arスコア[ nL12345 ].譜面情報.レベル[ (int) part ];\r
1170                                         }\r
1171                                         num = nSumPlayCountN2 - nSumPlayCountN1;\r
1172                                         if ( num != 0 )\r
1173                                         {\r
1174                                                 return order * num;\r
1175                                         }\r
1176                                         return order * n1.strタイトル.CompareTo( n2.strタイトル );\r
1177                                 } );\r
1178                                 foreach ( C曲リストノード c曲リストノード in ノードリスト )\r
1179                                 {\r
1180                                         int nSumPlayCountN1 = 0;\r
1181                                         if ( c曲リストノード.arスコア[ nL12345 ] != null )\r
1182                                         {\r
1183                                                 nSumPlayCountN1 = c曲リストノード.arスコア[ nL12345 ].譜面情報.レベル[ (int) part ];\r
1184                                         }\r
1185 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );\r
1186                                 }\r
1187                         }\r
1188                 }\r
1189                 public void t曲リストのソート5_BestRank順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )\r
1190                 {\r
1191                         order = -order;\r
1192                         int nL12345 = (int) p[ 0 ];\r
1193                         if ( part != E楽器パート.UNKNOWN )\r
1194                         {\r
1195                                 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )\r
1196                                 {\r
1197                                         #region [ 共通処理 ]\r
1198                                         if ( n1 == n2 )\r
1199                                         {\r
1200                                                 return 0;\r
1201                                         }\r
1202                                         int num = this.t比較0_共通( n1, n2 );\r
1203                                         if ( num != 0 )\r
1204                                         {\r
1205                                                 return order * num;\r
1206                                         }\r
1207                                         if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )\r
1208                                         {\r
1209                                                 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );\r
1210                                         }\r
1211                                         #endregion\r
1212                                         int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;\r
1213                                         bool isFullCombo1 = false, isFullCombo2 = false;\r
1214                                         if ( n1.arスコア[ nL12345 ] != null )\r
1215                                         {\r
1216                                                 isFullCombo1 = n1.arスコア[ nL12345 ].譜面情報.フルコンボ[ (int) part ];\r
1217                                                 nSumPlayCountN1 = n1.arスコア[ nL12345 ].譜面情報.最大ランク[ (int) part ];\r
1218                                         }\r
1219                                         if ( n2.arスコア[ nL12345 ] != null )\r
1220                                         {\r
1221                                                 isFullCombo2 = n2.arスコア[ nL12345 ].譜面情報.フルコンボ[ (int) part ];\r
1222                                                 nSumPlayCountN2 = n2.arスコア[ nL12345 ].譜面情報.最大ランク[ (int) part ];\r
1223                                         }\r
1224                                         if ( isFullCombo1 ^ isFullCombo2 )\r
1225                                         {\r
1226                                                 if ( isFullCombo1 ) return order; else return -order;\r
1227                                         }\r
1228                                         num = nSumPlayCountN2 - nSumPlayCountN1;\r
1229                                         if ( num != 0 )\r
1230                                         {\r
1231                                                 return order * num;\r
1232                                         }\r
1233                                         return order * n1.strタイトル.CompareTo( n2.strタイトル );\r
1234                                 } );\r
1235                                 foreach ( C曲リストノード c曲リストノード in ノードリスト )\r
1236                                 {\r
1237                                         int nSumPlayCountN1 = 0;\r
1238                                         if ( c曲リストノード.arスコア[ nL12345 ] != null )\r
1239                                         {\r
1240                                                 nSumPlayCountN1 = c曲リストノード.arスコア[ nL12345 ].譜面情報.最大ランク[ (int) part ];\r
1241                                         }\r
1242 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );\r
1243                                 }\r
1244                         }\r
1245                 }\r
1246                 public void t曲リストのソート6_SkillPoint順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )\r
1247                 {\r
1248                         order = -order;\r
1249                         int nL12345 = (int) p[ 0 ];\r
1250                         if ( part != E楽器パート.UNKNOWN )\r
1251                         {\r
1252                                 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )\r
1253                                 {\r
1254                                         #region [ 共通処理 ]\r
1255                                         if ( n1 == n2 )\r
1256                                         {\r
1257                                                 return 0;\r
1258                                         }\r
1259                                         int num = this.t比較0_共通( n1, n2 );\r
1260                                         if ( num != 0 )\r
1261                                         {\r
1262                                                 return order * num;\r
1263                                         }\r
1264                                         if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )\r
1265                                         {\r
1266                                                 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );\r
1267                                         }\r
1268                                         #endregion\r
1269                                         double nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;\r
1270                                         if ( n1.arスコア[ nL12345 ] != null )\r
1271                                         {\r
1272                                                 nSumPlayCountN1 = n1.arスコア[ nL12345 ].譜面情報.最大スキル[ (int) part ];\r
1273                                         }\r
1274                                         if ( n2.arスコア[ nL12345 ] != null )\r
1275                                         {\r
1276                                                 nSumPlayCountN2 = n2.arスコア[ nL12345 ].譜面情報.最大スキル[ (int) part ];\r
1277                                         }\r
1278                                         double d = nSumPlayCountN2 - nSumPlayCountN1;\r
1279                                         if ( d != 0 )\r
1280                                         {\r
1281                                                 return order * System.Math.Sign(d);\r
1282                                         }\r
1283                                         return order * n1.strタイトル.CompareTo( n2.strタイトル );\r
1284                                 } );\r
1285                                 foreach ( C曲リストノード c曲リストノード in ノードリスト )\r
1286                                 {\r
1287                                         double nSumPlayCountN1 = 0;\r
1288                                         if ( c曲リストノード.arスコア[ nL12345 ] != null )\r
1289                                         {\r
1290                                                 nSumPlayCountN1 = c曲リストノード.arスコア[ nL12345 ].譜面情報.最大スキル[ (int) part ];\r
1291                                         }\r
1292 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );\r
1293                                 }\r
1294                         }\r
1295                 }\r
1296                 public void t曲リストのソート7_更新日時順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )\r
1297                 {\r
1298                         int nL12345 = (int) p[ 0 ];\r
1299                         if ( part != E楽器パート.UNKNOWN )\r
1300                         {\r
1301                                 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )\r
1302                                 {\r
1303                                         #region [ 共通処理 ]\r
1304                                         if ( n1 == n2 )\r
1305                                         {\r
1306                                                 return 0;\r
1307                                         }\r
1308                                         int num = this.t比較0_共通( n1, n2 );\r
1309                                         if ( num != 0 )\r
1310                                         {\r
1311                                                 return order * num;\r
1312                                         }\r
1313                                         if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )\r
1314                                         {\r
1315                                                 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );\r
1316                                         }\r
1317                                         #endregion\r
1318                                         DateTime nSumPlayCountN1 = DateTime.Parse("0001/01/01 12:00:01.000");\r
1319                                         DateTime nSumPlayCountN2 = DateTime.Parse("0001/01/01 12:00:01.000");\r
1320                                         if ( n1.arスコア[ nL12345 ] != null )\r
1321                                         {\r
1322                                                 nSumPlayCountN1 = n1.arスコア[ nL12345 ].ファイル情報.最終更新日時;\r
1323                                         }\r
1324                                         if ( n2.arスコア[ nL12345 ] != null )\r
1325                                         {\r
1326                                                 nSumPlayCountN2 = n2.arスコア[ nL12345 ].ファイル情報.最終更新日時;\r
1327                                         }\r
1328                                         int d = nSumPlayCountN1.CompareTo(nSumPlayCountN2);\r
1329                                         if ( d != 0 )\r
1330                                         {\r
1331                                                 return order * System.Math.Sign( d );\r
1332                                         }\r
1333                                         return order * n1.strタイトル.CompareTo( n2.strタイトル );\r
1334                                 } );\r
1335                                 foreach ( C曲リストノード c曲リストノード in ノードリスト )\r
1336                                 {\r
1337                                         DateTime nSumPlayCountN1 = DateTime.Parse( "0001/01/01 12:00:01.000" );\r
1338                                         if ( c曲リストノード.arスコア[ nL12345 ] != null )\r
1339                                         {\r
1340                                                 nSumPlayCountN1 = c曲リストノード.arスコア[ nL12345 ].ファイル情報.最終更新日時;\r
1341                                         }\r
1342 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );\r
1343                                 }\r
1344                         }\r
1345                 }\r
1346                 public void t曲リストのソート8_アーティスト名順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )\r
1347                 {\r
1348                         int nL12345 = (int) p[ 0 ]; \r
1349                         ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )\r
1350                         {\r
1351                                 if ( n1 == n2 )\r
1352                                 {\r
1353                                         return 0;\r
1354                                 }\r
1355                                 int num = this.t比較0_共通( n1, n2 );\r
1356                                 if ( num != 0 )\r
1357                                 {\r
1358                                         return order * System.Math.Sign( num );\r
1359                                 }\r
1360                                 string strAuthorN1 = "";\r
1361                                 string strAuthorN2 = "";\r
1362                                 if (n1.arスコア[ nL12345 ] != null ) {\r
1363                                         strAuthorN1 = n1.arスコア[ nL12345 ].譜面情報.アーティスト名;\r
1364                                 }\r
1365                                 if ( n2.arスコア[ nL12345 ] != null )\r
1366                                 {\r
1367                                         strAuthorN2 = n2.arスコア[ nL12345 ].譜面情報.アーティスト名;\r
1368                                 }\r
1369 \r
1370                                 return order * strAuthorN1.CompareTo( strAuthorN2 );\r
1371                         } );\r
1372                         foreach ( C曲リストノード c曲リストノード in ノードリスト )\r
1373                         {\r
1374                                 string s = "";\r
1375                                 if ( c曲リストノード.arスコア[ nL12345 ] != null )\r
1376                                 {\r
1377                                         s = c曲リストノード.arスコア[ nL12345 ].譜面情報.アーティスト名;\r
1378                                 }\r
1379 Debug.WriteLine( s + ":" + c曲リストノード.strタイトル );\r
1380                         }\r
1381                 }\r
1382 #if TEST_SORTBGM\r
1383                 public void t曲リストのソート9_BPM順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )\r
1384                 {\r
1385                         order = -order;\r
1386                         int nL12345 = (int) p[ 0 ];\r
1387                         if ( part != E楽器パート.UNKNOWN )\r
1388                         {\r
1389                                 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )\r
1390                                 {\r
1391                                         #region [ 共通処理 ]\r
1392                                         if ( n1 == n2 )\r
1393                                         {\r
1394                                                 return 0;\r
1395                                         }\r
1396                                         int num = this.t比較0_共通( n1, n2 );\r
1397                                         if ( num != 0 )\r
1398                                         {\r
1399                                                 return order * num;\r
1400                                         }\r
1401                                         if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )\r
1402                                         {\r
1403                                                 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );\r
1404                                         }\r
1405                                         #endregion\r
1406                                         double dBPMn1 = 0.0, dBPMn2 = 0.0;\r
1407                                         if ( n1.arスコア[ nL12345 ] != null )\r
1408                                         {\r
1409                                                 dBPMn1 = n1.arスコア[ nL12345 ].譜面情報.bpm;\r
1410                                         }\r
1411                                         if ( n2.arスコア[ nL12345 ] != null )\r
1412                                         {\r
1413                                                 dBPMn2 = n2.arスコア[ nL12345 ].譜面情報.bpm;\r
1414                                         }\r
1415                                         double d = dBPMn1- dBPMn2;\r
1416                                         if ( d != 0 )\r
1417                                         {\r
1418                                                 return order * System.Math.Sign( d );\r
1419                                         }\r
1420                                         return order * n1.strタイトル.CompareTo( n2.strタイトル );\r
1421                                 } );\r
1422                                 foreach ( C曲リストノード c曲リストノード in ノードリスト )\r
1423                                 {\r
1424                                         double dBPM = 0;\r
1425                                         if ( c曲リストノード.arスコア[ nL12345 ] != null )\r
1426                                         {\r
1427                                                 dBPM = c曲リストノード.arスコア[ nL12345 ].譜面情報.bpm;\r
1428                                         }\r
1429 Debug.WriteLine( dBPM + ":" + c曲リストノード.strタイトル );\r
1430                                 }\r
1431                         }\r
1432                 }\r
1433 #endif\r
1434                 //-----------------\r
1435                 #endregion\r
1436                 #region [ .score.ini を読み込んで Cスコア.譜面情報に設定する ]\r
1437                 //-----------------\r
1438                 public void tScoreIniを読み込んで譜面情報を設定する( string strScoreIniファイルパス, ref Cスコア score )\r
1439                 {\r
1440                         if( !File.Exists( strScoreIniファイルパス ) )\r
1441                                 return;\r
1442 \r
1443                         try\r
1444                         {\r
1445                                 var ini = new CScoreIni( strScoreIniファイルパス );\r
1446                                 ini.t全演奏記録セクションの整合性をチェックし不整合があればリセットする();\r
1447 \r
1448                                 for( int n楽器番号 = 0; n楽器番号 < 3; n楽器番号++ )\r
1449                                 {\r
1450                                         int n = ( n楽器番号 * 2 ) + 1;      // n = 0~5\r
1451 \r
1452                                         #region socre.譜面情報.最大ランク[ n楽器番号 ] = ... \r
1453                                         //-----------------\r
1454                                         if( ini.stセクション[ n ].b演奏にMIDI入力を使用した ||\r
1455                                                 ini.stセクション[ n ].b演奏にキーボードを使用した ||\r
1456                                                 ini.stセクション[ n ].b演奏にジョイパッドを使用した ||\r
1457                                                 ini.stセクション[ n ].b演奏にマウスを使用した )\r
1458                                         {\r
1459                                                 // (A) 全オートじゃないようなので、演奏結果情報を有効としてランクを算出する。\r
1460 \r
1461                                                 score.譜面情報.最大ランク[ n楽器番号 ] =\r
1462                                                         CScoreIni.tランク値を計算して返す( \r
1463                                                                 ini.stセクション[ n ].n全チップ数,\r
1464                                                                 ini.stセクション[ n ].nPerfect数, \r
1465                                                                 ini.stセクション[ n ].nGreat数,\r
1466                                                                 ini.stセクション[ n ].nGood数, \r
1467                                                                 ini.stセクション[ n ].nPoor数,\r
1468                                                                 ini.stセクション[ n ].nMiss数 );\r
1469                                         }\r
1470                                         else\r
1471                                         {\r
1472                                                 // (B) 全オートらしいので、ランクは無効とする。\r
1473 \r
1474                                                 score.譜面情報.最大ランク[ n楽器番号 ] = (int) CScoreIni.ERANK.UNKNOWN;\r
1475                                         }\r
1476                                         //-----------------\r
1477                                         #endregion\r
1478                                         score.譜面情報.最大スキル[ n楽器番号 ] = ini.stセクション[ n ].db演奏型スキル値;\r
1479                                         score.譜面情報.フルコンボ[ n楽器番号 ] = ini.stセクション[ n ].bフルコンボである;\r
1480                                 }\r
1481                                 score.譜面情報.演奏回数.Drums = ini.stファイル.PlayCountDrums;\r
1482                                 score.譜面情報.演奏回数.Guitar = ini.stファイル.PlayCountGuitar;\r
1483                                 score.譜面情報.演奏回数.Bass = ini.stファイル.PlayCountBass;\r
1484                                 for( int i = 0; i < 5; i++ )\r
1485                                         score.譜面情報.演奏履歴[ i ] = ini.stファイル.History[ i ];\r
1486                         }\r
1487                         catch\r
1488                         {\r
1489                                 Trace.TraceError( "演奏記録ファイルの読み込みに失敗しました。[{0}]", strScoreIniファイルパス );\r
1490                         }\r
1491                 }\r
1492                 //-----------------\r
1493                 #endregion\r
1494 \r
1495 \r
1496                 // その他\r
1497 \r
1498                 #region [ private ]\r
1499                 //-----------------\r
1500                 private const string SONGSDB_VERSION = "SongsDB2";\r
1501 \r
1502                 private int t比較0_共通( C曲リストノード n1, C曲リストノード n2 )\r
1503                 {\r
1504                         if( n1.eノード種別 == C曲リストノード.Eノード種別.BACKBOX )\r
1505                         {\r
1506                                 return -1;\r
1507                         }\r
1508                         if( n2.eノード種別 == C曲リストノード.Eノード種別.BACKBOX )\r
1509                         {\r
1510                                 return 1;\r
1511                         }\r
1512                         if( n1.eノード種別 == C曲リストノード.Eノード種別.RANDOM )\r
1513                         {\r
1514                                 return 1;\r
1515                         }\r
1516                         if( n2.eノード種別 == C曲リストノード.Eノード種別.RANDOM )\r
1517                         {\r
1518                                 return -1;\r
1519                         }\r
1520                         if( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 != C曲リストノード.Eノード種別.BOX ) )\r
1521                         {\r
1522                                 return -1;\r
1523                         }\r
1524                         if( ( n1.eノード種別 != C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )\r
1525                         {\r
1526                                 return 1;\r
1527                         }\r
1528                         return 0;\r
1529                 }\r
1530                 //-----------------\r
1531                 #endregion\r
1532         }\r
1533 }\r