Beispiel #1
0
		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;
         }
     }
 }
Beispiel #3
0
		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);
					戻るノード数++;
				}
			}
		}
Beispiel #4
0
 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);
             }
         }
     }
 }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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);
            }
        }
Beispiel #8
0
        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
            }
        }
Beispiel #9
0
        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
            }
        }
Beispiel #11
0
		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へ出力できたスコア数++;
		}