OSDN Git Service

#26338 Dr/Gt/Bsの演奏排他チャンネルを実装。(片方の再生で、もう片方の再生を上書きする)
[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                 public void t演奏結果を格納する・ドラム( out CScoreIni.C演奏記録 Drums )\r
33                 {\r
34                         Drums = new CScoreIni.C演奏記録();\r
35 \r
36                         if ( CDTXMania.DTX.bチップがある.Drums && !CDTXMania.ConfigIni.bギタレボモード )\r
37                         {\r
38                                 Drums.nスコア = this.actScore.Get( E楽器パート.DRUMS );\r
39                                 Drums.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す( CDTXMania.DTX.LEVEL.Drums, CDTXMania.DTX.n可視チップ数.Drums, this.nヒット数・Auto含まない.Drums.Perfect, this.actCombo.n現在のコンボ数.Drums最高値 );\r
40                                 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 );\r
41                                 Drums.nPerfect数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Perfect : this.nヒット数・Auto含まない.Drums.Perfect;\r
42                                 Drums.nGreat数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Great : this.nヒット数・Auto含まない.Drums.Great;\r
43                                 Drums.nGood数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Good : this.nヒット数・Auto含まない.Drums.Good;\r
44                                 Drums.nPoor数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Poor : this.nヒット数・Auto含まない.Drums.Poor;\r
45                                 Drums.nMiss数 = CDTXMania.ConfigIni.bドラムが全部オートプレイである ? this.nヒット数・Auto含む.Drums.Miss : this.nヒット数・Auto含まない.Drums.Miss;\r
46                                 Drums.nPerfect数・Auto含まない = this.nヒット数・Auto含まない.Drums.Perfect;\r
47                                 Drums.nGreat数・Auto含まない = this.nヒット数・Auto含まない.Drums.Great;\r
48                                 Drums.nGood数・Auto含まない = this.nヒット数・Auto含まない.Drums.Good;\r
49                                 Drums.nPoor数・Auto含まない = this.nヒット数・Auto含まない.Drums.Poor;\r
50                                 Drums.nMiss数・Auto含まない = this.nヒット数・Auto含まない.Drums.Miss;\r
51                                 Drums.n最大コンボ数 = this.actCombo.n現在のコンボ数.Drums最高値;\r
52                                 Drums.n全チップ数 = CDTXMania.DTX.n可視チップ数.Drums;\r
53                                 for ( int i = 0; i < 10; i++ )\r
54                                 {\r
55                                         Drums.bAutoPlay[ i ] = bIsAutoPlay[ i ];\r
56                                 }\r
57                                 Drums.bTight = CDTXMania.ConfigIni.bTight;\r
58                                 for ( int i = 0; i < 3; i++ )\r
59                                 {\r
60                                         Drums.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];\r
61                                         Drums.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];\r
62                                         Drums.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];\r
63                                         Drums.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];\r
64                                         Drums.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];\r
65                                         Drums.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];\r
66                                         Drums.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;\r
67                                 }\r
68                                 Drums.eDark = CDTXMania.ConfigIni.eDark;\r
69                                 Drums.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;\r
70                                 Drums.n演奏速度分母 = 20;\r
71                                 Drums.eHHGroup = CDTXMania.ConfigIni.eHHGroup;\r
72                                 Drums.eFTGroup = CDTXMania.ConfigIni.eFTGroup;\r
73                                 Drums.eCYGroup = CDTXMania.ConfigIni.eCYGroup;\r
74                                 Drums.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;\r
75                                 Drums.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;\r
76                                 Drums.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;\r
77                                 Drums.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;\r
78                                 Drums.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;\r
79                                 Drums.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;\r
80                                 Drums.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;\r
81                                 Drums.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Drums;\r
82                                 Drums.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Drums;\r
83                                 Drums.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Drums;\r
84                                 Drums.b演奏にマウスを使用した = this.b演奏にマウスを使った.Drums;\r
85                                 Drums.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;\r
86                                 Drums.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;\r
87                                 Drums.nGoodになる範囲ms = CDTXMania.nGood範囲ms;\r
88                                 Drums.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;\r
89                                 Drums.strDTXManiaのバージョン = CDTXMania.VERSION;\r
90                                 Drums.最終更新日時 = DateTime.Now.ToString();\r
91                                 Drums.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Drums );\r
92                         }\r
93                 }\r
94                 public void t演奏結果を格納する・ギター( out CScoreIni.C演奏記録 Guitar )\r
95                 {\r
96                         Guitar = new CScoreIni.C演奏記録();\r
97 \r
98                         if ( CDTXMania.DTX.bチップがある.Guitar )\r
99                         {\r
100                                 Guitar.nスコア = this.actScore.Get( E楽器パート.GUITAR );\r
101                                 Guitar.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す( CDTXMania.DTX.LEVEL.Guitar, CDTXMania.DTX.n可視チップ数.Guitar, this.nヒット数・Auto含まない.Guitar.Perfect, this.actCombo.n現在のコンボ数.Guitar最高値 );\r
102                                 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 );\r
103                                 Guitar.nPerfect数 = bIsAutoPlay.Guitar ? this.nヒット数・Auto含む.Guitar.Perfect : this.nヒット数・Auto含まない.Guitar.Perfect;\r
104                                 Guitar.nGreat数 = bIsAutoPlay.Guitar ? this.nヒット数・Auto含む.Guitar.Great : this.nヒット数・Auto含まない.Guitar.Great;\r
105                                 Guitar.nGood数 = bIsAutoPlay.Guitar ? this.nヒット数・Auto含む.Guitar.Good : this.nヒット数・Auto含まない.Guitar.Good;\r
106                                 Guitar.nPoor数 = bIsAutoPlay.Guitar ? this.nヒット数・Auto含む.Guitar.Poor : this.nヒット数・Auto含まない.Guitar.Poor;\r
107                                 Guitar.nMiss数 = bIsAutoPlay.Guitar ? this.nヒット数・Auto含む.Guitar.Miss : this.nヒット数・Auto含まない.Guitar.Miss;\r
108                                 Guitar.nPerfect数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Perfect;\r
109                                 Guitar.nGreat数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Great;\r
110                                 Guitar.nGood数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Good;\r
111                                 Guitar.nPoor数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Poor;\r
112                                 Guitar.nMiss数・Auto含まない = this.nヒット数・Auto含まない.Guitar.Miss;\r
113                                 Guitar.n最大コンボ数 = this.actCombo.n現在のコンボ数.Guitar最高値;\r
114                                 Guitar.n全チップ数 = CDTXMania.DTX.n可視チップ数.Guitar;\r
115                                 for ( int i = 0; i < 10; i++ )\r
116                                 {\r
117                                         Guitar.bAutoPlay[ i ] = bIsAutoPlay[ i ];\r
118                                 }\r
119                                 Guitar.bTight = CDTXMania.ConfigIni.bTight;\r
120                                 for ( int i = 0; i < 3; i++ )\r
121                                 {\r
122                                         Guitar.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];\r
123                                         Guitar.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];\r
124                                         Guitar.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];\r
125                                         Guitar.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];\r
126                                         Guitar.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];\r
127                                         Guitar.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];\r
128                                         Guitar.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;\r
129                                 }\r
130                                 Guitar.eDark = CDTXMania.ConfigIni.eDark;\r
131                                 Guitar.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;\r
132                                 Guitar.n演奏速度分母 = 20;\r
133                                 Guitar.eHHGroup = CDTXMania.ConfigIni.eHHGroup;\r
134                                 Guitar.eFTGroup = CDTXMania.ConfigIni.eFTGroup;\r
135                                 Guitar.eCYGroup = CDTXMania.ConfigIni.eCYGroup;\r
136                                 Guitar.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;\r
137                                 Guitar.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;\r
138                                 Guitar.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;\r
139                                 Guitar.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;\r
140                                 Guitar.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;\r
141                                 Guitar.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;\r
142                                 Guitar.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;\r
143                                 Guitar.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Guitar;\r
144                                 Guitar.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Guitar;\r
145                                 Guitar.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Guitar;\r
146                                 Guitar.b演奏にマウスを使用した = this.b演奏にマウスを使った.Guitar;\r
147                                 Guitar.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;\r
148                                 Guitar.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;\r
149                                 Guitar.nGoodになる範囲ms = CDTXMania.nGood範囲ms;\r
150                                 Guitar.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;\r
151                                 Guitar.strDTXManiaのバージョン = CDTXMania.VERSION;\r
152                                 Guitar.最終更新日時 = DateTime.Now.ToString();\r
153                                 Guitar.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Guitar );\r
154                         }\r
155                 }\r
156                 public void t演奏結果を格納する・ベース( out CScoreIni.C演奏記録 Bass )\r
157                 {\r
158                         Bass = new CScoreIni.C演奏記録();\r
159 \r
160                         if ( CDTXMania.DTX.bチップがある.Bass )\r
161                         {\r
162                                 Bass.nスコア = this.actScore.Get( E楽器パート.BASS );\r
163                                 Bass.dbゲーム型スキル値 = CScoreIni.tゲーム型スキルを計算して返す( CDTXMania.DTX.LEVEL.Bass, CDTXMania.DTX.n可視チップ数.Bass, this.nヒット数・Auto含まない.Bass.Perfect, this.actCombo.n現在のコンボ数.Bass最高値 );\r
164                                 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 );\r
165                                 Bass.nPerfect数 = bIsAutoPlay.Bass ? this.nヒット数・Auto含む.Bass.Perfect : this.nヒット数・Auto含まない.Bass.Perfect;\r
166                                 Bass.nGreat数 = bIsAutoPlay.Bass ? this.nヒット数・Auto含む.Bass.Great : this.nヒット数・Auto含まない.Bass.Great;\r
167                                 Bass.nGood数 = bIsAutoPlay.Bass ? this.nヒット数・Auto含む.Bass.Good : this.nヒット数・Auto含まない.Bass.Good;\r
168                                 Bass.nPoor数 = bIsAutoPlay.Bass ? this.nヒット数・Auto含む.Bass.Poor : this.nヒット数・Auto含まない.Bass.Poor;\r
169                                 Bass.nMiss数 = bIsAutoPlay.Bass ? this.nヒット数・Auto含む.Bass.Miss : this.nヒット数・Auto含まない.Bass.Miss;\r
170                                 Bass.nPerfect数・Auto含まない = this.nヒット数・Auto含まない.Bass.Perfect;\r
171                                 Bass.nGreat数・Auto含まない = this.nヒット数・Auto含まない.Bass.Great;\r
172                                 Bass.nGood数・Auto含まない = this.nヒット数・Auto含まない.Bass.Good;\r
173                                 Bass.nPoor数・Auto含まない = this.nヒット数・Auto含まない.Bass.Poor;\r
174                                 Bass.nMiss数・Auto含まない = this.nヒット数・Auto含まない.Bass.Miss;\r
175                                 Bass.n最大コンボ数 = this.actCombo.n現在のコンボ数.Bass最高値;\r
176                                 Bass.n全チップ数 = CDTXMania.DTX.n可視チップ数.Bass;\r
177                                 for ( int i = 0; i < 10; i++ )\r
178                                 {\r
179                                         Bass.bAutoPlay[ i ] = bIsAutoPlay[ i ];\r
180                                 }\r
181                                 Bass.bTight = CDTXMania.ConfigIni.bTight;\r
182                                 for ( int i = 0; i < 3; i++ )\r
183                                 {\r
184                                         Bass.bSudden[ i ] = CDTXMania.ConfigIni.bSudden[ i ];\r
185                                         Bass.bHidden[ i ] = CDTXMania.ConfigIni.bHidden[ i ];\r
186                                         Bass.bReverse[ i ] = CDTXMania.ConfigIni.bReverse[ i ];\r
187                                         Bass.eRandom[ i ] = CDTXMania.ConfigIni.eRandom[ i ];\r
188                                         Bass.bLight[ i ] = CDTXMania.ConfigIni.bLight[ i ];\r
189                                         Bass.bLeft[ i ] = CDTXMania.ConfigIni.bLeft[ i ];\r
190                                         Bass.f譜面スクロール速度[ i ] = ( (float) ( CDTXMania.ConfigIni.n譜面スクロール速度[ i ] + 1 ) ) * 0.5f;\r
191                                 }\r
192                                 Bass.eDark = CDTXMania.ConfigIni.eDark;\r
193                                 Bass.n演奏速度分子 = CDTXMania.ConfigIni.n演奏速度;\r
194                                 Bass.n演奏速度分母 = 20;\r
195                                 Bass.eHHGroup = CDTXMania.ConfigIni.eHHGroup;\r
196                                 Bass.eFTGroup = CDTXMania.ConfigIni.eFTGroup;\r
197                                 Bass.eCYGroup = CDTXMania.ConfigIni.eCYGroup;\r
198                                 Bass.eHitSoundPriorityHH = CDTXMania.ConfigIni.eHitSoundPriorityHH;\r
199                                 Bass.eHitSoundPriorityFT = CDTXMania.ConfigIni.eHitSoundPriorityFT;\r
200                                 Bass.eHitSoundPriorityCY = CDTXMania.ConfigIni.eHitSoundPriorityCY;\r
201                                 Bass.bGuitar有効 = CDTXMania.ConfigIni.bGuitar有効;\r
202                                 Bass.bDrums有効 = CDTXMania.ConfigIni.bDrums有効;\r
203                                 Bass.bSTAGEFAILED有効 = CDTXMania.ConfigIni.bSTAGEFAILED有効;\r
204                                 Bass.eダメージレベル = CDTXMania.ConfigIni.eダメージレベル;\r
205                                 Bass.b演奏にキーボードを使用した = this.b演奏にキーボードを使った.Bass;                        // #24280 2011.1.29 yyagi\r
206                                 Bass.b演奏にMIDI入力を使用した = this.b演奏にMIDI入力を使った.Bass;                          //\r
207                                 Bass.b演奏にジョイパッドを使用した = this.b演奏にジョイパッドを使った.Bass;          //\r
208                                 Bass.b演奏にマウスを使用した = this.b演奏にマウスを使った.Bass;                                    //\r
209                                 Bass.nPerfectになる範囲ms = CDTXMania.nPerfect範囲ms;\r
210                                 Bass.nGreatになる範囲ms = CDTXMania.nGreat範囲ms;\r
211                                 Bass.nGoodになる範囲ms = CDTXMania.nGood範囲ms;\r
212                                 Bass.nPoorになる範囲ms = CDTXMania.nPoor範囲ms;\r
213                                 Bass.strDTXManiaのバージョン = CDTXMania.VERSION;\r
214                                 Bass.最終更新日時 = DateTime.Now.ToString();\r
215                                 Bass.Hash = CScoreIni.t演奏セクションのMD5を求めて返す( Bass );\r
216                         }\r
217                 }\r
218 \r
219                 // CStage 実装\r
220 \r
221                 public override void On活性化()\r
222                 {\r
223                         this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.継続;\r
224                         this.n現在のトップChip = ( CDTXMania.DTX.listChip.Count > 0 ) ? 0 : -1;\r
225                         this.L最後に再生したHHの実WAV番号 = new List<int>( 16 );\r
226                         this.n最後に再生したHHのチャンネル番号 = 0;\r
227                         this.n最後に再生した実WAV番号.Guitar = -1;\r
228                         this.n最後に再生した実WAV番号.Bass = -1;\r
229                         for ( int i = 0; i < 50; i++ )\r
230                         {\r
231                                 this.n最後に再生したBGMの実WAV番号[ i ] = -1;\r
232                         }\r
233                         this.r次にくるギターChip = null;\r
234                         this.r次にくるベースChip = null;\r
235                         for ( int j = 0; j < 10; j++ )\r
236                         {\r
237                                 this.r現在の空うちドラムChip[ j ] = null;\r
238                         }\r
239                         this.r現在の空うちギターChip = null;\r
240                         this.r現在の空うちベースChip = null;\r
241                         for ( int k = 0; k < 3; k++ )\r
242                         {\r
243                                 for ( int n = 0; n < 5; n++ )\r
244                                 {\r
245                                         this.nヒット数・Auto含まない[ k ] = new STHITCOUNTOFRANK();\r
246                                         this.nヒット数・Auto含む[ k ] = new STHITCOUNTOFRANK();\r
247                                 }\r
248                                 this.queWailing[ k ] = new Queue<CDTX.CChip>();\r
249                                 this.r現在の歓声Chip[ k ] = null;\r
250                         }\r
251                         for ( int i = 0; i < 3; i++ )\r
252                         {\r
253                                 this.b演奏にキーボードを使った[ i ] = false;\r
254                                 this.b演奏にジョイパッドを使った[ i ] = false;\r
255                                 this.b演奏にMIDI入力を使った[ i ] = false;\r
256                                 this.b演奏にマウスを使った[ i ] = false;\r
257                         }\r
258                         this.bAUTOでないチップが1つでもバーを通過した = false;\r
259                         base.On活性化();\r
260                         this.tステータスパネルの選択();\r
261                         this.tパネル文字列の設定();\r
262 \r
263                         this.nInputAdjustTimeMs.Drums = CDTXMania.ConfigIni.nInputAdjustTimeMs.Drums;           // #23580 2011.1.3 yyagi\r
264                         this.nInputAdjustTimeMs.Guitar = CDTXMania.ConfigIni.nInputAdjustTimeMs.Guitar;         //        2011.1.7 ikanick 修正\r
265                         this.nInputAdjustTimeMs.Bass = CDTXMania.ConfigIni.nInputAdjustTimeMs.Bass;                     //\r
266                         this.bIsAutoPlay = CDTXMania.ConfigIni.bAutoPlay;                                                                       // #24239 2011.1.23 yyagi\r
267 //                      this.nRisky = CDTXMania.ConfigIni.nRisky;                                                                                       // #23559 2011.7.28 yyagi\r
268                         actGauge.Init( CDTXMania.ConfigIni.nRisky );                                                                    // #23559 2011.7.28 yyagi\r
269 \r
270                         if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.24 yyagi Gt/Bsの譜面情報入れ替え\r
271                         {\r
272                                 CDTXMania.DTX.SwapGuitarBassInfos();\r
273                         }\r
274                         this.sw = new Stopwatch();\r
275 //                      this.gclatencymode = GCSettings.LatencyMode;\r
276 //                      GCSettings.LatencyMode = GCLatencyMode.LowLatency;      // GCのgen2はせいぜい1演奏辺り1,2回しか発生しないので、ここでわざわざGC gen2は抑止しない\r
277                 }\r
278                 public override void On非活性化()\r
279                 {\r
280                         this.L最後に再生したHHの実WAV番号.Clear();   // #23921 2011.1.4 yyagi\r
281                         this.L最後に再生したHHの実WAV番号 = null;    //\r
282                         for ( int i = 0; i < 3; i++ )\r
283                         {\r
284                                 this.queWailing[ i ] = null;\r
285                         }\r
286                         this.ctWailingチップ模様アニメ = null;\r
287                         this.ctチップ模様アニメ.Drums = null;\r
288                         this.ctチップ模様アニメ.Guitar = null;\r
289                         this.ctチップ模様アニメ.Bass = null;\r
290 //                      GCSettings.LatencyMode = this.gclatencymode;\r
291                         base.On非活性化();\r
292                 }\r
293                 public override void OnManagedリソースの作成()\r
294                 {\r
295                         if ( !base.b活性化してない )\r
296                         {\r
297                                 this.t背景テクスチャの生成();\r
298 \r
299                                 this.txWailing枠 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenPlay wailing cursor.png" ) );\r
300 \r
301                                 base.OnManagedリソースの作成();\r
302                         }\r
303                 }\r
304                 public override void OnManagedリソースの解放()\r
305                 {\r
306                         if ( !base.b活性化してない )\r
307                         {\r
308                                 CDTXMania.tテクスチャの解放( ref this.tx背景 );\r
309 \r
310                                 CDTXMania.tテクスチャの解放( ref this.txWailing枠 );\r
311                                 base.OnManagedリソースの解放();\r
312                         }\r
313                 }\r
314 \r
315                 // その他\r
316 \r
317                 #region [ protected ]\r
318                 //-----------------\r
319                 protected class STHITCOUNTOFRANK\r
320                 {\r
321                         // Fields\r
322                         public int Good;\r
323                         public int Great;\r
324                         public int Miss;\r
325                         public int Perfect;\r
326                         public int Poor;\r
327 \r
328                         // Properties\r
329                         public int this[ int index ]\r
330                         {\r
331                                 get\r
332                                 {\r
333                                         switch ( index )\r
334                                         {\r
335                                                 case 0:\r
336                                                         return this.Perfect;\r
337 \r
338                                                 case 1:\r
339                                                         return this.Great;\r
340 \r
341                                                 case 2:\r
342                                                         return this.Good;\r
343 \r
344                                                 case 3:\r
345                                                         return this.Poor;\r
346 \r
347                                                 case 4:\r
348                                                         return this.Miss;\r
349                                         }\r
350                                         throw new IndexOutOfRangeException();\r
351                                 }\r
352                                 set\r
353                                 {\r
354                                         switch ( index )\r
355                                         {\r
356                                                 case 0:\r
357                                                         this.Perfect = value;\r
358                                                         return;\r
359 \r
360                                                 case 1:\r
361                                                         this.Great = value;\r
362                                                         return;\r
363 \r
364                                                 case 2:\r
365                                                         this.Good = value;\r
366                                                         return;\r
367 \r
368                                                 case 3:\r
369                                                         this.Poor = value;\r
370                                                         return;\r
371 \r
372                                                 case 4:\r
373                                                         this.Miss = value;\r
374                                                         return;\r
375                                         }\r
376                                         throw new IndexOutOfRangeException();\r
377                                 }\r
378                         }\r
379                 }\r
380 \r
381                 [StructLayout( LayoutKind.Sequential )]\r
382                 protected struct STKARAUCHI\r
383                 {\r
384                         public CDTX.CChip HH;\r
385                         public CDTX.CChip SD;\r
386                         public CDTX.CChip BD;\r
387                         public CDTX.CChip HT;\r
388                         public CDTX.CChip LT;\r
389                         public CDTX.CChip FT;\r
390                         public CDTX.CChip CY;\r
391                         public CDTX.CChip HHO;\r
392                         public CDTX.CChip RD;\r
393                         public CDTX.CChip LC;\r
394                         public CDTX.CChip this[ int index ]\r
395                         {\r
396                                 get\r
397                                 {\r
398                                         switch ( index )\r
399                                         {\r
400                                                 case 0:\r
401                                                         return this.HH;\r
402 \r
403                                                 case 1:\r
404                                                         return this.SD;\r
405 \r
406                                                 case 2:\r
407                                                         return this.BD;\r
408 \r
409                                                 case 3:\r
410                                                         return this.HT;\r
411 \r
412                                                 case 4:\r
413                                                         return this.LT;\r
414 \r
415                                                 case 5:\r
416                                                         return this.FT;\r
417 \r
418                                                 case 6:\r
419                                                         return this.CY;\r
420 \r
421                                                 case 7:\r
422                                                         return this.HHO;\r
423 \r
424                                                 case 8:\r
425                                                         return this.RD;\r
426 \r
427                                                 case 9:\r
428                                                         return this.LC;\r
429                                         }\r
430                                         throw new IndexOutOfRangeException();\r
431                                 }\r
432                                 set\r
433                                 {\r
434                                         switch ( index )\r
435                                         {\r
436                                                 case 0:\r
437                                                         this.HH = value;\r
438                                                         return;\r
439 \r
440                                                 case 1:\r
441                                                         this.SD = value;\r
442                                                         return;\r
443 \r
444                                                 case 2:\r
445                                                         this.BD = value;\r
446                                                         return;\r
447 \r
448                                                 case 3:\r
449                                                         this.HT = value;\r
450                                                         return;\r
451 \r
452                                                 case 4:\r
453                                                         this.LT = value;\r
454                                                         return;\r
455 \r
456                                                 case 5:\r
457                                                         this.FT = value;\r
458                                                         return;\r
459 \r
460                                                 case 6:\r
461                                                         this.CY = value;\r
462                                                         return;\r
463 \r
464                                                 case 7:\r
465                                                         this.HHO = value;\r
466                                                         return;\r
467 \r
468                                                 case 8:\r
469                                                         this.RD = value;\r
470                                                         return;\r
471 \r
472                                                 case 9:\r
473                                                         this.LC = value;\r
474                                                         return;\r
475                                         }\r
476                                         throw new IndexOutOfRangeException();\r
477                                 }\r
478                         }\r
479                 }\r
480 \r
481                 protected CAct演奏AVI actAVI;\r
482                 protected CAct演奏BGA actBGA;\r
483 \r
484                 protected CAct演奏チップファイアGB actChipFireGB;\r
485                 protected CAct演奏Combo共通 actCombo;\r
486                 protected CAct演奏Danger共通 actDANGER;\r
487                 protected CActFIFOBlack actFI;\r
488                 protected CActFIFOBlack actFO;\r
489                 protected CActFIFOWhite actFOClear;\r
490                 protected CAct演奏ゲージ共通 actGauge;\r
491 \r
492                 protected CAct演奏判定文字列共通 actJudgeString;\r
493                 protected CAct演奏DrumsレーンフラッシュD actLaneFlushD;\r
494                 protected CAct演奏レーンフラッシュGB共通 actLaneFlushGB;\r
495                 protected CAct演奏パネル文字列 actPanel;\r
496                 protected CAct演奏演奏情報 actPlayInfo;\r
497                 protected CAct演奏RGB共通 actRGB;\r
498                 protected CAct演奏スコア共通 actScore;\r
499                 protected CAct演奏ステージ失敗 actStageFailed;\r
500                 protected CAct演奏ステータスパネル共通 actStatusPanels;\r
501                 protected CAct演奏WailingBonus共通 actWailingBonus;\r
502                 protected CAct演奏スクロール速度 act譜面スクロール速度;\r
503                 protected bool bPAUSE;\r
504                 protected STDGBVALUE<bool> b演奏にMIDI入力を使った;\r
505                 protected STDGBVALUE<bool> b演奏にキーボードを使った;\r
506                 protected STDGBVALUE<bool> b演奏にジョイパッドを使った;\r
507                 protected STDGBVALUE<bool> b演奏にマウスを使った;\r
508                 protected CCounter ctWailingチップ模様アニメ;\r
509                 protected STDGBVALUE<CCounter> ctチップ模様アニメ;\r
510 \r
511                 protected E演奏画面の戻り値 eフェードアウト完了時の戻り値;\r
512                 protected readonly int[,] nBGAスコープチャンネルマップ = new int[ , ] { { 0xc4, 0xc7, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xe0 }, { 4, 7, 0x55, 0x56, 0x57, 0x58, 0x59, 0x60 } };\r
513                 protected readonly int[] nチャンネル0Atoパッド08 = new int[] { 1, 2, 3, 4, 5, 7, 6, 1, 8, 0 };\r
514                 protected readonly int[] nチャンネル0Atoレーン07 = new int[] { 1, 2, 3, 4, 5, 7, 6, 1, 7, 0 };\r
515                 protected readonly int[] nパッド0Atoチャンネル0A = new int[] { 0x11, 0x12, 0x13, 20, 0x15, 0x17, 0x16, 0x18, 0x19, 0x1a };\r
516                 protected readonly int[] nパッド0Atoパッド08 = new int[] { 1, 2, 3, 4, 5, 6, 7, 1, 8, 0 };        // パッド画像のヒット処理用\r
517                 protected readonly int[] nパッド0Atoレーン07 = new int[] { 1, 2, 3, 4, 5, 6, 7, 1, 7, 0 };        \r
518                 protected STDGBVALUE<STHITCOUNTOFRANK> nヒット数・Auto含まない;\r
519                 protected STDGBVALUE<STHITCOUNTOFRANK> nヒット数・Auto含む;\r
520                 protected int n現在のトップChip = -1;\r
521                 protected int[] n最後に再生したBGMの実WAV番号 = new int[ 50 ];\r
522                 protected int n最後に再生したHHのチャンネル番号;\r
523                 protected List<int> L最後に再生したHHの実WAV番号;            // #23921 2011.1.4 yyagi: change "int" to "List<int>", for recording multiple wav No.\r
524                 protected STLANEVALUE<int> n最後に再生した実WAV番号;  // #26388 2011.11.8 yyagi: change "n最後に再生した実WAV番号.GUITAR" and "n最後に再生した実WAV番号.BASS"\r
525                                                                                                                                 //                                                      into "n最後に再生した実WAV番号";\r
526 //              protected int n最後に再生した実WAV番号.GUITAR;\r
527 //              protected int n最後に再生した実WAV番号.BASS;\r
528         \r
529                 protected STDGBVALUE<Queue<CDTX.CChip>> queWailing;\r
530                 protected STDGBVALUE<CDTX.CChip> r現在の歓声Chip;\r
531                 protected CDTX.CChip r現在の空うちギターChip;\r
532                 protected STKARAUCHI r現在の空うちドラムChip;\r
533                 protected CDTX.CChip r現在の空うちベースChip;\r
534                 protected CDTX.CChip r次にくるギターChip;\r
535                 protected CDTX.CChip r次にくるベースChip;\r
536                 protected CTexture txWailing枠;\r
537                 protected CTexture txチップ;\r
538                 protected CTexture txヒットバー;\r
539 \r
540                 protected CTexture tx背景;\r
541 \r
542                 protected STDGBVALUE<int> nInputAdjustTimeMs;           // #23580 2011.1.3 yyagi\r
543                 protected CConfigIni.STAUTOPLAY bIsAutoPlay;            // #24239 2011.1.23 yyagi\r
544 //              protected int nRisky_InitialVar, nRiskyTime;            // #23559 2011.7.28 yyagi → CAct演奏ゲージ共通クラスに隠蔽\r
545 \r
546                 protected Stopwatch sw;         // 2011.6.13 最適化検討用のストップウォッチ\r
547 //              protected GCLatencyMode gclatencymode;\r
548 \r
549                 protected E判定 e指定時刻からChipのJUDGEを返す( long nTime, CDTX.CChip pChip, int nInputAdjustTime )\r
550                 {\r
551                         if ( pChip != null )\r
552                         {\r
553                                 pChip.nLag = (int) ( nTime + nInputAdjustTime - pChip.n発声時刻ms );                // #23580 2011.1.3 yyagi: add "nInputAdjustTime" to add input timing adjust feature\r
554                                 int nDeltaTime = Math.Abs( pChip.nLag );\r
555                                 //Debug.WriteLine("nAbsTime=" + (nTime - pChip.n発声時刻ms) + ", nDeltaTime=" + (nTime + nInputAdjustTime - pChip.n発声時刻ms));\r
556                                 if ( nDeltaTime <= CDTXMania.nPerfect範囲ms )\r
557                                 {\r
558                                         return E判定.Perfect;\r
559                                 }\r
560                                 if ( nDeltaTime <= CDTXMania.nGreat範囲ms )\r
561                                 {\r
562                                         return E判定.Great;\r
563                                 }\r
564                                 if ( nDeltaTime <= CDTXMania.nGood範囲ms )\r
565                                 {\r
566                                         return E判定.Good;\r
567                                 }\r
568                                 if ( nDeltaTime <= CDTXMania.nPoor範囲ms )\r
569                                 {\r
570                                         return E判定.Poor;\r
571                                 }\r
572                         }\r
573                         return E判定.Miss;\r
574                 }\r
575                 protected CDTX.CChip r空うちChip( E楽器パート part, Eパッド pad )\r
576                 {\r
577                         switch ( part )\r
578                         {\r
579                                 case E楽器パート.DRUMS:\r
580                                         switch ( pad )\r
581                                         {\r
582                                                 case Eパッド.HH:\r
583                                                         if ( this.r現在の空うちドラムChip.HH != null )\r
584                                                         {\r
585                                                                 return this.r現在の空うちドラムChip.HH;\r
586                                                         }\r
587                                                         if ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける )\r
588                                                         {\r
589                                                                 if ( CDTXMania.ConfigIni.eHHGroup == EHHGroup.左シンバルのみ打ち分ける )\r
590                                                                 {\r
591                                                                         return this.r現在の空うちドラムChip.HHO;\r
592                                                                 }\r
593                                                                 if ( this.r現在の空うちドラムChip.HHO != null )\r
594                                                                 {\r
595                                                                         return this.r現在の空うちドラムChip.HHO;\r
596                                                                 }\r
597                                                         }\r
598                                                         return this.r現在の空うちドラムChip.LC;\r
599 \r
600                                                 case Eパッド.SD:\r
601                                                         return this.r現在の空うちドラムChip.SD;\r
602 \r
603                                                 case Eパッド.BD:\r
604                                                         return this.r現在の空うちドラムChip.BD;\r
605 \r
606                                                 case Eパッド.HT:\r
607                                                         return this.r現在の空うちドラムChip.HT;\r
608 \r
609                                                 case Eパッド.LT:\r
610                                                         if ( this.r現在の空うちドラムChip.LT != null )\r
611                                                         {\r
612                                                                 return this.r現在の空うちドラムChip.LT;\r
613                                                         }\r
614                                                         if ( CDTXMania.ConfigIni.eFTGroup == EFTGroup.共通 )\r
615                                                         {\r
616                                                                 return this.r現在の空うちドラムChip.FT;\r
617                                                         }\r
618                                                         return null;\r
619 \r
620                                                 case Eパッド.FT:\r
621                                                         if ( this.r現在の空うちドラムChip.FT != null )\r
622                                                         {\r
623                                                                 return this.r現在の空うちドラムChip.FT;\r
624                                                         }\r
625                                                         if ( CDTXMania.ConfigIni.eFTGroup == EFTGroup.共通 )\r
626                                                         {\r
627                                                                 return this.r現在の空うちドラムChip.LT;\r
628                                                         }\r
629                                                         return null;\r
630 \r
631                                                 case Eパッド.CY:\r
632                                                         if ( this.r現在の空うちドラムChip.CY != null )\r
633                                                         {\r
634                                                                 return this.r現在の空うちドラムChip.CY;\r
635                                                         }\r
636                                                         if ( CDTXMania.ConfigIni.eCYGroup == ECYGroup.共通 )\r
637                                                         {\r
638                                                                 return this.r現在の空うちドラムChip.RD;\r
639                                                         }\r
640                                                         return null;\r
641 \r
642                                                 case Eパッド.HHO:\r
643                                                         if ( this.r現在の空うちドラムChip.HHO != null )\r
644                                                         {\r
645                                                                 return this.r現在の空うちドラムChip.HHO;\r
646                                                         }\r
647                                                         if ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける )\r
648                                                         {\r
649                                                                 if ( CDTXMania.ConfigIni.eHHGroup == EHHGroup.左シンバルのみ打ち分ける )\r
650                                                                 {\r
651                                                                         return this.r現在の空うちドラムChip.HH;\r
652                                                                 }\r
653                                                                 if ( this.r現在の空うちドラムChip.HH != null )\r
654                                                                 {\r
655                                                                         return this.r現在の空うちドラムChip.HH;\r
656                                                                 }\r
657                                                         }\r
658                                                         return this.r現在の空うちドラムChip.LC;\r
659 \r
660                                                 case Eパッド.RD:\r
661                                                         if ( this.r現在の空うちドラムChip.RD != null )\r
662                                                         {\r
663                                                                 return this.r現在の空うちドラムChip.RD;\r
664                                                         }\r
665                                                         if ( CDTXMania.ConfigIni.eCYGroup == ECYGroup.共通 )\r
666                                                         {\r
667                                                                 return this.r現在の空うちドラムChip.CY;\r
668                                                         }\r
669                                                         return null;\r
670 \r
671                                                 case Eパッド.LC:\r
672                                                         if ( this.r現在の空うちドラムChip.LC != null )\r
673                                                         {\r
674                                                                 return this.r現在の空うちドラムChip.LC;\r
675                                                         }\r
676                                                         if ( ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.ハイハットのみ打ち分ける ) && ( CDTXMania.ConfigIni.eHHGroup != EHHGroup.全部共通 ) )\r
677                                                         {\r
678                                                                 return null;\r
679                                                         }\r
680                                                         if ( this.r現在の空うちドラムChip.HH != null )\r
681                                                         {\r
682                                                                 return this.r現在の空うちドラムChip.HH;\r
683                                                         }\r
684                                                         return this.r現在の空うちドラムChip.HHO;\r
685                                         }\r
686                                         break;\r
687 \r
688                                 case E楽器パート.GUITAR:\r
689                                         return this.r現在の空うちギターChip;\r
690 \r
691                                 case E楽器パート.BASS:\r
692                                         return this.r現在の空うちベースChip;\r
693                         }\r
694                         return null;\r
695                 }\r
696                 protected CDTX.CChip r指定時刻に一番近いChip・ヒット未済問わず不可視考慮( long nTime, int nChannel, int nInputAdjustTime )\r
697                 {\r
698                         nTime += nInputAdjustTime;                                              // #24239 2011.1.23 yyagi InputAdjust\r
699 \r
700                         int nIndex_InitialPositionSearchingToPast;\r
701                         if ( this.n現在のトップChip == -1 )                               // 演奏データとして1個もチップがない場合は\r
702                         {\r
703                                 return null;\r
704                         }\r
705                         int count = CDTXMania.DTX.listChip.Count;\r
706                         int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = this.n現在のトップChip;\r
707                         if ( this.n現在のトップChip >= count )                    // その時点で演奏すべきチップが既に全部無くなっていたら\r
708                         {\r
709                                 nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = count - 1;\r
710                         }\r
711                         //int nIndex_NearestChip_Future;        // = nIndex_InitialPositionSearchingToFuture;\r
712                         //while ( nIndex_NearestChip_Future < count )           // 未来方向への検索\r
713                         for ( ; nIndex_NearestChip_Future < count; nIndex_NearestChip_Future++)\r
714                         {\r
715                                 CDTX.CChip chip = CDTXMania.DTX.listChip[ nIndex_NearestChip_Future ];\r
716                                 if ( ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) ) )\r
717                                 {\r
718                                         if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )\r
719                                         {\r
720                                                 if ( chip.n発声時刻ms > nTime )\r
721                                                 {\r
722                                                         break;\r
723                                                 }\r
724                                                 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
725                                         }\r
726                                         continue;       // ほんの僅かながら高速化\r
727                                 }\r
728                                 else if ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )\r
729                                 {\r
730                                         if ( chip.n発声時刻ms > nTime )\r
731                                         {\r
732                                                 break;\r
733                                         }\r
734                                         nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
735                                 }\r
736                                 else if ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )\r
737                                 {\r
738                                         if ( chip.n発声時刻ms > nTime )\r
739                                         {\r
740                                                 break;\r
741                                         }\r
742                                         nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
743                                 }\r
744                                 // nIndex_NearestChip_Future++;\r
745                         }\r
746                         int nIndex_NearestChip_Past = nIndex_InitialPositionSearchingToPast;\r
747                         //while ( nIndex_NearestChip_Past >= 0 )                        // 過去方向への検索\r
748                         for ( ; nIndex_NearestChip_Past >= 0; nIndex_NearestChip_Past-- )\r
749                         {\r
750                                 CDTX.CChip chip = CDTXMania.DTX.listChip[ nIndex_NearestChip_Past ];\r
751                                 if ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) )\r
752                                 {\r
753                                         if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )\r
754                                         {\r
755                                                 break;\r
756                                         }\r
757                                 }\r
758                                 else if ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )\r
759                                 {\r
760                                         if ( ( 0x20 <= chip.nチャンネル番号 ) && ( chip.nチャンネル番号 <= 0x28 ) )\r
761                                         {\r
762                                                 break;\r
763                                         }\r
764                                 }\r
765                                 else if ( ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) )\r
766                                         && ( ( 0xa0 <= chip.nチャンネル番号 ) && ( chip.nチャンネル番号 <= 0xa8 ) ) )\r
767                                 {\r
768                                         break;\r
769                                 }\r
770                                 // nIndex_NearestChip_Past--;\r
771                         }\r
772 \r
773                         if ( nIndex_NearestChip_Future >= count )\r
774                         {\r
775                                 if ( nIndex_NearestChip_Past < 0 )      // 検索対象が過去未来どちらにも見つからなかった場合\r
776                                 {\r
777                                         return null;\r
778                                 }\r
779                                 else                                                            // 検索対象が未来方向には見つからなかった(しかし過去方向には見つかった)場合\r
780                                 {\r
781                                         return CDTXMania.DTX.listChip[ nIndex_NearestChip_Past ];\r
782                                 }\r
783                         }\r
784                         else if ( nIndex_NearestChip_Past < 0 ) // 検索対象が過去方向には見つからなかった(しかし未来方向には見つかった)場合\r
785                         {\r
786                                 return CDTXMania.DTX.listChip[ nIndex_NearestChip_Future ];\r
787                         }\r
788                                                                                                         // 検索対象が過去未来の双方に見つかったなら、より近い方を採用する\r
789                         CDTX.CChip nearestChip_Future = CDTXMania.DTX.listChip[ nIndex_NearestChip_Future ];\r
790                         CDTX.CChip nearestChip_Past   = CDTXMania.DTX.listChip[ nIndex_NearestChip_Past ];\r
791                         int nDiffTime_Future = Math.Abs( (int) ( nTime - nearestChip_Future.n発声時刻ms ) );\r
792                         int nDiffTime_Past   = Math.Abs( (int) ( nTime - nearestChip_Past.n発声時刻ms ) );\r
793                         if ( nDiffTime_Future >= nDiffTime_Past )\r
794                         {\r
795                                 return nearestChip_Past;\r
796                         }\r
797                         return nearestChip_Future;\r
798                 }\r
799                 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part )\r
800                 {\r
801                         this.tサウンド再生( rChip, n再生開始システム時刻ms, part, CDTXMania.ConfigIni.n手動再生音量, false, false );\r
802                 }\r
803                 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part, int n音量 )\r
804                 {\r
805                         this.tサウンド再生( rChip, n再生開始システム時刻ms, part, n音量, false, false );\r
806                 }\r
807                 protected void tサウンド再生( CDTX.CChip rChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ )\r
808                 {\r
809                         this.tサウンド再生( rChip, n再生開始システム時刻ms, part, n音量, bモニタ, false );\r
810                 }\r
811                 protected void tサウンド再生( CDTX.CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生 )\r
812                 {\r
813                         // mute sound (auto)\r
814                         // 4A: HH\r
815                         // 4B: CY\r
816                         // 4C: RD\r
817                         // 4D: LC\r
818                         // 2A: Gt\r
819                         // AA: Bs\r
820                         //\r
821 \r
822                         if ( pChip != null )\r
823                         {\r
824                                 bool overwrite = false;\r
825                                 switch ( part )\r
826                                 {\r
827                                         case E楽器パート.DRUMS:\r
828                                         #region [ DRUMS ]\r
829                                                 {\r
830                                                         int index = pChip.nチャンネル番号;\r
831                                                         if ( ( 0x11 <= index ) && ( index <= 0x1a ) )\r
832                                                         {\r
833                                                                 index -= 0x11;\r
834                                                         }\r
835                                                         else if ( ( 0x31 <= index ) && ( index <= 0x3a ) )\r
836                                                         {\r
837                                                                 index -= 0x31;\r
838                                                         }\r
839                                                         // mute sound (auto)\r
840                                                         // 4A: 84: HH (HO/HC)\r
841                                                         // 4B: 85: CY\r
842                                                         // 4C: 86: RD\r
843                                                         // 4D: 87: LC\r
844                                                         // 2A: 88: Gt\r
845                                                         // AA: 89: Bs\r
846                                                         else if ( 0x84 == index )       // 仮に今だけ追加 HHは消音処理があるので overwriteフラグ系の処理は改めて不要\r
847                                                         {\r
848                                                                 index = 0;\r
849                                                         }\r
850                                                         else if ( ( 0x85 <= index ) && ( index <= 0x87 ) )      // 仮に今だけ追加\r
851                                                         {\r
852                                                                 //            CY    RD    LC\r
853                                                                 int[] ch = { 0x16, 0x19, 0x1A };\r
854                                                                 pChip.nチャンネル番号 = ch[ pChip.nチャンネル番号 - 0x85 ];\r
855                                                                 index = pChip.nチャンネル番号 - 0x11;\r
856                                                                 overwrite = true;\r
857                                                         }\r
858                                                         else\r
859                                                         {\r
860                                                                 return;\r
861                                                         }\r
862                                                         int nLane = this.nチャンネル0Atoレーン07[ index ];\r
863                                                         if ( ( nLane == 1 ) &&  // 今回演奏するのがHC or HO\r
864                                                                 ( index == 0 || ( index == 7 && this.n最後に再生したHHのチャンネル番号 != 0x18 && this.n最後に再生したHHのチャンネル番号 != 0x38 ) )\r
865                                                                 // HCを演奏するか、またはHO演奏&以前HO演奏でない&以前不可視HO演奏でない\r
866                                                         )\r
867                                                         // #24772 2011.4.4 yyagi\r
868                                                         // == HH mute condition == \r
869                                                         //                      current HH              So, the mute logics are:\r
870                                                         //                              HC      HO              1) All played HC/HOs should be queueing\r
871                                                         // last HH      HC  Yes Yes             2) If you aren't in "both current/last HH are HO", queued HH should be muted.\r
872                                                         //                      HO      Yes     No\r
873                                                         {\r
874                                                                 // #23921 2011.1.4 yyagi: 2種類以上のオープンハイハットが発音済みだと、最後のHHOしか消せない問題に対応。\r
875 #if TEST_NOTEOFFMODE    // 2011.1.1 yyagi test\r
876                                                                 if (CDTXMania.DTX.b演奏で直前の音を消音する.HH)\r
877                                                                 {\r
878 #endif\r
879                                                                 for ( int i = 0; i < this.L最後に再生したHHの実WAV番号.Count; i++ )          // #23921 2011.1.4 yyagi\r
880                                                                 {\r
881                                                                         // CDTXMania.DTX.tWavの再生停止(this.L最後に再生したHHの実WAV番号);\r
882                                                                         CDTXMania.DTX.tWavの再生停止( this.L最後に再生したHHの実WAV番号[ i ] ); // #23921 yyagi ストック分全て消音する\r
883                                                                 }\r
884                                                                 this.L最後に再生したHHの実WAV番号.Clear();\r
885 #if TEST_NOTEOFFMODE    // 2011.1.1 yyagi test\r
886                                                                 }\r
887 #endif\r
888                                                                 //this.n最後に再生したHHの実WAV番号 = pChip.n整数値・内部番号;\r
889                                                                 this.n最後に再生したHHのチャンネル番号 = pChip.nチャンネル番号;\r
890                                                         }\r
891 #if TEST_NOTEOFFMODE    // 2011.1.4 yyagi test\r
892                                                         if (CDTXMania.DTX.b演奏で直前の音を消音する.HH)\r
893                                                         {\r
894 #endif\r
895                                                         if ( index == 0 || index == 7 || index == 0x20 || index == 0x27 )                       // #23921 HOまたは不可視HO演奏時はそのチップ番号をストックしておく\r
896                                                         {                                                                                                                                                       // #24772 HC, 不可視HCも消音キューに追加\r
897                                                                 if ( this.L最後に再生したHHの実WAV番号.Count >= 16 ) // #23921 ただしストック数が16以上になるようなら、頭の1個を削って常に16未満に抑える\r
898                                                                 {                                                                                                       // (ストックが増えてList<>のrealloc()が発生するのを予防する)\r
899                                                                         this.L最後に再生したHHの実WAV番号.RemoveAt( 0 );\r
900                                                                 }\r
901                                                                 if ( !this.L最後に再生したHHの実WAV番号.Contains( pChip.n整数値・内部番号 ) )        // チップ音がまだストックされてなければ\r
902                                                                 {\r
903                                                                         this.L最後に再生したHHの実WAV番号.Add( pChip.n整数値・内部番号 );                    // ストックする\r
904                                                                 }\r
905                                                         }\r
906 #if TEST_NOTEOFFMODE    // 2011.1.4 yyagi test\r
907                                                         }\r
908 #endif\r
909                                                         if ( overwrite )\r
910                                                         {\r
911                                                                 CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号[index] );\r
912                                                         }\r
913                                                         CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, nLane, n音量, bモニタ );\r
914                                                         this.n最後に再生した実WAV番号[ nLane ] = pChip.n整数値・内部番号;             // nLaneでなくindexにすると、LC(1A-11=09)とギター(enumで09)がかぶってLC音が消されるので注意\r
915                                                         return;\r
916                                                 }\r
917                                         #endregion\r
918                                         case E楽器パート.GUITAR:\r
919                                         #region [ GUITAR ]\r
920 #if TEST_NOTEOFFMODE    // 2011.1.1 yyagi test\r
921                                                 if (CDTXMania.DTX.b演奏で直前の音を消音する.Guitar) {\r
922 #endif\r
923                                                 CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Guitar );\r
924 #if TEST_NOTEOFFMODE\r
925                                                 }\r
926 #endif\r
927                                                 CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, (int) Eレーン.Guitar, n音量, bモニタ, b音程をずらして再生 );\r
928                                                 this.n最後に再生した実WAV番号.Guitar = pChip.n整数値・内部番号;\r
929                                                 return;\r
930                                         #endregion\r
931                                         case E楽器パート.BASS:\r
932                                         #region [ BASS ]\r
933 #if TEST_NOTEOFFMODE\r
934                                                 if (CDTXMania.DTX.b演奏で直前の音を消音する.Bass) {\r
935 #endif\r
936                                                 CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Bass );\r
937 #if TEST_NOTEOFFMODE\r
938                                                 }\r
939 #endif\r
940                                                 CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, (int) Eレーン.Bass, n音量, bモニタ, b音程をずらして再生 );\r
941                                                 this.n最後に再生した実WAV番号.Bass = pChip.n整数値・内部番号;\r
942                                                 return;\r
943                                         #endregion\r
944 \r
945                                         default:\r
946                                                 break;\r
947                                 }\r
948                         }\r
949                 }\r
950                 protected void tステータスパネルの選択()\r
951                 {\r
952                         if ( CDTXMania.bコンパクトモード )\r
953                         {\r
954                                 this.actStatusPanels.tラベル名からステータスパネルを決定する( null );\r
955                         }\r
956                         else if ( CDTXMania.stage選曲.r確定された曲 != null )\r
957                         {\r
958                                 this.actStatusPanels.tラベル名からステータスパネルを決定する( CDTXMania.stage選曲.r確定された曲.ar難易度ラベル[ CDTXMania.stage選曲.n確定された曲の難易度 ] );\r
959                         }\r
960                 }\r
961                 protected abstract E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip );\r
962                 protected E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, E楽器パート screenmode )          // E楽器パート screenmode\r
963                 {\r
964                         pChip.bHit = true;\r
965                         bool bPChipIsAutoPlay = false;\r
966                         if ( (\r
967                                         ( ( pChip.e楽器パート == E楽器パート.DRUMS ) && bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] ) ||\r
968                                         ( ( pChip.e楽器パート == E楽器パート.GUITAR ) && bIsAutoPlay.Guitar )\r
969                                 ) ||\r
970                                         ( ( pChip.e楽器パート == E楽器パート.BASS ) && bIsAutoPlay.Bass )\r
971                           )\r
972                         {\r
973                                 bPChipIsAutoPlay = true;\r
974                         }\r
975                         else\r
976                         {\r
977                                 this.bAUTOでないチップが1つでもバーを通過した = true;\r
978                         }\r
979                         pChip.bIsAutoPlayed = bPChipIsAutoPlay;                 // 2011.6.10 yyagi\r
980                         E判定 eJudgeResult = E判定.Auto;\r
981                         switch ( pChip.e楽器パート )\r
982                         {\r
983                                 case E楽器パート.DRUMS:\r
984                                         {\r
985                                                 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Drums;\r
986                                                 eJudgeResult = this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime );\r
987                                                 this.actJudgeString.Start( this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ], bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );\r
988                                         }\r
989                                         break;\r
990 \r
991                                 case E楽器パート.GUITAR:\r
992                                         {\r
993                                                 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Guitar;\r
994                                                 eJudgeResult = this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime );\r
995                                                 this.actJudgeString.Start( 10, bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );\r
996                                                 break;\r
997                                         }\r
998 \r
999                                 case E楽器パート.BASS:\r
1000                                         {\r
1001                                                 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Bass;\r
1002                                                 eJudgeResult = this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime );\r
1003                                                 this.actJudgeString.Start( 11, bPChipIsAutoPlay ? E判定.Auto : eJudgeResult, pChip.nLag );\r
1004                                         }\r
1005                                         break;\r
1006                         }\r
1007                         if ( !bPChipIsAutoPlay && ( pChip.e楽器パート != E楽器パート.UNKNOWN ) )\r
1008                         {\r
1009                                 // this.t判定にあわせてゲージを増減する( screenmode, pChip.e楽器パート, eJudgeResult );\r
1010                                 actGauge.Damage( screenmode, pChip.e楽器パート, eJudgeResult );\r
1011                         }\r
1012 \r
1013                         switch ( pChip.e楽器パート )\r
1014                         {\r
1015                                 case E楽器パート.DRUMS:\r
1016                                         switch ( eJudgeResult )\r
1017                                         {\r
1018                                                 case E判定.Miss:\r
1019                                                 case E判定.Bad:\r
1020                                                         this.nヒット数・Auto含む.Drums.Miss++;\r
1021                                                         if ( !bPChipIsAutoPlay )\r
1022                                                         {\r
1023                                                                 this.nヒット数・Auto含まない.Drums.Miss++;\r
1024                                                         }\r
1025                                                         break;\r
1026                                                 default:\r
1027                                                         this.nヒット数・Auto含む.Drums[ (int) eJudgeResult ]++;\r
1028                                                         if ( !bPChipIsAutoPlay )\r
1029                                                         {\r
1030                                                                 this.nヒット数・Auto含まない.Drums[ (int) eJudgeResult ]++;\r
1031                                                         }\r
1032                                                         break;\r
1033                                         }\r
1034 \r
1035                                         if ( CDTXMania.ConfigIni.bドラムが全部オートプレイである || !bPChipIsAutoPlay )\r
1036                                         {\r
1037                                                 switch ( eJudgeResult )\r
1038                                                 {\r
1039                                                         case E判定.Perfect:\r
1040                                                         case E判定.Great:\r
1041                                                         case E判定.Good:\r
1042                                                                 this.actCombo.n現在のコンボ数.Drums++;\r
1043                                                                 break;\r
1044 \r
1045                                                         default:\r
1046                                                                 this.actCombo.n現在のコンボ数.Drums = 0;\r
1047                                                                 break;\r
1048                                                 }\r
1049                                         }\r
1050                                         break;\r
1051 \r
1052                                 case E楽器パート.GUITAR:\r
1053                                 case E楽器パート.BASS:\r
1054                                         int indexInst = (int) pChip.e楽器パート;\r
1055                                         switch ( eJudgeResult )\r
1056                                         {\r
1057                                                 case E判定.Miss:\r
1058                                                 case E判定.Bad:\r
1059                                                         this.nヒット数・Auto含む[ indexInst ].Miss++;\r
1060                                                         if ( !bPChipIsAutoPlay )\r
1061                                                         {\r
1062                                                                 this.nヒット数・Auto含まない[ indexInst ].Miss++;\r
1063                                                         }\r
1064                                                         break;\r
1065                                                 default:        // #24068 2011.1.10 ikanick changed\r
1066                                                         // #24167 2011.1.16 yyagi changed\r
1067                                                         this.nヒット数・Auto含む[ indexInst ][ (int) eJudgeResult ]++;\r
1068                                                         if ( !bPChipIsAutoPlay )\r
1069                                                         {\r
1070                                                                 this.nヒット数・Auto含まない[ indexInst ][ (int) eJudgeResult ]++;\r
1071                                                         }\r
1072                                                         break;\r
1073                                         }\r
1074                                         switch ( eJudgeResult )\r
1075                                         {\r
1076                                                 case E判定.Perfect:\r
1077                                                 case E判定.Great:\r
1078                                                 case E判定.Good:\r
1079                                                         this.actCombo.n現在のコンボ数[ indexInst ]++;\r
1080                                                         break;\r
1081 \r
1082                                                 default:\r
1083                                                         this.actCombo.n現在のコンボ数[ indexInst ] = 0;\r
1084                                                         break;\r
1085                                         }\r
1086                                         break;\r
1087 \r
1088                                 default:\r
1089                                         break;\r
1090                         }\r
1091                         if ( ( !bPChipIsAutoPlay && ( pChip.e楽器パート != E楽器パート.UNKNOWN ) ) && ( eJudgeResult != E判定.Miss ) && ( eJudgeResult != E判定.Bad ) )\r
1092                         {\r
1093                                 int nCombos = this.actCombo.n現在のコンボ数[ (int) pChip.e楽器パート ];\r
1094                                 long nScore = this.actScore.Get( pChip.e楽器パート );\r
1095                                 long[] nComboScoreDelta = new long[] { 350L, 200L, 50L, 0L };\r
1096                                 if ( ( nCombos <= 500 ) || ( eJudgeResult == E判定.Good ) )\r
1097                                 {\r
1098                                         nScore += nComboScoreDelta[ (int) eJudgeResult ] * nCombos;\r
1099                                 }\r
1100                                 else if ( ( eJudgeResult == E判定.Perfect ) || ( eJudgeResult == E判定.Great ) )\r
1101                                 {\r
1102                                         nScore += nComboScoreDelta[ (int) eJudgeResult ] * 500L;\r
1103                                 }\r
1104                                 this.actScore.Set( pChip.e楽器パート, nScore );\r
1105                         }\r
1106                         return eJudgeResult;\r
1107                 }\r
1108                 protected abstract void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part );\r
1109                 protected abstract void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, int nLane );\r
1110                 protected void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, E楽器パート screenmode )\r
1111                 {\r
1112                         this.tチップのヒット処理・BadならびにTight時のMiss( part, 0, screenmode );\r
1113                 }\r
1114                 protected void tチップのヒット処理・BadならびにTight時のMiss( E楽器パート part, int nLane, E楽器パート screenmode )\r
1115                 {\r
1116                         this.bAUTOでないチップが1つでもバーを通過した = true;\r
1117                         //this.t判定にあわせてゲージを増減する( screenmode, part, E判定.Miss );\r
1118                         actGauge.Damage( screenmode, part, E判定.Miss );\r
1119                         switch ( part )\r
1120                         {\r
1121                                 case E楽器パート.DRUMS:\r
1122                                         if ( ( nLane >= 0 ) && ( nLane <= 7 ) )\r
1123                                         {\r
1124                                                 this.actJudgeString.Start( nLane, bIsAutoPlay[ nLane ] ? E判定.Auto : E判定.Miss, 999 );\r
1125                                         }\r
1126                                         this.actCombo.n現在のコンボ数.Drums = 0;\r
1127                                         return;\r
1128 \r
1129                                 case E楽器パート.GUITAR:\r
1130                                         this.actJudgeString.Start( 10, E判定.Bad, 999 );\r
1131                                         this.actCombo.n現在のコンボ数.Guitar = 0;\r
1132                                         return;\r
1133 \r
1134                                 case E楽器パート.BASS:\r
1135                                         this.actJudgeString.Start( 11, E判定.Bad, 999 );\r
1136                                         this.actCombo.n現在のコンボ数.Bass = 0;\r
1137                                         break;\r
1138 \r
1139                                 default:\r
1140                                         return;\r
1141                         }\r
1142                 }\r
1143         \r
1144                 protected CDTX.CChip r指定時刻に一番近い未ヒットChip( long nTime, int nChannelFlag, int nInputAdjustTime )\r
1145                 {\r
1146                         return this.r指定時刻に一番近い未ヒットChip( nTime, nChannelFlag, nInputAdjustTime, 0 );\r
1147                 }\r
1148                 protected CDTX.CChip r指定時刻に一番近い未ヒットChip( long nTime, int nChannel, int nInputAdjustTime, int n検索範囲時間ms )\r
1149                 {\r
1150                         nTime += nInputAdjustTime;\r
1151 \r
1152                         int nIndex_InitialPositionSearchingToPast;\r
1153                         int nTimeDiff;\r
1154                         if ( this.n現在のトップChip == -1 )                       // 演奏データとして1個もチップがない場合は\r
1155                         {\r
1156                                 return null;\r
1157                         }\r
1158                         int count = CDTXMania.DTX.listChip.Count;\r
1159                         int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToPast = this.n現在のトップChip;\r
1160                         if ( this.n現在のトップChip >= count )            // その時点で演奏すべきチップが既に全部無くなっていたら\r
1161                         {\r
1162                                 nIndex_NearestChip_Future  = nIndex_InitialPositionSearchingToPast = count - 1;\r
1163                         }\r
1164                         // int nIndex_NearestChip_Future = nIndex_InitialPositionSearchingToFuture;\r
1165 //                      while ( nIndex_NearestChip_Future < count )     // 未来方向への検索\r
1166                         for ( ; nIndex_NearestChip_Future < count; nIndex_NearestChip_Future++ )\r
1167                         {\r
1168                                 CDTX.CChip chip = CDTXMania.DTX.listChip[ nIndex_NearestChip_Future ];\r
1169                                 if ( !chip.bHit )\r
1170                                 {\r
1171                                         if ( ( 0x11 <= nChannel ) && ( nChannel <= 0x1a ) )\r
1172                                         {\r
1173                                                 if ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )\r
1174                                                 {\r
1175                                                         if ( chip.n発声時刻ms > nTime )\r
1176                                                         {\r
1177                                                                 break;\r
1178                                                         }\r
1179                                                         nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
1180                                                 }\r
1181                                                 continue;\r
1182                                         }\r
1183                                         else if ( ( ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( 0x20 <= nChannel ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) ) ) )\r
1184                                         {\r
1185                                                 if ( chip.n発声時刻ms > nTime )\r
1186                                                 {\r
1187                                                         break;\r
1188                                                 }\r
1189                                                 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
1190                                         }\r
1191                                         else if ( ( ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( 0xa0 <= nChannel ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) ) ) )\r
1192                                         {\r
1193                                                 if ( chip.n発声時刻ms > nTime )\r
1194                                                 {\r
1195                                                         break;\r
1196                                                 }\r
1197                                                 nIndex_InitialPositionSearchingToPast = nIndex_NearestChip_Future;\r
1198                                         }\r
1199                                 }\r
1200 //                              nIndex_NearestChip_Future++;\r
1201                         }\r
1202                         int nIndex_NearestChip_Past = nIndex_InitialPositionSearchingToPast;\r
1203 //                      while ( nIndex_NearestChip_Past >= 0 )          // 過去方向への検索\r
1204                         for ( ; nIndex_NearestChip_Past >= 0; nIndex_NearestChip_Past-- )\r
1205                         {\r
1206                                 CDTX.CChip chip = CDTXMania.DTX.listChip[ nIndex_NearestChip_Past ];\r
1207                                 if ( (!chip.bHit) &&\r
1208                                                 (\r
1209                                                         ( ( nChannel >= 0x11 ) && ( nChannel <= 0x1a ) &&\r
1210                                                                 ( ( chip.nチャンネル番号 == nChannel ) || ( chip.nチャンネル番号 == ( nChannel + 0x20 ) ) )\r
1211                                                         )\r
1212                                                         ||\r
1213                                                         (\r
1214                                                                 ( ( nChannel == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) ||\r
1215                                                                 ( ( ( nChannel >= 0x20 ) && ( nChannel <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannel ) )\r
1216                                                         )\r
1217                                                         ||\r
1218                                                         (\r
1219                                                                 ( ( nChannel == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) ||\r
1220                                                                 ( ( ( nChannel >= 0xA0 ) && ( nChannel <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannel ) )\r
1221                                                         )\r
1222                                                 )\r
1223                                         )\r
1224                                         {\r
1225                                                 break;\r
1226                                         }\r
1227 //                              nIndex_NearestChip_Past--;\r
1228                         }\r
1229                         if ( ( nIndex_NearestChip_Future >= count ) && ( nIndex_NearestChip_Past < 0 ) )        // 検索対象が過去未来どちらにも見つからなかった場合\r
1230                         {\r
1231                                 return null;\r
1232                         }\r
1233                         CDTX.CChip nearestChip; // = null;      // 以下のifブロックのいずれかで必ずnearestChipには非nullが代入されるので、null初期化を削除\r
1234                         if ( nIndex_NearestChip_Future >= count )                                                                                       // 検索対象が未来方向には見つからなかった(しかし過去方向には見つかった)場合\r
1235                         {\r
1236                                 nearestChip = CDTXMania.DTX.listChip[ nIndex_NearestChip_Past ];\r
1237 //                              nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1238                         }\r
1239                         else if ( nIndex_NearestChip_Past < 0 )                                                                                         // 検索対象が過去方向には見つからなかった(しかし未来方向には見つかった)場合\r
1240                         {\r
1241                                 nearestChip = CDTXMania.DTX.listChip[ nIndex_NearestChip_Future ];\r
1242 //                              nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1243                         }\r
1244                         else\r
1245                         {\r
1246                                 int nTimeDiff_Future = Math.Abs( (int) ( nTime - CDTXMania.DTX.listChip[ nIndex_NearestChip_Future ].n発声時刻ms ) );\r
1247                                 int nTimeDiff_Past   = Math.Abs( (int) ( nTime - CDTXMania.DTX.listChip[ nIndex_NearestChip_Past   ].n発声時刻ms ) );\r
1248                                 if ( nTimeDiff_Future < nTimeDiff_Past )\r
1249                                 {\r
1250                                         nearestChip = CDTXMania.DTX.listChip[ nIndex_NearestChip_Future ];\r
1251 //                                      nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1252                                 }\r
1253                                 else\r
1254                                 {\r
1255                                         nearestChip = CDTXMania.DTX.listChip[ nIndex_NearestChip_Past ];\r
1256 //                                      nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1257                                 }\r
1258                         }\r
1259                         nTimeDiff = Math.Abs( (int) ( nTime - nearestChip.n発声時刻ms ) );\r
1260                         if ( ( n検索範囲時間ms > 0 ) && ( nTimeDiff > n検索範囲時間ms ) )                                   // チップは見つかったが、検索範囲時間外だった場合\r
1261                         {\r
1262                                 return null;\r
1263                         }\r
1264                         return nearestChip;\r
1265                 }\r
1266 \r
1267                 protected CDTX.CChip r次に来る指定楽器Chipを更新して返す( E楽器パート inst )\r
1268                 {\r
1269                         switch ( (int) inst )\r
1270                         {\r
1271                                 case (int)E楽器パート.GUITAR:\r
1272                                         return r次にくるギターChipを更新して返す();\r
1273                                 case (int)E楽器パート.BASS:\r
1274                                         return r次にくるベースChipを更新して返す();\r
1275                                 default:\r
1276                                         return null;\r
1277                         }\r
1278                 }\r
1279                 protected CDTX.CChip r次にくるギターChipを更新して返す()\r
1280                 {\r
1281                         int nInputAdjustTime = this.bIsAutoPlay.Guitar ? 0 : this.nInputAdjustTimeMs.Guitar;\r
1282                         this.r次にくるギターChip = this.r指定時刻に一番近い未ヒットChip( CDTXMania.Timer.n現在時刻, 0x2f, nInputAdjustTime, 500 );\r
1283                         return this.r次にくるギターChip;\r
1284                 }\r
1285                 protected CDTX.CChip r次にくるベースChipを更新して返す()\r
1286                 {\r
1287                         int nInputAdjustTime = this.bIsAutoPlay.Bass ? 0 : this.nInputAdjustTimeMs.Bass;\r
1288                         this.r次にくるベースChip = this.r指定時刻に一番近い未ヒットChip( CDTXMania.Timer.n現在時刻, 0xaf, nInputAdjustTime, 500 );\r
1289                         return this.r次にくるベースChip;\r
1290                 }\r
1291 \r
1292                 protected void ChangeInputAdjustTimeInPlaying( IInputDevice keyboard, int plusminus )           // #23580 2011.1.16 yyagi UI for InputAdjustTime in playing screen.\r
1293                 {\r
1294                         int part, offset = plusminus;\r
1295                         if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) )      // Guitar InputAdjustTime\r
1296                         {\r
1297                                 part = (int) E楽器パート.GUITAR;\r
1298                         }\r
1299                         else if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftAlt ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightAlt ) )     // Bass InputAdjustTime\r
1300                         {\r
1301                                 part = (int) E楽器パート.BASS;\r
1302                         }\r
1303                         else    // Drums InputAdjustTime\r
1304                         {\r
1305                                 part = (int) E楽器パート.DRUMS;\r
1306                         }\r
1307                         if ( !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) && !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) )\r
1308                         {\r
1309                                 offset *= 10;\r
1310                         }\r
1311 \r
1312                         this.nInputAdjustTimeMs[ part ] += offset;\r
1313                         if ( this.nInputAdjustTimeMs[ part ] > 0 )\r
1314                         {\r
1315                                 this.nInputAdjustTimeMs[ part ] = 0;\r
1316                         }\r
1317                         else if ( this.nInputAdjustTimeMs[ part ] < -99 )\r
1318                         {\r
1319                                 this.nInputAdjustTimeMs[ part ] = -99;\r
1320                         }\r
1321                         CDTXMania.ConfigIni.nInputAdjustTimeMs[ part ] = this.nInputAdjustTimeMs[ part ];\r
1322                 }\r
1323 \r
1324                 protected abstract void t入力処理・ドラム();\r
1325 //              protected abstract void t入力処理・ギター();\r
1326 //              protected abstract void t入力処理・ベース();\r
1327                 protected abstract void ドラムスクロール速度アップ();\r
1328                 protected abstract void ドラムスクロール速度ダウン();\r
1329                 protected void tキー入力()\r
1330                 {\r
1331                         IInputDevice keyboard = CDTXMania.Input管理.Keyboard;\r
1332                         if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.F1 ) &&\r
1333                                 ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )\r
1334                         {       // shift+f1 (pause)\r
1335                                 this.bPAUSE = !this.bPAUSE;\r
1336                                 if ( this.bPAUSE )\r
1337                                 {\r
1338                                         CDTXMania.Timer.t一時停止();\r
1339                                         CDTXMania.DTX.t全チップの再生一時停止();\r
1340                                 }\r
1341                                 else\r
1342                                 {\r
1343                                         CDTXMania.Timer.t再開();\r
1344                                         CDTXMania.DTX.t全チップの再生再開();\r
1345                                 }\r
1346                         }\r
1347                         if ( ( !this.bPAUSE && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
1348                         {\r
1349                                 this.t入力処理・ドラム();\r
1350                                 //this.t入力処理・ギター();\r
1351                                 //this.t入力処理・ベース();\r
1352                                 this.t入力処理・ギターベース( E楽器パート.GUITAR );\r
1353                                 this.t入力処理・ギターベース( E楽器パート.BASS );\r
1354                                 if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )\r
1355                                 {       // shift (+ctrl) + UpArrow (BGMAdjust)\r
1356                                         CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? 1 : 10 );\r
1357                                         CDTXMania.DTX.tWave再生位置自動補正();\r
1358                                 }\r
1359                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )\r
1360                                 {       // shift + DownArrow (BGMAdjust)\r
1361                                         CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? -1 : -10 );\r
1362                                         CDTXMania.DTX.tWave再生位置自動補正();\r
1363                                 }\r
1364                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) )\r
1365                                 {       // UpArrow(scrollspeed up)\r
1366                                         ドラムスクロール速度アップ();\r
1367                                 }\r
1368                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) )\r
1369                                 {       // DownArrow (scrollspeed down)\r
1370                                         ドラムスクロール速度ダウン();\r
1371                                 }\r
1372                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Delete ) )\r
1373                                 {       // del (debug info)\r
1374                                         CDTXMania.ConfigIni.b演奏情報を表示する = !CDTXMania.ConfigIni.b演奏情報を表示する;\r
1375                                 }\r
1376                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.LeftArrow ) )           // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.\r
1377                                 {\r
1378                                         ChangeInputAdjustTimeInPlaying( keyboard, -1 );\r
1379                                 }\r
1380                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.RightArrow ) )          // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.\r
1381                                 {\r
1382                                         ChangeInputAdjustTimeInPlaying( keyboard, +1 );\r
1383                                 }\r
1384                                 else if ( ( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 ) && ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Escape ) || CDTXMania.Pad.b押されたGB( Eパッド.FT ) ) )\r
1385                                 {       // escape (exit)\r
1386                                         this.actFO.tフェードアウト開始();\r
1387                                         base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;\r
1388                                         this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.演奏中断;\r
1389                                 }\r
1390                         }\r
1391                 }\r
1392 \r
1393                 protected void t入力メソッド記憶( E楽器パート part )\r
1394                 {\r
1395                         if ( CDTXMania.Pad.st検知したデバイス.Keyboard )\r
1396                         {\r
1397                                 this.b演奏にキーボードを使った[ (int) part ] = true;\r
1398                         }\r
1399                         if ( CDTXMania.Pad.st検知したデバイス.Joypad )\r
1400                         {\r
1401                                 this.b演奏にジョイパッドを使った[ (int) part ] = true;\r
1402                         }\r
1403                         if ( CDTXMania.Pad.st検知したデバイス.MIDIIN )\r
1404                         {\r
1405                                 this.b演奏にMIDI入力を使った[ (int) part ] = true;\r
1406                         }\r
1407                         if ( CDTXMania.Pad.st検知したデバイス.Mouse )\r
1408                         {\r
1409                                 this.b演奏にマウスを使った[ (int) part ] = true;\r
1410                         }\r
1411                 }\r
1412 \r
1413 \r
1414                 protected abstract void t進行描画・AVI();\r
1415                 protected void t進行描画・AVI(int x, int y)\r
1416                 {\r
1417                         if ( ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( !CDTXMania.ConfigIni.bストイックモード && CDTXMania.ConfigIni.bAVI有効 ) )\r
1418                         {\r
1419                                 this.actAVI.t進行描画( x, y );\r
1420                         }\r
1421                 }\r
1422                 protected abstract void t進行描画・BGA();\r
1423                 protected void t進行描画・BGA(int x, int y)\r
1424                 {\r
1425                         if ( ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) ) && ( !CDTXMania.ConfigIni.bストイックモード && CDTXMania.ConfigIni.bBGA有効 ) )\r
1426                         {\r
1427                                 this.actBGA.t進行描画( x, y );\r
1428                         }\r
1429                 }\r
1430                 protected abstract void t進行描画・DANGER();\r
1431                 protected void t進行描画・MIDIBGM()\r
1432                 {\r
1433                         if ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED )\r
1434                         {\r
1435                                 CStage.Eフェーズ eフェーズid1 = base.eフェーズID;\r
1436                         }\r
1437                 }\r
1438                 protected void t進行描画・RGBボタン()\r
1439                 {\r
1440                         if ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )\r
1441                         {\r
1442                                 this.actRGB.On進行描画();\r
1443                         }\r
1444                 }\r
1445                 protected void t進行描画・STAGEFAILED()\r
1446                 {\r
1447                         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
1448                         {\r
1449                                 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージ失敗;\r
1450                                 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト;\r
1451                                 this.actFO.tフェードアウト開始();\r
1452                         }\r
1453                 }\r
1454                 protected void t進行描画・WailingBonus()\r
1455                 {\r
1456                         if ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
1457                         {\r
1458                                 this.actWailingBonus.On進行描画();\r
1459                         }\r
1460                 }\r
1461                 protected abstract void t進行描画・Wailing枠();\r
1462                 protected void t進行描画・Wailing枠(int GtWailingFrameX, int BsWailingFrameX, int GtWailingFrameY, int BsWailingFrameY)\r
1463                 {\r
1464                         if ( ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL ) && CDTXMania.ConfigIni.bGuitar有効 )\r
1465                         {\r
1466                                 if ( CDTXMania.DTX.bチップがある.Guitar && ( this.txWailing枠 != null ) )\r
1467                                 {\r
1468                                         this.txWailing枠.t2D描画( CDTXMania.app.Device, GtWailingFrameX, GtWailingFrameY );\r
1469                                 }\r
1470                                 if ( CDTXMania.DTX.bチップがある.Bass && ( this.txWailing枠 != null ) )\r
1471                                 {\r
1472                                         this.txWailing枠.t2D描画( CDTXMania.app.Device, BsWailingFrameX, BsWailingFrameY );\r
1473                                 }\r
1474                         }\r
1475                 }\r
1476 \r
1477 \r
1478                 protected void t進行描画・チップファイアGB()\r
1479                 {\r
1480                         this.actChipFireGB.On進行描画();\r
1481                 }\r
1482                 protected abstract void t進行描画・パネル文字列();\r
1483                 protected void t進行描画・パネル文字列(int x, int y)\r
1484                 {\r
1485                         if ( ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
1486                         {\r
1487                                 this.actPanel.t進行描画( x, y );\r
1488                         }\r
1489                 }\r
1490                 protected void tパネル文字列の設定()\r
1491                 {\r
1492                         this.actPanel.SetPanelString( string.IsNullOrEmpty( CDTXMania.DTX.PANEL ) ? CDTXMania.DTX.TITLE : CDTXMania.DTX.PANEL );\r
1493                 }\r
1494 \r
1495 \r
1496                 protected void t進行描画・ゲージ()\r
1497                 {\r
1498                         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
1499                         {\r
1500                                 this.actGauge.On進行描画();\r
1501                         }\r
1502                 }\r
1503                 protected void t進行描画・コンボ()\r
1504                 {\r
1505                         this.actCombo.On進行描画();\r
1506                 }\r
1507                 protected void t進行描画・スコア()\r
1508                 {\r
1509                         this.actScore.On進行描画();\r
1510                 }\r
1511                 protected void t進行描画・ステータスパネル()\r
1512                 {\r
1513                         this.actStatusPanels.On進行描画();\r
1514                 }\r
1515                 protected bool t進行描画・チップ( E楽器パート ePlayMode )\r
1516                 {\r
1517                         if ( ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED ) || ( base.eフェーズID == CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
1518                         {\r
1519                                 return true;\r
1520                         }\r
1521                         if ( ( this.n現在のトップChip == -1 ) || ( this.n現在のトップChip >= CDTXMania.DTX.listChip.Count ) )\r
1522                         {\r
1523                                 return true;\r
1524                         }\r
1525                         int nCurrentTopChip = this.n現在のトップChip;\r
1526                         if ( nCurrentTopChip == -1 )\r
1527                         {\r
1528                                 return true;\r
1529                         }\r
1530 \r
1531                         //double speed = 264.0; // BPM150の時の1小節の長さ[dot]\r
1532                         const double speed = 234.0;     // BPM150の時の1小節の長さ[dot]\r
1533 \r
1534                         double ScrollSpeedDrums = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Drums + 1.0 ) * 0.5 * 37.5 * speed / 60000.0;\r
1535                         double ScrollSpeedGuitar = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Guitar + 1.0 ) * 0.5 * 0.5 * 37.5 * speed / 60000.0;\r
1536                         double ScrollSpeedBass = ( this.act譜面スクロール速度.db現在の譜面スクロール速度.Bass + 1.0 ) * 0.5 * 0.5 * 37.5 * speed / 60000.0;\r
1537 \r
1538                         CDTX dTX = CDTXMania.DTX;\r
1539                         CConfigIni configIni = CDTXMania.ConfigIni;\r
1540 //                      while ( nCurrentTopChip < dTX.listChip.Count )\r
1541                         for ( ; nCurrentTopChip < dTX.listChip.Count; nCurrentTopChip++ )\r
1542                         {\r
1543                                 CDTX.CChip pChip = dTX.listChip[ nCurrentTopChip ];\r
1544                                 pChip.nバーからの距離dot.Drums = (int) ( ( pChip.n発声時刻ms - CDTXMania.Timer.n現在時刻 ) * ScrollSpeedDrums );\r
1545                                 pChip.nバーからの距離dot.Guitar = (int) ( ( pChip.n発声時刻ms - CDTXMania.Timer.n現在時刻 ) * ScrollSpeedGuitar );\r
1546                                 pChip.nバーからの距離dot.Bass = (int) ( ( pChip.n発声時刻ms - CDTXMania.Timer.n現在時刻 ) * ScrollSpeedBass );\r
1547                                 if ( Math.Min( Math.Min( pChip.nバーからの距離dot.Drums, pChip.nバーからの距離dot.Guitar ), pChip.nバーからの距離dot.Bass ) > 450 )\r
1548                                 {\r
1549                                         break;\r
1550                                 }\r
1551                                 if ( ( ( nCurrentTopChip == this.n現在のトップChip ) && ( pChip.nバーからの距離dot.Drums < -65 ) ) && pChip.bHit )\r
1552                                 {\r
1553                                         //this.n現在のトップChip++;\r
1554                                         nCurrentTopChip = ++this.n現在のトップChip;\r
1555                                         continue;\r
1556                                 }\r
1557 \r
1558                                 bool bPChipIsAutoPlay = false;\r
1559                                 if ( (\r
1560                                                 ( ( pChip.e楽器パート == E楽器パート.DRUMS ) && bIsAutoPlay[ this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ] ] ) ||\r
1561                                                 ( ( pChip.e楽器パート == E楽器パート.GUITAR ) && bIsAutoPlay.Guitar ) ) ||\r
1562                                                 ( ( pChip.e楽器パート == E楽器パート.BASS ) && bIsAutoPlay.Bass )\r
1563                                   )\r
1564                                 //                              if ((pChip.e楽器パート == E楽器パート.DRUMS) && bIsAutoPlay[this.nチャンネル0Atoレーン07[pChip.nチャンネル番号 - 0x11]])\r
1565                                 {\r
1566                                         bPChipIsAutoPlay = true;\r
1567                                 }\r
1568 \r
1569                                 int nInputAdjustTime = ( bPChipIsAutoPlay || (pChip.e楽器パート == E楽器パート.UNKNOWN) )? 0 : this.nInputAdjustTimeMs[ (int) pChip.e楽器パート ];\r
1570 \r
1571                                 if ( ( ( pChip.e楽器パート != E楽器パート.UNKNOWN ) && !pChip.bHit ) &&\r
1572                                         ( ( pChip.nバーからの距離dot.Drums < 0 ) && ( this.e指定時刻からChipのJUDGEを返す( CDTXMania.Timer.n現在時刻, pChip, nInputAdjustTime ) == E判定.Miss ) ) )\r
1573                                 {\r
1574                                         this.tチップのヒット処理( CDTXMania.Timer.n現在時刻, pChip );\r
1575                                 }\r
1576                                 switch ( pChip.nチャンネル番号 )\r
1577                                 {\r
1578                                         #region [ 01: BGM ]\r
1579                                         case 0x01:      // BGM\r
1580                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1581                                                 {\r
1582                                                         pChip.bHit = true;\r
1583                                                         if ( configIni.bBGM音を発声する )\r
1584                                                         {\r
1585                                                                 dTX.tチップの再生( pChip, CDTXMania.Timer.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int) Eレーン.BGM, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
1586                                                         }\r
1587                                                 }\r
1588                                                 break;\r
1589                                         #endregion\r
1590                                         #region [ 03: BPM変更 ]\r
1591                                         case 0x03:      // BPM変更\r
1592                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1593                                                 {\r
1594                                                         pChip.bHit = true;\r
1595                                                         this.actPlayInfo.dbBPM = ( pChip.n整数値 * ( ( (double) configIni.n演奏速度 ) / 20.0 ) ) + dTX.BASEBPM;\r
1596                                                 }\r
1597                                                 break;\r
1598                                         #endregion\r
1599                                         #region [ 04, 07, 55, 56,57, 58, 59, 60:レイヤーBGA ]\r
1600                                         case 0x04:      // レイヤーBGA\r
1601                                         case 0x07:\r
1602                                         case 0x55:\r
1603                                         case 0x56:\r
1604                                         case 0x57:\r
1605                                         case 0x58:\r
1606                                         case 0x59:\r
1607                                         case 0x60:\r
1608                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1609                                                 {\r
1610                                                         pChip.bHit = true;\r
1611                                                         if ( configIni.bBGA有効 )\r
1612                                                         {\r
1613                                                                 switch ( pChip.eBGA種別 )\r
1614                                                                 {\r
1615                                                                         case EBGA種別.BMPTEX:\r
1616                                                                                 if ( pChip.rBMPTEX != null )\r
1617                                                                                 {\r
1618                                                                                         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
1619                                                                                 }\r
1620                                                                                 break;\r
1621 \r
1622                                                                         case EBGA種別.BGA:\r
1623                                                                                 if ( ( pChip.rBGA != null ) && ( ( pChip.rBMP != null ) || ( pChip.rBMPTEX != null ) ) )\r
1624                                                                                 {\r
1625                                                                                         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
1626                                                                                 }\r
1627                                                                                 break;\r
1628 \r
1629                                                                         case EBGA種別.BGAPAN:\r
1630                                                                                 if ( ( pChip.rBGAPan != null ) && ( ( pChip.rBMP != null ) || ( pChip.rBMPTEX != null ) ) )\r
1631                                                                                 {\r
1632                                                                                         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
1633                                                                                 }\r
1634                                                                                 break;\r
1635 \r
1636                                                                         default:\r
1637                                                                                 if ( pChip.rBMP != null )\r
1638                                                                                 {\r
1639                                                                                         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
1640                                                                                 }\r
1641                                                                                 break;\r
1642                                                                 }\r
1643                                                         }\r
1644                                                 }\r
1645                                                 break;\r
1646                                         #endregion\r
1647                                         #region [ 08: BPM変更(拡張) ]\r
1648                                         case 0x08:      // BPM変更(拡張)\r
1649                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1650                                                 {\r
1651                                                         pChip.bHit = true;\r
1652                                                         if ( dTX.listBPM.ContainsKey( pChip.n整数値・内部番号 ) )\r
1653                                                         {\r
1654                                                                 this.actPlayInfo.dbBPM = ( dTX.listBPM[ pChip.n整数値・内部番号 ].dbBPM値 * ( ( (double) configIni.n演奏速度 ) / 20.0 ) ) + dTX.BASEBPM;\r
1655                                                         }\r
1656                                                 }\r
1657                                                 break;\r
1658                                         #endregion\r
1659                                         #region [ 11-1a: ドラム演奏 ]\r
1660                                         case 0x11:      // ドラム演奏\r
1661                                         case 0x12:\r
1662                                         case 0x13:\r
1663                                         case 0x14:\r
1664                                         case 0x15:\r
1665                                         case 0x16:\r
1666                                         case 0x17:\r
1667                                         case 0x18:\r
1668                                         case 0x19:\r
1669                                         case 0x1a:\r
1670                                                 this.t進行描画・チップ・ドラムス( configIni, ref dTX, ref pChip );\r
1671                                                 break;\r
1672                                         #endregion\r
1673                                         #region [ 1f: フィルインサウンド(ドラム) ]\r
1674                                         case 0x1f:      // フィルインサウンド(ドラム)\r
1675                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1676                                                 {\r
1677                                                         pChip.bHit = true;\r
1678                                                         this.r現在の歓声Chip.Drums = pChip;\r
1679                                                 }\r
1680                                                 break;\r
1681                                         #endregion\r
1682                                         #region [ 20-27: ギター演奏 ]\r
1683                                         case 0x20:      // ギター演奏\r
1684                                         case 0x21:\r
1685                                         case 0x22:\r
1686                                         case 0x23:\r
1687                                         case 0x24:\r
1688                                         case 0x25:\r
1689                                         case 0x26:\r
1690                                         case 0x27:\r
1691                                                 this.t進行描画・チップ・ギター( configIni, ref dTX, ref pChip );\r
1692                                                 break;\r
1693                                         #endregion\r
1694                                         #region [ 28: ウェイリング(ギター) ]\r
1695                                         case 0x28:      // ウェイリング(ギター)\r
1696                                                 this.t進行描画・チップ・ギター・ウェイリング( configIni, ref dTX, ref pChip );\r
1697                                                 break;\r
1698                                         #endregion\r
1699                                         #region [ 2f: ウェイリングサウンド(ギター) ]\r
1700                                         case 0x2f:      // ウェイリングサウンド(ギター)\r
1701                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Guitar < 0 ) )\r
1702                                                 {\r
1703                                                         pChip.bHit = true;\r
1704                                                         this.r現在の歓声Chip.Guitar = pChip;\r
1705                                                 }\r
1706                                                 break;\r
1707                                         #endregion\r
1708                                         #region [ 31-3a: 不可視チップ配置(ドラム) ]\r
1709                                         case 0x31:      // 不可視チップ配置(ドラム)\r
1710                                         case 0x32:\r
1711                                         case 0x33:\r
1712                                         case 0x34:\r
1713                                         case 0x35:\r
1714                                         case 0x36:\r
1715                                         case 0x37:\r
1716                                         case 0x38:\r
1717                                         case 0x39:\r
1718                                         case 0x3a:\r
1719                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1720                                                 {\r
1721                                                         pChip.bHit = true;\r
1722                                                 }\r
1723                                                 break;\r
1724                                         #endregion\r
1725                                         #region [ 50: 小節線 ]\r
1726                                         case 0x50:      // 小節線\r
1727                                                 {\r
1728                                                         this.t進行描画・チップ・小節線( configIni, ref dTX, ref pChip );\r
1729                                                         break;\r
1730                                                 }\r
1731                                         #endregion\r
1732                                         #region [ 51: 拍線 ]\r
1733                                         case 0x51:      // 拍線\r
1734                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1735                                                 {\r
1736                                                         pChip.bHit = true;\r
1737                                                 }\r
1738                                                 if ( ( ePlayMode == E楽器パート.DRUMS ) && ( configIni.eDark != Eダークモード.FULL ) && pChip.b可視 && ( this.txチップ != null ) )\r
1739                                                 {\r
1740                                                         this.txチップ.t2D描画( CDTXMania.app.Device, 0x23, configIni.bReverse.Drums ? ( ( 0x38 + pChip.nバーからの距離dot.Drums ) - 1 ) : ( ( 0x1a6 - pChip.nバーからの距離dot.Drums ) - 1 ), new Rectangle( 0, 0x1bf, 0x128, 1 ) );\r
1741                                                 }\r
1742                                                 break;\r
1743                                         #endregion\r
1744                                         #region [ 52: MIDIコーラス ]\r
1745                                         case 0x52:      // MIDIコーラス\r
1746                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1747                                                 {\r
1748                                                         pChip.bHit = true;\r
1749                                                 }\r
1750                                                 break;\r
1751                                         #endregion\r
1752                                         #region [ 53: フィルイン ]\r
1753                                         case 0x53:      // フィルイン\r
1754                                                 this.t進行描画・チップ・フィルイン( configIni, ref dTX, ref pChip );\r
1755                                                 break;\r
1756                                         #endregion\r
1757                                         #region [ 54: 動画再生 ]\r
1758                                         case 0x54:      // 動画再生\r
1759                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1760                                                 {\r
1761                                                         pChip.bHit = true;\r
1762                                                         if ( configIni.bAVI有効 )\r
1763                                                         {\r
1764                                                                 switch ( pChip.eAVI種別 )\r
1765                                                                 {\r
1766                                                                         case EAVI種別.AVI:\r
1767                                                                                 if ( pChip.rAVI != null )\r
1768                                                                                 {\r
1769                                                                                         this.actAVI.Start( pChip.nチャンネル番号, pChip.rAVI, 0x116, 0x163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, pChip.n発声時刻ms );\r
1770                                                                                 }\r
1771                                                                                 break;\r
1772 \r
1773                                                                         case EAVI種別.AVIPAN:\r
1774                                                                                 if ( pChip.rAVIPan != null )\r
1775                                                                                 {\r
1776                                                                                         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
1777                                                                                 }\r
1778                                                                                 break;\r
1779                                                                 }\r
1780                                                         }\r
1781                                                 }\r
1782                                                 break;\r
1783                                         #endregion\r
1784                                         #region [ 61-92: 自動再生(BGM, SE) ]\r
1785                                         case 0x61:\r
1786                                         case 0x62:\r
1787                                         case 0x63:\r
1788                                         case 0x64:      // 自動再生(BGM, SE)\r
1789                                         case 0x65:\r
1790                                         case 0x66:\r
1791                                         case 0x67:\r
1792                                         case 0x68:\r
1793                                         case 0x69:\r
1794                                         case 0x70:\r
1795                                         case 0x71:\r
1796                                         case 0x72:\r
1797                                         case 0x73:\r
1798                                         case 0x74:\r
1799                                         case 0x75:\r
1800                                         case 0x76:\r
1801                                         case 0x77:\r
1802                                         case 0x78:\r
1803                                         case 0x79:\r
1804                                         case 0x80:\r
1805                                         case 0x81:\r
1806                                         case 0x82:\r
1807                                         case 0x83:\r
1808                                         case 0x90:\r
1809                                         case 0x91:\r
1810                                         case 0x92:\r
1811                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1812                                                 {\r
1813                                                         pChip.bHit = true;\r
1814                                                         if ( configIni.bBGM音を発声する )\r
1815                                                         {\r
1816                                                                 dTX.tWavの再生停止( this.n最後に再生したBGMの実WAV番号[ pChip.nチャンネル番号 - 0x61 ] );\r
1817                                                                 dTX.tチップの再生( pChip, CDTXMania.Timer.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int) Eレーン.BGM, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
1818                                                                 this.n最後に再生したBGMの実WAV番号[ pChip.nチャンネル番号 - 0x61 ] = pChip.n整数値・内部番号;\r
1819                                                         }\r
1820                                                 }\r
1821                                                 break;\r
1822                                         #endregion\r
1823 \r
1824 \r
1825                                         #region [ 84-89: 仮: override sound ]  // #26338 2011.11.8 yyagi\r
1826                                         case 0x84:      // HH (HO/HC)\r
1827                                         case 0x85:      // CY\r
1828                                         case 0x86:      // RD\r
1829                                         case 0x87:      // LC\r
1830                                         case 0x88:      // Guitar\r
1831                                         case 0x89:      // Bass\r
1832                                         // mute sound (auto)\r
1833                                         // 4A: 84: HH (HO/HC)\r
1834                                         // 4B: 85: CY\r
1835                                         // 4C: 86: RD\r
1836                                         // 4D: 87: LC\r
1837                                         // 2A: 88: Gt\r
1838                                         // AA: 89: Bs\r
1839 \r
1840                                         //      CDTXMania.DTX.tWavの再生停止( this.n最後に再生した実WAV番号.Guitar );\r
1841                                         //      CDTXMania.DTX.tチップの再生( pChip, n再生開始システム時刻ms, 8, n音量, bモニタ, b音程をずらして再生 );\r
1842                                         //      this.n最後に再生した実WAV番号.Guitar = pChip.n整数値・内部番号;\r
1843 \r
1844                                         //      protected void tサウンド再生( CDTX.CChip pChip, long n再生開始システム時刻ms, E楽器パート part, int n音量, bool bモニタ, bool b音程をずらして再生 )\r
1845                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1846                                                 {\r
1847                                                         pChip.bHit = true;\r
1848                                                         E楽器パート[] p = { E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.DRUMS, E楽器パート.GUITAR, E楽器パート.BASS };\r
1849 \r
1850                                                         E楽器パート pp =  p[ pChip.nチャンネル番号 - 0x84 ];\r
1851                                                         \r
1852 //                                                      if ( pp == E楽器パート.DRUMS ) {                   // pChip.nチャンネル番号= ..... HHとか、ドラムの場合は変える。\r
1853 //                                                              //            HC    CY    RD    LC\r
1854 //                                                              int[] ch = { 0x11, 0x16, 0x19, 0x1A };\r
1855 //                                                              pChip.nチャンネル番号 = ch[ pChip.nチャンネル番号 - 0x84 ]; \r
1856 //                                                      }\r
1857                                                         this.tサウンド再生( pChip, CDTXMania.Timer.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, pp, dTX.nモニタを考慮した音量( pp ) );\r
1858                                                 }\r
1859                                                 break;\r
1860                                         #endregion\r
1861 \r
1862                                         #region [ a0-a7: ベース演奏 ]\r
1863                                         case 0xa0:      // ベース演奏\r
1864                                         case 0xa1:\r
1865                                         case 0xa2:\r
1866                                         case 0xa3:\r
1867                                         case 0xa4:\r
1868                                         case 0xa5:\r
1869                                         case 0xa6:\r
1870                                         case 0xa7:\r
1871                                                 this.t進行描画・チップ・ベース( configIni, ref dTX, ref pChip );\r
1872                                                 break;\r
1873                                         #endregion\r
1874                                         #region [ a8: ウェイリング(ベース) ]\r
1875                                         case 0xa8:      // ウェイリング(ベース)\r
1876                                                 this.t進行描画・チップ・ベース・ウェイリング( configIni, ref dTX, ref pChip );\r
1877                                                 break;\r
1878                                         #endregion\r
1879                                         #region [ af: ウェイリングサウンド(ベース) ]\r
1880                                         case 0xaf:      // ウェイリングサウンド(ベース)\r
1881                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )\r
1882                                                 {\r
1883                                                         pChip.bHit = true;\r
1884                                                         this.r現在の歓声Chip.Bass = pChip;\r
1885                                                 }\r
1886                                                 break;\r
1887                                         #endregion\r
1888                                         #region [ b1-b9, bc: 空打ち音設定(ドラム) ]\r
1889                                         case 0xb1:      // 空打ち音設定(ドラム)\r
1890                                         case 0xb2:\r
1891                                         case 0xb3:\r
1892                                         case 0xb4:\r
1893                                         case 0xb5:\r
1894                                         case 0xb6:\r
1895                                         case 0xb7:\r
1896                                         case 0xb8:\r
1897                                         case 0xb9:\r
1898                                         case 0xbc:\r
1899                                                 this.t進行描画・チップ・空打ち音設定・ドラム( configIni, ref dTX, ref pChip );\r
1900                                                 break;\r
1901                                         #endregion\r
1902                                         #region [ ba: 空打ち音設定(ギター) ]\r
1903                                         case 0xba:      // 空打ち音設定(ギター)\r
1904                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Guitar < 0 ) )\r
1905                                                 {\r
1906                                                         pChip.bHit = true;\r
1907                                                         this.r現在の空うちギターChip = pChip;\r
1908                                                         pChip.nチャンネル番号 = 0x20;\r
1909                                                 }\r
1910                                                 break;\r
1911                                         #endregion\r
1912                                         #region [ bb: 空打ち音設定(ベース) ]\r
1913                                         case 0xbb:      // 空打ち音設定(ベース)\r
1914                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )\r
1915                                                 {\r
1916                                                         pChip.bHit = true;\r
1917                                                         this.r現在の空うちベースChip = pChip;\r
1918                                                         pChip.nチャンネル番号 = 0xA0;\r
1919                                                 }\r
1920                                                 break;\r
1921                                         #endregion\r
1922                                         #region [ c4, c7, d5-d9, e0: BGA画像入れ替え ]\r
1923                                         case 0xc4:\r
1924                                         case 0xc7:\r
1925                                         case 0xd5:\r
1926                                         case 0xd6:      // BGA画像入れ替え\r
1927                                         case 0xd7:\r
1928                                         case 0xd8:\r
1929                                         case 0xd9:\r
1930                                         case 0xe0:\r
1931                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1932                                                 {\r
1933                                                         pChip.bHit = true;\r
1934                                                         if ( ( configIni.bBGA有効 && ( pChip.eBGA種別 == EBGA種別.BMP ) ) || ( pChip.eBGA種別 == EBGA種別.BMPTEX ) )\r
1935                                                         {\r
1936                                                                 for ( int i = 0; i < 8; i++ )\r
1937                                                                 {\r
1938                                                                         if ( this.nBGAスコープチャンネルマップ[ 0, i ] == pChip.nチャンネル番号 )\r
1939                                                                         {\r
1940                                                                                 this.actBGA.ChangeScope( this.nBGAスコープチャンネルマップ[ 1, i ], pChip.rBMP, pChip.rBMPTEX );\r
1941                                                                         }\r
1942                                                                 }\r
1943                                                         }\r
1944                                                 }\r
1945                                                 break;\r
1946                                         #endregion\r
1947                                         #region [ その他(未定義) ]\r
1948                                         default:\r
1949                                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )\r
1950                                                 {\r
1951                                                         pChip.bHit = true;\r
1952                                                 }\r
1953                                                 break;\r
1954                                         #endregion \r
1955                                 }\r
1956 \r
1957 //                              nCurrentTopChip++;\r
1958                         }\r
1959                         return false;\r
1960                 }\r
1961                 protected abstract void t進行描画・チップ・ドラムス( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
1962                 protected abstract void t進行描画・チップ・ギター( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
1963                 protected virtual void t進行描画・チップ・ギターベース・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst )\r
1964                 {\r
1965                         int indexInst = (int) inst;\r
1966                         if ( configIni.bGuitar有効 )\r
1967                         {\r
1968                                 if ( configIni.bSudden[indexInst] )\r
1969                                 {\r
1970                                         pChip.b可視 = pChip.nバーからの距離dot[indexInst] < 200;\r
1971                                 }\r
1972                                 if ( configIni.bHidden[indexInst] && ( pChip.nバーからの距離dot[indexInst] < 100 ) )\r
1973                                 {\r
1974                                         pChip.b可視 = false;\r
1975                                 }\r
1976                                 //\r
1977                                 // ここにチップ更新処理が入る(overrideで入れる)。といっても座標とチップサイズが違うだけで処理はまるまる同じ。\r
1978                                 //\r
1979                                 if ( !pChip.bHit && ( pChip.nバーからの距離dot[indexInst] < 0 ) )\r
1980                                 {\r
1981                                         if ( pChip.nバーからの距離dot[indexInst] < -234 )        // #25253 2011.5.29 yyagi: Don't set pChip.bHit=true for wailing at once. It need to 1sec-delay (234pix per 1sec). \r
1982                                         {\r
1983                                                 pChip.bHit = true;\r
1984                                         }\r
1985                                         if ( configIni.bAutoPlay[ ((int) Eレーン.Guitar - 1) + indexInst ] ) // このような、バグの入りやすい書き方(GT/BSのindex値が他と異なる)はいずれ見直したい\r
1986                                         {\r
1987                                                 pChip.bHit = true;                                                              // #25253 2011.5.29 yyagi: Set pChip.bHit=true if autoplay.\r
1988                                                 this.actWailingBonus.Start( inst, this.r現在の歓声Chip[indexInst] );\r
1989                                         }\r
1990                                 }\r
1991                                 return;\r
1992                         }\r
1993                         pChip.bHit = true;\r
1994                 }\r
1995                 protected virtual void t進行描画・チップ・ギター・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )\r
1996                 {\r
1997                         t進行描画・チップ・ギターベース・ウェイリング( configIni, ref dTX, ref pChip, E楽器パート.GUITAR );\r
1998                 }\r
1999                 protected abstract void t進行描画・チップ・フィルイン( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2000                 protected abstract void t進行描画・チップ・小節線( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2001                 protected abstract void t進行描画・チップ・ベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2002                 protected virtual void t進行描画・チップ・ベース・ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )\r
2003                 {\r
2004                         t進行描画・チップ・ギターベース・ウェイリング( configIni, ref dTX, ref pChip, E楽器パート.BASS );\r
2005                 }\r
2006                 protected abstract void t進行描画・チップ・空打ち音設定・ドラム( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip );\r
2007                 protected void t進行描画・チップアニメ()\r
2008                 {\r
2009                         for ( int i = 0; i < 3; i++ )                   // drums: 0-3 gt/bs: 1-3\r
2010                         {\r
2011                                 if ( this.ctチップ模様アニメ[ i ] != null )\r
2012                                 {\r
2013                                         this.ctチップ模様アニメ[ i ].t進行Loop();\r
2014                                 }\r
2015                         }\r
2016                         this.ctWailingチップ模様アニメ.t進行Loop();\r
2017                 }\r
2018 \r
2019                 protected bool t進行描画・フェードイン・アウト()\r
2020                 {\r
2021                         switch ( base.eフェーズID )\r
2022                         {\r
2023                                 case CStage.Eフェーズ.共通_フェードイン:\r
2024                                         if ( this.actFI.On進行描画() != 0 )\r
2025                                         {\r
2026                                                 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
2027                                         }\r
2028                                         break;\r
2029 \r
2030                                 case CStage.Eフェーズ.共通_フェードアウト:\r
2031                                 case CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト:\r
2032                                         if ( this.actFO.On進行描画() != 0 )\r
2033                                         {\r
2034                                                 return true;\r
2035                                         }\r
2036                                         break;\r
2037 \r
2038                                 case CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト:\r
2039                                         if ( this.actFOClear.On進行描画() == 0 )\r
2040                                         {\r
2041                                                 break;\r
2042                                         }\r
2043                                         return true;\r
2044                 \r
2045                         }\r
2046                         return false;\r
2047                 }\r
2048                 protected void t進行描画・レーンフラッシュD()\r
2049                 {\r
2050                         if ( ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
2051                         {\r
2052                                 this.actLaneFlushD.On進行描画();\r
2053                         }\r
2054                 }\r
2055                 protected void t進行描画・レーンフラッシュGB()\r
2056                 {\r
2057                         if ( ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF ) && CDTXMania.ConfigIni.bGuitar有効 )\r
2058                         {\r
2059                                 this.actLaneFlushGB.On進行描画();\r
2060                         }\r
2061                 }\r
2062                 protected abstract void t進行描画・演奏情報();\r
2063                 protected void t進行描画・演奏情報(int x, int y)\r
2064                 {\r
2065                         if ( !CDTXMania.ConfigIni.b演奏情報を表示しない )\r
2066                         {\r
2067                                 this.actPlayInfo.t進行描画( x, y );\r
2068                         }\r
2069                 }\r
2070                 protected void t進行描画・背景()\r
2071                 {\r
2072                         if ( CDTXMania.ConfigIni.eDark == Eダークモード.OFF )\r
2073                         {\r
2074                                 if ( this.tx背景 != null )\r
2075                                 {\r
2076                                         this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );\r
2077                                 }\r
2078                         }\r
2079                         else\r
2080                         {\r
2081                                 CDTXMania.app.Device.Clear( ClearFlags.ZBuffer | ClearFlags.Target, Color.Black, 0f, 0 );\r
2082                         }\r
2083                 }\r
2084 \r
2085                 protected void t進行描画・判定ライン()\r
2086                 {\r
2087                         if ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )\r
2088                         {\r
2089                                 int y = CDTXMania.ConfigIni.bReverse.Drums ? 0x35 : 0x1a3;\r
2090                                 for ( int i = 0x20; i < 0x14f; i += 8 )\r
2091                                 {\r
2092                                         if ( this.txヒットバー != null )\r
2093                                         {\r
2094                                                 this.txヒットバー.t2D描画( CDTXMania.app.Device, i, y, new Rectangle( 0, 0, ( ( i + 8 ) >= 0x14f ) ? ( 7 - ( ( i + 8 ) - 0x14f ) ) : 8, 8 ) );\r
2095                                         }\r
2096                                 }\r
2097                         }\r
2098                 }\r
2099                 protected void t進行描画・判定文字列()\r
2100                 {\r
2101                         this.actJudgeString.On進行描画();\r
2102                 }\r
2103                 protected void t進行描画・判定文字列1・通常位置指定の場合()\r
2104                 {\r
2105                         if ( ( (E判定文字表示位置) CDTXMania.ConfigIni.判定文字表示位置.Drums ) != E判定文字表示位置.判定ライン上または横 )\r
2106                         {\r
2107                                 this.actJudgeString.On進行描画();\r
2108                         }\r
2109                 }\r
2110                 protected void t進行描画・判定文字列2・判定ライン上指定の場合()\r
2111                 {\r
2112                         if ( ( (E判定文字表示位置) CDTXMania.ConfigIni.判定文字表示位置.Drums ) == E判定文字表示位置.判定ライン上または横 )\r
2113                         {\r
2114                                 this.actJudgeString.On進行描画();\r
2115                         }\r
2116                 }\r
2117 \r
2118                 protected void t進行描画・譜面スクロール速度()\r
2119                 {\r
2120                         this.act譜面スクロール速度.On進行描画();\r
2121                 }\r
2122 \r
2123                 protected abstract void t背景テクスチャの生成();\r
2124                 protected void t背景テクスチャの生成( string DefaultBgFilename, Rectangle bgrect, string bgfilename )\r
2125                 {\r
2126                         Bitmap image = null;\r
2127                         bool flag = true;\r
2128 \r
2129                         if ( bgfilename != null && File.Exists( bgfilename ) )\r
2130                         {\r
2131                                 try\r
2132                                 {\r
2133                                         Bitmap bitmap2 = null;\r
2134                                         bitmap2 = new Bitmap( bgfilename );\r
2135                                         if ( ( bitmap2.Size.Width == 0 ) && ( bitmap2.Size.Height == 0 ) )\r
2136                                         {\r
2137                                                 this.tx背景 = null;\r
2138                                                 return;\r
2139                                         }\r
2140                                         Bitmap bitmap3 = new Bitmap(SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height);\r
2141                                         Graphics graphics = Graphics.FromImage( bitmap3 );\r
2142                                         for ( int i = 0; i < SampleFramework.GameWindowSize.Height; i += bitmap2.Size.Height )\r
2143                                         {\r
2144                                                 for ( int j = 0; j < SampleFramework.GameWindowSize.Width; j += bitmap2.Size.Width )\r
2145                                                 {\r
2146                                                         graphics.DrawImage( bitmap2, j, i, bitmap2.Width, bitmap2.Height );\r
2147                                                 }\r
2148                                         }\r
2149                                         graphics.Dispose();\r
2150                                         bitmap2.Dispose();\r
2151                                         image = new Bitmap( CSkin.Path( DefaultBgFilename ) );\r
2152                                         graphics = Graphics.FromImage( image );\r
2153                                         ColorMatrix matrix2 = new ColorMatrix();\r
2154                                         matrix2.Matrix00 = 1f;\r
2155                                         matrix2.Matrix11 = 1f;\r
2156                                         matrix2.Matrix22 = 1f;\r
2157                                         matrix2.Matrix33 = ( (float) CDTXMania.ConfigIni.n背景の透過度 ) / 255f;\r
2158                                         matrix2.Matrix44 = 1f;\r
2159                                         ColorMatrix newColorMatrix = matrix2;\r
2160                                         ImageAttributes imageAttr = new ImageAttributes();\r
2161                                         imageAttr.SetColorMatrix( newColorMatrix );\r
2162                                         graphics.DrawImage( bitmap3, new Rectangle( 0, 0, SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height ), 0, 0, SampleFramework.GameWindowSize.Width, SampleFramework.GameWindowSize.Height, GraphicsUnit.Pixel, imageAttr );\r
2163                                         imageAttr.Dispose();\r
2164                                         graphics.DrawImage( bitmap3, bgrect, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height, GraphicsUnit.Pixel );\r
2165                                         graphics.Dispose();\r
2166                                         bitmap3.Dispose();\r
2167                                         flag = false;\r
2168                                 }\r
2169                                 catch\r
2170                                 {\r
2171                                         Trace.TraceError( "背景画像の読み込みに失敗しました。({0})", new object[] { bgfilename } );\r
2172                                 }\r
2173                         }\r
2174                         if ( flag )\r
2175                         {\r
2176                                 bgfilename = CSkin.Path( DefaultBgFilename );\r
2177                                 try\r
2178                                 {\r
2179                                         image = new Bitmap( bgfilename );\r
2180                                 }\r
2181                                 catch\r
2182                                 {\r
2183                                         Trace.TraceError( "背景画像の読み込みに失敗しました。({0})", new object[] { bgfilename } );\r
2184                                         this.tx背景 = null;\r
2185                                         return;\r
2186                                 }\r
2187                         }\r
2188                         if ( ( CDTXMania.DTX.listBMP.Count > 0 ) || ( CDTXMania.DTX.listBMPTEX.Count > 0 ) )\r
2189                         {\r
2190                                 Graphics graphics2 = Graphics.FromImage( image );\r
2191                                 graphics2.FillRectangle( Brushes.Black, bgrect.X, bgrect.Y, bgrect.Width, bgrect.Height );\r
2192                                 graphics2.Dispose();\r
2193                         }\r
2194                         try\r
2195                         {\r
2196                                 this.tx背景 = new CTexture( CDTXMania.app.Device, image, CDTXMania.TextureFormat );\r
2197                         }\r
2198                         catch ( CTextureCreateFailedException )\r
2199                         {\r
2200                                 Trace.TraceError( "背景テクスチャの生成に失敗しました。" );\r
2201                                 this.tx背景 = null;\r
2202                         }\r
2203                         image.Dispose();\r
2204                 }\r
2205 \r
2206                 protected virtual void t入力処理・ギター()\r
2207                 {\r
2208                         t入力処理・ギターベース( E楽器パート.GUITAR );\r
2209                 }\r
2210                 protected virtual void t入力処理・ベース()\r
2211                 {\r
2212                         t入力処理・ギターベース( E楽器パート.BASS );\r
2213                 }\r
2214 \r
2215 \r
2216                 protected virtual void t入力処理・ギターベース(E楽器パート inst)\r
2217                 {\r
2218                         int indexInst = (int) inst;\r
2219                         #region [ スクロール速度変更 ]\r
2220                         if ( CDTXMania.Pad.b押されている( inst, Eパッド.Decide ) && CDTXMania.Pad.b押された( inst, Eパッド.B ) )\r
2221                         {\r
2222                                 CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] = Math.Min( CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] + 1, 0x7cf );\r
2223                         }\r
2224                         if ( CDTXMania.Pad.b押されている( inst, Eパッド.Decide ) && CDTXMania.Pad.b押された( inst, Eパッド.R ) )\r
2225                         {\r
2226                                 CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] = Math.Max( CDTXMania.ConfigIni.n譜面スクロール速度[indexInst] - 1, 0 );\r
2227                         }\r
2228                         #endregion\r
2229 \r
2230                         if ( !CDTXMania.ConfigIni.bGuitar有効 || !CDTXMania.DTX.bチップがある[indexInst] )\r
2231                         {\r
2232                                 return;\r
2233                         }\r
2234 \r
2235                         int R = ( inst == E楽器パート.GUITAR ) ? 0 : 3;\r
2236                         int G = R + 1;\r
2237                         int B = R + 2;\r
2238                         if ( bIsAutoPlay[ (int) Eレーン.Guitar - 1 + indexInst ] )   // このような、バグの入りやすい書き方(GT/BSのindex値が他と異なる)はいずれ見直したい\r
2239                         {\r
2240                                 CDTX.CChip chip = this.r次に来る指定楽器Chipを更新して返す(inst);\r
2241                                 if ( chip != null )\r
2242                                 {\r
2243                                         if ( ( chip.nチャンネル番号 & 4 ) != 0 )\r
2244                                         {\r
2245                                                 this.actLaneFlushGB.Start( R );\r
2246                                                 this.actRGB.Push( R );\r
2247                                         }\r
2248                                         if ( ( chip.nチャンネル番号 & 2 ) != 0 )\r
2249                                         {\r
2250                                                 this.actLaneFlushGB.Start( G );\r
2251                                                 this.actRGB.Push( G );\r
2252                                         }\r
2253                                         if ( ( chip.nチャンネル番号 & 1 ) != 0 )\r
2254                                         {\r
2255                                                 this.actLaneFlushGB.Start( B );\r
2256                                                 this.actRGB.Push( B );\r
2257                                         }\r
2258                                 }\r
2259                         }\r
2260                         else\r
2261                         {\r
2262                                 int flagR = CDTXMania.Pad.b押されている( inst, Eパッド.R ) ? 4 : 0;\r
2263                                 this.t入力メソッド記憶( inst );\r
2264                                 int flagG = CDTXMania.Pad.b押されている( inst, Eパッド.G ) ? 2 : 0;\r
2265                                 this.t入力メソッド記憶( inst );\r
2266                                 int flagB = CDTXMania.Pad.b押されている( inst, Eパッド.B ) ? 1 : 0;\r
2267                                 this.t入力メソッド記憶( inst );\r
2268                                 int flagRGB = flagR | flagG | flagB;\r
2269                                 if ( flagR != 0 )\r
2270                                 {\r
2271                                         this.actLaneFlushGB.Start( R );\r
2272                                         this.actRGB.Push( R );\r
2273                                 }\r
2274                                 if ( flagG != 0 )\r
2275                                 {\r
2276                                         this.actLaneFlushGB.Start( G );\r
2277                                         this.actRGB.Push( G );\r
2278                                 }\r
2279                                 if ( flagB != 0 )\r
2280                                 {\r
2281                                         this.actLaneFlushGB.Start( B );\r
2282                                         this.actRGB.Push( B );\r
2283                                 }\r
2284                                 List<STInputEvent> events = CDTXMania.Pad.GetEvents( inst, Eパッド.Pick );\r
2285                                 if ( ( events != null ) && ( events.Count > 0 ) )\r
2286                                 {\r
2287                                         foreach ( STInputEvent event2 in events )\r
2288                                         {\r
2289                                                 if ( !event2.b押された )\r
2290                                                 {\r
2291                                                         continue;\r
2292                                                 }\r
2293                                                 this.t入力メソッド記憶( inst );\r
2294                                                 long nTime = event2.nTimeStamp - CDTXMania.Timer.n前回リセットした時のシステム時刻;\r
2295                                                 int chWailingSound = ( inst == E楽器パート.GUITAR ) ? 0x2F : 0xAF;\r
2296                                                 CDTX.CChip pChip = this.r指定時刻に一番近い未ヒットChip( nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst] );\r
2297                                                 E判定 e判定 = this.e指定時刻からChipのJUDGEを返す( nTime, pChip, this.nInputAdjustTimeMs[indexInst] );\r
2298                                                 if ( ( ( pChip != null ) && ( ( pChip.nチャンネル番号 & 15 ) == flagRGB ) ) && ( e判定 != E判定.Miss ) )\r
2299                                                 {\r
2300                                                         if ( ( flagR != 0 ) || ( flagRGB == 0 ) )\r
2301                                                         {\r
2302                                                                 this.actChipFireGB.Start( R );\r
2303                                                         }\r
2304                                                         if ( ( flagG != 0 ) || ( flagRGB == 0 ) )\r
2305                                                         {\r
2306                                                                 this.actChipFireGB.Start( G );\r
2307                                                         }\r
2308                                                         if ( ( flagB != 0 ) || ( flagRGB == 0 ) )\r
2309                                                         {\r
2310                                                                 this.actChipFireGB.Start( B );\r
2311                                                         }\r
2312                                                         this.tチップのヒット処理( nTime, pChip );\r
2313                                                         this.tサウンド再生( pChip, CDTXMania.Timer.nシステム時刻, inst, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する[indexInst], e判定 == E判定.Poor );\r
2314                                                         int chWailingChip = ( inst == E楽器パート.GUITAR ) ? 0x28 : 0xA8;\r
2315                                                         CDTX.CChip item = this.r指定時刻に一番近い未ヒットChip( nTime, chWailingChip, this.nInputAdjustTimeMs[ indexInst ], 140 );\r
2316                                                         if ( item != null )\r
2317                                                         {\r
2318                                                                 this.queWailing[indexInst].Enqueue( item );\r
2319                                                         }\r
2320                                                         continue;\r
2321                                                 }\r
2322 \r
2323                                                 CDTX.CChip chipPicked;\r
2324                                                 CDTX.CChip NoChip = ( inst == E楽器パート.GUITAR ) ? this.r現在の空うちギターChip : this.r現在の空うちベースChip;\r
2325                                                 if ( ( ( chipPicked = NoChip) != null ) || ( ( chipPicked = this.r指定時刻に一番近いChip・ヒット未済問わず不可視考慮( nTime, chWailingSound, this.nInputAdjustTimeMs[indexInst] ) ) != null ) )\r
2326                                                 {\r
2327                                                         this.tサウンド再生( chipPicked, CDTXMania.Timer.nシステム時刻, inst, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する[indexInst], true );\r
2328                                                 }\r
2329                                                 if ( !CDTXMania.ConfigIni.bLight[indexInst] )\r
2330                                                 {\r
2331                                                         this.tチップのヒット処理・BadならびにTight時のMiss( inst );\r
2332                                                 }\r
2333                                         }\r
2334                                 }\r
2335                                 List<STInputEvent> list = CDTXMania.Pad.GetEvents(inst, Eパッド.Wail );\r
2336                                 if ( ( list != null ) && ( list.Count > 0 ) )\r
2337                                 {\r
2338                                         foreach ( STInputEvent eventWailed in list )\r
2339                                         {\r
2340                                                 if ( !eventWailed.b押された )\r
2341                                                 {\r
2342                                                         continue;\r
2343                                                 }\r
2344                                                 long nTimeWailed = eventWailed.nTimeStamp - CDTXMania.Timer.n前回リセットした時のシステム時刻;\r
2345                                                 CDTX.CChip chipWailing;\r
2346                                                 while ( ( this.queWailing[indexInst].Count > 0 ) && ( ( chipWailing = this.queWailing[indexInst].Dequeue() ) != null ) )\r
2347                                                 {\r
2348                                                         if ( ( nTimeWailed - chipWailing.n発声時刻ms ) <= 1000 )            // #24245 2011.1.26 yyagi: 800 -> 1000\r
2349                                                         {\r
2350                                                                 chipWailing.bHit = true;\r
2351                                                                 this.actWailingBonus.Start( inst, this.r現在の歓声Chip[indexInst] );\r
2352                                                                 if ( !bIsAutoPlay[indexInst] )\r
2353                                                                 {\r
2354                                                                         int nCombo = ( this.actCombo.n現在のコンボ数[indexInst] < 500 ) ? this.actCombo.n現在のコンボ数[indexInst] : 500;\r
2355                                                                         this.actScore.Set( inst, this.actScore.Get( inst ) + ( nCombo * 3000L ) );              // #24245 2011.1.26 yyagi changed DRUMS->BASS, add nCombo conditions\r
2356                                                                 }\r
2357                                                         }\r
2358                                                 }\r
2359                                         }\r
2360                                 }\r
2361                         }\r
2362                 }\r
2363         #endregion\r
2364         }\r
2365 }\r