OSDN Git Service

896b50b48ffa2f7e8d3881166b217032be3deeb1
[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.InteropServices;\r
5 using System.Drawing;\r
6 using System.Drawing.Imaging;\r
7 using System.IO;\r
8 using System.Diagnostics;\r
9 using SlimDX;\r
10 using SlimDX.Direct3D9;\r
11 using FDK;\r
12 \r
13 namespace DTXMania\r
14 {\r
15         /// <summary>\r
16         /// 演奏画面の共通クラス (ドラム演奏画面, ギター演奏画面の継承元)\r
17         /// </summary>\r
18         internal abstract class CStage演奏画面共通 : CStage\r
19         {\r
20                 // プロパティ\r
21 \r
22                 public bool bAUTOでないチップが1つでもバーを通過した\r
23                 {\r
24                         get;\r
25                         protected set;\r
26                 }\r
27 \r
28 \r
29                 // CStage 実装\r
30 \r
31                 public override void On活性化()\r
32                 {\r
33                         this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.継続;\r
34 \r
35                         this.r次にくるギターChip = null;\r
36                         this.r次にくるベースChip = null;\r
37 \r
38                         for ( int i = 0; i < 3; i++ )\r
39                         {\r
40                                 this.b演奏にキーボードを使った[ i ] = false;\r
41                                 this.b演奏にジョイパッドを使った[ i ] = false;\r
42                                 this.b演奏にMIDI入力を使った[ i ] = false;\r
43                                 this.b演奏にマウスを使った[ i ] = false;\r
44                         }\r
45 \r
46                         base.On活性化();\r
47 \r
48                         this.nInputAdjustTimeMs.Drums = CDTXMania.ConfigIni.nInputAdjustTimeMs.Drums;           // #23580 2011.1.3 yyagi\r
49                         this.nInputAdjustTimeMs.Guitar = CDTXMania.ConfigIni.nInputAdjustTimeMs.Guitar;         //        2011.1.7 ikanick 修正\r
50                         this.nInputAdjustTimeMs.Bass = CDTXMania.ConfigIni.nInputAdjustTimeMs.Bass;                     //\r
51                         //this.bIsAutoPlay.Drums = false;\r
52                         //this.bIsAutoPlay.Guitar = CDTXMania.ConfigIni.bAutoPlay.Guitar;\r
53                         //this.bIsAutoPlay.Bass = CDTXMania.ConfigIni.bAutoPlay.Bass;\r
54                         this.bIsAutoPlay = CDTXMania.ConfigIni.bAutoPlay;                                                                       // #24239 2011.1.23 yyagi\r
55                 }\r
56 \r
57 \r
58 \r
59                 // その他\r
60 \r
61                 #region [ protected ]\r
62                 //-----------------\r
63                 protected class STHITCOUNTOFRANK\r
64                 {\r
65                         // Fields\r
66                         public int Good;\r
67                         public int Great;\r
68                         public int Miss;\r
69                         public int Perfect;\r
70                         public int Poor;\r
71 \r
72                         // Properties\r
73                         public int this[ int index ]\r
74                         {\r
75                                 get\r
76                                 {\r
77                                         switch ( index )\r
78                                         {\r
79                                                 case 0:\r
80                                                         return this.Perfect;\r
81 \r
82                                                 case 1:\r
83                                                         return this.Great;\r
84 \r
85                                                 case 2:\r
86                                                         return this.Good;\r
87 \r
88                                                 case 3:\r
89                                                         return this.Poor;\r
90 \r
91                                                 case 4:\r
92                                                         return this.Miss;\r
93                                         }\r
94                                         throw new IndexOutOfRangeException();\r
95                                 }\r
96                                 set\r
97                                 {\r
98                                         switch ( index )\r
99                                         {\r
100                                                 case 0:\r
101                                                         this.Perfect = value;\r
102                                                         return;\r
103 \r
104                                                 case 1:\r
105                                                         this.Great = value;\r
106                                                         return;\r
107 \r
108                                                 case 2:\r
109                                                         this.Good = value;\r
110                                                         return;\r
111 \r
112                                                 case 3:\r
113                                                         this.Poor = value;\r
114                                                         return;\r
115 \r
116                                                 case 4:\r
117                                                         this.Miss = value;\r
118                                                         return;\r
119                                         }\r
120                                         throw new IndexOutOfRangeException();\r
121                                 }\r
122                         }\r
123                 }\r
124 \r
125                 [StructLayout( LayoutKind.Sequential )]\r
126                 protected struct STKARAUCHI\r
127                 {\r
128                         public CDTX.CChip HH;\r
129                         public CDTX.CChip SD;\r
130                         public CDTX.CChip BD;\r
131                         public CDTX.CChip HT;\r
132                         public CDTX.CChip LT;\r
133                         public CDTX.CChip FT;\r
134                         public CDTX.CChip CY;\r
135                         public CDTX.CChip HHO;\r
136                         public CDTX.CChip RD;\r
137                         public CDTX.CChip LC;\r
138                         public CDTX.CChip this[ int index ]\r
139                         {\r
140                                 get\r
141                                 {\r
142                                         switch ( index )\r
143                                         {\r
144                                                 case 0:\r
145                                                         return this.HH;\r
146 \r
147                                                 case 1:\r
148                                                         return this.SD;\r
149 \r
150                                                 case 2:\r
151                                                         return this.BD;\r
152 \r
153                                                 case 3:\r
154                                                         return this.HT;\r
155 \r
156                                                 case 4:\r
157                                                         return this.LT;\r
158 \r
159                                                 case 5:\r
160                                                         return this.FT;\r
161 \r
162                                                 case 6:\r
163                                                         return this.CY;\r
164 \r
165                                                 case 7:\r
166                                                         return this.HHO;\r
167 \r
168                                                 case 8:\r
169                                                         return this.RD;\r
170 \r
171                                                 case 9:\r
172                                                         return this.LC;\r
173                                         }\r
174                                         throw new IndexOutOfRangeException();\r
175                                 }\r
176                                 set\r
177                                 {\r
178                                         switch ( index )\r
179                                         {\r
180                                                 case 0:\r
181                                                         this.HH = value;\r
182                                                         return;\r
183 \r
184                                                 case 1:\r
185                                                         this.SD = value;\r
186                                                         return;\r
187 \r
188                                                 case 2:\r
189                                                         this.BD = value;\r
190                                                         return;\r
191 \r
192                                                 case 3:\r
193                                                         this.HT = value;\r
194                                                         return;\r
195 \r
196                                                 case 4:\r
197                                                         this.LT = value;\r
198                                                         return;\r
199 \r
200                                                 case 5:\r
201                                                         this.FT = value;\r
202                                                         return;\r
203 \r
204                                                 case 6:\r
205                                                         this.CY = value;\r
206                                                         return;\r
207 \r
208                                                 case 7:\r
209                                                         this.HHO = value;\r
210                                                         return;\r
211 \r
212                                                 case 8:\r
213                                                         this.RD = value;\r
214                                                         return;\r
215 \r
216                                                 case 9:\r
217                                                         this.LC = value;\r
218                                                         return;\r
219                                         }\r
220                                         throw new IndexOutOfRangeException();\r
221                                 }\r
222                         }\r
223                 }\r
224 \r
225                 protected CActFIFOBlack actFI;\r
226                 protected CActFIFOBlack actFO;\r
227                 protected CActFIFOWhite actFOClear;\r
228                 protected CAct演奏ゲージ actGauge;\r
229 \r
230                 protected bool bPAUSE;\r
231                 protected STDGBVALUE<bool> b演奏にMIDI入力を使った;\r
232                 protected STDGBVALUE<bool> b演奏にキーボードを使った;\r
233                 protected STDGBVALUE<bool> b演奏にジョイパッドを使った;\r
234                 protected STDGBVALUE<bool> b演奏にマウスを使った;\r
235 \r
236                 protected E演奏画面の戻り値 eフェードアウト完了時の戻り値;\r
237 \r
238                 protected int n現在のトップChip = -1;\r
239 \r
240                 protected CDTX.CChip r次にくるギターChip;\r
241                 protected CDTX.CChip r次にくるベースChip;\r
242 \r
243 \r
244                 protected STDGBVALUE<int> nInputAdjustTimeMs;           // #23580 2011.1.3 yyagi\r
245                 protected CConfigIni.STAUTOPLAY bIsAutoPlay;            // #24239 2011.1.23 yyagi\r
246 \r
247 \r
248 \r
249 \r
250                 protected E判定 e指定時刻からChipのJUDGEを返す( long nTime, CDTX.CChip pChip, int nInputAdjustTime )\r
251                 {\r
252                         if ( pChip != null )\r
253                         {\r
254                                 pChip.nLag = (int) ( nTime + nInputAdjustTime - pChip.n発声時刻ms );                // #23580 2011.1.3 yyagi: add "nInputAdjustTime" to add input timing adjust feature\r
255                                 int nDeltaTime = Math.Abs( pChip.nLag );\r
256                                 //Debug.WriteLine("nAbsTime=" + (nTime - pChip.n発声時刻ms) + ", nDeltaTime=" + (nTime + nInputAdjustTime - pChip.n発声時刻ms));\r
257                                 if ( nDeltaTime <= CDTXMania.nPerfect範囲ms )\r
258                                 {\r
259                                         return E判定.Perfect;\r
260                                 }\r
261                                 if ( nDeltaTime <= CDTXMania.nGreat範囲ms )\r
262                                 {\r
263                                         return E判定.Great;\r
264                                 }\r
265                                 if ( nDeltaTime <= CDTXMania.nGood範囲ms )\r
266                                 {\r
267                                         return E判定.Good;\r
268                                 }\r
269                                 if ( nDeltaTime <= CDTXMania.nPoor範囲ms )\r
270                                 {\r
271                                         return E判定.Poor;\r
272                                 }\r
273                         }\r
274                         return E判定.Miss;\r
275                 }\r
276 \r
277 \r
278 \r
279                 protected CDTX.CChip r指定時刻に一番近いChip・ヒット未済問わず不可視考慮( long nTime, int nChannelFlag, int nInputAdjustTime )\r
280                 {\r
281                         nTime += nInputAdjustTime;                                              // #24239 2011.1.23 yyagi InputAdjust\r
282 \r
283                         int num5;\r
284                         if ( this.n現在のトップChip == -1 )\r
285                         {\r
286                                 return null;\r
287                         }\r
288                         int count = CDTXMania.DTX.listChip.Count;\r
289                         int num4 = num5 = this.n現在のトップChip;\r
290                         if ( this.n現在のトップChip >= count )\r
291                         {\r
292                                 num4 = num5 = count - 1;\r
293                         }\r
294                         int num2 = num4;\r
295                         while ( num2 < count )\r
296                         {\r
297                                 CDTX.CChip chip = CDTXMania.DTX.listChip[ num2 ];\r
298                                 if ( ( ( nChannelFlag >= 0x11 ) && ( nChannelFlag <= 0x1a ) ) && ( ( chip.nチャンネル番号 == nChannelFlag ) || ( chip.nチャンネル番号 == ( nChannelFlag + 0x20 ) ) ) )\r
299                                 {\r
300                                         if ( chip.n発声時刻ms > nTime )\r
301                                         {\r
302                                                 break;\r
303                                         }\r
304                                         num5 = num2;\r
305                                 }\r
306                                 else if ( ( ( nChannelFlag == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( nChannelFlag >= 0x20 ) && ( nChannelFlag <= 0x28 ) ) && ( chip.nチャンネル番号 == nChannelFlag ) ) )\r
307                                 {\r
308                                         if ( chip.n発声時刻ms > nTime )\r
309                                         {\r
310                                                 break;\r
311                                         }\r
312                                         num5 = num2;\r
313                                 }\r
314                                 else if ( ( ( nChannelFlag == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( nChannelFlag >= 0xa0 ) && ( nChannelFlag <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannelFlag ) ) )\r
315                                 {\r
316                                         if ( chip.n発声時刻ms > nTime )\r
317                                         {\r
318                                                 break;\r
319                                         }\r
320                                         num5 = num2;\r
321                                 }\r
322                                 num2++;\r
323                         }\r
324                         int num3 = num5;\r
325                         while ( num3 >= 0 )\r
326                         {\r
327                                 CDTX.CChip chip2 = CDTXMania.DTX.listChip[ num3 ];\r
328                                 if ( ( nChannelFlag >= 0x11 ) && ( nChannelFlag <= 0x1a ) )\r
329                                 {\r
330                                         if ( ( chip2.nチャンネル番号 == nChannelFlag ) || ( chip2.nチャンネル番号 == ( nChannelFlag + 0x20 ) ) )\r
331                                         {\r
332                                                 break;\r
333                                         }\r
334                                 }\r
335                                 else if ( ( ( nChannelFlag == 0x2f ) && ( chip2.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( nChannelFlag >= 0x20 ) && ( nChannelFlag <= 0x28 ) ) && ( chip2.nチャンネル番号 == nChannelFlag ) ) )\r
336                                 {\r
337                                         if ( ( chip2.nチャンネル番号 >= 0x20 ) && ( chip2.nチャンネル番号 <= 0x28 ) )\r
338                                         {\r
339                                                 break;\r
340                                         }\r
341                                 }\r
342                                 else if ( ( ( ( nChannelFlag == 0xaf ) && ( chip2.e楽器パート == E楽器パート.BASS ) ) || ( ( ( nChannelFlag >= 0xa0 ) && ( nChannelFlag <= 0xa8 ) ) && ( chip2.nチャンネル番号 == nChannelFlag ) ) ) && ( ( chip2.nチャンネル番号 >= 0xa0 ) && ( chip2.nチャンネル番号 <= 0xa8 ) ) )\r
343                                 {\r
344                                         break;\r
345                                 }\r
346                                 num3--;\r
347                         }\r
348                         if ( ( num2 == count ) && ( num3 < 0 ) )\r
349                         {\r
350                                 return null;\r
351                         }\r
352                         if ( num2 == count )\r
353                         {\r
354                                 return CDTXMania.DTX.listChip[ num3 ];\r
355                         }\r
356                         if ( num3 < 0 )\r
357                         {\r
358                                 return CDTXMania.DTX.listChip[ num2 ];\r
359                         }\r
360                         CDTX.CChip chip3 = CDTXMania.DTX.listChip[ num2 ];\r
361                         CDTX.CChip chip4 = CDTXMania.DTX.listChip[ num3 ];\r
362                         int num6 = Math.Abs( (int) ( nTime - chip3.n発声時刻ms ) );\r
363                         int num7 = Math.Abs( (int) ( nTime - chip4.n発声時刻ms ) );\r
364                         if ( num6 >= num7 )\r
365                         {\r
366                                 return chip4;\r
367                         }\r
368                         return chip3;\r
369                 }\r
370 \r
371                 protected CDTX.CChip r指定時刻に一番近い未ヒットChip( long nTime, int nChannelFlag, int nInputAdjustTime, int n検索範囲時間ms )\r
372                 {\r
373                         nTime += nInputAdjustTime;\r
374 \r
375                         int num5;\r
376                         int num6;\r
377                         if ( this.n現在のトップChip == -1 )\r
378                         {\r
379                                 return null;\r
380                         }\r
381                         int count = CDTXMania.DTX.listChip.Count;\r
382                         int num4 = num5 = this.n現在のトップChip;\r
383                         if ( this.n現在のトップChip >= count )\r
384                         {\r
385                                 num4 = num5 = count - 1;\r
386                         }\r
387                         int num2 = num4;\r
388                         while ( num2 < count )\r
389                         {\r
390                                 CDTX.CChip chip = CDTXMania.DTX.listChip[ num2 ];\r
391                                 if ( ( !chip.bHit && ( nChannelFlag >= 0x11 ) ) && ( nChannelFlag <= 0x1a ) )\r
392                                 {\r
393                                         if ( ( chip.nチャンネル番号 == nChannelFlag ) || ( chip.nチャンネル番号 == ( nChannelFlag + 0x20 ) ) )\r
394                                         {\r
395                                                 if ( chip.n発声時刻ms > nTime )\r
396                                                 {\r
397                                                         break;\r
398                                                 }\r
399                                                 num5 = num2;\r
400                                         }\r
401                                 }\r
402                                 else if ( !chip.bHit && ( ( ( nChannelFlag == 0x2f ) && ( chip.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( nChannelFlag >= 0x20 ) && ( nChannelFlag <= 40 ) ) && ( chip.nチャンネル番号 == nChannelFlag ) ) ) )\r
403                                 {\r
404                                         if ( chip.n発声時刻ms > nTime )\r
405                                         {\r
406                                                 break;\r
407                                         }\r
408                                         num5 = num2;\r
409                                 }\r
410                                 else if ( !chip.bHit && ( ( ( nChannelFlag == 0xaf ) && ( chip.e楽器パート == E楽器パート.BASS ) ) || ( ( ( nChannelFlag >= 160 ) && ( nChannelFlag <= 0xa8 ) ) && ( chip.nチャンネル番号 == nChannelFlag ) ) ) )\r
411                                 {\r
412                                         if ( chip.n発声時刻ms > nTime )\r
413                                         {\r
414                                                 break;\r
415                                         }\r
416                                         num5 = num2;\r
417                                 }\r
418                                 num2++;\r
419                         }\r
420                         int num3 = num5;\r
421                         while ( num3 >= 0 )\r
422                         {\r
423                                 CDTX.CChip chip2 = CDTXMania.DTX.listChip[ num3 ];\r
424                                 if ( ( ( ( !chip2.bHit && ( nChannelFlag >= 0x11 ) ) && ( ( nChannelFlag <= 0x1a ) && ( ( chip2.nチャンネル番号 == nChannelFlag ) || ( chip2.nチャンネル番号 == ( nChannelFlag + 0x20 ) ) ) ) ) || ( !chip2.bHit && ( ( ( nChannelFlag == 0x2f ) && ( chip2.e楽器パート == E楽器パート.GUITAR ) ) || ( ( ( nChannelFlag >= 0x20 ) && ( nChannelFlag <= 40 ) ) && ( chip2.nチャンネル番号 == nChannelFlag ) ) ) ) ) || ( !chip2.bHit && ( ( ( nChannelFlag == 0xaf ) && ( chip2.e楽器パート == E楽器パート.BASS ) ) || ( ( ( nChannelFlag >= 160 ) && ( nChannelFlag <= 0xa8 ) ) && ( chip2.nチャンネル番号 == nChannelFlag ) ) ) ) )\r
425                                 {\r
426                                         break;\r
427                                 }\r
428                                 num3--;\r
429                         }\r
430                         if ( ( num2 == count ) && ( num3 < 0 ) )\r
431                         {\r
432                                 return null;\r
433                         }\r
434                         CDTX.CChip chip3 = null;\r
435                         if ( num2 == count )\r
436                         {\r
437                                 chip3 = CDTXMania.DTX.listChip[ num3 ];\r
438                                 num6 = Math.Abs( (int) ( nTime - chip3.n発声時刻ms ) );\r
439                         }\r
440                         else if ( num3 < 0 )\r
441                         {\r
442                                 chip3 = CDTXMania.DTX.listChip[ num2 ];\r
443                                 num6 = Math.Abs( (int) ( nTime - chip3.n発声時刻ms ) );\r
444                         }\r
445                         else\r
446                         {\r
447                                 int num7 = Math.Abs( (int) ( nTime - CDTXMania.DTX.listChip[ num2 ].n発声時刻ms ) );\r
448                                 int num8 = Math.Abs( (int) ( nTime - CDTXMania.DTX.listChip[ num3 ].n発声時刻ms ) );\r
449                                 if ( num7 < num8 )\r
450                                 {\r
451                                         chip3 = CDTXMania.DTX.listChip[ num2 ];\r
452                                         num6 = Math.Abs( (int) ( nTime - chip3.n発声時刻ms ) );\r
453                                 }\r
454                                 else\r
455                                 {\r
456                                         chip3 = CDTXMania.DTX.listChip[ num3 ];\r
457                                         num6 = Math.Abs( (int) ( nTime - chip3.n発声時刻ms ) );\r
458                                 }\r
459                         }\r
460                         if ( ( n検索範囲時間ms > 0 ) && ( num6 > n検索範囲時間ms ) )\r
461                         {\r
462                                 return null;\r
463                         }\r
464                         return chip3;\r
465                 }\r
466                 protected CDTX.CChip r次にくるギターChipを更新して返す()\r
467                 {\r
468                         int nInputAdjustTime = this.bIsAutoPlay.Guitar ? 0 : this.nInputAdjustTimeMs.Guitar;\r
469                         this.r次にくるギターChip = this.r指定時刻に一番近い未ヒットChip( CDTXMania.Timer.n現在時刻, 0x2f, nInputAdjustTime, 500 );\r
470                         return this.r次にくるギターChip;\r
471                 }\r
472                 protected CDTX.CChip r次にくるベースChipを更新して返す()\r
473                 {\r
474                         int nInputAdjustTime = this.bIsAutoPlay.Bass ? 0 : this.nInputAdjustTimeMs.Bass;\r
475                         this.r次にくるベースChip = this.r指定時刻に一番近い未ヒットChip( CDTXMania.Timer.n現在時刻, 0xaf, nInputAdjustTime, 500 );\r
476                         return this.r次にくるベースChip;\r
477                 }\r
478 \r
479                 protected void ChangeInputAdjustTimeInPlaying( IInputDevice keyboard, int plusminus )           // #23580 2011.1.16 yyagi UI for InputAdjustTime in playing screen.\r
480                 {\r
481                         int part, offset = plusminus;\r
482                         if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) )      // Guitar InputAdjustTime\r
483                         {\r
484                                 part = (int) E楽器パート.GUITAR;\r
485                         }\r
486                         else if ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftAlt ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightAlt ) )     // Bass InputAdjustTime\r
487                         {\r
488                                 part = (int) E楽器パート.BASS;\r
489                         }\r
490                         else    // Drums InputAdjustTime\r
491                         {\r
492                                 part = (int) E楽器パート.DRUMS;\r
493                         }\r
494                         if ( !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) && !keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) )\r
495                         {\r
496                                 offset *= 10;\r
497                         }\r
498 \r
499                         this.nInputAdjustTimeMs[ part ] += offset;\r
500                         if ( this.nInputAdjustTimeMs[ part ] > 0 )\r
501                         {\r
502                                 this.nInputAdjustTimeMs[ part ] = 0;\r
503                         }\r
504                         else if ( this.nInputAdjustTimeMs[ part ] < -99 )\r
505                         {\r
506                                 this.nInputAdjustTimeMs[ part ] = -99;\r
507                         }\r
508                         CDTXMania.ConfigIni.nInputAdjustTimeMs[ part ] = this.nInputAdjustTimeMs[ part ];\r
509                 }\r
510 \r
511                 protected abstract void t入力処理・ドラム();\r
512                 protected abstract void t入力処理・ギター();\r
513                 protected abstract void t入力処理・ベース();\r
514                 protected abstract void ドラムスクロール速度アップ();\r
515                 protected abstract void ドラムスクロール速度ダウン();\r
516                 protected void tキー入力()\r
517                 {\r
518                         IInputDevice keyboard = CDTXMania.Input管理.Keyboard;\r
519                         if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.F1 ) &&\r
520                                 ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )\r
521                         {       // shift+f1 (pause)\r
522                                 this.bPAUSE = !this.bPAUSE;\r
523                                 if ( this.bPAUSE )\r
524                                 {\r
525                                         CDTXMania.Timer.t一時停止();\r
526                                         CDTXMania.DTX.t全チップの再生一時停止();\r
527                                 }\r
528                                 else\r
529                                 {\r
530                                         CDTXMania.Timer.t再開();\r
531                                         CDTXMania.DTX.t全チップの再生再開();\r
532                                 }\r
533                         }\r
534                         if ( ( !this.bPAUSE && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED ) ) && ( base.eフェーズID != CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト ) )\r
535                         {\r
536                                 this.t入力処理・ドラム();\r
537                                 this.t入力処理・ギター();\r
538                                 this.t入力処理・ベース();\r
539                                 if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )\r
540                                 {       // shift (+ctrl) + UpArrow (BGMAdjust)\r
541                                         CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? 1 : 10 );\r
542                                         CDTXMania.DTX.tWave再生位置自動補正();\r
543                                 }\r
544                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) && ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) )\r
545                                 {       // shift + DownArrow (BGMAdjust)\r
546                                         CDTXMania.DTX.t各自動再生音チップの再生時刻を変更する( ( keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftControl ) || keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightControl ) ) ? -1 : -10 );\r
547                                         CDTXMania.DTX.tWave再生位置自動補正();\r
548                                 }\r
549                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.UpArrow ) )\r
550                                 {       // UpArrow(scrollspeed up)\r
551                                         ドラムスクロール速度アップ();\r
552                                 }\r
553                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.DownArrow ) )\r
554                                 {       // DownArrow (scrollspeed down)\r
555                                         ドラムスクロール速度ダウン();\r
556                                 }\r
557                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Delete ) )\r
558                                 {       // del (debug info)\r
559                                         CDTXMania.ConfigIni.b演奏情報を表示する = !CDTXMania.ConfigIni.b演奏情報を表示する;\r
560                                 }\r
561                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.LeftArrow ) )           // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.\r
562                                 {\r
563                                         ChangeInputAdjustTimeInPlaying( keyboard, -1 );\r
564                                 }\r
565                                 else if ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.RightArrow ) )          // #24243 2011.1.16 yyagi UI for InputAdjustTime in playing screen.\r
566                                 {\r
567                                         ChangeInputAdjustTimeInPlaying( keyboard, +1 );\r
568                                 }\r
569                                 else if ( ( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 ) && ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Escape ) || CDTXMania.Pad.b押されたGB( Eパッド.FT ) ) )\r
570                                 {       // escape (exit)\r
571                                         this.actFO.tフェードアウト開始();\r
572                                         base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;\r
573                                         this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.演奏中断;\r
574                                 }\r
575                         }\r
576                 }\r
577 \r
578                 protected void t入力メソッド記憶( E楽器パート part )\r
579                 {\r
580                         if ( CDTXMania.Pad.st検知したデバイス.Keyboard )\r
581                         {\r
582                                 this.b演奏にキーボードを使った[ (int) part ] = true;\r
583                         }\r
584                         if ( CDTXMania.Pad.st検知したデバイス.Joypad )\r
585                         {\r
586                                 this.b演奏にジョイパッドを使った[ (int) part ] = true;\r
587                         }\r
588                         if ( CDTXMania.Pad.st検知したデバイス.MIDIIN )\r
589                         {\r
590                                 this.b演奏にMIDI入力を使った[ (int) part ] = true;\r
591                         }\r
592                         if ( CDTXMania.Pad.st検知したデバイス.Mouse )\r
593                         {\r
594                                 this.b演奏にマウスを使った[ (int) part ] = true;\r
595                         }\r
596                 }\r
597 \r
598 \r
599 \r
600 \r
601                 protected bool t進行描画・フェードイン・アウト()\r
602                 {\r
603                         switch ( base.eフェーズID )\r
604                         {\r
605                                 case CStage.Eフェーズ.共通_フェードイン:\r
606                                         if ( this.actFI.On進行描画() != 0 )\r
607                                         {\r
608                                                 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
609                                         }\r
610                                         break;\r
611 \r
612                                 case CStage.Eフェーズ.共通_フェードアウト:\r
613                                 case CStage.Eフェーズ.演奏_STAGE_FAILED_フェードアウト:\r
614                                         if ( this.actFO.On進行描画() != 0 )\r
615                                         {\r
616                                                 return true;\r
617                                         }\r
618                                         break;\r
619 \r
620                                 case CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト:\r
621                                         if ( this.actFOClear.On進行描画() == 0 )\r
622                                         {\r
623                                                 break;\r
624                                         }\r
625                                         return true;\r
626                 \r
627                         }\r
628                         return false;\r
629                 }               \r
630 \r
631         \r
632                 \r
633 \r
634 #if true                // DAMAGELEVELTUNING\r
635 #region [ DAMAGELEVELTUNING ]\r
636                 // ----------------------------------\r
637                 public float[ , ] fDamageGaugeDelta = {                 // #23625 2011.1.10 ickw_284: tuned damage/recover factors\r
638                         // drums,   guitar,  bass\r
639                         {  0.004f,  0.006f,  0.006f  },\r
640                         {  0.002f,  0.003f,  0.003f  },\r
641                         {  0.000f,  0.000f,  0.000f  },\r
642                         { -0.020f, -0.030f,     -0.030f  },\r
643                         { -0.050f, -0.050f, -0.050f  }\r
644                 };\r
645                 public float[] fDamageLevelFactor = {\r
646                         0.5f, 1.0f, 1.5f\r
647                 };\r
648                 // ----------------------------------\r
649 #endregion\r
650 #endif\r
651 \r
652                 protected void t判定にあわせてゲージを増減する( E楽器パート screenmode, E楽器パート part, E判定 e今回の判定 )\r
653                 {\r
654                         double fDamage;\r
655 \r
656 #if true        // DAMAGELEVELTUNING\r
657                         switch ( e今回の判定 )\r
658                         {\r
659                                 case E判定.Perfect:\r
660                                 case E判定.Great:\r
661                                 case E判定.Good:\r
662                                 case E判定.Poor:\r
663                                         fDamage = fDamageGaugeDelta[ (int) e今回の判定, (int) part ];\r
664                                         break;\r
665                                 case E判定.Miss:\r
666                                         fDamage = fDamageGaugeDelta[ (int) e今回の判定, (int) part ];\r
667                                         switch ( CDTXMania.ConfigIni.eダメージレベル )\r
668                                         {\r
669                                                 case Eダメージレベル.少ない:\r
670                                                 case Eダメージレベル.普通:\r
671                                                 case Eダメージレベル.大きい:\r
672                                                         fDamage *= fDamageLevelFactor[ (int) CDTXMania.ConfigIni.eダメージレベル ];\r
673                                                         break;\r
674                                         }\r
675                                         break;\r
676 \r
677                                 default:\r
678                                         fDamage = 0.0f;\r
679                                         break;\r
680                         }\r
681 #else                                                                                                   // before applying #23625 modifications\r
682                         switch (e今回の判定)\r
683                         {\r
684                                 case E判定.Perfect:\r
685                                         fDamage = ( part == E楽器パート.DRUMS ) ? 0.01 : 0.015;\r
686                                         break;\r
687 \r
688                                 case E判定.Great:\r
689                                         fDamage = ( part == E楽器パート.DRUMS ) ? 0.006 : 0.009;\r
690                                         break;\r
691 \r
692                                 case E判定.Good:\r
693                                         fDamage = ( part == E楽器パート.DRUMS ) ? 0.002 : 0.003;\r
694                                         break;\r
695 \r
696                                 case E判定.Poor:\r
697                                         fDamage = ( part == E楽器パート.DRUMS ) ? 0.0 : 0.0;\r
698                                         break;\r
699 \r
700                                 case E判定.Miss:\r
701                                         fDamage = ( part == E楽器パート.DRUMS ) ? -0.035 : -0.035;\r
702                                         switch( CDTXMania.ConfigIni.eダメージレベル )\r
703                                         {\r
704                                                 case Eダメージレベル.少ない:\r
705                                                         fDamage *= 0.6;\r
706                                                         break;\r
707 \r
708                                                 case Eダメージレベル.普通:\r
709                                                         fDamage *= 1.0;\r
710                                                         break;\r
711 \r
712                                                 case Eダメージレベル.大きい:\r
713                                                         fDamage *= 1.6;\r
714                                                         break;\r
715                                         }\r
716                                         break;\r
717 \r
718                                 default:\r
719                                         fDamage = 0.0;\r
720                                         break;\r
721                         }\r
722 #endif\r
723                         if ( screenmode == E楽器パート.DRUMS )                     // ドラム演奏画面なら、ギター/ベースのダメージも全部ドラムのゲージに集約する\r
724                         {\r
725                                 part = E楽器パート.DRUMS;\r
726                         }\r
727                         this.actGauge.db現在のゲージ値[ (int) part ] += fDamage;\r
728 \r
729                         if ( this.actGauge.db現在のゲージ値[ (int) part ] > 1.0 )\r
730                                 this.actGauge.db現在のゲージ値[ (int) part ] = 1.0;\r
731                 }\r
732                 //-----------------\r
733                 #endregion\r
734         }\r
735 }\r