2 using System.Collections.Generic;
\r
4 using System.Runtime.InteropServices;
\r
5 using System.Drawing;
\r
6 using System.Diagnostics;
\r
10 using SlimDXKey = SlimDX.DirectInput.Key;
\r
14 internal class CStage選曲 : CStage
\r
17 public int nスクロールバー相対y座標
\r
21 if (act曲リスト != null)
\r
23 return act曲リスト.nスクロールバー相対y座標;
\r
31 public bool bIsEnumeratingSongs
\r
35 return act曲リスト.bIsEnumeratingSongs;
\r
39 act曲リスト.bIsEnumeratingSongs = value;
\r
42 public bool bIsPlayingPremovie
\r
46 return this.actPreimageパネル.bIsPlayingPremovie;
\r
53 return this.act曲リスト.bスクロール中;
\r
56 public int n確定された曲の難易度
\r
61 public Cスコア r確定されたスコア
\r
66 public C曲リストノード r確定された曲
\r
71 public int n現在選択中の曲の難易度
\r
75 return this.act曲リスト.n現在選択中の曲の現在の難易度レベル;
\r
78 public Cスコア r現在選択中のスコア
\r
82 return this.act曲リスト.r現在選択中のスコア;
\r
85 public C曲リストノード r現在選択中の曲
\r
89 return this.act曲リスト.r現在選択中の曲;
\r
96 eステージID = CStage.Eステージ.選曲;
\r
97 eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
99 list子Activities.Add(this.actオプションパネル = new CActオプションパネル(EOptionPanelDirection.Horizontal));
\r
100 list子Activities.Add(this.actFIFO = new CActFIFOBlack());
\r
101 list子Activities.Add(this.actFIfrom結果画面 = new CActFIFOBlack());
\r
102 list子Activities.Add(this.act曲リスト = new CActSelect曲リスト());
\r
103 list子Activities.Add(this.actステータスパネル = new CActSelectステータスパネル());
\r
104 list子Activities.Add(this.act演奏履歴パネル = new CActSelect演奏履歴パネル());
\r
105 list子Activities.Add(this.actPreimageパネル = new CActSelectPreimageパネル());
\r
106 list子Activities.Add(this.actPresound = new CActSelectPresound());
\r
107 list子Activities.Add(this.actArtistComment = new CActSelectArtistComment());
\r
108 list子Activities.Add(this.actInformation = new CActSelectInformation());
\r
109 list子Activities.Add(this.actSortSongs = new CActSortSongs());
\r
110 list子Activities.Add(this.actShowCurrentPosition = new CActSelectShowCurrentPosition());
\r
111 list子Activities.Add(this.actQuickConfig = new CActSelectQuickConfig());
\r
112 list子Activities.Add(this.actAVI = new CAct演奏AVI());
\r
114 CommandHistory = new CCommandHistory(); // #24063 2011.1.16 yyagi
\r
115 actPreimageパネル.actAVI = this.actAVI;
\r
121 public void t選択曲変更通知()
\r
123 this.actPreimageパネル.t選択曲が変更された();
\r
124 this.actPresound.t選択曲が変更された();
\r
125 this.act演奏履歴パネル.t選択曲が変更された();
\r
126 this.actステータスパネル.t選択曲が変更された();
\r
127 this.actArtistComment.t選択曲が変更された();
\r
129 #region [ プラグインにも通知する(BOX, RANDOM, BACK なら通知しない)]
\r
130 //---------------------
\r
131 if (CDTXMania.Instance != null)
\r
133 var c曲リストノード = CDTXMania.Instance.stage選曲.r現在選択中の曲;
\r
134 var cスコア = CDTXMania.Instance.stage選曲.r現在選択中のスコア;
\r
136 if (c曲リストノード != null && cスコア != null && c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE)
\r
138 string str選択曲ファイル名 = cスコア.ファイル情報.ファイルの絶対パス;
\r
139 CSetDef setDef = null;
\r
140 int nブロック番号inSetDef = -1;
\r
141 int n曲番号inブロック = -1;
\r
143 if (!string.IsNullOrEmpty(c曲リストノード.pathSetDefの絶対パス) && File.Exists(c曲リストノード.pathSetDefの絶対パス))
\r
145 setDef = new CSetDef(c曲リストノード.pathSetDefの絶対パス);
\r
146 nブロック番号inSetDef = c曲リストノード.SetDefのブロック番号;
\r
147 n曲番号inブロック = CDTXMania.Instance.stage選曲.act曲リスト.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(c曲リストノード);
\r
150 foreach (STPlugin stPlugin in CDTXMania.Instance.listプラグイン)
\r
152 Directory.SetCurrentDirectory(stPlugin.strプラグインフォルダ);
\r
153 stPlugin.plugin.On選択曲変更(str選択曲ファイル名, setDef, nブロック番号inSetDef, n曲番号inブロック);
\r
154 Directory.SetCurrentDirectory(CDTXMania.Instance.strEXEのあるフォルダ);
\r
158 //---------------------
\r
167 /// <param name="cs"></param>
\r
168 public void Refresh(CSongs管理 cs, bool bRemakeSongTitleBar)
\r
170 this.act曲リスト.Refresh(cs, bRemakeSongTitleBar);
\r
173 public override void On活性化()
\r
175 Trace.TraceInformation("選曲ステージを活性化します。");
\r
179 this.eフェードアウト完了時の戻り値 = E戻り値.継続;
\r
180 this.bBGM再生済み = false;
\r
181 this.ftフォント = new Font("MS PGothic", 26f * Scale.X, GraphicsUnit.Pixel);
\r
182 for (int i = 0; i < 4; i++)
\r
184 this.ctキー反復用[i] = new CCounter(0, 0, 0, CDTXMania.Instance.Timer);
\r
186 this.actステータスパネル.t選択曲が変更された(); // 最大ランクを更新
\r
187 actオプションパネル.Pos = CDTXMania.Instance.Coordinates.OptionPanelSelect;
\r
192 Trace.TraceInformation("選曲ステージの活性化を完了しました。");
\r
196 public override void On非活性化()
\r
198 Trace.TraceInformation("選曲ステージを非活性化します。");
\r
202 if (this.ftフォント != null)
\r
204 this.ftフォント.Dispose();
\r
205 this.ftフォント = null;
\r
207 for (int i = 0; i < 4; i++)
\r
209 this.ctキー反復用[i] = null;
\r
215 Trace.TraceInformation("選曲ステージの非活性化を完了しました。");
\r
219 public override void OnManagedリソースの作成()
\r
221 if (!base.b活性化してない)
\r
223 this.tx背景 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect background.jpg"), false);
\r
224 this.tx上部パネル = TextureFactory.tテクスチャの生成Af(CSkin.Path(@"Graphics\ScreenSelect header panel.png"), true);
\r
225 this.tx下部パネル = TextureFactory.tテクスチャの生成Af(CSkin.Path(@"Graphics\ScreenSelect footer panel.png"), true);
\r
226 this.txコメントバー = TextureFactory.tテクスチャの生成Af(CSkin.Path(@"Graphics\ScreenSelect comment bar.png"), true);
\r
227 this.txFLIP = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSelect skill number on gauge etc.png"), false);
\r
228 base.OnManagedリソースの作成();
\r
231 public override void OnManagedリソースの解放()
\r
233 if (!base.b活性化してない)
\r
235 TextureFactory.tテクスチャの解放(ref this.tx背景);
\r
236 TextureFactory.tテクスチャの解放(ref this.tx上部パネル);
\r
237 TextureFactory.tテクスチャの解放(ref this.tx下部パネル);
\r
238 TextureFactory.tテクスチャの解放(ref this.txコメントバー);
\r
239 TextureFactory.tテクスチャの解放(ref this.txFLIP);
\r
240 base.OnManagedリソースの解放();
\r
243 public override int On進行描画()
\r
245 if (!base.b活性化してない)
\r
247 #region [ 初めての進行描画 ]
\r
248 //---------------------
\r
249 if (base.b初めての進行描画)
\r
251 this.ct登場時アニメ用共通 = new CCounter(0, 100, 3, CDTXMania.Instance.Timer);
\r
252 if (CDTXMania.Instance.r直前のステージ == CDTXMania.Instance.stage結果)
\r
254 this.actFIfrom結果画面.tフェードイン開始();
\r
255 base.eフェーズID = CStage.Eフェーズ.選曲_結果画面からのフェードイン;
\r
259 this.actFIFO.tフェードイン開始();
\r
260 base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;
\r
263 base.b初めての進行描画 = false;
\r
265 //---------------------
\r
268 this.ct登場時アニメ用共通.t進行();
\r
270 if (this.tx背景 != null)
\r
271 this.tx背景.t2D描画(CDTXMania.Instance.Device, 0, 0);
\r
273 this.actPreimageパネル.On進行描画();
\r
274 // this.bIsEnumeratingSongs = !this.actPreimageパネル.bIsPlayingPremovie; // #27060 2011.3.2 yyagi: #PREMOVIE再生中は曲検索を中断する
\r
276 this.act曲リスト.On進行描画();
\r
278 if (this.ct登場時アニメ用共通.b進行中)
\r
280 double db登場割合 = ((double)this.ct登場時アニメ用共通.n現在の値) / 100.0; // 100が最終値
\r
281 double dbY表示割合 = Math.Sin(Math.PI / 2 * db登場割合);
\r
282 y = ((int)(this.tx上部パネル.sz画像サイズ.Height * dbY表示割合)) - this.tx上部パネル.sz画像サイズ.Height;
\r
284 #region [ 上部パネル描画 ]
\r
285 if (this.tx上部パネル != null)
\r
286 this.tx上部パネル.t2D描画(
\r
287 CDTXMania.Instance.Device,
\r
292 this.actInformation.On進行描画();
\r
293 #region [ 下部パネル描画 ]
\r
294 if (this.tx下部パネル != null)
\r
295 this.tx下部パネル.t2D描画(
\r
296 CDTXMania.Instance.Device,
\r
298 SampleFramework.GameWindowSize.Height - this.tx下部パネル.sz画像サイズ.Height
\r
301 this.actステータスパネル.On進行描画();
\r
302 this.act演奏履歴パネル.On進行描画();
\r
303 this.actPresound.On進行描画();
\r
304 #region [ コメントバー描画 ]
\r
305 if (this.txコメントバー != null)
\r
307 this.txコメントバー.t2D描画(
\r
308 CDTXMania.Instance.Device,
\r
314 this.actArtistComment.On進行描画();
\r
315 this.actオプションパネル.On進行描画();
\r
317 if (this.txFLIP != null && CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass) // #24063 2011.1.16 yyagi
\r
319 Rectangle rect = new Rectangle(
\r
320 (int)(31 * Scale.X),
\r
321 (int)(49 * Scale.Y),
\r
322 (int)(20 * Scale.X),
\r
323 (int)(11 * Scale.Y)
\r
326 CDTXMania.Instance.Device,
\r
333 this.actShowCurrentPosition.On進行描画(); // #27648 2011.3.28 yyagi
\r
336 switch (base.eフェーズID)
\r
338 case CStage.Eフェーズ.共通_フェードイン:
\r
339 if (this.actFIFO.On進行描画() != 0)
\r
341 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
345 case CStage.Eフェーズ.共通_フェードアウト:
\r
346 if (this.actFIFO.On進行描画() == 0)
\r
350 return (int)this.eフェードアウト完了時の戻り値;
\r
352 case CStage.Eフェーズ.選曲_結果画面からのフェードイン:
\r
353 if (this.actFIfrom結果画面.On進行描画() != 0)
\r
355 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
359 case CStage.Eフェーズ.選曲_NowLoading画面へのフェードアウト:
\r
360 // if( this.actFOtoNowLoading.On進行描画() == 0 )
\r
364 return (int)this.eフェードアウト完了時の戻り値;
\r
367 if (!this.bBGM再生済み && (base.eフェーズID == CStage.Eフェーズ.共通_通常状態))
\r
369 CDTXMania.Instance.Skin.bgm選曲画面.n音量_次に鳴るサウンド = 100;
\r
370 CDTXMania.Instance.Skin.bgm選曲画面.t再生する();
\r
371 this.bBGM再生済み = true;
\r
375 //Debug.WriteLine( "パンくず=" + this.r現在選択中の曲.strBreadcrumbs );
\r
379 if (base.eフェーズID == CStage.Eフェーズ.共通_通常状態
\r
380 && CDTXMania.Instance.act現在入力を占有中のプラグイン == null)
\r
382 #region [ 簡易CONFIGでMore、またはShift+F1: 詳細CONFIG呼び出し ]
\r
383 if (actQuickConfig.bGotoDetailConfig)
\r
385 actQuickConfig.tDeativatePopupMenu();
\r
386 this.actPresound.tサウンド停止();
\r
387 this.eフェードアウト完了時の戻り値 = E戻り値.コンフィグ呼び出し; // #24525 2011.3.16 yyagi: [SHIFT]-[F1]でCONFIG呼び出し
\r
388 this.actFIFO.tフェードアウト開始();
\r
389 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\r
390 CDTXMania.Instance.Skin.sound取消音.t再生する();
\r
394 if (!this.actSortSongs.bIsActivePopupMenu && !this.actQuickConfig.bIsActivePopupMenu)
\r
397 if( CDTXMania.Instance.Input管理.Keyboard.bキーが押された( (int) SlimDXKey.Escape ) ||
\r
398 ( CDTXMania.Instance.Pad.bCancelPadIsPressedDGB() && ( this.act曲リスト.r現在選択中の曲 != null && this.act曲リスト.r現在選択中の曲.r親ノード == null ) ) )
\r
400 CDTXMania.Instance.Skin.sound取消音.t再生する();
\r
401 this.eフェードアウト完了時の戻り値 = E戻り値.タイトルに戻る;
\r
402 this.actFIFO.tフェードアウト開始();
\r
403 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\r
407 #region [ Shift-F1: CONFIG画面 ]
\r
408 if ((CDTXMania.Instance.Input管理.Keyboard.bキーが押されている((int)SlimDXKey.RightShift) || CDTXMania.Instance.Input管理.Keyboard.bキーが押されている((int)SlimDXKey.LeftShift)) &&
\r
409 CDTXMania.Instance.Input管理.Keyboard.bキーが押された((int)SlimDXKey.F1))
\r
411 this.actPresound.tサウンド停止();
\r
412 // #24525 2011.3.16 yyagi: [SHIFT]-[F1]でCONFIG呼び出し
\r
413 this.eフェードアウト完了時の戻り値 = E戻り値.コンフィグ呼び出し;
\r
414 this.actFIFO.tフェードアウト開始();
\r
415 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\r
416 CDTXMania.Instance.Skin.sound取消音.t再生する();
\r
420 #region [ Shift-F2: 未使用 ]
\r
421 // #24525 2011.3.16 yyagi: [SHIFT]+[F2]は廃止(将来発生するかもしれない別用途のためにキープ)
\r
423 if ( ( CDTXMania.Instance.Input管理.Keyboard.bキーが押されている( (int)SlimDXKey.RightShift ) || CDTXMania.Instance.Input管理.Keyboard.bキーが押されている( (int)SlimDXKey.LeftShift ) ) &&
\r
424 CDTXMania.Instance.Input管理.Keyboard.bキーが押された( (int)SlimDXKey.F2 ) )
\r
425 { // [SHIFT] + [F2] CONFIGURATION
\r
426 this.actPresound.tサウンド停止();
\r
427 this.eフェードアウト完了時の戻り値 = E戻り値.コンフィグ呼び出し;
\r
428 this.actFIFO.tフェードアウト開始();
\r
429 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\r
430 CDTXMania.Instance.Skin.sound取消音.t再生する();
\r
435 if (this.act曲リスト.r現在選択中の曲 != null)
\r
438 if (CDTXMania.Instance.Input管理.Keyboard.bキーが押された((int)SlimDXKey.RightArrow))
\r
440 if (this.act曲リスト.r現在選択中の曲 != null)
\r
442 switch (this.act曲リスト.r現在選択中の曲.eノード種別)
\r
444 case C曲リストノード.Eノード種別.BOX:
\r
446 CDTXMania.Instance.Skin.sound決定音.t再生する();
\r
447 bool bNeedChangeSkin = this.act曲リスト.tBOXに入る();
\r
448 if (bNeedChangeSkin)
\r
450 this.eフェードアウト完了時の戻り値 = E戻り値.スキン変更;
\r
451 base.eフェーズID = Eフェーズ.選曲_NowLoading画面へのフェードアウト;
\r
461 CDTXMania.Instance.Pad.bDecidePadIsPressedDGB() ||
\r
462 (CDTXMania.Instance.ConfigIni.bEnterがキー割り当てのどこにも使用されていない &&
\r
463 CDTXMania.Instance.Input管理.Keyboard.bキーが押された((int)SlimDXKey.Return)))
\r
465 CDTXMania.Instance.Skin.sound決定音.t再生する();
\r
466 if (this.act曲リスト.r現在選択中の曲 != null)
\r
468 switch (this.act曲リスト.r現在選択中の曲.eノード種別)
\r
470 case C曲リストノード.Eノード種別.SCORE:
\r
474 case C曲リストノード.Eノード種別.SCORE_MIDI:
\r
478 case C曲リストノード.Eノード種別.BOX:
\r
480 bool bNeedChangeSkin = this.act曲リスト.tBOXに入る();
\r
481 if (bNeedChangeSkin)
\r
483 this.eフェードアウト完了時の戻り値 = E戻り値.スキン変更;
\r
484 base.eフェーズID = Eフェーズ.選曲_NowLoading画面へのフェードアウト;
\r
489 case C曲リストノード.Eノード種別.BACKBOX:
\r
491 bool bNeedChangeSkin = this.act曲リスト.tBOXを出る();
\r
492 if (bNeedChangeSkin)
\r
494 this.eフェードアウト完了時の戻り値 = E戻り値.スキン変更;
\r
495 base.eフェーズID = Eフェーズ.選曲_NowLoading画面へのフェードアウト;
\r
500 case C曲リストノード.Eノード種別.RANDOM:
\r
501 this.t曲をランダム選択する();
\r
508 this.ctキー反復用.Up.tキー反復(
\r
509 CDTXMania.Instance.Input管理.Keyboard.bキーが押されている( (int) SlimDXKey.UpArrow ),
\r
510 new CCounter.DGキー処理( this.tカーソルを上へ移動する ) );
\r
512 this.ctキー反復用.R.tキー反復(
\r
513 CDTXMania.Instance.Pad.b押されている( EPad.GtR ) || CDTXMania.Instance.Pad.b押されている( EPad.BsR ),
\r
514 new CCounter.DGキー処理( this.tカーソルを上へ移動する ) );
\r
516 if (CDTXMania.Instance.Pad.b押された(EPad.SD))
\r
518 this.tカーソルを上へ移動する();
\r
522 this.ctキー反復用.Down.tキー反復(
\r
523 CDTXMania.Instance.Input管理.Keyboard.bキーが押されている( (int) SlimDXKey.DownArrow ),
\r
524 new CCounter.DGキー処理( this.tカーソルを下へ移動する ) );
\r
526 this.ctキー反復用.B.tキー反復(
\r
527 CDTXMania.Instance.Pad.b押されている( EPad.GtB ) || CDTXMania.Instance.Pad.b押されている( EPad.BsB ),
\r
528 new CCounter.DGキー処理( this.tカーソルを下へ移動する ) );
\r
530 if (CDTXMania.Instance.Pad.b押された(EPad.LT))
\r
532 this.tカーソルを下へ移動する();
\r
535 #region [ Upstairs / Left ]
\r
536 if (((this.act曲リスト.r現在選択中の曲 != null) && (this.act曲リスト.r現在選択中の曲.r親ノード != null)) &&
\r
537 (CDTXMania.Instance.Pad.bCancelPadIsPressedDGB() ||
\r
538 CDTXMania.Instance.Input管理.Keyboard.bキーが押された((int)SlimDXKey.LeftArrow)))
\r
540 this.actPresound.tサウンド停止();
\r
541 CDTXMania.Instance.Skin.sound取消音.t再生する();
\r
542 this.act曲リスト.tBOXを出る();
\r
546 #region [ BDx2: 簡易CONFIG ]
\r
547 if (CDTXMania.Instance.Pad.b押された(EPad.BD))
\r
548 { // [BD]x2 スクロール速度変更
\r
549 CommandHistory.Add(EPart.Drums, EPadFlag.BD);
\r
550 EPadFlag[] comChangeScrollSpeed = new EPadFlag[] { EPadFlag.BD, EPadFlag.BD };
\r
551 if (CommandHistory.CheckCommand(comChangeScrollSpeed, EPart.Drums))
\r
553 // Debug.WriteLine( "ドラムススクロール速度変更" );
\r
554 // CDTXMania.Instance.ConfigIni.n譜面スクロール速度.Drums = ( CDTXMania.Instance.ConfigIni.n譜面スクロール速度.Drums + 1 ) % 0x10;
\r
555 CDTXMania.Instance.Skin.sound変更音.t再生する();
\r
556 this.actQuickConfig.tActivatePopupMenu(EPart.Drums);
\r
560 #region [ HHx2: 難易度変更 ]
\r
561 if (CDTXMania.Instance.Pad.b押された(EPad.HH) || CDTXMania.Instance.Pad.b押された(EPad.HHO))
\r
563 CommandHistory.Add(EPart.Drums, EPadFlag.HH);
\r
564 EPadFlag[] comChangeDifficulty = new EPadFlag[] { EPadFlag.HH, EPadFlag.HH };
\r
565 if (CommandHistory.CheckCommand(comChangeDifficulty, EPart.Drums))
\r
567 this.act曲リスト.t難易度レベルをひとつ進める();
\r
568 CDTXMania.Instance.Skin.sound変更音.t再生する();
\r
572 #region [ G + PickPick Guitar: 難易度変更 ]
\r
573 if (CDTXMania.Instance.Pad.b押されている(EPad.GtG) && CDTXMania.Instance.Pad.b押された(EPad.GtPick)) // #24177 2011.1.17 yyagi || -> &&
\r
574 { // [G] + [Pick][Pick] ギター難易度変更
\r
575 CommandHistory.Add(EPart.Guitar, EPadFlag.Pick | EPadFlag.G);
\r
576 EPadFlag[] comChangeDifficulty = new EPadFlag[] { EPadFlag.Pick | EPadFlag.G, EPadFlag.Pick | EPadFlag.G };
\r
577 if (CommandHistory.CheckCommand(comChangeDifficulty, EPart.Guitar))
\r
579 Debug.WriteLine("ギター難易度変更");
\r
580 this.act曲リスト.t難易度レベルをひとつ進める();
\r
581 CDTXMania.Instance.Skin.sound変更音.t再生する();
\r
585 #region [ G + PickPick Bass: 難易度変更 ]
\r
586 if (CDTXMania.Instance.Pad.b押されている(EPad.BsG) && CDTXMania.Instance.Pad.b押された(EPad.BsPick)) // #24177 2011.1.17 yyagi || -> &&
\r
587 { // [G] + [Pick][Pick] ベース難易度変更
\r
588 CommandHistory.Add(EPart.Bass, EPadFlag.Pick | EPadFlag.G);
\r
589 EPadFlag[] comChangeDifficulty = new EPadFlag[] { EPadFlag.Pick | EPadFlag.G, EPadFlag.Pick | EPadFlag.G };
\r
590 if (CommandHistory.CheckCommand(comChangeDifficulty, EPart.Bass))
\r
592 Debug.WriteLine("ベース難易度変更");
\r
593 this.act曲リスト.t難易度レベルをひとつ進める();
\r
594 CDTXMania.Instance.Skin.sound変更音.t再生する();
\r
598 #region [ Pick G G Pick Guitar: ギターとベースを入れ替え ]
\r
599 if (CDTXMania.Instance.Pad.b押された(EPad.GtPick) && !CDTXMania.Instance.Pad.b押されている(EPad.GtG))
\r
600 { // ギター[Pick]: コマンドとしてEnqueue
\r
601 CommandHistory.Add(EPart.Guitar, EPadFlag.Pick);
\r
602 // Pick, G, G, Pick で、ギターとベースを入れ替え
\r
603 EPadFlag[] comSwapGtBs1 = new EPadFlag[] { EPadFlag.Pick, EPadFlag.G, EPadFlag.G, EPadFlag.Pick };
\r
604 if (CommandHistory.CheckCommand(comSwapGtBs1, EPart.Guitar))
\r
606 Debug.WriteLine("ギターとベースの入れ替え1");
\r
607 CDTXMania.Instance.Skin.sound変更音.t再生する();
\r
609 //CDTXMania.Instance.ConfigIni.SwapGuitarBassKeyAssign();
\r
610 CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass = !CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass;
\r
614 #region [ Pick G G Pick Bass: ギターとベースを入れ替え ]
\r
615 if (CDTXMania.Instance.Pad.b押された(EPad.BsPick) && !CDTXMania.Instance.Pad.b押されている(EPad.BsG))
\r
616 { // ベース[Pick]: コマンドとしてEnqueue
\r
617 CommandHistory.Add(EPart.Bass, EPadFlag.Pick);
\r
618 // Pick, G, G, Pick で、ギターとベースを入れ替え
\r
619 EPadFlag[] comSwapGtBs1 = new EPadFlag[] { EPadFlag.Pick, EPadFlag.G, EPadFlag.G, EPadFlag.Pick };
\r
620 if (CommandHistory.CheckCommand(comSwapGtBs1, EPart.Bass))
\r
622 Debug.WriteLine("ギターとベースの入れ替え2");
\r
623 CDTXMania.Instance.Skin.sound変更音.t再生する();
\r
625 //CDTXMania.Instance.ConfigIni.SwapGuitarBassKeyAssign();
\r
626 CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass = !CDTXMania.Instance.ConfigIni.bIsSwappedGuitarBass;
\r
630 #region [ G G G Guitar: ソート画面 ]
\r
631 if (CDTXMania.Instance.Pad.b押された(EPad.GtG))
\r
632 { // ギター[G]: コマンドとしてEnqueue
\r
633 CommandHistory.Add(EPart.Guitar, EPadFlag.G);
\r
634 // ギター G, G, G で、ソート画面に遷移
\r
635 EPadFlag[] comSortGt = new EPadFlag[] { EPadFlag.G, EPadFlag.G, EPadFlag.G };
\r
636 if (CommandHistory.CheckCommand(comSortGt, EPart.Guitar))
\r
638 CDTXMania.Instance.Skin.sound変更音.t再生する();
\r
639 this.actSortSongs.tActivatePopupMenu(EPart.Guitar, ref this.act曲リスト);
\r
643 #region [ G G G Bass: ソート画面 ]
\r
644 if (CDTXMania.Instance.Pad.b押された(EPad.BsG))
\r
645 { // ベース[G]: コマンドとしてEnqueue
\r
646 CommandHistory.Add(EPart.Bass, EPadFlag.G);
\r
647 // ベース G, G, G で、ソート画面に遷移
\r
648 EPadFlag[] comSortBs = new EPadFlag[] { EPadFlag.G, EPadFlag.G, EPadFlag.G };
\r
649 if (CommandHistory.CheckCommand(comSortBs, EPart.Bass))
\r
651 CDTXMania.Instance.Skin.sound変更音.t再生する();
\r
652 this.actSortSongs.tActivatePopupMenu(EPart.Bass, ref this.act曲リスト);
\r
656 #region [ BD HT Drums: ソート画面 ]
\r
657 if (CDTXMania.Instance.Pad.b押された(EPad.HT))
\r
660 CommandHistory.Add(EPart.Drums, EPadFlag.HT);
\r
661 EPadFlag[] comSort = new EPadFlag[] { EPadFlag.BD, EPadFlag.HT };
\r
662 if (CommandHistory.CheckCommand(comSort, EPart.Drums))
\r
664 CDTXMania.Instance.Skin.sound変更音.t再生する();
\r
665 this.actSortSongs.tActivatePopupMenu(EPart.Drums, ref this.act曲リスト);
\r
671 this.actSortSongs.t進行描画();
\r
672 this.actQuickConfig.t進行描画();
\r
677 public enum E戻り値 : int
\r
690 #region [ private ]
\r
691 //-----------------
\r
692 [StructLayout(LayoutKind.Sequential)]
\r
693 private struct STキー反復用カウンタ
\r
695 public CCounter Up;
\r
696 public CCounter Down;
\r
699 public CCounter this[int index]
\r
717 throw new IndexOutOfRangeException();
\r
739 throw new IndexOutOfRangeException();
\r
743 private CActSelectArtistComment actArtistComment;
\r
744 private CActFIFOBlack actFIFO;
\r
745 private CActFIFOBlack actFIfrom結果画面;
\r
746 // private CActFIFOBlack actFOtoNowLoading; // #27787 2012.3.10 yyagi 曲決定時の画面フェードアウトの省略
\r
747 private CActSelectInformation actInformation;
\r
748 private CActSelectPreimageパネル actPreimageパネル;
\r
749 private CActSelectPresound actPresound;
\r
750 private CActオプションパネル actオプションパネル;
\r
751 private CActSelectステータスパネル actステータスパネル;
\r
752 private CActSelect演奏履歴パネル act演奏履歴パネル;
\r
753 private CActSelect曲リスト act曲リスト;
\r
754 private CActSelectShowCurrentPosition actShowCurrentPosition;
\r
756 private CActSortSongs actSortSongs;
\r
757 private CActSelectQuickConfig actQuickConfig;
\r
758 private CAct演奏AVI actAVI;
\r
760 private bool bBGM再生済み;
\r
761 private STキー反復用カウンタ ctキー反復用;
\r
762 private CCounter ct登場時アニメ用共通;
\r
763 private E戻り値 eフェードアウト完了時の戻り値;
\r
764 private Font ftフォント;
\r
765 private CTextureAf txコメントバー;
\r
766 private CTextureAf tx下部パネル;
\r
767 private CTextureAf tx上部パネル;
\r
768 private CTexture tx背景;
\r
769 private CTexture txFLIP;
\r
771 private struct STCommandTime // #24063 2011.1.16 yyagi コマンド入力時刻の記録用
\r
773 public EPart eInst; // 使用楽器
\r
774 public EPadFlag ePad; // 押されたコマンド(同時押しはOR演算で列挙する)
\r
775 public long time; // コマンド入力時刻
\r
777 private class CCommandHistory // #24063 2011.1.16 yyagi コマンド入力履歴を保持・確認するクラス
\r
779 readonly int buffersize = 16;
\r
780 private List<STCommandTime> stct;
\r
782 public CCommandHistory() // コンストラクタ
\r
784 stct = new List<STCommandTime>(buffersize);
\r
788 /// コマンド入力履歴へのコマンド追加
\r
790 /// <param name="_eInst">楽器の種類</param>
\r
791 /// <param name="_ePad">入力コマンド(同時押しはOR演算で列挙すること)</param>
\r
792 public void Add(EPart _eInst, EPadFlag _ePad)
\r
794 STCommandTime _stct = new STCommandTime
\r
798 time = CDTXMania.Instance.Timer.n現在時刻
\r
801 if (stct.Count >= buffersize)
\r
806 //Debug.WriteLine( "CMDHIS: 楽器=" + _stct.eInst + ", CMD=" + _stct.ePad + ", time=" + _stct.time );
\r
808 public void RemoveAt(int index)
\r
810 stct.RemoveAt(index);
\r
814 /// コマンド入力に成功しているか調べる
\r
816 /// <param name="_ePad">入力が成功したか調べたいコマンド</param>
\r
817 /// <param name="_eInst">対象楽器</param>
\r
818 /// <returns>コマンド入力成功時true</returns>
\r
819 public bool CheckCommand(EPadFlag[] _ePad, EPart _eInst)
\r
821 int targetCount = _ePad.Length;
\r
822 int stciCount = stct.Count;
\r
823 if (stciCount < targetCount)
\r
825 //Debug.WriteLine("NOT start checking...stciCount=" + stciCount + ", targetCount=" + targetCount);
\r
829 long curTime = CDTXMania.Instance.Timer.n現在時刻;
\r
830 //Debug.WriteLine("Start checking...targetCount=" + targetCount);
\r
831 for (int i = targetCount - 1, j = stciCount - 1; i >= 0; i--, j--)
\r
833 if (_ePad[i] != stct[j].ePad)
\r
835 //Debug.WriteLine( "CMD解析: false targetCount=" + targetCount + ", i=" + i + ", j=" + j + ": ePad[]=" + _ePad[i] + ", stci[j] = " + stct[j].ePad );
\r
838 if (stct[j].eInst != _eInst)
\r
840 //Debug.WriteLine( "CMD解析: false " + i );
\r
843 if (curTime - stct[j].time > 500)
\r
845 //Debug.WriteLine( "CMD解析: false " + i + "; over 500ms" );
\r
848 curTime = stct[j].time;
\r
851 //Debug.Write( "CMD解析: 成功!(" + _ePad.Length + ") " );
\r
852 //for ( int i = 0; i < _ePad.Length; i++ ) Debug.Write( _ePad[ i ] + ", " );
\r
853 //Debug.WriteLine( "" );
\r
854 //stct.RemoveRange( 0, targetCount ); // #24396 2011.2.13 yyagi
\r
855 stct.Clear(); // #24396 2011.2.13 yyagi Clear all command input history in case you succeeded inputting some command
\r
860 private CCommandHistory CommandHistory;
\r
862 private void tカーソルを下へ移動する()
\r
864 CDTXMania.Instance.Skin.soundカーソル移動音.t再生する();
\r
865 this.act曲リスト.t次に移動();
\r
867 private void tカーソルを上へ移動する()
\r
869 CDTXMania.Instance.Skin.soundカーソル移動音.t再生する();
\r
870 this.act曲リスト.t前に移動();
\r
872 private void t曲をランダム選択する()
\r
874 C曲リストノード song = this.act曲リスト.r現在選択中の曲;
\r
875 if ((song.stackランダム演奏番号.Count == 0) || (song.listランダム用ノードリスト == null))
\r
877 if (song.listランダム用ノードリスト == null)
\r
879 song.listランダム用ノードリスト = this.t指定された曲が存在する場所の曲を列挙する_子リスト含む(song);
\r
881 int count = song.listランダム用ノードリスト.Count;
\r
886 int[] numArray = new int[count];
\r
887 for (int i = 0; i < count; i++)
\r
891 for (int j = 0; j < (count * 1.5); j++)
\r
893 int index = CDTXMania.Instance.Random.Next(count);
\r
894 int num5 = CDTXMania.Instance.Random.Next(count);
\r
895 int num6 = numArray[num5];
\r
896 numArray[num5] = numArray[index];
\r
897 numArray[index] = num6;
\r
899 for (int k = 0; k < count; k++)
\r
901 song.stackランダム演奏番号.Push(numArray[k]);
\r
903 if (CDTXMania.Instance.ConfigIni.bLogDTX)
\r
905 StringBuilder builder = new StringBuilder(0x400);
\r
906 builder.Append(string.Format("ランダムインデックスリストを作成しました: {0}曲: ", song.stackランダム演奏番号.Count));
\r
907 for (int m = 0; m < count; m++)
\r
909 builder.Append(string.Format("{0} ", numArray[m]));
\r
911 Trace.TraceInformation(builder.ToString());
\r
914 this.r確定された曲 = song.listランダム用ノードリスト[song.stackランダム演奏番号.Pop()];
\r
915 this.n確定された曲の難易度 = this.act曲リスト.n現在のアンカ難易度レベルに最も近い難易度レベルを返す(this.r確定された曲);
\r
916 this.r確定されたスコア = this.r確定された曲.arスコア[this.n確定された曲の難易度];
\r
917 this.eフェードアウト完了時の戻り値 = E戻り値.選曲した;
\r
918 // this.actFOtoNowLoading.tフェードアウト開始(); // #27787 2012.3.10 yyagi 曲決定時の画面フェードアウトの省略
\r
919 base.eフェーズID = CStage.Eフェーズ.選曲_NowLoading画面へのフェードアウト;
\r
920 if (CDTXMania.Instance.ConfigIni.bLogDTX)
\r
922 int[] numArray2 = song.stackランダム演奏番号.ToArray();
\r
923 StringBuilder builder2 = new StringBuilder(0x400);
\r
924 builder2.Append("ランダムインデックスリスト残り: ");
\r
925 if (numArray2.Length > 0)
\r
927 for (int n = 0; n < numArray2.Length; n++)
\r
929 builder2.Append(string.Format("{0} ", numArray2[n]));
\r
934 builder2.Append("(なし)");
\r
936 Trace.TraceInformation(builder2.ToString());
\r
938 CDTXMania.Instance.Skin.bgm選曲画面.t停止する();
\r
940 private void t曲を選択する()
\r
942 this.r確定された曲 = this.act曲リスト.r現在選択中の曲;
\r
943 this.r確定されたスコア = this.act曲リスト.r現在選択中のスコア;
\r
944 this.n確定された曲の難易度 = this.act曲リスト.n現在選択中の曲の現在の難易度レベル;
\r
945 if ((this.r確定された曲 != null) && (this.r確定されたスコア != null) && (File.Exists(this.r確定されたスコア.ファイル情報.ファイルの絶対パス)) )
\r
947 this.eフェードアウト完了時の戻り値 = E戻り値.選曲した;
\r
948 // this.actFOtoNowLoading.tフェードアウト開始(); // #27787 2012.3.10 yyagi 曲決定時の画面フェードアウトの省略
\r
949 base.eフェーズID = CStage.Eフェーズ.選曲_NowLoading画面へのフェードアウト;
\r
951 CDTXMania.Instance.Skin.bgm選曲画面.t停止する();
\r
953 private List<C曲リストノード> t指定された曲が存在する場所の曲を列挙する_子リスト含む(C曲リストノード song)
\r
955 List<C曲リストノード> list = new List<C曲リストノード>();
\r
957 if ((song == null) && (CDTXMania.Instance.Songs管理.list曲ルート.Count > 0))
\r
959 foreach (C曲リストノード c曲リストノード in CDTXMania.Instance.Songs管理.list曲ルート)
\r
961 if ((c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE) || (c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI))
\r
963 list.Add(c曲リストノード);
\r
965 if ((c曲リストノード.list子リスト != null) && CDTXMania.Instance.ConfigIni.bRandSubBox)
\r
967 this.t指定された曲の子リストの曲を列挙する_孫リスト含む(c曲リストノード, ref list);
\r
972 this.t指定された曲の子リストの曲を列挙する_孫リスト含む(song, ref list);
\r
975 private void t指定された曲の子リストの曲を列挙する_孫リスト含む(C曲リストノード r親, ref List<C曲リストノード> list)
\r
977 if ((r親 != null) && (r親.list子リスト != null))
\r
979 foreach (C曲リストノード c曲リストノード in r親.list子リスト)
\r
981 if ((c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE) || (c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI))
\r
983 list.Add(c曲リストノード);
\r
985 if ((c曲リストノード.list子リスト != null) && CDTXMania.Instance.ConfigIni.bRandSubBox)
\r
987 this.t指定された曲の子リストの曲を列挙する_孫リスト含む(c曲リストノード, ref list);
\r
992 //-----------------
\r