1
0
mirror of synced 2024-11-24 15:40:22 +01:00
OpenTaiko/TJAPlayer3/Songs/CSong管理.cs

1827 lines
82 KiB
C#
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Threading;
using TJAPlayer3.C曲リストードComparers;
using FDK;
using System.Web.UI;
using System.Drawing;
namespace TJAPlayer3
{
[Serializable]
internal class CSongs管理
{
// プロパティ
/*public int nSongsDBから取得できたスコア数
{
get;
set;
}
public int nSongsDBへ出力できたスコア数
{
get;
set;
}*/
public int nスコアキャッシュから反映できたスコア数
{
get;
set;
}
public int nファイルから反映できたスコア数
{
get;
set;
}
public int n検索されたスコア数
{
get;
set;
}
public int n検索された曲ード数
{
get;
set;
}
/*[NonSerialized]
public List<Cスコア> listSongsDB;*/ // songs.dbから構築されるlist
public List<C曲リストード> list曲ルート; // 起動時にフォルダ検索して構築されるlist
public List<C曲リストード> list曲ルート_Dan = new List<C曲リストード>(); // 起動時にフォルダ検索して構築されるlist
public bool bIsSuspending // 外部スレッドから、内部スレッドのsuspendを指示する時にtrueにする
{ // 再開時は、これをfalseにしてから、次のautoReset.Set()を実行する
get;
set;
}
public bool bIsSlowdown // #PREMOVIE再生時に曲検索を遅くする
{
get;
set;
}
[NonSerialized]
public AutoResetEvent AutoReset;
/*public AutoResetEvent AutoReset
{
get
{
return autoReset;
}
private set
{
autoReset = value;
}
}*/
private int searchCount; // #PREMOVIE中は検索n回実行したら少しスリープする
// コンストラクタ
public CSongs管理()
{
//this.listSongsDB = new List<Cスコア>();
this.list曲ルート = new List<C曲リストード>();
this.n検索された曲ード数 = 0;
this.n検索されたスコア数 = 0;
this.bIsSuspending = false; // #27060
this.AutoReset = new AutoResetEvent( true ); // #27060
this.searchCount = 0;
}
// メソッド
#region [ ]
//-----------------
public void t曲を検索してリストを作成する( string str基点フォルダ, bool b子BOXへ再帰する )
{
this.t曲を検索してリストを作成する( str基点フォルダ, b子BOXへ再帰する, this.list曲ルート, null );
}
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 [ a. set.def 1tjaファイル無制限]
//-----------------------------
string path = str基点フォルダ + "set.def";
if( File.Exists( path ) )
{
new FileInfo( path );
if( TJAPlayer3.ConfigIni.bLog曲検索ログ出力 )
{
Trace.TraceInformation( "set.def検出 : {0}", path );
Trace.Indent();
}
try
{
foreach( FileInfo fileinfo in info.GetFiles() )
{
SlowOrSuspendSearchTask();
#region[ ]
string strExt = fileinfo.Extension.ToLower();
#endregion
if( ( strExt.Equals( ".tja" ) || strExt.Equals( ".dtx" ) ) )
{
if( strExt.Equals( ".tja" ) )
{
//tja、dtxが両方存在していた場合、tjaを読み込まずにtjaと同名のdtxだけを使う。
string dtxscoreini = str基点フォルダ + ( fileinfo.Name.Replace( strExt, ".dtx" ) );
if( File.Exists( dtxscoreini ) )
{
continue;
}
}
#region[ ]
CDTX dtx = new CDTX( fileinfo.FullName, false, 1.0, 0, 1 );
C曲リストード c曲リストード = new C曲リストード();
c曲リストード.eード種別 = C曲リストード.Eード種別.SCORE;
bool b = false;
for( int n = 0; n < (int)Difficulty.Total; n++ )
{
if( dtx.b譜面が存在する[ n ] )
{
c曲リストード.nスコア数++;
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;
c曲リストード.strジャンル = dtx.GENRE;
if (c曲リストード.r親ード != null && c曲リストード.r親ード.strジャンル != "")
{
c曲リストード.strジャンル = c曲リストード.r親ード.strジャンル;
}
c曲リストード.nLevel = dtx.LEVELtaiko;
// LIFE here
c曲リストード.nLife = dtx.LIFE;
c曲リストード.nTowerType = dtx.TOWERTYPE;
c曲リストード.nDanTick = dtx.DANTICK;
c曲リストード.cDanTickColor = dtx.DANTICKCOLOR;
// Total count of floors for a tower chart
c曲リストード.nTotalFloor = 0;
for (int i = 0; i < dtx.listChip.Count; i++)
{
CDTX.CChip pChip = dtx.listChip[i];
if (pChip.n整数値_内部番号 > c曲リストード.nTotalFloor && pChip.nチャンネル番号 == 0x50) c曲リストード.nTotalFloor = pChip.n整数値_内部番号;
}
c曲リストード.nTotalFloor++;
/*
switch (c曲リストード.strジャンル)
{
case "J-POP":
c曲リストード.strジャンル = "ポップス";
break;
case "ゲームミュージック":
c曲リストード.strジャンル = "ゲームバラエティ";
break;
case "どうよう":
c曲リストード.strジャンル = "キッズ";
break;
}
*/
c曲リストード.str本当のジャンル = c曲リストード.strジャンル;
c曲リストード.arスコア[ n ] = new Cスコア();
c曲リストード.arスコア[ n ].. = str基点フォルダ + fileinfo.Name;
c曲リストード.arスコア[ n ].. = str基点フォルダ;
c曲リストード.arスコア[ n ].. = fileinfo.Length;
c曲リストード.arスコア[ n ].. = fileinfo.LastWriteTime;
string strFileNameScoreIni = c曲リストード.arスコア[ n ].. + ".score.ini";
if( File.Exists( strFileNameScoreIni ) )
{
FileInfo infoScoreIni = new FileInfo( strFileNameScoreIni );
c曲リストード.arスコア[ n ].ScoreIni情報. = infoScoreIni.Length;
c曲リストード.arスコア[ n ].ScoreIni情報. = infoScoreIni.LastWriteTime;
}
if( b == false )
{
this.n検索されたスコア数++;
listードリスト.Add( c曲リストード );
this.n検索された曲ード数++;
b = true;
}
}
}
dtx = null;
}
#endregion
}
}
finally
{
if( TJAPlayer3.ConfigIni.bLog曲検索ログ出力 )
{
Trace.Unindent();
}
}
}
//-----------------------------
#endregion
#region [ b. set.def ]
//-----------------------------
else
{
foreach( FileInfo fileinfo in info.GetFiles() )
{
SlowOrSuspendSearchTask(); // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす
string strExt = fileinfo.Extension.ToLower();
if( ( strExt.Equals( ".tja" ) || strExt.Equals( ".dtx" ) ) )
{
// 2017.06.02 kairera0467 廃止。
//if( strExt.Equals( ".tja" ) )
//{
// //tja、dtxが両方存在していた場合、tjaを読み込まずにdtxだけ使う。
// string[] dtxscoreini = Directory.GetFiles( str基点フォルダ, "*.dtx");
// if(dtxscoreini.Length != 0 )
// {
// continue;
// }
//}
#region[ ]
CDTX dtx = new CDTX( str基点フォルダ + fileinfo.Name, false, 1.0, 0, 0 );
C曲リストード c曲リストード = new C曲リストード();
c曲リストード.eード種別 = C曲リストード.Eード種別.SCORE;
bool b = false;
for( int n = 0; n < (int)Difficulty.Total; n++ )
{
if( dtx.b譜面が存在する[ n ] )
{
c曲リストード.nスコア数++;
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 (dtx.List_DanSongs != null)
c曲リストード.DanSongs = dtx.List_DanSongs;
if (dtx.Dan_C != null)
c曲リストード.Dan_C = dtx.Dan_C;
if (!string.IsNullOrEmpty(dtx.GENRE))
{
if(c曲リストード.r親ード != null)
{
c曲リストード.strジャンル = c曲リストード.r親ード.strジャンル;
c曲リストード.str本当のジャンル = dtx.GENRE;
}
else
{
c曲リストード.strジャンル = dtx.GENRE;
c曲リストード.str本当のジャンル = dtx.GENRE;
}
}
else
{
c曲リストード.strジャンル = c曲リストード.r親ード.strジャンル;
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;
}
if (c曲リストード.r親ード.isChangedBoxColor)
{
c曲リストード.BoxColor = c曲リストード.r親ード.BoxColor;
c曲リストード.isChangedBoxColor = true;
}
if (c曲リストード.r親ード.isChangedBgColor)
{
c曲リストード.BgColor = c曲リストード.r親ード.BgColor;
c曲リストード.isChangedBgColor = true;
}
if (c曲リストード.r親ード.isChangedBgType)
{
c曲リストード.BgType = c曲リストード.r親ード.BgType;
c曲リストード.isChangedBgType = true;
}
if (c曲リストード.r親ード.isChangedBoxType)
{
c曲リストード.BoxType = c曲リストード.r親ード.BoxType;
c曲リストード.isChangedBoxType = true;
}
if (c曲リストード.r親ード.isChangedBoxChara)
{
c曲リストード.BoxChara = c曲リストード.r親ード.BoxChara;
c曲リストード.isChangedBoxChara = true;
}
}
switch (CStrジャンルtoNum.ForAC15(c曲リストード.strジャンル))
{
case 0:
c曲リストード.ForeColor = TJAPlayer3.Skin.SongSelect_ForeColor_JPOP;
c曲リストード.BackColor = TJAPlayer3.Skin.SongSelect_BackColor_JPOP;
break;
case 1:
c曲リストード.ForeColor = TJAPlayer3.Skin.SongSelect_ForeColor_Anime;
c曲リストード.BackColor = TJAPlayer3.Skin.SongSelect_BackColor_Anime;
break;
case 2:
c曲リストード.ForeColor = TJAPlayer3.Skin.SongSelect_ForeColor_VOCALOID;
c曲リストード.BackColor = TJAPlayer3.Skin.SongSelect_BackColor_VOCALOID;
break;
case 3:
c曲リストード.ForeColor = TJAPlayer3.Skin.SongSelect_ForeColor_Children;
c曲リストード.BackColor = TJAPlayer3.Skin.SongSelect_BackColor_Children;
break;
case 4:
c曲リストード.ForeColor = TJAPlayer3.Skin.SongSelect_ForeColor_Variety;
c曲リストード.BackColor = TJAPlayer3.Skin.SongSelect_BackColor_Variety;
break;
case 5:
c曲リストード.ForeColor = TJAPlayer3.Skin.SongSelect_ForeColor_Classic;
c曲リストード.BackColor = TJAPlayer3.Skin.SongSelect_BackColor_Classic;
break;
case 6:
c曲リストード.ForeColor = TJAPlayer3.Skin.SongSelect_ForeColor_GameMusic;
c曲リストード.BackColor = TJAPlayer3.Skin.SongSelect_BackColor_GameMusic;
break;
case 7:
c曲リストード.ForeColor = TJAPlayer3.Skin.SongSelect_ForeColor_Namco;
c曲リストード.BackColor = TJAPlayer3.Skin.SongSelect_BackColor_Namco;
break;
default:
break;
}
c曲リストード.nLevel = dtx.LEVELtaiko;
c曲リストード.uniqueId = dtx.uniqueID;
CSongDict.tAddSongNode(c曲リストード.uniqueId.data.id, c曲リストード);
c曲リストード.arスコア[ n ] = new Cスコア();
c曲リストード.arスコア[ n ].. = str基点フォルダ + fileinfo.Name;
c曲リストード.arスコア[ n ].. = str基点フォルダ;
c曲リストード.arスコア[ n ].. = fileinfo.Length;
c曲リストード.arスコア[ n ].. = fileinfo.LastWriteTime;
string strFileNameScoreIni = c曲リストード.arスコア[ n ].. + ".score.ini";
if( File.Exists( strFileNameScoreIni ) )
{
FileInfo infoScoreIni = new FileInfo( strFileNameScoreIni );
c曲リストード.arスコア[ n ].ScoreIni情報. = infoScoreIni.Length;
c曲リストード.arスコア[ n ].ScoreIni情報. = infoScoreIni.LastWriteTime;
}
if( b == false )
{
this.n検索されたスコア数++;
listードリスト.Add( c曲リストード );
this.n検索された曲ード数++;
b = true;
}
if( TJAPlayer3.ConfigIni.bLog曲検索ログ出力 )
{
// Trace.Indent();
// try
// {
// StringBuilder sb = new StringBuilder( 0x100 );
// sb.Append( string.Format( "nID#{0:D3}", c曲リストード.nID ) );
// if( c曲リストード.r親ード != null )
// {
// sb.Append( string.Format( "(in#{0:D3}):", c曲リストード.r親ード.nID ) );
// }
// else
// {
// sb.Append( "(onRoot):" );
// }
// sb.Append( " SONG, File=" + c曲リストード.arスコア[ 0 ].ファイル情報.ファイルの絶対パス );
// sb.Append( ", Size=" + c曲リストード.arスコア[ 0 ].ファイル情報.ファイルサイズ );
// sb.Append( ", LastUpdate=" + c曲リストード.arスコア[ 0 ].ファイル情報.最終更新日時 );
// Trace.TraceInformation( sb.ToString() );
// }
// finally
// {
// Trace.Unindent();
// }
}
}
}
#endregion
}
}
}
//-----------------------------
#endregion
foreach( DirectoryInfo infoDir in info.GetDirectories() )
{
SlowOrSuspendSearchTask(); // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす
#region [ a. "dtxfiles." ]
//-----------------------------
if( infoDir.Name.ToLower().StartsWith( "dtxfiles." ) )
{
C曲リストード c曲リストード = new C曲リストード();
c曲リストード.eード種別 = C曲リストード.Eード種別.BOX;
c曲リストード.bDTXFilesで始まるフォルダ名のBOXである = true;
c曲リストード.strタイトル = infoDir.Name.Substring( 9 );
c曲リストード.nスコア数 = 1;
c曲リストード.r親ード = node親;
// 一旦、上位BOXのスキン情報をコピー (後でbox.defの記載にて上書きされる場合がある)
c曲リストード.strSkinPath = ( c曲リストード.r親ード == null ) ?
"" : c曲リストード.r親ード.strSkinPath;
c曲リストード.strBreadcrumbs = ( c曲リストード.r親ード == null ) ?
c曲リストード.strタイトル : c曲リストード.r親ード.strBreadcrumbs + " > " + c曲リストード.strタイトル;
c曲リストード.list子リスト = new List<C曲リストード>();
c曲リストード.arスコア[ 0 ] = new Cスコア();
c曲リストード.arスコア[ 0 ].. = infoDir.FullName + @"\";
c曲リストード.arスコア[ 0 ].. = c曲リストード.strタイトル;
c曲リストード.arスコア[ 0 ].. =
(CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?
"BOX に移動します。" :
"Enter into the BOX.";
listードリスト.Add(c曲リストード);
if( File.Exists( infoDir.FullName + @"\box.def" ) )
{
CBoxDef boxdef = new CBoxDef( infoDir.FullName + @"\box.def" );
if( ( boxdef.Title != null ) && ( boxdef.Title.Length > 0 ) )
{
c曲リストード.strタイトル = boxdef.Title;
}
for(int i = 0; i < 3; i++)
{
if ((boxdef.strBoxText[i] != null) && (boxdef.strBoxText[i].Length > 0))
{
c曲リストード.strBoxText[i] = boxdef.strBoxText[i];
}
}
if( ( boxdef.Genre != null ) && ( boxdef.Genre.Length > 0 ) )
{
c曲リストード.strジャンル = boxdef.Genre;
}
if(boxdef.IsChangedForeColor)
{
c曲リストード.ForeColor = boxdef.ForeColor;
}
if (boxdef.IsChangedBackColor)
{
c曲リストード.BackColor = boxdef.BackColor;
}
if (boxdef.IsChangedBoxColor)
{
c曲リストード.BoxColor = boxdef.BoxColor;
}
if (boxdef.IsChangedBgColor)
{
c曲リストード.BgColor = boxdef.BgColor;
}
if (boxdef.IsChangedBgType)
{
c曲リストード.BgType = boxdef.BgType;
}
if (boxdef.IsChangedBoxType)
{
c曲リストード.BoxType = boxdef.BoxType;
}
if (boxdef.IsChangedBoxChara)
{
c曲リストード.BoxChara = boxdef.BoxChara;
}
}
/*
switch (c曲リストード.strジャンル)
{
case "J-POP":
c曲リストード.strジャンル = "ポップス";
break;
case "ゲームミュージック":
case "バラエティー":
case "バラエティ":
c曲リストード.strジャンル = "ゲームバラエティ";
break;
case "どうよう":
c曲リストード.strジャンル = "キッズ";
break;
}
*/
if ( TJAPlayer3.ConfigIni.bLog曲検索ログ出力 )
{
Trace.Indent();
try
{
StringBuilder sb = new StringBuilder( 0x100 );
sb.Append( string.Format( "nID#{0:D3}", c曲リストード.nID ) );
if( c曲リストード.r親ード != null )
{
sb.Append( string.Format( "(in#{0:D3}):", c曲リストード.r親ード.nID ) );
}
else
{
sb.Append( "(onRoot):" );
}
sb.Append( " BOX, Title=" + c曲リストード.strタイトル );
sb.Append( ", Folder=" + c曲リストード.arスコア[ 0 ].. );
sb.Append( ", Comment=" + c曲リストード.arスコア[ 0 ].. );
sb.Append( ", SkinPath=" + c曲リストード.strSkinPath );
Trace.TraceInformation( sb.ToString() );
}
finally
{
Trace.Unindent();
}
}
if( b子BOXへ再帰する )
{
this.t曲を検索してリストを作成する( infoDir.FullName + @"\", b子BOXへ再帰する, c曲リストード.list子リスト, c曲リストード );
}
}
//-----------------------------
#endregion
#region [ b.box.def ]
//-----------------------------
else 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曲リストード.bDTXFilesで始まるフォルダ名のBOXである = false;
c曲リストード.strタイトル = boxdef.Title;
c曲リストード.strジャンル = boxdef.Genre;
/*
switch (c曲リストード.strジャンル)
{
case "J-POP":
c曲リストード.strジャンル = "ポップス";
break;
case "ゲームミュージック":
c曲リストード.strジャンル = "ゲームバラエティ";
break;
case "どうよう":
c曲リストード.strジャンル = "キッズ";
break;
}
*/
if (boxdef.IsChangedForeColor)
{
c曲リストード.ForeColor = boxdef.ForeColor;
c曲リストード.IsChangedForeColor = true;
}
if (boxdef.IsChangedBackColor)
{
c曲リストード.BackColor = boxdef.BackColor;
c曲リストード.IsChangedBackColor = true;
}
if (boxdef.IsChangedBoxColor)
{
c曲リストード.BoxColor = boxdef.BoxColor;
c曲リストード.isChangedBoxColor = true;
}
if (boxdef.IsChangedBgColor)
{
c曲リストード.BgColor = boxdef.BgColor;
c曲リストード.isChangedBgColor = true;
}
if (boxdef.IsChangedBgType)
{
c曲リストード.BgType = boxdef.BgType;
c曲リストード.isChangedBgType = true;
}
if (boxdef.IsChangedBoxType)
{
c曲リストード.BoxType = boxdef.BoxType;
c曲リストード.isChangedBoxType = true;
}
if (boxdef.IsChangedBoxChara)
{
c曲リストード.BoxChara = boxdef.BoxChara;
c曲リストード.isChangedBoxChara = true;
}
for (int i = 0; i < 3; i++)
{
if ((boxdef.strBoxText[i] != null) && (boxdef.strBoxText[i].Length > 0))
{
c曲リストード.strBoxText[i] = boxdef.strBoxText[i];
}
}
switch (CStrジャンルtoNum.ForAC15(c曲リストード.strジャンル))
{
case 0:
c曲リストード.ForeColor = TJAPlayer3.Skin.SongSelect_ForeColor_JPOP;
c曲リストード.BackColor = TJAPlayer3.Skin.SongSelect_BackColor_JPOP;
break;
case 1:
c曲リストード.ForeColor = TJAPlayer3.Skin.SongSelect_ForeColor_Anime;
c曲リストード.BackColor = TJAPlayer3.Skin.SongSelect_BackColor_Anime;
break;
case 2:
c曲リストード.ForeColor = TJAPlayer3.Skin.SongSelect_ForeColor_VOCALOID;
c曲リストード.BackColor = TJAPlayer3.Skin.SongSelect_BackColor_VOCALOID;
break;
case 3:
c曲リストード.ForeColor = TJAPlayer3.Skin.SongSelect_ForeColor_Children;
c曲リストード.BackColor = TJAPlayer3.Skin.SongSelect_BackColor_Children;
break;
case 4:
c曲リストード.ForeColor = TJAPlayer3.Skin.SongSelect_ForeColor_Variety;
c曲リストード.BackColor = TJAPlayer3.Skin.SongSelect_BackColor_Variety;
break;
case 5:
c曲リストード.ForeColor = TJAPlayer3.Skin.SongSelect_ForeColor_Classic;
c曲リストード.BackColor = TJAPlayer3.Skin.SongSelect_BackColor_Classic;
break;
case 6:
c曲リストード.ForeColor = TJAPlayer3.Skin.SongSelect_ForeColor_GameMusic;
c曲リストード.BackColor = TJAPlayer3.Skin.SongSelect_BackColor_GameMusic;
break;
case 7:
c曲リストード.ForeColor = TJAPlayer3.Skin.SongSelect_ForeColor_Namco;
c曲リストード.BackColor = TJAPlayer3.Skin.SongSelect_BackColor_Namco;
break;
default:
break;
}
c曲リストード.nスコア数 = 1;
c曲リストード.arスコア[ 0 ] = new Cスコア();
c曲リストード.arスコア[ 0 ].. = infoDir.FullName + @"\";
c曲リストード.arスコア[ 0 ].. = boxdef.Title;
c曲リストード.arスコア[ 0 ].. = boxdef.Genre;
c曲リストード.r親ード = node親;
c曲リストード.strBreadcrumbs = ( c曲リストード.r親ード == null ) ?
c曲リストード.strタイトル : c曲リストード.r親ード.strBreadcrumbs + " > " + c曲リストード.strタイトル;
c曲リストード.list子リスト = new List<C曲リストード>();
listードリスト.Add( c曲リストード );
if( TJAPlayer3.ConfigIni.bLog曲検索ログ出力 )
{
Trace.TraceInformation( "box.def検出 : {0}", infoDir.FullName + @"\box.def" );
Trace.Indent();
try
{
StringBuilder sb = new StringBuilder( 0x400 );
sb.Append( string.Format( "nID#{0:D3}", c曲リストード.nID ) );
if( c曲リストード.r親ード != null )
{
sb.Append( string.Format( "(in#{0:D3}):", c曲リストード.r親ード.nID ) );
}
else
{
sb.Append( "(onRoot):" );
}
sb.Append( "BOX, Title=" + c曲リストード.strタイトル );
if( ( c曲リストード.strジャンル != null ) && ( c曲リストード.strジャンル.Length > 0 ) )
{
sb.Append( ", Genre=" + c曲リストード.strジャンル );
}
if (c曲リストード.IsChangedForeColor)
{
sb.Append(", ForeColor=" + c曲リストード.ForeColor.ToString());
}
if (c曲リストード.IsChangedBackColor)
{
sb.Append(", BackColor=" + c曲リストード.BackColor.ToString());
}
if (c曲リストード.isChangedBoxColor)
{
sb.Append(", BoxColor=" + c曲リストード.BoxColor.ToString());
}
if (c曲リストード.isChangedBgColor)
{
sb.Append(", BgColor=" + c曲リストード.BgColor.ToString());
}
if (c曲リストード.isChangedBoxType)
{
sb.Append(", BoxType=" + c曲リストード.BoxType.ToString());
}
if (c曲リストード.isChangedBgType)
{
sb.Append(", BgType=" + c曲リストード.BgType.ToString());
}
if (c曲リストード.isChangedBoxChara)
{
sb.Append(", BoxChara=" + c曲リストード.BoxChara.ToString());
}
Trace.TraceInformation( sb.ToString() );
}
finally
{
Trace.Unindent();
}
}
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
}
}
//-----------------
#endregion
#region [ SongsDBになかった曲をファイルから読み込んで反映する ]
//-----------------
public void tSongsDBになかった曲をファイルから読み込んで反映する()
{
this.nファイルから反映できたスコア数 = 0;
this.tSongsDBになかった曲をファイルから読み込んで反映する( this.list曲ルート );
}
private void tSongsDBになかった曲をファイルから読み込んで反映する( List<C曲リストード> )
{
foreach( C曲リストード c曲リストード in )
{
SlowOrSuspendSearchTask(); // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす
if( c曲リストード.eード種別 == C曲リストード.Eード種別.BOX )
{
this.tSongsDBになかった曲をファイルから読み込んで反映する( c曲リストード.list子リスト );
}
else if( ( c曲リストード.eード種別 == C曲リストード.Eード種別.SCORE )
|| ( c曲リストード.eード種別 == C曲リストード.Eード種別.SCORE_MIDI ) )
{
for( int i = 0; i < (int)Difficulty.Total; i++ )
{
if( ( c曲リストード.arスコア[ i ] != null ) && !c曲リストード.arスコア[ i ].bSongDBにキャッシュがあった )
{
#region [ DTX Cスコア. ]
//-----------------
string path = c曲リストード.arスコア[ i ]..;
if( File.Exists( path ) )
{
try
{
CDTX cdtx = new CDTX( c曲リストード.arスコア[ i ].., true, 0, 0, 0 );
if( File.Exists( c曲リストード.arスコア[ i ].. + "set.def" ) )
cdtx = new CDTX( c曲リストード.arスコア[ i ].., true, 0, 0, 1 );
c曲リストード.arスコア[ i ].. = cdtx.TITLE;
c曲リストード.arスコア[ i ].. = cdtx.ARTIST;
c曲リストード.arスコア[ i ].. = cdtx.COMMENT;
c曲リストード.arスコア[ i ].. = cdtx.GENRE;
c曲リストード.arスコア[ i ]..Preimage = cdtx.PREIMAGE;
c曲リストード.arスコア[ i ]..Presound = cdtx.PREVIEW;
c曲リストード.arスコア[ i ]..Backgound = ( ( cdtx.BACKGROUND != null ) && ( cdtx.BACKGROUND.Length > 0 ) ) ? cdtx.BACKGROUND : cdtx.BACKGROUND_GR;
c曲リストード.arスコア[ i ]...Drums = cdtx.LEVEL.Drums;
c曲リストード.arスコア[ i ]...Guitar = cdtx.LEVEL.Guitar;
c曲リストード.arスコア[ i ]...Bass = cdtx.LEVEL.Bass;
c曲リストード.arスコア[ i ].. = cdtx.HIDDENLEVEL;
c曲リストード.arスコア[ i ]..Bpm = cdtx.BPM;
c曲リストード.arスコア[ i ]..Duration = 0; // (cdtx.listChip == null)? 0 : cdtx.listChip[ cdtx.listChip.Count - 1 ].n発声時刻ms;
c曲リストード.arスコア[ i ]..strBGMファイル名 = cdtx.strBGM_PATH;
c曲リストード.arスコア[ i ]..SongVol = cdtx.SongVol;
c曲リストード.arスコア[ i ]..SongLoudnessMetadata = cdtx.SongLoudnessMetadata;
c曲リストード.arスコア[ i ]..nデモBGMオフセット = cdtx.nデモBGMオフセット;
c曲リストード.arスコア[ i ]..b譜面分岐[0] = cdtx.bHIDDENBRANCH ? false : cdtx.bHasBranch[ 0 ];
c曲リストード.arスコア[ i ]..b譜面分岐[1] = cdtx.bHIDDENBRANCH ? false : cdtx.bHasBranch[ 1 ];
c曲リストード.arスコア[ i ]..b譜面分岐[2] = cdtx.bHIDDENBRANCH ? false : cdtx.bHasBranch[ 2 ];
c曲リストード.arスコア[ i ]..b譜面分岐[3] = cdtx.bHIDDENBRANCH ? false : cdtx.bHasBranch[ 3 ];
c曲リストード.arスコア[i]..b譜面分岐[4] = cdtx.bHIDDENBRANCH ? false : cdtx.bHasBranch[4];
c曲リストード.arスコア[i]..b譜面分岐[5] = cdtx.bHIDDENBRANCH ? false : cdtx.bHasBranch[5];
c曲リストード.arスコア[i]..b譜面分岐[6] = cdtx.bHIDDENBRANCH ? false : cdtx.bHasBranch[6];
c曲リストード.arスコア[ i ]..strサブタイトル = cdtx.SUBTITLE;
c曲リストード.arスコア[ i ]..nレベル[0] = cdtx.LEVELtaiko[0];
c曲リストード.arスコア[ i ]..nレベル[1] = cdtx.LEVELtaiko[1];
c曲リストード.arスコア[ i ]..nレベル[2] = cdtx.LEVELtaiko[2];
c曲リストード.arスコア[ i ]..nレベル[3] = cdtx.LEVELtaiko[3];
c曲リストード.arスコア[ i ]..nレベル[4] = cdtx.LEVELtaiko[4];
c曲リストード.arスコア[i]..nレベル[5] = cdtx.LEVELtaiko[5];
c曲リストード.arスコア[i]..nレベル[6] = cdtx.LEVELtaiko[6];
// Tower Lives
c曲リストード.arスコア[i]..nLife = cdtx.LIFE;
c曲リストード.arスコア[i]..nTowerType = cdtx.TOWERTYPE;
c曲リストード.arスコア[i]..nDanTick = cdtx.DANTICK;
c曲リストード.arスコア[i]..cDanTickColor = cdtx.DANTICKCOLOR;
c曲リストード.arスコア[i]..nTotalFloor = 0;
for (int k = 0; k < cdtx.listChip.Count; k++)
{
CDTX.CChip pChip = cdtx.listChip[k];
if (pChip.n整数値_内部番号 > c曲リストード.arスコア[i]..nTotalFloor && pChip.nチャンネル番号 == 0x50)
c曲リストード.arスコア[i]..nTotalFloor = pChip.n整数値_内部番号;
}
c曲リストード.arスコア[i]..nTotalFloor++;
this.nファイルから反映できたスコア数++;
cdtx.On非活性化();
//Debug.WriteLine( "★" + this.nファイルから反映できたスコア数 + " " + c曲リストード.arスコア[ i ].譜面情報.タイトル );
#region [ ]
//-----------------
if( TJAPlayer3.ConfigIni.bLog曲検索ログ出力 )
{
StringBuilder sb = new StringBuilder( 0x400 );
sb.Append( string.Format( "曲データファイルから譜面情報を転記しました。({0})", path ) );
sb.Append( "(title=" + c曲リストード.arスコア[ i ].. );
sb.Append( ", artist=" + c曲リストード.arスコア[ i ].. );
sb.Append( ", comment=" + c曲リストード.arスコア[ i ].. );
sb.Append( ", genre=" + c曲リストード.arスコア[ i ].. );
sb.Append( ", preimage=" + c曲リストード.arスコア[ i ]..Preimage );
sb.Append( ", premovie=" + c曲リストード.arスコア[ i ]..Premovie );
sb.Append( ", presound=" + c曲リストード.arスコア[ i ]..Presound );
sb.Append( ", background=" + c曲リストード.arスコア[ i ]..Backgound );
sb.Append( ", lvDr=" + c曲リストード.arスコア[ i ]...Drums );
sb.Append( ", lvGt=" + c曲リストード.arスコア[ i ]...Guitar );
sb.Append( ", lvBs=" + c曲リストード.arスコア[ i ]...Bass );
sb.Append( ", lvHide=" + c曲リストード.arスコア[ i ].. );
sb.Append( ", type=" + c曲リストード.arスコア[ i ].. );
sb.Append( ", bpm=" + c曲リストード.arスコア[ i ]..Bpm );
// sb.Append( ", duration=" + c曲リストード.arスコア[ i ].譜面情報.Duration );
Trace.TraceInformation( sb.ToString() );
}
//-----------------
#endregion
}
catch( Exception exception )
{
Trace.TraceError( exception.ToString() );
c曲リストード.arスコア[ i ] = null;
c曲リストード.nスコア数--;
this.n検索されたスコア数--;
Trace.TraceError( "曲データファイルの読み込みに失敗しました。({0})", path );
}
}
//-----------------
#endregion
#region [ .score.ini Cスコア. ]
//-----------------
try
{
var scoreIniPath = c曲リストード.arスコア[i]..;// + ".score.ini";
if( File.Exists( scoreIniPath ) )
{
this.tScoreIniを読み込んで譜面情報を設定する(scoreIniPath, c曲リストード.arスコア[i]);
}
// Legacy save files from DTX mania
/*
else
{
string[] dtxscoreini = Directory.GetFiles(c曲リストード.arスコア[i].ファイル情報.フォルダの絶対パス, "*.dtx.score.ini");
if (dtxscoreini.Length != 0 && File.Exists(dtxscoreini[0]))
{
this.tScoreIniを読み込んで譜面情報を設定する(dtxscoreini[0], c曲リストード.arスコア[i]);
}
}
*/
}
catch (Exception e)
{
Trace.TraceError( e.ToString() );
Trace.TraceError( "例外が発生しましたが処理を継続します。 (c8b6538c-46a1-403e-8cc3-fc7e7ff914fb)" );
}
//-----------------
#endregion
}
}
}
}
}
//-----------------
#endregion
#region [ ]
//-----------------
public void t曲リストへ後処理を適用する()
{
listStrBoxDefSkinSubfolderFullName = new List<string>();
if ( TJAPlayer3.Skin.strBoxDefSkinSubfolders != null )
{
foreach ( string b in TJAPlayer3.Skin.strBoxDefSkinSubfolders )
{
listStrBoxDefSkinSubfolderFullName.Add( b );
}
}
// Removed the pre-made recently played songs folder, so players will have total control on it's shape and visuals
/*
#region [ "最近遊んだ曲"BOXを生成する ]
if(list曲ルート.Count > 0)
{
C曲リストード crecentryplaysong = new C曲リストード();
crecentryplaysong.eード種別 = C曲リストード.Eード種別.BOX;
// 最近あそんだ曲
crecentryplaysong.strタイトル = CLangManager.LangInstance.GetString(201);
crecentryplaysong.strBoxText[0] = "";
crecentryplaysong.strBoxText[1] = CLangManager.LangInstance.GetString(202);
crecentryplaysong.strBoxText[2] = "";
crecentryplaysong.strジャンル = "最近遊んだ曲";
crecentryplaysong.nスコア数 = 1;
crecentryplaysong.list子リスト = new List<C曲リストード>();
crecentryplaysong.BackColor = ColorTranslator.FromHtml("#164748");
crecentryplaysong.BoxColor = Color.White;
crecentryplaysong.BgColor = Color.White;
crecentryplaysong.arスコア[0] = new Cスコア();
crecentryplaysong.arスコア[0].ファイル情報.フォルダの絶対パス = "";
crecentryplaysong.arスコア[0].譜面情報.タイトル = crecentryplaysong.strタイトル;
crecentryplaysong.arスコア[0].譜面情報.コメント =
(CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?
"最近遊んだ曲" :
"Recentry play songs";
list曲ルート.Add(crecentryplaysong);
}
#endregion
*/
this.t曲リストへ後処理を適用する(this.list曲ルート);
foreach (C曲リストード c曲リストード in list曲ルート)
{
if (c曲リストード.eード種別 == C曲リストード.Eード種別.BOX)
{
if (c曲リストード.strジャンル == "段位道場")
{
if (TJAPlayer3.ConfigIni.bDanTowerHide)
list曲ルート.Remove(c曲リストード);
// Add to dojo
for (int i = 0; i < c曲リストード.list子リスト.Count; i++)
{
if(c曲リストード.list子リスト[i].eード種別 == C曲リストード.Eード種別.SCORE)
{
list曲ルート_Dan.Add(c曲リストード.list子リスト[i]);
continue;
}
}
}
else
{
for (int i = 0; i < c曲リストード.list子リスト.Count; i++)
{
if(c曲リストード.list子リスト[i].arスコア[6] != null)
{
list曲ルート_Dan.Add(c曲リストード.list子リスト[i]);
if (TJAPlayer3.ConfigIni.bDanTowerHide)
c曲リストード.list子リスト.Remove(c曲リストード.list子リスト[i]);
continue;
}
}
}
}
else
{
// ???????
/*
if (c曲リストード.arスコア[5] != null)
{
c曲リストード.list子リスト.Remove(c曲リストード);
list曲ルート_Dan.Add(c曲リストード);
continue;
}
*/
}
}
#region [ skin名で比較してsystemスキンとboxdefスキンに重複があればboxdefスキン側を削除する ]
string[] systemSkinNames = CSkin.GetSkinName( TJAPlayer3.Skin.strSystemSkinSubfolders );
List<string> l = new List<string>( listStrBoxDefSkinSubfolderFullName );
foreach ( string boxdefSkinSubfolderFullName in l )
{
if ( Array.BinarySearch( systemSkinNames,
CSkin.GetSkinName( boxdefSkinSubfolderFullName ),
StringComparer.InvariantCultureIgnoreCase ) >= 0 )
{
listStrBoxDefSkinSubfolderFullName.Remove( boxdefSkinSubfolderFullName );
}
}
#endregion
string[] ba = listStrBoxDefSkinSubfolderFullName.ToArray();
Array.Sort( ba );
TJAPlayer3.Skin.strBoxDefSkinSubfolders = ba;
}
private void t曲リストへ後処理を適用する( List<C曲リストード> , string parentName = "/", bool isGlobal = true )
{
if (isGlobal)
{
var randomNode = CSongDict.tGenerateRandomButton([0].r親ード, parentName);
.Add(randomNode);
}
// Don't sort songs if the folder isn't global
// Call back reinsert back folders if sort called ?
if (isGlobal)
{
#region [ Sort nodes ]
//-----------------------------
if (TJAPlayer3.ConfigIni.nDefaultSongSort == 0)
{
t曲リストのソート1_絶対パス順();
}
else if (TJAPlayer3.ConfigIni.nDefaultSongSort == 1)
{
t曲リストのソート9_ジャンル順(, E楽器パート.TAIKO, 1, 0);
}
else if (TJAPlayer3.ConfigIni.nDefaultSongSort == 2)
{
t曲リストのソート9_ジャンル順(, E楽器パート.TAIKO, 2, 0);
}
//-----------------------------
#endregion
}
// すべてのノードについて…
foreach ( C曲リストード c曲リストード in )
{
SlowOrSuspendSearchTask(); // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす
#region [ Append "Back" buttons to the included folders ]
//-----------------------------
if ( c曲リストード.eード種別 == C曲リストード.Eード種別.BOX )
{
#region [ Sort child nodes ]
//-----------------------------
if (TJAPlayer3.ConfigIni.nDefaultSongSort == 0)
{
t曲リストのソート1_絶対パス順(c曲リストード.list子リスト);
}
else if (TJAPlayer3.ConfigIni.nDefaultSongSort == 1)
{
t曲リストのソート9_ジャンル順(c曲リストード.list子リスト, E楽器パート.TAIKO, 1, 0);
}
else if (TJAPlayer3.ConfigIni.nDefaultSongSort == 2)
{
t曲リストのソート9_ジャンル順(c曲リストード.list子リスト, E楽器パート.TAIKO, 2, 0);
}
//-----------------------------
#endregion
string newPath = parentName + c曲リストード.strタイトル + "/";
CSongDict.tReinsertBackButtons(c曲リストード, c曲リストード.list子リスト, newPath, listStrBoxDefSkinSubfolderFullName);
// Process subfolders recussively
t曲リストへ後処理を適用する(c曲リストード.list子リスト, newPath, false);
continue;
}
//-----------------------------
#endregion
#region [ If no node title found, try to fetch it within the score objects ]
//-----------------------------
if ( string.IsNullOrEmpty( c曲リストード.strタイトル ) )
{
for( int j = 0; j < (int)Difficulty.Total; j++ )
{
if( ( c曲リストード.arスコア[ j ] != null ) && !string.IsNullOrEmpty( c曲リストード.arスコア[ j ].. ) )
{
c曲リストード.strタイトル = c曲リストード.arスコア[ j ]..;
if( TJAPlayer3.ConfigIni.bLog曲検索ログ出力 )
Trace.TraceInformation( "タイトルを設定しました。(nID#{0:D3}, title={1})", c曲リストード.nID, c曲リストード.strタイトル );
break;
}
}
}
//-----------------------------
#endregion
}
}
//-----------------
#endregion
// Songs DB here
/*#region [ スコアキャッシュをSongsDBに出力する ]
//-----------------
public void tスコアキャッシュをSongsDBに出力する( string SongsDBファイル名 )
{
this.nSongsDBへ出力できたスコア数 = 0;
try
{
BinaryWriter bw = new BinaryWriter( new FileStream( SongsDBファイル名, FileMode.Create, FileAccess.Write ) );
bw.Write( SONGSDB_VERSION );
this.tSongsDBにリストをつ出力する( bw, this.list曲ルート );
bw.Close();
}
catch (Exception e)
{
Trace.TraceError( "songs.dbの出力に失敗しました。" );
Trace.TraceError( e.ToString() );
Trace.TraceError( "例外が発生しましたが処理を継続します。 (ca70d133-f092-4351-8ebd-0906d8f1cffa)" );
}
}
private void tSongsDBにードをつ出力する( BinaryWriter bw, C曲リストード node )
{
for( int i = 0; i < (int)Difficulty.Total; i++ )
{
// ここではsuspendに応じないようにしておく(深い意味はない。ファイルの書き込みオープン状態を長時間維持したくないだけ)
//if ( this.bIsSuspending ) // #27060 中断要求があったら、解除要求が来るまで待機
//{
// autoReset.WaitOne();
//}
if( node.arスコア[ i ] != null )
{
bw.Write( node.arスコア[ i ].ファイル情報.ファイルの絶対パス );
bw.Write( node.arスコア[ i ].ファイル情報.フォルダの絶対パス );
bw.Write( node.arスコア[ i ].ファイル情報.最終更新日時.Ticks );
bw.Write( node.arスコア[ i ].ファイル情報.ファイルサイズ );
bw.Write( node.arスコア[ i ].ScoreIni情報.最終更新日時.Ticks );
bw.Write( node.arスコア[ i ].ScoreIni情報.ファイルサイズ );
bw.Write( node.arスコア[ i ].譜面情報.タイトル );
bw.Write( node.arスコア[ i ].譜面情報.アーティスト名 );
bw.Write( node.arスコア[ i ].譜面情報.コメント );
bw.Write( node.arスコア[ i ].譜面情報.ジャンル );
bw.Write( node.arスコア[ i ].譜面情報.Preimage );
bw.Write( node.arスコア[ i ].譜面情報.Premovie );
bw.Write( node.arスコア[ i ].譜面情報.Presound );
bw.Write( node.arスコア[ i ].譜面情報.Backgound );
bw.Write( node.arスコア[ i ].譜面情報.レベル.Drums );
bw.Write( node.arスコア[ i ].譜面情報.レベル.Guitar );
bw.Write( node.arスコア[ i ].譜面情報.レベル.Bass );
bw.Write( node.arスコア[ i ].譜面情報.最大ランク.Drums );
bw.Write( node.arスコア[ i ].譜面情報.最大ランク.Guitar );
bw.Write( node.arスコア[ i ].譜面情報.最大ランク.Bass );
bw.Write( node.arスコア[ i ].譜面情報.最大スキル.Drums );
bw.Write( node.arスコア[ i ].譜面情報.最大スキル.Guitar );
bw.Write( node.arスコア[ i ].譜面情報.最大スキル.Bass );
bw.Write( node.arスコア[ i ].譜面情報.フルコンボ.Drums );
bw.Write( node.arスコア[ i ].譜面情報.フルコンボ.Guitar );
bw.Write( node.arスコア[ i ].譜面情報.フルコンボ.Bass );
bw.Write( node.arスコア[ i ].譜面情報.演奏回数.Drums );
bw.Write( node.arスコア[ i ].譜面情報.演奏回数.Guitar );
bw.Write( node.arスコア[ i ].譜面情報.演奏回数.Bass );
bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行1 );
bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行2 );
bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行3 );
bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行4 );
bw.Write( node.arスコア[ i ].譜面情報.演奏履歴.行5 );
bw.Write(node.arスコア[i].譜面情報.演奏履歴.行6);
bw.Write(node.arスコア[i].譜面情報.演奏履歴.行7);
bw.Write( node.arスコア[ i ].譜面情報.レベルを非表示にする );
bw.Write( (int) node.arスコア[ i ].譜面情報.曲種別 );
bw.Write( node.arスコア[ i ].譜面情報.Bpm );
bw.Write( node.arスコア[ i ].譜面情報.Duration );
bw.Write( node.arスコア[ i ].譜面情報.strBGMファイル名 );
bw.Write( node.arスコア[ i ].譜面情報.SongVol );
var songLoudnessMetadata = node.arスコア[ i ].譜面情報.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スコア[ i ].譜面情報.nデモBGMオフセット );
bw.Write( node.arスコア[ i ].譜面情報.b譜面分岐[0] );
bw.Write( node.arスコア[ i ].譜面情報.b譜面分岐[1] );
bw.Write( node.arスコア[ i ].譜面情報.b譜面分岐[2] );
bw.Write( node.arスコア[ i ].譜面情報.b譜面分岐[3] );
bw.Write( node.arスコア[ i ].譜面情報.b譜面分岐[4] );
bw.Write(node.arスコア[i].譜面情報.b譜面分岐[5]);
bw.Write( node.arスコア[ i ].譜面情報.b譜面分岐[6] );
bw.Write( node.arスコア[ i ].譜面情報.ハイスコア );
bw.Write( node.arスコア[ i ].譜面情報.nハイスコア[0] );
bw.Write( node.arスコア[ i ].譜面情報.nハイスコア[1] );
bw.Write( node.arスコア[ i ].譜面情報.nハイスコア[2] );
bw.Write( node.arスコア[ i ].譜面情報.nハイスコア[3] );
bw.Write( node.arスコア[ i ].譜面情報.nハイスコア[4] );
bw.Write(node.arスコア[i].譜面情報.nハイスコア[5]);
bw.Write(node.arスコア[i].譜面情報.nハイスコア[6]);
bw.Write( node.arスコア[ i ].譜面情報.strサブタイトル );
bw.Write( node.arスコア[ i ].譜面情報.nレベル[0] );
bw.Write( node.arスコア[ i ].譜面情報.nレベル[1] );
bw.Write( node.arスコア[ i ].譜面情報.nレベル[2] );
bw.Write( node.arスコア[ i ].譜面情報.nレベル[3] );
bw.Write( node.arスコア[ i ].譜面情報.nレベル[4] );
bw.Write(node.arスコア[i].譜面情報.nレベル[5]);
bw.Write(node.arスコア[i].譜面情報.nレベル[6]);
bw.Write(node.arスコア[i].譜面情報.nクリア[0]);
bw.Write(node.arスコア[i].譜面情報.nクリア[1]);
bw.Write(node.arスコア[i].譜面情報.nクリア[2]);
bw.Write(node.arスコア[i].譜面情報.nクリア[3]);
bw.Write(node.arスコア[i].譜面情報.nクリア[4]);
bw.Write(node.arスコア[i].譜面情報.nスコアランク[0]);
bw.Write(node.arスコア[i].譜面情報.nスコアランク[1]);
bw.Write(node.arスコア[i].譜面情報.nスコアランク[2]);
bw.Write(node.arスコア[i].譜面情報.nスコアランク[3]);
bw.Write(node.arスコア[i].譜面情報.nスコアランク[4]);
this.nSongsDBへ出力できたスコア数++;
}
}
}
private void tSongsDBにリストをつ出力する( BinaryWriter bw, List<C曲リストード> list )
{
foreach( C曲リストード c曲リストード in list )
{
if( ( c曲リストード.eード種別 == C曲リストード.Eード種別.SCORE )
|| ( c曲リストード.eード種別 == C曲リストード.Eード種別.SCORE_MIDI ) )
{
this.tSongsDBにードをつ出力する( bw, c曲リストード );
}
if( c曲リストード.list子リスト != null )
{
this.tSongsDBにリストをつ出力する( bw, c曲リストード.list子リスト );
}
}
}
//-----------------
#endregion*/
#region [ ]
//-----------------
public static void t曲リストのソート1_絶対パス順( List<C曲リストード> )
{
t曲リストのソート1_絶対パス順(, E楽器パート.TAIKO, 1, 0);
foreach( C曲リストード c曲リストード in )
{
if( ( c曲リストード.list子リスト != null ) && ( c曲リストード.list子リスト.Count > 1 ) )
{
t曲リストのソート1_絶対パス順( c曲リストード.list子リスト );
}
}
}
public static void t曲リストのソート1_絶対パス順( List<C曲リストード> , E楽器パート part, int order, params object[] p )
{
var comparer = new ComparerChain<C曲リストード>(
new C曲リストードComparerード種別(),
new C曲リストードComparer絶対パス(order),
new C曲リストードComparerタイトル(order));
.Sort( comparer );
}
public static void t曲リストのソート2_タイトル順( List<C曲リストード> , E楽器パート part, int order, params object[] p )
{
var comparer = new ComparerChain<C曲リストード>(
new C曲リストードComparerード種別(),
new C曲リストードComparerタイトル(order),
new C曲リストードComparer絶対パス(order));
.Sort( comparer );
}
/// <summary>
///
/// </summary>
/// <param name="ノードリスト"></param>
/// <param name="part"></param>
/// <param name="order">1=Ascend -1=Descend</param>
public static void t曲リストのソート3_演奏回数の多い順( List<C曲リストード> , E楽器パート part, int order, params object[] p )
{
order = -order;
int nL12345 = (int) p[ 0 ];
if ( part != E楽器パート.UNKNOWN )
{
.Sort( delegate( C曲リストード n1, C曲リストード n2 )
{
#region [ ]
if( ( n1.eード種別 == C曲リストード.Eード種別.BOX ) && ( n2.eード種別 == C曲リストード.Eード種別.BOX ) )
{
return order * n1.arスコア[ 0 ]...CompareTo( n2.arスコア[ 0 ].. );
}
#endregion
int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;
// for( int i = 0; i <(int)Difficulty.Total; i++ )
// {
if( n1.arスコア[ nL12345 ] != null )
{
nSumPlayCountN1 += n1.arスコア[ nL12345 ]..[ (int) part ];
}
if( n2.arスコア[ nL12345 ] != null )
{
nSumPlayCountN2 += n2.arスコア[ nL12345 ]..[ (int) part ];
}
// }
var num = nSumPlayCountN2 - nSumPlayCountN1;
if( num != 0 )
{
return order * num;
}
return order * n1.strタイトル.CompareTo( n2.strタイトル );
} );
foreach ( C曲リストード c曲リストード in )
{
int nSumPlayCountN1 = 0;
// for ( int i = 0; i < 5; i++ )
// {
if ( c曲リストード.arスコア[ nL12345 ] != null )
{
nSumPlayCountN1 += c曲リストード.arスコア[ nL12345 ]..[ (int) part ];
}
// }
// Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストード.strタイトル );
}
}
}
public static void t曲リストのソート4_LEVEL順( List<C曲リストード> , E楽器パート part, int order, params object[] p )
{
order = -order;
int nL12345 = (int)p[ 0 ];
if ( part != E楽器パート.UNKNOWN )
{
.Sort( delegate( C曲リストード n1, C曲リストード n2 )
{
#region [ ]
if ( ( n1.eード種別 == C曲リストード.Eード種別.BOX ) && ( n2.eード種別 == C曲リストード.Eード種別.BOX ) )
{
return order * n1.arスコア[ 0 ]...CompareTo( n2.arスコア[ 0 ].. );
}
#endregion
int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;
if ( n1.arスコア[ nL12345 ] != null )
{
nSumPlayCountN1 = n1.nLevel[ nL12345 ];
}
if ( n2.arスコア[ nL12345 ] != null )
{
nSumPlayCountN2 = n2.nLevel[ nL12345 ];
}
var num = nSumPlayCountN2 - nSumPlayCountN1;
if ( num != 0 )
{
return order * num;
}
return order * n1.strタイトル.CompareTo( n2.strタイトル );
} );
foreach ( C曲リストード c曲リストード in )
{
int nSumPlayCountN1 = 0;
if ( c曲リストード.arスコア[ nL12345 ] != null )
{
nSumPlayCountN1 = c曲リストード.nLevel[ nL12345 ];
}
// Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストード.strタイトル );
}
}
}
public static void t曲リストのソート5_BestRank順( List<C曲リストード> , E楽器パート part, int order, params object[] p )
{
order = -order;
int nL12345 = (int) p[ 0 ];
if ( part != E楽器パート.UNKNOWN )
{
.Sort( delegate( C曲リストード n1, C曲リストード n2 )
{
#region [ ]
if ( ( n1.eード種別 == C曲リストード.Eード種別.BOX ) && ( n2.eード種別 == C曲リストード.Eード種別.BOX ) )
{
return order * n1.arスコア[ 0 ]...CompareTo( n2.arスコア[ 0 ].. );
}
#endregion
int nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;
bool isFullCombo1 = false, isFullCombo2 = false;
if ( n1.arスコア[ nL12345 ] != null )
{
isFullCombo1 = n1.arスコア[ nL12345 ]..[ (int) part ];
nSumPlayCountN1 = n1.arスコア[ nL12345 ]..[ (int) part ];
}
if ( n2.arスコア[ nL12345 ] != null )
{
isFullCombo2 = n2.arスコア[ nL12345 ]..[ (int) part ];
nSumPlayCountN2 = n2.arスコア[ nL12345 ]..[ (int) part ];
}
if ( isFullCombo1 ^ isFullCombo2 )
{
if ( isFullCombo1 ) return order; else return -order;
}
var num = nSumPlayCountN2 - nSumPlayCountN1;
if ( num != 0 )
{
return order * num;
}
return order * n1.strタイトル.CompareTo( n2.strタイトル );
} );
foreach ( C曲リストード c曲リストード in )
{
int nSumPlayCountN1 = 0;
if ( c曲リストード.arスコア[ nL12345 ] != null )
{
nSumPlayCountN1 = c曲リストード.arスコア[ nL12345 ]..[ (int) part ];
}
// Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストード.strタイトル );
}
}
}
public static void t曲リストのソート6_SkillPoint順( List<C曲リストード> , E楽器パート part, int order, params object[] p )
{
order = -order;
int nL12345 = (int) p[ 0 ];
if ( part != E楽器パート.UNKNOWN )
{
.Sort( delegate( C曲リストード n1, C曲リストード n2 )
{
#region [ ]
if ( ( n1.eード種別 == C曲リストード.Eード種別.BOX ) && ( n2.eード種別 == C曲リストード.Eード種別.BOX ) )
{
return order * n1.arスコア[ 0 ]...CompareTo( n2.arスコア[ 0 ].. );
}
#endregion
double nSumPlayCountN1 = 0, nSumPlayCountN2 = 0;
if ( n1.arスコア[ nL12345 ] != null )
{
nSumPlayCountN1 = n1.arスコア[ nL12345 ]..[ (int) part ];
}
if ( n2.arスコア[ nL12345 ] != null )
{
nSumPlayCountN2 = n2.arスコア[ nL12345 ]..[ (int) part ];
}
double d = nSumPlayCountN2 - nSumPlayCountN1;
if ( d != 0 )
{
return order * System.Math.Sign(d);
}
return order * n1.strタイトル.CompareTo( n2.strタイトル );
} );
foreach ( C曲リストード c曲リストード in )
{
double nSumPlayCountN1 = 0;
if ( c曲リストード.arスコア[ nL12345 ] != null )
{
nSumPlayCountN1 = c曲リストード.arスコア[ nL12345 ]..[ (int) part ];
}
// Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストード.strタイトル );
}
}
}
public static void t曲リストのソート7_更新日時順( List<C曲リストード> , E楽器パート part, int order, params object[] p )
{
int nL12345 = (int) p[ 0 ];
if ( part != E楽器パート.UNKNOWN )
{
.Sort( delegate( C曲リストード n1, C曲リストード n2 )
{
#region [ ]
if ( ( n1.eード種別 == C曲リストード.Eード種別.BOX ) && ( n2.eード種別 == C曲リストード.Eード種別.BOX ) )
{
return order * n1.arスコア[ 0 ]...CompareTo( n2.arスコア[ 0 ].. );
}
#endregion
DateTime nSumPlayCountN1 = DateTime.Parse("0001/01/01 12:00:01.000");
DateTime nSumPlayCountN2 = DateTime.Parse("0001/01/01 12:00:01.000");
if ( n1.arスコア[ nL12345 ] != null )
{
nSumPlayCountN1 = n1.arスコア[ nL12345 ]..;
}
if ( n2.arスコア[ nL12345 ] != null )
{
nSumPlayCountN2 = n2.arスコア[ nL12345 ]..;
}
int d = nSumPlayCountN1.CompareTo(nSumPlayCountN2);
if ( d != 0 )
{
return order * System.Math.Sign( d );
}
return order * n1.strタイトル.CompareTo( n2.strタイトル );
} );
foreach ( C曲リストード c曲リストード in )
{
DateTime nSumPlayCountN1 = DateTime.Parse( "0001/01/01 12:00:01.000" );
if ( c曲リストード.arスコア[ nL12345 ] != null )
{
nSumPlayCountN1 = c曲リストード.arスコア[ nL12345 ]..;
}
// Debug.WriteLine( nSumPlayCountN1 + ":" + c曲リストード.strタイトル );
}
}
}
public static void t曲リストのソート8_アーティスト名順( List<C曲リストード> , E楽器パート part, int order, params object[] p )
{
int nL12345 = (int) p[ 0 ];
.Sort( delegate( C曲リストード n1, C曲リストード n2 )
{
string strAuthorN1 = "";
string strAuthorN2 = "";
if (n1.arスコア[ nL12345 ] != null ) {
strAuthorN1 = n1.arスコア[ nL12345 ]..;
}
if ( n2.arスコア[ nL12345 ] != null )
{
strAuthorN2 = n2.arスコア[ nL12345 ]..;
}
return order * strAuthorN1.CompareTo( strAuthorN2 );
} );
foreach ( C曲リストード c曲リストード in )
{
string s = "";
if ( c曲リストード.arスコア[ nL12345 ] != null )
{
s = c曲リストード.arスコア[ nL12345 ]..;
}
Debug.WriteLine( s + ":" + c曲リストード.strタイトル );
}
}
public static void t曲リストのソート9_ジャンル順(List<C曲リストード> , E楽器パート part, int order, params object[] p)
{
try
{
var acGenreComparer = order == 1
? (IComparer<C曲リストード>) new C曲リストードComparerAC8_14()
: new C曲リストードComparerAC15();
var comparer = new ComparerChain<C曲リストード>(
new C曲リストードComparerード種別(),
acGenreComparer,
new C曲リストードComparer絶対パス(1),
new C曲リストードComparerタイトル(1));
.Sort( comparer );
}
catch (Exception ex)
{
Trace.TraceError(ex.ToString());
Trace.TraceError("例外が発生しましたが処理を継続します。 (bca6dda7-76ad-42fc-a415-250f52c0b17d)");
}
}
#if TEST_SORTBGM
public static void t曲リストのソート9_BPM順( List<C曲リストード> , E楽器パート part, int order, params object[] p )
{
order = -order;
int nL12345 = (int) p[ 0 ];
if ( part != E楽器パート.UNKNOWN )
{
.Sort( delegate( C曲リストード n1, C曲リストード n2 )
{
#region [ ]
if ( n1 == n2 )
{
return 0;
}
int num = this.t比較0_共通( n1, n2 );
if ( num != 0 )
{
return num;
}
if ( ( n1.eード種別 == C曲リストード.Eード種別.BOX ) && ( n2.eード種別 == C曲リストード.Eード種別.BOX ) )
{
return order * n1.arスコア[ 0 ]...CompareTo( n2.arスコア[ 0 ].. );
}
#endregion
double dBPMn1 = 0.0, dBPMn2 = 0.0;
if ( n1.arスコア[ nL12345 ] != null )
{
dBPMn1 = n1.arスコア[ nL12345 ]..bpm;
}
if ( n2.arスコア[ nL12345 ] != null )
{
dBPMn2 = n2.arスコア[ nL12345 ]..bpm;
}
double d = dBPMn1- dBPMn2;
if ( d != 0 )
{
return order * System.Math.Sign( d );
}
return order * n1.strタイトル.CompareTo( n2.strタイトル );
} );
foreach ( C曲リストード c曲リストード in )
{
double dBPM = 0;
if ( c曲リストード.arスコア[ nL12345 ] != null )
{
dBPM = c曲リストード.arスコア[ nL12345 ]..bpm;
}
Debug.WriteLine( dBPM + ":" + c曲リストード.strタイトル );
}
}
}
#endif
//-----------------
#endregion
#region [ .score.ini Cスコア. ]
//-----------------
public void tScoreIniを読み込んで譜面情報を設定する( string strScoreIniファイルパス, Cスコア score )
{
// New format
string[] fp =
{
strScoreIniファイルパス + "1P.score.ini",
strScoreIniファイルパス + "2P.score.ini",
};
// Load legacy format if new doesn't exist yet
if (!File.Exists(fp[0]))
fp[0] = strScoreIniファイルパス + ".score.ini";
/*
if ( !File.Exists( strScoreIniファイルパス ) )
return;
*/
// Select the main file for the common informations
int mainFile = 0;
if (!File.Exists(fp[0]))
mainFile = 1;
if (!File.Exists(fp[1]) && mainFile == 1)
return;
// Only the necessary scores are read from the auxilliary score file
int auxFile = mainFile ^ 1;
try
{
//var ini = new CScoreIni( strScoreIniファイルパス );
CScoreIni[] csi =
{
new CScoreIni(fp[mainFile]),
File.Exists(fp[auxFile]) ? new CScoreIni(fp[auxFile]) : null,
};
var ini = csi[0];
ini.t全演奏記録セクションの整合性をチェックし不整合があればリセットする();
csi[1]?.t全演奏記録セクションの整合性をチェックし不整合があればリセットする();
for ( int n楽器番号 = 0; n楽器番号 < 3; n楽器番号++ )
{
int n = ( n楽器番号 * 2 ) + 1; // n = 05
#region score..[ n楽器番号 ] = ...
//-----------------
if( ini.stセクション[ n ].b演奏にMIDI入力を使用した ||
ini.stセクション[ n ].b演奏にキーボードを使用した ||
ini.stセクション[ n ].b演奏にジョイパッドを使用した ||
ini.stセクション[ n ].b演奏にマウスを使用した )
{
// (A) 全オートじゃないようなので、演奏結果情報を有効としてランクを算出する。
score..[ n楽器番号 ] =
CScoreIni.tランク値を計算して返す(
ini.stセクション[ n ].n全チップ数,
ini.stセクション[ n ].nPerfect数,
ini.stセクション[ n ].nGreat数,
ini.stセクション[ n ].nGood数,
ini.stセクション[ n ].nPoor数,
ini.stセクション[ n ].nMiss数 );
}
else
{
// (B) 全オートらしいので、ランクは無効とする。
score..[ n楽器番号 ] = (int) CScoreIni.ERANK.UNKNOWN;
}
//-----------------
#endregion
score..[ n楽器番号 ] = ini.stセクション[ n ].db演奏型スキル値;
score..[ n楽器番号 ] = ini.stセクション[ n ].bフルコンボである;
}
// Legacy
score.. = (int)ini.stセクション.HiScoreDrums.nスコア;
score..nクリア = ini.stセクション.HiScoreDrums.nクリア;
score..nスコアランク = ini.stセクション.HiScoreDrums.nスコアランク;
for (int i = 0; i < (int)Difficulty.Total; i++)
{
score..nハイスコア[i] = (int)ini.stセクション.HiScoreDrums.nハイスコア[i];
}
// Load GPInfo for each save file
for (int i = 0; i < 2; i++)
{
if (csi[i] == null)
continue;
score.GPInfo[i].nClear = csi[i].stセクション.HiScoreDrums.nクリア;
score.GPInfo[i].nScoreRank = csi[i].stセクション.HiScoreDrums.nスコアランク;
for (int j = 0; j < (int)Difficulty.Total; j++)
{
score.GPInfo[i].nHighScore[j] = (int)csi[i].stセクション.HiScoreDrums.nハイスコア[j];
}
}
score...Drums = ini.stファイル.PlayCountDrums;
score...Guitar = ini.stファイル.PlayCountGuitar;
score...Bass = ini.stファイル.PlayCountBass;
for( int i = 0; i < (int)Difficulty.Total; i++ )
score..[ i ] = ini.stファイル.History[ i ];
}
catch (Exception e)
{
Trace.TraceError( "演奏記録ファイルの読み込みに失敗しました。[{0}]", strScoreIniファイルパス );
Trace.TraceError( e.ToString() );
Trace.TraceError( "例外が発生しましたが処理を継続します。 (801f823d-a952-4809-a1bb-cf6a56194f5c)" );
}
}
//-----------------
#endregion
// その他
#region [ private ]
//-----------------
//private const string SONGSDB_VERSION = "SongsDB5";
private List<string> listStrBoxDefSkinSubfolderFullName;
/// <summary>
/// 検索を中断_スローダウンする
/// </summary>
private void SlowOrSuspendSearchTask()
{
if ( this.bIsSuspending ) // #27060 中断要求があったら、解除要求が来るまで待機
{
AutoReset.WaitOne();
}
if ( this.bIsSlowdown && ++this.searchCount > 10 ) // #27060 #PREMOVIE再生中は検索負荷を下げる
{
Thread.Sleep( 100 );
this.searchCount = 0;
}
}
//-----------------
#endregion
}
}