OSDN Git Service

#39816 Fixed below. (Basically I had to backup/restore QAuto.Index value when changin...
authoryyagi <yyagi.dtxmania@gmail.com>
Tue, 7 Jan 2020 17:34:51 +0000 (02:34 +0900)
committeryyagi <yyagi.dtxmania@gmail.com>
Tue, 7 Jan 2020 17:34:51 +0000 (02:34 +0900)
 * Changing Drum Auto also changes the Auto for Guitar and vice versa.
 * Changing Bass Auto does not change anything.
 * The text is missing from the menu.
 * "Auto BD" for Drum sets Auto to SD

BTW current code has many debug code. Refactor will be required.

DTXMania/コード/ステージ/05.選曲/CActSelectQuickConfig.cs

index b77caa7..d7f9c41 100644 (file)
@@ -14,6 +14,7 @@ namespace DTXMania
                readonly string QuickCfgTitle = "Quick Config";
                COptionStringList QTarget;
                COptionStringList QAuto;
+               STDGBSValue<int> QAutoIndex;    //QAuto.Indexの保持用
                List<COptionBase> lci;
                Font ft表示用フォント;
                CTexture txパネル本体;
@@ -40,6 +41,7 @@ namespace DTXMania
                        •More... 
                        •EXIT 
                        */
+                       QAuto = new COptionStringList("Custom");    // 以前はMakeListCItemBase()で初期化していたが、QAuto.Indexの保持のため、より上位で初期化するように変更
                        QTarget = new COptionStringList("Drums");
                        QTarget.Initialize("Target", "", new string[] { "Drums", "Guitar", "Bass" });
                        QTarget.OnEnterDelegate = () =>
@@ -47,54 +49,84 @@ namespace DTXMania
                                EPart nCurrentTarget = 0;
                                if (QTarget.Index == 0)
                                {
+                                       QAutoIndex.Bass = QAuto.Index;
+Trace.TraceInformation("QAutoIndex.Bass=" + QAutoIndex.Bass);
+                                       QAuto.Index = QAutoIndex.Drums;
+Trace.TraceInformation("QAuto,Index=" + QAuto.Index);
                                        nCurrentTarget = EPart.Drums;
                                }
                                else if (QTarget.Index == 1)
                                {
+                                       QAutoIndex.Drums = QAuto.Index;
+Trace.TraceInformation("QAutoIndex.Drums=" + QAutoIndex.Drums);
+                                       QAuto.Index = QAutoIndex.Guitar;
+Trace.TraceInformation("QAuto,Index=" + QAuto.Index);
                                        nCurrentTarget = EPart.Guitar;
                                }
                                else if (QTarget.Index == 2)
                                {
+                                       QAutoIndex.Guitar = QAuto.Index;
+Trace.TraceInformation("QAutoIndex.Guitar=" + QAutoIndex.Guitar);
+                                       QAuto.Index = QAutoIndex.Bass;
+Trace.TraceInformation("QAuto,Index=" + QAuto.Index);
                                        nCurrentTarget = EPart.Bass;
                                }
-                               lci = MakeListCItemBase(nCurrentTarget);
+                               lci = MakeListCItemBase(nCurrentTarget, false); // false: QAuto.Indexを初期化しない
+Trace.TraceInformation("AQAuto.Index=" + QAuto.Index);
                                // eInst = (E楽器パート) nCurrentTarget;
                                // ここではeInstは変えない。メニューを開いたタイミングでのみeInstを使う
                                Initialize(lci, true, QuickCfgTitle, n現在の選択行);
+Trace.TraceInformation("BQAuto.Index=" + QAuto.Index);
                                MakeAutoPanel();
+Trace.TraceInformation("CQAuto.Index=" + QAuto.Index);
                        };
                        lci = MakeListCItemBase(EPart.Drums);
                        // ConfSet=0, nInst=Drums
                        base.Initialize(lci, true, QuickCfgTitle, 2);
