2 using System.Collections.Generic;
\r
4 using System.Runtime.InteropServices;
\r
5 using System.Drawing;
\r
6 using System.Drawing.Imaging;
\r
8 using System.Diagnostics;
\r
9 using System.Threading;
\r
11 using SlimDX.Direct3D9;
\r
16 internal class CStage演奏ドラム画面 : CStage演奏画面共通
\r
20 public CStage演奏ドラム画面()
\r
22 base.eステージID = CStage.Eステージ.演奏;
\r
23 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
24 base.b活性化してない = true;
\r
25 base.list子Activities.Add( this.actPad = new CAct演奏Drumsパッド() );
\r
26 base.list子Activities.Add( this.actCombo = new CAct演奏DrumsコンボDGB() );
\r
27 base.list子Activities.Add( this.actDANGER = new CAct演奏DrumsDanger() );
\r
28 base.list子Activities.Add( this.actChipFireD = new CAct演奏DrumsチップファイアD() );
\r
29 base.list子Activities.Add( this.actChipFireGB = new CAct演奏DrumsチップファイアGB());
\r
30 base.list子Activities.Add( this.actGauge = new CAct演奏Drumsゲージ() );
\r
31 base.list子Activities.Add( this.actGraph = new CAct演奏Drumsグラフ() ); // #24074 2011.01.23 add ikanick
\r
32 base.list子Activities.Add( this.actJudgeString = new CAct演奏Drums判定文字列() );
\r
33 base.list子Activities.Add( this.actLaneFlushD = new CAct演奏DrumsレーンフラッシュD() );
\r
34 base.list子Activities.Add( this.actLaneFlushGB = new CAct演奏DrumsレーンフラッシュGB() );
\r
35 base.list子Activities.Add( this.actRGB = new CAct演奏DrumsRGB() );
\r
36 base.list子Activities.Add( this.actScore = new CAct演奏Drumsスコア() );
\r
37 base.list子Activities.Add( this.actStatusPanels = new CAct演奏Drumsステータスパネル() );
\r
38 base.list子Activities.Add( this.actWailingBonus = new CAct演奏DrumsWailingBonus() );
\r
39 base.list子Activities.Add( this.act譜面スクロール速度 = new CAct演奏スクロール速度() );
\r
40 base.list子Activities.Add( this.actAVI = new CAct演奏AVI() );
\r
41 base.list子Activities.Add( this.actBGA = new CAct演奏BGA() );
\r
42 base.list子Activities.Add( this.actPanel = new CAct演奏パネル文字列() );
\r
43 base.list子Activities.Add( this.actStageFailed = new CAct演奏ステージ失敗() );
\r
44 base.list子Activities.Add( this.actPlayInfo = new CAct演奏演奏情報() );
\r
45 base.list子Activities.Add( this.actFI = new CActFIFOBlack() );
\r
46 base.list子Activities.Add( this.actFO = new CActFIFOBlack() );
\r
47 base.list子Activities.Add( this.actFOClear = new CActFIFOWhite() );
\r
53 public void t演奏結果を格納する( out CScoreIni.C演奏記録 Drums, out CScoreIni.C演奏記録 Guitar, out CScoreIni.C演奏記録 Bass, out CDTX.CChip[] r空打ちドラムチップ )
\r
55 base.t演奏結果を格納する_ドラム( out Drums );
\r
56 base.t演奏結果を格納する_ギター( out Guitar );
\r
57 base.t演奏結果を格納する_ベース( out Bass );
\r
59 r空打ちドラムチップ = new CDTX.CChip[ 10 ];
\r
60 for ( int i = 0; i < 10; i++ )
\r
62 r空打ちドラムチップ[ i ] = this.r空うちChip( E楽器パート.DRUMS, (Eパッド) i );
\r
63 if( r空打ちドラムチップ[ i ] == null )
\r
65 r空打ちドラムチップ[ i ] = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( CSound管理.rc演奏用タイマ.n現在時刻, this.nパッド0Atoチャンネル0A[ i ], this.nInputAdjustTimeMs.Drums );
\r
69 // if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.24 yyagi Gt/Bsを入れ替えていたなら、演奏結果も入れ替える
\r
71 // CScoreIni.C演奏記録 t;
\r
76 // CDTXMania.DTX.SwapGuitarBassInfos(); // 譜面情報も元に戻す
\r
83 public override void On活性化()
\r
85 this.bフィルイン中 = false;
\r
88 // MODIFY_BEGIN #25398 2011.06.07 FROM
\r
89 if( CDTXMania.bコンパクトモード )
\r
91 var score = new Cスコア();
\r
92 CDTXMania.Songs管理.tScoreIniを読み込んで譜面情報を設定する( CDTXMania.strコンパクトモードファイル + ".score.ini", ref score );
\r
93 this.actGraph.dbグラフ値目標_渡 = score.譜面情報.最大スキル[ 0 ];
\r
97 this.actGraph.dbグラフ値目標_渡 = CDTXMania.stage選曲.r確定されたスコア.譜面情報.最大スキル[ 0 ]; // #24074 2011.01.23 add ikanick
\r
99 // #35411 2015.08.21 chnmr0 add
\r
100 // ゴースト利用可のなとき、0で初期化
\r
101 if (CDTXMania.ConfigIni.eTargetGhost.Drums != ETargetGhostData.NONE)
\r
103 if (CDTXMania.listTargetGhsotLag[(int)E楽器パート.DRUMS] != null)
\r
105 this.actGraph.dbグラフ値目標_渡 = 0;
\r
109 // MODIFY_END #25398
\r
110 dtLastQueueOperation = DateTime.MinValue;
\r
112 public override void On非活性化()
\r
116 public override void OnManagedリソースの作成()
\r
118 if( !base.b活性化してない )
\r
120 //this.t背景テクスチャの生成();
\r
121 this.txチップ = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenPlayDrums chips.png" ) );
\r
122 this.txヒットバー = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenPlayDrums hit-bar.png" ) );
\r
123 this.txヒットバーGB = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenPlayDrums hit-bar guitar.png" ) );
\r
124 //this.txWailing枠 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenPlay wailing cursor.png" ) );
\r
125 this.txレーンフレームGB = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenPlayDrums lane parts guitar.png" ) );
\r
126 if( this.txレーンフレームGB != null )
\r
128 this.txレーンフレームGB.n透明度 = 0xff - CDTXMania.ConfigIni.n背景の透過度;
\r
130 base.OnManagedリソースの作成();
\r
133 public override void OnManagedリソースの解放()
\r
135 if( !base.b活性化してない )
\r
137 //CDTXMania.tテクスチャの解放( ref this.tx背景 );
\r
138 CDTXMania.tテクスチャの解放( ref this.txヒットバー );
\r
139 CDTXMania.tテクスチャの解放( ref this.txヒットバーGB );
\r
140 CDTXMania.tテクスチャの解放( ref this.txチップ );
\r
141 CDTXMania.tテクスチャの解放( ref this.txレーンフレームGB );
\r
142 //CDTXMania.tテクスチャの解放( ref this.txWailing枠 );
\r
143 base.OnManagedリソースの解放();
\r
146 public override int On進行描画()
\r
149 if( !base.b活性化してない )
\r
151 bool bIsFinishedPlaying = false;
\r
152 bool bIsFinishedFadeout = false;
\r
153 #region [ 初めての進行描画 ]
\r
154 if ( base.b初めての進行描画 )
\r
156 CSound管理.rc演奏用タイマ.tリセット();
\r
157 CDTXMania.Timer.tリセット();
\r
158 this.ctチップ模様アニメ.Drums = new CCounter( 0, 0x30, 10, CDTXMania.Timer );
\r
159 this.ctチップ模様アニメ.Guitar = new CCounter( 0, 0x17, 20, CDTXMania.Timer );
\r
160 this.ctチップ模様アニメ.Bass = new CCounter( 0, 0x17, 20, CDTXMania.Timer );
\r
161 this.ctWailingチップ模様アニメ = new CCounter( 0, 4, 50, CDTXMania.Timer );
\r
163 // this.actChipFireD.Start( Eレーン.HH ); // #31554 2013.6.12 yyagi
\r
164 // 初チップヒット時のもたつき回避。最初にactChipFireD.Start()するときにJITが掛かって?
\r
165 // ものすごく待たされる(2回目以降と比べると2,3桁tick違う)。そこで最初の画面フェードインの間に
\r
166 // 一発Start()を掛けてJITの結果を生成させておく。
\r
168 base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;
\r
169 this.actFI.tフェードイン開始();
\r
171 if ( CDTXMania.DTXVmode.Enabled ) // DTXVモードなら
\r
173 #region [ DTXV用の再生設定にする(全AUTOなど) ]
\r
176 t演奏位置の変更( CDTXMania.DTXVmode.nStartBar );
\r
179 CDTXMania.Sound管理.tDisableUpdateBufferAutomatically();
\r
180 base.b初めての進行描画 = false;
\r
183 if ( ( CDTXMania.ConfigIni.bSTAGEFAILED有効 && this.actGauge.IsFailed( E楽器パート.DRUMS ) ) && ( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 ) )
\r
185 this.actStageFailed.Start();
\r
186 CDTXMania.DTX.t全チップの再生停止();
\r
187 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_FAILED;
\r
191 this.t進行描画_MIDIBGM();
\r
192 this.t進行描画_パネル文字列();
\r
195 this.t進行描画_ステータスパネル();
\r
196 this.t進行描画_ギターベースフレーム();
\r
197 this.t進行描画_レーンフラッシュGB();
\r
198 this.t進行描画_ギターベース判定ライン();
\r
200 this.t進行描画_グラフ(); // #24074 2011.01.23 add ikanick
\r
201 this.t進行描画_レーンフラッシュD();
\r
202 this.t進行描画_DANGER();
\r
203 this.t進行描画_判定ライン();
\r
204 if ( this.e判定表示優先度 == E判定表示優先度.Chipより下 )
\r
206 this.t進行描画_RGBボタン();
\r
207 this.t進行描画_判定文字列1_通常位置指定の場合();
\r
210 this.t進行描画_WailingBonus();
\r
211 this.t進行描画_譜面スクロール速度();
\r
212 this.t進行描画_チップアニメ();
\r
213 bIsFinishedPlaying = this.t進行描画_チップ(E楽器パート.DRUMS);
\r
215 this.t進行描画_ドラムパッド();
\r
216 if ( this.e判定表示優先度 == E判定表示優先度.Chipより上 )
\r
218 this.t進行描画_RGBボタン();
\r
219 this.t進行描画_判定文字列1_通常位置指定の場合();
\r
222 this.t進行描画_判定文字列2_判定ライン上指定の場合();
\r
223 this.t進行描画_Wailing枠();
\r
224 this.t進行描画_チップファイアD();
\r
225 this.t進行描画_チップファイアGB();
\r
226 this.t進行描画_STAGEFAILED();
\r
227 bIsFinishedFadeout = this.t進行描画_フェードイン_アウト();
\r
228 if( bIsFinishedPlaying && ( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 ) )
\r
230 if ( CDTXMania.DTXVmode.Enabled )
\r
232 if ( CDTXMania.Timer.b停止していない )
\r
234 this.actPanel.Stop(); // PANEL表示停止
\r
235 CDTXMania.Timer.t一時停止(); // 再生時刻カウンタ停止
\r
238 // DTXCからの次のメッセージを待ち続ける
\r
242 this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージクリア;
\r
243 base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト;
\r
244 this.actFOClear.tフェードアウト開始();
\r
247 if ( this.eフェードアウト完了時の戻り値 == E演奏画面の戻り値.再読込_再演奏)
\r
249 bIsFinishedFadeout = true;
\r
251 if( bIsFinishedFadeout )
\r
253 Debug.WriteLine( "Total On進行描画=" + sw.ElapsedMilliseconds + "ms" );
\r
254 return (int) this.eフェードアウト完了時の戻り値;
\r
257 ManageMixerQueue();
\r
261 if( CDTXMania.act現在入力を占有中のプラグイン == null )
\r
270 #region [ private ]
\r
271 //-----------------
\r
273 private CAct演奏DrumsチップファイアD actChipFireD;
\r
274 private CAct演奏Drumsグラフ actGraph; // #24074 2011.01.23 add ikanick
\r
275 private CAct演奏Drumsパッド actPad;
\r
276 private bool bフィルイン中;
\r
277 private readonly Eパッド[] eチャンネルtoパッド = new Eパッド[]
\r
279 Eパッド.HH, Eパッド.SD, Eパッド.BD, Eパッド.HT,
\r
280 Eパッド.LT, Eパッド.CY, Eパッド.FT, Eパッド.HHO,
\r
283 private readonly int[] nチャンネルtoX座標 = new int[] { 76, 110, 145, 192, 226, 294, 260, 79, 300, 35 };
\r
284 private CTexture txヒットバーGB;
\r
285 private CTexture txレーンフレームGB;
\r
286 //-----------------
\r
288 private bool bフィルイン区間の最後のChipである( CDTX.CChip pChip )
\r
290 if( pChip == null )
\r
294 int num = pChip.n発声位置;
\r
295 for( int i = listChip.IndexOf( pChip ) + 1; i < listChip.Count; i++ )
\r
297 pChip = listChip[ i ];
\r
298 if( ( pChip.nチャンネル番号 == 0x53 ) && ( pChip.n整数値 == 2 ) )
\r
302 if( ( ( pChip.nチャンネル番号 >= 0x11 ) && ( pChip.nチャンネル番号 <= 0x19 ) ) && ( ( pChip.n発声位置 - num ) > 0x18 ) )
\r
310 protected override E判定 tチップのヒット処理( long nHitTime, CDTX.CChip pChip, bool bCorrectLane )
\r
312 E判定 eJudgeResult = tチップのヒット処理( nHitTime, pChip, E楽器パート.DRUMS, bCorrectLane );
\r
313 // #24074 2011.01.23 add ikanick
\r
314 this.actGraph.dbグラフ値現在_渡 = CScoreIni.t演奏型スキルを計算して返す( CDTXMania.DTX.n可視チップ数.Drums, this.nヒット数_Auto含まない.Drums.Perfect, this.nヒット数_Auto含まない.Drums.Great, this.nヒット数_Auto含まない.Drums.Good, this.nヒット数_Auto含まない.Drums.Poor, this.nヒット数_Auto含まない.Drums.Miss, E楽器パート.DRUMS, bIsAutoPlay );
\r
315 // #35411 2015.09.07 add chnmr0
\r
316 if( CDTXMania.listTargetGhsotLag.Drums != null &&
\r
317 CDTXMania.ConfigIni.eTargetGhost.Drums == ETargetGhostData.ONLINE &&
\r
318 CDTXMania.DTX.n可視チップ数.Drums > 0 )
\r
320 // Online Stats の計算式
\r
321 this.actGraph.dbグラフ値現在_渡 = 100 *
\r
322 (this.nヒット数_Auto含まない.Drums.Perfect * 17 +
\r
323 this.nヒット数_Auto含まない.Drums.Great * 7 +
\r
324 this.actCombo.n現在のコンボ数.Drums最高値 * 3) / (20.0 * CDTXMania.DTX.n可視チップ数.Drums);
\r
326 return eJudgeResult;
\r
329 protected override void tチップのヒット処理_BadならびにTight時のMiss( E楽器パート part )
\r
331 this.tチップのヒット処理_BadならびにTight時のMiss( part, 0, E楽器パート.DRUMS );
\r
333 protected override void tチップのヒット処理_BadならびにTight時のMiss( E楽器パート part, int nLane )
\r
335 this.tチップのヒット処理_BadならびにTight時のMiss( part, nLane, E楽器パート.DRUMS );
\r
338 private bool tドラムヒット処理( long nHitTime, Eパッド type, CDTX.CChip pChip, int n強弱度合い0to127 )
\r
340 if( pChip == null )
\r
344 int index = pChip.nチャンネル番号;
\r
345 if ( ( index >= 0x11 ) && ( index <= 0x1a ) )
\r
349 else if ( ( index >= 0x31 ) && ( index <= 0x3a ) )
\r
353 int nLane = this.nチャンネル0Atoレーン07[ index ];
\r
354 int nPad = this.nチャンネル0Atoパッド08[ index ];
\r
355 bool bPChipIsAutoPlay = bIsAutoPlay[ nLane ];
\r
356 int nInputAdjustTime = bPChipIsAutoPlay ? 0 : this.nInputAdjustTimeMs.Drums;
\r
357 E判定 e判定 = this.e指定時刻からChipのJUDGEを返す( nHitTime, pChip, nInputAdjustTime );
\r
358 if( e判定 == E判定.Miss )
\r
362 this.tチップのヒット処理( nHitTime, pChip );
\r
363 this.actLaneFlushD.Start( (Eレーン) nLane, ( (float) n強弱度合い0to127 ) / 127f );
\r
364 this.actPad.Hit( nPad );
\r
365 if( ( e判定 != E判定.Poor ) && ( e判定 != E判定.Miss ) )
\r
367 bool flag = this.bフィルイン中;
\r
368 bool flag2 = this.bフィルイン中 && this.bフィルイン区間の最後のChipである( pChip );
\r
369 // bool flag3 = flag2;
\r
370 // #31602 2013.6.24 yyagi 判定ラインの表示位置をずらしたら、チップのヒットエフェクトの表示もずらすために、nJudgeLine..を追加
\r
371 this.actChipFireD.Start( (Eレーン)nLane, flag, flag2, flag2, 演奏判定ライン座標.nJudgeLinePosY_delta.Drums );
\r
373 if( CDTXMania.ConfigIni.bドラム打音を発声する )
\r
375 CDTX.CChip rChip = null;
\r
376 bool bIsChipsoundPriorToPad = true;
\r
377 if( ( ( type == Eパッド.HH ) || ( type == Eパッド.HHO ) ) || ( type == Eパッド.LC ) )
\r
379 bIsChipsoundPriorToPad = CDTXMania.ConfigIni.eHitSoundPriorityHH == E打ち分け時の再生の優先順位.ChipがPadより優先;
\r
381 else if( ( type == Eパッド.LT ) || ( type == Eパッド.FT ) )
\r
383 bIsChipsoundPriorToPad = CDTXMania.ConfigIni.eHitSoundPriorityFT == E打ち分け時の再生の優先順位.ChipがPadより優先;
\r
385 else if( ( type == Eパッド.CY ) || ( type == Eパッド.RD ) )
\r
387 bIsChipsoundPriorToPad = CDTXMania.ConfigIni.eHitSoundPriorityCY == E打ち分け時の再生の優先順位.ChipがPadより優先;
\r
389 if( bIsChipsoundPriorToPad )
\r
396 if( !CDTXMania.DTX.bチップがある.HHOpen && ( type == Eパッド.HHO ) )
\r
400 if( !CDTXMania.DTX.bチップがある.Ride && ( type == Eパッド.RD ) )
\r
404 if( !CDTXMania.DTX.bチップがある.LeftCymbal && ( type == Eパッド.LC ) )
\r
408 rChip = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nHitTime, this.nパッド0Atoチャンネル0A[ (int) hH ], nInputAdjustTime );
\r
409 if( rChip == null )
\r
414 this.tサウンド再生( rChip, CSound管理.rc演奏用タイマ.nシステム時刻, E楽器パート.DRUMS, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する.Drums );
\r
419 protected override void ドラムスクロール速度アップ()
\r
421 CDTXMania.ConfigIni.n譜面スクロール速度.Drums = Math.Min( CDTXMania.ConfigIni.n譜面スクロール速度.Drums + 1, 1999 );
\r
423 protected override void ドラムスクロール速度ダウン()
\r
425 CDTXMania.ConfigIni.n譜面スクロール速度.Drums = Math.Max( CDTXMania.ConfigIni.n譜面スクロール速度.Drums - 1, 0 );
\r
429 protected override void t進行描画_AVI()
\r
431 base.t進行描画_AVI( 1153, 128 );
\r
433 protected override void t進行描画_BGA()
\r
435 base.t進行描画_BGA( 1153, 128 );
\r
437 protected override void t進行描画_DANGER()
\r
439 // this.actDANGER.t進行描画( this.actGauge.db現在のゲージ値.Drums < 0.3, false, false );
\r
440 this.actDANGER.t進行描画( this.actGauge.IsDanger(E楽器パート.DRUMS), false, false );
\r
443 protected override void t進行描画_Wailing枠()
\r
445 int yG = this.演奏判定ライン座標.n判定ラインY座標( E楽器パート.GUITAR, false, bReverse[ (int) E楽器パート.GUITAR ], true );
\r
446 int yB = this.演奏判定ライン座標.n判定ラインY座標( E楽器パート.BASS, false, bReverse[ (int) E楽器パート.BASS ], true );
\r
447 base.t進行描画_Wailing枠(
\r
448 (int) ( 587 * Scale.X ),
\r
449 (int) ( 478 * Scale.X ),
\r
452 // CDTXMania.ConfigIni.bReverse.Guitar ? ( 400 - this.txWailing枠.sz画像サイズ.Height ) : 69, // 350:69
\r
453 // CDTXMania.ConfigIni.bReverse.Bass ? ( 400 - this.txWailing枠.sz画像サイズ.Height ) : 69 // 350:69
\r
456 private void t進行描画_ギターベースフレーム()
\r
458 if( ( ( CDTXMania.ConfigIni.eDark != Eダークモード.HALF ) && ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL ) ) && CDTXMania.ConfigIni.bGuitar有効 )
\r
460 if( CDTXMania.DTX.bチップがある.Guitar )
\r
462 for ( int i = 0; i < 355; i += 0x80 )
\r
464 Rectangle rectangle = new Rectangle( 0, 0, (int) ( 0x6d * Scale.X ), (int) ( 0x80 * Scale.Y ) );
\r
465 if ( ( i + 0x80 ) > 355 )
\r
467 rectangle.Height -= (int) ( ( i + 0x80 - 355 ) * Scale.Y );
\r
469 if ( this.txレーンフレームGB != null )
\r
471 this.txレーンフレームGB.t2D描画(
\r
472 CDTXMania.app.Device,
\r
474 ( 0x39 + i ) * Scale.Y,
\r
480 if( CDTXMania.DTX.bチップがある.Bass )
\r
482 for ( int j = 0; j < 355; j += 0x80 )
\r
484 Rectangle rectangle2 = new Rectangle( 0, 0, (int) ( 0x6d * Scale.X ), (int) ( 0x80 * Scale.Y ) );
\r
485 if ( ( j + 0x80 ) > 355 )
\r
487 rectangle2.Height -= (int) ( ( j + 0x80 - 355 ) * Scale.Y );
\r
489 if ( this.txレーンフレームGB != null )
\r
491 this.txレーンフレームGB.t2D描画( CDTXMania.app.Device,
\r
493 ( 0x39 + j ) * Scale.Y,
\r
501 private void t進行描画_ギターベース判定ライン() // yyagi: ギタレボモードとは座標が違うだけですが、まとめづらかったのでそのまま放置してます。
\r
503 if ( ( CDTXMania.ConfigIni.eDark != Eダークモード.FULL ) && CDTXMania.ConfigIni.bGuitar有効 )
\r
505 if ( CDTXMania.DTX.bチップがある.Guitar )
\r
507 int y = this.演奏判定ライン座標.n判定ラインY座標( E楽器パート.GUITAR, false, bReverse[ (int) E楽器パート.GUITAR ] ) - (int)(3 * Scale.Y);
\r
508 // #31602 2013.6.23 yyagi 描画遅延対策として、判定ラインの表示位置をオフセット調整できるようにする
\r
509 if ( this.txヒットバーGB != null )
\r
511 for ( int i = 0; i < 3; i++ )
\r
513 this.txヒットバーGB.t2D描画( CDTXMania.app.Device,
\r
514 ( 509 + ( 26 * i ) ) * Scale.X,
\r
517 this.txヒットバーGB.t2D描画( CDTXMania.app.Device,
\r
518 ( ( 509 + ( 26 * i ) ) + 16 ) * Scale.X,
\r
520 new Rectangle( 0, 0, (int) ( 10 * Scale.X ), (int) ( 16 * Scale.Y ) ) );
\r
524 if ( CDTXMania.DTX.bチップがある.Bass )
\r
526 int y = this.演奏判定ライン座標.n判定ラインY座標( E楽器パート.BASS, false, bReverse[ (int) E楽器パート.BASS ] ) - (int)(3 * Scale.Y);
\r
527 // #31602 2013.6.23 yyagi 描画遅延対策として、判定ラインの表示位置をオフセット調整できるようにする
\r
528 if ( this.txヒットバーGB != null )
\r
530 for ( int j = 0; j < 3; j++ )
\r
532 this.txヒットバーGB.t2D描画( CDTXMania.app.Device,
\r
533 ( 400 + ( 26 * j ) ) * Scale.X,
\r
535 this.txヒットバーGB.t2D描画( CDTXMania.app.Device,
\r
536 ( ( 400 + ( 26 * j ) ) + 16 ) * Scale.X,
\r
538 new Rectangle( 0, 0, (int) ( 10 * Scale.X ), (int) ( 16 * Scale.Y ) ) );
\r
545 private void t進行描画_グラフ()
\r
547 if ( !CDTXMania.ConfigIni.bストイックモード && !CDTXMania.ConfigIni.bドラムが全部オートプレイである && CDTXMania.ConfigIni.bGraph.Drums )
\r
549 this.actGraph.On進行描画();
\r
553 private void t進行描画_チップファイアD()
\r
555 this.actChipFireD.On進行描画();
\r
558 private void t進行描画_ドラムパッド()
\r
560 if( CDTXMania.ConfigIni.eDark != Eダークモード.FULL )
\r
562 this.actPad.On進行描画();
\r
565 protected override void t進行描画_パネル文字列()
\r
567 base.t進行描画_パネル文字列( 336, 427+1 );
\r
570 protected override void t進行描画_演奏情報()
\r
572 base.t進行描画_演奏情報( 338, 57 );
\r
575 protected override void t入力処理_ドラム()
\r
577 for( int nPad = 0; nPad < (int) Eパッド.MAX; nPad++ ) // #27029 2012.1.4 from: <10 to <=10; Eパッドの要素が1つ(HP)増えたため。
\r
578 // 2012.1.5 yyagi: (int)Eパッド.MAX に変更。Eパッドの要素数への依存を無くすため。
\r
580 List<STInputEvent> listInputEvent = CDTXMania.Pad.GetEvents( E楽器パート.DRUMS, (Eパッド) nPad );
\r
582 if( ( listInputEvent == null ) || ( listInputEvent.Count == 0 ) )
\r
585 this.t入力メソッド記憶( E楽器パート.DRUMS );
\r
587 #region [ 打ち分けグループ調整 ]
\r
588 //-----------------------------
\r
589 EHHGroup eHHGroup = CDTXMania.ConfigIni.eHHGroup;
\r
590 EFTGroup eFTGroup = CDTXMania.ConfigIni.eFTGroup;
\r
591 ECYGroup eCYGroup = CDTXMania.ConfigIni.eCYGroup;
\r
593 if( !CDTXMania.DTX.bチップがある.Ride && ( eCYGroup == ECYGroup.打ち分ける ) )
\r
595 eCYGroup = ECYGroup.共通;
\r
597 if( !CDTXMania.DTX.bチップがある.HHOpen && ( eHHGroup == EHHGroup.全部打ち分ける ) )
\r
599 eHHGroup = EHHGroup.左シンバルのみ打ち分ける;
\r
601 if( !CDTXMania.DTX.bチップがある.HHOpen && ( eHHGroup == EHHGroup.ハイハットのみ打ち分ける ) )
\r
603 eHHGroup = EHHGroup.全部共通;
\r
605 if( !CDTXMania.DTX.bチップがある.LeftCymbal && ( eHHGroup == EHHGroup.全部打ち分ける ) )
\r
607 eHHGroup = EHHGroup.ハイハットのみ打ち分ける;
\r
609 if( !CDTXMania.DTX.bチップがある.LeftCymbal && ( eHHGroup == EHHGroup.左シンバルのみ打ち分ける ) )
\r
611 eHHGroup = EHHGroup.全部共通;
\r
613 //-----------------------------
\r
616 foreach( STInputEvent inputEvent in listInputEvent )
\r
618 if( !inputEvent.b押された )
\r
621 long nTime = inputEvent.nTimeStamp - CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻;
\r
622 int nPad09 = ( nPad == (int) Eパッド.HP ) ? (int) Eパッド.BD : nPad; // #27029 2012.1.5 yyagi
\r
623 int nInputAdjustTime = bIsAutoPlay[ this.nチャンネル0Atoレーン07[ (int) nPad09 ] ] ? 0 : nInputAdjustTimeMs.Drums;
\r
625 bool bHitted = false;
\r
627 #region [ (A) ヒットしていればヒット処理して次の inputEvent へ ]
\r
628 //-----------------------------
\r
629 switch( ( (Eパッド) nPad ) )
\r
632 #region [ HHとLC(groupingしている場合) のヒット処理 ]
\r
633 //-----------------------------
\r
635 if( inputEvent.nVelocity <= CDTXMania.ConfigIni.nVelocityMin.HH )
\r
636 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
638 CDTX.CChip chipHC = this.r指定時刻に一番近い未ヒットChip( nTime, 0x11, nInputAdjustTime ); // HiHat Close
\r
639 CDTX.CChip chipHO = this.r指定時刻に一番近い未ヒットChip( nTime, 0x18, nInputAdjustTime ); // HiHat Open
\r
640 CDTX.CChip chipLC = this.r指定時刻に一番近い未ヒットChip( nTime, 0x1a, nInputAdjustTime ); // LC
\r
641 E判定 e判定HC = ( chipHC != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipHC, nInputAdjustTime ) : E判定.Miss;
\r
642 E判定 e判定HO = ( chipHO != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipHO, nInputAdjustTime ) : E判定.Miss;
\r
643 E判定 e判定LC = ( chipLC != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipLC, nInputAdjustTime ) : E判定.Miss;
\r
646 case EHHGroup.ハイハットのみ打ち分ける:
\r
647 #region [ HCとLCのヒット処理 ]
\r
648 //-----------------------------
\r
649 if( ( e判定HC != E判定.Miss ) && ( e判定LC != E判定.Miss ) )
\r
651 if( chipHC.n発声位置 < chipLC.n発声位置 )
\r
653 this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );
\r
655 else if( chipHC.n発声位置 > chipLC.n発声位置 )
\r
657 this.tドラムヒット処理( nTime, Eパッド.HH, chipLC, inputEvent.nVelocity );
\r
661 this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );
\r
662 this.tドラムヒット処理( nTime, Eパッド.HH, chipLC, inputEvent.nVelocity );
\r
666 else if( e判定HC != E判定.Miss )
\r
668 this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );
\r
671 else if( e判定LC != E判定.Miss )
\r
673 this.tドラムヒット処理( nTime, Eパッド.HH, chipLC, inputEvent.nVelocity );
\r
679 //-----------------------------
\r
682 case EHHGroup.左シンバルのみ打ち分ける:
\r
683 #region [ HCとHOのヒット処理 ]
\r
684 //-----------------------------
\r
685 if( ( e判定HC != E判定.Miss ) && ( e判定HO != E判定.Miss ) )
\r
687 if( chipHC.n発声位置 < chipHO.n発声位置 )
\r
689 this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );
\r
691 else if( chipHC.n発声位置 > chipHO.n発声位置 )
\r
693 this.tドラムヒット処理( nTime, Eパッド.HH, chipHO, inputEvent.nVelocity );
\r
697 this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );
\r
698 this.tドラムヒット処理( nTime, Eパッド.HH, chipHO, inputEvent.nVelocity );
\r
702 else if( e判定HC != E判定.Miss )
\r
704 this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );
\r
707 else if( e判定HO != E判定.Miss )
\r
709 this.tドラムヒット処理( nTime, Eパッド.HH, chipHO, inputEvent.nVelocity );
\r
715 //-----------------------------
\r
718 case EHHGroup.全部共通:
\r
719 #region [ HC,HO,LCのヒット処理 ]
\r
720 //-----------------------------
\r
721 if( ( ( e判定HC != E判定.Miss ) && ( e判定HO != E判定.Miss ) ) && ( e判定LC != E判定.Miss ) )
\r
724 CDTX.CChip[] chipArray = new CDTX.CChip[] { chipHC, chipHO, chipLC };
\r
725 // ここから、chipArrayをn発生位置の小さい順に並び替える
\r
726 if( chipArray[ 1 ].n発声位置 > chipArray[ 2 ].n発声位置 )
\r
728 chip = chipArray[ 1 ];
\r
729 chipArray[ 1 ] = chipArray[ 2 ];
\r
730 chipArray[ 2 ] = chip;
\r
732 if( chipArray[ 0 ].n発声位置 > chipArray[ 1 ].n発声位置 )
\r
734 chip = chipArray[ 0 ];
\r
735 chipArray[ 0 ] = chipArray[ 1 ];
\r
736 chipArray[ 1 ] = chip;
\r
738 if( chipArray[ 1 ].n発声位置 > chipArray[ 2 ].n発声位置 )
\r
740 chip = chipArray[ 1 ];
\r
741 chipArray[ 1 ] = chipArray[ 2 ];
\r
742 chipArray[ 2 ] = chip;
\r
744 this.tドラムヒット処理( nTime, Eパッド.HH, chipArray[ 0 ], inputEvent.nVelocity );
\r
745 if( chipArray[ 0 ].n発声位置 == chipArray[ 1 ].n発声位置 )
\r
747 this.tドラムヒット処理( nTime, Eパッド.HH, chipArray[ 1 ], inputEvent.nVelocity );
\r
749 if( chipArray[ 0 ].n発声位置 == chipArray[ 2 ].n発声位置 )
\r
751 this.tドラムヒット処理( nTime, Eパッド.HH, chipArray[ 2 ], inputEvent.nVelocity );
\r
755 else if( ( e判定HC != E判定.Miss ) && ( e判定HO != E判定.Miss ) )
\r
757 if( chipHC.n発声位置 < chipHO.n発声位置 )
\r
759 this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );
\r
761 else if( chipHC.n発声位置 > chipHO.n発声位置 )
\r
763 this.tドラムヒット処理( nTime, Eパッド.HH, chipHO, inputEvent.nVelocity );
\r
767 this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );
\r
768 this.tドラムヒット処理( nTime, Eパッド.HH, chipHO, inputEvent.nVelocity );
\r
772 else if( ( e判定HC != E判定.Miss ) && ( e判定LC != E判定.Miss ) )
\r
774 if( chipHC.n発声位置 < chipLC.n発声位置 )
\r
776 this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );
\r
778 else if( chipHC.n発声位置 > chipLC.n発声位置 )
\r
780 this.tドラムヒット処理( nTime, Eパッド.HH, chipLC, inputEvent.nVelocity );
\r
784 this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );
\r
785 this.tドラムヒット処理( nTime, Eパッド.HH, chipLC, inputEvent.nVelocity );
\r
789 else if( ( e判定HO != E判定.Miss ) && ( e判定LC != E判定.Miss ) )
\r
791 if( chipHO.n発声位置 < chipLC.n発声位置 )
\r
793 this.tドラムヒット処理( nTime, Eパッド.HH, chipHO, inputEvent.nVelocity );
\r
795 else if( chipHO.n発声位置 > chipLC.n発声位置 )
\r
797 this.tドラムヒット処理( nTime, Eパッド.HH, chipLC, inputEvent.nVelocity );
\r
801 this.tドラムヒット処理( nTime, Eパッド.HH, chipHO, inputEvent.nVelocity );
\r
802 this.tドラムヒット処理( nTime, Eパッド.HH, chipLC, inputEvent.nVelocity );
\r
806 else if( e判定HC != E判定.Miss )
\r
808 this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );
\r
811 else if( e判定HO != E判定.Miss )
\r
813 this.tドラムヒット処理( nTime, Eパッド.HH, chipHO, inputEvent.nVelocity );
\r
816 else if( e判定LC != E判定.Miss )
\r
818 this.tドラムヒット処理( nTime, Eパッド.HH, chipLC, inputEvent.nVelocity );
\r
824 //-----------------------------
\r
828 #region [ 全部打ち分け時のヒット処理 ]
\r
829 //-----------------------------
\r
830 if( e判定HC != E判定.Miss )
\r
832 this.tドラムヒット処理( nTime, Eパッド.HH, chipHC, inputEvent.nVelocity );
\r
838 //-----------------------------
\r
845 //-----------------------------
\r
849 #region [ SDのヒット処理 ]
\r
850 //-----------------------------
\r
851 if( inputEvent.nVelocity <= CDTXMania.ConfigIni.nVelocityMin.SD ) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
852 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
853 if( !this.tドラムヒット処理( nTime, Eパッド.SD, this.r指定時刻に一番近い未ヒットChip( nTime, 0x12, nInputAdjustTime ), inputEvent.nVelocity ) )
\r
856 //-----------------------------
\r
860 #region [ BDのヒット処理 ]
\r
861 //-----------------------------
\r
862 if( inputEvent.nVelocity <= CDTXMania.ConfigIni.nVelocityMin.BD ) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
863 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
864 if( !this.tドラムヒット処理( nTime, Eパッド.BD, this.r指定時刻に一番近い未ヒットChip( nTime, 0x13, nInputAdjustTime ), inputEvent.nVelocity ) )
\r
867 //-----------------------------
\r
871 #region [ HTのヒット処理 ]
\r
872 //-----------------------------
\r
873 if( inputEvent.nVelocity <= CDTXMania.ConfigIni.nVelocityMin.HT ) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
874 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
875 if( this.tドラムヒット処理( nTime, Eパッド.HT, this.r指定時刻に一番近い未ヒットChip( nTime, 20, nInputAdjustTime ), inputEvent.nVelocity ) )
\r
878 //-----------------------------
\r
882 #region [ LTとFT(groupingしている場合)のヒット処理 ]
\r
883 //-----------------------------
\r
885 if( inputEvent.nVelocity <= CDTXMania.ConfigIni.nVelocityMin.LT ) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
886 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
887 CDTX.CChip chipLT = this.r指定時刻に一番近い未ヒットChip( nTime, 0x15, nInputAdjustTime ); // LT
\r
888 CDTX.CChip chipFT = this.r指定時刻に一番近い未ヒットChip( nTime, 0x17, nInputAdjustTime ); // FT
\r
889 E判定 e判定LT = ( chipLT != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipLT, nInputAdjustTime ) : E判定.Miss;
\r
890 E判定 e判定FT = ( chipFT != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipFT, nInputAdjustTime ) : E判定.Miss;
\r
893 case EFTGroup.打ち分ける:
\r
894 #region [ LTのヒット処理 ]
\r
895 //-----------------------------
\r
896 if( e判定LT != E判定.Miss )
\r
898 this.tドラムヒット処理( nTime, Eパッド.LT, chipLT, inputEvent.nVelocity );
\r
902 //-----------------------------
\r
906 #region [ LTとFTのヒット処理 ]
\r
907 //-----------------------------
\r
908 if( ( e判定LT != E判定.Miss ) && ( e判定FT != E判定.Miss ) )
\r
910 if( chipLT.n発声位置 < chipFT.n発声位置 )
\r
912 this.tドラムヒット処理( nTime, Eパッド.LT, chipLT, inputEvent.nVelocity );
\r
914 else if( chipLT.n発声位置 > chipFT.n発声位置 )
\r
916 this.tドラムヒット処理( nTime, Eパッド.LT, chipFT, inputEvent.nVelocity );
\r
920 this.tドラムヒット処理( nTime, Eパッド.LT, chipLT, inputEvent.nVelocity );
\r
921 this.tドラムヒット処理( nTime, Eパッド.LT, chipFT, inputEvent.nVelocity );
\r
925 else if( e判定LT != E判定.Miss )
\r
927 this.tドラムヒット処理( nTime, Eパッド.LT, chipLT, inputEvent.nVelocity );
\r
930 else if( e判定FT != E判定.Miss )
\r
932 this.tドラムヒット処理( nTime, Eパッド.LT, chipFT, inputEvent.nVelocity );
\r
936 //-----------------------------
\r
943 //-----------------------------
\r
947 #region [ FTとLT(groupingしている場合)のヒット処理 ]
\r
948 //-----------------------------
\r
950 if( inputEvent.nVelocity <= CDTXMania.ConfigIni.nVelocityMin.FT ) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
951 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
952 CDTX.CChip chipLT = this.r指定時刻に一番近い未ヒットChip( nTime, 0x15, nInputAdjustTime ); // LT
\r
953 CDTX.CChip chipFT = this.r指定時刻に一番近い未ヒットChip( nTime, 0x17, nInputAdjustTime ); // FT
\r
954 E判定 e判定LT = ( chipLT != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipLT, nInputAdjustTime ) : E判定.Miss;
\r
955 E判定 e判定FT = ( chipFT != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipFT, nInputAdjustTime ) : E判定.Miss;
\r
958 case EFTGroup.打ち分ける:
\r
959 #region [ FTのヒット処理 ]
\r
960 //-----------------------------
\r
961 if( e判定FT != E判定.Miss )
\r
963 this.tドラムヒット処理( nTime, Eパッド.FT, chipFT, inputEvent.nVelocity );
\r
966 //-----------------------------
\r
971 #region [ FTとLTのヒット処理 ]
\r
972 //-----------------------------
\r
973 if( ( e判定LT != E判定.Miss ) && ( e判定FT != E判定.Miss ) )
\r
975 if( chipLT.n発声位置 < chipFT.n発声位置 )
\r
977 this.tドラムヒット処理( nTime, Eパッド.FT, chipLT, inputEvent.nVelocity );
\r
979 else if( chipLT.n発声位置 > chipFT.n発声位置 )
\r
981 this.tドラムヒット処理( nTime, Eパッド.FT, chipFT, inputEvent.nVelocity );
\r
985 this.tドラムヒット処理( nTime, Eパッド.FT, chipLT, inputEvent.nVelocity );
\r
986 this.tドラムヒット処理( nTime, Eパッド.FT, chipFT, inputEvent.nVelocity );
\r
990 else if( e判定LT != E判定.Miss )
\r
992 this.tドラムヒット処理( nTime, Eパッド.FT, chipLT, inputEvent.nVelocity );
\r
995 else if( e判定FT != E判定.Miss )
\r
997 this.tドラムヒット処理( nTime, Eパッド.FT, chipFT, inputEvent.nVelocity );
\r
1000 //-----------------------------
\r
1008 //-----------------------------
\r
1012 #region [ CY(とLCとRD:groupingしている場合)のヒット処理 ]
\r
1013 //-----------------------------
\r
1015 if( inputEvent.nVelocity <= CDTXMania.ConfigIni.nVelocityMin.CY ) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
1016 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
1017 CDTX.CChip chipCY = this.r指定時刻に一番近い未ヒットChip( nTime, 0x16, nInputAdjustTime ); // CY
\r
1018 CDTX.CChip chipRD = this.r指定時刻に一番近い未ヒットChip( nTime, 0x19, nInputAdjustTime ); // RD
\r
1019 CDTX.CChip chipLC = CDTXMania.ConfigIni.bシンバルフリー ? this.r指定時刻に一番近い未ヒットChip( nTime, 0x1a, nInputAdjustTime ) : null;
\r
1020 E判定 e判定CY = ( chipCY != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipCY, nInputAdjustTime ) : E判定.Miss;
\r
1021 E判定 e判定RD = ( chipRD != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipRD, nInputAdjustTime ) : E判定.Miss;
\r
1022 E判定 e判定LC = ( chipLC != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipLC, nInputAdjustTime ) : E判定.Miss;
\r
1023 CDTX.CChip[] chipArray = new CDTX.CChip[] { chipCY, chipRD, chipLC };
\r
1024 E判定[] e判定Array = new E判定[] { e判定CY, e判定RD, e判定LC };
\r
1025 const int NumOfChips = 3; // chipArray.GetLength(0)
\r
1028 //while( num8 < 2 )
\r
1030 // CY/RD/LC群を, n発生位置の小さい順に並べる + nullを大きい方に退かす
\r
1031 SortChipsByNTime( chipArray, e判定Array, NumOfChips );
\r
1032 //for ( int i = 0; i < NumOfChips - 1; i++ )
\r
1035 // //while( num9 > num8 )
\r
1036 // for ( int j = NumOfChips - 1; j > i; j-- )
\r
1038 // if ( ( chipArray[ j - 1 ] == null ) || ( ( chipArray[ j ] != null ) && ( chipArray[ j - 1 ].n発声位置 > chipArray[ j ].n発声位置 ) ) )
\r
1041 // CDTX.CChip chipTemp = chipArray[ j - 1 ];
\r
1042 // chipArray[ j - 1 ] = chipArray[ j ];
\r
1043 // chipArray[ j ] = chipTemp;
\r
1044 // E判定 e判定Temp = e判定Array[ j - 1 ];
\r
1045 // e判定Array[ j - 1 ] = e判定Array[ j ];
\r
1046 // e判定Array[ j ] = e判定Temp;
\r
1052 switch( eCYGroup )
\r
1054 case ECYGroup.打ち分ける:
\r
1055 if( !CDTXMania.ConfigIni.bシンバルフリー )
\r
1057 if( e判定CY != E判定.Miss )
\r
1059 this.tドラムヒット処理( nTime, Eパッド.CY, chipCY, inputEvent.nVelocity );
\r
1067 //while ( num10 < NumOfChips )
\r
1068 for( int i = 0; i < NumOfChips; i++ )
\r
1070 if( ( e判定Array[ i ] != E判定.Miss ) && ( ( chipArray[ i ] == chipCY ) || ( chipArray[ i ] == chipLC ) ) )
\r
1072 this.tドラムヒット処理( nTime, Eパッド.CY, chipArray[ i ], inputEvent.nVelocity );
\r
1078 if( e判定CY != E判定.Miss )
\r
1080 this.tドラムヒット処理( nTime, Eパッド.CY, chipCY, inputEvent.nVelocity );
\r
1088 if( !CDTXMania.ConfigIni.bシンバルフリー )
\r
1091 //while ( num12 < NumOfChips )
\r
1092 for( int i = 0; i < NumOfChips; i++ )
\r
1094 if( ( e判定Array[ i ] != E判定.Miss ) && ( ( chipArray[ i ] == chipCY ) || ( chipArray[ i ] == chipRD ) ) )
\r
1096 this.tドラムヒット処理( nTime, Eパッド.CY, chipArray[ i ], inputEvent.nVelocity );
\r
1107 //while ( num11 < NumOfChips )
\r
1108 for( int i = 0; i < NumOfChips; i++ )
\r
1110 if( e判定Array[ i ] != E判定.Miss )
\r
1112 this.tドラムヒット処理( nTime, Eパッド.CY, chipArray[ i ], inputEvent.nVelocity );
\r
1126 //-----------------------------
\r
1130 #region [ HO(とHCとLC:groupingしている場合)のヒット処理 ]
\r
1131 //-----------------------------
\r
1133 if( inputEvent.nVelocity <= CDTXMania.ConfigIni.nVelocityMin.HH )
\r
1134 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
1136 CDTX.CChip chipHC = this.r指定時刻に一番近い未ヒットChip( nTime, 0x11, nInputAdjustTime ); // HC
\r
1137 CDTX.CChip chipHO = this.r指定時刻に一番近い未ヒットChip( nTime, 0x18, nInputAdjustTime ); // HO
\r
1138 CDTX.CChip chipLC = this.r指定時刻に一番近い未ヒットChip( nTime, 0x1a, nInputAdjustTime ); // LC
\r
1139 E判定 e判定HC = ( chipHC != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipHC, nInputAdjustTime ) : E判定.Miss;
\r
1140 E判定 e判定HO = ( chipHO != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipHO, nInputAdjustTime ) : E判定.Miss;
\r
1141 E判定 e判定LC = ( chipLC != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipLC, nInputAdjustTime ) : E判定.Miss;
\r
1142 switch( eHHGroup )
\r
1144 case EHHGroup.全部打ち分ける:
\r
1145 if( e判定HO != E判定.Miss )
\r
1147 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );
\r
1154 case EHHGroup.ハイハットのみ打ち分ける:
\r
1155 if( ( e判定HO != E判定.Miss ) && ( e判定LC != E判定.Miss ) )
\r
1157 if( chipHO.n発声位置 < chipLC.n発声位置 )
\r
1159 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );
\r
1161 else if( chipHO.n発声位置 > chipLC.n発声位置 )
\r
1163 this.tドラムヒット処理( nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity );
\r
1167 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );
\r
1168 this.tドラムヒット処理( nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity );
\r
1172 else if( e判定HO != E判定.Miss )
\r
1174 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );
\r
1177 else if( e判定LC != E判定.Miss )
\r
1179 this.tドラムヒット処理( nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity );
\r
1186 case EHHGroup.左シンバルのみ打ち分ける:
\r
1187 if( ( e判定HC != E判定.Miss ) && ( e判定HO != E判定.Miss ) )
\r
1189 if( chipHC.n発声位置 < chipHO.n発声位置 )
\r
1191 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity );
\r
1193 else if( chipHC.n発声位置 > chipHO.n発声位置 )
\r
1195 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );
\r
1199 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity );
\r
1200 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );
\r
1204 else if( e判定HC != E判定.Miss )
\r
1206 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity );
\r
1209 else if( e判定HO != E判定.Miss )
\r
1211 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );
\r
1218 case EHHGroup.全部共通:
\r
1219 if( ( ( e判定HC != E判定.Miss ) && ( e判定HO != E判定.Miss ) ) && ( e判定LC != E判定.Miss ) )
\r
1222 CDTX.CChip[] chipArray = new CDTX.CChip[] { chipHC, chipHO, chipLC };
\r
1223 // ここから、chipArrayをn発生位置の小さい順に並び替える
\r
1224 if( chipArray[ 1 ].n発声位置 > chipArray[ 2 ].n発声位置 )
\r
1226 chip = chipArray[ 1 ];
\r
1227 chipArray[ 1 ] = chipArray[ 2 ];
\r
1228 chipArray[ 2 ] = chip;
\r
1230 if( chipArray[ 0 ].n発声位置 > chipArray[ 1 ].n発声位置 )
\r
1232 chip = chipArray[ 0 ];
\r
1233 chipArray[ 0 ] = chipArray[ 1 ];
\r
1234 chipArray[ 1 ] = chip;
\r
1236 if( chipArray[ 1 ].n発声位置 > chipArray[ 2 ].n発声位置 )
\r
1238 chip = chipArray[ 1 ];
\r
1239 chipArray[ 1 ] = chipArray[ 2 ];
\r
1240 chipArray[ 2 ] = chip;
\r
1242 this.tドラムヒット処理( nTime, Eパッド.HHO, chipArray[ 0 ], inputEvent.nVelocity );
\r
1243 if( chipArray[ 0 ].n発声位置 == chipArray[ 1 ].n発声位置 )
\r
1245 this.tドラムヒット処理( nTime, Eパッド.HHO, chipArray[ 1 ], inputEvent.nVelocity );
\r
1247 if( chipArray[ 0 ].n発声位置 == chipArray[ 2 ].n発声位置 )
\r
1249 this.tドラムヒット処理( nTime, Eパッド.HHO, chipArray[ 2 ], inputEvent.nVelocity );
\r
1253 else if( ( e判定HC != E判定.Miss ) && ( e判定HO != E判定.Miss ) )
\r
1255 if( chipHC.n発声位置 < chipHO.n発声位置 )
\r
1257 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity );
\r
1259 else if( chipHC.n発声位置 > chipHO.n発声位置 )
\r
1261 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );
\r
1265 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity );
\r
1266 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );
\r
1270 else if( ( e判定HC != E判定.Miss ) && ( e判定LC != E判定.Miss ) )
\r
1272 if( chipHC.n発声位置 < chipLC.n発声位置 )
\r
1274 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity );
\r
1276 else if( chipHC.n発声位置 > chipLC.n発声位置 )
\r
1278 this.tドラムヒット処理( nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity );
\r
1282 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity );
\r
1283 this.tドラムヒット処理( nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity );
\r
1287 else if( ( e判定HO != E判定.Miss ) && ( e判定LC != E判定.Miss ) )
\r
1289 if( chipHO.n発声位置 < chipLC.n発声位置 )
\r
1291 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );
\r
1293 else if( chipHO.n発声位置 > chipLC.n発声位置 )
\r
1295 this.tドラムヒット処理( nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity );
\r
1299 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );
\r
1300 this.tドラムヒット処理( nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity );
\r
1304 else if( e判定HC != E判定.Miss )
\r
1306 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHC, inputEvent.nVelocity );
\r
1309 else if( e判定HO != E判定.Miss )
\r
1311 this.tドラムヒット処理( nTime, Eパッド.HHO, chipHO, inputEvent.nVelocity );
\r
1314 else if( e判定LC != E判定.Miss )
\r
1316 this.tドラムヒット処理( nTime, Eパッド.HHO, chipLC, inputEvent.nVelocity );
\r
1327 //-----------------------------
\r
1331 #region [ RD(とCYとLC:groupingしている場合)のヒット処理 ]
\r
1332 //-----------------------------
\r
1334 if( inputEvent.nVelocity <= CDTXMania.ConfigIni.nVelocityMin.RD ) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
1335 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
1336 CDTX.CChip chipCY = this.r指定時刻に一番近い未ヒットChip( nTime, 0x16, nInputAdjustTime ); // CY
\r
1337 CDTX.CChip chipRD = this.r指定時刻に一番近い未ヒットChip( nTime, 0x19, nInputAdjustTime ); // RD
\r
1338 CDTX.CChip chipLC = CDTXMania.ConfigIni.bシンバルフリー ? this.r指定時刻に一番近い未ヒットChip( nTime, 0x1a, nInputAdjustTime ) : null;
\r
1339 E判定 e判定CY = ( chipCY != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipCY, nInputAdjustTime ) : E判定.Miss;
\r
1340 E判定 e判定RD = ( chipRD != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipRD, nInputAdjustTime ) : E判定.Miss;
\r
1341 E判定 e判定LC = ( chipLC != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipLC, nInputAdjustTime ) : E判定.Miss;
\r
1342 CDTX.CChip[] chipArray = new CDTX.CChip[] { chipCY, chipRD, chipLC };
\r
1343 E判定[] e判定Array = new E判定[] { e判定CY, e判定RD, e判定LC };
\r
1344 const int NumOfChips = 3; // chipArray.GetLength(0)
\r
1347 //while( num13 < 2 )
\r
1349 // HH/CY群を, n発生位置の小さい順に並べる + nullを大きい方に退かす
\r
1350 SortChipsByNTime( chipArray, e判定Array, NumOfChips );
\r
1351 //for ( int i = 0; i < NumOfChips - 1; i++ )
\r
1354 // // while( num14 > num13 )
\r
1355 // for (int j = NumOfChips - 1; j > i; j--)
\r
1357 // if( ( chipArray[ j - 1 ] == null ) || ( ( chipArray[ j ] != null ) && ( chipArray[ j - 1 ].n発声位置 > chipArray[ j ].n発声位置 ) ) )
\r
1359 // CDTX.CChip chipTemp = chipArray[ j - 1 ];
\r
1360 // chipArray[ j - 1 ] = chipArray[ j ];
\r
1361 // chipArray[ j ] = chipTemp;
\r
1362 // E判定 e判定Temp = e判定Array[ j - 1 ];
\r
1363 // e判定Array[ j - 1 ] = e判定Array[ j ];
\r
1364 // e判定Array[ j ] = e判定Temp;
\r
1370 switch( eCYGroup )
\r
1372 case ECYGroup.打ち分ける:
\r
1373 if( e判定RD != E判定.Miss )
\r
1375 this.tドラムヒット処理( nTime, Eパッド.RD, chipRD, inputEvent.nVelocity );
\r
1381 if( !CDTXMania.ConfigIni.bシンバルフリー )
\r
1384 //while( num16 < 3 )
\r
1385 for( int i = 0; i < NumOfChips; i++ )
\r
1387 if( ( e判定Array[ i ] != E判定.Miss ) && ( ( chipArray[ i ] == chipCY ) || ( chipArray[ i ] == chipRD ) ) )
\r
1389 this.tドラムヒット処理( nTime, Eパッド.CY, chipArray[ i ], inputEvent.nVelocity );
\r
1398 //while( num15 < 3 )
\r
1399 for( int i = 0; i < NumOfChips; i++ )
\r
1401 if( e判定Array[ i ] != E判定.Miss )
\r
1403 this.tドラムヒット処理( nTime, Eパッド.CY, chipArray[ i ], inputEvent.nVelocity );
\r
1417 //-----------------------------
\r
1421 #region [ LC(とHC/HOとCYと:groupingしている場合)のヒット処理 ]
\r
1422 //-----------------------------
\r
1424 if( inputEvent.nVelocity <= CDTXMania.ConfigIni.nVelocityMin.LC ) // #23857 2010.12.12 yyagi: to support VelocityMin
\r
1425 continue; // 電子ドラムによる意図的なクロストークを無効にする
\r
1426 CDTX.CChip chipHC = this.r指定時刻に一番近い未ヒットChip( nTime, 0x11, nInputAdjustTime ); // HC
\r
1427 CDTX.CChip chipHO = this.r指定時刻に一番近い未ヒットChip( nTime, 0x18, nInputAdjustTime ); // HO
\r
1428 CDTX.CChip chipLC = this.r指定時刻に一番近い未ヒットChip( nTime, 0x1a, nInputAdjustTime ); // LC
\r
1429 CDTX.CChip chipCY = CDTXMania.ConfigIni.bシンバルフリー ? this.r指定時刻に一番近い未ヒットChip( nTime, 0x16, nInputAdjustTime ) : null;
\r
1430 CDTX.CChip chipRD = CDTXMania.ConfigIni.bシンバルフリー ? this.r指定時刻に一番近い未ヒットChip( nTime, 0x19, nInputAdjustTime ) : null;
\r
1431 E判定 e判定HC = ( chipHC != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipHC, nInputAdjustTime ) : E判定.Miss;
\r
1432 E判定 e判定HO = ( chipHO != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipHO, nInputAdjustTime ) : E判定.Miss;
\r
1433 E判定 e判定LC = ( chipLC != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipLC, nInputAdjustTime ) : E判定.Miss;
\r
1434 E判定 e判定CY = ( chipCY != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipCY, nInputAdjustTime ) : E判定.Miss;
\r
1435 E判定 e判定RD = ( chipRD != null ) ? this.e指定時刻からChipのJUDGEを返す( nTime, chipRD, nInputAdjustTime ) : E判定.Miss;
\r
1436 CDTX.CChip[] chipArray = new CDTX.CChip[] { chipHC, chipHO, chipLC, chipCY, chipRD };
\r
1437 E判定[] e判定Array = new E判定[] { e判定HC, e判定HO, e判定LC, e判定CY, e判定RD };
\r
1438 const int NumOfChips = 5; // chipArray.GetLength(0)
\r
1441 //while( num3 < 4 )
\r
1443 // HH/CY群を, n発生位置の小さい順に並べる + nullを大きい方に退かす
\r
1444 SortChipsByNTime( chipArray, e判定Array, NumOfChips );
\r
1445 //for ( int i = 0; i < NumOfChips - 1; i++ )
\r
1448 // //while( num4 > num3 )
\r
1449 // for ( int j = NumOfChips - 1; j > i; j-- )
\r
1451 // if( ( chipArray[ j - 1 ] == null ) || ( ( chipArray[ j ] != null ) && ( chipArray[ j - 1 ].n発声位置 > chipArray[ j ].n発声位置 ) ) )
\r
1454 // CDTX.CChip chipTemp = chipArray[ j - 1 ];
\r
1455 // chipArray[ j - 1 ] = chipArray[ j ];
\r
1456 // chipArray[ j ] = chipTemp;
\r
1457 // E判定 e判定Temp = e判定Array[ j - 1 ];
\r
1458 // e判定Array[ j - 1 ] = e判定Array[ j ];
\r
1459 // e判定Array[ j ] = e判定Temp;
\r
1465 switch( eHHGroup )
\r
1467 case EHHGroup.全部打ち分ける:
\r
1468 case EHHGroup.左シンバルのみ打ち分ける:
\r
1469 if( !CDTXMania.ConfigIni.bシンバルフリー )
\r
1471 if( e判定LC != E判定.Miss )
\r
1473 this.tドラムヒット処理( nTime, Eパッド.LC, chipLC, inputEvent.nVelocity );
\r
1481 //while( num5 < 5 )
\r
1482 for( int i = 0; i < NumOfChips; i++ )
\r
1484 if( ( e判定Array[ i ] != E判定.Miss ) && ( ( ( chipArray[ i ] == chipLC ) || ( chipArray[ i ] == chipCY ) ) || ( ( chipArray[ i ] == chipRD ) && ( CDTXMania.ConfigIni.eCYGroup == ECYGroup.共通 ) ) ) )
\r
1486 this.tドラムヒット処理( nTime, Eパッド.LC, chipArray[ i ], inputEvent.nVelocity );
\r
1496 case EHHGroup.ハイハットのみ打ち分ける:
\r
1497 case EHHGroup.全部共通:
\r
1498 if( !CDTXMania.ConfigIni.bシンバルフリー )
\r
1501 //while( num7 < 5 )
\r
1502 for( int i = 0; i < NumOfChips; i++ )
\r
1504 if( ( e判定Array[ i ] != E判定.Miss ) && ( ( ( chipArray[ i ] == chipLC ) || ( chipArray[ i ] == chipHC ) ) || ( chipArray[ i ] == chipHO ) ) )
\r
1506 this.tドラムヒット処理( nTime, Eパッド.LC, chipArray[ i ], inputEvent.nVelocity );
\r
1517 //while( num6 < 5 )
\r
1518 for( int i = 0; i < NumOfChips; i++ )
\r
1520 if( ( e判定Array[ i ] != E判定.Miss ) && ( ( chipArray[ i ] != chipRD ) || ( CDTXMania.ConfigIni.eCYGroup == ECYGroup.共通 ) ) )
\r
1522 this.tドラムヒット処理( nTime, Eパッド.LC, chipArray[ i ], inputEvent.nVelocity );
\r
1537 //-----------------------------
\r
1540 case Eパッド.HP: // #27029 2012.1.4 from
\r
1541 #region [ HPのヒット処理 ]
\r
1542 //-----------------
\r
1543 if( CDTXMania.ConfigIni.eBDGroup == EBDGroup.どっちもBD )
\r
1545 #region [ BDとみなしてヒット処理 ]
\r
1546 //-----------------
\r
1547 if( !this.tドラムヒット処理( nTime, Eパッド.BD, this.r指定時刻に一番近い未ヒットChip( nTime, 0x13, nInputAdjustTime ), inputEvent.nVelocity ) )
\r
1550 //-----------------
\r
1555 #region [ HPのヒット処理 ]
\r
1556 //-----------------
\r
1557 continue; // 何もしない。この入力を完全に無視するので、break しないこと。
\r
1558 //-----------------
\r
1561 //-----------------
\r
1564 //-----------------------------
\r
1566 #region [ (B) ヒットしてなかった場合は、レーンフラッシュ、パッドアニメ、空打ち音再生を実行 ]
\r
1567 //-----------------------------
\r
1568 int pad = nPad; // 以下、nPad の代わりに pad を用いる。(成りすまし用)
\r
1570 if( nPad == (int) Eパッド.HP ) // #27029 2012.1.4 from: HP&BD 時の HiHatPedal の場合は BD に成りすます。
\r
1571 pad = (int) Eパッド.BD; //( HP|BD 時のHP入力はここまでこないので無視。)
\r
1574 this.actLaneFlushD.Start( (Eレーン) this.nパッド0Atoレーン07[ pad ], ( (float) inputEvent.nVelocity ) / 127f );
\r
1577 this.actPad.Hit( this.nパッド0Atoパッド08[ pad ] );
\r
1580 if( CDTXMania.ConfigIni.bドラム打音を発声する )
\r
1582 CDTX.CChip rChip = this.r空うちChip( E楽器パート.DRUMS, (Eパッド) pad );
\r
1583 if( rChip != null )
\r
1585 #region [ (B1) 空打ち音が譜面で指定されているのでそれを再生する。]
\r
1586 //-----------------
\r
1587 this.tサウンド再生( rChip, CSound管理.rc演奏用タイマ.nシステム時刻, E楽器パート.DRUMS, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する.Drums );
\r
1588 //-----------------
\r
1593 #region [ (B2) 空打ち音が指定されていないので一番近いチップを探して再生する。]
\r
1594 //-----------------
\r
1595 switch( ( (Eパッド) pad ) )
\r
1599 //-----------------------------
\r
1601 CDTX.CChip chipHC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 0 ], nInputAdjustTime );
\r
1602 CDTX.CChip chipHO = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 7 ], nInputAdjustTime );
\r
1603 CDTX.CChip chipLC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 9 ], nInputAdjustTime );
\r
1604 switch( CDTXMania.ConfigIni.eHHGroup )
\r
1606 case EHHGroup.ハイハットのみ打ち分ける:
\r
1607 rChip = ( chipHC != null ) ? chipHC : chipLC;
\r
1610 case EHHGroup.左シンバルのみ打ち分ける:
\r
1611 rChip = ( chipHC != null ) ? chipHC : chipHO;
\r
1614 case EHHGroup.全部共通:
\r
1615 if( chipHC != null )
\r
1619 else if( chipHO == null )
\r
1623 else if( chipLC == null )
\r
1627 else if( chipHO.n発声位置 < chipLC.n発声位置 )
\r
1642 //-----------------------------
\r
1648 //-----------------------------
\r
1650 CDTX.CChip chipLT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 4 ], nInputAdjustTime );
\r
1651 CDTX.CChip chipFT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 5 ], nInputAdjustTime );
\r
1652 if( CDTXMania.ConfigIni.eFTGroup != EFTGroup.打ち分ける )
\r
1653 rChip = ( chipLT != null ) ? chipLT : chipFT;
\r
1657 //-----------------------------
\r
1663 //-----------------------------
\r
1665 CDTX.CChip chipLT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 4 ], nInputAdjustTime );
\r
1666 CDTX.CChip chipFT = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 5 ], nInputAdjustTime );
\r
1667 if( CDTXMania.ConfigIni.eFTGroup != EFTGroup.打ち分ける )
\r
1668 rChip = ( chipFT != null ) ? chipFT : chipLT;
\r
1672 //-----------------------------
\r
1678 //-----------------------------
\r
1680 CDTX.CChip chipCY = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 6 ], nInputAdjustTime );
\r
1681 CDTX.CChip chipRD = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 8 ], nInputAdjustTime );
\r
1682 if( CDTXMania.ConfigIni.eCYGroup != ECYGroup.打ち分ける )
\r
1683 rChip = ( chipCY != null ) ? chipCY : chipRD;
\r
1687 //-----------------------------
\r
1693 //-----------------------------
\r
1695 CDTX.CChip chipHC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 0 ], nInputAdjustTime );
\r
1696 CDTX.CChip chipHO = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 7 ], nInputAdjustTime );
\r
1697 CDTX.CChip chipLC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 9 ], nInputAdjustTime );
\r
1698 switch( CDTXMania.ConfigIni.eHHGroup )
\r
1700 case EHHGroup.全部打ち分ける:
\r
1704 case EHHGroup.ハイハットのみ打ち分ける:
\r
1705 rChip = ( chipHO != null ) ? chipHO : chipLC;
\r
1708 case EHHGroup.左シンバルのみ打ち分ける:
\r
1709 rChip = ( chipHO != null ) ? chipHO : chipHC;
\r
1712 case EHHGroup.全部共通:
\r
1713 if( chipHO != null )
\r
1717 else if( chipHC == null )
\r
1721 else if( chipLC == null )
\r
1725 else if( chipHC.n発声位置 < chipLC.n発声位置 )
\r
1736 //-----------------------------
\r
1742 //-----------------------------
\r
1744 CDTX.CChip chipCY = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 6 ], nInputAdjustTime );
\r
1745 CDTX.CChip chipRD = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 8 ], nInputAdjustTime );
\r
1746 if( CDTXMania.ConfigIni.eCYGroup != ECYGroup.打ち分ける )
\r
1747 rChip = ( chipRD != null ) ? chipRD : chipCY;
\r
1751 //-----------------------------
\r
1757 //-----------------------------
\r
1759 CDTX.CChip chipHC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 0 ], nInputAdjustTime );
\r
1760 CDTX.CChip chipHO = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 7 ], nInputAdjustTime );
\r
1761 CDTX.CChip chipLC = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ 9 ], nInputAdjustTime );
\r
1762 switch( CDTXMania.ConfigIni.eHHGroup )
\r
1764 case EHHGroup.全部打ち分ける:
\r
1765 case EHHGroup.左シンバルのみ打ち分ける:
\r
1769 case EHHGroup.ハイハットのみ打ち分ける:
\r
1770 case EHHGroup.全部共通:
\r
1771 if( chipLC != null )
\r
1775 else if( chipHC == null )
\r
1779 else if( chipHO == null )
\r
1783 else if( chipHC.n発声位置 < chipHO.n発声位置 )
\r
1794 //-----------------------------
\r
1800 //-----------------------------
\r
1801 rChip = this.r指定時刻に一番近いChip_ヒット未済問わず不可視考慮( nTime, this.nパッド0Atoチャンネル0A[ pad ], nInputAdjustTime );
\r
1802 //-----------------------------
\r
1806 if( rChip != null )
\r
1808 // 空打ち音が見つかったので再生する。
\r
1809 this.tサウンド再生( rChip, CSound管理.rc演奏用タイマ.nシステム時刻, E楽器パート.DRUMS, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する.Drums );
\r
1811 //-----------------
\r
1816 // BAD or TIGHT 時の処理。
\r
1817 if( CDTXMania.ConfigIni.bTight )
\r
1818 this.tチップのヒット処理_BadならびにTight時のMiss( E楽器パート.DRUMS, this.nパッド0Atoレーン07[ pad ] );
\r
1819 //-----------------------------
\r
1825 // t入力処理・ドラム()からメソッドを抽出したもの。
\r
1827 /// chipArrayの中を, n発生位置の小さい順に並べる + nullを大きい方に退かす。セットでe判定Arrayも並べ直す。
\r
1829 /// <param name="chipArray">ソート対象chip群</param>
\r
1830 /// <param name="e判定Array">ソート対象e判定群</param>
\r
1831 /// <param name="NumOfChips">チップ数</param>
\r
1832 private static void SortChipsByNTime( CDTX.CChip[] chipArray, E判定[] e判定Array, int NumOfChips )
\r
1834 for ( int i = 0; i < NumOfChips - 1; i++ )
\r
1837 //while( num9 > num8 )
\r
1838 for ( int j = NumOfChips - 1; j > i; j-- )
\r
1840 if ( ( chipArray[ j - 1 ] == null ) || ( ( chipArray[ j ] != null ) && ( chipArray[ j - 1 ].n発声位置 > chipArray[ j ].n発声位置 ) ) )
\r
1843 CDTX.CChip chipTemp = chipArray[ j - 1 ];
\r
1844 chipArray[ j - 1 ] = chipArray[ j ];
\r
1845 chipArray[ j ] = chipTemp;
\r
1846 E判定 e判定Temp = e判定Array[ j - 1 ];
\r
1847 e判定Array[ j - 1 ] = e判定Array[ j ];
\r
1848 e判定Array[ j ] = e判定Temp;
\r
1856 protected override void t背景テクスチャの生成()
\r
1858 Rectangle bgrect = new Rectangle( (int) ( 338 * Scale.X ), (int) ( 57 * Scale.Y ), (int) ( 278 * Scale.X ), (int) ( 355 * Scale.Y ) );
\r
1859 string DefaultBgFilename = @"Graphics\ScreenPlayDrums-background.png";
\r
1860 string DefaultLaneFilename = @"Graphics\ScreenPlayDrums_Lane_parts_drums.png";
\r
1861 string BgFilename = "";
\r
1862 if ( ( ( CDTXMania.DTX.BACKGROUND != null ) && ( CDTXMania.DTX.BACKGROUND.Length > 0 ) ) && !CDTXMania.ConfigIni.bストイックモード )
\r
1864 BgFilename = CDTXMania.DTX.strフォルダ名 + CDTXMania.DTX.BACKGROUND;
\r
1866 base.t背景テクスチャの生成( DefaultBgFilename, DefaultLaneFilename, bgrect, BgFilename );
\r
1869 protected override void t進行描画_チップ_ドラムス( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )
\r
1871 if ( configIni.bDrums有効 )
\r
1873 #region [ Invisible処理 ]
\r
1874 if ( configIni.eInvisible.Drums != EInvisible.OFF )
\r
1876 cInvisibleChip.SetInvisibleStatus( ref pChip );
\r
1881 #region [ Sudden処理 ]
\r
1882 if ( configIni.bSudden.Drums )
\r
1884 if ( pChip.nバーからの距離dot.Drums < 200 * Scale.Y )
\r
1887 pChip.n透明度 = 0xff;
\r
1889 else if ( pChip.nバーからの距離dot.Drums < 250 * Scale.Y )
\r
1892 pChip.n透明度 = 0xff - ( (int) ( ( ( (double) ( pChip.nバーからの距離dot.Drums - 200 * Scale.Y ) ) * 255.0 ) / 50.0 ) );
\r
1896 pChip.b可視 = false;
\r
1901 #region [ Hidden処理 ]
\r
1902 if ( configIni.bHidden.Drums )
\r
1904 if ( pChip.nバーからの距離dot.Drums < 100 * Scale.Y )
\r
1906 pChip.b可視 = false;
\r
1908 else if ( pChip.nバーからの距離dot.Drums < 150 * Scale.Y )
\r
1911 pChip.n透明度 = (int) ( ( ( (double) ( pChip.nバーからの距離dot.Drums - 100 * Scale.Y ) ) * 255.0 ) / 50.0 );
\r
1916 if ( !pChip.bHit && pChip.b可視 )
\r
1918 if ( this.txチップ != null )
\r
1920 this.txチップ.n透明度 = pChip.n透明度;
\r
1922 int x = this.nチャンネルtoX座標[ pChip.nチャンネル番号 - 0x11 ];
\r
1923 int y = configIni.bReverse.Drums ?
\r
1924 (int) ( 0x38 * Scale.Y + pChip.nバーからの距離dot.Drums ) :
\r
1925 (int) ( 0x1a6 * Scale.Y - pChip.nバーからの距離dot.Drums );
\r
1926 x = (int) ( x * Scale.X );
\r
1927 if ( this.txチップ != null )
\r
1929 this.txチップ.vc拡大縮小倍率 = new Vector3( (float) pChip.dbチップサイズ倍率, (float) pChip.dbチップサイズ倍率, 1f );
\r
1931 int num9 = this.ctチップ模様アニメ.Drums.n現在の値;
\r
1932 switch ( pChip.nチャンネル番号 )
\r
1936 x += (int) ( 0x10 * Scale.X ) - ( (int) ( ( 32.0 * pChip.dbチップサイズ倍率 * Scale.X ) / 2.0 ) );
\r
1937 if ( this.txチップ != null )
\r
1939 this.txチップ.t2D描画( CDTXMania.app.Device,
\r
1943 (int) ( 44 * Scale.X ),
\r
1944 (int) ( num9 * (18-2) ),
\r
1945 (int) ( 32 * Scale.X ),
\r
1954 x += (int) ( 0x10 * Scale.X ) - ( (int) ( ( 32.0 * pChip.dbチップサイズ倍率 * Scale.X ) / 2.0 ) );
\r
1955 if ( this.txチップ != null )
\r
1957 this.txチップ.t2D描画( CDTXMania.app.Device,
\r
1961 (int) ( 0x4c * Scale.X ),
\r
1962 (int) ( num9 * (18 - 2) ),
\r
1963 (int) ( 0x20 * Scale.X ),
\r
1970 x += (int) ( 0x16 * Scale.X ) - ( (int) ( ( 44.0 * pChip.dbチップサイズ倍率 * Scale.X ) / 2.0 ) );
\r
1971 if ( this.txチップ != null )
\r
1973 this.txチップ.t2D描画( CDTXMania.app.Device,
\r
1977 (int) ( 0 * Scale.X ),
\r
1978 (int) ( num9 * (22-2) ),
\r
1979 (int) ( 44 * Scale.X ),
\r
1988 x += (int) ( 0x10 * Scale.X ) - ( (int) ( ( 32.0 * pChip.dbチップサイズ倍率 * Scale.X ) / 2.0 ) );
\r
1989 if ( this.txチップ != null )
\r
1991 this.txチップ.t2D描画( CDTXMania.app.Device,
\r
1995 (int) ( 0x6c * Scale.X ),
\r
1996 (int) ( num9 * (18 - 2) ),
\r
1997 (int) ( 0x20 * Scale.X ),
\r
2004 x += (int) ( 0x10 * Scale.X ) - ( (int) ( ( 32.0 * pChip.dbチップサイズ倍率 * Scale.X ) / 2.0 ) );
\r
2005 if ( this.txチップ != null )
\r
2007 this.txチップ.t2D描画( CDTXMania.app.Device,
\r
2011 (int) ( 140 * Scale.X ),
\r
2012 (int) ( num9 * (18 - 2) ),
\r
2013 (int) ( 0x20 * Scale.X ),
\r
2020 x += (int) ( 0x13 * Scale.X ) - ( (int) ( ( 38.0 * pChip.dbチップサイズ倍率 * Scale.X ) / 2.0 ) );
\r
2021 if ( this.txチップ != null )
\r
2023 this.txチップ.t2D描画( CDTXMania.app.Device,
\r
2027 (int) ( 0xcc * Scale.X ),
\r
2029 (int) ( 0x26 * Scale.X ),
\r
2032 this.txチップ.t2D描画( CDTXMania.app.Device,
\r
2036 (int) ( 0xcc * Scale.X ),
\r
2037 (int) ( num9 * (18 - 2) ),
\r
2038 (int) ( 0x26 * Scale.X ),
\r
2045 x += (int) ( 0x10 * Scale.X ) - ( (int) ( ( 32.0 * pChip.dbチップサイズ倍率 * Scale.X ) / 2.0 ) );
\r
2046 if ( this.txチップ != null )
\r
2048 this.txチップ.t2D描画( CDTXMania.app.Device,
\r
2052 (int) ( 0xac * Scale.X ),
\r
2053 (int) ( num9 * (18 - 2) ),
\r
2054 (int) ( 0x20 * Scale.X ),
\r
2061 x += (int) ( 13 * Scale.X ) - ( (int) ( ( 26.0 * pChip.dbチップサイズ倍率 * Scale.X ) / 2.0 ) );
\r
2062 if ( this.txチップ != null )
\r
2064 this.txチップ.t2D描画( CDTXMania.app.Device,
\r
2068 (int) ( 0xf2 * Scale.X ),
\r
2069 (int) ( num9 * (18 - 2) ),
\r
2070 (int) ( 0x1a * Scale.X ),
\r
2073 this.txチップ.t2D描画( CDTXMania.app.Device,
\r
2077 (int) ( 0xf2 * Scale.X ),
\r
2079 (int) ( 0x1a * Scale.X ),
\r
2087 x += (int) ( 13 * Scale.X ) - ( (int) ( ( 26.0 * pChip.dbチップサイズ倍率 * Scale.X ) / 2.0 ) );
\r
2088 if ( this.txチップ != null )
\r
2090 this.txチップ.t2D描画( CDTXMania.app.Device,
\r
2094 (int) ( 0xf2 * Scale.X ),
\r
2095 (int) ( num9 * ( 18 - 2 ) ),
\r
2096 (int) ( 0x1a * Scale.X ),
\r
2099 this.txチップ.t2D描画( CDTXMania.app.Device,
\r
2103 (int) ( 0xf2 * Scale.X ),
\r
2105 (int) ( 0x1a * Scale.X ),
\r
2113 x += (int) ( 0x13 * Scale.X ) - ( (int) ( ( 38.0 * pChip.dbチップサイズ倍率 * Scale.X ) / 2.0 ) );
\r
2114 if ( this.txチップ != null )
\r
2116 this.txチップ.t2D描画( CDTXMania.app.Device,
\r
2120 (int) ( 0xcc * Scale.X ),
\r
2122 (int) ( 0x26 * Scale.X ),
\r
2125 this.txチップ.t2D描画( CDTXMania.app.Device,
\r
2129 (int) ( 0xcc * Scale.X ),
\r
2130 (int) ( num9 * (18 - 2) ),
\r
2131 (int) ( 0x26 * Scale.X ),
\r
2137 if ( this.txチップ != null )
\r
2139 this.txチップ.vc拡大縮小倍率 = new Vector3( 1f, 1f, 1f );
\r
2140 this.txチップ.n透明度 = 0xff;
\r
2144 int indexSevenLanes = this.nチャンネル0Atoレーン07[ pChip.nチャンネル番号 - 0x11 ];
\r
2145 // #35411 chnmr0 modified
\r
2146 bool autoPlayCondition = ( configIni.bAutoPlay[ indexSevenLanes ] && !pChip.bHit );
\r
2147 bool UsePerfectGhost = true;
\r
2148 long ghostLag = 0;
\r
2150 if( CDTXMania.ConfigIni.eAutoGhost.Drums != EAutoGhostData.PERFECT &&
\r
2151 CDTXMania.listAutoGhostLag.Drums != null &&
\r
2152 0 <= pChip.n楽器パートでの出現順 && pChip.n楽器パートでの出現順 < CDTXMania.listAutoGhostLag.Drums.Count)
\r
2155 // ゴーストデータが有効 : ラグに合わせて判定
\r
2156 ghostLag = CDTXMania.listAutoGhostLag.Drums[pChip.n楽器パートでの出現順];
\r
2157 ghostLag = (ghostLag & 255) - 128;
\r
2158 ghostLag -= this.nInputAdjustTimeMs.Drums;
\r
2159 autoPlayCondition &= !pChip.bHit && (ghostLag + pChip.n発声時刻ms <= CSound管理.rc演奏用タイマ.n現在時刻ms);
\r
2160 UsePerfectGhost = false;
\r
2162 if( UsePerfectGhost )
\r
2164 // 従来の AUTO : バー下で判定
\r
2165 autoPlayCondition &= ( pChip.nバーからの距離dot.Drums < 0 );
\r
2168 if ( autoPlayCondition )
\r
2170 pChip.bHit = true;
\r
2171 this.actLaneFlushD.Start( (Eレーン) indexSevenLanes, ( (float) CInput管理.n通常音量 ) / 127f );
\r
2172 bool flag = this.bフィルイン中;
\r
2173 bool flag2 = this.bフィルイン中 && this.bフィルイン区間の最後のChipである( pChip );
\r
2174 //bool flag3 = flag2;
\r
2175 // #31602 2013.6.24 yyagi 判定ラインの表示位置をずらしたら、チップのヒットエフェクトの表示もずらすために、nJudgeLine..を追加
\r
2176 this.actChipFireD.Start( (Eレーン)indexSevenLanes, flag, flag2, flag2, 演奏判定ライン座標.nJudgeLinePosY_delta.Drums );
\r
2177 this.actPad.Hit( this.nチャンネル0Atoパッド08[ pChip.nチャンネル番号 - 0x11 ] );
\r
2178 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms + ghostLag, E楽器パート.DRUMS, dTX.nモニタを考慮した音量( E楽器パート.DRUMS ) );
\r
2179 this.tチップのヒット処理(pChip.n発声時刻ms + ghostLag, pChip);
\r
2180 cInvisibleChip.StartSemiInvisible( E楽器パート.DRUMS );
\r
2182 // #35411 modify end
\r
2184 // #35411 2015.08.21 chnmr0 add
\r
2185 // 目標値グラフにゴーストの達成率を渡す
\r
2186 if (CDTXMania.ConfigIni.eTargetGhost.Drums != ETargetGhostData.NONE &&
\r
2187 CDTXMania.listTargetGhsotLag.Drums != null)
\r
2190 if (CDTXMania.ConfigIni.eTargetGhost.Drums == ETargetGhostData.ONLINE)
\r
2192 if (CDTXMania.DTX.n可視チップ数.Drums > 0)
\r
2194 // Online Stats の計算式
\r
2196 (this.nヒット数_TargetGhost.Drums.Perfect * 17 +
\r
2197 this.nヒット数_TargetGhost.Drums.Great * 7 +
\r
2198 this.n最大コンボ数_TargetGhost.Drums * 3) / (20.0 * CDTXMania.DTX.n可視チップ数.Drums);
\r
2203 val = CScoreIni.t演奏型スキルを計算して返す(
\r
2204 CDTXMania.DTX.n可視チップ数.Drums,
\r
2205 this.nヒット数_TargetGhost.Drums.Perfect,
\r
2206 this.nヒット数_TargetGhost.Drums.Great,
\r
2207 this.nヒット数_TargetGhost.Drums.Good,
\r
2208 this.nヒット数_TargetGhost.Drums.Poor,
\r
2209 this.nヒット数_TargetGhost.Drums.Miss,
\r
2210 E楽器パート.DRUMS, new STAUTOPLAY());
\r
2212 if (val < 0) val = 0;
\r
2213 if (val > 100) val = 100;
\r
2214 this.actGraph.dbグラフ値目標_渡 = val;
\r
2218 } // end of "if configIni.bDrums有効"
\r
2219 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2221 this.tサウンド再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, E楽器パート.DRUMS, dTX.nモニタを考慮した音量( E楽器パート.DRUMS ) );
\r
2222 pChip.bHit = true;
\r
2225 protected override void t進行描画_チップ_ギターベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst )
\r
2227 base.t進行描画_チップ_ギターベース( configIni, ref dTX, ref pChip, inst,
\r
2228 演奏判定ライン座標.n判定ラインY座標( inst, false, false ), // 95 Normal
\r
2229 演奏判定ライン座標.n判定ラインY座標( inst, false, true ), // 374 Reverse
\r
2230 (int) ( 57 * Scale.Y ), (int) ( 412 * Scale.Y ), // チップのY軸表示範囲
\r
2231 509, 400, // openチップのX座標(Gt, Bs)
\r
2232 268, 144, 76, 6, 24, // オープンチップregionの x, y, w, h, 通常チップのw
\r
2233 509, 561, 400, 452, // GtのX, Gt左利きのX, BsのX, Bs左利きのX,
\r
2234 26, 24 // 描画のX座標間隔, テクスチャのX座標間隔
\r
2238 protected override void t進行描画・チップ・ギターベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip, E楽器パート inst )
\r
2240 int instIndex = (int) inst;
\r
2241 if ( configIni.bGuitar有効 )
\r
2243 if ( configIni.bSudden[ instIndex ] )
\r
2245 pChip.b可視 = pChip.nバーからの距離dot[ instIndex ] < 200;
\r
2247 if ( configIni.bHidden[ instIndex ] && ( pChip.nバーからの距離dot[ instIndex ] < 100 ) )
\r
2249 pChip.b可視 = false;
\r
2252 bool bChipHasR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );
\r
2253 bool bChipHasG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );
\r
2254 bool bChipHasB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );
\r
2255 bool bChipHasW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );
\r
2256 bool bChipIsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );
\r
2258 int OPEN = (inst == E楽器パート.GUITAR ) ? 0x20 : 0xA0;
\r
2259 if ( !pChip.bHit && pChip.b可視 )
\r
2261 int y = configIni.bReverse[ instIndex ] ? ( 374 - pChip.nバーからの距離dot[ instIndex ] ) : ( 95 + pChip.nバーからの距離dot[ instIndex ] );
\r
2262 if ( ( y > 57 ) && ( y < 412 ) )
\r
2264 if ( this.txチップ != null )
\r
2266 int nアニメカウンタ現在の値 = this.ctチップ模様アニメ[ instIndex ].n現在の値;
\r
2267 if ( pChip.nチャンネル番号 == OPEN )
\r
2269 int xo = ( inst == E楽器パート.GUITAR ) ? 509 : 400;
\r
2270 this.txチップ.t2D描画( CDTXMania.app.Device, xo, y - 2, new Rectangle( 268, 144 + ( ( nアニメカウンタ現在の値 % 5 ) * 6 ), 76, 6 ) );
\r
2272 Rectangle rc = new Rectangle( 268, nアニメカウンタ現在の値 * 6, 24, 6 );
\r
2274 if ( inst == E楽器パート.GUITAR )
\r
2276 x = ( configIni.bLeft.Guitar ) ? 561 : 509;
\r
2280 x = ( configIni.bLeft.Bass ) ? 452 : 400;
\r
2282 int deltaX = ( configIni.bLeft[ instIndex ] ) ? -26 : +26;
\r
2286 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - 3, rc );
\r
2292 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - 3, rc );
\r
2298 this.txチップ.t2D描画( CDTXMania.app.Device, x, y - 3, rc );
\r
2303 //if ( ( configIni.bAutoPlay.Guitar && !pChip.bHit ) && ( pChip.nバーからの距離dot.Guitar < 0 ) )
\r
2304 if ( ( !pChip.bHit ) && ( pChip.nバーからの距離dot[ instIndex ] < 0 ) )
\r
2306 int lo = ( inst == E楽器パート.GUITAR ) ? 0 : 3; // lane offset
\r
2307 bool autoR = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtR : bIsAutoPlay.BsR;
\r
2308 bool autoG = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtG : bIsAutoPlay.BsG;
\r
2309 bool autoB = ( inst == E楽器パート.GUITAR ) ? bIsAutoPlay.GtB : bIsAutoPlay.BsB;
\r
2310 if ( ( bChipHasR || bChipIsO ) && autoR )
\r
2312 this.actChipFireGB.Start( 0 + lo);
\r
2314 if ( ( bChipHasG || bChipIsO ) && autoG )
\r
2316 this.actChipFireGB.Start( 1 + lo );
\r
2318 if ( ( bChipHasB || bChipIsO ) && autoB )
\r
2320 this.actChipFireGB.Start( 2 + lo );
\r
2322 if ( (inst == E楽器パート.GUITAR && bIsAutoPlay.GtPick ) || (inst == E楽器パート.BASS && bIsAutoPlay.BsPick ) )
\r
2324 bool pushingR = CDTXMania.Pad.b押されている( inst, Eパッド.R );
\r
2325 bool pushingG = CDTXMania.Pad.b押されている( inst, Eパッド.G );
\r
2326 bool pushingB = CDTXMania.Pad.b押されている( inst, Eパッド.B );
\r
2327 bool bMiss = true;
\r
2328 if ( ( ( bChipIsO == true ) && ( !pushingR | autoR ) && ( !pushingG | autoG ) && ( !pushingB | autoB ) ) ||
\r
2329 ( ( bChipHasR == ( pushingR | autoR ) ) && ( bChipHasG == ( pushingG | autoG ) ) && ( bChipHasB == ( pushingB | autoB ) ) )
\r
2334 pChip.bHit = true;
\r
2335 this.tサウンド再生( pChip, CDTXMania.Timer.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, inst, dTX.nモニタを考慮した音量( inst ), false, bMiss );
\r
2336 this.r次にくるギターChip = null;
\r
2337 this.tチップのヒット処理( pChip.n発声時刻ms, pChip );
\r
2342 } // end of "if configIni.bGuitar有効"
\r
2343 if ( !pChip.bHit && ( pChip.nバーからの距離dot[ instIndex ] < 0 ) ) // Guitar/Bass無効の場合は、自動演奏する
\r
2345 pChip.bHit = true;
\r
2346 this.tサウンド再生( pChip, CDTXMania.Timer.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, inst, dTX.nモニタを考慮した音量( inst ) );
\r
2350 protected void t進行描画_チップ_ギター_ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )
\r
2352 //if ( configIni.bGuitar有効 )
\r
2354 // // 後日、以下の部分を何とかCStage演奏画面共通.csに移したい。
\r
2355 // if ( !pChip.bHit && pChip.b可視 )
\r
2357 // if ( this.txチップ != null )
\r
2359 // this.txチップ.n透明度 = pChip.n透明度;
\r
2361 // int[] y_base = {
\r
2362 // 演奏判定ライン座標.n判定ラインY座標( E楽器パート.GUITAR, false, false ), // 95
\r
2363 // 演奏判定ライン座標.n判定ラインY座標( E楽器パート.GUITAR, false, true ) // 374
\r
2364 // }; // ドラム画面かギター画面かで変わる値
\r
2365 // //int[] y_base = { 0x5f, 0x176 }; // 判定バーのY座標: ドラム画面かギター画面かで変わる値
\r
2366 // int offset = (int) ( 0x39 * Scale.Y ); // ドラム画面かギター画面かで変わる値
\r
2368 // const int WailingWidth = (int) ( 20 * Scale.X ); // ウェイリングチップ画像の幅: 4種全て同じ値
\r
2369 // const int WailingHeight = (int) ( 50 * Scale.Y ); // ウェイリングチップ画像の高さ: 4種全て同じ値
\r
2370 // const int baseTextureOffsetX = (int) ( 268 * Scale.X ); // テクスチャ画像中のウェイリングチップ画像の位置X: ドラム画面かギター画面かで変わる値
\r
2371 // const int baseTextureOffsetY = (int) ( 174 * Scale.Y ); // テクスチャ画像中のウェイリングチップ画像の位置Y: ドラム画面かギター画面かで変わる値
\r
2372 // const int drawX = (int) ( 588 * Scale.X ); // ウェイリングチップ描画位置X座標: 4種全て異なる値
\r
2374 // const int numA = (int) ( 26 * Scale.Y ); // ドラム画面かギター画面かで変わる値
\r
2375 // int y = configIni.bReverse.Guitar ?
\r
2376 // ( y_base[1] - (int) ( pChip.nバーからの距離dot.Guitar * Scale.Y ) ) :
\r
2377 // ( y_base[0] + (int) ( pChip.nバーからの距離dot.Guitar * Scale.Y ) );
\r
2378 // int numB = y - offset; // 4種全て同じ定義
\r
2379 // int numC = 0; // 4種全て同じ初期値
\r
2380 // const int showRangeY1 = (int) ( 355 * Scale.Y ); // ドラム画面かギター画面かで変わる値
\r
2381 // if ( ( numB < ( showRangeY1 + numA ) ) && ( numB > -numA ) ) // 以下のロジックは4種全て同じ
\r
2383 // int c = this.ctWailingチップ模様アニメ.n現在の値;
\r
2384 // Rectangle rect = new Rectangle(
\r
2385 // baseTextureOffsetX + ( c * WailingWidth ),
\r
2386 // baseTextureOffsetY,
\r
2390 // if ( numB < numA )
\r
2392 // rect.Y += numA - numB;
\r
2393 // rect.Height -= numA - numB;
\r
2394 // numC = numA - numB;
\r
2396 // if ( numB > ( showRangeY1 - numA ) )
\r
2398 // rect.Height -= numB - ( showRangeY1 - numA );
\r
2400 // if ( ( rect.Bottom > rect.Top ) && ( this.txチップ != null ) )
\r
2402 // this.txチップ.t2D描画( CDTXMania.app.Device,
\r
2404 // ( ( y - numA ) + numC ),
\r
2411 base.t進行描画_チップ_ギター_ウェイリング( configIni, ref dTX, ref pChip, false );
\r
2413 protected override void t進行描画_チップ_フィルイン( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )
\r
2415 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2417 pChip.bHit = true;
\r
2418 switch ( pChip.n整数値 )
\r
2420 case 0x01: // フィルイン開始
\r
2421 if ( configIni.bフィルイン有効 )
\r
2423 this.bフィルイン中 = true;
\r
2427 case 0x02: // フィルイン終了
\r
2428 if ( configIni.bフィルイン有効 )
\r
2430 this.bフィルイン中 = false;
\r
2432 if ( ( ( this.actCombo.n現在のコンボ数.Drums > 0 ) || configIni.bドラムが全部オートプレイである ) && configIni.b歓声を発声する )
\r
2434 if ( this.r現在の歓声Chip.Drums != null )
\r
2436 dTX.tチップの再生( this.r現在の歓声Chip.Drums, CSound管理.rc演奏用タイマ.nシステム時刻, (int) Eレーン.BGM, dTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );
\r
2440 CDTXMania.Skin.sound歓声音.n位置_次に鳴るサウンド = 0;
\r
2441 CDTXMania.Skin.sound歓声音.t再生する();
\r
2445 #if TEST_NOTEOFFMODE // 2011.1.1 yyagi TEST
\r
2446 case 0x04: // HH消音あり(従来同等)
\r
2447 CDTXMania.DTX.b演奏で直前の音を消音する.HH = true;
\r
2449 case 0x05: // HH消音無し
\r
2450 CDTXMania.DTX.b演奏で直前の音を消音する.HH = false;
\r
2452 case 0x06: // ギター消音あり(従来同等)
\r
2453 CDTXMania.DTX.b演奏で直前の音を消音する.Gutiar = true;
\r
2455 case 0x07: // ギター消音無し
\r
2456 CDTXMania.DTX.b演奏で直前の音を消音する.Gutiar = false;
\r
2458 case 0x08: // ベース消音あり(従来同等)
\r
2459 CDTXMania.DTX.b演奏で直前の音を消音する.Bass = true;
\r
2461 case 0x09: // ベース消音無し
\r
2462 CDTXMania.DTX.b演奏で直前の音を消音する.Bass = false;
\r
2469 protected override void t進行描画・チップ・ベース( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )
\r
2471 if ( configIni.bGuitar有効 )
\r
2473 if ( configIni.bSudden.Bass )
\r
2475 pChip.b可視 = pChip.nバーからの距離dot.Bass < 200;
\r
2477 if ( configIni.bHidden.Bass && ( pChip.nバーからの距離dot.Bass < 100 ) )
\r
2479 pChip.b可視 = false;
\r
2482 bool bGtBsR = ( ( pChip.nチャンネル番号 & 4 ) > 0 );
\r
2483 bool bGtBsG = ( ( pChip.nチャンネル番号 & 2 ) > 0 );
\r
2484 bool bGtBsB = ( ( pChip.nチャンネル番号 & 1 ) > 0 );
\r
2485 bool bGtBsW = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x08 );
\r
2486 bool bGtBsO = ( ( pChip.nチャンネル番号 & 0x0F ) == 0x00 );
\r
2487 if ( !pChip.bHit && pChip.b可視 )
\r
2489 int y = configIni.bReverse.Bass ? ( 374 - pChip.nバーからの距離dot.Bass ) : ( 95 + pChip.nバーからの距離dot.Bass );
\r
2490 if ( ( y > 57 ) && ( y < 412 ) )
\r
2492 int nアニメカウンタ現在の値 = this.ctチップ模様アニメ.Bass.n現在の値;
\r
2493 if ( pChip.nチャンネル番号 == 0xA0 )
\r
2495 if ( this.txチップ != null )
\r
2497 this.txチップ.t2D描画( CDTXMania.app.Device, 400, y - 2, new Rectangle( 268, 144 + ( ( nアニメカウンタ現在の値 % 5 ) * 6 ), 76, 6 ) );
\r
2500 else if ( this.txチップ != null )
\r
2502 int x = ( configIni.bLeft.Bass ) ? 452 : 400;
\r
2503 int deltaX = ( configIni.bLeft.Bass ) ? -24 : +24;
\r
2504 Rectangle rc = new Rectangle( 268, nアニメカウンタ現在の値 * 6, 24, 6 );
\r
2507 this.txチップ.t2D描画( CDTXMania.app.Device, 400, y - 3, rc );
\r
2513 this.txチップ.t2D描画( CDTXMania.app.Device, 0x1aa, y - 3, rc );
\r
2519 this.txチップ.t2D描画( CDTXMania.app.Device, 0x1c4, y - 3, rc );
\r
2524 if ( ( configIni.bAutoPlay.Bass && !pChip.bHit ) && ( pChip.nバーからの距離dot.Bass < 0 ) )
\r
2526 if ( ( bGtBsR || ( pChip.nチャンネル番号 == 0xA0 ) ) && bIsAutoPlay.BsR )
\r
2528 this.actChipFireGB.Start( 3 );
\r
2530 if ( ( bGtBsG || ( pChip.nチャンネル番号 == 0xA0 ) ) && bIsAutoPlay.BsG )
\r
2532 this.actChipFireGB.Start( 4 );
\r
2534 if ( ( bGtBsB || ( pChip.nチャンネル番号 == 0xA0 ) ) && bIsAutoPlay.BsB )
\r
2536 this.actChipFireGB.Start( 5 );
\r
2538 if ( bIsAutoPlay.BsPick )
\r
2540 pChip.bHit = true;
\r
2541 this.tサウンド再生( pChip, CDTXMania.Timer.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, E楽器パート.BASS, dTX.nモニタを考慮した音量( E楽器パート.BASS ) );
\r
2542 this.r次にくるベースChip = null;
\r
2543 this.tチップのヒット処理( pChip.n発声時刻ms, pChip );
\r
2548 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Bass < 0 ) )
\r
2550 this.tサウンド再生( pChip, CDTXMania.Timer.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, E楽器パート.BASS, dTX.nモニタを考慮した音量( E楽器パート.BASS ) );
\r
2551 pChip.bHit = true;
\r
2555 protected void t進行描画_チップ_ベース_ウェイリング( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )
\r
2557 //if ( configIni.bGuitar有効 )
\r
2559 // // 後日、以下の部分を何とかCStage演奏画面共通.csに移したい。
\r
2560 // if ( !pChip.bHit && pChip.b可視 )
\r
2562 // if ( this.txチップ != null )
\r
2564 // this.txチップ.n透明度 = pChip.n透明度;
\r
2566 // int[] y_base = {
\r
2567 // 演奏判定ライン座標.n判定ラインY座標( E楽器パート.BASS, false, false ),
\r
2568 // 演奏判定ライン座標.n判定ラインY座標( E楽器パート.BASS, false, true )
\r
2569 // }; // ドラム画面かギター画面かで変わる値
\r
2570 // //int[] y_base = { 0x5f, 0x176 }; // 判定バーのY座標: ドラム画面かギター画面かで変わる値
\r
2571 // int offset = (int) ( 0x39 * Scale.Y ); // ドラム画面かギター画面かで変わる値
\r
2573 // const int WailingWidth = (int) ( 20 * Scale.X ); // ウェイリングチップ画像の幅: 4種全て同じ値
\r
2574 // const int WailingHeight = (int) ( 50 * Scale.Y ); // ウェイリングチップ画像の高さ: 4種全て同じ値
\r
2575 // const int baseTextureOffsetX = (int) ( 268 * Scale.X ); // テクスチャ画像中のウェイリングチップ画像の位置X: ドラム画面かギター画面かで変わる値
\r
2576 // const int baseTextureOffsetY = (int) ( 174 * Scale.Y ); // テクスチャ画像中のウェイリングチップ画像の位置Y: ドラム画面かギター画面かで変わる値
\r
2577 // const int drawX = (int) ( 479 * Scale.X ); // ウェイリングチップ描画位置X座標: 4種全て異なる値
\r
2579 // const int numA = (int) ( 26 * Scale.Y ); // ドラム画面かギター画面かで変わる値
\r
2580 // int y = configIni.bReverse.Bass ?
\r
2581 // ( y_base[ 1 ] - (int) ( pChip.nバーからの距離dot.Bass * Scale.Y ) ) :
\r
2582 // ( y_base[ 0 ] + (int) ( pChip.nバーからの距離dot.Bass * Scale.Y ) );
\r
2583 // int numB = y - offset; // 4種全て同じ定義
\r
2584 // int numC = 0; // 4種全て同じ初期値
\r
2585 // const int showRangeY1 = (int) ( 355 * Scale.Y ); // ドラム画面かギター画面かで変わる値
\r
2586 // if ( ( numB < ( showRangeY1 + numA ) ) && ( numB > -numA ) ) // 以下のロジックは4種全て同じ
\r
2588 // int c = this.ctWailingチップ模様アニメ.n現在の値;
\r
2589 // Rectangle rect = new Rectangle(
\r
2590 // baseTextureOffsetX + ( c * WailingWidth ),
\r
2591 // baseTextureOffsetY,
\r
2595 // if ( numB < numA )
\r
2597 // rect.Y += numA - numB;
\r
2598 // rect.Height -= numA - numB;
\r
2599 // numC = numA - numB;
\r
2601 // if ( numB > ( showRangeY1 - numA ) )
\r
2603 // rect.Height -= numB - ( showRangeY1 - numA );
\r
2605 // if ( ( rect.Bottom > rect.Top ) && ( this.txチップ != null ) )
\r
2607 // this.txチップ.t2D描画( CDTXMania.app.Device,
\r
2609 // ( ( y - numA ) + numC ),
\r
2615 base.t進行描画_チップ_ベース_ウェイリング( configIni, ref dTX, ref pChip, false );
\r
2617 protected override void t進行描画_チップ_空打ち音設定_ドラム( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )
\r
2619 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2621 pChip.bHit = true;
\r
2622 this.r現在の空うちドラムChip[ (int) this.eチャンネルtoパッド[ pChip.nチャンネル番号 - 0x11 ] ] = pChip;
\r
2623 //pChip.nチャンネル番号 = ( pChip.nチャンネル番号 != 0xbc ) ? ( ( pChip.nチャンネル番号 - 0xb1 ) + 0x11 ) : 0x1a;
\r
2626 protected override void t進行描画_チップ_小節線( CConfigIni configIni, ref CDTX dTX, ref CDTX.CChip pChip )
\r
2628 int n小節番号plus1 = pChip.n発声位置 / 384;
\r
2629 if ( !pChip.bHit && ( pChip.nバーからの距離dot.Drums < 0 ) )
\r
2631 pChip.bHit = true;
\r
2632 this.actPlayInfo.n小節番号 = n小節番号plus1 - 1;
\r
2633 if ( configIni.bWave再生位置自動調整機能有効 && ( bIsDirectSound || bUseOSTimer ) )
\r
2635 dTX.tWave再生位置自動補正();
\r
2639 // dTX.tWaveBGM再生位置表示(); //デバッグ用
\r
2643 #region [ Drumsの小節線と、小節番号 ]
\r
2644 if ( configIni.bDrums有効 )
\r
2646 if ( configIni.b演奏情報を表示する && ( configIni.eDark == Eダークモード.OFF ) )
\r
2648 int n小節番号 = n小節番号plus1 - 1;
\r
2649 CDTXMania.act文字コンソール.tPrint(
\r
2650 (int) ( 0x14d * Scale.X ),
\r
2651 configIni.bReverse.Drums ?
\r
2652 (int) ( 0x38 * Scale.Y + pChip.nバーからの距離dot.Drums ) :
\r
2653 (int) ( 0x195 * Scale.Y - pChip.nバーからの距離dot.Drums ),
\r
2654 C文字コンソール.Eフォント種別.白,
\r
2658 if ( ( ( configIni.eDark != Eダークモード.FULL ) && pChip.b可視 ) && ( this.txチップ != null ) )
\r
2660 this.txチップ.n透明度 = 255;
\r
2661 this.txチップ.t2D描画( CDTXMania.app.Device,
\r
2663 configIni.bReverse.Drums ?
\r
2664 //( int ) ( ( ( 0x38 + pChip.nバーからの距離dot.Drums ) - 1 ) * Scale.Y ) :
\r
2665 //( int ) ( ( ( 0x1a6 - pChip.nバーからの距離dot.Drums ) - 1 ) * Scale.Y ),
\r
2666 (int) ( 0x37 * Scale.Y + pChip.nバーからの距離dot.Drums ) :
\r
2667 (int) ( 0x1a5 * Scale.Y - pChip.nバーからの距離dot.Drums ),
\r
2668 new Rectangle( 0, ( int ) ( 0x1bc * Scale.Y ), ( int ) ( 0x128 * Scale.X ), ( int ) ( 2 * Scale.Y ) ) );
\r
2672 if ( ( pChip.b可視 && configIni.bGuitar有効 ) && ( configIni.eDark != Eダークモード.FULL ) && ( this.txチップ != null ) )
\r
2674 this.txチップ.n透明度 = 255;
\r
2675 #region [ Guitarの小節線 ]
\r
2676 //int y = configIni.bReverse.Guitar ? ( ( 0x176 - pChip.nバーからの距離dot.Guitar ) - 1 ) : ( ( 0x5f + pChip.nバーからの距離dot.Guitar ) - 1 );
\r
2677 int y = 演奏判定ライン座標.n判定ラインY座標( E楽器パート.GUITAR, false, configIni.bReverse.Guitar );
\r
2678 if ( configIni.bReverse.Guitar )
\r
2680 y = y - (int) ( pChip.nバーからの距離dot.Guitar ) - 1;
\r
2684 y = y + (int) ( pChip.nバーからの距離dot.Guitar ) - 1;
\r
2687 // Reverse時の小節線消失位置を、RGBボタンの真ん中程度に。
\r
2688 // 非Reverse時の消失処理は、従来通りt進行描画・チップ()にお任せ。
\r
2689 n小節線消失距離dot = configIni.bReverse.Guitar ?
\r
2690 (int) ( -100 * Scale.Y ):
\r
2691 ( configIni.e判定位置.Guitar == E判定位置.標準 ) ? (int) ( -50 * Scale.Y ) : (int) ( -25 * Scale.Y );
\r
2693 if ( ( dTX.bチップがある.Guitar ) &&
\r
2694 ( 0x39 * Scale.Y < y ) && ( ( y < 0x19c * Scale.Y ) ) &&
\r
2695 ( pChip.nバーからの距離dot.Guitar >= n小節線消失距離dot )
\r
2699 CDTXMania.app.Device,
\r
2704 (int) ( 450 * Scale.Y ),
\r
2705 (int) ( 0x4e * Scale.X ),
\r
2706 (int) ( 1 * Scale.Y )
\r
2711 #region [ Bassの小節線 ]
\r
2712 //y = configIni.bReverse.Bass ? ( ( 0x176 - pChip.nバーからの距離dot.Bass ) - 1 ) : ( ( 0x5f + pChip.nバーからの距離dot.Bass ) - 1 );
\r
2713 y = 演奏判定ライン座標.n判定ラインY座標( E楽器パート.BASS, false, configIni.bReverse.Bass );
\r
2714 if ( configIni.bReverse.Bass )
\r
2716 y = y - (int) ( pChip.nバーからの距離dot.Bass ) - 1;
\r
2720 y = y + (int) ( pChip.nバーからの距離dot.Bass ) - 1;
\r
2722 n小節線消失距離dot = configIni.bReverse.Bass ?
\r
2723 (int) ( -100 * Scale.Y ) :
\r
2724 ( configIni.e判定位置.Bass == E判定位置.標準 ) ? (int) ( -50 * Scale.Y ) : (int) ( -25 * Scale.Y );
\r
2726 if ( ( dTX.bチップがある.Bass ) &&
\r
2727 ( 0x39 * Scale.Y < y ) && ( y < 0x19c * Scale.Y ) &&
\r
2728 ( pChip.nバーからの距離dot.Bass >= n小節線消失距離dot )
\r
2732 CDTXMania.app.Device,
\r
2737 (int) ( 450 * Scale.Y ),
\r
2738 (int) ( 0x4e * Scale.X ),
\r
2739 (int) ( 1 * Scale.Y )
\r