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
12 using SlimDX.Direct3D9;
\r
14 using SampleFramework;
\r
18 internal class CDTXMania : Game
\r
22 public static readonly string VERSION = "088(110211)";
\r
23 // public static readonly string VERSION = "086(101120)";
\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
159 public static CSound管理 Sound管理
\r
164 public static CStage起動 stage起動
\r
169 public static CStageタイトル stageタイトル
\r
174 public static CStageオプション stageオプション
\r
179 public static CStageコンフィグ stageコンフィグ
\r
184 public static CStage選曲 stage選曲
\r
189 public static CStage曲読み込み stage曲読み込み
\r
194 public static CStage演奏ギター画面 stage演奏ギター画面
\r
199 public static CStage演奏ドラム画面 stage演奏ドラム画面
\r
204 public static CStage結果 stage結果
\r
209 public static CStage終了 stage終了
\r
214 public static CStage r現在のステージ = null;
\r
215 public static CStage r直前のステージ = null;
\r
216 public static string strEXEのあるフォルダ
\r
221 public static string strコンパクトモードファイル
\r
226 public static CTimer Timer
\r
231 public static Format TextureFormat = Format.A8R8G8B8;
\r
232 internal static IPluginActivity act現在入力を占有中のプラグイン = null;
\r
233 public bool bApplicationActive
\r
238 public bool b次のタイミングで垂直帰線同期切り替えを行う
\r
243 public bool b次のタイミングで全画面・ウィンドウ切り替えを行う
\r
248 public Device Device
\r
250 get { return base.GraphicsDeviceManager.Direct3D9.Device; }
\r
252 public CPluginHost PluginHost
\r
257 public List<STPlugin> listプラグイン = new List<STPlugin>();
\r
258 public struct STPlugin
\r
260 public IPluginActivity plugin;
\r
261 public string strプラグインフォルダ;
\r
262 public string strアセンブリ簡易名;
\r
263 public Version Version;
\r
265 private static Size currentClientSize // #23510 2010.10.27 add yyagi to keep current window size
\r
275 CDTXMania.app = this;
\r
282 public void t全画面・ウィンドウモード切り替え()
\r
284 DeviceSettings settings = base.GraphicsDeviceManager.CurrentSettings.Clone();
\r
285 if( ( ConfigIni != null ) && ( ConfigIni.bウィンドウモード != settings.Windowed ) )
\r
287 settings.Windowed = ConfigIni.bウィンドウモード;
\r
288 if (ConfigIni.bウィンドウモード == false) // #23510 2010.10.27 yyagi: backup current window size before going fullscreen mode
\r
290 currentClientSize = this.Window.ClientSize;
\r
291 ConfigIni.nウインドウwidth = this.Window.ClientSize.Width;
\r
292 ConfigIni.nウインドウheight = this.Window.ClientSize.Height;
\r
294 base.GraphicsDeviceManager.ChangeDevice( settings );
\r
295 if (ConfigIni.bウィンドウモード == true) // #23510 2010.10.27 yyagi: to resume window size from backuped value
\r
297 base.Window.ClientSize =
\r
298 new Size(currentClientSize.Width, currentClientSize.Height);
\r
306 protected override void Initialize()
\r
308 if( this.listトップレベルActivities != null )
\r
310 foreach( CActivity activity in this.listトップレベルActivities )
\r
311 activity.OnManagedリソースの作成();
\r
314 foreach( STPlugin st in this.listプラグイン )
\r
316 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
317 st.plugin.OnManagedリソースの作成();
\r
318 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
321 protected override void LoadContent()
\r
323 if ( ConfigIni.bウィンドウモード )
\r
325 if( !this.bマウスカーソル表示中 )
\r
328 this.bマウスカーソル表示中 = true;
\r
331 else if( this.bマウスカーソル表示中 )
\r
334 this.bマウスカーソル表示中 = false;
\r
336 this.Device.SetTransform( TransformState.View, Matrix.LookAtLH( new Vector3( 0f, 0f, (float) ( -240.0 * Math.Sqrt( 3.0 ) ) ), new Vector3( 0f, 0f, 0f ), new Vector3( 0f, 1f, 0f ) ) );
\r
337 this.Device.SetTransform( TransformState.Projection, Matrix.PerspectiveFovLH( C変換.DegreeToRadian( (float) 60f ), ( (float) this.Device.Viewport.Width ) / ( (float) this.Device.Viewport.Height ), -100f, 100f ) );
\r
338 this.Device.SetRenderState( RenderState.Lighting, false );
\r
339 this.Device.SetRenderState( RenderState.ZEnable, false );
\r
340 this.Device.SetRenderState( RenderState.AntialiasedLineEnable, false );
\r
341 this.Device.SetRenderState( RenderState.AlphaTestEnable, true );
\r
342 this.Device.SetRenderState( RenderState.AlphaRef, 10 );
\r
343 this.Device.SetRenderState<Compare>( RenderState.AlphaFunc, Compare.Greater );
\r
344 this.Device.SetRenderState( RenderState.AlphaBlendEnable, true );
\r
345 this.Device.SetRenderState<Blend>( RenderState.SourceBlend, Blend.SourceAlpha );
\r
346 this.Device.SetRenderState<Blend>( RenderState.DestinationBlend, Blend.InverseSourceAlpha );
\r
347 this.Device.SetTextureStageState( 0, TextureStage.AlphaOperation, TextureOperation.Modulate );
\r
348 this.Device.SetTextureStageState( 0, TextureStage.AlphaArg1, 2 );
\r
349 this.Device.SetTextureStageState( 0, TextureStage.AlphaArg2, 1 );
\r
351 if( this.listトップレベルActivities != null )
\r
353 foreach( CActivity activity in this.listトップレベルActivities )
\r
354 activity.OnUnmanagedリソースの作成();
\r
357 foreach( STPlugin st in this.listプラグイン )
\r
359 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
360 st.plugin.OnUnmanagedリソースの作成();
\r
361 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
364 protected override void UnloadContent()
\r
366 if( this.listトップレベルActivities != null )
\r
368 foreach( CActivity activity in this.listトップレベルActivities )
\r
369 activity.OnUnmanagedリソースの解放();
\r
372 foreach( STPlugin st in this.listプラグイン )
\r
374 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
375 st.plugin.OnUnmanagedリソースの解放();
\r
376 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
379 protected override void OnExiting( EventArgs e )
\r
382 base.OnExiting( e );
\r
384 protected override void Update( GameTime gameTime )
\r
387 protected override void Draw( GameTime gameTime )
\r
389 CScoreIni.C演奏記録 c演奏記録_Drums, c演奏記録_Guitar, c演奏記録_Bass;
\r
390 CDTX.CChip[] chipArray;
\r
393 Sound管理.t再生中の処理をする();
\r
395 if( Timer != null )
\r
398 if( Input管理 != null )
\r
399 Input管理.tポーリング( this.bApplicationActive, CDTXMania.ConfigIni.bバッファ入力を行う );
\r
404 //if( Pad != null ) ポーリング時にクリアしたらダメ!曲の開始時に1回だけクリアする。(2010.9.11)
\r
405 // Pad.st検知したデバイス.Clear();
\r
407 if( this.Device == null )
\r
410 this.Device.BeginScene();
\r
411 this.Device.Clear( ClearFlags.ZBuffer | ClearFlags.Target, Color.Black, 1f, 0 );
\r
413 if( r現在のステージ != null )
\r
415 this.n進行描画の戻り値 = ( r現在のステージ != null ) ? r現在のステージ.On進行描画() : 0;
\r
417 #region [ プラグインの進行描画 ]
\r
418 //---------------------
\r
419 foreach( STPlugin sp in this.listプラグイン )
\r
421 Directory.SetCurrentDirectory( sp.strプラグインフォルダ );
\r
423 if( CDTXMania.act現在入力を占有中のプラグイン == null || CDTXMania.act現在入力を占有中のプラグイン == sp.plugin )
\r
424 sp.plugin.On進行描画( CDTXMania.Pad, CDTXMania.Input管理.Keyboard );
\r
426 sp.plugin.On進行描画( null, null );
\r
428 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
430 //---------------------
\r
433 CScoreIni scoreIni = null;
\r
435 switch( r現在のステージ.eステージID )
\r
437 case CStage.Eステージ.何もしない:
\r
440 case CStage.Eステージ.起動:
\r
442 //-----------------------------
\r
443 if( this.n進行描画の戻り値 != 0 )
\r
448 Trace.TraceInformation( "----------------------" );
\r
449 Trace.TraceInformation( "■ タイトル" );
\r
451 r直前のステージ = r現在のステージ;
\r
452 r現在のステージ = stageタイトル;
\r
457 Trace.TraceInformation( "----------------------" );
\r
458 Trace.TraceInformation( "■ 曲読み込み" );
\r
459 stage曲読み込み.On活性化();
\r
460 r直前のステージ = r現在のステージ;
\r
461 r現在のステージ = stage曲読み込み;
\r
464 foreach( STPlugin pg in this.listプラグイン )
\r
466 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
467 pg.plugin.Onステージ変更();
\r
468 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
471 this.tガベージコレクションを実行する();
\r
473 //-----------------------------
\r
477 case CStage.Eステージ.タイトル:
\r
479 //-----------------------------
\r
480 switch( this.n進行描画の戻り値 )
\r
484 //-----------------------------
\r
486 Trace.TraceInformation( "----------------------" );
\r
487 Trace.TraceInformation( "■ 選曲" );
\r
489 r直前のステージ = r現在のステージ;
\r
490 r現在のステージ = stage選曲;
\r
491 //-----------------------------
\r
497 //-----------------------------
\r
499 Trace.TraceInformation( "----------------------" );
\r
500 Trace.TraceInformation( "■ オプション" );
\r
501 stageオプション.On活性化();
\r
502 r直前のステージ = r現在のステージ;
\r
503 r現在のステージ = stageオプション;
\r
504 //-----------------------------
\r
510 //-----------------------------
\r
512 Trace.TraceInformation( "----------------------" );
\r
513 Trace.TraceInformation( "■ コンフィグ" );
\r
514 stageコンフィグ.On活性化();
\r
515 r直前のステージ = r現在のステージ;
\r
516 r現在のステージ = stageコンフィグ;
\r
517 //-----------------------------
\r
523 //-----------------------------
\r
525 Trace.TraceInformation( "----------------------" );
\r
526 Trace.TraceInformation( "■ 終了" );
\r
528 r直前のステージ = r現在のステージ;
\r
529 r現在のステージ = stage終了;
\r
530 //-----------------------------
\r
535 foreach( STPlugin pg in this.listプラグイン )
\r
537 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
538 pg.plugin.Onステージ変更();
\r
539 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
542 this.tガベージコレクションを実行する();
\r
543 //-----------------------------
\r
547 case CStage.Eステージ.オプション:
\r
549 //-----------------------------
\r
550 if( this.n進行描画の戻り値 != 0 )
\r
552 switch( r直前のステージ.eステージID )
\r
554 case CStage.Eステージ.タイトル:
\r
556 //-----------------------------
\r
558 Trace.TraceInformation( "----------------------" );
\r
559 Trace.TraceInformation( "■ タイトル" );
\r
561 r直前のステージ = r現在のステージ;
\r
562 r現在のステージ = stageタイトル;
\r
564 foreach( STPlugin pg in this.listプラグイン )
\r
566 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
567 pg.plugin.Onステージ変更();
\r
568 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
571 this.tガベージコレクションを実行する();
\r
573 //-----------------------------
\r
576 case CStage.Eステージ.選曲:
\r
578 //-----------------------------
\r
580 Trace.TraceInformation( "----------------------" );
\r
581 Trace.TraceInformation( "■ 選曲" );
\r
583 r直前のステージ = r現在のステージ;
\r
584 r現在のステージ = stage選曲;
\r
586 foreach( STPlugin pg in this.listプラグイン )
\r
588 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
589 pg.plugin.Onステージ変更();
\r
590 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
593 this.tガベージコレクションを実行する();
\r
595 //-----------------------------
\r
599 //-----------------------------
\r
603 case CStage.Eステージ.コンフィグ:
\r
605 //-----------------------------
\r
606 if( this.n進行描画の戻り値 != 0 )
\r
608 switch( r直前のステージ.eステージID )
\r
610 case CStage.Eステージ.タイトル:
\r
612 //-----------------------------
\r
614 Trace.TraceInformation( "----------------------" );
\r
615 Trace.TraceInformation( "■ タイトル" );
\r
617 r直前のステージ = r現在のステージ;
\r
618 r現在のステージ = stageタイトル;
\r
620 foreach( STPlugin pg in this.listプラグイン )
\r
622 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
623 pg.plugin.Onステージ変更();
\r
624 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
627 this.tガベージコレクションを実行する();
\r
629 //-----------------------------
\r
632 case CStage.Eステージ.選曲:
\r
634 //-----------------------------
\r
636 Trace.TraceInformation( "----------------------" );
\r
637 Trace.TraceInformation( "■ 選曲" );
\r
639 r直前のステージ = r現在のステージ;
\r
640 r現在のステージ = stage選曲;
\r
642 foreach( STPlugin pg in this.listプラグイン )
\r
644 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
645 pg.plugin.Onステージ変更();
\r
646 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
649 this.tガベージコレクションを実行する();
\r
651 //-----------------------------
\r
655 //-----------------------------
\r
659 case CStage.Eステージ.選曲:
\r
661 //-----------------------------
\r
662 switch( this.n進行描画の戻り値 )
\r
666 //-----------------------------
\r
668 Trace.TraceInformation( "----------------------" );
\r
669 Trace.TraceInformation( "■ タイトル" );
\r
671 r直前のステージ = r現在のステージ;
\r
672 r現在のステージ = stageタイトル;
\r
674 foreach( STPlugin pg in this.listプラグイン )
\r
676 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
677 pg.plugin.Onステージ変更();
\r
678 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
681 this.tガベージコレクションを実行する();
\r
683 //-----------------------------
\r
688 //-----------------------------
\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
710 //-----------------------------
\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
732 //-----------------------------
\r
734 Trace.TraceInformation( "----------------------" );
\r
735 Trace.TraceInformation( "■ コンフィグ" );
\r
736 stageコンフィグ.On活性化();
\r
737 r直前のステージ = r現在のステージ;
\r
738 r現在のステージ = stageコンフィグ;
\r
740 foreach( STPlugin pg in this.listプラグイン )
\r
742 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
743 pg.plugin.Onステージ変更();
\r
744 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
747 this.tガベージコレクションを実行する();
\r
749 //-----------------------------
\r
752 //-----------------------------
\r
756 case CStage.Eステージ.曲読み込み:
\r
758 //-----------------------------
\r
759 if( this.n進行描画の戻り値 != 0 )
\r
761 CDTXMania.Pad.st検知したデバイス.Clear(); // 入力デバイスフラグクリア(2010.9.11)
\r
764 if( !ConfigIni.bギタレボモード )
\r
766 Trace.TraceInformation( "----------------------" );
\r
767 Trace.TraceInformation( "■ 演奏(ドラム画面)" );
\r
768 #if false // #23625 2011.1.11 Config.iniからダメージ/回復値の定数変更を行う場合はここを有効にする 087リリースに合わせ機能無効化
\r
769 for (int i = 0; i < 5; i++)
\r
771 for (int j = 0; j < 2; j++)
\r
773 stage演奏ドラム画面.fDamageGaugeDelta[i, j] = ConfigIni.fGaugeFactor[i, j];
\r
776 for (int i = 0; i < 3; i++) {
\r
777 stage演奏ドラム画面.fDamageLevelFactor[i] = ConfigIni.fDamageLevelFactor[i];
\r
780 r直前のステージ = r現在のステージ;
\r
781 r現在のステージ = stage演奏ドラム画面;
\r
785 Trace.TraceInformation( "----------------------" );
\r
786 Trace.TraceInformation( "■ 演奏(ギター画面)" );
\r
787 #if false // #23625 2011.1.11 Config.iniからダメージ/回復値の定数変更を行う場合はここを有効にする 087リリースに合わせ機能無効化
\r
788 for (int i = 0; i < 5; i++)
\r
790 for (int j = 0; j < 2; j++)
\r
792 stage演奏ギター画面.fDamageGaugeDelta[i, j] = ConfigIni.fGaugeFactor[i, j];
\r
795 for (int i = 0; i < 3; i++) {
\r
796 stage演奏ギター画面.fDamageLevelFactor[i] = ConfigIni.fDamageLevelFactor[i];
\r
799 r直前のステージ = r現在のステージ;
\r
800 r現在のステージ = stage演奏ギター画面;
\r
803 foreach( STPlugin pg in this.listプラグイン )
\r
805 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
806 pg.plugin.Onステージ変更();
\r
807 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
810 this.tガベージコレクションを実行する();
\r
812 //-----------------------------
\r
816 case CStage.Eステージ.演奏:
\r
818 //-----------------------------
\r
819 switch( this.n進行描画の戻り値 )
\r
825 #region [ 演奏キャンセル ]
\r
826 //-----------------------------
\r
827 scoreIni = this.tScoreIniへBGMAdjustとHistoryとPlayCountを更新( "Play canceled" );
\r
829 #region [ プラグイン On演奏キャンセル() の呼び出し ]
\r
830 //---------------------
\r
831 foreach( STPlugin pg in this.listプラグイン )
\r
833 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
834 pg.plugin.On演奏キャンセル( scoreIni );
\r
835 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
837 //---------------------
\r
845 base.Window.Close();
\r
849 Trace.TraceInformation( "----------------------" );
\r
850 Trace.TraceInformation( "■ 選曲" );
\r
852 r直前のステージ = r現在のステージ;
\r
853 r現在のステージ = stage選曲;
\r
855 #region [ プラグイン Onステージ変更() の呼び出し ]
\r
856 //---------------------
\r
857 foreach( STPlugin pg in this.listプラグイン )
\r
859 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
860 pg.plugin.Onステージ変更();
\r
861 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
863 //---------------------
\r
866 this.tガベージコレクションを実行する();
\r
869 //-----------------------------
\r
873 #region [ 演奏失敗(StageFailed) ]
\r
874 //-----------------------------
\r
875 scoreIni = this.tScoreIniへBGMAdjustとHistoryとPlayCountを更新( "Stage failed" );
\r
877 #region [ プラグイン On演奏失敗() の呼び出し ]
\r
878 //---------------------
\r
879 foreach( STPlugin pg in this.listプラグイン )
\r
881 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
882 pg.plugin.On演奏失敗( scoreIni );
\r
883 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
885 //---------------------
\r
893 base.Window.Close();
\r
897 Trace.TraceInformation( "----------------------" );
\r
898 Trace.TraceInformation( "■ 選曲" );
\r
900 r直前のステージ = r現在のステージ;
\r
901 r現在のステージ = stage選曲;
\r
903 #region [ プラグイン Onステージ変更() の呼び出し ]
\r
904 //---------------------
\r
905 foreach( STPlugin pg in this.listプラグイン )
\r
907 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
908 pg.plugin.Onステージ変更();
\r
909 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
911 //---------------------
\r
914 this.tガベージコレクションを実行する();
\r
917 //-----------------------------
\r
922 //-----------------------------
\r
923 chipArray = new CDTX.CChip[ 10 ];
\r
924 if( ConfigIni.bギタレボモード )
\r
926 stage演奏ギター画面.t演奏結果を格納する( out c演奏記録_Drums, out c演奏記録_Guitar, out c演奏記録_Bass );
\r
930 stage演奏ドラム画面.t演奏結果を格納する( out c演奏記録_Drums, out c演奏記録_Guitar, out c演奏記録_Bass, out chipArray );
\r
933 if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.24 yyagi Gt/Bsを入れ替えていたなら、演奏結果も入れ替える
\r
937 c演奏記録_Guitar = c演奏記録_Bass;
\r
940 CDTXMania.DTX.SwapGuitarBassInfos(); // 譜面情報も元に戻す
\r
941 CDTXMania.DTX.SwapGuitarBassInfos_AutoFlags(); // #24415 2011.2.27 yyagi
\r
942 // リザルト集計時のみ、Auto系のフラグを入れ替え
\r
943 // これを戻すのは、リザルト集計後。
\r
944 } // "case CStage.Eステージ.結果:"のところ。
\r
947 switch( CScoreIni.t総合ランク値を計算して返す( c演奏記録_Drums, c演奏記録_Guitar, c演奏記録_Bass ) )
\r
950 str = "Cleared (Rank:SS)";
\r
954 str = "Cleared (Rank:S)";
\r
958 str = "Cleared (Rank:A)";
\r
962 str = "Cleared (Rank:B)";
\r
966 str = "Cleared (Rank:C)";
\r
970 str = "Cleared (Rank:D)";
\r
974 str = "Cleared (Rank:E)";
\r
977 case 99: // #23534 2010.10.28 yyagi add: 演奏チップが0個のとき
\r
978 str = "Cleared (No chips)";
\r
982 scoreIni = this.tScoreIniへBGMAdjustとHistoryとPlayCountを更新( str );
\r
984 #region [ プラグイン On演奏クリア() の呼び出し ]
\r
985 //---------------------
\r
986 foreach( STPlugin pg in this.listプラグイン )
\r
988 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
989 pg.plugin.On演奏クリア( scoreIni );
\r
990 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
992 //---------------------
\r
996 Trace.TraceInformation( "----------------------" );
\r
997 Trace.TraceInformation( "■ 結果" );
\r
998 stage結果.st演奏記録.Drums = c演奏記録_Drums;
\r
999 stage結果.st演奏記録.Guitar = c演奏記録_Guitar;
\r
1000 stage結果.st演奏記録.Bass = c演奏記録_Bass;
\r
1001 stage結果.r空うちドラムチップ = chipArray;
\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
1018 //-----------------------------
\r
1021 //-----------------------------
\r
1025 case CStage.Eステージ.結果:
\r
1027 //-----------------------------
\r
1028 if( this.n進行描画の戻り値 != 0 )
\r
1030 if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24415 2011.2.27 yyagi Gt/Bsを入れ替えていたなら、Auto状態をリザルト画面終了後に元に戻す
\r
1032 CDTXMania.DTX.SwapGuitarBassInfos_AutoFlags(); // Auto入れ替え
\r
1035 DTX.t全チップの再生一時停止();
\r
1037 r現在のステージ.On非活性化();
\r
1040 Trace.TraceInformation( "----------------------" );
\r
1041 Trace.TraceInformation( "■ 選曲" );
\r
1043 r直前のステージ = r現在のステージ;
\r
1044 r現在のステージ = stage選曲;
\r
1046 foreach( STPlugin pg in this.listプラグイン )
\r
1048 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1049 pg.plugin.Onステージ変更();
\r
1050 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1053 this.tガベージコレクションを実行する();
\r
1057 base.Window.Close();
\r
1060 //-----------------------------
\r
1064 case CStage.Eステージ.終了:
\r
1066 //-----------------------------
\r
1067 if( this.n進行描画の戻り値 != 0 )
\r
1071 //-----------------------------
\r
1077 this.Device.EndScene();
\r
1078 #region [ 全画面・ウインドウ切り替え ]
\r
1079 if ( this.b次のタイミングで全画面・ウィンドウ切り替えを行う )
\r
1081 ConfigIni.b全画面モード = !ConfigIni.b全画面モード;
\r
1082 app.t全画面・ウィンドウモード切り替え();
\r
1083 this.b次のタイミングで全画面・ウィンドウ切り替えを行う = false;
\r
1086 #region [ 垂直基線同期切り替え ]
\r
1087 if ( this.b次のタイミングで垂直帰線同期切り替えを行う )
\r
1089 bool bIsMaximized = this.Window.IsMaximized; // #23510 2010.11.3 yyagi: to backup current window mode before changing VSyncWait
\r
1090 currentClientSize = this.Window.ClientSize; // #23510 2010.11.3 yyagi: to backup current window size before changing VSyncWait
\r
1091 DeviceSettings currentSettings = app.GraphicsDeviceManager.CurrentSettings;
\r
1092 currentSettings.EnableVSync = ConfigIni.b垂直帰線待ちを行う;
\r
1093 app.GraphicsDeviceManager.ChangeDevice( currentSettings );
\r
1094 this.b次のタイミングで垂直帰線同期切り替えを行う = false;
\r
1095 base.Window.ClientSize = new Size(currentClientSize.Width, currentClientSize.Height); // #23510 2010.11.3 yyagi: to resume window size after changing VSyncWait
\r
1098 this.Window.WindowState = FormWindowState.Maximized; // #23510 2010.11.3 yyagi: to resume window mode after changing VSyncWait
\r
1107 #region [ テクスチャの生成・解放のためのヘルパー ]
\r
1108 //-----------------
\r
1109 public static CTexture tテクスチャの生成( string fileName )
\r
1111 return tテクスチャの生成( fileName, false );
\r
1113 public static CTexture tテクスチャの生成( string fileName, bool b黒を透過する )
\r
1121 return new CTexture( app.Device, fileName, TextureFormat, b黒を透過する );
\r
1123 catch( CTextureCreateFailedException )
\r
1125 Trace.TraceError( "テクスチャの生成に失敗しました。({0})", new object[] { fileName } );
\r
1129 public static void tテクスチャの解放( ref CTexture tx )
\r
1137 //-----------------
\r
1140 #region [ private ]
\r
1141 //-----------------
\r
1142 private bool bマウスカーソル表示中 = true;
\r
1143 private bool b終了処理完了済み;
\r
1144 private static CDTX dtx;
\r
1145 private List<CActivity> listトップレベルActivities;
\r
1146 private int n進行描画の戻り値;
\r
1148 private void t起動処理()
\r
1150 #region [ strEXEのあるフォルダを決定する ]
\r
1151 //-----------------
\r
1152 // BEGIN #23629 2010.11.13 from: デバッグ時は Application.ExecutablePath が ($SolutionDir)/bin/x86/Debug/ などになり System/ の読み込みに失敗するので、カレントディレクトリを採用する。(プロジェクトのプロパティ→デバッグ→作業ディレクトリが有効になる)
\r
1154 strEXEのあるフォルダ = Environment.CurrentDirectory + @"\";
\r
1156 strEXEのあるフォルダ = Path.GetDirectoryName( Application.ExecutablePath ) + @"\"; // #23629 2010.11.9 yyagi: set correct pathname where DTXManiaGR.exe is.
\r
1158 // END #23629 2010.11.13 from
\r
1159 //-----------------
\r
1162 #region [ Config.ini の読込み ]
\r
1163 //---------------------
\r
1164 ConfigIni = new CConfigIni();
\r
1165 string path = strEXEのあるフォルダ + "Config.ini";
\r
1166 if( File.Exists( path ) )
\r
1170 ConfigIni.t読み込み( path );
\r
1174 //ConfigIni = new CConfigIni(); // 存在してなければ新規生成
\r
1177 //---------------------
\r
1179 #region [ ログ出力開始 ]
\r
1180 //---------------------
\r
1181 Trace.AutoFlush = true;
\r
1182 if( ConfigIni.bログ出力 )
\r
1186 Trace.Listeners.Add( new CTraceLogListener( new StreamWriter( "DTXManiaLog.txt", false, Encoding.GetEncoding( "shift-jis" ) ) ) );
\r
1188 catch ( System.UnauthorizedAccessException ) // #24481 2011.2.20 yyagi
\r
1190 int c = (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja")? 0 : 1;
\r
1191 string[] mes_writeErr = {
\r
1192 "DTXManiaLog.txtへの書き込みができませんでした。書き込みできるようにしてから、再度起動してください。",
\r
1193 "Failed to write DTXManiaLog.txt. Please set it writable and try again."
\r
1195 MessageBox.Show( mes_writeErr[c], "DTXMania boot error", MessageBoxButtons.OK, MessageBoxIcon.Error );
\r
1196 Environment.Exit(1);
\r
1199 Trace.WriteLine("");
\r
1200 Trace.WriteLine( "DTXMania powered by YAMAHA Silent Session Drums" );
\r
1201 Trace.WriteLine( string.Format( "Release: {0}", VERSION ) );
\r
1202 Trace.WriteLine( "" );
\r
1203 Trace.TraceInformation( "----------------------" );
\r
1204 Trace.TraceInformation( "■ アプリケーションの初期化" );
\r
1205 Trace.TraceInformation( "OS Version: " + Environment.OSVersion );
\r
1206 Trace.TraceInformation( "ProcessorCount: " + Environment.ProcessorCount.ToString() );
\r
1207 Trace.TraceInformation( "CLR Version: " + Environment.Version.ToString() );
\r
1208 //---------------------
\r
1210 #region [ コンパクトモードスイッチの有無 ]
\r
1211 //---------------------
\r
1212 bコンパクトモード = false;
\r
1213 strコンパクトモードファイル = "";
\r
1214 string[] commandLineArgs = Environment.GetCommandLineArgs();
\r
1215 if( ( commandLineArgs != null ) && ( commandLineArgs.Length > 1 ) )
\r
1218 strコンパクトモードファイル = commandLineArgs[ 1 ];
\r
1219 Trace.TraceInformation( "コンパクトモードで起動します。[{0}]", new object[] { strコンパクトモードファイル } );
\r
1221 //---------------------
\r
1224 #region [ ウィンドウ初期化 ]
\r
1225 //---------------------
\r
1226 base.Window.Text = "DTXMania .NET style release " + VERSION;
\r
1227 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
1228 if (!ConfigIni.bウィンドウモード) // #23510 2010.11.02 yyagi: add; to recover window size in case bootup with fullscreen mode
\r
1230 currentClientSize = new Size(ConfigIni.nウインドウwidth, ConfigIni.nウインドウheight);
\r
1232 base.Window.MaximizeBox = true; // #23510 2010.11.04 yyagi: to support maximizing window
\r
1233 base.Window.FormBorderStyle = FormBorderStyle.Sizable; // #23510 2010.10.27 yyagi: changed from FixedDialog to Sizable, to support window resize
\r
1234 base.Window.ShowIcon = true;
\r
1235 base.Window.Icon = Properties.Resources.dtx;
\r
1236 base.Window.KeyDown += new KeyEventHandler( this.Window_KeyDown );
\r
1237 base.Window.MouseDoubleClick += new MouseEventHandler(this.Window_MouseDoubleClick); // #23510 2010.11.13 yyagi: to go fullscreen mode
\r
1238 base.Window.ResizeEnd += new EventHandler(this.Window_ResizeEnd); // #23510 2010.11.20 yyagi: to set resized window size in Config.ini
\r
1239 base.Window.ApplicationActivated += new EventHandler(this.Window_ApplicationActivated);
\r
1240 base.Window.ApplicationDeactivated += new EventHandler( this.Window_ApplicationDeactivated );
\r
1241 //---------------------
\r
1243 #region [ Direct3D9 デバイスの生成 ]
\r
1244 //---------------------
\r
1245 DeviceSettings settings = new DeviceSettings();
\r
1246 settings.Windowed = ConfigIni.bウィンドウモード;
\r
1247 settings.BackBufferWidth = 640;
\r
1248 settings.BackBufferHeight = 480;
\r
1249 settings.EnableVSync = ConfigIni.b垂直帰線待ちを行う;
\r
1252 base.GraphicsDeviceManager.ChangeDevice(settings);
\r
1254 catch (DeviceCreationException e)
\r
1256 Trace.TraceError(e.ToString());
\r
1257 MessageBox.Show(e.Message + e.ToString(), "DTXMania failed to boot: DirectX9 Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1258 Environment.Exit(-1);
\r
1261 base.IsFixedTimeStep = false;
\r
1262 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
1263 base.InactiveSleepTime = TimeSpan.FromMilliseconds((float)(ConfigIni.n非フォーカス時スリープms)); // #23568 2010.11.3 yyagi: to support valiable sleep value when !IsActive
\r
1264 // #23568 2010.11.4 ikanick changed ( 1 -> ConfigIni )
\r
1265 //---------------------
\r
1270 #region [ Skin の初期化 ]
\r
1271 //---------------------
\r
1272 Trace.TraceInformation( "スキンの初期化を行います。" );
\r
1276 Skin = new CSkin();
\r
1277 Trace.TraceInformation( "スキンの初期化を完了しました。" );
\r
1281 Trace.TraceInformation( "スキンの初期化に失敗しました。" );
\r
1288 //---------------------
\r
1290 #region [ Timer の初期化 ]
\r
1291 //---------------------
\r
1292 Trace.TraceInformation( "タイマの初期化を行います。" );
\r
1296 Timer = new CTimer( CTimer.E種別.MultiMedia );
\r
1297 Trace.TraceInformation( "タイマの初期化を完了しました。" );
\r
1303 //---------------------
\r
1305 #region [ FPS カウンタの初期化 ]
\r
1306 //---------------------
\r
1307 Trace.TraceInformation( "FPSカウンタの初期化を行います。" );
\r
1312 Trace.TraceInformation( "FPSカウンタを生成しました。" );
\r
1318 //---------------------
\r
1320 #region [ act文字コンソールの初期化 ]
\r
1321 //---------------------
\r
1322 Trace.TraceInformation( "文字コンソールの初期化を行います。" );
\r
1326 act文字コンソール = new C文字コンソール();
\r
1327 Trace.TraceInformation( "文字コンソールを生成しました。" );
\r
1328 act文字コンソール.On活性化();
\r
1329 Trace.TraceInformation( "文字コンソールを活性化しました。" );
\r
1330 Trace.TraceInformation( "文字コンソールの初期化を完了しました。" );
\r
1332 catch( Exception exception )
\r
1334 Trace.TraceError( exception.Message );
\r
1335 Trace.TraceError( "文字コンソールの初期化に失敗しました。" );
\r
1341 //---------------------
\r
1343 #region [ Input管理 の初期化 ]
\r
1344 //---------------------
\r
1345 Trace.TraceInformation( "DirectInput, MIDI入力の初期化を行います。" );
\r
1349 Input管理 = new CInput管理( base.Window.Handle );
\r
1350 foreach( IInputDevice device in Input管理.list入力デバイス )
\r
1352 if( ( device.e入力デバイス種別 == E入力デバイス種別.Joystick ) && !ConfigIni.dicJoystick.ContainsValue( device.GUID ) )
\r
1355 while( ConfigIni.dicJoystick.ContainsKey( key ) )
\r
1359 ConfigIni.dicJoystick.Add( key, device.GUID );
\r
1362 foreach( IInputDevice device2 in Input管理.list入力デバイス )
\r
1364 if( device2.e入力デバイス種別 == E入力デバイス種別.Joystick )
\r
1366 foreach( KeyValuePair<int, string> pair in ConfigIni.dicJoystick )
\r
1368 if( device2.GUID.Equals( pair.Value ) )
\r
1370 ( (CInputJoystick) device2 ).SetID( pair.Key );
\r
1377 Trace.TraceInformation( "DirectInput の初期化を完了しました。" );
\r
1379 catch( Exception exception2 )
\r
1381 Trace.TraceError( exception2.Message );
\r
1382 Trace.TraceError( "DirectInput, MIDI入力の初期化に失敗しました。" );
\r
1389 //---------------------
\r
1391 #region [ Pad の初期化 ]
\r
1392 //---------------------
\r
1393 Trace.TraceInformation( "パッドの初期化を行います。" );
\r
1397 Pad = new CPad( ConfigIni, Input管理 );
\r
1398 Trace.TraceInformation( "パッドの初期化を完了しました。" );
\r
1400 catch( Exception exception3 )
\r
1402 Trace.TraceError( exception3.Message );
\r
1403 Trace.TraceError( "パッドの初期化に失敗しました。" );
\r
1409 //---------------------
\r
1411 #region [ Sound管理 の初期化 ]
\r
1412 //---------------------
\r
1413 Trace.TraceInformation( "DirectSound の初期化を行います。" );
\r
1417 Sound管理 = new CSound管理( base.Window.Handle );
\r
1418 Trace.TraceInformation( "DirectSound の初期化を完了しました。" );
\r
1422 Trace.TraceError( "DirectSound の初期化に失敗しました。" );
\r
1429 //---------------------
\r
1431 #region [ Songs管理 の初期化 ]
\r
1432 //---------------------
\r
1433 Trace.TraceInformation( "曲リストの初期化を行います。" );
\r
1437 Songs管理 = new CSongs管理();
\r
1438 Trace.TraceInformation( "曲リストの初期化を完了しました。" );
\r
1440 catch( Exception exception4 )
\r
1442 Trace.TraceError( exception4.Message );
\r
1443 Trace.TraceError( "曲リストの初期化に失敗しました。" );
\r
1449 //---------------------
\r
1451 #region [ CAvi の初期化 ]
\r
1452 //---------------------
\r
1454 //---------------------
\r
1456 #region [ Random の初期化 ]
\r
1457 //---------------------
\r
1458 Random = new Random( (int) Timer.nシステム時刻 );
\r
1459 //---------------------
\r
1461 #region [ ステージの初期化 ]
\r
1462 //---------------------
\r
1465 stage起動 = new CStage起動();
\r
1466 stageタイトル = new CStageタイトル();
\r
1467 stageオプション = new CStageオプション();
\r
1468 stageコンフィグ = new CStageコンフィグ();
\r
1469 stage選曲 = new CStage選曲();
\r
1470 stage曲読み込み = new CStage曲読み込み();
\r
1471 stage演奏ドラム画面 = new CStage演奏ドラム画面();
\r
1472 stage演奏ギター画面 = new CStage演奏ギター画面();
\r
1473 stage結果 = new CStage結果();
\r
1474 stage終了 = new CStage終了();
\r
1475 this.listトップレベルActivities = new List<CActivity>();
\r
1476 this.listトップレベルActivities.Add( act文字コンソール );
\r
1477 this.listトップレベルActivities.Add( stage起動 );
\r
1478 this.listトップレベルActivities.Add( stageタイトル );
\r
1479 this.listトップレベルActivities.Add( stageオプション );
\r
1480 this.listトップレベルActivities.Add( stageコンフィグ );
\r
1481 this.listトップレベルActivities.Add( stage選曲 );
\r
1482 this.listトップレベルActivities.Add( stage曲読み込み );
\r
1483 this.listトップレベルActivities.Add( stage演奏ドラム画面 );
\r
1484 this.listトップレベルActivities.Add( stage演奏ギター画面 );
\r
1485 this.listトップレベルActivities.Add( stage結果 );
\r
1486 this.listトップレベルActivities.Add( stage終了 );
\r
1487 //---------------------
\r
1489 #region [ プラグインの検索と生成 ]
\r
1490 //---------------------
\r
1491 PluginHost = new CPluginHost();
\r
1493 Trace.TraceInformation( "プラグインの検索と生成を行います。" );
\r
1497 this.tプラグイン検索と生成();
\r
1498 Trace.TraceInformation( "プラグインの検索と生成を完了しました。" );
\r
1504 //---------------------
\r
1506 #region [ プラグインの初期化 ]
\r
1507 //---------------------
\r
1508 if( this.listプラグイン != null && this.listプラグイン.Count > 0 )
\r
1510 Trace.TraceInformation( "プラグインの初期化を行います。" );
\r
1514 foreach( STPlugin st in this.listプラグイン )
\r
1516 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
1517 st.plugin.On初期化( this.PluginHost );
\r
1518 st.plugin.OnManagedリソースの作成();
\r
1519 st.plugin.OnUnmanagedリソースの作成();
\r
1520 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1522 Trace.TraceInformation( "すべてのプラグインの初期化を完了しました。" );
\r
1526 Trace.TraceError( "プラグインのどれかの初期化に失敗しました。" );
\r
1535 //---------------------
\r
1538 Trace.TraceInformation( "アプリケーションの初期化を完了しました。" );
\r
1540 #region [ 最初のステージの起動 ]
\r
1541 //---------------------
\r
1542 Trace.TraceInformation( "----------------------" );
\r
1543 Trace.TraceInformation( "■ 起動" );
\r
1545 r現在のステージ = stage起動;
\r
1547 //---------------------
\r
1550 private void t終了処理()
\r
1552 if( !this.b終了処理完了済み )
\r
1554 Trace.TraceInformation( "----------------------" );
\r
1555 Trace.TraceInformation( "■ アプリケーションの終了" );
\r
1556 #region [ 現在のステージの終了処理 ]
\r
1557 //---------------------
\r
1558 if (r現在のステージ != null)
\r
1560 Trace.TraceInformation( "現在のステージを終了します。" );
\r
1564 r現在のステージ.On非活性化();
\r
1565 Trace.TraceInformation( "現在のステージの終了処理を完了しました。" );
\r
1572 //---------------------
\r
1574 #region [ プラグインの終了処理 ]
\r
1575 //---------------------
\r
1576 if (this.listプラグイン != null && this.listプラグイン.Count > 0)
\r
1578 Trace.TraceInformation( "すべてのプラグインを終了します。" );
\r
1582 foreach( STPlugin st in this.listプラグイン )
\r
1584 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
1585 st.plugin.OnUnmanagedリソースの解放();
\r
1586 st.plugin.OnManagedリソースの解放();
\r
1588 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1590 PluginHost = null;
\r
1591 Trace.TraceInformation( "すべてのプラグインの終了処理を完了しました。" );
\r
1598 //---------------------
\r
1600 #region [ 曲リストの終了処理 ]
\r
1601 //---------------------
\r
1602 if (Songs管理 != null)
\r
1604 Trace.TraceInformation( "曲リストの終了処理を行います。" );
\r
1609 Trace.TraceInformation( "曲リストの終了処理を完了しました。" );
\r
1611 catch( Exception exception )
\r
1613 Trace.TraceError( exception.Message );
\r
1614 Trace.TraceError( "曲リストの終了処理に失敗しました。" );
\r
1622 //---------------------
\r
1624 #region [ スキンの終了処理 ]
\r
1625 //---------------------
\r
1628 Trace.TraceInformation( "スキンの終了処理を行います。" );
\r
1634 Trace.TraceInformation( "スキンの終了処理を完了しました。" );
\r
1636 catch( Exception exception2 )
\r
1638 Trace.TraceError( exception2.Message );
\r
1639 Trace.TraceError( "スキンの終了処理に失敗しました。" );
\r
1646 //---------------------
\r
1648 #region [ DirectSoundの終了処理 ]
\r
1649 //---------------------
\r
1650 if (Sound管理 != null)
\r
1652 Trace.TraceInformation( "DirectSound の終了処理を行います。" );
\r
1656 Sound管理.Dispose();
\r
1658 Trace.TraceInformation( "DirectSound の終了処理を完了しました。" );
\r
1660 catch( Exception exception3 )
\r
1662 Trace.TraceError( exception3.Message );
\r
1663 Trace.TraceError( "DirectSound の終了処理に失敗しました。" );
\r
1670 //---------------------
\r
1672 #region [ パッドの終了処理 ]
\r
1673 //---------------------
\r
1676 Trace.TraceInformation( "パッドの終了処理を行います。" );
\r
1681 Trace.TraceInformation( "パッドの終了処理を完了しました。" );
\r
1683 catch( Exception exception4 )
\r
1685 Trace.TraceError( exception4.Message );
\r
1686 Trace.TraceError( "パッドの終了処理に失敗しました。" );
\r
1693 //---------------------
\r
1695 #region [ DirectInput, MIDI入力の終了処理 ]
\r
1696 //---------------------
\r
1697 if (Input管理 != null)
\r
1699 Trace.TraceInformation( "DirectInput, MIDI入力の終了処理を行います。" );
\r
1703 Input管理.Dispose();
\r
1705 Trace.TraceInformation( "DirectInput, MIDI入力の終了処理を完了しました。" );
\r
1707 catch( Exception exception5 )
\r
1709 Trace.TraceError( exception5.Message );
\r
1710 Trace.TraceError( "DirectInput, MIDI入力の終了処理に失敗しました。" );
\r
1717 //---------------------
\r
1719 #region [ 文字コンソールの終了処理 ]
\r
1720 //---------------------
\r
1721 if (act文字コンソール != null)
\r
1723 Trace.TraceInformation( "文字コンソールの終了処理を行います。" );
\r
1727 act文字コンソール.On非活性化();
\r
1728 act文字コンソール = null;
\r
1729 Trace.TraceInformation( "文字コンソールの終了処理を完了しました。" );
\r
1731 catch( Exception exception6 )
\r
1733 Trace.TraceError( exception6.Message );
\r
1734 Trace.TraceError( "文字コンソールの終了処理に失敗しました。" );
\r
1741 //---------------------
\r
1743 #region [ FPSカウンタの終了処理 ]
\r
1744 //---------------------
\r
1745 Trace.TraceInformation("FPSカウンタの終了処理を行います。");
\r
1753 Trace.TraceInformation( "FPSカウンタの終了処理を完了しました。" );
\r
1759 //---------------------
\r
1761 #region [ タイマの終了処理 ]
\r
1762 //---------------------
\r
1763 Trace.TraceInformation("タイマの終了処理を行います。");
\r
1767 if( Timer != null )
\r
1771 Trace.TraceInformation( "タイマの終了処理を完了しました。" );
\r
1775 Trace.TraceInformation( "タイマは使用されていません。" );
\r
1782 //---------------------
\r
1784 #region [ Config.iniの出力 ]
\r
1785 //---------------------
\r
1786 Trace.TraceInformation("Config.ini を出力します。");
\r
1787 // if ( ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.16 yyagi ギターベースがスワップしているときは元に戻す
\r
1788 if ( ConfigIni.bIsSwappedGuitarBass_AutoFlagsAreSwapped ) // #24415 2011.2.21 yyagi FLIP中かつ演奏中にalt-f4で終了したときは、AUTOのフラグをswapして戻す
\r
1790 DTX.SwapGuitarBassInfos_AutoFlags();
\r
1792 string str = strEXEのあるフォルダ + "Config.ini";
\r
1796 ConfigIni.t書き出し( str );
\r
1797 Trace.TraceInformation( "保存しました。({0})", new object[] { str } );
\r
1799 catch( Exception e )
\r
1801 Trace.TraceError( e.Message );
\r
1802 Trace.TraceError( "Config.ini の出力に失敗しました。({0})", new object[] { str } );
\r
1808 //---------------------
\r
1810 Trace.TraceInformation("アプリケーションの終了処理を完了しました。");
\r
1813 this.b終了処理完了済み = true;
\r
1816 private void Window_ApplicationActivated( object sender, EventArgs e )
\r
1818 this.bApplicationActive = true;
\r
1820 private void Window_ApplicationDeactivated( object sender, EventArgs e )
\r
1822 this.bApplicationActive = false;
\r
1824 private void Window_KeyDown( object sender, KeyEventArgs e )
\r
1826 if (e.KeyCode == Keys.Menu)
\r
1829 e.SuppressKeyPress = true;
\r
1831 else if ((e.KeyCode == Keys.Return) && e.Alt)
\r
1833 if (ConfigIni != null)
\r
1835 ConfigIni.bウィンドウモード = !ConfigIni.bウィンドウモード;
\r
1836 this.t全画面・ウィンドウモード切り替え();
\r
1839 e.SuppressKeyPress = true;
\r
1842 private CScoreIni tScoreIniへBGMAdjustとHistoryとPlayCountを更新(string str新ヒストリ行)
\r
1844 bool bIsUpdatedDrums, bIsUpdatedGuitar, bIsUpdatedBass;
\r
1845 string strFilename = DTX.strファイル名の絶対パス + ".score.ini";
\r
1846 CScoreIni ini = new CScoreIni( strFilename );
\r
1847 if( !File.Exists( strFilename ) )
\r
1849 ini.stファイル.Title = DTX.TITLE;
\r
1850 ini.stファイル.Name = DTX.strファイル名;
\r
1851 ini.stファイル.Hash = CScoreIni.tファイルのMD5を求めて返す( DTX.strファイル名の絶対パス );
\r
1852 for( int i = 0; i < 6; i++ )
\r
1854 ini.stセクション[ i ].nPerfectになる範囲ms = nPerfect範囲ms;
\r
1855 ini.stセクション[ i ].nGreatになる範囲ms = nGreat範囲ms;
\r
1856 ini.stセクション[ i ].nGoodになる範囲ms = nGood範囲ms;
\r
1857 ini.stセクション[ i ].nPoorになる範囲ms = nPoor範囲ms;
\r
1860 ini.stファイル.BGMAdjust = DTX.nBGMAdjust;
\r
1861 CScoreIni.t更新条件を取得する( out bIsUpdatedDrums, out bIsUpdatedGuitar, out bIsUpdatedBass );
\r
1862 if( bIsUpdatedDrums || bIsUpdatedGuitar || bIsUpdatedBass )
\r
1864 if( bIsUpdatedDrums )
\r
1866 ini.stファイル.PlayCountDrums++;
\r
1868 if( bIsUpdatedGuitar )
\r
1870 ini.stファイル.PlayCountGuitar++;
\r
1872 if( bIsUpdatedBass )
\r
1874 ini.stファイル.PlayCountBass++;
\r
1876 ini.tヒストリを追加する( str新ヒストリ行 );
\r
1879 stage選曲.r現在選択中のスコア.譜面情報.演奏回数.Drums = ini.stファイル.PlayCountDrums;
\r
1880 stage選曲.r現在選択中のスコア.譜面情報.演奏回数.Guitar = ini.stファイル.PlayCountGuitar;
\r
1881 stage選曲.r現在選択中のスコア.譜面情報.演奏回数.Bass = ini.stファイル.PlayCountBass;
\r
1882 for( int j = 0; j < ini.stファイル.History.Length; j++ )
\r
1884 stage選曲.r現在選択中のスコア.譜面情報.演奏履歴[ j ] = ini.stファイル.History[ j ];
\r
1888 if( ConfigIni.bScoreIniを出力する )
\r
1890 ini.t書き出し( strFilename );
\r
1895 private void tガベージコレクションを実行する()
\r
1898 GC.WaitForPendingFinalizers();
\r
1900 GC.WaitForPendingFinalizers();
\r
1902 private void tプラグイン検索と生成()
\r
1904 this.listプラグイン = new List<STPlugin>();
\r
1906 string strIPluginActivityの名前 = typeof( IPluginActivity ).FullName;
\r
1907 string strプラグインフォルダパス = strEXEのあるフォルダ + "Plugins\\";
\r
1909 this.t指定フォルダ内でのプラグイン検索と生成( strプラグインフォルダパス, strIPluginActivityの名前 );
\r
1911 if( this.listプラグイン.Count > 0 )
\r
1912 Trace.TraceInformation( this.listプラグイン.Count + " 個のプラグインを読み込みました。" );
\r
1914 private void t指定フォルダ内でのプラグイン検索と生成( string strプラグインフォルダパス, string strプラグイン型名 )
\r
1916 // 指定されたパスが存在しないとエラー
\r
1917 if( !Directory.Exists( strプラグインフォルダパス ) )
\r
1919 Trace.TraceWarning( "プラグインフォルダが存在しません。(" + strプラグインフォルダパス + ")" );
\r
1923 // (1) すべての *.dll について…
\r
1924 string[] strDLLs = System.IO.Directory.GetFiles( strプラグインフォルダパス, "*.dll" );
\r
1925 foreach( string dllName in strDLLs )
\r
1929 // (1-1) dll をアセンブリとして読み込む。
\r
1930 System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom( dllName );
\r
1932 // (1-2) アセンブリ内のすべての型について、プラグインとして有効か調べる
\r
1933 foreach( Type t in asm.GetTypes() )
\r
1935 // (1-3) ↓クラスであり↓Publicであり↓抽象クラスでなく↓IPlugin型のインスタンスが作れる 型を持っていれば有効
\r
1936 if( t.IsClass && t.IsPublic && !t.IsAbstract && t.GetInterface( strプラグイン型名 ) != null )
\r
1938 // (1-4) クラス名からインスタンスを作成する
\r
1939 var st = new STPlugin() {
\r
1940 plugin = (IPluginActivity) asm.CreateInstance( t.FullName ),
\r
1941 strプラグインフォルダ = Path.GetDirectoryName( dllName ),
\r
1942 strアセンブリ簡易名 = asm.GetName().Name,
\r
1943 Version = asm.GetName().Version,
\r
1946 // (1-5) プラグインリストへ登録
\r
1947 this.listプラグイン.Add( st );
\r
1948 Trace.TraceInformation( "プラグイン {0} ({1}, {2}, {3}) を読み込みました。", t.FullName, Path.GetFileName( dllName ), st.strアセンブリ簡易名, st.Version.ToString() );
\r
1954 Trace.TraceInformation( dllName + " からプラグインを生成することに失敗しました。スキップします。" );
\r
1958 // (2) サブフォルダがあれば再帰する
\r
1959 string[] strDirs = Directory.GetDirectories( strプラグインフォルダパス, "*" );
\r
1960 foreach( string dir in strDirs )
\r
1961 this.t指定フォルダ内でのプラグイン検索と生成( dir + "\\", strプラグイン型名 );
\r
1963 //-----------------
\r
1964 private void Window_MouseDoubleClick( object sender, MouseEventArgs e) // #23510 2010.11.13 yyagi: to go full screen mode
\r
1966 ConfigIni.bウィンドウモード = false;
\r
1967 this.t全画面・ウィンドウモード切り替え();
\r
1969 private void Window_ResizeEnd(object sender, EventArgs e) // #23510 2010.11.20 yyagi: to get resized window size
\r
1971 ConfigIni.nウインドウwidth = (ConfigIni.bウィンドウモード) ? base.Window.ClientSize.Width : currentClientSize.Width; // #23510 2010.10.31 yyagi add
\r
1972 ConfigIni.nウインドウheight = (ConfigIni.bウィンドウモード) ? base.Window.ClientSize.Height : currentClientSize.Height;
\r