OSDN Git Service

#32072 Invisible系の対応について、ギター/ベースでの対応が十分でなかったため、これを追加した。
[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                         base.On活性化();\r
274                         this.tステータスパネルの選択();\r
275                         this.tパネル文字列の設定();\r
276 \r
277                         this.nInputAdjustTimeMs.Drums = CDTXMania.ConfigIni.nInputAdjustTimeMs.Drums;           // #23580 2011.1.3 yyagi\r
278                         this.nInputAdjustTimeMs.Guitar = CDTXMania.ConfigIni.nInputAdjustTimeMs.Guitar;         //        2011.1.7 ikanick 修正\r
279                         this.nInputAdjustTimeMs.Bass = CDTXMania.ConfigIni.nInputAdjustTimeMs.Bass;                     //\r
280                         this.nJudgeLinePosY_delta.Drums  = CDTXMania.ConfigIni.nJudgeLinePosOffset.Drums;       // #31602 2013.6.23 yyagi\r
281                         this.nJudgeLinePosY_delta.Guitar = CDTXMania.ConfigIni.nJudgeLinePosOffset.Guitar;      //\r
282                         this.nJudgeLinePosY_delta.Bass   = CDTXMania.ConfigIni.nJudgeLinePosOffset.Bass;        //\r
283                         this.bIsAutoPlay = CDTXMania.ConfigIni.bAutoPlay;                                                                       // #24239 2011.1.23 yyagi\r
284                         //this.bIsAutoPlay.Guitar = CDTXMania.ConfigIni.bギターが全部オートプレイである;\r
285                         //this.bIsAutoPlay.Bass = CDTXMania.ConfigIni.bベースが全部オートプレイである;\r
286 //                      this.nRisky = CDTXMania.ConfigIni.nRisky;                                                                                       // #23559 2011.7.28 yyagi\r
287                         actGauge.Init( CDTXMania.ConfigIni.nRisky );                                                                    // #23559 2011.7.28 yyagi\r
288                         this.nPolyphonicSounds = CDTXMania.ConfigIni.nPoliphonicSounds;\r
289 \r
290                         CDTXMania.Skin.tRemoveMixerAll();       // 効果音のストリームをミキサーから解除しておく\r
291 \r
292                         queueMixerSound = new Queue<stmixer>( 64 );\r
293                         bIsDirectSound = ( CDTXMania.Sound管理.GetCurrentSoundDeviceType() == "DirectSound" );\r
294                         db再生速度 = ( (double) CDTXMania.ConfigIni.n演奏速度 ) / 20.0;\r
295                         bValidScore = true;\r
296                         bDTXVmode = false;      // とりあえずfalse固定\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                         bool bPChipIsAutoPlay = bCheckAutoPlay( pChip );\r
1174 \r
1175                         pChip.bIsAutoPlayed = bPChipIsAutoPlay;                 // 2011.6.10 yyagi\r
1176                         E判定 eJudgeResult = E判定.Auto;\r
1177                         switch ( pChip.e楽器パート )\r
1178                         {\r
1179                                 case E楽器パート.DRUMS:\r
1180                                         {\r
1181                                                 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Drums;\r
1182                                                 eJudgeResult = (bCorrectLane)? this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime ) : E判定.Miss;\r
1183                                                 this.actJudgeString.Start( this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ], bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );\r
1184                                         }\r
1185                                         break;\r
1186 \r
1187                                 case E楽器パート.GUITAR:\r
1188                                         {\r
1189                                                 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Guitar;\r
1190                                                 eJudgeResult = (bCorrectLane)? this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime ) : E判定.Miss;\r
1191                                                 this.actJudgeString.Start( 10, bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );\r
1192                                                 break;\r
1193                                         }\r
1194 \r
1195                                 case E楽器パート.BASS:\r
1196                                         {\r
1197                                                 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Bass;\r
1198                                                 eJudgeResult = (bCorrectLane)? this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime ) : E判定.Miss;\r
1199                                                 this.actJudgeString.Start( 11, bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );\r
1200                                         }\r
1201                                         break;\r
1202                         }\r
1203                         if ( !bPChipIsAutoPlay && ( pChip.e楽器パート != E楽器パート.UNKNOWN ) )\r
1204                         {\r
1205                                 // this.t判定にあわせてゲージを増減する( screenmode, pChip.e楽器パート, eJudgeResult );\r
1206                                 actGauge.Damage( screenmode, pChip.e楽器パート, eJudgeResult );\r
1207                         }\r
1208                         if ( eJudgeResult == E判定.Poor || eJudgeResult == E判定.Miss )\r
1209                         {\r
1210                                 cInvisibleChip.ShowChipTemporally( pChip.e楽器パート );\r
1211                         }\r
1212                         switch ( pChip.e楽器パート )\r
1213                         {\r
1214                                 case E楽器パート.DRUMS:\r
1215                                         switch ( eJudgeResult )\r
1216                                         {\r
1217                                                 case E判定.Miss:\r
1218                                                 case E判定.Bad:\r
1219                                                         this.nヒット数・Auto含む.Drums.Miss++;\r
1220                                                         if ( !bPChipIsAutoPlay )\r
1221                                                         {\r
1222                                                                 this.nヒット数・Auto含まない.Drums.Miss++;\r
1223                                                         }\r
1224                                                         break;\r
1225                                                 default:\r
1226                                                         this.nヒット数・Auto含む.Drums[ (int) eJudgeResult ]++;\r
1227                                                         if ( !bPChipIsAutoPlay )\r
1228                                                         {\r
1229                                                                 this.nヒット数・Auto含まない.Drums[ (int) eJudgeResult ]++;\r
1230                                                         }\r
1231                                                         break;\r
1232                                         }\r
1233 \r
1234                                         if ( CDTXMania.ConfigIni.bドラムが全部オートプレイである || !bPChipIsAutoPlay )\r
1235                                         {\r
1236                                                 switch ( eJudgeResult )\r
1237                                                 {\r
1238                                                         case E判定.Perfect:\r
1239                                                         case E判定.Great:\r
1240                                                         case E判定.Good:\r
1241                                                                 this.actCombo.n現在のコンボ数.Drums++;\r
1242                                                                 break;\r
1243 \r
1244                                                         default:\r
1245                                                                 this.actCombo.n現在のコンボ数.Drums = 0;\r
1246                                                                 break;\r
1247                                                 }\r
1248                                         }\r
1249                                         break;\r
1250 \r
1251                                 case E楽器パート.GUITAR:\r
1252                                 case E楽器パート.BASS:\r
1253                                         int indexInst = (int) pChip.e楽器パート;\r
1254                                         switch ( eJudgeResult )\r
1255                                         {\r
1256                                                 case E判定.Miss:\r
1257                                                 case E判定.Bad:\r
1258                                                         this.nヒット数・Auto含む[ indexInst ].Miss++;\r
1259                                                         if ( !bPChipIsAutoPlay )\r
1260                                                         {\r
1261                                                                 this.nヒット数・Auto含まない[ indexInst ].Miss++;\r
1262                                                         }\r
1263                                                         break;\r
1264                                                 default:        // #24068 2011.1.10 ikanick changed\r
1265                                                         // #24167 2011.1.16 yyagi changed\r
1266                                                         this.nヒット数・Auto含む[ indexInst ][ (int) eJudgeResult ]++;\r
1267                                                         if ( !bPChipIsAutoPlay )\r
1268                                                         {\r
1269                                                                 this.nヒット数・Auto含まない[ indexInst ][ (int) eJudgeResult ]++;\r
1270                                                         }\r
1271                                                         break;\r
1272                                         }\r
1273                                         switch ( eJudgeResult )\r
1274                                         {\r
1275                                                 case E判定.Perfect:\r
1276                                                 case E判定.Great:\r
1277                                                 case E判定.Good:\r
1278                                                         this.actCombo.n現在のコンボ数[ indexInst ]++;\r
1279                                                         break;\r
1280 \r
1281                                                 default:\r
1282                                                         this.actCombo.n現在のコンボ数[ indexInst ] = 0;\r
1283                                                         break;\r
1284                                         }\r
1285                                         break;\r
1286 \r
1287                                 default:\r
1288                                         break;\r
1289                         }\r
1290                         if ( ( !bPChipIsAutoPlay && ( pChip.e楽器パート != E楽器パート.UNKNOWN ) ) && ( eJudgeResult != E判定.Miss ) && ( eJudgeResult != E判定.Bad ) )\r
1291                         {\r
1292                                 int nCombos = this.actCombo.n現在のコンボ数[ (int) pChip.e楽器パート ];\r
1293                                 long nScoreDelta = 0;\r
1294                                 long[] nComboScoreDelta = new long[] { 350L, 200L, 50L, 0L };\r
1295                                 if ( ( nCombos <= 500 ) || ( eJudgeResult == E判定.Good ) )\r
1296                                 {\r
1297                                         nScoreDelta = nComboScoreDelta[ (int) eJudgeResult ] * nCombos;\r
1298                                 }\r
1299                                 else if ( ( eJudgeResult == E判定.Perfect ) || ( eJudgeResult == E判定.Great ) )\r
1300                                 {\r
1301                                         nScoreDelta = nComboScoreDelta[ (int) eJudgeResult ] * 500L;\r
1302                                 }\r
1303                                 this.actScore.Add( pChip.e楽器パート, bIsAutoPlay, nScoreDelta );\r
1304                         }\r
1305                         return eJudgeResult;\r
1306                 }\r
1307                 protected abstract void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part );\r
1308                 protected abstract void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, int nLane );\r
1309                 protected void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, E楽器パート screenmode )\r
1310                 {\r
1311                         this.tチップのヒット処理・BadならびにTight時のMiss( part, 0, screenmode );\r
1312                 }\r
1313                 protected void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, int nLane, E楽器パート screenmode )\r
1314                 {\r
1315                         this.bAUTOでないチップが1つでもバーを通過した = true;\r
1316                         //this.t判定にあわせてゲージを増減する( screenmode, part, E判定.Miss );\r
1317                         actGauge.Damage( screenmode, part, E判定.Miss );\r
1318                         switch ( part )\r
1319                         {\r
1320                                 case E楽器パート.DRUMS:\r
1321                                         if ( ( nLane >= 0 ) && ( nLane <= 7 ) )\r
1322                                         {\r
1323                                                 this.actJudgeString.Start( nLane, bIsAutoPlay[ nLane ] ? E判定.Auto : E判定.Miss, 999 );\r
1324                                         }\r
1325                                         this.actCombo.n現在のコンボ数.Drums = 0;\r
1326                                         return;\r
1327 \r
1328                                 case E楽器パート.GUITAR:\r
1329                                         this.actJudgeString.Start( 10, E判定.Bad, 999 );\r
1330                                         this.actCombo.n現在のコンボ数.Guitar = 0;\r
1331                                         return;\r
1332 \r
1333                                 case E楽器パート.BASS:\r
1334                                         this.actJudgeString.Start( 11, E判定.Bad, 999 );\r
1335                                         this.actCombo.n現在のコンボ数.Bass = 0;\r
1336                                         break;\r
1337 \r
1338                                 default:\r
1339                                         return;\r
1340                         }\r
1341                 }\r
1342         \r
1343                 protected CDTX.CChip r指定時刻に一番近い未ヒットChip( long nTime, int nChannelFlag, int nInputAdjustTime )\r
1344                 {\r
1345                         return this.r指定時刻に一番近い未ヒットChip( nTime, nChannelFlag, nInputAdjustTime, 0 );\r
1346                 }\r
1347                 protected CDTX.CChip r指定時刻に一番近い未ヒットChip( long nTime, int nChannel, int nInputAdjustTime, int n検索範囲時間ms )\r
1348                 {\r
1349                         sw2.Start();\r
1350 //Trace.TraceInformation( "nTime={0}, nChannel={1:x2}, 現在のTop={2}", nTime, nChannel,CDTXMania.DTX.listChip[ this.n現在のトップChip ].n発声時刻ms );\r
1351                         nTime += nInputAdjustTime;\r
1352 \r
1353                         int nIndex_InitialPositionSearchingToPast;\r
1354                         int nTimeDiff;\r
1355                         if ( this.n現在のトップChip == -1 )                       // 演奏データとして1個もチップがない場合は\r
1356                         {\r
1357                                 sw2.Stop();\r
1358                                 return null;\r
1359                         }\r
1360                         int count = listChip.Count;\r
1361                         int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = this.n現在のトップChip;\r
1362                         if ( this.n現在のトップChip >= count )            // その時点で演奏すべきチップが既に全部無くなっていたら\r
1363                         {\r
1364                                 nIndex_NearestChip_Future  = nIndex_InitialPositionSearchingToPast = count - 1;\r
1365                         }\r
1366                         // int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToFuture;\r
1367 //                      while ( nIndex_NearestChip_Future < count )     // 未来方向への検索\r
1368                         for ( ; nIndex_NearestChip_Future < count; nIndex_NearestChip_Future++ )\r
1369                         {\r
1370                                 CDTX.CChip chip = listChip[ nIndex_NearestChip_Future ];\r
1371                                 if ( !chip.bHit )\r
1372                                 {\r
1373                                         if ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) )\r
1374                                         {\r
1375                                                 if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )\r
1376                                                 {\r
1377                                                         if ( chip.n発声時刻ms > nTime )\r
1378                                                         {\r
1379                                                                 break;\r
1380                                                         }\r
1381                                                         nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
1382                                                 }\r
1383                                                 continue;\r
1384                                         }\r
1385                                         else if ( ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) ) )\r
1386                                         {\r
1387                                                 if ( chip.n発声時刻ms > nTime )\r
1388                                                 {\r
1389                                                         break;\r
1390                                                 }\r
1391                                                 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
1392                                         }\r
1393                                         else if ( ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) ) )\r
1394                                         {\r
1395                                                 if ( chip.n発声時刻ms > nTime )\r
1396                                                 {\r
1397                                                         break;\r
1398                                                 }\r
1399                                                 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
1400                                         }\r
1401                                 }\r
1402 //                              nIndex_NearestChip_Future++;\r
1403                         }\r
1404                         int nIndex_NearestChip_Past = nIndex_InitialPositionSearchingToPast;\r
1405 //                      while ( nIndex_NearestChip_Past >= 0 )          // 過去方向への検索\r
1406                         for ( ; nIndex_NearestChip_Past >= 0; nIndex_NearestChip_Past-- )\r
1407                         {\r
1408                                 CDTX.CChip chip = listChip[ nIndex_NearestChip_Past ];\r
1409                                 if ( (!chip.bHit) &&\r
1410                                                 (\r
1411                                                         ( ( nChannel >= 0x11 ) && ( nChannel <= 0x1a ) &&\r
1412                                                                 ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )\r
1413                                                         )\r
1414                                                         ||\r
1415                                                         (\r
1416                                                                 ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) ||\r
1417                                                                 ( ( ( nChannel >= 0x20 ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) )\r
1418                                                         )\r
1419                                                         ||\r
1420                                                         (\r
1421                                                                 ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) ||\r
1422                                                                 ( ( ( nChannel >= 0xA0 ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) )\r
1423                                                         )\r
1424                                                 )\r
1425                                         )\r
1426                                         {\r
1427                                                 break;\r
1428                                         }\r
1429 //                              nIndex_NearestChip_Past--;\r
1430                         }\r
1431                         if ( ( nIndex_NearestChip_Future >= count ) && ( nIndex_NearestChip_Past < 0 ) )        // 検索対象が過去未来どちらにも見つからなかった場合\r
1432                         {\r
1433                                 sw2.Stop();\r
1434                                 return null;\r
1435                         }\r
1436                         CDTX.CChip nearestChip; // = null;      // 以下のifブロックのいずれかで必ずnearestChipには非nullが代入されるので、null初期化を削除\r
1437                         if ( nIndex_NearestChip_Future >= count )                                                                                       // 検索対象が未来方向には見つからなかった(しかし過去方向には見つかった)場合\r
1438                         {\r
1439                                 nearestChip = listChip[ nIndex_NearestChip_Past ];\r
1440 //                              nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1441                         }\r
1442                         else if ( nIndex_NearestChip_Past < 0 )                                                                                         // 検索対象が過去方向には見つからなかった(しかし未来方向には見つかった)場合\r
1443                         {\r
1444                                 nearestChip = listChip[ nIndex_NearestChip_Future ];\r
1445 //                              nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1446                         }\r
1447                         else\r
1448                         {\r
1449                                 int nTimeDiff_Future = Math.Abs( (int) ( nTime - listChip[ nIndex_NearestChip_Future ].n発声時刻ms ) );\r
1450                                 int nTimeDiff_Past   = Math.Abs( (int) ( nTime - listChip[ nIndex_NearestChip_Past   ].n発声時刻ms ) );\r
1451                                 if ( nTimeDiff_Future < nTimeDiff_Past )\r
1452                                 {\r
1453                                         nearestChip = listChip[ nIndex_NearestChip_Future ];\r
1454 //                                      nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1455                                 }\r
1456                                 else\r
1457                                 {\r
1458                                         nearestChip = listChip[ nIndex_NearestChip_Past ];\r
1459 //                                      nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1460                                 }\r
1461                         }\r
1462                         nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1463                         if ( ( n検索範囲時間ms > 0 ) && ( nTimeDiff > n検索範囲時間ms ) )                                   // チップは見つかったが、検索範囲時間外だった場合\r
1464                         {\r
1465                                 sw2.Stop();\r
1466                                 return null;\r
1467                         }\r
1468                         sw2.Stop();\r
1469                         return nearestChip;\r
1470                 }\r
1471 \r
1472                 protected CDTX.CChip r次に来る指定楽器Chipを更新して返す( E楽器パート inst )\r
1473                 {\r
1474                         switch ( (int) inst )\r
1475                         {\r
1476                                 case (int)E楽器パート.GUITAR:\r
1477                                         return r次にくるギターChipを更新して返す();\r
1478                                 case (int)E楽器パート.BASS:\r
1479                                         return r次にくるベースChipを更新して返す();\r
1480                                 default:\r
1481                                         return null;\r
1482                         }\r
1483                 }\r
1484                 protected CDTX.CChip r次にくるギターChipを更新して返す()\r
1485                 {\r
1486                         int nInputAdjustTime = this.bIsAutoPlay.GtPick ? 0 : this.nInputAdjustTimeMs.Guitar;\r
1487                         this.r次にくるギターChip = this.r指定時刻に一番近い未ヒットChip( CSound管理.rc演奏用タイマ.n現在時刻, 0x2f, nInputAdjustTime, 500 );\r
1488                         return this.r次にくるギターChip;\r
1489                 }\r
1490                 protected CDTX.CChip r次にくるベースChipを更新して返す()\r
1491                 {\r
1492                         int nInputAdjustTime = this.bIsAutoPlay.BsPick ? 0 : this.nInputAdjustTimeMs.Bass;\r
1493                         this.r次にくるベースChip = this.r指定時刻に一番近い未ヒットChip( CSound管理.rc演奏用タイマ.n現在時刻, 0xaf, nInputAdjustTime, 500 );\r
1494                         return this.r次にくるベースChip;\r
1495                 }\r
1496 \r
1497                 protected void ChangeInputAdjustTimeInPlaying( IInputDevice keyboard, int plusminus )           // #23580 2011.1.16 yyagi UI for InputAdjustTime in playing screen.\r
1498                 {\r
1499                         int part, offset = plusminus;\r
1500                         if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) )      // Guitar InputAdjustTime\r
1501                         {\r
1502                                 part = (int) E楽器パート.GUITAR;\r
1503                         }\r
1504                         else if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftAlt ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightAlt ) )     // Bass InputAdjustTime\r
1505                         {\r
1506                                 part = (int) E楽器パート.BASS;\r
1507                         }\r
1508                         else    // Drums InputAdjustTime\r
1509                         {\r
1510                                 part = (int) E楽器パート.DRUMS;\r
1511                         }\r
1512                         if ( !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) && !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) )\r
1513                         {\r
1514                                 offset *= 10;\r
1515                         }\r
1516 \r
1517                         this.nInputAdjustTimeMs[ part ] += offset;\r
1518                         if ( this.nInputAdjustTimeMs[ part ] > 99 )\r
1519                         {\r
1520                                 this.nInputAdjustTimeMs[ part ] = 99;\r
1521                         }\r
1522                         else if ( this.nInputAdjustTimeMs[ part ] < -99 )\r
1523                         {\r
1524                                 this.nInputAdjustTimeMs[ part ] = -99;\r
1525                         }\r
1526                         CDTXMania.ConfigIni.nInputAdjustTimeMs[ part ] = this.nInputAdjustTimeMs[ part ];\r
1527                 }\r
1528 \r
1529                 protected abstract void t入力処理・ドラム();\r
1530                 protected abstract void ドラムスクロール速度アップ();\r
1531                 protected abstract void ドラムスクロール速度ダウン();\r
1532                 protected void tキー入力()\r
1533                 {\r
1534                         IInputDevice keyboard = CDTXMania.Input管理.Keyboard;\r
1535                         if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.F1 ) &&\r
1536                                 ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )\r
1537                         {       // shift+f1 (pause)\r
1538                                 this.bPAUSE = !this.bPAUSE;\r
1539                                 if ( this.bPAUSE )\r
1540                                 {\r
1541                     CSound管理.rc演奏用タイマ.t一時停止();\r
1542                                         CDTXMania.Timer.t一時停止();\r
1543                                         CDTXMania.DTX.t全チップの再生一時停止();\r
1544                                 }\r
1545                                 else\r
1546                                 {\r
1547                     CSound管理.rc演奏用タイマ.t再開();\r
1548                                         CDTXMania.Timer.t再開();\r
1549                                         CDTXMania.DTX.t全チップの再生再開();\r
1550                                 }\r
1551                         }\r
1552                         if ( ( !this.bPAUSE && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
1553                         {\r
1554                                 this.t入力処理・ドラム();\r
1555                                 this.t入力処理・ギターベース( E楽器パート.GUITAR );\r
1556                                 this.t入力処理・ギターベース( E楽器パート.BASS );\r
1557                                 if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )\r
1558                                 {       // shift (+ctrl) + UpArrow (BGMAdjust)\r
1559                                         CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? 1 : 10 );\r
1560                                         CDTXMania.DTX.tWave再生位置自動補正();\r
1561                                 }\r
1562                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )\r
1563                                 {       // shift + DownArrow (BGMAdjust)\r
1564                                         CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? -1 : -10 );\r
1565                                         CDTXMania.DTX.tWave再生位置自動補正();\r
1566                                 }\r
1567                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) )\r
1568                                 {       // UpArrow(scrollspeed up)\r
1569                                         ドラムスクロール速度アップ();\r
1570                                 }\r
1571                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) )\r
1572                                 {       // DownArrow (scrollspeed down)\r
1573                                         ドラムスクロール速度ダウン();\r
1574                                 }\r
1575                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Delete ) )\r
1576                                 {       // del (debug info)\r
1577                                         CDTXMania.ConfigIni.b演奏情報を表示する = !CDTXMania.ConfigIni.b演奏情報を表示する;\r
1578                                 }\r
1579                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.LeftArrow ) )           // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.\r
1580                                 {\r
1581                                         ChangeInputAdjustTimeInPlaying( keyboard, -1 );\r
1582                                 }\r
1583                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.RightArrow ) )          // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.\r
1584                                 {\r
1585                                         ChangeInputAdjustTimeInPlaying( keyboard, +1 );\r
1586                                 }\r
1587                                 else if ( ( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 ) && ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Escape ) || CDTXMania.Pad.b押されたGB( Eパッド.FT ) ) )\r
1588                                 {       // escape (exit)\r
1589                                         this.actFO.tフェードアウト開始();\r
1590                                         base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;\r
1591                                         this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.演奏中断;\r
1592                                 }\r
1593                         }\r
1594                 }\r
1595 \r
1596                 protected void t入力メソッド記憶( E楽器パート part )\r
1597                 {\r
1598                         if ( CDTXMania.Pad.st検知したデバイス.Keyboard )\r
1599                         {\r
1600                                 this.b演奏にキーボードを使った[ (int) part ] = true;\r
1601                         }\r
1602                         if ( CDTXMania.Pad.st検知したデバイス.Joypad )\r
1603                         {\r
1604                                 this.b演奏にジョイパッドを使った[ (int) part ] = true;\r
1605                         }\r
1606                         if ( CDTXMania.Pad.st検知したデバイス.MIDIIN )\r
1607                         {\r
1608                                 this.b演奏にMIDI入力を使った[ (int) part ] = true;\r
1609                         }\r
1610                         if ( CDTXMania.Pad.st検知したデバイス.Mouse )\r
1611                         {\r
1612                                 this.b演奏にマウスを使った[ (int) part ] = true;\r
1613                         }\r
1614                 }\r
1615 \r
1616 \r
1617                 protected abstract void t進行描画・AVI();\r
1618                 protected void t進行描画・AVI(int x, int y)\r
1619                 {\r
1620                         if ( ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( !CDTXMania.ConfigIni.bストイックモード && CDTXMania.ConfigIni.bAVI有効 ) )\r
1621                         {\r
1622                                 this.actAVI.t進行描画( x, y );\r
1623                         }\r
1624                 }\r
1625                 protected abstract void t進行描画・BGA();\r
1626                 protected void t進行描画・BGA(int x, int y)\r
1627                 {\r
1628                         if ( ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( !CDTXMania.ConfigIni.bストイックモード && CDTXMania.ConfigIni.bBGA有効 ) )\r
1629                         {\r
1630                                 this.actBGA.t進行描画( x, y );\r
1631                         }\r
1632                 }\r
1633                 protected abstract void t進行描画・DANGER();\r
1634                 protected void t進行描画・MIDIBGM()\r
1635                 {\r
1636                         if ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED )\r
1637                         {\r
1638                                 CStage.Eフェーズ eフェーズid1 = base.eフェーズID;\r
1639                         }\r
1640                 }\r
1641                 protected void t進行描画・RGBボタン()\r
1642                 {\r
1643                         if ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )\r
1644                         {\r
1645                                 this.actRGB.On進行描画();\r
1646                         }\r
1647                 }\r
1648                 protected void t進行描画・STAGEFAILED()\r
1649                 {\r
1650                         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
1651                         {\r
1652                                 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージ失敗;\r
1653                                 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト;\r
1654                                 this.actFO.tフェードアウト開始();\r
1655                         }\r
1656                 }\r
1657                 protected void t進行描画・WailingBonus()\r
1658                 {\r
1659                         if ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
1660                         {\r
1661                                 this.actWailingBonus.On進行描画();\r
1662                         }\r
1663                 }\r
1664                 protected abstract void t進行描画・Wailing枠();\r
1665                 protected void t進行描画・Wailing枠(int GtWailingFrameX, int BsWailingFrameX, int GtWailingFrameY, int BsWailingFrameY)\r
1666                 {\r
1667                         if ( ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL ) && CDTXMania.ConfigIni.bGuitar有効 )\r
1668                         {\r
1669                                 if ( this.txWailing枠 != null )\r
1670                                 {\r
1671                                         if ( CDTXMania.DTX.bチップがある.Guitar )\r
1672                                         {\r
1673                                                 this.txWailing枠.t2D描画( CDTXMania.app.Device, GtWailingFrameX, GtWailingFrameY );\r
1674                                         }\r
1675                                         if ( CDTXMania.DTX.bチップがある.Bass )\r
1676                                         {\r
1677                                                 this.txWailing枠.t2D描画( CDTXMania.app.Device, BsWailingFrameX, BsWailingFrameY );\r
1678                                         }\r
1679                                 }\r
1680                         }\r
1681                 }\r
1682 \r
1683 \r
1684                 protected void t進行描画・チップファイアGB()\r
1685                 {\r
1686                         this.actChipFireGB.On進行描画();\r
1687                 }\r
1688                 protected abstract void t進行描画・パネル文字列();\r
1689                 protected void t進行描画・パネル文字列(int x, int y)\r
1690                 {\r
1691                         if ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
1692                         {\r
1693                                 this.actPanel.t進行描画( x, y );\r
1694                         }\r
1695                 }\r
1696                 protected void tパネル文字列の設定()\r
1697                 {\r
1698                         this.actPanel.SetPanelString( string.IsNullOrEmpty( CDTXMania.DTX.PANEL ) ? CDTXMania.DTX.TITLE : CDTXMania.DTX.PANEL );\r
1699                 }\r
1700 \r
1701 \r
1702                 protected void t進行描画・ゲージ()\r
1703                 {\r
1704                         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
1705                         {\r
1706                                 this.actGauge.On進行描画();\r
1707                         }\r
1708                 }\r
1709                 protected void t進行描画・コンボ()\r
1710                 {\r
1711                         this.actCombo.On進行描画();\r
1712                 }\r
1713                 protected void t進行描画・スコア()\r
1714                 {\r
1715                         this.actScore.On進行描画();\r
1716                 }\r
1717                 protected void t進行描画・ステータスパネル()\r
1718                 {\r
1719                         this.actStatusPanels.On進行描画();\r
1720                 }\r
1721                 protected bool t進行描画・チップ( E楽器パート ePlayMode )\r
1722                 {\r
1723                         if ( ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED ) || ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
1724                         {\r
1725                                 return true;\r
1726                         }\r
1727                         if ( ( this.n現在のトップChip == -1 ) || ( this.n現在のトップChip >= listChip.Count ) )\r
1728                         {\r
1729                                 return true;\r
1730                         }\r
1731                         if ( this.n現在のトップChip == -1 )\r
1732                         {\r
1733                                 return true;\r
1734                         }\r
1735 \r
1736                         //double speed = 264.0; // BPM150の時の1小節の長さ[dot]\r
1737                         const double speed = 234.0;     // BPM150の時の1小節の長さ[dot]\r
1738 \r
1739                         double ScrollSpeedDrums = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Drums + 1.0 ) * 0.5 * 37.5 * speed / 60000.0;\r
1740                         double ScrollSpeedGuitar = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Guitar + 1.0 ) * 0.5 * 0.5 * 37.5 * speed / 60000.0;\r
1741                         double ScrollSpeedBass = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Bass + 1.0 ) * 0.5 * 0.5 * 37.5 * speed / 60000.0;\r
1742 \r
1743                         CDTX dTX = CDTXMania.DTX;\r
1744                         CConfigIni configIni = CDTXMania.ConfigIni;\r
1745                         for ( int nCurrentTopChip = this.n現在のトップChip; nCurrentTopChip < dTX.listChip.Count; nCurrentTopChip++ )\r
1746                         {\r
1747                                 CDTX.CChip pChip = dTX.listChip[ nCurrentTopChip ];\r
1748 //Debug.WriteLine( "nCurrentTopChip=" + nCurrentTopChip + ", ch=" + pChip.nチャンネル番号.ToString("x2") + ", 発音位置=" + pChip.n発声位置 + ", 発声時刻ms=" + pChip.n発声時刻ms );\r
1749                                 pChip.nバーからの距離dot.Drums = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedDrums );\r
1750                                 pChip.nバーからの距離dot.Guitar = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedGuitar );\r
1751                                 pChip.nバーからの距離dot.Bass = (int) ( ( pChip.n発声時刻ms - CSound管理.rc演奏用タイマ.n現在時刻 ) * ScrollSpeedBass );\r
1752                                 if ( Math.Min( Math.Min( pChip.nバーからの距離dot.Drums, pChip.nバーからの距離dot.Guitar ), pChip.nバーからの距離dot.Bass ) > 450 )\r
1753                                 {\r
1754                                         break;\r
1755                                 }\r
1756 //                              if ( ( ( nCurrentTopChip == this.n現在のトップChip ) && ( pChip.nバーからの距離dot.Drums < -65 ) ) && pChip.bHit )\r
1757                                 // #28026 2012.4.5 yyagi; 信心ワールドエンドの曲終了後リザルトになかなか行かない問題の修正\r
1758                                 if ( ( dTX.listChip[ this.n現在のトップChip ].nバーからの距離dot.Drums < -65 ) && dTX.listChip[ this.n現在のトップChip ].bHit )\r
1759                                 {\r
1760 //                                      nCurrentTopChip = ++this.n現在のトップChip;\r
1761                                         ++this.n現在のトップChip;\r
1762                                         continue;\r
1763                                 }\r
1764 \r
1765                                 bool bPChipIsAutoPlay = bCheckAutoPlay( pChip );\r
1766 \r
1767                                 int nInputAdjustTime = ( bPChipIsAutoPlay || (pChip.e楽器パート == E楽器パート.UNKNOWN) )? 0 : this.nInputAdjustTimeMs[ (int) pChip.e楽器パート ];\r
1768 \r
1769                                 if ( ( ( pChip.e楽器パート != E楽器パート.UNKNOWN ) && !pChip.bHit ) &&\r
1770                                         ( ( pChip.nバーからの距離dot.Drums < 0 ) && ( this.e指定時刻からChipのJUDGEを返す( CSound管理.rc演奏用タイマ.n現在時刻, pChip, nInputAdjustTime ) == E判定.Miss ) ) )\r
1771                                 {\r
1772                                         this.tチップのヒット処理( CSound管理.rc演奏用タイマ.n現在時刻, pChip );\r
1773                                 }\r
1774                                 switch ( pChip.nチャンネル番号 )\r
1775                                 {\r
1776                                         #region [ 01: BGM ]\r
1777                                         case 0x01:      // BGM\r
1778                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1779                                                 {\r
1780                                                         pChip.bHit = true;\r
1781                                                         if ( configIni.bBGM音を発声する )\r
1782                                                         {\r
1783                                                                 dTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int) Eレーン.BGM, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
1784                                                         }\r
1785                                                 }\r
1786                                                 break;\r
1787                                         #endregion\r
1788                                         #region [ 03: BPM変更 ]\r
1789                                         case 0x03:      // BPM変更\r
1790                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1791                                                 {\r
1792                                                         pChip.bHit = true;\r
1793                                                         this.actPlayInfo.dbBPM = ( pChip.n整数値 * ( ( (double) configIni.n演奏速度 ) / 20.0 ) ) + dTX.BASEBPM;\r
1794                                                 }\r
1795                                                 break;\r
1796                                         #endregion\r
1797                                         #region [ 04, 07, 55, 56,57, 58, 59, 60:レイヤーBGA ]\r
1798                                         case 0x04:      // レイヤーBGA\r
1799                                         case 0x07:\r
1800                                         case 0x55:\r
1801                                         case 0x56:\r
1802                                         case 0x57:\r
1803                                         case 0x58:\r
1804                                         case 0x59:\r
1805                                         case 0x60:\r
1806                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1807                                                 {\r
1808                                                         pChip.bHit = true;\r
1809                                                         if ( configIni.bBGA有効 )\r
1810                                                         {\r
1811                                                                 switch ( pChip.eBGA種別 )\r
1812                                                                 {\r
1813                                                                         case EBGA種別.BMPTEX:\r
1814                                                                                 if ( pChip.rBMPTEX != null )\r
1815                                                                                 {\r
1816                                                                                         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
1817                                                                                 }\r
1818                                                                                 break;\r
1819 \r
1820                                                                         case EBGA種別.BGA:\r
1821                                                                                 if ( ( pChip.rBGA != null ) && ( ( pChip.rBMP != null ) || ( pChip.rBMPTEX != null ) ) )\r
1822                                                                                 {\r
1823                                                                                         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
1824                                                                                 }\r
1825                                                                                 break;\r
1826 \r
1827                                                                         case EBGA種別.BGAPAN:\r
1828                                                                                 if ( ( pChip.rBGAPan != null ) && ( ( pChip.rBMP != null ) || ( pChip.rBMPTEX != null ) ) )\r
1829                                                                                 {\r
1830                                                                                         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
1831                                                                                 }\r
1832                                                                                 break;\r
1833 \r
1834                                                                         default:\r
1835                                                                                 if ( pChip.rBMP != null )\r
1836                                                                                 {\r
1837                                                                                         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
1838                                                                                 }\r
1839                                                                                 break;\r
1840                                                                 }\r
1841                                                         }\r
1842                                                 }\r
1843                                                 break;\r
1844                                         #endregion\r
1845                                         #region [ 08: BPM変更(拡張) ]\r
1846                                         case 0x08:      // BPM変更(拡張)\r
1847                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1848                                                 {\r
1849                                                         pChip.bHit = true;\r
1850                                                         if ( dTX.listBPM.ContainsKey( pChip.n整数値・内部番号 ) )\r
1851                                                         {\r
1852                                                                 this.actPlayInfo.dbBPM = ( dTX.listBPM[ pChip.n整数値・内部番号 ].dbBPM値 * ( ( (double) configIni.n演奏速度 ) / 20.0 ) ) + dTX.BASEBPM;\r
1853                                                         }\r
1854                                                 }\r
1855                                                 break;\r
1856                                         #endregion\r
1857                                         #region [ 11-1a: ドラム演奏 ]\r
1858                                         case 0x11:      // ドラム演奏\r
1859                                         case 0x12:\r
1860                                         case 0x13:\r
1861                                         case 0x14:\r
1862                                         case 0x15:\r
1863                                         case 0x16:\r
1864                                         case 0x17:\r
1865                                         case 0x18:\r
1866                                         case 0x19:\r
1867                                         case 0x1a:\r
1868                                                 this.t進行描画・チップ・ドラムス( configIni, ref dTX, ref pChip );\r
1869                                                 break;\r
1870                                         #endregion\r
1871                                         #region [ 1f: フィルインサウンド(ドラム) ]\r
1872                                         case 0x1f:      // フィルインサウンド(ドラム)\r
1873                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1874                                                 {\r
1875                                                         pChip.bHit = true;\r
1876                                                         this.r現在の歓声Chip.Drums = pChip;\r
1877                                                 }\r
1878                                                 break;\r
1879                                         #endregion\r
1880                                         #region [ 20-27: ギター演奏 ]\r
1881                                         case 0x20:      // ギター演奏\r
1882                                         case 0x21:\r
1883                                         case 0x22:\r
1884                                         case 0x23:\r
1885                                         case 0x24:\r
1886                                         case 0x25:\r
1887                                         case 0x26:\r
1888                                         case 0x27:\r
1889                                                 this.t進行描画・チップ・ギターベース( configIni, ref dTX, ref pChip, E楽器パート.GUITAR );\r
1890                                                 break;\r
1891                                         #endregion\r
1892                                         #region [ 28: ウェイリング(ギター) ]\r
1893                                         case 0x28:      // ウェイリング(ギター)\r
1894                                                 this.t進行描画・チップ・ギター・ウェイリング( configIni, ref dTX, ref pChip );\r
1895                                                 break;\r
1896                                         #endregion\r
1897                                         #region [ 2f: ウェイリングサウンド(ギター) ]\r
1898                                         case 0x2f:      // ウェイリングサウンド(ギター)\r
1899                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Guitar < 0 ) )\r
1900                                                 {\r
1901                                                         pChip.bHit = true;\r
1902                                                         this.r現在の歓声Chip.Guitar = pChip;\r
1903                                                 }\r
1904                                                 break;\r
1905                                         #endregion\r
1906                                         #region [ 31-3a: 不可視チップ配置(ドラム) ]\r
1907                                         case 0x31:      // 不可視チップ配置(ドラム)\r
1908                                         case 0x32:\r
1909                                         case 0x33:\r
1910                                         case 0x34:\r
1911                                         case 0x35:\r
1912                                         case 0x36:\r
1913                                         case 0x37:\r
1914                                         case 0x38:\r
1915                                         case 0x39:\r
1916                                         case 0x3a:\r
1917                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1918                                                 {\r
1919                                                         pChip.bHit = true;\r
1920                                                 }\r
1921                                                 break;\r
1922                                         #endregion\r
1923                                         #region [ 50: 小節線 ]\r
1924                                         case 0x50:      // 小節線\r
1925                                                 {\r
1926                                                         this.t進行描画・チップ・小節線( configIni, ref dTX, ref pChip );\r
1927                                                         break;\r
1928                                                 }\r
1929                                         #endregion\r
1930                                         #region [ 51: 拍線 ]\r
1931                                         case 0x51:      // 拍線\r
1932                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1933                                                 {\r
1934                                                         pChip.bHit = true;\r
1935                                                 }\r
1936                                                 if ( ( ePlayMode == E楽器パート.DRUMS ) && ( configIni.eDark != Eダークモード.FULL ) && pChip.b可視 && ( this.txチップ != null ) )\r
1937                                                 {\r
1938                                                         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
1939                                                 }\r
1940                                                 break;\r
1941                                         #endregion\r
1942                                         #region [ 52: MIDIコーラス ]\r
1943                                         case 0x52:      // MIDIコーラス\r
1944                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1945                                                 {\r
1946                                                         pChip.bHit = true;\r
1947                                                 }\r
1948                                                 break;\r
1949                                         #endregion\r
1950                                         #region [ 53: フィルイン ]\r
1951                                         case 0x53:      // フィルイン\r
1952                                                 this.t進行描画・チップ・フィルイン( configIni, ref dTX, ref pChip );\r
1953                                                 break;\r
1954                                         #endregion\r
1955                                         #region [ 54: 動画再生 ]\r
1956                                         case 0x54:      // 動画再生\r
1957                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1958                                                 {\r
1959                                                         pChip.bHit = true;\r
1960                                                         if ( configIni.bAVI有効 )\r
1961                                                         {\r
1962                                                                 switch ( pChip.eAVI種別 )\r
1963                                                                 {\r
1964                                                                         case EAVI種別.AVI:\r
1965                                                                                 if ( pChip.rAVI != null )\r
1966                                                                                 {\r
1967                                                                                         this.actAVI.Start( pChip.nチャンネル番号, pChip.rAVI, 0x116, 0x163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, pChip.n発声時刻ms );\r
1968                                                                                 }\r
1969                                                                                 break;\r
1970 \r
1971                                                                         case EAVI種別.AVIPAN:\r
1972                                                                                 if ( pChip.rAVIPan != null )\r
1973                                                                                 {\r
1974                                                                                         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
1975                                                                                 }\r
1976                                                                                 break;\r
1977                                                                 }\r
1978                                                         }\r
1979                                                 }\r
1980                                                 break;\r
1981                                         #endregion\r
1982                                         #region [ 61-92: 自動再生(BGM, SE) ]\r
1983                                         case 0x61:\r
1984                                         case 0x62:\r
1985                                         case 0x63:\r
1986                                         case 0x64:      // 自動再生(BGM, SE)\r
1987                                         case 0x65:\r
1988                                         case 0x66:\r
1989                                         case 0x67:\r
1990                                         case 0x68:\r
1991                                         case 0x69:\r
1992                                         case 0x70:\r
1993                                         case 0x71:\r
1994                                         case 0x72:\r
1995                                         case 0x73:\r
1996                                         case 0x74:\r
1997                                         case 0x75:\r
1998                                         case 0x76:\r
1999                                         case 0x77:\r
2000                                         case 0x78:\r
2001                                         case 0x79:\r
2002                                         case 0x80:\r
2003                                         case 0x81:\r
2004                                         case 0x82:\r
2005                                         case 0x83:\r
2006                                         case 0x90:\r
2007                                         case 0x91:\r
2008                                         case 0x92:\r
2009                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2010                                                 {\r
2011                                                         pChip.bHit = true;\r
2012                                                         if ( configIni.bBGM音を発声する )\r
2013                                                         {\r
2014                                                                 dTX.tWavの再生停止( this.n最後に再生したBGMの実WAV番号[ pChip.nチャンネル番号 - 0x61 ] );\r
2015                                                                 dTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, ( int ) Eレーン.BGM, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
2016                                                                 this.n最後に再生したBGMの実WAV番号[ pChip.nチャンネル番号 - 0x61 ] = pChip.n整数値・内部番号;\r
2017                                                         }\r
2018                                                 }\r
2019                                                 break;\r
2020                                         #endregion\r
2021 \r
2022 \r
2023                                         #region [ 84-89: 仮: override sound ]  // #26338 2011.11.8 yyagi\r
2024                                         case 0x84:      // HH (HO/HC)\r
2025                                         case 0x85:      // CY\r
2026                                         case 0x86:      // RD\r
2027                                         case 0x87:      // LC\r
2028                                         case 0x88:      // Guitar\r
2029                                         case 0x89:      // Bass\r
2030                                         // mute sound (auto)\r
2031                                         // 4A: 84: HH (HO/HC)\r
2032                                         // 4B: 85: CY\r
2033                                         // 4C: 86: RD\r
2034                                         // 4D: 87: LC\r
2035                                         // 2A: 88: Gt\r
2036                                         // AA: 89: Bs\r
2037 \r
2038                                         //      CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Guitar );\r
2039                                         //      CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, 8, n音量, bモニタ, b音程をずらして再生 );\r
2040                                         //      this.n最後に再生した実WAV番号.Guitar = pChip.n整数値・内部番号;\r
2041 \r
2042                                         //      protected void tサウンド再生( CDTX.CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生 )\r
2043                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2044                                                 {\r
2045                                                         pChip.bHit = true;\r
2046                                                         E楽器パート[] p = { E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.GUITAR, E楽器パート.BASS };\r
2047 \r
2048                                                         E楽器パート pp =  p[ pChip.nチャンネル番号 - 0x84 ];\r
2049                                                         \r
2050 //                                                      if ( pp == E楽器パート.DRUMS ) {                   // pChip.nチャンネル番号= ..... HHとか、ドラムの場合は変える。\r
2051 //                                                              //            HC    CY    RD    LC\r
2052 //                                                              int[] ch = { 0x11, 0x16, 0x19, 0x1A };\r
2053 //                                                              pChip.nチャンネル番号 = ch[ pChip.nチャンネル番号 - 0x84 ]; \r
2054 //                                                      }\r
2055                                                         this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, pp, dTX.nモニタを考慮した音量( pp ) );\r
2056                                                 }\r
2057                                                 break;\r
2058                                         #endregion\r
2059 \r
2060                                         #region [ a0-a7: ベース演奏 ]\r
2061                                         case 0xa0:      // ベース演奏\r
2062                                         case 0xa1:\r
2063                                         case 0xa2:\r
2064                                         case 0xa3:\r
2065                                         case 0xa4:\r
2066                                         case 0xa5:\r
2067                                         case 0xa6:\r
2068                                         case 0xa7:\r
2069                                                 this.t進行描画・チップ・ギターベース( configIni, ref dTX, ref pChip, E楽器パート.BASS );\r
2070                                                 break;\r
2071                                         #endregion\r
2072                                         #region [ a8: ウェイリング(ベース) ]\r
2073                                         case 0xa8:      // ウェイリング(ベース)\r
2074                                                 this.t進行描画・チップ・ベース・ウェイリング( configIni, ref dTX, ref pChip );\r
2075                                                 break;\r
2076                                         #endregion\r
2077                                         #region [ af: ウェイリングサウンド(ベース) ]\r
2078                                         case 0xaf:      // ウェイリングサウンド(ベース)\r
2079                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )\r
2080                                                 {\r
2081                                                         pChip.bHit = true;\r
2082                                                         this.r現在の歓声Chip.Bass = pChip;\r
2083                                                 }\r
2084                                                 break;\r
2085                                         #endregion\r
2086                                         #region [ b1-b9, bc: 空打ち音設定(ドラム) ]\r
2087                                         case 0xb1:      // 空打ち音設定(ドラム)\r
2088                                         case 0xb2:\r
2089                                         case 0xb3:\r
2090                                         case 0xb4:\r
2091                                         case 0xb5:\r
2092                                         case 0xb6:\r
2093                                         case 0xb7:\r
2094                                         case 0xb8:\r
2095                                         case 0xb9:\r
2096                                         case 0xbc:\r
2097                                                 this.t進行描画・チップ・空打ち音設定・ドラム( configIni, ref dTX, ref pChip );\r
2098                                                 break;\r
2099                                         #endregion\r
2100                                         #region [ ba: 空打ち音設定(ギター) ]\r
2101                                         case 0xba:      // 空打ち音設定(ギター)\r
2102                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Guitar < 0 ) )\r
2103                                                 {\r
2104                                                         pChip.bHit = true;\r
2105                                                         this.r現在の空うちギターChip = pChip;\r
2106                                                         pChip.nチャンネル番号 = 0x20;\r
2107                                                 }\r
2108                                                 break;\r
2109                                         #endregion\r
2110                                         #region [ bb: 空打ち音設定(ベース) ]\r
2111                                         case 0xbb:      // 空打ち音設定(ベース)\r
2112                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )\r
2113                                                 {\r
2114                                                         pChip.bHit = true;\r
2115                                                         this.r現在の空うちベースChip = pChip;\r
2116                                                         pChip.nチャンネル番号 = 0xA0;\r
2117                                                 }\r
2118                                                 break;\r
2119                                         #endregion\r
2120                                         #region [ c4, c7, d5-d9, e0: BGA画像入れ替え ]\r
2121                                         case 0xc4:\r
2122                                         case 0xc7:\r
2123                                         case 0xd5:\r
2124                                         case 0xd6:      // BGA画像入れ替え\r
2125                                         case 0xd7:\r
2126                                         case 0xd8:\r
2127                                         case 0xd9:\r
2128                                         case 0xe0:\r
2129                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2130                                                 {\r
2131                                                         pChip.bHit = true;\r
2132                                                         if ( ( configIni.bBGA有効 && ( pChip.eBGA種別 == EBGA種別.BMP ) ) || ( pChip.eBGA種別 == EBGA種別.BMPTEX ) )\r
2133                                                         {\r
2134                                                                 for ( int i = 0; i < 8; i++ )\r
2135                                                                 {\r
2136                                                                         if ( this.nBGAスコープチャンネルマップ[ 0, i ] == pChip.nチャンネル番号 )\r
2137                                                                         {\r
2138                                                                                 this.actBGA.ChangeScope( this.nBGAスコープチャンネルマップ[ 1, i ], pChip.rBMP, pChip.rBMPTEX );\r
2139                                                                         }\r
2140                                                                 }\r
2141                                                         }\r
2142                                                 }\r
2143                                                 break;\r
2144                                         #endregion\r
2145                                         #region [ da: ミキサーへチップ音追加 ]\r
2146                                         case 0xDA:\r
2147                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2148                                                 {\r
2149 //Debug.WriteLine( "[DA(AddMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );\r
2150                                                         pChip.bHit = true;\r
2151                                                         if ( listWAV.ContainsKey( pChip.n整数値・内部番号 ) )   // 参照が遠いので後日最適化する\r
2152                                                         {\r
2153                                                                 CDTX.CWAV wc = listWAV[ pChip.n整数値・内部番号 ];\r
2154                                                                 for ( int i = 0; i < nPolyphonicSounds; i++ )\r
2155                                                                 {\r
2156                                                                         if ( wc.rSound[ i ] != null )\r
2157                                                                         {\r
2158                                                                                 //CDTXMania.Sound管理.AddMixer( wc.rSound[ i ] );\r
2159                                                                                 AddMixer( wc.rSound[ i ], pChip.b演奏終了後も再生が続くチップである );\r
2160                                                                         }\r
2161                                                                 }\r
2162                                                         }\r
2163                                                 }\r
2164                                                 break;\r
2165                                         #endregion\r
2166                                         #region [ db: ミキサーからチップ音削除 ]\r
2167                                         case 0xDB:\r
2168                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2169                                                 {\r
2170 //Debug.WriteLine( "[DB(RemoveMixer)] BAR=" + pChip.n発声位置 / 384 + " ch=" + pChip.nチャンネル番号.ToString( "x2" ) + ", wav=" + pChip.n整数値.ToString( "x2" ) + ", time=" + pChip.n発声時刻ms );\r
2171                                                         pChip.bHit = true;\r
2172                                                         if ( listWAV.ContainsKey( pChip.n整数値・内部番号 ) )   // 参照が遠いので後日最適化する\r
2173                                                         {\r
2174                                                             CDTX.CWAV wc = listWAV[ pChip.n整数値・内部番号 ];\r
2175                                                             for ( int i = 0; i < nPolyphonicSounds; i++ )\r
2176                                                             {\r
2177                                                                         if ( wc.rSound[ i ] != null )\r
2178                                                                         {\r
2179                                                                                 //CDTXMania.Sound管理.RemoveMixer( wc.rSound[ i ] );\r
2180                                                                                 if ( !wc.rSound[ i ].b演奏終了後も再生が続くチップである )     // #32248 2013.10.16 yyagi\r
2181                                                                                 {                                                                                                                       // DTX終了後も再生が続くチップの0xDB登録をなくすことはできず。\r
2182                                                                                         RemoveMixer( wc.rSound[ i ] );                                                  // (ミキサー解除のタイミングが遅延する場合の対応が面倒なので。)\r
2183                                                                                 }                                                                                                                       // そこで、代わりにフラグをチェックしてミキサー削除ロジックへの遷移をカットする。\r
2184                                                                         }\r
2185                                                             }\r
2186                                                         }\r
2187                                                 }\r
2188                                                 break;\r
2189                                         #endregion\r
2190                                         #region [ その他(未定義) ]\r
2191                                         default:\r
2192                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
2193                                                 {\r
2194                                                         pChip.bHit = true;\r
2195                                                 }\r
2196                                                 break;\r
2197                                         #endregion \r
2198                                 }\r
2199                         }\r
2200                         return false;\r
2201                 }\r
2202 \r
2203                 private bool bCheckAutoPlay( CDTX.CChip pChip )\r
2204                 {\r
2205                         bool bPChipIsAutoPlay = false;\r
2206                         bool bGtBsR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );\r
2207                         bool bGtBsG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );\r
2208                         bool bGtBsB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );\r
2209                         bool bGtBsW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );\r
2210                         bool bGtBsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );\r
2211                         //if ( (\r
2212                         //        ( ( pChip.e楽器パート == E楽器パート.DRUMS ) && bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] ) ||\r
2213                         //        ( ( pChip.e楽器パート == E楽器パート.GUITAR ) && bIsAutoPlay.Guitar ) ) ||\r
2214                         //        ( ( pChip.e楽器パート == E楽器パート.BASS ) && bIsAutoPlay.Bass )\r
2215                         //  )\r
2216                         ////                            if ((pChip.e楽器パート == E楽器パート.DRUMS) && bIsAutoPlay[this.nチャンネル0Atoレーン07[pChip.nチャンネル番号 - 0x11]])\r
2217                         //{\r
2218                         //    bPChipIsAutoPlay = true;\r
2219                         //}\r
2220                         if ( pChip.e楽器パート == E楽器パート.DRUMS )\r
2221                         {\r
2222                                 if ( bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] )\r
2223                                 {\r
2224                                         bPChipIsAutoPlay = true;\r
2225                                 }\r
2226                         }\r
2227                         else if ( pChip.e楽器パート == E楽器パート.GUITAR )\r
2228                         {\r
2229                                 //Trace.TraceInformation( "chip:{0}{1}{2} ", bGtBsR, bGtBsG, bGtBsB );\r
2230                                 //Trace.TraceInformation( "auto:{0}{1}{2} ", bIsAutoPlay[ (int) Eレーン.GtR ], bIsAutoPlay[ (int) Eレーン.GtG ], bIsAutoPlay[ (int) Eレーン.GtB ]);\r
2231                                 bPChipIsAutoPlay = true;\r
2232                                 if ( bIsAutoPlay[ (int) Eレーン.GtPick ] == false ) bPChipIsAutoPlay = false;\r
2233                                 else\r
2234                                 {\r
2235                                         if ( bGtBsR == true && bIsAutoPlay[ (int) Eレーン.GtR ] == false ) bPChipIsAutoPlay = false;\r
2236                                         else if ( bGtBsG == true && bIsAutoPlay[ (int) Eレーン.GtG ] == false ) bPChipIsAutoPlay = false;\r
2237                                         else if ( bGtBsB == true && bIsAutoPlay[ (int) Eレーン.GtB ] == false ) bPChipIsAutoPlay = false;\r
2238                                         else if ( bGtBsW == true && bIsAutoPlay[ (int) Eレーン.GtW ] == false ) bPChipIsAutoPlay = false;\r
2239                                         else if ( bGtBsO == true &&\r
2240                                                 ( bIsAutoPlay[ (int) Eレーン.GtR ] == false || bIsAutoPlay[ (int) Eレーン.GtG ] == false || bIsAutoPlay[ (int) Eレーン.GtB ] == false ) )\r
2241                                                 bPChipIsAutoPlay = false;\r
2242                                 }\r
2243                                 //Trace.TraceInformation( "{0:x2}: {1}", pChip.nチャンネル番号, bPChipIsAutoPlay.ToString() );\r
2244                         }\r
2245                         else if ( pChip.e楽器パート == E楽器パート.BASS )\r
2246                         {\r
2247                                 bPChipIsAutoPlay = true;\r
2248                                 if ( bIsAutoPlay[ (int) Eレーン.BsPick ] == false ) bPChipIsAutoPlay = false;\r
2249                                 else\r
2250                                 {\r
2251                                         if ( bGtBsR == true && bIsAutoPlay[ (int) Eレーン.BsR ] == false ) bPChipIsAutoPlay = false;\r
2252                                         else if ( bGtBsG == true && bIsAutoPlay[ (int) Eレーン.BsG ] == false ) bPChipIsAutoPlay = false;\r
2253                                         else if ( bGtBsB == true && bIsAutoPlay[ (int) Eレーン.BsB ] == false ) bPChipIsAutoPlay = false;\r
2254                                         else if ( bGtBsW == true && bIsAutoPlay[ (int) Eレーン.BsW ] == false ) bPChipIsAutoPlay = false;\r
2255                                         else if ( bGtBsO == true &&\r
2256                                                 ( bIsAutoPlay[ (int) Eレーン.BsR ] == false || bIsAutoPlay[ (int) Eレーン.BsG ] == false || bIsAutoPlay[ (int) Eレーン.BsB ] == false ) )\r
2257                                                 bPChipIsAutoPlay = false;\r
2258                                 }\r
2259                         }\r
2260                         return bPChipIsAutoPlay;\r
2261                 }\r
2262 \r
2263                 protected abstract void t進行描画・チップ・ドラムス( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2264                 //protected abstract void t進行描画・チップ・ギター( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2265                 protected abstract void t進行描画・チップ・ギターベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst );\r
2266 \r
2267                 protected void t進行描画・チップ・ギターベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst,\r
2268                         int barYNormal, int barYReverse, int showRangeY0, int showRangeY1, int openXg, int openXb,\r
2269                         int rectOpenOffsetX, int rectOpenOffsetY, int openChipWidth, int chipHeight,\r
2270                         int chipWidth, int guitarNormalX, int guitarLeftyX, int bassNormalX, int bassLeftyX, int drawDeltaX, int chipTexDeltaX )\r
2271                 {\r
2272                         int instIndex = (int) inst;\r
2273                         if ( configIni.bGuitar有効 )\r
2274                         {\r
2275                                 #region [ Invisible処理 ]\r
2276                                 if ( configIni.eInvisible[ instIndex ] != EInvisible.OFF )\r
2277                                 {\r
2278                                         //pChip.b可視 = false;\r
2279                                         cInvisibleChip.SetInvisibleStatus( ref pChip );\r
2280                                 }\r
2281                                 #endregion\r
2282                                 else\r
2283                                 {\r
2284                                         #region [ Hidden/Sudden処理 ]\r
2285                                         if ( configIni.bSudden[ instIndex ] )\r
2286                                         {\r
2287                                                 pChip.b可視 = pChip.nバーからの距離dot[ instIndex ] < 200;\r
2288                                         }\r
2289                                         if ( configIni.bHidden[ instIndex ] && ( pChip.nバーからの距離dot[ instIndex ] < 100 ) )\r
2290                                         {\r
2291                                                 pChip.b可視 = false;\r
2292                                         }\r
2293                                         #endregion\r
2294                                 }\r
2295 \r
2296                                 bool bChipHasR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );\r
2297                                 bool bChipHasG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );\r
2298                                 bool bChipHasB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );\r
2299                                 bool bChipHasW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );\r
2300                                 bool bChipIsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );\r
2301 \r
2302                                 #region [ chip描画 ]\r
2303                                 int OPEN = ( inst == E楽器パート.GUITAR ) ? 0x20 : 0xA0;\r
2304                                 if ( !pChip.bHit && pChip.b可視 )\r
2305                                 {\r
2306                                         if ( this.txチップ != null )\r
2307                                         {\r
2308                                                 this.txチップ.n透明度 = pChip.n透明度;\r
2309                                         }\r
2310                                         int y = configIni.bReverse[ instIndex ] ? ( barYReverse - pChip.nバーからの距離dot[ instIndex ] ) : ( barYNormal + pChip.nバーからの距離dot[ instIndex ] );\r
2311                                         if ( ( showRangeY0 < y ) && ( y < showRangeY1 ) )\r
2312                                         {\r
2313                                                 if ( this.txチップ != null )\r
2314                                                 {\r
2315                                                         int nアニメカウンタ現在の値 = this.ctチップ模様アニメ[ instIndex ].n現在の値;\r
2316                                                         if ( pChip.nチャンネル番号 == OPEN )\r
2317                                                         {\r
2318                                                                 int xo = ( inst == E楽器パート.GUITAR ) ? openXg : openXb;\r
2319                                                                 this.txチップ.t2D描画( CDTXMania.app.Device, xo, y - 2, new Rectangle( rectOpenOffsetX, rectOpenOffsetY + ( ( nアニメカウンタ現在の値 % 5 ) * chipHeight ), openChipWidth, chipHeight ) );\r
2320                                                         }\r
2321                                                         Rectangle rc = new Rectangle( rectOpenOffsetX, nアニメカウンタ現在の値 * chipHeight, chipWidth, chipHeight );\r
2322                                                         int x;\r
2323                                                         if ( inst == E楽器パート.GUITAR )\r
2324                                                         {\r
2325                                                                 x = ( configIni.bLeft.Guitar ) ? guitarLeftyX : guitarNormalX;\r
2326                                                         }\r
2327                                                         else\r
2328                                                         {\r
2329                                                                 x = ( configIni.bLeft.Bass ) ? bassLeftyX : bassNormalX;\r
2330                                                         }\r
2331                                                         int deltaX = ( configIni.bLeft[ instIndex ] ) ? -drawDeltaX : +drawDeltaX;\r
2332 \r
2333 //Trace.TraceInformation( "chip={0:x2}, E楽器パート={1}, x={2}", pChip.nチャンネル番号, inst, x );\r
2334                                                         if ( bChipHasR )\r
2335                                                         {\r
2336                                                                 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - chipHeight / 2, rc );\r
2337                                                         }\r
2338                                                         rc.X += chipTexDeltaX;\r
2339                                                         x += deltaX;\r
2340                                                         if ( bChipHasG )\r
2341                                                         {\r
2342                                                                 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - chipHeight / 2, rc );\r
2343                                                         }\r
2344                                                         rc.X += chipTexDeltaX;\r
2345                                                         x += deltaX;\r
2346                                                         if ( bChipHasB )\r
2347                                                         {\r
2348                                                                 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - chipHeight / 2, rc );\r
2349                                                         }\r
2350                                                 }\r
2351                                         }\r
2352                                 }\r
2353                                 #endregion\r
2354                                 //if ( ( configIni.bAutoPlay.Guitar && !pChip.bHit ) && ( pChip.nバーからの距離dot.Guitar < 0 ) )\r
2355                                 if ( ( !pChip.bHit ) && ( pChip.nバーからの距離dot[ instIndex ] < 0 ) )\r
2356                                 {\r
2357                                         int lo = ( inst == E楽器パート.GUITAR ) ? 0 : 3;   // lane offset\r
2358                                         bool autoR = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtR : bIsAutoPlay.BsR;\r
2359                                         bool autoG = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtG : bIsAutoPlay.BsG;\r
2360                                         bool autoB = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtB : bIsAutoPlay.BsB;\r
2361                                         bool autoPick = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtPick : bIsAutoPlay.BsPick;\r
2362                                         bool pushingR = CDTXMania.Pad.b押されている( inst, Eパッド.R );\r
2363                                         bool pushingG = CDTXMania.Pad.b押されている( inst, Eパッド.G );\r
2364                                         bool pushingB = CDTXMania.Pad.b押されている( inst, Eパッド.B );\r
2365 \r
2366                                         #region [ Chip Fire effects ]\r
2367                                         bool bSuccessOPEN = bChipIsO && ( autoR || !pushingR ) && ( autoG || !pushingG ) && ( autoB || !pushingB );\r
2368                                         if ( ( bChipHasR && ( autoR || pushingR ) && autoPick ) || bSuccessOPEN )\r
2369                                         {\r
2370                                                 this.actChipFireGB.Start( 0 + lo, nJudgeLinePosY_delta );\r
2371                                         }\r
2372                                         if ( ( bChipHasG && ( autoG || pushingG ) && autoPick ) || bSuccessOPEN )\r
2373                                         {\r
2374                                                 this.actChipFireGB.Start( 1 + lo, nJudgeLinePosY_delta );\r
2375                                         }\r
2376                                         if ( ( bChipHasB && ( autoB || pushingB ) && autoPick ) || bSuccessOPEN )\r
2377                                         {\r
2378                                                 this.actChipFireGB.Start( 2 + lo, nJudgeLinePosY_delta );\r
2379                                         }\r
2380                                         #endregion\r
2381                                         if ( autoPick )\r
2382                                         {\r
2383                                                 bool bMiss = true;\r
2384                                                 if ( bChipHasR == autoR && bChipHasG == autoG && bChipHasB == autoB )           // autoレーンとチップレーン一致時はOK\r
2385                                                 {                                                                                                                                                       // この条件を加えないと、同時に非autoレーンを押下している時にNGとなってしまう。\r
2386                                                         bMiss = false;\r
2387                                                 }\r
2388                                                 else if ( ( autoR || ( bChipHasR == pushingR ) ) && ( autoG || ( bChipHasG == pushingG ) ) && ( autoB || ( bChipHasB == pushingB ) ) )\r
2389                                                         // ( bChipHasR == ( pushingR | autoR ) ) && ( bChipHasG == ( pushingG | autoG ) ) && ( bChipHasB == ( pushingB | autoB ) ) )\r
2390                                                 {\r
2391                                                         bMiss = false;\r
2392                                                 }\r
2393                                                 else if ( ( ( bChipIsO == true ) && ( !pushingR | autoR ) && ( !pushingG | autoG ) && ( !pushingB | autoB ) ) ) // OPEN時\r
2394                                                 {\r
2395                                                         bMiss = false;\r
2396                                                 }\r
2397                                                 pChip.bHit = true;\r
2398                                                 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, inst, dTX.nモニタを考慮した音量( inst ), false, bMiss );\r
2399                                                 this.r次にくるギターChip = null;\r
2400                                                 if ( !bMiss )\r
2401                                                 {\r
2402                                                         this.tチップのヒット処理( pChip.n発声時刻ms, pChip );\r
2403                                                 }\r
2404                                                 else\r
2405                                                 {\r
2406                                                         pChip.nLag = 0;         // tチップのヒット処理()の引数最後がfalseの時はpChip.nLagを計算しないため、ここでAutoPickかつMissのLag=0を代入\r
2407                                                         this.tチップのヒット処理( pChip.n発声時刻ms, pChip, false );\r
2408                                                 }\r
2409                                                 int chWailingChip = ( inst == E楽器パート.GUITAR ) ? 0x28 : 0xA8;\r
2410                                                 CDTX.CChip item = this.r指定時刻に一番近い未ヒットChip( pChip.n発声時刻ms, chWailingChip, this.nInputAdjustTimeMs[ instIndex ], 140 );\r
2411                                                 if ( item != null && !bMiss )\r
2412                                                 {\r
2413                                                         this.queWailing[ instIndex ].Enqueue( item );\r
2414                                                 }\r
2415                                         }\r
2416                                 }\r
2417                                 return;\r
2418                         }       // end of "if configIni.bGuitar有効"\r
2419                         if ( !pChip.bHit && ( pChip.nバーからの距離dot[ instIndex ] < 0 ) )      // Guitar/Bass無効の場合は、自動演奏する\r
2420                         {\r
2421                                 pChip.bHit = true;\r
2422                                 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, inst, dTX.nモニタを考慮した音量( inst ) );\r
2423                         }\r
2424                 }\r
2425 \r
2426                 \r
2427                 protected virtual void t進行描画・チップ・ギターベース・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst )\r
2428                 {\r
2429                         int indexInst = (int) inst;\r
2430                         if ( configIni.bGuitar有効 )\r
2431                         {\r
2432                                 #region [ Sudden/Hidden処理 ]\r
2433                                 if ( configIni.bSudden[indexInst] )\r
2434                                 {\r
2435                                         pChip.b可視 = pChip.nバーからの距離dot[indexInst] < 200;\r
2436                                 }\r
2437                                 if ( configIni.bHidden[indexInst] && ( pChip.nバーからの距離dot[indexInst] < 100 ) )\r
2438                                 {\r
2439                                         pChip.b可視 = false;\r
2440                                 }\r
2441                                 #endregion\r
2442                                 //\r
2443                                 // ここにチップ更新処理が入る(overrideで入れる)。といっても座標とチップサイズが違うだけで処理はまるまる同じ。\r
2444                                 //\r
2445                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot[indexInst] < 0 ) )\r
2446                                 {\r
2447                                         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
2448                                         {\r
2449                                                 pChip.bHit = true;\r
2450                                         }\r
2451                                         bool autoW = ( inst == E楽器パート.GUITAR ) ? configIni.bAutoPlay.GtW : configIni.bAutoPlay.BsW;\r
2452                                         //if ( configIni.bAutoPlay[ ((int) Eレーン.Guitar - 1) + indexInst ] )       // このような、バグの入りやすい書き方(GT/BSのindex値が他と異なる)はいずれ見直したい\r
2453                                         if ( autoW )\r
2454                                         {\r
2455                                         //    pChip.bHit = true;                                                                // #25253 2011.5.29 yyagi: Set pChip.bHit=true if autoplay.\r
2456                                         //    this.actWailingBonus.Start( inst, this.r現在の歓声Chip[indexInst] );\r
2457                                         // #23886 2012.5.22 yyagi; To support auto Wailing; Don't do wailing for ALL wailing chips. Do wailing for queued wailing chip.\r
2458                                         // wailing chips are queued when 1) manually wailing and not missed at that time 2) AutoWailing=ON and not missed at that time\r
2459                                                 long nTimeStamp_Wailed = pChip.n発声時刻ms + CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;\r
2460                                                 DoWailingFromQueue( inst, nTimeStamp_Wailed, autoW );\r
2461                                         }\r
2462                                 }\r
2463                                 return;\r
2464                         }\r
2465                         pChip.bHit = true;\r
2466                 }\r
2467                 protected virtual void t進行描画・チップ・ギター・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )\r
2468                 {\r
2469                         t進行描画・チップ・ギターベース・ウェイリング( configIni, ref dTX, ref pChip, E楽器パート.GUITAR );\r
2470                 }\r
2471                 protected abstract void t進行描画・チップ・フィルイン( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2472                 protected abstract void t進行描画・チップ・小節線( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2473                 //protected abstract void t進行描画・チップ・ベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2474                 protected virtual void t進行描画・チップ・ベース・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )\r
2475                 {\r
2476                         t進行描画・チップ・ギターベース・ウェイリング( configIni, ref dTX, ref pChip, E楽器パート.BASS );\r
2477                 }\r
2478                 protected abstract void t進行描画・チップ・空打ち音設定・ドラム( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2479                 protected void t進行描画・チップアニメ()\r
2480                 {\r
2481                         for ( int i = 0; i < 3; i++ )                   // 0=drums, 1=guitar, 2=bass\r
2482                         {\r
2483                                 if ( this.ctチップ模様アニメ[ i ] != null )\r
2484                                 {\r
2485                                         this.ctチップ模様アニメ[ i ].t進行Loop();\r
2486                                 }\r
2487                         }\r
2488                         if ( this.ctWailingチップ模様アニメ != null )\r
2489                         {\r
2490                                 this.ctWailingチップ模様アニメ.t進行Loop();\r
2491                         }\r
2492                 }\r
2493 \r
2494                 protected bool t進行描画・フェードイン・アウト()\r
2495                 {\r
2496                         switch ( base.eフェーズID )\r
2497                         {\r
2498                                 case CStage.Eフェーズ.共通_フェードイン:\r
2499                                         if ( this.actFI.On進行描画() != 0 )\r
2500                                         {\r
2501                                                 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
2502                                         }\r
2503                                         break;\r
2504 \r
2505                                 case CStage.Eフェーズ.共通_フェードアウト:\r
2506                                 case CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト:\r
2507                                         if ( this.actFO.On進行描画() != 0 )\r
2508                                         {\r
2509                                                 return true;\r
2510                                         }\r
2511                                         break;\r
2512 \r
2513                                 case CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト:\r
2514                                         if ( this.actFOClear.On進行描画() == 0 )\r
2515                                         {\r
2516                                                 break;\r
2517                                         }\r
2518                                         return true;\r
2519                 \r
2520                         }\r
2521                         return false;\r
2522                 }\r
2523                 protected void t進行描画・レーンフラッシュD()\r
2524                 {\r
2525                         if ( ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
2526                         {\r
2527                                 this.actLaneFlushD.On進行描画();\r
2528                         }\r
2529                 }\r
2530                 protected void t進行描画・レーンフラッシュGB()\r
2531                 {\r
2532                         if ( ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF ) && CDTXMania.ConfigIni.bGuitar有効 )\r
2533                         {\r
2534                                 this.actLaneFlushGB.On進行描画();\r
2535                         }\r
2536                 }\r
2537                 protected abstract void t進行描画・演奏情報();\r
2538                 protected void t進行描画・演奏情報(int x, int y)\r
2539                 {\r
2540                         if ( !CDTXMania.ConfigIni.b演奏情報を表示しない )\r
2541                         {\r
2542                                 this.actPlayInfo.t進行描画( x, y );\r
2543                         }\r
2544                 }\r
2545                 protected void t進行描画・背景()\r
2546                 {\r
2547                         if ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF )\r
2548                         {\r
2549                                 if ( this.tx背景 != null )\r
2550                                 {\r
2551                                         this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );\r
2552                                 }\r
2553                         }\r
2554                         else\r
2555                         {\r
2556                                 CDTXMania.app.Device.Clear( ClearFlags.ZBuffer | ClearFlags.Target, Color.Black, 0f, 0 );\r
2557                         }\r
2558                 }\r
2559 \r
2560                 protected void t進行描画・判定ライン()\r
2561                 {\r
2562                         if ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )\r
2563                         {\r
2564                                 int y = CDTXMania.ConfigIni.bReverse.Drums ? 53 - nJudgeLinePosY_delta.Drums : 419 + nJudgeLinePosY_delta.Drums;\r
2565                                                                                                                                 // #31602 2013.6.23 yyagi 描画遅延対策として、判定ラインの表示位置をオフセット調整できるようにする\r
2566                                 if ( this.txヒットバー != null )\r
2567                                 {\r
2568                                         for ( int i = 32; i < 335; i += 8 )\r
2569                                         {\r
2570                                                 this.txヒットバー.t2D描画( CDTXMania.app.Device, i, y, new Rectangle( 0, 0, ( ( i + 8 ) >= 335 ) ? ( 7 - ( ( i + 8 ) - 335 ) ) : 8, 8 ) );\r
2571                                         }\r
2572                                 }\r
2573                         }\r
2574                 }\r
2575                 protected void t進行描画・判定文字列()\r
2576                 {\r
2577                         this.actJudgeString.On進行描画();\r
2578                 }\r
2579                 protected void t進行描画・判定文字列1・通常位置指定の場合()\r
2580                 {\r
2581                         if ( ( (E判定文字表示位置) CDTXMania.ConfigIni.判定文字表示位置.Drums ) != E判定文字表示位置.判定ライン上または横 )\r
2582                         {\r
2583                                 this.actJudgeString.On進行描画();\r
2584                         }\r
2585                 }\r
2586                 protected void t進行描画・判定文字列2・判定ライン上指定の場合()\r
2587                 {\r
2588                         if ( ( (E判定文字表示位置) CDTXMania.ConfigIni.判定文字表示位置.Drums ) == E判定文字表示位置.判定ライン上または横 )\r
2589                         {\r
2590                                 this.actJudgeString.On進行描画();\r
2591                         }\r
2592                 }\r
2593 \r
2594                 protected void t進行描画・譜面スクロール速度()\r
2595                 {\r
2596                         this.act譜面スクロール速度.On進行描画();\r
2597                 }\r
2598 \r
2599                 protected abstract void t背景テクスチャの生成();\r
2600                 protected void t背景テクスチャの生成( string DefaultBgFilename, Rectangle bgrect, string bgfilename )\r
2601                 {\r
2602                         Bitmap image = null;\r
2603                         bool flag = true;\r
2604 \r
2605                         if ( bgfilename != null && File.Exists( bgfilename ) )\r
2606                         {\r
2607                                 try\r
2608                                 {\r
2609                                         Bitmap bitmap2 = null;\r
2610                                         bitmap2 = new Bitmap( bgfilename );\r
2611                                         if ( ( bitmap2.Size.Width == 0 ) && ( bitmap2.Size.Height == 0 ) )\r
2612                                         {\r
2613                                                 this.tx背景 = null;\r
2614                                                 return;\r
2615                                         }\r
2616                                         Bitmap bitmap3 = new Bitmap(SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height);\r
2617                                         Graphics graphics = Graphics.FromImage( bitmap3 );\r
2618                                         for ( int i = 0; i < SampleFramework.GameWindowSize.Height; i += bitmap2.Size.Height )\r
2619                                         {\r
2620                                                 for ( int j = 0; j < SampleFramework.GameWindowSize.Width; j += bitmap2.Size.Width )\r
2621                                                 {\r
2622                                                         graphics.DrawImage( bitmap2, j, i, bitmap2.Width, bitmap2.Height );\r
2623                                                 }\r
2624                                         }\r
2625                                         graphics.Dispose();\r
2626                                         bitmap2.Dispose();\r
2627                                         image = new Bitmap( CSkin.Path( DefaultBgFilename ) );\r
2628                                         graphics = Graphics.FromImage( image );\r
2629                                         ColorMatrix matrix2 = new ColorMatrix();\r
2630                                         matrix2.Matrix00 = 1f;\r
2631                                         matrix2.Matrix11 = 1f;\r
2632                                         matrix2.Matrix22 = 1f;\r
2633                                         matrix2.Matrix33 = ( (float) CDTXMania.ConfigIni.n背景の透過度 ) / 255f;\r
2634                                         matrix2.Matrix44 = 1f;\r
2635                                         ColorMatrix newColorMatrix = matrix2;\r
2636                                         ImageAttributes imageAttr = new ImageAttributes();\r
2637                                         imageAttr.SetColorMatrix( newColorMatrix );\r
2638                                         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
2639                                         imageAttr.Dispose();\r
2640                                         graphics.DrawImage( bitmap3, bgrect, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height, GraphicsUnit.Pixel );\r
2641                                         graphics.Dispose();\r
2642                                         bitmap3.Dispose();\r
2643                                         flag = false;\r
2644                                 }\r
2645                                 catch\r
2646                                 {\r
2647                                         Trace.TraceError( "背景画像の読み込みに失敗しました。({0})", new object[] { bgfilename } );\r
2648                                 }\r
2649                         }\r
2650                         if ( flag )\r
2651                         {\r
2652                                 bgfilename = CSkin.Path( DefaultBgFilename );\r
2653                                 try\r
2654                                 {\r
2655                                         image = new Bitmap( bgfilename );\r
2656                                 }\r
2657                                 catch\r
2658                                 {\r
2659                                         Trace.TraceError( "背景画像の読み込みに失敗しました。({0})", new object[] { bgfilename } );\r
2660                                         this.tx背景 = null;\r
2661                                         return;\r
2662                                 }\r
2663                         }\r
2664                         if ( ( CDTXMania.DTX.listBMP.Count > 0 ) || ( CDTXMania.DTX.listBMPTEX.Count > 0 ) )\r
2665                         {\r
2666                                 Graphics graphics2 = Graphics.FromImage( image );\r
2667                                 graphics2.FillRectangle( Brushes.Black, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height );\r
2668                                 graphics2.Dispose();\r
2669                         }\r
2670                         try\r
2671                         {\r
2672                                 this.tx背景 = new CTexture( CDTXMania.app.Device, image, CDTXMania.TextureFormat );\r
2673                         }\r
2674                         catch ( CTextureCreateFailedException )\r
2675                         {\r
2676                                 Trace.TraceError( "背景テクスチャの生成に失敗しました。" );\r
2677                                 this.tx背景 = null;\r
2678                         }\r
2679                         image.Dispose();\r
2680                 }\r
2681 \r
2682                 protected virtual void t入力処理・ギター()\r
2683                 {\r
2684                         t入力処理・ギターベース( E楽器パート.GUITAR );\r
2685                 }\r
2686                 protected virtual void t入力処理・ベース()\r
2687                 {\r
2688                         t入力処理・ギターベース( E楽器パート.BASS );\r
2689                 }\r
2690 \r
2691 \r
2692                 protected virtual void t入力処理・ギターベース(E楽器パート inst)\r
2693                 {\r
2694                         int indexInst = (int) inst;\r
2695                         #region [ スクロール速度変更 ]\r
2696                         if ( CDTXMania.Pad.b押されている( inst, Eパッド.Decide ) && CDTXMania.Pad.b押された( inst, Eパッド.B ) )\r
2697                         {\r
2698                                 CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] = Math.Min( CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] + 1, 0x7cf );\r
2699                         }\r
2700                         if ( CDTXMania.Pad.b押されている( inst, Eパッド.Decide ) && CDTXMania.Pad.b押された( inst, Eパッド.R ) )\r
2701                         {\r
2702                                 CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] = Math.Max( CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] - 1, 0 );\r
2703                         }\r
2704                         #endregion\r
2705 \r
2706                         if ( !CDTXMania.ConfigIni.bGuitar有効 || !CDTXMania.DTX.bチップがある[indexInst] )\r
2707                         {\r
2708                                 return;\r
2709                         }\r
2710 \r
2711                         int R = ( inst == E楽器パート.GUITAR ) ? 0 : 3;\r
2712                         int G = R + 1;\r
2713                         int B = R + 2;\r
2714                         bool autoW =    ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtW : bIsAutoPlay.BsW;\r
2715                         bool autoR =    ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtR : bIsAutoPlay.BsR;\r
2716                         bool autoG =    ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtG : bIsAutoPlay.BsG;\r
2717                         bool autoB =    ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtB : bIsAutoPlay.BsB;\r
2718                         bool autoPick = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtPick : bIsAutoPlay.BsPick;\r
2719                         int nAutoW = ( autoW ) ? 8 : 0;\r
2720                         int nAutoR = ( autoR ) ? 4 : 0;\r
2721                         int nAutoG = ( autoG ) ? 2 : 0;\r
2722                         int nAutoB = ( autoB ) ? 1 : 0;\r
2723                         int nAutoMask = nAutoW | nAutoR | nAutoG | nAutoB;\r
2724 \r
2725 //                      if ( bIsAutoPlay[ (int) Eレーン.Guitar - 1 + indexInst ] )   // このような、バグの入りやすい書き方(GT/BSのindex値が他と異なる)はいずれ見直したい\r
2726 //                      {\r
2727                         CDTX.CChip chip = this.r次に来る指定楽器Chipを更新して返す(inst);\r
2728                         if ( chip != null )     \r
2729                         {\r
2730                                 if ( ( chip.nチャンネル番号 & 4 ) != 0 && autoR )\r
2731                                 {\r
2732                                         this.actLaneFlushGB.Start( R );\r
2733                                         this.actRGB.Push( R );\r
2734                                 }\r
2735                                 if ( ( chip.nチャンネル番号 & 2 ) != 0 && autoG )\r
2736                                 {\r
2737                                         this.actLaneFlushGB.Start( G );\r
2738                                         this.actRGB.Push( G );\r
2739                                 }\r
2740                                 if ( ( chip.nチャンネル番号 & 1 ) != 0 && autoB )\r
2741                                 {\r
2742                                         this.actLaneFlushGB.Start( B );\r
2743                                         this.actRGB.Push( B );\r
2744                                 }\r
2745 //                      }\r
2746 \r
2747                         }\r
2748 //                      else\r
2749                         {\r
2750                                 int pushingR = CDTXMania.Pad.b押されている( inst, Eパッド.R ) ? 4 : 0;\r
2751                                 this.t入力メソッド記憶( inst );\r
2752                                 int pushingG = CDTXMania.Pad.b押されている( inst, Eパッド.G ) ? 2 : 0;\r
2753                                 this.t入力メソッド記憶( inst );\r
2754                                 int pushingB = CDTXMania.Pad.b押されている( inst, Eパッド.B ) ? 1 : 0;\r
2755                                 this.t入力メソッド記憶( inst );\r
2756                                 int flagRGB = pushingR | pushingG | pushingB;\r
2757                                 if ( pushingR != 0 )\r
2758                                 {\r
2759                                         this.actLaneFlushGB.Start( R );\r
2760                                         this.actRGB.Push( R );\r
2761                                 }\r
2762                                 if ( pushingG != 0 )\r
2763                                 {\r
2764                                         this.actLaneFlushGB.Start( G );\r
2765                                         this.actRGB.Push( G );\r
2766                                 }\r
2767                                 if ( pushingB != 0 )\r
2768                                 {\r
2769                                         this.actLaneFlushGB.Start( B );\r
2770                                         this.actRGB.Push( B );\r
2771                                 }\r
2772                                 // auto pickだとここから先に行かないので注意\r
2773                                 List<STInputEvent> events = CDTXMania.Pad.GetEvents( inst, Eパッド.Pick );\r
2774                                 if ( ( events != null ) && ( events.Count > 0 ) )\r
2775                                 {\r
2776                                         foreach ( STInputEvent eventPick in events )\r
2777                                         {\r
2778                                                 if ( !eventPick.b押された )\r
2779                                                 {\r
2780                                                         continue;\r
2781                                                 }\r
2782                                                 this.t入力メソッド記憶( inst );\r
2783                                                 long nTime = eventPick.nTimeStamp - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;\r
2784                                                 int chWailingSound = ( inst == E楽器パート.GUITAR ) ? 0x2F : 0xAF;\r
2785                                                 CDTX.CChip pChip = this.r指定時刻に一番近い未ヒットChip( nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst] );      // E楽器パート.GUITARなチップ全てにヒットする\r
2786                                                 E判定 e判定 = this.e指定時刻からChipのJUDGEを返す( nTime, pChip, this.nInputAdjustTimeMs[indexInst] );\r
2787 //Trace.TraceInformation("ch={0:x2}, mask1={1:x1}, mask2={2:x2}", pChip.nチャンネル番号,  ( pChip.nチャンネル番号 & ~nAutoMask ) & 0x0F, ( flagRGB & ~nAutoMask) & 0x0F );\r
2788                                                 if ( ( pChip != null ) && ( ( ( pChip.nチャンネル番号 & ~nAutoMask ) & 0x0F ) == ( ( flagRGB & ~nAutoMask) & 0x0F ) ) && ( e判定 != E判定.Miss ) )\r
2789                                                 {\r
2790                                                         bool bChipHasR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );\r
2791                                                         bool bChipHasG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );\r
2792                                                         bool bChipHasB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );\r
2793                                                         bool bChipHasW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );\r
2794                                                         bool bChipIsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );\r
2795                                                         bool bSuccessOPEN = bChipIsO && ( autoR || pushingR == 0 ) && ( autoG || pushingG == 0 ) && ( autoB || pushingB == 0 );\r
2796                                                         if ( ( bChipHasR && ( autoR || pushingR != 0 ) ) || bSuccessOPEN )\r
2797                                                         //if ( ( pushingR != 0 ) || autoR || ( flagRGB == 0 ) )\r
2798                                                         {\r
2799                                                                 this.actChipFireGB.Start( R, nJudgeLinePosY_delta );\r
2800                                                         }\r
2801                                                         if ( ( bChipHasG && ( autoG || pushingG != 0 ) ) || bSuccessOPEN )\r
2802                                                         //if ( ( pushingG != 0 ) || autoG || ( flagRGB == 0 ) )\r
2803                                                         {\r
2804                                                                 this.actChipFireGB.Start( G, nJudgeLinePosY_delta );\r
2805                                                         }\r
2806                                                         if ( ( bChipHasB && ( autoB || pushingB != 0 ) ) || bSuccessOPEN )\r
2807                                                         //if ( ( pushingB != 0 ) || autoB || ( flagRGB == 0 ) )\r
2808                                                         {\r
2809                                                                 this.actChipFireGB.Start( B, nJudgeLinePosY_delta );\r
2810                                                         }\r
2811                                                         this.tチップのヒット処理( nTime, pChip );\r
2812                                                         this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する[indexInst], e判定 == E判定.Poor );\r
2813                                                         int chWailingChip = ( inst == E楽器パート.GUITAR ) ? 0x28 : 0xA8;\r
2814                                                         CDTX.CChip item = this.r指定時刻に一番近い未ヒットChip( nTime, chWailingChip, this.nInputAdjustTimeMs[ indexInst ], 140 );\r
2815                                                         if ( item != null )\r
2816                                                         {\r
2817                                                                 this.queWailing[indexInst].Enqueue( item );\r
2818                                                         }\r
2819                                                         continue;\r
2820                                                 }\r
2821 \r
2822                                                 // 以下、間違いレーンでのピック時\r
2823                                                 CDTX.CChip NoChipPicked = ( inst == E楽器パート.GUITAR ) ? this.r現在の空うちギターChip : this.r現在の空うちベースChip;\r
2824                                                 if ( ( NoChipPicked != null ) || ( ( NoChipPicked = this.r指定時刻に一番近いChip・ヒット未済問わず不可視考慮( nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst] ) ) != null ) )\r
2825                                                 {\r
2826                                                         this.tサウンド再生( NoChipPicked, CSound管理.rc演奏用タイマ.nシステム時刻, inst, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する[indexInst], true );\r
2827                                                 }\r
2828                                                 if ( !CDTXMania.ConfigIni.bLight[indexInst] )\r
2829                                                 {\r
2830                                                         this.tチップのヒット処理・BadならびにTight時のMiss( inst );\r
2831                                                 }\r
2832                                         }\r
2833                                 }\r
2834                                 List<STInputEvent> list = CDTXMania.Pad.GetEvents(inst, Eパッド.Wail );\r
2835                                 if ( ( list != null ) && ( list.Count > 0 ) )\r
2836                                 {\r
2837                                         foreach ( STInputEvent eventWailed in list )\r
2838                                         {\r
2839                                                 if ( !eventWailed.b押された )\r
2840                                                 {\r
2841                                                         continue;\r
2842                                                 }\r
2843                                                 DoWailingFromQueue( inst, eventWailed.nTimeStamp,  autoW );\r
2844                                         }\r
2845                                 }\r
2846                         }\r
2847                 }\r
2848 \r
2849                 private void DoWailingFromQueue( E楽器パート inst, long nTimeStamp_Wailed,  bool autoW )\r
2850                 {\r
2851                         int indexInst = (int) inst;\r
2852                         long nTimeWailed = nTimeStamp_Wailed - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;\r
2853                         CDTX.CChip chipWailing;\r
2854                         while ( ( this.queWailing[ indexInst ].Count > 0 ) && ( ( chipWailing = this.queWailing[ indexInst ].Dequeue() ) != null ) )\r
2855                         {\r
2856                                 if ( ( nTimeWailed - chipWailing.n発声時刻ms ) <= 1000 )            // #24245 2011.1.26 yyagi: 800 -> 1000\r
2857                                 {\r
2858                                         chipWailing.bHit = true;\r
2859                                         this.actWailingBonus.Start( inst, this.r現在の歓声Chip[ indexInst ] );\r
2860                                         //if ( !bIsAutoPlay[indexInst] )\r
2861                                         if ( !autoW )\r
2862                                         {\r
2863                                                 int nCombo = ( this.actCombo.n現在のコンボ数[ indexInst ] < 500 ) ? this.actCombo.n現在のコンボ数[ indexInst ] : 500;\r
2864                                                 this.actScore.Add( inst, bIsAutoPlay, nCombo * 3000L );         // #24245 2011.1.26 yyagi changed DRUMS->BASS, add nCombo conditions\r
2865                                         }\r
2866                                 }\r
2867                         }\r
2868                 }\r
2869         #endregion\r
2870         }\r
2871 }\r