2 using System.Collections.Generic;
4 using System.Globalization;
5 using System.Runtime.InteropServices;
7 using System.Diagnostics;
11 using Color = System.Drawing.Color;
12 using Rectangle = System.Drawing.Rectangle;
13 using SlimDXKey = SlimDX.DirectInput.Key;
16 internal class CStageコンフィグ : CStage
20 //public CActDFPFont actFont { get; private set; }
28 base.eステージID = CStage.Eステージ.コンフィグ;
29 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
30 //this.actFont = font = new CActDFPFont();
31 //base.list子Activities.Add( font );
32 base.list子Activities.Add( this.actFIFO = new CActFIFOWhite() );
33 base.list子Activities.Add( this.actKeyAssign = new CActConfigKeyAssign() );
34 base.list子Activities.Add( this.actオプションパネル = new CActオプションパネル() );
41 public void tアサイン完了通知() // CONFIGにのみ存在
43 this.eItemPanelモード = EItemPanelモード.パッド一覧; //
45 public void tパッド選択通知( EKeyConfigPart part, EKeyConfigPad pad ) //
47 this.actKeyAssign.t開始( part, pad, this.actList.ib現在の選択項目.str項目名 ); //
48 this.eItemPanelモード = EItemPanelモード.キーコード一覧; //
50 public void t項目変更通知() // OPTIONと共通
52 this.actList.t説明文パネルに現在選択されている項目の説明を描画する(); //
58 public override void On活性化()
60 if( CDTXMania.bXGRelease )
61 base.list子Activities.Add( this.actList = new CActConfigListXG() );
63 base.list子Activities.Add( this.actList = new CActConfigListGD() );
64 Trace.TraceInformation( "コンフィグステージを活性化します。" );
68 this.n現在のメニュー番号 = 0; //
69 for ( int i = 0; i < 4; i++ ) //
71 this.ctキー反復用[ i ] = new CCounter( 0, 0, 0, CDTXMania.Timer ); //
73 this.bメニューにフォーカス中 = true; // ここまでOPTIONと共通
74 this.eItemPanelモード = EItemPanelモード.パッド一覧;
78 Trace.TraceInformation( "コンフィグステージの活性化を完了しました。" );
81 base.On活性化(); // 2011.3.14 yyagi: On活性化()をtryの中から外に移動
83 public override void On非活性化()
85 Trace.TraceInformation( "コンフィグステージを非活性化します。" );
89 CDTXMania.ConfigIni.t書き出し( CDTXMania.strEXEのあるフォルダ + "Config.ini" ); // CONFIGだけ
90 for( int i = 0; i < 4; i++ )
92 this.ctキー反復用[ i ] = null;
96 catch ( UnauthorizedAccessException e )
98 Trace.TraceError( e.Message + "ファイルが読み取り専用になっていないか、管理者権限がないと書き込めなくなっていないか等を確認して下さい" );
100 catch ( Exception e )
102 Trace.TraceError( e.Message );
106 base.list子Activities.Remove( this.actList );
107 Trace.TraceInformation( "コンフィグステージの非活性化を完了しました。" );
111 public override void OnManagedリソースの作成() // OPTIONと画像以外共通
115 this.tx背景 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\4_background.png" ), false );
116 this.tx上部パネル = CDTXMania.tテクスチャの生成Af( CSkin.Path( @"Graphics\4_header panel.png" ), true );
117 this.tx下部パネル = CDTXMania.tテクスチャの生成Af( CSkin.Path( @"Graphics\4_footer panel.png" ), true );
118 this.txMenuカーソル = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\4_menu cursor.png" ), false );
120 prvFont = new CPrivateFastFont( CSkin.Path( @"Graphics\fonts\mplus-1p-heavy.ttf" ), 20 );
121 string[] strMenuItem = { "System", "Drums", "Guitar", "Bass", "Exit" };
122 txMenuItemLeft = new CTexture[ strMenuItem.Length, 2 ];
123 for ( int i = 0; i < strMenuItem.Length; i++ )
126 bmpStr = prvFont.DrawPrivateFont( strMenuItem[ i ], Color.White, Color.Black );
127 txMenuItemLeft[ i, 0 ] = CDTXMania.tテクスチャの生成( bmpStr, false );
129 bmpStr = prvFont.DrawPrivateFont( strMenuItem[ i ], Color.White, Color.Black, Color.Yellow, Color.OrangeRed );
130 txMenuItemLeft[ i, 1 ] = CDTXMania.tテクスチャの生成( bmpStr, false );
133 base.OnManagedリソースの作成();
136 public override void OnManagedリソースの解放() // OPTIONと同じ(COnfig.iniの書き出しタイミングのみ異なるが、無視して良い)
140 CDTXMania.tテクスチャの解放( ref this.tx背景 );
141 CDTXMania.tテクスチャの解放( ref this.tx上部パネル );
142 CDTXMania.tテクスチャの解放( ref this.tx下部パネル );
143 CDTXMania.tテクスチャの解放( ref this.txMenuカーソル );
145 for ( int i = 0; i < txMenuItemLeft.GetLength( 0 ); i++ )
147 txMenuItemLeft[ i, 0 ].Dispose();
148 txMenuItemLeft[ i, 0 ] = null;
149 txMenuItemLeft[ i, 1 ].Dispose();
150 txMenuItemLeft[ i, 1 ] = null;
152 txMenuItemLeft = null;
153 base.OnManagedリソースの解放();
156 public override int On進行描画()
163 base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;
164 this.actFIFO.tフェードイン開始();
165 base.b初めての進行描画 = false;
171 //---------------------
172 if( this.tx背景 != null )
173 this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );
174 //---------------------
177 //---------------------
178 if ( this.txMenuカーソル != null )
181 this.txMenuカーソル.n透明度 = this.bメニューにフォーカス中 ? 0xff : 0x80;
183 int y = 144 + ( this.n現在のメニュー番号 * 38 );
185 this.txMenuカーソル.t2D描画( CDTXMania.app.Device, x, y, new Rectangle( 0, 0, 32, 48 ) );
186 this.txMenuカーソル.t2D描画( CDTXMania.app.Device, ( x + num3 ) - 32, y, new Rectangle( 20, 0, 32, 48 ) );
188 for ( num3 -= (int) ( 0x20 * Scale.X ); num3 > 0; num3 -= rectangle.Width )
190 rectangle = new Rectangle( 16, 0, 32, 48 );
193 rectangle.Width -= 32 - num3;
195 this.txMenuカーソル.t2D描画( CDTXMania.app.Device, x, y, rectangle );
196 x += rectangle.Width;
199 //---------------------
202 //---------------------
203 int menuY = 162 - 22;
205 for ( int i = 0; i < txMenuItemLeft.GetLength( 0 ); i++ )
207 //Bitmap bmpStr = (this.n現在のメニュー番号 == i) ?
208 // prvFont.DrawPrivateFont( strMenuItem[ i ], Color.White, Color.Black, Color.Yellow, Color.OrangeRed ) :
209 // prvFont.DrawPrivateFont( strMenuItem[ i ], Color.White, Color.Black );
210 //txMenuItemLeft = CDTXMania.tテクスチャの生成( bmpStr, false );
211 int flag = ( this.n現在のメニュー番号 == i ) ? 1 : 0;
212 int num4 = txMenuItemLeft[ i, flag ].sz画像サイズ.Width;
213 txMenuItemLeft[ i, flag ].t2D描画( CDTXMania.app.Device, 282 - ( num4 / 2 ), menuY ); //55
214 //txMenuItem.Dispose();
217 //---------------------
220 //---------------------
221 switch( this.eItemPanelモード )
223 case EItemPanelモード.パッド一覧:
224 this.actList.t進行描画( !this.bメニューにフォーカス中 );
227 case EItemPanelモード.キーコード一覧:
228 this.actKeyAssign.On進行描画();
231 //---------------------
234 //---------------------
235 if( this.tx上部パネル != null )
236 this.tx上部パネル.t2D描画( CDTXMania.app.Device, 0, 0 );
237 //---------------------
240 //---------------------
241 if( this.tx下部パネル != null )
242 this.tx下部パネル.t2D描画( CDTXMania.app.Device, 0, SampleFramework.GameWindowSize.Height - this.tx下部パネル.sz画像サイズ.Height );
243 //---------------------
246 //---------------------
247 this.actオプションパネル.On進行描画();
248 //---------------------
250 #region [ フェードイン・アウト ]
251 //---------------------
252 switch( base.eフェーズID )
254 case CStage.Eフェーズ.共通_フェードイン:
255 if( this.actFIFO.On進行描画() != 0 )
257 CDTXMania.Skin.bgmコンフィグ画面.t再生する();
258 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
262 case CStage.Eフェーズ.共通_フェードアウト:
263 if( this.actFIFO.On進行描画() == 0 )
269 //---------------------
272 #region [ Enumerating Songs ]
273 // CActEnumSongs側で表示する
278 if ( ( base.eフェーズID != CStage.Eフェーズ.共通_通常状態 )
279 || this.actKeyAssign.bキー入力待ちの最中である
280 || CDTXMania.act現在入力を占有中のプラグイン != null )
283 // 曲データの一覧取得中は、キー入力を無効化する
284 if ( !CDTXMania.EnumSongs.IsEnumerating || CDTXMania.actEnumSongs.bコマンドでの曲データ取得 != true )
286 if ( ( CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDXKey.Escape ) || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LC ) ) || CDTXMania.Pad.b押されたGB( Eパッド.FT ) )
288 CDTXMania.Skin.sound取消音.t再生する();
289 if ( !this.bメニューにフォーカス中 )
291 if ( this.eItemPanelモード == EItemPanelモード.キーコード一覧 )
293 CDTXMania.stageコンフィグ.tアサイン完了通知();
296 if ( !this.actList.bIsKeyAssignSelected && !this.actList.bIsFocusingParameter ) // #24525 2011.3.15 yyagi, #32059 2013.9.17 yyagi
298 this.bメニューにフォーカス中 = true;
300 this.actList.t説明文パネルに現在選択されているメニューの説明を描画する( this.n現在のメニュー番号 );
301 this.actList.tEsc押下(); // #24525 2011.3.15 yyagi ESC押下時の右メニュー描画用
305 this.actFIFO.tフェードアウト開始();
306 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
310 else if ( CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDXKey.LeftArrow ) ) // 左カーソルキー
312 if ( !this.bメニューにフォーカス中 )
314 if ( this.eItemPanelモード == EItemPanelモード.キーコード一覧 )
316 //キーコンフィグ画面中は、[←]押下に反応させない
319 if ( this.actList.bIsFocusingParameter )
321 // パラメータを増減している最中も、[←]押下に反応させない
324 if ( !this.actList.bIsKeyAssignSelected && !this.actList.bIsFocusingParameter ) // #24525 2011.3.15 yyagi, #32059 2013.9.17 yyagi
326 this.bメニューにフォーカス中 = true;
328 CDTXMania.Skin.sound取消音.t再生する();
329 this.actList.t説明文パネルに現在選択されているメニューの説明を描画する( this.n現在のメニュー番号 );
330 this.actList.tEsc押下(); // #24525 2011.3.15 yyagi ESC押下時の右メニュー描画用
334 else if ( ( CDTXMania.Pad.b押されたDGB( Eパッド.CY ) || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.RD ) ) || ( ( CDTXMania.ConfigIni.bEnterがキー割り当てのどこにも使用されていない && CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDXKey.Return ) ) ) )
337 if ( this.n現在のメニュー番号 == 4 )
339 CDTXMania.Skin.sound決定音.t再生する();
340 this.actFIFO.tフェードアウト開始();
341 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
344 else if ( this.bメニューにフォーカス中 )
346 CDTXMania.Skin.sound決定音.t再生する();
347 this.bメニューにフォーカス中 = false;
348 this.actList.t説明文パネルに現在選択されている項目の説明を描画する();
352 switch ( this.eItemPanelモード )
354 case EItemPanelモード.パッド一覧:
355 bool bIsKeyAssignSelectedBeforeHitEnter = this.actList.bIsKeyAssignSelected; // #24525 2011.3.15 yyagi
356 this.actList.tEnter押下();
357 if ( this.actList.b現在選択されている項目はReturnToMenuである )
359 this.actList.t説明文パネルに現在選択されているメニューの説明を描画する( this.n現在のメニュー番号 );
360 if ( bIsKeyAssignSelectedBeforeHitEnter == false ) // #24525 2011.3.15 yyagi
362 this.bメニューにフォーカス中 = true;
367 case EItemPanelモード.キーコード一覧:
368 this.actKeyAssign.tEnter押下();
374 else if ( CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDXKey.RightArrow ) ) // 右カーソルキー
377 if ( this.n現在のメニュー番号 == 4 )
382 else if ( this.bメニューにフォーカス中 )
384 CDTXMania.Skin.sound決定音.t再生する();
385 this.bメニューにフォーカス中 = false;
386 this.actList.t説明文パネルに現在選択されている項目の説明を描画する();
390 this.ctキー反復用.Up.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDXKey.UpArrow ), new CCounter.DGキー処理( this.tカーソルを上へ移動する ) );
391 this.ctキー反復用.R.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.HH ), new CCounter.DGキー処理( this.tカーソルを上へ移動する ) );
392 if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.SD ) )
396 this.ctキー反復用.Down.tキー反復( CDTXMania.Input管理.Keyboard.bキーが押されている( (int) SlimDXKey.DownArrow ), new CCounter.DGキー処理( this.tカーソルを下へ移動する ) );
397 this.ctキー反復用.B.tキー反復( CDTXMania.Pad.b押されているGB( Eパッド.BD ), new CCounter.DGキー処理( this.tカーソルを下へ移動する ) );
398 if ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.FT ) )
412 private enum EItemPanelモード
418 [StructLayout( LayoutKind.Sequential )]
419 private struct STキー反復用カウンタ
422 public CCounter Down;
425 public CCounter this[ int index ]
443 throw new IndexOutOfRangeException();
465 throw new IndexOutOfRangeException();
470 private CActFIFOWhite actFIFO;
471 private CActConfigKeyAssign actKeyAssign;
472 private CActConfigList共通 actList;
473 private CActオプションパネル actオプションパネル;
474 public bool bメニューにフォーカス中;
475 private STキー反復用カウンタ ctキー反復用;
476 private const int DESC_H = 0x80;
477 private const int DESC_W = 220;
478 private EItemPanelモード eItemPanelモード;
479 public int n現在のメニュー番号;
480 private CTexture txMenuカーソル;
481 private CTextureAf tx下部パネル;
482 private CTextureAf tx上部パネル;
483 private CTexture tx背景;
484 private CPrivateFastFont prvFont;
485 private CTexture[ , ] txMenuItemLeft;
487 private void tカーソルを下へ移動する()
489 if( !this.bメニューにフォーカス中 )
491 switch( this.eItemPanelモード )
493 case EItemPanelモード.パッド一覧:
494 this.actList.t次に移動();
497 case EItemPanelモード.キーコード一覧:
498 this.actKeyAssign.t次に移動();
504 CDTXMania.Skin.soundカーソル移動音.t再生する();
505 this.n現在のメニュー番号 = ( this.n現在のメニュー番号 + 1 ) % 5;
506 switch( this.n現在のメニュー番号 )
509 this.actList.t項目リストの設定_System();
513 // this.actList.t項目リストの設定・KeyAssignDrums();
517 // this.actList.t項目リストの設定・KeyAssignGuitar();
521 // this.actList.t項目リストの設定・KeyAssignBass();
525 this.actList.t項目リストの設定_Drums();
529 this.actList.t項目リストの設定_Guitar();
533 this.actList.t項目リストの設定_Bass();
537 this.actList.t項目リストの設定_Exit();
540 this.actList.t説明文パネルに現在選択されているメニューの説明を描画する( this.n現在のメニュー番号 );
543 private void tカーソルを上へ移動する()
545 if( !this.bメニューにフォーカス中 )
547 switch( this.eItemPanelモード )
549 case EItemPanelモード.パッド一覧:
550 this.actList.t前に移動();
553 case EItemPanelモード.キーコード一覧:
554 this.actKeyAssign.t前に移動();
560 CDTXMania.Skin.soundカーソル移動音.t再生する();
561 this.n現在のメニュー番号 = ( ( this.n現在のメニュー番号 - 1 ) + 5 ) % 5;
562 switch( this.n現在のメニュー番号 )
565 this.actList.t項目リストの設定_System();
569 // this.actList.t項目リストの設定・KeyAssignDrums();
573 // this.actList.t項目リストの設定・KeyAssignGuitar();
577 // this.actList.t項目リストの設定・KeyAssignBass();
580 this.actList.t項目リストの設定_Drums();
584 this.actList.t項目リストの設定_Guitar();
588 this.actList.t項目リストの設定_Bass();
592 this.actList.t項目リストの設定_Exit();
595 this.actList.t説明文パネルに現在選択されているメニューの説明を描画する( this.n現在のメニュー番号 );