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

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