Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/DTXManiaプロジェクト/コード/ステージ/05.選曲/CStage選曲.cs

Parent Directory Parent Directory | Revision Log Revision Log


Revision 130 - (show annotations) (download)
Sun Jul 14 02:25:43 2013 UTC (10 years, 8 months ago) by kairera0467
File size: 41389 byte(s)
#30805 空打ち時の音が多重再生されていたのを修正。
#30814 branchに適用。
#31703 Config.iniの「縮小文字のアンチエイリアスを有効にする」の有無で文字のアンチエイリアスの有無を決めるようにした。
#xxxxx 「5_background.mp4」があった場合、選曲画面の背景にDShow動画をつかうようにした。
#xxxxx いらない関数の削除。
#xxxxx 粉が表示される秒数を短くした。
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Runtime.InteropServices;
5 using System.Drawing;
6 using System.Diagnostics;
7 using System.IO;
8 using DirectShowLib;
9 using FDK;
10
11 namespace DTXMania
12 {
13 internal class CStage選曲 : CStage
14 {
15 // プロパティ
16 public int nスクロルバ相対y座標
17 {
18 get
19 {
20 if ( act曲リスト != null )
21 {
22 return act曲リスト.nスクロルバ相対y座標;
23 }
24 else
25 {
26 return 0;
27 }
28 }
29 }
30 public bool bIsEnumeratingSongs
31 {
32 get
33 {
34 return act曲リスト.bIsEnumeratingSongs;
35 }
36 set
37 {
38 act曲リスト.bIsEnumeratingSongs = value;
39 }
40 }
41 public bool bIsPlayingPremovie
42 {
43 get
44 {
45 return this.actPreimageパネル.bIsPlayingPremovie;
46 }
47 }
48 public bool bスクロル中
49 {
50 get
51 {
52 return this.act曲リスト.bスクロル中;
53 }
54 }
55 public int n確定された曲の難易度
56 {
57 get;
58 private set;
59 }
60 public Cスコア r確定されたスコア
61 {
62 get;
63 private set;
64 }
65 public C曲リストノ r確定された曲
66 {
67 get;
68 private set;
69 }
70 /// <summary>
71 /// <para>現在演奏中の曲のスコアに対応する背景動画。</para>
72 /// <para>r現在演奏中の曲のスコア の読み込み時に、自動検索・抽出・生成される。</para>
73 /// </summary>
74 public CDirectShow r現在演奏中のスコアの背景動画 = null;
75 public int n現在選択中の曲の難易度
76 {
77 get
78 {
79 return this.act曲リスト.n現在選択中の曲の現在の難易度レベル;
80 }
81 }
82 public Cスコア r現在選択中のスコア
83 {
84 get
85 {
86 return this.act曲リスト.r現在選択中のスコア;
87 }
88 }
89 public C曲リストノ r現在選択中の曲
90 {
91 get
92 {
93 return this.act曲リスト.r現在選択中の曲;
94 }
95 }
96
97 // コンストラクタ
98 public CStage選曲()
99 {
100 base.eステID = CStage.Eステ.選曲;
101 base.eフェID = CStage.Eフェ.共通_通常状態;
102 base.b活性化してない = true;
103 base.listActivities.Add( this.actオプションパネル = new CActオプションパネル() );
104 base.listActivities.Add( this.actFIFO = new CActFIFOBlack() );
105 base.listActivities.Add( this.actFIfrom結果画面 = new CActFIFOBlack() );
106 // base.list子Activities.Add( this.actFOtoNowLoading = new CActFIFOBlack() ); // #27787 2012.3.10 yyagi 曲決定時の画面フェードアウトの省略
107 base.listActivities.Add( this.act曲リスト = new CActSelect曲リスト() );
108 base.listActivities.Add( this.actステタスパネル = new CActSelectステタスパネル() );
109 base.listActivities.Add( this.act演奏履歴パネル = new CActSelect演奏履歴パネル() );
110 base.listActivities.Add( this.actPreimageパネル = new CActSelectPreimageパネル() );
111 base.listActivities.Add( this.actPresound = new CActSelectPresound() );
112 base.listActivities.Add( this.actArtistComment = new CActSelectArtistComment() );
113 base.listActivities.Add( this.actInformation = new CActSelectInformation() );
114 base.listActivities.Add( this.actSortSongs = new CActSortSongs() );
115 base.listActivities.Add( this.actShowCurrentPosition = new CActSelectShowCurrentPosition() );
116 base.listActivities.Add( this.actQuickConfig = new CActSelectQuickConfig() );
117
118 this.CommandHistory = new CCommandHistory(); // #24063 2011.1.16 yyagi
119 }
120
121
122 // メソッド
123
124 public void t選択曲変更通知()
125 {
126 this.actPreimageパネル.t選択曲が変更された();
127 this.actPresound.t選択曲が変更された();
128 this.act演奏履歴パネル.t選択曲が変更された();
129 this.actステタスパネル.t選択曲が変更された();
130 this.actArtistComment.t選択曲が変更された();
131
132 #region [ プラグインにも通知する(BOX, RANDOM, BACK なら通知しない)]
133 //---------------------
134 if( CDTXMania.app != null )
135 {
136 var c曲リストノ = CDTXMania.stage選曲.r現在選択中の曲;
137 var cスコア = CDTXMania.stage選曲.r現在選択中のスコア;
138
139 if( c曲リストノ != null && cスコア != null && c曲リストノ.eド種別 == C曲リストノ.Eド種別.SCORE )
140 {
141 string str選択曲ファイル名 = cスコア.ファイル情報.ファイルの絶対パス;
142 CSetDef setDef = null;
143 int nブロック番号inSetDef = -1;
144 int n曲番号inブロック = -1;
145
146 if( !string.IsNullOrEmpty( c曲リストノ.pathSetDefの絶対パス ) && File.Exists( c曲リストノ.pathSetDefの絶対パス ) )
147 {
148 setDef = new CSetDef( c曲リストノ.pathSetDefの絶対パス );
149 nブロック番号inSetDef = c曲リストノ.SetDefのブロック番号;
150 n曲番号inブロック = CDTXMania.stage選曲.act曲リスト.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( c曲リストノ );
151 }
152
153 foreach( CDTXMania.STPlugin stPlugin in CDTXMania.app.listプラグイン )
154 {
155 Directory.SetCurrentDirectory( stPlugin.strプラグインフォルダ );
156 stPlugin.plugin.On選択曲変更( str選択曲ファイル名, setDef, nブロック番号inSetDef, n曲番号inブロック );
157 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
158 }
159 }
160 }
161 //---------------------
162 #endregion
163 }
164
165 // CStage 実装
166
167 /// <summary>
168 /// 曲リストをリセットする
169 /// </summary>
170 /// <param name="cs"></param>
171 public void Refresh( CSongs管理 cs, bool bRemakeSongTitleBar)
172 {
173 this.act曲リスト.Refresh( cs, bRemakeSongTitleBar );
174 }
175
176 public override void On活性化()
177 {
178 Trace.TraceInformation( "選曲ステージを活性化します。" );
179 Trace.Indent();
180 try
181 {
182 this.eフェドアウト完了時の戻り値 = E戻り値.継続;
183 this.bBGM再生済み = false;
184 this.ftフォント = new Font( "MS PGothic", 26f, GraphicsUnit.Pixel );
185 for( int i = 0; i < 4; i++ )
186 this.ct反復用[ i ] = new CCounter( 0, 0, 0, CDTXMania.Timer );
187
188 base.On活性化();
189
190 this.actステタスパネル.t選択曲が変更された(); // 最大ランクを更新
191 }
192 finally
193 {
194 Trace.TraceInformation( "選曲ステージの活性化を完了しました。" );
195 Trace.Unindent();
196 }
197 }
198 public override void On非活性化()
199 {
200 Trace.TraceInformation( "選曲ステージを非活性化します。" );
201 Trace.Indent();
202 try
203 {
204 if( this.ftフォント != null )
205 {
206 this.ftフォント.Dispose();
207 this.ftフォント = null;
208 }
209 for( int i = 0; i < 4; i++ )
210 {
211 this.ct反復用[ i ] = null;
212 }
213 base.On非活性化();
214 }
215 finally
216 {
217 Trace.TraceInformation( "選曲ステージの非活性化を完了しました。" );
218 Trace.Unindent();
219 }
220 }
221 public override void OnManagedリソスの作成()
222 {
223 if( !base.b活性化してない )
224 {
225 this.tx背景 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_background.jpg" ), false );
226 if( File.Exists (CSkin.Path(@"Graphics\5_background.mp4")))
227 {
228 this.ds背景動画 = CDTXMania.t失敗してもスキップ可能なDirectShowを生成する( CSkin.Path(@"Graphics\5_background.mp4"), CDTXMania.app.WindowHandle, true );
229 }
230 this.tx上部パネル = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_header panel.png" ), false );
231 this.tx下部パネル = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_footer panel.png" ), false );
232 this.txコメントバ = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_comment bar.png" ), true );
233 this.txFLIP = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_skill number on gauge etc.png" ), false );
234 base.OnManagedリソスの作成();
235 }
236 }
237 public override void OnManagedリソスの解放()
238 {
239 if( !base.b活性化してない )
240 {
241 CDTXMania.t安全にDisposeする( ref this.ds背景動画 );
242 CDTXMania.tテクスチャの解放( ref this.tx背景 );
243 CDTXMania.tテクスチャの解放( ref this.tx上部パネル );
244 CDTXMania.tテクスチャの解放( ref this.tx下部パネル );
245 CDTXMania.tテクスチャの解放( ref this.txコメントバ );
246 CDTXMania.tテクスチャの解放( ref this.txFLIP );
247 base.OnManagedリソスの解放();
248 }
249 }
250 public override int On進行描画()
251 {
252 if( !base.b活性化してない )
253 {
254 #region [ 初めての進行描画 ]
255 //---------------------
256 if( base.b初めての進行描画 )
257 {
258 this.ct登場時アニメ用共通 = new CCounter( 0, 100, 3, CDTXMania.Timer );
259 if( CDTXMania.r直前のステ == CDTXMania.stage結果 )
260 {
261 this.actFIfrom結果画面.tフェドイン開始();
262 base.eフェID = CStage.Eフェ.選曲_結果画面からのフェドイン;
263 }
264 else
265 {
266 this.actFIFO.tフェドイン開始();
267 base.eフェID = CStage.Eフェ.共通_フェドイン;
268 }
269 this.t選択曲変更通知();
270 base.b初めての進行描画 = false;
271 }
272 //---------------------
273 #endregion
274
275 this.ct登場時アニメ用共通.t進行();
276
277 if( this.ds背景動画 != null )
278 {
279 this.ds背景動画.t現時点における最新のスナップイメジをTextureに転写する( this.tx背景 );
280 this.ds背景動画.t再生開始();
281 this.ds背景動画.MediaSeeking.GetPositions(out this.lDshowPosition, out this.lStopPosition);
282 if (this.lDshowPosition == this.lStopPosition)
283 {
284 this.ds背景動画.MediaSeeking.SetPositions(
285 DsLong.FromInt64((long)(0)),
286 AMSeekingSeekingFlags.AbsolutePositioning,
287 0,
288 AMSeekingSeekingFlags.NoPositioning);
289 }
290 }
291
292 if( this.tx背景 != null )
293 this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );
294
295 this.actPreimageパネル.On進行描画();
296 // this.bIsEnumeratingSongs = !this.actPreimageパネル.bIsPlayingPremovie; // #27060 2011.3.2 yyagi: #PREMOVIE再生中は曲検索を中断する
297
298 this.act曲リスト.On進行描画();
299 int y = 0;
300 if( this.ct登場時アニメ用共通.b進行中 )
301 {
302 double db登場割合 = ( (double) this.ct登場時アニメ用共通.n現在の値 ) / 100.0; // 100が最終値
303 double dbY表示割合 = Math.Sin( Math.PI / 2 * db登場割合 );
304 y = ( (int) ( this.tx上部パネル.sz画像サイズ.Height * dbY表示割合 ) ) - this.tx上部パネル.sz画像サイズ.Height;
305 }
306 if( this.tx上部パネル != null )
307 this.tx上部パネル.t2D描画( CDTXMania.app.Device, 0, y );
308
309 //this.actInformation.On進行描画();
310 if( this.tx下部パネル != null )
311 this.tx下部パネル.t2D描画( CDTXMania.app.Device, 0, 720 - this.tx下部パネル.sz画像サイズ.Height );
312
313 this.actステタスパネル.On進行描画();
314 this.act演奏履歴パネル.On進行描画();
315 this.actPresound.On進行描画();
316 if( this.txコメントバ != null )
317 {
318 this.txコメントバ.t2D描画(CDTXMania.app.Device, 484, 342);
319 }
320 this.actArtistComment.On進行描画();
321 //this.actオプションパネル.On進行描画();
322 if ( this.txFLIP != null && CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.16 yyagi
323 {
324 Rectangle rect = new Rectangle(0x1f, 0x31, 20, 11);
325 this.txFLIP.t2D描画( CDTXMania.app.Device, 80, 654, rect );
326 }
327 this.actShowCurrentPosition.On進行描画(); // #27648 2011.3.28 yyagi
328
329 switch ( base.eフェID )
330 {
331 case CStage.Eフェ.共通_フェドイン:
332 if( this.actFIFO.On進行描画() != 0 )
333 {
334 base.eフェID = CStage.Eフェ.共通_通常状態;
335 }
336 break;
337
338 case CStage.Eフェ.共通_フェドアウト:
339 if( this.actFIFO.On進行描画() == 0 )
340 {
341 break;
342 }
343 return (int) this.eフェドアウト完了時の戻り値;
344
345 case CStage.Eフェ.選曲_結果画面からのフェドイン:
346 if( this.actFIfrom結果画面.On進行描画() != 0 )
347 {
348 base.eフェID = CStage.Eフェ.共通_通常状態;
349 }
350 break;
351
352 case CStage.Eフェ.選曲_NowLoading画面へのフェドアウト:
353 // if( this.actFOtoNowLoading.On進行描画() == 0 )
354 // {
355 // break;
356 // }
357 return (int) this.eフェドアウト完了時の戻り値;
358 }
359 if( !this.bBGM再生済み && ( base.eフェID == CStage.Eフェ.共通_通常状態 ) )
360 {
361 CDTXMania.Skin.bgm選曲画面.n音量・次に鳴るサウンド = 100;
362 CDTXMania.Skin.bgm選曲画面.t再生する();
363 this.bBGM再生済み = true;
364 }
365
366
367 //Debug.WriteLine( "パンくず=" + this.r現在選択中の曲.strBreadcrumbs );
368
369
370 // キー入力
371 if( base.eフェID == CStage.Eフェ.共通_通常状態
372 && CDTXMania.act現在入力を占有中のプラグイン == null )
373 {
374 #region [ 簡易CONFIGでMore、またはShift+F1: 詳細CONFIG呼び出し ]
375 if ( actQuickConfig.bGotoDetailConfig )
376 { // 詳細CONFIG呼び出し
377 actQuickConfig.tDeativatePopupMenu();
378 this.actPresound.tサウンド停止();
379 this.eフェドアウト完了時の戻り値 = E戻り値.コンフィグ呼び出し; // #24525 2011.3.16 yyagi: [SHIFT]-[F1]でCONFIG呼び出し
380 this.actFIFO.tフェドアウト開始();
381 base.eフェID = CStage.Eフェ.共通_フェドアウト;
382 CDTXMania.Skin.sound取消音.t再生する();
383 return 0;
384 }
385 #endregion
386 if ( !this.actSortSongs.bIsActivePopupMenu && !this.actQuickConfig.bIsActivePopupMenu )
387 {
388 #region [ ESC ]
389 if ( CDTXMania.Input管理.Keyboard.bが押された( (int) SlimDX.DirectInput.Key.Escape ) || ( ( CDTXMania.Pad.b押された( E楽器パ.DRUMS, Eパッド.LC ) || CDTXMania.Pad.b押されたGB( Eパッド.Cancel ) ) && ( ( this.act曲リスト.r現在選択中の曲 != null ) && ( this.act曲リスト.r現在選択中の曲.r親ノ == null ) ) ) )
390 { // [ESC]
391 CDTXMania.Skin.sound取消音.t再生する();
392 this.eフェドアウト完了時の戻り値 = E戻り値.タイトルに戻る;
393 this.actFIFO.tフェドアウト開始();
394 base.eフェID = CStage.Eフェ.共通_フェドアウト;
395 return 0;
396 }
397 #endregion
398 #region [ Shift-F1: CONFIG画面 ]
399 if ( ( CDTXMania.Input管理.Keyboard.bが押されている( (int) SlimDX.DirectInput.Key.RightShift ) || CDTXMania.Input管理.Keyboard.bが押されている( (int) SlimDX.DirectInput.Key.LeftShift ) ) &&
400 CDTXMania.Input管理.Keyboard.bが押された( (int) SlimDX.DirectInput.Key.F1 ) )
401 { // [SHIFT] + [F1] CONFIG
402 this.actPresound.tサウンド停止();
403 this.eフェドアウト完了時の戻り値 = E戻り値.コンフィグ呼び出し; // #24525 2011.3.16 yyagi: [SHIFT]-[F1]でCONFIG呼び出し
404 this.actFIFO.tフェドアウト開始();
405 base.eフェID = CStage.Eフェ.共通_フェドアウト;
406 CDTXMania.Skin.sound取消音.t再生する();
407 return 0;
408 }
409 #endregion
410 #region [ Shift-F2: 未使用 ]
411 // #24525 2011.3.16 yyagi: [SHIFT]+[F2]は廃止(将来発生するかもしれない別用途のためにキープ)
412 /*
413 if ((CDTXMania.Input管理.Keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.RightShift) || CDTXMania.Input管理.Keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.LeftShift)) &&
414 CDTXMania.Input管理.Keyboard.bキーが押された((int)SlimDX.DirectInput.Key.F2))
415 { // [SHIFT] + [F2] CONFIGURATION
416 this.actPresound.tサウンド停止();
417 this.eフェードアウト完了時の戻り値 = E戻り値.オプション呼び出し;
418 this.actFIFO.tフェードアウト開始();
419 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
420 CDTXMania.Skin.sound取消音.t再生する();
421 return 0;
422 }
423 */
424 #endregion
425 if ( this.act曲リスト.r現在選択中の曲 != null )
426 {
427 #region [ Decide ]
428 if ( ( CDTXMania.Pad.b押されたDGB( Eパッド.Decide ) || CDTXMania.Pad.b押された( E楽器パ.DRUMS, Eパッド.CY ) || CDTXMania.Pad.b押された( E楽器パ.DRUMS, Eパッド.RD ) ) ||
429 ( CDTXMania.ConfigIni.bEnterがキ割り当てのどこにも使用されていない && CDTXMania.Input管理.Keyboard.bが押された( (int) SlimDX.DirectInput.Key.Return ) ) )
430 {
431 if ( this.act曲リスト.r現在選択中の曲 != null )
432 {
433 switch ( this.act曲リスト.r現在選択中の曲.eド種別 )
434 {
435 case C曲リストノ.Eド種別.SCORE:
436 CDTXMania.Skin.sound決定音.t再生する();
437 this.t曲を選択する();
438 break;
439
440 case C曲リストノ.Eド種別.SCORE_MIDI:
441 CDTXMania.Skin.sound決定音.t再生する();
442 this.t曲を選択する();
443 break;
444
445 case C曲リストノ.Eド種別.BOX:
446 {
447 CDTXMania.Skin.sound決定音.t再生する();
448 bool bNeedChangeSkin = this.act曲リスト.tBOXに入る();
449 if ( bNeedChangeSkin )
450 {
451 this.eフェドアウト完了時の戻り値 = E戻り値.スキン変更;
452 base.eフェID = Eフェ.選曲_NowLoading画面へのフェドアウト;
453 }
454 }
455 break;
456
457 case C曲リストノ.Eド種別.BACKBOX:
458 {
459 CDTXMania.Skin.sound取消音.t再生する();
460 bool bNeedChangeSkin = this.act曲リスト.tBOXを出る();
461 if ( bNeedChangeSkin )
462 {
463 this.eフェドアウト完了時の戻り値 = E戻り値.スキン変更;
464 base.eフェID = Eフェ.選曲_NowLoading画面へのフェドアウト;
465 }
466 }
467 break;
468
469 case C曲リストノ.Eド種別.RANDOM:
470 CDTXMania.Skin.sound決定音.t再生する();
471 this.t曲をランダム選択する();
472 break;
473 }
474 }
475 }
476 #endregion
477 #region [ Up ]
478 this.ct反復用.Up.t反復( CDTXMania.Input管理.Keyboard.bが押されている( (int) SlimDX.DirectInput.Key.UpArrow ), new CCounter.DG処理( this.tソルを上へ移動する ) );
479 this.ct反復用.R.t反復( CDTXMania.Pad.b押されているGB( Eパッド.R ), new CCounter.DG処理( this.tソルを上へ移動する ) );
480 if ( CDTXMania.Pad.b押された( E楽器パ.DRUMS, Eパッド.SD ) )
481 {
482 this.tソルを上へ移動する();
483 }
484 #endregion
485 #region [ Down ]
486 this.ct反復用.Down.t反復( CDTXMania.Input管理.Keyboard.bが押されている( (int) SlimDX.DirectInput.Key.DownArrow ), new CCounter.DG処理( this.tソルを下へ移動する ) );
487 this.ct反復用.B.t反復( CDTXMania.Pad.b押されているGB( Eパッド.B ), new CCounter.DG処理( this.tソルを下へ移動する ) );
488 if ( CDTXMania.Pad.b押された( E楽器パ.DRUMS, Eパッド.FT ) )
489 {
490 this.tソルを下へ移動する();
491 }
492 #endregion
493 #region [ Upstairs ]
494 if ( ( ( this.act曲リスト.r現在選択中の曲 != null ) && ( this.act曲リスト.r現在選択中の曲.r親ノ != null ) ) && ( CDTXMania.Pad.b押された( E楽器パ.DRUMS, Eパッド.LC ) || CDTXMania.Pad.b押されたGB( Eパッド.Cancel ) ) )
495 {
496 this.actPresound.tサウンド停止();
497 CDTXMania.Skin.sound取消音.t再生する();
498 this.act曲リスト.tBOXを出る();
499 this.t選択曲変更通知();
500 }
501 #endregion
502 #region [ BDx2: 簡易CONFIG ]
503 if ( CDTXMania.Pad.b押された( E楽器パ.DRUMS, Eパッド.BD ) )
504 { // [BD]x2 スクロール速度変更
505 CommandHistory.Add( E楽器パ.DRUMS, EパッドFlag.BD );
506 EパッドFlag[] comChangeScrollSpeed = new EパッドFlag[] { EパッドFlag.BD, EパッドFlag.BD };
507 if ( CommandHistory.CheckCommand( comChangeScrollSpeed, E楽器パ.DRUMS ) )
508 {
509 // Debug.WriteLine( "ドラムススクロール速度変更" );
510 // CDTXMania.ConfigIni.n譜面スクロール速度.Drums = ( CDTXMania.ConfigIni.n譜面スクロール速度.Drums + 1 ) % 0x10;
511 CDTXMania.Skin.sound変更音.t再生する();
512 this.actQuickConfig.tActivatePopupMenu( E楽器パ.DRUMS );
513 }
514 }
515 #endregion
516 #region [ HHx2: 難易度変更 ]
517 if ( CDTXMania.Pad.b押された( E楽器パ.DRUMS, Eパッド.HH ) || CDTXMania.Pad.b押された( E楽器パ.DRUMS, Eパッド.HHO ) )
518 { // [HH]x2 難易度変更
519 CommandHistory.Add( E楽器パ.DRUMS, EパッドFlag.HH );
520 EパッドFlag[] comChangeDifficulty = new EパッドFlag[] { EパッドFlag.HH, EパッドFlag.HH };
521 if ( CommandHistory.CheckCommand( comChangeDifficulty, E楽器パ.DRUMS ) )
522 {
523 Debug.WriteLine( "ドラムス難易度変更" );
524 this.act曲リスト.t難易度レベルをひとつ進める();
525 CDTXMania.Skin.sound変更音.t再生する();
526 }
527 }
528 #endregion
529 #region [ G + PickPick Guitar: 難易度変更 ]
530 if ( CDTXMania.Pad.b押されている( E楽器パ.GUITAR, Eパッド.G ) && CDTXMania.Pad.b押された( E楽器パ.GUITAR, Eパッド.Pick ) ) // #24177 2011.1.17 yyagi || -> &&
531 { // [G] + [Pick][Pick] ギター難易度変更
532 CommandHistory.Add( E楽器パ.GUITAR, EパッドFlag.Pick | EパッドFlag.G );
533 EパッドFlag[] comChangeDifficulty = new EパッドFlag[] { EパッドFlag.Pick | EパッドFlag.G, EパッドFlag.Pick | EパッドFlag.G };
534 if ( CommandHistory.CheckCommand( comChangeDifficulty, E楽器パ.GUITAR ) )
535 {
536 Debug.WriteLine( "ギター難易度変更" );
537 this.act曲リスト.t難易度レベルをひとつ進める();
538 CDTXMania.Skin.sound変更音.t再生する();
539 }
540 }
541 #endregion
542 #region [ G + PickPick Bass: 難易度変更 ]
543 if ( CDTXMania.Pad.b押されている( E楽器パ.BASS, Eパッド.G ) && CDTXMania.Pad.b押された( E楽器パ.BASS, Eパッド.Pick ) ) // #24177 2011.1.17 yyagi || -> &&
544 { // [G] + [Pick][Pick] ベース難易度変更
545 CommandHistory.Add( E楽器パ.BASS, EパッドFlag.Pick | EパッドFlag.G );
546 EパッドFlag[] comChangeDifficulty = new EパッドFlag[] { EパッドFlag.Pick | EパッドFlag.G, EパッドFlag.Pick | EパッドFlag.G };
547 if ( CommandHistory.CheckCommand( comChangeDifficulty, E楽器パ.BASS ) )
548 {
549 Debug.WriteLine( "ベース難易度変更" );
550 this.act曲リスト.t難易度レベルをひとつ進める();
551 CDTXMania.Skin.sound変更音.t再生する();
552 }
553 }
554 #endregion
555 #region [ Pick G G Pick Guitar: ギターとベースを入れ替え ]
556 if ( CDTXMania.Pad.b押された( E楽器パ.GUITAR, Eパッド.Pick ) && !CDTXMania.Pad.b押されている( E楽器パ.GUITAR, Eパッド.G ) )
557 { // ギター[Pick]: コマンドとしてEnqueue
558 CommandHistory.Add( E楽器パ.GUITAR, EパッドFlag.Pick );
559 // Pick, G, G, Pick で、ギターとベースを入れ替え
560 EパッドFlag[] comSwapGtBs1 = new EパッドFlag[] { EパッドFlag.Pick, EパッドFlag.G, EパッドFlag.G, EパッドFlag.Pick };
561 if ( CommandHistory.CheckCommand( comSwapGtBs1, E楽器パ.GUITAR ) )
562 {
563 Debug.WriteLine( "ギターとベースの入れ替え1" );
564 CDTXMania.Skin.sound変更音.t再生する();
565 // ギターとベースのキーを入れ替え
566 //CDTXMania.ConfigIni.SwapGuitarBassKeyAssign();
567 CDTXMania.ConfigIni.bIsSwappedGuitarBass = !CDTXMania.ConfigIni.bIsSwappedGuitarBass;
568 }
569 }
570 #endregion
571 #region [ Pick G G Pick Bass: ギターとベースを入れ替え ]
572 if ( CDTXMania.Pad.b押された( E楽器パ.BASS, Eパッド.Pick ) && !CDTXMania.Pad.b押されている( E楽器パ.BASS, Eパッド.G ) )
573 { // ベース[Pick]: コマンドとしてEnqueue
574 CommandHistory.Add( E楽器パ.BASS, EパッドFlag.Pick );
575 // Pick, G, G, Pick で、ギターとベースを入れ替え
576 EパッドFlag[] comSwapGtBs1 = new EパッドFlag[] { EパッドFlag.Pick, EパッドFlag.G, EパッドFlag.G, EパッドFlag.Pick };
577 if ( CommandHistory.CheckCommand( comSwapGtBs1, E楽器パ.BASS ) )
578 {
579 Debug.WriteLine( "ギターとベースの入れ替え2" );
580 CDTXMania.Skin.sound変更音.t再生する();
581 // ギターとベースのキーを入れ替え
582 //CDTXMania.ConfigIni.SwapGuitarBassKeyAssign();
583 CDTXMania.ConfigIni.bIsSwappedGuitarBass = !CDTXMania.ConfigIni.bIsSwappedGuitarBass;
584 }
585 }
586 #endregion
587 #region [ G G G Guitar: ソート画面 ]
588 if ( CDTXMania.Pad.b押された( E楽器パ.GUITAR, Eパッド.G ) )
589 { // ギター[G]: コマンドとしてEnqueue
590 CommandHistory.Add( E楽器パ.GUITAR, EパッドFlag.G );
591 // ギター G, G, G で、ソート画面に遷移
592 EパッドFlag[] comSortGt = new EパッドFlag[] { EパッドFlag.G, EパッドFlag.G, EパッドFlag.G };
593 if ( CommandHistory.CheckCommand( comSortGt, E楽器パ.GUITAR ) )
594 {
595 CDTXMania.Skin.sound変更音.t再生する();
596 this.actSortSongs.tActivatePopupMenu( E楽器パ.GUITAR, ref this.act曲リスト );
597 }
598 }
599 #endregion
600 #region [ G G G Bass: ソート画面 ]
601 if ( CDTXMania.Pad.b押された( E楽器パ.BASS, Eパッド.G ) )
602 { // ベース[G]: コマンドとしてEnqueue
603 CommandHistory.Add( E楽器パ.BASS, EパッドFlag.G );
604 // ベース G, G, G で、ソート画面に遷移
605 EパッドFlag[] comSortBs = new EパッドFlag[] { EパッドFlag.G, EパッドFlag.G, EパッドFlag.G };
606 if ( CommandHistory.CheckCommand( comSortBs, E楽器パ.BASS ) )
607 {
608 CDTXMania.Skin.sound変更音.t再生する();
609 this.actSortSongs.tActivatePopupMenu( E楽器パ.BASS, ref this.act曲リスト );
610 }
611 }
612 #endregion
613 #region [ BD HT Drums: ソート画面 ]
614 if ( CDTXMania.Pad.b押されている( E楽器パ.DRUMS, Eパッド.BD ) && CDTXMania.Pad.b押された( E楽器パ.DRUMS, Eパッド.HT ) )
615 { // [BD]+[HT] 未使用
616 //
617 //CommandHistory.Add( E楽器パート.DRUMS, EパッドFlag.HT );
618 //EパッドFlag[] comSort = new EパッドFlag[] { EパッドFlag.BD, EパッドFlag.HT };
619 //if ( CommandHistory.CheckCommand( comSort, E楽器パート.DRUMS ) )
620 {
621 CDTXMania.Skin.sound変更音.t再生する();
622 this.actSortSongs.tActivatePopupMenu( E楽器パ.DRUMS, ref this.act曲リスト );
623 }
624 }
625 #endregion
626 }
627 }
628 this.actSortSongs.t進行描画();
629 this.actQuickConfig.t進行描画();
630 }
631 }
632 return 0;
633 }
634 public enum E戻り値 : int
635 {
636 継続,
637 タイトルに戻る,
638 選曲した,
639 オプション呼び出し,
640 コンフィグ呼び出し,
641 スキン変更
642 }
643
644
645 // その他
646
647 #region [ private ]
648 //-----------------
649 [StructLayout( LayoutKind.Sequential )]
650 private struct ST反復用カウンタ
651 {
652 public CCounter Up;
653 public CCounter Down;
654 public CCounter R;
655 public CCounter B;
656 public CCounter this[ int index ]
657 {
658 get
659 {
660 switch( index )
661 {
662 case 0:
663 return this.Up;
664
665 case 1:
666 return this.Down;
667
668 case 2:
669 return this.R;
670
671 case 3:
672 return this.B;
673 }
674 throw new IndexOutOfRangeException();
675 }
676 set
677 {
678 switch( index )
679 {
680 case 0:
681 this.Up = value;
682 return;
683
684 case 1:
685 this.Down = value;
686 return;
687
688 case 2:
689 this.R = value;
690 return;
691
692 case 3:
693 this.B = value;
694 return;
695 }
696 throw new IndexOutOfRangeException();
697 }
698 }
699 }
700 private CActSelectArtistComment actArtistComment;
701 private CActFIFOBlack actFIFO;
702 private CActFIFOBlack actFIfrom結果画面;
703 // private CActFIFOBlack actFOtoNowLoading; // #27787 2012.3.10 yyagi 曲決定時の画面フェードアウトの省略
704 private CActSelectInformation actInformation;
705 private CActSelectPreimageパネル actPreimageパネル;
706 private CActSelectPresound actPresound;
707 private CActオプションパネル actオプションパネル;
708 public CActSelectステタスパネル actステタスパネル;
709 private CActSelect演奏履歴パネル act演奏履歴パネル;
710 private CActSelect曲リスト act曲リスト;
711 private CActSelectShowCurrentPosition actShowCurrentPosition;
712
713 private CActSortSongs actSortSongs;
714 private CActSelectQuickConfig actQuickConfig;
715
716 private bool bBGM再生済み;
717 private ST反復用カウンタ ct反復用;
718 private CCounter ct登場時アニメ用共通;
719 private E戻り値 eフェドアウト完了時の戻り値;
720 private Font ftフォント;
721 private CTexture txコメントバ;
722 private CTexture tx下部パネル;
723 private CTexture tx上部パネル;
724 private CTexture tx背景;
725 private CTexture txFLIP;
726 private CDirectShow ds背景動画;
727 private long lDshowPosition;
728 private long lStopPosition;
729
730 private struct STCommandTime // #24063 2011.1.16 yyagi コマンド入力時刻の記録用
731 {
732 public E楽器パ eInst; // 使用楽器
733 public EパッドFlag ePad; // 押されたコマンド(同時押しはOR演算で列挙する)
734 public long time; // コマンド入力時刻
735 }
736 public class CCommandHistory // #24063 2011.1.16 yyagi コマンド入力履歴を保持・確認するクラス
737 {
738 readonly int buffersize = 16;
739 private List<STCommandTime> stct;
740
741 public CCommandHistory() // コンストラクタ
742 {
743 stct = new List<STCommandTime>( buffersize );
744 }
745
746 /// <summary>
747 /// コマンド入力履歴へのコマンド追加
748 /// </summary>
749 /// <param name="_eInst">楽器の種類</param>
750 /// <param name="_ePad">入力コマンド(同時押しはOR演算で列挙すること)</param>
751 public void Add( E楽器パ _eInst, EパッドFlag _ePad )
752 {
753 STCommandTime _stct = new STCommandTime {
754 eInst = _eInst,
755 ePad = _ePad,
756 time = CDTXMania.Timer.n現在時刻
757 };
758
759 if ( stct.Count >= buffersize )
760 {
761 stct.RemoveAt( 0 );
762 }
763 stct.Add(_stct);
764 //Debug.WriteLine( "CMDHIS: 楽器=" + _stct.eInst + ", CMD=" + _stct.ePad + ", time=" + _stct.time );
765 }
766 public void RemoveAt( int index )
767 {
768 stct.RemoveAt( index );
769 }
770
771 /// <summary>
772 /// コマンド入力に成功しているか調べる
773 /// </summary>
774 /// <param name="_ePad">入力が成功したか調べたいコマンド</param>
775 /// <param name="_eInst">対象楽器</param>
776 /// <returns>コマンド入力成功時true</returns>
777 public bool CheckCommand( EパッドFlag[] _ePad, E楽器パ _eInst)
778 {
779 int targetCount = _ePad.Length;
780 int stciCount = stct.Count;
781 if ( stciCount < targetCount )
782 {
783 //Debug.WriteLine("NOT start checking...stciCount=" + stciCount + ", targetCount=" + targetCount);
784 return false;
785 }
786
787 long curTime = CDTXMania.Timer.n現在時刻;
788 //Debug.WriteLine("Start checking...targetCount=" + targetCount);
789 for ( int i = targetCount - 1, j = stciCount - 1; i >= 0; i--, j-- )
790 {
791 if ( _ePad[ i ] != stct[ j ].ePad )
792 {
793 //Debug.WriteLine( "CMD解析: false targetCount=" + targetCount + ", i=" + i + ", j=" + j + ": ePad[]=" + _ePad[i] + ", stci[j] = " + stct[j].ePad );
794 return false;
795 }
796 if ( stct[ j ].eInst != _eInst )
797 {
798 //Debug.WriteLine( "CMD解析: false " + i );
799 return false;
800 }
801 if ( curTime - stct[ j ].time > 500 )
802 {
803 //Debug.WriteLine( "CMD解析: false " + i + "; over 500ms" );
804 return false;
805 }
806 curTime = stct[ j ].time;
807 }
808
809 //Debug.Write( "CMD解析: 成功!(" + _ePad.Length + ") " );
810 //for ( int i = 0; i < _ePad.Length; i++ ) Debug.Write( _ePad[ i ] + ", " );
811 //Debug.WriteLine( "" );
812 //stct.RemoveRange( 0, targetCount ); // #24396 2011.2.13 yyagi
813 stct.Clear(); // #24396 2011.2.13 yyagi Clear all command input history in case you succeeded inputting some command
814
815 return true;
816 }
817 }
818 public CCommandHistory CommandHistory;
819
820 private void tソルを下へ移動する()
821 {
822 CDTXMania.Skin.soundソル移動音.t再生する();
823 this.act曲リスト.t次に移動();
824 }
825 private void tソルを上へ移動する()
826 {
827 CDTXMania.Skin.soundソル移動音.t再生する();
828 this.act曲リスト.t前に移動();
829 }
830 private void t曲をランダム選択する()
831 {
832 C曲リストノ song = this.act曲リスト.r現在選択中の曲;
833 if( ( song.stackランダム演奏番号.Count == 0 ) || ( song.listランダム用ノドリスト == null ) )
834 {
835 if( song.listランダム用ノドリスト == null )
836 {
837 song.listランダム用ノドリスト = this.t指定された曲が存在する場所の曲を列挙する・子リスト含む( song );
838 }
839 int count = song.listランダム用ノドリスト.Count;
840 if( count == 0 )
841 {
842 return;
843 }
844 int[] numArray = new int[ count ];
845 for( int i = 0; i < count; i++ )
846 {
847 numArray[ i ] = i;
848 }
849 for( int j = 0; j < ( count * 1.5 ); j++ )
850 {
851 int index = CDTXMania.Random.Next( count );
852 int num5 = CDTXMania.Random.Next( count );
853 int num6 = numArray[ num5 ];
854 numArray[ num5 ] = numArray[ index ];
855 numArray[ index ] = num6;
856 }
857 for( int k = 0; k < count; k++ )
858 {
859 song.stackランダム演奏番号.Push( numArray[ k ] );
860 }
861 if( CDTXMania.ConfigIni.bLogDTX詳細ログ出力 )
862 {
863 StringBuilder builder = new StringBuilder( 0x400 );
864 builder.Append( string.Format( "ランダムインデックスリストを作成しました: {0}曲: ", song.stackランダム演奏番号.Count ) );
865 for( int m = 0; m < count; m++ )
866 {
867 builder.Append( string.Format( "{0} ", numArray[ m ] ) );
868 }
869 Trace.TraceInformation( builder.ToString() );
870 }
871 }
872 this.r確定された曲 = song.listランダム用ノドリスト[ song.stackランダム演奏番号.Pop() ];
873 this.n確定された曲の難易度 = this.act曲リスト.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( this.r確定された曲 );
874 this.r確定されたスコア = this.r確定された曲.arスコア[ this.n確定された曲の難易度 ];
875 this.eフェドアウト完了時の戻り値 = E戻り値.選曲した;
876 // this.actFOtoNowLoading.tフェードアウト開始(); // #27787 2012.3.10 yyagi 曲決定時の画面フェードアウトの省略
877 base.eフェID = CStage.Eフェ.選曲_NowLoading画面へのフェドアウト;
878 if( CDTXMania.ConfigIni.bLogDTX詳細ログ出力 )
879 {
880 int[] numArray2 = song.stackランダム演奏番号.ToArray();
881 StringBuilder builder2 = new StringBuilder( 0x400 );
882 builder2.Append( "ランダムインデックスリスト残り: " );
883 if( numArray2.Length > 0 )
884 {
885 for( int n = 0; n < numArray2.Length; n++ )
886 {
887 builder2.Append( string.Format( "{0} ", numArray2[ n ] ) );
888 }
889 }
890 else
891 {
892 builder2.Append( "(なし)" );
893 }
894 Trace.TraceInformation( builder2.ToString() );
895 }
896 CDTXMania.Skin.bgm選曲画面.t停止する();
897 }
898 private void t曲を選択する()
899 {
900 this.r確定された曲 = this.act曲リスト.r現在選択中の曲;
901 this.r確定されたスコア = this.act曲リスト.r現在選択中のスコア;
902 this.n確定された曲の難易度 = this.act曲リスト.n現在選択中の曲の現在の難易度レベル;
903 if( ( this.r確定された曲 != null ) && ( this.r確定されたスコア != null ) )
904 {
905 this.eフェドアウト完了時の戻り値 = E戻り値.選曲した;
906 // this.actFOtoNowLoading.tフェードアウト開始(); // #27787 2012.3.10 yyagi 曲決定時の画面フェードアウトの省略
907 base.eフェID = CStage.Eフェ.選曲_NowLoading画面へのフェドアウト;
908 }
909 CDTXMania.Skin.bgm選曲画面.t停止する();
910 }
911 private List<C曲リストノ> t指定された曲が存在する場所の曲を列挙する・子リスト含む( C曲リストノ song )
912 {
913 List<C曲リストノ> list = new List<C曲リストノ>();
914 song = song.r親ノ;
915 if( ( song == null ) && ( CDTXMania.Songs管理.list曲ル.Count > 0 ) )
916 {
917 foreach( C曲リストノ c曲リストノ in CDTXMania.Songs管理.list曲ル )
918 {
919 if( ( c曲リストノ.eド種別 == C曲リストノ.Eド種別.SCORE ) || ( c曲リストノ.eド種別 == C曲リストノ.Eド種別.SCORE_MIDI ) )
920 {
921 list.Add( c曲リストノ );
922 }
923 if( ( c曲リストノ.list子リスト != null ) && CDTXMania.ConfigIni.bランダムセレクトで子BOXを検索対象とする )
924 {
925 this.t指定された曲の子リストの曲を列挙する・孫リスト含む( c曲リストノ, ref list );
926 }
927 }
928 return list;
929 }
930 this.t指定された曲の子リストの曲を列挙する・孫リスト含む( song, ref list );
931 return list;
932 }
933 private void t指定された曲の子リストの曲を列挙する・孫リスト含む( C曲リストノ r, ref List<C曲リストノ> list )
934 {
935 if( ( r != null ) && ( r.list子リスト != null ) )
936 {
937 foreach( C曲リストノ c曲リストノ in r.list子リスト )
938 {
939 if( ( c曲リストノ.eド種別 == C曲リストノ.Eド種別.SCORE ) || ( c曲リストノ.eド種別 == C曲リストノ.Eド種別.SCORE_MIDI ) )
940 {
941 list.Add( c曲リストノ );
942 }
943 if( ( c曲リストノ.list子リスト != null ) && CDTXMania.ConfigIni.bランダムセレクトで子BOXを検索対象とする )
944 {
945 this.t指定された曲の子リストの曲を列挙する・孫リスト含む( c曲リストノ, ref list );
946 }
947 }
948 }
949 }
950 //-----------------
951 #endregion
952 }
953 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26