OSDN Git Service

#28821 DTXCから「BGMのみ再生する」機能で呼び出すとエラーが発生する問題を修正。
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / ステージ / 07.演奏 / CStage演奏画面共通.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 using System.Runtime;\r
5 using System.Runtime.InteropServices;\r
6 using System.Drawing;\r
7 using System.Drawing.Imaging;\r
8 using System.IO;\r
9 using System.Diagnostics;\r
10 using System.Threading;\r
11 using SlimDX;\r
12 using SlimDX.Direct3D9;\r
13 using FDK;\r
14 \r
15 namespace DTXMania\r
16 {\r
17         /// <summary>\r
18         /// 演奏画面の共通クラス (ドラム演奏画面, ギター演奏画面の継承元)\r
19         /// </summary>\r
20         internal abstract class CStage演奏画面共通 : CStage\r
21         {\r
22                 // プロパティ\r
23 \r
24                 public bool bAUTOでないチップが1つでもバーを通過した // 誰も参照していない??\r
25                 {\r
26                         get;\r
27                         protected set;\r
28                 }\r
29 \r
30                 // メソッド\r
31 \r
32                 #region [ t演奏結果を格納する・ドラム() ]\r
33                 public void t演奏結果を格納する・ドラム( out CScoreIni.C演奏記録 Drums )\r
34                 {\r
35                         Drums = new CScoreIni.C演奏記録();\r
36 \r
37                         if ( CDTXMania.DTX.bチップがある.Drums && !CDTXMania.ConfigIni.bギタレボモード )\r
38                         {\r
39                                 Drums.nスコア = (long) this.actScore.Get( E楽器パート.DRUMS );\r
40                                 Drums.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す( CDTXMania.DTX.LEVEL.Drums, CDTXMania.DTX.n可視チップ数.Drums, this.nヒット数・Auto含まない.Drums.Perfect, this.actCombo.n現在のコンボ数.Drums最高値, E楽器パート.DRUMS, bIsAutoPlay );\r
41                                 Drums.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す( CDTXMania.DTX.n可視チップ数.Drums, this.nヒット数・Auto含まない.Drums.Perfect, this.nヒット数・Auto含まない.Drums.Great, this.nヒット数・Auto含まない.Drums.Good, this.nヒット数・Auto含まない.Drums.Poor, this.nヒット数・Auto含まない.Drums.Miss, E楽器パート.DRUMS, bIsAutoPlay );\r
42                                 Drums.nPerfect数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Perfect : this.nヒット数・Auto含まない.Drums.Perfect;\r
43                                 Drums.nGreat数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Great : this.nヒット数・Auto含まない.Drums.Great;\r
44                                 Drums.nGood数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Good : this.nヒット数・Auto含まない.Drums.Good;\r
45                                 Drums.nPoor数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Poor : this.nヒット数・Auto含まない.Drums.Poor;\r
46                                 Drums.nMiss数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Miss : this.nヒット数・Auto含まない.Drums.Miss;\r
47                                 Drums.nPerfect数・Auto含まない = this.nヒット数・Auto含まない.Drums.Perfect;\r
48                                 Drums.nGreat数・Auto含まない = this.nヒット数・Auto含まない.Drums.Great;\r
49                                 Drums.nGood数・Auto含まない = this.nヒット数・Auto含まない.Drums.Good;\r
50                                 Drums.nPoor数・Auto含まない = this.nヒット数・Auto含まない.Drums.Poor;\r
51                                 Drums.nMiss数・Auto含まない = this.nヒット数・Auto含まない.Drums.Miss;\r
52                                 Drums.n最大コンボ数 = this.actCombo.n現在のコンボ数.Drums最高値;\r
53                                 Drums.n全チップ数 = CDTXMania.DTX.n可視チップ数.Drums;\r
54                                 for ( int i = 0; i < (int) Eレーン.MAX;  i++ )\r
55                                 {\r
56                                         Drums.bAutoPlay[ i ] = bIsAutoPlay[ i ];\r
57                                 }\r
58                                 Drums.bTight = CDTXMania.ConfigIni.bTight;\r
59                                 for ( int i = 0; i < 3; i++ )\r
60                                 {\r
61                                         Drums.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];\r
62                                         Drums.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];\r
63                                         Drums.eInvisible[ i ] = CDTXMania.ConfigIni.eInvisible[ i ];\r
64                                         Drums.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];\r
65                                         Drums.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];\r
66                                         Drums.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];\r
67                                         Drums.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];\r
68                                         Drums.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;\r
69                                 }\r
70                                 Drums.eDark = CDTXMania.ConfigIni.eDark;\r
71                                 Drums.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;\r
72                                 Drums.n演奏速度分母 = 20;\r
73                                 Drums.eHHGroup = CDTXMania.ConfigIni.eHHGroup;\r
74                                 Drums.eFTGroup = CDTXMania.ConfigIni.eFTGroup;\r
75                                 Drums.eCYGroup = CDTXMania.ConfigIni.eCYGroup;\r
76                                 Drums.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;\r
77                                 Drums.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;\r
78                                 Drums.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;\r
79                                 Drums.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;\r
80                                 Drums.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;\r
81                                 Drums.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;\r
82                                 Drums.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;\r
83                                 Drums.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Drums;\r
84                                 Drums.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Drums;\r
85                                 Drums.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Drums;\r
86                                 Drums.b演奏にマウスを使用した = this.b演奏にマウスを使った.Drums;\r
87                                 Drums.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;\r
88                                 Drums.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;\r
89                                 Drums.nGoodになる範囲ms = CDTXMania.nGood範囲ms;\r
90                                 Drums.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;\r
91                                 Drums.strDTXManiaのバージョン = CDTXMania.VERSION;\r
92                                 Drums.最終更新日時 = DateTime.Now.ToString();\r
93                                 Drums.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Drums );\r
94                         }\r
95                 }\r
96                 #endregion\r
97                 #region [ t演奏結果を格納する・ギター() ]\r
98                 public void t演奏結果を格納する・ギター( out CScoreIni.C演奏記録 Guitar )\r
99                 {\r
100                         Guitar = new CScoreIni.C演奏記録();\r
101 \r
102                         if ( CDTXMania.DTX.bチップがある.Guitar )\r
103                         {\r
104                                 Guitar.nスコア = (long) this.actScore.Get( E楽器パート.GUITAR );\r
105                                 Guitar.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す( CDTXMania.DTX.LEVEL.Guitar, CDTXMania.DTX.n可視チップ数.Guitar, this.nヒット数・Auto含まない.Guitar.Perfect, this.actCombo.n現在のコンボ数.Guitar最高値, E楽器パート.GUITAR, bIsAutoPlay );\r
106                                 Guitar.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す( CDTXMania.DTX.n可視チップ数.Guitar, this.nヒット数・Auto含まない.Guitar.Perfect, this.nヒット数・Auto含まない.Guitar.Great, this.nヒット数・Auto含まない.Guitar.Good, this.nヒット数・Auto含まない.Guitar.Poor, this.nヒット数・Auto含まない.Guitar.Miss, E楽器パート.GUITAR, bIsAutoPlay );\r
107                                 Guitar.nPerfect数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数・Auto含む.Guitar.Perfect : this.nヒット数・Auto含まない.Guitar.Perfect;\r
108                                 Guitar.nGreat数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数・Auto含む.Guitar.Great : this.nヒット数・Auto含まない.Guitar.Great;\r
109                                 Guitar.nGood数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数・Auto含む.Guitar.Good : this.nヒット数・Auto含まない.Guitar.Good;\r
110                                 Guitar.nPoor数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数・Auto含む.Guitar.Poor : this.nヒット数・Auto含まない.Guitar.Poor;\r
111                                 Guitar.nMiss数 = CDTXMania.ConfigIni.bギターが全部オートプレイである ? this.nヒット数・Auto含む.Guitar.Miss : this.nヒット数・Auto含まない.Guitar.Miss;\r
112                                 Guitar.nPerfect数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Perfect;\r
113                                 Guitar.nGreat数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Great;\r
114                                 Guitar.nGood数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Good;\r
115                                 Guitar.nPoor数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Poor;\r
116                                 Guitar.nMiss数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Miss;\r
117                                 Guitar.n最大コンボ数 = this.actCombo.n現在のコンボ数.Guitar最高値;\r
118                                 Guitar.n全チップ数 = CDTXMania.DTX.n可視チップ数.Guitar;\r
119                                 for ( int i = 0; i < (int) Eレーン.MAX; i++ )\r
120                                 {\r
121                                         Guitar.bAutoPlay[ i ] = bIsAutoPlay[ i ];\r
122                                 }\r
123                                 Guitar.bTight = CDTXMania.ConfigIni.bTight;\r
124                                 for ( int i = 0; i < 3; i++ )\r
125                                 {\r
126                                         Guitar.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];\r
127                                         Guitar.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];\r
128                                         Guitar.eInvisible[ i ] = CDTXMania.ConfigIni.eInvisible[ i ];\r
129                                         Guitar.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];\r
130                                         Guitar.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];\r
131                                         Guitar.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];\r
132                                         Guitar.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];\r
133                                         Guitar.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;\r
134                                 }\r
135                                 Guitar.eDark = CDTXMania.ConfigIni.eDark;\r
136                                 Guitar.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;\r
137                                 Guitar.n演奏速度分母 = 20;\r
138                                 Guitar.eHHGroup = CDTXMania.ConfigIni.eHHGroup;\r
139                                 Guitar.eFTGroup = CDTXMania.ConfigIni.eFTGroup;\r
140                                 Guitar.eCYGroup = CDTXMania.ConfigIni.eCYGroup;\r
141                                 Guitar.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;\r
142                                 Guitar.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;\r
143                                 Guitar.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;\r
144                                 Guitar.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;\r
145                                 Guitar.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;\r
146                                 Guitar.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;\r
147                                 Guitar.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;\r
148                                 Guitar.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Guitar;\r
149                                 Guitar.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Guitar;\r
150                                 Guitar.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Guitar;\r
151                                 Guitar.b演奏にマウスを使用した = this.b演奏にマウスを使った.Guitar;\r
152                                 Guitar.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;\r
153                                 Guitar.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;\r
154                                 Guitar.nGoodになる範囲ms = CDTXMania.nGood範囲ms;\r
155                                 Guitar.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;\r
156                                 Guitar.strDTXManiaのバージョン = CDTXMania.VERSION;\r
157                                 Guitar.最終更新日時 = DateTime.Now.ToString();\r
158                                 Guitar.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Guitar );\r
159                         }\r
160                 }\r
161                 #endregion\r
162                 #region [ t演奏結果を格納する・ベース() ]\r
163                 public void t演奏結果を格納する・ベース( out CScoreIni.C演奏記録 Bass )\r
164                 {\r
165                         Bass = new CScoreIni.C演奏記録();\r
166 \r
167                         if ( CDTXMania.DTX.bチップがある.Bass )\r
168                         {\r
169                                 Bass.nスコア = (long) this.actScore.Get( E楽器パート.BASS );\r
170                                 Bass.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す( CDTXMania.DTX.LEVEL.Bass, CDTXMania.DTX.n可視チップ数.Bass, this.nヒット数・Auto含まない.Bass.Perfect, this.actCombo.n現在のコンボ数.Bass最高値, E楽器パート.BASS, bIsAutoPlay );\r
171                                 Bass.db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す( CDTXMania.DTX.n可視チップ数.Bass, this.nヒット数・Auto含まない.Bass.Perfect, this.nヒット数・Auto含まない.Bass.Great, this.nヒット数・Auto含まない.Bass.Good, this.nヒット数・Auto含まない.Bass.Poor, this.nヒット数・Auto含まない.Bass.Miss, E楽器パート.BASS, bIsAutoPlay );\r
172                                 Bass.nPerfect数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数・Auto含む.Bass.Perfect : this.nヒット数・Auto含まない.Bass.Perfect;\r
173                                 Bass.nGreat数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数・Auto含む.Bass.Great : this.nヒット数・Auto含まない.Bass.Great;\r
174                                 Bass.nGood数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数・Auto含む.Bass.Good : this.nヒット数・Auto含まない.Bass.Good;\r
175                                 Bass.nPoor数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数・Auto含む.Bass.Poor : this.nヒット数・Auto含まない.Bass.Poor;\r
176                                 Bass.nMiss数 = CDTXMania.ConfigIni.bベースが全部オートプレイである ? this.nヒット数・Auto含む.Bass.Miss : this.nヒット数・Auto含まない.Bass.Miss;\r
177                                 Bass.nPerfect数・Auto含まない = this.nヒット数・Auto含まない.Bass.Perfect;\r
178                                 Bass.nGreat数・Auto含まない = this.nヒット数・Auto含まない.Bass.Great;\r
179                                 Bass.nGood数・Auto含まない = this.nヒット数・Auto含まない.Bass.Good;\r
180                                 Bass.nPoor数・Auto含まない = this.nヒット数・Auto含まない.Bass.Poor;\r
181                                 Bass.nMiss数・Auto含まない = this.nヒット数・Auto含まない.Bass.Miss;\r
182                                 Bass.n最大コンボ数 = this.actCombo.n現在のコンボ数.Bass最高値;\r
183                                 Bass.n全チップ数 = CDTXMania.DTX.n可視チップ数.Bass;\r
184                                 for ( int i = 0; i < (int) Eレーン.MAX; i++ )\r
185                                 {\r
186                                         Bass.bAutoPlay[ i ] = bIsAutoPlay[ i ];\r
187                                 }\r
188                                 Bass.bTight = CDTXMania.ConfigIni.bTight;\r
189                                 for ( int i = 0; i < 3; i++ )\r
190                                 {\r
191                                         Bass.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];\r
192                                         Bass.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];\r
193                                         Bass.eInvisible[ i ] = CDTXMania.ConfigIni.eInvisible[ i ];\r
194                                         Bass.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];\r
195                                         Bass.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];\r
196                                         Bass.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];\r
197                                         Bass.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];\r
198                                         Bass.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;\r
199                                 }\r
200                                 Bass.eDark = CDTXMania.ConfigIni.eDark;\r
201                                 Bass.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;\r
202                                 Bass.n演奏速度分母 = 20;\r
203                                 Bass.eHHGroup = CDTXMania.ConfigIni.eHHGroup;\r
204                                 Bass.eFTGroup = CDTXMania.ConfigIni.eFTGroup;\r
205                                 Bass.eCYGroup = CDTXMania.ConfigIni.eCYGroup;\r
206                                 Bass.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;\r
207                                 Bass.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;\r
208                                 Bass.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;\r
209                                 Bass.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;\r
210                                 Bass.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;\r
211                                 Bass.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;\r
212                                 Bass.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;\r
213                                 Bass.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Bass;                        // #24280 2011.1.29 yyagi\r
214                                 Bass.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Bass;                          //\r
215                                 Bass.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Bass;          //\r
216                                 Bass.b演奏にマウスを使用した = this.b演奏にマウスを使った.Bass;                                    //\r
217                                 Bass.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;\r
218                                 Bass.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;\r
219                                 Bass.nGoodになる範囲ms = CDTXMania.nGood範囲ms;\r
220                                 Bass.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;\r
221                                 Bass.strDTXManiaのバージョン = CDTXMania.VERSION;\r
222                                 Bass.最終更新日時 = DateTime.Now.ToString();\r
223                                 Bass.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Bass );\r
224                         }\r
225                 }\r
226                 #endregion\r
227 \r
228                 // CStage 実装\r
229 \r
230                 public override void On活性化()\r
231                 {\r
232                         listChip = CDTXMania.DTX.listChip;\r
233                         listWAV = CDTXMania.DTX.listWAV;\r
234 \r
235                         this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.継続;\r
236                         this.n現在のトップChip = ( listChip.Count > 0 ) ? 0 : -1;\r
237                         this.L最後に再生したHHの実WAV番号 = new List<int>( 16 );\r
238                         this.n最後に再生したHHのチャンネル番号 = 0;\r
239                         this.n最後に再生した実WAV番号.Guitar = -1;\r
240                         this.n最後に再生した実WAV番号.Bass = -1;\r
241                         for ( int i = 0; i < 50; i++ )\r
242                         {\r
243                                 this.n最後に再生したBGMの実WAV番号[ i ] = -1;\r
244                         }\r
245                         this.r次にくるギターChip = null;\r
246                         this.r次にくるベースChip = null;\r
247                         for ( int j = 0; j < 10; j++ )\r
248                         {\r
249                                 this.r現在の空うちドラムChip[ j ] = null;\r
250                         }\r
251                         this.r現在の空うちギターChip = null;\r
252                         this.r現在の空うちベースChip = null;\r
253                         cInvisibleChip = new CInvisibleChip( CDTXMania.ConfigIni.nDisplayTimesMs, CDTXMania.ConfigIni.nFadeoutTimeMs );\r
254                         for ( int k = 0; k < 3; k++ )\r
255                         {\r
256                                 //for ( int n = 0; n < 5; n++ )\r
257                                 //{\r
258                                         this.nヒット数・Auto含まない[ k ] = new CHITCOUNTOFRANK();\r
259                                         this.nヒット数・Auto含む[ k ] = new CHITCOUNTOFRANK();\r
260                                 //}\r
261                                 this.queWailing[ k ] = new Queue<CDTX.CChip>();\r
262                                 this.r現在の歓声Chip[ k ] = null;\r
263                                 cInvisibleChip.eInvisibleMode[ k ] = CDTXMania.ConfigIni.eInvisible[ k ];\r
264                         }\r
265                         for ( int i = 0; i < 3; i++ )\r
266                         {\r
267                                 this.b演奏にキーボードを使った[ i ] = false;\r
268                                 this.b演奏にジョイパッドを使った[ i ] = false;\r
269                                 this.b演奏にMIDI入力を使った[ i ] = false;\r
270                                 this.b演奏にマウスを使った[ i ] = false;\r
271                         }\r
272                         this.bAUTOでないチップが1つでもバーを通過した = false;\r
273                         cInvisibleChip.Reset();\r
274                         base.On活性化();\r
275                         this.tステータスパネルの選択();\r
276                         this.tパネル文字列の設定();\r
277 \r
278                         this.nInputAdjustTimeMs.Drums = CDTXMania.ConfigIni.nInputAdjustTimeMs.Drums;           // #23580 2011.1.3 yyagi\r
279                         this.nInputAdjustTimeMs.Guitar = CDTXMania.ConfigIni.nInputAdjustTimeMs.Guitar;         //        2011.1.7 ikanick 修正\r
280                         this.nInputAdjustTimeMs.Bass = CDTXMania.ConfigIni.nInputAdjustTimeMs.Bass;                     //\r
281                         this.nJudgeLinePosY_delta.Drums  = CDTXMania.ConfigIni.nJudgeLinePosOffset.Drums;       // #31602 2013.6.23 yyagi\r
282                         this.nJudgeLinePosY_delta.Guitar = CDTXMania.ConfigIni.nJudgeLinePosOffset.Guitar;      //\r
283                         this.nJudgeLinePosY_delta.Bass   = CDTXMania.ConfigIni.nJudgeLinePosOffset.Bass;        //\r
284                         this.bIsAutoPlay = CDTXMania.ConfigIni.bAutoPlay;                                                                       // #24239 2011.1.23 yyagi\r
285                         //this.bIsAutoPlay.Guitar = CDTXMania.ConfigIni.bギターが全部オートプレイである;\r
286                         //this.bIsAutoPlay.Bass = CDTXMania.ConfigIni.bベースが全部オートプレイである;\r
287 //                      this.nRisky = CDTXMania.ConfigIni.nRisky;                                                                                       // #23559 2011.7.28 yyagi\r
288                         actGauge.Init( CDTXMania.ConfigIni.nRisky );                                                                    // #23559 2011.7.28 yyagi\r
289                         this.nPolyphonicSounds = CDTXMania.ConfigIni.nPoliphonicSounds;\r
290 \r
291                         CDTXMania.Skin.tRemoveMixerAll();       // 効果音のストリームをミキサーから解除しておく\r
292 \r
293                         queueMixerSound = new Queue<stmixer>( 64 );\r
294                         bIsDirectSound = ( CDTXMania.Sound管理.GetCurrentSoundDeviceType() == "DirectSound" );\r
295                         db再生速度 = ( (double) CDTXMania.ConfigIni.n演奏速度 ) / 20.0;\r
296                         bValidScore = (CDTXMania.DTXVmode.Enabled)? false : true;\r
297 \r
298                         #region [ 演奏開始前にmixer登録しておくべきサウンド(開幕してすぐに鳴らすことになるチップ音)を登録しておく ]\r
299                         foreach ( CDTX.CChip pChip in listChip )\r
300                         {\r
301 //                              Debug.WriteLine( "CH=" + pChip.nチャンネル番号.ToString( "x2" ) + ", 整数値=" + pChip.n整数値 +  ", time=" + pChip.n発声時刻ms );\r
302                                 if ( pChip.n発声時刻ms <= 0 )\r
303                                 {\r
304                                         if ( pChip.nチャンネル番号 == 0xDA )\r
305                                         {\r
306                                                 pChip.bHit = true;\r
307 //                                              Debug.WriteLine( "first [DA] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値 + ", time=" + pChip.n発声時刻ms );\r
308                                                 if ( listWAV.ContainsKey( pChip.n整数値・内部番号 ) )\r
309                                                 {\r
310                                                         CDTX.CWAV wc = listWAV[ pChip.n整数値・内部番号 ];\r
311                                                         for ( int i = 0; i < nPolyphonicSounds; i++ )\r
312                                                         {\r
313                                                                 if ( wc.rSound[ i ] != null )\r
314                                                                 {\r
315                                                                         CDTXMania.Sound管理.AddMixer( wc.rSound[ i ], db再生速度, pChip.b演奏終了後も再生が続くチップである );\r
316                                                                         //AddMixer( wc.rSound[ i ] );           // 最初はqueueを介さず直接ミキサー登録する\r
317                                                                 }\r
318                                                         }\r
319                                                 }\r
320                                         }\r
321                                 }\r
322                                 else\r
323                                 {\r
324                                         break;\r
325                                 }\r
326                         }\r
327                         #endregion\r
328 \r
329                         if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.24 yyagi Gt/Bsの譜面情報入れ替え\r
330                         {\r
331                                 CDTXMania.DTX.SwapGuitarBassInfos();\r
332                         }\r
333                         this.sw = new Stopwatch();\r
334                         this.sw2 = new Stopwatch();\r
335 //                      this.gclatencymode = GCSettings.LatencyMode;\r
336 //                      GCSettings.LatencyMode = GCLatencyMode.Batch;   // 演奏画面中はGCを抑止する\r
337                 }\r
338                 public override void On非活性化()\r
339                 {\r
340                         this.L最後に再生したHHの実WAV番号.Clear();   // #23921 2011.1.4 yyagi\r
341                         this.L最後に再生したHHの実WAV番号 = null;    //\r
342                         for ( int i = 0; i < 3; i++ )\r
343                         {\r
344                                 this.queWailing[ i ].Clear();\r
345                                 this.queWailing[ i ] = null;\r
346                         }\r
347                         this.ctWailingチップ模様アニメ = null;\r
348                         this.ctチップ模様アニメ.Drums = null;\r
349                         this.ctチップ模様アニメ.Guitar = null;\r
350                         this.ctチップ模様アニメ.Bass = null;\r
351                         //listWAV.Clear();\r
352                         listWAV = null;\r
353                         listChip = null;\r
354                         queueMixerSound.Clear();\r
355                         queueMixerSound = null;\r
356                         cInvisibleChip.Dispose();\r
357                         cInvisibleChip = null;\r
358 //                      GCSettings.LatencyMode = this.gclatencymode;\r
359                         base.On非活性化();\r
360                 }\r
361                 public override void OnManagedリソースの作成()\r
362                 {\r
363                         if ( !base.b活性化してない )\r
364                         {\r
365                                 this.t背景テクスチャの生成();\r
366 \r
367                                 this.txWailing枠 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenPlay wailing cursor.png" ) );\r
368 \r
369                                 base.OnManagedリソースの作成();\r
370                         }\r
371                 }\r
372                 public override void OnManagedリソースの解放()\r
373                 {\r
374                         if ( !base.b活性化してない )\r
375                         {\r
376                                 CDTXMania.tテクスチャの解放( ref this.tx背景 );\r
377 \r
378                                 CDTXMania.tテクスチャの解放( ref this.txWailing枠 );\r
379                                 base.OnManagedリソースの解放();\r
380                         }\r
381                 }\r
382 \r
383                 // その他\r
384 \r
385                 #region [ protected ]\r
386                 //-----------------\r
387                 protected class CHITCOUNTOFRANK\r
388                 {\r
389                         // Fields\r
390                         public int Good;\r
391                         public int Great;\r
392                         public int Miss;\r
393                         public int Perfect;\r
394                         public int Poor;\r
395 \r
396                         // Properties\r
397                         public int this[ int index ]\r
398                         {\r
399                                 get\r
400                                 {\r
401                                         switch ( index )\r
402                                         {\r
403                                                 case 0:\r
404                                                         return this.Perfect;\r
405 \r
406                                                 case 1:\r
407                                                         return this.Great;\r
408 \r
409                                                 case 2:\r
410                                                         return this.Good;\r
411 \r
412                                                 case 3:\r
413                                                         return this.Poor;\r
414 \r
415                                                 case 4:\r
416                                                         return this.Miss;\r
417                                         }\r
418                                         throw new IndexOutOfRangeException();\r
419                                 }\r
420                                 set\r
421                                 {\r
422                                         switch ( index )\r
423                                         {\r
424                                                 case 0:\r
425                                                         this.Perfect = value;\r
426                                                         return;\r
427 \r
428                                                 case 1:\r
429                                                         this.Great = value;\r
430                                                         return;\r
431 \r
432                                                 case 2:\r
433                                                         this.Good = value;\r
434                                                         return;\r
435 \r
436                                                 case 3:\r
437                                                         this.Poor = value;\r
438                                                         return;\r
439 \r
440                                                 case 4:\r
441                                                         this.Miss = value;\r
442                                                         return;\r
443                                         }\r
444                                         throw new IndexOutOfRangeException();\r
445                                 }\r
446                         }\r
447                 }\r
448 \r
449                 [StructLayout( LayoutKind.Sequential )]\r
450                 protected struct STKARAUCHI\r
451                 {\r
452                         public CDTX.CChip HH;\r
453                         public CDTX.CChip SD;\r
454                         public CDTX.CChip BD;\r
455                         public CDTX.CChip HT;\r
456                         public CDTX.CChip LT;\r
457                         public CDTX.CChip FT;\r
458                         public CDTX.CChip CY;\r
459                         public CDTX.CChip HHO;\r
460                         public CDTX.CChip RD;\r
461                         public CDTX.CChip LC;\r
462                         public CDTX.CChip this[ int index ]\r
463                         {\r
464                                 get\r
465                                 {\r
466                                         switch ( index )\r
467                                         {\r
468                                                 case 0:\r
469                                                         return this.HH;\r
470 \r
471                                                 case 1:\r
472                                                         return this.SD;\r
473 \r
474                                                 case 2:\r
475                                                         return this.BD;\r
476 \r
477                                                 case 3:\r
478                                                         return this.HT;\r
479 \r
480                                                 case 4:\r
481                                                         return this.LT;\r
482 \r
483                                                 case 5:\r
484                                                         return this.FT;\r
485 \r
486                                                 case 6:\r
487                                                         return this.CY;\r
488 \r
489                                                 case 7:\r
490                                                         return this.HHO;\r
491 \r
492                                                 case 8:\r
493                                                         return this.RD;\r
494 \r
495                                                 case 9:\r
496                                                         return this.LC;\r
497                                         }\r
498                                         throw new IndexOutOfRangeException();\r
499                                 }\r
500                                 set\r
501                                 {\r
502                                         switch ( index )\r
503                                         {\r
504                                                 case 0:\r
505                                                         this.HH = value;\r
506                                                         return;\r
507 \r
508                                                 case 1:\r
509                                                         this.SD = value;\r
510                                                         return;\r
511 \r
512                                                 case 2:\r
513                                                         this.BD = value;\r
514                                                         return;\r
515 \r
516                                                 case 3:\r
517                                                         this.HT = value;\r
518                                                         return;\r
519 \r
520                                                 case 4:\r
521                                                         this.LT = value;\r
522                                                         return;\r
523 \r
524                                                 case 5:\r
525                                                         this.FT = value;\r
526                                                         return;\r
527 \r
528                                                 case 6:\r
529                                                         this.CY = value;\r
530                                                         return;\r
531 \r
532                                                 case 7:\r
533                                                         this.HHO = value;\r
534                                                         return;\r
535 \r
536                                                 case 8:\r
537                                                         this.RD = value;\r
538                                                         return;\r
539 \r
540                                                 case 9:\r
541                                                         this.LC = value;\r
542                                                         return;\r
543                                         }\r
544                                         throw new IndexOutOfRangeException();\r
545                                 }\r
546                         }\r
547                 }\r
548 \r
549                 protected struct stmixer\r
550                 {\r
551                         internal bool bIsAdd;\r
552                         internal CSound csound;\r
553                         internal bool b演奏終了後も再生が続くチップである;\r
554                 };\r
555 \r
556                 protected CAct演奏AVI actAVI;\r
557                 protected CAct演奏BGA actBGA;\r
558 \r
559                 protected CAct演奏チップファイアGB actChipFireGB;\r
560                 protected CAct演奏Combo共通 actCombo;\r
561                 protected CAct演奏Danger共通 actDANGER;\r
562                 protected CActFIFOBlack actFI;\r
563                 protected CActFIFOBlack actFO;\r
564                 protected CActFIFOWhite actFOClear;\r
565                 protected CAct演奏ゲージ共通 actGauge;\r
566 \r
567                 protected CAct演奏判定文字列共通 actJudgeString;\r
568                 protected CAct演奏DrumsレーンフラッシュD actLaneFlushD;\r
569                 protected CAct演奏レーンフラッシュGB共通 actLaneFlushGB;\r
570                 protected CAct演奏パネル文字列 actPanel;\r
571                 protected CAct演奏演奏情報 actPlayInfo;\r
572                 protected CAct演奏RGB共通 actRGB;\r
573                 protected CAct演奏スコア共通 actScore;\r
574                 protected CAct演奏ステージ失敗 actStageFailed;\r
575                 protected CAct演奏ステータスパネル共通 actStatusPanels;\r
576                 protected CAct演奏WailingBonus共通 actWailingBonus;\r
577                 protected CAct演奏スクロール速度 act譜面スクロール速度;\r
578                 protected bool bPAUSE;\r
579                 protected STDGBVALUE<bool> b演奏にMIDI入力を使った;\r
580                 protected STDGBVALUE<bool> b演奏にキーボードを使った;\r
581                 protected STDGBVALUE<bool> b演奏にジョイパッドを使った;\r
582                 protected STDGBVALUE<bool> b演奏にマウスを使った;\r
583                 protected CCounter ctWailingチップ模様アニメ;\r
584                 protected STDGBVALUE<CCounter> ctチップ模様アニメ;\r
585 \r
586                 protected E演奏画面の戻り値 eフェードアウト完了時の戻り値;\r
587                 protected readonly int[,] nBGAスコープチャンネルマップ = new int[ , ] { { 0xc4, 0xc7, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xe0 }, { 4, 7, 0x55, 0x56, 0x57, 0x58, 0x59, 0x60 } };\r
588                 protected readonly int[] nチャンネル0Atoパッド08 = new int[] { 1, 2, 3, 4, 5, 7, 6, 1, 8, 0 };\r
589                 protected readonly int[] nチャンネル0Atoレーン07 = new int[] { 1, 2, 3, 4, 5, 7, 6, 1, 7, 0 };\r
590                 protected readonly int[] nパッド0Atoチャンネル0A = new int[] { 0x11, 0x12, 0x13, 20, 0x15, 0x17, 0x16, 0x18, 0x19, 0x1a };\r
591                 protected readonly int[] nパッド0Atoパッド08 = new int[] { 1, 2, 3, 4, 5, 6, 7, 1, 8, 0 };        // パッド画像のヒット処理用\r
592                 protected readonly int[] nパッド0Atoレーン07 = new int[] { 1, 2, 3, 4, 5, 6, 7, 1, 7, 0 };        \r
593                 protected STDGBVALUE<CHITCOUNTOFRANK> nヒット数・Auto含まない;\r
594                 protected STDGBVALUE<CHITCOUNTOFRANK> nヒット数・Auto含む;\r
595                 protected int n現在のトップChip = -1;\r
596                 protected int[] n最後に再生したBGMの実WAV番号 = new int[ 50 ];\r
597                 protected int n最後に再生したHHのチャンネル番号;\r
598                 protected List<int> L最後に再生したHHの実WAV番号;            // #23921 2011.1.4 yyagi: change "int" to "List<int>", for recording multiple wav No.\r
599                 protected STLANEVALUE<int> n最後に再生した実WAV番号;  // #26388 2011.11.8 yyagi: change "n最後に再生した実WAV番号.GUITAR" and "n最後に再生した実WAV番号.BASS"\r
600                                                                                                                                 //                                                      into "n最後に再生した実WAV番号";\r
601 //              protected int n最後に再生した実WAV番号.GUITAR;\r
602 //              protected int n最後に再生した実WAV番号.BASS;\r
603 \r
604                 protected volatile Queue<stmixer> queueMixerSound;              // #24820 2013.1.21 yyagi まずは単純にAdd/Removeを1個のキューでまとめて管理するやり方で設計する\r
605                 protected DateTime dtLastQueueOperation;                                //\r
606                 protected bool bIsDirectSound;                                                  //\r
607                 protected double db再生速度;\r
608                 protected bool bValidScore;\r
609 //              protected bool bDTXVmode;\r
610                 protected STDGBVALUE<int> nJudgeLinePosY_delta;                 // #31602 2013.6.23 yyagi 表示遅延対策として、判定ラインの表示位置をずらす機能を追加する\r
611 \r
612                 protected STDGBVALUE<Queue<CDTX.CChip>> queWailing;\r
613                 protected STDGBVALUE<CDTX.CChip> r現在の歓声Chip;\r
614                 protected CDTX.CChip r現在の空うちギターChip;\r
615                 protected STKARAUCHI r現在の空うちドラムChip;\r
616                 protected CDTX.CChip r現在の空うちベースChip;\r
617                 protected CDTX.CChip r次にくるギターChip;\r
618                 protected CDTX.CChip r次にくるベースChip;\r
619                 protected CTexture txWailing枠;\r
620                 protected CTexture txチップ;\r
621                 protected CTexture txヒットバー;\r
622 \r
623                 protected CTexture tx背景;\r
624 \r
625                 protected STDGBVALUE<int> nInputAdjustTimeMs;           // #23580 2011.1.3 yyagi\r
626                 protected STAUTOPLAY bIsAutoPlay;               // #24239 2011.1.23 yyagi\r
627 //              protected int nRisky_InitialVar, nRiskyTime;            // #23559 2011.7.28 yyagi → CAct演奏ゲージ共通クラスに隠蔽\r
628                 protected int nPolyphonicSounds;\r
629                 protected List<CDTX.CChip> listChip;\r
630                 protected Dictionary<int, CDTX.CWAV> listWAV;\r
631                 protected CInvisibleChip cInvisibleChip;\r
632 \r
633                 protected Stopwatch sw;         // 2011.6.13 最適化検討用のストップウォッチ\r
634                 protected Stopwatch sw2;\r
635 //              protected GCLatencyMode gclatencymode;\r
636 \r
637                 public void AddMixer( CSound cs, bool _b演奏終了後も再生が続くチップである )\r
638                 {\r
639                         stmixer stm = new stmixer()\r
640                         {\r
641                                 bIsAdd = true,\r
642                                 csound = cs,\r
643                                 b演奏終了後も再生が続くチップである = _b演奏終了後も再生が続くチップである\r
644                         };\r
645                         queueMixerSound.Enqueue( stm );\r
646 //              Debug.WriteLine( "★Queue: add " + Path.GetFileName( stm.csound.strファイル名 ));\r
647                 }\r
648                 public void RemoveMixer( CSound cs )\r
649                 {\r
650                         stmixer stm = new stmixer()\r
651                         {\r
652                                 bIsAdd = false,\r
653                                 csound = cs,\r
654                                 b演奏終了後も再生が続くチップである = false\r
655                         };\r
656                         queueMixerSound.Enqueue( stm );\r
657 //              Debug.WriteLine( "★Queue: remove " + Path.GetFileName( stm.csound.strファイル名 ));\r
658                 }\r
659                 public void ManageMixerQueue()\r
660                 {\r
661                         // もしサウンドの登録/削除が必要なら、実行する\r
662                         if ( queueMixerSound.Count > 0 )\r
663                         {\r
664                                 //Debug.WriteLine( "☆queueLength=" + queueMixerSound.Count );\r
665                                 DateTime dtnow = DateTime.Now;\r
666                                 TimeSpan ts = dtnow - dtLastQueueOperation;\r
667                                 if ( ts.Milliseconds > 7 )\r
668                                 {\r
669                                         for ( int i = 0; i < 2 && queueMixerSound.Count > 0; i++ )\r
670                                         {\r
671                                                 dtLastQueueOperation = dtnow;\r
672                                                 stmixer stm = queueMixerSound.Dequeue();\r
673                                                 if ( stm.bIsAdd )\r
674                                                 {\r
675                                                         CDTXMania.Sound管理.AddMixer( stm.csound, db再生速度, stm.b演奏終了後も再生が続くチップである );\r
676                                                 }\r
677                                                 else\r
678                                                 {\r
679                                                         CDTXMania.Sound管理.RemoveMixer( stm.csound );\r
680                                                 }\r
681                                         }\r
682                                 }\r
683                         }\r
684                 }\r
685 \r
686                 protected E判定 e指定時刻からChipのJUDGEを返す( long nTime, CDTX.CChip pChip, int nInputAdjustTime )\r
687                 {\r
688                         if ( pChip != null )\r
689                         {\r
690                                 pChip.nLag = (int) ( nTime + nInputAdjustTime - pChip.n発声時刻ms );                // #23580 2011.1.3 yyagi: add "nInputAdjustTime" to add input timing adjust feature\r
691                                 int nDeltaTime = Math.Abs( pChip.nLag );\r
692                                 //Debug.WriteLine("nAbsTime=" + (nTime - pChip.n発声時刻ms) + ", nDeltaTime=" + (nTime + nInputAdjustTime - pChip.n発声時刻ms));\r
693                                 if ( nDeltaTime <= CDTXMania.nPerfect範囲ms )\r
694                                 {\r
695                                         return E判定.Perfect;\r
696                                 }\r
697                                 if ( nDeltaTime <= CDTXMania.nGreat範囲ms )\r
698                                 {\r
699                                         return E判定.Great;\r
700                                 }\r
701                                 if ( nDeltaTime <= CDTXMania.nGood範囲ms )\r
702                                 {\r
703                                         return E判定.Good;\r
704                                 }\r
705                                 if ( nDeltaTime <= CDTXMania.nPoor範囲ms )\r
706                                 {\r
707                                         return E判定.Poor;\r
708                                 }\r
709                         }\r
710                         return E判定.Miss;\r
711                 }\r
712                 protected CDTX.CChip r空うちChip( E楽器パート part, Eパッド pad )\r
713                 {\r
714                         switch ( part )\r
715                         {\r
716                                 case E楽器パート.DRUMS:\r
717                                         switch ( pad )\r
718                                         {\r
719                                                 case Eパッド.HH:\r
720                                                         if ( this.r現在の空うちドラムChip.HH != null )\r
721                                                         {\r
722                                                                 return this.r現在の空うちドラムChip.HH;\r
723                                                         }\r
724                                                         if ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける )\r
725                                                         {\r
726                                                                 if ( CDTXMania.ConfigIni.eHHGroup == EHHGroup.左シンバルのみ打ち分ける )\r
727                                                                 {\r
728                                                                         return this.r現在の空うちドラムChip.HHO;\r
729                                                                 }\r
730                                                                 if ( this.r現在の空うちドラムChip.HHO != null )\r
731                                                                 {\r
732                                                                         return this.r現在の空うちドラムChip.HHO;\r
733                                                                 }\r
734                                                         }\r
735                                                         return this.r現在の空うちドラムChip.LC;\r
736 \r
737                                                 case Eパッド.SD:\r
738                                                         return this.r現在の空うちドラムChip.SD;\r
739 \r
740                                                 case Eパッド.BD:\r
741                                                         return this.r現在の空うちドラムChip.BD;\r
742 \r
743                                                 case Eパッド.HT:\r
744                                                         return this.r現在の空うちドラムChip.HT;\r
745 \r
746                                                 case Eパッド.LT:\r
747                                                         if ( this.r現在の空うちドラムChip.LT != null )\r
748                                                         {\r
749                                                                 return this.r現在の空うちドラムChip.LT;\r
750                                                         }\r
751                                                         if ( CDTXMania.ConfigIni.eFTGroup == EFTGroup.共通 )\r
752                                                         {\r
753                                                                 return this.r現在の空うちドラムChip.FT;\r
754                                                         }\r
755                                                         return null;\r
756 \r
757                                                 case Eパッド.FT:\r
758                                                         if ( this.r現在の空うちドラムChip.FT != null )\r
759                                                         {\r
760                                                                 return this.r現在の空うちドラムChip.FT;\r
761                                                         }\r
762                                                         if ( CDTXMania.ConfigIni.eFTGroup == EFTGroup.共通 )\r
763                                                         {\r
764                                                                 return this.r現在の空うちドラムChip.LT;\r
765                                                         }\r
766                                                         return null;\r
767 \r
768                                                 case Eパッド.CY:\r
769                                                         if ( this.r現在の空うちドラムChip.CY != null )\r
770                                                         {\r
771                                                                 return this.r現在の空うちドラムChip.CY;\r
772                                                         }\r
773                                                         if ( CDTXMania.ConfigIni.eCYGroup == ECYGroup.共通 )\r
774                                                         {\r
775                                                                 return this.r現在の空うちドラムChip.RD;\r
776                                                         }\r
777                                                         return null;\r
778 \r
779                                                 case Eパッド.HHO:\r
780                                                         if ( this.r現在の空うちドラムChip.HHO != null )\r
781                                                         {\r
782                                                                 return this.r現在の空うちドラムChip.HHO;\r
783                                                         }\r
784                                                         if ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける )\r
785                                                         {\r
786                                                                 if ( CDTXMania.ConfigIni.eHHGroup == EHHGroup.左シンバルのみ打ち分ける )\r
787                                                                 {\r
788                                                                         return this.r現在の空うちドラムChip.HH;\r
789                                                                 }\r
790                                                                 if ( this.r現在の空うちドラムChip.HH != null )\r
791                                                                 {\r
792                                                                         return this.r現在の空うちドラムChip.HH;\r
793                                                                 }\r
794                                                         }\r
795                                                         return this.r現在の空うちドラムChip.LC;\r
796 \r
797                                                 case Eパッド.RD:\r
798                                                         if ( this.r現在の空うちドラムChip.RD != null )\r
799                                                         {\r
800                                                                 return this.r現在の空うちドラムChip.RD;\r
801                                                         }\r
802                                                         if ( CDTXMania.ConfigIni.eCYGroup == ECYGroup.共通 )\r
803                                                         {\r
804                                                                 return this.r現在の空うちドラムChip.CY;\r
805                                                         }\r
806                                                         return null;\r
807 \r
808                                                 case Eパッド.LC:\r
809                                                         if ( this.r現在の空うちドラムChip.LC != null )\r
810                                                         {\r
811                                                                 return this.r現在の空うちドラムChip.LC;\r
812                                                         }\r
813                                                         if ( ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける ) && ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.全部共通 ) )\r
814                                                         {\r
815                                                                 return null;\r
816                                                         }\r
817                                                         if ( this.r現在の空うちドラムChip.HH != null )\r
818                                                         {\r
819                                                                 return this.r現在の空うちドラムChip.HH;\r
820                                                         }\r
821                                                         return this.r現在の空うちドラムChip.HHO;\r
822                                         }\r
823                                         break;\r
824 \r
825                                 case E楽器パート.GUITAR:\r
826                                         return this.r現在の空うちギターChip;\r
827 \r
828                                 case E楽器パート.BASS:\r
829                                         return this.r現在の空うちベースChip;\r
830                         }\r
831                         return null;\r
832                 }\r
833                 protected CDTX.CChip r指定時刻に一番近いChip・ヒット未済問わず不可視考慮( long nTime, int nChannel, int nInputAdjustTime )\r
834                 {\r
835                         sw2.Start();\r
836 //Trace.TraceInformation( "NTime={0}, nChannel={1:x2}", nTime, nChannel );\r
837                         nTime += nInputAdjustTime;                                              // #24239 2011.1.23 yyagi InputAdjust\r
838 \r
839                         int nIndex_InitialPositionSearchingToPast;\r
840                         if ( this.n現在のトップChip == -1 )                               // 演奏データとして1個もチップがない場合は\r
841                         {\r
842                                 sw2.Stop();\r
843                                 return null;\r
844                         }\r
845                         int count = listChip.Count;\r
846                         int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = this.n現在のトップChip;\r
847                         if ( this.n現在のトップChip >= count )                    // その時点で演奏すべきチップが既に全部無くなっていたら\r
848                         {\r
849                                 nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = count - 1;\r
850                         }\r
851                         //int nIndex_NearestChip_Future;        // = nIndex_InitialPositionSearchingToFuture;\r
852                         //while ( nIndex_NearestChip_Future < count )           // 未来方向への検索\r
853                         for ( ; nIndex_NearestChip_Future < count; nIndex_NearestChip_Future++)\r
854                         {\r
855                                 CDTX.CChip chip = listChip[ nIndex_NearestChip_Future ];\r
856                                 if ( ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) ) )\r
857                                 {\r
858                                         if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )\r
859                                         {\r
860                                                 if ( chip.n発声時刻ms > nTime )\r
861                                                 {\r
862                                                         break;\r
863                                                 }\r
864                                                 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
865                                         }\r
866                                         continue;       // ほんの僅かながら高速化\r
867                                 }\r
868                                 else if ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )\r
869                                 {\r
870                                         if ( chip.n発声時刻ms > nTime )\r
871                                         {\r
872                                                 break;\r
873                                         }\r
874                                         nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
875                                 }\r
876                                 else if ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )\r
877                                 {\r
878                                         if ( chip.n発声時刻ms > nTime )\r
879                                         {\r
880                                                 break;\r
881                                         }\r
882                                         nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
883                                 }\r
884                                 // nIndex_NearestChip_Future++;\r
885                         }\r
886                         int nIndex_NearestChip_Past = nIndex_InitialPositionSearchingToPast;\r
887                         //while ( nIndex_NearestChip_Past >= 0 )                        // 過去方向への検索\r
888                         for ( ; nIndex_NearestChip_Past >= 0; nIndex_NearestChip_Past-- )\r
889                         {\r
890                                 CDTX.CChip chip = listChip[ nIndex_NearestChip_Past ];\r
891                                 if ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) )\r
892                                 {\r
893                                         if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )\r
894                                         {\r
895                                                 break;\r
896                                         }\r
897                                 }\r
898                                 else if ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )\r
899                                 {\r
900                                         if ( ( 0x20 <= chip.nチャンネル番号 ) && ( chip.nチャンネル番号 <= 0x28 ) )\r
901                                         {\r
902                                                 break;\r
903                                         }\r
904                                 }\r
905                                 else if ( ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )\r
906                                         && ( ( 0xa0 <= chip.nチャンネル番号 ) && ( chip.nチャンネル番号 <= 0xa8 ) ) )\r
907                                 {\r
908                                         break;\r
909                                 }\r
910                                 // nIndex_NearestChip_Past--;\r
911                         }\r
912 \r
913                         if ( nIndex_NearestChip_Future >= count )\r
914                         {\r
915                                 if ( nIndex_NearestChip_Past < 0 )      // 検索対象が過去未来どちらにも見つからなかった場合\r
916                                 {\r
917                                         return null;\r
918                                 }\r
919                                 else                                                            // 検索対象が未来方向には見つからなかった(しかし過去方向には見つかった)場合\r
920                                 {\r
921                                         sw2.Stop();\r
922                                         return listChip[ nIndex_NearestChip_Past ];\r
923                                 }\r
924                         }\r
925                         else if ( nIndex_NearestChip_Past < 0 ) // 検索対象が過去方向には見つからなかった(しかし未来方向には見つかった)場合\r
926                         {\r
927                                 sw2.Stop();\r
928                                 return listChip[ nIndex_NearestChip_Future ];\r
929                         }\r
930                                                                                                         // 検索対象が過去未来の双方に見つかったなら、より近い方を採用する\r
931                         CDTX.CChip nearestChip_Future = listChip[ nIndex_NearestChip_Future ];\r
932                         CDTX.CChip nearestChip_Past   = listChip[ nIndex_NearestChip_Past ];\r
933                         int nDiffTime_Future = Math.Abs( (int) ( nTime - nearestChip_Future.n発声時刻ms ) );\r
934                         int nDiffTime_Past   = Math.Abs( (int) ( nTime - nearestChip_Past.n発声時刻ms ) );\r
935                         if ( nDiffTime_Future >= nDiffTime_Past )\r
936                         {\r
937                                 sw2.Stop();\r
938                                 return nearestChip_Past;\r
939                         }\r
940                         sw2.Stop();\r
941                         return nearestChip_Future;\r
942                 }\r
943                 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part )\r
944                 {\r
945                         this.tサウンド再生( rChip, n再生開始システム時刻ms, part, CDTXMania.ConfigIni.n手動再生音量, false, false );\r
946                 }\r
947                 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part, int n音量 )\r
948                 {\r
949                         this.tサウンド再生( rChip, n再生開始システム時刻ms, part, n音量, false, false );\r
950                 }\r
951                 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ )\r
952                 {\r
953                         this.tサウンド再生( rChip, n再生開始システム時刻ms, part, n音量, bモニタ, false );\r
954                 }\r
955                 protected void tサウンド再生( CDTX.CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生 )\r
956                 {\r
957                         // mute sound (auto)\r
958                         // 4A: HH\r
959                         // 4B: CY\r
960                         // 4C: RD\r
961                         // 4D: LC\r
962                         // 2A: Gt\r
963                         // AA: Bs\r
964                         //\r
965 \r
966                         if ( pChip != null )\r
967                         {\r
968                                 bool overwrite = false;\r
969                                 switch ( part )\r
970                                 {\r
971                                         case E楽器パート.DRUMS:\r
972                                         #region [ DRUMS ]\r
973                                                 {\r
974                                                         int index = pChip.nチャンネル番号;\r
975                                                         if ( ( 0x11 <= index ) && ( index <= 0x1a ) )\r
976                                                         {\r
977                                                                 index -= 0x11;\r
978                                                         }\r
979                                                         else if ( ( 0x31 <= index ) && ( index <= 0x3a ) )\r
980                                                         {\r
981                                                                 index -= 0x31;\r
982                                                         }\r
983                                                         // mute sound (auto)\r
984                                                         // 4A: 84: HH (HO/HC)\r
985                                                         // 4B: 85: CY\r
986                                                         // 4C: 86: RD\r
987                                                         // 4D: 87: LC\r
988                                                         // 2A: 88: Gt\r
989                                                         // AA: 89: Bs\r
990                                                         else if ( 0x84 == index )       // 仮に今だけ追加 HHは消音処理があるので overwriteフラグ系の処理は改めて不要\r
991                                                         {\r
992                                                                 index = 0;\r
993                                                         }\r
994                                                         else if ( ( 0x85 <= index ) && ( index <= 0x87 ) )      // 仮に今だけ追加\r
995                                                         {\r
996                                                                 //            CY    RD    LC\r
997                                                                 int[] ch = { 0x16, 0x19, 0x1A };\r
998                                                                 pChip.nチャンネル番号 = ch[ pChip.nチャンネル番号 - 0x85 ];\r
999                                                                 index = pChip.nチャンネル番号 - 0x11;\r
1000                                                                 overwrite = true;\r
1001                                                         }\r
1002                                                         else\r
1003                                                         {\r
1004                                                                 return;\r
1005                                                         }\r
1006                                                         int nLane = this.nチャンネル0Atoレーン07[ index ];\r
1007                                                         if ( ( nLane == 1 ) &&  // 今回演奏するのがHC or HO\r
1008                                                                 ( index == 0 || ( index == 7 && this.n最後に再生したHHのチャンネル番号 != 0x18 && this.n最後に再生したHHのチャンネル番号 != 0x38 ) )\r
1009                                                                 // HCを演奏するか、またはHO演奏&以前HO演奏でない&以前不可視HO演奏でない\r
1010                                                         )\r
1011                                                         // #24772 2011.4.4 yyagi\r
1012                                                         // == HH mute condition == \r
1013                                                         //                      current HH              So, the mute logics are:\r
1014                                                         //                              HC      HO              1) All played HC/HOs should be queueing\r
1015                                                         // last HH      HC  Yes Yes             2) If you aren't in "both current/last HH are HO", queued HH should be muted.\r
1016                                                         //                      HO      Yes     No\r
1017                                                         {\r
1018                                                                 // #23921 2011.1.4 yyagi: 2種類以上のオープンハイハットが発音済みだと、最後のHHOしか消せない問題に対応。\r
1019 #if TEST_NOTEOFFMODE    // 2011.1.1 yyagi test\r
1020                                                                 if (CDTXMania.DTX.b演奏で直前の音を消音する.HH)\r
1021                                                                 {\r
1022 #endif\r
1023                                                                 for ( int i = 0; i < this.L最後に再生したHHの実WAV番号.Count; i++ )          // #23921 2011.1.4 yyagi\r
1024                                                                 {\r
1025                                                                         // CDTXMania.DTX.tWavの再生停止(this.L最後に再生したHHの実WAV番号);\r
1026                                                                         CDTXMania.DTX.tWavの再生停止( this.L最後に再生したHHの実WAV番号[ i ] ); // #23921 yyagi ストック分全て消音する\r
1027                                                                 }\r
1028                                                                 this.L最後に再生したHHの実WAV番号.Clear();\r
1029 #if TEST_NOTEOFFMODE    // 2011.1.1 yyagi test\r
1030                                                                 }\r
1031 #endif\r
1032                                                                 //this.n最後に再生したHHの実WAV番号 = pChip.n整数値・内部番号;\r
1033                                                                 this.n最後に再生したHHのチャンネル番号 = pChip.nチャンネル番号;\r
1034                                                         }\r
1035 #if TEST_NOTEOFFMODE    // 2011.1.4 yyagi test\r
1036                                                         if (CDTXMania.DTX.b演奏で直前の音を消音する.HH)\r
1037                                                         {\r
1038 #endif\r
1039                                                         if ( index == 0 || index == 7 || index == 0x20 || index == 0x27 )                       // #23921 HOまたは不可視HO演奏時はそのチップ番号をストックしておく\r
1040                                                         {                                                                                                                                                       // #24772 HC, 不可視HCも消音キューに追加\r
1041                                                                 if ( this.L最後に再生したHHの実WAV番号.Count >= 16 ) // #23921 ただしストック数が16以上になるようなら、頭の1個を削って常に16未満に抑える\r
1042                                                                 {                                                                                                       // (ストックが増えてList<>のrealloc()が発生するのを予防する)\r
1043                                                                         this.L最後に再生したHHの実WAV番号.RemoveAt( 0 );\r
1044                                                                 }\r
1045                                                                 if ( !this.L最後に再生したHHの実WAV番号.Contains( pChip.n整数値・内部番号 ) )        // チップ音がまだストックされてなければ\r
1046                                                                 {\r
1047                                                                         this.L最後に再生したHHの実WAV番号.Add( pChip.n整数値・内部番号 );                    // ストックする\r
1048                                                                 }\r
1049                                                         }\r
1050 #if TEST_NOTEOFFMODE    // 2011.1.4 yyagi test\r
1051                                                         }\r
1052 #endif\r
1053                                                         if ( overwrite )\r
1054                                                         {\r
1055                                                                 CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号[index] );\r
1056                                                         }\r
1057                                                         CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, nLane, n音量, bモニタ );\r
1058                                                         this.n最後に再生した実WAV番号[ nLane ] = pChip.n整数値・内部番号;             // nLaneでなくindexにすると、LC(1A-11=09)とギター(enumで09)がかぶってLC音が消されるので注意\r
1059                                                         return;\r
1060                                                 }\r
1061                                         #endregion\r
1062                                         case E楽器パート.GUITAR:\r
1063                                         #region [ GUITAR ]\r
1064 #if TEST_NOTEOFFMODE    // 2011.1.1 yyagi test\r
1065                                                 if (CDTXMania.DTX.b演奏で直前の音を消音する.Guitar) {\r
1066 #endif\r
1067                                                 CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Guitar );\r
1068 #if TEST_NOTEOFFMODE\r
1069                                                 }\r
1070 #endif\r
1071                                                 CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, (int) Eレーン.Guitar, n音量, bモニタ, b音程をずらして再生 );\r
1072                                                 this.n最後に再生した実WAV番号.Guitar = pChip.n整数値・内部番号;\r
1073                                                 return;\r
1074                                         #endregion\r
1075                                         case E楽器パート.BASS:\r
1076                                         #region [ BASS ]\r
1077 #if TEST_NOTEOFFMODE\r
1078                                                 if (CDTXMania.DTX.b演奏で直前の音を消音する.Bass) {\r
1079 #endif\r
1080                                                 CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Bass );\r
1081 #if TEST_NOTEOFFMODE\r
1082                                                 }\r
1083 #endif\r
1084                                                 CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, (int) Eレーン.Bass, n音量, bモニタ, b音程をずらして再生 );\r
1085                                                 this.n最後に再生した実WAV番号.Bass = pChip.n整数値・内部番号;\r
1086                                                 return;\r
1087                                         #endregion\r
1088 \r
1089                                         default:\r
1090                                                 break;\r
1091                                 }\r
1092                         }\r
1093                 }\r
1094                 protected void tステータスパネルの選択()\r
1095                 {\r
1096                         if ( CDTXMania.bコンパクトモード )\r
1097                         {\r
1098                                 this.actStatusPanels.tラベル名からステータスパネルを決定する( null );\r
1099                         }\r
1100                         else if ( CDTXMania.stage選曲.r確定された曲 != null )\r
1101                         {\r
1102                                 this.actStatusPanels.tラベル名からステータスパネルを決定する( CDTXMania.stage選曲.r確定された曲.ar難易度ラベル[ CDTXMania.stage選曲.n確定された曲の難易度 ] );\r
1103                         }\r
1104                 }\r
1105                 protected E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip )\r
1106                 {\r
1107                         return tチップのヒット処理( nHitTime, pChip, true );\r
1108                 }\r
1109                 protected abstract E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, bool bCorrectLane );\r
1110                 protected E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, E楽器パート screenmode )          // E楽器パート screenmode\r
1111                 {\r
1112                         return tチップのヒット処理( nHitTime, pChip, screenmode, true );\r
1113                 }\r
1114                 protected E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, E楽器パート screenmode, bool bCorrectLane )\r
1115                 {\r
1116                         pChip.bHit = true;\r
1117 #region [メソッド化する前の記述(注釈化)]\r
1118 //            bool bPChipIsAutoPlay = false;\r
1119 //            bool bGtBsR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );\r
1120 //            bool bGtBsG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );\r
1121 //            bool bGtBsB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );\r
1122 //            bool bGtBsW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );\r
1123 //            bool bGtBsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );\r
1124 //            if ( pChip.e楽器パート == E楽器パート.DRUMS )\r
1125 //            {\r
1126 //                if ( bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] )\r
1127 //                {\r
1128 //                    bPChipIsAutoPlay = true;\r
1129 //                }\r
1130 //            }\r
1131 //            else if ( pChip.e楽器パート == E楽器パート.GUITAR )\r
1132 //            {\r
1133 ////Trace.TraceInformation( "chip:{0}{1}{2} ", bGtBsR, bGtBsG, bGtBsB );\r
1134 ////Trace.TraceInformation( "auto:{0}{1}{2} ", bIsAutoPlay[ (int) Eレーン.GtR ], bIsAutoPlay[ (int) Eレーン.GtG ], bIsAutoPlay[ (int) Eレーン.GtB ]);\r
1135 //                bPChipIsAutoPlay = true;\r
1136 //                if ( !bIsAutoPlay[ (int) Eレーン.GtPick ] ) bPChipIsAutoPlay = false;\r
1137 //                else\r
1138 //                {\r
1139 //                    if ( bGtBsR  && !bIsAutoPlay[ (int) Eレーン.GtR ] ) bPChipIsAutoPlay = false;\r
1140 //                    else if ( bGtBsG && !bIsAutoPlay[ (int) Eレーン.GtG ] ) bPChipIsAutoPlay = false;\r
1141 //                    else if ( bGtBsB && !bIsAutoPlay[ (int) Eレーン.GtB ] ) bPChipIsAutoPlay = false;\r
1142 //                    else if ( bGtBsW && !bIsAutoPlay[ (int) Eレーン.GtW ] ) bPChipIsAutoPlay = false;\r
1143 //                    else if ( bGtBsO &&\r
1144 //                        ( !bIsAutoPlay[ (int) Eレーン.GtR] || !bIsAutoPlay[ (int) Eレーン.GtG] || !bIsAutoPlay[ (int) Eレーン.GtB] ) )\r
1145 //                        bPChipIsAutoPlay = false;\r
1146 //                }\r
1147 //            }\r
1148 //            else if ( pChip.e楽器パート == E楽器パート.BASS )\r
1149 //            {\r
1150 //                bPChipIsAutoPlay = true;\r
1151 //                if ( !bIsAutoPlay[ (int) Eレーン.BsPick ] ) bPChipIsAutoPlay = false;\r
1152 //                else\r
1153 //                {\r
1154 //                    if ( bGtBsR && !bIsAutoPlay[ (int) Eレーン.BsR ] ) bPChipIsAutoPlay = false;\r
1155 //                    else if ( bGtBsG && bIsAutoPlay[ (int) Eレーン.BsG ] ) bPChipIsAutoPlay = false;\r
1156 //                    else if ( bGtBsB && bIsAutoPlay[ (int) Eレーン.BsB ] ) bPChipIsAutoPlay = false;\r
1157 //                    else if ( bGtBsW && bIsAutoPlay[ (int) Eレーン.BsW ] ) bPChipIsAutoPlay = false;\r
1158 //                    else if ( bGtBsO &&\r
1159 //                        ( !bIsAutoPlay[ (int) Eレーン.BsR ] || !bIsAutoPlay[ (int) Eレーン.BsG ] || !bIsAutoPlay[ (int) Eレーン.BsB ] ) )\r
1160 //                        bPChipIsAutoPlay = false;\r
1161 //                }\r
1162 //            }\r
1163 //            else\r
1164 //            {\r
1165 //                this.bAUTOでないチップが1つでもバーを通過した = true;\r
1166 //            }\r
1167 ////Trace.TraceInformation( "ch={0:x2}, flag={1}",  pChip.nチャンネル番号, bPChipIsAutoPlay.ToString() );\r
1168 #endregion\r
1169                         if ( pChip.e楽器パート == E楽器パート.UNKNOWN )\r
1170                         {\r
1171                                 this.bAUTOでないチップが1つでもバーを通過した = true;\r
1172                         }\r
1173                         else\r
1174                         {\r
1175                                 cInvisibleChip.StartSemiInvisible( pChip.e楽器パート );\r
1176                         }\r
1177                         bool bPChipIsAutoPlay = bCheckAutoPlay( pChip );\r
1178 \r
1179                         pChip.bIsAutoPlayed = bPChipIsAutoPlay;                 // 2011.6.10 yyagi\r
1180                         E判定 eJudgeResult = E判定.Auto;\r
1181                         switch ( pChip.e楽器パート )\r
1182                         {\r
1183                                 case E楽器パート.DRUMS:\r
1184                                         {\r
1185                                                 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Drums;\r
1186                                                 eJudgeResult = (bCorrectLane)? this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime ) : E判定.Miss;\r
1187                                                 this.actJudgeString.Start( this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ], bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );\r
1188                                         }\r
1189                                         break;\r
1190 \r
1191                                 case E楽器パート.GUITAR:\r
1192                                         {\r
1193                                                 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Guitar;\r
1194                                                 eJudgeResult = (bCorrectLane)? this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime ) : E判定.Miss;\r
1195                                                 this.actJudgeString.Start( 10, bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );\r
1196                                                 break;\r
1197                                         }\r
1198 \r
1199                                 case E楽器パート.BASS:\r
1200                                         {\r
1201                                                 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Bass;\r
1202                                                 eJudgeResult = (bCorrectLane)? this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime ) : E判定.Miss;\r
1203                                                 this.actJudgeString.Start( 11, bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );\r
1204                                         }\r
1205                                         break;\r
1206                         }\r
1207                         if ( !bPChipIsAutoPlay && ( pChip.e楽器パート != E楽器パート.UNKNOWN ) )\r
1208                         {\r
1209                                 // this.t判定にあわせてゲージを増減する( screenmode, pChip.e楽器パート, eJudgeResult );\r
1210                                 actGauge.Damage( screenmode, pChip.e楽器パート, eJudgeResult );\r
1211                         }\r
1212                         if ( eJudgeResult == E判定.Poor || eJudgeResult == E判定.Miss || eJudgeResult == E判定.Bad )\r
1213                         {\r
1214                                 cInvisibleChip.ShowChipTemporally( pChip.e楽器パート );\r
1215                         }\r
1216                         switch ( pChip.e楽器パート )\r
1217                         {\r
1218                                 case E楽器パート.DRUMS:\r
1219                                         switch ( eJudgeResult )\r
1220                                         {\r
1221                                                 case E判定.Miss:\r
1222                                                 case E判定.Bad:\r
1223                                                         this.nヒット数・Auto含む.Drums.Miss++;\r
1224                                                         if ( !bPChipIsAutoPlay )\r
1225                                                         {\r
1226                                                                 this.nヒット数・Auto含まない.Drums.Miss++;\r
1227                                                         }\r
1228                                                         break;\r
1229                                                 default:\r
1230                                                         this.nヒット数・Auto含む.Drums[ (int) eJudgeResult ]++;\r
1231                                                         if ( !bPChipIsAutoPlay )\r
1232                                                         {\r
1233                                                                 this.nヒット数・Auto含まない.Drums[ (int) eJudgeResult ]++;\r
1234                                                         }\r
1235                                                         break;\r
1236                                         }\r
1237 \r
1238                                         if ( CDTXMania.ConfigIni.bドラムが全部オートプレイである || !bPChipIsAutoPlay )\r
1239                                         {\r
1240                                                 switch ( eJudgeResult )\r
1241                                                 {\r
1242                                                         case E判定.Perfect:\r
1243                                                         case E判定.Great:\r
1244                                                         case E判定.Good:\r
1245                                                                 this.actCombo.n現在のコンボ数.Drums++;\r
1246                                                                 break;\r
1247 \r
1248                                                         default:\r
1249                                                                 this.actCombo.n現在のコンボ数.Drums = 0;\r
1250                                                                 break;\r
1251                                                 }\r
1252                                         }\r
1253                                         break;\r
1254 \r
1255                                 case E楽器パート.GUITAR:\r
1256                                 case E楽器パート.BASS:\r
1257                                         int indexInst = (int) pChip.e楽器パート;\r
1258                                         switch ( eJudgeResult )\r
1259                                         {\r
1260                                                 case E判定.Miss:\r
1261                                                 case E判定.Bad:\r
1262                                                         this.nヒット数・Auto含む[ indexInst ].Miss++;\r
1263                                                         if ( !bPChipIsAutoPlay )\r
1264                                                         {\r
1265                                                                 this.nヒット数・Auto含まない[ indexInst ].Miss++;\r
1266                                                         }\r
1267                                                         break;\r
1268                                                 default:        // #24068 2011.1.10 ikanick changed\r
1269                                                         // #24167 2011.1.16 yyagi changed\r
1270                                                         this.nヒット数・Auto含む[ indexInst ][ (int) eJudgeResult ]++;\r
1271                                                         if ( !bPChipIsAutoPlay )\r
1272                                                         {\r
1273                                                                 this.nヒット数・Auto含まない[ indexInst ][ (int) eJudgeResult ]++;\r
1274                                                         }\r
1275                                                         break;\r
1276                                         }\r
1277                                         switch ( eJudgeResult )\r
1278                                         {\r
1279                                                 case E判定.Perfect:\r
1280                                                 case E判定.Great:\r
1281                                                 case E判定.Good:\r
1282                                                         this.actCombo.n現在のコンボ数[ indexInst ]++;\r
1283                                                         break;\r
1284 \r
1285                                                 default:\r
1286                                                         this.actCombo.n現在のコンボ数[ indexInst ] = 0;\r
1287                                                         break;\r
1288                                         }\r
1289                                         break;\r
1290 \r
1291                                 default:\r
1292                                         break;\r
1293                         }\r
1294                         if ( ( !bPChipIsAutoPlay && ( pChip.e楽器パート != E楽器パート.UNKNOWN ) ) && ( eJudgeResult != E判定.Miss ) && ( eJudgeResult != E判定.Bad ) )\r
1295                         {\r
1296                                 int nCombos = this.actCombo.n現在のコンボ数[ (int) pChip.e楽器パート ];\r
1297                                 long nScoreDelta = 0;\r
1298                                 long[] nComboScoreDelta = new long[] { 350L, 200L, 50L, 0L };\r
1299                                 if ( ( nCombos <= 500 ) || ( eJudgeResult == E判定.Good ) )\r
1300                                 {\r
1301                                         nScoreDelta = nComboScoreDelta[ (int) eJudgeResult ] * nCombos;\r
1302                                 }\r
1303                                 else if ( ( eJudgeResult == E判定.Perfect ) || ( eJudgeResult == E判定.Great ) )\r
1304                                 {\r
1305                                         nScoreDelta = nComboScoreDelta[ (int) eJudgeResult ] * 500L;\r
1306                                 }\r
1307                                 this.actScore.Add( pChip.e楽器パート, bIsAutoPlay, nScoreDelta );\r
1308                         }\r
1309                         return eJudgeResult;\r
1310                 }\r
1311                 protected abstract void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part );\r
1312                 protected abstract void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, int nLane );\r
1313                 protected void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, E楽器パート screenmode )\r
1314                 {\r
1315                         this.tチップのヒット処理・BadならびにTight時のMiss( part, 0, screenmode );\r
1316                 }\r
1317                 protected void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, int nLane, E楽器パート screenmode )\r
1318                 {\r
1319                         this.bAUTOでないチップが1つでもバーを通過した = true;\r
1320                         cInvisibleChip.StartSemiInvisible( part );\r
1321                         cInvisibleChip.ShowChipTemporally( part );\r
1322                         //this.t判定にあわせてゲージを増減する( screenmode, part, E判定.Miss );\r
1323                         actGauge.Damage( screenmode, part, E判定.Miss );\r
1324                         switch ( part )\r
1325                         {\r
1326                                 case E楽器パート.DRUMS:\r
1327                                         if ( ( nLane >= 0 ) && ( nLane <= 7 ) )\r
1328                                         {\r
1329                                                 this.actJudgeString.Start( nLane, bIsAutoPlay[ nLane ] ? E判定.Auto : E判定.Miss, 999 );\r
1330                                         }\r
1331                                         this.actCombo.n現在のコンボ数.Drums = 0;\r
1332                                         return;\r
1333 \r
1334                                 case E楽器パート.GUITAR:\r
1335                                         this.actJudgeString.Start( 10, E判定.Bad, 999 );\r
1336                                         this.actCombo.n現在のコンボ数.Guitar = 0;\r
1337                                         return;\r
1338 \r
1339                                 case E楽器パート.BASS:\r
1340                                         this.actJudgeString.Start( 11, E判定.Bad, 999 );\r
1341                                         this.actCombo.n現在のコンボ数.Bass = 0;\r
1342                                         break;\r
1343 \r
1344                                 default:\r
1345                                         return;\r
1346                         }\r
1347                 }\r
1348         \r
1349                 protected CDTX.CChip r指定時刻に一番近い未ヒットChip( long nTime, int nChannelFlag, int nInputAdjustTime )\r
1350                 {\r
1351                         return this.r指定時刻に一番近い未ヒットChip( nTime, nChannelFlag, nInputAdjustTime, 0 );\r
1352                 }\r
1353                 protected CDTX.CChip r指定時刻に一番近い未ヒットChip( long nTime, int nChannel, int nInputAdjustTime, int n検索範囲時間ms )\r
1354                 {\r
1355                         sw2.Start();\r
1356 //Trace.TraceInformation( "nTime={0}, nChannel={1:x2}, 現在のTop={2}", nTime, nChannel,CDTXMania.DTX.listChip[ this.n現在のトップChip ].n発声時刻ms );\r
1357                         nTime += nInputAdjustTime;\r
1358 \r
1359                         int nIndex_InitialPositionSearchingToPast;\r
1360                         int nTimeDiff;\r
1361                         if ( this.n現在のトップChip == -1 )                       // 演奏データとして1個もチップがない場合は\r
1362                         {\r
1363                                 sw2.Stop();\r
1364                                 return null;\r
1365                         }\r
1366                         int count = listChip.Count;\r
1367                         int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = this.n現在のトップChip;\r
1368                         if ( this.n現在のトップChip >= count )            // その時点で演奏すべきチップが既に全部無くなっていたら\r
1369                         {\r
1370                                 nIndex_NearestChip_Future  = nIndex_InitialPositionSearchingToPast = count - 1;\r
1371                         }\r
1372                         // int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToFuture;\r
1373 //                      while ( nIndex_NearestChip_Future < count )     // 未来方向への検索\r
1374                         for ( ; nIndex_NearestChip_Future < count; nIndex_NearestChip_Future++ )\r
1375                         {\r
1376                                 CDTX.CChip chip = listChip[ nIndex_NearestChip_Future ];\r
1377                                 if ( !chip.bHit )\r
1378                                 {\r
1379                                         if ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) )\r
1380                                         {\r
1381                                                 if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )\r
1382                                                 {\r
1383                                                         if ( chip.n発声時刻ms > nTime )\r
1384                                                         {\r
1385                                                                 break;\r
1386                                                         }\r
1387                                                         nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
1388                                                 }\r
1389                                                 continue;\r
1390                                         }\r
1391                                         else if ( ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) ) )\r
1392                                         {\r
1393                                                 if ( chip.n発声時刻ms > nTime )\r
1394                                                 {\r
1395                                                         break;\r
1396                                                 }\r
1397                                                 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
1398                                         }\r
1399                                         else if ( ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) ) )\r
1400                                         {\r
1401                                                 if ( chip.n発声時刻ms > nTime )\r
1402                                                 {\r
1403                                                         break;\r
1404                                                 }\r
1405                                                 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
1406                                         }\r
1407                                 }\r
1408 //                              nIndex_NearestChip_Future++;\r
1409                         }\r
1410                         int nIndex_NearestChip_Past = nIndex_InitialPositionSearchingToPast;\r
1411 //                      while ( nIndex_NearestChip_Past >= 0 )          // 過去方向への検索\r
1412                         for ( ; nIndex_NearestChip_Past >= 0; nIndex_NearestChip_Past-- )\r
1413                         {\r
1414                                 CDTX.CChip chip = listChip[ nIndex_NearestChip_Past ];\r
1415                                 if ( (!chip.bHit) &&\r
1416                                                 (\r
1417                                                         ( ( nChannel >= 0x11 ) && ( nChannel <= 0x1a ) &&\r
1418                                                                 ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )\r
1419                                                         )\r
1420                                                         ||\r
1421                                                         (\r
1422                                                                 ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) ||\r
1423                                                                 ( ( ( nChannel >= 0x20 ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) )\r
1424                                                         )\r
1425                                                         ||\r
1426                                                         (\r
1427                                                                 ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) ||\r
1428                                                                 ( ( ( nChannel >= 0xA0 ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) )\r
1429                                                         )\r
1430                                                 )\r
1431                                         )\r
1432                                         {\r
1433                                                 break;\r
1434                                         }\r
1435 //                              nIndex_NearestChip_Past--;\r
1436                         }\r
1437                         if ( ( nIndex_NearestChip_Future >= count ) && ( nIndex_NearestChip_Past < 0 ) )        // 検索対象が過去未来どちらにも見つからなかった場合\r
1438                         {\r
1439                                 sw2.Stop();\r
1440                                 return null;\r
1441                         }\r
1442                         CDTX.CChip nearestChip; // = null;      // 以下のifブロックのいずれかで必ずnearestChipには非nullが代入されるので、null初期化を削除\r
1443                         if ( nIndex_NearestChip_Future >= count )                                                                                       // 検索対象が未来方向には見つからなかった(しかし過去方向には見つかった)場合\r
1444                         {\r
1445                                 nearestChip = listChip[ nIndex_NearestChip_Past ];\r
1446 //                              nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1447                         }\r
1448                         else if ( nIndex_NearestChip_Past < 0 )                                                                                         // 検索対象が過去方向には見つからなかった(しかし未来方向には見つかった)場合\r
1449                         {\r
1450                                 nearestChip = listChip[ nIndex_NearestChip_Future ];\r
1451 //                              nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1452                         }\r
1453                         else\r
1454                         {\r
1455                                 int nTimeDiff_Future = Math.Abs( (int) ( nTime - listChip[ nIndex_NearestChip_Future ].n発声時刻ms ) );\r
1456                                 int nTimeDiff_Past   = Math.Abs( (int) ( nTime - listChip[ nIndex_NearestChip_Past   ].n発声時刻ms ) );\r
1457                                 if ( nTimeDiff_Future < nTimeDiff_Past )\r
1458                                 {\r
1459                                         nearestChip = listChip[ nIndex_NearestChip_Future ];\r
1460 //                                      nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1461                                 }\r
1462                                 else\r
1463                                 {\r
1464                                         nearestChip = listChip[ nIndex_NearestChip_Past ];\r
1465 //                                      nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1466                                 }\r
1467                         }\r
1468                         nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1469                         if ( ( n検索範囲時間ms > 0 ) && ( nTimeDiff > n検索範囲時間ms ) )                                   // チップは見つかったが、検索範囲時間外だった場合\r
1470                         {\r
1471                                 sw2.Stop();\r
1472                                 return null;\r
1473                         }\r
1474                         sw2.Stop();\r
1475                         return nearestChip;\r
1476                 }\r
1477 \r
1478                 protected CDTX.CChip r次に来る指定楽器Chipを更新して返す( E楽器パート inst )\r
1479                 {\r
1480                         switch ( (int) inst )\r
1481                         {\r
1482                                 case (int)E楽器パート.GUITAR:\r
1483                                         return r次にくるギターChipを更新して返す();\r
1484                                 case (int)E楽器パート.BASS:\r
1485                                         return r次にくるベースChipを更新して返す();\r
1486                                 default:\r
1487                                         return null;\r
1488                         }\r
1489                 }\r
1490                 protected CDTX.CChip r次にくるギターChipを更新して返す()\r
1491                 {\r
1492                         int nInputAdjustTime = this.bIsAutoPlay.GtPick ? 0 : this.nInputAdjustTimeMs.Guitar;\r
1493                         this.r次にくるギターChip = this.r指定時刻に一番近い未ヒットChip( CSound管理.rc演奏用タイマ.n現在時刻, 0x2f, nInputAdjustTime, 500 );\r
1494                         return this.r次にくるギターChip;\r
1495                 }\r
1496                 protected CDTX.CChip r次にくるベースChipを更新して返す()\r
1497                 {\r
1498                         int nInputAdjustTime = this.bIsAutoPlay.BsPick ? 0 : this.nInputAdjustTimeMs.Bass;\r
1499                         this.r次にくるベースChip = this.r指定時刻に一番近い未ヒットChip( CSound管理.rc演奏用タイマ.n現在時刻, 0xaf, nInputAdjustTime, 500 );\r
1500                         return this.r次にくるベースChip;\r
1501                 }\r
1502 \r
1503                 protected void ChangeInputAdjustTimeInPlaying( IInputDevice keyboard, int plusminus )           // #23580 2011.1.16 yyagi UI for InputAdjustTime in playing screen.\r
1504                 {\r
1505                         int part, offset = plusminus;\r
1506                         if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) )      // Guitar InputAdjustTime\r
1507                         {\r
1508                                 part = (int) E楽器パート.GUITAR;\r
1509                         }\r
1510                         else if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftAlt ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightAlt ) )     // Bass InputAdjustTime\r
1511                         {\r
1512                                 part = (int) E楽器パート.BASS;\r
1513                         }\r
1514                         else    // Drums InputAdjustTime\r
1515                         {\r
1516                                 part = (int) E楽器パート.DRUMS;\r
1517                         }\r
1518                         if ( !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) && !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) )\r
1519                         {\r
1520                                 offset *= 10;\r
1521                         }\r
1522 \r
1523                         this.nInputAdjustTimeMs[ part ] += offset;\r
1524                         if ( this.nInputAdjustTimeMs[ part ] > 99 )\r
1525                         {\r
1526                                 this.nInputAdjustTimeMs[ part ] = 99;\r
1527                         }\r
1528                         else if ( this.nInputAdjustTimeMs[ part ] < -99 )\r
1529                         {\r
1530                                 this.nInputAdjustTimeMs[ part ] = -99;\r
1531                         }\r
1532                         CDTXMania.ConfigIni.nInputAdjustTimeMs[ part ] = this.nInputAdjustTimeMs[ part ];\r
1533                 }\r
1534 \r
1535                 protected abstract void t入力処理・ドラム();\r
1536                 protected abstract void ドラムスクロール速度アップ();\r
1537                 protected abstract void ドラムスクロール速度ダウン();\r
1538                 protected void tキー入力()\r
1539                 {\r
1540                         IInputDevice keyboard = CDTXMania.Input管理.Keyboard;\r
1541                         if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.F1 ) &&\r
1542                                 ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )\r
1543                         {       // shift+f1 (pause)\r
1544                                 this.bPAUSE = !this.bPAUSE;\r
1545                                 if ( this.bPAUSE )\r
1546                                 {\r
1547                     CSound管理.rc演奏用タイマ.t一時停止();\r
1548                                         CDTXMania.Timer.t一時停止();\r
1549                                         CDTXMania.DTX.t全チップの再生一時停止();\r
1550                                 }\r
1551                                 else\r
1552                                 {\r
1553                     CSound管理.rc演奏用タイマ.t再開();\r
1554                                         CDTXMania.Timer.t再開();\r
1555                                         CDTXMania.DTX.t全チップの再生再開();\r
1556                                 }\r
1557                         }\r
1558                         if ( ( !this.bPAUSE && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
1559                         {\r
1560                                 this.t入力処理・ドラム();\r
1561                                 this.t入力処理・ギターベース( E楽器パート.GUITAR );\r
1562                                 this.t入力処理・ギターベース( E楽器パート.BASS );\r
1563                                 if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )\r
1564                                 {       // shift (+ctrl) + UpArrow (BGMAdjust)\r
1565                                         CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? 1 : 10 );\r
1566                                         CDTXMania.DTX.tWave再生位置自動補正();\r
1567                                 }\r
1568                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )\r
1569                                 {       // shift + DownArrow (BGMAdjust)\r
1570                                         CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? -1 : -10 );\r
1571                                         CDTXMania.DTX.tWave再生位置自動補正();\r
1572                                 }\r
1573                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) )\r
1574                                 {       // UpArrow(scrollspeed up)\r
1575                                         ドラムスクロール速度アップ();\r
1576                                 }\r
1577                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) )\r
1578                                 {       // DownArrow (scrollspeed down)\r
1579                                         ドラムスクロール速度ダウン();\r
1580                                 }\r
1581                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Delete ) )\r
1582                                 {       // del (debug info)\r
1583                                         CDTXMania.ConfigIni.b演奏情報を表示する = !CDTXMania.ConfigIni.b演奏情報を表示する;\r
1584                                 }\r
1585                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.LeftArrow ) )           // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.\r
1586                                 {\r
1587                                         ChangeInputAdjustTimeInPlaying( keyboard, -1 );\r
1588                                 }\r
1589                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.RightArrow ) )          // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.\r
1590                                 {\r
1591                                         ChangeInputAdjustTimeInPlaying( keyboard, +1 );\r
1592                                 }\r
1593                                 else if ( ( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 ) && ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Escape ) || CDTXMania.Pad.b押されたGB( Eパッド.FT ) ) )\r
1594                                 {       // escape (exit)\r
1595                                         this.actFO.tフェードアウト開始();\r
1596                                         base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;\r
1597                                         this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.演奏中断;\r
1598                                 }\r
1599                         }\r
1600                 }\r
1601 \r
1602                 protected void t入力メソッド記憶( E楽器パート part )\r
1603                 {\r
1604                         if ( CDTXMania.Pad.st検知したデバイス.Keyboard )\r
1605                         {\r
1606                                 this.b演奏にキーボードを使った[ (int) part ] = true;\r
1607                         }\r
1608                         if ( CDTXMania.Pad.st検知したデバイス.Joypad )\r
1609                         {\r
1610                                 this.b演奏にジョイパッドを使った[ (int) part ] = true;\r
1611                         }\r
1612                         if ( CDTXMania.Pad.st検知したデバイス.MIDIIN )\r
1613                         {\r
1614                                 this.b演奏にMIDI入力を使った[ (int) part ] = true;\r
1615                         }\r
1616                         if ( CDTXMania.Pad.st検知したデバイス.Mouse )\r
1617                         {\r
1618                                 this.b演奏にマウスを使った[ (int) part ] = true;\r
1619                         }\r
1620                 }\r
1621 \r
1622 \r
1623                 protected abstract void t進行描画・AVI();\r
1624                 protected void t進行描画・AVI(int x, int y)\r
1625                 {\r
1626                         if ( ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( !CDTXMania.ConfigIni.bストイックモード && CDTXMania.ConfigIni.bAVI有効 ) )\r
1627                         {\r
1628                                 this.actAVI.t進行描画( x, y );\r
1629                         }\r
1630                 }\r
1631                 protected abstract void t進行描画・BGA();\r
1632                 protected void t進行描画・BGA(int x, int y)\r
1633                 {\r
1634                         if ( ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( !CDTXMania.ConfigIni.bストイックモード && CDTXMania.ConfigIni.bBGA有効 ) )\r
1635                         {\r
1636                                 this.actBGA.t進行描画( x, y );\r
1637                         }\r
1638                 }\r
1639                 protected abstract void t進行描画・DANGER();\r
1640                 protected void t進行描画・MIDIBGM()\r
1641                 {\r
1642                         if ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED )\r
1643                         {\r
1644                                 CStage.Eフェーズ eフェーズid1 = base.eフェーズID;\r
1645                         }\r
1646                 }\r
1647                 protected void t進行描画・RGBボタン()\r
1648                 {\r
1649                         if ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )\r
1650                         {\r
1651                                 this.actRGB.On進行描画();\r
1652                         }\r
1653                 }\r
1654                 protected void t進行描画・STAGEFAILED()\r
1655                 {\r
1656                         if ( ( ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED ) || ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( ( this.actStageFailed.On進行描画() != 0 ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) )\r
1657                         {\r
1658                                 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージ失敗;\r
1659                                 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト;\r
1660                                 this.actFO.tフェードアウト開始();\r
1661                         }\r
1662                 }\r
1663                 protected void t進行描画・WailingBonus()\r
1664                 {\r
1665                         if ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
1666                         {\r
1667                                 this.actWailingBonus.On進行描画();\r
1668                         }\r
1669                 }\r
1670                 protected abstract void t進行描画・Wailing枠();\r
1671                 protected void t進行描画・Wailing枠(int GtWailingFrameX, int BsWailingFrameX, int GtWailingFrameY, int BsWailingFrameY)\r
1672                 {\r
1673                         if ( ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL ) && CDTXMania.ConfigIni.bGuitar有効 )\r
1674                         {\r
1675                                 if ( this.txWailing枠 != null )\r
1676                                 {\r
1677                                         if ( CDTXMania.DTX.bチップがある.Guitar )\r
1678                                         {\r
1679                                                 this.txWailing枠.t2D描画( CDTXMania.app.Device, GtWailingFrameX, GtWailingFrameY );\r
1680                                         }\r
1681                                         if ( CDTXMania.DTX.bチップがある.Bass )\r
1682                                         {\r
1683                                                 this.txWailing枠.t2D描画( CDTXMania.app.Device, BsWailingFrameX, BsWailingFrameY );\r
1684                                         }\r
1685                                 }\r
1686                         }\r
1687                 }\r
1688 \r
1689 \r
1690                 protected void t進行描画・チップファイアGB()\r
1691                 {\r
1692                         this.actChipFireGB.On進行描画();\r
1693                 }\r
1694                 protected abstract void t進行描画・パネル文字列();\r
1695                 protected void t進行描画・パネル文字列(int x, int y)\r
1696                 {\r
1697                         if ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
1698                         {\r
1699                                 this.actPanel.t進行描画( x, y );\r
1700                         }\r
1701                 }\r
1702                 protected void tパネル文字列の設定()\r
1703                 {\r
1704                         this.actPanel.SetPanelString( string.IsNullOrEmpty( CDTXMania.DTX.PANEL ) ? CDTXMania.DTX.TITLE : CDTXMania.DTX.PANEL );\r
1705                 }\r
1706 \r
1707 \r
1708                 protected void t進行描画・ゲージ()\r
1709                 {\r
1710                         if ( ( ( CDTXMania.ConfigIni.eDark != Eダークモード.HALF ) && ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL ) ) && ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) )\r
1711                         {\r
1712                                 this.actGauge.On進行描画();\r
1713                         }\r
1714                 }\r
1715                 protected void t進行描画・コンボ()\r
1716                 {\r
1717                         this.actCombo.On進行描画();\r
1718                 }\r
1719                 protected void t進行描画・スコア()\r
1720                 {\r
1721                         this.actScore.On進行描画();\r
1722                 }\r
1723                 protected void t進行描画・ステータスパネル()\r
1724                 {\r
1725                         this.actStatusPanels.On進行描画();\r
1726                 }\r
1727                 protected bool t進行描画・チップ( E楽器パート ePlayMode )\r
1728                 {\r
1729                         if ( ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED ) || ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
1730                         {\r
1731                                 return true;\r
1732                         }\r
1733                         if ( ( this.n現在のトップChip == -1 ) || ( this.n現在のトップChip >= listChip.Count ) )\r
1734                         {\r
1735                                 return true;\r
1736                         }\r
1737                         if ( this.n現在のトップChip == -1 )\r
1738                         {\r
1739                                 return true;\r
1740                         }\r
1741 \r
1742                         //double speed = 264.0; // BPM150の時の1小節の長さ[dot]\r
1743                         const double speed = 234.0;     // BPM150の時の1小節の長さ[dot]\r
1744 \r
1745                         double ScrollSpeedDrums = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Drums + 1.0 ) * 0.5 * 37.5 * speed / 60000.0;\r
1746                         double ScrollSpeedGuitar = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Guitar + 1.0 ) * 0.5 * 0.5 * 37.5 * speed / 60000.0;\r
1747                         double ScrollSpeedBass = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Bass + 1.0 ) * 0.5 * 0.5 * 37.5 * speed / 60000.0;\r
1748 \r
1749                         CDTX dTX = CDTXMania.DTX;\r
1750                         CConfigIni configIni = CDTXMania.ConfigIni;\r
1751                         for ( int nCurrentTopChip = this.n現在のトップChip; nCurrentTopChip < dTX.listChip.Count; nCurrentTopChip++ )\r
1752                         {\r
1753                                 CDTX.CChip pChip = dTX.listChip[ nCurrentTopChip ];\r
1754 //Debug.WriteLine( "nCurrentTopChip=" + nCurrentTopChip + ", ch=" + pChip.nチャンネル番号.ToString("x2") + ", 発音位置=" + pChip.n発声位置 + ", 発声時刻ms=" + pChip.n発声時刻ms );\r
1755                                 pChip.nバーからの距離dot.Drums = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedDrums );\r
1756                                 pChip.nバーからの距離dot.Guitar = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedGuitar );\r
1757                                 pChip.nバーからの距離dot.Bass = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedBass );\r
1758                                 if ( Math.Min( Math.Min( pChip.nバーからの距離dot.Drums, pChip.nバーからの距離dot.Guitar ), pChip.nバーからの距離dot.Bass ) > 450 )\r
1759                                 {\r
1760                                         break;\r
1761                                 }\r
1762 //                              if ( ( ( nCurrentTopChip == this.n現在のトップChip ) && ( pChip.nバーからの距離dot.Drums < -65 ) ) && pChip.bHit )\r
1763                                 // #28026 2012.4.5 yyagi; 信心ワールドエンドの曲終了後リザルトになかなか行かない問題の修正\r
1764                                 if ( ( dTX.listChip[ this.n現在のトップChip ].nバーからの距離dot.Drums < -65 ) && dTX.listChip[ this.n現在のトップChip ].bHit )\r
1765                                 {\r
1766 //                                      nCurrentTopChip = ++this.n現在のトップChip;\r
1767                                         ++this.n現在のトップChip;\r
1768                                         continue;\r
1769                                 }\r
1770 \r
1771                                 bool bPChipIsAutoPlay = bCheckAutoPlay( pChip );\r
1772 \r
1773                                 int nInputAdjustTime = ( bPChipIsAutoPlay || (pChip.e楽器パート == E楽器パート.UNKNOWN) )? 0 : this.nInputAdjustTimeMs[ (int) pChip.e楽器パート ];\r
1774 \r
1775                                 if ( ( ( pChip.e楽器パート != E楽器パート.UNKNOWN ) && !pChip.bHit ) &&\r
1776                                         ( ( pChip.nバーからの距離dot.Drums < 0 ) && ( this.e指定時刻からChipのJUDGEを返す( CSound管理.rc演奏用タイマ.n現在時刻, pChip, nInputAdjustTime ) == E判定.Miss ) ) )\r
1777                                 {\r
1778                                         this.tチップのヒット処理( CSound管理.rc演奏用タイマ.n現在時刻, pChip );\r
1779                                 }\r
1780                                 switch ( pChip.nチャンネル番号 )\r
1781                                 {\r
1782                                         #region [ 01: BGM ]\r
1783                                         case 0x01:      // BGM\r
1784                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1785                                                 {\r
1786                                                         pChip.bHit = true;\r
1787                                                         if ( configIni.bBGM音を発声する )\r
1788                                                         {\r
1789                                                                 dTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int) Eレーン.BGM, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
1790                                                         }\r
1791                                                 }\r
1792                                                 break;\r
1793                                         #endregion\r
1794                                         #region [ 03: BPM変更 ]\r
1795                                         case 0x03:      // BPM変更\r
1796                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1797                                                 {\r
1798                                                         pChip.bHit = true;\r
1799                                                         this.actPlayInfo.dbBPM = ( pChip.n整数値 * ( ( (double) configIni.n演奏速度 ) / 20.0 ) ) + dTX.BASEBPM;\r
1800                                                 }\r
1801                                                 break;\r
1802                                         #endregion\r
1803                                         #region [ 04, 07, 55, 56,57, 58, 59, 60:レイヤーBGA ]\r
1804                                         case 0x04:      // レイヤーBGA\r
1805                                         case 0x07:\r
1806                                         case 0x55:\r
1807                                         case 0x56:\r
1808                                         case 0x57:\r
1809                                         case 0x58:\r
1810                                         case 0x59:\r
1811                                         case 0x60:\r
1812                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1813                                                 {\r
1814                                                         pChip.bHit = true;\r
1815                                                         if ( configIni.bBGA有効 )\r
1816                                                         {\r
1817                                                                 switch ( pChip.eBGA種別 )\r
1818                                                                 {\r
1819                                                                         case EBGA種別.BMPTEX:\r
1820                                                                                 if ( pChip.rBMPTEX != null )\r
1821                                                                                 {\r
1822                                                                                         this.actBGA.Start( pChip.nチャンネル番号, null, pChip.rBMPTEX, pChip.rBMPTEX.tx画像.sz画像サイズ.Width, pChip.rBMPTEX.tx画像.sz画像サイズ.Height, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\r
1823                                                                                 }\r
1824                                                                                 break;\r
1825 \r
1826                                                                         case EBGA種別.BGA:\r
1827                                                                                 if ( ( pChip.rBGA != null ) && ( ( pChip.rBMP != null ) || ( pChip.rBMPTEX != null ) ) )\r
1828                                                                                 {\r
1829                                                                                         this.actBGA.Start( pChip.nチャンネル番号, pChip.rBMP, pChip.rBMPTEX, pChip.rBGA.pt画像側右下座標.X - pChip.rBGA.pt画像側左上座標.X, pChip.rBGA.pt画像側右下座標.Y - pChip.rBGA.pt画像側左上座標.Y, 0, 0, pChip.rBGA.pt画像側左上座標.X, pChip.rBGA.pt画像側左上座標.Y, 0, 0, pChip.rBGA.pt表示座標.X, pChip.rBGA.pt表示座標.Y, 0, 0, 0 );\r
1830                                                                                 }\r
1831                                                                                 break;\r
1832 \r
1833                                                                         case EBGA種別.BGAPAN:\r
1834                                                                                 if ( ( pChip.rBGAPan != null ) && ( ( pChip.rBMP != null ) || ( pChip.rBMPTEX != null ) ) )\r
1835                                                                                 {\r
1836                                                                                         this.actBGA.Start( pChip.nチャンネル番号, pChip.rBMP, pChip.rBMPTEX, pChip.rBGAPan.sz開始サイズ.Width, pChip.rBGAPan.sz開始サイズ.Height, pChip.rBGAPan.sz終了サイズ.Width, pChip.rBGAPan.sz終了サイズ.Height, pChip.rBGAPan.pt画像側開始位置.X, pChip.rBGAPan.pt画像側開始位置.Y, pChip.rBGAPan.pt画像側終了位置.X, pChip.rBGAPan.pt画像側終了位置.Y, pChip.rBGAPan.pt表示側開始位置.X, pChip.rBGAPan.pt表示側開始位置.Y, pChip.rBGAPan.pt表示側終了位置.X, pChip.rBGAPan.pt表示側終了位置.Y, pChip.n総移動時間 );\r
1837                                                                                 }\r
1838                                                                                 break;\r
1839 \r
1840                                                                         default:\r
1841                                                                                 if ( pChip.rBMP != null )\r
1842                                                                                 {\r
1843                                                                                         this.actBGA.Start( pChip.nチャンネル番号, pChip.rBMP, null, pChip.rBMP.n幅, pChip.rBMP.n高さ, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\r
1844                                                                                 }\r
1845                                                                                 break;\r
1846                                                                 }\r
1847                                                         }\r
1848                                                 }\r
1849                                                 break;\r
1850                                         #endregion\r
1851                                         #region [ 08: BPM変更(拡張) ]\r
1852                                         case 0x08:      // BPM変更(拡張)\r
1853                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1854                                                 {\r
1855                                                         pChip.bHit = true;\r
1856                                                         if ( dTX.listBPM.ContainsKey( pChip.n整数値・内部番号 ) )\r
1857                                                         {\r
1858                                                                 this.actPlayInfo.dbBPM = ( dTX.listBPM[ pChip.n整数値・内部番号 ].dbBPM値 * ( ( (double) configIni.n演奏速度 ) / 20.0 ) ) + dTX.BASEBPM;\r
1859                                                         }\r
1860                                                 }\r
1861                                                 break;\r
1862                                         #endregion\r
1863                                         #region [ 11-1a: ドラム演奏 ]\r
1864                                         case 0x11:      // ドラム演奏\r
1865                                         case 0x12:\r
1866                                         case 0x13:\r
1867                                         case 0x14:\r
1868                                         case 0x15:\r
1869                                         case 0x16:\r
1870                                         case 0x17:\r
1871                                         case 0x18:\r
1872                                         case 0x19:\r
1873                                         case 0x1a:\r
1874                                                 this.t進行描画・チップ・ドラムス( configIni, ref dTX, ref pChip );\r
1875                                                 break;\r
1876                                         #endregion\r
1877                                         #region [ 1f: フィルインサウンド(ドラム) ]\r
1878                                         case 0x1f:      // フィルインサウンド(ドラム)\r
1879                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1880                                                 {\r
1881                                                         pChip.bHit = true;\r
1882                                                         this.r現在の歓声Chip.Drums = pChip;\r
1883                                                 }\r
1884                                                 break;\r
1885                                         #endregion\r
1886                                         #region [ 20-27: ギター演奏 ]\r
1887                                         case 0x20:      // ギター演奏\r
1888                                         case 0x21:\r
1889                                         case 0x22:\r
1890                                         case 0x23:\r
1891                                         case 0x24:\r
1892                                         case 0x25:\r
1893                                         case 0x26:\r
1894                                         case 0x27:\r
1895                                                 this.t進行描画・チップ・ギターベース( configIni, ref dTX, ref pChip, E楽器パート.GUITAR );\r
1896                                                 break;\r
1897                                         #endregion\r
1898                                         #region [ 28: ウェイリング(ギター) ]\r
1899                                         case 0x28:      // ウェイリング(ギター)\r
1900                                                 this.t進行描画・チップ・ギター・ウェイリング( configIni, ref dTX, ref pChip );\r
1901                                                 break;\r
1902                                         #endregion\r
1903                                         #region [ 2f: ウェイリングサウンド(ギター) ]\r
1904                                         case 0x2f:      // ウェイリングサウンド(ギター)\r
1905                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Guitar < 0 ) )\r
1906                                                 {\r
1907                                                         pChip.bHit = true;\r
1908                                                         this.r現在の歓声Chip.Guitar = pChip;\r
1909                                                 }\r
1910                                                 break;\r
1911                                         #endregion\r
1912                                         #region [ 31-3a: 不可視チップ配置(ドラム) ]\r
1913                                         case 0x31:      // 不可視チップ配置(ドラム)\r
1914                                         case 0x32:\r
1915                                         case 0x33:\r
1916                                         case 0x34:\r
1917                                         case 0x35:\r
1918                                         case 0x36:\r
1919                                         case 0x37:\r
1920                                         case 0x38:\r
1921                                         case 0x39:\r
1922                                         case 0x3a:\r
1923                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1924                                                 {\r
1925                                                         pChip.bHit = true;\r
1926                                                 }\r
1927                                                 break;\r
1928                                         #endregion\r
1929                                         #region [ 50: 小節線 ]\r
1930                                         case 0x50:      // 小節線\r
1931                                                 {\r
1932                                                         this.t進行描画・チップ・小節線( configIni, ref dTX, ref pChip );\r
1933                                                         break;\r
1934                                                 }\r
1935                                         #endregion\r
1936                                         #region [ 51: 拍線 ]\r
1937                                         case 0x51:      // 拍線\r
1938                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1939                                                 {\r
1940                                                         pChip.bHit = true;\r
1941                                                 }\r
1942                                                 if ( ( ePlayMode == E楽器パート.DRUMS ) && ( configIni.eDark != Eダークモード.FULL ) && pChip.b可視 && ( this.txチップ != null ) )\r
1943                                                 {\r
1944                                                         this.txチップ.t2D描画( CDTXMania.app.Device, 0x23, configIni.bReverse.Drums ? ( ( 0x38 + pChip.nバーからの距離dot.Drums ) - 1 ) : ( ( 0x1a6 - pChip.nバーからの距離dot.Drums ) - 1 ), new Rectangle( 0, 0x1bf, 0x128, 1 ) );\r
1945                                                 }\r
1946                                                 break;\r
1947                                         #endregion\r
1948                                         #region [ 52: MIDIコーラス ]\r
1949                                         case 0x52:      // MIDIコーラス\r
1950                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1951                                                 {\r
1952                                                         pChip.bHit = true;\r
1953                                                 }\r
1954                                                 break;\r
1955                                         #endregion\r
1956                                         #region [ 53: フィルイン ]\r
1957                                         case 0x53:      // フィルイン\r
1958                                                 this.t進行描画・チップ・フィルイン( configIni, ref dTX, ref pChip );\r
1959                                                 break;\r
1960                                         #endregion\r
1961                                         #region [ 54: 動画再生 ]\r
1962                                         case 0x54:      // 動画再生\r
1963                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1964                                                 {\r
1965                                                         pChip.bHit = true;\r
1966                                                         if ( configIni.bAVI有効 )\r
1967                                                         {\r
1968                                                                 switch ( pChip.eAVI種別 )\r
1969                                                                 {\r
1970                                                                         case EAVI種別.AVI:\r
1971                                                                                 if ( pChip.rAVI != null )\r
1972                                                                                 {\r
1973                                                                                         this.actAVI.Start( pChip.nチャンネル番号, pChip.rAVI, 278, 355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, pChip.n発声時刻ms );\r
1974                                                                                 }\r
1975                                                                                 break;\r
1976 \r
1977                                                                         case EAVI種別.AVIPAN:\r
1978                                                                                 if ( pChip.rAVIPan != null )\r
1979                                                                                 {\r
1980                                                                                         this.actAVI.Start( pChip.nチャンネル番号, pChip.rAVI, pChip.rAVIPan.sz開始サイズ.Width, pChip.rAVIPan.sz開始サイズ.Height, pChip.rAVIPan.sz終了サイズ.Width, pChip.rAVIPan.sz終了サイズ.Height, pChip.rAVIPan.pt動画側開始位置.X, pChip.rAVIPan.pt動画側開始位置.Y, pChip.rAVIPan.pt動画側終了位置.X, pChip.rAVIPan.pt動画側終了位置.Y, pChip.rAVIPan.pt表示側開始位置.X, pChip.rAVIPan.pt表示側開始位置.Y, pChip.rAVIPan.pt表示側終了位置.X, pChip.rAVIPan.pt表示側終了位置.Y, pChip.n総移動時間, pChip.n発声時刻ms );\r
1981                                                                                 }\r
1982                                                                                 break;\r
1983                                                                 }\r
1984                                                         }\r
1985                                                 }\r
1986                                                 break;\r
1987                                         #endregion\r
1988                                         #region [ 61-92: 自動再生(BGM, SE) ]\r
1989                                         case 0x61:\r
1990                                         case 0x62:\r
1991                                         case 0x63:\r
1992                                         case 0x64:      // 自動再生(BGM, SE)\r
1993                                         case 0x65:\r
1994                                         case 0x66:\r
1995                                         case 0x67:\r
1996                                         case 0x68:\r
1997                                         case 0x69:\r
1998                                         case 0x70:\r
1999                                         case 0x71:\r
2000                                         case 0x72:\r
2001                                         case 0x73:\r
2002                                         case 0x74:\r
2003                                         case 0x75:\r
2004                                         case 0x76:\r
2005                                         case 0x77:\r
2006                                         case 0x78:\r
2007                                         case 0x79:\r
2008                                         case 0x80:\r
2009                                         case 0x81:\r
2010                                         case 0x82:\r
2011                                         case 0x83:\r
2012                                         case 0x90:\r
2013                                         case 0x91:\r
2014                                         case 0x92:\r
2015                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2016                                                 {\r
2017                                                         pChip.bHit = true;\r
2018                                                         if ( configIni.bBGM音を発声する )\r
2019                                                         {\r
2020                                                                 dTX.tWavの再生停止( this.n最後に再生したBGMの実WAV番号[ pChip.nチャンネル番号 - 0x61 ] );\r
2021                                                                 dTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, ( int ) Eレーン.BGM, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
2022                                                                 this.n最後に再生したBGMの実WAV番号[ pChip.nチャンネル番号 - 0x61 ] = pChip.n整数値・内部番号;\r
2023                                                         }\r
2024                                                 }\r
2025                                                 break;\r
2026                                         #endregion\r
2027 \r
2028 \r
2029                                         #region [ 84-89: 仮: override sound ]  // #26338 2011.11.8 yyagi\r
2030                                         case 0x84:      // HH (HO/HC)\r
2031                                         case 0x85:      // CY\r
2032                                         case 0x86:      // RD\r
2033                                         case 0x87:      // LC\r
2034                                         case 0x88:      // Guitar\r
2035                                         case 0x89:      // Bass\r
2036                                         // mute sound (auto)\r
2037                                         // 4A: 84: HH (HO/HC)\r
2038                                         // 4B: 85: CY\r
2039                                         // 4C: 86: RD\r
2040                                         // 4D: 87: LC\r
2041                                         // 2A: 88: Gt\r
2042                                         // AA: 89: Bs\r
2043 \r
2044                                         //      CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Guitar );\r
2045                                         //      CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, 8, n音量, bモニタ, b音程をずらして再生 );\r
2046                                         //      this.n最後に再生した実WAV番号.Guitar = pChip.n整数値・内部番号;\r
2047 \r
2048                                         //      protected void tサウンド再生( CDTX.CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生 )\r
2049                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2050                                                 {\r
2051                                                         pChip.bHit = true;\r
2052                                                         E楽器パート[] p = { E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.GUITAR, E楽器パート.BASS };\r
2053 \r
2054                                                         E楽器パート pp =  p[ pChip.nチャンネル番号 - 0x84 ];\r
2055                                                         \r
2056 //                                                      if ( pp == E楽器パート.DRUMS ) {                   // pChip.nチャンネル番号= ..... HHとか、ドラムの場合は変える。\r
2057 //                                                              //            HC    CY    RD    LC\r
2058 //                                                              int[] ch = { 0x11, 0x16, 0x19, 0x1A };\r
2059 //                                                              pChip.nチャンネル番号 = ch[ pChip.nチャンネル番号 - 0x84 ]; \r
2060 //                                                      }\r
2061                                                         this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, pp, dTX.nモニタを考慮した音量( pp ) );\r
2062                                                 }\r
2063                                                 break;\r
2064                                         #endregion\r
2065 \r
2066                                         #region [ a0-a7: ベース演奏 ]\r
2067                                         case 0xa0:      // ベース演奏\r
2068                                         case 0xa1:\r
2069                                         case 0xa2:\r
2070                                         case 0xa3:\r
2071                                         case 0xa4:\r
2072                                         case 0xa5:\r
2073                                         case 0xa6:\r
2074                                         case 0xa7:\r
2075                                                 this.t進行描画・チップ・ギターベース( configIni, ref dTX, ref pChip, E楽器パート.BASS );\r
2076                                                 break;\r
2077                                         #endregion\r
2078                                         #region [ a8: ウェイリング(ベース) ]\r
2079                                         case 0xa8:      // ウェイリング(ベース)\r
2080                                                 this.t進行描画・チップ・ベース・ウェイリング( configIni, ref dTX, ref pChip );\r
2081                                                 break;\r
2082                                         #endregion\r
2083                                         #region [ af: ウェイリングサウンド(ベース) ]\r
2084                                         case 0xaf:      // ウェイリングサウンド(ベース)\r
2085                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )\r
2086                                                 {\r
2087                                                         pChip.bHit = true;\r
2088                                                         this.r現在の歓声Chip.Bass = pChip;\r
2089                                                 }\r
2090                                                 break;\r
2091                                         #endregion\r
2092                                         #region [ b1-b9, bc: 空打ち音設定(ドラム) ]\r
2093                                         case 0xb1:      // 空打ち音設定(ドラム)\r
2094                                         case 0xb2:\r
2095                                         case 0xb3:\r
2096                                         case 0xb4:\r
2097                                         case 0xb5:\r
2098                                         case 0xb6:\r
2099                                         case 0xb7:\r
2100                                         case 0xb8:\r
2101                                         case 0xb9:\r
2102                                         case 0xbc:\r
2103                                                 this.t進行描画・チップ・空打ち音設定・ドラム( configIni, ref dTX, ref pChip );\r
2104                                                 break;\r
2105                                         #endregion\r
2106                                         #region [ ba: 空打ち音設定(ギター) ]\r
2107                                         case 0xba:      // 空打ち音設定(ギター)\r
2108                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Guitar < 0 ) )\r
2109                                                 {\r
2110                                                         pChip.bHit = true;\r
2111                                                         this.r現在の空うちギターChip = pChip;\r
2112                                                         pChip.nチャンネル番号 = 0x20;\r
2113                                                 }\r
2114                                                 break;\r
2115                                         #endregion\r
2116                                         #region [ bb: 空打ち音設定(ベース) ]\r
2117                                         case 0xbb:      // 空打ち音設定(ベース)\r
2118                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )\r
2119                                                 {\r
2120                                                         pChip.bHit = true;\r
2121                                                         this.r現在の空うちベースChip = pChip;\r
2122                                                         pChip.nチャンネル番号 = 0xA0;\r
2123                                                 }\r
2124                                                 break;\r
2125                                         #endregion\r
2126                                         #region [ c4, c7, d5-d9, e0: BGA画像入れ替え ]\r
2127                                         case 0xc4:\r
2128                                         case 0xc7:\r
2129                                         case 0xd5:\r
2130                                         case 0xd6:      // BGA画像入れ替え\r
2131                                         case 0xd7:\r
2132                                         case 0xd8:\r
2133                                         case 0xd9:\r
2134                                         case 0xe0:\r
2135                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2136                                                 {\r
2137                                                         pChip.bHit = true;\r
2138                                                         if ( ( configIni.bBGA有効 && ( pChip.eBGA種別 == EBGA種別.BMP ) ) || ( pChip.eBGA種別 == EBGA種別.BMPTEX ) )\r
2139                                                         {\r
2140                                                                 for ( int i = 0; i < 8; i++ )\r
2141                                                                 {\r
2142                                                                         if ( this.nBGAスコープチャンネルマップ[ 0, i ] == pChip.nチャンネル番号 )\r
2143                                                                         {\r
2144                                                                                 this.actBGA.ChangeScope( this.nBGAスコープチャンネルマップ[ 1, i ], pChip.rBMP, pChip.rBMPTEX );\r
2145                                                                         }\r
2146                                                                 }\r
2147                                                         }\r
2148                                                 }\r
2149                                                 break;\r
2150                                         #endregion\r
2151                                         #region [ da: ミキサーへチップ音追加 ]\r
2152                                         case 0xDA:\r
2153                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2154                                                 {\r
2155 //Debug.WriteLine( "[DA(AddMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );\r
2156                                                         pChip.bHit = true;\r
2157                                                         if ( listWAV.ContainsKey( pChip.n整数値・内部番号 ) )   // 参照が遠いので後日最適化する\r
2158                                                         {\r
2159                                                                 CDTX.CWAV wc = listWAV[ pChip.n整数値・内部番号 ];\r
2160                                                                 for ( int i = 0; i < nPolyphonicSounds; i++ )\r
2161                                                                 {\r
2162                                                                         if ( wc.rSound[ i ] != null )\r
2163                                                                         {\r
2164                                                                                 //CDTXMania.Sound管理.AddMixer( wc.rSound[ i ] );\r
2165                                                                                 AddMixer( wc.rSound[ i ], pChip.b演奏終了後も再生が続くチップである );\r
2166                                                                         }\r
2167                                                                 }\r
2168                                                         }\r
2169                                                 }\r
2170                                                 break;\r
2171                                         #endregion\r
2172                                         #region [ db: ミキサーからチップ音削除 ]\r
2173                                         case 0xDB:\r
2174                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2175                                                 {\r
2176 //Debug.WriteLine( "[DB(RemoveMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );\r
2177                                                         pChip.bHit = true;\r
2178                                                         if ( listWAV.ContainsKey( pChip.n整数値・内部番号 ) )   // 参照が遠いので後日最適化する\r
2179                                                         {\r
2180                                                             CDTX.CWAV wc = listWAV[ pChip.n整数値・内部番号 ];\r
2181                                                             for ( int i = 0; i < nPolyphonicSounds; i++ )\r
2182                                                             {\r
2183                                                                         if ( wc.rSound[ i ] != null )\r
2184                                                                         {\r
2185                                                                                 //CDTXMania.Sound管理.RemoveMixer( wc.rSound[ i ] );\r
2186                                                                                 if ( !wc.rSound[ i ].b演奏終了後も再生が続くチップである )     // #32248 2013.10.16 yyagi\r
2187                                                                                 {                                                                                                                       // DTX終了後も再生が続くチップの0xDB登録をなくすことはできず。\r
2188                                                                                         RemoveMixer( wc.rSound[ i ] );                                                  // (ミキサー解除のタイミングが遅延する場合の対応が面倒なので。)\r
2189                                                                                 }                                                                                                                       // そこで、代わりにフラグをチェックしてミキサー削除ロジックへの遷移をカットする。\r
2190                                                                         }\r
2191                                                             }\r
2192                                                         }\r
2193                                                 }\r
2194                                                 break;\r
2195                                         #endregion\r
2196                                         #region [ その他(未定義) ]\r
2197                                         default:\r
2198                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2199                                                 {\r
2200                                                         pChip.bHit = true;\r
2201                                                 }\r
2202                                                 break;\r
2203                                         #endregion \r
2204                                 }\r
2205                         }\r
2206                         return false;\r
2207                 }\r
2208 \r
2209                 public void t再読込()\r
2210                 {\r
2211                         CDTXMania.DTX.t全チップの再生停止();\r
2212                         this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.再読込・再演奏;\r
2213                         base.eフェーズID = CStage.Eフェーズ.演奏_再読込;\r
2214                 }\r
2215 \r
2216                 public void t停止()\r
2217                 {\r
2218                         CDTXMania.DTX.t全チップの再生停止();\r
2219                         this.actAVI.Stop();\r
2220                         this.actBGA.Stop();\r
2221 \r
2222                         this.n現在のトップChip = CDTXMania.DTX.listChip.Count - 1;        // 終端にシーク\r
2223 \r
2224                         // 自分自身のOn活性化()相当の処理もすべき。\r
2225                 }\r
2226 \r
2227                 public void t演奏位置の変更( int nStartBar )\r
2228                 {\r
2229                         // まず全サウンドオフにする\r
2230                         CDTXMania.DTX.t全チップの再生停止();\r
2231                         this.actAVI.Stop();\r
2232                         this.actBGA.Stop();\r
2233 \r
2234                         #region [ 再生開始小節の変更 ]\r
2235                         nStartBar++;                                                                    // +1が必要\r
2236 \r
2237                         #region [ 演奏済みフラグのついたChipをリセットする ]\r
2238                         for ( int i = 0; i < CDTXMania.DTX.listChip.Count; i++ )\r
2239                         {\r
2240                                 CDTX.CChip pChip = CDTXMania.DTX.listChip[ i ];\r
2241                                 if ( pChip.bHit )\r
2242                                 {\r
2243                                         CDTX.CChip p = (CDTX.CChip) pChip.Clone();\r
2244                                         p.bHit = false;\r
2245                                         CDTXMania.DTX.listChip[ i ] = p;\r
2246                                 }\r
2247                         }\r
2248                         #endregion\r
2249 \r
2250                         #region [ 処理を開始するチップの特定 ]\r
2251                         //for ( int i = this.n現在のトップChip; i < CDTXMania.DTX.listChip.Count; i++ )\r
2252                         bool bSuccessSeek = false;\r
2253                         for ( int i = 0; i < CDTXMania.DTX.listChip.Count; i++ )\r
2254                         {\r
2255                                 CDTX.CChip pChip = CDTXMania.DTX.listChip[ i ];\r
2256                                 if ( pChip.n発声位置 < 384 * nStartBar )\r
2257                                 {\r
2258                                         continue;\r
2259                                 }\r
2260                                 else\r
2261                                 {\r
2262                                         bSuccessSeek = true;\r
2263                                         this.n現在のトップChip = i;\r
2264                                         break;\r
2265                                 }\r
2266                         }\r
2267                         if ( !bSuccessSeek )\r
2268                         {\r
2269                                 // this.n現在のトップChip = CDTXMania.DTX.listChip.Count - 1;\r
2270                                 this.n現在のトップChip = 0;               // 対象小節が存在しないなら、最初から再生\r
2271                         }\r
2272                         #endregion\r
2273 \r
2274                         #region [ 演奏開始の発声時刻msを取得し、タイマに設定 ]\r
2275                         int nStartTime = CDTXMania.DTX.listChip[ this.n現在のトップChip ].n発声時刻ms;\r
2276                         CSound管理.rc演奏用タイマ.t一時停止();\r
2277                         CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;\r
2278                         #endregion\r
2279 \r
2280                         List<CSound> pausedCSound = new List<CSound>();\r
2281 \r
2282                         #region [ BGMやギターなど、演奏開始のタイミングで再生がかかっているサウンドのの途中再生開始 ] // (CDTXのt入力・行解析・チップ配置()で小節番号が+1されているのを削っておくこと)\r
2283                         bool bAVIPlaying = false;\r
2284                         for ( int i = this.n現在のトップChip; i >= 0; i-- )\r
2285                         {\r
2286                                 CDTX.CChip pChip = CDTXMania.DTX.listChip[ i ];\r
2287                                 int nDuration = pChip.GetDuration();\r
2288 \r
2289                                 if ( ( pChip.n発声時刻ms + nDuration > 0 ) && ( pChip.n発声時刻ms <= nStartTime ) && ( nStartTime <= pChip.n発声時刻ms + nDuration ) )\r
2290                                 {\r
2291                                         if ( pChip.bWAVを使うチャンネルである )\r
2292                                         {\r
2293                                                 CDTX.CWAV wc = CDTXMania.DTX.listWAV[ pChip.n整数値・内部番号 ];\r
2294                                                 if ( ( wc.bIsBGMSound && CDTXMania.ConfigIni.bBGM音を発声する ) || ( !wc.bIsBGMSound ) )\r
2295                                                 {\r
2296                                                         CDTXMania.DTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int) Eレーン.BGM, CDTXMania.DTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
2297                                                         #region [ PAUSEする ]\r
2298                                                         int j = wc.n現在再生中のサウンド番号;\r
2299                                                         if ( wc.rSound[ j ] != null )\r
2300                                                         {\r
2301                                                                 wc.rSound[ j ].t再生を一時停止する();\r
2302                                                                 wc.rSound[ j ].t再生位置を変更する( nStartTime - pChip.n発声時刻ms );\r
2303                                                                 pausedCSound.Add( wc.rSound[ j ] );\r
2304                                                         }\r
2305                                                         #endregion\r
2306                                                 }\r
2307                                         }\r
2308                                 }\r
2309                         }\r
2310                         #endregion\r
2311                         #region [ 演奏開始時点で既に表示されているBGAとAVIの、シークと再生 ]\r
2312                         this.actBGA.SkipStart( nStartTime );\r
2313                         this.actAVI.SkipStart( nStartTime );\r
2314                         #endregion\r
2315                         #region [ PAUSEしていたサウンドを一斉に再生再開する(ただしタイマを止めているので、ここではまだ再生開始しない) ]\r
2316                         foreach ( CSound cs in pausedCSound )\r
2317                         {\r
2318                                 cs.tサウンドを再生する();\r
2319                         }\r
2320                         pausedCSound.Clear();\r
2321                         pausedCSound = null;\r
2322                         #endregion\r
2323                         #region [ タイマを再開して、PAUSEから復帰する ]\r
2324                         CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;\r
2325                         CDTXMania.Timer.n現在時刻 = nStartTime;                             // Debug表示のTime: 表記を正しくするために必要\r
2326                         CSound管理.rc演奏用タイマ.t再開();\r
2327                         CDTXMania.Timer.t再開();\r
2328                         #endregion\r
2329                         #endregion\r
2330                 }\r
2331 \r
2332 \r
2333                 /// <summary>\r
2334                 /// DTXV用の設定をする。(全AUTOなど)\r
2335                 /// 元の設定のバックアップなどはしないので、あとでConfig.iniを上書き保存しないこと。\r
2336                 /// </summary>\r
2337                 protected void tDTXV用の設定()\r
2338                 {\r
2339                         CDTXMania.ConfigIni.bAutoPlay.HH = true;\r
2340                         CDTXMania.ConfigIni.bAutoPlay.SD = true;\r
2341                         CDTXMania.ConfigIni.bAutoPlay.BD = true;\r
2342                         CDTXMania.ConfigIni.bAutoPlay.HT = true;\r
2343                         CDTXMania.ConfigIni.bAutoPlay.LT = true;\r
2344                         CDTXMania.ConfigIni.bAutoPlay.CY = true;\r
2345                         CDTXMania.ConfigIni.bAutoPlay.FT = true;\r
2346                         CDTXMania.ConfigIni.bAutoPlay.RD = true;\r
2347                         CDTXMania.ConfigIni.bAutoPlay.LC = true;\r
2348                         CDTXMania.ConfigIni.bAutoPlay.GtR = true;\r
2349                         CDTXMania.ConfigIni.bAutoPlay.GtB = true;\r
2350                         CDTXMania.ConfigIni.bAutoPlay.GtB = true;\r
2351                         CDTXMania.ConfigIni.bAutoPlay.GtPick = true;\r
2352                         CDTXMania.ConfigIni.bAutoPlay.GtW = true;\r
2353                         CDTXMania.ConfigIni.bAutoPlay.BsR = true;\r
2354                         CDTXMania.ConfigIni.bAutoPlay.BsB = true;\r
2355                         CDTXMania.ConfigIni.bAutoPlay.BsB = true;\r
2356                         CDTXMania.ConfigIni.bAutoPlay.BsPick = true;\r
2357                         CDTXMania.ConfigIni.bAutoPlay.BsW = true;\r
2358 \r
2359                         this.bIsAutoPlay = CDTXMania.ConfigIni.bAutoPlay;\r
2360 \r
2361                         CDTXMania.ConfigIni.bAVI有効 = true;\r
2362                         CDTXMania.ConfigIni.bBGA有効 = true;\r
2363                         for ( int i = 0; i < 3; i++ )\r
2364                         {\r
2365                                 CDTXMania.ConfigIni.bGraph[ i ] = false;\r
2366                                 CDTXMania.ConfigIni.bHidden[ i ] = false;\r
2367                                 CDTXMania.ConfigIni.bLeft[ i ] = false;\r
2368                                 CDTXMania.ConfigIni.bLight[ i ] = false;\r
2369                                 CDTXMania.ConfigIni.bReverse[ i ] = false;\r
2370                                 CDTXMania.ConfigIni.bSudden[ i ] = false;\r
2371                                 CDTXMania.ConfigIni.eInvisible[ i ] = EInvisible.OFF;\r
2372                                 CDTXMania.ConfigIni.eRandom[ i ] = Eランダムモード.OFF;\r
2373                                 CDTXMania.ConfigIni.n表示可能な最小コンボ数[ i ] = 65535;\r
2374                                 CDTXMania.ConfigIni.判定文字表示位置[ i ] = E判定文字表示位置.表示OFF;\r
2375                         }\r
2376 \r
2377                         CDTXMania.ConfigIni.eDark = Eダークモード.OFF;\r
2378 \r
2379                         CDTXMania.ConfigIni.bScoreIniを出力する = false;\r
2380                         CDTXMania.ConfigIni.bSTAGEFAILED有効 = false;\r
2381                         CDTXMania.ConfigIni.bTight = false;\r
2382                         CDTXMania.ConfigIni.bストイックモード = false;\r
2383                         CDTXMania.ConfigIni.bドラム打音を発声する = true;\r
2384                         CDTXMania.ConfigIni.bBGM音を発声する = true;\r
2385 \r
2386                         CDTXMania.ConfigIni.nRisky = 0;\r
2387                         CDTXMania.ConfigIni.nShowLagType = 0;\r
2388                         CDTXMania.ConfigIni.ドラムコンボ文字の表示位置 = Eドラムコンボ文字の表示位置.OFF;\r
2389                 }\r
2390 \r
2391 \r
2392                 private bool bCheckAutoPlay( CDTX.CChip pChip )\r
2393                 {\r
2394                         bool bPChipIsAutoPlay = false;\r
2395                         bool bGtBsR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );\r
2396                         bool bGtBsG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );\r
2397                         bool bGtBsB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );\r
2398                         bool bGtBsW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );\r
2399                         bool bGtBsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );\r
2400                         //if ( (\r
2401                         //        ( ( pChip.e楽器パート == E楽器パート.DRUMS ) && bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] ) ||\r
2402                         //        ( ( pChip.e楽器パート == E楽器パート.GUITAR ) && bIsAutoPlay.Guitar ) ) ||\r
2403                         //        ( ( pChip.e楽器パート == E楽器パート.BASS ) && bIsAutoPlay.Bass )\r
2404                         //  )\r
2405                         ////                            if ((pChip.e楽器パート == E楽器パート.DRUMS) && bIsAutoPlay[this.nチャンネル0Atoレーン07[pChip.nチャンネル番号 - 0x11]])\r
2406                         //{\r
2407                         //    bPChipIsAutoPlay = true;\r
2408                         //}\r
2409                         if ( pChip.e楽器パート == E楽器パート.DRUMS )\r
2410                         {\r
2411                                 if ( bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] )\r
2412                                 {\r
2413                                         bPChipIsAutoPlay = true;\r
2414                                 }\r
2415                         }\r
2416                         else if ( pChip.e楽器パート == E楽器パート.GUITAR )\r
2417                         {\r
2418                                 //Trace.TraceInformation( "chip:{0}{1}{2} ", bGtBsR, bGtBsG, bGtBsB );\r
2419                                 //Trace.TraceInformation( "auto:{0}{1}{2} ", bIsAutoPlay[ (int) Eレーン.GtR ], bIsAutoPlay[ (int) Eレーン.GtG ], bIsAutoPlay[ (int) Eレーン.GtB ]);\r
2420                                 bPChipIsAutoPlay = true;\r
2421                                 if ( bIsAutoPlay[ (int) Eレーン.GtPick ] == false ) bPChipIsAutoPlay = false;\r
2422                                 else\r
2423                                 {\r
2424                                         if ( bGtBsR == true && bIsAutoPlay[ (int) Eレーン.GtR ] == false ) bPChipIsAutoPlay = false;\r
2425                                         else if ( bGtBsG == true && bIsAutoPlay[ (int) Eレーン.GtG ] == false ) bPChipIsAutoPlay = false;\r
2426                                         else if ( bGtBsB == true && bIsAutoPlay[ (int) Eレーン.GtB ] == false ) bPChipIsAutoPlay = false;\r
2427                                         else if ( bGtBsW == true && bIsAutoPlay[ (int) Eレーン.GtW ] == false ) bPChipIsAutoPlay = false;\r
2428                                         else if ( bGtBsO == true &&\r
2429                                                 ( bIsAutoPlay[ (int) Eレーン.GtR ] == false || bIsAutoPlay[ (int) Eレーン.GtG ] == false || bIsAutoPlay[ (int) Eレーン.GtB ] == false ) )\r
2430                                                 bPChipIsAutoPlay = false;\r
2431                                 }\r
2432                                 //Trace.TraceInformation( "{0:x2}: {1}", pChip.nチャンネル番号, bPChipIsAutoPlay.ToString() );\r
2433                         }\r
2434                         else if ( pChip.e楽器パート == E楽器パート.BASS )\r
2435                         {\r
2436                                 bPChipIsAutoPlay = true;\r
2437                                 if ( bIsAutoPlay[ (int) Eレーン.BsPick ] == false ) bPChipIsAutoPlay = false;\r
2438                                 else\r
2439                                 {\r
2440                                         if ( bGtBsR == true && bIsAutoPlay[ (int) Eレーン.BsR ] == false ) bPChipIsAutoPlay = false;\r
2441                                         else if ( bGtBsG == true && bIsAutoPlay[ (int) Eレーン.BsG ] == false ) bPChipIsAutoPlay = false;\r
2442                                         else if ( bGtBsB == true && bIsAutoPlay[ (int) Eレーン.BsB ] == false ) bPChipIsAutoPlay = false;\r
2443                                         else if ( bGtBsW == true && bIsAutoPlay[ (int) Eレーン.BsW ] == false ) bPChipIsAutoPlay = false;\r
2444                                         else if ( bGtBsO == true &&\r
2445                                                 ( bIsAutoPlay[ (int) Eレーン.BsR ] == false || bIsAutoPlay[ (int) Eレーン.BsG ] == false || bIsAutoPlay[ (int) Eレーン.BsB ] == false ) )\r
2446                                                 bPChipIsAutoPlay = false;\r
2447                                 }\r
2448                         }\r
2449                         return bPChipIsAutoPlay;\r
2450                 }\r
2451 \r
2452                 protected abstract void t進行描画・チップ・ドラムス( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2453                 //protected abstract void t進行描画・チップ・ギター( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2454                 protected abstract void t進行描画・チップ・ギターベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst );\r
2455 \r
2456                 protected void t進行描画・チップ・ギターベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst,\r
2457                         int barYNormal, int barYReverse, int showRangeY0, int showRangeY1, int openXg, int openXb,\r
2458                         int rectOpenOffsetX, int rectOpenOffsetY, int openChipWidth, int chipHeight,\r
2459                         int chipWidth, int guitarNormalX, int guitarLeftyX, int bassNormalX, int bassLeftyX, int drawDeltaX, int chipTexDeltaX )\r
2460                 {\r
2461                         int instIndex = (int) inst;\r
2462                         if ( configIni.bGuitar有効 )\r
2463                         {\r
2464                                 #region [ Invisible処理 ]\r
2465                                 if ( configIni.eInvisible[ instIndex ] != EInvisible.OFF )\r
2466                                 {\r
2467                                         cInvisibleChip.SetInvisibleStatus( ref pChip );\r
2468                                 }\r
2469                                 #endregion\r
2470                                 else\r
2471                                 {\r
2472                                         #region [ Hidden/Sudden処理 ]\r
2473                                         if ( configIni.bSudden[ instIndex ] )\r
2474                                         {\r
2475                                                 pChip.b可視 = pChip.nバーからの距離dot[ instIndex ] < 200;\r
2476                                         }\r
2477                                         if ( configIni.bHidden[ instIndex ] && ( pChip.nバーからの距離dot[ instIndex ] < 100 ) )\r
2478                                         {\r
2479                                                 pChip.b可視 = false;\r
2480                                         }\r
2481                                         #endregion\r
2482                                 }\r
2483 \r
2484                                 bool bChipHasR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );\r
2485                                 bool bChipHasG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );\r
2486                                 bool bChipHasB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );\r
2487                                 bool bChipHasW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );\r
2488                                 bool bChipIsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );\r
2489 \r
2490                                 #region [ chip描画 ]\r
2491                                 int OPEN = ( inst == E楽器パート.GUITAR ) ? 0x20 : 0xA0;\r
2492                                 if ( !pChip.bHit && pChip.b可視 )\r
2493                                 {\r
2494                                         if ( this.txチップ != null )\r
2495                                         {\r
2496                                                 this.txチップ.n透明度 = pChip.n透明度;\r
2497                                         }\r
2498                                         int y = configIni.bReverse[ instIndex ] ? ( barYReverse - pChip.nバーからの距離dot[ instIndex ] ) : ( barYNormal + pChip.nバーからの距離dot[ instIndex ] );\r
2499                                         if ( ( showRangeY0 < y ) && ( y < showRangeY1 ) )\r
2500                                         {\r
2501                                                 if ( this.txチップ != null )\r
2502                                                 {\r
2503                                                         int nアニメカウンタ現在の値 = this.ctチップ模様アニメ[ instIndex ].n現在の値;\r
2504                                                         if ( pChip.nチャンネル番号 == OPEN )\r
2505                                                         {\r
2506                                                                 int xo = ( inst == E楽器パート.GUITAR ) ? openXg : openXb;\r
2507                                                                 this.txチップ.t2D描画( CDTXMania.app.Device, xo, y - 2, new Rectangle( rectOpenOffsetX, rectOpenOffsetY + ( ( nアニメカウンタ現在の値 % 5 ) * chipHeight ), openChipWidth, chipHeight ) );\r
2508                                                         }\r
2509                                                         Rectangle rc = new Rectangle( rectOpenOffsetX, nアニメカウンタ現在の値 * chipHeight, chipWidth, chipHeight );\r
2510                                                         int x;\r
2511                                                         if ( inst == E楽器パート.GUITAR )\r
2512                                                         {\r
2513                                                                 x = ( configIni.bLeft.Guitar ) ? guitarLeftyX : guitarNormalX;\r
2514                                                         }\r
2515                                                         else\r
2516                                                         {\r
2517                                                                 x = ( configIni.bLeft.Bass ) ? bassLeftyX : bassNormalX;\r
2518                                                         }\r
2519                                                         int deltaX = ( configIni.bLeft[ instIndex ] ) ? -drawDeltaX : +drawDeltaX;\r
2520 \r
2521 //Trace.TraceInformation( "chip={0:x2}, E楽器パート={1}, x={2}", pChip.nチャンネル番号, inst, x );\r
2522                                                         if ( bChipHasR )\r
2523                                                         {\r
2524                                                                 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - chipHeight / 2, rc );\r
2525                                                         }\r
2526                                                         rc.X += chipTexDeltaX;\r
2527                                                         x += deltaX;\r
2528                                                         if ( bChipHasG )\r
2529                                                         {\r
2530                                                                 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - chipHeight / 2, rc );\r
2531                                                         }\r
2532                                                         rc.X += chipTexDeltaX;\r
2533                                                         x += deltaX;\r
2534                                                         if ( bChipHasB )\r
2535                                                         {\r
2536                                                                 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - chipHeight / 2, rc );\r
2537                                                         }\r
2538                                                 }\r
2539                                         }\r
2540                                 }\r
2541                                 #endregion\r
2542                                 //if ( ( configIni.bAutoPlay.Guitar && !pChip.bHit ) && ( pChip.nバーからの距離dot.Guitar < 0 ) )\r
2543                                 if ( ( !pChip.bHit ) && ( pChip.nバーからの距離dot[ instIndex ] < 0 ) )\r
2544                                 {\r
2545                                         int lo = ( inst == E楽器パート.GUITAR ) ? 0 : 3;   // lane offset\r
2546                                         bool autoR = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtR : bIsAutoPlay.BsR;\r
2547                                         bool autoG = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtG : bIsAutoPlay.BsG;\r
2548                                         bool autoB = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtB : bIsAutoPlay.BsB;\r
2549                                         bool autoPick = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtPick : bIsAutoPlay.BsPick;\r
2550                                         bool pushingR = CDTXMania.Pad.b押されている( inst, Eパッド.R );\r
2551                                         bool pushingG = CDTXMania.Pad.b押されている( inst, Eパッド.G );\r
2552                                         bool pushingB = CDTXMania.Pad.b押されている( inst, Eパッド.B );\r
2553 \r
2554                                         cInvisibleChip.StartSemiInvisible( inst );\r
2555                                         #region [ Chip Fire effects ]\r
2556                                         bool bSuccessOPEN = bChipIsO && ( autoR || !pushingR ) && ( autoG || !pushingG ) && ( autoB || !pushingB );\r
2557                                         if ( ( bChipHasR && ( autoR || pushingR ) && autoPick ) || bSuccessOPEN )\r
2558                                         {\r
2559                                                 this.actChipFireGB.Start( 0 + lo, nJudgeLinePosY_delta );\r
2560                                         }\r
2561                                         if ( ( bChipHasG && ( autoG || pushingG ) && autoPick ) || bSuccessOPEN )\r
2562                                         {\r
2563                                                 this.actChipFireGB.Start( 1 + lo, nJudgeLinePosY_delta );\r
2564                                         }\r
2565                                         if ( ( bChipHasB && ( autoB || pushingB ) && autoPick ) || bSuccessOPEN )\r
2566                                         {\r
2567                                                 this.actChipFireGB.Start( 2 + lo, nJudgeLinePosY_delta );\r
2568                                         }\r
2569                                         #endregion\r
2570                                         if ( autoPick )\r
2571                                         {\r
2572                                                 bool bMiss = true;\r
2573                                                 if ( bChipHasR == autoR && bChipHasG == autoG && bChipHasB == autoB )           // autoレーンとチップレーン一致時はOK\r
2574                                                 {                                                                                                                                                       // この条件を加えないと、同時に非autoレーンを押下している時にNGとなってしまう。\r
2575                                                         bMiss = false;\r
2576                                                 }\r
2577                                                 else if ( ( autoR || ( bChipHasR == pushingR ) ) && ( autoG || ( bChipHasG == pushingG ) ) && ( autoB || ( bChipHasB == pushingB ) ) )\r
2578                                                         // ( bChipHasR == ( pushingR | autoR ) ) && ( bChipHasG == ( pushingG | autoG ) ) && ( bChipHasB == ( pushingB | autoB ) ) )\r
2579                                                 {\r
2580                                                         bMiss = false;\r
2581                                                 }\r
2582                                                 else if ( ( ( bChipIsO == true ) && ( !pushingR | autoR ) && ( !pushingG | autoG ) && ( !pushingB | autoB ) ) ) // OPEN時\r
2583                                                 {\r
2584                                                         bMiss = false;\r
2585                                                 }\r
2586                                                 pChip.bHit = true;\r
2587                                                 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, inst, dTX.nモニタを考慮した音量( inst ), false, bMiss );\r
2588                                                 this.r次にくるギターChip = null;\r
2589                                                 if ( !bMiss )\r
2590                                                 {\r
2591                                                         this.tチップのヒット処理( pChip.n発声時刻ms, pChip );\r
2592                                                 }\r
2593                                                 else\r
2594                                                 {\r
2595                                                         pChip.nLag = 0;         // tチップのヒット処理()の引数最後がfalseの時はpChip.nLagを計算しないため、ここでAutoPickかつMissのLag=0を代入\r
2596                                                         this.tチップのヒット処理( pChip.n発声時刻ms, pChip, false );\r
2597                                                 }\r
2598                                                 int chWailingChip = ( inst == E楽器パート.GUITAR ) ? 0x28 : 0xA8;\r
2599                                                 CDTX.CChip item = this.r指定時刻に一番近い未ヒットChip( pChip.n発声時刻ms, chWailingChip, this.nInputAdjustTimeMs[ instIndex ], 140 );\r
2600                                                 if ( item != null && !bMiss )\r
2601                                                 {\r
2602                                                         this.queWailing[ instIndex ].Enqueue( item );\r
2603                                                 }\r
2604                                         }\r
2605                                 }\r
2606                                 return;\r
2607                         }       // end of "if configIni.bGuitar有効"\r
2608                         if ( !pChip.bHit && ( pChip.nバーからの距離dot[ instIndex ] < 0 ) )      // Guitar/Bass無効の場合は、自動演奏する\r
2609                         {\r
2610                                 pChip.bHit = true;\r
2611                                 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, inst, dTX.nモニタを考慮した音量( inst ) );\r
2612                         }\r
2613                 }\r
2614 \r
2615                 \r
2616                 protected virtual void t進行描画・チップ・ギターベース・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst )\r
2617                 {\r
2618                         int indexInst = (int) inst;\r
2619                         if ( configIni.bGuitar有効 )\r
2620                         {\r
2621                                 #region [ Invisible処理 ]\r
2622                                 if ( configIni.eInvisible[ indexInst ] != EInvisible.OFF )\r
2623                                 {\r
2624                                         cInvisibleChip.SetInvisibleStatus( ref pChip );\r
2625                                 }\r
2626                                 #endregion\r
2627                                 #region [ Sudden/Hidden処理 ]\r
2628                                 if ( configIni.bSudden[indexInst] )\r
2629                                 {\r
2630                                         pChip.b可視 = pChip.nバーからの距離dot[indexInst] < 200;\r
2631                                 }\r
2632                                 if ( configIni.bHidden[indexInst] && ( pChip.nバーからの距離dot[indexInst] < 100 ) )\r
2633                                 {\r
2634                                         pChip.b可視 = false;\r
2635                                 }\r
2636                                 #endregion\r
2637                                 //\r
2638                                 // ここにチップ更新処理が入る(overrideで入れる)。といっても座標とチップサイズが違うだけで処理はまるまる同じ。\r
2639                                 //\r
2640                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot[indexInst] < 0 ) )\r
2641                                 {\r
2642                                         if ( pChip.nバーからの距離dot[indexInst] < -234 )        // #25253 2011.5.29 yyagi: Don't set pChip.bHit=true for wailing at once. It need to 1sec-delay (234pix per 1sec). \r
2643                                         {\r
2644                                                 pChip.bHit = true;\r
2645                                         }\r
2646                                         bool autoW = ( inst == E楽器パート.GUITAR ) ? configIni.bAutoPlay.GtW : configIni.bAutoPlay.BsW;\r
2647                                         //if ( configIni.bAutoPlay[ ((int) Eレーン.Guitar - 1) + indexInst ] )       // このような、バグの入りやすい書き方(GT/BSのindex値が他と異なる)はいずれ見直したい\r
2648                                         if ( autoW )\r
2649                                         {\r
2650                                         //    pChip.bHit = true;                                                                // #25253 2011.5.29 yyagi: Set pChip.bHit=true if autoplay.\r
2651                                         //    this.actWailingBonus.Start( inst, this.r現在の歓声Chip[indexInst] );\r
2652                                         // #23886 2012.5.22 yyagi; To support auto Wailing; Don't do wailing for ALL wailing chips. Do wailing for queued wailing chip.\r
2653                                         // wailing chips are queued when 1) manually wailing and not missed at that time 2) AutoWailing=ON and not missed at that time\r
2654                                                 long nTimeStamp_Wailed = pChip.n発声時刻ms + CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;\r
2655                                                 DoWailingFromQueue( inst, nTimeStamp_Wailed, autoW );\r
2656                                         }\r
2657                                         cInvisibleChip.StartSemiInvisible( inst );\r
2658                                 }\r
2659                                 return;\r
2660                         }\r
2661                         pChip.bHit = true;\r
2662                 }\r
2663                 protected virtual void t進行描画・チップ・ギター・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )\r
2664                 {\r
2665                         t進行描画・チップ・ギターベース・ウェイリング( configIni, ref dTX, ref pChip, E楽器パート.GUITAR );\r
2666                 }\r
2667                 protected abstract void t進行描画・チップ・フィルイン( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2668                 protected abstract void t進行描画・チップ・小節線( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2669                 //protected abstract void t進行描画・チップ・ベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2670                 protected virtual void t進行描画・チップ・ベース・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )\r
2671                 {\r
2672                         t進行描画・チップ・ギターベース・ウェイリング( configIni, ref dTX, ref pChip, E楽器パート.BASS );\r
2673                 }\r
2674                 protected abstract void t進行描画・チップ・空打ち音設定・ドラム( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2675                 protected void t進行描画・チップアニメ()\r
2676                 {\r
2677                         for ( int i = 0; i < 3; i++ )                   // 0=drums, 1=guitar, 2=bass\r
2678                         {\r
2679                                 if ( this.ctチップ模様アニメ[ i ] != null )\r
2680                                 {\r
2681                                         this.ctチップ模様アニメ[ i ].t進行Loop();\r
2682                                 }\r
2683                         }\r
2684                         if ( this.ctWailingチップ模様アニメ != null )\r
2685                         {\r
2686                                 this.ctWailingチップ模様アニメ.t進行Loop();\r
2687                         }\r
2688                 }\r
2689 \r
2690                 protected bool t進行描画・フェードイン・アウト()\r
2691                 {\r
2692                         switch ( base.eフェーズID )\r
2693                         {\r
2694                                 case CStage.Eフェーズ.共通_フェードイン:\r
2695                                         if ( this.actFI.On進行描画() != 0 )\r
2696                                         {\r
2697                                                 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
2698                                         }\r
2699                                         break;\r
2700 \r
2701                                 case CStage.Eフェーズ.共通_フェードアウト:\r
2702                                 case CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト:\r
2703                                         if ( this.actFO.On進行描画() != 0 )\r
2704                                         {\r
2705                                                 return true;\r
2706                                         }\r
2707                                         break;\r
2708 \r
2709                                 case CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト:\r
2710                                         if ( this.actFOClear.On進行描画() == 0 )\r
2711                                         {\r
2712                                                 break;\r
2713                                         }\r
2714                                         return true;\r
2715                 \r
2716                         }\r
2717                         return false;\r
2718                 }\r
2719                 protected void t進行描画・レーンフラッシュD()\r
2720                 {\r
2721                         if ( ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
2722                         {\r
2723                                 this.actLaneFlushD.On進行描画();\r
2724                         }\r
2725                 }\r
2726                 protected void t進行描画・レーンフラッシュGB()\r
2727                 {\r
2728                         if ( ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF ) && CDTXMania.ConfigIni.bGuitar有効 )\r
2729                         {\r
2730                                 this.actLaneFlushGB.On進行描画();\r
2731                         }\r
2732                 }\r
2733                 protected abstract void t進行描画・演奏情報();\r
2734                 protected void t進行描画・演奏情報(int x, int y)\r
2735                 {\r
2736                         if ( !CDTXMania.ConfigIni.b演奏情報を表示しない )\r
2737                         {\r
2738                                 this.actPlayInfo.t進行描画( x, y );\r
2739                         }\r
2740                 }\r
2741                 protected void t進行描画・背景()\r
2742                 {\r
2743                         if ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF )\r
2744                         {\r
2745                                 if ( this.tx背景 != null )\r
2746                                 {\r
2747                                         this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );\r
2748                                 }\r
2749                         }\r
2750                         else\r
2751                         {\r
2752                                 CDTXMania.app.Device.Clear( ClearFlags.ZBuffer | ClearFlags.Target, Color.Black, 0f, 0 );\r
2753                         }\r
2754                 }\r
2755 \r
2756                 protected void t進行描画・判定ライン()\r
2757                 {\r
2758                         if ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )\r
2759                         {\r
2760                                 int y = CDTXMania.ConfigIni.bReverse.Drums ? 53 - nJudgeLinePosY_delta.Drums : 419 + nJudgeLinePosY_delta.Drums;\r
2761                                                                                                                                 // #31602 2013.6.23 yyagi 描画遅延対策として、判定ラインの表示位置をオフセット調整できるようにする\r
2762                                 if ( this.txヒットバー != null )\r
2763                                 {\r
2764                                         for ( int i = 32; i < 335; i += 8 )\r
2765                                         {\r
2766                                                 this.txヒットバー.t2D描画( CDTXMania.app.Device, i, y, new Rectangle( 0, 0, ( ( i + 8 ) >= 335 ) ? ( 7 - ( ( i + 8 ) - 335 ) ) : 8, 8 ) );\r
2767                                         }\r
2768                                 }\r
2769                         }\r
2770                 }\r
2771                 protected void t進行描画・判定文字列()\r
2772                 {\r
2773                         this.actJudgeString.On進行描画();\r
2774                 }\r
2775                 protected void t進行描画・判定文字列1・通常位置指定の場合()\r
2776                 {\r
2777                         if ( ( (E判定文字表示位置) CDTXMania.ConfigIni.判定文字表示位置.Drums ) != E判定文字表示位置.判定ライン上または横 )\r
2778                         {\r
2779                                 this.actJudgeString.On進行描画();\r
2780                         }\r
2781                 }\r
2782                 protected void t進行描画・判定文字列2・判定ライン上指定の場合()\r
2783                 {\r
2784                         if ( ( (E判定文字表示位置) CDTXMania.ConfigIni.判定文字表示位置.Drums ) == E判定文字表示位置.判定ライン上または横 )\r
2785                         {\r
2786                                 this.actJudgeString.On進行描画();\r
2787                         }\r
2788                 }\r
2789 \r
2790                 protected void t進行描画・譜面スクロール速度()\r
2791                 {\r
2792                         this.act譜面スクロール速度.On進行描画();\r
2793                 }\r
2794 \r
2795                 protected abstract void t背景テクスチャの生成();\r
2796                 protected void t背景テクスチャの生成( string DefaultBgFilename, Rectangle bgrect, string bgfilename )\r
2797                 {\r
2798                         Bitmap image = null;\r
2799                         bool flag = true;\r
2800 \r
2801                         if ( bgfilename != null && File.Exists( bgfilename ) )\r
2802                         {\r
2803                                 try\r
2804                                 {\r
2805                                         Bitmap bitmap2 = null;\r
2806                                         bitmap2 = new Bitmap( bgfilename );\r
2807                                         if ( ( bitmap2.Size.Width == 0 ) && ( bitmap2.Size.Height == 0 ) )\r
2808                                         {\r
2809                                                 this.tx背景 = null;\r
2810                                                 return;\r
2811                                         }\r
2812                                         Bitmap bitmap3 = new Bitmap(SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height);\r
2813                                         Graphics graphics = Graphics.FromImage( bitmap3 );\r
2814                                         for ( int i = 0; i < SampleFramework.GameWindowSize.Height; i += bitmap2.Size.Height )\r
2815                                         {\r
2816                                                 for ( int j = 0; j < SampleFramework.GameWindowSize.Width; j += bitmap2.Size.Width )\r
2817                                                 {\r
2818                                                         graphics.DrawImage( bitmap2, j, i, bitmap2.Width, bitmap2.Height );\r
2819                                                 }\r
2820                                         }\r
2821                                         graphics.Dispose();\r
2822                                         bitmap2.Dispose();\r
2823                                         image = new Bitmap( CSkin.Path( DefaultBgFilename ) );\r
2824                                         graphics = Graphics.FromImage( image );\r
2825                                         ColorMatrix matrix2 = new ColorMatrix();\r
2826                                         matrix2.Matrix00 = 1f;\r
2827                                         matrix2.Matrix11 = 1f;\r
2828                                         matrix2.Matrix22 = 1f;\r
2829                                         matrix2.Matrix33 = ( (float) CDTXMania.ConfigIni.n背景の透過度 ) / 255f;\r
2830                                         matrix2.Matrix44 = 1f;\r
2831                                         ColorMatrix newColorMatrix = matrix2;\r
2832                                         ImageAttributes imageAttr = new ImageAttributes();\r
2833                                         imageAttr.SetColorMatrix( newColorMatrix );\r
2834                                         graphics.DrawImage( bitmap3, new Rectangle( 0, 0, SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height ), 0, 0, SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height, GraphicsUnit.Pixel, imageAttr );\r
2835                                         imageAttr.Dispose();\r
2836                                         graphics.DrawImage( bitmap3, bgrect, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height, GraphicsUnit.Pixel );\r
2837                                         graphics.Dispose();\r
2838                                         bitmap3.Dispose();\r
2839                                         flag = false;\r
2840                                 }\r
2841                                 catch\r
2842                                 {\r
2843                                         Trace.TraceError( "背景画像の読み込みに失敗しました。({0})", new object[] { bgfilename } );\r
2844                                 }\r
2845                         }\r
2846                         if ( flag )\r
2847                         {\r
2848                                 bgfilename = CSkin.Path( DefaultBgFilename );\r
2849                                 try\r
2850                                 {\r
2851                                         image = new Bitmap( bgfilename );\r
2852                                 }\r
2853                                 catch\r
2854                                 {\r
2855                                         Trace.TraceError( "背景画像の読み込みに失敗しました。({0})", new object[] { bgfilename } );\r
2856                                         this.tx背景 = null;\r
2857                                         return;\r
2858                                 }\r
2859                         }\r
2860                         if ( ( CDTXMania.DTX.listBMP.Count > 0 ) || ( CDTXMania.DTX.listBMPTEX.Count > 0 ) )\r
2861                         {\r
2862                                 Graphics graphics2 = Graphics.FromImage( image );\r
2863                                 graphics2.FillRectangle( Brushes.Black, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height );\r
2864                                 graphics2.Dispose();\r
2865                         }\r
2866                         try\r
2867                         {\r
2868                                 this.tx背景 = new CTexture( CDTXMania.app.Device, image, CDTXMania.TextureFormat );\r
2869                         }\r
2870                         catch ( CTextureCreateFailedException )\r
2871                         {\r
2872                                 Trace.TraceError( "背景テクスチャの生成に失敗しました。" );\r
2873                                 this.tx背景 = null;\r
2874                         }\r
2875                         image.Dispose();\r
2876                 }\r
2877 \r
2878                 protected virtual void t入力処理・ギター()\r
2879                 {\r
2880                         t入力処理・ギターベース( E楽器パート.GUITAR );\r
2881                 }\r
2882                 protected virtual void t入力処理・ベース()\r
2883                 {\r
2884                         t入力処理・ギターベース( E楽器パート.BASS );\r
2885                 }\r
2886 \r
2887 \r
2888                 protected virtual void t入力処理・ギターベース(E楽器パート inst)\r
2889                 {\r
2890                         int indexInst = (int) inst;\r
2891                         #region [ スクロール速度変更 ]\r
2892                         if ( CDTXMania.Pad.b押されている( inst, Eパッド.Decide ) && CDTXMania.Pad.b押された( inst, Eパッド.B ) )\r
2893                         {\r
2894                                 CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] = Math.Min( CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] + 1, 0x7cf );\r
2895                         }\r
2896                         if ( CDTXMania.Pad.b押されている( inst, Eパッド.Decide ) && CDTXMania.Pad.b押された( inst, Eパッド.R ) )\r
2897                         {\r
2898                                 CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] = Math.Max( CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] - 1, 0 );\r
2899                         }\r
2900                         #endregion\r
2901 \r
2902                         if ( !CDTXMania.ConfigIni.bGuitar有効 || !CDTXMania.DTX.bチップがある[indexInst] )\r
2903                         {\r
2904                                 return;\r
2905                         }\r
2906 \r
2907                         int R = ( inst == E楽器パート.GUITAR ) ? 0 : 3;\r
2908                         int G = R + 1;\r
2909                         int B = R + 2;\r
2910                         bool autoW =    ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtW : bIsAutoPlay.BsW;\r
2911                         bool autoR =    ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtR : bIsAutoPlay.BsR;\r
2912                         bool autoG =    ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtG : bIsAutoPlay.BsG;\r
2913                         bool autoB =    ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtB : bIsAutoPlay.BsB;\r
2914                         bool autoPick = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtPick : bIsAutoPlay.BsPick;\r
2915                         int nAutoW = ( autoW ) ? 8 : 0;\r
2916                         int nAutoR = ( autoR ) ? 4 : 0;\r
2917                         int nAutoG = ( autoG ) ? 2 : 0;\r
2918                         int nAutoB = ( autoB ) ? 1 : 0;\r
2919                         int nAutoMask = nAutoW | nAutoR | nAutoG | nAutoB;\r
2920 \r
2921 //                      if ( bIsAutoPlay[ (int) Eレーン.Guitar - 1 + indexInst ] )   // このような、バグの入りやすい書き方(GT/BSのindex値が他と異なる)はいずれ見直したい\r
2922 //                      {\r
2923                         CDTX.CChip chip = this.r次に来る指定楽器Chipを更新して返す(inst);\r
2924                         if ( chip != null )     \r
2925                         {\r
2926                                 if ( ( chip.nチャンネル番号 & 4 ) != 0 && autoR )\r
2927                                 {\r
2928                                         this.actLaneFlushGB.Start( R );\r
2929                                         this.actRGB.Push( R );\r
2930                                 }\r
2931                                 if ( ( chip.nチャンネル番号 & 2 ) != 0 && autoG )\r
2932                                 {\r
2933                                         this.actLaneFlushGB.Start( G );\r
2934                                         this.actRGB.Push( G );\r
2935                                 }\r
2936                                 if ( ( chip.nチャンネル番号 & 1 ) != 0 && autoB )\r
2937                                 {\r
2938                                         this.actLaneFlushGB.Start( B );\r
2939                                         this.actRGB.Push( B );\r
2940                                 }\r
2941 //                      }\r
2942 \r
2943                         }\r
2944 //                      else\r
2945                         {\r
2946                                 int pushingR = CDTXMania.Pad.b押されている( inst, Eパッド.R ) ? 4 : 0;\r
2947                                 this.t入力メソッド記憶( inst );\r
2948                                 int pushingG = CDTXMania.Pad.b押されている( inst, Eパッド.G ) ? 2 : 0;\r
2949                                 this.t入力メソッド記憶( inst );\r
2950                                 int pushingB = CDTXMania.Pad.b押されている( inst, Eパッド.B ) ? 1 : 0;\r
2951                                 this.t入力メソッド記憶( inst );\r
2952                                 int flagRGB = pushingR | pushingG | pushingB;\r
2953                                 if ( pushingR != 0 )\r
2954                                 {\r
2955                                         this.actLaneFlushGB.Start( R );\r
2956                                         this.actRGB.Push( R );\r
2957                                 }\r
2958                                 if ( pushingG != 0 )\r
2959                                 {\r
2960                                         this.actLaneFlushGB.Start( G );\r
2961                                         this.actRGB.Push( G );\r
2962                                 }\r
2963                                 if ( pushingB != 0 )\r
2964                                 {\r
2965                                         this.actLaneFlushGB.Start( B );\r
2966                                         this.actRGB.Push( B );\r
2967                                 }\r
2968                                 // auto pickだとここから先に行かないので注意\r
2969                                 List<STInputEvent> events = CDTXMania.Pad.GetEvents( inst, Eパッド.Pick );\r
2970                                 if ( ( events != null ) && ( events.Count > 0 ) )\r
2971                                 {\r
2972                                         foreach ( STInputEvent eventPick in events )\r
2973                                         {\r
2974                                                 if ( !eventPick.b押された )\r
2975                                                 {\r
2976                                                         continue;\r
2977                                                 }\r
2978                                                 this.t入力メソッド記憶( inst );\r
2979                                                 long nTime = eventPick.nTimeStamp - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;\r
2980                                                 int chWailingSound = ( inst == E楽器パート.GUITAR ) ? 0x2F : 0xAF;\r
2981                                                 CDTX.CChip pChip = this.r指定時刻に一番近い未ヒットChip( nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst] );      // E楽器パート.GUITARなチップ全てにヒットする\r
2982                                                 E判定 e判定 = this.e指定時刻からChipのJUDGEを返す( nTime, pChip, this.nInputAdjustTimeMs[indexInst] );\r
2983 //Trace.TraceInformation("ch={0:x2}, mask1={1:x1}, mask2={2:x2}", pChip.nチャンネル番号,  ( pChip.nチャンネル番号 & ~nAutoMask ) & 0x0F, ( flagRGB & ~nAutoMask) & 0x0F );\r
2984                                                 if ( ( pChip != null ) && ( ( ( pChip.nチャンネル番号 & ~nAutoMask ) & 0x0F ) == ( ( flagRGB & ~nAutoMask) & 0x0F ) ) && ( e判定 != E判定.Miss ) )\r
2985                                                 {\r
2986                                                         bool bChipHasR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );\r
2987                                                         bool bChipHasG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );\r
2988                                                         bool bChipHasB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );\r
2989                                                         bool bChipHasW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );\r
2990                                                         bool bChipIsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );\r
2991                                                         bool bSuccessOPEN = bChipIsO && ( autoR || pushingR == 0 ) && ( autoG || pushingG == 0 ) && ( autoB || pushingB == 0 );\r
2992                                                         if ( ( bChipHasR && ( autoR || pushingR != 0 ) ) || bSuccessOPEN )\r
2993                                                         //if ( ( pushingR != 0 ) || autoR || ( flagRGB == 0 ) )\r
2994                                                         {\r
2995                                                                 this.actChipFireGB.Start( R, nJudgeLinePosY_delta );\r
2996                                                         }\r
2997                                                         if ( ( bChipHasG && ( autoG || pushingG != 0 ) ) || bSuccessOPEN )\r
2998                                                         //if ( ( pushingG != 0 ) || autoG || ( flagRGB == 0 ) )\r
2999                                                         {\r
3000                                                                 this.actChipFireGB.Start( G, nJudgeLinePosY_delta );\r
3001                                                         }\r
3002                                                         if ( ( bChipHasB && ( autoB || pushingB != 0 ) ) || bSuccessOPEN )\r
3003                                                         //if ( ( pushingB != 0 ) || autoB || ( flagRGB == 0 ) )\r
3004                                                         {\r
3005                                                                 this.actChipFireGB.Start( B, nJudgeLinePosY_delta );\r
3006                                                         }\r
3007                                                         this.tチップのヒット処理( nTime, pChip );\r
3008                                                         this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する[indexInst], e判定 == E判定.Poor );\r
3009                                                         int chWailingChip = ( inst == E楽器パート.GUITAR ) ? 0x28 : 0xA8;\r
3010                                                         CDTX.CChip item = this.r指定時刻に一番近い未ヒットChip( nTime, chWailingChip, this.nInputAdjustTimeMs[ indexInst ], 140 );\r
3011                                                         if ( item != null )\r
3012                                                         {\r
3013                                                                 this.queWailing[indexInst].Enqueue( item );\r
3014                                                         }\r
3015                                                         continue;\r
3016                                                 }\r
3017 \r
3018                                                 // 以下、間違いレーンでのピック時\r
3019                                                 CDTX.CChip NoChipPicked = ( inst == E楽器パート.GUITAR ) ? this.r現在の空うちギターChip : this.r現在の空うちベースChip;\r
3020                                                 if ( ( NoChipPicked != null ) || ( ( NoChipPicked = this.r指定時刻に一番近いChip・ヒット未済問わず不可視考慮( nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst] ) ) != null ) )\r
3021                                                 {\r
3022                                                         this.tサウンド再生( NoChipPicked, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する[indexInst], true );\r
3023                                                 }\r
3024                                                 if ( !CDTXMania.ConfigIni.bLight[indexInst] )\r
3025                                                 {\r
3026                                                         this.tチップのヒット処理・BadならびにTight時のMiss( inst );\r
3027                                                 }\r
3028                                         }\r
3029                                 }\r
3030                                 List<STInputEvent> list = CDTXMania.Pad.GetEvents(inst, Eパッド.Wail );\r
3031                                 if ( ( list != null ) && ( list.Count > 0 ) )\r
3032                                 {\r
3033                                         foreach ( STInputEvent eventWailed in list )\r
3034                                         {\r
3035                                                 if ( !eventWailed.b押された )\r
3036                                                 {\r
3037                                                         continue;\r
3038                                                 }\r
3039                                                 DoWailingFromQueue( inst, eventWailed.nTimeStamp,  autoW );\r
3040                                         }\r
3041                                 }\r
3042                         }\r
3043                 }\r
3044 \r
3045                 private void DoWailingFromQueue( E楽器パート inst, long nTimeStamp_Wailed,  bool autoW )\r
3046                 {\r
3047                         int indexInst = (int) inst;\r
3048                         long nTimeWailed = nTimeStamp_Wailed - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;\r
3049                         CDTX.CChip chipWailing;\r
3050                         while ( ( this.queWailing[ indexInst ].Count > 0 ) && ( ( chipWailing = this.queWailing[ indexInst ].Dequeue() ) != null ) )\r
3051                         {\r
3052                                 if ( ( nTimeWailed - chipWailing.n発声時刻ms ) <= 1000 )            // #24245 2011.1.26 yyagi: 800 -> 1000\r
3053                                 {\r
3054                                         chipWailing.bHit = true;\r
3055                                         this.actWailingBonus.Start( inst, this.r現在の歓声Chip[ indexInst ] );\r
3056                                         //if ( !bIsAutoPlay[indexInst] )\r
3057                                         if ( !autoW )\r
3058                                         {\r
3059                                                 int nCombo = ( this.actCombo.n現在のコンボ数[ indexInst ] < 500 ) ? this.actCombo.n現在のコンボ数[ indexInst ] : 500;\r
3060                                                 this.actScore.Add( inst, bIsAutoPlay, nCombo * 3000L );         // #24245 2011.1.26 yyagi changed DRUMS->BASS, add nCombo conditions\r
3061                                         }\r
3062                                 }\r
3063                         }\r
3064                 }\r
3065         #endregion\r
3066         }\r
3067 }\r