2 using System.Collections.Generic;
\r
3 using System.Globalization;
\r
5 using System.Windows.Forms;
\r
6 using System.Drawing;
\r
7 using System.Diagnostics;
\r
8 using System.Runtime.InteropServices;
\r
10 using System.Threading;
\r
11 using System.Runtime.Serialization.Formatters.Binary;
\r
13 using SlimDX.Direct3D9;
\r
15 using SampleFramework;
\r
19 internal class CDTXMania : Game
\r
22 #region [ properties ]
\r
23 public static readonly string VERSION = "103(150815)";
\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
80 public static int nPerfect範囲ms
\r
84 if( stage選曲.r確定された曲 != null )
\r
86 C曲リストノード c曲リストノード = stage選曲.r確定された曲.r親ノード;
\r
87 if( ( ( c曲リストノード != null ) && ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX ) ) && ( c曲リストノード.nPerfect範囲ms >= 0 ) )
\r
89 return c曲リストノード.nPerfect範囲ms;
\r
92 return ConfigIni.nヒット範囲ms.Perfect;
\r
95 public static int nGreat範囲ms
\r
99 if( stage選曲.r確定された曲 != null )
\r
101 C曲リストノード c曲リストノード = stage選曲.r確定された曲.r親ノード;
\r
102 if( ( ( c曲リストノード != null ) && ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX ) ) && ( c曲リストノード.nGreat範囲ms >= 0 ) )
\r
104 return c曲リストノード.nGreat範囲ms;
\r
107 return ConfigIni.nヒット範囲ms.Great;
\r
110 public static int nGood範囲ms
\r
114 if( stage選曲.r確定された曲 != null )
\r
116 C曲リストノード c曲リストノード = stage選曲.r確定された曲.r親ノード;
\r
117 if( ( ( c曲リストノード != null ) && ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX ) ) && ( c曲リストノード.nGood範囲ms >= 0 ) )
\r
119 return c曲リストノード.nGood範囲ms;
\r
122 return ConfigIni.nヒット範囲ms.Good;
\r
125 public static int nPoor範囲ms
\r
129 if( stage選曲.r確定された曲 != null )
\r
131 C曲リストノード c曲リストノード = stage選曲.r確定された曲.r親ノード;
\r
132 if( ( ( c曲リストノード != null ) && ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX ) ) && ( c曲リストノード.nPoor範囲ms >= 0 ) )
\r
134 return c曲リストノード.nPoor範囲ms;
\r
137 return ConfigIni.nヒット範囲ms.Poor;
\r
141 public static CPad Pad
\r
146 public static Random Random
\r
151 public static CSkin Skin
\r
156 public static CSongs管理 Songs管理
\r
159 set; // 2012.1.26 yyagi private解除 CStage起動でのdesirialize読み込みのため
\r
161 public static CEnumSongs EnumSongs
\r
166 public static CActEnumSongs actEnumSongs
\r
171 public static CActFlushGPU actFlushGPU
\r
177 public static CSound管理 Sound管理
\r
182 public static CStage起動 stage起動
\r
187 public static CStageタイトル stageタイトル
\r
192 // public static CStageオプション stageオプション
\r
197 public static CStageコンフィグ stageコンフィグ
\r
202 public static CStage選曲 stage選曲
\r
207 public static CStage曲読み込み stage曲読み込み
\r
212 public static CStage演奏ギター画面 stage演奏ギター画面
\r
217 public static CStage演奏ドラム画面 stage演奏ドラム画面
\r
222 public static CStage結果 stage結果
\r
227 public static CStageChangeSkin stageChangeSkin
\r
232 public static CStage終了 stage終了
\r
237 public static CStage r現在のステージ = null;
\r
238 public static CStage r直前のステージ = null;
\r
239 public static string strEXEのあるフォルダ
\r
244 public static string strコンパクトモードファイル
\r
249 public static CTimer Timer
\r
254 public static Format TextureFormat = Format.A8R8G8B8;
\r
255 internal static IPluginActivity act現在入力を占有中のプラグイン = null;
\r
256 public bool bApplicationActive
\r
261 public bool b次のタイミングで垂直帰線同期切り替えを行う
\r
266 public bool b次のタイミングで全画面_ウィンドウ切り替えを行う
\r
271 public Device Device
\r
273 get { return base.GraphicsDeviceManager.Direct3D9.Device; }
\r
275 public CPluginHost PluginHost
\r
280 public List<STPlugin> listプラグイン = new List<STPlugin>();
\r
281 public struct STPlugin
\r
283 public IPluginActivity plugin;
\r
284 public string strプラグインフォルダ;
\r
285 public string strアセンブリ簡易名;
\r
286 public Version Version;
\r
288 private static Size currentClientSize // #23510 2010.10.27 add yyagi to keep current window size
\r
293 // public static CTimer ct;
\r
294 public IntPtr WindowHandle // 2012.10.24 yyagi; to add ASIO support
\r
296 get { return base.Window.Handle; }
\r
298 public static CDTXVmode DTXVmode // #28821 2014.1.23 yyagi
\r
303 public static STDGBVALUE< List<int> > listAutoGhostLag = new STDGBVALUE<List<int>>();
\r
304 public static STDGBVALUE< List<int> > listTargetGhsotLag = new STDGBVALUE<List<int>>();
\r
311 CDTXMania.app = this;
\r
318 public void t全画面_ウィンドウモード切り替え()
\r
320 #if WindowedFullscreen
\r
321 if ( ConfigIni != null )
\r
323 DeviceSettings settings = base.GraphicsDeviceManager.CurrentSettings.Clone();
\r
324 if ( ( ConfigIni != null ) && ( ConfigIni.bウィンドウモード != settings.Windowed ) )
\r
327 #if !WindowedFullscreen
\r
328 settings.Windowed = ConfigIni.bウィンドウモード;
\r
330 if ( ConfigIni.bウィンドウモード == false ) // #23510 2010.10.27 yyagi: backup current window size before going fullscreen mode
\r
332 currentClientSize = this.Window.ClientSize;
\r
333 ConfigIni.nウインドウwidth = this.Window.ClientSize.Width;
\r
334 ConfigIni.nウインドウheight = this.Window.ClientSize.Height;
\r
335 // FDK.CTaskBar.ShowTaskBar( false );
\r
337 #if !WindowedFullscreen
\r
338 base.GraphicsDeviceManager.ChangeDevice( settings );
\r
340 if ( ConfigIni.bウィンドウモード == true ) // #23510 2010.10.27 yyagi: to resume window size from backuped value
\r
342 #if WindowedFullscreen
\r
343 // #30666 2013.2.2 yyagi Don't use Fullscreen mode becasue NVIDIA GeForce is
\r
344 // tend to delay drawing on Fullscreen mode. So DTXMania uses Maximized window
\r
345 // in spite of using fullscreen mode.
\r
346 app.Window.WindowState = FormWindowState.Normal;
\r
347 app.Window.FormBorderStyle = FormBorderStyle.Sizable;
\r
348 app.Window.WindowState = FormWindowState.Normal;
\r
350 base.Window.ClientSize =
\r
351 new Size( currentClientSize.Width, currentClientSize.Height );
\r
352 // FDK.CTaskBar.ShowTaskBar( true );
\r
354 #if WindowedFullscreen
\r
357 app.Window.WindowState = FormWindowState.Normal;
\r
358 app.Window.FormBorderStyle = FormBorderStyle.None;
\r
359 app.Window.WindowState = FormWindowState.Maximized;
\r
361 if ( ConfigIni.bウィンドウモード )
\r
363 if ( !this.bマウスカーソル表示中 )
\r
366 this.bマウスカーソル表示中 = true;
\r
369 else if ( this.bマウスカーソル表示中 )
\r
372 this.bマウスカーソル表示中 = false;
\r
378 #region [ #24609 リザルト画像をpngで保存する ] // #24609 2011.3.14 yyagi; to save result screen in case BestRank or HiSkill.
\r
380 /// リザルト画像のキャプチャと保存。
\r
382 /// <param name="strFilename">保存するファイル名(フルパス)</param>
\r
383 public bool SaveResultScreen( string strFullPath )
\r
385 string strSavePath = Path.GetDirectoryName( strFullPath );
\r
386 if ( !Directory.Exists( strSavePath ) )
\r
390 Directory.CreateDirectory( strSavePath );
\r
398 // http://www.gamedev.net/topic/594369-dx9slimdxati-incorrect-saving-surface-to-file/
\r
399 using ( Surface pSurface = CDTXMania.app.Device.GetRenderTarget( 0 ) )
\r
401 Surface.ToFile( pSurface, strFullPath, ImageFileFormat.Png );
\r
409 protected override void Initialize()
\r
413 //swlist1 = new List<int>( 8192 );
\r
414 //swlist2 = new List<int>( 8192 );
\r
415 //swlist3 = new List<int>( 8192 );
\r
416 //swlist4 = new List<int>( 8192 );
\r
417 //swlist5 = new List<int>( 8192 );
\r
418 if ( this.listトップレベルActivities != null )
\r
420 foreach( CActivity activity in this.listトップレベルActivities )
\r
421 activity.OnManagedリソースの作成();
\r
424 foreach( STPlugin st in this.listプラグイン )
\r
426 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
427 st.plugin.OnManagedリソースの作成();
\r
428 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
430 #if GPUFlushAfterPresent
\r
431 FrameEnd += dtxmania_FrameEnd;
\r
434 #if GPUFlushAfterPresent
\r
435 void dtxmania_FrameEnd( object sender, EventArgs e ) // GraphicsDeviceManager.game_FrameEnd()後に実行される
\r
436 { // → Present()直後にGPUをFlushする
\r
437 // → 画面のカクツキが頻発したため、ここでのFlushは行わない
\r
438 actFlushGPU.On進行描画(); // Flush GPU
\r
441 protected override void LoadContent()
\r
443 if ( ConfigIni.bウィンドウモード )
\r
445 if( !this.bマウスカーソル表示中 )
\r
448 this.bマウスカーソル表示中 = true;
\r
451 else if( this.bマウスカーソル表示中 )
\r
454 this.bマウスカーソル表示中 = false;
\r
456 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
457 this.Device.SetTransform(TransformState.Projection, Matrix.PerspectiveFovLH(C変換.DegreeToRadian((float)60f), ((float)this.Device.Viewport.Width) / ((float)this.Device.Viewport.Height), -100f, 100f));
\r
458 this.Device.SetRenderState(RenderState.Lighting, false);
\r
459 this.Device.SetRenderState( RenderState.ZEnable, false );
\r
460 this.Device.SetRenderState( RenderState.AntialiasedLineEnable, false );
\r
461 this.Device.SetRenderState( RenderState.AlphaTestEnable, true );
\r
462 this.Device.SetRenderState( RenderState.AlphaRef, 10 );
\r
464 this.Device.SetRenderState( RenderState.MultisampleAntialias, true );
\r
465 this.Device.SetSamplerState( 0, SamplerState.MinFilter, TextureFilter.Linear );
\r
466 this.Device.SetSamplerState( 0, SamplerState.MagFilter, TextureFilter.Linear );
\r
468 this.Device.SetRenderState<Compare>( RenderState.AlphaFunc, Compare.Greater );
\r
469 this.Device.SetRenderState( RenderState.AlphaBlendEnable, true );
\r
470 this.Device.SetRenderState<Blend>( RenderState.SourceBlend, Blend.SourceAlpha );
\r
471 this.Device.SetRenderState<Blend>( RenderState.DestinationBlend, Blend.InverseSourceAlpha );
\r
472 this.Device.SetTextureStageState( 0, TextureStage.AlphaOperation, TextureOperation.Modulate );
\r
473 this.Device.SetTextureStageState( 0, TextureStage.AlphaArg1, 2 );
\r
474 this.Device.SetTextureStageState( 0, TextureStage.AlphaArg2, 1 );
\r
476 if( this.listトップレベルActivities != null )
\r
478 foreach( CActivity activity in this.listトップレベルActivities )
\r
479 activity.OnUnmanagedリソースの作成();
\r
482 foreach( STPlugin st in this.listプラグイン )
\r
484 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
485 st.plugin.OnUnmanagedリソースの作成();
\r
486 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
489 protected override void UnloadContent()
\r
491 if( this.listトップレベルActivities != null )
\r
493 foreach( CActivity activity in this.listトップレベルActivities )
\r
494 activity.OnUnmanagedリソースの解放();
\r
497 foreach( STPlugin st in this.listプラグイン )
\r
499 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
500 st.plugin.OnUnmanagedリソースの解放();
\r
501 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
504 protected override void OnExiting( EventArgs e )
\r
506 CPowerManagement.tEnableMonitorSuspend(); // スリープ抑止状態を解除
\r
508 base.OnExiting( e );
\r
510 protected override void Update( GameTime gameTime )
\r
513 protected override void Draw( GameTime gameTime )
\r
515 Sound管理.t再生中の処理をする();
\r
517 if( Timer != null )
\r
519 if (CSound管理.rc演奏用タイマ != null)
\r
520 CSound管理.rc演奏用タイマ.t更新();
\r
522 if( Input管理 != null )
\r
523 Input管理.tポーリング( this.bApplicationActive, CDTXMania.ConfigIni.bバッファ入力を行う );
\r
528 //if( Pad != null ) ポーリング時にクリアしたらダメ!曲の開始時に1回だけクリアする。(2010.9.11)
\r
529 // Pad.st検知したデバイス.Clear();
\r
531 if( this.Device == null )
\r
534 if ( this.bApplicationActive ) // DTXMania本体起動中の本体/モニタの省電力モード移行を抑止
\r
535 CPowerManagement.tDisableMonitorSuspend();
\r
537 // #xxxxx 2013.4.8 yyagi; sleepの挿入位置を、EndScnene~Present間から、BeginScene前に移動。描画遅延を小さくするため。
\r
539 if ( ConfigIni.nフレーム毎スリープms >= 0 ) // #xxxxx 2011.11.27 yyagi
\r
541 Thread.Sleep( ConfigIni.nフレーム毎スリープms );
\r
545 #region [ DTXCreatorからの指示 ]
\r
546 if ( this.Window.IsReceivedMessage ) // ウインドウメッセージで、
\r
548 string strMes = this.Window.strMessage;
\r
549 this.Window.IsReceivedMessage = false;
\r
551 if ( strMes != null )
\r
553 DTXVmode.ParseArguments( strMes );
\r
555 if ( DTXVmode.Enabled )
\r
558 strコンパクトモードファイル = DTXVmode.filename;
\r
559 if ( DTXVmode.Command == CDTXVmode.ECommand.Preview )
\r
561 // preview soundの再生
\r
562 string strPreviewFilename = DTXVmode.previewFilename;
\r
563 //Trace.TraceInformation( "Preview Filename=" + DTXVmode.previewFilename );
\r
566 if ( this.previewSound != null )
\r
568 this.previewSound.tサウンドを停止する();
\r
569 this.previewSound.Dispose();
\r
570 this.previewSound = null;
\r
572 this.previewSound = CDTXMania.Sound管理.tサウンドを生成する( strPreviewFilename );
\r
573 this.previewSound.n音量 = DTXVmode.previewVolume;
\r
574 this.previewSound.n位置 = DTXVmode.previewPan;
\r
575 this.previewSound.t再生を開始する();
\r
576 Trace.TraceInformation( "DTXCからの指示で、サウンドを生成しました。({0})", strPreviewFilename );
\r
580 Trace.TraceError( "DTXCからの指示での、サウンドの生成に失敗しました。({0})", strPreviewFilename );
\r
581 if ( this.previewSound != null )
\r
583 this.previewSound.Dispose();
\r
585 this.previewSound = null;
\r
593 this.Device.BeginScene();
\r
594 this.Device.Clear( ClearFlags.ZBuffer | ClearFlags.Target, Color.Black, 1f, 0 );
\r
596 if( r現在のステージ != null )
\r
598 this.n進行描画の戻り値 = ( r現在のステージ != null ) ? r現在のステージ.On進行描画() : 0;
\r
600 #region [ プラグインの進行描画 ]
\r
601 //---------------------
\r
602 foreach( STPlugin sp in this.listプラグイン )
\r
604 Directory.SetCurrentDirectory( sp.strプラグインフォルダ );
\r
606 if( CDTXMania.act現在入力を占有中のプラグイン == null || CDTXMania.act現在入力を占有中のプラグイン == sp.plugin )
\r
607 sp.plugin.On進行描画( CDTXMania.Pad, CDTXMania.Input管理.Keyboard );
\r
609 sp.plugin.On進行描画( null, null );
\r
611 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
613 //---------------------
\r
617 CScoreIni scoreIni = null;
\r
619 if ( Control.IsKeyLocked( Keys.CapsLock ) ) // #30925 2013.3.11 yyagi; capslock=ON時は、EnumSongsしないようにして、起動負荷とASIOの音切れの関係を確認する
\r
620 { // → songs.db等の書き込み時だと音切れするっぽい
\r
621 actEnumSongs.On非活性化();
\r
622 EnumSongs.SongListEnumCompletelyDone();
\r
623 CDTXMania.stage選曲.bIsEnumeratingSongs = false;
\r
625 #region [ 曲検索スレッドの起動/終了 ] // ここに"Enumerating Songs..."表示を集約
\r
626 if ( !CDTXMania.bコンパクトモード )
\r
628 actEnumSongs.On進行描画(); // "Enumerating Songs..."アイコンの描画
\r
630 switch ( r現在のステージ.eステージID )
\r
632 case CStage.Eステージ.タイトル:
\r
633 case CStage.Eステージ.コンフィグ:
\r
634 case CStage.Eステージ.選曲:
\r
635 case CStage.Eステージ.曲読み込み:
\r
636 if ( EnumSongs != null )
\r
638 #region [ (特定条件時) 曲検索スレッドの起動・開始 ]
\r
639 if ( r現在のステージ.eステージID == CStage.Eステージ.タイトル &&
\r
640 r直前のステージ.eステージID == CStage.Eステージ.起動 &&
\r
641 this.n進行描画の戻り値 == (int) CStageタイトル.E戻り値.継続 &&
\r
642 !EnumSongs.IsSongListEnumStarted )
\r
644 actEnumSongs.On活性化();
\r
645 CDTXMania.stage選曲.bIsEnumeratingSongs = true;
\r
646 EnumSongs.Init( CDTXMania.Songs管理.listSongsDB, CDTXMania.Songs管理.nSongsDBから取得できたスコア数 ); // songs.db情報と、取得した曲数を、新インスタンスにも与える
\r
647 EnumSongs.StartEnumFromDisk(); // 曲検索スレッドの起動・開始
\r
648 if ( CDTXMania.Songs管理.nSongsDBから取得できたスコア数 == 0 ) // もし初回起動なら、検索スレッドのプライオリティをLowestでなくNormalにする
\r
650 EnumSongs.ChangeEnumeratePriority( ThreadPriority.Normal );
\r
655 #region [ 曲検索の中断と再開 ]
\r
656 if ( r現在のステージ.eステージID == CStage.Eステージ.選曲 && !EnumSongs.IsSongListEnumCompletelyDone )
\r
658 switch ( this.n進行描画の戻り値 )
\r
661 //if ( CDTXMania.stage選曲.bIsEnumeratingSongs )
\r
662 if ( !CDTXMania.stage選曲.bIsPlayingPremovie )
\r
664 EnumSongs.Resume(); // #27060 2012.2.6 yyagi 中止していたバックグランド曲検索を再開
\r
665 EnumSongs.IsSlowdown = false;
\r
669 // EnumSongs.Suspend(); // #27060 2012.3.2 yyagi #PREMOVIE再生中は曲検索を低速化
\r
670 EnumSongs.IsSlowdown = true;
\r
672 actEnumSongs.On活性化();
\r
676 EnumSongs.Suspend(); // #27060 バックグラウンドの曲検索を一時停止
\r
677 actEnumSongs.On非活性化();
\r
683 #region [ 曲探索中断待ち待機 ]
\r
684 if ( r現在のステージ.eステージID == CStage.Eステージ.曲読み込み && !EnumSongs.IsSongListEnumCompletelyDone &&
\r
685 EnumSongs.thDTXFileEnumerate != null ) // #28700 2012.6.12 yyagi; at Compact mode, enumerating thread does not exist.
\r
687 EnumSongs.WaitUntilSuspended(); // 念のため、曲検索が一時中断されるまで待機
\r
691 #region [ 曲検索が完了したら、実際の曲リストに反映する ]
\r
692 // CStage選曲.On活性化() に回した方がいいかな?
\r
693 if ( EnumSongs.IsSongListEnumerated )
\r
695 actEnumSongs.On非活性化();
\r
696 CDTXMania.stage選曲.bIsEnumeratingSongs = false;
\r
698 bool bRemakeSongTitleBar = ( r現在のステージ.eステージID == CStage.Eステージ.選曲 ) ? true : false;
\r
699 CDTXMania.stage選曲.Refresh( EnumSongs.Songs管理, bRemakeSongTitleBar );
\r
700 EnumSongs.SongListEnumCompletelyDone();
\r
708 switch ( r現在のステージ.eステージID )
\r
710 case CStage.Eステージ.何もしない:
\r
713 case CStage.Eステージ.起動:
\r
715 //-----------------------------
\r
716 if( this.n進行描画の戻り値 != 0 )
\r
721 Trace.TraceInformation( "----------------------" );
\r
722 Trace.TraceInformation( "■ タイトル" );
\r
724 r直前のステージ = r現在のステージ;
\r
725 r現在のステージ = stageタイトル;
\r
730 Trace.TraceInformation( "----------------------" );
\r
731 Trace.TraceInformation( "■ 曲読み込み" );
\r
732 stage曲読み込み.On活性化();
\r
733 r直前のステージ = r現在のステージ;
\r
734 r現在のステージ = stage曲読み込み;
\r
737 foreach( STPlugin pg in this.listプラグイン )
\r
739 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
740 pg.plugin.Onステージ変更();
\r
741 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
744 this.tガベージコレクションを実行する();
\r
746 //-----------------------------
\r
750 case CStage.Eステージ.タイトル:
\r
752 //-----------------------------
\r
753 switch( this.n進行描画の戻り値 )
\r
755 case (int)CStageタイトル.E戻り値.GAMESTART:
\r
757 //-----------------------------
\r
759 Trace.TraceInformation( "----------------------" );
\r
760 Trace.TraceInformation( "■ 選曲" );
\r
762 r直前のステージ = r現在のステージ;
\r
763 r現在のステージ = stage選曲;
\r
764 //-----------------------------
\r
768 #region [ OPTION: 廃止済 ]
\r
769 // case 2: // #24525 OPTIONとCONFIGの統合に伴い、OPTIONは廃止
\r
771 // //-----------------------------
\r
772 // r現在のステージ.On非活性化();
\r
773 // Trace.TraceInformation( "----------------------" );
\r
774 // Trace.TraceInformation( "■ オプション" );
\r
775 // stageオプション.On活性化();
\r
776 // r直前のステージ = r現在のステージ;
\r
777 // r現在のステージ = stageオプション;
\r
778 // //-----------------------------
\r
783 case (int)CStageタイトル.E戻り値.CONFIG:
\r
785 //-----------------------------
\r
787 Trace.TraceInformation( "----------------------" );
\r
788 Trace.TraceInformation( "■ コンフィグ" );
\r
789 stageコンフィグ.On活性化();
\r
790 r直前のステージ = r現在のステージ;
\r
791 r現在のステージ = stageコンフィグ;
\r
792 //-----------------------------
\r
796 case (int)CStageタイトル.E戻り値.EXIT:
\r
798 //-----------------------------
\r
800 Trace.TraceInformation( "----------------------" );
\r
801 Trace.TraceInformation( "■ 終了" );
\r
803 r直前のステージ = r現在のステージ;
\r
804 r現在のステージ = stage終了;
\r
805 //-----------------------------
\r
810 foreach( STPlugin pg in this.listプラグイン )
\r
812 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
813 pg.plugin.Onステージ変更();
\r
814 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
817 //this.tガベージコレクションを実行する(); // #31980 2013.9.3 yyagi タイトル画面でだけ、毎フレームGCを実行して重くなっていた問題の修正
\r
818 //-----------------------------
\r
822 // case CStage.Eステージ.オプション:
\r
824 // //-----------------------------
\r
825 // if( this.n進行描画の戻り値 != 0 )
\r
827 // switch( r直前のステージ.eステージID )
\r
829 // case CStage.Eステージ.タイトル:
\r
831 // //-----------------------------
\r
832 // r現在のステージ.On非活性化();
\r
833 // Trace.TraceInformation( "----------------------" );
\r
834 // Trace.TraceInformation( "■ タイトル" );
\r
835 // stageタイトル.On活性化();
\r
836 // r直前のステージ = r現在のステージ;
\r
837 // r現在のステージ = stageタイトル;
\r
839 // foreach( STPlugin pg in this.listプラグイン )
\r
841 // Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
842 // pg.plugin.Onステージ変更();
\r
843 // Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
846 // this.tガベージコレクションを実行する();
\r
848 // //-----------------------------
\r
851 // case CStage.Eステージ.選曲:
\r
853 // //-----------------------------
\r
854 // r現在のステージ.On非活性化();
\r
855 // Trace.TraceInformation( "----------------------" );
\r
856 // Trace.TraceInformation( "■ 選曲" );
\r
857 // stage選曲.On活性化();
\r
858 // r直前のステージ = r現在のステージ;
\r
859 // r現在のステージ = stage選曲;
\r
861 // foreach( STPlugin pg in this.listプラグイン )
\r
863 // Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
864 // pg.plugin.Onステージ変更();
\r
865 // Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
868 // this.tガベージコレクションを実行する();
\r
870 // //-----------------------------
\r
874 // //-----------------------------
\r
878 case CStage.Eステージ.コンフィグ:
\r
880 //-----------------------------
\r
881 if( this.n進行描画の戻り値 != 0 )
\r
883 switch( r直前のステージ.eステージID )
\r
885 case CStage.Eステージ.タイトル:
\r
887 //-----------------------------
\r
889 Trace.TraceInformation( "----------------------" );
\r
890 Trace.TraceInformation( "■ タイトル" );
\r
892 r直前のステージ = r現在のステージ;
\r
893 r現在のステージ = stageタイトル;
\r
895 foreach( STPlugin pg in this.listプラグイン )
\r
897 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
898 pg.plugin.Onステージ変更();
\r
899 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
902 this.tガベージコレクションを実行する();
\r
904 //-----------------------------
\r
907 case CStage.Eステージ.選曲:
\r
909 //-----------------------------
\r
911 Trace.TraceInformation( "----------------------" );
\r
912 Trace.TraceInformation( "■ 選曲" );
\r
914 r直前のステージ = r現在のステージ;
\r
915 r現在のステージ = stage選曲;
\r
917 foreach( STPlugin pg in this.listプラグイン )
\r
919 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
920 pg.plugin.Onステージ変更();
\r
921 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
924 this.tガベージコレクションを実行する();
\r
926 //-----------------------------
\r
930 //-----------------------------
\r
934 case CStage.Eステージ.選曲:
\r
936 //-----------------------------
\r
937 switch( this.n進行描画の戻り値 )
\r
939 case (int) CStage選曲.E戻り値.タイトルに戻る:
\r
941 //-----------------------------
\r
943 Trace.TraceInformation( "----------------------" );
\r
944 Trace.TraceInformation( "■ タイトル" );
\r
946 r直前のステージ = r現在のステージ;
\r
947 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
961 case (int) CStage選曲.E戻り値.選曲した:
\r
963 //-----------------------------
\r
965 Trace.TraceInformation( "----------------------" );
\r
966 Trace.TraceInformation( "■ 曲読み込み" );
\r
967 stage曲読み込み.On活性化();
\r
968 r直前のステージ = r現在のステージ;
\r
969 r現在のステージ = stage曲読み込み;
\r
971 foreach( STPlugin pg in this.listプラグイン )
\r
973 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
974 pg.plugin.Onステージ変更();
\r
975 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
978 this.tガベージコレクションを実行する();
\r
980 //-----------------------------
\r
983 // case (int) CStage選曲.E戻り値.オプション呼び出し:
\r
985 // //-----------------------------
\r
986 // r現在のステージ.On非活性化();
\r
987 // Trace.TraceInformation( "----------------------" );
\r
988 // Trace.TraceInformation( "■ オプション" );
\r
989 // stageオプション.On活性化();
\r
990 // r直前のステージ = r現在のステージ;
\r
991 // r現在のステージ = stageオプション;
\r
993 // foreach( STPlugin pg in this.listプラグイン )
\r
995 // Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
996 // pg.plugin.Onステージ変更();
\r
997 // Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1000 // this.tガベージコレクションを実行する();
\r
1002 // //-----------------------------
\r
1005 case (int) CStage選曲.E戻り値.コンフィグ呼び出し:
\r
1007 //-----------------------------
\r
1008 r現在のステージ.On非活性化();
\r
1009 Trace.TraceInformation( "----------------------" );
\r
1010 Trace.TraceInformation( "■ コンフィグ" );
\r
1011 stageコンフィグ.On活性化();
\r
1012 r直前のステージ = r現在のステージ;
\r
1013 r現在のステージ = stageコンフィグ;
\r
1015 foreach( STPlugin pg in this.listプラグイン )
\r
1017 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1018 pg.plugin.Onステージ変更();
\r
1019 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1022 this.tガベージコレクションを実行する();
\r
1024 //-----------------------------
\r
1027 case (int) CStage選曲.E戻り値.スキン変更:
\r
1030 //-----------------------------
\r
1031 r現在のステージ.On非活性化();
\r
1032 Trace.TraceInformation( "----------------------" );
\r
1033 Trace.TraceInformation( "■ スキン切り替え" );
\r
1034 stageChangeSkin.On活性化();
\r
1035 r直前のステージ = r現在のステージ;
\r
1036 r現在のステージ = stageChangeSkin;
\r
1038 //-----------------------------
\r
1041 //-----------------------------
\r
1045 case CStage.Eステージ.曲読み込み:
\r
1047 //-----------------------------
\r
1048 DTXVmode.Refreshed = false; // 曲のリロード中に発生した再リロードは、無視する。
\r
1049 if( this.n進行描画の戻り値 != 0 )
\r
1051 CDTXMania.Pad.st検知したデバイス.Clear(); // 入力デバイスフラグクリア(2010.9.11)
\r
1052 r現在のステージ.On非活性化();
\r
1053 #region [ ESC押下時は、曲の読み込みを中止して選曲画面に戻る ]
\r
1054 if ( this.n進行描画の戻り値 == (int) E曲読込画面の戻り値.読込中止 )
\r
1056 //DTX.t全チップの再生停止();
\r
1058 Trace.TraceInformation( "曲の読み込みを中止しました。" );
\r
1059 this.tガベージコレクションを実行する();
\r
1060 Trace.TraceInformation( "----------------------" );
\r
1061 Trace.TraceInformation( "■ 選曲" );
\r
1063 r直前のステージ = r現在のステージ;
\r
1064 r現在のステージ = stage選曲;
\r
1065 foreach ( STPlugin pg in this.listプラグイン )
\r
1067 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1068 pg.plugin.Onステージ変更();
\r
1069 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1075 if( !ConfigIni.bギタレボモード )
\r
1077 Trace.TraceInformation( "----------------------" );
\r
1078 Trace.TraceInformation( "■ 演奏(ドラム画面)" );
\r
1079 #if false // #23625 2011.1.11 Config.iniからダメージ/回復値の定数変更を行う場合はここを有効にする 087リリースに合わせ機能無効化
\r
1080 for (int i = 0; i < 5; i++)
\r
1082 for (int j = 0; j < 2; j++)
\r
1084 stage演奏ドラム画面.fDamageGaugeDelta[i, j] = ConfigIni.fGaugeFactor[i, j];
\r
1087 for (int i = 0; i < 3; i++) {
\r
1088 stage演奏ドラム画面.fDamageLevelFactor[i] = ConfigIni.fDamageLevelFactor[i];
\r
1091 r直前のステージ = r現在のステージ;
\r
1092 r現在のステージ = stage演奏ドラム画面;
\r
1096 Trace.TraceInformation( "----------------------" );
\r
1097 Trace.TraceInformation( "■ 演奏(ギター画面)" );
\r
1098 #if false // #23625 2011.1.11 Config.iniからダメージ/回復値の定数変更を行う場合はここを有効にする 087リリースに合わせ機能無効化
\r
1099 for (int i = 0; i < 5; i++)
\r
1101 for (int j = 0; j < 2; j++)
\r
1103 stage演奏ギター画面.fDamageGaugeDelta[i, j] = ConfigIni.fGaugeFactor[i, j];
\r
1106 for (int i = 0; i < 3; i++) {
\r
1107 stage演奏ギター画面.fDamageLevelFactor[i] = ConfigIni.fDamageLevelFactor[i];
\r
1110 r直前のステージ = r現在のステージ;
\r
1111 r現在のステージ = stage演奏ギター画面;
\r
1114 foreach( STPlugin pg in this.listプラグイン )
\r
1116 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1117 pg.plugin.Onステージ変更();
\r
1118 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1121 this.tガベージコレクションを実行する();
\r
1123 //-----------------------------
\r
1127 case CStage.Eステージ.演奏:
\r
1129 //-----------------------------
\r
1130 //long n1 = FDK.CSound管理.rc演奏用タイマ.nシステム時刻ms;
\r
1131 //long n2 = FDK.CSound管理.SoundDevice.n経過時間ms;
\r
1132 //long n3 = FDK.CSound管理.SoundDevice.tmシステムタイマ.nシステム時刻ms;
\r
1133 //long n4 = FDK.CSound管理.rc演奏用タイマ.n現在時刻;
\r
1134 //long n5 = FDK.CSound管理.SoundDevice.n経過時間を更新したシステム時刻ms;
\r
1136 //swlist1.Add( Convert.ToInt32(n1) );
\r
1137 //swlist2.Add( Convert.ToInt32(n2) );
\r
1138 //swlist3.Add( Convert.ToInt32( n3 ) );
\r
1139 //swlist4.Add( Convert.ToInt32( n4 ) );
\r
1140 //swlist5.Add( Convert.ToInt32( n5 ) );
\r
1142 #region [ DTXVモード中にDTXCreatorから指示を受けた場合の処理 ]
\r
1143 if ( DTXVmode.Enabled && DTXVmode.Refreshed )
\r
1145 DTXVmode.Refreshed = false;
\r
1147 if ( DTXVmode.Command == CDTXVmode.ECommand.Stop )
\r
1149 if ( !ConfigIni.bギタレボモード )
\r
1151 CDTXMania.stage演奏ドラム画面.t停止();
\r
1155 CDTXMania.stage演奏ギター画面.t停止();
\r
1157 if ( previewSound != null )
\r
1159 this.previewSound.tサウンドを停止する();
\r
1160 this.previewSound.Dispose();
\r
1161 this.previewSound = null;
\r
1166 // for ( int i = 0; i < swlist1.Count; i++ )
\r
1168 // int d1 = swlist1[ i ];
\r
1169 // int d2 = swlist2[ i ];
\r
1170 // int d3 = swlist3[ i ];
\r
1171 // int d4 = swlist4[ i ];
\r
1172 // int d5 = swlist5[ i ];
\r
1174 // int dif = d1 - lastd;
\r
1176 // if ( 16 <= dif && dif <= 17 )
\r
1183 // Trace.TraceInformation( "frame {0:D4}: {1:D3} ( {2:D3}, {3:D3} - {7:D3}, {4:D3} ) {5}, n現在時刻={6}", f, dif, d1, d2, d3, s, d4, d5 );
\r
1187 // swlist1.Clear();
\r
1188 // swlist2.Clear();
\r
1189 // swlist3.Clear();
\r
1190 // swlist4.Clear();
\r
1191 // swlist5.Clear();
\r
1195 else if ( DTXVmode.Command == CDTXVmode.ECommand.Play )
\r
1197 if ( DTXVmode.NeedReload )
\r
1199 if ( !ConfigIni.bギタレボモード )
\r
1201 CDTXMania.stage演奏ドラム画面.t再読込();
\r
1205 CDTXMania.stage演奏ギター画面.t再読込();
\r
1208 CDTXMania.ConfigIni.bDrums有効 = !DTXVmode.GRmode;
\r
1209 CDTXMania.ConfigIni.bGuitar有効 = true;
\r
1210 CDTXMania.ConfigIni.bTimeStretch = DTXVmode.TimeStretch;
\r
1211 CSound管理.bIsTimeStretch = DTXVmode.TimeStretch;
\r
1212 if ( CDTXMania.ConfigIni.b垂直帰線待ちを行う != DTXVmode.VSyncWait )
\r
1214 CDTXMania.ConfigIni.b垂直帰線待ちを行う = DTXVmode.VSyncWait;
\r
1215 CDTXMania.app.b次のタイミングで垂直帰線同期切り替えを行う = true;
\r
1220 if ( !ConfigIni.bギタレボモード )
\r
1222 CDTXMania.stage演奏ドラム画面.t演奏位置の変更( CDTXMania.DTXVmode.nStartBar );
\r
1226 CDTXMania.stage演奏ギター画面.t演奏位置の変更( CDTXMania.DTXVmode.nStartBar );
\r
1233 switch( this.n進行描画の戻り値 )
\r
1235 case (int) E演奏画面の戻り値.再読込_再演奏:
\r
1236 #region [ DTXファイルを再読み込みして、再演奏 ]
\r
1239 r現在のステージ.On非活性化();
\r
1240 stage曲読み込み.On活性化();
\r
1241 r直前のステージ = r現在のステージ;
\r
1242 r現在のステージ = stage曲読み込み;
\r
1243 this.tガベージコレクションを実行する();
\r
1247 //case (int) E演奏画面の戻り値.再演奏:
\r
1248 #region [ 再読み込み無しで、再演奏 ]
\r
1252 case (int) E演奏画面の戻り値.継続:
\r
1255 case (int) E演奏画面の戻り値.演奏中断:
\r
1256 #region [ 演奏キャンセル ]
\r
1257 //-----------------------------
\r
1258 scoreIni = this.tScoreIniへBGMAdjustとHistoryとPlayCountを更新( "Play canceled" );
\r
1259 if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #35417 2015.8.18 yyagi Gt/Bsを入れ替えていたなら、演奏設定を元に戻す
\r
1261 //CDTXMania.DTX.SwapGuitarBassInfos(); // 譜面情報も元に戻す (現在は再演奏機能なしのため、元に戻す必要はない)
\r
1266 //for (int i = 0; i < swlist1.Count; i++)
\r
1268 // int d1 = swlist1[ i ];
\r
1269 // int d2 = swlist2[ i ];
\r
1270 // int d3 = swlist3[ i ];
\r
1271 // int d4 = swlist4[ i ];
\r
1273 // int dif = d1 - lastd;
\r
1275 // if ( 16 <= dif && dif <= 17 )
\r
1282 // Trace.TraceInformation( "frame {0:D4}: {1:D3} ( {2:D3}, {3:D3}, {4:D3} ) {5}, n現在時刻={6}", f, dif, d1, d2, d3, s, d4 );
\r
1286 //swlist1.Clear();
\r
1287 //swlist2.Clear();
\r
1288 //swlist3.Clear();
\r
1289 //swlist4.Clear();
\r
1291 #region [ プラグイン On演奏キャンセル() の呼び出し ]
\r
1292 //---------------------
\r
1293 foreach( STPlugin pg in this.listプラグイン )
\r
1295 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1296 pg.plugin.On演奏キャンセル( scoreIni );
\r
1297 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1299 //---------------------
\r
1304 r現在のステージ.On非活性化();
\r
1307 base.Window.Close();
\r
1311 Trace.TraceInformation( "----------------------" );
\r
1312 Trace.TraceInformation( "■ 選曲" );
\r
1314 r直前のステージ = r現在のステージ;
\r
1315 r現在のステージ = stage選曲;
\r
1317 #region [ プラグイン Onステージ変更() の呼び出し ]
\r
1318 //---------------------
\r
1319 foreach( STPlugin pg in this.listプラグイン )
\r
1321 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1322 pg.plugin.Onステージ変更();
\r
1323 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1325 //---------------------
\r
1328 this.tガベージコレクションを実行する();
\r
1331 //-----------------------------
\r
1334 case (int) E演奏画面の戻り値.ステージ失敗:
\r
1335 #region [ 演奏失敗(StageFailed) ]
\r
1336 //-----------------------------
\r
1337 scoreIni = this.tScoreIniへBGMAdjustとHistoryとPlayCountを更新( "Stage failed" );
\r
1339 #region [ プラグイン On演奏失敗() の呼び出し ]
\r
1340 //---------------------
\r
1341 foreach( STPlugin pg in this.listプラグイン )
\r
1343 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1344 pg.plugin.On演奏失敗( scoreIni );
\r
1345 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1347 //---------------------
\r
1352 r現在のステージ.On非活性化();
\r
1355 base.Window.Close();
\r
1359 Trace.TraceInformation( "----------------------" );
\r
1360 Trace.TraceInformation( "■ 選曲" );
\r
1362 r直前のステージ = r現在のステージ;
\r
1363 r現在のステージ = stage選曲;
\r
1365 #region [ プラグイン Onステージ変更() の呼び出し ]
\r
1366 //---------------------
\r
1367 foreach( STPlugin pg in this.listプラグイン )
\r
1369 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1370 pg.plugin.Onステージ変更();
\r
1371 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1373 //---------------------
\r
1376 this.tガベージコレクションを実行する();
\r
1379 //-----------------------------
\r
1382 case (int) E演奏画面の戻り値.ステージクリア:
\r
1384 //-----------------------------
\r
1385 CScoreIni.C演奏記録 c演奏記録_Drums, c演奏記録_Guitar, c演奏記録_Bass;
\r
1386 CDTX.CChip[] chipArray = new CDTX.CChip[ 10 ];
\r
1387 if( ConfigIni.bギタレボモード )
\r
1389 stage演奏ギター画面.t演奏結果を格納する( out c演奏記録_Drums, out c演奏記録_Guitar, out c演奏記録_Bass );
\r
1393 stage演奏ドラム画面.t演奏結果を格納する( out c演奏記録_Drums, out c演奏記録_Guitar, out c演奏記録_Bass, out chipArray );
\r
1396 if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.24 yyagi Gt/Bsを入れ替えていたなら、演奏結果も入れ替える
\r
1398 CScoreIni.C演奏記録 t;
\r
1400 c演奏記録_Guitar = c演奏記録_Bass;
\r
1403 CDTXMania.DTX.SwapGuitarBassInfos(); // 譜面情報も元に戻す
\r
1404 // #35417 2015.08.30 changed フラグにアクセスしている箇所が見つかったため有効化
\r
1405 // #35417 2015.8.18 yyagi: AUTO系のフラグ入れ替えは削除可能!?。以後AUTOフラグに全くアクセスしておらず、意味がないため。
\r
1406 // (直下でb全AUTOである にアクセスしているが、既に計算済みのクラスへのアクセスであり、ここでの交換対象ではない)
\r
1407 CDTXMania.ConfigIni.SwapGuitarBassInfos_AutoFlags();
\r
1408 // #24415 2011.2.27 yyagi
\r
1409 // リザルト集計時のみ、Auto系のフラグも元に戻す。
\r
1410 // これを戻すのは、リザルト集計後。
\r
1411 } // "case CStage.Eステージ.結果:"のところ。
\r
1413 double ps = 0.0, gs = 0.0;
\r
1414 if ( !c演奏記録_Drums.b全AUTOである && c演奏記録_Drums.n全チップ数 > 0) {
\r
1415 ps = c演奏記録_Drums.db演奏型スキル値;
\r
1416 gs = c演奏記録_Drums.dbゲーム型スキル値;
\r
1418 else if ( !c演奏記録_Guitar.b全AUTOである && c演奏記録_Guitar.n全チップ数 > 0) {
\r
1419 ps = c演奏記録_Guitar.db演奏型スキル値;
\r
1420 gs = c演奏記録_Guitar.dbゲーム型スキル値;
\r
1424 ps = c演奏記録_Bass.db演奏型スキル値;
\r
1425 gs = c演奏記録_Bass.dbゲーム型スキル値;
\r
1427 string str = "Cleared";
\r
1428 switch( CScoreIni.t総合ランク値を計算して返す( c演奏記録_Drums, c演奏記録_Guitar, c演奏記録_Bass ) )
\r
1430 case (int)CScoreIni.ERANK.SS:
\r
1431 str = string.Format( "Cleared (SS: {0:F2})", ps );
\r
1434 case (int) CScoreIni.ERANK.S:
\r
1435 str = string.Format( "Cleared (S: {0:F2})", ps );
\r
1438 case (int) CScoreIni.ERANK.A:
\r
1439 str = string.Format( "Cleared (A: {0:F2})", ps );
\r
1442 case (int) CScoreIni.ERANK.B:
\r
1443 str = string.Format( "Cleared (B: {0:F2})", ps );
\r
1446 case (int) CScoreIni.ERANK.C:
\r
1447 str = string.Format( "Cleared (C: {0:F2})", ps );
\r
1450 case (int) CScoreIni.ERANK.D:
\r
1451 str = string.Format( "Cleared (D: {0:F2})", ps );
\r
1454 case (int) CScoreIni.ERANK.E:
\r
1455 str = string.Format( "Cleared (E: {0:F2})", ps );
\r
1458 case (int)CScoreIni.ERANK.UNKNOWN: // #23534 2010.10.28 yyagi add: 演奏チップが0個のとき
\r
1459 str = "Cleared (No chips)";
\r
1463 scoreIni = this.tScoreIniへBGMAdjustとHistoryとPlayCountを更新( str );
\r
1465 #region [ プラグイン On演奏クリア() の呼び出し ]
\r
1466 //---------------------
\r
1467 foreach( STPlugin pg in this.listプラグイン )
\r
1469 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1470 pg.plugin.On演奏クリア( scoreIni );
\r
1471 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1473 //---------------------
\r
1476 r現在のステージ.On非活性化();
\r
1477 Trace.TraceInformation( "----------------------" );
\r
1478 Trace.TraceInformation( "■ 結果" );
\r
1479 stage結果.st演奏記録.Drums = c演奏記録_Drums;
\r
1480 stage結果.st演奏記録.Guitar = c演奏記録_Guitar;
\r
1481 stage結果.st演奏記録.Bass = c演奏記録_Bass;
\r
1482 stage結果.r空うちドラムチップ = chipArray;
\r
1484 r直前のステージ = r現在のステージ;
\r
1485 r現在のステージ = stage結果;
\r
1487 #region [ プラグイン Onステージ変更() の呼び出し ]
\r
1488 //---------------------
\r
1489 foreach( STPlugin pg in this.listプラグイン )
\r
1491 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1492 pg.plugin.Onステージ変更();
\r
1493 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1495 //---------------------
\r
1499 //-----------------------------
\r
1502 //-----------------------------
\r
1506 case CStage.Eステージ.結果:
\r
1508 //-----------------------------
\r
1509 if( this.n進行描画の戻り値 != 0 )
\r
1511 // #35417 2015.08.30 chnmr0 changed : ステージクリア処理で入れ替えるため元に戻した
\r
1512 // #35417 2015.8.18 yyagi: AUTO系のフラグ入れ替えは削除可能!?。以後AUTOフラグに全くアクセスしておらず、意味がないため。
\r
1513 if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass ) // #24415 2011.2.27 yyagi Gt/Bsを入れ替えていたなら、Auto状態をリザルト画面終了後に元に戻す
\r
1515 CDTXMania.ConfigIni.SwapGuitarBassInfos_AutoFlags(); // Auto入れ替え
\r
1518 DTX.t全チップの再生一時停止();
\r
1520 r現在のステージ.On非活性化();
\r
1523 Trace.TraceInformation( "----------------------" );
\r
1524 Trace.TraceInformation( "■ 選曲" );
\r
1526 r直前のステージ = r現在のステージ;
\r
1527 r現在のステージ = stage選曲;
\r
1529 foreach( STPlugin pg in this.listプラグイン )
\r
1531 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );
\r
1532 pg.plugin.Onステージ変更();
\r
1533 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
1536 this.tガベージコレクションを実行する();
\r
1540 base.Window.Close();
\r
1543 //-----------------------------
\r
1547 case CStage.Eステージ.ChangeSkin:
\r
1549 //-----------------------------
\r
1550 if ( this.n進行描画の戻り値 != 0 )
\r
1552 r現在のステージ.On非活性化();
\r
1553 Trace.TraceInformation( "----------------------" );
\r
1554 Trace.TraceInformation( "■ 選曲" );
\r
1556 r直前のステージ = r現在のステージ;
\r
1557 r現在のステージ = stage選曲;
\r
1558 this.tガベージコレクションを実行する();
\r
1560 //-----------------------------
\r
1564 case CStage.Eステージ.終了:
\r
1566 //-----------------------------
\r
1567 if( this.n進行描画の戻り値 != 0 )
\r
1571 //-----------------------------
\r
1576 this.Device.EndScene(); // Present()は game.csのOnFrameEnd()に登録された、GraphicsDeviceManager.game_FrameEnd() 内で実行されるので不要
\r
1577 // (つまり、Present()は、Draw()完了後に実行される)
\r
1578 #if !GPUFlushAfterPresent
\r
1579 actFlushGPU.On進行描画(); // Flush GPU // EndScene()~Present()間 (つまりVSync前) でFlush実行
\r
1581 if ( Sound管理.GetCurrentSoundDeviceType() != "DirectSound" )
\r
1583 Sound管理.t再生中の処理をする(); // サウンドバッファの更新; 画面描画と同期させることで、スクロールをスムーズにする
\r
1587 #region [ 全画面・ウインドウ切り替え ]
\r
1588 if ( this.b次のタイミングで全画面_ウィンドウ切り替えを行う)
\r
1590 ConfigIni.b全画面モード = !ConfigIni.b全画面モード;
\r
1591 app.t全画面_ウィンドウモード切り替え();
\r
1592 this.b次のタイミングで全画面_ウィンドウ切り替えを行う = false;
\r
1595 #region [ 垂直基線同期切り替え ]
\r
1596 if ( this.b次のタイミングで垂直帰線同期切り替えを行う )
\r
1598 bool bIsMaximized = this.Window.IsMaximized; // #23510 2010.11.3 yyagi: to backup current window mode before changing VSyncWait
\r
1599 currentClientSize = this.Window.ClientSize; // #23510 2010.11.3 yyagi: to backup current window size before changing VSyncWait
\r
1600 DeviceSettings currentSettings = app.GraphicsDeviceManager.CurrentSettings;
\r
1601 currentSettings.EnableVSync = ConfigIni.b垂直帰線待ちを行う;
\r
1602 app.GraphicsDeviceManager.ChangeDevice( currentSettings );
\r
1603 this.b次のタイミングで垂直帰線同期切り替えを行う = false;
\r
1604 base.Window.ClientSize = new Size(currentClientSize.Width, currentClientSize.Height); // #23510 2010.11.3 yyagi: to resume window size after changing VSyncWait
\r
1607 this.Window.WindowState = FormWindowState.Maximized; // #23510 2010.11.3 yyagi: to resume window mode after changing VSyncWait
\r
1615 #region [ 汎用ヘルパー ]
\r
1616 //-----------------
\r
1617 #region [ tテクスチャの生成 ]
\r
1618 public static CTexture tテクスチャの生成( string fileName )
\r
1620 return tテクスチャの生成( fileName, false );
\r
1622 public static CTexture tテクスチャの生成( string fileName, bool b黒を透過する )
\r
1624 if ( app == null )
\r
1630 return new CTexture( app.Device, fileName, TextureFormat, b黒を透過する );
\r
1632 catch ( CTextureCreateFailedException )
\r
1634 Trace.TraceError( "テクスチャの生成に失敗しました。({0})", fileName );
\r
1637 catch ( FileNotFoundException )
\r
1639 Trace.TraceError( "テクスチャファイルが見つかりませんでした。({0})", fileName );
\r
1643 public static CTextureAf tテクスチャの生成Af( string fileName )
\r
1645 return tテクスチャの生成Af( fileName, false );
\r
1647 public static CTextureAf tテクスチャの生成Af( string fileName, bool b黒を透過する )
\r
1649 if ( app == null )
\r
1655 return new CTextureAf( app.Device, fileName, TextureFormat, b黒を透過する );
\r
1657 catch ( CTextureCreateFailedException )
\r
1659 Trace.TraceError( "テクスチャの生成に失敗しました。({0})", fileName );
\r
1662 catch ( FileNotFoundException )
\r
1664 Trace.TraceError( "テクスチャファイルが見つかりませんでした。({0})", fileName );
\r
1668 public static void tテクスチャの解放( ref CTexture tx )
\r
1670 CDTXMania.t安全にDisposeする( ref tx );
\r
1672 public static void tテクスチャの解放( ref CTextureAf tx )
\r
1674 CDTXMania.t安全にDisposeする( ref tx );
\r
1676 public static CTexture tテクスチャの生成( byte[] txData )
\r
1678 return tテクスチャの生成( txData, false );
\r
1680 public static CTexture tテクスチャの生成( byte[] txData, bool b黒を透過する )
\r
1682 if ( app == null )
\r
1686 if ( txData == null )
\r
1688 Trace.TraceError( "テクスチャの生成に失敗しました。(txData==null)" );
\r
1693 return new CTexture( app.Device, txData, TextureFormat, b黒を透過する );
\r
1695 catch ( CTextureCreateFailedException )
\r
1697 Trace.TraceError( "テクスチャの生成に失敗しました。(txData)" );
\r
1702 public static CTexture tテクスチャの生成( Bitmap bitmap )
\r
1704 return tテクスチャの生成( bitmap, false );
\r
1706 public static CTexture tテクスチャの生成( Bitmap bitmap, bool b黒を透過する )
\r
1708 if ( app == null )
\r
1712 if ( bitmap == null )
\r
1714 Trace.TraceError( "テクスチャの生成に失敗しました。(bitmap==null)" );
\r
1719 return new CTexture( app.Device, bitmap, TextureFormat, b黒を透過する );
\r
1721 catch ( CTextureCreateFailedException )
\r
1723 Trace.TraceError( "テクスチャの生成に失敗しました。(bitmap)" );
\r
1729 /// <summary>プロパティ、インデクサには ref は使用できないので注意。</summary>
\r
1730 public static void t安全にDisposeする<T>( ref T obj )
\r
1732 if ( obj == null )
\r
1735 var d = obj as IDisposable;
\r
1740 obj = default( T );
\r
1742 //-----------------
\r
1745 #region [ private ]
\r
1746 //-----------------
\r
1747 private bool bマウスカーソル表示中 = true;
\r
1748 private bool b終了処理完了済み;
\r
1749 private static CDTX dtx;
\r
1750 private List<CActivity> listトップレベルActivities;
\r
1751 private int n進行描画の戻り値;
\r
1752 private MouseButtons mb = System.Windows.Forms.MouseButtons.Left;
\r
1753 private string strWindowTitle
\r
1757 if ( DTXVmode.Enabled )
\r
1759 return "DTXViewer release " + VERSION;
\r
1763 return "DTXMania .NET style release " + VERSION;
\r
1767 private CSound previewSound;
\r
1769 private void t起動処理()
\r
1771 #region [ strEXEのあるフォルダを決定する ]
\r
1772 //-----------------
\r
1773 // BEGIN #23629 2010.11.13 from: デバッグ時は Application.ExecutablePath が ($SolutionDir)/bin/x86/Debug/ などになり System/ の読み込みに失敗するので、カレントディレクトリを採用する。(プロジェクトのプロパティ→デバッグ→作業ディレクトリが有効になる)
\r
1775 strEXEのあるフォルダ = Environment.CurrentDirectory + @"\";
\r
1776 //strEXEのあるフォルダ = Path.GetDirectoryName( Environment.GetCommandLineArgs()[ 0 ] ) + @"\";
\r
1778 strEXEのあるフォルダ = Path.GetDirectoryName( Application.ExecutablePath ) + @"\"; // #23629 2010.11.9 yyagi: set correct pathname where DTXManiaGR.exe is.
\r
1780 // END #23629 2010.11.13 from
\r
1781 //-----------------
\r
1784 #region [ Config.ini の読込み ]
\r
1785 //---------------------
\r
1786 ConfigIni = new CConfigIni();
\r
1787 string path = strEXEのあるフォルダ + "Config.ini";
\r
1788 if (File.Exists(path))
\r
1792 ConfigIni.tファイルから読み込み(path);
\r
1796 //ConfigIni = new CConfigIni(); // 存在してなければ新規生成
\r
1799 this.Window.EnableSystemMenu = CDTXMania.ConfigIni.bIsEnabledSystemMenu; // #28200 2011.5.1 yyagi
\r
1800 // 2012.8.22 Config.iniが無いときに初期値が適用されるよう、この設定行をifブロック外に移動
\r
1802 //---------------------
\r
1804 #region [ ログ出力開始 ]
\r
1805 //---------------------
\r
1806 Trace.AutoFlush = true;
\r
1807 if (ConfigIni.bログ出力)
\r
1811 Trace.Listeners.Add(new CTraceLogListener(new StreamWriter(System.IO.Path.Combine(strEXEのあるフォルダ, "DTXManiaLog.txt"), false, Encoding.GetEncoding("utf-16"))));
\r
1813 catch (System.UnauthorizedAccessException) // #24481 2011.2.20 yyagi
\r
1815 int c = (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ? 0 : 1;
\r
1816 string[] mes_writeErr = {
\r
1817 "DTXManiaLog.txtへの書き込みができませんでした。書き込みできるようにしてから、再度起動してください。",
\r
1818 "Failed to write DTXManiaLog.txt. Please set it writable and try again."
\r
1820 MessageBox.Show(mes_writeErr[c], "DTXMania boot error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1821 Environment.Exit(1);
\r
1824 Trace.WriteLine("");
\r
1825 Trace.WriteLine("DTXMania powered by YAMAHA Silent Session Drums");
\r
1826 Trace.WriteLine(string.Format("Release: {0}", VERSION));
\r
1827 Trace.WriteLine("");
\r
1828 Trace.TraceInformation("----------------------");
\r
1829 Trace.TraceInformation("■ アプリケーションの初期化");
\r
1830 Trace.TraceInformation("OS Version: " + Environment.OSVersion);
\r
1831 Trace.TraceInformation("ProcessorCount: " + Environment.ProcessorCount.ToString());
\r
1832 Trace.TraceInformation("CLR Version: " + Environment.Version.ToString());
\r
1833 //---------------------
\r
1835 #region [ DTXVmodeクラス の初期化 ]
\r
1836 //---------------------
\r
1837 //Trace.TraceInformation( "DTXVモードの初期化を行います。" );
\r
1841 DTXVmode = new CDTXVmode();
\r
1842 DTXVmode.Enabled = false;
\r
1843 //Trace.TraceInformation( "DTXVモードの初期化を完了しました。" );
\r
1847 //Trace.Unindent();
\r
1849 //---------------------
\r
1851 #region [ コンパクトモードスイッチの有無、もしくは、DTXViewerとしての起動 ]
\r
1852 //---------------------
\r
1853 bコンパクトモード = false;
\r
1854 strコンパクトモードファイル = "";
\r
1855 string[] commandLineArgs = Environment.GetCommandLineArgs();
\r
1856 if ((commandLineArgs != null) && (commandLineArgs.Length > 1))
\r
1861 for (int i = 1; i < commandLineArgs.Length; i++)
\r
1865 arg += " " + "\"" + commandLineArgs[i] + "\"";
\r
1869 arg += commandLineArgs[i];
\r
1872 DTXVmode.ParseArguments(arg);
\r
1873 if (DTXVmode.Enabled)
\r
1875 DTXVmode.Refreshed = false; // 初回起動時は再読み込みに走らせない
\r
1876 strコンパクトモードファイル = DTXVmode.filename;
\r
1877 switch (DTXVmode.soundDeviceType) // サウンド再生方式の設定
\r
1879 case ESoundDeviceType.DirectSound:
\r
1880 ConfigIni.nSoundDeviceType = 0;
\r
1882 case ESoundDeviceType.ExclusiveWASAPI:
\r
1883 ConfigIni.nSoundDeviceType = 2;
\r
1885 case ESoundDeviceType.ASIO:
\r
1886 ConfigIni.nSoundDeviceType = 1;
\r
1887 ConfigIni.nASIODevice = DTXVmode.nASIOdevice;
\r
1891 CDTXMania.ConfigIni.b垂直帰線待ちを行う = DTXVmode.VSyncWait;
\r
1892 CDTXMania.ConfigIni.bTimeStretch = DTXVmode.TimeStretch;
\r
1893 CDTXMania.ConfigIni.bDrums有効 = !DTXVmode.GRmode;
\r
1894 CDTXMania.ConfigIni.bGuitar有効 = true;
\r
1896 CDTXMania.ConfigIni.nウインドウwidth = CDTXMania.ConfigIni.nViewerウインドウwidth;
\r
1897 CDTXMania.ConfigIni.nウインドウheight = CDTXMania.ConfigIni.nViewerウインドウheight;
\r
1898 CDTXMania.ConfigIni.n初期ウィンドウ開始位置X = CDTXMania.ConfigIni.nViewer初期ウィンドウ開始位置X;
\r
1899 CDTXMania.ConfigIni.n初期ウィンドウ開始位置Y = CDTXMania.ConfigIni.nViewer初期ウィンドウ開始位置Y;
\r
1901 else // 通常のコンパクトモード
\r
1903 strコンパクトモードファイル = commandLineArgs[1];
\r
1906 if (!File.Exists(strコンパクトモードファイル)) // #32985 2014.1.23 yyagi
\r
1908 Trace.TraceError("コンパクトモードで指定されたファイルが見つかりません。DTXManiaを終了します。[{0}]", strコンパクトモードファイル);
\r
1910 Environment.Exit(-1);
\r
1912 if ( strコンパクトモードファイル == "" ) // DTXMania未起動状態で、DTXCで再生停止ボタンを押した場合は、何もせず終了
\r
1914 Environment.Exit( -1 );
\r
1918 throw new FileNotFoundException( "コンパクトモードで指定されたファイルが見つかりません。DTXManiaを終了します。", strコンパクトモードファイル );
\r
1922 if (DTXVmode.Enabled)
\r
1924 Trace.TraceInformation("DTXVモードで起動します。[{0}]", strコンパクトモードファイル);
\r
1928 Trace.TraceInformation("コンパクトモードで起動します。[{0}]", strコンパクトモードファイル);
\r
1931 //---------------------
\r
1935 #region [ Input管理 の初期化 ]
\r
1936 //---------------------
\r
1937 Trace.TraceInformation("DirectInput, MIDI入力の初期化を行います。");
\r
1941 bool bUseMIDIIn = !DTXVmode.Enabled;
\r
1942 Input管理 = new CInput管理(base.Window.Handle, bUseMIDIIn);
\r
1943 foreach (IInputDevice device in Input管理.list入力デバイス)
\r
1945 if ((device.e入力デバイス種別 == E入力デバイス種別.Joystick) && !ConfigIni.dicJoystick.ContainsValue(device.GUID))
\r
1948 while (ConfigIni.dicJoystick.ContainsKey(key))
\r
1952 ConfigIni.dicJoystick.Add(key, device.GUID);
\r
1955 foreach (IInputDevice device2 in Input管理.list入力デバイス)
\r
1957 if (device2.e入力デバイス種別 == E入力デバイス種別.Joystick)
\r
1959 foreach (KeyValuePair<int, string> pair in ConfigIni.dicJoystick)
\r
1961 if (device2.GUID.Equals(pair.Value))
\r
1963 ((CInputJoystick)device2).SetID(pair.Key);
\r
1970 Trace.TraceInformation("DirectInput の初期化を完了しました。");
\r
1972 catch (Exception exception2)
\r
1974 Trace.TraceError(exception2.Message);
\r
1975 Trace.TraceError("DirectInput, MIDI入力の初期化に失敗しました。");
\r
1977 int c = (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ? 0 : 1;
\r
1978 string[] mes_writeErr = {
\r
1979 "DirectInputまたはMIDI入力の初期化に失敗しました。DTXManiaGRを終了します。",
\r
1980 "Failed to initialize DirectInput (or MIDI-IN)."
\r
1982 MessageBox.Show(mes_writeErr[c], "DTXMania boot error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
1983 Environment.Exit(1);
\r
1989 //---------------------
\r
1992 #region [ ウィンドウ初期化 ]
\r
1993 //---------------------
\r
1994 base.Window.StartPosition = FormStartPosition.Manual; // #30675 2013.02.04 ikanick add
\r
1995 base.Window.Location = new Point(ConfigIni.n初期ウィンドウ開始位置X, ConfigIni.n初期ウィンドウ開始位置Y); // #30675 2013.02.04 ikanick add
\r
1997 base.Window.Text = this.strWindowTitle; // 事前にDTXVmodeの実体を作っておくこと
\r
1999 base.Window.StartPosition = FormStartPosition.Manual; // #30675 2013.02.04 ikanick add
\r
2000 base.Window.Location = new Point(ConfigIni.n初期ウィンドウ開始位置X, ConfigIni.n初期ウィンドウ開始位置Y); // #30675 2013.02.04 ikanick add
\r
2002 if (ConfigIni.nウインドウwidth <= 0 && ConfigIni.nウインドウheight <= 0) // #34069 2014.7.24 yyagi 初回起動時は1280x720にする
\r
2004 ConfigIni.nウインドウwidth = 1280;
\r
2005 ConfigIni.nウインドウheight = 720;
\r
2006 //w = this.Window.Screen.WorkingArea.Width;
\r
2007 //h = this.Window.Screen.WorkingArea.Height;
\r
2008 //w = base.Window.Screen.Bounds.Width;
\r
2009 //h = base.Window.Screen.Bounds.Height;
\r
2010 //ConfigIni.nウインドウwidth = SampleFramework.GameWindowSize.Width;
\r
2011 //ConfigIni.nウインドウheight = SampleFramework.GameWindowSize.Height;
\r
2014 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
2015 #if !WindowedFullscreen
\r
2016 if (!ConfigIni.bウィンドウモード) // #23510 2010.11.02 yyagi: add; to recover window size in case bootup with fullscreen mode
\r
2017 { // #30666 2013.02.02 yyagi: currentClientSize should be always made
\r
2019 currentClientSize = new Size(ConfigIni.nウインドウwidth, ConfigIni.nウインドウheight);
\r
2020 #if !WindowedFullscreen
\r
2023 base.Window.MaximizeBox = true; // #23510 2010.11.04 yyagi: to support maximizing window
\r
2024 base.Window.FormBorderStyle = FormBorderStyle.Sizable; // #23510 2010.10.27 yyagi: changed from FixedDialog to Sizable, to support window resize
\r
2025 // #30666 2013.02.02 yyagi: moved the code to t全画面・ウインドウモード切り替え()
\r
2026 base.Window.ShowIcon = true;
\r
2027 base.Window.Icon = Properties.Resources.dtx;
\r
2028 base.Window.KeyDown += new KeyEventHandler(this.Window_KeyDown);
\r
2029 base.Window.MouseUp += new MouseEventHandler(this.Window_MouseUp);
\r
2030 base.Window.MouseDoubleClick += new MouseEventHandler(this.Window_MouseDoubleClick); // #23510 2010.11.13 yyagi: to go fullscreen mode
\r
2031 base.Window.ResizeEnd += new EventHandler(this.Window_ResizeEnd); // #23510 2010.11.20 yyagi: to set resized window size in Config.ini
\r
2032 base.Window.ApplicationActivated += new EventHandler(this.Window_ApplicationActivated);
\r
2033 base.Window.ApplicationDeactivated += new EventHandler(this.Window_ApplicationDeactivated);
\r
2034 //---------------------
\r
2036 #region [ Direct3D9Exを使うかどうか判定 ]
\r
2038 #region [ Direct3D9 デバイスの生成 ]
\r
2039 //---------------------
\r
2040 DeviceSettings settings = new DeviceSettings();
\r
2041 #if WindowedFullscreen
\r
2042 settings.Windowed = true; // #30666 2013.2.2 yyagi: Fullscreenmode is "Maximized window" mode
\r
2044 settings.Windowed = ConfigIni.bウィンドウモード;
\r
2046 settings.BackBufferWidth = SampleFramework.GameWindowSize.Width;
\r
2047 settings.BackBufferHeight = SampleFramework.GameWindowSize.Height;
\r
2048 // settings.BackBufferCount = 3;
\r
2049 settings.EnableVSync = ConfigIni.b垂直帰線待ちを行う;
\r
2050 // settings.BackBufferFormat = Format.A8R8G8B8;
\r
2051 // settings.MultisampleType = MultisampleType.FourSamples;
\r
2052 // settings.MultisampleQuality = 4;
\r
2053 // settings.MultisampleType = MultisampleType.None;
\r
2054 // settings.MultisampleQuality = 0;
\r
2058 base.GraphicsDeviceManager.ChangeDevice(settings);
\r
2060 catch (DeviceCreationException e)
\r
2062 Trace.TraceError(e.ToString());
\r
2063 MessageBox.Show(e.Message + e.ToString(), "DTXMania failed to boot: DirectX9 Initialize Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
\r
2064 Environment.Exit(-1);
\r
2067 base.IsFixedTimeStep = false;
\r
2068 // base.TargetElapsedTime = TimeSpan.FromTicks( 10000000 / 75 );
\r
2069 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
2070 base.InactiveSleepTime = TimeSpan.FromMilliseconds((float)(ConfigIni.n非フォーカス時スリープms)); // #23568 2010.11.3 yyagi: to support valiable sleep value when !IsActive
\r
2071 // #23568 2010.11.4 ikanick changed ( 1 -> ConfigIni )
\r
2072 #if WindowedFullscreen
\r
2073 this.t全画面_ウィンドウモード切り替え(); // #30666 2013.2.2 yyagi: finalize settings for "Maximized window mode"
\r
2075 actFlushGPU = new CActFlushGPU();
\r
2076 //---------------------
\r
2081 #region [ Skin の初期化 ]
\r
2082 //---------------------
\r
2083 Trace.TraceInformation("スキンの初期化を行います。");
\r
2087 Skin = new CSkin(CDTXMania.ConfigIni.strSystemSkinSubfolderFullName, CDTXMania.ConfigIni.bUseBoxDefSkin);
\r
2088 CDTXMania.ConfigIni.strSystemSkinSubfolderFullName = CDTXMania.Skin.GetCurrentSkinSubfolderFullName(true); // 旧指定のSkinフォルダが消滅していた場合に備える
\r
2089 Trace.TraceInformation("スキンの初期化を完了しました。");
\r
2093 Trace.TraceInformation("スキンの初期化に失敗しました。");
\r
2100 //---------------------
\r
2103 #region [ Timer の初期化 ]
\r
2104 //---------------------
\r
2105 Trace.TraceInformation("タイマの初期化を行います。");
\r
2109 Timer = new CTimer(CTimer.E種別.MultiMedia);
\r
2110 Trace.TraceInformation("タイマの初期化を完了しました。");
\r
2116 //---------------------
\r
2120 #region [ FPS カウンタの初期化 ]
\r
2121 //---------------------
\r
2122 Trace.TraceInformation("FPSカウンタの初期化を行います。");
\r
2127 Trace.TraceInformation("FPSカウンタを生成しました。");
\r
2133 //---------------------
\r
2135 #region [ act文字コンソールの初期化 ]
\r
2136 //---------------------
\r
2137 Trace.TraceInformation("文字コンソールの初期化を行います。");
\r
2141 act文字コンソール = new C文字コンソール();
\r
2142 Trace.TraceInformation("文字コンソールを生成しました。");
\r
2143 act文字コンソール.On活性化();
\r
2144 Trace.TraceInformation("文字コンソールを活性化しました。");
\r
2145 Trace.TraceInformation("文字コンソールの初期化を完了しました。");
\r
2147 catch (Exception exception)
\r
2149 Trace.TraceError(exception.Message);
\r
2150 Trace.TraceError("文字コンソールの初期化に失敗しました。");
\r
2156 //---------------------
\r
2158 #region [ Pad の初期化 ]
\r
2159 //---------------------
\r
2160 Trace.TraceInformation("パッドの初期化を行います。");
\r
2164 Pad = new CPad(ConfigIni, Input管理);
\r
2165 Trace.TraceInformation("パッドの初期化を完了しました。");
\r
2167 catch (Exception exception3)
\r
2169 Trace.TraceError(exception3.Message);
\r
2170 Trace.TraceError("パッドの初期化に失敗しました。");
\r
2176 //---------------------
\r
2178 #region [ Sound管理 の初期化 ]
\r
2179 //---------------------
\r
2180 Trace.TraceInformation("サウンドデバイスの初期化を行います。");
\r
2184 ESoundDeviceType soundDeviceType;
\r
2185 switch (CDTXMania.ConfigIni.nSoundDeviceType)
\r
2188 soundDeviceType = ESoundDeviceType.DirectSound;
\r
2191 soundDeviceType = ESoundDeviceType.ASIO;
\r
2194 soundDeviceType = ESoundDeviceType.ExclusiveWASAPI;
\r
2197 soundDeviceType = ESoundDeviceType.Unknown;
\r
2200 Sound管理 = new CSound管理(base.Window.Handle,
\r
2202 CDTXMania.ConfigIni.nWASAPIBufferSizeMs,
\r
2203 // CDTXMania.ConfigIni.nASIOBufferSizeMs,
\r
2205 CDTXMania.ConfigIni.nASIODevice,
\r
2206 CDTXMania.ConfigIni.bUseOSTimer
\r
2208 //Sound管理 = FDK.CSound管理.Instance;
\r
2209 //Sound管理.t初期化( soundDeviceType, 0, 0, CDTXMania.ConfigIni.nASIODevice, base.Window.Handle );
\r
2211 ShowWindowTitleWithSoundType();
\r
2212 FDK.CSound管理.bIsTimeStretch = CDTXMania.ConfigIni.bTimeStretch;
\r
2213 Sound管理.nMasterVolume = CDTXMania.ConfigIni.nMasterVolume;
\r
2214 //FDK.CSound管理.bIsMP3DecodeByWindowsCodec = CDTXMania.ConfigIni.bNoMP3Streaming;
\r
2215 Trace.TraceInformation("サウンドデバイスの初期化を完了しました。");
\r
2217 catch (Exception e)
\r
2219 Trace.TraceError(e.Message);
\r
2226 //---------------------
\r
2228 #region [ Songs管理 の初期化 ]
\r
2229 //---------------------
\r
2230 Trace.TraceInformation("曲リストの初期化を行います。");
\r
2234 Songs管理 = new CSongs管理();
\r
2235 // Songs管理_裏読 = new CSongs管理();
\r
2236 EnumSongs = new CEnumSongs();
\r
2237 actEnumSongs = new CActEnumSongs();
\r
2238 Trace.TraceInformation("曲リストの初期化を完了しました。");
\r
2240 catch (Exception e)
\r
2242 Trace.TraceError(e.Message);
\r
2243 Trace.TraceError("曲リストの初期化に失敗しました。");
\r
2249 //---------------------
\r
2251 #region [ CAvi の初期化 ]
\r
2252 //---------------------
\r
2254 //---------------------
\r
2256 #region [ Random の初期化 ]
\r
2257 //---------------------
\r
2258 Random = new Random((int)Timer.nシステム時刻);
\r
2259 //---------------------
\r
2261 #region [ ステージの初期化 ]
\r
2262 //---------------------
\r
2265 stage起動 = new CStage起動();
\r
2266 stageタイトル = new CStageタイトル();
\r
2267 // stageオプション = new CStageオプション();
\r
2268 stageコンフィグ = new CStageコンフィグ();
\r
2269 stage選曲 = new CStage選曲();
\r
2270 stage曲読み込み = new CStage曲読み込み();
\r
2271 stage演奏ドラム画面 = new CStage演奏ドラム画面();
\r
2272 stage演奏ギター画面 = new CStage演奏ギター画面();
\r
2273 stage結果 = new CStage結果();
\r
2274 stageChangeSkin = new CStageChangeSkin();
\r
2275 stage終了 = new CStage終了();
\r
2276 this.listトップレベルActivities = new List<CActivity>();
\r
2277 this.listトップレベルActivities.Add(actEnumSongs);
\r
2278 this.listトップレベルActivities.Add(act文字コンソール);
\r
2279 this.listトップレベルActivities.Add(stage起動);
\r
2280 this.listトップレベルActivities.Add(stageタイトル);
\r
2281 // this.listトップレベルActivities.Add( stageオプション );
\r
2282 this.listトップレベルActivities.Add(stageコンフィグ);
\r
2283 this.listトップレベルActivities.Add(stage選曲);
\r
2284 this.listトップレベルActivities.Add(stage曲読み込み);
\r
2285 this.listトップレベルActivities.Add(stage演奏ドラム画面);
\r
2286 this.listトップレベルActivities.Add(stage演奏ギター画面);
\r
2287 this.listトップレベルActivities.Add(stage結果);
\r
2288 this.listトップレベルActivities.Add(stageChangeSkin);
\r
2289 this.listトップレベルActivities.Add(stage終了);
\r
2290 this.listトップレベルActivities.Add(actFlushGPU);
\r
2291 //---------------------
\r
2293 #region [ プラグインの検索と生成 ]
\r
2294 //---------------------
\r
2295 PluginHost = new CPluginHost();
\r
2297 Trace.TraceInformation("プラグインの検索と生成を行います。");
\r
2301 this.tプラグイン検索と生成();
\r
2302 Trace.TraceInformation("プラグインの検索と生成を完了しました。");
\r
2308 //---------------------
\r
2310 #region [ プラグインの初期化 ]
\r
2311 //---------------------
\r
2312 if (this.listプラグイン != null && this.listプラグイン.Count > 0)
\r
2314 Trace.TraceInformation("プラグインの初期化を行います。");
\r
2318 foreach (STPlugin st in this.listプラグイン)
\r
2320 Directory.SetCurrentDirectory(st.strプラグインフォルダ);
\r
2321 st.plugin.On初期化(this.PluginHost);
\r
2322 st.plugin.OnManagedリソースの作成();
\r
2323 st.plugin.OnUnmanagedリソースの作成();
\r
2324 Directory.SetCurrentDirectory(CDTXMania.strEXEのあるフォルダ);
\r
2326 Trace.TraceInformation("すべてのプラグインの初期化を完了しました。");
\r
2330 Trace.TraceError("プラグインのどれかの初期化に失敗しました。");
\r
2339 //---------------------
\r
2342 Trace.TraceInformation("アプリケーションの初期化を完了しました。");
\r
2344 #region [ 最初のステージの起動 ]
\r
2345 //---------------------
\r
2346 Trace.TraceInformation("----------------------");
\r
2347 Trace.TraceInformation("■ 起動");
\r
2349 if (CDTXMania.bコンパクトモード)
\r
2351 r現在のステージ = stage曲読み込み;
\r
2355 r現在のステージ = stage起動;
\r
2358 //---------------------
\r
2362 public void ShowWindowTitleWithSoundType()
\r
2364 string delay = "";
\r
2365 if ( Sound管理.GetCurrentSoundDeviceType() != "DirectSound" )
\r
2367 delay = "(" + Sound管理.GetSoundDelay() + "ms)";
\r
2369 base.Window.Text = strWindowTitle + " (" + Sound管理.GetCurrentSoundDeviceType() + delay + ")";
\r
2372 private void t終了処理()
\r
2374 if( !this.b終了処理完了済み )
\r
2376 Trace.TraceInformation( "----------------------" );
\r
2377 Trace.TraceInformation( "■ アプリケーションの終了" );
\r
2378 #region [ 曲検索の終了処理 ]
\r
2379 //---------------------
\r
2380 if ( actEnumSongs != null )
\r
2382 Trace.TraceInformation( "曲検索actの終了処理を行います。" );
\r
2386 actEnumSongs.On非活性化();
\r
2387 actEnumSongs= null;
\r
2388 Trace.TraceInformation( "曲検索actの終了処理を完了しました。" );
\r
2390 catch ( Exception e )
\r
2392 Trace.TraceError( e.Message );
\r
2393 Trace.TraceError( "曲検索actの終了処理に失敗しました。" );
\r
2400 //---------------------
\r
2402 #region [ 現在のステージの終了処理 ]
\r
2403 //---------------------
\r
2404 if( CDTXMania.r現在のステージ != null && CDTXMania.r現在のステージ.b活性化してる ) // #25398 2011.06.07 MODIFY FROM
\r
2406 Trace.TraceInformation( "現在のステージを終了します。" );
\r
2410 r現在のステージ.On非活性化();
\r
2411 Trace.TraceInformation( "現在のステージの終了処理を完了しました。" );
\r
2418 //---------------------
\r
2420 #region [ プラグインの終了処理 ]
\r
2421 //---------------------
\r
2422 if (this.listプラグイン != null && this.listプラグイン.Count > 0)
\r
2424 Trace.TraceInformation( "すべてのプラグインを終了します。" );
\r
2428 foreach( STPlugin st in this.listプラグイン )
\r
2430 Directory.SetCurrentDirectory( st.strプラグインフォルダ );
\r
2431 st.plugin.OnUnmanagedリソースの解放();
\r
2432 st.plugin.OnManagedリソースの解放();
\r
2434 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );
\r
2436 PluginHost = null;
\r
2437 Trace.TraceInformation( "すべてのプラグインの終了処理を完了しました。" );
\r
2444 //---------------------
\r
2446 #region [ 曲リストの終了処理 ]
\r
2447 //---------------------
\r
2448 if (Songs管理 != null)
\r
2450 Trace.TraceInformation( "曲リストの終了処理を行います。" );
\r
2455 Trace.TraceInformation( "曲リストの終了処理を完了しました。" );
\r
2457 catch( Exception exception )
\r
2459 Trace.TraceError( exception.Message );
\r
2460 Trace.TraceError( "曲リストの終了処理に失敗しました。" );
\r
2468 //---------------------
\r
2470 #region [ スキンの終了処理 ]
\r
2471 //---------------------
\r
2474 Trace.TraceInformation( "スキンの終了処理を行います。" );
\r
2480 Trace.TraceInformation( "スキンの終了処理を完了しました。" );
\r
2482 catch( Exception exception2 )
\r
2484 Trace.TraceError( exception2.Message );
\r
2485 Trace.TraceError( "スキンの終了処理に失敗しました。" );
\r
2492 //---------------------
\r
2494 #region [ DirectSoundの終了処理 ]
\r
2495 //---------------------
\r
2496 if (Sound管理 != null)
\r
2498 Trace.TraceInformation( "DirectSound の終了処理を行います。" );
\r
2502 Sound管理.Dispose();
\r
2504 Trace.TraceInformation( "DirectSound の終了処理を完了しました。" );
\r
2506 catch( Exception exception3 )
\r
2508 Trace.TraceError( exception3.Message );
\r
2509 Trace.TraceError( "DirectSound の終了処理に失敗しました。" );
\r
2516 //---------------------
\r
2518 #region [ パッドの終了処理 ]
\r
2519 //---------------------
\r
2522 Trace.TraceInformation( "パッドの終了処理を行います。" );
\r
2527 Trace.TraceInformation( "パッドの終了処理を完了しました。" );
\r
2529 catch( Exception exception4 )
\r
2531 Trace.TraceError( exception4.Message );
\r
2532 Trace.TraceError( "パッドの終了処理に失敗しました。" );
\r
2539 //---------------------
\r
2541 #region [ DirectInput, MIDI入力の終了処理 ]
\r
2542 //---------------------
\r
2543 if (Input管理 != null)
\r
2545 Trace.TraceInformation( "DirectInput, MIDI入力の終了処理を行います。" );
\r
2549 Input管理.Dispose();
\r
2551 Trace.TraceInformation( "DirectInput, MIDI入力の終了処理を完了しました。" );
\r
2553 catch( Exception exception5 )
\r
2555 Trace.TraceError( exception5.Message );
\r
2556 Trace.TraceError( "DirectInput, MIDI入力の終了処理に失敗しました。" );
\r
2563 //---------------------
\r
2565 #region [ 文字コンソールの終了処理 ]
\r
2566 //---------------------
\r
2567 if (act文字コンソール != null)
\r
2569 Trace.TraceInformation( "文字コンソールの終了処理を行います。" );
\r
2573 act文字コンソール.On非活性化();
\r
2574 act文字コンソール = null;
\r
2575 Trace.TraceInformation( "文字コンソールの終了処理を完了しました。" );
\r
2577 catch( Exception exception6 )
\r
2579 Trace.TraceError( exception6.Message );
\r
2580 Trace.TraceError( "文字コンソールの終了処理に失敗しました。" );
\r
2587 //---------------------
\r
2589 #region [ FPSカウンタの終了処理 ]
\r
2590 //---------------------
\r
2591 Trace.TraceInformation("FPSカウンタの終了処理を行います。");
\r
2599 Trace.TraceInformation( "FPSカウンタの終了処理を完了しました。" );
\r
2605 //---------------------
\r
2607 #region [ タイマの終了処理 ]
\r
2608 //---------------------
\r
2609 Trace.TraceInformation("タイマの終了処理を行います。");
\r
2613 if( Timer != null )
\r
2617 Trace.TraceInformation( "タイマの終了処理を完了しました。" );
\r
2621 Trace.TraceInformation( "タイマは使用されていません。" );
\r
2628 //---------------------
\r
2630 #region [ Config.iniの出力 ]
\r
2631 //---------------------
\r
2632 Trace.TraceInformation("Config.ini を出力します。");
\r
2633 // if ( ConfigIni.bIsSwappedGuitarBass ) // #24063 2011.1.16 yyagi ギターベースがスワップしているときは元に戻す
\r
2634 if ( ConfigIni.bIsSwappedGuitarBass_AutoFlagsAreSwapped ) // #24415 2011.2.21 yyagi FLIP中かつ演奏中にalt-f4で終了したときは、AUTOのフラグをswapして戻す
\r
2636 ConfigIni.SwapGuitarBassInfos_AutoFlags();
\r
2638 if ( ConfigIni.bIsSwappedGuitarBass_PlaySettingsAreSwapped) // #35417 2015/8/18 yyagi FLIP中かつ演奏中にalt-f4で終了したときは、演奏設定のフラグをswapして戻す
\r
2640 ConfigIni.SwapGuitarBassInfos_PlaySettings();
\r
2642 string str = strEXEのあるフォルダ + "Config.ini";
\r
2646 if ( DTXVmode.Enabled )
\r
2648 DTXVmode.tUpdateConfigIni();
\r
2649 Trace.TraceInformation( "DTXVモードの設定情報を、Config.iniに保存しました。" );
\r
2653 ConfigIni.t書き出し( str );
\r
2654 Trace.TraceInformation( "保存しました。({0})", str );
\r
2657 catch( Exception e )
\r
2659 Trace.TraceError( e.Message );
\r
2660 Trace.TraceError( "Config.ini の出力に失敗しました。({0})", str );
\r
2666 //---------------------
\r
2668 #region [ DTXVmodeの終了処理 ]
\r
2669 //---------------------
\r
2670 //Trace.TraceInformation( "DTXVモードの終了処理を行います。" );
\r
2674 if ( DTXVmode != null )
\r
2677 //Trace.TraceInformation( "DTXVモードの終了処理を完了しました。" );
\r
2681 //Trace.TraceInformation( "DTXVモードは使用されていません。" );
\r
2686 //Trace.Unindent();
\r
2688 //---------------------
\r
2690 Trace.TraceInformation( "アプリケーションの終了処理を完了しました。" );
\r
2693 this.b終了処理完了済み = true;
\r
2696 private CScoreIni tScoreIniへBGMAdjustとHistoryとPlayCountを更新(string str新ヒストリ行)
\r
2698 bool bIsUpdatedDrums, bIsUpdatedGuitar, bIsUpdatedBass;
\r
2699 string strFilename = DTX.strファイル名の絶対パス + ".score.ini";
\r
2700 CScoreIni ini = new CScoreIni( strFilename );
\r
2701 if( !File.Exists( strFilename ) )
\r
2703 ini.stファイル.Title = DTX.TITLE;
\r
2704 ini.stファイル.Name = DTX.strファイル名;
\r
2705 ini.stファイル.Hash = CScoreIni.tファイルのMD5を求めて返す( DTX.strファイル名の絶対パス );
\r
2706 for( int i = 0; i < 6; i++ )
\r
2708 ini.stセクション[ i ].nPerfectになる範囲ms = nPerfect範囲ms;
\r
2709 ini.stセクション[ i ].nGreatになる範囲ms = nGreat範囲ms;
\r
2710 ini.stセクション[ i ].nGoodになる範囲ms = nGood範囲ms;
\r
2711 ini.stセクション[ i ].nPoorになる範囲ms = nPoor範囲ms;
\r
2714 ini.stファイル.BGMAdjust = DTX.nBGMAdjust;
\r
2715 CScoreIni.t更新条件を取得する( out bIsUpdatedDrums, out bIsUpdatedGuitar, out bIsUpdatedBass );
\r
2716 if( bIsUpdatedDrums || bIsUpdatedGuitar || bIsUpdatedBass )
\r
2718 if( bIsUpdatedDrums )
\r
2720 ini.stファイル.PlayCountDrums++;
\r
2722 if( bIsUpdatedGuitar )
\r
2724 ini.stファイル.PlayCountGuitar++;
\r
2726 if( bIsUpdatedBass )
\r
2728 ini.stファイル.PlayCountBass++;
\r
2730 ini.tヒストリを追加する( str新ヒストリ行 );
\r
2733 stage選曲.r現在選択中のスコア.譜面情報.演奏回数.Drums = ini.stファイル.PlayCountDrums;
\r
2734 stage選曲.r現在選択中のスコア.譜面情報.演奏回数.Guitar = ini.stファイル.PlayCountGuitar;
\r
2735 stage選曲.r現在選択中のスコア.譜面情報.演奏回数.Bass = ini.stファイル.PlayCountBass;
\r
2736 for( int j = 0; j < ini.stファイル.History.Length; j++ )
\r
2738 stage選曲.r現在選択中のスコア.譜面情報.演奏履歴[ j ] = ini.stファイル.History[ j ];
\r
2742 if( ConfigIni.bScoreIniを出力する )
\r
2744 ini.t書き出し( strFilename );
\r
2749 private void tガベージコレクションを実行する()
\r
2752 GC.WaitForPendingFinalizers();
\r
2754 GC.WaitForPendingFinalizers();
\r
2756 private void tプラグイン検索と生成()
\r
2758 this.listプラグイン = new List<STPlugin>();
\r
2760 string strIPluginActivityの名前 = typeof( IPluginActivity ).FullName;
\r
2761 string strプラグインフォルダパス = strEXEのあるフォルダ + "Plugins\\";
\r
2763 this.t指定フォルダ内でのプラグイン検索と生成( strプラグインフォルダパス, strIPluginActivityの名前 );
\r
2765 if( this.listプラグイン.Count > 0 )
\r
2766 Trace.TraceInformation( this.listプラグイン.Count + " 個のプラグインを読み込みました。" );
\r
2768 #region [ Windowイベント処理 ]
\r
2770 private System.Reflection.Assembly CurrentDomain_AssemblyResolve( object sender, ResolveEventArgs args )
\r
2772 var domain = (AppDomain) sender;
\r
2775 foreach ( var assembly in domain.GetAssemblies() )
\r
2777 if ( assembly.FullName == args.Name )
\r
2787 private void t指定フォルダ内でのプラグイン検索と生成( string strプラグインフォルダパス, string strプラグイン型名 )
\r
2789 // 指定されたパスが存在しないとエラー
\r
2790 if( !Directory.Exists( strプラグインフォルダパス ) )
\r
2792 Trace.TraceWarning( "プラグインフォルダが存在しません。(" + strプラグインフォルダパス + ")" );
\r
2796 AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
\r
2799 // (1) すべての *.dll について…
\r
2800 string[] strDLLs = System.IO.Directory.GetFiles( strプラグインフォルダパス, "*.dll" );
\r
2801 foreach( string dllName in strDLLs )
\r
2805 // (1-1) dll をアセンブリとして読み込む。
\r
2806 System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom( dllName );
\r
2808 // (1-2) アセンブリ内のすべての型について、プラグインとして有効か調べる
\r
2809 foreach ( Type t in asm.GetTypes() )
\r
2811 // (1-3) ↓クラスであり↓Publicであり↓抽象クラスでなく↓IPlugin型のインスタンスが作れる 型を持っていれば有効
\r
2812 if ( t.IsClass && t.IsPublic && !t.IsAbstract && t.GetInterface( strプラグイン型名 ) != null )
\r
2814 // (1-4) クラス名からインスタンスを作成する
\r
2815 var st = new STPlugin()
\r
2817 plugin = (IPluginActivity) asm.CreateInstance( t.FullName ),
\r
2818 strプラグインフォルダ = Path.GetDirectoryName( dllName ),
\r
2819 strアセンブリ簡易名 = asm.GetName().Name,
\r
2820 Version = asm.GetName().Version,
\r
2823 // (1-5) プラグインリストへ登録
\r
2824 this.listプラグイン.Add( st );
\r
2825 Trace.TraceInformation( "プラグイン {0} ({1}, {2}, {3}) を読み込みました。", t.FullName, Path.GetFileName( dllName ), st.strアセンブリ簡易名, st.Version.ToString() );
\r
2829 catch ( System.Reflection.ReflectionTypeLoadException e )
\r
2831 Trace.TraceInformation( dllName + " からプラグインを生成することに失敗しました。スキップします。" );
\r
2832 Trace.TraceInformation( e.ToString() );
\r
2833 Trace.TraceInformation( e.Message );
\r
2835 StringBuilder sb = new StringBuilder();
\r
2836 foreach (Exception exSub in e.LoaderExceptions)
\r
2838 sb.AppendLine(exSub.Message);
\r
2839 FileNotFoundException exFileNotFound = exSub as FileNotFoundException;
\r
2840 if (exFileNotFound != null)
\r
2842 if(!string.IsNullOrEmpty(exFileNotFound.FusionLog))
\r
2844 sb.AppendLine("Fusion Log:");
\r
2845 sb.AppendLine(exFileNotFound.FusionLog);
\r
2850 string errorMessage = sb.ToString();
\r
2851 //Display or log the error based on your application.
\r
2852 Trace.TraceInformation( errorMessage );
\r
2855 catch ( Exception e )
\r
2857 Trace.TraceInformation( dllName + " からプラグインを生成することに失敗しました。スキップします。" );
\r
2858 Trace.TraceInformation( e.ToString() );
\r
2859 Trace.TraceInformation( e.Message );
\r
2863 // (2) サブフォルダがあれば再帰する
\r
2864 string[] strDirs = Directory.GetDirectories( strプラグインフォルダパス, "*" );
\r
2865 foreach( string dir in strDirs )
\r
2866 this.t指定フォルダ内でのプラグイン検索と生成( dir + "\\", strプラグイン型名 );
\r
2868 //-----------------
\r
2869 private void Window_ApplicationActivated( object sender, EventArgs e )
\r
2871 this.bApplicationActive = true;
\r
2873 private void Window_ApplicationDeactivated( object sender, EventArgs e )
\r
2875 this.bApplicationActive = false;
\r
2877 private void Window_KeyDown( object sender, KeyEventArgs e )
\r
2879 if ( e.KeyCode == Keys.Menu )
\r
2882 e.SuppressKeyPress = true;
\r
2884 else if ( ( e.KeyCode == Keys.Return ) && e.Alt )
\r
2886 if ( ConfigIni != null )
\r
2888 ConfigIni.bウィンドウモード = !ConfigIni.bウィンドウモード;
\r
2889 this.t全画面_ウィンドウモード切り替え();
\r
2892 e.SuppressKeyPress = true;
\r
2896 for ( int i = 0; i < 0x10; i++ )
\r
2898 if ( ConfigIni.KeyAssign.System.Capture[ i ].コード > 0 &&
\r
2899 e.KeyCode == DeviceConstantConverter.KeyToKeyCode( (SlimDX.DirectInput.Key) ConfigIni.KeyAssign.System.Capture[ i ].コード ) )
\r
2901 // Debug.WriteLine( "capture: " + string.Format( "{0:2x}", (int) e.KeyCode ) + " " + (int) e.KeyCode );
\r
2902 string strFullPath =
\r
2903 Path.Combine( CDTXMania.strEXEのあるフォルダ, "Capture_img" );
\r
2904 strFullPath = Path.Combine( strFullPath, DateTime.Now.ToString( "yyyyMMddHHmmss" ) + ".png" );
\r
2905 SaveResultScreen( strFullPath );
\r
2910 private void Window_MouseUp( object sender, MouseEventArgs e )
\r
2915 private void Window_MouseDoubleClick( object sender, MouseEventArgs e) // #23510 2010.11.13 yyagi: to go full screen mode
\r
2917 if ( mb.Equals(MouseButtons.Left) && ConfigIni.bIsAllowedDoubleClickFullscreen ) // #26752 2011.11.27 yyagi
\r
2919 ConfigIni.bウィンドウモード = false;
\r
2920 this.t全画面_ウィンドウモード切り替え();
\r
2923 private void Window_ResizeEnd(object sender, EventArgs e) // #23510 2010.11.20 yyagi: to get resized window size
\r
2925 if ( ConfigIni.bウィンドウモード )
\r
2927 ConfigIni.n初期ウィンドウ開始位置X = base.Window.Location.X; // #30675 2013.02.04 ikanick add
\r
2928 ConfigIni.n初期ウィンドウ開始位置Y = base.Window.Location.Y; //
\r
2931 ConfigIni.nウインドウwidth = (ConfigIni.bウィンドウモード) ? base.Window.ClientSize.Width : currentClientSize.Width; // #23510 2010.10.31 yyagi add
\r
2932 ConfigIni.nウインドウheight = (ConfigIni.bウィンドウモード) ? base.Window.ClientSize.Height : currentClientSize.Height;
\r
2936 //internal sealed class GCBeep // GC発生の度にbeep
\r
2940 // Console.Beep();
\r
2941 // if ( !AppDomain.CurrentDomain.IsFinalizingForUnload()
\r
2942 // && !Environment.HasShutdownStarted )
\r
2949 //-----------------
\r
2951 //Stopwatch sw = new Stopwatch();
\r
2952 //List<int> swlist1, swlist2, swlist3, swlist4, swlist5;
\r