2 using System.Collections.Generic;
\r
4 using System.Runtime.InteropServices;
\r
5 using System.Drawing;
\r
6 using System.Diagnostics;
\r
12 internal class CStage選曲 : CStage
\r
16 public bool bIsEnumeratingSongs
\r
20 return act曲リスト.bIsEnumeratingSongs;
\r
24 act曲リスト.bIsEnumeratingSongs = value;
\r
27 public bool bIsPlayingPremovie
\r
31 return this.actPreimageパネル.bIsPlayingPremovie;
\r
38 return this.act曲リスト.bスクロール中;
\r
41 public int n確定された曲の難易度
\r
46 public Cスコア r確定されたスコア
\r
51 public C曲リストノード r確定された曲
\r
56 public int n現在選択中の曲の難易度
\r
60 return this.act曲リスト.n現在選択中の曲の現在の難易度レベル;
\r
63 public Cスコア r現在選択中のスコア
\r
67 return this.act曲リスト.r現在選択中のスコア;
\r
70 public C曲リストノード r現在選択中の曲
\r
74 return this.act曲リスト.r現在選択中の曲;
\r
81 base.eステージID = CStage.Eステージ.選曲;
\r
82 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
83 base.b活性化してない = true;
\r
84 base.list子Activities.Add( this.actオプションパネル = new CActオプションパネル() );
\r
85 base.list子Activities.Add( this.actFIFO = new CActFIFOBlack() );
\r
86 base.list子Activities.Add( this.actFIfrom結果画面 = new CActFIFOBlack() );
\r
87 // base.list子Activities.Add( this.actFOtoNowLoading = new CActFIFOBlack() ); // #27787 2012.3.10 yyagi 曲決定時の画面フェードアウトの省略
\r
88 base.list子Activities.Add( this.act曲リスト = new CActSelect曲リスト() );
\r
89 base.list子Activities.Add( this.actステータスパネル = new CActSelectステータスパネル() );
\r
90 base.list子Activities.Add( this.act演奏履歴パネル = new CActSelect演奏履歴パネル() );
\r
91 base.list子Activities.Add( this.actPreimageパネル = new CActSelectPreimageパネル() );
\r
92 base.list子Activities.Add( this.actPresound = new CActSelectPresound() );
\r
93 base.list子Activities.Add( this.actArtistComment = new CActSelectArtistComment() );
\r
94 base.list子Activities.Add( this.actInformation = new CActSelectInformation() );
\r
95 base.list子Activities.Add( this.actSortSongs = new CActSortSongs() );
\r
97 this.CommandHistory = new CCommandHistory(); // #24063 2011.1.16 yyagi
\r
98 // this.actSortSongs.bIsActiveSortMenu = false; // #23615 2011.3.28 yyagi
\r
104 public void t選択曲変更通知()
\r
106 this.actPreimageパネル.t選択曲が変更された();
\r
107 this.actPresound.t選択曲が変更された();
\r
108 this.act演奏履歴パネル.t選択曲が変更された();
\r
109 this.actステータスパネル.t選択曲が変更された();
\r
110 this.actArtistComment.t選択曲が変更された();
\r
112 #region [ プラグインにも通知する(BOX, RANDOM, BACK なら通知しない)]
\r
113 //---------------------
\r
114 if( CDTXMania.app != null )
\r
116 var c曲リストノード = CDTXMania.stage選曲.r現在選択中の曲;
\r
117 var cスコア = CDTXMania.stage選曲.r現在選択中のスコア;
\r
119 if( c曲リストノード != null && cスコア != null && c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE )
\r
121 string str選択曲ファイル名 = cスコア.ファイル情報.ファイルの絶対パス;
\r
122 CSetDef setDef = null;
\r
123 int nブロック番号inSetDef = -1;
\r
124 int n曲番号inブロック = -1;
\r
126 if( !string.IsNullOrEmpty( c曲リストノード.pathSetDefの絶対パス ) && File.Exists( c曲リストノード.pathSetDefの絶対パス ) )
\r
128 setDef = new CSetDef( c曲リストノード.pathSetDefの絶対パス );
\r
129 nブロック番号inSetDef = c曲リストノード.SetDefのブロック番号;
\r
130 n曲番号inブロック = CDTXMania.stage選曲.act曲リスト.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( c曲リストノード );
\r
133 foreach( CDTXMania.STPlugin stPlugin in CDTXMania.app.listプラグイン )
\r
135 Directory.SetCurrentDirectory( stPlugin.strプラグインフォルダ );
\r
136 stPlugin.plugin.On選択曲変更( str選択曲ファイル名, setDef, nブロック番号inSetDef, n曲番号inブロック );
\r
137 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
141 //---------------------
\r
151 /// <param name="cs"></param>
\r
152 public void Refresh( CSongs管理 cs, bool bRemakeSongTitleBar)
\r
154 this.act曲リスト.Refresh( cs, bRemakeSongTitleBar );
\r
157 public override void On活性化()
\r
159 Trace.TraceInformation( "選曲ステージを活性化します。" );
\r
163 this.eフェードアウト完了時の戻り値 = E戻り値.継続;
\r
164 this.bBGM再生済み = false;
\r
166 // this.actSortSongs.bIsActiveSortMenu = false;
\r
168 // this.n前回Bassを踏んだ時刻 = -1;
\r
169 // this.n前回HHを叩いた時刻 = -1;
\r
170 // this.n前回ギターをPickした時刻 = -1;
\r
171 // this.n前回ベースをPickした時刻 = -1;
\r
172 this.ftフォント = new Font( "MS PGothic", 26f, GraphicsUnit.Pixel );
\r
173 for( int i = 0; i < 4; i++ )
\r
174 this.ctキー反復用[ i ] = new CCounter( 0, 0, 0, CDTXMania.Timer );
\r
178 this.actステータスパネル.t選択曲が変更された(); // 最大ランクを更新
\r
182 Trace.TraceInformation( "選曲ステージの活性化を完了しました。" );
\r
186 public override void On非活性化()
\r
188 Trace.TraceInformation( "選曲ステージを非活性化します。" );
\r
192 if( this.ftフォント != null )
\r
194 this.ftフォント.Dispose();
\r
195 this.ftフォント = null;
\r
197 for( int i = 0; i < 4; i++ )
\r
199 this.ctキー反復用[ i ] = null;
\r
205 Trace.TraceInformation( "選曲ステージの非活性化を完了しました。" );
\r
209 public override void OnManagedリソースの作成()
\r
211 if( !base.b活性化してない )
\r
213 this.tx背景 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenSelect background.jpg" ), false );
\r
214 this.tx上部パネル = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenSelect header panel.png" ), true );
\r
215 this.tx下部パネル = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenSelect footer panel.png" ), true );
\r
216 this.txコメントバー = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenSelect comment bar.png" ), true );
\r
217 this.txFLIP = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenSelect skill number on gauge etc.png" ), false );
\r
218 base.OnManagedリソースの作成();
\r
221 public override void OnManagedリソースの解放()
\r
223 if( !base.b活性化してない )
\r
225 CDTXMania.tテクスチャの解放( ref this.tx背景 );
\r
226 CDTXMania.tテクスチャの解放( ref this.tx上部パネル );
\r
227 CDTXMania.tテクスチャの解放( ref this.tx下部パネル );
\r
228 CDTXMania.tテクスチャの解放( ref this.txコメントバー );
\r
229 CDTXMania.tテクスチャの解放( ref this.txFLIP );
\r
230 base.OnManagedリソースの解放();
\r
233 public override int On進行描画()
\r
235 if( !base.b活性化してない )
\r
237 #region [ 初めての進行描画 ]
\r
238 //---------------------
\r
239 if( base.b初めての進行描画 )
\r
241 this.ct登場時アニメ用共通 = new CCounter( 0, 100, 3, CDTXMania.Timer );
\r
242 if( CDTXMania.r直前のステージ == CDTXMania.stage結果 )
\r
244 this.actFIfrom結果画面.tフェードイン開始();
\r
245 base.eフェーズID = CStage.Eフェーズ.選曲_結果画面からのフェードイン;
\r
249 this.actFIFO.tフェードイン開始();
\r
250 base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;
\r
253 base.b初めての進行描画 = false;
\r
255 //---------------------
\r
258 this.ct登場時アニメ用共通.t進行();
\r
260 if( this.tx背景 != null )
\r
261 this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );
\r
263 this.actPreimageパネル.On進行描画();
\r
264 // this.bIsEnumeratingSongs = !this.actPreimageパネル.bIsPlayingPremovie; // #27060 2011.3.2 yyagi: #PREMOVIE再生中は曲検索を中断する
\r
266 this.act曲リスト.On進行描画();
\r
268 if( this.ct登場時アニメ用共通.b進行中 )
\r
270 double db登場割合 = ( (double) this.ct登場時アニメ用共通.n現在の値 ) / 100.0; // 100が最終値
\r
271 double dbY表示割合 = Math.Sin( Math.PI / 2 * db登場割合 );
\r
272 y = ( (int) ( this.tx上部パネル.sz画像サイズ.Height * dbY表示割合 ) ) - this.tx上部パネル.sz画像サイズ.Height;
\r
274 if( this.tx上部パネル != null )
\r
275 this.tx上部パネル.t2D描画( CDTXMania.app.Device, 0, y );
\r
277 this.actInformation.On進行描画();
\r
278 if( this.tx下部パネル != null )
\r
279 this.tx下部パネル.t2D描画( CDTXMania.app.Device, 0, 480 - this.tx下部パネル.sz画像サイズ.Height );
\r
281 this.actステータスパネル.On進行描画();
\r
282 this.act演奏履歴パネル.On進行描画();
\r
283 this.actPresound.On進行描画();
\r
284 if( this.txコメントバー != null )
\r
286 this.txコメントバー.t2D描画( CDTXMania.app.Device, 0xf2, 0xe4 );
\r
288 this.actArtistComment.On進行描画();
\r
289 this.actオプションパネル.On進行描画();
\r
290 if ( this.txFLIP != null && CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.16 yyagi
\r
292 Rectangle rect = new Rectangle(31, 49, 20, 11);
\r
293 this.txFLIP.t2D描画( CDTXMania.app.Device, 40, 436, rect );
\r
295 switch ( base.eフェーズID )
\r
297 case CStage.Eフェーズ.共通_フェードイン:
\r
298 if( this.actFIFO.On進行描画() != 0 )
\r
300 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
304 case CStage.Eフェーズ.共通_フェードアウト:
\r
305 if( this.actFIFO.On進行描画() == 0 )
\r
309 return (int) this.eフェードアウト完了時の戻り値;
\r
311 case CStage.Eフェーズ.選曲_結果画面からのフェードイン:
\r
312 if( this.actFIfrom結果画面.On進行描画() != 0 )
\r
314 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
318 case CStage.Eフェーズ.選曲_NowLoading画面へのフェードアウト:
\r
319 // if( this.actFOtoNowLoading.On進行描画() == 0 )
\r
323 return (int) this.eフェードアウト完了時の戻り値;
\r
325 if( !this.bBGM再生済み && ( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 ) )
\r
327 CDTXMania.Skin.bgm選曲画面.n音量・次に鳴るサウンド = 100;
\r
328 CDTXMania.Skin.bgm選曲画面.t再生する();
\r
329 this.bBGM再生済み = true;
\r
333 //Debug.WriteLine( "パンくず=" + this.r現在選択中の曲.strBreadcrumbs );
\r
337 if( base.eフェーズID == CStage.Eフェーズ.共通_通常状態
\r
338 && CDTXMania.act現在入力を占有中のプラグイン == null )
\r
340 if ( !this.actSortSongs.bIsActiveSortMenu )
\r
342 if ( CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Escape ) || ( ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.FT ) || CDTXMania.Pad.b押されたGB( Eパッド.Cancel ) ) && ( ( this.act曲リスト.r現在選択中の曲 != null ) && ( this.act曲リスト.r現在選択中の曲.r親ノード == null ) ) ) )
\r
344 CDTXMania.Skin.sound取消音.t再生する();
\r
345 this.eフェードアウト完了時の戻り値 = E戻り値.タイトルに戻る;
\r
346 this.actFIFO.tフェードアウト開始();
\r
347 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\r
350 if ( ( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) &&
\r
351 CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.F1 ) )
\r
352 { // [SHIFT] + [F1] OPTION
\r
353 this.actPresound.tサウンド停止();
\r
354 // this.eフェードアウト完了時の戻り値 = E戻り値.オプション呼び出し;
\r
355 this.eフェードアウト完了時の戻り値 = E戻り値.コンフィグ呼び出し; // #24525 2011.3.16 yyagi: [SHIFT]-[F1]でCONFIG呼び出し
\r
356 this.actFIFO.tフェードアウト開始();
\r
357 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\r
358 CDTXMania.Skin.sound取消音.t再生する();
\r
361 // #24525 2011.3.16 yyagi: [SHIFT]+[F2]は廃止(将来発生するかもしれない別用途のためにキープ)
\r
363 if ( ( CDTXMania.Input管理.Keyboard.bキーが押されている( (int)SlimDX.DirectInput.Key.RightShift ) || CDTXMania.Input管理.Keyboard.bキーが押されている( (int)SlimDX.DirectInput.Key.LeftShift ) ) &&
\r
364 CDTXMania.Input管理.Keyboard.bキーが押された( (int)SlimDX.DirectInput.Key.F2 ) )
\r
365 { // [SHIFT] + [F2] CONFIGURATION
\r
366 this.actPresound.tサウンド停止();
\r
367 this.eフェードアウト完了時の戻り値 = E戻り値.コンフィグ呼び出し;
\r
368 this.actFIFO.tフェードアウト開始();
\r
369 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\r
370 CDTXMania.Skin.sound取消音.t再生する();
\r
374 if ( this.act曲リスト.r現在選択中の曲 != null )
\r
376 if ( ( CDTXMania.Pad.b押されたDGB( Eパッド.Decide ) || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.RD ) ) ||
\r
377 ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LC ) || ( CDTXMania.ConfigIni.bEnterがキー割り当てのどこにも使用されていない && CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Return ) ) ) )
\r
379 CDTXMania.Skin.sound決定音.t再生する();
\r
380 if ( this.act曲リスト.r現在選択中の曲 != null )
\r
382 switch ( this.act曲リスト.r現在選択中の曲.eノード種別 )
\r
384 case C曲リストノード.Eノード種別.SCORE:
\r
388 case C曲リストノード.Eノード種別.SCORE_MIDI:
\r
392 case C曲リストノード.Eノード種別.BOX:
\r
393 this.act曲リスト.tBOXに入る();
\r
396 case C曲リストノード.Eノード種別.BACKBOX:
\r
397 this.act曲リスト.tBOXを出る();
\r
400 case C曲リストノード.Eノード種別.RANDOM:
\r
401 this.t曲をランダム選択する();
\r
406 this.ctキー反復用.Up.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.UpArrow ), new CCounter.DGキー処理( this.tカーソルを上へ移動する ) );
\r
407 this.ctキー反復用.R.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.R ), new CCounter.DGキー処理( this.tカーソルを上へ移動する ) );
\r
408 if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.SD ) )
\r
410 this.tカーソルを上へ移動する();
\r
412 this.ctキー反復用.Down.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDX.DirectInput.Key.DownArrow ), new CCounter.DGキー処理( this.tカーソルを下へ移動する ) );
\r
413 this.ctキー反復用.B.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.B ), new CCounter.DGキー処理( this.tカーソルを下へ移動する ) );
\r
414 if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LT ) )
\r
416 this.tカーソルを下へ移動する();
\r
418 if ( ( ( this.act曲リスト.r現在選択中の曲 != null ) && ( this.act曲リスト.r現在選択中の曲.r親ノード != null ) ) && ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.FT ) || CDTXMania.Pad.b押されたGB( Eパッド.Cancel ) ) )
\r
420 this.actPresound.tサウンド停止();
\r
421 CDTXMania.Skin.sound取消音.t再生する();
\r
422 this.act曲リスト.tBOXを出る();
\r
425 if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.BD ) )
\r
426 { // [BD]x2 スクロール速度変更
\r
427 CommandHistory.Add( E楽器パート.DRUMS, EパッドFlag.BD );
\r
428 EパッドFlag[] comChangeScrollSpeed = new EパッドFlag[] { EパッドFlag.BD, EパッドFlag.BD };
\r
429 if ( CommandHistory.CheckCommand( comChangeScrollSpeed, E楽器パート.DRUMS ) )
\r
431 Debug.WriteLine( "ドラムススクロール速度変更" );
\r
432 CDTXMania.ConfigIni.n譜面スクロール速度.Drums = ( CDTXMania.ConfigIni.n譜面スクロール速度.Drums + 1 ) % 0x10;
\r
433 CDTXMania.Skin.sound変更音.t再生する();
\r
436 if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.HH ) || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.HHO ) )
\r
438 CommandHistory.Add( E楽器パート.DRUMS, EパッドFlag.HH );
\r
439 EパッドFlag[] comChangeDifficulty = new EパッドFlag[] { EパッドFlag.HH, EパッドFlag.HH };
\r
440 if ( CommandHistory.CheckCommand( comChangeDifficulty, E楽器パート.DRUMS ) )
\r
442 Debug.WriteLine( "ドラムス難易度変更" );
\r
443 this.act曲リスト.t難易度レベルをひとつ進める();
\r
444 CDTXMania.Skin.sound変更音.t再生する();
\r
447 if ( CDTXMania.Pad.b押されている( E楽器パート.GUITAR, Eパッド.G ) && CDTXMania.Pad.b押された( E楽器パート.GUITAR, Eパッド.Pick ) ) // #24177 2011.1.17 yyagi || -> &&
\r
448 { // [G] + [Pick][Pick] ギター難易度変更
\r
449 CommandHistory.Add( E楽器パート.GUITAR, EパッドFlag.Pick | EパッドFlag.G );
\r
450 EパッドFlag[] comChangeDifficulty = new EパッドFlag[] { EパッドFlag.Pick | EパッドFlag.G, EパッドFlag.Pick | EパッドFlag.G };
\r
451 if ( CommandHistory.CheckCommand( comChangeDifficulty, E楽器パート.GUITAR ) )
\r
453 Debug.WriteLine( "ギター難易度変更" );
\r
454 this.act曲リスト.t難易度レベルをひとつ進める();
\r
455 CDTXMania.Skin.sound変更音.t再生する();
\r
458 if ( CDTXMania.Pad.b押されている( E楽器パート.BASS, Eパッド.G ) && CDTXMania.Pad.b押された( E楽器パート.BASS, Eパッド.Pick ) ) // #24177 2011.1.17 yyagi || -> &&
\r
459 { // [G] + [Pick][Pick] ベース難易度変更
\r
460 CommandHistory.Add( E楽器パート.BASS, EパッドFlag.Pick | EパッドFlag.G );
\r
461 EパッドFlag[] comChangeDifficulty = new EパッドFlag[] { EパッドFlag.Pick | EパッドFlag.G, EパッドFlag.Pick | EパッドFlag.G };
\r
462 if ( CommandHistory.CheckCommand( comChangeDifficulty, E楽器パート.BASS ) )
\r
464 Debug.WriteLine( "ベース難易度変更" );
\r
465 this.act曲リスト.t難易度レベルをひとつ進める();
\r
466 CDTXMania.Skin.sound変更音.t再生する();
\r
470 if ( CDTXMania.Pad.b押された( E楽器パート.GUITAR, Eパッド.Pick ) && !CDTXMania.Pad.b押されている( E楽器パート.GUITAR, Eパッド.G ) )
\r
471 { // ギター[Pick]: コマンドとしてEnqueue
\r
472 CommandHistory.Add( E楽器パート.GUITAR, EパッドFlag.Pick );
\r
473 // Pick, G, G, Pick で、ギターとベースを入れ替え
\r
474 EパッドFlag[] comSwapGtBs1 = new EパッドFlag[] { EパッドFlag.Pick, EパッドFlag.G, EパッドFlag.G, EパッドFlag.Pick };
\r
475 if ( CommandHistory.CheckCommand( comSwapGtBs1, E楽器パート.GUITAR ) )
\r
477 Debug.WriteLine( "ギターとベースの入れ替え1" );
\r
478 CDTXMania.Skin.sound変更音.t再生する();
\r
480 //CDTXMania.ConfigIni.SwapGuitarBassKeyAssign();
\r
481 CDTXMania.ConfigIni.bIsSwappedGuitarBass = !CDTXMania.ConfigIni.bIsSwappedGuitarBass;
\r
484 if ( CDTXMania.Pad.b押された( E楽器パート.BASS, Eパッド.Pick ) && !CDTXMania.Pad.b押されている( E楽器パート.BASS, Eパッド.G ) )
\r
485 { // ベース[Pick]: コマンドとしてEnqueue
\r
486 CommandHistory.Add( E楽器パート.BASS, EパッドFlag.Pick );
\r
487 // Pick, G, G, Pick で、ギターとベースを入れ替え
\r
488 EパッドFlag[] comSwapGtBs1 = new EパッドFlag[] { EパッドFlag.Pick, EパッドFlag.G, EパッドFlag.G, EパッドFlag.Pick };
\r
489 if ( CommandHistory.CheckCommand( comSwapGtBs1, E楽器パート.BASS ) )
\r
491 Debug.WriteLine( "ギターとベースの入れ替え2" );
\r
492 CDTXMania.Skin.sound変更音.t再生する();
\r
494 //CDTXMania.ConfigIni.SwapGuitarBassKeyAssign();
\r
495 CDTXMania.ConfigIni.bIsSwappedGuitarBass = !CDTXMania.ConfigIni.bIsSwappedGuitarBass;
\r
498 if ( CDTXMania.Pad.b押された( E楽器パート.GUITAR, Eパッド.G ) )
\r
499 { // ギター[G]: コマンドとしてEnqueue
\r
500 CommandHistory.Add( E楽器パート.GUITAR, EパッドFlag.G );
\r
501 // ギター G, G, G で、ソート画面に遷移
\r
502 EパッドFlag[] comSortGt = new EパッドFlag[] { EパッドFlag.G, EパッドFlag.G, EパッドFlag.G };
\r
503 if ( CommandHistory.CheckCommand( comSortGt, E楽器パート.GUITAR ) )
\r
505 CDTXMania.Skin.sound変更音.t再生する();
\r
506 Debug.WriteLine( "ソート画面発動(gt)" );
\r
507 //this.actSortSongs.bIsActiveSortMenu = !this.actSortSongs.bIsActiveSortMenu;
\r
508 this.actSortSongs.tActivateSortMenu( ref this.act曲リスト );
\r
511 if ( CDTXMania.Pad.b押された( E楽器パート.BASS, Eパッド.G ) )
\r
512 { // ベース[G]: コマンドとしてEnqueue
\r
513 CommandHistory.Add( E楽器パート.BASS, EパッドFlag.G );
\r
514 // ベース G, G, G で、ソート画面に遷移
\r
515 EパッドFlag[] comSortBs = new EパッドFlag[] { EパッドFlag.G, EパッドFlag.G, EパッドFlag.G };
\r
516 if ( CommandHistory.CheckCommand( comSortBs, E楽器パート.BASS ) )
\r
518 CDTXMania.Skin.sound変更音.t再生する();
\r
519 Debug.WriteLine( "ソート画面発動(bs)" );
\r
520 //this.actSortSongs.bIsActiveSortMenu = !this.actSortSongs.bIsActiveSortMenu;
\r
521 this.actSortSongs.tActivateSortMenu( ref this.act曲リスト );
\r
524 if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.HT ) )
\r
527 CommandHistory.Add( E楽器パート.DRUMS, EパッドFlag.HT );
\r
528 EパッドFlag[] comSort = new EパッドFlag[] { EパッドFlag.BD, EパッドFlag.HT };
\r
529 if ( CommandHistory.CheckCommand( comSort, E楽器パート.DRUMS ) )
\r
531 CDTXMania.Skin.sound変更音.t再生する();
\r
532 Debug.WriteLine( "ソート画面発動(dr)" );
\r
533 //this.actSortSongs.bIsActiveSortMenu = !this.actSortSongs.bIsActiveSortMenu;
\r
534 this.actSortSongs.tActivateSortMenu( ref this.act曲リスト );
\r
539 this.actSortSongs.t進行描画( this.actSortSongs.bIsActiveSortMenu );
\r
544 public enum E戻り値 : int
\r
556 #region [ private ]
\r
557 //-----------------
\r
558 [StructLayout( LayoutKind.Sequential )]
\r
559 private struct STキー反復用カウンタ
\r
561 public CCounter Up;
\r
562 public CCounter Down;
\r
565 public CCounter this[ int index ]
\r
583 throw new IndexOutOfRangeException();
\r
605 throw new IndexOutOfRangeException();
\r
609 private CActSelectArtistComment actArtistComment;
\r
610 private CActFIFOBlack actFIFO;
\r
611 private CActFIFOBlack actFIfrom結果画面;
\r
612 // private CActFIFOBlack actFOtoNowLoading; // #27787 2012.3.10 yyagi 曲決定時の画面フェードアウトの省略
\r
613 private CActSelectInformation actInformation;
\r
614 private CActSelectPreimageパネル actPreimageパネル;
\r
615 private CActSelectPresound actPresound;
\r
616 private CActオプションパネル actオプションパネル;
\r
617 private CActSelectステータスパネル actステータスパネル;
\r
618 private CActSelect演奏履歴パネル act演奏履歴パネル;
\r
619 private CActSelect曲リスト act曲リスト;
\r
621 private CActSortSongs actSortSongs;
\r
623 private bool bBGM再生済み;
\r
624 private STキー反復用カウンタ ctキー反復用;
\r
625 private CCounter ct登場時アニメ用共通;
\r
626 private E戻り値 eフェードアウト完了時の戻り値;
\r
627 private Font ftフォント;
\r
628 // private long n前回Bassを踏んだ時刻;
\r
629 // private long n前回HHを叩いた時刻;
\r
630 // private long n前回HTを叩いた時刻;
\r
631 // private long n前回ギターをPickした時刻;
\r
632 // private long n前回ベースをPickした時刻;
\r
633 private CTexture txコメントバー;
\r
634 private CTexture tx下部パネル;
\r
635 private CTexture tx上部パネル;
\r
636 private CTexture tx背景;
\r
637 private CTexture txFLIP;
\r
639 private struct STCommandTime // #24063 2011.1.16 yyagi コマンド入力時刻の記録用
\r
641 public E楽器パート eInst; // 使用楽器
\r
642 public EパッドFlag ePad; // 押されたコマンド(同時押しはOR演算で列挙する)
\r
643 public long time; // コマンド入力時刻
\r
645 private class CCommandHistory // #24063 2011.1.16 yyagi コマンド入力履歴を保持・確認するクラス
\r
647 readonly int buffersize = 16;
\r
648 private List<STCommandTime> stct;
\r
650 public CCommandHistory() // コンストラクタ
\r
652 stct = new List<STCommandTime>( buffersize );
\r
656 /// コマンド入力履歴へのコマンド追加
\r
658 /// <param name="_eInst">楽器の種類</param>
\r
659 /// <param name="_ePad">入力コマンド(同時押しはOR演算で列挙すること)</param>
\r
660 public void Add( E楽器パート _eInst, EパッドFlag _ePad )
\r
662 STCommandTime _stct = new STCommandTime {
\r
665 time = CDTXMania.Timer.n現在時刻
\r
668 if ( stct.Count >= buffersize )
\r
670 stct.RemoveAt( 0 );
\r
673 Debug.WriteLine( "CMDHIS: 楽器=" + _stct.eInst + ", CMD=" + _stct.ePad + ", time=" + _stct.time );
\r
675 public void RemoveAt( int index )
\r
677 stct.RemoveAt( index );
\r
681 /// コマンド入力に成功しているか調べる
\r
683 /// <param name="_ePad">入力が成功したか調べたいコマンド</param>
\r
684 /// <param name="_eInst">対象楽器</param>
\r
685 /// <returns>コマンド入力成功時true</returns>
\r
686 public bool CheckCommand( EパッドFlag[] _ePad, E楽器パート _eInst)
\r
688 int targetCount = _ePad.Length;
\r
689 int stciCount = stct.Count;
\r
690 if ( stciCount < targetCount )
\r
692 //Debug.WriteLine("NOT start checking...stciCount=" + stciCount + ", targetCount=" + targetCount);
\r
696 long curTime = CDTXMania.Timer.n現在時刻;
\r
697 //Debug.WriteLine("Start checking...targetCount=" + targetCount);
\r
698 for ( int i = targetCount - 1, j = stciCount - 1; i >= 0; i--, j-- )
\r
700 if ( _ePad[ i ] != stct[ j ].ePad )
\r
702 //Debug.WriteLine( "CMD解析: false targetCount=" + targetCount + ", i=" + i + ", j=" + j + ": ePad[]=" + _ePad[i] + ", stci[j] = " + stct[j].ePad );
\r
705 if ( stct[ j ].eInst != _eInst )
\r
707 //Debug.WriteLine( "CMD解析: false " + i );
\r
710 if ( curTime - stct[ j ].time > 500 )
\r
712 //Debug.WriteLine( "CMD解析: false " + i + "; over 500ms" );
\r
715 curTime = stct[ j ].time;
\r
718 //Debug.Write( "CMD解析: 成功!(" + _ePad.Length + ") " );
\r
719 //for ( int i = 0; i < _ePad.Length; i++ ) Debug.Write( _ePad[ i ] + ", " );
\r
720 //Debug.WriteLine( "" );
\r
721 //stct.RemoveRange( 0, targetCount ); // #24396 2011.2.13 yyagi
\r
722 stct.Clear(); // #24396 2011.2.13 yyagi Clear all command input history in case you succeeded inputting some command
\r
727 private CCommandHistory CommandHistory;
\r
729 private void tカーソルを下へ移動する()
\r
731 CDTXMania.Skin.soundカーソル移動音.t再生する();
\r
732 this.act曲リスト.t次に移動();
\r
734 private void tカーソルを上へ移動する()
\r
736 CDTXMania.Skin.soundカーソル移動音.t再生する();
\r
737 this.act曲リスト.t前に移動();
\r
739 private void t曲をランダム選択する()
\r
741 C曲リストノード song = this.act曲リスト.r現在選択中の曲;
\r
742 if( ( song.stackランダム演奏番号.Count == 0 ) || ( song.listランダム用ノードリスト == null ) )
\r
744 if( song.listランダム用ノードリスト == null )
\r
746 song.listランダム用ノードリスト = this.t指定された曲が存在する場所の曲を列挙する・子リスト含む( song );
\r
748 int count = song.listランダム用ノードリスト.Count;
\r
753 int[] numArray = new int[ count ];
\r
754 for( int i = 0; i < count; i++ )
\r
758 for( int j = 0; j < ( count * 1.5 ); j++ )
\r
760 int index = CDTXMania.Random.Next( count );
\r
761 int num5 = CDTXMania.Random.Next( count );
\r
762 int num6 = numArray[ num5 ];
\r
763 numArray[ num5 ] = numArray[ index ];
\r
764 numArray[ index ] = num6;
\r
766 for( int k = 0; k < count; k++ )
\r
768 song.stackランダム演奏番号.Push( numArray[ k ] );
\r
770 if( CDTXMania.ConfigIni.bLogDTX詳細ログ出力 )
\r
772 StringBuilder builder = new StringBuilder( 0x400 );
\r
773 builder.Append( string.Format( "ランダムインデックスリストを作成しました: {0}曲: ", song.stackランダム演奏番号.Count ) );
\r
774 for( int m = 0; m < count; m++ )
\r
776 builder.Append( string.Format( "{0} ", numArray[ m ] ) );
\r
778 Trace.TraceInformation( builder.ToString() );
\r
781 this.r確定された曲 = song.listランダム用ノードリスト[ song.stackランダム演奏番号.Pop() ];
\r
782 this.n確定された曲の難易度 = this.act曲リスト.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( this.r確定された曲 );
\r
783 this.r確定されたスコア = this.r確定された曲.arスコア[ this.n確定された曲の難易度 ];
\r
784 this.eフェードアウト完了時の戻り値 = E戻り値.選曲した;
\r
785 // this.actFOtoNowLoading.tフェードアウト開始(); // #27787 2012.3.10 yyagi 曲決定時の画面フェードアウトの省略
\r
786 base.eフェーズID = CStage.Eフェーズ.選曲_NowLoading画面へのフェードアウト;
\r
787 if( CDTXMania.ConfigIni.bLogDTX詳細ログ出力 )
\r
789 int[] numArray2 = song.stackランダム演奏番号.ToArray();
\r
790 StringBuilder builder2 = new StringBuilder( 0x400 );
\r
791 builder2.Append( "ランダムインデックスリスト残り: " );
\r
792 if( numArray2.Length > 0 )
\r
794 for( int n = 0; n < numArray2.Length; n++ )
\r
796 builder2.Append( string.Format( "{0} ", numArray2[ n ] ) );
\r
801 builder2.Append( "(なし)" );
\r
803 Trace.TraceInformation( builder2.ToString() );
\r
806 private void t曲を選択する()
\r
808 this.r確定された曲 = this.act曲リスト.r現在選択中の曲;
\r
809 this.r確定されたスコア = this.act曲リスト.r現在選択中のスコア;
\r
810 this.n確定された曲の難易度 = this.act曲リスト.n現在選択中の曲の現在の難易度レベル;
\r
811 if( ( this.r確定された曲 != null ) && ( this.r確定されたスコア != null ) )
\r
813 this.eフェードアウト完了時の戻り値 = E戻り値.選曲した;
\r
814 // this.actFOtoNowLoading.tフェードアウト開始(); // #27787 2012.3.10 yyagi 曲決定時の画面フェードアウトの省略
\r
815 base.eフェーズID = CStage.Eフェーズ.選曲_NowLoading画面へのフェードアウト;
\r
818 private List<C曲リストノード> t指定された曲が存在する場所の曲を列挙する・子リスト含む( C曲リストノード song )
\r
820 List<C曲リストノード> list = new List<C曲リストノード>();
\r
822 if( ( song == null ) && ( CDTXMania.Songs管理.list曲ルート.Count > 0 ) )
\r
824 foreach( C曲リストノード c曲リストノード in CDTXMania.Songs管理.list曲ルート )
\r
826 if( ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE ) || ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) )
\r
828 list.Add( c曲リストノード );
\r
830 if( ( c曲リストノード.list子リスト != null ) && CDTXMania.ConfigIni.bランダムセレクトで子BOXを検索対象とする )
\r
832 this.t指定された曲の子リストの曲を列挙する・孫リスト含む( c曲リストノード, ref list );
\r
837 this.t指定された曲の子リストの曲を列挙する・孫リスト含む( song, ref list );
\r
840 private void t指定された曲の子リストの曲を列挙する・孫リスト含む( C曲リストノード r親, ref List<C曲リストノード> list )
\r
842 if( ( r親 != null ) && ( r親.list子リスト != null ) )
\r
844 foreach( C曲リストノード c曲リストノード in r親.list子リスト )
\r
846 if( ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE ) || ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) )
\r
848 list.Add( c曲リストノード );
\r
850 if( ( c曲リストノード.list子リスト != null ) && CDTXMania.ConfigIni.bランダムセレクトで子BOXを検索対象とする )
\r
852 this.t指定された曲の子リストの曲を列挙する・孫リスト含む( c曲リストノード, ref list );
\r
857 //-----------------
\r