2 using System.Collections.Generic;
\r
3 using System.Globalization;
\r
5 using System.Diagnostics;
\r
7 using System.Drawing;
\r
8 using System.Runtime.Serialization.Formatters.Binary;
\r
13 internal class CSongs管理
\r
17 public int nSongsDBから取得できたスコア数
\r
22 public int nSongsDBへ出力できたスコア数
\r
27 public int nスコアキャッシュから反映できたスコア数
\r
32 public int nファイルから反映できたスコア数
\r
37 public int n検索されたスコア数
\r
42 public int n検索された曲ノード数
\r
47 public List<Cスコア> listSongsDB; // songs.dbから構築されるlist
\r
48 public List<C曲リストノード> list曲ルート; // 起動時にフォルダ検索して構築されるlist
\r
55 this.listSongsDB = new List<Cスコア>();
\r
56 this.list曲ルート = new List<C曲リストノード>();
\r
57 this.n検索された曲ノード数 = 0;
\r
58 this.n検索されたスコア数 = 0;
\r
64 #region [ SongsDB(songs.db) を読み込む ]
\r
66 public void tSongsDBを読み込む( string SongsDBファイル名 )
\r
68 this.nSongsDBから取得できたスコア数 = 0;
\r
69 if( File.Exists( SongsDBファイル名 ) )
\r
71 BinaryReader br = null;
\r
74 br = new BinaryReader( File.OpenRead( SongsDBファイル名 ) );
\r
75 if ( !br.ReadString().Equals( SONGSDB_VERSION ) )
\r
77 throw new InvalidDataException( "ヘッダが異なります。" );
\r
79 this.listSongsDB = new List<Cスコア>();
\r
85 Cスコア item = this.tSongsDBからスコアを1つ読み込む( br );
\r
86 this.listSongsDB.Add( item );
\r
87 this.nSongsDBから取得できたスコア数++;
\r
89 catch( EndOfStreamException )
\r
102 //-----------------
\r
104 #region [ 曲を検索してリストを作成する ]
\r
105 //-----------------
\r
106 public void t曲を検索してリストを作成する( string str基点フォルダ, bool b子BOXへ再帰する )
\r
108 this.t曲を検索してリストを作成する( str基点フォルダ, b子BOXへ再帰する, this.list曲ルート, null );
\r
110 private void t曲を検索してリストを作成する( string str基点フォルダ, bool b子BOXへ再帰する, List<C曲リストノード> listノードリスト, C曲リストノード node親 )
\r
112 if( !str基点フォルダ.EndsWith( @"\" ) )
\r
113 str基点フォルダ = str基点フォルダ + @"\";
\r
115 DirectoryInfo info = new DirectoryInfo( str基点フォルダ );
\r
117 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
118 Trace.TraceInformation( "基点フォルダ: " + str基点フォルダ );
\r
120 #region [ a.フォルダ内に set.def が存在する場合 → set.def からノード作成]
\r
121 //-----------------------------
\r
122 string path = str基点フォルダ + "set.def";
\r
123 if( File.Exists( path ) )
\r
125 CSetDef def = new CSetDef( path );
\r
126 new FileInfo( path );
\r
127 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
129 Trace.TraceInformation( "set.def検出 : {0}", new object[] { path } );
\r
134 for( int i = 0; i < def.blocks.Count; i++ )
\r
136 CSetDef.CBlock block = def.blocks[ i ];
\r
137 C曲リストノード item = new C曲リストノード();
\r
138 item.eノード種別 = C曲リストノード.Eノード種別.SCORE;
\r
139 item.strタイトル = block.Title;
\r
140 item.strジャンル = block.Genre;
\r
142 item.col文字色 = block.FontColor;
\r
143 item.SetDefのブロック番号 = i;
\r
144 item.pathSetDefの絶対パス = path;
\r
145 item.r親ノード = node親;
\r
146 for( int j = 0; j < 5; j++ )
\r
148 if( !string.IsNullOrEmpty( block.File[ j ] ) )
\r
150 string str2 = str基点フォルダ + block.File[ j ];
\r
151 if( File.Exists( str2 ) )
\r
153 item.ar難易度ラベル[ j ] = block.Label[ j ];
\r
154 item.arスコア[ j ] = new Cスコア();
\r
155 item.arスコア[ j ].ファイル情報.ファイルの絶対パス = str2;
\r
156 item.arスコア[ j ].ファイル情報.フォルダの絶対パス = Path.GetFullPath( Path.GetDirectoryName( str2 ) ) + @"\";
\r
157 FileInfo info2 = new FileInfo( str2 );
\r
158 item.arスコア[ j ].ファイル情報.ファイルサイズ = info2.Length;
\r
159 item.arスコア[ j ].ファイル情報.最終更新日時 = info2.LastWriteTime;
\r
160 string str3 = str2 + ".score.ini";
\r
161 if( File.Exists( str3 ) )
\r
163 FileInfo info3 = new FileInfo( str3 );
\r
164 item.arスコア[ j ].ScoreIni情報.ファイルサイズ = info3.Length;
\r
165 item.arスコア[ j ].ScoreIni情報.最終更新日時 = info3.LastWriteTime;
\r
172 item.arスコア[ j ] = null;
\r
176 if( item.nスコア数 > 0 )
\r
178 listノードリスト.Add( item );
\r
179 this.n検索された曲ノード数++;
\r
180 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
182 StringBuilder builder = new StringBuilder( 0x200 );
\r
183 builder.Append( string.Format( "nID#{0:D3}", item.nID ) );
\r
184 if( item.r親ノード != null )
\r
186 builder.Append( string.Format( "(in#{0:D3}):", item.r親ノード.nID ) );
\r
190 builder.Append( "(onRoot):" );
\r
192 if( ( item.strタイトル != null ) && ( item.strタイトル.Length > 0 ) )
\r
194 builder.Append( " SONG, Title=" + item.strタイトル );
\r
196 if( ( item.strジャンル != null ) && ( item.strジャンル.Length > 0 ) )
\r
198 builder.Append( ", Genre=" + item.strジャンル );
\r
200 if( item.col文字色 != Color.White )
\r
202 builder.Append( ", FontColor=" + item.col文字色 );
\r
204 Trace.TraceInformation( builder.ToString() );
\r
208 for( int k = 0; k < 5; k++ )
\r
210 if( item.arスコア[ k ] != null )
\r
212 Cスコア cスコア = item.arスコア[ k ];
\r
213 builder.Remove( 0, builder.Length );
\r
214 builder.Append( string.Format( "ブロック{0}-{1}:", item.SetDefのブロック番号 + 1, k + 1 ) );
\r
215 builder.Append( " Label=" + item.ar難易度ラベル[ k ] );
\r
216 builder.Append( ", File=" + cスコア.ファイル情報.ファイルの絶対パス );
\r
217 builder.Append( ", Size=" + cスコア.ファイル情報.ファイルサイズ );
\r
218 builder.Append( ", LastUpdate=" + cスコア.ファイル情報.最終更新日時 );
\r
219 Trace.TraceInformation( builder.ToString() );
\r
233 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
239 //-----------------------------
\r
242 #region [ b.フォルダ内に set.def が存在しない場合 → 個別ファイルからノード作成 ]
\r
243 //-----------------------------
\r
246 foreach( FileInfo info4 in info.GetFiles() )
\r
248 string str4 = info4.Extension.ToLower();
\r
249 if( ( str4.Equals( ".dtx" ) || str4.Equals( ".gda" ) ) || ( ( str4.Equals( ".g2d" ) || str4.Equals( ".bms" ) ) || str4.Equals( ".bme" ) ) )
\r
251 C曲リストノード c曲リストノード2 = new C曲リストノード();
\r
252 c曲リストノード2.eノード種別 = C曲リストノード.Eノード種別.SCORE;
\r
253 c曲リストノード2.nスコア数 = 1;
\r
254 c曲リストノード2.r親ノード = node親;
\r
255 c曲リストノード2.arスコア[ 0 ] = new Cスコア();
\r
256 c曲リストノード2.arスコア[ 0 ].ファイル情報.ファイルの絶対パス = str基点フォルダ + info4.Name;
\r
257 c曲リストノード2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス = str基点フォルダ;
\r
258 c曲リストノード2.arスコア[ 0 ].ファイル情報.ファイルサイズ = info4.Length;
\r
259 c曲リストノード2.arスコア[ 0 ].ファイル情報.最終更新日時 = info4.LastWriteTime;
\r
260 string str5 = c曲リストノード2.arスコア[ 0 ].ファイル情報.ファイルの絶対パス + ".score.ini";
\r
261 if( File.Exists( str5 ) )
\r
263 FileInfo info5 = new FileInfo( str5 );
\r
264 c曲リストノード2.arスコア[ 0 ].ScoreIni情報.ファイルサイズ = info5.Length;
\r
265 c曲リストノード2.arスコア[ 0 ].ScoreIni情報.最終更新日時 = info5.LastWriteTime;
\r
268 listノードリスト.Add( c曲リストノード2 );
\r
269 this.n検索された曲ノード数++;
\r
270 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
275 StringBuilder builder2 = new StringBuilder( 0x100 );
\r
276 builder2.Append( string.Format( "nID#{0:D3}", c曲リストノード2.nID ) );
\r
277 if( c曲リストノード2.r親ノード != null )
\r
279 builder2.Append( string.Format( "(in#{0:D3}):", c曲リストノード2.r親ノード.nID ) );
\r
283 builder2.Append( "(onRoot):" );
\r
285 builder2.Append( " SONG, File=" + c曲リストノード2.arスコア[ 0 ].ファイル情報.ファイルの絶対パス );
\r
286 builder2.Append( ", Size=" + c曲リストノード2.arスコア[ 0 ].ファイル情報.ファイルサイズ );
\r
287 builder2.Append( ", LastUpdate=" + c曲リストノード2.arスコア[ 0 ].ファイル情報.最終更新日時 );
\r
288 Trace.TraceInformation( builder2.ToString() );
\r
296 else if( !str4.Equals( ".mid" ) )
\r
298 str4.Equals( ".smf" );
\r
302 //-----------------------------
\r
305 foreach( DirectoryInfo info6 in info.GetDirectories() )
\r
307 #region [ a. "dtxfiles." で始まるフォルダの場合 ]
\r
308 //-----------------------------
\r
309 if( info6.Name.ToLower().StartsWith( "dtxfiles." ) )
\r
311 C曲リストノード c曲リストノード3 = new C曲リストノード();
\r
312 c曲リストノード3.eノード種別 = C曲リストノード.Eノード種別.BOX;
\r
313 c曲リストノード3.bDTXFilesで始まるフォルダ名のBOXである = true;
\r
314 c曲リストノード3.strタイトル = info6.Name.Substring( 9 );
\r
315 c曲リストノード3.nスコア数 = 1;
\r
316 c曲リストノード3.r親ノード = node親;
\r
317 c曲リストノード3.list子リスト = new List<C曲リストノード>();
\r
318 c曲リストノード3.arスコア[ 0 ] = new Cスコア();
\r
319 c曲リストノード3.arスコア[ 0 ].ファイル情報.フォルダの絶対パス = info6.FullName + @"\";
\r
320 c曲リストノード3.arスコア[ 0 ].譜面情報.タイトル = c曲リストノード3.strタイトル;
\r
321 c曲リストノード3.arスコア[ 0 ].譜面情報.コメント =
\r
322 (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?
\r
324 "Enter into the BOX.";
\r
325 listノードリスト.Add(c曲リストノード3);
\r
326 if( File.Exists( info6.FullName + @"\box.def" ) )
\r
328 CBoxDef def2 = new CBoxDef( info6.FullName + @"\box.def" );
\r
329 if( ( def2.Title != null ) && ( def2.Title.Length > 0 ) )
\r
331 c曲リストノード3.strタイトル = def2.Title;
\r
333 if( ( def2.Genre != null ) && ( def2.Genre.Length > 0 ) )
\r
335 c曲リストノード3.strジャンル = def2.Genre;
\r
337 if( def2.Color != Color.White )
\r
339 c曲リストノード3.col文字色 = def2.Color;
\r
341 if( ( def2.Artist != null ) && ( def2.Artist.Length > 0 ) )
\r
343 c曲リストノード3.arスコア[ 0 ].譜面情報.アーティスト名 = def2.Artist;
\r
345 if( ( def2.Comment != null ) && ( def2.Comment.Length > 0 ) )
\r
347 c曲リストノード3.arスコア[ 0 ].譜面情報.コメント = def2.Comment;
\r
349 if( ( def2.Preimage != null ) && ( def2.Preimage.Length > 0 ) )
\r
351 c曲リストノード3.arスコア[ 0 ].譜面情報.Preimage = def2.Preimage;
\r
353 if( ( def2.Premovie != null ) && ( def2.Premovie.Length > 0 ) )
\r
355 c曲リストノード3.arスコア[ 0 ].譜面情報.Premovie = def2.Premovie;
\r
357 if( ( def2.Presound != null ) && ( def2.Presound.Length > 0 ) )
\r
359 c曲リストノード3.arスコア[ 0 ].譜面情報.Presound = def2.Presound;
\r
361 if( def2.PerfectRange >= 0 )
\r
363 c曲リストノード3.nPerfect範囲ms = def2.PerfectRange;
\r
365 if( def2.GreatRange >= 0 )
\r
367 c曲リストノード3.nGreat範囲ms = def2.GreatRange;
\r
369 if( def2.GoodRange >= 0 )
\r
371 c曲リストノード3.nGood範囲ms = def2.GoodRange;
\r
373 if( def2.PoorRange >= 0 )
\r
375 c曲リストノード3.nPoor範囲ms = def2.PoorRange;
\r
378 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
383 StringBuilder builder3 = new StringBuilder( 0x100 );
\r
384 builder3.Append( string.Format( "nID#{0:D3}", c曲リストノード3.nID ) );
\r
385 if( c曲リストノード3.r親ノード != null )
\r
387 builder3.Append( string.Format( "(in#{0:D3}):", c曲リストノード3.r親ノード.nID ) );
\r
391 builder3.Append( "(onRoot):" );
\r
393 builder3.Append( " BOX, Title=" + c曲リストノード3.strタイトル );
\r
394 builder3.Append( ", Folder=" + c曲リストノード3.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
395 builder3.Append( ", Comment=" + c曲リストノード3.arスコア[ 0 ].譜面情報.コメント );
\r
396 Trace.TraceInformation( builder3.ToString() );
\r
405 this.t曲を検索してリストを作成する( info6.FullName + @"\", b子BOXへ再帰する, c曲リストノード3.list子リスト, c曲リストノード3 );
\r
408 //-----------------------------
\r
411 #region [ b.box.def を含むフォルダの場合 ]
\r
412 //-----------------------------
\r
413 else if( File.Exists( info6.FullName + @"\box.def" ) )
\r
415 CBoxDef def3 = new CBoxDef( info6.FullName + @"\box.def" );
\r
416 C曲リストノード c曲リストノード4 = new C曲リストノード();
\r
417 c曲リストノード4.eノード種別 = C曲リストノード.Eノード種別.BOX;
\r
418 c曲リストノード4.bDTXFilesで始まるフォルダ名のBOXである = false;
\r
419 c曲リストノード4.strタイトル = def3.Title;
\r
420 c曲リストノード4.strジャンル = def3.Genre;
\r
421 c曲リストノード4.col文字色 = def3.Color;
\r
422 c曲リストノード4.nスコア数 = 1;
\r
423 c曲リストノード4.arスコア[ 0 ] = new Cスコア();
\r
424 c曲リストノード4.arスコア[ 0 ].ファイル情報.フォルダの絶対パス = info6.FullName + @"\";
\r
425 c曲リストノード4.arスコア[ 0 ].譜面情報.タイトル = def3.Title;
\r
426 c曲リストノード4.arスコア[ 0 ].譜面情報.ジャンル = def3.Genre;
\r
427 c曲リストノード4.arスコア[ 0 ].譜面情報.アーティスト名 = def3.Artist;
\r
428 c曲リストノード4.arスコア[ 0 ].譜面情報.コメント = def3.Comment;
\r
429 c曲リストノード4.arスコア[ 0 ].譜面情報.Preimage = def3.Preimage;
\r
430 c曲リストノード4.arスコア[ 0 ].譜面情報.Premovie = def3.Premovie;
\r
431 c曲リストノード4.arスコア[ 0 ].譜面情報.Presound = def3.Presound;
\r
432 c曲リストノード4.r親ノード = node親;
\r
433 c曲リストノード4.list子リスト = new List<C曲リストノード>();
\r
434 c曲リストノード4.nPerfect範囲ms = def3.PerfectRange;
\r
435 c曲リストノード4.nGreat範囲ms = def3.GreatRange;
\r
436 c曲リストノード4.nGood範囲ms = def3.GoodRange;
\r
437 c曲リストノード4.nPoor範囲ms = def3.PoorRange;
\r
438 listノードリスト.Add( c曲リストノード4 );
\r
439 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
441 Trace.TraceInformation( "box.def検出 : {0}", new object[] { info6.FullName + @"\box.def" } );
\r
445 StringBuilder builder4 = new StringBuilder( 0x400 );
\r
446 builder4.Append( string.Format( "nID#{0:D3}", c曲リストノード4.nID ) );
\r
447 if( c曲リストノード4.r親ノード != null )
\r
449 builder4.Append( string.Format( "(in#{0:D3}):", c曲リストノード4.r親ノード.nID ) );
\r
453 builder4.Append( "(onRoot):" );
\r
455 builder4.Append( "BOX, Title=" + c曲リストノード4.strタイトル );
\r
456 if( ( c曲リストノード4.strジャンル != null ) && ( c曲リストノード4.strジャンル.Length > 0 ) )
\r
458 builder4.Append( ", Genre=" + c曲リストノード4.strジャンル );
\r
460 if( ( c曲リストノード4.arスコア[ 0 ].譜面情報.アーティスト名 != null ) && ( c曲リストノード4.arスコア[ 0 ].譜面情報.アーティスト名.Length > 0 ) )
\r
462 builder4.Append( ", Artist=" + c曲リストノード4.arスコア[ 0 ].譜面情報.アーティスト名 );
\r
464 if( ( c曲リストノード4.arスコア[ 0 ].譜面情報.コメント != null ) && ( c曲リストノード4.arスコア[ 0 ].譜面情報.コメント.Length > 0 ) )
\r
466 builder4.Append( ", Comment=" + c曲リストノード4.arスコア[ 0 ].譜面情報.コメント );
\r
468 if( ( c曲リストノード4.arスコア[ 0 ].譜面情報.Preimage != null ) && ( c曲リストノード4.arスコア[ 0 ].譜面情報.Preimage.Length > 0 ) )
\r
470 builder4.Append( ", Preimage=" + c曲リストノード4.arスコア[ 0 ].譜面情報.Preimage );
\r
472 if( ( c曲リストノード4.arスコア[ 0 ].譜面情報.Premovie != null ) && ( c曲リストノード4.arスコア[ 0 ].譜面情報.Premovie.Length > 0 ) )
\r
474 builder4.Append( ", Premovie=" + c曲リストノード4.arスコア[ 0 ].譜面情報.Premovie );
\r
476 if( ( c曲リストノード4.arスコア[ 0 ].譜面情報.Presound != null ) && ( c曲リストノード4.arスコア[ 0 ].譜面情報.Presound.Length > 0 ) )
\r
478 builder4.Append( ", Presound=" + c曲リストノード4.arスコア[ 0 ].譜面情報.Presound );
\r
480 if( c曲リストノード4.col文字色 != ColorTranslator.FromHtml( "White" ) )
\r
482 builder4.Append( ", FontColor=" + c曲リストノード4.col文字色 );
\r
484 if( c曲リストノード4.nPerfect範囲ms != -1 )
\r
486 builder4.Append( ", Perfect=" + c曲リストノード4.nPerfect範囲ms + "ms" );
\r
488 if( c曲リストノード4.nGreat範囲ms != -1 )
\r
490 builder4.Append( ", Great=" + c曲リストノード4.nGreat範囲ms + "ms" );
\r
492 if( c曲リストノード4.nGood範囲ms != -1 )
\r
494 builder4.Append( ", Good=" + c曲リストノード4.nGood範囲ms + "ms" );
\r
496 if( c曲リストノード4.nPoor範囲ms != -1 )
\r
498 builder4.Append( ", Poor=" + c曲リストノード4.nPoor範囲ms + "ms" );
\r
500 Trace.TraceInformation( builder4.ToString() );
\r
509 this.t曲を検索してリストを作成する( info6.FullName + @"\", b子BOXへ再帰する, c曲リストノード4.list子リスト, c曲リストノード4 );
\r
512 //-----------------------------
\r
515 #region [ c.通常フォルダの場合 ]
\r
516 //-----------------------------
\r
519 this.t曲を検索してリストを作成する( info6.FullName + @"\", b子BOXへ再帰する, listノードリスト, node親 );
\r
521 //-----------------------------
\r
525 //-----------------
\r
527 #region [ スコアキャッシュを曲リストに反映する ]
\r
528 //-----------------
\r
529 public void tスコアキャッシュを曲リストに反映する()
\r
531 this.nスコアキャッシュから反映できたスコア数 = 0;
\r
532 this.tスコアキャッシュを曲リストに反映する( this.list曲ルート );
\r
534 private void tスコアキャッシュを曲リストに反映する( List<C曲リストノード> ノードリスト )
\r
536 using( List<C曲リストノード>.Enumerator enumerator = ノードリスト.GetEnumerator() )
\r
538 while( enumerator.MoveNext() )
\r
540 C曲リストノード node = enumerator.Current;
\r
541 if( node.eノード種別 == C曲リストノード.Eノード種別.BOX )
\r
543 this.tスコアキャッシュを曲リストに反映する( node.list子リスト );
\r
545 else if( ( node.eノード種別 == C曲リストノード.Eノード種別.SCORE ) || ( node.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) )
\r
547 Predicate<Cスコア> match = null;
\r
548 for( int lv = 0; lv < 5; lv++ )
\r
550 if( node.arスコア[ lv ] != null )
\r
552 if( match == null )
\r
554 match = delegate( Cスコア sc )
\r
556 return ( ( sc.ファイル情報.ファイルの絶対パス.Equals( node.arスコア[ lv ].ファイル情報.ファイルの絶対パス )
\r
557 && sc.ファイル情報.ファイルサイズ.Equals( node.arスコア[ lv ].ファイル情報.ファイルサイズ ) )
\r
558 && ( sc.ファイル情報.最終更新日時.Equals( node.arスコア[ lv ].ファイル情報.最終更新日時 )
\r
559 && sc.ScoreIni情報.ファイルサイズ.Equals( node.arスコア[ lv ].ScoreIni情報.ファイルサイズ ) ) )
\r
560 && sc.ScoreIni情報.最終更新日時.Equals( node.arスコア[ lv ].ScoreIni情報.最終更新日時 );
\r
563 int num = this.listSongsDB.FindIndex( match );
\r
566 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
568 Trace.TraceInformation( "songs.db に存在しません。({0})", new object[] { node.arスコア[ lv ].ファイル情報.ファイルの絶対パス } );
\r
573 node.arスコア[ lv ].譜面情報 = this.listSongsDB[ num ].譜面情報;
\r
574 node.arスコア[ lv ].bSongDBにキャッシュがあった = true;
\r
575 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
577 Trace.TraceInformation( "songs.db から転記しました。({0})", new object[] { node.arスコア[ lv ].ファイル情報.ファイルの絶対パス } );
\r
579 this.nスコアキャッシュから反映できたスコア数++;
\r
580 if( node.arスコア[ lv ].ScoreIni情報.最終更新日時 != this.listSongsDB[ num ].ScoreIni情報.最終更新日時 )
\r
582 string str = node.arスコア[ lv ].ファイル情報.ファイルの絶対パス + ".score.ini";
\r
585 CScoreIni ini = new CScoreIni( str );
\r
586 ini.t全演奏記録セクションの整合性をチェックし不整合があればリセットする();
\r
587 for( int i = 0; i < 3; i++ )
\r
589 int num3 = ( i * 2 ) + 1;
\r
590 if( ( ini.stセクション[ num3 ].b演奏にMIDI入力を使用した || ini.stセクション[ num3 ].b演奏にキーボードを使用した ) || ( ini.stセクション[ num3 ].b演奏にジョイパッドを使用した || ini.stセクション[ num3 ].b演奏にマウスを使用した ) )
\r
592 node.arスコア[ lv ].譜面情報.最大ランク[ i ] =
\r
593 (ini.stファイル.BestRank[i] != (int)CScoreIni.ERANK.UNKNOWN)?
\r
594 (int)ini.stファイル.BestRank[i] : CScoreIni.tランク値を計算して返す( ini.stセクション[ num3 ] );
\r
598 node.arスコア[ lv ].譜面情報.最大ランク[ i ] = (int)CScoreIni.ERANK.UNKNOWN;
\r
600 node.arスコア[ lv ].譜面情報.最大スキル[ i ] = ini.stセクション[ num3 ].db演奏型スキル値;
\r
601 node.arスコア[ lv ].譜面情報.フルコンボ[ i ] = ini.stセクション[ num3 ].bフルコンボである;
\r
603 node.arスコア[ lv ].譜面情報.演奏回数.Drums = ini.stファイル.PlayCountDrums;
\r
604 node.arスコア[ lv ].譜面情報.演奏回数.Guitar = ini.stファイル.PlayCountGuitar;
\r
605 node.arスコア[ lv ].譜面情報.演奏回数.Bass = ini.stファイル.PlayCountBass;
\r
606 for( int j = 0; j < 5; j++ )
\r
608 node.arスコア[ lv ].譜面情報.演奏履歴[ j ] = ini.stファイル.History[ j ];
\r
610 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
612 Trace.TraceInformation( "演奏記録ファイルから HiSkill 情報と演奏履歴を取得しました。({0})", new object[] { str } );
\r
617 Trace.TraceError( "演奏記録ファイルの読み込みに失敗しました。({0})", new object[] { str } );
\r
627 private Cスコア tSongsDBからスコアを1つ読み込む( BinaryReader br )
\r
629 Cスコア cスコア = new Cスコア();
\r
630 cスコア.ファイル情報.ファイルの絶対パス = br.ReadString();
\r
631 cスコア.ファイル情報.フォルダの絶対パス = br.ReadString();
\r
632 cスコア.ファイル情報.最終更新日時 = new DateTime( br.ReadInt64() );
\r
633 cスコア.ファイル情報.ファイルサイズ = br.ReadInt64();
\r
634 cスコア.ScoreIni情報.最終更新日時 = new DateTime( br.ReadInt64() );
\r
635 cスコア.ScoreIni情報.ファイルサイズ = br.ReadInt64();
\r
636 cスコア.譜面情報.タイトル = br.ReadString();
\r
637 cスコア.譜面情報.アーティスト名 = br.ReadString();
\r
638 cスコア.譜面情報.コメント = br.ReadString();
\r
639 cスコア.譜面情報.ジャンル = br.ReadString();
\r
640 cスコア.譜面情報.Preimage = br.ReadString();
\r
641 cスコア.譜面情報.Premovie = br.ReadString();
\r
642 cスコア.譜面情報.Presound = br.ReadString();
\r
643 cスコア.譜面情報.Backgound = br.ReadString();
\r
644 cスコア.譜面情報.レベル.Drums = br.ReadInt32();
\r
645 cスコア.譜面情報.レベル.Guitar = br.ReadInt32();
\r
646 cスコア.譜面情報.レベル.Bass = br.ReadInt32();
\r
647 cスコア.譜面情報.最大ランク.Drums = br.ReadInt32();
\r
648 cスコア.譜面情報.最大ランク.Guitar = br.ReadInt32();
\r
649 cスコア.譜面情報.最大ランク.Bass = br.ReadInt32();
\r
650 cスコア.譜面情報.最大スキル.Drums = br.ReadDouble();
\r
651 cスコア.譜面情報.最大スキル.Guitar = br.ReadDouble();
\r
652 cスコア.譜面情報.最大スキル.Bass = br.ReadDouble();
\r
653 cスコア.譜面情報.フルコンボ.Drums = br.ReadBoolean();
\r
654 cスコア.譜面情報.フルコンボ.Guitar = br.ReadBoolean();
\r
655 cスコア.譜面情報.フルコンボ.Bass = br.ReadBoolean();
\r
656 cスコア.譜面情報.演奏回数.Drums = br.ReadInt32();
\r
657 cスコア.譜面情報.演奏回数.Guitar = br.ReadInt32();
\r
658 cスコア.譜面情報.演奏回数.Bass = br.ReadInt32();
\r
659 cスコア.譜面情報.演奏履歴.行1 = br.ReadString();
\r
660 cスコア.譜面情報.演奏履歴.行2 = br.ReadString();
\r
661 cスコア.譜面情報.演奏履歴.行3 = br.ReadString();
\r
662 cスコア.譜面情報.演奏履歴.行4 = br.ReadString();
\r
663 cスコア.譜面情報.演奏履歴.行5 = br.ReadString();
\r
664 cスコア.譜面情報.レベルを非表示にする = br.ReadBoolean();
\r
665 cスコア.譜面情報.曲種別 = (CDTX.E種別) br.ReadInt32();
\r
666 // cスコア.譜面情報.bpm = br.ReadDouble();
\r
669 //-----------------
\r
671 #region [ SongsDBになかった曲をファイルから読み込んで反映する ]
\r
672 //-----------------
\r
673 public void tSongsDBになかった曲をファイルから読み込んで反映する()
\r
675 this.nファイルから反映できたスコア数 = 0;
\r
676 this.tSongsDBになかった曲をファイルから読み込んで反映する( this.list曲ルート );
\r
678 private void tSongsDBになかった曲をファイルから読み込んで反映する( List<C曲リストノード> ノードリスト )
\r
680 foreach( C曲リストノード c曲リストノード in ノードリスト )
\r
682 if( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX )
\r
684 this.tSongsDBになかった曲をファイルから読み込んで反映する( c曲リストノード.list子リスト );
\r
686 else if( ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE ) || ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) )
\r
688 for( int i = 0; i < 5; i++ )
\r
690 if( ( c曲リストノード.arスコア[ i ] != null ) && !c曲リストノード.arスコア[ i ].bSongDBにキャッシュがあった )
\r
692 #region [ DTX ファイルのヘッダだけ読み込み、Cスコア.譜面情報 を設定する ]
\r
693 //-----------------
\r
694 string path = c曲リストノード.arスコア[ i ].ファイル情報.ファイルの絶対パス;
\r
695 if( File.Exists( path ) )
\r
699 CDTX cdtx = new CDTX( c曲リストノード.arスコア[ i ].ファイル情報.ファイルの絶対パス, true );
\r
700 c曲リストノード.arスコア[ i ].譜面情報.タイトル = cdtx.TITLE;
\r
701 c曲リストノード.arスコア[ i ].譜面情報.アーティスト名 = cdtx.ARTIST;
\r
702 c曲リストノード.arスコア[ i ].譜面情報.コメント = cdtx.COMMENT;
\r
703 c曲リストノード.arスコア[ i ].譜面情報.ジャンル = cdtx.GENRE;
\r
704 c曲リストノード.arスコア[ i ].譜面情報.Preimage = cdtx.PREIMAGE;
\r
705 c曲リストノード.arスコア[ i ].譜面情報.Premovie = cdtx.PREMOVIE;
\r
706 c曲リストノード.arスコア[ i ].譜面情報.Presound = cdtx.PREVIEW;
\r
707 c曲リストノード.arスコア[ i ].譜面情報.Backgound = ( ( cdtx.BACKGROUND != null ) && ( cdtx.BACKGROUND.Length > 0 ) ) ? cdtx.BACKGROUND : cdtx.BACKGROUND_GR;
\r
708 c曲リストノード.arスコア[ i ].譜面情報.レベル.Drums = cdtx.LEVEL.Drums;
\r
709 c曲リストノード.arスコア[ i ].譜面情報.レベル.Guitar = cdtx.LEVEL.Guitar;
\r
710 c曲リストノード.arスコア[ i ].譜面情報.レベル.Bass = cdtx.LEVEL.Bass;
\r
711 c曲リストノード.arスコア[ i ].譜面情報.レベルを非表示にする = cdtx.HIDDENLEVEL;
\r
712 c曲リストノード.arスコア[ i ].譜面情報.曲種別 = cdtx.e種別;
\r
713 // c曲リストノード.arスコア[ i ].譜面情報.bpm = cdtx.BPM;
\r
714 this.nファイルから反映できたスコア数++;
\r
717 #region [ 曲検索ログ出力 ]
\r
718 //-----------------
\r
719 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
721 StringBuilder builder = new StringBuilder( 0x400 );
\r
722 builder.Append( string.Format( "曲データファイルから譜面情報を転記しました。({0})", path ) );
\r
723 builder.Append( "(title=" + c曲リストノード.arスコア[ i ].譜面情報.タイトル );
\r
724 builder.Append( ", artist=" + c曲リストノード.arスコア[ i ].譜面情報.アーティスト名 );
\r
725 builder.Append( ", comment=" + c曲リストノード.arスコア[ i ].譜面情報.コメント );
\r
726 builder.Append( ", genre=" + c曲リストノード.arスコア[ i ].譜面情報.ジャンル );
\r
727 builder.Append( ", preimage=" + c曲リストノード.arスコア[ i ].譜面情報.Preimage );
\r
728 builder.Append( ", premovie=" + c曲リストノード.arスコア[ i ].譜面情報.Premovie );
\r
729 builder.Append( ", presound=" + c曲リストノード.arスコア[ i ].譜面情報.Presound );
\r
730 builder.Append( ", background=" + c曲リストノード.arスコア[ i ].譜面情報.Backgound );
\r
731 builder.Append( ", lvDr=" + c曲リストノード.arスコア[ i ].譜面情報.レベル.Drums );
\r
732 builder.Append( ", lvGt=" + c曲リストノード.arスコア[ i ].譜面情報.レベル.Guitar );
\r
733 builder.Append( ", lvBs=" + c曲リストノード.arスコア[ i ].譜面情報.レベル.Bass );
\r
734 builder.Append( ", lvHide=" + c曲リストノード.arスコア[ i ].譜面情報.レベルを非表示にする );
\r
735 builder.Append( ", type=" + c曲リストノード.arスコア[ i ].譜面情報.曲種別 );
\r
736 // builder.Append( ", bpm=" + c曲リストノード.arスコア[ i ].譜面情報.bpm );
\r
737 Trace.TraceInformation( builder.ToString() );
\r
739 //-----------------
\r
742 catch( Exception exception )
\r
744 Trace.TraceError( exception.Message );
\r
745 c曲リストノード.arスコア[ i ] = null;
\r
748 Trace.TraceError( "曲データファイルの読み込みに失敗しました。({0})", new object[] { path } );
\r
751 //-----------------
\r
754 #region [ 対応する .score.ini が存在していれば読み込み、Cスコア.譜面情報 に追加設定する ]
\r
755 //-----------------
\r
756 this.tScoreIniを読み込んで譜面情報を設定する( c曲リストノード.arスコア[ i ].ファイル情報.ファイルの絶対パス + ".score.ini", ref c曲リストノード.arスコア[ i ] );
\r
757 //-----------------
\r
764 //-----------------
\r
766 #region [ 曲リストへ後処理を適用する ]
\r
767 //-----------------
\r
768 public void t曲リストへ後処理を適用する()
\r
770 this.t曲リストへ後処理を適用する( this.list曲ルート );
\r
772 private void t曲リストへ後処理を適用する( List<C曲リストノード> ノードリスト )
\r
774 #region [ リストに1つ以上の曲があるなら RANDOM BOX を入れる ]
\r
775 //-----------------------------
\r
776 if( ノードリスト.Count > 0 )
\r
778 C曲リストノード item = new C曲リストノード();
\r
779 item.eノード種別 = C曲リストノード.Eノード種別.RANDOM;
\r
780 item.strタイトル = "< RANDOM SELECT >";
\r
782 item.r親ノード = ノードリスト[ 0 ].r親ノード;
\r
783 for( int i = 0; i < 5; i++ )
\r
785 item.arスコア[ i ] = new Cスコア();
\r
786 item.arスコア[ i ].譜面情報.タイトル = string.Format( "< RANDOM SELECT Lv.{0} >", i + 1 );
\r
787 item.arスコア[i].譜面情報.コメント =
\r
788 (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?
\r
789 string.Format("難易度レベル {0} 付近の曲をランダムに選択します。難易度レベルを持たない曲も選択候補となります。", i + 1) :
\r
790 string.Format("Random select from the songs which has the level about L{0}. Non-leveled songs may also selected.", i + 1);
\r
791 item.ar難易度ラベル[ i ] = string.Format( "L{0}", i + 1 );
\r
793 ノードリスト.Add( item );
\r
796 //-----------------------------
\r
797 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
799 StringBuilder builder = new StringBuilder( 0x100 );
\r
800 builder.Append( string.Format( "nID#{0:D3}", item.nID ) );
\r
801 if( item.r親ノード != null )
\r
803 builder.Append( string.Format( "(in#{0:D3}):", item.r親ノード.nID ) );
\r
807 builder.Append( "(onRoot):" );
\r
809 builder.Append( " RANDOM" );
\r
810 Trace.TraceInformation( builder.ToString() );
\r
812 //-----------------------------
\r
815 //-----------------------------
\r
819 foreach( C曲リストノード c曲リストノード2 in ノードリスト )
\r
821 #region [ BOXノードなら子リストに <<BACK を入れ、子リストに後処理を適用する ]
\r
822 //-----------------------------
\r
823 if( c曲リストノード2.eノード種別 == C曲リストノード.Eノード種別.BOX )
\r
825 C曲リストノード c曲リストノード3 = new C曲リストノード();
\r
826 c曲リストノード3.eノード種別 = C曲リストノード.Eノード種別.BACKBOX;
\r
827 c曲リストノード3.strタイトル = "<< BACK";
\r
828 c曲リストノード3.nスコア数 = 1;
\r
829 c曲リストノード3.r親ノード = c曲リストノード2;
\r
830 c曲リストノード3.arスコア[ 0 ] = new Cスコア();
\r
831 c曲リストノード3.arスコア[ 0 ].ファイル情報.フォルダの絶対パス = "";
\r
832 c曲リストノード3.arスコア[ 0 ].譜面情報.タイトル = c曲リストノード3.strタイトル;
\r
833 c曲リストノード3.arスコア[ 0 ].譜面情報.コメント =
\r
834 (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?
\r
836 "Exit from the BOX.";
\r
837 c曲リストノード2.list子リスト.Insert( 0, c曲リストノード3 );
\r
840 //-----------------------------
\r
841 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
843 StringBuilder builder2 = new StringBuilder( 0x100 );
\r
844 builder2.Append( string.Format( "nID#{0:D3}", c曲リストノード3.nID ) );
\r
845 if( c曲リストノード3.r親ノード != null )
\r
847 builder2.Append( string.Format( "(in#{0:D3}):", c曲リストノード3.r親ノード.nID ) );
\r
851 builder2.Append( "(onRoot):" );
\r
853 builder2.Append( " BACKBOX" );
\r
854 Trace.TraceInformation( builder2.ToString() );
\r
856 //-----------------------------
\r
859 this.t曲リストへ後処理を適用する( c曲リストノード2.list子リスト );
\r
862 //-----------------------------
\r
865 #region [ ノードにタイトルがないなら、最初に見つけたスコアのタイトルを設定する ]
\r
866 //-----------------------------
\r
867 if( string.IsNullOrEmpty( c曲リストノード2.strタイトル ) )
\r
869 for( int j = 0; j < 5; j++ )
\r
871 if( ( c曲リストノード2.arスコア[ j ] != null ) && !string.IsNullOrEmpty( c曲リストノード2.arスコア[ j ].譜面情報.タイトル ) )
\r
873 c曲リストノード2.strタイトル = c曲リストノード2.arスコア[ j ].譜面情報.タイトル;
\r
875 if( CDTXMania.ConfigIni.bLog曲検索ログ出力 )
\r
876 Trace.TraceInformation( "タイトルを設定しました。(nID#{0:D3}, title={1})", new object[] { c曲リストノード2.nID, c曲リストノード2.strタイトル } );
\r
882 //-----------------------------
\r
886 #region [ ノードをソートする ]
\r
887 //-----------------------------
\r
888 this.t曲リストのソート1_絶対パス順( ノードリスト );
\r
889 //-----------------------------
\r
892 //-----------------
\r
894 #region [ スコアキャッシュをSongsDBに出力する ]
\r
895 //-----------------
\r
896 public void tスコアキャッシュをSongsDBに出力する( string SongsDBファイル名 )
\r
898 this.nSongsDBへ出力できたスコア数 = 0;
\r
901 BinaryWriter bw = new BinaryWriter( new FileStream( SongsDBファイル名, FileMode.Create, FileAccess.Write ) );
\r
902 bw.Write( SONGSDB_VERSION );
\r
903 this.tSongsDBにリストを1つ出力する( bw, this.list曲ルート );
\r
908 Trace.TraceError( "songs.dbの出力に失敗しました。" );
\r
911 private void tSongsDBにノードを1つ出力する( BinaryWriter bw, C曲リストノード node )
\r
913 for( int i = 0; i < 5; i++ )
\r
915 if( node.arスコア[ i ] != null )
\r
917 bw.Write( node.arスコア[ i ].ファイル情報.ファイルの絶対パス );
\r
918 bw.Write( node.arスコア[ i ].ファイル情報.フォルダの絶対パス );
\r
919 bw.Write( node.arスコア[ i ].ファイル情報.最終更新日時.Ticks );
\r
920 bw.Write( node.arスコア[ i ].ファイル情報.ファイルサイズ );
\r
921 bw.Write( node.arスコア[ i ].ScoreIni情報.最終更新日時.Ticks );
\r
922 bw.Write( node.arスコア[ i ].ScoreIni情報.ファイルサイズ );
\r
923 bw.Write( node.arスコア[ i ].譜面情報.タイトル );
\r
924 bw.Write( node.arスコア[ i ].譜面情報.アーティスト名 );
\r
925 bw.Write( node.arスコア[ i ].譜面情報.コメント );
\r
926 bw.Write( node.arスコア[ i ].譜面情報.ジャンル );
\r
927 bw.Write( node.arスコア[ i ].譜面情報.Preimage );
\r
928 bw.Write( node.arスコア[ i ].譜面情報.Premovie );
\r
929 bw.Write( node.arスコア[ i ].譜面情報.Presound );
\r
930 bw.Write( node.arスコア[ i ].譜面情報.Backgound );
\r
931 bw.Write( node.arスコア[ i ].譜面情報.レベル.Drums );
\r
932 bw.Write( node.arスコア[ i ].譜面情報.レベル.Guitar );
\r
933 bw.Write( node.arスコア[ i ].譜面情報.レベル.Bass );
\r
934 bw.Write( node.arスコア[ i ].譜面情報.最大ランク.Drums );
\r
935 bw.Write( node.arスコア[ i ].譜面情報.最大ランク.Guitar );
\r
936 bw.Write( node.arスコア[ i ].譜面情報.最大ランク.Bass );
\r
937 bw.Write( node.arスコア[ i ].譜面情報.最大スキル.Drums );
\r
938 bw.Write( node.arスコア[ i ].譜面情報.最大スキル.Guitar );
\r
939 bw.Write( node.arスコア[ i ].譜面情報.最大スキル.Bass );
\r
940 bw.Write( node.arスコア[ i ].譜面情報.フルコンボ.Drums );
\r
941 bw.Write( node.arスコア[ i ].譜面情報.フルコンボ.Guitar );
\r
942 bw.Write( node.arスコア[ i ].譜面情報.フルコンボ.Bass );
\r
943 bw.Write( node.arスコア[ i ].譜面情報.演奏回数.Drums );
\r
944 bw.Write( node.arスコア[ i ].譜面情報.演奏回数.Guitar );
\r
945 bw.Write( node.arスコア[ i ].譜面情報.演奏回数.Bass );
\r
946 bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行1 );
\r
947 bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行2 );
\r
948 bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行3 );
\r
949 bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行4 );
\r
950 bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行5 );
\r
951 bw.Write( node.arスコア[ i ].譜面情報.レベルを非表示にする );
\r
952 bw.Write( (int) node.arスコア[ i ].譜面情報.曲種別 );
\r
953 // bw.Write( node.arスコア[ i ].譜面情報.bpm );
\r
954 this.nSongsDBへ出力できたスコア数++;
\r
958 private void tSongsDBにリストを1つ出力する( BinaryWriter bw, List<C曲リストノード> list )
\r
960 foreach( C曲リストノード c曲リストノード in list )
\r
962 if( ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE ) || ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) )
\r
964 this.tSongsDBにノードを1つ出力する( bw, c曲リストノード );
\r
966 if( c曲リストノード.list子リスト != null )
\r
968 this.tSongsDBにリストを1つ出力する( bw, c曲リストノード.list子リスト );
\r
972 //-----------------
\r
975 #region [ 曲リストソート ]
\r
976 //-----------------
\r
977 public void t曲リストのソート1_絶対パス順( List<C曲リストノード> ノードリスト )
\r
979 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
986 int num = this.t比較0_共通( n1, n2 );
\r
991 if( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
993 return n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
997 if( string.IsNullOrEmpty( n1.pathSetDefの絶対パス ) )
\r
999 for( int i = 0; i < 5; i++ )
\r
1001 if( n1.arスコア[ i ] != null )
\r
1003 str = n1.arスコア[ i ].ファイル情報.ファイルの絶対パス;
\r
1014 str = n1.pathSetDefの絶対パス + n1.SetDefのブロック番号.ToString( "00" );
\r
1017 if( string.IsNullOrEmpty( n2.pathSetDefの絶対パス ) )
\r
1019 for( int j = 0; j < 5; j++ )
\r
1021 if( n2.arスコア[ j ] != null )
\r
1023 strB = n2.arスコア[ j ].ファイル情報.ファイルの絶対パス;
\r
1024 if( strB == null )
\r
1034 strB = n2.pathSetDefの絶対パス + n2.SetDefのブロック番号.ToString( "00" );
\r
1036 return str.CompareTo( strB );
\r
1038 foreach( C曲リストノード c曲リストノード in ノードリスト )
\r
1040 if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )
\r
1042 this.t曲リストのソート1_絶対パス順( c曲リストノード.list子リスト );
\r
1046 public void t曲リストのソート2_タイトル順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1048 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1054 int num = this.t比較0_共通( n1, n2 );
\r
1057 return order * num;
\r
1059 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1061 // foreach( C曲リストノード c曲リストノード in ノードリスト )
\r
1063 // if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )
\r
1065 // this.t曲リストのソート2_タイトル順( c曲リストノード.list子リスト, part, order );
\r
1072 /// <param name="ノードリスト"></param>
\r
1073 /// <param name="part"></param>
\r
1074 /// <param name="order">1=Ascend -1=Descend</param>
\r
1075 public void t曲リストのソート3_演奏回数の多い順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1078 int nL12345 = (int) p[ 0 ];
\r
1079 if ( part != E楽器パート.UNKNOWN )
\r
1081 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1088 int num = this.t比較0_共通( n1, n2 );
\r
1091 return order * num;
\r
1093 if( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1095 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1098 int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;
\r
1099 // for( int i = 0; i < 5; i++ )
\r
1101 if( n1.arスコア[ nL12345 ] != null )
\r
1103 nSumPlayCountN1 += n1.arスコア[ nL12345 ].譜面情報.演奏回数[ (int) part ];
\r
1105 if( n2.arスコア[ nL12345 ] != null )
\r
1107 nSumPlayCountN2 += n2.arスコア[ nL12345 ].譜面情報.演奏回数[ (int) part ];
\r
1110 num = nSumPlayCountN2 - nSumPlayCountN1;
\r
1113 return order * num;
\r
1115 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1117 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1119 int nSumPlayCountN1 = 0;
\r
1120 // for ( int i = 0; i < 5; i++ )
\r
1122 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1124 nSumPlayCountN1 += c曲リストノード.arスコア[ nL12345 ].譜面情報.演奏回数[ (int) part ];
\r
1127 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );
\r
1130 // foreach( C曲リストノード c曲リストノード in ノードリスト )
\r
1132 // if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )
\r
1134 // this.t曲リストのソート3_演奏回数の多い順( c曲リストノード.list子リスト, part );
\r
1139 public void t曲リストのソート4_LEVEL順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1142 int nL12345 = (int)p[ 0 ];
\r
1143 if ( part != E楽器パート.UNKNOWN )
\r
1145 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1152 int num = this.t比較0_共通( n1, n2 );
\r
1155 return order * num;
\r
1157 if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1159 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1162 int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;
\r
1163 if ( n1.arスコア[ nL12345 ] != null )
\r
1165 nSumPlayCountN1 = n1.arスコア[ nL12345 ].譜面情報.レベル[ (int) part ];
\r
1167 if ( n2.arスコア[ nL12345 ] != null )
\r
1169 nSumPlayCountN2 = n2.arスコア[ nL12345 ].譜面情報.レベル[ (int) part ];
\r
1171 num = nSumPlayCountN2 - nSumPlayCountN1;
\r
1174 return order * num;
\r
1176 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1178 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1180 int nSumPlayCountN1 = 0;
\r
1181 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1183 nSumPlayCountN1 = c曲リストノード.arスコア[ nL12345 ].譜面情報.レベル[ (int) part ];
\r
1185 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );
\r
1189 public void t曲リストのソート5_BestRank順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1192 int nL12345 = (int) p[ 0 ];
\r
1193 if ( part != E楽器パート.UNKNOWN )
\r
1195 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1202 int num = this.t比較0_共通( n1, n2 );
\r
1205 return order * num;
\r
1207 if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1209 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1212 int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;
\r
1213 bool isFullCombo1 = false, isFullCombo2 = false;
\r
1214 if ( n1.arスコア[ nL12345 ] != null )
\r
1216 isFullCombo1 = n1.arスコア[ nL12345 ].譜面情報.フルコンボ[ (int) part ];
\r
1217 nSumPlayCountN1 = n1.arスコア[ nL12345 ].譜面情報.最大ランク[ (int) part ];
\r
1219 if ( n2.arスコア[ nL12345 ] != null )
\r
1221 isFullCombo2 = n2.arスコア[ nL12345 ].譜面情報.フルコンボ[ (int) part ];
\r
1222 nSumPlayCountN2 = n2.arスコア[ nL12345 ].譜面情報.最大ランク[ (int) part ];
\r
1224 if ( isFullCombo1 ^ isFullCombo2 )
\r
1226 if ( isFullCombo1 ) return order; else return -order;
\r
1228 num = nSumPlayCountN2 - nSumPlayCountN1;
\r
1231 return order * num;
\r
1233 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1235 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1237 int nSumPlayCountN1 = 0;
\r
1238 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1240 nSumPlayCountN1 = c曲リストノード.arスコア[ nL12345 ].譜面情報.最大ランク[ (int) part ];
\r
1242 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );
\r
1246 public void t曲リストのソート6_SkillPoint順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1249 int nL12345 = (int) p[ 0 ];
\r
1250 if ( part != E楽器パート.UNKNOWN )
\r
1252 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1259 int num = this.t比較0_共通( n1, n2 );
\r
1262 return order * num;
\r
1264 if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1266 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1269 double nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;
\r
1270 if ( n1.arスコア[ nL12345 ] != null )
\r
1272 nSumPlayCountN1 = n1.arスコア[ nL12345 ].譜面情報.最大スキル[ (int) part ];
\r
1274 if ( n2.arスコア[ nL12345 ] != null )
\r
1276 nSumPlayCountN2 = n2.arスコア[ nL12345 ].譜面情報.最大スキル[ (int) part ];
\r
1278 double d = nSumPlayCountN2 - nSumPlayCountN1;
\r
1281 return order * System.Math.Sign(d);
\r
1283 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1285 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1287 double nSumPlayCountN1 = 0;
\r
1288 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1290 nSumPlayCountN1 = c曲リストノード.arスコア[ nL12345 ].譜面情報.最大スキル[ (int) part ];
\r
1292 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );
\r
1296 public void t曲リストのソート7_更新日時順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1298 int nL12345 = (int) p[ 0 ];
\r
1299 if ( part != E楽器パート.UNKNOWN )
\r
1301 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1308 int num = this.t比較0_共通( n1, n2 );
\r
1311 return order * num;
\r
1313 if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1315 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1318 DateTime nSumPlayCountN1 = DateTime.Parse("0001/01/01 12:00:01.000");
\r
1319 DateTime nSumPlayCountN2 = DateTime.Parse("0001/01/01 12:00:01.000");
\r
1320 if ( n1.arスコア[ nL12345 ] != null )
\r
1322 nSumPlayCountN1 = n1.arスコア[ nL12345 ].ファイル情報.最終更新日時;
\r
1324 if ( n2.arスコア[ nL12345 ] != null )
\r
1326 nSumPlayCountN2 = n2.arスコア[ nL12345 ].ファイル情報.最終更新日時;
\r
1328 int d = nSumPlayCountN1.CompareTo(nSumPlayCountN2);
\r
1331 return order * System.Math.Sign( d );
\r
1333 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1335 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1337 DateTime nSumPlayCountN1 = DateTime.Parse( "0001/01/01 12:00:01.000" );
\r
1338 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1340 nSumPlayCountN1 = c曲リストノード.arスコア[ nL12345 ].ファイル情報.最終更新日時;
\r
1342 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );
\r
1346 public void t曲リストのソート8_アーティスト名順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1348 int nL12345 = (int) p[ 0 ];
\r
1349 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1355 int num = this.t比較0_共通( n1, n2 );
\r
1358 return order * System.Math.Sign( num );
\r
1360 string strAuthorN1 = "";
\r
1361 string strAuthorN2 = "";
\r
1362 if (n1.arスコア[ nL12345 ] != null ) {
\r
1363 strAuthorN1 = n1.arスコア[ nL12345 ].譜面情報.アーティスト名;
\r
1365 if ( n2.arスコア[ nL12345 ] != null )
\r
1367 strAuthorN2 = n2.arスコア[ nL12345 ].譜面情報.アーティスト名;
\r
1370 return order * strAuthorN1.CompareTo( strAuthorN2 );
\r
1372 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1375 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1377 s = c曲リストノード.arスコア[ nL12345 ].譜面情報.アーティスト名;
\r
1379 Debug.WriteLine( s + ":" + c曲リストノード.strタイトル );
\r
1383 public void t曲リストのソート9_BPM順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1386 int nL12345 = (int) p[ 0 ];
\r
1387 if ( part != E楽器パート.UNKNOWN )
\r
1389 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1396 int num = this.t比較0_共通( n1, n2 );
\r
1399 return order * num;
\r
1401 if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1403 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1406 double dBPMn1 = 0.0, dBPMn2 = 0.0;
\r
1407 if ( n1.arスコア[ nL12345 ] != null )
\r
1409 dBPMn1 = n1.arスコア[ nL12345 ].譜面情報.bpm;
\r
1411 if ( n2.arスコア[ nL12345 ] != null )
\r
1413 dBPMn2 = n2.arスコア[ nL12345 ].譜面情報.bpm;
\r
1415 double d = dBPMn1- dBPMn2;
\r
1418 return order * System.Math.Sign( d );
\r
1420 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1422 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1425 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1427 dBPM = c曲リストノード.arスコア[ nL12345 ].譜面情報.bpm;
\r
1429 Debug.WriteLine( dBPM + ":" + c曲リストノード.strタイトル );
\r
1434 //-----------------
\r
1436 #region [ .score.ini を読み込んで Cスコア.譜面情報に設定する ]
\r
1437 //-----------------
\r
1438 public void tScoreIniを読み込んで譜面情報を設定する( string strScoreIniファイルパス, ref Cスコア score )
\r
1440 if( !File.Exists( strScoreIniファイルパス ) )
\r
1445 var ini = new CScoreIni( strScoreIniファイルパス );
\r
1446 ini.t全演奏記録セクションの整合性をチェックし不整合があればリセットする();
\r
1448 for( int n楽器番号 = 0; n楽器番号 < 3; n楽器番号++ )
\r
1450 int n = ( n楽器番号 * 2 ) + 1; // n = 0~5
\r
1452 #region socre.譜面情報.最大ランク[ n楽器番号 ] = ...
\r
1453 //-----------------
\r
1454 if( ini.stセクション[ n ].b演奏にMIDI入力を使用した ||
\r
1455 ini.stセクション[ n ].b演奏にキーボードを使用した ||
\r
1456 ini.stセクション[ n ].b演奏にジョイパッドを使用した ||
\r
1457 ini.stセクション[ n ].b演奏にマウスを使用した )
\r
1459 // (A) 全オートじゃないようなので、演奏結果情報を有効としてランクを算出する。
\r
1461 score.譜面情報.最大ランク[ n楽器番号 ] =
\r
1462 CScoreIni.tランク値を計算して返す(
\r
1463 ini.stセクション[ n ].n全チップ数,
\r
1464 ini.stセクション[ n ].nPerfect数,
\r
1465 ini.stセクション[ n ].nGreat数,
\r
1466 ini.stセクション[ n ].nGood数,
\r
1467 ini.stセクション[ n ].nPoor数,
\r
1468 ini.stセクション[ n ].nMiss数 );
\r
1472 // (B) 全オートらしいので、ランクは無効とする。
\r
1474 score.譜面情報.最大ランク[ n楽器番号 ] = (int) CScoreIni.ERANK.UNKNOWN;
\r
1476 //-----------------
\r
1478 score.譜面情報.最大スキル[ n楽器番号 ] = ini.stセクション[ n ].db演奏型スキル値;
\r
1479 score.譜面情報.フルコンボ[ n楽器番号 ] = ini.stセクション[ n ].bフルコンボである;
\r
1481 score.譜面情報.演奏回数.Drums = ini.stファイル.PlayCountDrums;
\r
1482 score.譜面情報.演奏回数.Guitar = ini.stファイル.PlayCountGuitar;
\r
1483 score.譜面情報.演奏回数.Bass = ini.stファイル.PlayCountBass;
\r
1484 for( int i = 0; i < 5; i++ )
\r
1485 score.譜面情報.演奏履歴[ i ] = ini.stファイル.History[ i ];
\r
1489 Trace.TraceError( "演奏記録ファイルの読み込みに失敗しました。[{0}]", strScoreIniファイルパス );
\r
1492 //-----------------
\r
1498 #region [ private ]
\r
1499 //-----------------
\r
1500 private const string SONGSDB_VERSION = "SongsDB2";
\r
1502 private int t比較0_共通( C曲リストノード n1, C曲リストノード n2 )
\r
1504 if( n1.eノード種別 == C曲リストノード.Eノード種別.BACKBOX )
\r
1508 if( n2.eノード種別 == C曲リストノード.Eノード種別.BACKBOX )
\r
1512 if( n1.eノード種別 == C曲リストノード.Eノード種別.RANDOM )
\r
1516 if( n2.eノード種別 == C曲リストノード.Eノード種別.RANDOM )
\r
1520 if( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 != C曲リストノード.Eノード種別.BOX ) )
\r
1524 if( ( n1.eノード種別 != C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1530 //-----------------
\r