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
170 public static CSound管理 Sound管理
\r
175 public static CStage起動 stage起動
\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 CStageChangeSkin stageChangeSkin
\r
225 public static CStage終了 stage終了
\r
230 public static CStage r現在のステージ = null;
\r
231 public static CStage r直前のステージ = null;
\r
232 public static string strEXEのあるフォルダ
\r
237 public static string strコンパクトモードファイル
\r
242 public static CTimer Timer
\r
247 public static Format TextureFormat = Format.A8R8G8B8;
\r
248 internal static IPluginActivity act現在入力を占有中のプラグイン = null;
\r
249 public bool bApplicationActive
\r
254 public bool b次のタイミングで垂直帰線同期切り替えを行う
\r
259 public bool b次のタイミングで全画面・ウィンドウ切り替えを行う
\r
264 public Device Device
\r
266 get { return base.GraphicsDeviceManager.Direct3D9.Device; }
\r
268 public CPluginHost PluginHost
\r
273 public List<STPlugin> listプラグイン = new List<STPlugin>();
\r
274 public struct STPlugin
\r
276 public IPluginActivity plugin;
\r
277 public string strプラグインフォルダ;
\r
278 public string strアセンブリ簡易名;
\r
279 public Version Version;
\r
281 private static Size currentClientSize // #23510 2010.10.27 add yyagi to keep current window size
\r
286 // public static CTimer ct;
\r
287 public IntPtr WindowHandle // 2012.10.24 yyagi; to add ASIO support
\r
289 get { return base.Window.Handle; }
\r
296 CDTXMania.app = this;
\r
303 public void t全画面・ウィンドウモード切り替え()
\r
305 DeviceSettings settings = base.GraphicsDeviceManager.CurrentSettings.Clone();
\r
306 if( ( ConfigIni != null ) && ( ConfigIni.bウィンドウモード != settings.Windowed ) )
\r
308 settings.Windowed = ConfigIni.bウィンドウモード;
\r
309 if (ConfigIni.bウィンドウモード == false) // #23510 2010.10.27 yyagi: backup current window size before going fullscreen mode
\r
311 currentClientSize = this.Window.ClientSize;
\r
312 ConfigIni.nウインドウwidth = this.Window.ClientSize.Width;
\r
313 ConfigIni.nウインドウheight = this.Window.ClientSize.Height;
\r
315 base.GraphicsDeviceManager.ChangeDevice( settings );
\r
316 if (ConfigIni.bウィンドウモード == true) // #23510 2010.10.27 yyagi: to resume window size from backuped value
\r
318 base.Window.ClientSize =
\r
319 new Size(currentClientSize.Width, currentClientSize.Height);
\r
324 #region [ #24609 リザルト画像をpngで保存する ] // #24609 2011.3.14 yyagi; to save result screen in case BestRank or HiSkill.
\r
326 /// リザルト画像のキャプチャと保存。
\r
328 /// <param name="strFilename">保存するファイル名(フルパス)</param>
\r
329 public bool SaveResultScreen( string strFullPath )
\r
331 string strSavePath = Path.GetDirectoryName( strFullPath );
\r
332 if ( !Directory.Exists( strSavePath ) )
\r
336 Directory.CreateDirectory( strSavePath );
\r
344 // http://www.gamedev.net/topic/594369-dx9slimdxati-incorrect-saving-surface-to-file/
\r
345 using ( Surface pSurface = CDTXMania.app.Device.GetRenderTarget( 0 ) )
\r
347 Surface.ToFile( pSurface, strFullPath, ImageFileFormat.Png );
\r
355 protected override void Initialize()
\r
358 if( this.listトップレベルActivities != null )
\r
360 foreach( CActivity activity in this.listトップレベルActivities )
\r
361 activity.OnManagedリソースの作成();
\r
364 foreach( STPlugin st in this.listプラグイン )
\r
366 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
367 st.plugin.OnManagedリソースの作成();
\r
368 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
371 protected override void LoadContent()
\r
373 if ( ConfigIni.bウィンドウモード )
\r
375 if( !this.bマウスカーソル表示中 )
\r
378 this.bマウスカーソル表示中 = true;
\r
381 else if( this.bマウスカーソル表示中 )
\r
384 this.bマウスカーソル表示中 = false;
\r
386 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
387 this.Device.SetTransform(TransformState.Projection, Matrix.PerspectiveFovLH(C変換.DegreeToRadian((float)60f), ((float)this.Device.Viewport.Width) / ((float)this.Device.Viewport.Height), -100f, 100f));
\r
388 this.Device.SetRenderState(RenderState.Lighting, false);
\r
389 this.Device.SetRenderState( RenderState.ZEnable, false );
\r
390 this.Device.SetRenderState( RenderState.AntialiasedLineEnable, false );
\r
391 this.Device.SetRenderState( RenderState.AlphaTestEnable, true );
\r
392 this.Device.SetRenderState( RenderState.AlphaRef, 10 );
\r
393 this.Device.SetRenderState<Compare>( RenderState.AlphaFunc, Compare.Greater );
\r
394 this.Device.SetRenderState( RenderState.AlphaBlendEnable, true );
\r
395 this.Device.SetRenderState<Blend>( RenderState.SourceBlend, Blend.SourceAlpha );
\r
396 this.Device.SetRenderState<Blend>( RenderState.DestinationBlend, Blend.InverseSourceAlpha );
\r
397 this.Device.SetTextureStageState( 0, TextureStage.AlphaOperation, TextureOperation.Modulate );
\r
398 this.Device.SetTextureStageState( 0, TextureStage.AlphaArg1, 2 );
\r
399 this.Device.SetTextureStageState( 0, TextureStage.AlphaArg2, 1 );
\r
401 if( this.listトップレベルActivities != null )
\r
403 foreach( CActivity activity in this.listトップレベルActivities )
\r
404 activity.OnUnmanagedリソースの作成();
\r
407 foreach( STPlugin st in this.listプラグイン )
\r
409 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
410 st.plugin.OnUnmanagedリソースの作成();
\r
411 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
414 protected override void UnloadContent()
\r
416 if( this.listトップレベルActivities != null )
\r
418 foreach( CActivity activity in this.listトップレベルActivities )
\r
419 activity.OnUnmanagedリソースの解放();
\r
422 foreach( STPlugin st in this.listプラグイン )
\r
424 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
425 st.plugin.OnUnmanagedリソースの解放();
\r
426 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
429 protected override void OnExiting( EventArgs e )
\r
432 base.OnExiting( e );
\r
434 protected override void Update( GameTime gameTime )
\r
437 protected override void Draw( GameTime gameTime )
\r
439 Sound管理.t再生中の処理をする();
\r
441 if( Timer != null )
\r
444 if( Input管理 != null )
\r
445 Input管理.tポーリング( this.bApplicationActive, CDTXMania.ConfigIni.bバッファ入力を行う );
\r
450 //if( Pad != null ) ポーリング時にクリアしたらダメ!曲の開始時に1回だけクリアする。(2010.9.11)
\r
451 // Pad.st検知したデバイス.Clear();
\r
453 if( this.Device == null )
\r
456 this.Device.BeginScene();
\r
457 this.Device.Clear( ClearFlags.ZBuffer | ClearFlags.Target, Color.Black, 1f, 0 );
\r
459 if( r現在のステージ != null )
\r
461 this.n進行描画の戻り値 = ( r現在のステージ != null ) ? r現在のステージ.On進行描画() : 0;
\r
463 #region [ プラグインの進行描画 ]
\r
464 //---------------------
\r
465 foreach( STPlugin sp in this.listプラグイン )
\r
467 Directory.SetCurrentDirectory( sp.strプラグインフォルダ );
\r
469 if( CDTXMania.act現在入力を占有中のプラグイン == null || CDTXMania.act現在入力を占有中のプラグイン == sp.plugin )
\r
470 sp.plugin.On進行描画( CDTXMania.Pad, CDTXMania.Input管理.Keyboard );
\r
472 sp.plugin.On進行描画( null, null );
\r
474 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
476 //---------------------
\r
480 CScoreIni scoreIni = null;
\r
482 #region [ 曲検索スレッドの起動/終了 ] // ここに"Enumerating Songs..."表示を集約
\r
483 if ( !CDTXMania.bコンパクトモード )
\r
485 actEnumSongs.On進行描画(); // "Enumerating Songs..."アイコンの描画
\r
487 switch ( r現在のステージ.eステージID )
\r
489 case CStage.Eステージ.タイトル:
\r
490 case CStage.Eステージ.コンフィグ:
\r
491 case CStage.Eステージ.選曲:
\r
492 case CStage.Eステージ.曲読み込み:
\r
493 if ( EnumSongs != null )
\r
495 #region [ (特定条件時) 曲検索スレッドの起動・開始 ]
\r
496 if ( r現在のステージ.eステージID == CStage.Eステージ.タイトル &&
\r
497 r直前のステージ.eステージID == CStage.Eステージ.起動 &&
\r
498 this.n進行描画の戻り値 == (int) CStageタイトル.E戻り値.継続 &&
\r
499 !EnumSongs.IsSongListEnumStarted )
\r
501 actEnumSongs.On活性化();
\r
502 CDTXMania.stage選曲.bIsEnumeratingSongs = true;
\r
503 EnumSongs.Init( CDTXMania.Songs管理.listSongsDB, CDTXMania.Songs管理.nSongsDBから取得できたスコア数 ); // songs.db情報と、取得した曲数を、新インスタンスにも与える
\r
504 EnumSongs.StartEnumFromDisk(); // 曲検索スレッドの起動・開始
\r
505 if ( CDTXMania.Songs管理.nSongsDBから取得できたスコア数 == 0 ) // もし初回起動なら、検索スレッドのプライオリティをLowestでなくNormalにする
\r
507 EnumSongs.ChangeEnumeratePriority( ThreadPriority.Normal );
\r
512 #region [ 曲検索の中断と再開 ]
\r
513 if ( r現在のステージ.eステージID == CStage.Eステージ.選曲 && !EnumSongs.IsSongListEnumCompletelyDone )
\r
515 switch ( this.n進行描画の戻り値 )
\r
518 //if ( CDTXMania.stage選曲.bIsEnumeratingSongs )
\r
519 if ( !CDTXMania.stage選曲.bIsPlayingPremovie )
\r
521 EnumSongs.Resume(); // #27060 2012.2.6 yyagi 中止していたバックグランド曲検索を再開
\r
522 EnumSongs.IsSlowdown = false;
\r
526 // EnumSongs.Suspend(); // #27060 2012.3.2 yyagi #PREMOVIE再生中は曲検索を低速化
\r
527 EnumSongs.IsSlowdown = true;
\r
529 actEnumSongs.On活性化();
\r
533 EnumSongs.Suspend(); // #27060 バックグラウンドの曲検索を一時停止
\r
534 actEnumSongs.On非活性化();
\r
540 #region [ 曲探索中断待ち待機 ]
\r
541 if ( r現在のステージ.eステージID == CStage.Eステージ.曲読み込み && !EnumSongs.IsSongListEnumCompletelyDone &&
\r
542 EnumSongs.thDTXFileEnumerate != null ) // #28700 2012.6.12 yyagi; at Compact mode, enumerating thread does not exist.
\r
544 EnumSongs.WaitUntilSuspended(); // 念のため、曲検索が一時中断されるまで待機
\r
548 #region [ 曲検索が完了したら、実際の曲リストに反映する ]
\r
549 // CStage選曲.On活性化() に回した方がいいかな?
\r
550 if ( EnumSongs.IsSongListEnumerated )
\r
552 actEnumSongs.On非活性化();
\r
553 CDTXMania.stage選曲.bIsEnumeratingSongs = false;
\r
555 bool bRemakeSongTitleBar = ( r現在のステージ.eステージID == CStage.Eステージ.選曲 ) ? true : false;
\r
556 CDTXMania.stage選曲.Refresh( EnumSongs.Songs管理, bRemakeSongTitleBar );
\r
557 EnumSongs.SongListEnumCompletelyDone();
\r
565 switch ( r現在のステージ.eステージID )
\r
567 case CStage.Eステージ.何もしない:
\r
570 case CStage.Eステージ.起動:
\r
572 //-----------------------------
\r
573 if( this.n進行描画の戻り値 != 0 )
\r
578 Trace.TraceInformation( "----------------------" );
\r
579 Trace.TraceInformation( "■ タイトル" );
\r
581 r直前のステージ = r現在のステージ;
\r
582 r現在のステージ = stageタイトル;
\r
587 Trace.TraceInformation( "----------------------" );
\r
588 Trace.TraceInformation( "■ 曲読み込み" );
\r
589 stage曲読み込み.On活性化();
\r
590 r直前のステージ = r現在のステージ;
\r
591 r現在のステージ = stage曲読み込み;
\r
594 foreach( STPlugin pg in this.listプラグイン )
\r
596 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
597 pg.plugin.Onステージ変更();
\r
598 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
601 this.tガベージコレクションを実行する();
\r
603 //-----------------------------
\r
607 case CStage.Eステージ.タイトル:
\r
609 //-----------------------------
\r
610 switch( this.n進行描画の戻り値 )
\r
612 case (int)CStageタイトル.E戻り値.GAMESTART:
\r
614 //-----------------------------
\r
616 Trace.TraceInformation( "----------------------" );
\r
617 Trace.TraceInformation( "■ 選曲" );
\r
619 r直前のステージ = r現在のステージ;
\r
620 r現在のステージ = stage選曲;
\r
621 //-----------------------------
\r
625 #region [ OPTION: 廃止済 ]
\r
626 // case 2: // #24525 OPTIONとCONFIGの統合に伴い、OPTIONは廃止
\r
628 // //-----------------------------
\r
629 // r現在のステージ.On非活性化();
\r
630 // Trace.TraceInformation( "----------------------" );
\r
631 // Trace.TraceInformation( "■ オプション" );
\r
632 // stageオプション.On活性化();
\r
633 // r直前のステージ = r現在のステージ;
\r
634 // r現在のステージ = stageオプション;
\r
635 // //-----------------------------
\r
640 case (int)CStageタイトル.E戻り値.CONFIG:
\r
642 //-----------------------------
\r
644 Trace.TraceInformation( "----------------------" );
\r
645 Trace.TraceInformation( "■ コンフィグ" );
\r
646 stageコンフィグ.On活性化();
\r
647 r直前のステージ = r現在のステージ;
\r
648 r現在のステージ = stageコンフィグ;
\r
649 //-----------------------------
\r
653 case (int)CStageタイトル.E戻り値.EXIT:
\r
655 //-----------------------------
\r
657 Trace.TraceInformation( "----------------------" );
\r
658 Trace.TraceInformation( "■ 終了" );
\r
660 r直前のステージ = r現在のステージ;
\r
661 r現在のステージ = stage終了;
\r
662 //-----------------------------
\r
667 foreach( STPlugin pg in this.listプラグイン )
\r
669 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
670 pg.plugin.Onステージ変更();
\r
671 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
674 this.tガベージコレクションを実行する();
\r
675 //-----------------------------
\r
679 // case CStage.Eステージ.オプション:
\r
681 // //-----------------------------
\r
682 // if( this.n進行描画の戻り値 != 0 )
\r
684 // switch( r直前のステージ.eステージID )
\r
686 // case CStage.Eステージ.タイトル:
\r
688 // //-----------------------------
\r
689 // r現在のステージ.On非活性化();
\r
690 // Trace.TraceInformation( "----------------------" );
\r
691 // Trace.TraceInformation( "■ タイトル" );
\r
692 // stageタイトル.On活性化();
\r
693 // r直前のステージ = r現在のステージ;
\r
694 // r現在のステージ = stageタイトル;
\r
696 // foreach( STPlugin pg in this.listプラグイン )
\r
698 // Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
699 // pg.plugin.Onステージ変更();
\r
700 // Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
703 // this.tガベージコレクションを実行する();
\r
705 // //-----------------------------
\r
708 // case CStage.Eステージ.選曲:
\r
710 // //-----------------------------
\r
711 // r現在のステージ.On非活性化();
\r
712 // Trace.TraceInformation( "----------------------" );
\r
713 // Trace.TraceInformation( "■ 選曲" );
\r
714 // stage選曲.On活性化();
\r
715 // r直前のステージ = r現在のステージ;
\r
716 // r現在のステージ = stage選曲;
\r
718 // foreach( STPlugin pg in this.listプラグイン )
\r
720 // Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
721 // pg.plugin.Onステージ変更();
\r
722 // Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
725 // this.tガベージコレクションを実行する();
\r
727 // //-----------------------------
\r
731 // //-----------------------------
\r
735 case CStage.Eステージ.コンフィグ:
\r
737 //-----------------------------
\r
738 if( this.n進行描画の戻り値 != 0 )
\r
740 switch( r直前のステージ.eステージID )
\r
742 case CStage.Eステージ.タイトル:
\r
744 //-----------------------------
\r
746 Trace.TraceInformation( "----------------------" );
\r
747 Trace.TraceInformation( "■ タイトル" );
\r
749 r直前のステージ = r現在のステージ;
\r
750 r現在のステージ = stageタイトル;
\r
752 foreach( STPlugin pg in this.listプラグイン )
\r
754 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
755 pg.plugin.Onステージ変更();
\r
756 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
759 this.tガベージコレクションを実行する();
\r
761 //-----------------------------
\r
764 case CStage.Eステージ.選曲:
\r
766 //-----------------------------
\r
768 Trace.TraceInformation( "----------------------" );
\r
769 Trace.TraceInformation( "■ 選曲" );
\r
771 r直前のステージ = r現在のステージ;
\r
772 r現在のステージ = stage選曲;
\r
774 foreach( STPlugin pg in this.listプラグイン )
\r
776 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
777 pg.plugin.Onステージ変更();
\r
778 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
781 this.tガベージコレクションを実行する();
\r
783 //-----------------------------
\r
787 //-----------------------------
\r
791 case CStage.Eステージ.選曲:
\r
793 //-----------------------------
\r
794 switch( this.n進行描画の戻り値 )
\r
796 case (int) CStage選曲.E戻り値.タイトルに戻る:
\r
798 //-----------------------------
\r
800 Trace.TraceInformation( "----------------------" );
\r
801 Trace.TraceInformation( "■ タイトル" );
\r
803 r直前のステージ = r現在のステージ;
\r
804 r現在のステージ = stageタイトル;
\r
806 foreach( STPlugin pg in this.listプラグイン )
\r
808 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
809 pg.plugin.Onステージ変更();
\r
810 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
813 this.tガベージコレクションを実行する();
\r
815 //-----------------------------
\r
818 case (int) CStage選曲.E戻り値.選曲した:
\r
820 //-----------------------------
\r
822 Trace.TraceInformation( "----------------------" );
\r
823 Trace.TraceInformation( "■ 曲読み込み" );
\r
824 stage曲読み込み.On活性化();
\r
825 r直前のステージ = r現在のステージ;
\r
826 r現在のステージ = stage曲読み込み;
\r
828 foreach( STPlugin pg in this.listプラグイン )
\r
830 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
831 pg.plugin.Onステージ変更();
\r
832 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
835 this.tガベージコレクションを実行する();
\r
837 //-----------------------------
\r
840 // case (int) CStage選曲.E戻り値.オプション呼び出し:
\r
842 // //-----------------------------
\r
843 // r現在のステージ.On非活性化();
\r
844 // Trace.TraceInformation( "----------------------" );
\r
845 // Trace.TraceInformation( "■ オプション" );
\r
846 // stageオプション.On活性化();
\r
847 // r直前のステージ = r現在のステージ;
\r
848 // r現在のステージ = stageオプション;
\r
850 // foreach( STPlugin pg in this.listプラグイン )
\r
852 // Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
853 // pg.plugin.Onステージ変更();
\r
854 // Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
857 // this.tガベージコレクションを実行する();
\r
859 // //-----------------------------
\r
862 case (int) CStage選曲.E戻り値.コンフィグ呼び出し:
\r
864 //-----------------------------
\r
866 Trace.TraceInformation( "----------------------" );
\r
867 Trace.TraceInformation( "■ コンフィグ" );
\r
868 stageコンフィグ.On活性化();
\r
869 r直前のステージ = r現在のステージ;
\r
870 r現在のステージ = stageコンフィグ;
\r
872 foreach( STPlugin pg in this.listプラグイン )
\r
874 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
875 pg.plugin.Onステージ変更();
\r
876 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
879 this.tガベージコレクションを実行する();
\r
881 //-----------------------------
\r
884 case (int) CStage選曲.E戻り値.スキン変更:
\r
887 //-----------------------------
\r
889 Trace.TraceInformation( "----------------------" );
\r
890 Trace.TraceInformation( "■ スキン切り替え" );
\r
891 stageChangeSkin.On活性化();
\r
892 r直前のステージ = r現在のステージ;
\r
893 r現在のステージ = stageChangeSkin;
\r
895 //-----------------------------
\r
898 //-----------------------------
\r
902 case CStage.Eステージ.曲読み込み:
\r
904 //-----------------------------
\r
905 if( this.n進行描画の戻り値 != 0 )
\r
907 CDTXMania.Pad.st検知したデバイス.Clear(); // 入力デバイスフラグクリア(2010.9.11)
\r
910 if( !ConfigIni.bギタレボモード )
\r
912 Trace.TraceInformation( "----------------------" );
\r
913 Trace.TraceInformation( "■ 演奏(ドラム画面)" );
\r
914 #if false // #23625 2011.1.11 Config.iniからダメージ/回復値の定数変更を行う場合はここを有効にする 087リリースに合わせ機能無効化
\r
915 for (int i = 0; i < 5; i++)
\r
917 for (int j = 0; j < 2; j++)
\r
919 stage演奏ドラム画面.fDamageGaugeDelta[i, j] = ConfigIni.fGaugeFactor[i, j];
\r
922 for (int i = 0; i < 3; i++) {
\r
923 stage演奏ドラム画面.fDamageLevelFactor[i] = ConfigIni.fDamageLevelFactor[i];
\r
926 r直前のステージ = r現在のステージ;
\r
927 r現在のステージ = stage演奏ドラム画面;
\r
931 Trace.TraceInformation( "----------------------" );
\r
932 Trace.TraceInformation( "■ 演奏(ギター画面)" );
\r
933 #if false // #23625 2011.1.11 Config.iniからダメージ/回復値の定数変更を行う場合はここを有効にする 087リリースに合わせ機能無効化
\r
934 for (int i = 0; i < 5; i++)
\r
936 for (int j = 0; j < 2; j++)
\r
938 stage演奏ギター画面.fDamageGaugeDelta[i, j] = ConfigIni.fGaugeFactor[i, j];
\r
941 for (int i = 0; i < 3; i++) {
\r
942 stage演奏ギター画面.fDamageLevelFactor[i] = ConfigIni.fDamageLevelFactor[i];
\r
945 r直前のステージ = r現在のステージ;
\r
946 r現在のステージ = stage演奏ギター画面;
\r
949 foreach( STPlugin pg in this.listプラグイン )
\r
951 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
952 pg.plugin.Onステージ変更();
\r
953 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
956 this.tガベージコレクションを実行する();
\r
958 //-----------------------------
\r
962 case CStage.Eステージ.演奏:
\r
964 //-----------------------------
\r
965 switch( this.n進行描画の戻り値 )
\r
967 case (int) E演奏画面の戻り値.継続:
\r
970 case (int) E演奏画面の戻り値.演奏中断:
\r
971 #region [ 演奏キャンセル ]
\r
972 //-----------------------------
\r
973 scoreIni = this.tScoreIniへBGMAdjustとHistoryとPlayCountを更新( "Play canceled" );
\r
975 #region [ プラグイン On演奏キャンセル() の呼び出し ]
\r
976 //---------------------
\r
977 foreach( STPlugin pg in this.listプラグイン )
\r
979 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
980 pg.plugin.On演奏キャンセル( scoreIni );
\r
981 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
983 //---------------------
\r
991 base.Window.Close();
\r
995 Trace.TraceInformation( "----------------------" );
\r
996 Trace.TraceInformation( "■ 選曲" );
\r
998 r直前のステージ = r現在のステージ;
\r
999 r現在のステージ = stage選曲;
\r
1001 #region [ プラグイン Onステージ変更() の呼び出し ]
\r
1002 //---------------------
\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
1009 //---------------------
\r
1012 this.tガベージコレクションを実行する();
\r
1015 //-----------------------------
\r
1018 case (int) E演奏画面の戻り値.ステージ失敗:
\r
1019 #region [ 演奏失敗(StageFailed) ]
\r
1020 //-----------------------------
\r
1021 scoreIni = this.tScoreIniへBGMAdjustとHistoryとPlayCountを更新( "Stage failed" );
\r
1023 #region [ プラグイン On演奏失敗() の呼び出し ]
\r
1024 //---------------------
\r
1025 foreach( STPlugin pg in this.listプラグイン )
\r
1027 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1028 pg.plugin.On演奏失敗( scoreIni );
\r
1029 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1031 //---------------------
\r
1036 r現在のステージ.On非活性化();
\r
1039 base.Window.Close();
\r
1043 Trace.TraceInformation( "----------------------" );
\r
1044 Trace.TraceInformation( "■ 選曲" );
\r
1046 r直前のステージ = r現在のステージ;
\r
1047 r現在のステージ = stage選曲;
\r
1049 #region [ プラグイン Onステージ変更() の呼び出し ]
\r
1050 //---------------------
\r
1051 foreach( STPlugin pg in this.listプラグイン )
\r
1053 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1054 pg.plugin.Onステージ変更();
\r
1055 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1057 //---------------------
\r
1060 this.tガベージコレクションを実行する();
\r
1063 //-----------------------------
\r
1066 case (int) E演奏画面の戻り値.ステージクリア:
\r
1068 //-----------------------------
\r
1069 CScoreIni.C演奏記録 c演奏記録_Drums, c演奏記録_Guitar, c演奏記録_Bass;
\r
1070 CDTX.CChip[] chipArray = new CDTX.CChip[ 10 ];
\r
1071 if( ConfigIni.bギタレボモード )
\r
1073 stage演奏ギター画面.t演奏結果を格納する( out c演奏記録_Drums, out c演奏記録_Guitar, out c演奏記録_Bass );
\r
1077 stage演奏ドラム画面.t演奏結果を格納する( out c演奏記録_Drums, out c演奏記録_Guitar, out c演奏記録_Bass, out chipArray );
\r
1080 if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.24 yyagi Gt/Bsを入れ替えていたなら、演奏結果も入れ替える
\r
1082 CScoreIni.C演奏記録 t;
\r
1084 c演奏記録_Guitar = c演奏記録_Bass;
\r
1087 CDTXMania.DTX.SwapGuitarBassInfos(); // 譜面情報も元に戻す
\r
1088 CDTXMania.DTX.SwapGuitarBassInfos_AutoFlags(); // #24415 2011.2.27 yyagi
\r
1089 // リザルト集計時のみ、Auto系のフラグを入れ替え
\r
1090 // これを戻すのは、リザルト集計後。
\r
1091 } // "case CStage.Eステージ.結果:"のところ。
\r
1093 double ps = 0.0, gs = 0.0;
\r
1094 if ( !c演奏記録_Drums.b全AUTOである && c演奏記録_Drums.n全チップ数 > 0) {
\r
1095 ps = c演奏記録_Drums.db演奏型スキル値;
\r
1096 gs = c演奏記録_Drums.dbゲーム型スキル値;
\r
1098 else if ( !c演奏記録_Guitar.b全AUTOである && c演奏記録_Guitar.n全チップ数 > 0) {
\r
1099 ps = c演奏記録_Guitar.db演奏型スキル値;
\r
1100 gs = c演奏記録_Guitar.dbゲーム型スキル値;
\r
1104 ps = c演奏記録_Bass.db演奏型スキル値;
\r
1105 gs = c演奏記録_Bass.dbゲーム型スキル値;
\r
1107 string str = "Cleared";
\r
1108 switch( CScoreIni.t総合ランク値を計算して返す( c演奏記録_Drums, c演奏記録_Guitar, c演奏記録_Bass ) )
\r
1110 case (int)CScoreIni.ERANK.SS:
\r
1111 str = string.Format( "Cleared (SS: {0:F2})", ps );
\r
1114 case (int) CScoreIni.ERANK.S:
\r
1115 str = string.Format( "Cleared (S: {0:F2})", ps );
\r
1118 case (int) CScoreIni.ERANK.A:
\r
1119 str = string.Format( "Cleared (A: {0:F2})", ps );
\r
1122 case (int) CScoreIni.ERANK.B:
\r
1123 str = string.Format( "Cleared (B: {0:F2})", ps );
\r
1126 case (int) CScoreIni.ERANK.C:
\r
1127 str = string.Format( "Cleared (C: {0:F2})", ps );
\r
1130 case (int) CScoreIni.ERANK.D:
\r
1131 str = string.Format( "Cleared (D: {0:F2})", ps );
\r
1134 case (int) CScoreIni.ERANK.E:
\r
1135 str = string.Format( "Cleared (E: {0:F2})", ps );
\r
1138 case (int)CScoreIni.ERANK.UNKNOWN: // #23534 2010.10.28 yyagi add: 演奏チップが0個のとき
\r
1139 str = "Cleared (No chips)";
\r
1143 scoreIni = this.tScoreIniへBGMAdjustとHistoryとPlayCountを更新( str );
\r
1145 #region [ プラグイン On演奏クリア() の呼び出し ]
\r
1146 //---------------------
\r
1147 foreach( STPlugin pg in this.listプラグイン )
\r
1149 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1150 pg.plugin.On演奏クリア( scoreIni );
\r
1151 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1153 //---------------------
\r
1156 r現在のステージ.On非活性化();
\r
1157 Trace.TraceInformation( "----------------------" );
\r
1158 Trace.TraceInformation( "■ 結果" );
\r
1159 stage結果.st演奏記録.Drums = c演奏記録_Drums;
\r
1160 stage結果.st演奏記録.Guitar = c演奏記録_Guitar;
\r
1161 stage結果.st演奏記録.Bass = c演奏記録_Bass;
\r
1162 stage結果.r空うちドラムチップ = chipArray;
\r
1164 r直前のステージ = r現在のステージ;
\r
1165 r現在のステージ = stage結果;
\r
1167 #region [ プラグイン Onステージ変更() の呼び出し ]
\r
1168 //---------------------
\r
1169 foreach( STPlugin pg in this.listプラグイン )
\r
1171 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1172 pg.plugin.Onステージ変更();
\r
1173 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1175 //---------------------
\r
1179 //-----------------------------
\r
1182 //-----------------------------
\r
1186 case CStage.Eステージ.結果:
\r
1188 //-----------------------------
\r
1189 if( this.n進行描画の戻り値 != 0 )
\r
1191 if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24415 2011.2.27 yyagi Gt/Bsを入れ替えていたなら、Auto状態をリザルト画面終了後に元に戻す
\r
1193 CDTXMania.DTX.SwapGuitarBassInfos_AutoFlags(); // Auto入れ替え
\r
1196 DTX.t全チップの再生一時停止();
\r
1198 r現在のステージ.On非活性化();
\r
1201 Trace.TraceInformation( "----------------------" );
\r
1202 Trace.TraceInformation( "■ 選曲" );
\r
1204 r直前のステージ = r現在のステージ;
\r
1205 r現在のステージ = stage選曲;
\r
1207 foreach( STPlugin pg in this.listプラグイン )
\r
1209 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1210 pg.plugin.Onステージ変更();
\r
1211 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1214 this.tガベージコレクションを実行する();
\r
1218 base.Window.Close();
\r
1221 //-----------------------------
\r
1225 case CStage.Eステージ.ChangeSkin:
\r
1227 //-----------------------------
\r
1228 if ( this.n進行描画の戻り値 != 0 )
\r
1230 r現在のステージ.On非活性化();
\r
1231 Trace.TraceInformation( "----------------------" );
\r
1232 Trace.TraceInformation( "■ 選曲" );
\r
1234 r直前のステージ = r現在のステージ;
\r
1235 r現在のステージ = stage選曲;
\r
1236 this.tガベージコレクションを実行する();
\r
1238 //-----------------------------
\r
1242 case CStage.Eステージ.終了:
\r
1244 //-----------------------------
\r
1245 if( this.n進行描画の戻り値 != 0 )
\r
1249 //-----------------------------
\r
1255 this.Device.EndScene();
\r
1256 #region [ 全画面・ウインドウ切り替え ]
\r
1257 if ( this.b次のタイミングで全画面・ウィンドウ切り替えを行う )
\r
1259 ConfigIni.b全画面モード = !ConfigIni.b全画面モード;
\r
1260 app.t全画面・ウィンドウモード切り替え();
\r
1261 this.b次のタイミングで全画面・ウィンドウ切り替えを行う = false;
\r
1264 #region [ 垂直基線同期切り替え ]
\r
1265 if ( this.b次のタイミングで垂直帰線同期切り替えを行う )
\r
1267 bool bIsMaximized = this.Window.IsMaximized; // #23510 2010.11.3 yyagi: to backup current window mode before changing VSyncWait
\r
1268 currentClientSize = this.Window.ClientSize; // #23510 2010.11.3 yyagi: to backup current window size before changing VSyncWait
\r
1269 DeviceSettings currentSettings = app.GraphicsDeviceManager.CurrentSettings;
\r
1270 currentSettings.EnableVSync = ConfigIni.b垂直帰線待ちを行う;
\r
1271 app.GraphicsDeviceManager.ChangeDevice( currentSettings );
\r
1272 this.b次のタイミングで垂直帰線同期切り替えを行う = false;
\r
1273 base.Window.ClientSize = new Size(currentClientSize.Width, currentClientSize.Height); // #23510 2010.11.3 yyagi: to resume window size after changing VSyncWait
\r
1276 this.Window.WindowState = FormWindowState.Maximized; // #23510 2010.11.3 yyagi: to resume window mode after changing VSyncWait
\r
1281 if ( ConfigIni.nフレーム毎スリープms >= 0 ) // #xxxxx 2011.11.27 yyagi
\r
1283 Thread.Sleep( ConfigIni.nフレーム毎スリープms );
\r
1291 #region [ 汎用ヘルパー ]
\r
1292 //-----------------
\r
1293 public static CTexture tテクスチャの生成( string fileName )
\r
1295 return tテクスチャの生成( fileName, false );
\r
1297 public static CTexture tテクスチャの生成( string fileName, bool b黒を透過する )
\r
1299 if ( app == null )
\r
1305 return new CTexture( app.Device, fileName, TextureFormat, b黒を透過する );
\r
1307 catch ( CTextureCreateFailedException )
\r
1309 Trace.TraceError( "テクスチャの生成に失敗しました。({0})", fileName );
\r
1312 catch ( FileNotFoundException )
\r
1314 Trace.TraceError( "テクスチャファイルが見つかりませんでした。({0})", fileName );
\r
1318 public static void tテクスチャの解放( ref CTexture tx )
\r
1320 CDTXMania.t安全にDisposeする( ref tx );
\r
1323 public static CTexture tテクスチャの生成( byte[] txData )
\r
1325 return tテクスチャの生成( txData, false );
\r
1327 public static CTexture tテクスチャの生成( byte[] txData, bool b黒を透過する )
\r
1329 if ( app == null )
\r
1335 return new CTexture( app.Device, txData, TextureFormat, b黒を透過する );
\r
1337 catch ( CTextureCreateFailedException )
\r
1339 Trace.TraceError( "テクスチャの生成に失敗しました。(txData)" );
\r
1344 public static CTexture tテクスチャの生成( Bitmap bitmap )
\r
1346 return tテクスチャの生成( bitmap, false );
\r
1348 public static CTexture tテクスチャの生成( Bitmap bitmap, bool b黒を透過する )
\r
1350 if ( app == null )
\r
1356 return new CTexture( app.Device, bitmap, TextureFormat, b黒を透過する );
\r
1358 catch ( CTextureCreateFailedException )
\r
1360 Trace.TraceError( "テクスチャの生成に失敗しました。(txData)" );
\r
1365 /// <summary>プロパティ、インデクサには ref は使用できないので注意。</summary>
\r
1366 public static void t安全にDisposeする<T>( ref T obj )
\r
1368 if ( obj == null )
\r
1371 var d = obj as IDisposable;
\r
1376 obj = default( T );
\r
1378 //-----------------
\r
1381 #region [ private ]
\r
1382 //-----------------
\r
1383 private bool bマウスカーソル表示中 = true;
\r
1384 private bool b終了処理完了済み;
\r
1385 private static CDTX dtx;
\r
1386 private List<CActivity> listトップレベルActivities;
\r
1387 private int n進行描画の戻り値;
\r
1388 private MouseButtons mb = System.Windows.Forms.MouseButtons.Left;
\r
1390 private void t起動処理()
\r
1392 #region [ strEXEのあるフォルダを決定する ]
\r
1393 //-----------------
\r
1394 // BEGIN #23629 2010.11.13 from: デバッグ時は Application.ExecutablePath が ($SolutionDir)/bin/x86/Debug/ などになり System/ の読み込みに失敗するので、カレントディレクトリを採用する。(プロジェクトのプロパティ→デバッグ→作業ディレクトリが有効になる)
\r
1396 strEXEのあるフォルダ = Environment.CurrentDirectory + @"\";
\r
1398 strEXEのあるフォルダ = Path.GetDirectoryName( Application.ExecutablePath ) + @"\"; // #23629 2010.11.9 yyagi: set correct pathname where DTXManiaGR.exe is.
\r
1400 // END #23629 2010.11.13 from
\r
1401 //-----------------
\r
1404 #region [ Config.ini の読込み ]
\r
1405 //---------------------
\r
1406 ConfigIni = new CConfigIni();
\r
1407 string path = strEXEのあるフォルダ + "Config.ini";
\r
1408 if( File.Exists( path ) )
\r
1412 ConfigIni.tファイルから読み込み( path );
\r
1413 this.Window.EnableSystemMenu = CDTXMania.ConfigIni.bIsEnabledSystemMenu; // #28200 2011.5.1 yyagi
\r
1417 //ConfigIni = new CConfigIni(); // 存在してなければ新規生成
\r
1420 //---------------------
\r
1422 #region [ ログ出力開始 ]
\r
1423 //---------------------
\r
1424 Trace.AutoFlush = true;
\r
1425 if( ConfigIni.bログ出力 )
\r
1429 Trace.Listeners.Add( new CTraceLogListener( new StreamWriter( "DTXManiaLog.txt", false, Encoding.GetEncoding( "shift-jis" ) ) ) );
\r
1431 catch ( System.UnauthorizedAccessException ) // #24481 2011.2.20 yyagi
\r
1433 int c = (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja")? 0 : 1;
\r
1434 string[] mes_writeErr = {
\r
1435 "DTXManiaLog.txtへの書き込みができませんでした。書き込みできるようにしてから、再度起動してください。",
\r
1436 "Failed to write DTXManiaLog.txt. Please set it writable and try again."
\r
1438 MessageBox.Show( mes_writeErr[c], "DTXMania boot error", MessageBoxButtons.OK, MessageBoxIcon.Error );
\r
1439 Environment.Exit(1);
\r
1442 Trace.WriteLine("");
\r
1443 Trace.WriteLine( "DTXMania powered by YAMAHA Silent Session Drums" );
\r
1444 Trace.WriteLine( string.Format( "Release: {0}", VERSION ) );
\r
1445 Trace.WriteLine( "" );
\r
1446 Trace.TraceInformation( "----------------------" );
\r
1447 Trace.TraceInformation( "■ アプリケーションの初期化" );
\r
1448 Trace.TraceInformation( "OS Version: " + Environment.OSVersion );
\r
1449 Trace.TraceInformation( "ProcessorCount: " + Environment.ProcessorCount.ToString() );
\r
1450 Trace.TraceInformation( "CLR Version: " + Environment.Version.ToString() );
\r
1451 //---------------------
\r
1453 #region [ コンパクトモードスイッチの有無 ]
\r
1454 //---------------------
\r
1455 bコンパクトモード = false;
\r
1456 strコンパクトモードファイル = "";
\r
1457 string[] commandLineArgs = Environment.GetCommandLineArgs();
\r
1458 if( ( commandLineArgs != null ) && ( commandLineArgs.Length > 1 ) )
\r
1461 strコンパクトモードファイル = commandLineArgs[ 1 ];
\r
1462 Trace.TraceInformation( "コンパクトモードで起動します。[{0}]", strコンパクトモードファイル );
\r
1464 //---------------------
\r
1467 #region [ ウィンドウ初期化 ]
\r
1468 //---------------------
\r
1469 base.Window.Text = "DTXMania .NET style release " + VERSION;
\r
1470 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
1471 if (!ConfigIni.bウィンドウモード) // #23510 2010.11.02 yyagi: add; to recover window size in case bootup with fullscreen mode
\r
1473 currentClientSize = new Size(ConfigIni.nウインドウwidth, ConfigIni.nウインドウheight);
\r
1475 base.Window.MaximizeBox = true; // #23510 2010.11.04 yyagi: to support maximizing window
\r
1476 base.Window.FormBorderStyle = FormBorderStyle.Sizable; // #23510 2010.10.27 yyagi: changed from FixedDialog to Sizable, to support window resize
\r
1477 base.Window.ShowIcon = true;
\r
1478 base.Window.Icon = Properties.Resources.dtx;
\r
1479 base.Window.KeyDown += new KeyEventHandler( this.Window_KeyDown );
\r
1480 base.Window.MouseUp +=new MouseEventHandler( this.Window_MouseUp);
\r
1481 base.Window.MouseDoubleClick += new MouseEventHandler(this.Window_MouseDoubleClick); // #23510 2010.11.13 yyagi: to go fullscreen mode
\r
1482 base.Window.ResizeEnd += new EventHandler(this.Window_ResizeEnd); // #23510 2010.11.20 yyagi: to set resized window size in Config.ini
\r
1483 base.Window.ApplicationActivated += new EventHandler(this.Window_ApplicationActivated);
\r
1484 base.Window.ApplicationDeactivated += new EventHandler( this.Window_ApplicationDeactivated );
\r
1485 //---------------------
\r
1487 #region [ Direct3D9Exを使うかどうか判定 ]
\r
1489 #region [ Direct3D9 デバイスの生成 ]
\r
1490 //---------------------
\r
1491 DeviceSettings settings = new DeviceSettings();
\r
1492 settings.Windowed = ConfigIni.bウィンドウモード;
\r
1493 settings.BackBufferWidth = SampleFramework.GameWindowSize.Width;
\r
1494 settings.BackBufferHeight = SampleFramework.GameWindowSize.Height;
\r
1495 // settings.BackBufferCount = 3;
\r
1496 settings.EnableVSync = ConfigIni.b垂直帰線待ちを行う;
\r
1500 base.GraphicsDeviceManager.ChangeDevice(settings);
\r
1502 catch (DeviceCreationException e)
\r
1504 Trace.TraceError(e.ToString());
\r
1505 MessageBox.Show(e.Message + e.ToString(), "DTXMania failed to boot: DirectX9 Initialize Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1506 Environment.Exit(-1);
\r
1509 base.IsFixedTimeStep = false;
\r
1510 // base.TargetElapsedTime = TimeSpan.FromTicks( 10000000 / 75 );
\r
1511 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
1512 base.InactiveSleepTime = TimeSpan.FromMilliseconds((float)(ConfigIni.n非フォーカス時スリープms)); // #23568 2010.11.3 yyagi: to support valiable sleep value when !IsActive
\r
1513 // #23568 2010.11.4 ikanick changed ( 1 -> ConfigIni )
\r
1514 //---------------------
\r
1519 #region [ Skin の初期化 ]
\r
1520 //---------------------
\r
1521 Trace.TraceInformation( "スキンの初期化を行います。" );
\r
1525 Skin = new CSkin( CDTXMania.ConfigIni.strSystemSkinSubfolderFullName, CDTXMania.ConfigIni.bUseBoxDefSkin );
\r
1526 CDTXMania.ConfigIni.strSystemSkinSubfolderFullName = CDTXMania.Skin.GetCurrentSkinSubfolderFullName( true ); // 旧指定のSkinフォルダが消滅していた場合に備える
\r
1527 Trace.TraceInformation( "スキンの初期化を完了しました。" );
\r
1531 Trace.TraceInformation( "スキンの初期化に失敗しました。" );
\r
1538 //---------------------
\r
1540 // ct = new CTimer( CTimer.E種別.PerformanceCounter );
\r
1542 #region [ Timer の初期化 ]
\r
1543 //---------------------
\r
1544 Trace.TraceInformation( "タイマの初期化を行います。" );
\r
1548 Timer = new CTimer( CTimer.E種別.MultiMedia );
\r
1549 Trace.TraceInformation( "タイマの初期化を完了しました。" );
\r
1555 //---------------------
\r
1557 #region [ FPS カウンタの初期化 ]
\r
1558 //---------------------
\r
1559 Trace.TraceInformation( "FPSカウンタの初期化を行います。" );
\r
1564 Trace.TraceInformation( "FPSカウンタを生成しました。" );
\r
1570 //---------------------
\r
1572 #region [ act文字コンソールの初期化 ]
\r
1573 //---------------------
\r
1574 Trace.TraceInformation( "文字コンソールの初期化を行います。" );
\r
1578 act文字コンソール = new C文字コンソール();
\r
1579 Trace.TraceInformation( "文字コンソールを生成しました。" );
\r
1580 act文字コンソール.On活性化();
\r
1581 Trace.TraceInformation( "文字コンソールを活性化しました。" );
\r
1582 Trace.TraceInformation( "文字コンソールの初期化を完了しました。" );
\r
1584 catch( Exception exception )
\r
1586 Trace.TraceError( exception.Message );
\r
1587 Trace.TraceError( "文字コンソールの初期化に失敗しました。" );
\r
1593 //---------------------
\r
1595 #region [ Input管理 の初期化 ]
\r
1596 //---------------------
\r
1597 Trace.TraceInformation( "DirectInput, MIDI入力の初期化を行います。" );
\r
1601 Input管理 = new CInput管理( base.Window.Handle );
\r
1602 foreach( IInputDevice device in Input管理.list入力デバイス )
\r
1604 if( ( device.e入力デバイス種別 == E入力デバイス種別.Joystick ) && !ConfigIni.dicJoystick.ContainsValue( device.GUID ) )
\r
1607 while( ConfigIni.dicJoystick.ContainsKey( key ) )
\r
1611 ConfigIni.dicJoystick.Add( key, device.GUID );
\r
1614 foreach( IInputDevice device2 in Input管理.list入力デバイス )
\r
1616 if( device2.e入力デバイス種別 == E入力デバイス種別.Joystick )
\r
1618 foreach( KeyValuePair<int, string> pair in ConfigIni.dicJoystick )
\r
1620 if( device2.GUID.Equals( pair.Value ) )
\r
1622 ( (CInputJoystick) device2 ).SetID( pair.Key );
\r
1629 Trace.TraceInformation( "DirectInput の初期化を完了しました。" );
\r
1631 catch( Exception exception2 )
\r
1633 Trace.TraceError( exception2.Message );
\r
1634 Trace.TraceError( "DirectInput, MIDI入力の初期化に失敗しました。" );
\r
1641 //---------------------
\r
1643 #region [ Pad の初期化 ]
\r
1644 //---------------------
\r
1645 Trace.TraceInformation( "パッドの初期化を行います。" );
\r
1649 Pad = new CPad( ConfigIni, Input管理 );
\r
1650 Trace.TraceInformation( "パッドの初期化を完了しました。" );
\r
1652 catch( Exception exception3 )
\r
1654 Trace.TraceError( exception3.Message );
\r
1655 Trace.TraceError( "パッドの初期化に失敗しました。" );
\r
1661 //---------------------
\r
1663 #region [ Sound管理 の初期化 ]
\r
1664 //---------------------
\r
1665 Trace.TraceInformation( "サウンドデバイスの初期化を行います。" );
\r
1669 ESoundDeviceType soundDeviceType;
\r
1670 switch ( CDTXMania.ConfigIni.nSoundDeviceType )
\r
1673 soundDeviceType = ESoundDeviceType.DirectSound;
\r
1676 soundDeviceType = ESoundDeviceType.ASIO;
\r
1679 soundDeviceType = ESoundDeviceType.ExclusiveWASAPI;
\r
1682 soundDeviceType = ESoundDeviceType.Unknown;
\r
1685 Sound管理 = new CSound管理( base.Window.Handle, soundDeviceType );
\r
1686 Sound管理.SetSoundBufferSizeASIO( CDTXMania.ConfigIni.nASIOBufferSize );
\r
1687 Trace.TraceInformation( "サウンドデバイスの初期化を完了しました。" );
\r
1689 catch (Exception e)
\r
1691 Trace.TraceError( e.Message );
\r
1698 //---------------------
\r
1700 #region [ Songs管理 の初期化 ]
\r
1701 //---------------------
\r
1702 Trace.TraceInformation( "曲リストの初期化を行います。" );
\r
1706 Songs管理 = new CSongs管理();
\r
1707 // Songs管理_裏読 = new CSongs管理();
\r
1708 EnumSongs = new CEnumSongs();
\r
1709 actEnumSongs = new CActEnumSongs();
\r
1710 Trace.TraceInformation( "曲リストの初期化を完了しました。" );
\r
1712 catch( Exception e )
\r
1714 Trace.TraceError( e.Message );
\r
1715 Trace.TraceError( "曲リストの初期化に失敗しました。" );
\r
1721 //---------------------
\r
1723 #region [ CAvi の初期化 ]
\r
1724 //---------------------
\r
1726 //---------------------
\r
1728 #region [ Random の初期化 ]
\r
1729 //---------------------
\r
1730 Random = new Random( (int) Timer.nシステム時刻 );
\r
1731 //---------------------
\r
1733 #region [ ステージの初期化 ]
\r
1734 //---------------------
\r
1737 stage起動 = new CStage起動();
\r
1738 stageタイトル = new CStageタイトル();
\r
1739 // stageオプション = new CStageオプション();
\r
1740 stageコンフィグ = new CStageコンフィグ();
\r
1741 stage選曲 = new CStage選曲();
\r
1742 stage曲読み込み = new CStage曲読み込み();
\r
1743 stage演奏ドラム画面 = new CStage演奏ドラム画面();
\r
1744 stage演奏ギター画面 = new CStage演奏ギター画面();
\r
1745 stage結果 = new CStage結果();
\r
1746 stageChangeSkin = new CStageChangeSkin();
\r
1747 stage終了 = new CStage終了();
\r
1748 this.listトップレベルActivities = new List<CActivity>();
\r
1749 this.listトップレベルActivities.Add( actEnumSongs );
\r
1750 this.listトップレベルActivities.Add( act文字コンソール );
\r
1751 this.listトップレベルActivities.Add( stage起動 );
\r
1752 this.listトップレベルActivities.Add( stageタイトル );
\r
1753 // this.listトップレベルActivities.Add( stageオプション );
\r
1754 this.listトップレベルActivities.Add( stageコンフィグ );
\r
1755 this.listトップレベルActivities.Add( stage選曲 );
\r
1756 this.listトップレベルActivities.Add( stage曲読み込み );
\r
1757 this.listトップレベルActivities.Add( stage演奏ドラム画面 );
\r
1758 this.listトップレベルActivities.Add( stage演奏ギター画面 );
\r
1759 this.listトップレベルActivities.Add( stage結果 );
\r
1760 this.listトップレベルActivities.Add( stageChangeSkin );
\r
1761 this.listトップレベルActivities.Add( stage終了 );
\r
1762 //---------------------
\r
1764 #region [ プラグインの検索と生成 ]
\r
1765 //---------------------
\r
1766 PluginHost = new CPluginHost();
\r
1768 Trace.TraceInformation( "プラグインの検索と生成を行います。" );
\r
1772 this.tプラグイン検索と生成();
\r
1773 Trace.TraceInformation( "プラグインの検索と生成を完了しました。" );
\r
1779 //---------------------
\r
1781 #region [ プラグインの初期化 ]
\r
1782 //---------------------
\r
1783 if( this.listプラグイン != null && this.listプラグイン.Count > 0 )
\r
1785 Trace.TraceInformation( "プラグインの初期化を行います。" );
\r
1789 foreach( STPlugin st in this.listプラグイン )
\r
1791 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
1792 st.plugin.On初期化( this.PluginHost );
\r
1793 st.plugin.OnManagedリソースの作成();
\r
1794 st.plugin.OnUnmanagedリソースの作成();
\r
1795 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1797 Trace.TraceInformation( "すべてのプラグインの初期化を完了しました。" );
\r
1801 Trace.TraceError( "プラグインのどれかの初期化に失敗しました。" );
\r
1810 //---------------------
\r
1813 // Sound管理.t再生中の処理をする() を、別スレッドで50ms周期で実行する
\r
1814 //System.Threading.Thread t =
\r
1815 //new System.Threading.Thread(
\r
1816 //new System.Threading.ThreadStart( Sound管理.t再生中の処理をする_loop ) );
\r
1817 //t.IsBackground = true;
\r
1820 Trace.TraceInformation( "アプリケーションの初期化を完了しました。" );
\r
1822 #region [ 最初のステージの起動 ]
\r
1823 //---------------------
\r
1824 Trace.TraceInformation( "----------------------" );
\r
1825 Trace.TraceInformation( "■ 起動" );
\r
1827 if ( CDTXMania.bコンパクトモード )
\r
1829 r現在のステージ = stage曲読み込み;
\r
1833 r現在のステージ = stage起動;
\r
1836 //---------------------
\r
1840 private void t終了処理()
\r
1842 if( !this.b終了処理完了済み )
\r
1844 Trace.TraceInformation( "----------------------" );
\r
1845 Trace.TraceInformation( "■ アプリケーションの終了" );
\r
1846 #region [ 曲検索の終了処理 ]
\r
1847 //---------------------
\r
1848 if ( actEnumSongs != null )
\r
1850 Trace.TraceInformation( "曲検索actの終了処理を行います。" );
\r
1854 actEnumSongs.On非活性化();
\r
1855 actEnumSongs= null;
\r
1856 Trace.TraceInformation( "曲検索actの終了処理を完了しました。" );
\r
1858 catch ( Exception e )
\r
1860 Trace.TraceError( e.Message );
\r
1861 Trace.TraceError( "曲検索actの終了処理に失敗しました。" );
\r
1868 //---------------------
\r
1870 #region [ 現在のステージの終了処理 ]
\r
1871 //---------------------
\r
1872 if( CDTXMania.r現在のステージ != null && CDTXMania.r現在のステージ.b活性化してる ) // #25398 2011.06.07 MODIFY FROM
\r
1874 Trace.TraceInformation( "現在のステージを終了します。" );
\r
1878 r現在のステージ.On非活性化();
\r
1879 Trace.TraceInformation( "現在のステージの終了処理を完了しました。" );
\r
1886 //---------------------
\r
1888 #region [ プラグインの終了処理 ]
\r
1889 //---------------------
\r
1890 if (this.listプラグイン != null && this.listプラグイン.Count > 0)
\r
1892 Trace.TraceInformation( "すべてのプラグインを終了します。" );
\r
1896 foreach( STPlugin st in this.listプラグイン )
\r
1898 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
1899 st.plugin.OnUnmanagedリソースの解放();
\r
1900 st.plugin.OnManagedリソースの解放();
\r
1902 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1904 PluginHost = null;
\r
1905 Trace.TraceInformation( "すべてのプラグインの終了処理を完了しました。" );
\r
1912 //---------------------
\r
1914 #region [ 曲リストの終了処理 ]
\r
1915 //---------------------
\r
1916 if (Songs管理 != null)
\r
1918 Trace.TraceInformation( "曲リストの終了処理を行います。" );
\r
1923 Trace.TraceInformation( "曲リストの終了処理を完了しました。" );
\r
1925 catch( Exception exception )
\r
1927 Trace.TraceError( exception.Message );
\r
1928 Trace.TraceError( "曲リストの終了処理に失敗しました。" );
\r
1936 //---------------------
\r
1938 #region [ スキンの終了処理 ]
\r
1939 //---------------------
\r
1942 Trace.TraceInformation( "スキンの終了処理を行います。" );
\r
1948 Trace.TraceInformation( "スキンの終了処理を完了しました。" );
\r
1950 catch( Exception exception2 )
\r
1952 Trace.TraceError( exception2.Message );
\r
1953 Trace.TraceError( "スキンの終了処理に失敗しました。" );
\r
1960 //---------------------
\r
1962 #region [ DirectSoundの終了処理 ]
\r
1963 //---------------------
\r
1964 if (Sound管理 != null)
\r
1966 Trace.TraceInformation( "DirectSound の終了処理を行います。" );
\r
1970 Sound管理.Dispose();
\r
1972 Trace.TraceInformation( "DirectSound の終了処理を完了しました。" );
\r
1974 catch( Exception exception3 )
\r
1976 Trace.TraceError( exception3.Message );
\r
1977 Trace.TraceError( "DirectSound の終了処理に失敗しました。" );
\r
1984 //---------------------
\r
1986 #region [ パッドの終了処理 ]
\r
1987 //---------------------
\r
1990 Trace.TraceInformation( "パッドの終了処理を行います。" );
\r
1995 Trace.TraceInformation( "パッドの終了処理を完了しました。" );
\r
1997 catch( Exception exception4 )
\r
1999 Trace.TraceError( exception4.Message );
\r
2000 Trace.TraceError( "パッドの終了処理に失敗しました。" );
\r
2007 //---------------------
\r
2009 #region [ DirectInput, MIDI入力の終了処理 ]
\r
2010 //---------------------
\r
2011 if (Input管理 != null)
\r
2013 Trace.TraceInformation( "DirectInput, MIDI入力の終了処理を行います。" );
\r
2017 Input管理.Dispose();
\r
2019 Trace.TraceInformation( "DirectInput, MIDI入力の終了処理を完了しました。" );
\r
2021 catch( Exception exception5 )
\r
2023 Trace.TraceError( exception5.Message );
\r
2024 Trace.TraceError( "DirectInput, MIDI入力の終了処理に失敗しました。" );
\r
2031 //---------------------
\r
2033 #region [ 文字コンソールの終了処理 ]
\r
2034 //---------------------
\r
2035 if (act文字コンソール != null)
\r
2037 Trace.TraceInformation( "文字コンソールの終了処理を行います。" );
\r
2041 act文字コンソール.On非活性化();
\r
2042 act文字コンソール = null;
\r
2043 Trace.TraceInformation( "文字コンソールの終了処理を完了しました。" );
\r
2045 catch( Exception exception6 )
\r
2047 Trace.TraceError( exception6.Message );
\r
2048 Trace.TraceError( "文字コンソールの終了処理に失敗しました。" );
\r
2055 //---------------------
\r
2057 #region [ FPSカウンタの終了処理 ]
\r
2058 //---------------------
\r
2059 Trace.TraceInformation("FPSカウンタの終了処理を行います。");
\r
2067 Trace.TraceInformation( "FPSカウンタの終了処理を完了しました。" );
\r
2073 //---------------------
\r
2078 #region [ タイマの終了処理 ]
\r
2079 //---------------------
\r
2080 Trace.TraceInformation("タイマの終了処理を行います。");
\r
2084 if( Timer != null )
\r
2088 Trace.TraceInformation( "タイマの終了処理を完了しました。" );
\r
2092 Trace.TraceInformation( "タイマは使用されていません。" );
\r
2099 //---------------------
\r
2101 #region [ Config.iniの出力 ]
\r
2102 //---------------------
\r
2103 Trace.TraceInformation("Config.ini を出力します。");
\r
2104 // if ( ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.16 yyagi ギターベースがスワップしているときは元に戻す
\r
2105 if ( ConfigIni.bIsSwappedGuitarBass_AutoFlagsAreSwapped ) // #24415 2011.2.21 yyagi FLIP中かつ演奏中にalt-f4で終了したときは、AUTOのフラグをswapして戻す
\r
2107 DTX.SwapGuitarBassInfos_AutoFlags();
\r
2109 string str = strEXEのあるフォルダ + "Config.ini";
\r
2113 ConfigIni.t書き出し( str );
\r
2114 Trace.TraceInformation( "保存しました。({0})", new object[] { str } );
\r
2116 catch( Exception e )
\r
2118 Trace.TraceError( e.Message );
\r
2119 Trace.TraceError( "Config.ini の出力に失敗しました。({0})", new object[] { str } );
\r
2125 //---------------------
\r
2127 Trace.TraceInformation("アプリケーションの終了処理を完了しました。");
\r
2130 this.b終了処理完了済み = true;
\r
2133 private void Window_ApplicationActivated( object sender, EventArgs e )
\r
2135 this.bApplicationActive = true;
\r
2137 private void Window_ApplicationDeactivated( object sender, EventArgs e )
\r
2139 this.bApplicationActive = false;
\r
2141 private void Window_KeyDown( object sender, KeyEventArgs e )
\r
2143 if (e.KeyCode == Keys.Menu)
\r
2146 e.SuppressKeyPress = true;
\r
2148 else if ((e.KeyCode == Keys.Return) && e.Alt)
\r
2150 if (ConfigIni != null)
\r
2152 ConfigIni.bウィンドウモード = !ConfigIni.bウィンドウモード;
\r
2153 this.t全画面・ウィンドウモード切り替え();
\r
2156 e.SuppressKeyPress = true;
\r
2160 for ( int i = 0; i < 0x10; i++ )
\r
2162 if ( ConfigIni.KeyAssign.System.Capture[ i ].コード > 0 &&
\r
2163 e.KeyCode == DeviceConstantConverter.KeyToKeyCode( (SlimDX.DirectInput.Key) ConfigIni.KeyAssign.System.Capture[ i ].コード ) )
\r
2165 // Debug.WriteLine( "capture: " + string.Format( "{0:2x}", (int) e.KeyCode ) + " " + (int) e.KeyCode );
\r
2166 string strFullPath =
\r
2167 Path.Combine( CDTXMania.strEXEのあるフォルダ, "Capture_img" );
\r
2168 strFullPath = Path.Combine( strFullPath, DateTime.Now.ToString( "yyyyMMddHHmmss" ) + ".png" );
\r
2169 SaveResultScreen( strFullPath );
\r
2174 private CScoreIni tScoreIniへBGMAdjustとHistoryとPlayCountを更新(string str新ヒストリ行)
\r
2176 bool bIsUpdatedDrums, bIsUpdatedGuitar, bIsUpdatedBass;
\r
2177 string strFilename = DTX.strファイル名の絶対パス + ".score.ini";
\r
2178 CScoreIni ini = new CScoreIni( strFilename );
\r
2179 if( !File.Exists( strFilename ) )
\r
2181 ini.stファイル.Title = DTX.TITLE;
\r
2182 ini.stファイル.Name = DTX.strファイル名;
\r
2183 ini.stファイル.Hash = CScoreIni.tファイルのMD5を求めて返す( DTX.strファイル名の絶対パス );
\r
2184 for( int i = 0; i < 6; i++ )
\r
2186 ini.stセクション[ i ].nPerfectになる範囲ms = nPerfect範囲ms;
\r
2187 ini.stセクション[ i ].nGreatになる範囲ms = nGreat範囲ms;
\r
2188 ini.stセクション[ i ].nGoodになる範囲ms = nGood範囲ms;
\r
2189 ini.stセクション[ i ].nPoorになる範囲ms = nPoor範囲ms;
\r
2192 ini.stファイル.BGMAdjust = DTX.nBGMAdjust;
\r
2193 CScoreIni.t更新条件を取得する( out bIsUpdatedDrums, out bIsUpdatedGuitar, out bIsUpdatedBass );
\r
2194 if( bIsUpdatedDrums || bIsUpdatedGuitar || bIsUpdatedBass )
\r
2196 if( bIsUpdatedDrums )
\r
2198 ini.stファイル.PlayCountDrums++;
\r
2200 if( bIsUpdatedGuitar )
\r
2202 ini.stファイル.PlayCountGuitar++;
\r
2204 if( bIsUpdatedBass )
\r
2206 ini.stファイル.PlayCountBass++;
\r
2208 ini.tヒストリを追加する( str新ヒストリ行 );
\r
2211 stage選曲.r現在選択中のスコア.譜面情報.演奏回数.Drums = ini.stファイル.PlayCountDrums;
\r
2212 stage選曲.r現在選択中のスコア.譜面情報.演奏回数.Guitar = ini.stファイル.PlayCountGuitar;
\r
2213 stage選曲.r現在選択中のスコア.譜面情報.演奏回数.Bass = ini.stファイル.PlayCountBass;
\r
2214 for( int j = 0; j < ini.stファイル.History.Length; j++ )
\r
2216 stage選曲.r現在選択中のスコア.譜面情報.演奏履歴[ j ] = ini.stファイル.History[ j ];
\r
2220 if( ConfigIni.bScoreIniを出力する )
\r
2222 ini.t書き出し( strFilename );
\r
2227 private void tガベージコレクションを実行する()
\r
2230 GC.WaitForPendingFinalizers();
\r
2232 GC.WaitForPendingFinalizers();
\r
2234 private void tプラグイン検索と生成()
\r
2236 this.listプラグイン = new List<STPlugin>();
\r
2238 string strIPluginActivityの名前 = typeof( IPluginActivity ).FullName;
\r
2239 string strプラグインフォルダパス = strEXEのあるフォルダ + "Plugins\\";
\r
2241 this.t指定フォルダ内でのプラグイン検索と生成( strプラグインフォルダパス, strIPluginActivityの名前 );
\r
2243 if( this.listプラグイン.Count > 0 )
\r
2244 Trace.TraceInformation( this.listプラグイン.Count + " 個のプラグインを読み込みました。" );
\r
2246 private void t指定フォルダ内でのプラグイン検索と生成( string strプラグインフォルダパス, string strプラグイン型名 )
\r
2248 // 指定されたパスが存在しないとエラー
\r
2249 if( !Directory.Exists( strプラグインフォルダパス ) )
\r
2251 Trace.TraceWarning( "プラグインフォルダが存在しません。(" + strプラグインフォルダパス + ")" );
\r
2255 // (1) すべての *.dll について…
\r
2256 string[] strDLLs = System.IO.Directory.GetFiles( strプラグインフォルダパス, "*.dll" );
\r
2257 foreach( string dllName in strDLLs )
\r
2261 // (1-1) dll をアセンブリとして読み込む。
\r
2262 System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom( dllName );
\r
2264 // (1-2) アセンブリ内のすべての型について、プラグインとして有効か調べる
\r
2265 foreach( Type t in asm.GetTypes() )
\r
2267 // (1-3) ↓クラスであり↓Publicであり↓抽象クラスでなく↓IPlugin型のインスタンスが作れる 型を持っていれば有効
\r
2268 if( t.IsClass && t.IsPublic && !t.IsAbstract && t.GetInterface( strプラグイン型名 ) != null )
\r
2270 // (1-4) クラス名からインスタンスを作成する
\r
2271 var st = new STPlugin() {
\r
2272 plugin = (IPluginActivity) asm.CreateInstance( t.FullName ),
\r
2273 strプラグインフォルダ = Path.GetDirectoryName( dllName ),
\r
2274 strアセンブリ簡易名 = asm.GetName().Name,
\r
2275 Version = asm.GetName().Version,
\r
2278 // (1-5) プラグインリストへ登録
\r
2279 this.listプラグイン.Add( st );
\r
2280 Trace.TraceInformation( "プラグイン {0} ({1}, {2}, {3}) を読み込みました。", t.FullName, Path.GetFileName( dllName ), st.strアセンブリ簡易名, st.Version.ToString() );
\r
2286 Trace.TraceInformation( dllName + " からプラグインを生成することに失敗しました。スキップします。" );
\r
2290 // (2) サブフォルダがあれば再帰する
\r
2291 string[] strDirs = Directory.GetDirectories( strプラグインフォルダパス, "*" );
\r
2292 foreach( string dir in strDirs )
\r
2293 this.t指定フォルダ内でのプラグイン検索と生成( dir + "\\", strプラグイン型名 );
\r
2295 //-----------------
\r
2296 private void Window_MouseUp( object sender, MouseEventArgs e )
\r
2301 private void Window_MouseDoubleClick( object sender, MouseEventArgs e) // #23510 2010.11.13 yyagi: to go full screen mode
\r
2303 if ( mb.Equals(MouseButtons.Left) && ConfigIni.bIsAllowedDoubleClickFullscreen ) // #26752 2011.11.27 yyagi
\r
2305 ConfigIni.bウィンドウモード = false;
\r
2306 this.t全画面・ウィンドウモード切り替え();
\r
2309 private void Window_ResizeEnd(object sender, EventArgs e) // #23510 2010.11.20 yyagi: to get resized window size
\r
2311 ConfigIni.nウインドウwidth = (ConfigIni.bウィンドウモード) ? base.Window.ClientSize.Width : currentClientSize.Width; // #23510 2010.10.31 yyagi add
\r
2312 ConfigIni.nウインドウheight = (ConfigIni.bウィンドウモード) ? base.Window.ClientSize.Height : currentClientSize.Height;
\r
2315 //internal sealed class GCBeep // GC発生の度にbeep
\r
2319 // Console.Beep();
\r
2320 // if ( !AppDomain.CurrentDomain.IsFinalizingForUnload()
\r
2321 // && !Environment.HasShutdownStarted )
\r
2330 //-----------------
\r