2 using System.Collections.Generic;
\r
3 using System.Globalization;
\r
5 using System.Diagnostics;
\r
7 using System.Drawing;
\r
8 using System.Threading;
\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
48 public List<Cスコア> listSongsDB; // songs.dbから構築されるlist
\r
49 public List<C曲リストノード> list曲ルート; // 起動時にフォルダ検索して構築されるlist
\r
50 public bool bIsSuspending // 外部スレッドから、内部スレッドのsuspendを指示する時にtrueにする
\r
51 { // 再開時は、これをfalseにしてから、次のautoReset.Set()を実行する
\r
55 public bool bIsSlowdown // #PREMOVIE再生時に曲検索を遅くする
\r
61 private AutoResetEvent autoReset;
\r
62 public AutoResetEvent AutoReset
\r
74 private int searchCount; // #PREMOVIE中は検索n回実行したら少しスリープする
\r
80 this.listSongsDB = new List<Cスコア>();
\r
81 this.list曲ルート = new List<C曲リストノード>();
\r
82 this.n検索された曲ノード数 = 0;
\r
83 this.n検索されたスコア数 = 0;
\r
84 this.bIsSuspending = false; // #27060
\r
85 this.autoReset = new AutoResetEvent(true); // #27060
\r
86 this.searchCount = 0;
\r
92 #region [ SongsDB(songs.db) を読み込む ]
\r
94 public void tSongsDBを読み込む(string SongsDBファイル名)
\r
96 this.nSongsDBから取得できたスコア数 = 0;
\r
97 if (File.Exists(SongsDBファイル名))
\r
99 BinaryReader br = null;
\r
102 br = new BinaryReader(File.OpenRead(SongsDBファイル名));
\r
103 if (!br.ReadString().Equals(SONGSDB_VERSION))
\r
105 throw new InvalidDataException("ヘッダが異なります。");
\r
107 this.listSongsDB = new List<Cスコア>();
\r
113 Cスコア item = this.tSongsDBからスコアを1つ読み込む(br);
\r
114 this.listSongsDB.Add(item);
\r
115 this.nSongsDBから取得できたスコア数++;
\r
117 catch (EndOfStreamException)
\r
130 //-----------------
\r
133 #region [ 曲を検索してリストを作成する ]
\r
134 //-----------------
\r
135 public void t曲を検索してリストを作成する(string str基点フォルダ, bool b子BOXへ再帰する)
\r
137 this.t曲を検索してリストを作成する(str基点フォルダ, b子BOXへ再帰する, this.list曲ルート, null);
\r
139 private void t曲を検索してリストを作成する(string str基点フォルダ, bool b子BOXへ再帰する, List<C曲リストノード> listノードリスト, C曲リストノード node親)
\r
141 if (!str基点フォルダ.EndsWith(@"\"))
\r
142 str基点フォルダ = str基点フォルダ + @"\";
\r
144 DirectoryInfo info = new DirectoryInfo(str基点フォルダ);
\r
146 if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)
\r
147 Trace.TraceInformation("基点フォルダ: " + str基点フォルダ);
\r
149 #region [ a.フォルダ内に set.def が存在する場合 → set.def からノード作成]
\r
150 //-----------------------------
\r
151 string path = str基点フォルダ + "set.def";
\r
152 if (File.Exists(path))
\r
154 CSetDef def = new CSetDef(path);
\r
155 new FileInfo(path);
\r
156 if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)
\r
158 Trace.TraceInformation("set.def検出 : {0}", path);
\r
163 SlowOrSuspendSearchTask(); // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす
\r
164 for (int i = 0; i < def.blocks.Count; i++)
\r
166 CSetDef.CBlock block = def.blocks[i];
\r
167 C曲リストノード item = new C曲リストノード();
\r
168 item.eノード種別 = C曲リストノード.Eノード種別.SCORE;
\r
169 item.strタイトル = block.Title;
\r
170 item.strジャンル = block.Genre;
\r
172 item.col文字色 = block.FontColor;
\r
173 item.SetDefのブロック番号 = i;
\r
174 item.pathSetDefの絶対パス = path;
\r
175 item.r親ノード = node親;
\r
177 item.strBreadcrumbs = (item.r親ノード == null) ?
\r
178 path + i : item.r親ノード.strBreadcrumbs + " > " + path + i;
\r
180 for (int j = 0; j < 5; j++)
\r
182 if (!string.IsNullOrEmpty(block.File[j]))
\r
184 string str2 = str基点フォルダ + block.File[j];
\r
185 if (File.Exists(str2))
\r
187 item.ar難易度ラベル[j] = block.Label[j];
\r
188 item.arスコア[j] = new Cスコア();
\r
189 item.arスコア[j].ファイル情報.ファイルの絶対パス = str2;
\r
190 item.arスコア[j].ファイル情報.フォルダの絶対パス = Path.GetFullPath(Path.GetDirectoryName(str2)) + @"\";
\r
191 FileInfo info2 = new FileInfo(str2);
\r
192 item.arスコア[j].ファイル情報.ファイルサイズ = info2.Length;
\r
193 item.arスコア[j].ファイル情報.最終更新日時 = info2.LastWriteTime;
\r
194 string str3 = str2 + ".score.ini";
\r
195 if (File.Exists(str3))
\r
197 FileInfo info3 = new FileInfo(str3);
\r
198 item.arスコア[j].ScoreIni情報.ファイルサイズ = info3.Length;
\r
199 item.arスコア[j].ScoreIni情報.最終更新日時 = info3.LastWriteTime;
\r
206 item.arスコア[j] = null;
\r
210 if (item.nスコア数 > 0)
\r
212 listノードリスト.Add(item);
\r
213 this.n検索された曲ノード数++;
\r
214 if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)
\r
216 StringBuilder builder = new StringBuilder(0x200);
\r
217 builder.Append(string.Format("nID#{0:D3}", item.nID));
\r
218 if (item.r親ノード != null)
\r
220 builder.Append(string.Format("(in#{0:D3}):", item.r親ノード.nID));
\r
224 builder.Append("(onRoot):");
\r
226 if ((item.strタイトル != null) && (item.strタイトル.Length > 0))
\r
228 builder.Append(" SONG, Title=" + item.strタイトル);
\r
230 if ((item.strジャンル != null) && (item.strジャンル.Length > 0))
\r
232 builder.Append(", Genre=" + item.strジャンル);
\r
234 if (item.col文字色 != Color.White)
\r
236 builder.Append(", FontColor=" + item.col文字色);
\r
238 Trace.TraceInformation(builder.ToString());
\r
242 for (int k = 0; k < 5; k++)
\r
244 if (item.arスコア[k] != null)
\r
246 Cスコア cスコア = item.arスコア[k];
\r
247 builder.Remove(0, builder.Length);
\r
248 builder.Append(string.Format("ブロック{0}-{1}:", item.SetDefのブロック番号 + 1, k + 1));
\r
249 builder.Append(" Label=" + item.ar難易度ラベル[k]);
\r
250 builder.Append(", File=" + cスコア.ファイル情報.ファイルの絶対パス);
\r
251 builder.Append(", Size=" + cスコア.ファイル情報.ファイルサイズ);
\r
252 builder.Append(", LastUpdate=" + cスコア.ファイル情報.最終更新日時);
\r
253 Trace.TraceInformation(builder.ToString());
\r
267 if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)
\r
273 //-----------------------------
\r
276 #region [ b.フォルダ内に set.def が存在しない場合 → 個別ファイルからノード作成 ]
\r
277 //-----------------------------
\r
280 foreach (FileInfo fileinfo in info.GetFiles())
\r
282 SlowOrSuspendSearchTask(); // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす
\r
283 string strExt = fileinfo.Extension.ToLower();
\r
284 if ((strExt.Equals(".dtx") || strExt.Equals(".gda")) || ((strExt.Equals(".g2d") || strExt.Equals(".bms")) || strExt.Equals(".bme")))
\r
286 C曲リストノード c曲リストノード = new C曲リストノード();
\r
287 c曲リストノード.eノード種別 = C曲リストノード.Eノード種別.SCORE;
\r
288 c曲リストノード.nスコア数 = 1;
\r
289 c曲リストノード.r親ノード = node親;
\r
291 c曲リストノード.strBreadcrumbs = (c曲リストノード.r親ノード == null) ?
\r
292 str基点フォルダ + fileinfo.Name : c曲リストノード.r親ノード.strBreadcrumbs + " > " + str基点フォルダ + fileinfo.Name;
\r
294 c曲リストノード.arスコア[0] = new Cスコア();
\r
295 c曲リストノード.arスコア[0].ファイル情報.ファイルの絶対パス = str基点フォルダ + fileinfo.Name;
\r
296 c曲リストノード.arスコア[0].ファイル情報.フォルダの絶対パス = str基点フォルダ;
\r
297 c曲リストノード.arスコア[0].ファイル情報.ファイルサイズ = fileinfo.Length;
\r
298 c曲リストノード.arスコア[0].ファイル情報.最終更新日時 = fileinfo.LastWriteTime;
\r
299 string strFileNameScoreIni = c曲リストノード.arスコア[0].ファイル情報.ファイルの絶対パス + ".score.ini";
\r
300 if (File.Exists(strFileNameScoreIni))
\r
302 FileInfo infoScoreIni = new FileInfo(strFileNameScoreIni);
\r
303 c曲リストノード.arスコア[0].ScoreIni情報.ファイルサイズ = infoScoreIni.Length;
\r
304 c曲リストノード.arスコア[0].ScoreIni情報.最終更新日時 = infoScoreIni.LastWriteTime;
\r
307 listノードリスト.Add(c曲リストノード);
\r
308 this.n検索された曲ノード数++;
\r
309 if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)
\r
314 StringBuilder sb = new StringBuilder(0x100);
\r
315 sb.Append(string.Format("nID#{0:D3}", c曲リストノード.nID));
\r
316 if (c曲リストノード.r親ノード != null)
\r
318 sb.Append(string.Format("(in#{0:D3}):", c曲リストノード.r親ノード.nID));
\r
322 sb.Append("(onRoot):");
\r
324 sb.Append(" SONG, File=" + c曲リストノード.arスコア[0].ファイル情報.ファイルの絶対パス);
\r
325 sb.Append(", Size=" + c曲リストノード.arスコア[0].ファイル情報.ファイルサイズ);
\r
326 sb.Append(", LastUpdate=" + c曲リストノード.arスコア[0].ファイル情報.最終更新日時);
\r
327 Trace.TraceInformation(sb.ToString());
\r
335 else if (strExt.Equals(".mid") || strExt.Equals(".smf"))
\r
341 //-----------------------------
\r
344 foreach (DirectoryInfo infoDir in info.GetDirectories())
\r
346 SlowOrSuspendSearchTask(); // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす
\r
348 #region [ a. "dtxfiles." で始まるフォルダの場合 ]
\r
349 //-----------------------------
\r
350 if (infoDir.Name.ToLower().StartsWith("dtxfiles."))
\r
352 C曲リストノード c曲リストノード = new C曲リストノード();
\r
353 c曲リストノード.eノード種別 = C曲リストノード.Eノード種別.BOX;
\r
354 c曲リストノード.bDTXFilesで始まるフォルダ名のBOXである = true;
\r
355 c曲リストノード.strタイトル = infoDir.Name.Substring(9);
\r
356 c曲リストノード.nスコア数 = 1;
\r
357 c曲リストノード.r親ノード = node親;
\r
359 // 一旦、上位BOXのスキン情報をコピー (後でbox.defの記載にて上書きされる場合がある)
\r
360 c曲リストノード.strSkinPath = (c曲リストノード.r親ノード == null) ?
\r
361 "" : c曲リストノード.r親ノード.strSkinPath;
\r
363 c曲リストノード.strBreadcrumbs = (c曲リストノード.r親ノード == null) ?
\r
364 c曲リストノード.strタイトル : c曲リストノード.r親ノード.strBreadcrumbs + " > " + c曲リストノード.strタイトル;
\r
367 c曲リストノード.list子リスト = new List<C曲リストノード>();
\r
368 c曲リストノード.arスコア[0] = new Cスコア();
\r
369 c曲リストノード.arスコア[0].ファイル情報.フォルダの絶対パス = infoDir.FullName + @"\";
\r
370 c曲リストノード.arスコア[0].譜面情報.タイトル = c曲リストノード.strタイトル;
\r
371 c曲リストノード.arスコア[0].譜面情報.コメント =
\r
372 (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?
\r
374 "Enter into the BOX.";
\r
375 listノードリスト.Add(c曲リストノード);
\r
376 if (File.Exists(infoDir.FullName + @"\box.def"))
\r
378 CBoxDef boxdef = new CBoxDef(infoDir.FullName + @"\box.def");
\r
379 if ((boxdef.Title != null) && (boxdef.Title.Length > 0))
\r
381 c曲リストノード.strタイトル = boxdef.Title;
\r
383 if ((boxdef.Genre != null) && (boxdef.Genre.Length > 0))
\r
385 c曲リストノード.strジャンル = boxdef.Genre;
\r
387 if (boxdef.Color != Color.White)
\r
389 c曲リストノード.col文字色 = boxdef.Color;
\r
391 if ((boxdef.Artist != null) && (boxdef.Artist.Length > 0))
\r
393 c曲リストノード.arスコア[0].譜面情報.アーティスト名 = boxdef.Artist;
\r
395 if ((boxdef.Comment != null) && (boxdef.Comment.Length > 0))
\r
397 c曲リストノード.arスコア[0].譜面情報.コメント = boxdef.Comment;
\r
399 if ((boxdef.Preimage != null) && (boxdef.Preimage.Length > 0))
\r
401 c曲リストノード.arスコア[0].譜面情報.Preimage = boxdef.Preimage;
\r
403 if ((boxdef.Premovie != null) && (boxdef.Premovie.Length > 0))
\r
405 c曲リストノード.arスコア[0].譜面情報.Premovie = boxdef.Premovie;
\r
407 if ((boxdef.Presound != null) && (boxdef.Presound.Length > 0))
\r
409 c曲リストノード.arスコア[0].譜面情報.Presound = boxdef.Presound;
\r
411 if (boxdef.SkinPath != null)
\r
413 if (boxdef.SkinPath == "")
\r
415 // box.defにスキン情報が記載されていないなら、上位BOXのスキン情報をコピー
\r
416 c曲リストノード.strSkinPath = (c曲リストノード.r親ノード == null) ?
\r
417 "" : c曲リストノード.r親ノード.strSkinPath;
\r
421 // box.defに記載されているスキン情報をコピー。末尾に必ず\をつけておくこと。
\r
422 string s = System.IO.Path.Combine(infoDir.FullName, boxdef.SkinPath);
\r
423 if (s[s.Length - 1] != System.IO.Path.DirectorySeparatorChar) // フォルダ名末尾に\を必ずつけて、CSkin側と表記を統一する
\r
425 s += System.IO.Path.DirectorySeparatorChar;
\r
427 if (CDTXMania.Instance.Skin.bIsValid(s))
\r
429 c曲リストノード.strSkinPath = s;
\r
433 c曲リストノード.strSkinPath = (c曲リストノード.r親ノード == null) ?
\r
434 "" : c曲リストノード.r親ノード.strSkinPath;
\r
438 if (boxdef.PerfectRange >= 0)
\r
440 c曲リストノード.nPerfect範囲ms = boxdef.PerfectRange;
\r
442 if (boxdef.GreatRange >= 0)
\r
444 c曲リストノード.nGreat範囲ms = boxdef.GreatRange;
\r
446 if (boxdef.GoodRange >= 0)
\r
448 c曲リストノード.nGood範囲ms = boxdef.GoodRange;
\r
450 if (boxdef.PoorRange >= 0)
\r
452 c曲リストノード.nPoor範囲ms = boxdef.PoorRange;
\r
455 if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)
\r
460 StringBuilder sb = new StringBuilder(0x100);
\r
461 sb.Append(string.Format("nID#{0:D3}", c曲リストノード.nID));
\r
462 if (c曲リストノード.r親ノード != null)
\r
464 sb.Append(string.Format("(in#{0:D3}):", c曲リストノード.r親ノード.nID));
\r
468 sb.Append("(onRoot):");
\r
470 sb.Append(" BOX, Title=" + c曲リストノード.strタイトル);
\r
471 sb.Append(", Folder=" + c曲リストノード.arスコア[0].ファイル情報.フォルダの絶対パス);
\r
472 sb.Append(", Comment=" + c曲リストノード.arスコア[0].譜面情報.コメント);
\r
473 sb.Append(", SkinPath=" + c曲リストノード.strSkinPath);
\r
474 Trace.TraceInformation(sb.ToString());
\r
483 this.t曲を検索してリストを作成する(infoDir.FullName + @"\", b子BOXへ再帰する, c曲リストノード.list子リスト, c曲リストノード);
\r
486 //-----------------------------
\r
489 #region [ b.box.def を含むフォルダの場合 ]
\r
490 //-----------------------------
\r
491 else if (File.Exists(infoDir.FullName + @"\box.def"))
\r
493 CBoxDef boxdef = new CBoxDef(infoDir.FullName + @"\box.def");
\r
494 C曲リストノード c曲リストノード = new C曲リストノード();
\r
495 c曲リストノード.eノード種別 = C曲リストノード.Eノード種別.BOX;
\r
496 c曲リストノード.bDTXFilesで始まるフォルダ名のBOXである = false;
\r
497 c曲リストノード.strタイトル = boxdef.Title;
\r
498 c曲リストノード.strジャンル = boxdef.Genre;
\r
499 c曲リストノード.col文字色 = boxdef.Color;
\r
500 c曲リストノード.nスコア数 = 1;
\r
501 c曲リストノード.arスコア[0] = new Cスコア();
\r
502 c曲リストノード.arスコア[0].ファイル情報.フォルダの絶対パス = infoDir.FullName + @"\";
\r
503 c曲リストノード.arスコア[0].譜面情報.タイトル = boxdef.Title;
\r
504 c曲リストノード.arスコア[0].譜面情報.ジャンル = boxdef.Genre;
\r
505 c曲リストノード.arスコア[0].譜面情報.アーティスト名 = boxdef.Artist;
\r
506 c曲リストノード.arスコア[0].譜面情報.コメント = boxdef.Comment;
\r
507 c曲リストノード.arスコア[0].譜面情報.Preimage = boxdef.Preimage;
\r
508 c曲リストノード.arスコア[0].譜面情報.Premovie = boxdef.Premovie;
\r
509 c曲リストノード.arスコア[0].譜面情報.Presound = boxdef.Presound;
\r
510 c曲リストノード.r親ノード = node親;
\r
512 if (boxdef.SkinPath == "")
\r
514 // box.defにスキン情報が記載されていないなら、上位BOXのスキン情報をコピー
\r
515 c曲リストノード.strSkinPath = (c曲リストノード.r親ノード == null) ?
\r
516 "" : c曲リストノード.r親ノード.strSkinPath;
\r
520 // box.defに記載されているスキン情報をコピー。末尾に必ず\をつけておくこと。
\r
521 string s = System.IO.Path.Combine(infoDir.FullName, boxdef.SkinPath);
\r
522 if (s[s.Length - 1] != System.IO.Path.DirectorySeparatorChar) // フォルダ名末尾に\を必ずつけて、CSkin側と表記を統一する
\r
524 s += System.IO.Path.DirectorySeparatorChar;
\r
526 if (CDTXMania.Instance.Skin.bIsValid(s))
\r
528 c曲リストノード.strSkinPath = s;
\r
532 c曲リストノード.strSkinPath = (c曲リストノード.r親ノード == null) ?
\r
533 "" : c曲リストノード.r親ノード.strSkinPath;
\r
536 c曲リストノード.strBreadcrumbs = (c曲リストノード.r親ノード == null) ?
\r
537 c曲リストノード.strタイトル : c曲リストノード.r親ノード.strBreadcrumbs + " > " + c曲リストノード.strタイトル;
\r
540 c曲リストノード.list子リスト = new List<C曲リストノード>();
\r
541 c曲リストノード.nPerfect範囲ms = boxdef.PerfectRange;
\r
542 c曲リストノード.nGreat範囲ms = boxdef.GreatRange;
\r
543 c曲リストノード.nGood範囲ms = boxdef.GoodRange;
\r
544 c曲リストノード.nPoor範囲ms = boxdef.PoorRange;
\r
545 listノードリスト.Add(c曲リストノード);
\r
546 if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)
\r
548 Trace.TraceInformation("box.def検出 : {0}", infoDir.FullName + @"\box.def");
\r
552 StringBuilder sb = new StringBuilder(0x400);
\r
553 sb.Append(string.Format("nID#{0:D3}", c曲リストノード.nID));
\r
554 if (c曲リストノード.r親ノード != null)
\r
556 sb.Append(string.Format("(in#{0:D3}):", c曲リストノード.r親ノード.nID));
\r
560 sb.Append("(onRoot):");
\r
562 sb.Append("BOX, Title=" + c曲リストノード.strタイトル);
\r
563 if ((c曲リストノード.strジャンル != null) && (c曲リストノード.strジャンル.Length > 0))
\r
565 sb.Append(", Genre=" + c曲リストノード.strジャンル);
\r
567 if ((c曲リストノード.arスコア[0].譜面情報.アーティスト名 != null) && (c曲リストノード.arスコア[0].譜面情報.アーティスト名.Length > 0))
\r
569 sb.Append(", Artist=" + c曲リストノード.arスコア[0].譜面情報.アーティスト名);
\r
571 if ((c曲リストノード.arスコア[0].譜面情報.コメント != null) && (c曲リストノード.arスコア[0].譜面情報.コメント.Length > 0))
\r
573 sb.Append(", Comment=" + c曲リストノード.arスコア[0].譜面情報.コメント);
\r
575 if ((c曲リストノード.arスコア[0].譜面情報.Preimage != null) && (c曲リストノード.arスコア[0].譜面情報.Preimage.Length > 0))
\r
577 sb.Append(", Preimage=" + c曲リストノード.arスコア[0].譜面情報.Preimage);
\r
579 if ((c曲リストノード.arスコア[0].譜面情報.Premovie != null) && (c曲リストノード.arスコア[0].譜面情報.Premovie.Length > 0))
\r
581 sb.Append(", Premovie=" + c曲リストノード.arスコア[0].譜面情報.Premovie);
\r
583 if ((c曲リストノード.arスコア[0].譜面情報.Presound != null) && (c曲リストノード.arスコア[0].譜面情報.Presound.Length > 0))
\r
585 sb.Append(", Presound=" + c曲リストノード.arスコア[0].譜面情報.Presound);
\r
587 if (c曲リストノード.col文字色 != ColorTranslator.FromHtml("White"))
\r
589 sb.Append(", FontColor=" + c曲リストノード.col文字色);
\r
591 if (c曲リストノード.nPerfect範囲ms != -1)
\r
593 sb.Append(", Perfect=" + c曲リストノード.nPerfect範囲ms + "ms");
\r
595 if (c曲リストノード.nGreat範囲ms != -1)
\r
597 sb.Append(", Great=" + c曲リストノード.nGreat範囲ms + "ms");
\r
599 if (c曲リストノード.nGood範囲ms != -1)
\r
601 sb.Append(", Good=" + c曲リストノード.nGood範囲ms + "ms");
\r
603 if (c曲リストノード.nPoor範囲ms != -1)
\r
605 sb.Append(", Poor=" + c曲リストノード.nPoor範囲ms + "ms");
\r
607 if ((c曲リストノード.strSkinPath != null) && (c曲リストノード.strSkinPath.Length > 0))
\r
609 sb.Append(", SkinPath=" + c曲リストノード.strSkinPath);
\r
611 Trace.TraceInformation(sb.ToString());
\r
620 this.t曲を検索してリストを作成する(infoDir.FullName + @"\", b子BOXへ再帰する, c曲リストノード.list子リスト, c曲リストノード);
\r
623 //-----------------------------
\r
626 #region [ c.通常フォルダの場合 ]
\r
627 //-----------------------------
\r
630 this.t曲を検索してリストを作成する(infoDir.FullName + @"\", b子BOXへ再帰する, listノードリスト, node親);
\r
632 //-----------------------------
\r
636 //-----------------
\r
638 #region [ スコアキャッシュを曲リストに反映する ]
\r
639 //-----------------
\r
640 public void tスコアキャッシュを曲リストに反映する()
\r
642 this.nスコアキャッシュから反映できたスコア数 = 0;
\r
643 this.tスコアキャッシュを曲リストに反映する(this.list曲ルート);
\r
645 private void tスコアキャッシュを曲リストに反映する(List<C曲リストノード> ノードリスト)
\r
647 using (List<C曲リストノード>.Enumerator enumerator = ノードリスト.GetEnumerator())
\r
649 while (enumerator.MoveNext())
\r
651 SlowOrSuspendSearchTask(); // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす
\r
653 C曲リストノード node = enumerator.Current;
\r
654 if (node.eノード種別 == C曲リストノード.Eノード種別.BOX)
\r
656 this.tスコアキャッシュを曲リストに反映する(node.list子リスト);
\r
658 else if ((node.eノード種別 == C曲リストノード.Eノード種別.SCORE) || (node.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI))
\r
660 Predicate<Cスコア> match = null;
\r
661 for (int lv = 0; lv < 5; lv++)
\r
663 if (node.arスコア[lv] != null)
\r
667 match = delegate (Cスコア sc)
\r
671 (sc.ファイル情報.ファイルの絶対パス.Equals(node.arスコア[lv].ファイル情報.ファイルの絶対パス)
\r
672 && sc.ファイル情報.ファイルサイズ.Equals(node.arスコア[lv].ファイル情報.ファイルサイズ))
\r
673 && (sc.ファイル情報.最終更新日時.Equals(node.arスコア[lv].ファイル情報.最終更新日時)
\r
674 && sc.ScoreIni情報.ファイルサイズ.Equals(node.arスコア[lv].ScoreIni情報.ファイルサイズ)))
\r
675 && sc.ScoreIni情報.最終更新日時.Equals(node.arスコア[lv].ScoreIni情報.最終更新日時);
\r
678 int nMatched = this.listSongsDB.FindIndex(match);
\r
679 if (nMatched == -1)
\r
681 //Trace.TraceInformation( "songs.db に存在しません。({0})", node.arスコア[ lv ].ファイル情報.ファイルの絶対パス );
\r
682 if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)
\r
684 Trace.TraceInformation("songs.db に存在しません。({0})", node.arスコア[lv].ファイル情報.ファイルの絶対パス);
\r
689 node.arスコア[lv].譜面情報 = this.listSongsDB[nMatched].譜面情報;
\r
690 node.arスコア[lv].bSongDBにキャッシュがあった = true;
\r
691 if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)
\r
693 Trace.TraceInformation("songs.db から転記しました。({0})", node.arスコア[lv].ファイル情報.ファイルの絶対パス);
\r
695 this.nスコアキャッシュから反映できたスコア数++;
\r
696 if (node.arスコア[lv].ScoreIni情報.最終更新日時 != this.listSongsDB[nMatched].ScoreIni情報.最終更新日時)
\r
698 string strFileNameScoreIni = node.arスコア[lv].ファイル情報.ファイルの絶対パス + ".score.ini";
\r
701 CScoreIni scoreIni = new CScoreIni(strFileNameScoreIni);
\r
702 for (EPart i = EPart.Drums; i <= EPart.Bass; i++)
\r
704 if (scoreIni.stセクション.HiSkill[i].b演奏にMIDI入力を使用した
\r
705 || scoreIni.stセクション.HiSkill[i].b演奏にキーボードを使用した
\r
706 || scoreIni.stセクション.HiSkill[i].b演奏にジョイパッドを使用した
\r
707 || scoreIni.stセクション.HiSkill[i].b演奏にマウスを使用した)
\r
709 node.arスコア[lv].譜面情報.最大ランク[i] =
\r
710 (scoreIni.stファイル.BestRank[i] != CScoreIni.ERANK.UNKNOWN) ?
\r
711 scoreIni.stファイル.BestRank[i] : CScoreIni.tランク値を計算して返す(scoreIni.stセクション.HiSkill[i]);
\r
715 node.arスコア[lv].譜面情報.最大ランク[i] = CScoreIni.ERANK.UNKNOWN;
\r
717 node.arスコア[lv].譜面情報.最大スキル[i] = scoreIni.stセクション.HiSkill[i].db演奏型スキル値;
\r
718 node.arスコア[lv].譜面情報.フルコンボ[i] = scoreIni.stセクション.HiSkill[i].bフルコンボである;
\r
720 node.arスコア[lv].譜面情報.演奏回数.Drums = scoreIni.stファイル.PlayCountDrums;
\r
721 node.arスコア[lv].譜面情報.演奏回数.Guitar = scoreIni.stファイル.PlayCountGuitar;
\r
722 node.arスコア[lv].譜面情報.演奏回数.Bass = scoreIni.stファイル.PlayCountBass;
\r
723 for (int j = 0; j < 5; j++)
\r
725 node.arスコア[lv].譜面情報.演奏履歴[j] = scoreIni.stファイル.History[j];
\r
727 if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)
\r
729 Trace.TraceInformation("演奏記録ファイルから HiSkill 情報と演奏履歴を取得しました。({0})", strFileNameScoreIni);
\r
734 Trace.TraceError("演奏記録ファイルの読み込みに失敗しました。({0})", strFileNameScoreIni);
\r
744 private Cスコア tSongsDBからスコアを1つ読み込む(BinaryReader br)
\r
746 Cスコア cスコア = new Cスコア();
\r
747 cスコア.ファイル情報.ファイルの絶対パス = br.ReadString();
\r
748 cスコア.ファイル情報.フォルダの絶対パス = br.ReadString();
\r
749 cスコア.ファイル情報.最終更新日時 = new DateTime(br.ReadInt64());
\r
750 cスコア.ファイル情報.ファイルサイズ = br.ReadInt64();
\r
751 cスコア.ScoreIni情報.最終更新日時 = new DateTime(br.ReadInt64());
\r
752 cスコア.ScoreIni情報.ファイルサイズ = br.ReadInt64();
\r
753 cスコア.譜面情報.タイトル = br.ReadString();
\r
754 cスコア.譜面情報.アーティスト名 = br.ReadString();
\r
755 cスコア.譜面情報.コメント = br.ReadString();
\r
756 cスコア.譜面情報.ジャンル = br.ReadString();
\r
757 cスコア.譜面情報.Preimage = br.ReadString();
\r
758 cスコア.譜面情報.Premovie = br.ReadString();
\r
759 cスコア.譜面情報.Presound = br.ReadString();
\r
760 cスコア.譜面情報.Backgound = br.ReadString();
\r
761 cスコア.譜面情報.レベル.Drums = br.ReadInt32();
\r
762 cスコア.譜面情報.レベル.Guitar = br.ReadInt32();
\r
763 cスコア.譜面情報.レベル.Bass = br.ReadInt32();
\r
764 cスコア.譜面情報.最大ランク.Drums = (CScoreIni.ERANK)br.ReadInt32();
\r
765 cスコア.譜面情報.最大ランク.Guitar = (CScoreIni.ERANK)br.ReadInt32();
\r
766 cスコア.譜面情報.最大ランク.Bass = (CScoreIni.ERANK)br.ReadInt32();
\r
767 cスコア.譜面情報.最大スキル.Drums = br.ReadDouble();
\r
768 cスコア.譜面情報.最大スキル.Guitar = br.ReadDouble();
\r
769 cスコア.譜面情報.最大スキル.Bass = br.ReadDouble();
\r
770 cスコア.譜面情報.フルコンボ.Drums = br.ReadBoolean();
\r
771 cスコア.譜面情報.フルコンボ.Guitar = br.ReadBoolean();
\r
772 cスコア.譜面情報.フルコンボ.Bass = br.ReadBoolean();
\r
773 cスコア.譜面情報.演奏回数.Drums = br.ReadInt32();
\r
774 cスコア.譜面情報.演奏回数.Guitar = br.ReadInt32();
\r
775 cスコア.譜面情報.演奏回数.Bass = br.ReadInt32();
\r
776 cスコア.譜面情報.演奏履歴.行1 = br.ReadString();
\r
777 cスコア.譜面情報.演奏履歴.行2 = br.ReadString();
\r
778 cスコア.譜面情報.演奏履歴.行3 = br.ReadString();
\r
779 cスコア.譜面情報.演奏履歴.行4 = br.ReadString();
\r
780 cスコア.譜面情報.演奏履歴.行5 = br.ReadString();
\r
781 cスコア.譜面情報.レベルを非表示にする = br.ReadBoolean();
\r
782 cスコア.譜面情報.曲種別 = (EDTX種別)br.ReadInt32();
\r
783 cスコア.譜面情報.Bpm = br.ReadDouble();
\r
784 cスコア.譜面情報.Duration = br.ReadInt32();
\r
785 cスコア.譜面情報.使用レーン数.Drums = (EUseLanes)br.ReadInt32();
\r
786 cスコア.譜面情報.使用レーン数.Guitar = (EUseLanes)br.ReadInt32();
\r
787 cスコア.譜面情報.使用レーン数.Bass = (EUseLanes)br.ReadInt32();
\r
789 //Debug.WriteLine( "songs.db: " + cスコア.ファイル情報.ファイルの絶対パス );
\r
792 //-----------------
\r
794 #region [ SongsDBになかった曲をファイルから読み込んで反映する ]
\r
795 //-----------------
\r
796 public void tSongsDBになかった曲をファイルから読み込んで反映する()
\r
798 this.nファイルから反映できたスコア数 = 0;
\r
799 this.tSongsDBになかった曲をファイルから読み込んで反映する(this.list曲ルート);
\r
801 private void tSongsDBになかった曲をファイルから読み込んで反映する(List<C曲リストノード> ノードリスト)
\r
803 foreach (C曲リストノード c曲リストノード in ノードリスト)
\r
805 SlowOrSuspendSearchTask(); // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす
\r
807 if (c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX)
\r
809 this.tSongsDBになかった曲をファイルから読み込んで反映する(c曲リストノード.list子リスト);
\r
811 else if ((c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE)
\r
812 || (c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI))
\r
814 for (int i = 0; i < 5; i++)
\r
816 if ((c曲リストノード.arスコア[i] != null) && !c曲リストノード.arスコア[i].bSongDBにキャッシュがあった)
\r
818 #region [ Cスコア.譜面情報 を設定する ]
\r
819 //-----------------
\r
820 string path = c曲リストノード.arスコア[i].ファイル情報.ファイルの絶対パス;
\r
821 if (File.Exists(path))
\r
825 //#36177 2016.7.30 ikanick 曲データの取得時、bLoadDTXDetailがtrueであれば bヘッダのみをfalseにし 詳細なデータを取得する
\r
826 CDTX cdtx = new CDTX(c曲リストノード.arスコア[i].ファイル情報.ファイルの絶対パス, !CDTXMania.Instance.ConfigIni.bLoadDTXDetail );
\r
827 c曲リストノード.arスコア[i].譜面情報.タイトル = cdtx.TITLE;
\r
828 c曲リストノード.arスコア[i].譜面情報.アーティスト名 = cdtx.ARTIST;
\r
829 c曲リストノード.arスコア[i].譜面情報.コメント = cdtx.COMMENT;
\r
830 c曲リストノード.arスコア[i].譜面情報.ジャンル = cdtx.GENRE;
\r
831 c曲リストノード.arスコア[i].譜面情報.Preimage = cdtx.PREIMAGE;
\r
832 c曲リストノード.arスコア[i].譜面情報.Premovie = cdtx.PREMOVIE;
\r
833 c曲リストノード.arスコア[i].譜面情報.Presound = cdtx.PREVIEW;
\r
834 c曲リストノード.arスコア[i].譜面情報.Backgound = ((cdtx.BACKGROUND != null) && (cdtx.BACKGROUND.Length > 0)) ? cdtx.BACKGROUND : cdtx.BACKGROUND_GR;
\r
835 c曲リストノード.arスコア[i].譜面情報.レベル.Drums = cdtx.LEVEL.Drums;
\r
836 c曲リストノード.arスコア[i].譜面情報.レベル.Guitar = cdtx.LEVEL.Guitar;
\r
837 c曲リストノード.arスコア[i].譜面情報.レベル.Bass = cdtx.LEVEL.Bass;
\r
838 c曲リストノード.arスコア[i].譜面情報.レベルを非表示にする = cdtx.HIDDENLEVEL;
\r
839 c曲リストノード.arスコア[i].譜面情報.曲種別 = cdtx.e種別;
\r
840 c曲リストノード.arスコア[i].譜面情報.Bpm = cdtx.BPM;
\r
841 c曲リストノード.arスコア[i].譜面情報.Duration = 0; // (cdtx.listChip == null)? 0 : cdtx.listChip[ cdtx.listChip.Count - 1 ].n発声時刻ms;
\r
843 // #36177 2016.7.30 ikanick
\r
844 #region [ LoadDTXDetail ]
\r
845 c曲リストノード.arスコア[i].譜面情報.使用レーン数.Drums = cdtx.n使用レーン数.Drums;
\r
846 c曲リストノード.arスコア[i].譜面情報.使用レーン数.Guitar = cdtx.n使用レーン数.Guitar;
\r
847 c曲リストノード.arスコア[i].譜面情報.使用レーン数.Bass = cdtx.n使用レーン数.Bass;
\r
850 this.nファイルから反映できたスコア数++;
\r
852 //Debug.WriteLine( "★" + this.nファイルから反映できたスコア数 + " " + c曲リストノード.arスコア[ i ].譜面情報.タイトル );
\r
853 #region [ 曲検索ログ出力 ]
\r
854 //-----------------
\r
855 if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)
\r
857 StringBuilder sb = new StringBuilder(0x400);
\r
858 sb.Append(string.Format("曲データファイルから譜面情報を転記しました。({0})", path));
\r
859 sb.Append("(title=" + c曲リストノード.arスコア[i].譜面情報.タイトル);
\r
860 sb.Append(", artist=" + c曲リストノード.arスコア[i].譜面情報.アーティスト名);
\r
861 sb.Append(", comment=" + c曲リストノード.arスコア[i].譜面情報.コメント);
\r
862 sb.Append(", genre=" + c曲リストノード.arスコア[i].譜面情報.ジャンル);
\r
863 sb.Append(", preimage=" + c曲リストノード.arスコア[i].譜面情報.Preimage);
\r
864 sb.Append(", premovie=" + c曲リストノード.arスコア[i].譜面情報.Premovie);
\r
865 sb.Append(", presound=" + c曲リストノード.arスコア[i].譜面情報.Presound);
\r
866 sb.Append(", background=" + c曲リストノード.arスコア[i].譜面情報.Backgound);
\r
867 sb.Append(", lvDr=" + c曲リストノード.arスコア[i].譜面情報.レベル.Drums);
\r
868 sb.Append(", lvGt=" + c曲リストノード.arスコア[i].譜面情報.レベル.Guitar);
\r
869 sb.Append(", lvBs=" + c曲リストノード.arスコア[i].譜面情報.レベル.Bass);
\r
870 sb.Append(", lvHide=" + c曲リストノード.arスコア[i].譜面情報.レベルを非表示にする);
\r
871 sb.Append(", type=" + c曲リストノード.arスコア[i].譜面情報.曲種別);
\r
872 sb.Append(", bpm=" + c曲リストノード.arスコア[i].譜面情報.Bpm);
\r
873 // sb.Append( ", duration=" + c曲リストノード.arスコア[ i ].譜面情報.Duration );
\r
874 sb.Append(", lnDr=" + c曲リストノード.arスコア[i].譜面情報.使用レーン数.Drums);
\r
875 sb.Append(", lnGt=" + c曲リストノード.arスコア[i].譜面情報.使用レーン数.Guitar);
\r
876 sb.Append(", lnBs=" + c曲リストノード.arスコア[i].譜面情報.使用レーン数.Bass);
\r
877 Trace.TraceInformation(sb.ToString());
\r
879 //-----------------
\r
882 catch (Exception exception)
\r
884 Trace.TraceError(exception.Message);
\r
885 c曲リストノード.arスコア[i] = null;
\r
888 Trace.TraceError("曲データファイルの読み込みに失敗しました。({0})", path);
\r
891 //-----------------
\r
894 #region [ 対応する .score.ini が存在していれば読み込み、Cスコア.譜面情報 に追加設定する ]
\r
895 //-----------------
\r
896 this.tScoreIniを読み込んで譜面情報を設定する(c曲リストノード.arスコア[i].ファイル情報.ファイルの絶対パス + ".score.ini", ref c曲リストノード.arスコア[i]);
\r
897 //-----------------
\r
904 //-----------------
\r
906 #region [ 曲リストへ後処理を適用する ]
\r
907 //-----------------
\r
908 public void t曲リストへ後処理を適用する()
\r
910 listStrBoxDefSkinSubfolderFullName = new List<string>();
\r
911 if (CDTXMania.Instance.Skin.strBoxDefSkinSubfolders != null)
\r
913 foreach (string b in CDTXMania.Instance.Skin.strBoxDefSkinSubfolders)
\r
915 listStrBoxDefSkinSubfolderFullName.Add(b);
\r
919 this.t曲リストへ後処理を適用する(this.list曲ルート);
\r
921 #region [ skin名で比較して、systemスキンとboxdefスキンに重複があれば、boxdefスキン側を削除する ]
\r
922 string[] systemSkinNames = CSkin.GetSkinName(CDTXMania.Instance.Skin.strSystemSkinSubfolders);
\r
923 List<string> l = new List<string>(listStrBoxDefSkinSubfolderFullName);
\r
924 foreach (string boxdefSkinSubfolderFullName in l)
\r
926 if (Array.BinarySearch(systemSkinNames,
\r
927 CSkin.GetSkinName(boxdefSkinSubfolderFullName),
\r
928 StringComparer.InvariantCultureIgnoreCase) >= 0)
\r
930 listStrBoxDefSkinSubfolderFullName.Remove(boxdefSkinSubfolderFullName);
\r
934 string[] ba = listStrBoxDefSkinSubfolderFullName.ToArray();
\r
936 CDTXMania.Instance.Skin.strBoxDefSkinSubfolders = ba;
\r
938 private void t曲リストへ後処理を適用する(List<C曲リストノード> ノードリスト)
\r
940 #region [ リストに1つ以上の曲があるなら RANDOM BOX を入れる ]
\r
941 //-----------------------------
\r
942 if (ノードリスト.Count > 0)
\r
944 C曲リストノード itemRandom = new C曲リストノード();
\r
945 itemRandom.eノード種別 = C曲リストノード.Eノード種別.RANDOM;
\r
946 itemRandom.strタイトル = "< RANDOM SELECT >";
\r
947 itemRandom.nスコア数 = 5;
\r
948 itemRandom.r親ノード = ノードリスト[0].r親ノード;
\r
950 itemRandom.strBreadcrumbs = (itemRandom.r親ノード == null) ?
\r
951 itemRandom.strタイトル : itemRandom.r親ノード.strBreadcrumbs + " > " + itemRandom.strタイトル;
\r
953 for (int i = 0; i < 5; i++)
\r
955 itemRandom.arスコア[i] = new Cスコア();
\r
956 itemRandom.arスコア[i].譜面情報.タイトル = string.Format("< RANDOM SELECT Lv.{0} >", i + 1);
\r
957 itemRandom.arスコア[i].譜面情報.コメント =
\r
958 (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?
\r
959 string.Format("難易度レベル {0} 付近の曲をランダムに選択します。難易度レベルを持たない曲も選択候補となります。", i + 1) :
\r
960 string.Format("Random select from the songs which has the level about L{0}. Non-leveled songs may also selected.", i + 1);
\r
961 itemRandom.ar難易度ラベル[i] = string.Format("L{0}", i + 1);
\r
963 ノードリスト.Add(itemRandom);
\r
966 //-----------------------------
\r
967 if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)
\r
969 StringBuilder sb = new StringBuilder(0x100);
\r
970 sb.Append(string.Format("nID#{0:D3}", itemRandom.nID));
\r
971 if (itemRandom.r親ノード != null)
\r
973 sb.Append(string.Format("(in#{0:D3}):", itemRandom.r親ノード.nID));
\r
977 sb.Append("(onRoot):");
\r
979 sb.Append(" RANDOM");
\r
980 Trace.TraceInformation(sb.ToString());
\r
982 //-----------------------------
\r
985 //-----------------------------
\r
989 foreach (C曲リストノード c曲リストノード in ノードリスト)
\r
991 SlowOrSuspendSearchTask(); // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす
\r
993 #region [ BOXノードなら子リストに <<BACK を入れ、子リストに後処理を適用する ]
\r
994 //-----------------------------
\r
995 if (c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX)
\r
997 C曲リストノード itemBack = new C曲リストノード();
\r
998 itemBack.eノード種別 = C曲リストノード.Eノード種別.BACKBOX;
\r
999 itemBack.strタイトル = "<< BACK";
\r
1000 itemBack.nスコア数 = 1;
\r
1001 itemBack.r親ノード = c曲リストノード;
\r
1003 itemBack.strSkinPath = (c曲リストノード.r親ノード == null) ?
\r
1004 "" : c曲リストノード.r親ノード.strSkinPath;
\r
1006 if (itemBack.strSkinPath != "" && !listStrBoxDefSkinSubfolderFullName.Contains(itemBack.strSkinPath))
\r
1008 listStrBoxDefSkinSubfolderFullName.Add(itemBack.strSkinPath);
\r
1011 itemBack.strBreadcrumbs = (itemBack.r親ノード == null) ?
\r
1012 itemBack.strタイトル : itemBack.r親ノード.strBreadcrumbs + " > " + itemBack.strタイトル;
\r
1014 itemBack.arスコア[0] = new Cスコア();
\r
1015 itemBack.arスコア[0].ファイル情報.フォルダの絶対パス = "";
\r
1016 itemBack.arスコア[0].譜面情報.タイトル = itemBack.strタイトル;
\r
1017 itemBack.arスコア[0].譜面情報.コメント =
\r
1018 (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?
\r
1020 "Exit from the BOX.";
\r
1021 c曲リストノード.list子リスト.Insert(0, itemBack);
\r
1024 //-----------------------------
\r
1025 if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)
\r
1027 StringBuilder sb = new StringBuilder(0x100);
\r
1028 sb.Append(string.Format("nID#{0:D3}", itemBack.nID));
\r
1029 if (itemBack.r親ノード != null)
\r
1031 sb.Append(string.Format("(in#{0:D3}):", itemBack.r親ノード.nID));
\r
1035 sb.Append("(onRoot):");
\r
1037 sb.Append(" BACKBOX");
\r
1038 Trace.TraceInformation(sb.ToString());
\r
1040 //-----------------------------
\r
1043 this.t曲リストへ後処理を適用する(c曲リストノード.list子リスト);
\r
1046 //-----------------------------
\r
1049 #region [ ノードにタイトルがないなら、最初に見つけたスコアのタイトルを設定する ]
\r
1050 //-----------------------------
\r
1051 if (string.IsNullOrEmpty(c曲リストノード.strタイトル))
\r
1053 for (int j = 0; j < 5; j++)
\r
1055 if ((c曲リストノード.arスコア[j] != null) && !string.IsNullOrEmpty(c曲リストノード.arスコア[j].譜面情報.タイトル))
\r
1057 c曲リストノード.strタイトル = c曲リストノード.arスコア[j].譜面情報.タイトル;
\r
1059 if (CDTXMania.Instance.ConfigIni.bLogEnumerateSongs)
\r
1060 Trace.TraceInformation("タイトルを設定しました。(nID#{0:D3}, title={1})", c曲リストノード.nID, c曲リストノード.strタイトル);
\r
1066 //-----------------------------
\r
1070 #region [ ノードをソートする ]
\r
1071 //-----------------------------
\r
1072 this.t曲リストのソート1_絶対パス順(ノードリスト);
\r
1073 //-----------------------------
\r
1076 //-----------------
\r
1078 #region [ スコアキャッシュをSongsDBに出力する ]
\r
1079 //-----------------
\r
1080 public void tスコアキャッシュをSongsDBに出力する(string SongsDBファイル名)
\r
1082 this.nSongsDBへ出力できたスコア数 = 0;
\r
1085 BinaryWriter bw = new BinaryWriter( new FileStream( SongsDBファイル名, FileMode.Create, FileAccess.Write ) );
\r
1086 //BinaryWriter bw = new BinaryWriter( new FileStreamSSD( SongsDBファイル名, FileMode.Create, FileAccess.Write ) );
\r
1087 bw.Write( SONGSDB_VERSION );
\r
1088 this.tSongsDBにリストを1つ出力する(bw, this.list曲ルート);
\r
1093 Trace.TraceError("songs.dbの出力に失敗しました。");
\r
1096 private void tSongsDBにノードを1つ出力する(BinaryWriter bw, C曲リストノード node)
\r
1098 for (int i = 0; i < 5; i++)
\r
1100 // ここではsuspendに応じないようにしておく(深い意味はない。ファイルの書き込みオープン状態を長時間維持したくないだけ)
\r
1101 //if ( this.bIsSuspending ) // #27060 中断要求があったら、解除要求が来るまで待機
\r
1103 // autoReset.WaitOne();
\r
1106 if (node.arスコア[i] != null)
\r
1108 bw.Write(node.arスコア[i].ファイル情報.ファイルの絶対パス);
\r
1109 bw.Write(node.arスコア[i].ファイル情報.フォルダの絶対パス);
\r
1110 bw.Write(node.arスコア[i].ファイル情報.最終更新日時.Ticks);
\r
1111 bw.Write(node.arスコア[i].ファイル情報.ファイルサイズ);
\r
1112 bw.Write(node.arスコア[i].ScoreIni情報.最終更新日時.Ticks);
\r
1113 bw.Write(node.arスコア[i].ScoreIni情報.ファイルサイズ);
\r
1114 bw.Write(node.arスコア[i].譜面情報.タイトル);
\r
1115 bw.Write(node.arスコア[i].譜面情報.アーティスト名);
\r
1116 bw.Write(node.arスコア[i].譜面情報.コメント);
\r
1117 bw.Write(node.arスコア[i].譜面情報.ジャンル);
\r
1118 bw.Write(node.arスコア[i].譜面情報.Preimage);
\r
1119 bw.Write(node.arスコア[i].譜面情報.Premovie);
\r
1120 bw.Write(node.arスコア[i].譜面情報.Presound);
\r
1121 bw.Write(node.arスコア[i].譜面情報.Backgound);
\r
1122 bw.Write(node.arスコア[i].譜面情報.レベル.Drums);
\r
1123 bw.Write(node.arスコア[i].譜面情報.レベル.Guitar);
\r
1124 bw.Write(node.arスコア[i].譜面情報.レベル.Bass);
\r
1125 bw.Write((int)node.arスコア[i].譜面情報.最大ランク.Drums);
\r
1126 bw.Write((int)node.arスコア[i].譜面情報.最大ランク.Guitar);
\r
1127 bw.Write((int)node.arスコア[i].譜面情報.最大ランク.Bass);
\r
1128 bw.Write(node.arスコア[i].譜面情報.最大スキル.Drums);
\r
1129 bw.Write(node.arスコア[i].譜面情報.最大スキル.Guitar);
\r
1130 bw.Write(node.arスコア[i].譜面情報.最大スキル.Bass);
\r
1131 bw.Write(node.arスコア[i].譜面情報.フルコンボ.Drums);
\r
1132 bw.Write(node.arスコア[i].譜面情報.フルコンボ.Guitar);
\r
1133 bw.Write(node.arスコア[i].譜面情報.フルコンボ.Bass);
\r
1134 bw.Write(node.arスコア[i].譜面情報.演奏回数.Drums);
\r
1135 bw.Write(node.arスコア[i].譜面情報.演奏回数.Guitar);
\r
1136 bw.Write(node.arスコア[i].譜面情報.演奏回数.Bass);
\r
1137 bw.Write(node.arスコア[i].譜面情報.演奏履歴.行1);
\r
1138 bw.Write(node.arスコア[i].譜面情報.演奏履歴.行2);
\r
1139 bw.Write(node.arスコア[i].譜面情報.演奏履歴.行3);
\r
1140 bw.Write(node.arスコア[i].譜面情報.演奏履歴.行4);
\r
1141 bw.Write(node.arスコア[i].譜面情報.演奏履歴.行5);
\r
1142 bw.Write(node.arスコア[i].譜面情報.レベルを非表示にする);
\r
1143 bw.Write((int)node.arスコア[i].譜面情報.曲種別);
\r
1144 bw.Write(node.arスコア[i].譜面情報.Bpm);
\r
1145 bw.Write(node.arスコア[i].譜面情報.Duration);
\r
1146 bw.Write((int)node.arスコア[i].譜面情報.使用レーン数.Drums);
\r
1147 bw.Write((int)node.arスコア[i].譜面情報.使用レーン数.Guitar);
\r
1148 bw.Write((int)node.arスコア[i].譜面情報.使用レーン数.Bass);
\r
1149 this.nSongsDBへ出力できたスコア数++;
\r
1153 private void tSongsDBにリストを1つ出力する(BinaryWriter bw, List<C曲リストノード> list)
\r
1155 foreach (C曲リストノード c曲リストノード in list)
\r
1157 if ((c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE)
\r
1158 || (c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI))
\r
1160 this.tSongsDBにノードを1つ出力する(bw, c曲リストノード);
\r
1162 if (c曲リストノード.list子リスト != null)
\r
1164 this.tSongsDBにリストを1つ出力する(bw, c曲リストノード.list子リスト);
\r
1168 //-----------------
\r
1171 #region [ 曲リストソート ]
\r
1172 //-----------------
\r
1173 public void t曲リストのソート1_絶対パス順(List<C曲リストノード> ノードリスト)
\r
1175 ノードリスト.Sort(delegate (C曲リストノード n1, C曲リストノード n2)
\r
1182 int num = this.t比較0_共通(n1, n2);
\r
1187 if ((n1.eノード種別 == C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 == C曲リストノード.Eノード種別.BOX))
\r
1189 return n1.arスコア[0].ファイル情報.フォルダの絶対パス.CompareTo(n2.arスコア[0].ファイル情報.フォルダの絶対パス);
\r
1193 if (string.IsNullOrEmpty(n1.pathSetDefの絶対パス))
\r
1195 for (int i = 0; i < 5; i++)
\r
1197 if (n1.arスコア[i] != null)
\r
1199 str = n1.arスコア[i].ファイル情報.ファイルの絶対パス;
\r
1210 str = n1.pathSetDefの絶対パス + n1.SetDefのブロック番号.ToString("00");
\r
1213 if (string.IsNullOrEmpty(n2.pathSetDefの絶対パス))
\r
1215 for (int j = 0; j < 5; j++)
\r
1217 if (n2.arスコア[j] != null)
\r
1219 strB = n2.arスコア[j].ファイル情報.ファイルの絶対パス;
\r
1230 strB = n2.pathSetDefの絶対パス + n2.SetDefのブロック番号.ToString("00");
\r
1232 return str.CompareTo(strB);
\r
1234 foreach (C曲リストノード c曲リストノード in ノードリスト)
\r
1236 if ((c曲リストノード.list子リスト != null) && (c曲リストノード.list子リスト.Count > 1))
\r
1238 this.t曲リストのソート1_絶対パス順(c曲リストノード.list子リスト);
\r
1242 public void t曲リストのソート2_タイトル順(List<C曲リストノード> ノードリスト, EPart part, int order, params object[] p)
\r
1244 ノードリスト.Sort(delegate (C曲リストノード n1, C曲リストノード n2)
\r
1250 int num = this.t比較0_共通(n1, n2);
\r
1253 return order * num;
\r
1255 return order * n1.strタイトル.CompareTo(n2.strタイトル);
\r
1257 // foreach( C曲リストノード c曲リストノード in ノードリスト )
\r
1259 // if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )
\r
1261 // this.t曲リストのソート2_タイトル順( c曲リストノード.list子リスト, part, order );
\r
1268 /// <param name="ノードリスト"></param>
\r
1269 /// <param name="part"></param>
\r
1270 /// <param name="order">1=Ascend -1=Descend</param>
\r
1271 public void t曲リストのソート3_演奏回数の多い順(List<C曲リストノード> ノードリスト, EPart part, int order, params object[] p)
\r
1274 int nL12345 = (int)p[0];
\r
1275 if (part != EPart.Unknown)
\r
1277 ノードリスト.Sort(delegate (C曲リストノード n1, C曲リストノード n2)
\r
1284 int num = this.t比較0_共通(n1, n2);
\r
1287 return order * num;
\r
1289 if ((n1.eノード種別 == C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 == C曲リストノード.Eノード種別.BOX))
\r
1291 return order * n1.arスコア[0].ファイル情報.フォルダの絶対パス.CompareTo(n2.arスコア[0].ファイル情報.フォルダの絶対パス);
\r
1294 int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;
\r
1295 // for( int i = 0; i < 5; i++ )
\r
1297 if (n1.arスコア[nL12345] != null)
\r
1299 nSumPlayCountN1 += n1.arスコア[nL12345].譜面情報.演奏回数[part];
\r
1301 if (n2.arスコア[nL12345] != null)
\r
1303 nSumPlayCountN2 += n2.arスコア[nL12345].譜面情報.演奏回数[part];
\r
1306 num = nSumPlayCountN2 - nSumPlayCountN1;
\r
1309 return order * num;
\r
1311 return order * n1.strタイトル.CompareTo(n2.strタイトル);
\r
1313 foreach (C曲リストノード c曲リストノード in ノードリスト)
\r
1315 int nSumPlayCountN1 = 0;
\r
1316 // for ( int i = 0; i < 5; i++ )
\r
1318 if (c曲リストノード.arスコア[nL12345] != null)
\r
1320 nSumPlayCountN1 += c曲リストノード.arスコア[nL12345].譜面情報.演奏回数[part];
\r
1323 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );
\r
1326 // foreach( C曲リストノード c曲リストノード in ノードリスト )
\r
1328 // if( ( c曲リストノード.list子リスト != null ) && ( c曲リストノード.list子リスト.Count > 1 ) )
\r
1330 // this.t曲リストのソート3_演奏回数の多い順( c曲リストノード.list子リスト, part );
\r
1335 public void t曲リストのソート4_LEVEL順(List<C曲リストノード> ノードリスト, EPart part, int order, params object[] p)
\r
1338 int nL12345 = (int)p[0];
\r
1339 if (part != EPart.Unknown)
\r
1341 ノードリスト.Sort(delegate (C曲リストノード n1, C曲リストノード n2)
\r
1348 int num = this.t比較0_共通(n1, n2);
\r
1351 return order * num;
\r
1353 if ((n1.eノード種別 == C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 == C曲リストノード.Eノード種別.BOX))
\r
1355 return order * n1.arスコア[0].ファイル情報.フォルダの絶対パス.CompareTo(n2.arスコア[0].ファイル情報.フォルダの絶対パス);
\r
1358 int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;
\r
1359 if (n1.arスコア[nL12345] != null)
\r
1361 nSumPlayCountN1 = n1.arスコア[nL12345].譜面情報.レベル[part];
\r
1363 if (n2.arスコア[nL12345] != null)
\r
1365 nSumPlayCountN2 = n2.arスコア[nL12345].譜面情報.レベル[part];
\r
1367 num = nSumPlayCountN2 - nSumPlayCountN1;
\r
1370 return order * num;
\r
1372 return order * n1.strタイトル.CompareTo(n2.strタイトル);
\r
1374 foreach (C曲リストノード c曲リストノード in ノードリスト)
\r
1376 int nSumPlayCountN1 = 0;
\r
1377 if (c曲リストノード.arスコア[nL12345] != null)
\r
1379 nSumPlayCountN1 = c曲リストノード.arスコア[nL12345].譜面情報.レベル[part];
\r
1381 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );
\r
1385 public void t曲リストのソート5_BestRank順(List<C曲リストノード> ノードリスト, EPart part, int order, params object[] p)
\r
1388 int nL12345 = (int)p[0];
\r
1389 if (part != EPart.Unknown)
\r
1391 ノードリスト.Sort(delegate (C曲リストノード n1, C曲リストノード n2)
\r
1398 int num = this.t比較0_共通(n1, n2);
\r
1401 return order * num;
\r
1403 if ((n1.eノード種別 == C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 == C曲リストノード.Eノード種別.BOX))
\r
1405 return order * n1.arスコア[0].ファイル情報.フォルダの絶対パス.CompareTo(n2.arスコア[0].ファイル情報.フォルダの絶対パス);
\r
1408 int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;
\r
1409 bool isFullCombo1 = false, isFullCombo2 = false;
\r
1410 if (n1.arスコア[nL12345] != null)
\r
1412 isFullCombo1 = n1.arスコア[nL12345].譜面情報.フルコンボ[part];
\r
1413 nSumPlayCountN1 = (int)n1.arスコア[nL12345].譜面情報.最大ランク[part];
\r
1415 if (n2.arスコア[nL12345] != null)
\r
1417 isFullCombo2 = n2.arスコア[nL12345].譜面情報.フルコンボ[part];
\r
1418 nSumPlayCountN2 = (int)n2.arスコア[nL12345].譜面情報.最大ランク[part];
\r
1420 if (isFullCombo1 ^ isFullCombo2)
\r
1422 if (isFullCombo1) return order; else return -order;
\r
1424 num = nSumPlayCountN2 - nSumPlayCountN1;
\r
1427 return order * num;
\r
1429 return order * n1.strタイトル.CompareTo(n2.strタイトル);
\r
1431 foreach (C曲リストノード c曲リストノード in ノードリスト)
\r
1433 int nSumPlayCountN1 = 0;
\r
1434 if (c曲リストノード.arスコア[nL12345] != null)
\r
1436 nSumPlayCountN1 = (int)c曲リストノード.arスコア[nL12345].譜面情報.最大ランク[part];
\r
1438 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );
\r
1442 public void t曲リストのソート6_SkillPoint順(List<C曲リストノード> ノードリスト, EPart part, int order, params object[] p)
\r
1445 int nL12345 = (int)p[0];
\r
1446 if (part != EPart.Unknown)
\r
1448 ノードリスト.Sort(delegate (C曲リストノード n1, C曲リストノード n2)
\r
1455 int num = this.t比較0_共通(n1, n2);
\r
1458 return order * num;
\r
1460 if ((n1.eノード種別 == C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 == C曲リストノード.Eノード種別.BOX))
\r
1462 return order * n1.arスコア[0].ファイル情報.フォルダの絶対パス.CompareTo(n2.arスコア[0].ファイル情報.フォルダの絶対パス);
\r
1465 double nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;
\r
1466 if (n1.arスコア[nL12345] != null)
\r
1468 nSumPlayCountN1 = n1.arスコア[nL12345].譜面情報.最大スキル[part];
\r
1470 if (n2.arスコア[nL12345] != null)
\r
1472 nSumPlayCountN2 = n2.arスコア[nL12345].譜面情報.最大スキル[part];
\r
1474 double d = nSumPlayCountN2 - nSumPlayCountN1;
\r
1477 return order * System.Math.Sign(d);
\r
1479 return order * n1.strタイトル.CompareTo(n2.strタイトル);
\r
1481 foreach (C曲リストノード c曲リストノード in ノードリスト)
\r
1483 double nSumPlayCountN1 = 0;
\r
1484 if (c曲リストノード.arスコア[nL12345] != null)
\r
1486 nSumPlayCountN1 = c曲リストノード.arスコア[nL12345].譜面情報.最大スキル[part];
\r
1488 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );
\r
1492 public void t曲リストのソート7_更新日時順(List<C曲リストノード> ノードリスト, EPart part, int order, params object[] p)
\r
1494 int nL12345 = (int)p[0];
\r
1495 if (part != EPart.Unknown)
\r
1497 ノードリスト.Sort(delegate (C曲リストノード n1, C曲リストノード n2)
\r
1504 int num = this.t比較0_共通(n1, n2);
\r
1507 return order * num;
\r
1509 if ((n1.eノード種別 == C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 == C曲リストノード.Eノード種別.BOX))
\r
1511 return order * n1.arスコア[0].ファイル情報.フォルダの絶対パス.CompareTo(n2.arスコア[0].ファイル情報.フォルダの絶対パス);
\r
1514 DateTime nSumPlayCountN1 = DateTime.Parse("0001/01/01 12:00:01.000");
\r
1515 DateTime nSumPlayCountN2 = DateTime.Parse("0001/01/01 12:00:01.000");
\r
1516 if (n1.arスコア[nL12345] != null)
\r
1518 nSumPlayCountN1 = n1.arスコア[nL12345].ファイル情報.最終更新日時;
\r
1520 if (n2.arスコア[nL12345] != null)
\r
1522 nSumPlayCountN2 = n2.arスコア[nL12345].ファイル情報.最終更新日時;
\r
1524 int d = nSumPlayCountN1.CompareTo(nSumPlayCountN2);
\r
1527 return order * System.Math.Sign(d);
\r
1529 return order * n1.strタイトル.CompareTo(n2.strタイトル);
\r
1531 foreach (C曲リストノード c曲リストノード in ノードリスト)
\r
1533 DateTime nSumPlayCountN1 = DateTime.Parse("0001/01/01 12:00:01.000");
\r
1534 if (c曲リストノード.arスコア[nL12345] != null)
\r
1536 nSumPlayCountN1 = c曲リストノード.arスコア[nL12345].ファイル情報.最終更新日時;
\r
1538 // Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストノード.strタイトル );
\r
1542 public void t曲リストのソート8_アーティスト名順(List<C曲リストノード> ノードリスト, EPart part, int order, params object[] p)
\r
1544 int nL12345 = (int)p[0];
\r
1545 ノードリスト.Sort(delegate (C曲リストノード n1, C曲リストノード n2)
\r
1552 int num = this.t比較0_共通(n1, n2);
\r
1555 return order * System.Math.Sign(num);
\r
1558 string strAuthorN1 = "";
\r
1559 string strAuthorN2 = "";
\r
1560 int nL12345補正後1 = nL12345;
\r
1561 int nL12345補正後2 = nL12345;
\r
1562 if (n1.arスコア[nL12345] == null)
\r
1564 nL12345補正後1 = n現在のアンカ難易度レベルに最も近い難易度レベルを返す(n1, nL12345);
\r
1566 if (n1.arスコア[nL12345補正後1] != null)
\r
1568 strAuthorN1 = n1.arスコア[nL12345補正後1].譜面情報.アーティスト名;
\r
1570 if (n2.arスコア[nL12345] == null)
\r
1572 nL12345補正後2 = n現在のアンカ難易度レベルに最も近い難易度レベルを返す(n2, nL12345);
\r
1574 if (n2.arスコア[nL12345補正後2] != null)
\r
1576 strAuthorN2 = n2.arスコア[nL12345補正後2].譜面情報.アーティスト名;
\r
1579 return order * strAuthorN1.CompareTo(strAuthorN2);
\r
1582 foreach (C曲リストノード c曲リストノード in ノードリスト)
\r
1585 if (c曲リストノード.arスコア[nL12345] != null)
\r
1587 s = c曲リストノード.arスコア[nL12345].譜面情報.アーティスト名;
\r
1589 //Debug.WriteLine( s + ":" + c曲リストノード.strタイトル );
\r
1594 /// CActSelect曲リスト のメソッドのデッドコピー。美しくない実装ですみません。
\r
1596 /// <param name="song"></param>
\r
1597 /// <param name="n現在のアンカ難易度レベル"></param>
\r
1598 /// <returns></returns>
\r
1599 public int n現在のアンカ難易度レベルに最も近い難易度レベルを返す(C曲リストノード song, int n現在のアンカ難易度レベル)
\r
1604 return n現在のアンカ難易度レベル; // 曲がまったくないよ
\r
1606 if (song.arスコア[n現在のアンカ難易度レベル] != null)
\r
1607 return n現在のアンカ難易度レベル; // 難易度ぴったりの曲があったよ
\r
1609 if ((song.eノード種別 == C曲リストノード.Eノード種別.BOX) || (song.eノード種別 == C曲リストノード.Eノード種別.BACKBOX))
\r
1610 return 0; // BOX と BACKBOX は関係無いよ
\r
1613 // 現在のアンカレベルから、難易度上向きに検索開始。
\r
1615 int n最も近いレベル = n現在のアンカ難易度レベル;
\r
1617 for (int i = 0; i < 5; i++)
\r
1619 if (song.arスコア[n最も近いレベル] != null)
\r
1622 n最も近いレベル = (n最も近いレベル + 1) % 5; // 曲がなかったので次の難易度レベルへGo。(5以上になったら0に戻る。)
\r
1626 // 見つかった曲がアンカより下のレベルだった場合……
\r
1627 // アンカから下向きに検索すれば、もっとアンカに近い曲があるんじゃね?
\r
1629 if (n最も近いレベル < n現在のアンカ難易度レベル)
\r
1631 // 現在のアンカレベルから、難易度下向きに検索開始。
\r
1633 n最も近いレベル = n現在のアンカ難易度レベル;
\r
1635 for (int i = 0; i < 5; i++)
\r
1637 if (song.arスコア[n最も近いレベル] != null)
\r
1640 n最も近いレベル = ((n最も近いレベル - 1) + 5) % 5; // 曲がなかったので次の難易度レベルへGo。(0未満になったら4に戻る。)
\r
1647 public void t曲リストのソート9_BPM順( List<C曲リストノード> ノードリスト, E楽器パート part, int order, params object[] p )
\r
1650 int nL12345 = (int) p[ 0 ];
\r
1651 if ( part != E楽器パート.UNKNOWN )
\r
1653 ノードリスト.Sort( delegate( C曲リストノード n1, C曲リストノード n2 )
\r
1660 int num = this.t比較0_共通( n1, n2 );
\r
1663 return order * num;
\r
1665 if ( ( n1.eノード種別 == C曲リストノード.Eノード種別.BOX ) && ( n2.eノード種別 == C曲リストノード.Eノード種別.BOX ) )
\r
1667 return order * n1.arスコア[ 0 ].ファイル情報.フォルダの絶対パス.CompareTo( n2.arスコア[ 0 ].ファイル情報.フォルダの絶対パス );
\r
1670 double dBPMn1 = 0.0, dBPMn2 = 0.0;
\r
1671 if ( n1.arスコア[ nL12345 ] != null )
\r
1673 dBPMn1 = n1.arスコア[ nL12345 ].譜面情報.bpm;
\r
1675 if ( n2.arスコア[ nL12345 ] != null )
\r
1677 dBPMn2 = n2.arスコア[ nL12345 ].譜面情報.bpm;
\r
1679 double d = dBPMn1- dBPMn2;
\r
1682 return order * System.Math.Sign( d );
\r
1684 return order * n1.strタイトル.CompareTo( n2.strタイトル );
\r
1686 foreach ( C曲リストノード c曲リストノード in ノードリスト )
\r
1689 if ( c曲リストノード.arスコア[ nL12345 ] != null )
\r
1691 dBPM = c曲リストノード.arスコア[ nL12345 ].譜面情報.bpm;
\r
1693 Debug.WriteLine( dBPM + ":" + c曲リストノード.strタイトル );
\r
1698 //-----------------
\r
1700 #region [ .score.ini を読み込んで Cスコア.譜面情報に設定する ]
\r
1701 //-----------------
\r
1702 public void tScoreIniを読み込んで譜面情報を設定する(string strScoreIniファイルパス, ref Cスコア score)
\r
1704 if (!File.Exists(strScoreIniファイルパス))
\r
1709 var ini = new CScoreIni(strScoreIniファイルパス);
\r
1711 for (EPart inst = EPart.Drums; inst <= EPart.Bass; inst++)
\r
1713 //-----------------
\r
1715 ini.stセクション.HiSkill[inst].b演奏にMIDI入力を使用した ||
\r
1716 ini.stセクション.HiSkill[inst].b演奏にキーボードを使用した ||
\r
1717 ini.stセクション.HiSkill[inst].b演奏にジョイパッドを使用した ||
\r
1718 ini.stセクション.HiSkill[inst].b演奏にマウスを使用した)
\r
1720 // (A) 全オートじゃないようなので、演奏結果情報を有効としてランクを算出する。
\r
1722 score.譜面情報.最大ランク[inst] =
\r
1723 CScoreIni.tランク値を計算して返す(
\r
1724 ini.stセクション.HiSkill[inst].n全チップ数,
\r
1725 ini.stセクション.HiSkill[inst].nPerfect数,
\r
1726 ini.stセクション.HiSkill[inst].nGreat数,
\r
1727 ini.stセクション.HiSkill[inst].nGood数,
\r
1728 ini.stセクション.HiSkill[inst].nPoor数,
\r
1729 ini.stセクション.HiSkill[inst].nMiss数);
\r
1733 // (B) 全オートらしいので、ランクは無効とする。
\r
1735 score.譜面情報.最大ランク[inst] = CScoreIni.ERANK.UNKNOWN;
\r
1737 //-----------------
\r
1738 score.譜面情報.最大スキル[inst] = ini.stセクション.HiSkill[inst].db演奏型スキル値;
\r
1739 score.譜面情報.フルコンボ[inst] = ini.stセクション.HiSkill[inst].bフルコンボである;
\r
1741 score.譜面情報.演奏回数.Drums = ini.stファイル.PlayCountDrums;
\r
1742 score.譜面情報.演奏回数.Guitar = ini.stファイル.PlayCountGuitar;
\r
1743 score.譜面情報.演奏回数.Bass = ini.stファイル.PlayCountBass;
\r
1744 for (int i = 0; i < 5; i++)
\r
1746 score.譜面情報.演奏履歴[i] = ini.stファイル.History[i];
\r
1751 Trace.TraceError("演奏記録ファイルの読み込みに失敗しました。[{0}]", strScoreIniファイルパス);
\r
1754 //-----------------
\r
1760 #region [ private ]
\r
1761 //-----------------
\r
1762 private const string SONGSDB_VERSION = "SongsDB4";
\r
1763 private List<string> listStrBoxDefSkinSubfolderFullName;
\r
1765 private int t比較0_共通(C曲リストノード n1, C曲リストノード n2)
\r
1767 if (n1.eノード種別 == C曲リストノード.Eノード種別.BACKBOX)
\r
1771 if (n2.eノード種別 == C曲リストノード.Eノード種別.BACKBOX)
\r
1775 if (n1.eノード種別 == C曲リストノード.Eノード種別.RANDOM)
\r
1779 if (n2.eノード種別 == C曲リストノード.Eノード種別.RANDOM)
\r
1783 if ((n1.eノード種別 == C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 != C曲リストノード.Eノード種別.BOX))
\r
1787 if ((n1.eノード種別 != C曲リストノード.Eノード種別.BOX) && (n2.eノード種別 == C曲リストノード.Eノード種別.BOX))
\r
1795 /// 検索を中断・スローダウンする
\r
1797 private void SlowOrSuspendSearchTask()
\r
1799 if (this.bIsSuspending) // #27060 中断要求があったら、解除要求が来るまで待機
\r
1801 autoReset.WaitOne();
\r
1803 if (this.bIsSlowdown && ++this.searchCount > 10) // #27060 #PREMOVIE再生中は検索負荷を下げる
\r
1805 Thread.Sleep(100);
\r
1806 this.searchCount = 0;
\r
1810 //-----------------
\r