<Reference Include="System" />\r
<Reference Include="System.Data" />\r
<Reference Include="System.Drawing" />\r
+ <Reference Include="System.Web" />\r
<Reference Include="System.Windows.Forms" />\r
<Reference Include="System.Xml" />\r
</ItemGroup>\r
}\r
//-----------------\r
#endregion\r
-\r
+ #region [ BPM ]\r
+ //-----------------\r
+ else if( strコマンド.StartsWith( "BPM", StringComparison.OrdinalIgnoreCase ) )\r
+ {\r
+ this.t入力・行解析・BPM_BPMzz( strコマンド, strパラメータ, strコメント );\r
+ }\r
+ //-----------------\r
+ #endregion\r
else if( !this.bヘッダのみ ) // ヘッダのみの解析の場合、以下は無視。\r
{\r
#region [ PANEL ]\r
!this.t入力・行解析・BGA( strコマンド, strパラメータ, strコメント ) &&\r
!this.t入力・行解析・AVIPAN( strコマンド, strパラメータ, strコメント ) &&\r
!this.t入力・行解析・AVI_VIDEO( strコマンド, strパラメータ, strコメント ) &&\r
- !this.t入力・行解析・BPM_BPMzz( strコマンド, strパラメータ, strコメント ) &&\r
+ // !this.t入力・行解析・BPM_BPMzz( strコマンド, strパラメータ, strコメント ) && // bヘッダのみ==trueの場合でもチェックするよう変更\r
!this.t入力・行解析・RESULTIMAGE( strコマンド, strパラメータ, strコメント ) &&\r
!this.t入力・行解析・RESULTMOVIE( strコマンド, strパラメータ, strコメント ) &&\r
!this.t入力・行解析・RESULTSOUND( strコマンド, strパラメータ, strコメント ) &&\r
Debug.Assert( true ); // #23885 2010.12.12 yyagi: dummy line to exit parsing the line\r
// 2011.8.17 from: "int xx=0;" から変更。毎回警告が出るので。\r
}\r
+ //else\r
+ //{ // Duration測定のため、bヘッダのみ==trueでも、チップ配置は行う\r
+ // this.t入力・行解析・チップ配置( strコマンド, strパラメータ, strコメント );\r
+ //}\r
}\r
}\r
private bool t入力・行解析・AVI_VIDEO( string strコマンド, string strパラメータ, string strコメント )\r
}\r
else\r
{\r
- // box.def 記載のスキン情報を利用\r
- c曲リストノード.strSkinPath = System.IO.Path.Combine( infoDir.FullName, boxdef.SkinPath );\r
+ // box.defに記載されているスキン情報をコピー。末尾に必ず\をつけておくこと。\r
+ string s = System.IO.Path.Combine( infoDir.FullName, boxdef.SkinPath );\r
+ if ( s[ s.Length - 1 ] != System.IO.Path.DirectorySeparatorChar ) // フォルダ名末尾に\を必ずつけて、CSkin側と表記を統一する\r
+ {\r
+ s += System.IO.Path.DirectorySeparatorChar;\r
+ }\r
+ if ( CDTXMania.Skin.bIsValid( s ) )\r
+ {\r
+ c曲リストノード.strSkinPath = s;\r
+ }\r
+ else\r
+ {\r
+ c曲リストノード.strSkinPath = ( c曲リストノード.r親ノード == null ) ?\r
+ "" : c曲リストノード.r親ノード.strSkinPath;\r
+ }\r
}\r
}\r
if ( boxdef.PerfectRange >= 0 )\r
}\r
else\r
{\r
- // box.defに記載されているスキン情報をコピー\r
- c曲リストノード.strSkinPath = System.IO.Path.Combine( infoDir.FullName, boxdef.SkinPath );\r
+ // box.defに記載されているスキン情報をコピー。末尾に必ず\をつけておくこと。\r
+ string s = System.IO.Path.Combine( infoDir.FullName, boxdef.SkinPath );\r
+ if ( s[ s.Length - 1 ] != System.IO.Path.DirectorySeparatorChar ) // フォルダ名末尾に\を必ずつけて、CSkin側と表記を統一する\r
+ {\r
+ s += System.IO.Path.DirectorySeparatorChar;\r
+ }\r
+ if ( CDTXMania.Skin.bIsValid( s ) )\r
+ {\r
+ c曲リストノード.strSkinPath = s;\r
+ }\r
+ else\r
+ {\r
+ c曲リストノード.strSkinPath = ( c曲リストノード.r親ノード == null ) ?\r
+ "" : c曲リストノード.r親ノード.strSkinPath;\r
+ }\r
}\r
c曲リストノード.strBreadcrumbs = ( c曲リストノード.r親ノード == null ) ?\r
c曲リストノード.strタイトル : c曲リストノード.r親ノード.strBreadcrumbs + " > " + c曲リストノード.strタイトル;\r
//-----------------\r
public void t曲リストへ後処理を適用する()\r
{\r
+ listStrBoxDefSkinSubfolderFullName = new List<string>();\r
+ if ( CDTXMania.Skin.strBoxDefSkinSubfolders != null )\r
+ {\r
+ foreach ( string b in CDTXMania.Skin.strBoxDefSkinSubfolders )\r
+ {\r
+ listStrBoxDefSkinSubfolderFullName.Add( b );\r
+ }\r
+ }\r
+\r
this.t曲リストへ後処理を適用する( this.list曲ルート );\r
+\r
+ #region [ skin名で比較して、systemスキンとboxdefスキンに重複があれば、boxdefスキン側を削除する ]\r
+ string[] systemSkinNames = CSkin.GetSkinName( CDTXMania.Skin.strSystemSkinSubfolders );\r
+ List<string> l = new List<string>( listStrBoxDefSkinSubfolderFullName );\r
+ foreach ( string boxdefSkinSubfolderFullName in l )\r
+ {\r
+ if ( Array.BinarySearch( systemSkinNames,\r
+ CSkin.GetSkinName( boxdefSkinSubfolderFullName ),\r
+ StringComparer.InvariantCultureIgnoreCase ) >= 0 )\r
+ {\r
+ listStrBoxDefSkinSubfolderFullName.Remove( boxdefSkinSubfolderFullName );\r
+ }\r
+ }\r
+ #endregion\r
+ string[] ba = listStrBoxDefSkinSubfolderFullName.ToArray();\r
+ Array.Sort( ba );\r
+ CDTXMania.Skin.strBoxDefSkinSubfolders = ba;\r
}\r
private void t曲リストへ後処理を適用する( List<C曲リストノード> ノードリスト )\r
{\r
itemBack.strSkinPath = ( c曲リストノード.r親ノード == null ) ?\r
"" : c曲リストノード.r親ノード.strSkinPath;\r
\r
+ if ( itemBack.strSkinPath != "" && !listStrBoxDefSkinSubfolderFullName.Contains( itemBack.strSkinPath ) )\r
+ {\r
+ listStrBoxDefSkinSubfolderFullName.Add( itemBack.strSkinPath );\r
+ }\r
+\r
itemBack.strBreadcrumbs = ( itemBack.r親ノード == null ) ?\r
itemBack.strタイトル : itemBack.r親ノード.strBreadcrumbs + " > " + itemBack.strタイトル;\r
\r
#region [ private ]\r
//-----------------\r
private const string SONGSDB_VERSION = "SongsDB3";\r
+ private List<string> listStrBoxDefSkinSubfolderFullName;\r
\r
private int t比較0_共通( C曲リストノード n1, C曲リストノード n2 )\r
{\r
"Turn ON to put debug log to\n DTXManiaLog.txt\nTo take it effective, you need to\n re-open DTXMania." );\r
this.list項目リスト.Add( this.iLogOutputLog );\r
\r
- this.iSystemSkinSubfolder = new CItemList( "Skin", CItemBase.Eパネル種別.通常, nSkinIndex,\r
+ this.iSystemSkinSubfolder = new CItemList( "Skin (General)", CItemBase.Eパネル種別.通常, nSkinIndex,\r
"スキン切替:\n" +\r
- "スキンを切り替えます。",\r
+ "スキンを切り替えます。\n",\r
+ //"CONFIGURATIONを抜けると、設定した\n" +\r
+ //"スキンに変更されます。",\r
"Skin:\n" +\r
"Change skin.",\r
- skinSubFolders );\r
+ skinNames );\r
this.list項目リスト.Add( this.iSystemSkinSubfolder );\r
+ this.iSystemUseBoxDefSkin = new CItemToggle( "Skin (Box)", CDTXMania.ConfigIni.bUseBoxDefSkin,\r
+ "Music boxスキンの利用:\n" +\r
+ "特別なスキンが設定されたMusic box\n" +\r
+ "に出入りしたときに、自動でスキンを\n" +\r
+ "切り替えるかどうかを設定します。\n",\r
+ //"\n" +\r
+ //"(Music Boxスキンは、box.defファイル\n" +\r
+ //" で指定できます)\n",\r
+ "Box skin:\n" +\r
+ "Automatically change skin\n" +\r
+ "specified in box.def file." );\r
+ this.list項目リスト.Add( this.iSystemUseBoxDefSkin );\r
\r
\r
this.iSystemGoToKeyAssign = new CItemBase( "System Keys", CItemBase.Eパネル種別.通常,\r
CDTXMania.ConfigIni.BackupOf1BD = null;\r
}\r
}\r
+ else if ( this.list項目リスト[ this.n現在の選択項目 ] == this.iSystemUseBoxDefSkin ) // #28195 2012.5.6 yyagi\r
+ {\r
+ CSkin.bUseBoxDefSkin = this.iSystemUseBoxDefSkin.bON;\r
+ }\r
#region [ スキン項目でEnterを押下した場合に限り、スキンの縮小サンプルを生成する。]\r
else if ( this.list項目リスト[ this.n現在の選択項目 ] == this.iSystemSkinSubfolder ) // #28195 2012.5.2 yyagi\r
{\r
nSkinIndex = ( ( CItemList ) this.list項目リスト[ this.n現在の選択項目 ] ).n現在選択されている項目番号;\r
if ( nSkinSampleIndex != nSkinIndex )\r
{\r
- string skinName = ( string ) ( ( ( CItemList ) this.list項目リスト[ this.n現在の選択項目 ] ).obj現在値() );\r
- string path;\r
- path = System.IO.Path.Combine( CDTXMania.strEXEのあるフォルダ, "System" );\r
- path = System.IO.Path.Combine( path, CSkin.PrefixSkinFolder + skinName );\r
+ string path = skinSubFolders[ nSkinIndex ];\r
path = System.IO.Path.Combine( path, @"Graphics\ScreenTitle background.jpg" );\r
Bitmap bmSrc = new Bitmap( path );\r
Bitmap bmDest = new Bitmap( bmSrc.Width / 4, bmSrc.Height / 4 );\r
this.eメニュー種別 = Eメニュー種別.Unknown;\r
\r
#region [ スキン選択肢と、現在選択中のスキン(index)の準備 #28195 2012.5.2 yyagi ]\r
- //CDTXMania.Skin.ReloadSkinPaths(); // CONFIGに入るタイミングで、スキンフォルダを再検索\r
- skinSubFolders = (string[])CDTXMania.Skin.strSkinSubfolders.Clone(); // skinSubFoldersへの書き換えが元に及ばないよう、Clone()する\r
- skinSubFolder_org = CSkin.strSkinSubfolder;\r
- nSkinIndex = Array.BinarySearch( skinSubFolders, CSkin.strSkinSubfolder );\r
- if ( nSkinIndex < 0 )\r
+ int ns = ( CDTXMania.Skin.strSystemSkinSubfolders == null ) ? 0 : CDTXMania.Skin.strSystemSkinSubfolders.Length;\r
+ int nb = ( CDTXMania.Skin.strBoxDefSkinSubfolders == null ) ? 0 : CDTXMania.Skin.strBoxDefSkinSubfolders.Length;\r
+ skinSubFolders = new string[ ns + nb ];\r
+ for ( int i = 0; i < ns; i++ )\r
{\r
- nSkinIndex = 0;\r
+ skinSubFolders[ i ] = CDTXMania.Skin.strSystemSkinSubfolders[ i ];\r
}\r
- nSkinSampleIndex = -1;\r
- for ( int i = 0; i < skinSubFolders.Length; i++ ) // "SkinFiles."を削除\r
+ for ( int i = 0; i < nb; i++ )\r
{\r
- skinSubFolders[ i ] = skinSubFolders[ i ].Substring( CSkin.PrefixSkinFolder.Length );\r
+ skinSubFolders[ ns + i ] = CDTXMania.Skin.strBoxDefSkinSubfolders[ i ];\r
}\r
+ skinSubFolder_org = CDTXMania.Skin.GetCurrentSkinSubfolderFullName( true );\r
+ Array.Sort( skinSubFolders );\r
+ skinNames = CSkin.GetSkinName( skinSubFolders );\r
+ nSkinIndex = Array.BinarySearch( skinSubFolders, skinSubFolder_org );\r
+ if ( nSkinIndex < 0 ) // 念のため\r
+ {\r
+ nSkinIndex = 0;\r
+ }\r
+ nSkinSampleIndex = -1;\r
#endregion\r
\r
this.t項目リストの設定・Bass(); // #27795 2012.3.11 yyagi; System設定の中でDrumsの設定を参照しているため、\r
\r
base.On非活性化();\r
\r
- if ( CSkin.strSkinSubfolder != this.skinSubFolder_org )\r
+ if ( CDTXMania.Skin.GetCurrentSkinSubfolderFullName( true ) != this.skinSubFolder_org )\r
{\r
CDTXMania.Skin.PrepareReloadSkin(); // #28195 2012.5.2 yyagi CONFIG脱出時にSkin更新\r
CDTXMania.Skin.ReloadSkin(); //\r
\r
private CTexture txSkinSample1; // #28195 2012.5.2 yyagi\r
private string[] skinSubFolders; //\r
+ private string[] skinNames; //\r
private string skinSubFolder_org; //\r
private int nSkinSampleIndex; //\r
private int nSkinIndex; //\r
private CItemInteger iGuitarInputAdjustTimeMs; //\r
private CItemInteger iBassInputAdjustTimeMs; //\r
private CItemList iSystemSkinSubfolder; // #28195 2012.5.2 yyagi\r
+ private CItemToggle iSystemUseBoxDefSkin; // #28195 2012.5.6 yyagi\r
\r
private int t前の項目( int nItem )\r
{\r
CDTXMania.ConfigIni.n自動再生音量 = this.iSystemAutoChipVolume.n現在の値;\r
CDTXMania.ConfigIni.bストイックモード = this.iSystemStoicMode.bON;\r
\r
- CDTXMania.ConfigIni.nShowLagType = this.iSystemShowLag.n現在選択されている項目番号; // #25370 2011.6.3 yyagi\r
- CDTXMania.ConfigIni.bIsAutoResultCapture = this.iSystemAutoResultCapture.bON; // #25399 2011.6.9 yyagi\r
+ CDTXMania.ConfigIni.nShowLagType = this.iSystemShowLag.n現在選択されている項目番号; // #25370 2011.6.3 yyagi\r
+ CDTXMania.ConfigIni.bIsAutoResultCapture = this.iSystemAutoResultCapture.bON; // #25399 2011.6.9 yyagi\r
\r
- CDTXMania.ConfigIni.nRisky = this.iSystemRisky.n現在の値; // #23559 2911.7.27 yyagi\r
+ CDTXMania.ConfigIni.nRisky = this.iSystemRisky.n現在の値; // #23559 2911.7.27 yyagi\r
\r
- CDTXMania.ConfigIni.strSkinSubfolder = CSkin.PrefixSkinFolder + ( string ) this.iSystemSkinSubfolder.list項目値[ nSkinIndex ]; // #28195 2012.5.2 yyagi\r
- CSkin.strSkinSubfolder = CDTXMania.ConfigIni.strSkinSubfolder; //\r
+ CDTXMania.ConfigIni.strSystemSkinSubfolderFullName = skinSubFolders[ nSkinIndex ]; // #28195 2012.5.2 yyagi\r
+ CDTXMania.Skin.SetCurrentSkinSubfolderFullName( CDTXMania.ConfigIni.strSystemSkinSubfolderFullName, true );\r
+ CDTXMania.ConfigIni.bUseBoxDefSkin = this.iSystemUseBoxDefSkin.bON; // #28195 2012.5.6 yyagi\r
+\r
+//Trace.TraceInformation( "saved" );\r
+//Trace.TraceInformation( "Skin現在Current : " + CDTXMania.Skin.GetCurrentSkinSubfolderFullName(true) );\r
+//Trace.TraceInformation( "Skin現在System : " + CSkin.strSystemSkinSubfolderFullName );\r
+//Trace.TraceInformation( "Skin現在BoxDef : " + CSkin.strBoxDefSkinSubfolderFullName );\r
+ \r
}\r
private void tConfigIniへ記録する・Bass()\r
{\r
\r
public bool tBOXに入る()\r
{\r
+//Trace.TraceInformation( "box enter" );\r
+//Trace.TraceInformation( "Skin現在Current : " + CDTXMania.Skin.GetCurrentSkinSubfolderFullName(false) );\r
+//Trace.TraceInformation( "Skin現在System : " + CSkin.strSystemSkinSubfolderFullName );\r
+//Trace.TraceInformation( "Skin現在BoxDef : " + CSkin.strBoxDefSkinSubfolderFullName );\r
+//Trace.TraceInformation( "Skin現在: " + CSkin.GetSkinName( CDTXMania.Skin.GetCurrentSkinSubfolderFullName(false) ) );\r
+//Trace.TraceInformation( "Skin現pt: " + CDTXMania.Skin.GetCurrentSkinSubfolderFullName(false) );\r
+//Trace.TraceInformation( "Skin指定: " + CSkin.GetSkinName( this.r現在選択中の曲.strSkinPath ) );\r
+//Trace.TraceInformation( "Skinpath: " + this.r現在選択中の曲.strSkinPath );\r
bool ret = false;\r
- if ( this.strBoxDefSkinPath != this.r現在選択中の曲.strSkinPath )\r
+ if ( CSkin.GetSkinName( CDTXMania.Skin.GetCurrentSkinSubfolderFullName( false ) ) != CSkin.GetSkinName( this.r現在選択中の曲.strSkinPath )\r
+ && CSkin.bUseBoxDefSkin )\r
{\r
- CSkin.strBoxDefSkinSubfolderFullName = this.r現在選択中の曲.strSkinPath;\r
- this.strBoxDefSkinPath = this.r現在選択中の曲.strSkinPath;\r
ret = true;\r
}\r
+ CDTXMania.Skin.SetCurrentSkinSubfolderFullName(\r
+ CDTXMania.Skin.GetSkinSubfolderFullNameFromSkinName( CSkin.GetSkinName( this.r現在選択中の曲.strSkinPath ) ), false );\r
+\r
+//Trace.TraceInformation( "Skin変更: " + CSkin.GetSkinName( CDTXMania.Skin.GetCurrentSkinSubfolderFullName(false) ) );\r
+//Trace.TraceInformation( "Skin変更Current : "+ CDTXMania.Skin.GetCurrentSkinSubfolderFullName(false) );\r
+//Trace.TraceInformation( "Skin変更System : "+ CSkin.strSystemSkinSubfolderFullName );\r
+//Trace.TraceInformation( "Skin変更BoxDef : "+ CSkin.strBoxDefSkinSubfolderFullName );\r
\r
if( ( this.r現在選択中の曲.list子リスト != null ) && ( this.r現在選択中の曲.list子リスト.Count > 0 ) )\r
{\r
}\r
public bool tBOXを出る()\r
{\r
+//Trace.TraceInformation( "box exit" );\r
+//Trace.TraceInformation( "Skin現在Current : " + CDTXMania.Skin.GetCurrentSkinSubfolderFullName(false) );\r
+//Trace.TraceInformation( "Skin現在System : " + CSkin.strSystemSkinSubfolderFullName );\r
+//Trace.TraceInformation( "Skin現在BoxDef : " + CSkin.strBoxDefSkinSubfolderFullName );\r
+//Trace.TraceInformation( "Skin現在: " + CSkin.GetSkinName( CDTXMania.Skin.GetCurrentSkinSubfolderFullName(false) ) );\r
+//Trace.TraceInformation( "Skin現pt: " + CDTXMania.Skin.GetCurrentSkinSubfolderFullName(false) );\r
+//Trace.TraceInformation( "Skin指定: " + CSkin.GetSkinName( this.r現在選択中の曲.strSkinPath ) );\r
+//Trace.TraceInformation( "Skinpath: " + this.r現在選択中の曲.strSkinPath );\r
bool ret = false;\r
- if ( this.strBoxDefSkinPath != this.r現在選択中の曲.strSkinPath )\r
+ if ( CSkin.GetSkinName( CDTXMania.Skin.GetCurrentSkinSubfolderFullName( false ) ) != CSkin.GetSkinName( this.r現在選択中の曲.strSkinPath )\r
+ && CSkin.bUseBoxDefSkin )\r
{\r
- CSkin.strBoxDefSkinSubfolderFullName = this.r現在選択中の曲.strSkinPath;\r
- this.strBoxDefSkinPath = this.r現在選択中の曲.strSkinPath;\r
ret = true;\r
}\r
+ // スキン変更が発生しなくても、boxdef圏外に出る場合は、boxdefスキン設定の更新が必要\r
+ // (ユーザーがboxdefスキンをConfig指定している場合への対応のために必要)\r
+ // tBoxに入る()とは処理が微妙に異なるので注意\r
+ CDTXMania.Skin.SetCurrentSkinSubfolderFullName(\r
+ ( this.r現在選択中の曲.strSkinPath == "" ) ? "" : CDTXMania.Skin.GetSkinSubfolderFullNameFromSkinName( CSkin.GetSkinName( this.r現在選択中の曲.strSkinPath ) ), false );\r
+//Trace.TraceInformation( "SKIN変更: " + CSkin.GetSkinName( CDTXMania.Skin.GetCurrentSkinSubfolderFullName(false) ) );\r
+//Trace.TraceInformation( "SKIN変更Current : "+ CDTXMania.Skin.GetCurrentSkinSubfolderFullName(false) );\r
+//Trace.TraceInformation( "SKIN変更System : "+ CSkin.strSystemSkinSubfolderFullName );\r
+//Trace.TraceInformation( "SKIN変更BoxDef : "+ CSkin.strBoxDefSkinSubfolderFullName );\r
if ( this.r現在選択中の曲.r親ノード != null )\r
{\r
this.r現在選択中の曲 = this.r現在選択中の曲.r親ノード;\r
private int nCurrentPosition = 0;\r
private int nNumOfItems = 0;\r
\r
- private string strBoxDefSkinPath = "";\r
+ //private string strBoxDefSkinPath = "";\r
private Eバー種別 e曲のバー種別を返す( C曲リストノード song )\r
{\r
if( song != null )\r
}\r
\r
//スキン変更処理\r
- Trace.TraceInformation("New Skin=" + CSkin.strBoxDefSkinSubfolderFullName );\r
+ Trace.TraceInformation("スキン変更:" + CDTXMania.Skin.GetCurrentSkinSubfolderFullName( false ) );\r
CDTXMania.Skin.PrepareReloadSkin();\r
CDTXMania.Skin.ReloadSkin();\r
return 1;\r
using System.Runtime.InteropServices;\r
using System.IO;\r
using System.Diagnostics;\r
+using System.Web;\r
using FDK;\r
\r
namespace DTXMania\r
public int nPoliphonicSounds; // #28228 2012.5.1 yyagi レーン毎の最大同時発音数\r
public bool bバッファ入力を行う;\r
public bool bIsEnabledSystemMenu; // #28200 2012.5.1 yyagi System Menuの使用可否切替\r
- public string strSkinSubfolder; // #28195 2012.5.2 yyagi Skin切替用 System/以下のサブフォルダ名\r
+ public string strSystemSkinSubfolderFullName; // #28195 2012.5.2 yyagi Skin切替用 System/以下のサブフォルダ名\r
+ public bool bUseBoxDefSkin; // #28195 2012.5.6 yyagi Skin切替用 box.defによるスキン変更機能を使用するか否か\r
public bool bConfigIniがないかDTXManiaのバージョンが異なる\r
{\r
get\r
this.eBDGroup = EBDGroup.打ち分ける; // #27029 2012.1.4 from HHPedalとBassPedalのグルーピング\r
this.nPoliphonicSounds = 4; // #28228 2012.5.1 yyagi レーン毎の最大同時発音数\r
this.bIsEnabledSystemMenu = true; // #28200 2012.5.1 yyagi System Menuの利用可否切替(使用可)\r
- this.strSkinSubfolder = ""; // #28195 2012.5.2 yyagi 使用中のSkinサブフォルダ名\r
+ this.strSystemSkinSubfolderFullName = ""; // #28195 2012.5.2 yyagi 使用中のSkinサブフォルダ名\r
+ this.bUseBoxDefSkin = true; // #28195 2012.5.6 yyagi box.defによるスキン切替機能を使用するか否か\r
}\r
public CConfigIni( string iniファイル名 )\r
: this()\r
sw.WriteLine( @"; You can specify many pathes separated with semicolon(;). (e.g. d:\DTXFiles1\;e:\DTXFiles2\)" );\r
sw.WriteLine( "DTXPath={0}", this.str曲データ検索パス );\r
sw.WriteLine();\r
- sw.WriteLine( "; 使用するSkinのサブフォルダ名。" );\r
- sw.WriteLine( "; 例えば System/Default/Graphics/... などの場合は、SkinPath=Default を指定します。" );\r
- sw.WriteLine( "; Skin subfolder path." );\r
- sw.WriteLine( "; e.g. System/Default/Graphics/... -> Set SkinPath=Default" );\r
- sw.WriteLine( "SkinPath={0}", this.strSkinSubfolder );\r
+\r
+ #region [ スキン関連 ]\r
+ #region [ Skinパスの絶対パス→相対パス変換 ]\r
+ Uri uriRoot = new Uri( System.IO.Path.Combine( CDTXMania.strEXEのあるフォルダ, "System" + System.IO.Path.DirectorySeparatorChar ) );\r
+ Uri uriPath = new Uri( System.IO.Path.Combine( this.strSystemSkinSubfolderFullName, "." + System.IO.Path.DirectorySeparatorChar ) );\r
+ string relPath = uriRoot.MakeRelativeUri( uriPath ).ToString(); // 相対パスを取得\r
+ relPath = System.Web.HttpUtility.UrlDecode( relPath ); // デコードする\r
+ relPath = relPath.Replace( '/', System.IO.Path.DirectorySeparatorChar ); // 区切り文字が\ではなく/なので置換する\r
+ #endregion\r
+ sw.WriteLine( "; 使用するSkinのフォルダ名。" );\r
+ sw.WriteLine( "; 例えば System\\Default\\Graphics\\... などの場合は、SkinPath=.\\Default\\ を指定します。" );\r
+ sw.WriteLine( "; Skin folder path." );\r
+ sw.WriteLine( "; e.g. System\\Default\\Graphics\\... -> Set SkinPath=.\\Default\\" );\r
+ sw.WriteLine( "SkinPath={0}", relPath );\r
+ sw.WriteLine();\r
+ sw.WriteLine( "; box.defが指定するSkinに自動で切り替えるかどうか (0=切り替えない、1=切り替える)" );\r
+ sw.WriteLine( "; Automatically change skin specified in box.def. (0=No 1=Yes)" );\r
+ sw.WriteLine( "SkinChangeByBoxDef={0}", this.bUseBoxDefSkin? 1 : 0 );\r
sw.WriteLine();\r
+ #endregion\r
sw.WriteLine( "; 画面モード(0:ウィンドウ, 1:全画面)" );\r
sw.WriteLine( "; Screen mode. (0:Window, 1:Fullscreen)" );\r
sw.WriteLine( "FullScreen={0}", this.b全画面モード ? 1 : 0 );\r
sw.WriteLine();\r
-\r
sw.WriteLine("; ウインドウモード時の画面幅"); // #23510 2010.10.31 yyagi add\r
sw.WriteLine("; A width size in the window mode."); //\r
sw.WriteLine("WindowWidth={0}", this.nウインドウwidth); //\r
}\r
else if ( str3.Equals( "SkinPath" ) )\r
{\r
- this.strSkinSubfolder = str4;\r
+ string absSkinPath = str4;\r
+ if ( !System.IO.Path.IsPathRooted( str4 ) )\r
+ {\r
+ absSkinPath = System.IO.Path.Combine( CDTXMania.strEXEのあるフォルダ, "System" );\r
+ absSkinPath = System.IO.Path.Combine( absSkinPath, str4 );\r
+ Uri u = new Uri( absSkinPath );\r
+ absSkinPath = u.AbsolutePath.ToString(); // str4内に相対パスがある場合に備える\r
+ absSkinPath = System.Web.HttpUtility.UrlDecode( absSkinPath ); // デコードする\r
+ absSkinPath = absSkinPath.Replace( '/', System.IO.Path.DirectorySeparatorChar ); // 区切り文字が\ではなく/なので置換する\r
+ }\r
+ if ( absSkinPath[ absSkinPath.Length - 1 ] != System.IO.Path.DirectorySeparatorChar ) // フォルダ名末尾に\を必ずつけて、CSkin側と表記を統一する\r
+ {\r
+ absSkinPath += System.IO.Path.DirectorySeparatorChar;\r
+ }\r
+ this.strSystemSkinSubfolderFullName = absSkinPath;\r
+ }\r
+ else if ( str3.Equals( "SkinChangeByBoxDef" ) )\r
+ {\r
+ this.bUseBoxDefSkin = C変換.bONorOFF( str4[ 0 ] );\r
}\r
else if ( str3.Equals( "FullScreen" ) )\r
{\r
this.b全画面モード = C変換.bONorOFF( str4[ 0 ] );\r
}\r
- else if( str3.Equals( "WindowWidth" ) ) // #23510 2010.10.31 yyagi add\r
+ else if ( str3.Equals( "WindowWidth" ) ) // #23510 2010.10.31 yyagi add\r
{\r
this.nウインドウwidth = C変換.n値を文字列から取得して範囲内に丸めて返す( str4, 1, 65535, this.nウインドウwidth );\r
if( this.nウインドウwidth <= 0 )\r
try\r
{\r
Trace.TraceInformation( "初期化開始。" );\r
- Skin = new CSkin( CDTXMania.ConfigIni.strSkinSubfolder );\r
- CDTXMania.ConfigIni.strSkinSubfolder = CSkin.strSkinSubfolder; // 旧指定のSkinフォルダが消滅していた場合に備える\r
+ Skin = new CSkin( CDTXMania.ConfigIni.strSystemSkinSubfolderFullName, CDTXMania.ConfigIni.bUseBoxDefSkin );\r
+ CDTXMania.ConfigIni.strSystemSkinSubfolderFullName = CDTXMania.Skin.GetCurrentSkinSubfolderFullName( true ); // 旧指定のSkinフォルダが消滅していた場合に備える\r
Trace.TraceInformation( "スキンの初期化を完了しました。" );\r
}\r
catch\r
//---------------------\r
#endregion\r
\r
+ // Sound管理.t再生中の処理をする() を、別スレッドで50ms周期で実行する\r
+ //System.Threading.Thread t =\r
+ //new System.Threading.Thread(\r
+ //new System.Threading.ThreadStart( Sound管理.t再生中の処理をする_loop ) );\r
+ //t.IsBackground = true;\r
+ //t.Start();\r
+\r
Trace.TraceInformation( "アプリケーションの初期化を完了しました。" );\r
\r
#region [ 最初のステージの起動 ]\r
\r
internal class CSkin : IDisposable\r
{\r
- public static string PrefixSkinFolder = ""; // "SkinFiles.";\r
-\r
// クラス\r
\r
public class Cシステムサウンド : IDisposable\r
}\r
}\r
\r
- public string[] strSkinSubfolders = null; // List<string>だとignoreCaseな検索が面倒なので、配列に逃げる :-)\r
- public static string strSkinSubfolder = null; // Configで選択しているスキン\r
- public static string strSkinSubfolderFullName // strSkinSubfolderのフルパスを返す\r
+\r
+ // スキンの切り替えについて・・・\r
+ //\r
+ // ・スキンの種類は大きく分けて2種類。Systemスキンとboxdefスキン。\r
+ // 前者はSystem/フォルダにユーザーが自らインストールしておくスキン。\r
+ // 後者はbox.defで指定する、曲データ制作者が提示するスキン。\r
+ //\r
+ // ・Config画面で、2種のスキンを区別無く常時使用するよう設定することができる。\r
+ // ・box.defの#SKINPATH 設定により、boxdefスキンを一時的に使用するよう設定する。\r
+ // (box.defの効果の及ばない他のmuxic boxでは、当該boxdefスキンの有効性が無くなる)\r
+ //\r
+ // これを実現するために・・・\r
+ // ・Systemスキンの設定情報と、boxdefスキンの設定情報は、分離して持つ。\r
+ // (strSystem~~ と、strBoxDef~~~)\r
+ // ・Config画面からは前者のみ書き換えできるようにし、\r
+ // 選曲画面からは後者のみ書き換えできるようにする。(SetCurrent...())\r
+ // ・読み出しは両者から行えるようにすると共に\r
+ // 選曲画面用に二種の情報を区別しない読み出し方法も提供する(GetCurrent...)\r
+\r
+ private object lockBoxDefSkin;\r
+ public static bool bUseBoxDefSkin = true; // box.defからのスキン変更を許容するか否か\r
+\r
+ public string strSystemSkinRoot = null;\r
+ public string[] strSystemSkinSubfolders = null; // List<string>だとignoreCaseな検索が面倒なので、配列に逃げる :-)\r
+ private string[] _strBoxDefSkinSubfolders = null;\r
+ public string[] strBoxDefSkinSubfolders\r
{\r
get\r
{\r
- string path;\r
- path = System.IO.Path.Combine( CDTXMania.strEXEのあるフォルダ, "System" );\r
- path = System.IO.Path.Combine( path, strSkinSubfolder );\r
- return path;\r
+ lock ( lockBoxDefSkin )\r
+ {\r
+ return _strBoxDefSkinSubfolders;\r
+ }\r
+ }\r
+ set\r
+ {\r
+ lock ( lockBoxDefSkin )\r
+ {\r
+ _strBoxDefSkinSubfolders = value;\r
+ }\r
+ }\r
+ } // 別スレッドからも書き込みアクセスされるため、スレッドセーフなアクセス法を提供\r
+\r
+ private static string strSystemSkinSubfolderFullName; // Config画面で設定されたスキン\r
+ private static string strBoxDefSkinSubfolderFullName = ""; // box.defで指定されているスキン\r
+\r
+ /// <summary>\r
+ /// スキンパス名をフルパスで取得する\r
+ /// </summary>\r
+ /// <param name="bFromUserConfig">ユーザー設定用ならtrue, box.defからの設定ならfalse</param>\r
+ /// <returns></returns>\r
+ public string GetCurrentSkinSubfolderFullName( bool bFromUserConfig )\r
+ {\r
+ if ( !bUseBoxDefSkin || bFromUserConfig == true || strBoxDefSkinSubfolderFullName == "" )\r
+ {\r
+ return strSystemSkinSubfolderFullName;\r
+ }\r
+ else\r
+ {\r
+ return strBoxDefSkinSubfolderFullName;\r
+ }\r
+ }\r
+ /// <summary>\r
+ /// スキンパス名をフルパスで設定する\r
+ /// </summary>\r
+ /// <param name="value">スキンパス名</param>\r
+ /// <param name="bFromUserConfig">ユーザー設定用ならtrue, box.defからの設定ならfalse</param>\r
+ public void SetCurrentSkinSubfolderFullName( string value, bool bFromUserConfig )\r
+ {\r
+ if ( bFromUserConfig )\r
+ {\r
+ strSystemSkinSubfolderFullName = value;\r
+ }\r
+ else\r
+ {\r
+ strBoxDefSkinSubfolderFullName = value;\r
}\r
}\r
- public static string strBoxDefSkinSubfolderFullName = ""; // box.defで指定されているスキン\r
\r
\r
// コンストラクタ\r
- public CSkin( string _strSkinSubfolder )\r
+ public CSkin( string _strSkinSubfolderFullName, bool _bUseBoxDefSkin )\r
{\r
- string path;\r
- path = System.IO.Path.Combine( CDTXMania.strEXEのあるフォルダ, "System" );\r
- strSkinSubfolder = _strSkinSubfolder;\r
+ lockBoxDefSkin = new object();\r
+ strSystemSkinSubfolderFullName = _strSkinSubfolderFullName;\r
+ bUseBoxDefSkin = _bUseBoxDefSkin;\r
+ InitializeSkinPathRoot();\r
ReloadSkinPaths();\r
PrepareReloadSkin();\r
}\r
public CSkin()\r
{\r
+ lockBoxDefSkin = new object();\r
+ InitializeSkinPathRoot();\r
+ bUseBoxDefSkin = true;\r
ReloadSkinPaths();\r
PrepareReloadSkin();\r
}\r
+ private string InitializeSkinPathRoot()\r
+ {\r
+ strSystemSkinRoot = System.IO.Path.Combine( CDTXMania.strEXEのあるフォルダ, "System" );\r
+ return strSystemSkinRoot;\r
+ }\r
\r
/// <summary>\r
/// Skin(Sounds)を再読込する準備をする(再生停止,Dispose,ファイル名再設定)。\r
{\r
Trace.TraceInformation( "SkinPath設定: {0}",\r
( strBoxDefSkinSubfolderFullName == "" ) ?\r
- strBoxDefSkinSubfolderFullName :\r
- strSkinSubfolder\r
+ strSystemSkinSubfolderFullName :\r
+ strBoxDefSkinSubfolderFullName\r
);\r
\r
for ( int i = 0; i < nシステムサウンド数; i++ )\r
\r
/// <summary>\r
/// Skinの一覧を再取得する。\r
- /// System/SkinFiles.*****/Graphics (やSounds/) というフォルダ構成を想定している。\r
- /// もし再取得の結果、現在使用中のSkinのパス(strSkinSubfloder)が消えていた場合は、\r
- /// 以下の優先順位で存在確認の上strSkinSubfolderを再設定する。\r
- /// 1. System/SkinFiles.Default/\r
- /// 2. System/SkinFiles.*****/ で最初にenumerateされたもの\r
+ /// System/*****/Graphics (やSounds/) というフォルダ構成を想定している。\r
+ /// もし再取得の結果、現在使用中のSkinのパス(strSystemSkinSubfloderFullName)が消えていた場合は、\r
+ /// 以下の優先順位で存在確認の上strSystemSkinSubfolderFullNameを再設定する。\r
+ /// 1. System/Default/\r
+ /// 2. System/*****/ で最初にenumerateされたもの\r
/// 3. System/ (従来互換)\r
/// </summary>\r
public void ReloadSkinPaths()\r
{\r
- string path;\r
- #region [ まず System/SkinFiles.*** をenumerateする ]\r
- path = System.IO.Path.Combine( CDTXMania.strEXEのあるフォルダ, "System" );\r
- string[] tempSkinSubfolders = System.IO.Directory.GetDirectories( path, PrefixSkinFolder + "*" );\r
- strSkinSubfolders = new string[ tempSkinSubfolders.Length ];\r
+ #region [ まず System/*** をenumerateする ]\r
+ string[] tempSkinSubfolders = System.IO.Directory.GetDirectories( strSystemSkinRoot, "*" );\r
+ strSystemSkinSubfolders = new string[ tempSkinSubfolders.Length ];\r
int size = 0;\r
- for ( int i = 0; i < strSkinSubfolders.Length; i++ )\r
+ for ( int i = 0; i < tempSkinSubfolders.Length; i++ )\r
{\r
#region [ 検出したフォルダがスキンフォルダかどうか確認する]\r
- string filePathTitle;\r
- filePathTitle = System.IO.Path.Combine( tempSkinSubfolders[i], @"Graphics\ScreenTitle background.jpg" );\r
- if ( !File.Exists( filePathTitle ) )\r
+ if ( !bIsValid( tempSkinSubfolders[ i ] ) )\r
continue;\r
#endregion\r
- #region [ スキンフォルダと確認できたものを、strSKinSubfoldersに入れる ]\r
- string[] spl = tempSkinSubfolders[ i ].Split( System.IO.Path.DirectorySeparatorChar );\r
- strSkinSubfolders[ size ] = spl[ spl.Length - 1 ]; // subfolder名から、~~/System/ までの部分を削除\r
- Trace.TraceInformation( "SkinPath検出: {0}", strSkinSubfolders[ size ] );\r
+ #region [ スキンフォルダと確認できたものを、strSkinSubfoldersに入れる ]\r
+ // フォルダ名末尾に必ず\をつけておくこと。さもないとConfig読み出し側(必ず\をつける)とマッチできない\r
+ if ( tempSkinSubfolders[ i ][ tempSkinSubfolders[ i ].Length - 1 ] != System.IO.Path.DirectorySeparatorChar )\r
+ {\r
+ tempSkinSubfolders[ i ] += System.IO.Path.DirectorySeparatorChar;\r
+ }\r
+ strSystemSkinSubfolders[ size ] = tempSkinSubfolders[ i ];\r
+ Trace.TraceInformation( "SkinPath検出: {0}", strSystemSkinSubfolders[ size ] );\r
size++;\r
#endregion\r
}\r
- Array.Resize( ref strSkinSubfolders, size );\r
- Array.Sort( strSkinSubfolders ); // BinarySearch実行前にSortが必要\r
+ Trace.TraceInformation( "SkinPath入力: {0}", strSystemSkinSubfolderFullName );\r
+ Array.Resize( ref strSystemSkinSubfolders, size );\r
+ Array.Sort( strSystemSkinSubfolders ); // BinarySearch実行前にSortが必要\r
#endregion\r
\r
- #region [ 次に、カレントのSkinパスが存在するか調べる。あれば終了。]\r
- if ( Array.BinarySearch( strSkinSubfolders, strSkinSubfolder,\r
+ #region [ 現在のSkinパスがbox.defスキンをCONFIG指定していた場合のために、最初にこれが有効かチェックする。有効ならこれを使う。 ]\r
+ if ( bIsValid( strSystemSkinSubfolderFullName ) &&\r
+ Array.BinarySearch( strSystemSkinSubfolders, strSystemSkinSubfolderFullName,\r
+ StringComparer.InvariantCultureIgnoreCase ) < 0 )\r
+ {\r
+ strBoxDefSkinSubfolders = new string[ 1 ]{ strSystemSkinSubfolderFullName };\r
+ return;\r
+ }\r
+ #endregion\r
+\r
+ #region [ 次に、現在のSkinパスが存在するか調べる。あれば終了。]\r
+ if ( Array.BinarySearch( strSystemSkinSubfolders, strSystemSkinSubfolderFullName,\r
StringComparer.InvariantCultureIgnoreCase ) >= 0 )\r
return;\r
#endregion\r
- #region [ カレントのSkinパスが消滅しているので、再設定する。]\r
+ #region [ カレントのSkinパスが消滅しているので、以下で再設定する。]\r
/// 以下の優先順位で現在使用中のSkinパスを再設定する。\r
- /// 1. System/SkinFiles.Default/\r
- /// 2. System/SkinFiles.*****/ で最初にenumerateされたもの\r
+ /// 1. System/Default/\r
+ /// 2. System/*****/ で最初にenumerateされたもの\r
/// 3. System/ (従来互換)\r
- #region [ System/SkinFiles.Default/ があるなら、そこにカレントSkinパスを設定する]\r
- if ( Array.BinarySearch( strSkinSubfolders, PrefixSkinFolder + "Default", StringComparer.InvariantCultureIgnoreCase ) >= 0 )\r
+ #region [ System/Default/ があるなら、そこにカレントSkinパスを設定する]\r
+ string tempSkinPath_default = System.IO.Path.Combine( strSystemSkinRoot, "Default" + System.IO.Path.DirectorySeparatorChar );\r
+ if ( Array.BinarySearch( strSystemSkinSubfolders, tempSkinPath_default, \r
+ StringComparer.InvariantCultureIgnoreCase ) >= 0 )\r
{\r
- strSkinSubfolder = PrefixSkinFolder + "Default";\r
+ strSystemSkinSubfolderFullName = tempSkinPath_default;\r
return;\r
}\r
#endregion\r
#region [ System/SkinFiles.*****/ で最初にenumerateされたものを、カレントSkinパスに再設定する ]\r
- if ( strSkinSubfolders.Length > 0 )\r
+ if ( strSystemSkinSubfolders.Length > 0 )\r
{\r
- strSkinSubfolder = strSkinSubfolders[ 0 ];\r
+ strSystemSkinSubfolderFullName = strSystemSkinSubfolders[ 0 ];\r
return;\r
}\r
#endregion\r
#region [ System/ に、カレントSkinパスを再設定する。]\r
- strSkinSubfolder = "";\r
+ strSystemSkinSubfolderFullName = strSystemSkinRoot;\r
#endregion\r
#endregion\r
}\r
\r
public static string Path( string strファイルの相対パス )\r
{\r
- if ( strBoxDefSkinSubfolderFullName == "" )\r
+ if ( strBoxDefSkinSubfolderFullName == "" || !bUseBoxDefSkin )\r
{\r
- return System.IO.Path.Combine( strSkinSubfolderFullName, strファイルの相対パス );\r
+ return System.IO.Path.Combine( strSystemSkinSubfolderFullName, strファイルの相対パス );\r
}\r
else\r
{\r
return System.IO.Path.Combine( strBoxDefSkinSubfolderFullName, strファイルの相対パス );\r
}\r
}\r
- \r
+\r
+ /// <summary>\r
+ /// フルパス名を与えると、スキン名として、ディレクトリ名末尾の要素を返す\r
+ /// 例: C:\foo\bar\ なら、barを返す\r
+ /// </summary>\r
+ /// <param name="skinpath">スキンが格納されたパス名(フルパス)</param>\r
+ /// <returns>スキン名</returns>\r
+ public static string GetSkinName( string skinPathFullName )\r
+ {\r
+ if ( skinPathFullName != null )\r
+ {\r
+ if ( skinPathFullName == "" ) // 「box.defで未定義」用\r
+ skinPathFullName = strSystemSkinSubfolderFullName;\r
+ string[] tmp = skinPathFullName.Split( System.IO.Path.DirectorySeparatorChar );\r
+ return tmp[ tmp.Length - 2 ]; // ディレクトリ名の最後から2番目の要素がスキン名(最後の要素はnull。元stringの末尾が\なので。)\r
+ }\r
+ return null;\r
+ }\r
+ public static string[] GetSkinName( string[] skinPathFullNames )\r
+ {\r
+ string[] ret = new string[ skinPathFullNames.Length ];\r
+ for ( int i = 0; i < skinPathFullNames.Length; i++ )\r
+ {\r
+ ret[ i ] = GetSkinName( skinPathFullNames[ i ] );\r
+ }\r
+ return ret;\r
+ }\r
+\r
+\r
+ public string GetSkinSubfolderFullNameFromSkinName( string skinName )\r
+ {\r
+ foreach ( string s in strSystemSkinSubfolders )\r
+ {\r
+ if ( GetSkinName( s ) == skinName )\r
+ return s;\r
+ }\r
+ foreach ( string b in strBoxDefSkinSubfolders )\r
+ {\r
+ if ( GetSkinName( b ) == skinName )\r
+ return b;\r
+ }\r
+ return null;\r
+ }\r
+\r
+ /// <summary>\r
+ /// スキンパス名が妥当かどうか\r
+ /// (タイトル画像にアクセスできるかどうかで判定する)\r
+ /// </summary>\r
+ /// <param name="skinPathFullName">妥当性を確認するスキンパス(フルパス)</param>\r
+ /// <returns>妥当ならtrue</returns>\r
+ public bool bIsValid( string skinPathFullName )\r
+ {\r
+ string filePathTitle;\r
+ filePathTitle = System.IO.Path.Combine( skinPathFullName, @"Graphics\ScreenTitle background.jpg" );\r
+ return ( File.Exists( filePathTitle ) );\r
+ }\r
+\r
#region [ IDisposable 実装 ]\r
//-----------------\r
public void Dispose()\r
}\r
}\r
}\r
+\r
+ //public void t再生中の処理をする_loop()\r
+ //{\r
+ // while ( true )\r
+ // {\r
+ // t再生中の処理をする();\r
+ // System.Threading.Thread.Sleep( 100 );\r
+ // }\r
+ //}\r
+\r
+ \r
public void tサウンドを破棄する( CSound sound )\r
{\r
lock( this.obj排他用 )\r