OSDN Git Service

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