OSDN Git Service

2027ed8239a9d1e25213589cad355c72531f8b2e
[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 \r
9 namespace DTXMania\r
10 {\r
11         internal class CSongs管理\r
12         {\r
13                 // プロパティ\r
14 \r
15                 public int nSongsDBから取得できたスコア数\r
16                 {\r
17                         get; \r
18                         set; \r
19                 }\r
20                 public int nSongsDBへ出力できたスコア数\r
21                 {\r
22                         get;\r
23                         set;\r
24                 }\r
25                 public int nスコアキャッシュから反映できたスコア数 \r
26                 {\r
27                         get;\r
28                         set; \r
29                 }\r
30                 public int nファイルから反映できたスコア数\r
31                 {\r
32                         get;\r
33                         set;\r
34                 }\r
35                 public int n検索されたスコア数 \r
36                 { \r
37                         get;\r
38                         set;\r
39                 }\r
40                 public int n検索された曲ノード数\r
41                 {\r
42                         get; \r
43                         set;\r
44                 }\r
45                 public List<Cスコア> listSongsDB;                                    // songs.dbから構築されるlist\r
46                 public List<C曲リストノード> list曲ルート;                   // 起動時にフォルダ検索して構築されるlist\r
47 \r
48 \r
49                 // コンストラクタ\r
50 \r
51                 public CSongs管理()\r
52                 {\r
53                         this.listSongsDB = new List<Cスコア>();\r
54                         this.list曲ルート = new List<C曲リストノード>();\r
55                         this.n検索された曲ノード数 = 0;\r
56                         this.n検索されたスコア数 = 0;\r
57                 }\r
58 \r
59 \r
60                 // メソッド\r
61 \r
62                 #region [ SongsDB(songs.db) を読み込む ]\r
63                 //-----------------\r
64                 public void tSongsDBを読み込む( string SongsDBファイル名 )\r
65                 {\r
66                         this.nSongsDBから取得できたスコア数 = 0;\r
67                         if( File.Exists( SongsDBファイル名 ) )\r
68                         {\r
69                                 BinaryReader br = null;\r
70                                 try\r
71                                 {\r
72                                         br = new BinaryReader( File.OpenRead( SongsDBファイル名 ) );\r
73                                         if( !br.ReadString().Equals( "SongsDB2" ) )\r
74                                         {\r
75                                                 throw new InvalidDataException( "ヘッダが異なります。" );\r
76                                         }\r
77                                         this.listSongsDB = new List<Cスコア>();\r
78 \r
79                                         while( true )\r
80                                         {\r
81                                                 try\r
82                                                 {\r
83                                                         Cスコア item = this.tSongsDBからスコアを1つ読み込む( br );\r
84                                                         this.listSongsDB.Add( item );\r
85                                                         this.nSongsDBから取得できたスコア数++;\r
86                                                 }\r
87                                                 catch( EndOfStreamException )\r
88                                                 {\r
89                                                         break;\r
90                                                 }\r
91                                         }\r
92                                 }\r
93                                 finally\r
94                                 {\r
95                                         if( br != null )\r
96                                                 br.Close();\r
97                                 }\r
98                         }\r
99                 }\r
100                 //-----------------\r
101                 #endregion\r
102                 #region [ 曲を検索してリストを作成する ]\r
103                 //-----------------\r
104                 public void t曲を検索してリストを作成する( string str基点フォルダ, bool b子BOXへ再帰する )\r
105                 {\r
106                         this.t曲を検索してリストを作成する( str基点フォルダ, b子BOXへ再帰する, this.list曲ルート, null );\r
107                 }\r
108                 private void t曲を検索してリストを作成する( string str基点フォルダ, bool b子BOXへ再帰する, List<C曲リストノード> listノードリスト, C曲リストノード node親 )\r
109                 {\r
110                         if( !str基点フォルダ.EndsWith( @"\" ) )\r
111                                 str基点フォルダ = str基点フォルダ + @"\";\r
112 \r
113                         DirectoryInfo info = new DirectoryInfo( str基点フォルダ );\r
114 \r
115                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
116                                 Trace.TraceInformation( "基点フォルダ: " + str基点フォルダ );\r
117 \r
118                         #region [ a.フォルダ内に set.def が存在する場合 → set.def からノード作成]\r
119                         //-----------------------------\r
120                         string path = str基点フォルダ + "set.def";\r
121                         if( File.Exists( path ) )\r
122                         {\r
123                                 CSetDef def = new CSetDef( path );\r
124                                 new FileInfo( path );\r
125                                 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
126                                 {\r
127                                         Trace.TraceInformation( "set.def検出 : {0}", new object[] { path } );\r
128                                         Trace.Indent();\r
129                                 }\r
130                                 try\r
131                                 {\r
132                                         for( int i = 0; i < def.blocks.Count; i++ )\r
133                                         {\r
134                                                 CSetDef.CBlock block = def.blocks[ i ];\r
135                                                 C曲リストノード item = new C曲リストノード();\r
136                                                 item.eノード種別 = C曲リストノード.Eノード種別.SCORE;\r
137                                                 item.strタイトル = block.Title;\r
138                                                 item.strジャンル = block.Genre;\r
139                                                 item.nスコア数 = 0;\r
140                                                 item.col文字色 = block.FontColor;\r
141                                                 item.SetDefのブロック番号 = i;\r
142                                                 item.pathSetDefの絶対パス = path;\r
143                                                 item.r親ノード = node親;\r
144                                                 for( int j = 0; j < 5; j++ )\r
145                                                 {\r
146                                                         if( !string.IsNullOrEmpty( block.File[ j ] ) )\r
147                                                         {\r
148                                                                 string str2 = str基点フォルダ + block.File[ j ];\r
149                                                                 if( File.Exists( str2 ) )\r
150                                                                 {\r
151                                                                         item.ar難易度ラベル[ j ] = block.Label[ j ];\r
152                                                                         item.arスコア[ j ] = new Cスコア();\r
153                                                                         item.arスコア[ j ].ファイル情報.ファイルの絶対パス = str2;\r
154                                                                         item.arスコア[ j ].ファイル情報.フォルダの絶対パス = Path.GetFullPath( Path.GetDirectoryName( str2 ) ) + @"\";\r
155                                                                         FileInfo info2 = new FileInfo( str2 );\r
156                                                                         item.arスコア[ j ].ファイル情報.ファイルサイズ = info2.Length;\r
157                                                                         item.arスコア[ j ].ファイル情報.最終更新日時 = info2.LastWriteTime;\r
158                                                                         string str3 = str2 + ".score.ini";\r
159                                                                         if( File.Exists( str3 ) )\r
160                                                                         {\r
161                                                                                 FileInfo info3 = new FileInfo( str3 );\r
162                                                                                 item.arスコア[ j ].ScoreIni情報.ファイルサイズ = info3.Length;\r
163                                                                                 item.arスコア[ j ].ScoreIni情報.最終更新日時 = info3.LastWriteTime;\r
164                                                                         }\r
165                                                                         item.nスコア数++;\r
166                                                                         this.n検索されたスコア数++;\r
167                                                                 }\r
168                                                                 else\r
169                                                                 {\r
170                                                                         item.arスコア[ j ] = null;\r
171                                                                 }\r
172                                                         }\r
173                                                 }\r
174                                                 if( item.nスコア数 > 0 )\r
175                                                 {\r
176                                                         listノードリスト.Add( item );\r
177                                                         this.n検索された曲ノード数++;\r
178                                                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
179                                                         {\r
180                                                                 StringBuilder builder = new StringBuilder( 0x200 );\r
181                                                                 builder.Append( string.Format( "nID#{0:D3}", item.nID ) );\r
182                                                                 if( item.r親ノード != null )\r
183                                                                 {\r
184                                                                         builder.Append( string.Format( "(in#{0:D3}):", item.r親ノード.nID ) );\r
185                                                                 }\r
186                                                                 else\r
187                                                                 {\r
188                                                                         builder.Append( "(onRoot):" );\r
189                                                                 }\r
190                                                                 if( ( item.strタイトル != null ) && ( item.strタイトル.Length > 0 ) )\r
191                                                                 {\r
192                                                                         builder.Append( " SONG, Title=" + item.strタイトル );\r
193                                                                 }\r
194                                                                 if( ( item.strジャンル != null ) && ( item.strジャンル.Length > 0 ) )\r
195                                                                 {\r
196                                                                         builder.Append( ", Genre=" + item.strジャンル );\r
197                                                                 }\r
198                                                                 if( item.col文字色 != Color.White )\r
199                                                                 {\r
200                                                                         builder.Append( ", FontColor=" + item.col文字色 );\r
201                                                                 }\r
202                                                                 Trace.TraceInformation( builder.ToString() );\r
203                                                                 Trace.Indent();\r
204                                                                 try\r
205                                                                 {\r
206                                                                         for( int k = 0; k < 5; k++ )\r
207                                                                         {\r
208                                                                                 if( item.arスコア[ k ] != null )\r
209                                                                                 {\r
210                                                                                         Cスコア cスコア = item.arスコア[ k ];\r
211                                                                                         builder.Remove( 0, builder.Length );\r
212                                                                                         builder.Append( string.Format( "ブロック{0}-{1}:", item.SetDefのブロック番号 + 1, k + 1 ) );\r
213                                                                                         builder.Append( " Label=" + item.ar難易度ラベル[ k ] );\r
214                                                                                         builder.Append( ", File=" + cスコア.ファイル情報.ファイルの絶対パス );\r
215                                                                                         builder.Append( ", Size=" + cスコア.ファイル情報.ファイルサイズ );\r
216                                                                                         builder.Append( ", LastUpdate=" + cスコア.ファイル情報.最終更新日時 );\r
217                                                                                         Trace.TraceInformation( builder.ToString() );\r
218                                                                                 }\r
219                                                                         }\r
220                                                                 }\r
221                                                                 finally\r
222                                                                 {\r
223                                                                         Trace.Unindent();\r
224                                                                 }\r
225                                                         }\r
226                                                 }\r
227                                         }\r
228                                 }\r
229                                 finally\r
230                                 {\r
231                                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
232                                         {\r
233                                                 Trace.Unindent();\r
234                                         }\r
235                                 }\r
236                         }\r
237                         //-----------------------------\r
238                         #endregion\r
239 \r
240                         #region [ b.フォルダ内に set.def が存在しない場合 → 個別ファイルからノード作成 ]\r
241                         //-----------------------------\r
242                         else\r
243                         {\r
244                                 foreach( FileInfo info4 in info.GetFiles() )\r
245                                 {\r
246                                         string str4 = info4.Extension.ToLower();\r
247                                         if( ( str4.Equals( ".dtx" ) || str4.Equals( ".gda" ) ) || ( ( str4.Equals( ".g2d" ) || str4.Equals( ".bms" ) ) || str4.Equals( ".bme" ) ) )\r
248                                         {\r
249                                                 C曲リストノード c曲リストノード2 = new C曲リストノード();\r
250                                                 c曲リストノード2.eノード種別 = C曲リストノード.Eノード種別.SCORE;\r
251                                                 c曲リストノード2.nスコア数 = 1;\r
252                                                 c曲リストノード2.r親ノード = node親;\r
253                                                 c曲リストノード2.arスコア[ 0 ] = new Cスコア();\r
254                                                 c曲リストノード2.arスコア[ 0 ].ファイル情報.ファイルの絶対パス = str基点フォルダ + info4.Name;\r
255                                                 c曲リストノード2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス = str基点フォルダ;\r
256                                                 c曲リストノード2.arスコア[ 0 ].ファイル情報.ファイルサイズ = info4.Length;\r
257                                                 c曲リストノード2.arスコア[ 0 ].ファイル情報.最終更新日時 = info4.LastWriteTime;\r
258                                                 string str5 = c曲リストノード2.arスコア[ 0 ].ファイル情報.ファイルの絶対パス + ".score.ini";\r
259                                                 if( File.Exists( str5 ) )\r
260                                                 {\r
261                                                         FileInfo info5 = new FileInfo( str5 );\r
262                                                         c曲リストノード2.arスコア[ 0 ].ScoreIni情報.ファイルサイズ = info5.Length;\r
263                                                         c曲リストノード2.arスコア[ 0 ].ScoreIni情報.最終更新日時 = info5.LastWriteTime;\r
264                                                 }\r
265                                                 this.n検索されたスコア数++;\r
266                                                 listノードリスト.Add( c曲リストノード2 );\r
267                                                 this.n検索された曲ノード数++;\r
268                                                 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
269                                                 {\r
270                                                         Trace.Indent();\r
271                                                         try\r
272                                                         {\r
273                                                                 StringBuilder builder2 = new StringBuilder( 0x100 );\r
274                                                                 builder2.Append( string.Format( "nID#{0:D3}", c曲リストノード2.nID ) );\r
275                                                                 if( c曲リストノード2.r親ノード != null )\r
276                                                                 {\r
277                                                                         builder2.Append( string.Format( "(in#{0:D3}):", c曲リストノード2.r親ノード.nID ) );\r
278                                                                 }\r
279                                                                 else\r
280                                                                 {\r
281                                                                         builder2.Append( "(onRoot):" );\r
282                                                                 }\r
283                                                                 builder2.Append( " SONG, File=" + c曲リストノード2.arスコア[ 0 ].ファイル情報.ファイルの絶対パス );\r
284                                                                 builder2.Append( ", Size=" + c曲リストノード2.arスコア[ 0 ].ファイル情報.ファイルサイズ );\r
285                                                                 builder2.Append( ", LastUpdate=" + c曲リストノード2.arスコア[ 0 ].ファイル情報.最終更新日時 );\r
286                                                                 Trace.TraceInformation( builder2.ToString() );\r
287                                                         }\r
288                                                         finally\r
289                                                         {\r
290                                                                 Trace.Unindent();\r
291                                                         }\r
292                                                 }\r
293                                         }\r
294                                         else if( !str4.Equals( ".mid" ) )\r
295                                         {\r
296                                                 str4.Equals( ".smf" );\r
297                                         }\r
298                                 }\r
299                         }\r
300                         //-----------------------------\r
301                         #endregion\r
302 \r
303                         foreach( DirectoryInfo info6 in info.GetDirectories() )\r
304                         {\r
305                                 #region [ a. "dtxfiles." で始まるフォルダの場合 ]\r
306                                 //-----------------------------\r
307                                 if( info6.Name.ToLower().StartsWith( "dtxfiles." ) )\r
308                                 {\r
309                                         C曲リストノード c曲リストノード3 = new C曲リストノード();\r
310                                         c曲リストノード3.eノード種別 = C曲リストノード.Eノード種別.BOX;\r
311                                         c曲リストノード3.bDTXFilesで始まるフォルダ名のBOXである = true;\r
312                                         c曲リストノード3.strタイトル = info6.Name.Substring( 9 );\r
313                                         c曲リストノード3.nスコア数 = 1;\r
314                                         c曲リストノード3.r親ノード = node親;\r
315                                         c曲リストノード3.list子リスト = new List<C曲リストノード>();\r
316                                         c曲リストノード3.arスコア[ 0 ] = new Cスコア();\r
317                                         c曲リストノード3.arスコア[ 0 ].ファイル情報.フォルダの絶対パス = info6.FullName + @"\";\r
318                                         c曲リストノード3.arスコア[ 0 ].譜面情報.タイトル = c曲リストノード3.strタイトル;\r
319                                         c曲リストノード3.arスコア[ 0 ].譜面情報.コメント =\r
320                                                 (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?\r
321                                                 "BOX に移動します。" :\r
322                                                 "Enter into the BOX.";\r
323                                         listノードリスト.Add(c曲リストノード3);\r
324                                         if( File.Exists( info6.FullName + @"\box.def" ) )\r
325                                         {\r
326                                                 CBoxDef def2 = new CBoxDef( info6.FullName + @"\box.def" );\r
327                                                 if( ( def2.Title != null ) && ( def2.Title.Length > 0 ) )\r
328                                                 {\r
329                                                         c曲リストノード3.strタイトル = def2.Title;\r
330                                                 }\r
331                                                 if( ( def2.Genre != null ) && ( def2.Genre.Length > 0 ) )\r
332                                                 {\r
333                                                         c曲リストノード3.strジャンル = def2.Genre;\r
334                                                 }\r
335                                                 if( def2.Color != Color.White )\r
336                                                 {\r
337                                                         c曲リストノード3.col文字色 = def2.Color;\r
338                                                 }\r
339                                                 if( ( def2.Artist != null ) && ( def2.Artist.Length > 0 ) )\r
340                                                 {\r
341                                                         c曲リストノード3.arスコア[ 0 ].譜面情報.アーティスト名 = def2.Artist;\r
342                                                 }\r
343                                                 if( ( def2.Comment != null ) && ( def2.Comment.Length > 0 ) )\r
344                                                 {\r
345                                                         c曲リストノード3.arスコア[ 0 ].譜面情報.コメント = def2.Comment;\r
346                                                 }\r
347                                                 if( ( def2.Preimage != null ) && ( def2.Preimage.Length > 0 ) )\r
348                                                 {\r
349                                                         c曲リストノード3.arスコア[ 0 ].譜面情報.Preimage = def2.Preimage;\r
350                                                 }\r
351                                                 if( ( def2.Premovie != null ) && ( def2.Premovie.Length > 0 ) )\r
352                                                 {\r
353                                                         c曲リストノード3.arスコア[ 0 ].譜面情報.Premovie = def2.Premovie;\r
354                                                 }\r
355                                                 if( ( def2.Presound != null ) && ( def2.Presound.Length > 0 ) )\r
356                                                 {\r
357                                                         c曲リストノード3.arスコア[ 0 ].譜面情報.Presound = def2.Presound;\r
358                                                 }\r
359                                                 if( def2.PerfectRange >= 0 )\r
360                                                 {\r
361                                                         c曲リストノード3.nPerfect範囲ms = def2.PerfectRange;\r
362                                                 }\r
363                                                 if( def2.GreatRange >= 0 )\r
364                                                 {\r
365                                                         c曲リストノード3.nGreat範囲ms = def2.GreatRange;\r
366                                                 }\r
367                                                 if( def2.GoodRange >= 0 )\r
368                                                 {\r
369                                                         c曲リストノード3.nGood範囲ms = def2.GoodRange;\r
370                                                 }\r
371                                                 if( def2.PoorRange >= 0 )\r
372                                                 {\r
373                                                         c曲リストノード3.nPoor範囲ms = def2.PoorRange;\r
374                                                 }\r
375                                         }\r
376                                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
377                                         {\r
378                                                 Trace.Indent();\r
379                                                 try\r
380                                                 {\r
381                                                         StringBuilder builder3 = new StringBuilder( 0x100 );\r
382                                                         builder3.Append( string.Format( "nID#{0:D3}", c曲リストノード3.nID ) );\r
383                                                         if( c曲リストノード3.r親ノード != null )\r
384                                                         {\r
385                                                                 builder3.Append( string.Format( "(in#{0:D3}):", c曲リストノード3.r親ノード.nID ) );\r
386                                                         }\r
387                                                         else\r
388                                                         {\r
389                                                                 builder3.Append( "(onRoot):" );\r
390                                                         }\r
391                                                         builder3.Append( " BOX, Title=" + c曲リストノード3.strタイトル );\r
392                                                         builder3.Append( ", Folder=" + c曲リストノード3.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );\r
393                                                         builder3.Append( ", Comment=" + c曲リストノード3.arスコア[ 0 ].譜面情報.コメント );\r
394                                                         Trace.TraceInformation( builder3.ToString() );\r
395                                                 }\r
396                                                 finally\r
397                                                 {\r
398                                                         Trace.Unindent();\r
399                                                 }\r
400                                         }\r
401                                         if( b子BOXへ再帰する )\r
402                                         {\r
403                                                 this.t曲を検索してリストを作成する( info6.FullName + @"\", b子BOXへ再帰する, c曲リストノード3.list子リスト, c曲リストノード3 );\r
404                                         }\r
405                                 }\r
406                                 //-----------------------------\r
407                                 #endregion\r
408 \r
409                                 #region [ b.box.def を含むフォルダの場合  ]\r
410                                 //-----------------------------\r
411                                 else if( File.Exists( info6.FullName + @"\box.def" ) )\r
412                                 {\r
413                                         CBoxDef def3 = new CBoxDef( info6.FullName + @"\box.def" );\r
414                                         C曲リストノード c曲リストノード4 = new C曲リストノード();\r
415                                         c曲リストノード4.eノード種別 = C曲リストノード.Eノード種別.BOX;\r
416                                         c曲リストノード4.bDTXFilesで始まるフォルダ名のBOXである = false;\r
417                                         c曲リストノード4.strタイトル = def3.Title;\r
418                                         c曲リストノード4.strジャンル = def3.Genre;\r
419                                         c曲リストノード4.col文字色 = def3.Color;\r
420                                         c曲リストノード4.nスコア数 = 1;\r
421                                         c曲リストノード4.arスコア[ 0 ] = new Cスコア();\r
422                                         c曲リストノード4.arスコア[ 0 ].ファイル情報.フォルダの絶対パス = info6.FullName + @"\";\r
423                                         c曲リストノード4.arスコア[ 0 ].譜面情報.タイトル = def3.Title;\r
424                                         c曲リストノード4.arスコア[ 0 ].譜面情報.ジャンル = def3.Genre;\r
425                                         c曲リストノード4.arスコア[ 0 ].譜面情報.アーティスト名 = def3.Artist;\r
426                                         c曲リストノード4.arスコア[ 0 ].譜面情報.コメント = def3.Comment;\r
427                                         c曲リストノード4.arスコア[ 0 ].譜面情報.Preimage = def3.Preimage;\r
428                                         c曲リストノード4.arスコア[ 0 ].譜面情報.Premovie = def3.Premovie;\r
429                                         c曲リストノード4.arスコア[ 0 ].譜面情報.Presound = def3.Presound;\r
430                                         c曲リストノード4.r親ノード = node親;\r
431                                         c曲リストノード4.list子リスト = new List<C曲リストノード>();\r
432                                         c曲リストノード4.nPerfect範囲ms = def3.PerfectRange;\r
433                                         c曲リストノード4.nGreat範囲ms = def3.GreatRange;\r
434                                         c曲リストノード4.nGood範囲ms = def3.GoodRange;\r
435                                         c曲リストノード4.nPoor範囲ms = def3.PoorRange;\r
436                                         listノードリスト.Add( c曲リストノード4 );\r
437                                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
438                                         {\r
439                                                 Trace.TraceInformation( "box.def検出 : {0}", new object[] { info6.FullName + @"\box.def" } );\r
440                                                 Trace.Indent();\r
441                                                 try\r
442                                                 {\r
443                                                         StringBuilder builder4 = new StringBuilder( 0x400 );\r
444                                                         builder4.Append( string.Format( "nID#{0:D3}", c曲リストノード4.nID ) );\r
445                                                         if( c曲リストノード4.r親ノード != null )\r
446                                                         {\r
447                                                                 builder4.Append( string.Format( "(in#{0:D3}):", c曲リストノード4.r親ノード.nID ) );\r
448                                                         }\r
449                                                         else\r
450                                                         {\r
451                                                                 builder4.Append( "(onRoot):" );\r
452                                                         }\r
453                                                         builder4.Append( "BOX, Title=" + c曲リストノード4.strタイトル );\r
454                                                         if( ( c曲リストノード4.strジャンル != null ) && ( c曲リストノード4.strジャンル.Length > 0 ) )\r
455                                                         {\r
456                                                                 builder4.Append( ", Genre=" + c曲リストノード4.strジャンル );\r
457                                                         }\r
458                                                         if( ( c曲リストノード4.arスコア[ 0 ].譜面情報.アーティスト名 != null ) && ( c曲リストノード4.arスコア[ 0 ].譜面情報.アーティスト名.Length > 0 ) )\r
459                                                         {\r
460                                                                 builder4.Append( ", Artist=" + c曲リストノード4.arスコア[ 0 ].譜面情報.アーティスト名 );\r
461                                                         }\r
462                                                         if( ( c曲リストノード4.arスコア[ 0 ].譜面情報.コメント != null ) && ( c曲リストノード4.arスコア[ 0 ].譜面情報.コメント.Length > 0 ) )\r
463                                                         {\r
464                                                                 builder4.Append( ", Comment=" + c曲リストノード4.arスコア[ 0 ].譜面情報.コメント );\r
465                                                         }\r
466                                                         if( ( c曲リストノード4.arスコア[ 0 ].譜面情報.Preimage != null ) && ( c曲リストノード4.arスコア[ 0 ].譜面情報.Preimage.Length > 0 ) )\r
467                                                         {\r
468                                                                 builder4.Append( ", Preimage=" + c曲リストノード4.arスコア[ 0 ].譜面情報.Preimage );\r
469                                                         }\r
470                                                         if( ( c曲リストノード4.arスコア[ 0 ].譜面情報.Premovie != null ) && ( c曲リストノード4.arスコア[ 0 ].譜面情報.Premovie.Length > 0 ) )\r
471                                                         {\r
472                                                                 builder4.Append( ", Premovie=" + c曲リストノード4.arスコア[ 0 ].譜面情報.Premovie );\r
473                                                         }\r
474                                                         if( ( c曲リストノード4.arスコア[ 0 ].譜面情報.Presound != null ) && ( c曲リストノード4.arスコア[ 0 ].譜面情報.Presound.Length > 0 ) )\r
475                                                         {\r
476                                                                 builder4.Append( ", Presound=" + c曲リストノード4.arスコア[ 0 ].譜面情報.Presound );\r
477                                                         }\r
478                                                         if( c曲リストノード4.col文字色 != ColorTranslator.FromHtml( "White" ) )\r
479                                                         {\r
480                                                                 builder4.Append( ", FontColor=" + c曲リストノード4.col文字色 );\r
481                                                         }\r
482                                                         if( c曲リストノード4.nPerfect範囲ms != -1 )\r
483                                                         {\r
484                                                                 builder4.Append( ", Perfect=" + c曲リストノード4.nPerfect範囲ms + "ms" );\r
485                                                         }\r
486                                                         if( c曲リストノード4.nGreat範囲ms != -1 )\r
487                                                         {\r
488                                                                 builder4.Append( ", Great=" + c曲リストノード4.nGreat範囲ms + "ms" );\r
489                                                         }\r
490                                                         if( c曲リストノード4.nGood範囲ms != -1 )\r
491                                                         {\r
492                                                                 builder4.Append( ", Good=" + c曲リストノード4.nGood範囲ms + "ms" );\r
493                                                         }\r
494                                                         if( c曲リストノード4.nPoor範囲ms != -1 )\r
495                                                         {\r
496                                                                 builder4.Append( ", Poor=" + c曲リストノード4.nPoor範囲ms + "ms" );\r
497                                                         }\r
498                                                         Trace.TraceInformation( builder4.ToString() );\r
499                                                 }\r
500                                                 finally\r
501                                                 {\r
502                                                         Trace.Unindent();\r
503                                                 }\r
504                                         }\r
505                                         if( b子BOXへ再帰する )\r
506                                         {\r
507                                                 this.t曲を検索してリストを作成する( info6.FullName + @"\", b子BOXへ再帰する, c曲リストノード4.list子リスト, c曲リストノード4 );\r
508                                         }\r
509                                 }\r
510                                 //-----------------------------\r
511                                 #endregion\r
512 \r
513                                 #region [ c.通常フォルダの場合 ]\r
514                                 //-----------------------------\r
515                                 else\r
516                                 {\r
517                                         this.t曲を検索してリストを作成する( info6.FullName + @"\", b子BOXへ再帰する, listノードリスト, node親 );\r
518                                 }\r
519                                 //-----------------------------\r
520                                 #endregion\r
521                         }\r
522                 }\r
523                 //-----------------\r
524                 #endregion\r
525                 #region [ スコアキャッシュを曲リストに反映する ]\r
526                 //-----------------\r
527                 public void tスコアキャッシュを曲リストに反映する()\r
528                 {\r
529                         this.nスコアキャッシュから反映できたスコア数 = 0;\r
530                         this.tスコアキャッシュを曲リストに反映する( this.list曲ルート );\r
531                 }\r
532                 private void tスコアキャッシュを曲リストに反映する( List<C曲リストノード> ノードリスト )\r
533                 {\r
534                         using( List<C曲リストノード>.Enumerator enumerator = ノードリスト.GetEnumerator() )\r
535                         {\r
536                                 while( enumerator.MoveNext() )\r
537                                 {\r
538                                         C曲リストノード node = enumerator.Current;\r
539                                         if( node.eノード種別 == C曲リストノード.Eノード種別.BOX )\r
540                                         {\r
541                                                 this.tスコアキャッシュを曲リストに反映する( node.list子リスト );\r
542                                         }\r
543                                         else if( ( node.eノード種別 == C曲リストノード.Eノード種別.SCORE ) || ( node.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) )\r
544                                         {\r
545                                                 Predicate<Cスコア> match = null;\r
546                                                 for( int lv = 0; lv < 5; lv++ )\r
547                                                 {\r
548                                                         if( node.arスコア[ lv ] != null )\r
549                                                         {\r
550                                                                 if( match == null )\r
551                                                                 {\r
552                                                                         match = delegate( Cスコア sc )\r
553                                                                         {\r
554                                                                                 return ( ( sc.ファイル情報.ファイルの絶対パス.Equals( node.arスコア[ lv ].ファイル情報.ファイルの絶対パス )\r
555                                                                                         && sc.ファイル情報.ファイルサイズ.Equals( node.arスコア[ lv ].ファイル情報.ファイルサイズ ) )\r
556                                                                                         && ( sc.ファイル情報.最終更新日時.Equals( node.arスコア[ lv ].ファイル情報.最終更新日時 )\r
557                                                                                         && sc.ScoreIni情報.ファイルサイズ.Equals( node.arスコア[ lv ].ScoreIni情報.ファイルサイズ ) ) )\r
558                                                                                         && sc.ScoreIni情報.最終更新日時.Equals( node.arスコア[ lv ].ScoreIni情報.最終更新日時 );\r
559                                                                         };\r
560                                                                 }\r
561                                                                 int num = this.listSongsDB.FindIndex( match );\r
562                                                                 if( num == -1 )\r
563                                                                 {\r
564                                                                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
565                                                                         {\r
566                                                                                 Trace.TraceInformation( "songs.db に存在しません。({0})", new object[] { node.arスコア[ lv ].ファイル情報.ファイルの絶対パス } );\r
567                                                                         }\r
568                                                                 }\r
569                                                                 else\r
570                                                                 {\r
571                                                                         node.arスコア[ lv ].譜面情報 = this.listSongsDB[ num ].譜面情報;\r
572                                                                         node.arスコア[ lv ].bSongDBにキャッシュがあった = true;\r
573                                                                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
574                                                                         {\r
575                                                                                 Trace.TraceInformation( "songs.db から転記しました。({0})", new object[] { node.arスコア[ lv ].ファイル情報.ファイルの絶対パス } );\r
576                                                                         }\r
577                                                                         this.nスコアキャッシュから反映できたスコア数++;\r
578                                                                         if( node.arスコア[ lv ].ScoreIni情報.最終更新日時 != this.listSongsDB[ num ].ScoreIni情報.最終更新日時 )\r
579                                                                         {\r
580                                                                                 string str = node.arスコア[ lv ].ファイル情報.ファイルの絶対パス + ".score.ini";\r
581                                                                                 try\r
582                                                                                 {\r
583                                                                                         CScoreIni ini = new CScoreIni( str );\r
584                                                                                         ini.t全演奏記録セクションの整合性をチェックし不整合があればリセットする();\r
585                                                                                         for( int i = 0; i < 3; i++ )\r
586                                                                                         {\r
587                                                                                                 int num3 = ( i * 2 ) + 1;\r
588                                                                                                 if( ( ini.stセクション[ num3 ].b演奏にMIDI入力を使用した || ini.stセクション[ num3 ].b演奏にキーボードを使用した ) || ( ini.stセクション[ num3 ].b演奏にジョイパッドを使用した || ini.stセクション[ num3 ].b演奏にマウスを使用した ) )\r
589                                                                                                 {\r
590                                                                                                         node.arスコア[ lv ].譜面情報.最大ランク[ i ] = CScoreIni.tランク値を計算して返す( ini.stセクション[ num3 ] );\r
591                                                                                                 }\r
592                                                                                                 else\r
593                                                                                                 {\r
594                                                                                                         node.arスコア[ lv ].譜面情報.最大ランク[ i ] = 0x63;\r
595                                                                                                 }\r
596                                                                                                 node.arスコア[ lv ].譜面情報.最大スキル[ i ] = ini.stセクション[ num3 ].db演奏型スキル値;\r
597                                                                                                 node.arスコア[ lv ].譜面情報.フルコンボ[ i ] = ini.stセクション[ num3 ].bフルコンボである;\r
598                                                                                         }\r
599                                                                                         node.arスコア[ lv ].譜面情報.演奏回数.Drums = ini.stファイル.PlayCountDrums;\r
600                                                                                         node.arスコア[ lv ].譜面情報.演奏回数.Guitar = ini.stファイル.PlayCountGuitar;\r
601                                                                                         node.arスコア[ lv ].譜面情報.演奏回数.Bass = ini.stファイル.PlayCountBass;\r
602                                                                                         for( int j = 0; j < 5; j++ )\r
603                                                                                         {\r
604                                                                                                 node.arスコア[ lv ].譜面情報.演奏履歴[ j ] = ini.stファイル.History[ j ];\r
605                                                                                         }\r
606                                                                                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
607                                                                                         {\r
608                                                                                                 Trace.TraceInformation( "演奏記録ファイルから HiSkill 情報と演奏履歴を取得しました。({0})", new object[] { str } );\r
609                                                                                         }\r
610                                                                                 }\r
611                                                                                 catch\r
612                                                                                 {\r
613                                                                                         Trace.TraceError( "演奏記録ファイルの読み込みに失敗しました。({0})", new object[] { str } );\r
614                                                                                 }\r
615                                                                         }\r
616                                                                 }\r
617                                                         }\r
618                                                 }\r
619                                         }\r
620                                 }\r
621                         }\r
622                 }\r
623                 private Cスコア tSongsDBからスコアを1つ読み込む( BinaryReader br )\r
624                 {\r
625                         Cスコア cスコア = new Cスコア();\r
626                         cスコア.ファイル情報.ファイルの絶対パス = br.ReadString();\r
627                         cスコア.ファイル情報.フォルダの絶対パス = br.ReadString();\r
628                         cスコア.ファイル情報.最終更新日時 = new DateTime( br.ReadInt64() );\r
629                         cスコア.ファイル情報.ファイルサイズ = br.ReadInt64();\r
630                         cスコア.ScoreIni情報.最終更新日時 = new DateTime( br.ReadInt64() );\r
631                         cスコア.ScoreIni情報.ファイルサイズ = br.ReadInt64();\r
632                         cスコア.譜面情報.タイトル = br.ReadString();\r
633                         cスコア.譜面情報.アーティスト名 = br.ReadString();\r
634                         cスコア.譜面情報.コメント = br.ReadString();\r
635                         cスコア.譜面情報.ジャンル = br.ReadString();\r
636                         cスコア.譜面情報.Preimage = br.ReadString();\r
637                         cスコア.譜面情報.Premovie = br.ReadString();\r
638                         cスコア.譜面情報.Presound = br.ReadString();\r
639                         cスコア.譜面情報.Backgound = br.ReadString();\r
640                         cスコア.譜面情報.レベル.Drums = br.ReadInt32();\r
641                         cスコア.譜面情報.レベル.Guitar = br.ReadInt32();\r
642                         cスコア.譜面情報.レベル.Bass = br.ReadInt32();\r
643                         cスコア.譜面情報.最大ランク.Drums = br.ReadInt32();\r
644                         cスコア.譜面情報.最大ランク.Guitar = br.ReadInt32();\r
645                         cスコア.譜面情報.最大ランク.Bass = br.ReadInt32();\r
646                         cスコア.譜面情報.最大スキル.Drums = br.ReadDouble();\r
647                         cスコア.譜面情報.最大スキル.Guitar = br.ReadDouble();\r
648                         cスコア.譜面情報.最大スキル.Bass = br.ReadDouble();\r
649                         cスコア.譜面情報.フルコンボ.Drums = br.ReadBoolean();\r
650                         cスコア.譜面情報.フルコンボ.Guitar = br.ReadBoolean();\r
651                         cスコア.譜面情報.フルコンボ.Bass = br.ReadBoolean();\r
652                         cスコア.譜面情報.演奏回数.Drums = br.ReadInt32();\r
653                         cスコア.譜面情報.演奏回数.Guitar = br.ReadInt32();\r
654                         cスコア.譜面情報.演奏回数.Bass = br.ReadInt32();\r
655                         cスコア.譜面情報.演奏履歴.行1 = br.ReadString();\r
656                         cスコア.譜面情報.演奏履歴.行2 = br.ReadString();\r
657                         cスコア.譜面情報.演奏履歴.行3 = br.ReadString();\r
658                         cスコア.譜面情報.演奏履歴.行4 = br.ReadString();\r
659                         cスコア.譜面情報.演奏履歴.行5 = br.ReadString();\r
660                         cスコア.譜面情報.レベルを非表示にする = br.ReadBoolean();\r
661                         cスコア.譜面情報.曲種別 = (CDTX.E種別) br.ReadInt32();\r
662                         return cスコア;\r
663                 }\r
664                 //-----------------\r
665                 #endregion\r
666                 #region [ SongsDBになかった曲をファイルから読み込んで反映する ]\r
667                 //-----------------\r
668                 public void tSongsDBになかった曲をファイルから読み込んで反映する()\r
669                 {\r
670                         this.nファイルから反映できたスコア数 = 0;\r
671                         this.tSongsDBになかった曲をファイルから読み込んで反映する( this.list曲ルート );\r
672                 }\r
673                 private void tSongsDBになかった曲をファイルから読み込んで反映する( List<C曲リストノード> ノードリスト )\r
674                 {\r
675                         foreach( C曲リストノード c曲リストノード in ノードリスト )\r
676                         {\r
677                                 if( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX )\r
678                                 {\r
679                                         this.tSongsDBになかった曲をファイルから読み込んで反映する( c曲リストノード.list子リスト );\r
680                                 }\r
681                                 else if( ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE ) || ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) )\r
682                                 {\r
683                                         for( int i = 0; i < 5; i++ )\r
684                                         {\r
685                                                 if( ( c曲リストノード.arスコア[ i ] != null ) && !c曲リストノード.arスコア[ i ].bSongDBにキャッシュがあった )\r
686                                                 {\r
687                                                         string path = c曲リストノード.arスコア[ i ].ファイル情報.ファイルの絶対パス;\r
688                                                         if( File.Exists( path ) )\r
689                                                         {\r
690                                                                 try\r
691                                                                 {\r
692                                                                         CDTX cdtx = new CDTX( c曲リストノード.arスコア[ i ].ファイル情報.ファイルの絶対パス, true );\r
693                                                                         c曲リストノード.arスコア[ i ].譜面情報.タイトル = cdtx.TITLE;\r
694                                                                         c曲リストノード.arスコア[ i ].譜面情報.アーティスト名 = cdtx.ARTIST;\r
695                                                                         c曲リストノード.arスコア[ i ].譜面情報.コメント = cdtx.COMMENT;\r
696                                                                         c曲リストノード.arスコア[ i ].譜面情報.ジャンル = cdtx.GENRE;\r
697                                                                         c曲リストノード.arスコア[ i ].譜面情報.Preimage = cdtx.PREIMAGE;\r
698                                                                         c曲リストノード.arスコア[ i ].譜面情報.Premovie = cdtx.PREMOVIE;\r
699                                                                         c曲リストノード.arスコア[ i ].譜面情報.Presound = cdtx.PREVIEW;\r
700                                                                         c曲リストノード.arスコア[ i ].譜面情報.Backgound = ( ( cdtx.BACKGROUND != null ) && ( cdtx.BACKGROUND.Length > 0 ) ) ? cdtx.BACKGROUND : cdtx.BACKGROUND_GR;\r
701                                                                         c曲リストノード.arスコア[ i ].譜面情報.レベル.Drums = cdtx.LEVEL.Drums;\r
702                                                                         c曲リストノード.arスコア[ i ].譜面情報.レベル.Guitar = cdtx.LEVEL.Guitar;\r
703                                                                         c曲リストノード.arスコア[ i ].譜面情報.レベル.Bass = cdtx.LEVEL.Bass;\r
704                                                                         c曲リストノード.arスコア[ i ].譜面情報.レベルを非表示にする = cdtx.HIDDENLEVEL;\r
705                                                                         c曲リストノード.arスコア[ i ].譜面情報.曲種別 = cdtx.e種別;\r
706                                                                         this.nファイルから反映できたスコア数++;\r
707                                                                         cdtx.On非活性化();\r
708                                                                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
709                                                                         {\r
710                                                                                 StringBuilder builder = new StringBuilder( 0x400 );\r
711                                                                                 builder.Append( string.Format( "曲データファイルから譜面情報を転記しました。({0})", path ) );\r
712                                                                                 builder.Append( "(title=" + c曲リストノード.arスコア[ i ].譜面情報.タイトル );\r
713                                                                                 builder.Append( ", artist=" + c曲リストノード.arスコア[ i ].譜面情報.アーティスト名 );\r
714                                                                                 builder.Append( ", comment=" + c曲リストノード.arスコア[ i ].譜面情報.コメント );\r
715                                                                                 builder.Append( ", genre=" + c曲リストノード.arスコア[ i ].譜面情報.ジャンル );\r
716                                                                                 builder.Append( ", preimage=" + c曲リストノード.arスコア[ i ].譜面情報.Preimage );\r
717                                                                                 builder.Append( ", premovie=" + c曲リストノード.arスコア[ i ].譜面情報.Premovie );\r
718                                                                                 builder.Append( ", presound=" + c曲リストノード.arスコア[ i ].譜面情報.Presound );\r
719                                                                                 builder.Append( ", background=" + c曲リストノード.arスコア[ i ].譜面情報.Backgound );\r
720                                                                                 builder.Append( ", lvDr=" + c曲リストノード.arスコア[ i ].譜面情報.レベル.Drums );\r
721                                                                                 builder.Append( ", lvGt=" + c曲リストノード.arスコア[ i ].譜面情報.レベル.Guitar );\r
722                                                                                 builder.Append( ", lvBs=" + c曲リストノード.arスコア[ i ].譜面情報.レベル.Bass );\r
723                                                                                 builder.Append( ", lvHide=" + c曲リストノード.arスコア[ i ].譜面情報.レベルを非表示にする );\r
724                                                                                 builder.Append( ", type=" + c曲リストノード.arスコア[ i ].譜面情報.曲種別 );\r
725                                                                                 Trace.TraceInformation( builder.ToString() );\r
726                                                                         }\r
727                                                                 }\r
728                                                                 catch( Exception exception )\r
729                                                                 {\r
730                                                                         Trace.TraceError( exception.Message );\r
731                                                                         c曲リストノード.arスコア[ i ] = null;\r
732                                                                         c曲リストノード.nスコア数--;\r
733                                                                         this.n検索されたスコア数--;\r
734                                                                         Trace.TraceError( "曲データファイルの読み込みに失敗しました。({0})", new object[] { path } );\r
735                                                                 }\r
736                                                         }\r
737                                                         string str2 = c曲リストノード.arスコア[ i ].ファイル情報.ファイルの絶対パス + ".score.ini";\r
738                                                         if( File.Exists( str2 ) )\r
739                                                         {\r
740                                                                 try\r
741                                                                 {\r
742                                                                         CScoreIni ini = new CScoreIni( str2 );\r
743                                                                         ini.t全演奏記録セクションの整合性をチェックし不整合があればリセットする();\r
744                                                                         for( int j = 0; j < 3; j++ )\r
745                                                                         {\r
746                                                                                 int num3 = ( j * 2 ) + 1;\r
747                                                                                 if( ( ini.stセクション[ num3 ].b演奏にMIDI入力を使用した || ini.stセクション[ num3 ].b演奏にキーボードを使用した ) || ( ini.stセクション[ num3 ].b演奏にジョイパッドを使用した || ini.stセクション[ num3 ].b演奏にマウスを使用した ) )\r
748                                                                                 {\r
749                                                                                         c曲リストノード.arスコア[ i ].譜面情報.最大ランク[ j ] = CScoreIni.tランク値を計算して返す( ini.stセクション[ num3 ].n全チップ数, ini.stセクション[ num3 ].nPerfect数, ini.stセクション[ num3 ].nGreat数, ini.stセクション[ num3 ].nGood数, ini.stセクション[ num3 ].nPoor数, ini.stセクション[ num3 ].nMiss数 );\r
750                                                                                 }\r
751                                                                                 else\r
752                                                                                 {\r
753                                                                                         c曲リストノード.arスコア[ i ].譜面情報.最大ランク[ j ] = 0x63;\r
754                                                                                 }\r
755                                                                                 c曲リストノード.arスコア[ i ].譜面情報.最大スキル[ j ] = ini.stセクション[ num3 ].db演奏型スキル値;\r
756                                                                                 c曲リストノード.arスコア[ i ].譜面情報.フルコンボ[ j ] = ini.stセクション[ num3 ].bフルコンボである;\r
757                                                                         }\r
758                                                                         c曲リストノード.arスコア[ i ].譜面情報.演奏回数.Drums = ini.stファイル.PlayCountDrums;\r
759                                                                         c曲リストノード.arスコア[ i ].譜面情報.演奏回数.Guitar = ini.stファイル.PlayCountGuitar;\r
760                                                                         c曲リストノード.arスコア[ i ].譜面情報.演奏回数.Bass = ini.stファイル.PlayCountBass;\r
761                                                                         for( int k = 0; k < 5; k++ )\r
762                                                                         {\r
763                                                                                 c曲リストノード.arスコア[ i ].譜面情報.演奏履歴[ k ] = ini.stファイル.History[ k ];\r
764                                                                         }\r
765                                                                 }\r
766                                                                 catch\r
767                                                                 {\r
768                                                                         Trace.TraceError( "演奏記録ファイルの読み込みに失敗しました。[{0}]", new object[] { str2 } );\r
769                                                                 }\r
770                                                         }\r
771                                                 }\r
772                                         }\r
773                                 }\r
774                         }\r
775                 }\r
776                 //-----------------\r
777                 #endregion\r
778                 #region [ 曲リストへ後処理を適用する ]\r
779                 //-----------------\r
780                 public void t曲リストへ後処理を適用する()\r
781                 {\r
782                         this.t曲リストへ後処理を適用する( this.list曲ルート );\r
783                 }\r
784                 private void t曲リストへ後処理を適用する( List<C曲リストノード> ノードリスト )\r
785                 {\r
786                         #region [ リストに1つ以上の曲があるなら RANDOM BOX を入れる ]\r
787                         //-----------------------------\r
788                         if( ノードリスト.Count > 0 )\r
789                         {\r
790                                 C曲リストノード item = new C曲リストノード();\r
791                                 item.eノード種別 = C曲リストノード.Eノード種別.RANDOM;\r
792                                 item.strタイトル = "< RANDOM SELECT >";\r
793                                 item.nスコア数 = 5;\r
794                                 item.r親ノード = ノードリスト[ 0 ].r親ノード;\r
795                                 for( int i = 0; i < 5; i++ )\r
796                                 {\r
797                                         item.arスコア[ i ] = new Cスコア();\r
798                                         item.arスコア[ i ].譜面情報.タイトル = string.Format( "< RANDOM SELECT Lv.{0} >", i + 1 );\r
799                                         item.arスコア[i].譜面情報.コメント =\r
800                                                  (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?\r
801                                                  string.Format("難易度レベル {0} 付近の曲をランダムに選択します。難易度レベルを持たない曲も選択候補となります。", i + 1) :\r
802                                                  string.Format("Random select from the songs which has the level about L{0}. Non-leveled songs may also selected.", i + 1);\r
803                                         item.ar難易度ラベル[ i ] = string.Format( "L{0}", i + 1 );\r
804                                 }\r
805                                 ノードリスト.Add( item );\r
806 \r
807                                 #region [ ログ出力 ]\r
808                                 //-----------------------------\r
809                                 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
810                                 {\r
811                                         StringBuilder builder = new StringBuilder( 0x100 );\r
812                                         builder.Append( string.Format( "nID#{0:D3}", item.nID ) );\r
813                                         if( item.r親ノード != null )\r
814                                         {\r
815                                                 builder.Append( string.Format( "(in#{0:D3}):", item.r親ノード.nID ) );\r
816                                         }\r
817                                         else\r
818                                         {\r
819                                                 builder.Append( "(onRoot):" );\r
820                                         }\r
821                                         builder.Append( " RANDOM" );\r
822                                         Trace.TraceInformation( builder.ToString() );\r
823                                 }\r
824                                 //-----------------------------\r
825                                 #endregion\r
826                         }\r
827                         //-----------------------------\r
828                         #endregion\r
829 \r
830                         // すべてのノードについて…\r
831                         foreach( C曲リストノード c曲リストノード2 in ノードリスト )\r
832                         {\r
833                                 #region [ BOXノードなら子リストに <<BACK を入れ、子リストに後処理を適用する ]\r
834                                 //-----------------------------\r
835                                 if( c曲リストノード2.eノード種別 == C曲リストノード.Eノード種別.BOX )\r
836                                 {\r
837                                         C曲リストノード c曲リストノード3 = new C曲リストノード();\r
838                                         c曲リストノード3.eノード種別 = C曲リストノード.Eノード種別.BACKBOX;\r
839                                         c曲リストノード3.strタイトル = "<< BACK";\r
840                                         c曲リストノード3.nスコア数 = 1;\r
841                                         c曲リストノード3.r親ノード = c曲リストノード2;\r
842                                         c曲リストノード3.arスコア[ 0 ] = new Cスコア();\r
843                                         c曲リストノード3.arスコア[ 0 ].ファイル情報.フォルダの絶対パス = "";\r
844                                         c曲リストノード3.arスコア[ 0 ].譜面情報.タイトル = c曲リストノード3.strタイトル;\r
845                                         c曲リストノード3.arスコア[ 0 ].譜面情報.コメント =\r
846                                                 (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?\r
847                                                 "BOX を出ます。" :\r
848                                                 "Exit from the BOX.";\r
849                                         c曲リストノード2.list子リスト.Insert( 0, c曲リストノード3 );\r
850 \r
851                                         #region [ ログ出力 ]\r
852                                         //-----------------------------\r
853                                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
854                                         {\r
855                                                 StringBuilder builder2 = new StringBuilder( 0x100 );\r
856                                                 builder2.Append( string.Format( "nID#{0:D3}", c曲リストノード3.nID ) );\r
857                                                 if( c曲リストノード3.r親ノード != null )\r
858                                                 {\r
859                                                         builder2.Append( string.Format( "(in#{0:D3}):", c曲リストノード3.r親ノード.nID ) );\r
860                                                 }\r
861                                                 else\r
862                                                 {\r
863                                                         builder2.Append( "(onRoot):" );\r
864                                                 }\r
865                                                 builder2.Append( " BACKBOX" );\r
866                                                 Trace.TraceInformation( builder2.ToString() );\r
867                                         }\r
868                                         //-----------------------------\r
869                                         #endregion\r
870 \r
871                                         this.t曲リストへ後処理を適用する( c曲リストノード2.list子リスト );\r
872                                         continue;\r
873                                 }\r
874                                 //-----------------------------\r
875                                 #endregion\r
876 \r
877                                 #region [ ノードにタイトルがないなら、最初に見つけたスコアのタイトルを設定する ]\r
878                                 //-----------------------------\r
879                                 if( string.IsNullOrEmpty( c曲リストノード2.strタイトル ) )\r
880                                 {\r
881                                         for( int j = 0; j < 5; j++ )\r
882                                         {\r
883                                                 if( ( c曲リストノード2.arスコア[ j ] != null ) && !string.IsNullOrEmpty( c曲リストノード2.arスコア[ j ].譜面情報.タイトル ) )\r
884                                                 {\r
885                                                         c曲リストノード2.strタイトル = c曲リストノード2.arスコア[ j ].譜面情報.タイトル;\r
886 \r
887                                                         if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )\r
888                                                                 Trace.TraceInformation( "タイトルを設定しました。(nID#{0:D3}, title={1})", new object[] { c曲リストノード2.nID, c曲リストノード2.strタイトル } );\r
889 \r
890                                                         break;\r
891                                                 }\r
892                                         }\r
893                                 }\r
894                                 //-----------------------------\r
895                                 #endregion\r
896                         }\r
897 \r
898                         #region [ ノードをソートする ]\r
899                         //-----------------------------\r
900                         this.t曲リストのソート1_絶対パス順( ノードリスト );\r
901                         //-----------------------------\r
902                         #endregion\r
903                 }\r
904                 //-----------------\r
905                 #endregion\r
906                 #region [ スコアキャッシュをSongsDBに出力する ]\r
907                 //-----------------\r
908                 public void tスコアキャッシュをSongsDBに出力する( string SongsDBファイル名 )\r
909                 {\r
910                         this.nSongsDBへ出力できたスコア数 = 0;\r
911                         try\r
912                         {\r
913                                 BinaryWriter bw = new BinaryWriter( new FileStream( SongsDBファイル名, FileMode.Create, FileAccess.Write ) );\r
914                                 bw.Write( "SongsDB2" );\r
915                                 this.tSongsDBにリストを1つ出力する( bw, this.list曲ルート );\r
916                                 bw.Close();\r
917                         }\r
918                         catch\r
919                         {\r
920                                 Trace.TraceError( "songs.dbの出力に失敗しました。" );\r
921                         }\r
922                 }\r
923                 private void tSongsDBにノードを1つ出力する( BinaryWriter bw, C曲リストノード node )\r
924                 {\r
925                         for( int i = 0; i < 5; i++ )\r
926                         {\r
927                                 if( node.arスコア[ i ] != null )\r
928                                 {\r
929                                         bw.Write( node.arスコア[ i ].ファイル情報.ファイルの絶対パス );\r
930                                         bw.Write( node.arスコア[ i ].ファイル情報.フォルダの絶対パス );\r
931                                         bw.Write( node.arスコア[ i ].ファイル情報.最終更新日時.Ticks );\r
932                                         bw.Write( node.arスコア[ i ].ファイル情報.ファイルサイズ );\r
933                                         bw.Write( node.arスコア[ i ].ScoreIni情報.最終更新日時.Ticks );\r
934                                         bw.Write( node.arスコア[ i ].ScoreIni情報.ファイルサイズ );\r
935                                         bw.Write( node.arスコア[ i ].譜面情報.タイトル );\r
936                                         bw.Write( node.arスコア[ i ].譜面情報.アーティスト名 );\r
937                                         bw.Write( node.arスコア[ i ].譜面情報.コメント );\r
938                                         bw.Write( node.arスコア[ i ].譜面情報.ジャンル );\r
939                                         bw.Write( node.arスコア[ i ].譜面情報.Preimage );\r
940                                         bw.Write( node.arスコア[ i ].譜面情報.Premovie );\r
941                                         bw.Write( node.arスコア[ i ].譜面情報.Presound );\r
942                                         bw.Write( node.arスコア[ i ].譜面情報.Backgound );\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 ].譜面情報.最大ランク.Drums );\r
947                                         bw.Write( node.arスコア[ i ].譜面情報.最大ランク.Guitar );\r
948                                         bw.Write( node.arスコア[ i ].譜面情報.最大ランク.Bass );\r
949                                         bw.Write( node.arスコア[ i ].譜面情報.最大スキル.Drums );\r
950                                         bw.Write( node.arスコア[ i ].譜面情報.最大スキル.Guitar );\r
951                                         bw.Write( node.arスコア[ i ].譜面情報.最大スキル.Bass );\r
952                                         bw.Write( node.arスコア[ i ].譜面情報.フルコンボ.Drums );\r
953                                         bw.Write( node.arスコア[ i ].譜面情報.フルコンボ.Guitar );\r
954                                         bw.Write( node.arスコア[ i ].譜面情報.フルコンボ.Bass );\r
955                                         bw.Write( node.arスコア[ i ].譜面情報.演奏回数.Drums );\r
956                                         bw.Write( node.arスコア[ i ].譜面情報.演奏回数.Guitar );\r
957                                         bw.Write( node.arスコア[ i ].譜面情報.演奏回数.Bass );\r
958                                         bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行1 );\r
959                                         bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行2 );\r
960                                         bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行3 );\r
961                                         bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行4 );\r
962                                         bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行5 );\r
963                                         bw.Write( node.arスコア[ i ].譜面情報.レベルを非表示にする );\r
964                                         bw.Write( (int) node.arスコア[ i ].譜面情報.曲種別 );\r
965                                         this.nSongsDBへ出力できたスコア数++;\r
966                                 }\r
967                         }\r
968                 }\r
969                 private void tSongsDBにリストを1つ出力する( BinaryWriter bw, List<C曲リストノード> list )\r
970                 {\r
971                         foreach( C曲リストノード c曲リストノード in list )\r
972                         {\r
973                                 if( ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE ) || ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) )\r
974                                 {\r
975                                         this.tSongsDBにノードを1つ出力する( bw, c曲リストノード );\r
976                                 }\r
977                                 if( c曲リストノード.list子リスト != null )\r
978                                 {\r
979                                         this.tSongsDBにリストを1つ出力する( bw, c曲リストノード.list子リスト );\r
980                                 }\r
981                         }\r
982                 }\r
983                 //-----------------\r
984                 #endregion\r
985 \r
986                 #region [ 曲リストソート ]\r
987                 //-----------------\r
988                 public void t曲リストのソート1_絶対パス順( List<C曲リストノード> ノードリスト )\r
989                 {\r
990                         ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )\r
991                         {\r
992                                 if( n1 == n2 )\r
993                                 {\r
994                                         return 0;\r
995                                 }\r
996                                 int num = this.t比較0_共通( n1, n2 );\r
997                                 if( num != 0 )\r
998                                 {\r
999                                         return num;\r
1000                                 }\r
1001                                 if( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )\r
1002                                 {\r
1003                                         return n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );\r
1004                                 }\r
1005                                 string str = "";\r
1006                                 if( string.IsNullOrEmpty( n1.pathSetDefの絶対パス ) )\r
1007                                 {\r
1008                                         for( int i = 0; i < 5; i++ )\r
1009                                         {\r
1010                                                 if( n1.arスコア[ i ] != null )\r
1011                                                 {\r
1012                                                         str = n1.arスコア[ i ].ファイル情報.ファイルの絶対パス;\r
1013                                                         if( str == null )\r
1014                                                         {\r
1015                                                                 str = "";\r
1016                                                         }\r
1017                                                         break;\r
1018                                                 }\r
1019                                         }\r
1020                                 }\r
1021                                 else\r
1022                                 {\r
1023                                         str = n1.pathSetDefの絶対パス + n1.SetDefのブロック番号.ToString( "00" );\r
1024                                 }\r
1025                                 string strB = "";\r
1026                                 if( string.IsNullOrEmpty( n2.pathSetDefの絶対パス ) )\r
1027                                 {\r
1028                                         for( int j = 0; j < 5; j++ )\r
1029                                         {\r
1030                                                 if( n2.arスコア[ j ] != null )\r
1031                                                 {\r
1032                                                         strB = n2.arスコア[ j ].ファイル情報.ファイルの絶対パス;\r
1033                                                         if( strB == null )\r
1034                                                         {\r
1035                                                                 strB = "";\r
1036                                                         }\r
1037                                                         break;\r
1038                                                 }\r
1039                                         }\r
1040                                 }\r
1041                                 else\r
1042                                 {\r
1043                                         strB = n2.pathSetDefの絶対パス + n2.SetDefのブロック番号.ToString( "00" );\r
1044                                 }\r
1045                                 return str.CompareTo( strB );\r
1046                         } );\r
1047                         foreach( C曲リストノード c曲リストノード in ノードリスト )\r
1048                         {\r
1049                                 if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )\r
1050                                 {\r
1051                                         this.t曲リストのソート1_絶対パス順( c曲リストノード.list子リスト );\r
1052                                 }\r
1053                         }\r
1054                 }\r
1055                 public void t曲リストのソート2_タイトル順( List<C曲リストノード> ノードリスト )\r
1056                 {\r
1057                         ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )\r
1058                         {\r
1059                                 if( n1 == n2 )\r
1060                                 {\r
1061                                         return 0;\r
1062                                 }\r
1063                                 int num = this.t比較0_共通( n1, n2 );\r
1064                                 if( num != 0 )\r
1065                                 {\r
1066                                         return num;\r
1067                                 }\r
1068                                 return n1.strタイトル.CompareTo( n2.strタイトル );\r
1069                         } );\r
1070                         foreach( C曲リストノード c曲リストノード in ノードリスト )\r
1071                         {\r
1072                                 if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )\r
1073                                 {\r
1074                                         this.t曲リストのソート2_タイトル順( c曲リストノード.list子リスト );\r
1075                                 }\r
1076                         }\r
1077                 }\r
1078                 public void t曲リストのソート3_演奏回数の多い順( List<C曲リストノード> ノードリスト, E楽器パート part )\r
1079                 {\r
1080                         if( part != E楽器パート.UNKNOWN )\r
1081                         {\r
1082                                 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )\r
1083                                 {\r
1084                                         if( n1 == n2 )\r
1085                                         {\r
1086                                                 return 0;\r
1087                                         }\r
1088                                         int num = 0;\r
1089                                         num = this.t比較0_共通( n1, n2 );\r
1090                                         if( num != 0 )\r
1091                                         {\r
1092                                                 return num;\r
1093                                         }\r
1094                                         if( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )\r
1095                                         {\r
1096                                                 return n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );\r
1097                                         }\r
1098                                         int num2 = 0;\r
1099                                         int num3 = 0;\r
1100                                         for( int i = 0; i < 5; i++ )\r
1101                                         {\r
1102                                                 if( n1.arスコア[ i ] != null )\r
1103                                                 {\r
1104                                                         num2 += n1.arスコア[ i ].譜面情報.演奏回数[ (int) part ];\r
1105                                                 }\r
1106                                                 if( n2.arスコア[ i ] != null )\r
1107                                                 {\r
1108                                                         num3 += n2.arスコア[ i ].譜面情報.演奏回数[ (int) part ];\r
1109                                                 }\r
1110                                         }\r
1111                                         num = num3 - num2;\r
1112                                         if( num != 0 )\r
1113                                         {\r
1114                                                 return num;\r
1115                                         }\r
1116                                         return n1.strタイトル.CompareTo( n2.strタイトル );\r
1117                                 } );\r
1118                                 foreach( C曲リストノード c曲リストノード in ノードリスト )\r
1119                                 {\r
1120                                         if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )\r
1121                                         {\r
1122                                                 this.t曲リストのソート3_演奏回数の多い順( c曲リストノード.list子リスト, part );\r
1123                                         }\r
1124                                 }\r
1125                         }\r
1126                 }\r
1127                 //-----------------\r
1128                 #endregion\r
1129 \r
1130 \r
1131                 // その他\r
1132 \r
1133                 #region [ private ]\r
1134                 //-----------------\r
1135                 private const string SONGSDB_VERSION = "SongsDB2";\r
1136 \r
1137                 private int t比較0_共通( C曲リストノード n1, C曲リストノード n2 )\r
1138                 {\r
1139                         if( n1.eノード種別 == C曲リストノード.Eノード種別.BACKBOX )\r
1140                         {\r
1141                                 return -1;\r
1142                         }\r
1143                         if( n2.eノード種別 == C曲リストノード.Eノード種別.BACKBOX )\r
1144                         {\r
1145                                 return 1;\r
1146                         }\r
1147                         if( n1.eノード種別 == C曲リストノード.Eノード種別.RANDOM )\r
1148                         {\r
1149                                 return 1;\r
1150                         }\r
1151                         if( n2.eノード種別 == C曲リストノード.Eノード種別.RANDOM )\r
1152                         {\r
1153                                 return -1;\r
1154                         }\r
1155                         if( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 != C曲リストノード.Eノード種別.BOX ) )\r
1156                         {\r
1157                                 return -1;\r
1158                         }\r
1159                         if( ( n1.eノード種別 != C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )\r
1160                         {\r
1161                                 return 1;\r
1162                         }\r
1163                         return 0;\r
1164                 }\r
1165                 //-----------------\r
1166                 #endregion\r
1167         }\r
1168 }\r