OSDN Git Service

#xxxxx songs.dbにBPMの情報を含めるよう修正。
authoryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Sun, 6 May 2012 15:09:11 +0000 (15:09 +0000)
committeryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Sun, 6 May 2012 15:09:11 +0000 (15:09 +0000)
#28198 songs.dbに曲の演奏時間の情報を含められるような仕込みを実施。(Enumerating Songsの時間が10倍行かないくらいかかるようになってしまうため、時間情報として0を固定的に入れている)
#28195 box.defで指定しているスキンも、CONFIG画面から選択できるよう変更。これに伴い、スキンパス名の内部管理を相対パスから絶対パスに変更。
#28195 box.defによるスキンの自動変更可否をCONFIGで設定できるよう変更。
#23577 Sound管理.t再生中の処理をする()を別スレッドで実行する試作(を注釈化したもの)を追加。

git-svn-id: http://svn.osdn.jp/svnroot/dtxmania/trunk@401 16f42ceb-6dc6-49c8-ba94-f2d53467949d

12 files changed:
DTXManiaプロジェクト/DTXManiaプロジェクト.csproj
DTXManiaプロジェクト/コード/スコア、曲/CDTX.cs
DTXManiaプロジェクト/コード/スコア、曲/CSong管理.cs
DTXManiaプロジェクト/コード/ステージ/04.コンフィグ/CActConfigList.cs
DTXManiaプロジェクト/コード/ステージ/05.選曲/CActSelect曲リスト.cs
DTXManiaプロジェクト/コード/ステージ/10.ChangeSkin/CStageChangeSkin.cs
DTXManiaプロジェクト/コード/全体/CConfigIni.cs
DTXManiaプロジェクト/コード/全体/CDTXMania.cs
DTXManiaプロジェクト/コード/全体/CSkin.cs
FDK17プロジェクト/コード/03.サウンド/CSound管理.cs
実行時フォルダ/DTXManiaGR.exe
実行時フォルダ/FDK.dll

index d30d681..0f6379e 100644 (file)
@@ -65,6 +65,7 @@
     <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
index 2543d80..d4176e0 100644 (file)
@@ -3455,7 +3455,14 @@ namespace DTXMania
                                }\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
@@ -3555,7 +3562,7 @@ namespace DTXMania
                                                !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
@@ -3567,6 +3574,10 @@ namespace DTXMania
                                        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
index d278dd5..576f838 100644 (file)
@@ -418,8 +418,21 @@ namespace DTXMania
                                                        }\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
@@ -504,8 +517,21 @@ namespace DTXMania
                                        }\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
@@ -868,7 +894,33 @@ namespace DTXMania
                //-----------------\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
@@ -938,6 +990,11 @@ namespace DTXMania
                                        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
@@ -1620,6 +1677,7 @@ Debug.WriteLine( dBPM + ":" + c曲リストノード.strタイトル );
                #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
index 3684fa5..c26fa60 100644 (file)
@@ -190,13 +190,27 @@ namespace DTXMania
                                "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
@@ -978,6 +992,10 @@ namespace DTXMania
                                                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
@@ -992,10 +1010,7 @@ namespace DTXMania
                        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
@@ -1219,19 +1234,26 @@ namespace DTXMania
                        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
@@ -1257,7 +1279,7 @@ namespace DTXMania
                        \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
@@ -1680,6 +1702,7 @@ namespace DTXMania
 \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
@@ -1736,6 +1759,7 @@ namespace DTXMania
                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
@@ -1828,13 +1852,20 @@ namespace DTXMania
                        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
index f0c8e8d..c7890a2 100644 (file)
@@ -189,13 +189,27 @@ namespace DTXMania
 \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
@@ -207,13 +221,29 @@ namespace DTXMania
                }\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
@@ -1052,7 +1082,7 @@ namespace DTXMania
                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
index f46e757..d58a51b 100644 (file)
@@ -79,7 +79,7 @@ namespace DTXMania
                                }\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
index 10c2f3a..f6d2575 100644 (file)
@@ -4,6 +4,7 @@ using System.Text;
 using System.Runtime.InteropServices;\r
 using System.IO;\r
 using System.Diagnostics;\r
+using System.Web;\r
 using FDK;\r
 \r
 namespace DTXMania\r
@@ -482,7 +483,8 @@ namespace DTXMania
                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
@@ -1017,7 +1019,8 @@ namespace DTXMania
                        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
@@ -1083,17 +1086,30 @@ namespace DTXMania
                        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
@@ -1718,13 +1734,31 @@ namespace DTXMania
                                                                                        }\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
index f42eb88..94fadc0 100644 (file)
@@ -1518,8 +1518,8 @@ for (int i = 0; i < 3; i++) {
                        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
@@ -1787,6 +1787,13 @@ for (int i = 0; i < 3; i++) {
                        //---------------------\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
index 08ea3d3..b9aaddd 100644 (file)
@@ -32,8 +32,6 @@ namespace DTXMania
 \r
        internal class CSkin : IDisposable\r
        {\r
-               public static string PrefixSkinFolder = "";             // "SkinFiles.";\r
-\r
                // クラス\r
 \r
                public class Cシステムサウンド : IDisposable\r
@@ -418,35 +416,109 @@ namespace DTXMania
                        }\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
@@ -459,8 +531,8 @@ namespace DTXMania
                {\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
@@ -520,66 +592,79 @@ namespace DTXMania
 \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
@@ -588,16 +673,72 @@ namespace DTXMania
 \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
index 37b2a95..18990f3 100644 (file)
@@ -133,6 +133,17 @@ namespace FDK
                                }\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
index c263e3c..3bd10ff 100644 (file)
Binary files a/実行時フォルダ/DTXManiaGR.exe and b/実行時フォルダ/DTXManiaGR.exe differ
index 24cbf85..4bb6583 100644 (file)
Binary files a/実行時フォルダ/FDK.dll and b/実行時フォルダ/FDK.dll differ