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 #region [ DTX ファイルのヘッダだけ読み込み、Cスコア.譜面情報 を設定する ]
\r
691 //-----------------
\r
692 string path = c曲リストノード.arスコア[ i ].ファイル情報.ファイルの絶対パス;
\r
693 if( File.Exists( path ) )
\r
697 CDTX cdtx = new CDTX( c曲リストノード.arスコア[ i ].ファイル情報.ファイルの絶対パス, true );
\r
698 c曲リストノード.arスコア[ i ].譜面情報.タイトル = cdtx.TITLE;
\r
699 c曲リストノード.arスコア[ i ].譜面情報.アーティスト名 = cdtx.ARTIST;
\r
700 c曲リストノード.arスコア[ i ].譜面情報.コメント = cdtx.COMMENT;
\r
701 c曲リストノード.arスコア[ i ].譜面情報.ジャンル = cdtx.GENRE;
\r
702 c曲リストノード.arスコア[ i ].譜面情報.Preimage = cdtx.PREIMAGE;
\r
703 c曲リストノード.arスコア[ i ].譜面情報.Premovie = cdtx.PREMOVIE;
\r
704 c曲リストノード.arスコア[ i ].譜面情報.Presound = cdtx.PREVIEW;
\r
705 c曲リストノード.arスコア[ i ].譜面情報.Backgound = ( ( cdtx.BACKGROUND != null ) && ( cdtx.BACKGROUND.Length > 0 ) ) ? cdtx.BACKGROUND : cdtx.BACKGROUND_GR;
\r
706 c曲リストノード.arスコア[ i ].譜面情報.レベル.Drums = cdtx.LEVEL.Drums;
\r
707 c曲リストノード.arスコア[ i ].譜面情報.レベル.Guitar = cdtx.LEVEL.Guitar;
\r
708 c曲リストノード.arスコア[ i ].譜面情報.レベル.Bass = cdtx.LEVEL.Bass;
\r
709 c曲リストノード.arスコア[ i ].譜面情報.レベルを非表示にする = cdtx.HIDDENLEVEL;
\r
710 c曲リストノード.arスコア[ i ].譜面情報.曲種別 = cdtx.e種別;
\r
711 // c曲リストノード.arスコア[ i ].譜面情報.bpm = cdtx.BPM;
\r
712 this.nファイルから反映できたスコア数++;
\r
715 #region [ 曲検索ログ出力 ]
\r
716 //-----------------
\r
717 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
719 StringBuilder builder = new StringBuilder( 0x400 );
\r
720 builder.Append( string.Format( "曲データファイルから譜面情報を転記しました。({0})", path ) );
\r
721 builder.Append( "(title=" + c曲リストノード.arスコア[ i ].譜面情報.タイトル );
\r
722 builder.Append( ", artist=" + c曲リストノード.arスコア[ i ].譜面情報.アーティスト名 );
\r
723 builder.Append( ", comment=" + c曲リストノード.arスコア[ i ].譜面情報.コメント );
\r
724 builder.Append( ", genre=" + c曲リストノード.arスコア[ i ].譜面情報.ジャンル );
\r
725 builder.Append( ", preimage=" + c曲リストノード.arスコア[ i ].譜面情報.Preimage );
\r
726 builder.Append( ", premovie=" + c曲リストノード.arスコア[ i ].譜面情報.Premovie );
\r
727 builder.Append( ", presound=" + c曲リストノード.arスコア[ i ].譜面情報.Presound );
\r
728 builder.Append( ", background=" + c曲リストノード.arスコア[ i ].譜面情報.Backgound );
\r
729 builder.Append( ", lvDr=" + c曲リストノード.arスコア[ i ].譜面情報.レベル.Drums );
\r
730 builder.Append( ", lvGt=" + c曲リストノード.arスコア[ i ].譜面情報.レベル.Guitar );
\r
731 builder.Append( ", lvBs=" + c曲リストノード.arスコア[ i ].譜面情報.レベル.Bass );
\r
732 builder.Append( ", lvHide=" + c曲リストノード.arスコア[ i ].譜面情報.レベルを非表示にする );
\r
733 builder.Append( ", type=" + c曲リストノード.arスコア[ i ].譜面情報.曲種別 );
\r
734 // builder.Append( ", bpm=" + c曲リストノード.arスコア[ i ].譜面情報.bpm );
\r
735 Trace.TraceInformation( builder.ToString() );
\r
737 //-----------------
\r
740 catch( Exception exception )
\r
742 Trace.TraceError( exception.Message );
\r
743 c曲リストノード.arスコア[ i ] = null;
\r
746 Trace.TraceError( "曲データファイルの読み込みに失敗しました。({0})", new object[] { path } );
\r
749 //-----------------
\r
752 #region [ 対応する .score.ini が存在していれば読み込み、Cスコア.譜面情報 に追加設定する ]
\r
753 //-----------------
\r
754 this.tScoreIniを読み込んで譜面情報を設定する( c曲リストノード.arスコア[ i ].ファイル情報.ファイルの絶対パス + ".score.ini", ref c曲リストノード.arスコア[ i ] );
\r
755 //-----------------
\r
762 //-----------------
\r
764 #region [ 曲リストへ後処理を適用する ]
\r
765 //-----------------
\r
766 public void t曲リストへ後処理を適用する()
\r
768 this.t曲リストへ後処理を適用する( this.list曲ルート );
\r
770 private void t曲リストへ後処理を適用する( List<C曲リストノード> ノードリスト )
\r
772 #region [ リストに1つ以上の曲があるなら RANDOM BOX を入れる ]
\r
773 //-----------------------------
\r
774 if( ノードリスト.Count > 0 )
\r
776 C曲リストノード item = new C曲リストノード();
\r
777 item.eノード種別 = C曲リストノード.Eノード種別.RANDOM;
\r
778 item.strタイトル = "< RANDOM SELECT >";
\r
780 item.r親ノード = ノードリスト[ 0 ].r親ノード;
\r
781 for( int i = 0; i < 5; i++ )
\r
783 item.arスコア[ i ] = new Cスコア();
\r
784 item.arスコア[ i ].譜面情報.タイトル = string.Format( "< RANDOM SELECT Lv.{0} >", i + 1 );
\r
785 item.arスコア[i].譜面情報.コメント =
\r
786 (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?
\r
787 string.Format("難易度レベル {0} 付近の曲をランダムに選択します。難易度レベルを持たない曲も選択候補となります。", i + 1) :
\r
788 string.Format("Random select from the songs which has the level about L{0}. Non-leveled songs may also selected.", i + 1);
\r
789 item.ar難易度ラベル[ i ] = string.Format( "L{0}", i + 1 );
\r
791 ノードリスト.Add( item );
\r
794 //-----------------------------
\r
795 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
797 StringBuilder builder = new StringBuilder( 0x100 );
\r
798 builder.Append( string.Format( "nID#{0:D3}", item.nID ) );
\r
799 if( item.r親ノード != null )
\r
801 builder.Append( string.Format( "(in#{0:D3}):", item.r親ノード.nID ) );
\r
805 builder.Append( "(onRoot):" );
\r
807 builder.Append( " RANDOM" );
\r
808 Trace.TraceInformation( builder.ToString() );
\r
810 //-----------------------------
\r
813 //-----------------------------
\r
817 foreach( C曲リストノード c曲リストノード2 in ノードリスト )
\r
819 #region [ BOXノードなら子リストに <<BACK を入れ、子リストに後処理を適用する ]
\r
820 //-----------------------------
\r
821 if( c曲リストノード2.eノード種別 == C曲リストノード.Eノード種別.BOX )
\r
823 C曲リストノード c曲リストノード3 = new C曲リストノード();
\r
824 c曲リストノード3.eノード種別 = C曲リストノード.Eノード種別.BACKBOX;
\r
825 c曲リストノード3.strタイトル = "<< BACK";
\r
826 c曲リストノード3.nスコア数 = 1;
\r
827 c曲リストノード3.r親ノード = c曲リストノード2;
\r
828 c曲リストノード3.arスコア[ 0 ] = new Cスコア();
\r
829 c曲リストノード3.arスコア[ 0 ].ファイル情報.フォルダの絶対パス = "";
\r
830 c曲リストノード3.arスコア[ 0 ].譜面情報.タイトル = c曲リストノード3.strタイトル;
\r
831 c曲リストノード3.arスコア[ 0 ].譜面情報.コメント =
\r
832 (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?
\r
834 "Exit from the BOX.";
\r
835 c曲リストノード2.list子リスト.Insert( 0, c曲リストノード3 );
\r
838 //-----------------------------
\r
839 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
841 StringBuilder builder2 = new StringBuilder( 0x100 );
\r
842 builder2.Append( string.Format( "nID#{0:D3}", c曲リストノード3.nID ) );
\r
843 if( c曲リストノード3.r親ノード != null )
\r
845 builder2.Append( string.Format( "(in#{0:D3}):", c曲リストノード3.r親ノード.nID ) );
\r
849 builder2.Append( "(onRoot):" );
\r
851 builder2.Append( " BACKBOX" );
\r
852 Trace.TraceInformation( builder2.ToString() );
\r
854 //-----------------------------
\r
857 this.t曲リストへ後処理を適用する( c曲リストノード2.list子リスト );
\r
860 //-----------------------------
\r
863 #region [ ノードにタイトルがないなら、最初に見つけたスコアのタイトルを設定する ]
\r
864 //-----------------------------
\r
865 if( string.IsNullOrEmpty( c曲リストノード2.strタイトル ) )
\r
867 for( int j = 0; j < 5; j++ )
\r
869 if( ( c曲リストノード2.arスコア[ j ] != null ) && !string.IsNullOrEmpty( c曲リストノード2.arスコア[ j ].譜面情報.タイトル ) )
\r
871 c曲リストノード2.strタイトル = c曲リストノード2.arスコア[ j ].譜面情報.タイトル;
\r
873 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
874 Trace.TraceInformation( "タイトルを設定しました。(nID#{0:D3}, title={1})", new object[] { c曲リストノード2.nID, c曲リストノード2.strタイトル } );
\r
880 //-----------------------------
\r
884 #region [ ノードをソートする ]
\r
885 //-----------------------------
\r
886 this.t曲リストのソート1_絶対パス順( ノードリスト );
\r
887 //-----------------------------
\r
890 //-----------------
\r
892 #region [ スコアキャッシュをSongsDBに出力する ]
\r
893 //-----------------
\r
894 public void tスコアキャッシュをSongsDBに出力する( string SongsDBファイル名 )
\r
896 this.nSongsDBへ出力できたスコア数 = 0;
\r
899 BinaryWriter bw = new BinaryWriter( new FileStream( SongsDBファイル名, FileMode.Create, FileAccess.Write ) );
\r
900 bw.Write( SONGSDB_VERSION );
\r
901 this.tSongsDBにリストを1つ出力する( bw, this.list曲ルート );
\r
906 Trace.TraceError( "songs.dbの出力に失敗しました。" );
\r
909 private void tSongsDBにノードを1つ出力する( BinaryWriter bw, C曲リストノード node )
\r
911 for( int i = 0; i < 5; i++ )
\r
913 if( node.arスコア[ i ] != null )
\r
915 bw.Write( node.arスコア[ i ].ファイル情報.ファイルの絶対パス );
\r
916 bw.Write( node.arスコア[ i ].ファイル情報.フォルダの絶対パス );
\r
917 bw.Write( node.arスコア[ i ].ファイル情報.最終更新日時.Ticks );
\r
918 bw.Write( node.arスコア[ i ].ファイル情報.ファイルサイズ );
\r
919 bw.Write( node.arスコア[ i ].ScoreIni情報.最終更新日時.Ticks );
\r
920 bw.Write( node.arスコア[ i ].ScoreIni情報.ファイルサイズ );
\r
921 bw.Write( node.arスコア[ i ].譜面情報.タイトル );
\r
922 bw.Write( node.arスコア[ i ].譜面情報.アーティスト名 );
\r
923 bw.Write( node.arスコア[ i ].譜面情報.コメント );
\r
924 bw.Write( node.arスコア[ i ].譜面情報.ジャンル );
\r
925 bw.Write( node.arスコア[ i ].譜面情報.Preimage );
\r
926 bw.Write( node.arスコア[ i ].譜面情報.Premovie );
\r
927 bw.Write( node.arスコア[ i ].譜面情報.Presound );
\r
928 bw.Write( node.arスコア[ i ].譜面情報.Backgound );
\r
929 bw.Write( node.arスコア[ i ].譜面情報.レベル.Drums );
\r
930 bw.Write( node.arスコア[ i ].譜面情報.レベル.Guitar );
\r
931 bw.Write( node.arスコア[ i ].譜面情報.レベル.Bass );
\r
932 bw.Write( node.arスコア[ i ].譜面情報.最大ランク.Drums );
\r
933 bw.Write( node.arスコア[ i ].譜面情報.最大ランク.Guitar );
\r
934 bw.Write( node.arスコア[ i ].譜面情報.最大ランク.Bass );
\r
935 bw.Write( node.arスコア[ i ].譜面情報.最大スキル.Drums );
\r
936 bw.Write( node.arスコア[ i ].譜面情報.最大スキル.Guitar );
\r
937 bw.Write( node.arスコア[ i ].譜面情報.最大スキル.Bass );
\r
938 bw.Write( node.arスコア[ i ].譜面情報.フルコンボ.Drums );
\r
939 bw.Write( node.arスコア[ i ].譜面情報.フルコンボ.Guitar );
\r
940 bw.Write( node.arスコア[ i ].譜面情報.フルコンボ.Bass );
\r
941 bw.Write( node.arスコア[ i ].譜面情報.演奏回数.Drums );
\r
942 bw.Write( node.arスコア[ i ].譜面情報.演奏回数.Guitar );
\r
943 bw.Write( node.arスコア[ i ].譜面情報.演奏回数.Bass );
\r
944 bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行1 );
\r
945 bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行2 );
\r
946 bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行3 );
\r
947 bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行4 );
\r
948 bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行5 );
\r
949 bw.Write( node.arスコア[ i ].譜面情報.レベルを非表示にする );
\r
950 bw.Write( (int) node.arスコア[ i ].譜面情報.曲種別 );
\r
951 // bw.Write( node.arスコア[ i ].譜面情報.bpm );
\r
952 this.nSongsDBへ出力できたスコア数++;
\r
956 private void tSongsDBにリストを1つ出力する( BinaryWriter bw, List<C曲リストノード> list )
\r
958 foreach( C曲リストノード c曲リストノード in list )
\r
960 if( ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE ) || ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) )
\r
962 this.tSongsDBにノードを1つ出力する( bw, c曲リストノード );
\r
964 if( c曲リストノード.list子リスト != null )
\r
966 this.tSongsDBにリストを1つ出力する( bw, c曲リストノード.list子リスト );
\r
970 //-----------------
\r
973 #region [ 曲リストソート ]
\r
974 //-----------------
\r
975 public void t曲リストのソート1_絶対パス順( List<C曲リストノード> ノードリスト )
\r
977 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
984 int num = this.t比較0_共通( n1, n2 );
\r
989 if( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
991 return n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
995 if( string.IsNullOrEmpty( n1.pathSetDefの絶対パス ) )
\r
997 for( int i = 0; i < 5; i++ )
\r
999 if( n1.arスコア[ i ] != null )
\r
1001 str = n1.arスコア[ i ].ファイル情報.ファイルの絶対パス;
\r
1012 str = n1.pathSetDefの絶対パス + n1.SetDefのブロック番号.ToString( "00" );
\r
1015 if( string.IsNullOrEmpty( n2.pathSetDefの絶対パス ) )
\r
1017 for( int j = 0; j < 5; j++ )
\r
1019 if( n2.arスコア[ j ] != null )
\r
1021 strB = n2.arスコア[ j ].ファイル情報.ファイルの絶対パス;
\r
1022 if( strB == null )
\r
1032 strB = n2.pathSetDefの絶対パス + n2.SetDefのブロック番号.ToString( "00" );
\r
1034 return str.CompareTo( strB );
\r
1036 foreach( C曲リストノード c曲リストノード in ノードリスト )
\r
1038 if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )
\r
1040 this.t曲リストのソート1_絶対パス順( c曲リストノード.list子リスト );
\r
1044 public void t曲リストのソート2_タイトル順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1046 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1052 int num = this.t比較0_共通( n1, n2 );
\r
1055 return order * num;
\r
1057 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1059 // foreach( C曲リストノード c曲リストノード in ノードリスト )
\r
1061 // if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )
\r
1063 // this.t曲リストのソート2_タイトル順( c曲リストノード.list子リスト, part, order );
\r
1070 /// <param name="ノードリスト"></param>
\r
1071 /// <param name="part"></param>
\r
1072 /// <param name="order">1=Ascend -1=Descend</param>
\r
1073 public void t曲リストのソート3_演奏回数の多い順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1076 int nL12345 = (int) p[ 0 ];
\r
1077 if ( part != E楽器パート.UNKNOWN )
\r
1079 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1086 int num = this.t比較0_共通( n1, n2 );
\r
1089 return order * num;
\r
1091 if( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1093 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1096 int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;
\r
1097 // for( int i = 0; i < 5; i++ )
\r
1099 if( n1.arスコア[ nL12345 ] != null )
\r
1101 nSumPlayCountN1 += n1.arスコア[ nL12345 ].譜面情報.演奏回数[ (int) part ];
\r
1103 if( n2.arスコア[ nL12345 ] != null )
\r
1105 nSumPlayCountN2 += n2.arスコア[ nL12345 ].譜面情報.演奏回数[ (int) part ];
\r
1108 num = nSumPlayCountN2 - nSumPlayCountN1;
\r
1111 return order * num;
\r
1113 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1115 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1117 int nSumPlayCountN1 = 0;
\r
1118 // for ( int i = 0; i < 5; i++ )
\r
1120 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1122 nSumPlayCountN1 += c曲リストノード.arスコア[ nL12345 ].譜面情報.演奏回数[ (int) part ];
\r
1125 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );
\r
1128 // foreach( C曲リストノード c曲リストノード in ノードリスト )
\r
1130 // if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )
\r
1132 // this.t曲リストのソート3_演奏回数の多い順( c曲リストノード.list子リスト, part );
\r
1137 public void t曲リストのソート4_LEVEL順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1140 int nL12345 = (int)p[ 0 ];
\r
1141 if ( part != E楽器パート.UNKNOWN )
\r
1143 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1150 int num = this.t比較0_共通( n1, n2 );
\r
1153 return order * num;
\r
1155 if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1157 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1160 int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;
\r
1161 if ( n1.arスコア[ nL12345 ] != null )
\r
1163 nSumPlayCountN1 = n1.arスコア[ nL12345 ].譜面情報.レベル[ (int) part ];
\r
1165 if ( n2.arスコア[ nL12345 ] != null )
\r
1167 nSumPlayCountN2 = n2.arスコア[ nL12345 ].譜面情報.レベル[ (int) part ];
\r
1169 num = nSumPlayCountN2 - nSumPlayCountN1;
\r
1172 return order * num;
\r
1174 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1176 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1178 int nSumPlayCountN1 = 0;
\r
1179 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1181 nSumPlayCountN1 = c曲リストノード.arスコア[ nL12345 ].譜面情報.レベル[ (int) part ];
\r
1183 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );
\r
1187 public void t曲リストのソート5_BestRank順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1190 int nL12345 = (int) p[ 0 ];
\r
1191 if ( part != E楽器パート.UNKNOWN )
\r
1193 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1200 int num = this.t比較0_共通( n1, n2 );
\r
1203 return order * num;
\r
1205 if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1207 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1210 int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;
\r
1211 bool isFullCombo1 = false, isFullCombo2 = false;
\r
1212 if ( n1.arスコア[ nL12345 ] != null )
\r
1214 isFullCombo1 = n1.arスコア[ nL12345 ].譜面情報.フルコンボ[ (int) part ];
\r
1215 nSumPlayCountN1 = n1.arスコア[ nL12345 ].譜面情報.最大ランク[ (int) part ];
\r
1217 if ( n2.arスコア[ nL12345 ] != null )
\r
1219 isFullCombo2 = n2.arスコア[ nL12345 ].譜面情報.フルコンボ[ (int) part ];
\r
1220 nSumPlayCountN2 = n2.arスコア[ nL12345 ].譜面情報.最大ランク[ (int) part ];
\r
1222 if ( isFullCombo1 ^ isFullCombo2 )
\r
1224 if ( isFullCombo1 ) return order; else return -order;
\r
1226 num = nSumPlayCountN2 - nSumPlayCountN1;
\r
1229 return order * num;
\r
1231 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1233 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1235 int nSumPlayCountN1 = 0;
\r
1236 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1238 nSumPlayCountN1 = c曲リストノード.arスコア[ nL12345 ].譜面情報.最大ランク[ (int) part ];
\r
1240 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );
\r
1244 public void t曲リストのソート6_SkillPoint順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1247 int nL12345 = (int) p[ 0 ];
\r
1248 if ( part != E楽器パート.UNKNOWN )
\r
1250 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1257 int num = this.t比較0_共通( n1, n2 );
\r
1260 return order * num;
\r
1262 if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1264 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1267 double nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;
\r
1268 if ( n1.arスコア[ nL12345 ] != null )
\r
1270 nSumPlayCountN1 = n1.arスコア[ nL12345 ].譜面情報.最大スキル[ (int) part ];
\r
1272 if ( n2.arスコア[ nL12345 ] != null )
\r
1274 nSumPlayCountN2 = n2.arスコア[ nL12345 ].譜面情報.最大スキル[ (int) part ];
\r
1276 double d = nSumPlayCountN2 - nSumPlayCountN1;
\r
1279 return order * System.Math.Sign(d);
\r
1281 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1283 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1285 double nSumPlayCountN1 = 0;
\r
1286 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1288 nSumPlayCountN1 = c曲リストノード.arスコア[ nL12345 ].譜面情報.最大スキル[ (int) part ];
\r
1290 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );
\r
1294 public void t曲リストのソート7_更新日時順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1296 int nL12345 = (int) p[ 0 ];
\r
1297 if ( part != E楽器パート.UNKNOWN )
\r
1299 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1306 int num = this.t比較0_共通( n1, n2 );
\r
1309 return order * num;
\r
1311 if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1313 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1316 DateTime nSumPlayCountN1 = DateTime.Parse("0001/01/01 12:00:01.000");
\r
1317 DateTime nSumPlayCountN2 = DateTime.Parse("0001/01/01 12:00:01.000");
\r
1318 if ( n1.arスコア[ nL12345 ] != null )
\r
1320 nSumPlayCountN1 = n1.arスコア[ nL12345 ].ファイル情報.最終更新日時;
\r
1322 if ( n2.arスコア[ nL12345 ] != null )
\r
1324 nSumPlayCountN2 = n2.arスコア[ nL12345 ].ファイル情報.最終更新日時;
\r
1326 int d = nSumPlayCountN1.CompareTo(nSumPlayCountN2);
\r
1329 return order * System.Math.Sign( d );
\r
1331 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1333 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1335 DateTime nSumPlayCountN1 = DateTime.Parse( "0001/01/01 12:00:01.000" );
\r
1336 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1338 nSumPlayCountN1 = c曲リストノード.arスコア[ nL12345 ].ファイル情報.最終更新日時;
\r
1340 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );
\r
1344 public void t曲リストのソート8_アーティスト名順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1346 int nL12345 = (int) p[ 0 ];
\r
1347 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1353 int num = this.t比較0_共通( n1, n2 );
\r
1356 return order * System.Math.Sign( num );
\r
1358 string strAuthorN1 = "";
\r
1359 string strAuthorN2 = "";
\r
1360 if (n1.arスコア[ nL12345 ] != null ) {
\r
1361 strAuthorN1 = n1.arスコア[ nL12345 ].譜面情報.アーティスト名;
\r
1363 if ( n2.arスコア[ nL12345 ] != null )
\r
1365 strAuthorN2 = n2.arスコア[ nL12345 ].譜面情報.アーティスト名;
\r
1368 return order * strAuthorN1.CompareTo( strAuthorN2 );
\r
1370 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1373 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1375 s = c曲リストノード.arスコア[ nL12345 ].譜面情報.アーティスト名;
\r
1377 Debug.WriteLine( s + ":" + c曲リストノード.strタイトル );
\r
1381 public void t曲リストのソート9_BPM順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1384 int nL12345 = (int) p[ 0 ];
\r
1385 if ( part != E楽器パート.UNKNOWN )
\r
1387 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1394 int num = this.t比較0_共通( n1, n2 );
\r
1397 return order * num;
\r
1399 if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1401 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1404 double dBPMn1 = 0.0, dBPMn2 = 0.0;
\r
1405 if ( n1.arスコア[ nL12345 ] != null )
\r
1407 dBPMn1 = n1.arスコア[ nL12345 ].譜面情報.bpm;
\r
1409 if ( n2.arスコア[ nL12345 ] != null )
\r
1411 dBPMn2 = n2.arスコア[ nL12345 ].譜面情報.bpm;
\r
1413 double d = dBPMn1- dBPMn2;
\r
1416 return order * System.Math.Sign( d );
\r
1418 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1420 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1423 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1425 dBPM = c曲リストノード.arスコア[ nL12345 ].譜面情報.bpm;
\r
1427 Debug.WriteLine( dBPM + ":" + c曲リストノード.strタイトル );
\r
1432 //-----------------
\r
1434 #region [ .score.ini を読み込んで Cスコア.譜面情報に設定する ]
\r
1435 //-----------------
\r
1436 public void tScoreIniを読み込んで譜面情報を設定する( string strScoreIniファイルパス, ref Cスコア score )
\r
1438 if( !File.Exists( strScoreIniファイルパス ) )
\r
1443 var ini = new CScoreIni( strScoreIniファイルパス );
\r
1444 ini.t全演奏記録セクションの整合性をチェックし不整合があればリセットする();
\r
1446 for( int n楽器番号 = 0; n楽器番号 < 3; n楽器番号++ )
\r
1448 int n = ( n楽器番号 * 2 ) + 1; // n = 0~5
\r
1450 #region socre.譜面情報.最大ランク[ n楽器番号 ] = ...
\r
1451 //-----------------
\r
1452 if( ini.stセクション[ n ].b演奏にMIDI入力を使用した ||
\r
1453 ini.stセクション[ n ].b演奏にキーボードを使用した ||
\r
1454 ini.stセクション[ n ].b演奏にジョイパッドを使用した ||
\r
1455 ini.stセクション[ n ].b演奏にマウスを使用した )
\r
1457 // (A) 全オートじゃないようなので、演奏結果情報を有効としてランクを算出する。
\r
1459 score.譜面情報.最大ランク[ n楽器番号 ] =
\r
1460 CScoreIni.tランク値を計算して返す(
\r
1461 ini.stセクション[ n ].n全チップ数,
\r
1462 ini.stセクション[ n ].nPerfect数,
\r
1463 ini.stセクション[ n ].nGreat数,
\r
1464 ini.stセクション[ n ].nGood数,
\r
1465 ini.stセクション[ n ].nPoor数,
\r
1466 ini.stセクション[ n ].nMiss数 );
\r
1470 // (B) 全オートらしいので、ランクは無効とする。
\r
1472 score.譜面情報.最大ランク[ n楽器番号 ] = (int) CScoreIni.ERANK.UNKNOWN;
\r
1474 //-----------------
\r
1476 score.譜面情報.最大スキル[ n楽器番号 ] = ini.stセクション[ n ].db演奏型スキル値;
\r
1477 score.譜面情報.フルコンボ[ n楽器番号 ] = ini.stセクション[ n ].bフルコンボである;
\r
1479 score.譜面情報.演奏回数.Drums = ini.stファイル.PlayCountDrums;
\r
1480 score.譜面情報.演奏回数.Guitar = ini.stファイル.PlayCountGuitar;
\r
1481 score.譜面情報.演奏回数.Bass = ini.stファイル.PlayCountBass;
\r
1482 for( int i = 0; i < 5; i++ )
\r
1483 score.譜面情報.演奏履歴[ i ] = ini.stファイル.History[ i ];
\r
1487 Trace.TraceError( "演奏記録ファイルの読み込みに失敗しました。[{0}]", strScoreIniファイルパス );
\r
1490 //-----------------
\r
1496 #region [ private ]
\r
1497 //-----------------
\r
1498 private const string SONGSDB_VERSION = "SongsDB2";
\r
1500 private int t比較0_共通( C曲リストノード n1, C曲リストノード n2 )
\r
1502 if( n1.eノード種別 == C曲リストノード.Eノード種別.BACKBOX )
\r
1506 if( n2.eノード種別 == C曲リストノード.Eノード種別.BACKBOX )
\r
1510 if( n1.eノード種別 == C曲リストノード.Eノード種別.RANDOM )
\r
1514 if( n2.eノード種別 == C曲リストノード.Eノード種別.RANDOM )
\r
1518 if( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 != C曲リストノード.Eノード種別.BOX ) )
\r
1522 if( ( n1.eノード種別 != C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1528 //-----------------
\r