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( SONGSDB_VERSION ) )
\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 ] =
\r
591 (ini.stファイル.BestRank[i] != (int)CScoreIni.ERANK.UNKNOWN)?
\r
592 (int)ini.stファイル.BestRank[i] : CScoreIni.tランク値を計算して返す( ini.stセクション[ num3 ] );
\r
596 node.arスコア[ lv ].譜面情報.最大ランク[ i ] = (int)CScoreIni.ERANK.UNKNOWN;
\r
598 node.arスコア[ lv ].譜面情報.最大スキル[ i ] = ini.stセクション[ num3 ].db演奏型スキル値;
\r
599 node.arスコア[ lv ].譜面情報.フルコンボ[ i ] = ini.stセクション[ num3 ].bフルコンボである;
\r
601 node.arスコア[ lv ].譜面情報.演奏回数.Drums = ini.stファイル.PlayCountDrums;
\r
602 node.arスコア[ lv ].譜面情報.演奏回数.Guitar = ini.stファイル.PlayCountGuitar;
\r
603 node.arスコア[ lv ].譜面情報.演奏回数.Bass = ini.stファイル.PlayCountBass;
\r
604 for( int j = 0; j < 5; j++ )
\r
606 node.arスコア[ lv ].譜面情報.演奏履歴[ j ] = ini.stファイル.History[ j ];
\r
608 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
610 Trace.TraceInformation( "演奏記録ファイルから HiSkill 情報と演奏履歴を取得しました。({0})", new object[] { str } );
\r
615 Trace.TraceError( "演奏記録ファイルの読み込みに失敗しました。({0})", new object[] { str } );
\r
625 private Cスコア tSongsDBからスコアを1つ読み込む( BinaryReader br )
\r
627 Cスコア cスコア = new Cスコア();
\r
628 cスコア.ファイル情報.ファイルの絶対パス = br.ReadString();
\r
629 cスコア.ファイル情報.フォルダの絶対パス = br.ReadString();
\r
630 cスコア.ファイル情報.最終更新日時 = new DateTime( br.ReadInt64() );
\r
631 cスコア.ファイル情報.ファイルサイズ = br.ReadInt64();
\r
632 cスコア.ScoreIni情報.最終更新日時 = new DateTime( br.ReadInt64() );
\r
633 cスコア.ScoreIni情報.ファイルサイズ = br.ReadInt64();
\r
634 cスコア.譜面情報.タイトル = br.ReadString();
\r
635 cスコア.譜面情報.アーティスト名 = br.ReadString();
\r
636 cスコア.譜面情報.コメント = br.ReadString();
\r
637 cスコア.譜面情報.ジャンル = br.ReadString();
\r
638 cスコア.譜面情報.Preimage = br.ReadString();
\r
639 cスコア.譜面情報.Premovie = br.ReadString();
\r
640 cスコア.譜面情報.Presound = br.ReadString();
\r
641 cスコア.譜面情報.Backgound = br.ReadString();
\r
642 cスコア.譜面情報.レベル.Drums = br.ReadInt32();
\r
643 cスコア.譜面情報.レベル.Guitar = br.ReadInt32();
\r
644 cスコア.譜面情報.レベル.Bass = br.ReadInt32();
\r
645 cスコア.譜面情報.最大ランク.Drums = br.ReadInt32();
\r
646 cスコア.譜面情報.最大ランク.Guitar = br.ReadInt32();
\r
647 cスコア.譜面情報.最大ランク.Bass = br.ReadInt32();
\r
648 cスコア.譜面情報.最大スキル.Drums = br.ReadDouble();
\r
649 cスコア.譜面情報.最大スキル.Guitar = br.ReadDouble();
\r
650 cスコア.譜面情報.最大スキル.Bass = br.ReadDouble();
\r
651 cスコア.譜面情報.フルコンボ.Drums = br.ReadBoolean();
\r
652 cスコア.譜面情報.フルコンボ.Guitar = br.ReadBoolean();
\r
653 cスコア.譜面情報.フルコンボ.Bass = br.ReadBoolean();
\r
654 cスコア.譜面情報.演奏回数.Drums = br.ReadInt32();
\r
655 cスコア.譜面情報.演奏回数.Guitar = br.ReadInt32();
\r
656 cスコア.譜面情報.演奏回数.Bass = br.ReadInt32();
\r
657 cスコア.譜面情報.演奏履歴.行1 = br.ReadString();
\r
658 cスコア.譜面情報.演奏履歴.行2 = br.ReadString();
\r
659 cスコア.譜面情報.演奏履歴.行3 = br.ReadString();
\r
660 cスコア.譜面情報.演奏履歴.行4 = br.ReadString();
\r
661 cスコア.譜面情報.演奏履歴.行5 = br.ReadString();
\r
662 cスコア.譜面情報.レベルを非表示にする = br.ReadBoolean();
\r
663 cスコア.譜面情報.曲種別 = (CDTX.E種別) br.ReadInt32();
\r
664 // cスコア.譜面情報.bpm = br.ReadDouble();
\r
667 //-----------------
\r
669 #region [ SongsDBになかった曲をファイルから読み込んで反映する ]
\r
670 //-----------------
\r
671 public void tSongsDBになかった曲をファイルから読み込んで反映する()
\r
673 this.nファイルから反映できたスコア数 = 0;
\r
674 this.tSongsDBになかった曲をファイルから読み込んで反映する( this.list曲ルート );
\r
676 private void tSongsDBになかった曲をファイルから読み込んで反映する( List<C曲リストノード> ノードリスト )
\r
678 foreach( C曲リストノード c曲リストノード in ノードリスト )
\r
680 if( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX )
\r
682 this.tSongsDBになかった曲をファイルから読み込んで反映する( c曲リストノード.list子リスト );
\r
684 else if( ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE ) || ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) )
\r
686 for( int i = 0; i < 5; i++ )
\r
688 if( ( c曲リストノード.arスコア[ i ] != null ) && !c曲リストノード.arスコア[ i ].bSongDBにキャッシュがあった )
\r
690 string path = c曲リストノード.arスコア[ i ].ファイル情報.ファイルの絶対パス;
\r
691 if( File.Exists( path ) )
\r
695 CDTX cdtx = new CDTX( c曲リストノード.arスコア[ i ].ファイル情報.ファイルの絶対パス, true );
\r
696 c曲リストノード.arスコア[ i ].譜面情報.タイトル = cdtx.TITLE;
\r
697 c曲リストノード.arスコア[ i ].譜面情報.アーティスト名 = cdtx.ARTIST;
\r
698 c曲リストノード.arスコア[ i ].譜面情報.コメント = cdtx.COMMENT;
\r
699 c曲リストノード.arスコア[ i ].譜面情報.ジャンル = cdtx.GENRE;
\r
700 c曲リストノード.arスコア[ i ].譜面情報.Preimage = cdtx.PREIMAGE;
\r
701 c曲リストノード.arスコア[ i ].譜面情報.Premovie = cdtx.PREMOVIE;
\r
702 c曲リストノード.arスコア[ i ].譜面情報.Presound = cdtx.PREVIEW;
\r
703 c曲リストノード.arスコア[ i ].譜面情報.Backgound = ( ( cdtx.BACKGROUND != null ) && ( cdtx.BACKGROUND.Length > 0 ) ) ? cdtx.BACKGROUND : cdtx.BACKGROUND_GR;
\r
704 c曲リストノード.arスコア[ i ].譜面情報.レベル.Drums = cdtx.LEVEL.Drums;
\r
705 c曲リストノード.arスコア[ i ].譜面情報.レベル.Guitar = cdtx.LEVEL.Guitar;
\r
706 c曲リストノード.arスコア[ i ].譜面情報.レベル.Bass = cdtx.LEVEL.Bass;
\r
707 c曲リストノード.arスコア[ i ].譜面情報.レベルを非表示にする = cdtx.HIDDENLEVEL;
\r
708 c曲リストノード.arスコア[ i ].譜面情報.曲種別 = cdtx.e種別;
\r
709 // c曲リストノード.arスコア[ i ].譜面情報.bpm = cdtx.BPM;
\r
710 this.nファイルから反映できたスコア数++;
\r
712 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
714 StringBuilder builder = new StringBuilder( 0x400 );
\r
715 builder.Append( string.Format( "曲データファイルから譜面情報を転記しました。({0})", path ) );
\r
716 builder.Append( "(title=" + c曲リストノード.arスコア[ i ].譜面情報.タイトル );
\r
717 builder.Append( ", artist=" + c曲リストノード.arスコア[ i ].譜面情報.アーティスト名 );
\r
718 builder.Append( ", comment=" + c曲リストノード.arスコア[ i ].譜面情報.コメント );
\r
719 builder.Append( ", genre=" + c曲リストノード.arスコア[ i ].譜面情報.ジャンル );
\r
720 builder.Append( ", preimage=" + c曲リストノード.arスコア[ i ].譜面情報.Preimage );
\r
721 builder.Append( ", premovie=" + c曲リストノード.arスコア[ i ].譜面情報.Premovie );
\r
722 builder.Append( ", presound=" + c曲リストノード.arスコア[ i ].譜面情報.Presound );
\r
723 builder.Append( ", background=" + c曲リストノード.arスコア[ i ].譜面情報.Backgound );
\r
724 builder.Append( ", lvDr=" + c曲リストノード.arスコア[ i ].譜面情報.レベル.Drums );
\r
725 builder.Append( ", lvGt=" + c曲リストノード.arスコア[ i ].譜面情報.レベル.Guitar );
\r
726 builder.Append( ", lvBs=" + c曲リストノード.arスコア[ i ].譜面情報.レベル.Bass );
\r
727 builder.Append( ", lvHide=" + c曲リストノード.arスコア[ i ].譜面情報.レベルを非表示にする );
\r
728 builder.Append( ", type=" + c曲リストノード.arスコア[ i ].譜面情報.曲種別 );
\r
729 // builder.Append( ", bpm=" + c曲リストノード.arスコア[ i ].譜面情報.bpm );
\r
730 Trace.TraceInformation( builder.ToString() );
\r
733 catch( Exception exception )
\r
735 Trace.TraceError( exception.Message );
\r
736 c曲リストノード.arスコア[ i ] = null;
\r
739 Trace.TraceError( "曲データファイルの読み込みに失敗しました。({0})", new object[] { path } );
\r
742 string str2 = c曲リストノード.arスコア[ i ].ファイル情報.ファイルの絶対パス + ".score.ini";
\r
743 if( File.Exists( str2 ) )
\r
747 CScoreIni ini = new CScoreIni( str2 );
\r
748 ini.t全演奏記録セクションの整合性をチェックし不整合があればリセットする();
\r
749 for( int j = 0; j < 3; j++ )
\r
751 int num3 = ( j * 2 ) + 1;
\r
752 if( ( ini.stセクション[ num3 ].b演奏にMIDI入力を使用した || ini.stセクション[ num3 ].b演奏にキーボードを使用した ) || ( ini.stセクション[ num3 ].b演奏にジョイパッドを使用した || ini.stセクション[ num3 ].b演奏にマウスを使用した ) )
\r
754 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
758 c曲リストノード.arスコア[ i ].譜面情報.最大ランク[ j ] = 0x63;
\r
760 c曲リストノード.arスコア[ i ].譜面情報.最大スキル[ j ] = ini.stセクション[ num3 ].db演奏型スキル値;
\r
761 c曲リストノード.arスコア[ i ].譜面情報.フルコンボ[ j ] = ini.stセクション[ num3 ].bフルコンボである;
\r
763 c曲リストノード.arスコア[ i ].譜面情報.演奏回数.Drums = ini.stファイル.PlayCountDrums;
\r
764 c曲リストノード.arスコア[ i ].譜面情報.演奏回数.Guitar = ini.stファイル.PlayCountGuitar;
\r
765 c曲リストノード.arスコア[ i ].譜面情報.演奏回数.Bass = ini.stファイル.PlayCountBass;
\r
766 for( int k = 0; k < 5; k++ )
\r
768 c曲リストノード.arスコア[ i ].譜面情報.演奏履歴[ k ] = ini.stファイル.History[ k ];
\r
773 Trace.TraceError( "演奏記録ファイルの読み込みに失敗しました。[{0}]", new object[] { str2 } );
\r
781 //-----------------
\r
783 #region [ 曲リストへ後処理を適用する ]
\r
784 //-----------------
\r
785 public void t曲リストへ後処理を適用する()
\r
787 this.t曲リストへ後処理を適用する( this.list曲ルート );
\r
789 private void t曲リストへ後処理を適用する( List<C曲リストノード> ノードリスト )
\r
791 #region [ リストに1つ以上の曲があるなら RANDOM BOX を入れる ]
\r
792 //-----------------------------
\r
793 if( ノードリスト.Count > 0 )
\r
795 C曲リストノード item = new C曲リストノード();
\r
796 item.eノード種別 = C曲リストノード.Eノード種別.RANDOM;
\r
797 item.strタイトル = "< RANDOM SELECT >";
\r
799 item.r親ノード = ノードリスト[ 0 ].r親ノード;
\r
800 for( int i = 0; i < 5; i++ )
\r
802 item.arスコア[ i ] = new Cスコア();
\r
803 item.arスコア[ i ].譜面情報.タイトル = string.Format( "< RANDOM SELECT Lv.{0} >", i + 1 );
\r
804 item.arスコア[i].譜面情報.コメント =
\r
805 (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?
\r
806 string.Format("難易度レベル {0} 付近の曲をランダムに選択します。難易度レベルを持たない曲も選択候補となります。", i + 1) :
\r
807 string.Format("Random select from the songs which has the level about L{0}. Non-leveled songs may also selected.", i + 1);
\r
808 item.ar難易度ラベル[ i ] = string.Format( "L{0}", i + 1 );
\r
810 ノードリスト.Add( item );
\r
813 //-----------------------------
\r
814 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
816 StringBuilder builder = new StringBuilder( 0x100 );
\r
817 builder.Append( string.Format( "nID#{0:D3}", item.nID ) );
\r
818 if( item.r親ノード != null )
\r
820 builder.Append( string.Format( "(in#{0:D3}):", item.r親ノード.nID ) );
\r
824 builder.Append( "(onRoot):" );
\r
826 builder.Append( " RANDOM" );
\r
827 Trace.TraceInformation( builder.ToString() );
\r
829 //-----------------------------
\r
832 //-----------------------------
\r
836 foreach( C曲リストノード c曲リストノード2 in ノードリスト )
\r
838 #region [ BOXノードなら子リストに <<BACK を入れ、子リストに後処理を適用する ]
\r
839 //-----------------------------
\r
840 if( c曲リストノード2.eノード種別 == C曲リストノード.Eノード種別.BOX )
\r
842 C曲リストノード c曲リストノード3 = new C曲リストノード();
\r
843 c曲リストノード3.eノード種別 = C曲リストノード.Eノード種別.BACKBOX;
\r
844 c曲リストノード3.strタイトル = "<< BACK";
\r
845 c曲リストノード3.nスコア数 = 1;
\r
846 c曲リストノード3.r親ノード = c曲リストノード2;
\r
847 c曲リストノード3.arスコア[ 0 ] = new Cスコア();
\r
848 c曲リストノード3.arスコア[ 0 ].ファイル情報.フォルダの絶対パス = "";
\r
849 c曲リストノード3.arスコア[ 0 ].譜面情報.タイトル = c曲リストノード3.strタイトル;
\r
850 c曲リストノード3.arスコア[ 0 ].譜面情報.コメント =
\r
851 (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?
\r
853 "Exit from the BOX.";
\r
854 c曲リストノード2.list子リスト.Insert( 0, c曲リストノード3 );
\r
857 //-----------------------------
\r
858 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
860 StringBuilder builder2 = new StringBuilder( 0x100 );
\r
861 builder2.Append( string.Format( "nID#{0:D3}", c曲リストノード3.nID ) );
\r
862 if( c曲リストノード3.r親ノード != null )
\r
864 builder2.Append( string.Format( "(in#{0:D3}):", c曲リストノード3.r親ノード.nID ) );
\r
868 builder2.Append( "(onRoot):" );
\r
870 builder2.Append( " BACKBOX" );
\r
871 Trace.TraceInformation( builder2.ToString() );
\r
873 //-----------------------------
\r
876 this.t曲リストへ後処理を適用する( c曲リストノード2.list子リスト );
\r
879 //-----------------------------
\r
882 #region [ ノードにタイトルがないなら、最初に見つけたスコアのタイトルを設定する ]
\r
883 //-----------------------------
\r
884 if( string.IsNullOrEmpty( c曲リストノード2.strタイトル ) )
\r
886 for( int j = 0; j < 5; j++ )
\r
888 if( ( c曲リストノード2.arスコア[ j ] != null ) && !string.IsNullOrEmpty( c曲リストノード2.arスコア[ j ].譜面情報.タイトル ) )
\r
890 c曲リストノード2.strタイトル = c曲リストノード2.arスコア[ j ].譜面情報.タイトル;
\r
892 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
893 Trace.TraceInformation( "タイトルを設定しました。(nID#{0:D3}, title={1})", new object[] { c曲リストノード2.nID, c曲リストノード2.strタイトル } );
\r
899 //-----------------------------
\r
903 #region [ ノードをソートする ]
\r
904 //-----------------------------
\r
905 this.t曲リストのソート1_絶対パス順( ノードリスト );
\r
906 //-----------------------------
\r
909 //-----------------
\r
911 #region [ スコアキャッシュをSongsDBに出力する ]
\r
912 //-----------------
\r
913 public void tスコアキャッシュをSongsDBに出力する( string SongsDBファイル名 )
\r
915 this.nSongsDBへ出力できたスコア数 = 0;
\r
918 BinaryWriter bw = new BinaryWriter( new FileStream( SongsDBファイル名, FileMode.Create, FileAccess.Write ) );
\r
919 bw.Write( SONGSDB_VERSION );
\r
920 this.tSongsDBにリストを1つ出力する( bw, this.list曲ルート );
\r
925 Trace.TraceError( "songs.dbの出力に失敗しました。" );
\r
928 private void tSongsDBにノードを1つ出力する( BinaryWriter bw, C曲リストノード node )
\r
930 for( int i = 0; i < 5; i++ )
\r
932 if( node.arスコア[ i ] != null )
\r
934 bw.Write( node.arスコア[ i ].ファイル情報.ファイルの絶対パス );
\r
935 bw.Write( node.arスコア[ i ].ファイル情報.フォルダの絶対パス );
\r
936 bw.Write( node.arスコア[ i ].ファイル情報.最終更新日時.Ticks );
\r
937 bw.Write( node.arスコア[ i ].ファイル情報.ファイルサイズ );
\r
938 bw.Write( node.arスコア[ i ].ScoreIni情報.最終更新日時.Ticks );
\r
939 bw.Write( node.arスコア[ i ].ScoreIni情報.ファイルサイズ );
\r
940 bw.Write( node.arスコア[ i ].譜面情報.タイトル );
\r
941 bw.Write( node.arスコア[ i ].譜面情報.アーティスト名 );
\r
942 bw.Write( node.arスコア[ i ].譜面情報.コメント );
\r
943 bw.Write( node.arスコア[ i ].譜面情報.ジャンル );
\r
944 bw.Write( node.arスコア[ i ].譜面情報.Preimage );
\r
945 bw.Write( node.arスコア[ i ].譜面情報.Premovie );
\r
946 bw.Write( node.arスコア[ i ].譜面情報.Presound );
\r
947 bw.Write( node.arスコア[ i ].譜面情報.Backgound );
\r
948 bw.Write( node.arスコア[ i ].譜面情報.レベル.Drums );
\r
949 bw.Write( node.arスコア[ i ].譜面情報.レベル.Guitar );
\r
950 bw.Write( node.arスコア[ i ].譜面情報.レベル.Bass );
\r
951 bw.Write( node.arスコア[ i ].譜面情報.最大ランク.Drums );
\r
952 bw.Write( node.arスコア[ i ].譜面情報.最大ランク.Guitar );
\r
953 bw.Write( node.arスコア[ i ].譜面情報.最大ランク.Bass );
\r
954 bw.Write( node.arスコア[ i ].譜面情報.最大スキル.Drums );
\r
955 bw.Write( node.arスコア[ i ].譜面情報.最大スキル.Guitar );
\r
956 bw.Write( node.arスコア[ i ].譜面情報.最大スキル.Bass );
\r
957 bw.Write( node.arスコア[ i ].譜面情報.フルコンボ.Drums );
\r
958 bw.Write( node.arスコア[ i ].譜面情報.フルコンボ.Guitar );
\r
959 bw.Write( node.arスコア[ i ].譜面情報.フルコンボ.Bass );
\r
960 bw.Write( node.arスコア[ i ].譜面情報.演奏回数.Drums );
\r
961 bw.Write( node.arスコア[ i ].譜面情報.演奏回数.Guitar );
\r
962 bw.Write( node.arスコア[ i ].譜面情報.演奏回数.Bass );
\r
963 bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行1 );
\r
964 bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行2 );
\r
965 bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行3 );
\r
966 bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行4 );
\r
967 bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行5 );
\r
968 bw.Write( node.arスコア[ i ].譜面情報.レベルを非表示にする );
\r
969 bw.Write( (int) node.arスコア[ i ].譜面情報.曲種別 );
\r
970 // bw.Write( node.arスコア[ i ].譜面情報.bpm );
\r
971 this.nSongsDBへ出力できたスコア数++;
\r
975 private void tSongsDBにリストを1つ出力する( BinaryWriter bw, List<C曲リストノード> list )
\r
977 foreach( C曲リストノード c曲リストノード in list )
\r
979 if( ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE ) || ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) )
\r
981 this.tSongsDBにノードを1つ出力する( bw, c曲リストノード );
\r
983 if( c曲リストノード.list子リスト != null )
\r
985 this.tSongsDBにリストを1つ出力する( bw, c曲リストノード.list子リスト );
\r
989 //-----------------
\r
992 #region [ 曲リストソート ]
\r
993 //-----------------
\r
994 public void t曲リストのソート1_絶対パス順( List<C曲リストノード> ノードリスト )
\r
996 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1003 int num = this.t比較0_共通( n1, n2 );
\r
1008 if( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1010 return n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1014 if( string.IsNullOrEmpty( n1.pathSetDefの絶対パス ) )
\r
1016 for( int i = 0; i < 5; i++ )
\r
1018 if( n1.arスコア[ i ] != null )
\r
1020 str = n1.arスコア[ i ].ファイル情報.ファイルの絶対パス;
\r
1031 str = n1.pathSetDefの絶対パス + n1.SetDefのブロック番号.ToString( "00" );
\r
1034 if( string.IsNullOrEmpty( n2.pathSetDefの絶対パス ) )
\r
1036 for( int j = 0; j < 5; j++ )
\r
1038 if( n2.arスコア[ j ] != null )
\r
1040 strB = n2.arスコア[ j ].ファイル情報.ファイルの絶対パス;
\r
1041 if( strB == null )
\r
1051 strB = n2.pathSetDefの絶対パス + n2.SetDefのブロック番号.ToString( "00" );
\r
1053 return str.CompareTo( strB );
\r
1055 foreach( C曲リストノード c曲リストノード in ノードリスト )
\r
1057 if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )
\r
1059 this.t曲リストのソート1_絶対パス順( c曲リストノード.list子リスト );
\r
1063 public void t曲リストのソート2_タイトル順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1065 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1071 int num = this.t比較0_共通( n1, n2 );
\r
1074 return order * num;
\r
1076 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1078 // foreach( C曲リストノード c曲リストノード in ノードリスト )
\r
1080 // if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )
\r
1082 // this.t曲リストのソート2_タイトル順( c曲リストノード.list子リスト, part, order );
\r
1089 /// <param name="ノードリスト"></param>
\r
1090 /// <param name="part"></param>
\r
1091 /// <param name="order">1=Ascend -1=Descend</param>
\r
1092 public void t曲リストのソート3_演奏回数の多い順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1095 int nL12345 = (int) p[ 0 ];
\r
1096 if ( part != E楽器パート.UNKNOWN )
\r
1098 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1105 int num = this.t比較0_共通( n1, n2 );
\r
1108 return order * num;
\r
1110 if( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1112 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1115 int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;
\r
1116 // for( int i = 0; i < 5; i++ )
\r
1118 if( n1.arスコア[ nL12345 ] != null )
\r
1120 nSumPlayCountN1 += n1.arスコア[ nL12345 ].譜面情報.演奏回数[ (int) part ];
\r
1122 if( n2.arスコア[ nL12345 ] != null )
\r
1124 nSumPlayCountN2 += n2.arスコア[ nL12345 ].譜面情報.演奏回数[ (int) part ];
\r
1127 num = nSumPlayCountN2 - nSumPlayCountN1;
\r
1130 return order * num;
\r
1132 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1134 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1136 int nSumPlayCountN1 = 0;
\r
1137 // for ( int i = 0; i < 5; i++ )
\r
1139 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1141 nSumPlayCountN1 += c曲リストノード.arスコア[ nL12345 ].譜面情報.演奏回数[ (int) part ];
\r
1144 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );
\r
1147 // foreach( C曲リストノード c曲リストノード in ノードリスト )
\r
1149 // if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )
\r
1151 // this.t曲リストのソート3_演奏回数の多い順( c曲リストノード.list子リスト, part );
\r
1156 public void t曲リストのソート4_LEVEL順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1159 int nL12345 = (int)p[ 0 ];
\r
1160 if ( part != E楽器パート.UNKNOWN )
\r
1162 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1169 int num = this.t比較0_共通( n1, n2 );
\r
1172 return order * num;
\r
1174 if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1176 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1179 int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;
\r
1180 if ( n1.arスコア[ nL12345 ] != null )
\r
1182 nSumPlayCountN1 = n1.arスコア[ nL12345 ].譜面情報.レベル[ (int) part ];
\r
1184 if ( n2.arスコア[ nL12345 ] != null )
\r
1186 nSumPlayCountN2 = n2.arスコア[ nL12345 ].譜面情報.レベル[ (int) part ];
\r
1188 num = nSumPlayCountN2 - nSumPlayCountN1;
\r
1191 return order * num;
\r
1193 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1195 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1197 int nSumPlayCountN1 = 0;
\r
1198 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1200 nSumPlayCountN1 = c曲リストノード.arスコア[ nL12345 ].譜面情報.レベル[ (int) part ];
\r
1202 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );
\r
1206 public void t曲リストのソート5_BestRank順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1209 int nL12345 = (int) p[ 0 ];
\r
1210 if ( part != E楽器パート.UNKNOWN )
\r
1212 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1219 int num = this.t比較0_共通( n1, n2 );
\r
1222 return order * num;
\r
1224 if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1226 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1229 int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;
\r
1230 bool isFullCombo1 = false, isFullCombo2 = false;
\r
1231 if ( n1.arスコア[ nL12345 ] != null )
\r
1233 isFullCombo1 = n1.arスコア[ nL12345 ].譜面情報.フルコンボ[ (int) part ];
\r
1234 nSumPlayCountN1 = n1.arスコア[ nL12345 ].譜面情報.最大ランク[ (int) part ];
\r
1236 if ( n2.arスコア[ nL12345 ] != null )
\r
1238 isFullCombo2 = n2.arスコア[ nL12345 ].譜面情報.フルコンボ[ (int) part ];
\r
1239 nSumPlayCountN2 = n2.arスコア[ nL12345 ].譜面情報.最大ランク[ (int) part ];
\r
1241 if ( isFullCombo1 ^ isFullCombo2 )
\r
1243 if ( isFullCombo1 ) return order; else return -order;
\r
1245 num = nSumPlayCountN2 - nSumPlayCountN1;
\r
1248 return order * num;
\r
1250 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1252 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1254 int nSumPlayCountN1 = 0;
\r
1255 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1257 nSumPlayCountN1 = c曲リストノード.arスコア[ nL12345 ].譜面情報.最大ランク[ (int) part ];
\r
1259 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );
\r
1263 public void t曲リストのソート6_SkillPoint順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1266 int nL12345 = (int) p[ 0 ];
\r
1267 if ( part != E楽器パート.UNKNOWN )
\r
1269 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1276 int num = this.t比較0_共通( n1, n2 );
\r
1279 return order * num;
\r
1281 if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1283 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1286 double nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;
\r
1287 if ( n1.arスコア[ nL12345 ] != null )
\r
1289 nSumPlayCountN1 = n1.arスコア[ nL12345 ].譜面情報.最大スキル[ (int) part ];
\r
1291 if ( n2.arスコア[ nL12345 ] != null )
\r
1293 nSumPlayCountN2 = n2.arスコア[ nL12345 ].譜面情報.最大スキル[ (int) part ];
\r
1295 double d = nSumPlayCountN2 - nSumPlayCountN1;
\r
1298 return order * System.Math.Sign(d);
\r
1300 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1302 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1304 double nSumPlayCountN1 = 0;
\r
1305 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1307 nSumPlayCountN1 = c曲リストノード.arスコア[ nL12345 ].譜面情報.最大スキル[ (int) part ];
\r
1309 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );
\r
1313 public void t曲リストのソート7_更新日時順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1315 int nL12345 = (int) p[ 0 ];
\r
1316 if ( part != E楽器パート.UNKNOWN )
\r
1318 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1325 int num = this.t比較0_共通( n1, n2 );
\r
1328 return order * num;
\r
1330 if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1332 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1335 DateTime nSumPlayCountN1 = DateTime.Parse("0001/01/01 12:00:01.000");
\r
1336 DateTime nSumPlayCountN2 = DateTime.Parse("0001/01/01 12:00:01.000");
\r
1337 if ( n1.arスコア[ nL12345 ] != null )
\r
1339 nSumPlayCountN1 = n1.arスコア[ nL12345 ].ファイル情報.最終更新日時;
\r
1341 if ( n2.arスコア[ nL12345 ] != null )
\r
1343 nSumPlayCountN2 = n2.arスコア[ nL12345 ].ファイル情報.最終更新日時;
\r
1345 int d = nSumPlayCountN1.CompareTo(nSumPlayCountN2);
\r
1348 return order * System.Math.Sign( d );
\r
1350 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1352 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1354 DateTime nSumPlayCountN1 = DateTime.Parse( "0001/01/01 12:00:01.000" );
\r
1355 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1357 nSumPlayCountN1 = c曲リストノード.arスコア[ nL12345 ].ファイル情報.最終更新日時;
\r
1359 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );
\r
1363 public void t曲リストのソート8_アーティスト名順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1365 int nL12345 = (int) p[ 0 ];
\r
1366 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1372 int num = this.t比較0_共通( n1, n2 );
\r
1375 return order * System.Math.Sign( num );
\r
1377 string strAuthorN1 = "";
\r
1378 string strAuthorN2 = "";
\r
1379 if (n1.arスコア[ nL12345 ] != null ) {
\r
1380 strAuthorN1 = n1.arスコア[ nL12345 ].譜面情報.アーティスト名;
\r
1382 if ( n2.arスコア[ nL12345 ] != null )
\r
1384 strAuthorN2 = n2.arスコア[ nL12345 ].譜面情報.アーティスト名;
\r
1387 return order * strAuthorN1.CompareTo( strAuthorN2 );
\r
1389 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1392 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1394 s = c曲リストノード.arスコア[ nL12345 ].譜面情報.アーティスト名;
\r
1396 Debug.WriteLine( s + ":" + c曲リストノード.strタイトル );
\r
1400 public void t曲リストのソート9_BPM順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1403 int nL12345 = (int) p[ 0 ];
\r
1404 if ( part != E楽器パート.UNKNOWN )
\r
1406 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1413 int num = this.t比較0_共通( n1, n2 );
\r
1416 return order * num;
\r
1418 if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1420 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1423 double dBPMn1 = 0.0, dBPMn2 = 0.0;
\r
1424 if ( n1.arスコア[ nL12345 ] != null )
\r
1426 dBPMn1 = n1.arスコア[ nL12345 ].譜面情報.bpm;
\r
1428 if ( n2.arスコア[ nL12345 ] != null )
\r
1430 dBPMn2 = n2.arスコア[ nL12345 ].譜面情報.bpm;
\r
1432 double d = dBPMn1- dBPMn2;
\r
1435 return order * System.Math.Sign( d );
\r
1437 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1439 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1442 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1444 dBPM = c曲リストノード.arスコア[ nL12345 ].譜面情報.bpm;
\r
1446 Debug.WriteLine( dBPM + ":" + c曲リストノード.strタイトル );
\r
1451 //-----------------
\r
1457 #region [ private ]
\r
1458 //-----------------
\r
1459 private const string SONGSDB_VERSION = "SongsDB2";
\r
1461 private int t比較0_共通( C曲リストノード n1, C曲リストノード n2 )
\r
1463 if( n1.eノード種別 == C曲リストノード.Eノード種別.BACKBOX )
\r
1467 if( n2.eノード種別 == C曲リストノード.Eノード種別.BACKBOX )
\r
1471 if( n1.eノード種別 == C曲リストノード.Eノード種別.RANDOM )
\r
1475 if( n2.eノード種別 == C曲リストノード.Eノード種別.RANDOM )
\r
1479 if( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 != C曲リストノード.Eノード種別.BOX ) )
\r
1483 if( ( n1.eノード種別 != C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1489 //-----------------
\r