private void tスコアキャッシュを曲リストに反映する(List<C曲リストノード> ノードリスト) { using (List<C曲リストノード>.Enumerator enumerator = ノードリスト.GetEnumerator()) { while (enumerator.MoveNext()) { SlowOrSuspendSearchTask(); // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす C曲リストノード node = enumerator.Current; if (node.eノード種別 == C曲リストノード.Eノード種別.BOX) { this.tスコアキャッシュを曲リストに反映する(node.list子リスト); } else if ((node.eノード種別 == C曲リストノード.Eノード種別.SCORE)) { Predicate<Cスコア> match = null; if (match == null) { match = delegate (Cスコア sc) { return ( (sc.ファイル情報.ファイルの絶対パス.Equals(node.arスコア.ファイル情報.ファイルの絶対パス) && sc.ファイル情報.ファイルサイズ.Equals(node.arスコア.ファイル情報.ファイルサイズ)) && (sc.ファイル情報.最終更新日時.Equals(node.arスコア.ファイル情報.最終更新日時) && sc.ScoreIni情報.ファイルサイズ.Equals(node.arスコア.ScoreIni情報.ファイルサイズ))) && sc.ScoreIni情報.最終更新日時.Equals(node.arスコア.ScoreIni情報.最終更新日時); }; } int nMatched = this.listSongsDB.FindIndex(match); if (nMatched == -1) { //Trace.TraceInformation( "songs.db に存在しません。({0})", node.arスコア[ lv ].ファイル情報.ファイルの絶対パス ); if (TJAPlayer3.ConfigIni.bLog曲検索ログ出力) { Trace.TraceInformation("songs.db に存在しません。({0})", node.arスコア.ファイル情報.ファイルの絶対パス); } } else { node.arスコア.譜面情報 = this.listSongsDB[nMatched].譜面情報; node.arスコア.bSongDBにキャッシュがあった = true; if (TJAPlayer3.ConfigIni.bLog曲検索ログ出力) { Trace.TraceInformation("songs.db から転記しました。({0})", node.arスコア.ファイル情報.ファイルの絶対パス); } this.nスコアキャッシュから反映できたスコア数++; } } } } }
private static void 親ノードを設定する(ref List <C曲リストノード> cs, C曲リストノード parent) { foreach (C曲リストノード c in cs) { if (c.eノード種別 == C曲リストノード.Eノード種別.BOX && c.list子リスト != null) { 親ノードを設定する(ref c.list子リスト, c); //再帰 } else { c.r親ノード = parent; } } }
public static void tとじるノードの等間隔追加(List<C曲リストノード> ノードリスト) { int 戻るノード数 = 0; for (int index = 0; index < ノードリスト.Count; index++) { if (ノードリスト[index].eノード種別 == C曲リストノード.Eノード種別.BACKBOX) { C曲リストノード tmp = new C曲リストノード();//今、入ってるBACKBOXを使いまわす。 tmp = ノードリスト[index]; ノードリスト.RemoveAt(index); ノードリスト.Insert(Math.Min((戻るノード数) * (TJAPlayer3.ConfigIni.n閉じる差し込み間隔 + 1), ノードリスト.Count), tmp); 戻るノード数++; } } }
private void t指定された曲の子リストの曲を列挙する_孫リスト含む(C曲リストノード r親, ref List <C曲リストノード> list) { if ((r親 != null) && (r親.list子リスト != null)) { foreach (C曲リストノード c曲リストノード in r親.list子リスト) { if ((c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE) || (c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI)) { list.Add(c曲リストノード); } if ((c曲リストノード.list子リスト != null) && TJAPlayer3.ConfigIni.bランダムセレクトで子BOXを検索対象とする) { this.t指定された曲の子リストの曲を列挙する_孫リスト含む(c曲リストノード, ref list); } } } }
private List <C曲リストノード> t指定された曲が存在する場所の曲を列挙する_子リスト含む(C曲リストノード song) { List <C曲リストノード> list = new List <C曲リストノード>(); song = song.r親ノード; if ((song == null) && (TJAPlayer3.Songs管理.list曲ルート.Count > 0)) { foreach (C曲リストノード c曲リストノード in TJAPlayer3.Songs管理.list曲ルート) { if ((c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE) || (c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI)) { list.Add(c曲リストノード); } if ((c曲リストノード.list子リスト != null) && TJAPlayer3.ConfigIni.bランダムセレクトで子BOXを検索対象とする) { this.t指定された曲の子リストの曲を列挙する_孫リスト含む(c曲リストノード, ref list); } } return(list); } this.t指定された曲の子リストの曲を列挙する_孫リスト含む(song, ref list); return(list); }
private void t曲をランダム選択する() { C曲リストノード song = this.act曲リスト.r現在選択中の曲; if ((song.stackランダム演奏番号.Count == 0) || (song.listランダム用ノードリスト == null)) { if (song.listランダム用ノードリスト == null) { song.listランダム用ノードリスト = this.t指定された曲が存在する場所の曲を列挙する_子リスト含む(song); } int count = song.listランダム用ノードリスト.Count; if (count == 0) { return; } int[] numArray = new int[count]; for (int i = 0; i < count; i++) { numArray[i] = i; } for (int j = 0; j < (count * 1.5); j++) { int index = TJAPlayer3.Random.Next(count); int num5 = TJAPlayer3.Random.Next(count); int num6 = numArray[num5]; numArray[num5] = numArray[index]; numArray[index] = num6; } for (int k = 0; k < count; k++) { song.stackランダム演奏番号.Push(numArray[k]); } if (TJAPlayer3.ConfigIni.bLogDTX詳細ログ出力) { StringBuilder builder = new StringBuilder(0x400); builder.Append(string.Format("ランダムインデックスリストを作成しました: {0}曲: ", song.stackランダム演奏番号.Count)); for (int m = 0; m < count; m++) { builder.Append(string.Format("{0} ", numArray[m])); } Trace.TraceInformation(builder.ToString()); } } this.r確定された曲 = song.listランダム用ノードリスト[song.stackランダム演奏番号.Pop()]; for (int nPlayer = 0; nPlayer < TJAPlayer3.ConfigIni.nPlayerCount; nPlayer++) { this.n確定された曲の難易度[nPlayer] = this.act曲リスト.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(this.r確定された曲, nPlayer); } this.r確定されたスコア = this.r確定された曲.arスコア[this.n確定された曲の難易度[0]]; this.str確定された曲のジャンル = this.r確定された曲.strジャンル; this.eフェードアウト完了時の戻り値 = E戻り値.選曲した; this.actFOtoNowLoading.tフェードアウト開始(); // #27787 2012.3.10 yyagi 曲決定時の画面フェードアウトの省略 base.eフェーズID = CStage.Eフェーズ.選曲_NowLoading画面へのフェードアウト; if (TJAPlayer3.ConfigIni.bLogDTX詳細ログ出力) { int[] numArray2 = song.stackランダム演奏番号.ToArray(); StringBuilder builder2 = new StringBuilder(0x400); builder2.Append("ランダムインデックスリスト残り: "); if (numArray2.Length > 0) { for (int n = 0; n < numArray2.Length; n++) { builder2.Append(string.Format("{0} ", numArray2[n])); } } else { builder2.Append("(なし)"); } Trace.TraceInformation(builder2.ToString()); } TJAPlayer3.Skin.bgm選曲画面.t停止する(); }
/// <summary> /// 一時的に使用禁止。 /// </summary> private void t描画処理_ジャンル文字列() { C曲リストノード c曲リストノード = TJAPlayer3.stage選曲.r現在選択中の曲; Cスコア cスコア = TJAPlayer3.stage選曲.r現在選択中のスコア; if ((c曲リストノード != null) && (cスコア != null)) { string str = ""; switch (c曲リストノード.eノード種別) { case C曲リストノード.Eノード種別.SCORE: if ((c曲リストノード.strジャンル == null) || (c曲リストノード.strジャンル.Length <= 0)) { if ((cスコア.譜面情報.ジャンル != null) && (cスコア.譜面情報.ジャンル.Length > 0)) { str = cスコア.譜面情報.ジャンル; } #if false // #32644 2013.12.21 yyagi "Unknown"なジャンル表示を削除。DTX/BMSなどの種別表示もしない。 else { switch (cスコア.譜面情報.曲種別) { case CDTX.E種別.DTX: str = "DTX"; break; case CDTX.E種別.GDA: str = "GDA"; break; case CDTX.E種別.G2D: str = "G2D"; break; case CDTX.E種別.BMS: str = "BMS"; break; case CDTX.E種別.BME: str = "BME"; break; } str = "Unknown"; } #endif break; } str = c曲リストノード.strジャンル; break; case C曲リストノード.Eノード種別.SCORE_MIDI: str = "MIDI"; break; case C曲リストノード.Eノード種別.BOX: str = "MusicBox"; break; case C曲リストノード.Eノード種別.BACKBOX: str = "BackBox"; break; case C曲リストノード.Eノード種別.RANDOM: str = "Random"; break; default: str = "Unknown"; break; } TJAPlayer3.act文字コンソール.tPrint(this.n本体X + 0x12, this.n本体Y - 1, C文字コンソール.Eフォント種別.赤細, str); } }
private void t曲を検索してリストを作成する(string str基点フォルダ, bool b子BOXへ再帰する, List <C曲リストノード> listノードリスト, C曲リストノード node親) { if (!str基点フォルダ.EndsWith(@"/")) { str基点フォルダ = str基点フォルダ + @"/"; } DirectoryInfo info = new DirectoryInfo(str基点フォルダ); if (TJAPlayer3.ConfigIni.bLog曲検索ログ出力) { Trace.TraceInformation("基点フォルダ: " + str基点フォルダ); } #region [ 個別ファイルからノード作成 ] //----------------------------- foreach (FileInfo fileinfo in info.GetFiles()) { SlowOrSuspendSearchTask(); // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす string strExt = fileinfo.Extension.ToLower(); if ((strExt.Equals(".tja")) || strExt.Equals(".tcm") || strExt.Equals(".tci")) { #region [ 新処理 ] CDTX dtx = new CDTX(str基点フォルダ + fileinfo.Name, false, 1.0, 0, 0, false); C曲リストノード c曲リストノード = new C曲リストノード(); c曲リストノード.eNodeType = C曲リストノード.ENodeType.SCORE; c曲リストノード.r親ノード = node親; c曲リストノード.strBreadcrumbs = (c曲リストノード.r親ノード == null) ? str基点フォルダ + fileinfo.Name : c曲リストノード.r親ノード.strBreadcrumbs + " > " + str基点フォルダ + fileinfo.Name; c曲リストノード.strTitle = dtx.TITLE; c曲リストノード.strSubTitle = dtx.SUBTITLE; if (!string.IsNullOrEmpty(dtx.GENRE)) { c曲リストノード.strGenre = dtx.GENRE; } else { if (c曲リストノード.r親ノード != null && c曲リストノード.r親ノード.strGenre != "") { // .tjaのジャンルが存在しなくて、かつ親ノードにジャンルが指定されていればそちらを読み込む。 c曲リストノード.strGenre = c曲リストノード.r親ノード.strGenre; } } if (c曲リストノード.r親ノード != null) { c曲リストノード.ForeColor = c曲リストノード.r親ノード.ForeColor; c曲リストノード.BackColor = c曲リストノード.r親ノード.BackColor; } c曲リストノード.ForeColor = TJAPlayer3.Skin.SongSelect_ForeColor[TJAPlayer3.Skin.nStrジャンルtoNum(c曲リストノード.strGenre)]; c曲リストノード.BackColor = TJAPlayer3.Skin.SongSelect_BackColor[TJAPlayer3.Skin.nStrジャンルtoNum(c曲リストノード.strGenre)]; c曲リストノード.nLevel = dtx.LEVELtaiko; bool b = false; c曲リストノード.arスコア = new Cスコア(); c曲リストノード.arスコア.ファイル情報.ファイルの絶対パス = str基点フォルダ + fileinfo.Name; c曲リストノード.arスコア.ファイル情報.フォルダの絶対パス = str基点フォルダ; c曲リストノード.arスコア.ファイル情報.ファイルサイズ = fileinfo.Length; c曲リストノード.arスコア.ファイル情報.最終更新日時 = fileinfo.LastWriteTime; string strFileNameScoreIni = c曲リストノード.arスコア.ファイル情報.ファイルの絶対パス + ".score.ini"; if (File.Exists(strFileNameScoreIni)) { FileInfo infoScoreIni = new FileInfo(strFileNameScoreIni); c曲リストノード.arスコア.ScoreIni情報.ファイルサイズ = infoScoreIni.Length; c曲リストノード.arスコア.ScoreIni情報.最終更新日時 = infoScoreIni.LastWriteTime; } c曲リストノード.arスコア.譜面情報.Title = dtx.TITLE; c曲リストノード.arスコア.譜面情報.Artist = dtx.ARTIST; c曲リストノード.arスコア.譜面情報.Comment = dtx.COMMENT; c曲リストノード.arスコア.譜面情報.Genre = dtx.GENRE; c曲リストノード.arスコア.譜面情報.Backgound = ((dtx.BACKGROUND != null) && (dtx.BACKGROUND.Length > 0)) ? dtx.BACKGROUND : ""; c曲リストノード.arスコア.譜面情報.Bpm = dtx.BPM; c曲リストノード.arスコア.譜面情報.Duration = 0; // (cdtx.listChip == null)? 0 : cdtx.listChip[ cdtx.listChip.Count - 1 ].n発声時刻ms; c曲リストノード.arスコア.譜面情報.strBGMファイル名 = dtx.strBGM_PATH == null ? "" : dtx.strBGM_PATH; c曲リストノード.arスコア.譜面情報.SongVol = dtx.SongVol; c曲リストノード.arスコア.譜面情報.SongLoudnessMetadata = dtx.SongLoudnessMetadata; c曲リストノード.arスコア.譜面情報.nデモBGMオフセット = dtx.nデモBGMオフセット; c曲リストノード.arスコア.譜面情報.b譜面分岐[0] = dtx.bHIDDENBRANCH ? false : dtx.bHasBranch[0]; c曲リストノード.arスコア.譜面情報.b譜面分岐[1] = dtx.bHIDDENBRANCH ? false : dtx.bHasBranch[1]; c曲リストノード.arスコア.譜面情報.b譜面分岐[2] = dtx.bHIDDENBRANCH ? false : dtx.bHasBranch[2]; c曲リストノード.arスコア.譜面情報.b譜面分岐[3] = dtx.bHIDDENBRANCH ? false : dtx.bHasBranch[3]; c曲リストノード.arスコア.譜面情報.b譜面分岐[4] = dtx.bHIDDENBRANCH ? false : dtx.bHasBranch[4]; c曲リストノード.arスコア.譜面情報.b譜面分岐[5] = dtx.bHIDDENBRANCH ? false : dtx.bHasBranch[5]; c曲リストノード.arスコア.譜面情報.b譜面分岐[6] = dtx.bHIDDENBRANCH ? false : dtx.bHasBranch[6]; c曲リストノード.arスコア.譜面情報.bPapaMamaSupport[0] = dtx.bPapaMamaSupport[0]; c曲リストノード.arスコア.譜面情報.bPapaMamaSupport[1] = dtx.bPapaMamaSupport[1]; c曲リストノード.arスコア.譜面情報.bPapaMamaSupport[2] = dtx.bPapaMamaSupport[2]; c曲リストノード.arスコア.譜面情報.bPapaMamaSupport[3] = dtx.bPapaMamaSupport[3]; c曲リストノード.arスコア.譜面情報.bPapaMamaSupport[4] = dtx.bPapaMamaSupport[4]; c曲リストノード.arスコア.譜面情報.bPapaMamaSupport[5] = dtx.bPapaMamaSupport[5]; c曲リストノード.arスコア.譜面情報.bPapaMamaSupport[6] = dtx.bPapaMamaSupport[6]; c曲リストノード.arスコア.譜面情報.strSubTitle = dtx.SUBTITLE; c曲リストノード.arスコア.譜面情報.nレベル[0] = dtx.LEVELtaiko[0]; c曲リストノード.arスコア.譜面情報.nレベル[1] = dtx.LEVELtaiko[1]; c曲リストノード.arスコア.譜面情報.nレベル[2] = dtx.LEVELtaiko[2]; c曲リストノード.arスコア.譜面情報.nレベル[3] = dtx.LEVELtaiko[3]; c曲リストノード.arスコア.譜面情報.nレベル[4] = dtx.LEVELtaiko[4]; c曲リストノード.arスコア.譜面情報.nレベル[5] = dtx.LEVELtaiko[5]; c曲リストノード.arスコア.譜面情報.nレベル[6] = dtx.LEVELtaiko[6]; c曲リストノード.arスコア.譜面情報.b歌詞あり = dtx.bLyrics; for (int n = 0; n < (int)Difficulty.Total; n++) { if (dtx.b譜面が存在する[n]) { c曲リストノード.nスコア数++; c曲リストノード.arスコア.譜面情報.b譜面が存在する[n] = true; if (b == false) { this.n検索されたスコア数++; listノードリスト.Add(c曲リストノード); this.n検索された曲ノード数++; b = true; } } } dtx = null; try { var scoreIniPath = c曲リストノード.arスコア.ファイル情報.ファイルの絶対パス + ".score.ini"; if (File.Exists(scoreIniPath)) { this.tScoreIniを読み込んで譜面情報を設定する(scoreIniPath, c曲リストノード.arスコア); } else { string[] dtxscoreini = Directory.GetFiles(c曲リストノード.arスコア.ファイル情報.フォルダの絶対パス, "*.dtx.score.ini"); if (dtxscoreini.Length != 0 && File.Exists(dtxscoreini[0])) { this.tScoreIniを読み込んで譜面情報を設定する(dtxscoreini[0], c曲リストノード.arスコア); } } } catch (Exception e) { Trace.TraceError(e.ToString()); Trace.TraceError("An exception has occurred, but processing continues."); } #endregion } } //----------------------------- #endregion foreach (DirectoryInfo infoDir in info.GetDirectories()) { SlowOrSuspendSearchTask(); // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす #region [ b.box.def を含むフォルダの場合 ] //----------------------------- if (File.Exists(infoDir.FullName + @"/box.def")) { CBoxDef boxdef = new CBoxDef(infoDir.FullName + @"/box.def"); C曲リストノード c曲リストノード = new C曲リストノード(); c曲リストノード.eNodeType = C曲リストノード.ENodeType.BOX; c曲リストノード.strTitle = boxdef.Title; c曲リストノード.strGenre = boxdef.Genre; c曲リストノード.ForeColor = boxdef.ForeColor; c曲リストノード.BackColor = boxdef.BackColor; c曲リストノード.ForeColor = TJAPlayer3.Skin.SongSelect_ForeColor[TJAPlayer3.Skin.nStrジャンルtoNum(c曲リストノード.strGenre)]; c曲リストノード.BackColor = TJAPlayer3.Skin.SongSelect_BackColor[TJAPlayer3.Skin.nStrジャンルtoNum(c曲リストノード.strGenre)]; c曲リストノード.nスコア数 = 1; c曲リストノード.arスコア = new Cスコア(); c曲リストノード.arスコア.ファイル情報.フォルダの絶対パス = infoDir.FullName + @"/"; c曲リストノード.arスコア.譜面情報.Title = boxdef.Title; c曲リストノード.arスコア.譜面情報.Genre = boxdef.Genre; c曲リストノード.r親ノード = node親; c曲リストノード.Openindex = 1; c曲リストノード.strBreadcrumbs = (c曲リストノード.r親ノード == null) ? c曲リストノード.strTitle : c曲リストノード.r親ノード.strBreadcrumbs + " > " + c曲リストノード.strTitle; c曲リストノード.list子リスト = new List <C曲リストノード>(); listノードリスト.Add(c曲リストノード); if (b子BOXへ再帰する) { this.t曲を検索してリストを作成する(infoDir.FullName + @"/", b子BOXへ再帰する, c曲リストノード.list子リスト, c曲リストノード); } } //----------------------------- #endregion #region [ c.通常フォルダの場合 ] //----------------------------- else { this.t曲を検索してリストを作成する(infoDir.FullName + @"/", b子BOXへ再帰する, listノードリスト, node親); } //----------------------------- #endregion } }
private void t曲リストへ後処理を適用する(List <C曲リストノード> ノードリスト) { #region [ リストに1つ以上の曲があるなら RANDOM BOX を入れる ] //----------------------------- if (ノードリスト.Count > 0 && TJAPlayer3.ConfigIni.RandomPresence) { C曲リストノード itemRandom = new C曲リストノード(); itemRandom.eNodeType = C曲リストノード.ENodeType.RANDOM; itemRandom.strTitle = "ランダムに曲をえらぶ"; itemRandom.nスコア数 = (int)Difficulty.Total; itemRandom.r親ノード = ノードリスト[0].r親ノード; itemRandom.strBreadcrumbs = (itemRandom.r親ノード == null) ? itemRandom.strTitle : itemRandom.r親ノード.strBreadcrumbs + " > " + itemRandom.strTitle; itemRandom.arスコア = new Cスコア(); for (int i = 0; i < (int)Difficulty.Total; i++) { itemRandom.arスコア.譜面情報.Title = string.Format("< RANDOM SELECT Lv.{0} >", i + 1); itemRandom.arスコア.譜面情報.Comment = (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ? string.Format("難易度レベル {0} 付近の曲をランダムに選択します。難易度レベルを持たない曲も選択候補となります。", i + 1) : string.Format("Random select from the songs which has the level about L{0}. Non-leveled songs may also selected.", i + 1); itemRandom.arスコア.譜面情報.b譜面が存在する[i] = true; } ノードリスト.Add(itemRandom); #region [ ログ出力 ] //----------------------------- if (TJAPlayer3.ConfigIni.bLog曲検索ログ出力) { StringBuilder sb = new StringBuilder(0x100); sb.Append(string.Format("nID#{0:D3}", itemRandom.nID)); if (itemRandom.r親ノード != null) { sb.Append(string.Format("(in#{0:D3}):", itemRandom.r親ノード.nID)); } else { sb.Append("(onRoot):"); } sb.Append(" RANDOM"); Trace.TraceInformation(sb.ToString()); } //----------------------------- #endregion } //----------------------------- #endregion // すべてのノードについて… foreach (C曲リストノード c曲リストノード in ノードリスト) { SlowOrSuspendSearchTask(); // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす #region [ BOXノードなら子リストに <<BACK を入れ、子リストに後処理を適用する ] //----------------------------- if (c曲リストノード.eNodeType == C曲リストノード.ENodeType.BOX) { int 曲数 = c曲リストノード.list子リスト.Count; //for文に直接書くと、もどるもカウントされてしまう。 for (int index = 0; index < ((曲数 - 1) / TJAPlayer3.ConfigIni.n閉じる差し込み間隔) + 2; index++) { C曲リストノード itemBack = new C曲リストノード(); itemBack.eNodeType = C曲リストノード.ENodeType.BACKBOX; itemBack.strTitle = "とじる"; itemBack.nスコア数 = 1; itemBack.r親ノード = c曲リストノード; itemBack.strSkinPath = (c曲リストノード.r親ノード == null) ? "" : c曲リストノード.r親ノード.strSkinPath; if (itemBack.strSkinPath != "" && !listStrBoxDefSkinSubfolderFullName.Contains(itemBack.strSkinPath)) { listStrBoxDefSkinSubfolderFullName.Add(itemBack.strSkinPath); } itemBack.strBreadcrumbs = (itemBack.r親ノード == null) ? itemBack.strTitle : itemBack.r親ノード.strBreadcrumbs + " > " + itemBack.strTitle; itemBack.arスコア = new Cスコア(); itemBack.arスコア.ファイル情報.フォルダの絶対パス = ""; itemBack.arスコア.譜面情報.Title = itemBack.strTitle; itemBack.arスコア.譜面情報.Comment = (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ? "BOX を出ます。" : "Exit from the BOX."; c曲リストノード.arスコア.譜面情報.b譜面が存在する[0] = true; c曲リストノード.list子リスト.Insert(Math.Min(index * (TJAPlayer3.ConfigIni.n閉じる差し込み間隔 + 1), c曲リストノード.list子リスト.Count), itemBack); #region [ ログ出力 ] //----------------------------- if (TJAPlayer3.ConfigIni.bLog曲検索ログ出力) { StringBuilder sb = new StringBuilder(0x100); sb.Append(string.Format("nID#{0:D3}", itemBack.nID)); if (itemBack.r親ノード != null) { sb.Append(string.Format("(in#{0:D3}):", itemBack.r親ノード.nID)); } else { sb.Append("(onRoot):"); } sb.Append(" BACKBOX"); Trace.TraceInformation(sb.ToString()); } //----------------------------- #endregion } this.t曲リストへ後処理を適用する(c曲リストノード.list子リスト); continue; } //----------------------------- #endregion #region [ ノードにタイトルがないなら、最初に見つけたスコアのタイトルを設定する ] //----------------------------- if (string.IsNullOrEmpty(c曲リストノード.strTitle)) { for (int j = 0; j < (int)Difficulty.Total; j++) { if ((c曲リストノード.arスコア.譜面情報.b譜面が存在する[j] != false) && !string.IsNullOrEmpty(c曲リストノード.arスコア.譜面情報.Title)) { c曲リストノード.strTitle = c曲リストノード.arスコア.譜面情報.Title; if (TJAPlayer3.ConfigIni.bLog曲検索ログ出力) { Trace.TraceInformation("タイトルを設定しました。(nID#{0:D3}, title={1})", c曲リストノード.nID, c曲リストノード.strTitle); } break; } } } //----------------------------- #endregion } #region [ ノードをソートする ] //----------------------------- if (TJAPlayer3.ConfigIni.nDefaultSongSort == 0) { t曲リストのソート1_絶対パス順(ノードリスト); } else if (TJAPlayer3.ConfigIni.nDefaultSongSort == 1) { t曲リストのソート9_ジャンル順(ノードリスト, 0, 0); } //----------------------------- #endregion }
private void t曲を検索してリストを作成する(string str基点フォルダ, bool b子BOXへ再帰する, List <C曲リストノード> listノードリスト, C曲リストノード node親) { if (!str基点フォルダ.EndsWith(@"\")) { str基点フォルダ = str基点フォルダ + @"\"; } DirectoryInfo info = new DirectoryInfo(str基点フォルダ); if (TJAPlayer3.ConfigIni.bLog曲検索ログ出力) { Trace.TraceInformation("基点フォルダ: " + str基点フォルダ); } #region [ 個別ファイルからノード作成 ] //----------------------------- foreach (FileInfo fileinfo in info.GetFiles()) { SlowOrSuspendSearchTask(); // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす string strExt = fileinfo.Extension.ToLower(); if ((strExt.Equals(".tja")) || strExt.Equals(".tcm") || strExt.Equals(".tci")) { #region [ 新処理 ] CDTX dtx = new CDTX(str基点フォルダ + fileinfo.Name, false, 1.0, 0); C曲リストノード c曲リストノード = new C曲リストノード(); c曲リストノード.eノード種別 = C曲リストノード.Eノード種別.SCORE; c曲リストノード.r親ノード = node親; c曲リストノード.strBreadcrumbs = (c曲リストノード.r親ノード == null) ? str基点フォルダ + fileinfo.Name : c曲リストノード.r親ノード.strBreadcrumbs + " > " + str基点フォルダ + fileinfo.Name; c曲リストノード.strタイトル = dtx.TITLE; c曲リストノード.strサブタイトル = dtx.SUBTITLE; if (!string.IsNullOrEmpty(dtx.GENRE)) { c曲リストノード.strジャンル = dtx.GENRE; } else { if (c曲リストノード.r親ノード != null && c曲リストノード.r親ノード.strジャンル != "") { // .tjaのジャンルが存在しなくて、かつ親ノードにジャンルが指定されていればそちらを読み込む。 c曲リストノード.strジャンル = c曲リストノード.r親ノード.strジャンル; } } if (c曲リストノード.r親ノード != null) { if (c曲リストノード.r親ノード.IsChangedForeColor) { c曲リストノード.ForeColor = c曲リストノード.r親ノード.ForeColor; c曲リストノード.IsChangedForeColor = true; } if (c曲リストノード.r親ノード.IsChangedBackColor) { c曲リストノード.BackColor = c曲リストノード.r親ノード.BackColor; c曲リストノード.IsChangedBackColor = true; } } c曲リストノード.ForeColor = TJAPlayer3.Skin.SongSelect_ForeColor[TJAPlayer3.Skin.nStrジャンルtoNum(c曲リストノード.strジャンル)]; c曲リストノード.BackColor = TJAPlayer3.Skin.SongSelect_BackColor[TJAPlayer3.Skin.nStrジャンルtoNum(c曲リストノード.strジャンル)]; c曲リストノード.nLevel = dtx.LEVELtaiko; bool b = false; c曲リストノード.arスコア = new Cスコア(); c曲リストノード.arスコア.ファイル情報.ファイルの絶対パス = str基点フォルダ + fileinfo.Name; c曲リストノード.arスコア.ファイル情報.フォルダの絶対パス = str基点フォルダ; c曲リストノード.arスコア.ファイル情報.ファイルサイズ = fileinfo.Length; c曲リストノード.arスコア.ファイル情報.最終更新日時 = fileinfo.LastWriteTime; string strFileNameScoreIni = c曲リストノード.arスコア.ファイル情報.ファイルの絶対パス + ".score.ini"; if (File.Exists(strFileNameScoreIni)) { FileInfo infoScoreIni = new FileInfo(strFileNameScoreIni); c曲リストノード.arスコア.ScoreIni情報.ファイルサイズ = infoScoreIni.Length; c曲リストノード.arスコア.ScoreIni情報.最終更新日時 = infoScoreIni.LastWriteTime; } for (int n = 0; n < (int)Difficulty.Total; n++) { if (dtx.b譜面が存在する[n]) { c曲リストノード.nスコア数++; c曲リストノード.arスコア.譜面情報.b譜面が存在する[n] = true; if (b == false) { this.n検索されたスコア数++; listノードリスト.Add(c曲リストノード); this.n検索された曲ノード数++; b = true; } } } dtx = null; #endregion } } //----------------------------- #endregion foreach (DirectoryInfo infoDir in info.GetDirectories()) { SlowOrSuspendSearchTask(); // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす #region [ b.box.def を含むフォルダの場合 ] //----------------------------- if (File.Exists(infoDir.FullName + @"\box.def")) { CBoxDef boxdef = new CBoxDef(infoDir.FullName + @"\box.def"); C曲リストノード c曲リストノード = new C曲リストノード(); c曲リストノード.eノード種別 = C曲リストノード.Eノード種別.BOX; c曲リストノード.strタイトル = boxdef.Title; c曲リストノード.strジャンル = boxdef.Genre; if (boxdef.IsChangedForeColor) { c曲リストノード.ForeColor = boxdef.ForeColor; c曲リストノード.IsChangedForeColor = true; } if (boxdef.IsChangedBackColor) { c曲リストノード.BackColor = boxdef.BackColor; c曲リストノード.IsChangedBackColor = true; } c曲リストノード.ForeColor = TJAPlayer3.Skin.SongSelect_ForeColor[TJAPlayer3.Skin.nStrジャンルtoNum(c曲リストノード.strジャンル)]; c曲リストノード.BackColor = TJAPlayer3.Skin.SongSelect_BackColor[TJAPlayer3.Skin.nStrジャンルtoNum(c曲リストノード.strジャンル)]; c曲リストノード.nスコア数 = 1; c曲リストノード.arスコア = new Cスコア(); c曲リストノード.arスコア.ファイル情報.フォルダの絶対パス = infoDir.FullName + @"\"; c曲リストノード.arスコア.譜面情報.タイトル = boxdef.Title; c曲リストノード.arスコア.譜面情報.ジャンル = boxdef.Genre; c曲リストノード.r親ノード = node親; c曲リストノード.Openindex = 1; c曲リストノード.strBreadcrumbs = (c曲リストノード.r親ノード == null) ? c曲リストノード.strタイトル : c曲リストノード.r親ノード.strBreadcrumbs + " > " + c曲リストノード.strタイトル; c曲リストノード.list子リスト = new List <C曲リストノード>(); listノードリスト.Add(c曲リストノード); if (b子BOXへ再帰する) { this.t曲を検索してリストを作成する(infoDir.FullName + @"\", b子BOXへ再帰する, c曲リストノード.list子リスト, c曲リストノード); } } //----------------------------- #endregion #region [ c.通常フォルダの場合 ] //----------------------------- else { this.t曲を検索してリストを作成する(infoDir.FullName + @"\", b子BOXへ再帰する, listノードリスト, node親); } //----------------------------- #endregion } }
private void tSongsDBにノードを1つ出力する(BinaryWriter bw, C曲リストノード node) { // ここではsuspendに応じないようにしておく(深い意味はない。ファイルの書き込みオープン状態を長時間維持したくないだけ) //if ( this.bIsSuspending ) // #27060 中断要求があったら、解除要求が来るまで待機 //{ // autoReset.WaitOne(); //} bw.Write(node.arスコア.ファイル情報.ファイルの絶対パス); bw.Write(node.arスコア.ファイル情報.フォルダの絶対パス); bw.Write(node.arスコア.ファイル情報.最終更新日時.Ticks); bw.Write(node.arスコア.ファイル情報.ファイルサイズ); bw.Write(node.arスコア.ScoreIni情報.最終更新日時.Ticks); bw.Write(node.arスコア.ScoreIni情報.ファイルサイズ); bw.Write(node.arスコア.譜面情報.タイトル); bw.Write(node.arスコア.譜面情報.アーティスト名); bw.Write(node.arスコア.譜面情報.コメント); bw.Write(node.arスコア.譜面情報.ジャンル); bw.Write(node.arスコア.譜面情報.Backgound); bw.Write(node.arスコア.譜面情報.最大ランク); bw.Write(node.arスコア.譜面情報.最大スキル); bw.Write(node.arスコア.譜面情報.フルコンボ); bw.Write(node.arスコア.譜面情報.演奏回数); bw.Write(node.arスコア.譜面情報.演奏履歴.行1); bw.Write(node.arスコア.譜面情報.演奏履歴.行2); bw.Write(node.arスコア.譜面情報.演奏履歴.行3); bw.Write(node.arスコア.譜面情報.演奏履歴.行4); bw.Write(node.arスコア.譜面情報.演奏履歴.行5); bw.Write(node.arスコア.譜面情報.演奏履歴.行6); bw.Write(node.arスコア.譜面情報.演奏履歴.行7); bw.Write(node.arスコア.譜面情報.Bpm); bw.Write(node.arスコア.譜面情報.Duration); bw.Write(node.arスコア.譜面情報.strBGMファイル名); bw.Write(node.arスコア.譜面情報.SongVol); var songLoudnessMetadata = node.arスコア.譜面情報.SongLoudnessMetadata; bw.Write(songLoudnessMetadata.HasValue); bw.Write(songLoudnessMetadata?.Integrated.ToDouble() ?? 0.0); bw.Write(songLoudnessMetadata?.TruePeak.HasValue ?? false); bw.Write(songLoudnessMetadata?.TruePeak?.ToDouble() ?? 0.0); bw.Write(node.arスコア.譜面情報.nデモBGMオフセット); bw.Write(node.arスコア.譜面情報.b譜面分岐[0]); bw.Write(node.arスコア.譜面情報.b譜面分岐[1]); bw.Write(node.arスコア.譜面情報.b譜面分岐[2]); bw.Write(node.arスコア.譜面情報.b譜面分岐[3]); bw.Write(node.arスコア.譜面情報.b譜面分岐[4]); bw.Write(node.arスコア.譜面情報.b譜面分岐[5]); bw.Write(node.arスコア.譜面情報.b譜面分岐[6]); bw.Write(node.arスコア.譜面情報.bPapaMamaSupport[0]); bw.Write(node.arスコア.譜面情報.bPapaMamaSupport[1]); bw.Write(node.arスコア.譜面情報.bPapaMamaSupport[2]); bw.Write(node.arスコア.譜面情報.bPapaMamaSupport[3]); bw.Write(node.arスコア.譜面情報.bPapaMamaSupport[4]); bw.Write(node.arスコア.譜面情報.bPapaMamaSupport[5]); bw.Write(node.arスコア.譜面情報.bPapaMamaSupport[6]); bw.Write(node.arスコア.譜面情報.nハイスコア[0]); bw.Write(node.arスコア.譜面情報.nハイスコア[1]); bw.Write(node.arスコア.譜面情報.nハイスコア[2]); bw.Write(node.arスコア.譜面情報.nハイスコア[3]); bw.Write(node.arスコア.譜面情報.nハイスコア[4]); bw.Write(node.arスコア.譜面情報.nハイスコア[5]); bw.Write(node.arスコア.譜面情報.nハイスコア[6]); bw.Write(node.arスコア.譜面情報.nSecondScore[0]); bw.Write(node.arスコア.譜面情報.nSecondScore[1]); bw.Write(node.arスコア.譜面情報.nSecondScore[2]); bw.Write(node.arスコア.譜面情報.nSecondScore[3]); bw.Write(node.arスコア.譜面情報.nSecondScore[4]); bw.Write(node.arスコア.譜面情報.nSecondScore[5]); bw.Write(node.arスコア.譜面情報.nSecondScore[6]); bw.Write(node.arスコア.譜面情報.nThirdScore[0]); bw.Write(node.arスコア.譜面情報.nThirdScore[1]); bw.Write(node.arスコア.譜面情報.nThirdScore[2]); bw.Write(node.arスコア.譜面情報.nThirdScore[3]); bw.Write(node.arスコア.譜面情報.nThirdScore[4]); bw.Write(node.arスコア.譜面情報.nThirdScore[5]); bw.Write(node.arスコア.譜面情報.nThirdScore[6]); bw.Write(node.arスコア.譜面情報.strHiScorerName[0]); bw.Write(node.arスコア.譜面情報.strHiScorerName[1]); bw.Write(node.arスコア.譜面情報.strHiScorerName[2]); bw.Write(node.arスコア.譜面情報.strHiScorerName[3]); bw.Write(node.arスコア.譜面情報.strHiScorerName[4]); bw.Write(node.arスコア.譜面情報.strHiScorerName[5]); bw.Write(node.arスコア.譜面情報.strHiScorerName[6]); bw.Write(node.arスコア.譜面情報.strSecondScorerName[0]); bw.Write(node.arスコア.譜面情報.strSecondScorerName[1]); bw.Write(node.arスコア.譜面情報.strSecondScorerName[2]); bw.Write(node.arスコア.譜面情報.strSecondScorerName[3]); bw.Write(node.arスコア.譜面情報.strSecondScorerName[4]); bw.Write(node.arスコア.譜面情報.strSecondScorerName[5]); bw.Write(node.arスコア.譜面情報.strSecondScorerName[6]); bw.Write(node.arスコア.譜面情報.strThirdScorerName[0]); bw.Write(node.arスコア.譜面情報.strThirdScorerName[1]); bw.Write(node.arスコア.譜面情報.strThirdScorerName[2]); bw.Write(node.arスコア.譜面情報.strThirdScorerName[3]); bw.Write(node.arスコア.譜面情報.strThirdScorerName[4]); bw.Write(node.arスコア.譜面情報.strThirdScorerName[5]); bw.Write(node.arスコア.譜面情報.strThirdScorerName[6]); bw.Write(node.arスコア.譜面情報.strサブタイトル); bw.Write(node.arスコア.譜面情報.nレベル[0]); bw.Write(node.arスコア.譜面情報.nレベル[1]); bw.Write(node.arスコア.譜面情報.nレベル[2]); bw.Write(node.arスコア.譜面情報.nレベル[3]); bw.Write(node.arスコア.譜面情報.nレベル[4]); bw.Write(node.arスコア.譜面情報.nレベル[5]); bw.Write(node.arスコア.譜面情報.nレベル[6]); bw.Write(node.arスコア.譜面情報.n王冠[0]); bw.Write(node.arスコア.譜面情報.n王冠[1]); bw.Write(node.arスコア.譜面情報.n王冠[2]); bw.Write(node.arスコア.譜面情報.n王冠[3]); bw.Write(node.arスコア.譜面情報.n王冠[4]); bw.Write(node.arスコア.譜面情報.n王冠[5]); bw.Write(node.arスコア.譜面情報.n王冠[6]); bw.Write(node.arスコア.譜面情報.b譜面が存在する[0]); bw.Write(node.arスコア.譜面情報.b譜面が存在する[1]); bw.Write(node.arスコア.譜面情報.b譜面が存在する[2]); bw.Write(node.arスコア.譜面情報.b譜面が存在する[3]); bw.Write(node.arスコア.譜面情報.b譜面が存在する[4]); bw.Write(node.arスコア.譜面情報.b譜面が存在する[5]); bw.Write(node.arスコア.譜面情報.b譜面が存在する[6]); bw.Write(node.arスコア.譜面情報.b歌詞あり); this.nSongsDBへ出力できたスコア数++; }