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
23 public static readonly string VERSION = "094(120610)";
\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
301 CDTXMania.app = this;
\r
308 public void t全画面・ウィンドウモード切り替え()
\r
310 DeviceSettings settings = base.GraphicsDeviceManager.CurrentSettings.Clone();
\r
311 if( ( ConfigIni != null ) && ( ConfigIni.bウィンドウモード != settings.Windowed ) )
\r
313 settings.Windowed = ConfigIni.bウィンドウモード;
\r
314 if (ConfigIni.bウィンドウモード == false) // #23510 2010.10.27 yyagi: backup current window size before going fullscreen mode
\r
316 currentClientSize = this.Window.ClientSize;
\r
317 ConfigIni.nウインドウwidth = this.Window.ClientSize.Width;
\r
318 ConfigIni.nウインドウheight = this.Window.ClientSize.Height;
\r
320 base.GraphicsDeviceManager.ChangeDevice( settings );
\r
321 if (ConfigIni.bウィンドウモード == true) // #23510 2010.10.27 yyagi: to resume window size from backuped value
\r
323 base.Window.ClientSize =
\r
324 new Size(currentClientSize.Width, currentClientSize.Height);
\r
329 #region [ #24609 リザルト画像をpngで保存する ] // #24609 2011.3.14 yyagi; to save result screen in case BestRank or HiSkill.
\r
331 /// リザルト画像のキャプチャと保存。
\r
333 /// <param name="strFilename">保存するファイル名(フルパス)</param>
\r
334 public bool SaveResultScreen( string strFullPath )
\r
336 string strSavePath = Path.GetDirectoryName( strFullPath );
\r
337 if ( !Directory.Exists( strSavePath ) )
\r
341 Directory.CreateDirectory( strSavePath );
\r
349 // http://www.gamedev.net/topic/594369-dx9slimdxati-incorrect-saving-surface-to-file/
\r
350 using ( Surface pSurface = CDTXMania.app.Device.GetRenderTarget( 0 ) )
\r
352 Surface.ToFile( pSurface, strFullPath, ImageFileFormat.Png );
\r
360 protected override void Initialize()
\r
363 if( this.listトップレベルActivities != null )
\r
365 foreach( CActivity activity in this.listトップレベルActivities )
\r
366 activity.OnManagedリソースの作成();
\r
369 foreach( STPlugin st in this.listプラグイン )
\r
371 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
372 st.plugin.OnManagedリソースの作成();
\r
373 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
376 protected override void LoadContent()
\r
378 if ( ConfigIni.bウィンドウモード )
\r
380 if( !this.bマウスカーソル表示中 )
\r
383 this.bマウスカーソル表示中 = true;
\r
386 else if( this.bマウスカーソル表示中 )
\r
389 this.bマウスカーソル表示中 = false;
\r
391 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
392 this.Device.SetTransform(TransformState.Projection, Matrix.PerspectiveFovLH(C変換.DegreeToRadian((float)60f), ((float)this.Device.Viewport.Width) / ((float)this.Device.Viewport.Height), -100f, 100f));
\r
393 this.Device.SetRenderState(RenderState.Lighting, false);
\r
394 this.Device.SetRenderState( RenderState.ZEnable, false );
\r
395 this.Device.SetRenderState( RenderState.AntialiasedLineEnable, false );
\r
396 this.Device.SetRenderState( RenderState.AlphaTestEnable, true );
\r
397 this.Device.SetRenderState( RenderState.AlphaRef, 10 );
\r
398 this.Device.SetRenderState<Compare>( RenderState.AlphaFunc, Compare.Greater );
\r
399 this.Device.SetRenderState( RenderState.AlphaBlendEnable, true );
\r
400 this.Device.SetRenderState<Blend>( RenderState.SourceBlend, Blend.SourceAlpha );
\r
401 this.Device.SetRenderState<Blend>( RenderState.DestinationBlend, Blend.InverseSourceAlpha );
\r
402 this.Device.SetTextureStageState( 0, TextureStage.AlphaOperation, TextureOperation.Modulate );
\r
403 this.Device.SetTextureStageState( 0, TextureStage.AlphaArg1, 2 );
\r
404 this.Device.SetTextureStageState( 0, TextureStage.AlphaArg2, 1 );
\r
406 if( this.listトップレベルActivities != null )
\r
408 foreach( CActivity activity in this.listトップレベルActivities )
\r
409 activity.OnUnmanagedリソースの作成();
\r
412 foreach( STPlugin st in this.listプラグイン )
\r
414 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
415 st.plugin.OnUnmanagedリソースの作成();
\r
416 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
419 protected override void UnloadContent()
\r
421 if( this.listトップレベルActivities != null )
\r
423 foreach( CActivity activity in this.listトップレベルActivities )
\r
424 activity.OnUnmanagedリソースの解放();
\r
427 foreach( STPlugin st in this.listプラグイン )
\r
429 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
430 st.plugin.OnUnmanagedリソースの解放();
\r
431 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
434 protected override void OnExiting( EventArgs e )
\r
437 base.OnExiting( e );
\r
439 protected override void Update( GameTime gameTime )
\r
442 protected override void Draw( GameTime gameTime )
\r
444 Sound管理.t再生中の処理をする();
\r
446 if( Timer != null )
\r
449 if( Input管理 != null )
\r
450 Input管理.tポーリング( this.bApplicationActive, CDTXMania.ConfigIni.bバッファ入力を行う );
\r
455 //if( Pad != null ) ポーリング時にクリアしたらダメ!曲の開始時に1回だけクリアする。(2010.9.11)
\r
456 // Pad.st検知したデバイス.Clear();
\r
458 if( this.Device == null )
\r
461 this.Device.BeginScene();
\r
462 this.Device.Clear( ClearFlags.ZBuffer | ClearFlags.Target, Color.Black, 1f, 0 );
\r
464 if( r現在のステージ != null )
\r
466 this.n進行描画の戻り値 = ( r現在のステージ != null ) ? r現在のステージ.On進行描画() : 0;
\r
468 #region [ プラグインの進行描画 ]
\r
469 //---------------------
\r
470 foreach( STPlugin sp in this.listプラグイン )
\r
472 Directory.SetCurrentDirectory( sp.strプラグインフォルダ );
\r
474 if( CDTXMania.act現在入力を占有中のプラグイン == null || CDTXMania.act現在入力を占有中のプラグイン == sp.plugin )
\r
475 sp.plugin.On進行描画( CDTXMania.Pad, CDTXMania.Input管理.Keyboard );
\r
477 sp.plugin.On進行描画( null, null );
\r
479 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
481 //---------------------
\r
485 CScoreIni scoreIni = null;
\r
487 #region [ 曲検索スレッドの起動/終了 ] // ここに"Enumerating Songs..."表示を集約
\r
488 if ( !CDTXMania.bコンパクトモード )
\r
490 actEnumSongs.On進行描画(); // "Enumerating Songs..."アイコンの描画
\r
492 switch ( r現在のステージ.eステージID )
\r
494 case CStage.Eステージ.タイトル:
\r
495 case CStage.Eステージ.コンフィグ:
\r
496 case CStage.Eステージ.選曲:
\r
497 case CStage.Eステージ.曲読み込み:
\r
498 if ( EnumSongs != null )
\r
500 #region [ (特定条件時) 曲検索スレッドの起動・開始 ]
\r
501 if ( r現在のステージ.eステージID == CStage.Eステージ.タイトル &&
\r
502 r直前のステージ.eステージID == CStage.Eステージ.起動 &&
\r
503 this.n進行描画の戻り値 == (int) CStageタイトル.E戻り値.継続 &&
\r
504 !EnumSongs.IsSongListEnumStarted )
\r
506 actEnumSongs.On活性化();
\r
507 CDTXMania.stage選曲.bIsEnumeratingSongs = true;
\r
508 EnumSongs.Init( CDTXMania.Songs管理.listSongsDB, CDTXMania.Songs管理.nSongsDBから取得できたスコア数 ); // songs.db情報と、取得した曲数を、新インスタンスにも与える
\r
509 EnumSongs.StartEnumFromDisk(); // 曲検索スレッドの起動・開始
\r
510 if ( CDTXMania.Songs管理.nSongsDBから取得できたスコア数 == 0 ) // もし初回起動なら、検索スレッドのプライオリティをLowestでなくNormalにする
\r
512 EnumSongs.ChangeEnumeratePriority( ThreadPriority.Normal );
\r
517 #region [ 曲検索の中断と再開 ]
\r
518 if ( r現在のステージ.eステージID == CStage.Eステージ.選曲 && !EnumSongs.IsSongListEnumCompletelyDone )
\r
520 switch ( this.n進行描画の戻り値 )
\r
523 //if ( CDTXMania.stage選曲.bIsEnumeratingSongs )
\r
524 if ( !CDTXMania.stage選曲.bIsPlayingPremovie )
\r
526 EnumSongs.Resume(); // #27060 2012.2.6 yyagi 中止していたバックグランド曲検索を再開
\r
527 EnumSongs.IsSlowdown = false;
\r
531 // EnumSongs.Suspend(); // #27060 2012.3.2 yyagi #PREMOVIE再生中は曲検索を低速化
\r
532 EnumSongs.IsSlowdown = true;
\r
534 actEnumSongs.On活性化();
\r
538 EnumSongs.Suspend(); // #27060 バックグラウンドの曲検索を一時停止
\r
539 actEnumSongs.On非活性化();
\r
545 #region [ 曲探索中断待ち待機 ]
\r
546 if ( r現在のステージ.eステージID == CStage.Eステージ.曲読み込み && !EnumSongs.IsSongListEnumCompletelyDone &&
\r
547 EnumSongs.thDTXFileEnumerate != null ) // #28700 2012.6.12 yyagi; at Compact mode, enumerating thread does not exist.
\r
549 EnumSongs.WaitUntilSuspended(); // 念のため、曲検索が一時中断されるまで待機
\r
553 #region [ 曲検索が完了したら、実際の曲リストに反映する ]
\r
554 // CStage選曲.On活性化() に回した方がいいかな?
\r
555 if ( EnumSongs.IsSongListEnumerated )
\r
557 actEnumSongs.On非活性化();
\r
558 CDTXMania.stage選曲.bIsEnumeratingSongs = false;
\r
560 bool bRemakeSongTitleBar = ( r現在のステージ.eステージID == CStage.Eステージ.選曲 ) ? true : false;
\r
561 CDTXMania.stage選曲.Refresh( EnumSongs.Songs管理, bRemakeSongTitleBar );
\r
562 EnumSongs.SongListEnumCompletelyDone();
\r
570 switch ( r現在のステージ.eステージID )
\r
572 case CStage.Eステージ.何もしない:
\r
575 case CStage.Eステージ.起動:
\r
577 //-----------------------------
\r
578 if( this.n進行描画の戻り値 != 0 )
\r
583 Trace.TraceInformation( "----------------------" );
\r
584 Trace.TraceInformation( "■ タイトル" );
\r
586 r直前のステージ = r現在のステージ;
\r
587 r現在のステージ = stageタイトル;
\r
592 Trace.TraceInformation( "----------------------" );
\r
593 Trace.TraceInformation( "■ 曲読み込み" );
\r
594 stage曲読み込み.On活性化();
\r
595 r直前のステージ = r現在のステージ;
\r
596 r現在のステージ = stage曲読み込み;
\r
599 foreach( STPlugin pg in this.listプラグイン )
\r
601 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
602 pg.plugin.Onステージ変更();
\r
603 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
606 this.tガベージコレクションを実行する();
\r
608 //-----------------------------
\r
612 case CStage.Eステージ.タイトル:
\r
614 //-----------------------------
\r
615 switch( this.n進行描画の戻り値 )
\r
617 case (int)CStageタイトル.E戻り値.GAMESTART:
\r
619 //-----------------------------
\r
621 Trace.TraceInformation( "----------------------" );
\r
622 Trace.TraceInformation( "■ 選曲" );
\r
624 r直前のステージ = r現在のステージ;
\r
625 r現在のステージ = stage選曲;
\r
626 //-----------------------------
\r
630 #region [ OPTION: 廃止済 ]
\r
631 // case 2: // #24525 OPTIONとCONFIGの統合に伴い、OPTIONは廃止
\r
633 // //-----------------------------
\r
634 // r現在のステージ.On非活性化();
\r
635 // Trace.TraceInformation( "----------------------" );
\r
636 // Trace.TraceInformation( "■ オプション" );
\r
637 // stageオプション.On活性化();
\r
638 // r直前のステージ = r現在のステージ;
\r
639 // r現在のステージ = stageオプション;
\r
640 // //-----------------------------
\r
645 case (int)CStageタイトル.E戻り値.CONFIG:
\r
647 //-----------------------------
\r
649 Trace.TraceInformation( "----------------------" );
\r
650 Trace.TraceInformation( "■ コンフィグ" );
\r
651 stageコンフィグ.On活性化();
\r
652 r直前のステージ = r現在のステージ;
\r
653 r現在のステージ = stageコンフィグ;
\r
654 //-----------------------------
\r
658 case (int)CStageタイトル.E戻り値.EXIT:
\r
660 //-----------------------------
\r
662 Trace.TraceInformation( "----------------------" );
\r
663 Trace.TraceInformation( "■ 終了" );
\r
665 r直前のステージ = r現在のステージ;
\r
666 r現在のステージ = stage終了;
\r
667 //-----------------------------
\r
672 foreach( STPlugin pg in this.listプラグイン )
\r
674 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
675 pg.plugin.Onステージ変更();
\r
676 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
679 this.tガベージコレクションを実行する();
\r
680 //-----------------------------
\r
684 // case CStage.Eステージ.オプション:
\r
686 // //-----------------------------
\r
687 // if( this.n進行描画の戻り値 != 0 )
\r
689 // switch( r直前のステージ.eステージID )
\r
691 // case CStage.Eステージ.タイトル:
\r
693 // //-----------------------------
\r
694 // r現在のステージ.On非活性化();
\r
695 // Trace.TraceInformation( "----------------------" );
\r
696 // Trace.TraceInformation( "■ タイトル" );
\r
697 // stageタイトル.On活性化();
\r
698 // r直前のステージ = r現在のステージ;
\r
699 // r現在のステージ = stageタイトル;
\r
701 // foreach( STPlugin pg in this.listプラグイン )
\r
703 // Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
704 // pg.plugin.Onステージ変更();
\r
705 // Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
708 // this.tガベージコレクションを実行する();
\r
710 // //-----------------------------
\r
713 // case CStage.Eステージ.選曲:
\r
715 // //-----------------------------
\r
716 // r現在のステージ.On非活性化();
\r
717 // Trace.TraceInformation( "----------------------" );
\r
718 // Trace.TraceInformation( "■ 選曲" );
\r
719 // stage選曲.On活性化();
\r
720 // r直前のステージ = r現在のステージ;
\r
721 // r現在のステージ = stage選曲;
\r
723 // foreach( STPlugin pg in this.listプラグイン )
\r
725 // Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
726 // pg.plugin.Onステージ変更();
\r
727 // Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
730 // this.tガベージコレクションを実行する();
\r
732 // //-----------------------------
\r
736 // //-----------------------------
\r
740 case CStage.Eステージ.コンフィグ:
\r
742 //-----------------------------
\r
743 if( this.n進行描画の戻り値 != 0 )
\r
745 switch( r直前のステージ.eステージID )
\r
747 case CStage.Eステージ.タイトル:
\r
749 //-----------------------------
\r
751 Trace.TraceInformation( "----------------------" );
\r
752 Trace.TraceInformation( "■ タイトル" );
\r
754 r直前のステージ = r現在のステージ;
\r
755 r現在のステージ = stageタイトル;
\r
757 foreach( STPlugin pg in this.listプラグイン )
\r
759 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
760 pg.plugin.Onステージ変更();
\r
761 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
764 this.tガベージコレクションを実行する();
\r
766 //-----------------------------
\r
769 case CStage.Eステージ.選曲:
\r
771 //-----------------------------
\r
773 Trace.TraceInformation( "----------------------" );
\r
774 Trace.TraceInformation( "■ 選曲" );
\r
776 r直前のステージ = r現在のステージ;
\r
777 r現在のステージ = stage選曲;
\r
779 foreach( STPlugin pg in this.listプラグイン )
\r
781 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
782 pg.plugin.Onステージ変更();
\r
783 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
786 this.tガベージコレクションを実行する();
\r
788 //-----------------------------
\r
792 //-----------------------------
\r
796 case CStage.Eステージ.選曲:
\r
798 //-----------------------------
\r
799 switch( this.n進行描画の戻り値 )
\r
801 case (int) CStage選曲.E戻り値.タイトルに戻る:
\r
803 //-----------------------------
\r
805 Trace.TraceInformation( "----------------------" );
\r
806 Trace.TraceInformation( "■ タイトル" );
\r
808 r直前のステージ = r現在のステージ;
\r
809 r現在のステージ = stageタイトル;
\r
811 foreach( STPlugin pg in this.listプラグイン )
\r
813 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
814 pg.plugin.Onステージ変更();
\r
815 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
818 this.tガベージコレクションを実行する();
\r
820 //-----------------------------
\r
823 case (int) CStage選曲.E戻り値.選曲した:
\r
825 //-----------------------------
\r
827 Trace.TraceInformation( "----------------------" );
\r
828 Trace.TraceInformation( "■ 曲読み込み" );
\r
829 stage曲読み込み.On活性化();
\r
830 r直前のステージ = r現在のステージ;
\r
831 r現在のステージ = stage曲読み込み;
\r
833 foreach( STPlugin pg in this.listプラグイン )
\r
835 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
836 pg.plugin.Onステージ変更();
\r
837 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
840 this.tガベージコレクションを実行する();
\r
842 //-----------------------------
\r
845 // case (int) CStage選曲.E戻り値.オプション呼び出し:
\r
847 // //-----------------------------
\r
848 // r現在のステージ.On非活性化();
\r
849 // Trace.TraceInformation( "----------------------" );
\r
850 // Trace.TraceInformation( "■ オプション" );
\r
851 // stageオプション.On活性化();
\r
852 // r直前のステージ = r現在のステージ;
\r
853 // r現在のステージ = stageオプション;
\r
855 // foreach( STPlugin pg in this.listプラグイン )
\r
857 // Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
858 // pg.plugin.Onステージ変更();
\r
859 // Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
862 // this.tガベージコレクションを実行する();
\r
864 // //-----------------------------
\r
867 case (int) CStage選曲.E戻り値.コンフィグ呼び出し:
\r
869 //-----------------------------
\r
871 Trace.TraceInformation( "----------------------" );
\r
872 Trace.TraceInformation( "■ コンフィグ" );
\r
873 stageコンフィグ.On活性化();
\r
874 r直前のステージ = r現在のステージ;
\r
875 r現在のステージ = stageコンフィグ;
\r
877 foreach( STPlugin pg in this.listプラグイン )
\r
879 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
880 pg.plugin.Onステージ変更();
\r
881 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
884 this.tガベージコレクションを実行する();
\r
886 //-----------------------------
\r
889 case (int) CStage選曲.E戻り値.スキン変更:
\r
892 //-----------------------------
\r
894 Trace.TraceInformation( "----------------------" );
\r
895 Trace.TraceInformation( "■ スキン切り替え" );
\r
896 stageChangeSkin.On活性化();
\r
897 r直前のステージ = r現在のステージ;
\r
898 r現在のステージ = stageChangeSkin;
\r
900 //-----------------------------
\r
903 //-----------------------------
\r
907 case CStage.Eステージ.曲読み込み:
\r
909 //-----------------------------
\r
910 if( this.n進行描画の戻り値 != 0 )
\r
912 CDTXMania.Pad.st検知したデバイス.Clear(); // 入力デバイスフラグクリア(2010.9.11)
\r
915 if( !ConfigIni.bギタレボモード )
\r
917 Trace.TraceInformation( "----------------------" );
\r
918 Trace.TraceInformation( "■ 演奏(ドラム画面)" );
\r
919 #if false // #23625 2011.1.11 Config.iniからダメージ/回復値の定数変更を行う場合はここを有効にする 087リリースに合わせ機能無効化
\r
920 for (int i = 0; i < 5; i++)
\r
922 for (int j = 0; j < 2; j++)
\r
924 stage演奏ドラム画面.fDamageGaugeDelta[i, j] = ConfigIni.fGaugeFactor[i, j];
\r
927 for (int i = 0; i < 3; i++) {
\r
928 stage演奏ドラム画面.fDamageLevelFactor[i] = ConfigIni.fDamageLevelFactor[i];
\r
931 r直前のステージ = r現在のステージ;
\r
932 r現在のステージ = stage演奏ドラム画面;
\r
936 Trace.TraceInformation( "----------------------" );
\r
937 Trace.TraceInformation( "■ 演奏(ギター画面)" );
\r
938 #if false // #23625 2011.1.11 Config.iniからダメージ/回復値の定数変更を行う場合はここを有効にする 087リリースに合わせ機能無効化
\r
939 for (int i = 0; i < 5; i++)
\r
941 for (int j = 0; j < 2; j++)
\r
943 stage演奏ギター画面.fDamageGaugeDelta[i, j] = ConfigIni.fGaugeFactor[i, j];
\r
946 for (int i = 0; i < 3; i++) {
\r
947 stage演奏ギター画面.fDamageLevelFactor[i] = ConfigIni.fDamageLevelFactor[i];
\r
950 r直前のステージ = r現在のステージ;
\r
951 r現在のステージ = stage演奏ギター画面;
\r
954 foreach( STPlugin pg in this.listプラグイン )
\r
956 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
957 pg.plugin.Onステージ変更();
\r
958 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
961 this.tガベージコレクションを実行する();
\r
963 //-----------------------------
\r
967 case CStage.Eステージ.演奏:
\r
969 //-----------------------------
\r
970 switch( this.n進行描画の戻り値 )
\r
972 case (int) E演奏画面の戻り値.継続:
\r
975 case (int) E演奏画面の戻り値.演奏中断:
\r
976 #region [ 演奏キャンセル ]
\r
977 //-----------------------------
\r
978 scoreIni = this.tScoreIniへBGMAdjustとHistoryとPlayCountを更新( "Play canceled" );
\r
980 #region [ プラグイン On演奏キャンセル() の呼び出し ]
\r
981 //---------------------
\r
982 foreach( STPlugin pg in this.listプラグイン )
\r
984 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
985 pg.plugin.On演奏キャンセル( scoreIni );
\r
986 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
988 //---------------------
\r
996 base.Window.Close();
\r
1000 Trace.TraceInformation( "----------------------" );
\r
1001 Trace.TraceInformation( "■ 選曲" );
\r
1003 r直前のステージ = r現在のステージ;
\r
1004 r現在のステージ = stage選曲;
\r
1006 #region [ プラグイン Onステージ変更() の呼び出し ]
\r
1007 //---------------------
\r
1008 foreach( STPlugin pg in this.listプラグイン )
\r
1010 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1011 pg.plugin.Onステージ変更();
\r
1012 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1014 //---------------------
\r
1017 this.tガベージコレクションを実行する();
\r
1020 //-----------------------------
\r
1023 case (int) E演奏画面の戻り値.ステージ失敗:
\r
1024 #region [ 演奏失敗(StageFailed) ]
\r
1025 //-----------------------------
\r
1026 scoreIni = this.tScoreIniへBGMAdjustとHistoryとPlayCountを更新( "Stage failed" );
\r
1028 #region [ プラグイン On演奏失敗() の呼び出し ]
\r
1029 //---------------------
\r
1030 foreach( STPlugin pg in this.listプラグイン )
\r
1032 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1033 pg.plugin.On演奏失敗( scoreIni );
\r
1034 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1036 //---------------------
\r
1041 r現在のステージ.On非活性化();
\r
1044 base.Window.Close();
\r
1048 Trace.TraceInformation( "----------------------" );
\r
1049 Trace.TraceInformation( "■ 選曲" );
\r
1051 r直前のステージ = r現在のステージ;
\r
1052 r現在のステージ = stage選曲;
\r
1054 #region [ プラグイン Onステージ変更() の呼び出し ]
\r
1055 //---------------------
\r
1056 foreach( STPlugin pg in this.listプラグイン )
\r
1058 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1059 pg.plugin.Onステージ変更();
\r
1060 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1062 //---------------------
\r
1065 this.tガベージコレクションを実行する();
\r
1068 //-----------------------------
\r
1071 case (int) E演奏画面の戻り値.ステージクリア:
\r
1073 //-----------------------------
\r
1074 CScoreIni.C演奏記録 c演奏記録_Drums, c演奏記録_Guitar, c演奏記録_Bass;
\r
1075 CDTX.CChip[] chipArray = new CDTX.CChip[ 10 ];
\r
1076 if( ConfigIni.bギタレボモード )
\r
1078 stage演奏ギター画面.t演奏結果を格納する( out c演奏記録_Drums, out c演奏記録_Guitar, out c演奏記録_Bass );
\r
1082 stage演奏ドラム画面.t演奏結果を格納する( out c演奏記録_Drums, out c演奏記録_Guitar, out c演奏記録_Bass, out chipArray );
\r
1085 if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.24 yyagi Gt/Bsを入れ替えていたなら、演奏結果も入れ替える
\r
1087 CScoreIni.C演奏記録 t;
\r
1089 c演奏記録_Guitar = c演奏記録_Bass;
\r
1092 CDTXMania.DTX.SwapGuitarBassInfos(); // 譜面情報も元に戻す
\r
1093 CDTXMania.DTX.SwapGuitarBassInfos_AutoFlags(); // #24415 2011.2.27 yyagi
\r
1094 // リザルト集計時のみ、Auto系のフラグを入れ替え
\r
1095 // これを戻すのは、リザルト集計後。
\r
1096 } // "case CStage.Eステージ.結果:"のところ。
\r
1098 double ps = 0.0, gs = 0.0;
\r
1099 if ( !c演奏記録_Drums.b全AUTOである && c演奏記録_Drums.n全チップ数 > 0) {
\r
1100 ps = c演奏記録_Drums.db演奏型スキル値;
\r
1101 gs = c演奏記録_Drums.dbゲーム型スキル値;
\r
1103 else if ( !c演奏記録_Guitar.b全AUTOである && c演奏記録_Guitar.n全チップ数 > 0) {
\r
1104 ps = c演奏記録_Guitar.db演奏型スキル値;
\r
1105 gs = c演奏記録_Guitar.dbゲーム型スキル値;
\r
1109 ps = c演奏記録_Bass.db演奏型スキル値;
\r
1110 gs = c演奏記録_Bass.dbゲーム型スキル値;
\r
1112 string str = "Cleared";
\r
1113 switch( CScoreIni.t総合ランク値を計算して返す( c演奏記録_Drums, c演奏記録_Guitar, c演奏記録_Bass ) )
\r
1115 case (int)CScoreIni.ERANK.SS:
\r
1116 str = string.Format( "Cleared (SS: {0:F2})", ps );
\r
1119 case (int) CScoreIni.ERANK.S:
\r
1120 str = string.Format( "Cleared (S: {0:F2})", ps );
\r
1123 case (int) CScoreIni.ERANK.A:
\r
1124 str = string.Format( "Cleared (A: {0:F2})", ps );
\r
1127 case (int) CScoreIni.ERANK.B:
\r
1128 str = string.Format( "Cleared (B: {0:F2})", ps );
\r
1131 case (int) CScoreIni.ERANK.C:
\r
1132 str = string.Format( "Cleared (C: {0:F2})", ps );
\r
1135 case (int) CScoreIni.ERANK.D:
\r
1136 str = string.Format( "Cleared (D: {0:F2})", ps );
\r
1139 case (int) CScoreIni.ERANK.E:
\r
1140 str = string.Format( "Cleared (E: {0:F2})", ps );
\r
1143 case (int)CScoreIni.ERANK.UNKNOWN: // #23534 2010.10.28 yyagi add: 演奏チップが0個のとき
\r
1144 str = "Cleared (No chips)";
\r
1148 scoreIni = this.tScoreIniへBGMAdjustとHistoryとPlayCountを更新( str );
\r
1150 #region [ プラグイン On演奏クリア() の呼び出し ]
\r
1151 //---------------------
\r
1152 foreach( STPlugin pg in this.listプラグイン )
\r
1154 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1155 pg.plugin.On演奏クリア( scoreIni );
\r
1156 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1158 //---------------------
\r
1161 r現在のステージ.On非活性化();
\r
1162 Trace.TraceInformation( "----------------------" );
\r
1163 Trace.TraceInformation( "■ 結果" );
\r
1164 stage結果.st演奏記録.Drums = c演奏記録_Drums;
\r
1165 stage結果.st演奏記録.Guitar = c演奏記録_Guitar;
\r
1166 stage結果.st演奏記録.Bass = c演奏記録_Bass;
\r
1167 stage結果.r空うちドラムチップ = chipArray;
\r
1169 r直前のステージ = r現在のステージ;
\r
1170 r現在のステージ = stage結果;
\r
1172 #region [ プラグイン Onステージ変更() の呼び出し ]
\r
1173 //---------------------
\r
1174 foreach( STPlugin pg in this.listプラグイン )
\r
1176 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1177 pg.plugin.Onステージ変更();
\r
1178 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1180 //---------------------
\r
1184 //-----------------------------
\r
1187 //-----------------------------
\r
1191 case CStage.Eステージ.結果:
\r
1193 //-----------------------------
\r
1194 if( this.n進行描画の戻り値 != 0 )
\r
1196 if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24415 2011.2.27 yyagi Gt/Bsを入れ替えていたなら、Auto状態をリザルト画面終了後に元に戻す
\r
1198 CDTXMania.DTX.SwapGuitarBassInfos_AutoFlags(); // Auto入れ替え
\r
1201 DTX.t全チップの再生一時停止();
\r
1203 r現在のステージ.On非活性化();
\r
1206 Trace.TraceInformation( "----------------------" );
\r
1207 Trace.TraceInformation( "■ 選曲" );
\r
1209 r直前のステージ = r現在のステージ;
\r
1210 r現在のステージ = stage選曲;
\r
1212 foreach( STPlugin pg in this.listプラグイン )
\r
1214 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1215 pg.plugin.Onステージ変更();
\r
1216 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1219 this.tガベージコレクションを実行する();
\r
1223 base.Window.Close();
\r
1226 //-----------------------------
\r
1230 case CStage.Eステージ.ChangeSkin:
\r
1232 //-----------------------------
\r
1233 if ( this.n進行描画の戻り値 != 0 )
\r
1235 r現在のステージ.On非活性化();
\r
1236 Trace.TraceInformation( "----------------------" );
\r
1237 Trace.TraceInformation( "■ 選曲" );
\r
1239 r直前のステージ = r現在のステージ;
\r
1240 r現在のステージ = stage選曲;
\r
1241 this.tガベージコレクションを実行する();
\r
1243 //-----------------------------
\r
1247 case CStage.Eステージ.終了:
\r
1249 //-----------------------------
\r
1250 if( this.n進行描画の戻り値 != 0 )
\r
1254 //-----------------------------
\r
1259 actFlushGPU.On進行描画(); // Flush GPU
\r
1260 this.Device.EndScene();
\r
1262 #region [ 全画面・ウインドウ切り替え ]
\r
1263 if ( this.b次のタイミングで全画面・ウィンドウ切り替えを行う )
\r
1265 ConfigIni.b全画面モード = !ConfigIni.b全画面モード;
\r
1266 app.t全画面・ウィンドウモード切り替え();
\r
1267 this.b次のタイミングで全画面・ウィンドウ切り替えを行う = false;
\r
1270 #region [ 垂直基線同期切り替え ]
\r
1271 if ( this.b次のタイミングで垂直帰線同期切り替えを行う )
\r
1273 bool bIsMaximized = this.Window.IsMaximized; // #23510 2010.11.3 yyagi: to backup current window mode before changing VSyncWait
\r
1274 currentClientSize = this.Window.ClientSize; // #23510 2010.11.3 yyagi: to backup current window size before changing VSyncWait
\r
1275 DeviceSettings currentSettings = app.GraphicsDeviceManager.CurrentSettings;
\r
1276 currentSettings.EnableVSync = ConfigIni.b垂直帰線待ちを行う;
\r
1277 app.GraphicsDeviceManager.ChangeDevice( currentSettings );
\r
1278 this.b次のタイミングで垂直帰線同期切り替えを行う = false;
\r
1279 base.Window.ClientSize = new Size(currentClientSize.Width, currentClientSize.Height); // #23510 2010.11.3 yyagi: to resume window size after changing VSyncWait
\r
1282 this.Window.WindowState = FormWindowState.Maximized; // #23510 2010.11.3 yyagi: to resume window mode after changing VSyncWait
\r
1287 if ( ConfigIni.nフレーム毎スリープms >= 0 ) // #xxxxx 2011.11.27 yyagi
\r
1289 Thread.Sleep( ConfigIni.nフレーム毎スリープms );
\r
1296 #region [ 汎用ヘルパー ]
\r
1297 //-----------------
\r
1298 public static CTexture tテクスチャの生成( string fileName )
\r
1300 return tテクスチャの生成( fileName, false );
\r
1302 public static CTexture tテクスチャの生成( string fileName, bool b黒を透過する )
\r
1304 if ( app == null )
\r
1310 return new CTexture( app.Device, fileName, TextureFormat, b黒を透過する );
\r
1312 catch ( CTextureCreateFailedException )
\r
1314 Trace.TraceError( "テクスチャの生成に失敗しました。({0})", fileName );
\r
1317 catch ( FileNotFoundException )
\r
1319 Trace.TraceError( "テクスチャファイルが見つかりませんでした。({0})", fileName );
\r
1323 public static void tテクスチャの解放( ref CTexture tx )
\r
1325 CDTXMania.t安全にDisposeする( ref tx );
\r
1328 public static CTexture tテクスチャの生成( byte[] txData )
\r
1330 return tテクスチャの生成( txData, false );
\r
1332 public static CTexture tテクスチャの生成( byte[] txData, bool b黒を透過する )
\r
1334 if ( app == null )
\r
1340 return new CTexture( app.Device, txData, TextureFormat, b黒を透過する );
\r
1342 catch ( CTextureCreateFailedException )
\r
1344 Trace.TraceError( "テクスチャの生成に失敗しました。(txData)" );
\r
1349 public static CTexture tテクスチャの生成( Bitmap bitmap )
\r
1351 return tテクスチャの生成( bitmap, false );
\r
1353 public static CTexture tテクスチャの生成( Bitmap bitmap, bool b黒を透過する )
\r
1355 if ( app == null )
\r
1361 return new CTexture( app.Device, bitmap, TextureFormat, b黒を透過する );
\r
1363 catch ( CTextureCreateFailedException )
\r
1365 Trace.TraceError( "テクスチャの生成に失敗しました。(txData)" );
\r
1370 /// <summary>プロパティ、インデクサには ref は使用できないので注意。</summary>
\r
1371 public static void t安全にDisposeする<T>( ref T obj )
\r
1373 if ( obj == null )
\r
1376 var d = obj as IDisposable;
\r
1381 obj = default( T );
\r
1383 //-----------------
\r
1386 #region [ private ]
\r
1387 //-----------------
\r
1388 private bool bマウスカーソル表示中 = true;
\r
1389 private bool b終了処理完了済み;
\r
1390 private static CDTX dtx;
\r
1391 private List<CActivity> listトップレベルActivities;
\r
1392 private int n進行描画の戻り値;
\r
1393 private MouseButtons mb = System.Windows.Forms.MouseButtons.Left;
\r
1395 private void t起動処理()
\r
1397 #region [ strEXEのあるフォルダを決定する ]
\r
1398 //-----------------
\r
1399 // BEGIN #23629 2010.11.13 from: デバッグ時は Application.ExecutablePath が ($SolutionDir)/bin/x86/Debug/ などになり System/ の読み込みに失敗するので、カレントディレクトリを採用する。(プロジェクトのプロパティ→デバッグ→作業ディレクトリが有効になる)
\r
1401 strEXEのあるフォルダ = Environment.CurrentDirectory + @"\";
\r
1403 strEXEのあるフォルダ = Path.GetDirectoryName( Application.ExecutablePath ) + @"\"; // #23629 2010.11.9 yyagi: set correct pathname where DTXManiaGR.exe is.
\r
1405 // END #23629 2010.11.13 from
\r
1406 //-----------------
\r
1409 #region [ Config.ini の読込み ]
\r
1410 //---------------------
\r
1411 ConfigIni = new CConfigIni();
\r
1412 string path = strEXEのあるフォルダ + "Config.ini";
\r
1413 if( File.Exists( path ) )
\r
1417 ConfigIni.tファイルから読み込み( path );
\r
1418 this.Window.EnableSystemMenu = CDTXMania.ConfigIni.bIsEnabledSystemMenu; // #28200 2011.5.1 yyagi
\r
1422 //ConfigIni = new CConfigIni(); // 存在してなければ新規生成
\r
1425 //---------------------
\r
1427 #region [ ログ出力開始 ]
\r
1428 //---------------------
\r
1429 Trace.AutoFlush = true;
\r
1430 if( ConfigIni.bログ出力 )
\r
1434 Trace.Listeners.Add( new CTraceLogListener( new StreamWriter( "DTXManiaLog.txt", false, Encoding.GetEncoding( "shift-jis" ) ) ) );
\r
1436 catch ( System.UnauthorizedAccessException ) // #24481 2011.2.20 yyagi
\r
1438 int c = (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja")? 0 : 1;
\r
1439 string[] mes_writeErr = {
\r
1440 "DTXManiaLog.txtへの書き込みができませんでした。書き込みできるようにしてから、再度起動してください。",
\r
1441 "Failed to write DTXManiaLog.txt. Please set it writable and try again."
\r
1443 MessageBox.Show( mes_writeErr[c], "DTXMania boot error", MessageBoxButtons.OK, MessageBoxIcon.Error );
\r
1444 Environment.Exit(1);
\r
1447 Trace.WriteLine("");
\r
1448 Trace.WriteLine( "DTXMania powered by YAMAHA Silent Session Drums" );
\r
1449 Trace.WriteLine( string.Format( "Release: {0}", VERSION ) );
\r
1450 Trace.WriteLine( "" );
\r
1451 Trace.TraceInformation( "----------------------" );
\r
1452 Trace.TraceInformation( "■ アプリケーションの初期化" );
\r
1453 Trace.TraceInformation( "OS Version: " + Environment.OSVersion );
\r
1454 Trace.TraceInformation( "ProcessorCount: " + Environment.ProcessorCount.ToString() );
\r
1455 Trace.TraceInformation( "CLR Version: " + Environment.Version.ToString() );
\r
1456 //---------------------
\r
1458 #region [ コンパクトモードスイッチの有無 ]
\r
1459 //---------------------
\r
1460 bコンパクトモード = false;
\r
1461 strコンパクトモードファイル = "";
\r
1462 string[] commandLineArgs = Environment.GetCommandLineArgs();
\r
1463 if( ( commandLineArgs != null ) && ( commandLineArgs.Length > 1 ) )
\r
1466 strコンパクトモードファイル = commandLineArgs[ 1 ];
\r
1467 Trace.TraceInformation( "コンパクトモードで起動します。[{0}]", strコンパクトモードファイル );
\r
1469 //---------------------
\r
1472 #region [ ウィンドウ初期化 ]
\r
1473 //---------------------
\r
1474 base.Window.Text = "DTXMania .NET style release " + VERSION;
\r
1475 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
1476 if (!ConfigIni.bウィンドウモード) // #23510 2010.11.02 yyagi: add; to recover window size in case bootup with fullscreen mode
\r
1478 currentClientSize = new Size(ConfigIni.nウインドウwidth, ConfigIni.nウインドウheight);
\r
1480 base.Window.MaximizeBox = true; // #23510 2010.11.04 yyagi: to support maximizing window
\r
1481 base.Window.FormBorderStyle = FormBorderStyle.Sizable; // #23510 2010.10.27 yyagi: changed from FixedDialog to Sizable, to support window resize
\r
1482 base.Window.ShowIcon = true;
\r
1483 base.Window.Icon = Properties.Resources.dtx;
\r
1484 base.Window.KeyDown += new KeyEventHandler( this.Window_KeyDown );
\r
1485 base.Window.MouseUp +=new MouseEventHandler( this.Window_MouseUp);
\r
1486 base.Window.MouseDoubleClick += new MouseEventHandler(this.Window_MouseDoubleClick); // #23510 2010.11.13 yyagi: to go fullscreen mode
\r
1487 base.Window.ResizeEnd += new EventHandler(this.Window_ResizeEnd); // #23510 2010.11.20 yyagi: to set resized window size in Config.ini
\r
1488 base.Window.ApplicationActivated += new EventHandler(this.Window_ApplicationActivated);
\r
1489 base.Window.ApplicationDeactivated += new EventHandler( this.Window_ApplicationDeactivated );
\r
1490 //---------------------
\r
1492 #region [ Direct3D9Exを使うかどうか判定 ]
\r
1494 #region [ Direct3D9 デバイスの生成 ]
\r
1495 //---------------------
\r
1496 DeviceSettings settings = new DeviceSettings();
\r
1497 settings.Windowed = ConfigIni.bウィンドウモード;
\r
1498 settings.BackBufferWidth = SampleFramework.GameWindowSize.Width;
\r
1499 settings.BackBufferHeight = SampleFramework.GameWindowSize.Height;
\r
1500 // settings.BackBufferCount = 3;
\r
1501 settings.EnableVSync = ConfigIni.b垂直帰線待ちを行う;
\r
1506 base.GraphicsDeviceManager.ChangeDevice(settings);
\r
1508 catch (DeviceCreationException e)
\r
1510 Trace.TraceError(e.ToString());
\r
1511 MessageBox.Show(e.Message + e.ToString(), "DTXMania failed to boot: DirectX9 Initialize Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1512 Environment.Exit(-1);
\r
1515 base.IsFixedTimeStep = false;
\r
1516 // base.TargetElapsedTime = TimeSpan.FromTicks( 10000000 / 75 );
\r
1517 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
1518 base.InactiveSleepTime = TimeSpan.FromMilliseconds((float)(ConfigIni.n非フォーカス時スリープms)); // #23568 2010.11.3 yyagi: to support valiable sleep value when !IsActive
\r
1519 // #23568 2010.11.4 ikanick changed ( 1 -> ConfigIni )
\r
1520 actFlushGPU = new CActFlushGPU();
\r
1521 //---------------------
\r
1526 #region [ Skin の初期化 ]
\r
1527 //---------------------
\r
1528 Trace.TraceInformation( "スキンの初期化を行います。" );
\r
1532 Skin = new CSkin( CDTXMania.ConfigIni.strSystemSkinSubfolderFullName, CDTXMania.ConfigIni.bUseBoxDefSkin );
\r
1533 CDTXMania.ConfigIni.strSystemSkinSubfolderFullName = CDTXMania.Skin.GetCurrentSkinSubfolderFullName( true ); // 旧指定のSkinフォルダが消滅していた場合に備える
\r
1534 Trace.TraceInformation( "スキンの初期化を完了しました。" );
\r
1538 Trace.TraceInformation( "スキンの初期化に失敗しました。" );
\r
1545 //---------------------
\r
1547 // ct = new CTimer( CTimer.E種別.PerformanceCounter );
\r
1549 #region [ Timer の初期化 ]
\r
1550 //---------------------
\r
1551 Trace.TraceInformation( "タイマの初期化を行います。" );
\r
1555 Timer = new CTimer( CTimer.E種別.MultiMedia );
\r
1556 Trace.TraceInformation( "タイマの初期化を完了しました。" );
\r
1562 //---------------------
\r
1564 #region [ FPS カウンタの初期化 ]
\r
1565 //---------------------
\r
1566 Trace.TraceInformation( "FPSカウンタの初期化を行います。" );
\r
1571 Trace.TraceInformation( "FPSカウンタを生成しました。" );
\r
1577 //---------------------
\r
1579 #region [ act文字コンソールの初期化 ]
\r
1580 //---------------------
\r
1581 Trace.TraceInformation( "文字コンソールの初期化を行います。" );
\r
1585 act文字コンソール = new C文字コンソール();
\r
1586 Trace.TraceInformation( "文字コンソールを生成しました。" );
\r
1587 act文字コンソール.On活性化();
\r
1588 Trace.TraceInformation( "文字コンソールを活性化しました。" );
\r
1589 Trace.TraceInformation( "文字コンソールの初期化を完了しました。" );
\r
1591 catch( Exception exception )
\r
1593 Trace.TraceError( exception.Message );
\r
1594 Trace.TraceError( "文字コンソールの初期化に失敗しました。" );
\r
1600 //---------------------
\r
1602 #region [ Input管理 の初期化 ]
\r
1603 //---------------------
\r
1604 Trace.TraceInformation( "DirectInput, MIDI入力の初期化を行います。" );
\r
1608 Input管理 = new CInput管理( base.Window.Handle );
\r
1609 foreach( IInputDevice device in Input管理.list入力デバイス )
\r
1611 if( ( device.e入力デバイス種別 == E入力デバイス種別.Joystick ) && !ConfigIni.dicJoystick.ContainsValue( device.GUID ) )
\r
1614 while( ConfigIni.dicJoystick.ContainsKey( key ) )
\r
1618 ConfigIni.dicJoystick.Add( key, device.GUID );
\r
1621 foreach( IInputDevice device2 in Input管理.list入力デバイス )
\r
1623 if( device2.e入力デバイス種別 == E入力デバイス種別.Joystick )
\r
1625 foreach( KeyValuePair<int, string> pair in ConfigIni.dicJoystick )
\r
1627 if( device2.GUID.Equals( pair.Value ) )
\r
1629 ( (CInputJoystick) device2 ).SetID( pair.Key );
\r
1636 Trace.TraceInformation( "DirectInput の初期化を完了しました。" );
\r
1638 catch( Exception exception2 )
\r
1640 Trace.TraceError( exception2.Message );
\r
1641 Trace.TraceError( "DirectInput, MIDI入力の初期化に失敗しました。" );
\r
1648 //---------------------
\r
1650 #region [ Pad の初期化 ]
\r
1651 //---------------------
\r
1652 Trace.TraceInformation( "パッドの初期化を行います。" );
\r
1656 Pad = new CPad( ConfigIni, Input管理 );
\r
1657 Trace.TraceInformation( "パッドの初期化を完了しました。" );
\r
1659 catch( Exception exception3 )
\r
1661 Trace.TraceError( exception3.Message );
\r
1662 Trace.TraceError( "パッドの初期化に失敗しました。" );
\r
1668 //---------------------
\r
1670 #region [ Sound管理 の初期化 ]
\r
1671 //---------------------
\r
1672 Trace.TraceInformation( "サウンドデバイスの初期化を行います。" );
\r
1676 ESoundDeviceType soundDeviceType;
\r
1677 switch ( CDTXMania.ConfigIni.nSoundDeviceType )
\r
1680 soundDeviceType = ESoundDeviceType.DirectSound;
\r
1683 soundDeviceType = ESoundDeviceType.ASIO;
\r
1686 soundDeviceType = ESoundDeviceType.ExclusiveWASAPI;
\r
1689 soundDeviceType = ESoundDeviceType.Unknown;
\r
1692 Sound管理 = new CSound管理( base.Window.Handle, soundDeviceType );
\r
1693 Sound管理.SetSoundBufferSizeASIO( CDTXMania.ConfigIni.nASIOBufferSize );
\r
1694 base.Window.Text += " (" + Sound管理.GetCurrentSoundDeviceType() + ")";
\r
1695 Trace.TraceInformation( "サウンドデバイスの初期化を完了しました。" );
\r
1697 catch (Exception e)
\r
1699 Trace.TraceError( e.Message );
\r
1706 //---------------------
\r
1708 #region [ Songs管理 の初期化 ]
\r
1709 //---------------------
\r
1710 Trace.TraceInformation( "曲リストの初期化を行います。" );
\r
1714 Songs管理 = new CSongs管理();
\r
1715 // Songs管理_裏読 = new CSongs管理();
\r
1716 EnumSongs = new CEnumSongs();
\r
1717 actEnumSongs = new CActEnumSongs();
\r
1718 Trace.TraceInformation( "曲リストの初期化を完了しました。" );
\r
1720 catch( Exception e )
\r
1722 Trace.TraceError( e.Message );
\r
1723 Trace.TraceError( "曲リストの初期化に失敗しました。" );
\r
1729 //---------------------
\r
1731 #region [ CAvi の初期化 ]
\r
1732 //---------------------
\r
1734 //---------------------
\r
1736 #region [ Random の初期化 ]
\r
1737 //---------------------
\r
1738 Random = new Random( (int) Timer.nシステム時刻 );
\r
1739 //---------------------
\r
1741 #region [ ステージの初期化 ]
\r
1742 //---------------------
\r
1745 stage起動 = new CStage起動();
\r
1746 stageタイトル = new CStageタイトル();
\r
1747 // stageオプション = new CStageオプション();
\r
1748 stageコンフィグ = new CStageコンフィグ();
\r
1749 stage選曲 = new CStage選曲();
\r
1750 stage曲読み込み = new CStage曲読み込み();
\r
1751 stage演奏ドラム画面 = new CStage演奏ドラム画面();
\r
1752 stage演奏ギター画面 = new CStage演奏ギター画面();
\r
1753 stage結果 = new CStage結果();
\r
1754 stageChangeSkin = new CStageChangeSkin();
\r
1755 stage終了 = new CStage終了();
\r
1756 this.listトップレベルActivities = new List<CActivity>();
\r
1757 this.listトップレベルActivities.Add( actEnumSongs );
\r
1758 this.listトップレベルActivities.Add( act文字コンソール );
\r
1759 this.listトップレベルActivities.Add( stage起動 );
\r
1760 this.listトップレベルActivities.Add( stageタイトル );
\r
1761 // this.listトップレベルActivities.Add( stageオプション );
\r
1762 this.listトップレベルActivities.Add( stageコンフィグ );
\r
1763 this.listトップレベルActivities.Add( stage選曲 );
\r
1764 this.listトップレベルActivities.Add( stage曲読み込み );
\r
1765 this.listトップレベルActivities.Add( stage演奏ドラム画面 );
\r
1766 this.listトップレベルActivities.Add( stage演奏ギター画面 );
\r
1767 this.listトップレベルActivities.Add( stage結果 );
\r
1768 this.listトップレベルActivities.Add( stageChangeSkin );
\r
1769 this.listトップレベルActivities.Add( stage終了 );
\r
1770 this.listトップレベルActivities.Add( actFlushGPU );
\r
1771 //---------------------
\r
1773 #region [ プラグインの検索と生成 ]
\r
1774 //---------------------
\r
1775 PluginHost = new CPluginHost();
\r
1777 Trace.TraceInformation( "プラグインの検索と生成を行います。" );
\r
1781 this.tプラグイン検索と生成();
\r
1782 Trace.TraceInformation( "プラグインの検索と生成を完了しました。" );
\r
1788 //---------------------
\r
1790 #region [ プラグインの初期化 ]
\r
1791 //---------------------
\r
1792 if( this.listプラグイン != null && this.listプラグイン.Count > 0 )
\r
1794 Trace.TraceInformation( "プラグインの初期化を行います。" );
\r
1798 foreach( STPlugin st in this.listプラグイン )
\r
1800 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
1801 st.plugin.On初期化( this.PluginHost );
\r
1802 st.plugin.OnManagedリソースの作成();
\r
1803 st.plugin.OnUnmanagedリソースの作成();
\r
1804 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1806 Trace.TraceInformation( "すべてのプラグインの初期化を完了しました。" );
\r
1810 Trace.TraceError( "プラグインのどれかの初期化に失敗しました。" );
\r
1819 //---------------------
\r
1822 // Sound管理.t再生中の処理をする() を、別スレッドで50ms周期で実行する
\r
1823 //System.Threading.Thread t =
\r
1824 //new System.Threading.Thread(
\r
1825 //new System.Threading.ThreadStart( Sound管理.t再生中の処理をする_loop ) );
\r
1826 //t.IsBackground = true;
\r
1829 Trace.TraceInformation( "アプリケーションの初期化を完了しました。" );
\r
1831 #region [ 最初のステージの起動 ]
\r
1832 //---------------------
\r
1833 Trace.TraceInformation( "----------------------" );
\r
1834 Trace.TraceInformation( "■ 起動" );
\r
1836 if ( CDTXMania.bコンパクトモード )
\r
1838 r現在のステージ = stage曲読み込み;
\r
1842 r現在のステージ = stage起動;
\r
1845 //---------------------
\r
1849 private void t終了処理()
\r
1851 if( !this.b終了処理完了済み )
\r
1853 Trace.TraceInformation( "----------------------" );
\r
1854 Trace.TraceInformation( "■ アプリケーションの終了" );
\r
1855 #region [ 曲検索の終了処理 ]
\r
1856 //---------------------
\r
1857 if ( actEnumSongs != null )
\r
1859 Trace.TraceInformation( "曲検索actの終了処理を行います。" );
\r
1863 actEnumSongs.On非活性化();
\r
1864 actEnumSongs= null;
\r
1865 Trace.TraceInformation( "曲検索actの終了処理を完了しました。" );
\r
1867 catch ( Exception e )
\r
1869 Trace.TraceError( e.Message );
\r
1870 Trace.TraceError( "曲検索actの終了処理に失敗しました。" );
\r
1877 //---------------------
\r
1879 #region [ 現在のステージの終了処理 ]
\r
1880 //---------------------
\r
1881 if( CDTXMania.r現在のステージ != null && CDTXMania.r現在のステージ.b活性化してる ) // #25398 2011.06.07 MODIFY FROM
\r
1883 Trace.TraceInformation( "現在のステージを終了します。" );
\r
1887 r現在のステージ.On非活性化();
\r
1888 Trace.TraceInformation( "現在のステージの終了処理を完了しました。" );
\r
1895 //---------------------
\r
1897 #region [ プラグインの終了処理 ]
\r
1898 //---------------------
\r
1899 if (this.listプラグイン != null && this.listプラグイン.Count > 0)
\r
1901 Trace.TraceInformation( "すべてのプラグインを終了します。" );
\r
1905 foreach( STPlugin st in this.listプラグイン )
\r
1907 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
1908 st.plugin.OnUnmanagedリソースの解放();
\r
1909 st.plugin.OnManagedリソースの解放();
\r
1911 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1913 PluginHost = null;
\r
1914 Trace.TraceInformation( "すべてのプラグインの終了処理を完了しました。" );
\r
1921 //---------------------
\r
1923 #region [ 曲リストの終了処理 ]
\r
1924 //---------------------
\r
1925 if (Songs管理 != null)
\r
1927 Trace.TraceInformation( "曲リストの終了処理を行います。" );
\r
1932 Trace.TraceInformation( "曲リストの終了処理を完了しました。" );
\r
1934 catch( Exception exception )
\r
1936 Trace.TraceError( exception.Message );
\r
1937 Trace.TraceError( "曲リストの終了処理に失敗しました。" );
\r
1945 //---------------------
\r
1947 #region [ スキンの終了処理 ]
\r
1948 //---------------------
\r
1951 Trace.TraceInformation( "スキンの終了処理を行います。" );
\r
1957 Trace.TraceInformation( "スキンの終了処理を完了しました。" );
\r
1959 catch( Exception exception2 )
\r
1961 Trace.TraceError( exception2.Message );
\r
1962 Trace.TraceError( "スキンの終了処理に失敗しました。" );
\r
1969 //---------------------
\r
1971 #region [ DirectSoundの終了処理 ]
\r
1972 //---------------------
\r
1973 if (Sound管理 != null)
\r
1975 Trace.TraceInformation( "DirectSound の終了処理を行います。" );
\r
1979 Sound管理.Dispose();
\r
1981 Trace.TraceInformation( "DirectSound の終了処理を完了しました。" );
\r
1983 catch( Exception exception3 )
\r
1985 Trace.TraceError( exception3.Message );
\r
1986 Trace.TraceError( "DirectSound の終了処理に失敗しました。" );
\r
1993 //---------------------
\r
1995 #region [ パッドの終了処理 ]
\r
1996 //---------------------
\r
1999 Trace.TraceInformation( "パッドの終了処理を行います。" );
\r
2004 Trace.TraceInformation( "パッドの終了処理を完了しました。" );
\r
2006 catch( Exception exception4 )
\r
2008 Trace.TraceError( exception4.Message );
\r
2009 Trace.TraceError( "パッドの終了処理に失敗しました。" );
\r
2016 //---------------------
\r
2018 #region [ DirectInput, MIDI入力の終了処理 ]
\r
2019 //---------------------
\r
2020 if (Input管理 != null)
\r
2022 Trace.TraceInformation( "DirectInput, MIDI入力の終了処理を行います。" );
\r
2026 Input管理.Dispose();
\r
2028 Trace.TraceInformation( "DirectInput, MIDI入力の終了処理を完了しました。" );
\r
2030 catch( Exception exception5 )
\r
2032 Trace.TraceError( exception5.Message );
\r
2033 Trace.TraceError( "DirectInput, MIDI入力の終了処理に失敗しました。" );
\r
2040 //---------------------
\r
2042 #region [ 文字コンソールの終了処理 ]
\r
2043 //---------------------
\r
2044 if (act文字コンソール != null)
\r
2046 Trace.TraceInformation( "文字コンソールの終了処理を行います。" );
\r
2050 act文字コンソール.On非活性化();
\r
2051 act文字コンソール = null;
\r
2052 Trace.TraceInformation( "文字コンソールの終了処理を完了しました。" );
\r
2054 catch( Exception exception6 )
\r
2056 Trace.TraceError( exception6.Message );
\r
2057 Trace.TraceError( "文字コンソールの終了処理に失敗しました。" );
\r
2064 //---------------------
\r
2066 #region [ FPSカウンタの終了処理 ]
\r
2067 //---------------------
\r
2068 Trace.TraceInformation("FPSカウンタの終了処理を行います。");
\r
2076 Trace.TraceInformation( "FPSカウンタの終了処理を完了しました。" );
\r
2082 //---------------------
\r
2087 #region [ タイマの終了処理 ]
\r
2088 //---------------------
\r
2089 Trace.TraceInformation("タイマの終了処理を行います。");
\r
2093 if( Timer != null )
\r
2097 Trace.TraceInformation( "タイマの終了処理を完了しました。" );
\r
2101 Trace.TraceInformation( "タイマは使用されていません。" );
\r
2108 //---------------------
\r
2110 #region [ Config.iniの出力 ]
\r
2111 //---------------------
\r
2112 Trace.TraceInformation("Config.ini を出力します。");
\r
2113 // if ( ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.16 yyagi ギターベースがスワップしているときは元に戻す
\r
2114 if ( ConfigIni.bIsSwappedGuitarBass_AutoFlagsAreSwapped ) // #24415 2011.2.21 yyagi FLIP中かつ演奏中にalt-f4で終了したときは、AUTOのフラグをswapして戻す
\r
2116 DTX.SwapGuitarBassInfos_AutoFlags();
\r
2118 string str = strEXEのあるフォルダ + "Config.ini";
\r
2122 ConfigIni.t書き出し( str );
\r
2123 Trace.TraceInformation( "保存しました。({0})", new object[] { str } );
\r
2125 catch( Exception e )
\r
2127 Trace.TraceError( e.Message );
\r
2128 Trace.TraceError( "Config.ini の出力に失敗しました。({0})", new object[] { str } );
\r
2134 //---------------------
\r
2136 Trace.TraceInformation("アプリケーションの終了処理を完了しました。");
\r
2139 this.b終了処理完了済み = true;
\r
2142 private void Window_ApplicationActivated( object sender, EventArgs e )
\r
2144 this.bApplicationActive = true;
\r
2146 private void Window_ApplicationDeactivated( object sender, EventArgs e )
\r
2148 this.bApplicationActive = false;
\r
2150 private void Window_KeyDown( object sender, KeyEventArgs e )
\r
2152 if (e.KeyCode == Keys.Menu)
\r
2155 e.SuppressKeyPress = true;
\r
2157 else if ((e.KeyCode == Keys.Return) && e.Alt)
\r
2159 if (ConfigIni != null)
\r
2161 ConfigIni.bウィンドウモード = !ConfigIni.bウィンドウモード;
\r
2162 this.t全画面・ウィンドウモード切り替え();
\r
2165 e.SuppressKeyPress = true;
\r
2169 for ( int i = 0; i < 0x10; i++ )
\r
2171 if ( ConfigIni.KeyAssign.System.Capture[ i ].コード > 0 &&
\r
2172 e.KeyCode == DeviceConstantConverter.KeyToKeyCode( (SlimDX.DirectInput.Key) ConfigIni.KeyAssign.System.Capture[ i ].コード ) )
\r
2174 // Debug.WriteLine( "capture: " + string.Format( "{0:2x}", (int) e.KeyCode ) + " " + (int) e.KeyCode );
\r
2175 string strFullPath =
\r
2176 Path.Combine( CDTXMania.strEXEのあるフォルダ, "Capture_img" );
\r
2177 strFullPath = Path.Combine( strFullPath, DateTime.Now.ToString( "yyyyMMddHHmmss" ) + ".png" );
\r
2178 SaveResultScreen( strFullPath );
\r
2183 private CScoreIni tScoreIniへBGMAdjustとHistoryとPlayCountを更新(string str新ヒストリ行)
\r
2185 bool bIsUpdatedDrums, bIsUpdatedGuitar, bIsUpdatedBass;
\r
2186 string strFilename = DTX.strファイル名の絶対パス + ".score.ini";
\r
2187 CScoreIni ini = new CScoreIni( strFilename );
\r
2188 if( !File.Exists( strFilename ) )
\r
2190 ini.stファイル.Title = DTX.TITLE;
\r
2191 ini.stファイル.Name = DTX.strファイル名;
\r
2192 ini.stファイル.Hash = CScoreIni.tファイルのMD5を求めて返す( DTX.strファイル名の絶対パス );
\r
2193 for( int i = 0; i < 6; i++ )
\r
2195 ini.stセクション[ i ].nPerfectになる範囲ms = nPerfect範囲ms;
\r
2196 ini.stセクション[ i ].nGreatになる範囲ms = nGreat範囲ms;
\r
2197 ini.stセクション[ i ].nGoodになる範囲ms = nGood範囲ms;
\r
2198 ini.stセクション[ i ].nPoorになる範囲ms = nPoor範囲ms;
\r
2201 ini.stファイル.BGMAdjust = DTX.nBGMAdjust;
\r
2202 CScoreIni.t更新条件を取得する( out bIsUpdatedDrums, out bIsUpdatedGuitar, out bIsUpdatedBass );
\r
2203 if( bIsUpdatedDrums || bIsUpdatedGuitar || bIsUpdatedBass )
\r
2205 if( bIsUpdatedDrums )
\r
2207 ini.stファイル.PlayCountDrums++;
\r
2209 if( bIsUpdatedGuitar )
\r
2211 ini.stファイル.PlayCountGuitar++;
\r
2213 if( bIsUpdatedBass )
\r
2215 ini.stファイル.PlayCountBass++;
\r
2217 ini.tヒストリを追加する( str新ヒストリ行 );
\r
2220 stage選曲.r現在選択中のスコア.譜面情報.演奏回数.Drums = ini.stファイル.PlayCountDrums;
\r
2221 stage選曲.r現在選択中のスコア.譜面情報.演奏回数.Guitar = ini.stファイル.PlayCountGuitar;
\r
2222 stage選曲.r現在選択中のスコア.譜面情報.演奏回数.Bass = ini.stファイル.PlayCountBass;
\r
2223 for( int j = 0; j < ini.stファイル.History.Length; j++ )
\r
2225 stage選曲.r現在選択中のスコア.譜面情報.演奏履歴[ j ] = ini.stファイル.History[ j ];
\r
2229 if( ConfigIni.bScoreIniを出力する )
\r
2231 ini.t書き出し( strFilename );
\r
2236 private void tガベージコレクションを実行する()
\r
2239 GC.WaitForPendingFinalizers();
\r
2241 GC.WaitForPendingFinalizers();
\r
2243 private void tプラグイン検索と生成()
\r
2245 this.listプラグイン = new List<STPlugin>();
\r
2247 string strIPluginActivityの名前 = typeof( IPluginActivity ).FullName;
\r
2248 string strプラグインフォルダパス = strEXEのあるフォルダ + "Plugins\\";
\r
2250 this.t指定フォルダ内でのプラグイン検索と生成( strプラグインフォルダパス, strIPluginActivityの名前 );
\r
2252 if( this.listプラグイン.Count > 0 )
\r
2253 Trace.TraceInformation( this.listプラグイン.Count + " 個のプラグインを読み込みました。" );
\r
2255 private void t指定フォルダ内でのプラグイン検索と生成( string strプラグインフォルダパス, string strプラグイン型名 )
\r
2257 // 指定されたパスが存在しないとエラー
\r
2258 if( !Directory.Exists( strプラグインフォルダパス ) )
\r
2260 Trace.TraceWarning( "プラグインフォルダが存在しません。(" + strプラグインフォルダパス + ")" );
\r
2264 // (1) すべての *.dll について…
\r
2265 string[] strDLLs = System.IO.Directory.GetFiles( strプラグインフォルダパス, "*.dll" );
\r
2266 foreach( string dllName in strDLLs )
\r
2270 // (1-1) dll をアセンブリとして読み込む。
\r
2271 System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom( dllName );
\r
2273 // (1-2) アセンブリ内のすべての型について、プラグインとして有効か調べる
\r
2274 foreach( Type t in asm.GetTypes() )
\r
2276 // (1-3) ↓クラスであり↓Publicであり↓抽象クラスでなく↓IPlugin型のインスタンスが作れる 型を持っていれば有効
\r
2277 if( t.IsClass && t.IsPublic && !t.IsAbstract && t.GetInterface( strプラグイン型名 ) != null )
\r
2279 // (1-4) クラス名からインスタンスを作成する
\r
2280 var st = new STPlugin() {
\r
2281 plugin = (IPluginActivity) asm.CreateInstance( t.FullName ),
\r
2282 strプラグインフォルダ = Path.GetDirectoryName( dllName ),
\r
2283 strアセンブリ簡易名 = asm.GetName().Name,
\r
2284 Version = asm.GetName().Version,
\r
2287 // (1-5) プラグインリストへ登録
\r
2288 this.listプラグイン.Add( st );
\r
2289 Trace.TraceInformation( "プラグイン {0} ({1}, {2}, {3}) を読み込みました。", t.FullName, Path.GetFileName( dllName ), st.strアセンブリ簡易名, st.Version.ToString() );
\r
2295 Trace.TraceInformation( dllName + " からプラグインを生成することに失敗しました。スキップします。" );
\r
2299 // (2) サブフォルダがあれば再帰する
\r
2300 string[] strDirs = Directory.GetDirectories( strプラグインフォルダパス, "*" );
\r
2301 foreach( string dir in strDirs )
\r
2302 this.t指定フォルダ内でのプラグイン検索と生成( dir + "\\", strプラグイン型名 );
\r
2304 //-----------------
\r
2305 private void Window_MouseUp( object sender, MouseEventArgs e )
\r
2310 private void Window_MouseDoubleClick( object sender, MouseEventArgs e) // #23510 2010.11.13 yyagi: to go full screen mode
\r
2312 if ( mb.Equals(MouseButtons.Left) && ConfigIni.bIsAllowedDoubleClickFullscreen ) // #26752 2011.11.27 yyagi
\r
2314 ConfigIni.bウィンドウモード = false;
\r
2315 this.t全画面・ウィンドウモード切り替え();
\r
2318 private void Window_ResizeEnd(object sender, EventArgs e) // #23510 2010.11.20 yyagi: to get resized window size
\r
2320 ConfigIni.nウインドウwidth = (ConfigIni.bウィンドウモード) ? base.Window.ClientSize.Width : currentClientSize.Width; // #23510 2010.10.31 yyagi add
\r
2321 ConfigIni.nウインドウheight = (ConfigIni.bウィンドウモード) ? base.Window.ClientSize.Height : currentClientSize.Height;
\r
2324 //internal sealed class GCBeep // GC発生の度にbeep
\r
2328 // Console.Beep();
\r
2329 // if ( !AppDomain.CurrentDomain.IsFinalizingForUnload()
\r
2330 // && !Environment.HasShutdownStarted )
\r
2339 //-----------------
\r