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

1881 lines
89 KiB
C#
Raw Normal View History

2021-09-21 00:16:38 +02:00
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 [ SongsDB(songs.db) ]
//-----------------
public void tSongsDBを読み込む( string SongsDBファイル名 )
{
this.nSongsDBから取得できたスコア数 = 0;
if( File.Exists( SongsDBファイル名 ) )
{
BinaryReader br = null;
try
{
br = new BinaryReader( File.OpenRead( SongsDBファイル名 ) );
if ( !br.ReadString().Equals( SONGSDB_VERSION ) )
{
throw new InvalidDataException( "ヘッダが異なります。" );
}
this.listSongsDB = new List<Cスコア>();
while( true )
{
try
{
Cスコア item = this.tSongsDBからスコアをつ読み込む( br );
this.listSongsDB.Add( item );
this.nSongsDBから取得できたスコア数++;
}
catch( EndOfStreamException )
{
break;
}
}
}
finally
{
if( br != null )
br.Close();
}
}
}
//-----------------
#endregion
*/
#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;
// 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ジャンル)
2021-09-21 00:16:38 +02:00
{
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ジャンル;
}
switch (c曲リストード.strジャンル)
{
case "J-POP":
c曲リストード.strジャンル = "ポップス";
break;
case "ゲームミュージック":
c曲リストード.strジャンル = "ゲームバラエティ";
break;
case "どうよう":
c曲リストード.strジャンル = "キッズ";
break;
}
switch (c曲リストード.str本当のジャンル)
{
case "J-POP":
c曲リストード.str本当のジャンル = "ポップス";
break;
case "ゲームミュージック":
c曲リストード.str本当のジャンル = "ゲームバラエティ";
break;
case "どうよう":
c曲リストード.str本当のジャンル = "キッズ";
break;
}
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;
2021-09-21 00:16:38 +02:00
}
}
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曲リストード.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;
2021-09-21 00:16:38 +02:00
}
}
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;
}
2021-09-21 00:16:38 +02:00
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());
2021-09-21 00:16:38 +02:00
}
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 [ ]
//-----------------
public void tスコアキャッシュを曲リストに反映する()
{
this.nスコアキャッシュから反映できたスコア数 = 0;
this.tスコアキャッシュを曲リストに反映する( this.list曲ルート );
}
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 ) || ( node.eード種別 == C曲リストード.Eード種別.SCORE_MIDI ) )
{
Predicate<Cスコア> match = null;
for( int lv = 0; lv < (int)Difficulty.Total; lv++ )
{
if( node.arスコア[ lv ] != null )
{
if( match == null )
{
match = delegate( Cスコア sc )
{
return
(
( sc...Equals( node.arスコア[ lv ].. )
&& sc...Equals( node.arスコア[ lv ].. ) )
&& ( sc...Equals( node.arスコア[ lv ].. )
&& sc.ScoreIni情報..Equals( node.arスコア[ lv ].ScoreIni情報. ) ) )
&& sc.ScoreIni情報..Equals( node.arスコア[ lv ].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スコア[ lv ].. );
}
}
else
{
node.arスコア[ lv ]. = this.listSongsDB[ nMatched ].;
node.arスコア[ lv ].bSongDBにキャッシュがあった = true;
if( TJAPlayer3.ConfigIni.bLog曲検索ログ出力 )
{
Trace.TraceInformation( "songs.db から転記しました。({0})", node.arスコア[ lv ].. );
}
this.nスコアキャッシュから反映できたスコア数++;
}
}
}
}
}
}
}
private Cスコア tSongsDBからスコアをつ読み込む( BinaryReader br )
{
Cスコア cスコア = new Cスコア();
cスコア.. = br.ReadString();
cスコア.. = br.ReadString();
cスコア.. = new DateTime( br.ReadInt64() );
cスコア.. = br.ReadInt64();
cスコア.ScoreIni情報. = new DateTime( br.ReadInt64() );
cスコア.ScoreIni情報. = br.ReadInt64();
cスコア.. = br.ReadString();
cスコア.. = br.ReadString();
cスコア.. = br.ReadString();
cスコア.. = br.ReadString();
cスコア..Preimage = br.ReadString();
cスコア..Premovie = br.ReadString();
cスコア..Presound = br.ReadString();
cスコア..Backgound = br.ReadString();
cスコア...Drums = br.ReadInt32();
cスコア...Guitar = br.ReadInt32();
cスコア...Bass = br.ReadInt32();
cスコア...Drums = br.ReadInt32();
cスコア...Guitar = br.ReadInt32();
cスコア...Bass = br.ReadInt32();
cスコア...Drums = br.ReadDouble();
cスコア...Guitar = br.ReadDouble();
cスコア...Bass = br.ReadDouble();
cスコア...Drums = br.ReadBoolean();
cスコア...Guitar = br.ReadBoolean();
cスコア...Bass = br.ReadBoolean();
cスコア...Drums = br.ReadInt32();
cスコア...Guitar = br.ReadInt32();
cスコア...Bass = br.ReadInt32();
cスコア...1 = br.ReadString();
cスコア...2 = br.ReadString();
cスコア...3 = br.ReadString();
cスコア...4 = br.ReadString();
cスコア...5 = br.ReadString();
cスコア...6 = br.ReadString();
cスコア...7 = br.ReadString();
cスコア.. = br.ReadBoolean();
cスコア.. = (CDTX.E種別) br.ReadInt32();
cスコア..Bpm = br.ReadDouble();
cスコア..Duration = br.ReadInt32();
cスコア..strBGMファイル名 = br.ReadString();
cスコア..SongVol = br.ReadInt32();
var hasSongIntegratedLoudness = br.ReadBoolean();
var songIntegratedLoudness = br.ReadDouble();
var integratedLoudness = hasSongIntegratedLoudness ? new Lufs(songIntegratedLoudness) : default(Lufs?);
var hasSongPeakLoudness = br.ReadBoolean();
var songPeakLoudness = br.ReadDouble();
var peakLoudness = hasSongPeakLoudness ? new Lufs(songPeakLoudness) : default(Lufs?);
var songLoudnessMetadata = hasSongIntegratedLoudness
? new LoudnessMetadata(integratedLoudness.Value, peakLoudness)
: default(LoudnessMetadata?);
cスコア..SongLoudnessMetadata = songLoudnessMetadata;
cスコア..nデモBGMオフセット = br.ReadInt32();
cスコア..b譜面分岐[0] = br.ReadBoolean();
cスコア..b譜面分岐[1] = br.ReadBoolean();
cスコア..b譜面分岐[2] = br.ReadBoolean();
cスコア..b譜面分岐[3] = br.ReadBoolean();
cスコア..b譜面分岐[4] = br.ReadBoolean();
cスコア..b譜面分岐[5] = br.ReadBoolean();
cスコア..b譜面分岐[6] = br.ReadBoolean();
cスコア.. = br.ReadInt32();
cスコア..nハイスコア[0] = br.ReadInt32();
cスコア..nハイスコア[1] = br.ReadInt32();
cスコア..nハイスコア[2] = br.ReadInt32();
cスコア..nハイスコア[3] = br.ReadInt32();
cスコア..nハイスコア[4] = br.ReadInt32();
cスコア..nハイスコア[5] = br.ReadInt32();
cスコア..nハイスコア[6] = br.ReadInt32();
cスコア..strサブタイトル = br.ReadString();
cスコア..nレベル[0] = br.ReadInt32();
cスコア..nレベル[1] = br.ReadInt32();
cスコア..nレベル[2] = br.ReadInt32();
cスコア..nレベル[3] = br.ReadInt32();
cスコア..nレベル[4] = br.ReadInt32();
cスコア..nレベル[5] = br.ReadInt32();
cスコア..nレベル[6] = br.ReadInt32();
cスコア..nクリア[0] = br.ReadInt32();
cスコア..nクリア[1] = br.ReadInt32();
cスコア..nクリア[2] = br.ReadInt32();
cスコア..nクリア[3] = br.ReadInt32();
cスコア..nクリア[4] = br.ReadInt32();
cスコア..nスコアランク[0] = br.ReadInt32();
cスコア..nスコアランク[1] = br.ReadInt32();
cスコア..nスコアランク[2] = br.ReadInt32();
cスコア..nスコアランク[3] = br.ReadInt32();
cスコア..nスコアランク[4] = br.ReadInt32();
//Debug.WriteLine( "songs.db: " + cスコア.ファイル情報.ファイルの絶対パス );
return cスコア;
}
//-----------------
#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]..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ファイルから反映できたスコア数++;
2021-09-21 00:16:38 +02:00
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 ] );
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 );
}
}
#region [ "最近遊んだ曲"BOXを生成する ]
if(list曲ルート.Count > 0)
{
C曲リストード crecentryplaysong = new C曲リストード();
crecentryplaysong.eード種別 = C曲リストード.Eード種別.BOX;
crecentryplaysong.strタイトル = "最近あそんだ曲";
crecentryplaysong.strBoxText[0] = "";
crecentryplaysong.strBoxText[1] = "最近あそんだ曲を集めたよ!";
crecentryplaysong.strBoxText[2] = "";
crecentryplaysong.strジャンル = "最近遊んだ曲";
crecentryplaysong.nスコア数 = 1;
crecentryplaysong.list子リスト = new List<C曲リストード>();
crecentryplaysong.BackColor = ColorTranslator.FromHtml("#164748");
crecentryplaysong.BoxColor = Color.White;
2021-09-21 00:16:38 +02:00
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タイトル == "段位道場")
{
list曲ルート.Remove(c曲リストード);
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]);
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曲リストード> )
{
// すべてのノードについて…
foreach ( C曲リストード c曲リストード in )
{
SlowOrSuspendSearchTask(); // #27060 中断要求があったら、解除要求が来るまで待機, #PREMOVIE再生中は検索負荷を落とす
#region [ BOXードなら子リストに <<BACK ]
//-----------------------------
if ( c曲リストード.eード種別 == C曲リストード.Eード種別.BOX )
{
int = c曲リストード.list子リスト.Count;
for (int index = 0; index < ( / 7) + 1; index++)
{
C曲リストード itemBack = new C曲リストード();
itemBack.eード種別 = C曲リストード.Eード種別.BACKBOX;
itemBack.strタイトル = "とじる";
itemBack.BackColor = ColorTranslator.FromHtml("#513009");
itemBack.BoxColor = Color.White;
2021-09-21 00:16:38 +02:00
itemBack.strジャンル = c曲リストード.strジャンル;
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.strタイトル : itemBack.r親ード.strBreadcrumbs + " > " + itemBack.strタイトル;
itemBack.arスコア[0] = new Cスコア();
itemBack.arスコア[0].. = "";
itemBack.arスコア[0].. = itemBack.strタイトル;
itemBack.arスコア[0].. =
(CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?
"BOX を出ます。" :
"Exit from the BOX.";
c曲リストード.list子リスト.Insert(Math.Min(index * (7 + 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
}
continue;
}
//-----------------------------
#endregion
#region [ ]
//-----------------------------
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
}
#region [ ]
//-----------------------------
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
}
//-----------------
#endregion
/*#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 )
{
if( !File.Exists( strScoreIniファイルパス ) )
return;
try
{
var ini = new CScoreIni( strScoreIniファイルパス );
ini.t全演奏記録セクションの整合性をチェックし不整合があればリセットする();
for( int n楽器番号 = 0; n楽器番号 < 3; n楽器番号++ )
{
int n = ( n楽器番号 * 2 ) + 1; // n = 05
#region socre..[ 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フルコンボである;
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 ];
}
}
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
}
}