+                       QAutoIndex = new STDGBSValue<int>();  // Drums, Guitar, Bass
+                       QAutoIndex.Drums = GetAutoIndex(EPart.Drums);
+                       QAutoIndex.Guitar = GetAutoIndex(EPart.Guitar);
+                       QAutoIndex.Bass = GetAutoIndex(EPart.Bass);
+Trace.TraceInformation($"★ {QAutoIndex.Drums}, {QAutoIndex.Guitar}, {QAutoIndex.Bass}");
                }
 
-               private List<COptionBase> MakeListCItemBase(EPart nInst)
+               private List<COptionBase> MakeListCItemBase(EPart nInst, bool bInitQAutoIndex = true)
                {
                        List<COptionBase> ret = new List<COptionBase>();
 
-                       QAuto = new COptionStringList("Custom");
+                       //QAuto = new COptionStringList("Custom");
                        if (nInst == EPart.Drums)
                        {
                                string[] items_dr = new string[] { "All On", "Auto HH", "Auto BD", "Custom", "All Off" };
-                               int dr_init_idx = 3;
-                               if (CDTXMania.Instance.ConfigIni.bAutoPlay.IsAllTrue(EPart.Drums))
-                               {
-                                       dr_init_idx = 0;        // All On
-                               }
-                               else if (CDTXMania.Instance.ConfigIni.bAutoPlay.bIsAutoHH)
-                               {
-                                       dr_init_idx = 1;        // Auto HH
-                               }
-                               else if (CDTXMania.Instance.ConfigIni.bAutoPlay.bIsAutoBD)
+                               //int dr_init_idx = 3;
+                               //if (CDTXMania.Instance.ConfigIni.bAutoPlay.IsAllTrue(EPart.Drums))
+                               //{
+                               //      dr_init_idx = 0;        // All On
+                               //}
+                               //else if (CDTXMania.Instance.ConfigIni.bAutoPlay.bIsAutoHH)
+                               //{
+                               //      dr_init_idx = 1;        // Auto HH
+                               //}
+                               //else if (CDTXMania.Instance.ConfigIni.bAutoPlay.bIsAutoBD)
+                               //{
+                               //      dr_init_idx = 2;        // Auto BD
+                               //}
+                               //else if (CDTXMania.Instance.ConfigIni.bAutoPlay.IsAllFalse(EPart.Drums))
+                               //{
+                               //      dr_init_idx = 4;        // All Off
+                               //}
+Trace.TraceInformation("1QAuto.Index=" + QAuto.Index);
+                               QAuto.Initialize("Auto", "", items_dr);
+Trace.TraceInformation("xQAuto.Index=" + QAuto.Index);
+                               if (bInitQAutoIndex)
                                {
-                                       dr_init_idx = 2;        // Auto BD
+                                       QAuto.Index = GetAutoIndex(nInst);     //dr_init_idx;
                                }
-                               else if (CDTXMania.Instance.ConfigIni.bAutoPlay.IsAllFalse(EPart.Drums))
+                               else
                                {
-                                       dr_init_idx = 4;        // All Off
+                                       QAuto.Index = QAutoIndex.Drums;         // QAuto.Initialize()でIndexが初期化されるため、再設定する
                                }
-                               QAuto.Initialize("Auto", "", items_dr);
-                               QAuto.Index = dr_init_idx;
+Trace.TraceInformation("2QAuto.Index=" + QAuto.Index);
                                QAuto.OnEnterDelegate = () =>
                                {
                                        //if (QAuto.Value == "All On")
@@ -120,25 +152,31 @@ namespace DTXMania
                        {
                                string[] items_gt = new string[] { "All On", "Auto Pick", "Auto Neck", "Custom", "All Off" };
                                // 初期値の決定
-                               int gt_init_idx = 3;
-                               if (CDTXMania.Instance.ConfigIni.bAutoPlay.IsAllTrue(nInst))
-                               {
-                                       gt_init_idx = 0;
-                               }
-                               else if (CDTXMania.Instance.ConfigIni.bAutoPlay.bIsAutoPick(nInst))
-                               {
-                                       gt_init_idx = 1;
-                               }
-                               else if (CDTXMania.Instance.ConfigIni.bAutoPlay.bIsAutoNeck(nInst))
+                               //int gt_init_idx = 3;
+                               //if (CDTXMania.Instance.ConfigIni.bAutoPlay.IsAllTrue(nInst))
+                               //{
+                               //      gt_init_idx = 0;
+                               //}
+                               //else if (CDTXMania.Instance.ConfigIni.bAutoPlay.bIsAutoPick(nInst))
+                               //{
+                               //      gt_init_idx = 1;
+                               //}
+                               //else if (CDTXMania.Instance.ConfigIni.bAutoPlay.bIsAutoNeck(nInst))
+                               //{
+                               //      gt_init_idx = 2;
+                               //}
+                               //else if (CDTXMania.Instance.ConfigIni.bAutoPlay.IsAllFalse(nInst))
+                               //{
+                               //      gt_init_idx = 4;
+                               //}
+                               QAuto.Initialize("Auto", "", items_gt);
+                               if (bInitQAutoIndex)
                                {
-                                       gt_init_idx = 2;
+                                       QAuto.Index = GetAutoIndex(nInst);   //gt_init_idx;
                                }
-                               else if (CDTXMania.Instance.ConfigIni.bAutoPlay.IsAllFalse(nInst))
                                {
-                                       gt_init_idx = 4;
+                                       QAuto.Index = QAutoIndex[nInst];     // QAuto.Initialize()でIndexが初期化されるため、再設定する
                                }
-                               QAuto.Initialize("Auto", "", items_gt);
-                               QAuto.Index = gt_init_idx;
                                QAuto.OnEnterDelegate = () =>
                                {
                                        //if (QAuto.Value == "All On")
@@ -195,16 +233,80 @@ namespace DTXMania
                        return ret;
                }
 
+               /// <summary>
+               /// 現在のAuto設定状況から、AutoのIndex値を生成する (Auto HH? Auto BD? Auto Pick? ....)
+               /// ただし設定済みのAuto設定状況を使用するので注意。Auto項目をEnterで切り替えるだけではAuto設定は変化しない。
+               /// (Auto=Customの状態保持のために、そうしている)
+               /// </summary>
+               /// <param name="nInst"></param>
+               /// <returns></returns>
+               private int GetAutoIndex(EPart nInst)
+               {
+                       int init_idx = 3;
+                       if (nInst == EPart.Drums)
+                       {
+                               // 初期値の決定
+                               if (CDTXMania.Instance.ConfigIni.bAutoPlay.IsAllTrue(EPart.Drums))
+                               {
+                                       init_idx = 0;    // All On
+                               }
+                               else if (CDTXMania.Instance.ConfigIni.bAutoPlay.bIsAutoHH)
+                               {
+                                       init_idx = 1;    // Auto HH
+                               }
+                               else if (CDTXMania.Instance.ConfigIni.bAutoPlay.bIsAutoBD)
+                               {
+                                       init_idx = 2;    // Auto BD
+                               }
+                               else if (CDTXMania.Instance.ConfigIni.bAutoPlay.IsAllFalse(EPart.Drums))
+                               {
+                                       init_idx = 4;    // All Off
+                               }
+Trace.TraceInformation("GetAutoIndex: Drums: " + init_idx);
+                       }
+                       else if (nInst == EPart.Guitar || nInst == EPart.Bass)
+                       {
+                               // 初期値の決定
+                               if (CDTXMania.Instance.ConfigIni.bAutoPlay.IsAllTrue(nInst))
+                               {
+                                       init_idx = 0;   // All On
+                               }
+                               else if (CDTXMania.Instance.ConfigIni.bAutoPlay.bIsAutoPick(nInst))
+                               {
+                                       init_idx = 1;   // Auto Pick
+                               }
+                               else if (CDTXMania.Instance.ConfigIni.bAutoPlay.bIsAutoNeck(nInst))
+                               {
+                                       init_idx = 2;   // Auto Neck
+                               }
+                               else if (CDTXMania.Instance.ConfigIni.bAutoPlay.IsAllFalse(nInst))
+                               {
+                                       init_idx = 4;   // All Off
+                               }
+Trace.TraceInformation("GetAutoIndex: GtBs: " + init_idx);
+                       }
+                       else
+                       {
+                               throw new ArgumentOutOfRangeException();
+                       }
+                       return init_idx;
+               }
+
+
                // メソッド
                public override void tActivatePopupMenu(EPart einst)
                {
+                       // Activateすると、DrumsのAutoIndexだけ化けているので、Instance.Configiniから再取得する
+                       //QAutoIndex.Drums = GetAutoIndex(EPart.Drums);
+                       //QAutoIndex.Guitar = GetAutoIndex(EPart.Guitar);
+                       //QAutoIndex.Bass = GetAutoIndex(EPart.Bass);
+
                        this.CActSelectQuickConfigMain();
                        base.tActivatePopupMenu(einst);
                }
 
                /// <summary>
                /// Auto Modeにフォーカスを合わせているときだけ、AUTOの設定状態を表示する。
-               /// 現状はDrumでのみ表示。
                /// </summary>
                public override void t進行描画sub()
                {
@@ -309,21 +411,21 @@ namespace DTXMania
                        {
                                if (this.tx文字列パネル != null)
                                {
-                                       this.tx文字列パネル.Dispose();
+                                       TextureFactory.tテクスチャの解放(ref this.tx文字列パネル);
                                }
-                               this.tx文字列パネル = new CTexture(CDTXMania.Instance.Device, image, CDTXMania.Instance.TextureFormat);
+                               this.tx文字列パネル = new CTexture(CDTXMania.Instance.Device, image, CDTXMania.Instance.TextureFormat, "AutoStrings");
                                this.tx文字列パネル.vc拡大縮小倍率 = new Vector3(1f, 1f, 1f);
                                image.Dispose();
                        }
                        catch (CTextureCreateFailedException)
                        {
-                               Trace.TraceError("演奏履歴文字列テクスチャの作成に失敗しました。");
+                               Trace.TraceError("Quick Config: Autoパネルテクスチャの作成に失敗しました。");
                                this.tx文字列パネル = null;
                        }
                }
 
                /// <summary>
-               /// 簡易CONFIG内のAUTO状態を、文字列で返す。
+               /// 簡易CONFIG内のAUTO状態を、文字列で返す。(AAA___など)
                /// </summary>
                /// <param name="target">対象楽器</param>
                /// <returns>AutoならA,さもなくば_。この文字が複数並んだ文字列。</returns>
@@ -343,10 +445,10 @@ namespace DTXMania
                                                        s = "_AA_______";
                                                        break;
                                                case 2: // Auto BD
-                                                       s = "___A______";
+                                                       s = "____A_____";
                                                        break;
                                                case 3: // Custom
-                                                       // 本当は、現在のレーン順に合わせた表示順にしたいが・・・
+                                                               // 本当は、現在のレーン順に合わせた表示順にしたいが・・・
                                                        COptionBool[] e = new[] {
                                                                CDTXMania.Instance.ConfigIni.bAutoPlay.LC,
                                                                CDTXMania.Instance.ConfigIni.bAutoPlay.HH,
@@ -410,42 +512,55 @@ namespace DTXMania
                        return s;
                }
 
+
                /// <summary>
                /// ConfigIni.bAutoPlayに簡易CONFIGの状態を反映する
                /// </summary>
-               private void SetAutoParameters()
+               private void SetAutoParameters(EPart nInst)
                {
                        string s;
                        #region [Drums]
-                       s = GetAutoParameters(EPart.Drums);
-                       CDTXMania.Instance.ConfigIni.bAutoPlay.LC.Value = (s[0] == 'A'); s = s.Remove(0, 1);
-                       CDTXMania.Instance.ConfigIni.bAutoPlay.HH.Value = (s[0] == 'A'); s = s.Remove(0, 1);
-                       CDTXMania.Instance.ConfigIni.bAutoPlay.HHO.Value = (s[0] == 'A'); s = s.Remove(0, 1);
-                       CDTXMania.Instance.ConfigIni.bAutoPlay.SD.Value = (s[0] == 'A'); s = s.Remove(0, 1);
-                       CDTXMania.Instance.ConfigIni.bAutoPlay.BD.Value = (s[0] == 'A'); s = s.Remove(0, 1);
-                       CDTXMania.Instance.ConfigIni.bAutoPlay.HT.Value = (s[0] == 'A'); s = s.Remove(0, 1);
-                       CDTXMania.Instance.ConfigIni.bAutoPlay.LT.Value = (s[0] == 'A'); s = s.Remove(0, 1);
-                       CDTXMania.Instance.ConfigIni.bAutoPlay.FT.Value = (s[0] == 'A'); s = s.Remove(0, 1);
-                       CDTXMania.Instance.ConfigIni.bAutoPlay.CY.Value = (s[0] == 'A'); s = s.Remove(0, 1);
-                       CDTXMania.Instance.ConfigIni.bAutoPlay.RD.Value = (s[0] == 'A'); s = s.Remove(0, 1);
+                       if (nInst == EPart.Drums)
+                       {
+                               s = GetAutoParameters(EPart.Drums);
+                               CDTXMania.Instance.ConfigIni.bAutoPlay.LC.Value = (s[0] == 'A'); s = s.Remove(0, 1);
+                               CDTXMania.Instance.ConfigIni.bAutoPlay.HH.Value = (s[0] == 'A'); s = s.Remove(0, 1);
+                               CDTXMania.Instance.ConfigIni.bAutoPlay.HHO.Value = (s[0] == 'A'); s = s.Remove(0, 1);
+                               CDTXMania.Instance.ConfigIni.bAutoPlay.SD.Value = (s[0] == 'A'); s = s.Remove(0, 1);
+                               CDTXMania.Instance.ConfigIni.bAutoPlay.BD.Value = (s[0] == 'A'); s = s.Remove(0, 1);
+                               CDTXMania.Instance.ConfigIni.bAutoPlay.HT.Value = (s[0] == 'A'); s = s.Remove(0, 1);
+                               CDTXMania.Instance.ConfigIni.bAutoPlay.LT.Value = (s[0] == 'A'); s = s.Remove(0, 1);
+                               CDTXMania.Instance.ConfigIni.bAutoPlay.FT.Value = (s[0] == 'A'); s = s.Remove(0, 1);
+                               CDTXMania.Instance.ConfigIni.bAutoPlay.CY.Value = (s[0] == 'A'); s = s.Remove(0, 1);
+                               CDTXMania.Instance.ConfigIni.bAutoPlay.RD.Value = (s[0] == 'A'); //s = s.Remove(0, 1);
+                       }
                        #endregion
                        #region [Guitar]
-                       s = GetAutoParameters(EPart.Guitar);
-                       CDTXMania.Instance.ConfigIni.bAutoPlay.GtR.Value = (s[0] == 'A'); s = s.Remove(0, 1);
-                       CDTXMania.Instance.ConfigIni.bAutoPlay.GtG.Value = (s[0] == 'A'); s = s.Remove(0, 1);
-                       CDTXMania.Instance.ConfigIni.bAutoPlay.GtB.Value = (s[0] == 'A'); s = s.Remove(0, 1);
-                       CDTXMania.Instance.ConfigIni.bAutoPlay.GtPick.Value = (s[0] == 'A'); s = s.Remove(0, 1);
-                       CDTXMania.Instance.ConfigIni.bAutoPlay.GtWail.Value = (s[0] == 'A'); s = s.Remove(0, 1);
+                       else if (nInst == EPart.Guitar)
+                       {
+                               s = GetAutoParameters(EPart.Guitar);
+                               CDTXMania.Instance.ConfigIni.bAutoPlay.GtR.Value = (s[0] == 'A'); s = s.Remove(0, 1);
+                               CDTXMania.Instance.ConfigIni.bAutoPlay.GtG.Value = (s[0] == 'A'); s = s.Remove(0, 1);
+                               CDTXMania.Instance.ConfigIni.bAutoPlay.GtB.Value = (s[0] == 'A'); s = s.Remove(0, 1);
+                               CDTXMania.Instance.ConfigIni.bAutoPlay.GtPick.Value = (s[0] == 'A'); s = s.Remove(0, 1);
+                               CDTXMania.Instance.ConfigIni.bAutoPlay.GtWail.Value = (s[0] == 'A'); //s = s.Remove(0, 1);
+                       }
                        #endregion
                        #region [Bass]
-                       s = GetAutoParameters(EPart.Bass);
-                       CDTXMania.Instance.ConfigIni.bAutoPlay.GtR.Value = (s[0] == 'A'); s = s.Remove(0, 1);
-                       CDTXMania.Instance.ConfigIni.bAutoPlay.GtG.Value = (s[0] == 'A'); s = s.Remove(0, 1);
-                       CDTXMania.Instance.ConfigIni.bAutoPlay.GtB.Value = (s[0] == 'A'); s = s.Remove(0, 1);
-                       CDTXMania.Instance.ConfigIni.bAutoPlay.GtPick.Value = (s[0] == 'A'); s = s.Remove(0, 1);
-                       CDTXMania.Instance.ConfigIni.bAutoPlay.GtWail.Value = (s[0] == 'A'); s = s.Remove(0, 1);
+                       else if (nInst == EPart.Bass)
+                       {
+                               s = GetAutoParameters(EPart.Bass);
+                               CDTXMania.Instance.ConfigIni.bAutoPlay.BsR.Value = (s[0] == 'A'); s = s.Remove(0, 1);
+                               CDTXMania.Instance.ConfigIni.bAutoPlay.BsG.Value = (s[0] == 'A'); s = s.Remove(0, 1);
+                               CDTXMania.Instance.ConfigIni.bAutoPlay.BsB.Value = (s[0] == 'A'); s = s.Remove(0, 1);
+                               CDTXMania.Instance.ConfigIni.bAutoPlay.BsPick.Value = (s[0] == 'A'); s = s.Remove(0, 1);
+                               CDTXMania.Instance.ConfigIni.bAutoPlay.BsWail.Value = (s[0] == 'A'); //s = s.Remove(0, 1);
+                       }
                        #endregion
-
+                       else
+                       {
+                               throw new ArgumentOutOfRangeException();
+                       }
                        //for (EPart target = EPart.Guitar; target < EPart.Bass; target++)
                        //{
                        //      s += GetAutoParameters(target);
@@ -458,6 +573,19 @@ namespace DTXMania
                        //      CDTXMania.Instance.ConfigIni.bAutoPlay[i].Value = (s[j++] == 'A') ? true : false;
                        //}
                }
+               private void SetAutoParameters()
+               {
+                       QAutoIndex[(EPart)(QTarget.Index)] = QAuto.Index;
+
+                       QAuto.Index = QAutoIndex[EPart.Drums];
+                       SetAutoParameters(EPart.Drums);
+                       QAuto.Index = QAutoIndex[EPart.Guitar];
+                       SetAutoParameters(EPart.Guitar);
+                       QAuto.Index = QAutoIndex[EPart.Bass];
+                       SetAutoParameters(EPart.Bass);
+               }
+
+
 
                // CActivity 実装
 
@@ -491,6 +619,10 @@ namespace DTXMania
                                string pathパネル本体 = CSkin.Path(@"Graphics\ScreenSelect popup auto settings.png");
                                if (File.Exists(pathパネル本体))
                                {
+                                       if (this.txパネル本体 != null)
+                                       {
+                                               this.txパネル本体.Dispose();
+                                       }
                                        this.txパネル本体 = TextureFactory.tテクスチャの生成(pathパネル本体, true);
                                }
                                base.OnManagedリソースの作成();