2 using System.Collections.Generic;
\r
3 using System.Globalization;
\r
5 using System.Windows.Forms;
\r
6 using System.Drawing;
\r
7 using System.Diagnostics;
\r
8 using System.Runtime.InteropServices;
\r
10 using System.Threading;
\r
11 using System.Runtime.Serialization.Formatters.Binary;
\r
13 using SlimDX.Direct3D9;
\r
15 using SampleFramework;
\r
19 internal class CDTXMania : Game
\r
22 #region [ properties ]
\r
23 public static readonly string VERSION = "098(131101)";
\r
24 public static readonly string SLIMDXDLL = "c_net20x86_Jun2010";
\r
25 public static readonly string D3DXDLL = "d3dx9_43.dll"; // June 2010
\r
26 //public static readonly string D3DXDLL = "d3dx9_42.dll"; // February 2010
\r
27 //public static readonly string D3DXDLL = "d3dx9_41.dll"; // March 2009
\r
29 public static CDTXMania app
\r
34 public static C文字コンソール act文字コンソール
\r
39 public static bool bコンパクトモード
\r
44 public static CConfigIni ConfigIni
\r
49 public static CDTX DTX
\r
57 if( ( dtx != null ) && ( app != null ) )
\r
60 app.listトップレベルActivities.Remove( dtx );
\r
63 if( ( dtx != null ) && ( app != null ) )
\r
65 app.listトップレベルActivities.Add( dtx );
\r
69 public static CFPS FPS
\r
74 public static CInput管理 Input管理
\r
79 public static int nPerfect範囲ms
\r
83 if( stage選曲.r確定された曲 != null )
\r
85 C曲リストノード c曲リストノード = stage選曲.r確定された曲.r親ノード;
\r
86 if( ( ( c曲リストノード != null ) && ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX ) ) && ( c曲リストノード.nPerfect範囲ms >= 0 ) )
\r
88 return c曲リストノード.nPerfect範囲ms;
\r
91 return ConfigIni.nヒット範囲ms.Perfect;
\r
94 public static int nGreat範囲ms
\r
98 if( stage選曲.r確定された曲 != null )
\r
100 C曲リストノード c曲リストノード = stage選曲.r確定された曲.r親ノード;
\r
101 if( ( ( c曲リストノード != null ) && ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX ) ) && ( c曲リストノード.nGreat範囲ms >= 0 ) )
\r
103 return c曲リストノード.nGreat範囲ms;
\r
106 return ConfigIni.nヒット範囲ms.Great;
\r
109 public static int nGood範囲ms
\r
113 if( stage選曲.r確定された曲 != null )
\r
115 C曲リストノード c曲リストノード = stage選曲.r確定された曲.r親ノード;
\r
116 if( ( ( c曲リストノード != null ) && ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX ) ) && ( c曲リストノード.nGood範囲ms >= 0 ) )
\r
118 return c曲リストノード.nGood範囲ms;
\r
121 return ConfigIni.nヒット範囲ms.Good;
\r
124 public static int nPoor範囲ms
\r
128 if( stage選曲.r確定された曲 != null )
\r
130 C曲リストノード c曲リストノード = stage選曲.r確定された曲.r親ノード;
\r
131 if( ( ( c曲リストノード != null ) && ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX ) ) && ( c曲リストノード.nPoor範囲ms >= 0 ) )
\r
133 return c曲リストノード.nPoor範囲ms;
\r
136 return ConfigIni.nヒット範囲ms.Poor;
\r
139 public static CPad Pad
\r
144 public static Random Random
\r
149 public static CSkin Skin
\r
154 public static CSongs管理 Songs管理
\r
157 set; // 2012.1.26 yyagi private解除 CStage起動でのdesirialize読み込みのため
\r
159 public static CEnumSongs EnumSongs
\r
164 public static CActEnumSongs actEnumSongs
\r
169 public static CActFlushGPU actFlushGPU
\r
175 public static CSound管理 Sound管理
\r
180 public static CStage起動 stage起動
\r
185 public static CStageタイトル stageタイトル
\r
190 // public static CStageオプション stageオプション
\r
195 public static CStageコンフィグ stageコンフィグ
\r
200 public static CStage選曲 stage選曲
\r
205 public static CStage曲読み込み stage曲読み込み
\r
210 public static CStage演奏ギター画面 stage演奏ギター画面
\r
215 public static CStage演奏ドラム画面 stage演奏ドラム画面
\r
220 public static CStage結果 stage結果
\r
225 public static CStageChangeSkin stageChangeSkin
\r
230 public static CStage終了 stage終了
\r
235 public static CStage r現在のステージ = null;
\r
236 public static CStage r直前のステージ = null;
\r
237 public static string strEXEのあるフォルダ
\r
242 public static string strコンパクトモードファイル
\r
247 public static CTimer Timer
\r
252 public static Format TextureFormat = Format.A8R8G8B8;
\r
253 internal static IPluginActivity act現在入力を占有中のプラグイン = null;
\r
254 public bool bApplicationActive
\r
259 public bool b次のタイミングで垂直帰線同期切り替えを行う
\r
264 public bool b次のタイミングで全画面・ウィンドウ切り替えを行う
\r
269 public Device Device
\r
271 get { return base.GraphicsDeviceManager.Direct3D9.Device; }
\r
273 public CPluginHost PluginHost
\r
278 public List<STPlugin> listプラグイン = new List<STPlugin>();
\r
279 public struct STPlugin
\r
281 public IPluginActivity plugin;
\r
282 public string strプラグインフォルダ;
\r
283 public string strアセンブリ簡易名;
\r
284 public Version Version;
\r
286 private static Size currentClientSize // #23510 2010.10.27 add yyagi to keep current window size
\r
291 // public static CTimer ct;
\r
292 public IntPtr WindowHandle // 2012.10.24 yyagi; to add ASIO support
\r
294 get { return base.Window.Handle; }
\r
302 CDTXMania.app = this;
\r
309 public void t全画面・ウィンドウモード切り替え()
\r
311 #if WindowedFullscreen
\r
312 if ( ConfigIni != null )
\r
314 DeviceSettings settings = base.GraphicsDeviceManager.CurrentSettings.Clone();
\r
315 if ( ( ConfigIni != null ) && ( ConfigIni.bウィンドウモード != settings.Windowed ) )
\r
318 #if !WindowedFullscreen
\r
319 settings.Windowed = ConfigIni.bウィンドウモード;
\r
321 if ( ConfigIni.bウィンドウモード == false ) // #23510 2010.10.27 yyagi: backup current window size before going fullscreen mode
\r
323 currentClientSize = this.Window.ClientSize;
\r
324 ConfigIni.nウインドウwidth = this.Window.ClientSize.Width;
\r
325 ConfigIni.nウインドウheight = this.Window.ClientSize.Height;
\r
326 // FDK.CTaskBar.ShowTaskBar( false );
\r
328 #if !WindowedFullscreen
\r
329 base.GraphicsDeviceManager.ChangeDevice( settings );
\r
331 if ( ConfigIni.bウィンドウモード == true ) // #23510 2010.10.27 yyagi: to resume window size from backuped value
\r
333 #if WindowedFullscreen
\r
334 // #30666 2013.2.2 yyagi Don't use Fullscreen mode becasue NVIDIA GeForce is
\r
335 // tend to delay drawing on Fullscreen mode. So DTXMania uses Maximized window
\r
336 // in spite of using fullscreen mode.
\r
337 app.Window.WindowState = FormWindowState.Normal;
\r
338 app.Window.FormBorderStyle = FormBorderStyle.Sizable;
\r
339 app.Window.WindowState = FormWindowState.Normal;
\r
341 base.Window.ClientSize =
\r
342 new Size( currentClientSize.Width, currentClientSize.Height );
\r
343 // FDK.CTaskBar.ShowTaskBar( true );
\r
345 #if WindowedFullscreen
\r
348 app.Window.WindowState = FormWindowState.Normal;
\r
349 app.Window.FormBorderStyle = FormBorderStyle.None;
\r
350 app.Window.WindowState = FormWindowState.Maximized;
\r
352 if ( ConfigIni.bウィンドウモード )
\r
354 if ( !this.bマウスカーソル表示中 )
\r
357 this.bマウスカーソル表示中 = true;
\r
360 else if ( this.bマウスカーソル表示中 )
\r
363 this.bマウスカーソル表示中 = false;
\r
369 #region [ #24609 リザルト画像をpngで保存する ] // #24609 2011.3.14 yyagi; to save result screen in case BestRank or HiSkill.
\r
371 /// リザルト画像のキャプチャと保存。
\r
373 /// <param name="strFilename">保存するファイル名(フルパス)</param>
\r
374 public bool SaveResultScreen( string strFullPath )
\r
376 string strSavePath = Path.GetDirectoryName( strFullPath );
\r
377 if ( !Directory.Exists( strSavePath ) )
\r
381 Directory.CreateDirectory( strSavePath );
\r
389 // http://www.gamedev.net/topic/594369-dx9slimdxati-incorrect-saving-surface-to-file/
\r
390 using ( Surface pSurface = CDTXMania.app.Device.GetRenderTarget( 0 ) )
\r
392 Surface.ToFile( pSurface, strFullPath, ImageFileFormat.Png );
\r
400 protected override void Initialize()
\r
403 if( this.listトップレベルActivities != null )
\r
405 foreach( CActivity activity in this.listトップレベルActivities )
\r
406 activity.OnManagedリソースの作成();
\r
409 foreach( STPlugin st in this.listプラグイン )
\r
411 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
412 st.plugin.OnManagedリソースの作成();
\r
413 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
415 #if GPUFlushAfterPresent
\r
416 FrameEnd += dtxmania_FrameEnd;
\r
419 #if GPUFlushAfterPresent
\r
420 void dtxmania_FrameEnd( object sender, EventArgs e ) // GraphicsDeviceManager.game_FrameEnd()後に実行される
\r
421 { // → Present()直後にGPUをFlushする
\r
422 // → 画面のカクツキが頻発したため、ここでのFlushは行わない
\r
423 actFlushGPU.On進行描画(); // Flush GPU
\r
426 protected override void LoadContent()
\r
428 if ( ConfigIni.bウィンドウモード )
\r
430 if( !this.bマウスカーソル表示中 )
\r
433 this.bマウスカーソル表示中 = true;
\r
436 else if( this.bマウスカーソル表示中 )
\r
439 this.bマウスカーソル表示中 = false;
\r
441 this.Device.SetTransform(TransformState.View, Matrix.LookAtLH(new Vector3(0f, 0f, (float)(-SampleFramework.GameWindowSize.Height / 2 * Math.Sqrt(3.0))), new Vector3(0f, 0f, 0f), new Vector3(0f, 1f, 0f)));
\r
442 this.Device.SetTransform(TransformState.Projection, Matrix.PerspectiveFovLH(C変換.DegreeToRadian((float)60f), ((float)this.Device.Viewport.Width) / ((float)this.Device.Viewport.Height), -100f, 100f));
\r
443 this.Device.SetRenderState(RenderState.Lighting, false);
\r
444 this.Device.SetRenderState( RenderState.ZEnable, false );
\r
445 this.Device.SetRenderState( RenderState.AntialiasedLineEnable, false );
\r
446 this.Device.SetRenderState( RenderState.AlphaTestEnable, true );
\r
447 this.Device.SetRenderState( RenderState.AlphaRef, 10 );
\r
449 this.Device.SetRenderState( RenderState.MultisampleAntialias, true );
\r
450 this.Device.SetSamplerState( 0, SamplerState.MinFilter, TextureFilter.Linear );
\r
451 this.Device.SetSamplerState( 0, SamplerState.MagFilter, TextureFilter.Linear );
\r
453 this.Device.SetRenderState<Compare>( RenderState.AlphaFunc, Compare.Greater );
\r
454 this.Device.SetRenderState( RenderState.AlphaBlendEnable, true );
\r
455 this.Device.SetRenderState<Blend>( RenderState.SourceBlend, Blend.SourceAlpha );
\r
456 this.Device.SetRenderState<Blend>( RenderState.DestinationBlend, Blend.InverseSourceAlpha );
\r
457 this.Device.SetTextureStageState( 0, TextureStage.AlphaOperation, TextureOperation.Modulate );
\r
458 this.Device.SetTextureStageState( 0, TextureStage.AlphaArg1, 2 );
\r
459 this.Device.SetTextureStageState( 0, TextureStage.AlphaArg2, 1 );
\r
461 if( this.listトップレベルActivities != null )
\r
463 foreach( CActivity activity in this.listトップレベルActivities )
\r
464 activity.OnUnmanagedリソースの作成();
\r
467 foreach( STPlugin st in this.listプラグイン )
\r
469 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
470 st.plugin.OnUnmanagedリソースの作成();
\r
471 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
474 protected override void UnloadContent()
\r
476 if( this.listトップレベルActivities != null )
\r
478 foreach( CActivity activity in this.listトップレベルActivities )
\r
479 activity.OnUnmanagedリソースの解放();
\r
482 foreach( STPlugin st in this.listプラグイン )
\r
484 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
485 st.plugin.OnUnmanagedリソースの解放();
\r
486 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
489 protected override void OnExiting( EventArgs e )
\r
491 CPowerManagement.tEnableMonitorSuspend(); // スリープ抑止状態を解除
\r
493 base.OnExiting( e );
\r
495 protected override void Update( GameTime gameTime )
\r
498 protected override void Draw( GameTime gameTime )
\r
500 Sound管理.t再生中の処理をする();
\r
502 if( Timer != null )
\r
504 if (CSound管理.rc演奏用タイマ != null)
\r
505 CSound管理.rc演奏用タイマ.t更新();
\r
507 if( Input管理 != null )
\r
508 Input管理.tポーリング( this.bApplicationActive, CDTXMania.ConfigIni.bバッファ入力を行う );
\r
513 //if( Pad != null ) ポーリング時にクリアしたらダメ!曲の開始時に1回だけクリアする。(2010.9.11)
\r
514 // Pad.st検知したデバイス.Clear();
\r
516 if( this.Device == null )
\r
519 if ( this.bApplicationActive ) // DTXMania本体起動中の本体/モニタの省電力モード移行を抑止
\r
520 CPowerManagement.tDisableMonitorSuspend();
\r
522 // #xxxxx 2013.4.8 yyagi; sleepの挿入位置を、EndScnene~Present間から、BeginScene前に移動。描画遅延を小さくするため。
\r
524 if ( ConfigIni.nフレーム毎スリープms >= 0 ) // #xxxxx 2011.11.27 yyagi
\r
526 Thread.Sleep( ConfigIni.nフレーム毎スリープms );
\r
530 this.Device.BeginScene();
\r
531 this.Device.Clear( ClearFlags.ZBuffer | ClearFlags.Target, Color.Black, 1f, 0 );
\r
533 if( r現在のステージ != null )
\r
535 this.n進行描画の戻り値 = ( r現在のステージ != null ) ? r現在のステージ.On進行描画() : 0;
\r
537 #region [ プラグインの進行描画 ]
\r
538 //---------------------
\r
539 foreach( STPlugin sp in this.listプラグイン )
\r
541 Directory.SetCurrentDirectory( sp.strプラグインフォルダ );
\r
543 if( CDTXMania.act現在入力を占有中のプラグイン == null || CDTXMania.act現在入力を占有中のプラグイン == sp.plugin )
\r
544 sp.plugin.On進行描画( CDTXMania.Pad, CDTXMania.Input管理.Keyboard );
\r
546 sp.plugin.On進行描画( null, null );
\r
548 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
550 //---------------------
\r
554 CScoreIni scoreIni = null;
\r
556 if ( Control.IsKeyLocked( Keys.CapsLock ) ) // #30925 2013.3.11 yyagi; capslock=ON時は、EnumSongsしないようにして、起動負荷とASIOの音切れの関係を確認する
\r
557 { // → songs.db等の書き込み時だと音切れするっぽい
\r
558 actEnumSongs.On非活性化();
\r
559 EnumSongs.SongListEnumCompletelyDone();
\r
560 CDTXMania.stage選曲.bIsEnumeratingSongs = false;
\r
562 #region [ 曲検索スレッドの起動/終了 ] // ここに"Enumerating Songs..."表示を集約
\r
563 if ( !CDTXMania.bコンパクトモード )
\r
565 actEnumSongs.On進行描画(); // "Enumerating Songs..."アイコンの描画
\r
567 switch ( r現在のステージ.eステージID )
\r
569 case CStage.Eステージ.タイトル:
\r
570 case CStage.Eステージ.コンフィグ:
\r
571 case CStage.Eステージ.選曲:
\r
572 case CStage.Eステージ.曲読み込み:
\r
573 if ( EnumSongs != null )
\r
575 #region [ (特定条件時) 曲検索スレッドの起動・開始 ]
\r
576 if ( r現在のステージ.eステージID == CStage.Eステージ.タイトル &&
\r
577 r直前のステージ.eステージID == CStage.Eステージ.起動 &&
\r
578 this.n進行描画の戻り値 == (int) CStageタイトル.E戻り値.継続 &&
\r
579 !EnumSongs.IsSongListEnumStarted )
\r
581 actEnumSongs.On活性化();
\r
582 CDTXMania.stage選曲.bIsEnumeratingSongs = true;
\r
583 EnumSongs.Init( CDTXMania.Songs管理.listSongsDB, CDTXMania.Songs管理.nSongsDBから取得できたスコア数 ); // songs.db情報と、取得した曲数を、新インスタンスにも与える
\r
584 EnumSongs.StartEnumFromDisk(); // 曲検索スレッドの起動・開始
\r
585 if ( CDTXMania.Songs管理.nSongsDBから取得できたスコア数 == 0 ) // もし初回起動なら、検索スレッドのプライオリティをLowestでなくNormalにする
\r
587 EnumSongs.ChangeEnumeratePriority( ThreadPriority.Normal );
\r
592 #region [ 曲検索の中断と再開 ]
\r
593 if ( r現在のステージ.eステージID == CStage.Eステージ.選曲 && !EnumSongs.IsSongListEnumCompletelyDone )
\r
595 switch ( this.n進行描画の戻り値 )
\r
598 //if ( CDTXMania.stage選曲.bIsEnumeratingSongs )
\r
599 if ( !CDTXMania.stage選曲.bIsPlayingPremovie )
\r
601 EnumSongs.Resume(); // #27060 2012.2.6 yyagi 中止していたバックグランド曲検索を再開
\r
602 EnumSongs.IsSlowdown = false;
\r
606 // EnumSongs.Suspend(); // #27060 2012.3.2 yyagi #PREMOVIE再生中は曲検索を低速化
\r
607 EnumSongs.IsSlowdown = true;
\r
609 actEnumSongs.On活性化();
\r
613 EnumSongs.Suspend(); // #27060 バックグラウンドの曲検索を一時停止
\r
614 actEnumSongs.On非活性化();
\r
620 #region [ 曲探索中断待ち待機 ]
\r
621 if ( r現在のステージ.eステージID == CStage.Eステージ.曲読み込み && !EnumSongs.IsSongListEnumCompletelyDone &&
\r
622 EnumSongs.thDTXFileEnumerate != null ) // #28700 2012.6.12 yyagi; at Compact mode, enumerating thread does not exist.
\r
624 EnumSongs.WaitUntilSuspended(); // 念のため、曲検索が一時中断されるまで待機
\r
628 #region [ 曲検索が完了したら、実際の曲リストに反映する ]
\r
629 // CStage選曲.On活性化() に回した方がいいかな?
\r
630 if ( EnumSongs.IsSongListEnumerated )
\r
632 actEnumSongs.On非活性化();
\r
633 CDTXMania.stage選曲.bIsEnumeratingSongs = false;
\r
635 bool bRemakeSongTitleBar = ( r現在のステージ.eステージID == CStage.Eステージ.選曲 ) ? true : false;
\r
636 CDTXMania.stage選曲.Refresh( EnumSongs.Songs管理, bRemakeSongTitleBar );
\r
637 EnumSongs.SongListEnumCompletelyDone();
\r
645 switch ( r現在のステージ.eステージID )
\r
647 case CStage.Eステージ.何もしない:
\r
650 case CStage.Eステージ.起動:
\r
652 //-----------------------------
\r
653 if( this.n進行描画の戻り値 != 0 )
\r
658 Trace.TraceInformation( "----------------------" );
\r
659 Trace.TraceInformation( "■ タイトル" );
\r
661 r直前のステージ = r現在のステージ;
\r
662 r現在のステージ = stageタイトル;
\r
667 Trace.TraceInformation( "----------------------" );
\r
668 Trace.TraceInformation( "■ 曲読み込み" );
\r
669 stage曲読み込み.On活性化();
\r
670 r直前のステージ = r現在のステージ;
\r
671 r現在のステージ = stage曲読み込み;
\r
674 foreach( STPlugin pg in this.listプラグイン )
\r
676 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
677 pg.plugin.Onステージ変更();
\r
678 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
681 this.tガベージコレクションを実行する();
\r
683 //-----------------------------
\r
687 case CStage.Eステージ.タイトル:
\r
689 //-----------------------------
\r
690 switch( this.n進行描画の戻り値 )
\r
692 case (int)CStageタイトル.E戻り値.GAMESTART:
\r
694 //-----------------------------
\r
696 Trace.TraceInformation( "----------------------" );
\r
697 Trace.TraceInformation( "■ 選曲" );
\r
699 r直前のステージ = r現在のステージ;
\r
700 r現在のステージ = stage選曲;
\r
701 //-----------------------------
\r
705 #region [ OPTION: 廃止済 ]
\r
706 // case 2: // #24525 OPTIONとCONFIGの統合に伴い、OPTIONは廃止
\r
708 // //-----------------------------
\r
709 // r現在のステージ.On非活性化();
\r
710 // Trace.TraceInformation( "----------------------" );
\r
711 // Trace.TraceInformation( "■ オプション" );
\r
712 // stageオプション.On活性化();
\r
713 // r直前のステージ = r現在のステージ;
\r
714 // r現在のステージ = stageオプション;
\r
715 // //-----------------------------
\r
720 case (int)CStageタイトル.E戻り値.CONFIG:
\r
722 //-----------------------------
\r
724 Trace.TraceInformation( "----------------------" );
\r
725 Trace.TraceInformation( "■ コンフィグ" );
\r
726 stageコンフィグ.On活性化();
\r
727 r直前のステージ = r現在のステージ;
\r
728 r現在のステージ = stageコンフィグ;
\r
729 //-----------------------------
\r
733 case (int)CStageタイトル.E戻り値.EXIT:
\r
735 //-----------------------------
\r
737 Trace.TraceInformation( "----------------------" );
\r
738 Trace.TraceInformation( "■ 終了" );
\r
740 r直前のステージ = r現在のステージ;
\r
741 r現在のステージ = stage終了;
\r
742 //-----------------------------
\r
747 foreach( STPlugin pg in this.listプラグイン )
\r
749 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
750 pg.plugin.Onステージ変更();
\r
751 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
754 //this.tガベージコレクションを実行する(); // #31980 2013.9.3 yyagi タイトル画面でだけ、毎フレームGCを実行して重くなっていた問題の修正
\r
755 //-----------------------------
\r
759 // case CStage.Eステージ.オプション:
\r
761 // //-----------------------------
\r
762 // if( this.n進行描画の戻り値 != 0 )
\r
764 // switch( r直前のステージ.eステージID )
\r
766 // case CStage.Eステージ.タイトル:
\r
768 // //-----------------------------
\r
769 // r現在のステージ.On非活性化();
\r
770 // Trace.TraceInformation( "----------------------" );
\r
771 // Trace.TraceInformation( "■ タイトル" );
\r
772 // stageタイトル.On活性化();
\r
773 // r直前のステージ = r現在のステージ;
\r
774 // r現在のステージ = stageタイトル;
\r
776 // foreach( STPlugin pg in this.listプラグイン )
\r
778 // Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
779 // pg.plugin.Onステージ変更();
\r
780 // Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
783 // this.tガベージコレクションを実行する();
\r
785 // //-----------------------------
\r
788 // case CStage.Eステージ.選曲:
\r
790 // //-----------------------------
\r
791 // r現在のステージ.On非活性化();
\r
792 // Trace.TraceInformation( "----------------------" );
\r
793 // Trace.TraceInformation( "■ 選曲" );
\r
794 // stage選曲.On活性化();
\r
795 // r直前のステージ = r現在のステージ;
\r
796 // r現在のステージ = stage選曲;
\r
798 // foreach( STPlugin pg in this.listプラグイン )
\r
800 // Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
801 // pg.plugin.Onステージ変更();
\r
802 // Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
805 // this.tガベージコレクションを実行する();
\r
807 // //-----------------------------
\r
811 // //-----------------------------
\r
815 case CStage.Eステージ.コンフィグ:
\r
817 //-----------------------------
\r
818 if( this.n進行描画の戻り値 != 0 )
\r
820 switch( r直前のステージ.eステージID )
\r
822 case CStage.Eステージ.タイトル:
\r
824 //-----------------------------
\r
826 Trace.TraceInformation( "----------------------" );
\r
827 Trace.TraceInformation( "■ タイトル" );
\r
829 r直前のステージ = r現在のステージ;
\r
830 r現在のステージ = stageタイトル;
\r
832 foreach( STPlugin pg in this.listプラグイン )
\r
834 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
835 pg.plugin.Onステージ変更();
\r
836 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
839 this.tガベージコレクションを実行する();
\r
841 //-----------------------------
\r
844 case CStage.Eステージ.選曲:
\r
846 //-----------------------------
\r
848 Trace.TraceInformation( "----------------------" );
\r
849 Trace.TraceInformation( "■ 選曲" );
\r
851 r直前のステージ = r現在のステージ;
\r
852 r現在のステージ = stage選曲;
\r
854 foreach( STPlugin pg in this.listプラグイン )
\r
856 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
857 pg.plugin.Onステージ変更();
\r
858 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
861 this.tガベージコレクションを実行する();
\r
863 //-----------------------------
\r
867 //-----------------------------
\r
871 case CStage.Eステージ.選曲:
\r
873 //-----------------------------
\r
874 switch( this.n進行描画の戻り値 )
\r
876 case (int) CStage選曲.E戻り値.タイトルに戻る:
\r
878 //-----------------------------
\r
880 Trace.TraceInformation( "----------------------" );
\r
881 Trace.TraceInformation( "■ タイトル" );
\r
883 r直前のステージ = r現在のステージ;
\r
884 r現在のステージ = stageタイトル;
\r
886 foreach( STPlugin pg in this.listプラグイン )
\r
888 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
889 pg.plugin.Onステージ変更();
\r
890 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
893 this.tガベージコレクションを実行する();
\r
895 //-----------------------------
\r
898 case (int) CStage選曲.E戻り値.選曲した:
\r
900 //-----------------------------
\r
902 Trace.TraceInformation( "----------------------" );
\r
903 Trace.TraceInformation( "■ 曲読み込み" );
\r
904 stage曲読み込み.On活性化();
\r
905 r直前のステージ = r現在のステージ;
\r
906 r現在のステージ = stage曲読み込み;
\r
908 foreach( STPlugin pg in this.listプラグイン )
\r
910 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
911 pg.plugin.Onステージ変更();
\r
912 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
915 this.tガベージコレクションを実行する();
\r
917 //-----------------------------
\r
920 // case (int) CStage選曲.E戻り値.オプション呼び出し:
\r
922 // //-----------------------------
\r
923 // r現在のステージ.On非活性化();
\r
924 // Trace.TraceInformation( "----------------------" );
\r
925 // Trace.TraceInformation( "■ オプション" );
\r
926 // stageオプション.On活性化();
\r
927 // r直前のステージ = r現在のステージ;
\r
928 // r現在のステージ = stageオプション;
\r
930 // foreach( STPlugin pg in this.listプラグイン )
\r
932 // Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
933 // pg.plugin.Onステージ変更();
\r
934 // Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
937 // this.tガベージコレクションを実行する();
\r
939 // //-----------------------------
\r
942 case (int) CStage選曲.E戻り値.コンフィグ呼び出し:
\r
944 //-----------------------------
\r
946 Trace.TraceInformation( "----------------------" );
\r
947 Trace.TraceInformation( "■ コンフィグ" );
\r
948 stageコンフィグ.On活性化();
\r
949 r直前のステージ = r現在のステージ;
\r
950 r現在のステージ = stageコンフィグ;
\r
952 foreach( STPlugin pg in this.listプラグイン )
\r
954 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
955 pg.plugin.Onステージ変更();
\r
956 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
959 this.tガベージコレクションを実行する();
\r
961 //-----------------------------
\r
964 case (int) CStage選曲.E戻り値.スキン変更:
\r
967 //-----------------------------
\r
969 Trace.TraceInformation( "----------------------" );
\r
970 Trace.TraceInformation( "■ スキン切り替え" );
\r
971 stageChangeSkin.On活性化();
\r
972 r直前のステージ = r現在のステージ;
\r
973 r現在のステージ = stageChangeSkin;
\r
975 //-----------------------------
\r
978 //-----------------------------
\r
982 case CStage.Eステージ.曲読み込み:
\r
984 //-----------------------------
\r
985 if( this.n進行描画の戻り値 != 0 )
\r
987 CDTXMania.Pad.st検知したデバイス.Clear(); // 入力デバイスフラグクリア(2010.9.11)
\r
991 #region [ ESC押下時は、曲の読み込みを中止して選曲画面に戻る ]
\r
992 if ( this.n進行描画の戻り値 == (int) E曲読込画面の戻り値.読込中止 )
\r
994 //DTX.t全チップの再生停止();
\r
996 Trace.TraceInformation( "曲の読み込みを中止しました。" );
\r
997 this.tガベージコレクションを実行する();
\r
998 Trace.TraceInformation( "----------------------" );
\r
999 Trace.TraceInformation( "■ 選曲" );
\r
1001 r直前のステージ = r現在のステージ;
\r
1002 r現在のステージ = stage選曲;
\r
1003 foreach ( STPlugin pg in this.listプラグイン )
\r
1005 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1006 pg.plugin.Onステージ変更();
\r
1007 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1013 if( !ConfigIni.bギタレボモード )
\r
1015 Trace.TraceInformation( "----------------------" );
\r
1016 Trace.TraceInformation( "■ 演奏(ドラム画面)" );
\r
1017 #if false // #23625 2011.1.11 Config.iniからダメージ/回復値の定数変更を行う場合はここを有効にする 087リリースに合わせ機能無効化
\r
1018 for (int i = 0; i < 5; i++)
\r
1020 for (int j = 0; j < 2; j++)
\r
1022 stage演奏ドラム画面.fDamageGaugeDelta[i, j] = ConfigIni.fGaugeFactor[i, j];
\r
1025 for (int i = 0; i < 3; i++) {
\r
1026 stage演奏ドラム画面.fDamageLevelFactor[i] = ConfigIni.fDamageLevelFactor[i];
\r
1029 r直前のステージ = r現在のステージ;
\r
1030 r現在のステージ = stage演奏ドラム画面;
\r
1034 Trace.TraceInformation( "----------------------" );
\r
1035 Trace.TraceInformation( "■ 演奏(ギター画面)" );
\r
1036 #if false // #23625 2011.1.11 Config.iniからダメージ/回復値の定数変更を行う場合はここを有効にする 087リリースに合わせ機能無効化
\r
1037 for (int i = 0; i < 5; i++)
\r
1039 for (int j = 0; j < 2; j++)
\r
1041 stage演奏ギター画面.fDamageGaugeDelta[i, j] = ConfigIni.fGaugeFactor[i, j];
\r
1044 for (int i = 0; i < 3; i++) {
\r
1045 stage演奏ギター画面.fDamageLevelFactor[i] = ConfigIni.fDamageLevelFactor[i];
\r
1048 r直前のステージ = r現在のステージ;
\r
1049 r現在のステージ = stage演奏ギター画面;
\r
1052 foreach( STPlugin pg in this.listプラグイン )
\r
1054 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1055 pg.plugin.Onステージ変更();
\r
1056 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1059 this.tガベージコレクションを実行する();
\r
1061 //-----------------------------
\r
1065 case CStage.Eステージ.演奏:
\r
1067 //-----------------------------
\r
1068 switch( this.n進行描画の戻り値 )
\r
1070 case (int) E演奏画面の戻り値.継続:
\r
1073 case (int) E演奏画面の戻り値.演奏中断:
\r
1074 #region [ 演奏キャンセル ]
\r
1075 //-----------------------------
\r
1076 scoreIni = this.tScoreIniへBGMAdjustとHistoryとPlayCountを更新( "Play canceled" );
\r
1078 #region [ プラグイン On演奏キャンセル() の呼び出し ]
\r
1079 //---------------------
\r
1080 foreach( STPlugin pg in this.listプラグイン )
\r
1082 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1083 pg.plugin.On演奏キャンセル( scoreIni );
\r
1084 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1086 //---------------------
\r
1091 r現在のステージ.On非活性化();
\r
1094 base.Window.Close();
\r
1098 Trace.TraceInformation( "----------------------" );
\r
1099 Trace.TraceInformation( "■ 選曲" );
\r
1101 r直前のステージ = r現在のステージ;
\r
1102 r現在のステージ = stage選曲;
\r
1104 #region [ プラグイン Onステージ変更() の呼び出し ]
\r
1105 //---------------------
\r
1106 foreach( STPlugin pg in this.listプラグイン )
\r
1108 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1109 pg.plugin.Onステージ変更();
\r
1110 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1112 //---------------------
\r
1115 this.tガベージコレクションを実行する();
\r
1118 //-----------------------------
\r
1121 case (int) E演奏画面の戻り値.ステージ失敗:
\r
1122 #region [ 演奏失敗(StageFailed) ]
\r
1123 //-----------------------------
\r
1124 scoreIni = this.tScoreIniへBGMAdjustとHistoryとPlayCountを更新( "Stage failed" );
\r
1126 #region [ プラグイン On演奏失敗() の呼び出し ]
\r
1127 //---------------------
\r
1128 foreach( STPlugin pg in this.listプラグイン )
\r
1130 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1131 pg.plugin.On演奏失敗( scoreIni );
\r
1132 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1134 //---------------------
\r
1139 r現在のステージ.On非活性化();
\r
1142 base.Window.Close();
\r
1146 Trace.TraceInformation( "----------------------" );
\r
1147 Trace.TraceInformation( "■ 選曲" );
\r
1149 r直前のステージ = r現在のステージ;
\r
1150 r現在のステージ = stage選曲;
\r
1152 #region [ プラグイン Onステージ変更() の呼び出し ]
\r
1153 //---------------------
\r
1154 foreach( STPlugin pg in this.listプラグイン )
\r
1156 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1157 pg.plugin.Onステージ変更();
\r
1158 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1160 //---------------------
\r
1163 this.tガベージコレクションを実行する();
\r
1166 //-----------------------------
\r
1169 case (int) E演奏画面の戻り値.ステージクリア:
\r
1171 //-----------------------------
\r
1172 CScoreIni.C演奏記録 c演奏記録_Drums, c演奏記録_Guitar, c演奏記録_Bass;
\r
1173 CDTX.CChip[] chipArray = new CDTX.CChip[ 10 ];
\r
1174 if( ConfigIni.bギタレボモード )
\r
1176 stage演奏ギター画面.t演奏結果を格納する( out c演奏記録_Drums, out c演奏記録_Guitar, out c演奏記録_Bass );
\r
1180 stage演奏ドラム画面.t演奏結果を格納する( out c演奏記録_Drums, out c演奏記録_Guitar, out c演奏記録_Bass, out chipArray );
\r
1183 if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.24 yyagi Gt/Bsを入れ替えていたなら、演奏結果も入れ替える
\r
1185 CScoreIni.C演奏記録 t;
\r
1187 c演奏記録_Guitar = c演奏記録_Bass;
\r
1190 CDTXMania.DTX.SwapGuitarBassInfos(); // 譜面情報も元に戻す
\r
1191 CDTXMania.ConfigIni.SwapGuitarBassInfos_AutoFlags(); // #24415 2011.2.27 yyagi
\r
1192 // リザルト集計時のみ、Auto系のフラグも元に戻す。
\r
1193 // これを戻すのは、リザルト集計後。
\r
1194 } // "case CStage.Eステージ.結果:"のところ。
\r
1196 double ps = 0.0, gs = 0.0;
\r
1197 if ( !c演奏記録_Drums.b全AUTOである && c演奏記録_Drums.n全チップ数 > 0) {
\r
1198 ps = c演奏記録_Drums.db演奏型スキル値;
\r
1199 gs = c演奏記録_Drums.dbゲーム型スキル値;
\r
1201 else if ( !c演奏記録_Guitar.b全AUTOである && c演奏記録_Guitar.n全チップ数 > 0) {
\r
1202 ps = c演奏記録_Guitar.db演奏型スキル値;
\r
1203 gs = c演奏記録_Guitar.dbゲーム型スキル値;
\r
1207 ps = c演奏記録_Bass.db演奏型スキル値;
\r
1208 gs = c演奏記録_Bass.dbゲーム型スキル値;
\r
1210 string str = "Cleared";
\r
1211 switch( CScoreIni.t総合ランク値を計算して返す( c演奏記録_Drums, c演奏記録_Guitar, c演奏記録_Bass ) )
\r
1213 case (int)CScoreIni.ERANK.SS:
\r
1214 str = string.Format( "Cleared (SS: {0:F2})", ps );
\r
1217 case (int) CScoreIni.ERANK.S:
\r
1218 str = string.Format( "Cleared (S: {0:F2})", ps );
\r
1221 case (int) CScoreIni.ERANK.A:
\r
1222 str = string.Format( "Cleared (A: {0:F2})", ps );
\r
1225 case (int) CScoreIni.ERANK.B:
\r
1226 str = string.Format( "Cleared (B: {0:F2})", ps );
\r
1229 case (int) CScoreIni.ERANK.C:
\r
1230 str = string.Format( "Cleared (C: {0:F2})", ps );
\r
1233 case (int) CScoreIni.ERANK.D:
\r
1234 str = string.Format( "Cleared (D: {0:F2})", ps );
\r
1237 case (int) CScoreIni.ERANK.E:
\r
1238 str = string.Format( "Cleared (E: {0:F2})", ps );
\r
1241 case (int)CScoreIni.ERANK.UNKNOWN: // #23534 2010.10.28 yyagi add: 演奏チップが0個のとき
\r
1242 str = "Cleared (No chips)";
\r
1246 scoreIni = this.tScoreIniへBGMAdjustとHistoryとPlayCountを更新( str );
\r
1248 #region [ プラグイン On演奏クリア() の呼び出し ]
\r
1249 //---------------------
\r
1250 foreach( STPlugin pg in this.listプラグイン )
\r
1252 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1253 pg.plugin.On演奏クリア( scoreIni );
\r
1254 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1256 //---------------------
\r
1259 r現在のステージ.On非活性化();
\r
1260 Trace.TraceInformation( "----------------------" );
\r
1261 Trace.TraceInformation( "■ 結果" );
\r
1262 stage結果.st演奏記録.Drums = c演奏記録_Drums;
\r
1263 stage結果.st演奏記録.Guitar = c演奏記録_Guitar;
\r
1264 stage結果.st演奏記録.Bass = c演奏記録_Bass;
\r
1265 stage結果.r空うちドラムチップ = chipArray;
\r
1267 r直前のステージ = r現在のステージ;
\r
1268 r現在のステージ = stage結果;
\r
1270 #region [ プラグイン Onステージ変更() の呼び出し ]
\r
1271 //---------------------
\r
1272 foreach( STPlugin pg in this.listプラグイン )
\r
1274 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1275 pg.plugin.Onステージ変更();
\r
1276 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1278 //---------------------
\r
1282 //-----------------------------
\r
1285 //-----------------------------
\r
1289 case CStage.Eステージ.結果:
\r
1291 //-----------------------------
\r
1292 if( this.n進行描画の戻り値 != 0 )
\r
1294 if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24415 2011.2.27 yyagi Gt/Bsを入れ替えていたなら、Auto状態をリザルト画面終了後に元に戻す
\r
1296 CDTXMania.ConfigIni.SwapGuitarBassInfos_AutoFlags(); // Auto入れ替え
\r
1299 DTX.t全チップの再生一時停止();
\r
1301 r現在のステージ.On非活性化();
\r
1304 Trace.TraceInformation( "----------------------" );
\r
1305 Trace.TraceInformation( "■ 選曲" );
\r
1307 r直前のステージ = r現在のステージ;
\r
1308 r現在のステージ = stage選曲;
\r
1310 foreach( STPlugin pg in this.listプラグイン )
\r
1312 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1313 pg.plugin.Onステージ変更();
\r
1314 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1317 this.tガベージコレクションを実行する();
\r
1321 base.Window.Close();
\r
1324 //-----------------------------
\r
1328 case CStage.Eステージ.ChangeSkin:
\r
1330 //-----------------------------
\r
1331 if ( this.n進行描画の戻り値 != 0 )
\r
1333 r現在のステージ.On非活性化();
\r
1334 Trace.TraceInformation( "----------------------" );
\r
1335 Trace.TraceInformation( "■ 選曲" );
\r
1337 r直前のステージ = r現在のステージ;
\r
1338 r現在のステージ = stage選曲;
\r
1339 this.tガベージコレクションを実行する();
\r
1341 //-----------------------------
\r
1345 case CStage.Eステージ.終了:
\r
1347 //-----------------------------
\r
1348 if( this.n進行描画の戻り値 != 0 )
\r
1352 //-----------------------------
\r
1357 this.Device.EndScene(); // Present()は game.csのOnFrameEnd()に登録された、GraphicsDeviceManager.game_FrameEnd() 内で実行されるので不要
\r
1358 // (つまり、Present()は、Draw()完了後に実行される)
\r
1359 #if !GPUFlushAfterPresent
\r
1360 actFlushGPU.On進行描画(); // Flush GPU // EndScene()~Present()間 (つまりVSync前) でFlush実行
\r
1362 #region [ 全画面・ウインドウ切り替え ]
\r
1363 if ( this.b次のタイミングで全画面・ウィンドウ切り替えを行う )
\r
1365 ConfigIni.b全画面モード = !ConfigIni.b全画面モード;
\r
1366 app.t全画面・ウィンドウモード切り替え();
\r
1367 this.b次のタイミングで全画面・ウィンドウ切り替えを行う = false;
\r
1370 #region [ 垂直基線同期切り替え ]
\r
1371 if ( this.b次のタイミングで垂直帰線同期切り替えを行う )
\r
1373 bool bIsMaximized = this.Window.IsMaximized; // #23510 2010.11.3 yyagi: to backup current window mode before changing VSyncWait
\r
1374 currentClientSize = this.Window.ClientSize; // #23510 2010.11.3 yyagi: to backup current window size before changing VSyncWait
\r
1375 DeviceSettings currentSettings = app.GraphicsDeviceManager.CurrentSettings;
\r
1376 currentSettings.EnableVSync = ConfigIni.b垂直帰線待ちを行う;
\r
1377 app.GraphicsDeviceManager.ChangeDevice( currentSettings );
\r
1378 this.b次のタイミングで垂直帰線同期切り替えを行う = false;
\r
1379 base.Window.ClientSize = new Size(currentClientSize.Width, currentClientSize.Height); // #23510 2010.11.3 yyagi: to resume window size after changing VSyncWait
\r
1382 this.Window.WindowState = FormWindowState.Maximized; // #23510 2010.11.3 yyagi: to resume window mode after changing VSyncWait
\r
1390 #region [ 汎用ヘルパー ]
\r
1391 //-----------------
\r
1392 public static CTexture tテクスチャの生成( string fileName )
\r
1394 return tテクスチャの生成( fileName, false );
\r
1396 public static CTexture tテクスチャの生成( string fileName, bool b黒を透過する )
\r
1398 if ( app == null )
\r
1404 return new CTexture( app.Device, fileName, TextureFormat, b黒を透過する );
\r
1406 catch ( CTextureCreateFailedException )
\r
1408 Trace.TraceError( "テクスチャの生成に失敗しました。({0})", fileName );
\r
1411 catch ( FileNotFoundException )
\r
1413 Trace.TraceError( "テクスチャファイルが見つかりませんでした。({0})", fileName );
\r
1417 public static void tテクスチャの解放( ref CTexture tx )
\r
1419 CDTXMania.t安全にDisposeする( ref tx );
\r
1422 public static CTexture tテクスチャの生成( byte[] txData )
\r
1424 return tテクスチャの生成( txData, false );
\r
1426 public static CTexture tテクスチャの生成( byte[] txData, bool b黒を透過する )
\r
1428 if ( app == null )
\r
1434 return new CTexture( app.Device, txData, TextureFormat, b黒を透過する );
\r
1436 catch ( CTextureCreateFailedException )
\r
1438 Trace.TraceError( "テクスチャの生成に失敗しました。(txData)" );
\r
1443 public static CTexture tテクスチャの生成( Bitmap bitmap )
\r
1445 return tテクスチャの生成( bitmap, false );
\r
1447 public static CTexture tテクスチャの生成( Bitmap bitmap, bool b黒を透過する )
\r
1449 if ( app == null )
\r
1455 return new CTexture( app.Device, bitmap, TextureFormat, b黒を透過する );
\r
1457 catch ( CTextureCreateFailedException )
\r
1459 Trace.TraceError( "テクスチャの生成に失敗しました。(txData)" );
\r
1464 /// <summary>プロパティ、インデクサには ref は使用できないので注意。</summary>
\r
1465 public static void t安全にDisposeする<T>( ref T obj )
\r
1467 if ( obj == null )
\r
1470 var d = obj as IDisposable;
\r
1475 obj = default( T );
\r
1477 //-----------------
\r
1480 #region [ private ]
\r
1481 //-----------------
\r
1482 private bool bマウスカーソル表示中 = true;
\r
1483 private bool b終了処理完了済み;
\r
1484 private static CDTX dtx;
\r
1485 private List<CActivity> listトップレベルActivities;
\r
1486 private int n進行描画の戻り値;
\r
1487 private MouseButtons mb = System.Windows.Forms.MouseButtons.Left;
\r
1488 private string strWindowTitle = "";
\r
1490 private void t起動処理()
\r
1492 #region [ strEXEのあるフォルダを決定する ]
\r
1493 //-----------------
\r
1494 // BEGIN #23629 2010.11.13 from: デバッグ時は Application.ExecutablePath が ($SolutionDir)/bin/x86/Debug/ などになり System/ の読み込みに失敗するので、カレントディレクトリを採用する。(プロジェクトのプロパティ→デバッグ→作業ディレクトリが有効になる)
\r
1496 strEXEのあるフォルダ = Environment.CurrentDirectory + @"\";
\r
1498 strEXEのあるフォルダ = Path.GetDirectoryName( Application.ExecutablePath ) + @"\"; // #23629 2010.11.9 yyagi: set correct pathname where DTXManiaGR.exe is.
\r
1500 // END #23629 2010.11.13 from
\r
1501 //-----------------
\r
1504 #region [ Config.ini の読込み ]
\r
1505 //---------------------
\r
1506 ConfigIni = new CConfigIni();
\r
1507 string path = strEXEのあるフォルダ + "Config.ini";
\r
1508 if( File.Exists( path ) )
\r
1512 ConfigIni.tファイルから読み込み( path );
\r
1516 //ConfigIni = new CConfigIni(); // 存在してなければ新規生成
\r
1519 this.Window.EnableSystemMenu = CDTXMania.ConfigIni.bIsEnabledSystemMenu; // #28200 2011.5.1 yyagi
\r
1520 // 2012.8.22 Config.iniが無いときに初期値が適用されるよう、この設定行をifブロック外に移動
\r
1522 //---------------------
\r
1524 #region [ ログ出力開始 ]
\r
1525 //---------------------
\r
1526 Trace.AutoFlush = true;
\r
1527 if( ConfigIni.bログ出力 )
\r
1531 Trace.Listeners.Add( new CTraceLogListener( new StreamWriter( "DTXManiaLog.txt", false, Encoding.GetEncoding( "Shift_JIS" ) ) ) );
\r
1533 catch ( System.UnauthorizedAccessException ) // #24481 2011.2.20 yyagi
\r
1535 int c = (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja")? 0 : 1;
\r
1536 string[] mes_writeErr = {
\r
1537 "DTXManiaLog.txtへの書き込みができませんでした。書き込みできるようにしてから、再度起動してください。",
\r
1538 "Failed to write DTXManiaLog.txt. Please set it writable and try again."
\r
1540 MessageBox.Show( mes_writeErr[c], "DTXMania boot error", MessageBoxButtons.OK, MessageBoxIcon.Error );
\r
1541 Environment.Exit(1);
\r
1544 Trace.WriteLine("");
\r
1545 Trace.WriteLine( "DTXMania powered by YAMAHA Silent Session Drums" );
\r
1546 Trace.WriteLine( string.Format( "Release: {0}", VERSION ) );
\r
1547 Trace.WriteLine( "" );
\r
1548 Trace.TraceInformation( "----------------------" );
\r
1549 Trace.TraceInformation( "■ アプリケーションの初期化" );
\r
1550 Trace.TraceInformation( "OS Version: " + Environment.OSVersion );
\r
1551 Trace.TraceInformation( "ProcessorCount: " + Environment.ProcessorCount.ToString() );
\r
1552 Trace.TraceInformation( "CLR Version: " + Environment.Version.ToString() );
\r
1553 //---------------------
\r
1555 #region [ コンパクトモードスイッチの有無 ]
\r
1556 //---------------------
\r
1557 bコンパクトモード = false;
\r
1558 strコンパクトモードファイル = "";
\r
1559 string[] commandLineArgs = Environment.GetCommandLineArgs();
\r
1560 if( ( commandLineArgs != null ) && ( commandLineArgs.Length > 1 ) )
\r
1563 strコンパクトモードファイル = commandLineArgs[ 1 ];
\r
1564 Trace.TraceInformation( "コンパクトモードで起動します。[{0}]", strコンパクトモードファイル );
\r
1566 //---------------------
\r
1569 #region [ ウィンドウ初期化 ]
\r
1570 //---------------------
\r
1571 this.strWindowTitle = "DTXMania .NET style release " + VERSION;
\r
1573 base.Window.StartPosition = FormStartPosition.Manual; // #30675 2013.02.04 ikanick add
\r
1574 base.Window.Location = new Point( ConfigIni.n初期ウィンドウ開始位置X, ConfigIni.n初期ウィンドウ開始位置Y ); // #30675 2013.02.04 ikanick add
\r
1576 base.Window.Text = this.strWindowTitle;
\r
1578 base.Window.StartPosition = FormStartPosition.Manual; // #30675 2013.02.04 ikanick add
\r
1579 base.Window.Location = new Point(ConfigIni.n初期ウィンドウ開始位置X, ConfigIni.n初期ウィンドウ開始位置Y); // #30675 2013.02.04 ikanick add
\r
1581 base.Window.ClientSize = new Size(ConfigIni.nウインドウwidth, ConfigIni.nウインドウheight); // #34510 yyagi 2010.10.31 to change window size got from Config.ini
\r
1582 #if !WindowedFullscreen
\r
1583 if (!ConfigIni.bウィンドウモード) // #23510 2010.11.02 yyagi: add; to recover window size in case bootup with fullscreen mode
\r
1584 { // #30666 2013.02.02 yyagi: currentClientSize should be always made
\r
1586 currentClientSize = new Size( ConfigIni.nウインドウwidth, ConfigIni.nウインドウheight );
\r
1587 #if !WindowedFullscreen
\r
1590 base.Window.MaximizeBox = true; // #23510 2010.11.04 yyagi: to support maximizing window
\r
1591 base.Window.FormBorderStyle = FormBorderStyle.Sizable; // #23510 2010.10.27 yyagi: changed from FixedDialog to Sizable, to support window resize
\r
1592 // #30666 2013.02.02 yyagi: moved the code to t全画面・ウインドウモード切り替え()
\r
1593 base.Window.ShowIcon = true;
\r
1594 base.Window.Icon = Properties.Resources.dtx;
\r
1595 base.Window.KeyDown += new KeyEventHandler( this.Window_KeyDown );
\r
1596 base.Window.MouseUp +=new MouseEventHandler( this.Window_MouseUp);
\r
1597 base.Window.MouseDoubleClick += new MouseEventHandler(this.Window_MouseDoubleClick); // #23510 2010.11.13 yyagi: to go fullscreen mode
\r
1598 base.Window.ResizeEnd += new EventHandler(this.Window_ResizeEnd); // #23510 2010.11.20 yyagi: to set resized window size in Config.ini
\r
1599 base.Window.ApplicationActivated += new EventHandler(this.Window_ApplicationActivated);
\r
1600 base.Window.ApplicationDeactivated += new EventHandler( this.Window_ApplicationDeactivated );
\r
1601 //---------------------
\r
1603 #region [ Direct3D9Exを使うかどうか判定 ]
\r
1605 #region [ Direct3D9 デバイスの生成 ]
\r
1606 //---------------------
\r
1607 DeviceSettings settings = new DeviceSettings();
\r
1608 #if WindowedFullscreen
\r
1609 settings.Windowed = true; // #30666 2013.2.2 yyagi: Fullscreenmode is "Maximized window" mode
\r
1611 settings.Windowed = ConfigIni.bウィンドウモード;
\r
1613 settings.BackBufferWidth = SampleFramework.GameWindowSize.Width;
\r
1614 settings.BackBufferHeight = SampleFramework.GameWindowSize.Height;
\r
1615 // settings.BackBufferCount = 3;
\r
1616 settings.EnableVSync = ConfigIni.b垂直帰線待ちを行う;
\r
1617 // settings.BackBufferFormat = Format.A8R8G8B8;
\r
1618 // settings.MultisampleType = MultisampleType.FourSamples;
\r
1619 // settings.MultisampleQuality = 4;
\r
1620 // settings.MultisampleType = MultisampleType.None;
\r
1621 // settings.MultisampleQuality = 0;
\r
1625 base.GraphicsDeviceManager.ChangeDevice(settings);
\r
1627 catch (DeviceCreationException e)
\r
1629 Trace.TraceError(e.ToString());
\r
1630 MessageBox.Show(e.Message + e.ToString(), "DTXMania failed to boot: DirectX9 Initialize Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1631 Environment.Exit(-1);
\r
1634 base.IsFixedTimeStep = false;
\r
1635 // base.TargetElapsedTime = TimeSpan.FromTicks( 10000000 / 75 );
\r
1636 base.Window.ClientSize = new Size(ConfigIni.nウインドウwidth, ConfigIni.nウインドウheight); // #23510 2010.10.31 yyagi: to recover window size. width and height are able to get from Config.ini.
\r
1637 base.InactiveSleepTime = TimeSpan.FromMilliseconds((float)(ConfigIni.n非フォーカス時スリープms)); // #23568 2010.11.3 yyagi: to support valiable sleep value when !IsActive
\r
1638 // #23568 2010.11.4 ikanick changed ( 1 -> ConfigIni )
\r
1639 #if WindowedFullscreen
\r
1640 this.t全画面・ウィンドウモード切り替え(); // #30666 2013.2.2 yyagi: finalize settings for "Maximized window mode"
\r
1642 actFlushGPU = new CActFlushGPU();
\r
1643 //---------------------
\r
1648 #region [ Skin の初期化 ]
\r
1649 //---------------------
\r
1650 Trace.TraceInformation( "スキンの初期化を行います。" );
\r
1654 Skin = new CSkin( CDTXMania.ConfigIni.strSystemSkinSubfolderFullName, CDTXMania.ConfigIni.bUseBoxDefSkin );
\r
1655 CDTXMania.ConfigIni.strSystemSkinSubfolderFullName = CDTXMania.Skin.GetCurrentSkinSubfolderFullName( true ); // 旧指定のSkinフォルダが消滅していた場合に備える
\r
1656 Trace.TraceInformation( "スキンの初期化を完了しました。" );
\r
1660 Trace.TraceInformation( "スキンの初期化に失敗しました。" );
\r
1667 //---------------------
\r
1670 #region [ Timer の初期化 ]
\r
1671 //---------------------
\r
1672 Trace.TraceInformation( "タイマの初期化を行います。" );
\r
1676 Timer = new CTimer( CTimer.E種別.MultiMedia );
\r
1677 Trace.TraceInformation( "タイマの初期化を完了しました。" );
\r
1683 //---------------------
\r
1685 #region [ FPS カウンタの初期化 ]
\r
1686 //---------------------
\r
1687 Trace.TraceInformation( "FPSカウンタの初期化を行います。" );
\r
1692 Trace.TraceInformation( "FPSカウンタを生成しました。" );
\r
1698 //---------------------
\r
1700 #region [ act文字コンソールの初期化 ]
\r
1701 //---------------------
\r
1702 Trace.TraceInformation( "文字コンソールの初期化を行います。" );
\r
1706 act文字コンソール = new C文字コンソール();
\r
1707 Trace.TraceInformation( "文字コンソールを生成しました。" );
\r
1708 act文字コンソール.On活性化();
\r
1709 Trace.TraceInformation( "文字コンソールを活性化しました。" );
\r
1710 Trace.TraceInformation( "文字コンソールの初期化を完了しました。" );
\r
1712 catch( Exception exception )
\r
1714 Trace.TraceError( exception.Message );
\r
1715 Trace.TraceError( "文字コンソールの初期化に失敗しました。" );
\r
1721 //---------------------
\r
1723 #region [ Input管理 の初期化 ]
\r
1724 //---------------------
\r
1725 Trace.TraceInformation( "DirectInput, MIDI入力の初期化を行います。" );
\r
1729 Input管理 = new CInput管理( base.Window.Handle );
\r
1730 foreach( IInputDevice device in Input管理.list入力デバイス )
\r
1732 if( ( device.e入力デバイス種別 == E入力デバイス種別.Joystick ) && !ConfigIni.dicJoystick.ContainsValue( device.GUID ) )
\r
1735 while( ConfigIni.dicJoystick.ContainsKey( key ) )
\r
1739 ConfigIni.dicJoystick.Add( key, device.GUID );
\r
1742 foreach( IInputDevice device2 in Input管理.list入力デバイス )
\r
1744 if( device2.e入力デバイス種別 == E入力デバイス種別.Joystick )
\r
1746 foreach( KeyValuePair<int, string> pair in ConfigIni.dicJoystick )
\r
1748 if( device2.GUID.Equals( pair.Value ) )
\r
1750 ( (CInputJoystick) device2 ).SetID( pair.Key );
\r
1757 Trace.TraceInformation( "DirectInput の初期化を完了しました。" );
\r
1759 catch( Exception exception2 )
\r
1761 Trace.TraceError( exception2.Message );
\r
1762 Trace.TraceError( "DirectInput, MIDI入力の初期化に失敗しました。" );
\r
1769 //---------------------
\r
1771 #region [ Pad の初期化 ]
\r
1772 //---------------------
\r
1773 Trace.TraceInformation( "パッドの初期化を行います。" );
\r
1777 Pad = new CPad( ConfigIni, Input管理 );
\r
1778 Trace.TraceInformation( "パッドの初期化を完了しました。" );
\r
1780 catch( Exception exception3 )
\r
1782 Trace.TraceError( exception3.Message );
\r
1783 Trace.TraceError( "パッドの初期化に失敗しました。" );
\r
1789 //---------------------
\r
1791 #region [ Sound管理 の初期化 ]
\r
1792 //---------------------
\r
1793 Trace.TraceInformation( "サウンドデバイスの初期化を行います。" );
\r
1797 ESoundDeviceType soundDeviceType;
\r
1798 switch ( CDTXMania.ConfigIni.nSoundDeviceType )
\r
1801 soundDeviceType = ESoundDeviceType.DirectSound;
\r
1804 soundDeviceType = ESoundDeviceType.ASIO;
\r
1807 soundDeviceType = ESoundDeviceType.ExclusiveWASAPI;
\r
1810 soundDeviceType = ESoundDeviceType.Unknown;
\r
1813 Sound管理 = new CSound管理( base.Window.Handle,
\r
1815 // CDTXMania.ConfigIni.nWASAPIBufferSizeMs,
\r
1817 // CDTXMania.ConfigIni.nASIOBufferSizeMs,
\r
1819 CDTXMania.ConfigIni.nASIODevice
\r
1821 AddSoundTypeToWindowTitle();
\r
1822 FDK.CSound管理.bIsTimeStretch = CDTXMania.ConfigIni.bTimeStretch;
\r
1823 Trace.TraceInformation( "サウンドデバイスの初期化を完了しました。" );
\r
1825 catch (Exception e)
\r
1827 Trace.TraceError( e.Message );
\r
1834 //---------------------
\r
1836 #region [ Songs管理 の初期化 ]
\r
1837 //---------------------
\r
1838 Trace.TraceInformation( "曲リストの初期化を行います。" );
\r
1842 Songs管理 = new CSongs管理();
\r
1843 // Songs管理_裏読 = new CSongs管理();
\r
1844 EnumSongs = new CEnumSongs();
\r
1845 actEnumSongs = new CActEnumSongs();
\r
1846 Trace.TraceInformation( "曲リストの初期化を完了しました。" );
\r
1848 catch( Exception e )
\r
1850 Trace.TraceError( e.Message );
\r
1851 Trace.TraceError( "曲リストの初期化に失敗しました。" );
\r
1857 //---------------------
\r
1859 #region [ CAvi の初期化 ]
\r
1860 //---------------------
\r
1862 //---------------------
\r
1864 #region [ Random の初期化 ]
\r
1865 //---------------------
\r
1866 Random = new Random( (int) Timer.nシステム時刻 );
\r
1867 //---------------------
\r
1869 #region [ ステージの初期化 ]
\r
1870 //---------------------
\r
1873 stage起動 = new CStage起動();
\r
1874 stageタイトル = new CStageタイトル();
\r
1875 // stageオプション = new CStageオプション();
\r
1876 stageコンフィグ = new CStageコンフィグ();
\r
1877 stage選曲 = new CStage選曲();
\r
1878 stage曲読み込み = new CStage曲読み込み();
\r
1879 stage演奏ドラム画面 = new CStage演奏ドラム画面();
\r
1880 stage演奏ギター画面 = new CStage演奏ギター画面();
\r
1881 stage結果 = new CStage結果();
\r
1882 stageChangeSkin = new CStageChangeSkin();
\r
1883 stage終了 = new CStage終了();
\r
1884 this.listトップレベルActivities = new List<CActivity>();
\r
1885 this.listトップレベルActivities.Add( actEnumSongs );
\r
1886 this.listトップレベルActivities.Add( act文字コンソール );
\r
1887 this.listトップレベルActivities.Add( stage起動 );
\r
1888 this.listトップレベルActivities.Add( stageタイトル );
\r
1889 // this.listトップレベルActivities.Add( stageオプション );
\r
1890 this.listトップレベルActivities.Add( stageコンフィグ );
\r
1891 this.listトップレベルActivities.Add( stage選曲 );
\r
1892 this.listトップレベルActivities.Add( stage曲読み込み );
\r
1893 this.listトップレベルActivities.Add( stage演奏ドラム画面 );
\r
1894 this.listトップレベルActivities.Add( stage演奏ギター画面 );
\r
1895 this.listトップレベルActivities.Add( stage結果 );
\r
1896 this.listトップレベルActivities.Add( stageChangeSkin );
\r
1897 this.listトップレベルActivities.Add( stage終了 );
\r
1898 this.listトップレベルActivities.Add( actFlushGPU );
\r
1899 //---------------------
\r
1901 #region [ プラグインの検索と生成 ]
\r
1902 //---------------------
\r
1903 PluginHost = new CPluginHost();
\r
1905 Trace.TraceInformation( "プラグインの検索と生成を行います。" );
\r
1909 this.tプラグイン検索と生成();
\r
1910 Trace.TraceInformation( "プラグインの検索と生成を完了しました。" );
\r
1916 //---------------------
\r
1918 #region [ プラグインの初期化 ]
\r
1919 //---------------------
\r
1920 if( this.listプラグイン != null && this.listプラグイン.Count > 0 )
\r
1922 Trace.TraceInformation( "プラグインの初期化を行います。" );
\r
1926 foreach( STPlugin st in this.listプラグイン )
\r
1928 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
1929 st.plugin.On初期化( this.PluginHost );
\r
1930 st.plugin.OnManagedリソースの作成();
\r
1931 st.plugin.OnUnmanagedリソースの作成();
\r
1932 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1934 Trace.TraceInformation( "すべてのプラグインの初期化を完了しました。" );
\r
1938 Trace.TraceError( "プラグインのどれかの初期化に失敗しました。" );
\r
1947 //---------------------
\r
1950 Trace.TraceInformation( "アプリケーションの初期化を完了しました。" );
\r
1952 #region [ 最初のステージの起動 ]
\r
1953 //---------------------
\r
1954 Trace.TraceInformation( "----------------------" );
\r
1955 Trace.TraceInformation( "■ 起動" );
\r
1957 if ( CDTXMania.bコンパクトモード )
\r
1959 r現在のステージ = stage曲読み込み;
\r
1963 r現在のステージ = stage起動;
\r
1966 //---------------------
\r
1970 public void AddSoundTypeToWindowTitle()
\r
1972 string delay = "";
\r
1973 if ( Sound管理.GetCurrentSoundDeviceType() != "DirectSound" )
\r
1975 delay = "(" + Sound管理.GetSoundDelay() + "ms)";
\r
1977 base.Window.Text = strWindowTitle + " (" + Sound管理.GetCurrentSoundDeviceType() + delay + ")";
\r
1980 private void t終了処理()
\r
1982 if( !this.b終了処理完了済み )
\r
1984 Trace.TraceInformation( "----------------------" );
\r
1985 Trace.TraceInformation( "■ アプリケーションの終了" );
\r
1986 #region [ 曲検索の終了処理 ]
\r
1987 //---------------------
\r
1988 if ( actEnumSongs != null )
\r
1990 Trace.TraceInformation( "曲検索actの終了処理を行います。" );
\r
1994 actEnumSongs.On非活性化();
\r
1995 actEnumSongs= null;
\r
1996 Trace.TraceInformation( "曲検索actの終了処理を完了しました。" );
\r
1998 catch ( Exception e )
\r
2000 Trace.TraceError( e.Message );
\r
2001 Trace.TraceError( "曲検索actの終了処理に失敗しました。" );
\r
2008 //---------------------
\r
2010 #region [ 現在のステージの終了処理 ]
\r
2011 //---------------------
\r
2012 if( CDTXMania.r現在のステージ != null && CDTXMania.r現在のステージ.b活性化してる ) // #25398 2011.06.07 MODIFY FROM
\r
2014 Trace.TraceInformation( "現在のステージを終了します。" );
\r
2018 r現在のステージ.On非活性化();
\r
2019 Trace.TraceInformation( "現在のステージの終了処理を完了しました。" );
\r
2026 //---------------------
\r
2028 #region [ プラグインの終了処理 ]
\r
2029 //---------------------
\r
2030 if (this.listプラグイン != null && this.listプラグイン.Count > 0)
\r
2032 Trace.TraceInformation( "すべてのプラグインを終了します。" );
\r
2036 foreach( STPlugin st in this.listプラグイン )
\r
2038 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
2039 st.plugin.OnUnmanagedリソースの解放();
\r
2040 st.plugin.OnManagedリソースの解放();
\r
2042 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
2044 PluginHost = null;
\r
2045 Trace.TraceInformation( "すべてのプラグインの終了処理を完了しました。" );
\r
2052 //---------------------
\r
2054 #region [ 曲リストの終了処理 ]
\r
2055 //---------------------
\r
2056 if (Songs管理 != null)
\r
2058 Trace.TraceInformation( "曲リストの終了処理を行います。" );
\r
2063 Trace.TraceInformation( "曲リストの終了処理を完了しました。" );
\r
2065 catch( Exception exception )
\r
2067 Trace.TraceError( exception.Message );
\r
2068 Trace.TraceError( "曲リストの終了処理に失敗しました。" );
\r
2076 //---------------------
\r
2078 #region [ スキンの終了処理 ]
\r
2079 //---------------------
\r
2082 Trace.TraceInformation( "スキンの終了処理を行います。" );
\r
2088 Trace.TraceInformation( "スキンの終了処理を完了しました。" );
\r
2090 catch( Exception exception2 )
\r
2092 Trace.TraceError( exception2.Message );
\r
2093 Trace.TraceError( "スキンの終了処理に失敗しました。" );
\r
2100 //---------------------
\r
2102 #region [ DirectSoundの終了処理 ]
\r
2103 //---------------------
\r
2104 if (Sound管理 != null)
\r
2106 Trace.TraceInformation( "DirectSound の終了処理を行います。" );
\r
2110 Sound管理.Dispose();
\r
2112 Trace.TraceInformation( "DirectSound の終了処理を完了しました。" );
\r
2114 catch( Exception exception3 )
\r
2116 Trace.TraceError( exception3.Message );
\r
2117 Trace.TraceError( "DirectSound の終了処理に失敗しました。" );
\r
2124 //---------------------
\r
2126 #region [ パッドの終了処理 ]
\r
2127 //---------------------
\r
2130 Trace.TraceInformation( "パッドの終了処理を行います。" );
\r
2135 Trace.TraceInformation( "パッドの終了処理を完了しました。" );
\r
2137 catch( Exception exception4 )
\r
2139 Trace.TraceError( exception4.Message );
\r
2140 Trace.TraceError( "パッドの終了処理に失敗しました。" );
\r
2147 //---------------------
\r
2149 #region [ DirectInput, MIDI入力の終了処理 ]
\r
2150 //---------------------
\r
2151 if (Input管理 != null)
\r
2153 Trace.TraceInformation( "DirectInput, MIDI入力の終了処理を行います。" );
\r
2157 Input管理.Dispose();
\r
2159 Trace.TraceInformation( "DirectInput, MIDI入力の終了処理を完了しました。" );
\r
2161 catch( Exception exception5 )
\r
2163 Trace.TraceError( exception5.Message );
\r
2164 Trace.TraceError( "DirectInput, MIDI入力の終了処理に失敗しました。" );
\r
2171 //---------------------
\r
2173 #region [ 文字コンソールの終了処理 ]
\r
2174 //---------------------
\r
2175 if (act文字コンソール != null)
\r
2177 Trace.TraceInformation( "文字コンソールの終了処理を行います。" );
\r
2181 act文字コンソール.On非活性化();
\r
2182 act文字コンソール = null;
\r
2183 Trace.TraceInformation( "文字コンソールの終了処理を完了しました。" );
\r
2185 catch( Exception exception6 )
\r
2187 Trace.TraceError( exception6.Message );
\r
2188 Trace.TraceError( "文字コンソールの終了処理に失敗しました。" );
\r
2195 //---------------------
\r
2197 #region [ FPSカウンタの終了処理 ]
\r
2198 //---------------------
\r
2199 Trace.TraceInformation("FPSカウンタの終了処理を行います。");
\r
2207 Trace.TraceInformation( "FPSカウンタの終了処理を完了しました。" );
\r
2213 //---------------------
\r
2216 #region [ タイマの終了処理 ]
\r
2217 //---------------------
\r
2218 Trace.TraceInformation("タイマの終了処理を行います。");
\r
2222 if( Timer != null )
\r
2226 Trace.TraceInformation( "タイマの終了処理を完了しました。" );
\r
2230 Trace.TraceInformation( "タイマは使用されていません。" );
\r
2237 //---------------------
\r
2239 #region [ Config.iniの出力 ]
\r
2240 //---------------------
\r
2241 Trace.TraceInformation("Config.ini を出力します。");
\r
2242 // if ( ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.16 yyagi ギターベースがスワップしているときは元に戻す
\r
2243 if ( ConfigIni.bIsSwappedGuitarBass_AutoFlagsAreSwapped ) // #24415 2011.2.21 yyagi FLIP中かつ演奏中にalt-f4で終了したときは、AUTOのフラグをswapして戻す
\r
2245 ConfigIni.SwapGuitarBassInfos_AutoFlags();
\r
2247 string str = strEXEのあるフォルダ + "Config.ini";
\r
2251 ConfigIni.t書き出し( str );
\r
2252 Trace.TraceInformation( "保存しました。({0})", new object[] { str } );
\r
2254 catch( Exception e )
\r
2256 Trace.TraceError( e.Message );
\r
2257 Trace.TraceError( "Config.ini の出力に失敗しました。({0})", new object[] { str } );
\r
2263 //---------------------
\r
2265 Trace.TraceInformation("アプリケーションの終了処理を完了しました。");
\r
2268 this.b終了処理完了済み = true;
\r
2271 private CScoreIni tScoreIniへBGMAdjustとHistoryとPlayCountを更新(string str新ヒストリ行)
\r
2273 bool bIsUpdatedDrums, bIsUpdatedGuitar, bIsUpdatedBass;
\r
2274 string strFilename = DTX.strファイル名の絶対パス + ".score.ini";
\r
2275 CScoreIni ini = new CScoreIni( strFilename );
\r
2276 if( !File.Exists( strFilename ) )
\r
2278 ini.stファイル.Title = DTX.TITLE;
\r
2279 ini.stファイル.Name = DTX.strファイル名;
\r
2280 ini.stファイル.Hash = CScoreIni.tファイルのMD5を求めて返す( DTX.strファイル名の絶対パス );
\r
2281 for( int i = 0; i < 6; i++ )
\r
2283 ini.stセクション[ i ].nPerfectになる範囲ms = nPerfect範囲ms;
\r
2284 ini.stセクション[ i ].nGreatになる範囲ms = nGreat範囲ms;
\r
2285 ini.stセクション[ i ].nGoodになる範囲ms = nGood範囲ms;
\r
2286 ini.stセクション[ i ].nPoorになる範囲ms = nPoor範囲ms;
\r
2289 ini.stファイル.BGMAdjust = DTX.nBGMAdjust;
\r
2290 CScoreIni.t更新条件を取得する( out bIsUpdatedDrums, out bIsUpdatedGuitar, out bIsUpdatedBass );
\r
2291 if( bIsUpdatedDrums || bIsUpdatedGuitar || bIsUpdatedBass )
\r
2293 if( bIsUpdatedDrums )
\r
2295 ini.stファイル.PlayCountDrums++;
\r
2297 if( bIsUpdatedGuitar )
\r
2299 ini.stファイル.PlayCountGuitar++;
\r
2301 if( bIsUpdatedBass )
\r
2303 ini.stファイル.PlayCountBass++;
\r
2305 ini.tヒストリを追加する( str新ヒストリ行 );
\r
2308 stage選曲.r現在選択中のスコア.譜面情報.演奏回数.Drums = ini.stファイル.PlayCountDrums;
\r
2309 stage選曲.r現在選択中のスコア.譜面情報.演奏回数.Guitar = ini.stファイル.PlayCountGuitar;
\r
2310 stage選曲.r現在選択中のスコア.譜面情報.演奏回数.Bass = ini.stファイル.PlayCountBass;
\r
2311 for( int j = 0; j < ini.stファイル.History.Length; j++ )
\r
2313 stage選曲.r現在選択中のスコア.譜面情報.演奏履歴[ j ] = ini.stファイル.History[ j ];
\r
2317 if( ConfigIni.bScoreIniを出力する )
\r
2319 ini.t書き出し( strFilename );
\r
2324 private void tガベージコレクションを実行する()
\r
2327 GC.WaitForPendingFinalizers();
\r
2329 GC.WaitForPendingFinalizers();
\r
2331 private void tプラグイン検索と生成()
\r
2333 this.listプラグイン = new List<STPlugin>();
\r
2335 string strIPluginActivityの名前 = typeof( IPluginActivity ).FullName;
\r
2336 string strプラグインフォルダパス = strEXEのあるフォルダ + "Plugins\\";
\r
2338 this.t指定フォルダ内でのプラグイン検索と生成( strプラグインフォルダパス, strIPluginActivityの名前 );
\r
2340 if( this.listプラグイン.Count > 0 )
\r
2341 Trace.TraceInformation( this.listプラグイン.Count + " 個のプラグインを読み込みました。" );
\r
2343 #region [ Windowイベント処理 ]
\r
2344 private void t指定フォルダ内でのプラグイン検索と生成( string strプラグインフォルダパス, string strプラグイン型名 )
\r
2346 // 指定されたパスが存在しないとエラー
\r
2347 if( !Directory.Exists( strプラグインフォルダパス ) )
\r
2349 Trace.TraceWarning( "プラグインフォルダが存在しません。(" + strプラグインフォルダパス + ")" );
\r
2353 // (1) すべての *.dll について…
\r
2354 string[] strDLLs = System.IO.Directory.GetFiles( strプラグインフォルダパス, "*.dll" );
\r
2355 foreach( string dllName in strDLLs )
\r
2359 // (1-1) dll をアセンブリとして読み込む。
\r
2360 System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom( dllName );
\r
2362 // (1-2) アセンブリ内のすべての型について、プラグインとして有効か調べる
\r
2363 foreach( Type t in asm.GetTypes() )
\r
2365 // (1-3) ↓クラスであり↓Publicであり↓抽象クラスでなく↓IPlugin型のインスタンスが作れる 型を持っていれば有効
\r
2366 if( t.IsClass && t.IsPublic && !t.IsAbstract && t.GetInterface( strプラグイン型名 ) != null )
\r
2368 // (1-4) クラス名からインスタンスを作成する
\r
2369 var st = new STPlugin() {
\r
2370 plugin = (IPluginActivity) asm.CreateInstance( t.FullName ),
\r
2371 strプラグインフォルダ = Path.GetDirectoryName( dllName ),
\r
2372 strアセンブリ簡易名 = asm.GetName().Name,
\r
2373 Version = asm.GetName().Version,
\r
2376 // (1-5) プラグインリストへ登録
\r
2377 this.listプラグイン.Add( st );
\r
2378 Trace.TraceInformation( "プラグイン {0} ({1}, {2}, {3}) を読み込みました。", t.FullName, Path.GetFileName( dllName ), st.strアセンブリ簡易名, st.Version.ToString() );
\r
2384 Trace.TraceInformation( dllName + " からプラグインを生成することに失敗しました。スキップします。" );
\r
2388 // (2) サブフォルダがあれば再帰する
\r
2389 string[] strDirs = Directory.GetDirectories( strプラグインフォルダパス, "*" );
\r
2390 foreach( string dir in strDirs )
\r
2391 this.t指定フォルダ内でのプラグイン検索と生成( dir + "\\", strプラグイン型名 );
\r
2393 //-----------------
\r
2394 private void Window_ApplicationActivated( object sender, EventArgs e )
\r
2396 this.bApplicationActive = true;
\r
2398 private void Window_ApplicationDeactivated( object sender, EventArgs e )
\r
2400 this.bApplicationActive = false;
\r
2402 private void Window_KeyDown( object sender, KeyEventArgs e )
\r
2404 if ( e.KeyCode == Keys.Menu )
\r
2407 e.SuppressKeyPress = true;
\r
2409 else if ( ( e.KeyCode == Keys.Return ) && e.Alt )
\r
2411 if ( ConfigIni != null )
\r
2413 ConfigIni.bウィンドウモード = !ConfigIni.bウィンドウモード;
\r
2414 this.t全画面・ウィンドウモード切り替え();
\r
2417 e.SuppressKeyPress = true;
\r
2421 for ( int i = 0; i < 0x10; i++ )
\r
2423 if ( ConfigIni.KeyAssign.System.Capture[ i ].コード > 0 &&
\r
2424 e.KeyCode == DeviceConstantConverter.KeyToKeyCode( (SlimDX.DirectInput.Key) ConfigIni.KeyAssign.System.Capture[ i ].コード ) )
\r
2426 // Debug.WriteLine( "capture: " + string.Format( "{0:2x}", (int) e.KeyCode ) + " " + (int) e.KeyCode );
\r
2427 string strFullPath =
\r
2428 Path.Combine( CDTXMania.strEXEのあるフォルダ, "Capture_img" );
\r
2429 strFullPath = Path.Combine( strFullPath, DateTime.Now.ToString( "yyyyMMddHHmmss" ) + ".png" );
\r
2430 SaveResultScreen( strFullPath );
\r
2435 private void Window_MouseUp( object sender, MouseEventArgs e )
\r
2440 private void Window_MouseDoubleClick( object sender, MouseEventArgs e) // #23510 2010.11.13 yyagi: to go full screen mode
\r
2442 if ( mb.Equals(MouseButtons.Left) && ConfigIni.bIsAllowedDoubleClickFullscreen ) // #26752 2011.11.27 yyagi
\r
2444 ConfigIni.bウィンドウモード = false;
\r
2445 this.t全画面・ウィンドウモード切り替え();
\r
2448 private void Window_ResizeEnd(object sender, EventArgs e) // #23510 2010.11.20 yyagi: to get resized window size
\r
2450 if ( ConfigIni.bウィンドウモード )
\r
2452 ConfigIni.n初期ウィンドウ開始位置X = base.Window.Location.X; // #30675 2013.02.04 ikanick add
\r
2453 ConfigIni.n初期ウィンドウ開始位置Y = base.Window.Location.Y; //
\r
2456 ConfigIni.nウインドウwidth = (ConfigIni.bウィンドウモード) ? base.Window.ClientSize.Width : currentClientSize.Width; // #23510 2010.10.31 yyagi add
\r
2457 ConfigIni.nウインドウheight = (ConfigIni.bウィンドウモード) ? base.Window.ClientSize.Height : currentClientSize.Height;
\r
2461 //internal sealed class GCBeep // GC発生の度にbeep
\r
2465 // Console.Beep();
\r
2466 // if ( !AppDomain.CurrentDomain.IsFinalizingForUnload()
\r
2467 // && !Environment.HasShutdownStarted )
\r
2474 //-----------------
\r