Develop and Download Open Source Software

Browse Subversion Repository

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 186 - (hide annotations) (download)
Sun Dec 15 11:02:39 2013 UTC (10 years, 3 months ago) by kairera0467
File size: 42409 byte(s)
#xxxxx CSongDBにギターベース側のレベルDecを追加。
#30763 XG選曲画面のものをコミット。(手元に別々にデータはあるので戻すこともできます。)
変更点は、
・パネルの大きさ等変更。
・スクロールバーを作り直した。
・BPMの表示方法を新しくした。
・パネルの構成を一部変更。
#32604 STAGEFILEがある曲だけ6_background.mp4を使わないようにして一時的な対策。
#xxxxx 8_background.mp4がうまく再生されないバグの修正。
#xxxxx 終了時のアニメーションを実装。
#xxxxx 難易度変更をした時のボイス機能を追加。rev185と同じ。(Novice、Regular、Expert、Master、Basic、Advanced、Extreme)
1 kairera0467 2 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 kairera0467 130 using DirectShowLib;
9 kairera0467 2 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 kairera0467 186 if( File.Exists (CSkin.Path(@"Graphics\5_background.mp4")))
227 kairera0467 130 {
228     this.ds背景動画 = CDTXMania.t失敗してもスキップ可能なDirectShowを生成する( CSkin.Path(@"Graphics\5_background.mp4"), CDTXMania.app.WindowHandle, true );
229     }
230 kairera0467 186 this.tx上部パネル = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\5_header panel.png" ), false );
231 kairera0467 2 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 kairera0467 186 CDTXMania.t安全にDisposeする( ref this.ds背景動画 );
242 kairera0467 2 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 kairera0467 186 this.ct登場時アニメ用共通 = new CCounter( 0, 100, 4, CDTXMania.Timer );
259 kairera0467 2 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 kairera0467 186 CDTXMania.Skin.soundSelectMusic.t再生する();
270 kairera0467 2 this.t選択曲変更通知();
271     base.b初めての進行描画 = false;
272     }
273     //---------------------
274     #endregion
275    
276     this.ct登場時アニメ用共通.t進行();
277    
278 kairera0467 186 if( this.ds背景動画 != null )
279 kairera0467 130 {
280     this.ds背景動画.t現時点における最新のスナップイメジをTextureに転写する( this.tx背景 );
281     this.ds背景動画.t再生開始();
282     this.ds背景動画.MediaSeeking.GetPositions(out this.lDshowPosition, out this.lStopPosition);
283     if (this.lDshowPosition == this.lStopPosition)
284     {
285     this.ds背景動画.MediaSeeking.SetPositions(
286     DsLong.FromInt64((long)(0)),
287     AMSeekingSeekingFlags.AbsolutePositioning,
288     0,
289     AMSeekingSeekingFlags.NoPositioning);
290     }
291     }
292 kairera0467 186
293 kairera0467 2 if( this.tx背景 != null )
294 kairera0467 175 {
295 kairera0467 184 if( this.ds背景動画 != null && this.ds背景動画.b上下反転 )
296 kairera0467 175 this.tx背景.t2D上下反転描画( CDTXMania.app.Device, 0, 0 );
297     else
298     this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );
299     }
300 kairera0467 2
301 kairera0467 186 // this.actPreimageパネル.On進行描画();
302 kairera0467 2 // this.bIsEnumeratingSongs = !this.actPreimageパネル.bIsPlayingPremovie; // #27060 2011.3.2 yyagi: #PREMOVIE再生中は曲検索を中断する
303    
304     this.act曲リスト.On進行描画();
305     int y = 0;
306     if( this.ct登場時アニメ用共通.b進行中 )
307     {
308     double db登場割合 = ( (double) this.ct登場時アニメ用共通.n現在の値 ) / 100.0; // 100が最終値
309     double dbY表示割合 = Math.Sin( Math.PI / 2 * db登場割合 );
310     y = ( (int) ( this.tx上部パネル.sz画像サイズ.Height * dbY表示割合 ) ) - this.tx上部パネル.sz画像サイズ.Height;
311     }
312     if( this.tx上部パネル != null )
313 kairera0467 186 {
314     this.tx上部パネル.t2D描画( CDTXMania.app.Device, 0f, 78.0f - ( this.ct登場時アニメ用共通.n現在の値 * 0.61f ) , new Rectangle(0, 17, 200, 55 ) );
315     this.tx上部パネル.t2D描画( CDTXMania.app.Device, 0f, 24.0f + ( this.ct登場時アニメ用共通.n現在の値 * 0.57f ) , new Rectangle(0, 81, 200, 55 ) );
316     this.tx上部パネル.t2D描画( CDTXMania.app.Device, 0f, 150.0f, new Rectangle(0, 150, 200, 12 ) );
317     this.tx上部パネル.t2D描画( CDTXMania.app.Device, 0f, 143.0f, new Rectangle(0, 143, 200, 3 ) );
318     }
319 kairera0467 2
320 kairera0467 186 //this.actInformation.On進行描画();
321 kairera0467 2 if( this.tx下部パネル != null )
322     this.tx下部パネル.t2D描画( CDTXMania.app.Device, 0, 720 - this.tx下部パネル.sz画像サイズ.Height );
323    
324     this.actステタスパネル.On進行描画();
325 kairera0467 186 if( CDTXMania.ConfigIni.bDrums有効 )
326     {
327     this.act演奏履歴パネル.On進行描画();
328     }
329 kairera0467 2 this.actPresound.On進行描画();
330     if( this.txコメントバ != null )
331     {
332 kairera0467 186 // this.txコメントバー.t2D描画(CDTXMania.app.Device, 484, 342);
333 kairera0467 2 }
334 kairera0467 186 // this.actArtistComment.On進行描画();
335     //this.actオプションパネル.On進行描画();
336 kairera0467 2 if ( this.txFLIP != null && CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.16 yyagi
337     {
338     Rectangle rect = new Rectangle(0x1f, 0x31, 20, 11);
339     this.txFLIP.t2D描画( CDTXMania.app.Device, 80, 654, rect );
340     }
341     this.actShowCurrentPosition.On進行描画(); // #27648 2011.3.28 yyagi
342    
343     switch ( base.eフェID )
344     {
345     case CStage.Eフェ.共通_フェドイン:
346     if( this.actFIFO.On進行描画() != 0 )
347     {
348     base.eフェID = CStage.Eフェ.共通_通常状態;
349     }
350     break;
351    
352     case CStage.Eフェ.共通_フェドアウト:
353     if( this.actFIFO.On進行描画() == 0 )
354     {
355     break;
356     }
357     return (int) this.eフェドアウト完了時の戻り値;
358    
359     case CStage.Eフェ.選曲_結果画面からのフェドイン:
360     if( this.actFIfrom結果画面.On進行描画() != 0 )
361     {
362     base.eフェID = CStage.Eフェ.共通_通常状態;
363     }
364     break;
365    
366     case CStage.Eフェ.選曲_NowLoading画面へのフェドアウト:
367     // if( this.actFOtoNowLoading.On進行描画() == 0 )
368     // {
369     // break;
370     // }
371     return (int) this.eフェドアウト完了時の戻り値;
372     }
373     if( !this.bBGM再生済み && ( base.eフェID == CStage.Eフェ.共通_通常状態 ) )
374     {
375     CDTXMania.Skin.bgm選曲画面.n音量・次に鳴るサウンド = 100;
376     CDTXMania.Skin.bgm選曲画面.t再生する();
377     this.bBGM再生済み = true;
378     }
379    
380    
381     //Debug.WriteLine( "パンくず=" + this.r現在選択中の曲.strBreadcrumbs );
382    
383    
384     // キー入力
385     if( base.eフェID == CStage.Eフェ.共通_通常状態
386     && CDTXMania.act現在入力を占有中のプラグイン == null )
387     {
388     #region [ 簡易CONFIGでMore、またはShift+F1: 詳細CONFIG呼び出し ]
389     if ( actQuickConfig.bGotoDetailConfig )
390     { // 詳細CONFIG呼び出し
391     actQuickConfig.tDeativatePopupMenu();
392     this.actPresound.tサウンド停止();
393     this.eフェドアウト完了時の戻り値 = E戻り値.コンフィグ呼び出し; // #24525 2011.3.16 yyagi: [SHIFT]-[F1]でCONFIG呼び出し
394     this.actFIFO.tフェドアウト開始();
395     base.eフェID = CStage.Eフェ.共通_フェドアウト;
396     CDTXMania.Skin.sound取消音.t再生する();
397     return 0;
398     }
399     #endregion
400     if ( !this.actSortSongs.bIsActivePopupMenu && !this.actQuickConfig.bIsActivePopupMenu )
401     {
402     #region [ ESC ]
403     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 ) ) ) )
404     { // [ESC]
405     CDTXMania.Skin.sound取消音.t再生する();
406     this.eフェドアウト完了時の戻り値 = E戻り値.タイトルに戻る;
407     this.actFIFO.tフェドアウト開始();
408     base.eフェID = CStage.Eフェ.共通_フェドアウト;
409     return 0;
410     }
411     #endregion
412     #region [ Shift-F1: CONFIG画面 ]
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.F1 ) )
415     { // [SHIFT] + [F1] CONFIG
416     this.actPresound.tサウンド停止();
417     this.eフェドアウト完了時の戻り値 = E戻り値.コンフィグ呼び出し; // #24525 2011.3.16 yyagi: [SHIFT]-[F1]でCONFIG呼び出し
418     this.actFIFO.tフェドアウト開始();
419     base.eフェID = CStage.Eフェ.共通_フェドアウト;
420     CDTXMania.Skin.sound取消音.t再生する();
421     return 0;
422     }
423     #endregion
424     #region [ Shift-F2: 未使用 ]
425     // #24525 2011.3.16 yyagi: [SHIFT]+[F2]は廃止(将来発生するかもしれない別用途のためにキープ)
426     /*
427     if ((CDTXMania.Input管理.Keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.RightShift) || CDTXMania.Input管理.Keyboard.bキーが押されている((int)SlimDX.DirectInput.Key.LeftShift)) &&
428     CDTXMania.Input管理.Keyboard.bキーが押された((int)SlimDX.DirectInput.Key.F2))
429     { // [SHIFT] + [F2] CONFIGURATION
430     this.actPresound.tサウンド停止();
431     this.eフェードアウト完了時の戻り値 = E戻り値.オプション呼び出し;
432     this.actFIFO.tフェードアウト開始();
433     base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
434     CDTXMania.Skin.sound取消音.t再生する();
435     return 0;
436     }
437     */
438     #endregion
439     if ( this.act曲リスト.r現在選択中の曲 != null )
440     {
441     #region [ Decide ]
442 kairera0467 63 if ( ( CDTXMania.Pad.b押されたDGB( Eパッド.Decide ) || CDTXMania.Pad.b押された( E楽器パ.DRUMS, Eパッド.CY ) || CDTXMania.Pad.b押された( E楽器パ.DRUMS, Eパッド.RD ) ) ||
443 kairera0467 2 ( CDTXMania.ConfigIni.bEnterがキ割り当てのどこにも使用されていない && CDTXMania.Input管理.Keyboard.bが押された( (int) SlimDX.DirectInput.Key.Return ) ) )
444     {
445     if ( this.act曲リスト.r現在選択中の曲 != null )
446     {
447     switch ( this.act曲リスト.r現在選択中の曲.eド種別 )
448     {
449     case C曲リストノ.Eド種別.SCORE:
450     CDTXMania.Skin.sound決定音.t再生する();
451     this.t曲を選択する();
452     break;
453    
454     case C曲リストノ.Eド種別.SCORE_MIDI:
455     CDTXMania.Skin.sound決定音.t再生する();
456     this.t曲を選択する();
457     break;
458    
459     case C曲リストノ.Eド種別.BOX:
460     {
461     CDTXMania.Skin.sound決定音.t再生する();
462     bool bNeedChangeSkin = this.act曲リスト.tBOXに入る();
463     if ( bNeedChangeSkin )
464     {
465     this.eフェドアウト完了時の戻り値 = E戻り値.スキン変更;
466     base.eフェID = Eフェ.選曲_NowLoading画面へのフェドアウト;
467     }
468     }
469     break;
470    
471     case C曲リストノ.Eド種別.BACKBOX:
472     {
473     CDTXMania.Skin.sound取消音.t再生する();
474     bool bNeedChangeSkin = this.act曲リスト.tBOXを出る();
475     if ( bNeedChangeSkin )
476     {
477     this.eフェドアウト完了時の戻り値 = E戻り値.スキン変更;
478     base.eフェID = Eフェ.選曲_NowLoading画面へのフェドアウト;
479     }
480     }
481     break;
482    
483     case C曲リストノ.Eド種別.RANDOM:
484     CDTXMania.Skin.sound決定音.t再生する();
485     this.t曲をランダム選択する();
486     break;
487     }
488     }
489     }
490     #endregion
491     #region [ Up ]
492 kairera0467 186 this.ct反復用.Up.t反復( CDTXMania.Input管理.Keyboard.bが押されている( (int) SlimDX.DirectInput.Key.LeftArrow ), new CCounter.DG処理( this.tソルを上へ移動する ) );
493 kairera0467 2 this.ct反復用.R.t反復( CDTXMania.Pad.b押されているGB( Eパッド.R ), new CCounter.DG処理( this.tソルを上へ移動する ) );
494     if ( CDTXMania.Pad.b押された( E楽器パ.DRUMS, Eパッド.SD ) )
495     {
496     this.tソルを上へ移動する();
497     }
498     #endregion
499     #region [ Down ]
500 kairera0467 186 this.ct反復用.Down.t反復( CDTXMania.Input管理.Keyboard.bが押されている( (int) SlimDX.DirectInput.Key.RightArrow ), new CCounter.DG処理( this.tソルを下へ移動する ) );
501 kairera0467 2 this.ct反復用.B.t反復( CDTXMania.Pad.b押されているGB( Eパッド.B ), new CCounter.DG処理( this.tソルを下へ移動する ) );
502     if ( CDTXMania.Pad.b押された( E楽器パ.DRUMS, Eパッド.FT ) )
503     {
504     this.tソルを下へ移動する();
505     }
506     #endregion
507     #region [ Upstairs ]
508     if ( ( ( this.act曲リスト.r現在選択中の曲 != null ) && ( this.act曲リスト.r現在選択中の曲.r親ノ != null ) ) && ( CDTXMania.Pad.b押された( E楽器パ.DRUMS, Eパッド.LC ) || CDTXMania.Pad.b押されたGB( Eパッド.Cancel ) ) )
509     {
510     this.actPresound.tサウンド停止();
511     CDTXMania.Skin.sound取消音.t再生する();
512     this.act曲リスト.tBOXを出る();
513     this.t選択曲変更通知();
514     }
515     #endregion
516     #region [ BDx2: 簡易CONFIG ]
517     if ( CDTXMania.Pad.b押された( E楽器パ.DRUMS, Eパッド.BD ) )
518     { // [BD]x2 スクロール速度変更
519     CommandHistory.Add( E楽器パ.DRUMS, EパッドFlag.BD );
520     EパッドFlag[] comChangeScrollSpeed = new EパッドFlag[] { EパッドFlag.BD, EパッドFlag.BD };
521     if ( CommandHistory.CheckCommand( comChangeScrollSpeed, E楽器パ.DRUMS ) )
522     {
523     // Debug.WriteLine( "ドラムススクロール速度変更" );
524     // CDTXMania.ConfigIni.n譜面スクロール速度.Drums = ( CDTXMania.ConfigIni.n譜面スクロール速度.Drums + 1 ) % 0x10;
525     CDTXMania.Skin.sound変更音.t再生する();
526     this.actQuickConfig.tActivatePopupMenu( E楽器パ.DRUMS );
527     }
528     }
529     #endregion
530     #region [ HHx2: 難易度変更 ]
531     if ( CDTXMania.Pad.b押された( E楽器パ.DRUMS, Eパッド.HH ) || CDTXMania.Pad.b押された( E楽器パ.DRUMS, Eパッド.HHO ) )
532     { // [HH]x2 難易度変更
533     CommandHistory.Add( E楽器パ.DRUMS, EパッドFlag.HH );
534     EパッドFlag[] comChangeDifficulty = new EパッドFlag[] { EパッドFlag.HH, EパッドFlag.HH };
535     if ( CommandHistory.CheckCommand( comChangeDifficulty, E楽器パ.DRUMS ) )
536     {
537     Debug.WriteLine( "ドラムス難易度変更" );
538     this.act曲リスト.t難易度レベルをひとつ進める();
539 kairera0467 186 //CDTXMania.Skin.sound変更音.t再生する();
540 kairera0467 2 }
541     }
542     #endregion
543     #region [ G + PickPick Guitar: 難易度変更 ]
544     if ( CDTXMania.Pad.b押されている( E楽器パ.GUITAR, Eパッド.G ) && CDTXMania.Pad.b押された( E楽器パ.GUITAR, Eパッド.Pick ) ) // #24177 2011.1.17 yyagi || -> &&
545     { // [G] + [Pick][Pick] ギター難易度変更
546     CommandHistory.Add( E楽器パ.GUITAR, EパッドFlag.Pick | EパッドFlag.G );
547     EパッドFlag[] comChangeDifficulty = new EパッドFlag[] { EパッドFlag.Pick | EパッドFlag.G, EパッドFlag.Pick | EパッドFlag.G };
548     if ( CommandHistory.CheckCommand( comChangeDifficulty, E楽器パ.GUITAR ) )
549     {
550     Debug.WriteLine( "ギター難易度変更" );
551     this.act曲リスト.t難易度レベルをひとつ進める();
552     CDTXMania.Skin.sound変更音.t再生する();
553     }
554     }
555     #endregion
556     #region [ G + PickPick Bass: 難易度変更 ]
557     if ( CDTXMania.Pad.b押されている( E楽器パ.BASS, Eパッド.G ) && CDTXMania.Pad.b押された( E楽器パ.BASS, Eパッド.Pick ) ) // #24177 2011.1.17 yyagi || -> &&
558     { // [G] + [Pick][Pick] ベース難易度変更
559     CommandHistory.Add( E楽器パ.BASS, EパッドFlag.Pick | EパッドFlag.G );
560     EパッドFlag[] comChangeDifficulty = new EパッドFlag[] { EパッドFlag.Pick | EパッドFlag.G, EパッドFlag.Pick | EパッドFlag.G };
561     if ( CommandHistory.CheckCommand( comChangeDifficulty, E楽器パ.BASS ) )
562     {
563     Debug.WriteLine( "ベース難易度変更" );
564     this.act曲リスト.t難易度レベルをひとつ進める();
565     CDTXMania.Skin.sound変更音.t再生する();
566     }
567     }
568     #endregion
569     #region [ Pick G G Pick Guitar: ギターとベースを入れ替え ]
570     if ( CDTXMania.Pad.b押された( E楽器パ.GUITAR, Eパッド.Pick ) && !CDTXMania.Pad.b押されている( E楽器パ.GUITAR, Eパッド.G ) )
571     { // ギター[Pick]: コマンドとしてEnqueue
572     CommandHistory.Add( E楽器パ.GUITAR, EパッドFlag.Pick );
573     // Pick, G, G, Pick で、ギターとベースを入れ替え
574     EパッドFlag[] comSwapGtBs1 = new EパッドFlag[] { EパッドFlag.Pick, EパッドFlag.G, EパッドFlag.G, EパッドFlag.Pick };
575     if ( CommandHistory.CheckCommand( comSwapGtBs1, E楽器パ.GUITAR ) )
576     {
577     Debug.WriteLine( "ギターとベースの入れ替え1" );
578     CDTXMania.Skin.sound変更音.t再生する();
579     // ギターとベースのキーを入れ替え
580     //CDTXMania.ConfigIni.SwapGuitarBassKeyAssign();
581     CDTXMania.ConfigIni.bIsSwappedGuitarBass = !CDTXMania.ConfigIni.bIsSwappedGuitarBass;
582     }
583     }
584     #endregion
585     #region [ Pick G G Pick Bass: ギターとベースを入れ替え ]
586     if ( CDTXMania.Pad.b押された( E楽器パ.BASS, Eパッド.Pick ) && !CDTXMania.Pad.b押されている( E楽器パ.BASS, Eパッド.G ) )
587     { // ベース[Pick]: コマンドとしてEnqueue
588     CommandHistory.Add( E楽器パ.BASS, EパッドFlag.Pick );
589     // Pick, G, G, Pick で、ギターとベースを入れ替え
590     EパッドFlag[] comSwapGtBs1 = new EパッドFlag[] { EパッドFlag.Pick, EパッドFlag.G, EパッドFlag.G, EパッドFlag.Pick };
591     if ( CommandHistory.CheckCommand( comSwapGtBs1, E楽器パ.BASS ) )
592     {
593     Debug.WriteLine( "ギターとベースの入れ替え2" );
594     CDTXMania.Skin.sound変更音.t再生する();
595     // ギターとベースのキーを入れ替え
596     //CDTXMania.ConfigIni.SwapGuitarBassKeyAssign();
597     CDTXMania.ConfigIni.bIsSwappedGuitarBass = !CDTXMania.ConfigIni.bIsSwappedGuitarBass;
598     }
599     }
600     #endregion
601     #region [ G G G Guitar: ソート画面 ]
602     if ( CDTXMania.Pad.b押された( E楽器パ.GUITAR, Eパッド.G ) )
603     { // ギター[G]: コマンドとしてEnqueue
604     CommandHistory.Add( E楽器パ.GUITAR, EパッドFlag.G );
605     // ギター G, G, G で、ソート画面に遷移
606     EパッドFlag[] comSortGt = new EパッドFlag[] { EパッドFlag.G, EパッドFlag.G, EパッドFlag.G };
607     if ( CommandHistory.CheckCommand( comSortGt, E楽器パ.GUITAR ) )
608     {
609     CDTXMania.Skin.sound変更音.t再生する();
610     this.actSortSongs.tActivatePopupMenu( E楽器パ.GUITAR, ref this.act曲リスト );
611     }
612     }
613     #endregion
614     #region [ G G G Bass: ソート画面 ]
615     if ( CDTXMania.Pad.b押された( E楽器パ.BASS, Eパッド.G ) )
616     { // ベース[G]: コマンドとしてEnqueue
617     CommandHistory.Add( E楽器パ.BASS, EパッドFlag.G );
618     // ベース G, G, G で、ソート画面に遷移
619     EパッドFlag[] comSortBs = new EパッドFlag[] { EパッドFlag.G, EパッドFlag.G, EパッドFlag.G };
620     if ( CommandHistory.CheckCommand( comSortBs, E楽器パ.BASS ) )
621     {
622     CDTXMania.Skin.sound変更音.t再生する();
623     this.actSortSongs.tActivatePopupMenu( E楽器パ.BASS, ref this.act曲リスト );
624     }
625     }
626     #endregion
627     #region [ BD HT Drums: ソート画面 ]
628 kairera0467 77 if ( CDTXMania.Pad.b押されている( E楽器パ.DRUMS, Eパッド.BD ) && CDTXMania.Pad.b押された( E楽器パ.DRUMS, Eパッド.HT ) )
629 kairera0467 2 { // [BD]+[HT] 未使用
630     //
631 kairera0467 77 //CommandHistory.Add( E楽器パート.DRUMS, EパッドFlag.HT );
632     //EパッドFlag[] comSort = new EパッドFlag[] { EパッドFlag.BD, EパッドFlag.HT };
633     //if ( CommandHistory.CheckCommand( comSort, E楽器パート.DRUMS ) )
634 kairera0467 2 {
635     CDTXMania.Skin.sound変更音.t再生する();
636     this.actSortSongs.tActivatePopupMenu( E楽器パ.DRUMS, ref this.act曲リスト );
637     }
638     }
639     #endregion
640     }
641     }
642     this.actSortSongs.t進行描画();
643     this.actQuickConfig.t進行描画();
644     }
645     }
646     return 0;
647     }
648     public enum E戻り値 : int
649     {
650     継続,
651     タイトルに戻る,
652     選曲した,
653     オプション呼び出し,
654     コンフィグ呼び出し,
655     スキン変更
656     }
657    
658    
659     // その他
660    
661     #region [ private ]
662     //-----------------
663     [StructLayout( LayoutKind.Sequential )]
664     private struct ST反復用カウンタ
665     {
666     public CCounter Up;
667     public CCounter Down;
668     public CCounter R;
669     public CCounter B;
670     public CCounter this[ int index ]
671     {
672     get
673     {
674     switch( index )
675     {
676     case 0:
677     return this.Up;
678    
679     case 1:
680     return this.Down;
681    
682     case 2:
683     return this.R;
684    
685     case 3:
686     return this.B;
687     }
688     throw new IndexOutOfRangeException();
689     }
690     set
691     {
692     switch( index )
693     {
694     case 0:
695     this.Up = value;
696     return;
697    
698     case 1:
699     this.Down = value;
700     return;
701    
702     case 2:
703     this.R = value;
704     return;
705    
706     case 3:
707     this.B = value;
708     return;
709     }
710     throw new IndexOutOfRangeException();
711     }
712     }
713     }
714     private CActSelectArtistComment actArtistComment;
715     private CActFIFOBlack actFIFO;
716     private CActFIFOBlack actFIfrom結果画面;
717     // private CActFIFOBlack actFOtoNowLoading; // #27787 2012.3.10 yyagi 曲決定時の画面フェードアウトの省略
718     private CActSelectInformation actInformation;
719     private CActSelectPreimageパネル actPreimageパネル;
720     private CActSelectPresound actPresound;
721     private CActオプションパネル actオプションパネル;
722     public CActSelectステタスパネル actステタスパネル;
723     private CActSelect演奏履歴パネル act演奏履歴パネル;
724 kairera0467 186 public CActSelect曲リスト act曲リスト;
725 kairera0467 2 private CActSelectShowCurrentPosition actShowCurrentPosition;
726    
727     private CActSortSongs actSortSongs;
728     private CActSelectQuickConfig actQuickConfig;
729    
730     private bool bBGM再生済み;
731     private ST反復用カウンタ ct反復用;
732 kairera0467 186 public CCounter ct登場時アニメ用共通;
733 kairera0467 2 private E戻り値 eフェドアウト完了時の戻り値;
734     private Font ftフォント;
735     private CTexture txコメントバ;
736     private CTexture tx下部パネル;
737     private CTexture tx上部パネル;
738     private CTexture tx背景;
739     private CTexture txFLIP;
740 kairera0467 130 private CDirectShow ds背景動画;
741     private long lDshowPosition;
742     private long lStopPosition;
743 kairera0467 2
744     private struct STCommandTime // #24063 2011.1.16 yyagi コマンド入力時刻の記録用
745     {
746     public E楽器パ eInst; // 使用楽器
747     public EパッドFlag ePad; // 押されたコマンド(同時押しはOR演算で列挙する)
748     public long time; // コマンド入力時刻
749     }
750 kairera0467 101 public class CCommandHistory // #24063 2011.1.16 yyagi コマンド入力履歴を保持・確認するクラス
751 kairera0467 2 {
752     readonly int buffersize = 16;
753     private List<STCommandTime> stct;
754    
755     public CCommandHistory() // コンストラクタ
756     {
757     stct = new List<STCommandTime>( buffersize );
758     }
759    
760     /// <summary>
761     /// コマンド入力履歴へのコマンド追加
762     /// </summary>
763     /// <param name="_eInst">楽器の種類</param>
764     /// <param name="_ePad">入力コマンド(同時押しはOR演算で列挙すること)</param>
765     public void Add( E楽器パ _eInst, EパッドFlag _ePad )
766     {
767     STCommandTime _stct = new STCommandTime {
768     eInst = _eInst,
769     ePad = _ePad,
770     time = CDTXMania.Timer.n現在時刻
771     };
772    
773     if ( stct.Count >= buffersize )
774     {
775     stct.RemoveAt( 0 );
776     }
777     stct.Add(_stct);
778     //Debug.WriteLine( "CMDHIS: 楽器=" + _stct.eInst + ", CMD=" + _stct.ePad + ", time=" + _stct.time );
779     }
780     public void RemoveAt( int index )
781     {
782     stct.RemoveAt( index );
783     }
784    
785     /// <summary>
786     /// コマンド入力に成功しているか調べる
787     /// </summary>
788     /// <param name="_ePad">入力が成功したか調べたいコマンド</param>
789     /// <param name="_eInst">対象楽器</param>
790     /// <returns>コマンド入力成功時true</returns>
791     public bool CheckCommand( EパッドFlag[] _ePad, E楽器パ _eInst)
792     {
793     int targetCount = _ePad.Length;
794     int stciCount = stct.Count;
795     if ( stciCount < targetCount )
796     {
797     //Debug.WriteLine("NOT start checking...stciCount=" + stciCount + ", targetCount=" + targetCount);
798     return false;
799     }
800    
801     long curTime = CDTXMania.Timer.n現在時刻;
802     //Debug.WriteLine("Start checking...targetCount=" + targetCount);
803     for ( int i = targetCount - 1, j = stciCount - 1; i >= 0; i--, j-- )
804     {
805     if ( _ePad[ i ] != stct[ j ].ePad )
806     {
807     //Debug.WriteLine( "CMD解析: false targetCount=" + targetCount + ", i=" + i + ", j=" + j + ": ePad[]=" + _ePad[i] + ", stci[j] = " + stct[j].ePad );
808     return false;
809     }
810     if ( stct[ j ].eInst != _eInst )
811     {
812     //Debug.WriteLine( "CMD解析: false " + i );
813     return false;
814     }
815     if ( curTime - stct[ j ].time > 500 )
816     {
817     //Debug.WriteLine( "CMD解析: false " + i + "; over 500ms" );
818     return false;
819     }
820     curTime = stct[ j ].time;
821     }
822    
823     //Debug.Write( "CMD解析: 成功!(" + _ePad.Length + ") " );
824     //for ( int i = 0; i < _ePad.Length; i++ ) Debug.Write( _ePad[ i ] + ", " );
825     //Debug.WriteLine( "" );
826     //stct.RemoveRange( 0, targetCount ); // #24396 2011.2.13 yyagi
827     stct.Clear(); // #24396 2011.2.13 yyagi Clear all command input history in case you succeeded inputting some command
828    
829     return true;
830     }
831     }
832 kairera0467 101 public CCommandHistory CommandHistory;
833 kairera0467 2
834     private void tソルを下へ移動する()
835     {
836     CDTXMania.Skin.soundソル移動音.t再生する();
837     this.act曲リスト.t次に移動();
838     }
839     private void tソルを上へ移動する()
840     {
841     CDTXMania.Skin.soundソル移動音.t再生する();
842     this.act曲リスト.t前に移動();
843     }
844     private void t曲をランダム選択する()
845     {
846     C曲リストノ song = this.act曲リスト.r現在選択中の曲;
847     if( ( song.stackランダム演奏番号.Count == 0 ) || ( song.listランダム用ノドリスト == null ) )
848     {
849     if( song.listランダム用ノドリスト == null )
850     {
851     song.listランダム用ノドリスト = this.t指定された曲が存在する場所の曲を列挙する・子リスト含む( song );
852     }
853     int count = song.listランダム用ノドリスト.Count;
854     if( count == 0 )
855     {
856     return;
857     }
858     int[] numArray = new int[ count ];
859     for( int i = 0; i < count; i++ )
860     {
861     numArray[ i ] = i;
862     }
863     for( int j = 0; j < ( count * 1.5 ); j++ )
864     {
865     int index = CDTXMania.Random.Next( count );
866     int num5 = CDTXMania.Random.Next( count );
867     int num6 = numArray[ num5 ];
868     numArray[ num5 ] = numArray[ index ];
869     numArray[ index ] = num6;
870     }
871     for( int k = 0; k < count; k++ )
872     {
873     song.stackランダム演奏番号.Push( numArray[ k ] );
874     }
875     if( CDTXMania.ConfigIni.bLogDTX詳細ログ出力 )
876     {
877     StringBuilder builder = new StringBuilder( 0x400 );
878     builder.Append( string.Format( "ランダムインデックスリストを作成しました: {0}曲: ", song.stackランダム演奏番号.Count ) );
879     for( int m = 0; m < count; m++ )
880     {
881     builder.Append( string.Format( "{0} ", numArray[ m ] ) );
882     }
883     Trace.TraceInformation( builder.ToString() );
884     }
885     }
886     this.r確定された曲 = song.listランダム用ノドリスト[ song.stackランダム演奏番号.Pop() ];
887     this.n確定された曲の難易度 = this.act曲リスト.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( this.r確定された曲 );
888     this.r確定されたスコア = this.r確定された曲.arスコア[ this.n確定された曲の難易度 ];
889     this.eフェドアウト完了時の戻り値 = E戻り値.選曲した;
890     // this.actFOtoNowLoading.tフェードアウト開始(); // #27787 2012.3.10 yyagi 曲決定時の画面フェードアウトの省略
891     base.eフェID = CStage.Eフェ.選曲_NowLoading画面へのフェドアウト;
892     if( CDTXMania.ConfigIni.bLogDTX詳細ログ出力 )
893     {
894     int[] numArray2 = song.stackランダム演奏番号.ToArray();
895     StringBuilder builder2 = new StringBuilder( 0x400 );
896     builder2.Append( "ランダムインデックスリスト残り: " );
897     if( numArray2.Length > 0 )
898     {
899     for( int n = 0; n < numArray2.Length; n++ )
900     {
901     builder2.Append( string.Format( "{0} ", numArray2[ n ] ) );
902     }
903     }
904     else
905     {
906     builder2.Append( "(なし)" );
907     }
908     Trace.TraceInformation( builder2.ToString() );
909     }
910     CDTXMania.Skin.bgm選曲画面.t停止する();
911     }
912     private void t曲を選択する()
913     {
914     this.r確定された曲 = this.act曲リスト.r現在選択中の曲;
915     this.r確定されたスコア = this.act曲リスト.r現在選択中のスコア;
916     this.n確定された曲の難易度 = this.act曲リスト.n現在選択中の曲の現在の難易度レベル;
917     if( ( this.r確定された曲 != null ) && ( this.r確定されたスコア != null ) )
918     {
919     this.eフェドアウト完了時の戻り値 = E戻り値.選曲した;
920     // this.actFOtoNowLoading.tフェードアウト開始(); // #27787 2012.3.10 yyagi 曲決定時の画面フェードアウトの省略
921     base.eフェID = CStage.Eフェ.選曲_NowLoading画面へのフェドアウト;
922     }
923     CDTXMania.Skin.bgm選曲画面.t停止する();
924     }
925     private List<C曲リストノ> t指定された曲が存在する場所の曲を列挙する・子リスト含む( C曲リストノ song )
926     {
927     List<C曲リストノ> list = new List<C曲リストノ>();
928     song = song.r親ノ;
929     if( ( song == null ) && ( CDTXMania.Songs管理.list曲ル.Count > 0 ) )
930     {
931     foreach( C曲リストノ c曲リストノ in CDTXMania.Songs管理.list曲ル )
932     {
933     if( ( c曲リストノ.eド種別 == C曲リストノ.Eド種別.SCORE ) || ( c曲リストノ.eド種別 == C曲リストノ.Eド種別.SCORE_MIDI ) )
934     {
935     list.Add( c曲リストノ );
936     }
937     if( ( c曲リストノ.list子リスト != null ) && CDTXMania.ConfigIni.bランダムセレクトで子BOXを検索対象とする )
938     {
939     this.t指定された曲の子リストの曲を列挙する・孫リスト含む( c曲リストノ, ref list );
940     }
941     }
942     return list;
943     }
944     this.t指定された曲の子リストの曲を列挙する・孫リスト含む( song, ref list );
945     return list;
946     }
947     private void t指定された曲の子リストの曲を列挙する・孫リスト含む( C曲リストノ r, ref List<C曲リストノ> list )
948     {
949     if( ( r != null ) && ( r.list子リスト != null ) )
950     {
951     foreach( C曲リストノ c曲リストノ in r.list子リスト )
952     {
953     if( ( c曲リストノ.eド種別 == C曲リストノ.Eド種別.SCORE ) || ( c曲リストノ.eド種別 == C曲リストノ.Eド種別.SCORE_MIDI ) )
954     {
955     list.Add( c曲リストノ );
956     }
957     if( ( c曲リストノ.list子リスト != null ) && CDTXMania.ConfigIni.bランダムセレクトで子BOXを検索対象とする )
958     {
959     this.t指定された曲の子リストの曲を列挙する・孫リスト含む( c曲リストノ, ref list );
960     }
961     }
962     }
963     }
964     //-----------------
965     #endregion
966     }
967     }

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