2 using System.Collections.Generic;
\r
3 using System.Globalization;
\r
5 using System.Diagnostics;
\r
7 using System.Drawing;
\r
11 internal class CSongs管理
\r
15 public int nSongsDBから取得できたスコア数
\r
20 public int nSongsDBへ出力できたスコア数
\r
25 public int nスコアキャッシュから反映できたスコア数
\r
30 public int nファイルから反映できたスコア数
\r
35 public int n検索されたスコア数
\r
40 public int n検索された曲ノード数
\r
45 public List<Cスコア> listSongsDB; // songs.dbから構築されるlist
\r
46 public List<C曲リストノード> list曲ルート; // 起動時にフォルダ検索して構築されるlist
\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
62 #region [ SongsDB(songs.db) を読み込む ]
\r
64 public void tSongsDBを読み込む( string SongsDBファイル名 )
\r
66 this.nSongsDBから取得できたスコア数 = 0;
\r
67 if( File.Exists( SongsDBファイル名 ) )
\r
69 BinaryReader br = null;
\r
72 br = new BinaryReader( File.OpenRead( SongsDBファイル名 ) );
\r
73 if( !br.ReadString().Equals( "SongsDB2" ) )
\r
75 throw new InvalidDataException( "ヘッダが異なります。" );
\r
77 this.listSongsDB = new List<Cスコア>();
\r
83 Cスコア item = this.tSongsDBからスコアを1つ読み込む( br );
\r
84 this.listSongsDB.Add( item );
\r
85 this.nSongsDBから取得できたスコア数++;
\r
87 catch( EndOfStreamException )
\r
100 //-----------------
\r
102 #region [ 曲を検索してリストを作成する ]
\r
103 //-----------------
\r
104 public void t曲を検索してリストを作成する( string str基点フォルダ, bool b子BOXへ再帰する )
\r
106 this.t曲を検索してリストを作成する( str基点フォルダ, b子BOXへ再帰する, this.list曲ルート, null );
\r
108 private void t曲を検索してリストを作成する( string str基点フォルダ, bool b子BOXへ再帰する, List<C曲リストノード> listノードリスト, C曲リストノード node親 )
\r
110 if( !str基点フォルダ.EndsWith( @"\" ) )
\r
111 str基点フォルダ = str基点フォルダ + @"\";
\r
113 DirectoryInfo info = new DirectoryInfo( str基点フォルダ );
\r
115 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
116 Trace.TraceInformation( "基点フォルダ: " + str基点フォルダ );
\r
118 #region [ a.フォルダ内に set.def が存在する場合 → set.def からノード作成]
\r
119 //-----------------------------
\r
120 string path = str基点フォルダ + "set.def";
\r
121 if( File.Exists( path ) )
\r
123 CSetDef def = new CSetDef( path );
\r
124 new FileInfo( path );
\r
125 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
127 Trace.TraceInformation( "set.def検出 : {0}", new object[] { path } );
\r
132 for( int i = 0; i < def.blocks.Count; i++ )
\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
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
146 if( !string.IsNullOrEmpty( block.File[ j ] ) )
\r
148 string str2 = str基点フォルダ + block.File[ j ];
\r
149 if( File.Exists( str2 ) )
\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
161 FileInfo info3 = new FileInfo( str3 );
\r
162 item.arスコア[ j ].ScoreIni情報.ファイルサイズ = info3.Length;
\r
163 item.arスコア[ j ].ScoreIni情報.最終更新日時 = info3.LastWriteTime;
\r
170 item.arスコア[ j ] = null;
\r
174 if( item.nスコア数 > 0 )
\r
176 listノードリスト.Add( item );
\r
177 this.n検索された曲ノード数++;
\r
178 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\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
184 builder.Append( string.Format( "(in#{0:D3}):", item.r親ノード.nID ) );
\r
188 builder.Append( "(onRoot):" );
\r
190 if( ( item.strタイトル != null ) && ( item.strタイトル.Length > 0 ) )
\r
192 builder.Append( " SONG, Title=" + item.strタイトル );
\r
194 if( ( item.strジャンル != null ) && ( item.strジャンル.Length > 0 ) )
\r
196 builder.Append( ", Genre=" + item.strジャンル );
\r
198 if( item.col文字色 != Color.White )
\r
200 builder.Append( ", FontColor=" + item.col文字色 );
\r
202 Trace.TraceInformation( builder.ToString() );
\r
206 for( int k = 0; k < 5; k++ )
\r
208 if( item.arスコア[ k ] != null )
\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
231 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
237 //-----------------------------
\r
240 #region [ b.フォルダ内に set.def が存在しない場合 → 個別ファイルからノード作成 ]
\r
241 //-----------------------------
\r
244 foreach( FileInfo info4 in info.GetFiles() )
\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
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
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
266 listノードリスト.Add( c曲リストノード2 );
\r
267 this.n検索された曲ノード数++;
\r
268 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\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
277 builder2.Append( string.Format( "(in#{0:D3}):", c曲リストノード2.r親ノード.nID ) );
\r
281 builder2.Append( "(onRoot):" );
\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
294 else if( !str4.Equals( ".mid" ) )
\r
296 str4.Equals( ".smf" );
\r
300 //-----------------------------
\r
303 foreach( DirectoryInfo info6 in info.GetDirectories() )
\r
305 #region [ a. "dtxfiles." で始まるフォルダの場合 ]
\r
306 //-----------------------------
\r
307 if( info6.Name.ToLower().StartsWith( "dtxfiles." ) )
\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
322 "Enter into the BOX.";
\r
323 listノードリスト.Add(c曲リストノード3);
\r
324 if( File.Exists( info6.FullName + @"\box.def" ) )
\r
326 CBoxDef def2 = new CBoxDef( info6.FullName + @"\box.def" );
\r
327 if( ( def2.Title != null ) && ( def2.Title.Length > 0 ) )
\r
329 c曲リストノード3.strタイトル = def2.Title;
\r
331 if( ( def2.Genre != null ) && ( def2.Genre.Length > 0 ) )
\r
333 c曲リストノード3.strジャンル = def2.Genre;
\r
335 if( def2.Color != Color.White )
\r
337 c曲リストノード3.col文字色 = def2.Color;
\r
339 if( ( def2.Artist != null ) && ( def2.Artist.Length > 0 ) )
\r
341 c曲リストノード3.arスコア[ 0 ].譜面情報.アーティスト名 = def2.Artist;
\r
343 if( ( def2.Comment != null ) && ( def2.Comment.Length > 0 ) )
\r
345 c曲リストノード3.arスコア[ 0 ].譜面情報.コメント = def2.Comment;
\r
347 if( ( def2.Preimage != null ) && ( def2.Preimage.Length > 0 ) )
\r
349 c曲リストノード3.arスコア[ 0 ].譜面情報.Preimage = def2.Preimage;
\r
351 if( ( def2.Premovie != null ) && ( def2.Premovie.Length > 0 ) )
\r
353 c曲リストノード3.arスコア[ 0 ].譜面情報.Premovie = def2.Premovie;
\r
355 if( ( def2.Presound != null ) && ( def2.Presound.Length > 0 ) )
\r
357 c曲リストノード3.arスコア[ 0 ].譜面情報.Presound = def2.Presound;
\r
359 if( def2.PerfectRange >= 0 )
\r
361 c曲リストノード3.nPerfect範囲ms = def2.PerfectRange;
\r
363 if( def2.GreatRange >= 0 )
\r
365 c曲リストノード3.nGreat範囲ms = def2.GreatRange;
\r
367 if( def2.GoodRange >= 0 )
\r
369 c曲リストノード3.nGood範囲ms = def2.GoodRange;
\r
371 if( def2.PoorRange >= 0 )
\r
373 c曲リストノード3.nPoor範囲ms = def2.PoorRange;
\r
376 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\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
385 builder3.Append( string.Format( "(in#{0:D3}):", c曲リストノード3.r親ノード.nID ) );
\r
389 builder3.Append( "(onRoot):" );
\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
403 this.t曲を検索してリストを作成する( info6.FullName + @"\", b子BOXへ再帰する, c曲リストノード3.list子リスト, c曲リストノード3 );
\r
406 //-----------------------------
\r
409 #region [ b.box.def を含むフォルダの場合 ]
\r
410 //-----------------------------
\r
411 else if( File.Exists( info6.FullName + @"\box.def" ) )
\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
439 Trace.TraceInformation( "box.def検出 : {0}", new object[] { info6.FullName + @"\box.def" } );
\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
447 builder4.Append( string.Format( "(in#{0:D3}):", c曲リストノード4.r親ノード.nID ) );
\r
451 builder4.Append( "(onRoot):" );
\r
453 builder4.Append( "BOX, Title=" + c曲リストノード4.strタイトル );
\r
454 if( ( c曲リストノード4.strジャンル != null ) && ( c曲リストノード4.strジャンル.Length > 0 ) )
\r
456 builder4.Append( ", Genre=" + c曲リストノード4.strジャンル );
\r
458 if( ( c曲リストノード4.arスコア[ 0 ].譜面情報.アーティスト名 != null ) && ( c曲リストノード4.arスコア[ 0 ].譜面情報.アーティスト名.Length > 0 ) )
\r
460 builder4.Append( ", Artist=" + c曲リストノード4.arスコア[ 0 ].譜面情報.アーティスト名 );
\r
462 if( ( c曲リストノード4.arスコア[ 0 ].譜面情報.コメント != null ) && ( c曲リストノード4.arスコア[ 0 ].譜面情報.コメント.Length > 0 ) )
\r
464 builder4.Append( ", Comment=" + c曲リストノード4.arスコア[ 0 ].譜面情報.コメント );
\r
466 if( ( c曲リストノード4.arスコア[ 0 ].譜面情報.Preimage != null ) && ( c曲リストノード4.arスコア[ 0 ].譜面情報.Preimage.Length > 0 ) )
\r
468 builder4.Append( ", Preimage=" + c曲リストノード4.arスコア[ 0 ].譜面情報.Preimage );
\r
470 if( ( c曲リストノード4.arスコア[ 0 ].譜面情報.Premovie != null ) && ( c曲リストノード4.arスコア[ 0 ].譜面情報.Premovie.Length > 0 ) )
\r
472 builder4.Append( ", Premovie=" + c曲リストノード4.arスコア[ 0 ].譜面情報.Premovie );
\r
474 if( ( c曲リストノード4.arスコア[ 0 ].譜面情報.Presound != null ) && ( c曲リストノード4.arスコア[ 0 ].譜面情報.Presound.Length > 0 ) )
\r
476 builder4.Append( ", Presound=" + c曲リストノード4.arスコア[ 0 ].譜面情報.Presound );
\r
478 if( c曲リストノード4.col文字色 != ColorTranslator.FromHtml( "White" ) )
\r
480 builder4.Append( ", FontColor=" + c曲リストノード4.col文字色 );
\r
482 if( c曲リストノード4.nPerfect範囲ms != -1 )
\r
484 builder4.Append( ", Perfect=" + c曲リストノード4.nPerfect範囲ms + "ms" );
\r
486 if( c曲リストノード4.nGreat範囲ms != -1 )
\r
488 builder4.Append( ", Great=" + c曲リストノード4.nGreat範囲ms + "ms" );
\r
490 if( c曲リストノード4.nGood範囲ms != -1 )
\r
492 builder4.Append( ", Good=" + c曲リストノード4.nGood範囲ms + "ms" );
\r
494 if( c曲リストノード4.nPoor範囲ms != -1 )
\r
496 builder4.Append( ", Poor=" + c曲リストノード4.nPoor範囲ms + "ms" );
\r
498 Trace.TraceInformation( builder4.ToString() );
\r
507 this.t曲を検索してリストを作成する( info6.FullName + @"\", b子BOXへ再帰する, c曲リストノード4.list子リスト, c曲リストノード4 );
\r
510 //-----------------------------
\r
513 #region [ c.通常フォルダの場合 ]
\r
514 //-----------------------------
\r
517 this.t曲を検索してリストを作成する( info6.FullName + @"\", b子BOXへ再帰する, listノードリスト, node親 );
\r
519 //-----------------------------
\r
523 //-----------------
\r
525 #region [ スコアキャッシュを曲リストに反映する ]
\r
526 //-----------------
\r
527 public void tスコアキャッシュを曲リストに反映する()
\r
529 this.nスコアキャッシュから反映できたスコア数 = 0;
\r
530 this.tスコアキャッシュを曲リストに反映する( this.list曲ルート );
\r
532 private void tスコアキャッシュを曲リストに反映する( List<C曲リストノード> ノードリスト )
\r
534 using( List<C曲リストノード>.Enumerator enumerator = ノードリスト.GetEnumerator() )
\r
536 while( enumerator.MoveNext() )
\r
538 C曲リストノード node = enumerator.Current;
\r
539 if( node.eノード種別 == C曲リストノード.Eノード種別.BOX )
\r
541 this.tスコアキャッシュを曲リストに反映する( node.list子リスト );
\r
543 else if( ( node.eノード種別 == C曲リストノード.Eノード種別.SCORE ) || ( node.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) )
\r
545 Predicate<Cスコア> match = null;
\r
546 for( int lv = 0; lv < 5; lv++ )
\r
548 if( node.arスコア[ lv ] != null )
\r
550 if( match == null )
\r
552 match = delegate( Cスコア sc )
\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
561 int num = this.listSongsDB.FindIndex( match );
\r
564 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
566 Trace.TraceInformation( "songs.db に存在しません。({0})", new object[] { node.arスコア[ lv ].ファイル情報.ファイルの絶対パス } );
\r
571 node.arスコア[ lv ].譜面情報 = this.listSongsDB[ num ].譜面情報;
\r
572 node.arスコア[ lv ].bSongDBにキャッシュがあった = true;
\r
573 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
575 Trace.TraceInformation( "songs.db から転記しました。({0})", new object[] { node.arスコア[ lv ].ファイル情報.ファイルの絶対パス } );
\r
577 this.nスコアキャッシュから反映できたスコア数++;
\r
578 if( node.arスコア[ lv ].ScoreIni情報.最終更新日時 != this.listSongsDB[ num ].ScoreIni情報.最終更新日時 )
\r
580 string str = node.arスコア[ lv ].ファイル情報.ファイルの絶対パス + ".score.ini";
\r
583 CScoreIni ini = new CScoreIni( str );
\r
584 ini.t全演奏記録セクションの整合性をチェックし不整合があればリセットする();
\r
585 for( int i = 0; i < 3; i++ )
\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
590 node.arスコア[ lv ].譜面情報.最大ランク[ i ] = CScoreIni.tランク値を計算して返す( ini.stセクション[ num3 ] );
\r
594 node.arスコア[ lv ].譜面情報.最大ランク[ i ] = 0x63;
\r
596 node.arスコア[ lv ].譜面情報.最大スキル[ i ] = ini.stセクション[ num3 ].db演奏型スキル値;
\r
597 node.arスコア[ lv ].譜面情報.フルコンボ[ i ] = ini.stセクション[ num3 ].bフルコンボである;
\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
604 node.arスコア[ lv ].譜面情報.演奏履歴[ j ] = ini.stファイル.History[ j ];
\r
606 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
608 Trace.TraceInformation( "演奏記録ファイルから HiSkill 情報と演奏履歴を取得しました。({0})", new object[] { str } );
\r
613 Trace.TraceError( "演奏記録ファイルの読み込みに失敗しました。({0})", new object[] { str } );
\r
623 private Cスコア tSongsDBからスコアを1つ読み込む( BinaryReader br )
\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
664 //-----------------
\r
666 #region [ SongsDBになかった曲をファイルから読み込んで反映する ]
\r
667 //-----------------
\r
668 public void tSongsDBになかった曲をファイルから読み込んで反映する()
\r
670 this.nファイルから反映できたスコア数 = 0;
\r
671 this.tSongsDBになかった曲をファイルから読み込んで反映する( this.list曲ルート );
\r
673 private void tSongsDBになかった曲をファイルから読み込んで反映する( List<C曲リストノード> ノードリスト )
\r
675 foreach( C曲リストノード c曲リストノード in ノードリスト )
\r
677 if( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX )
\r
679 this.tSongsDBになかった曲をファイルから読み込んで反映する( c曲リストノード.list子リスト );
\r
681 else if( ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE ) || ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) )
\r
683 for( int i = 0; i < 5; i++ )
\r
685 if( ( c曲リストノード.arスコア[ i ] != null ) && !c曲リストノード.arスコア[ i ].bSongDBにキャッシュがあった )
\r
687 string path = c曲リストノード.arスコア[ i ].ファイル情報.ファイルの絶対パス;
\r
688 if( File.Exists( path ) )
\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
708 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\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
728 catch( Exception exception )
\r
730 Trace.TraceError( exception.Message );
\r
731 c曲リストノード.arスコア[ i ] = null;
\r
734 Trace.TraceError( "曲データファイルの読み込みに失敗しました。({0})", new object[] { path } );
\r
737 string str2 = c曲リストノード.arスコア[ i ].ファイル情報.ファイルの絶対パス + ".score.ini";
\r
738 if( File.Exists( str2 ) )
\r
742 CScoreIni ini = new CScoreIni( str2 );
\r
743 ini.t全演奏記録セクションの整合性をチェックし不整合があればリセットする();
\r
744 for( int j = 0; j < 3; j++ )
\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
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
753 c曲リストノード.arスコア[ i ].譜面情報.最大ランク[ j ] = 0x63;
\r
755 c曲リストノード.arスコア[ i ].譜面情報.最大スキル[ j ] = ini.stセクション[ num3 ].db演奏型スキル値;
\r
756 c曲リストノード.arスコア[ i ].譜面情報.フルコンボ[ j ] = ini.stセクション[ num3 ].bフルコンボである;
\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
763 c曲リストノード.arスコア[ i ].譜面情報.演奏履歴[ k ] = ini.stファイル.History[ k ];
\r
768 Trace.TraceError( "演奏記録ファイルの読み込みに失敗しました。[{0}]", new object[] { str2 } );
\r
776 //-----------------
\r
778 #region [ 曲リストへ後処理を適用する ]
\r
779 //-----------------
\r
780 public void t曲リストへ後処理を適用する()
\r
782 this.t曲リストへ後処理を適用する( this.list曲ルート );
\r
784 private void t曲リストへ後処理を適用する( List<C曲リストノード> ノードリスト )
\r
786 #region [ リストに1つ以上の曲があるなら RANDOM BOX を入れる ]
\r
787 //-----------------------------
\r
788 if( ノードリスト.Count > 0 )
\r
790 C曲リストノード item = new C曲リストノード();
\r
791 item.eノード種別 = C曲リストノード.Eノード種別.RANDOM;
\r
792 item.strタイトル = "< RANDOM SELECT >";
\r
794 item.r親ノード = ノードリスト[ 0 ].r親ノード;
\r
795 for( int i = 0; i < 5; i++ )
\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
805 ノードリスト.Add( item );
\r
808 //-----------------------------
\r
809 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\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
815 builder.Append( string.Format( "(in#{0:D3}):", item.r親ノード.nID ) );
\r
819 builder.Append( "(onRoot):" );
\r
821 builder.Append( " RANDOM" );
\r
822 Trace.TraceInformation( builder.ToString() );
\r
824 //-----------------------------
\r
827 //-----------------------------
\r
831 foreach( C曲リストノード c曲リストノード2 in ノードリスト )
\r
833 #region [ BOXノードなら子リストに <<BACK を入れ、子リストに後処理を適用する ]
\r
834 //-----------------------------
\r
835 if( c曲リストノード2.eノード種別 == C曲リストノード.Eノード種別.BOX )
\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
848 "Exit from the BOX.";
\r
849 c曲リストノード2.list子リスト.Insert( 0, c曲リストノード3 );
\r
852 //-----------------------------
\r
853 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\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
859 builder2.Append( string.Format( "(in#{0:D3}):", c曲リストノード3.r親ノード.nID ) );
\r
863 builder2.Append( "(onRoot):" );
\r
865 builder2.Append( " BACKBOX" );
\r
866 Trace.TraceInformation( builder2.ToString() );
\r
868 //-----------------------------
\r
871 this.t曲リストへ後処理を適用する( c曲リストノード2.list子リスト );
\r
874 //-----------------------------
\r
877 #region [ ノードにタイトルがないなら、最初に見つけたスコアのタイトルを設定する ]
\r
878 //-----------------------------
\r
879 if( string.IsNullOrEmpty( c曲リストノード2.strタイトル ) )
\r
881 for( int j = 0; j < 5; j++ )
\r
883 if( ( c曲リストノード2.arスコア[ j ] != null ) && !string.IsNullOrEmpty( c曲リストノード2.arスコア[ j ].譜面情報.タイトル ) )
\r
885 c曲リストノード2.strタイトル = c曲リストノード2.arスコア[ j ].譜面情報.タイトル;
\r
887 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
888 Trace.TraceInformation( "タイトルを設定しました。(nID#{0:D3}, title={1})", new object[] { c曲リストノード2.nID, c曲リストノード2.strタイトル } );
\r
894 //-----------------------------
\r
898 #region [ ノードをソートする ]
\r
899 //-----------------------------
\r
900 this.t曲リストのソート1_絶対パス順( ノードリスト );
\r
901 //-----------------------------
\r
904 //-----------------
\r
906 #region [ スコアキャッシュをSongsDBに出力する ]
\r
907 //-----------------
\r
908 public void tスコアキャッシュをSongsDBに出力する( string SongsDBファイル名 )
\r
910 this.nSongsDBへ出力できたスコア数 = 0;
\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
920 Trace.TraceError( "songs.dbの出力に失敗しました。" );
\r
923 private void tSongsDBにノードを1つ出力する( BinaryWriter bw, C曲リストノード node )
\r
925 for( int i = 0; i < 5; i++ )
\r
927 if( node.arスコア[ i ] != null )
\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
969 private void tSongsDBにリストを1つ出力する( BinaryWriter bw, List<C曲リストノード> list )
\r
971 foreach( C曲リストノード c曲リストノード in list )
\r
973 if( ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE ) || ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) )
\r
975 this.tSongsDBにノードを1つ出力する( bw, c曲リストノード );
\r
977 if( c曲リストノード.list子リスト != null )
\r
979 this.tSongsDBにリストを1つ出力する( bw, c曲リストノード.list子リスト );
\r
983 //-----------------
\r
986 #region [ 曲リストソート ]
\r
987 //-----------------
\r
988 public void t曲リストのソート1_絶対パス順( List<C曲リストノード> ノードリスト )
\r
990 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
996 int num = this.t比較0_共通( n1, n2 );
\r
1001 if( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1003 return n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1006 if( string.IsNullOrEmpty( n1.pathSetDefの絶対パス ) )
\r
1008 for( int i = 0; i < 5; i++ )
\r
1010 if( n1.arスコア[ i ] != null )
\r
1012 str = n1.arスコア[ i ].ファイル情報.ファイルの絶対パス;
\r
1023 str = n1.pathSetDefの絶対パス + n1.SetDefのブロック番号.ToString( "00" );
\r
1026 if( string.IsNullOrEmpty( n2.pathSetDefの絶対パス ) )
\r
1028 for( int j = 0; j < 5; j++ )
\r
1030 if( n2.arスコア[ j ] != null )
\r
1032 strB = n2.arスコア[ j ].ファイル情報.ファイルの絶対パス;
\r
1033 if( strB == null )
\r
1043 strB = n2.pathSetDefの絶対パス + n2.SetDefのブロック番号.ToString( "00" );
\r
1045 return str.CompareTo( strB );
\r
1047 foreach( C曲リストノード c曲リストノード in ノードリスト )
\r
1049 if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )
\r
1051 this.t曲リストのソート1_絶対パス順( c曲リストノード.list子リスト );
\r
1055 public void t曲リストのソート2_タイトル順( List<C曲リストノード> ノードリスト )
\r
1057 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1063 int num = this.t比較0_共通( n1, n2 );
\r
1068 return n1.strタイトル.CompareTo( n2.strタイトル );
\r
1070 foreach( C曲リストノード c曲リストノード in ノードリスト )
\r
1072 if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )
\r
1074 this.t曲リストのソート2_タイトル順( c曲リストノード.list子リスト );
\r
1078 public void t曲リストのソート3_演奏回数の多い順( List<C曲リストノード> ノードリスト, E楽器パート part )
\r
1080 if( part != E楽器パート.UNKNOWN )
\r
1082 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1089 num = this.t比較0_共通( n1, n2 );
\r
1094 if( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1096 return n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1100 for( int i = 0; i < 5; i++ )
\r
1102 if( n1.arスコア[ i ] != null )
\r
1104 num2 += n1.arスコア[ i ].譜面情報.演奏回数[ (int) part ];
\r
1106 if( n2.arスコア[ i ] != null )
\r
1108 num3 += n2.arスコア[ i ].譜面情報.演奏回数[ (int) part ];
\r
1111 num = num3 - num2;
\r
1116 return n1.strタイトル.CompareTo( n2.strタイトル );
\r
1118 foreach( C曲リストノード c曲リストノード in ノードリスト )
\r
1120 if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )
\r
1122 this.t曲リストのソート3_演奏回数の多い順( c曲リストノード.list子リスト, part );
\r
1127 //-----------------
\r
1133 #region [ private ]
\r
1134 //-----------------
\r
1135 private const string SONGSDB_VERSION = "SongsDB2";
\r
1137 private int t比較0_共通( C曲リストノード n1, C曲リストノード n2 )
\r
1139 if( n1.eノード種別 == C曲リストノード.Eノード種別.BACKBOX )
\r
1143 if( n2.eノード種別 == C曲リストノード.Eノード種別.BACKBOX )
\r
1147 if( n1.eノード種別 == C曲リストノード.Eノード種別.RANDOM )
\r
1151 if( n2.eノード種別 == C曲リストノード.Eノード種別.RANDOM )
\r
1155 if( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 != C曲リストノード.Eノード種別.BOX ) )
\r
1159 if( ( n1.eノード種別 != C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1165 //-----------------
\r