OSDN Git Service

b8f6d77fd5a0bf2fc9b46427488a2278cdab8a3f
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / 全体 / CDTXMania.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Globalization;\r
4 using System.Text;\r
5 using System.Windows.Forms;\r
6 using System.Drawing;\r
7 using System.Diagnostics;\r
8 using System.Runtime.InteropServices;\r
9 using System.IO;\r
10 using System.Threading;\r
11 using System.Runtime.Serialization.Formatters.Binary;\r
12 using SlimDX;\r
13 using SlimDX.Direct3D9;\r
14 using FDK;\r
15 using SampleFramework;\r
16 \r
17 namespace DTXMania\r
18 {\r
19         internal class CDTXMania : Game\r
20         {\r
21                 // プロパティ\r
22                 #region [ properties ]\r
23                 public static readonly string VERSION = "098(131101)";\r
24                 public static readonly string SLIMDXDLL = "c_net20x86_Jun2010";\r
25                 public static readonly string D3DXDLL = "d3dx9_43.dll";         // June 2010\r
26         //public static readonly string D3DXDLL = "d3dx9_42.dll";       // February 2010\r
27         //public static readonly string D3DXDLL = "d3dx9_41.dll";       // March 2009\r
28 \r
29                 public static CDTXMania app\r
30                 {\r
31                         get;\r
32                         private set;\r
33                 }\r
34                 public static C文字コンソール act文字コンソール\r
35                 { \r
36                         get;\r
37                         private set;\r
38                 }\r
39                 public static bool bコンパクトモード\r
40                 {\r
41                         get;\r
42                         private set;\r
43                 }\r
44                 public static CConfigIni ConfigIni\r
45                 {\r
46                         get; \r
47                         private set;\r
48                 }\r
49                 public static CDTX DTX\r
50                 {\r
51                         get\r
52                         {\r
53                                 return dtx;\r
54                         }\r
55                         set\r
56                         {\r
57                                 if( ( dtx != null ) && ( app != null ) )\r
58                                 {\r
59                                         dtx.On非活性化();\r
60                                         app.listトップレベルActivities.Remove( dtx );\r
61                                 }\r
62                                 dtx = value;\r
63                                 if( ( dtx != null ) && ( app != null ) )\r
64                                 {\r
65                                         app.listトップレベルActivities.Add( dtx );\r
66                                 }\r
67                         }\r
68                 }\r
69                 public static CFPS FPS\r
70                 { \r
71                         get; \r
72                         private set;\r
73                 }\r
74                 public static CInput管理 Input管理 \r
75                 {\r
76                         get;\r
77                         private set;\r
78                 }\r
79                 public static int nPerfect範囲ms\r
80                 {\r
81                         get\r
82                         {\r
83                                 if( stage選曲.r確定された曲 != null )\r
84                                 {\r
85                                         C曲リストノード c曲リストノード = stage選曲.r確定された曲.r親ノード;\r
86                                         if( ( ( c曲リストノード != null ) && ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX ) ) && ( c曲リストノード.nPerfect範囲ms >= 0 ) )\r
87                                         {\r
88                                                 return c曲リストノード.nPerfect範囲ms;\r
89                                         }\r
90                                 }\r
91                                 return ConfigIni.nヒット範囲ms.Perfect;\r
92                         }\r
93                 }\r
94                 public static int nGreat範囲ms\r
95                 {\r
96                         get\r
97                         {\r
98                                 if( stage選曲.r確定された曲 != null )\r
99                                 {\r
100                                         C曲リストノード c曲リストノード = stage選曲.r確定された曲.r親ノード;\r
101                                         if( ( ( c曲リストノード != null ) && ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX ) ) && ( c曲リストノード.nGreat範囲ms >= 0 ) )\r
102                                         {\r
103                                                 return c曲リストノード.nGreat範囲ms;\r
104                                         }\r
105                                 }\r
106                                 return ConfigIni.nヒット範囲ms.Great;\r
107                         }\r
108                 }\r
109                 public static int nGood範囲ms\r
110                 {\r
111                         get\r
112                         {\r
113                                 if( stage選曲.r確定された曲 != null )\r
114                                 {\r
115                                         C曲リストノード c曲リストノード = stage選曲.r確定された曲.r親ノード;\r
116                                         if( ( ( c曲リストノード != null ) && ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX ) ) && ( c曲リストノード.nGood範囲ms >= 0 ) )\r
117                                         {\r
118                                                 return c曲リストノード.nGood範囲ms;\r
119                                         }\r
120                                 }\r
121                                 return ConfigIni.nヒット範囲ms.Good;\r
122                         }\r
123                 }\r
124                 public static int nPoor範囲ms\r
125                 {\r
126                         get\r
127                         {\r
128                                 if( stage選曲.r確定された曲 != null )\r
129                                 {\r
130                                         C曲リストノード c曲リストノード = stage選曲.r確定された曲.r親ノード;\r
131                                         if( ( ( c曲リストノード != null ) && ( c曲リストノード.eノード種別 == C曲リストノード.Eノード種別.BOX ) ) && ( c曲リストノード.nPoor範囲ms >= 0 ) )\r
132                                         {\r
133                                                 return c曲リストノード.nPoor範囲ms;\r
134                                         }\r
135                                 }\r
136                                 return ConfigIni.nヒット範囲ms.Poor;\r
137                         }\r
138                 }\r
139                 public static CPad Pad \r
140                 {\r
141                         get;\r
142                         private set;\r
143                 }\r
144                 public static Random Random\r
145                 {\r
146                         get;\r
147                         private set;\r
148                 }\r
149                 public static CSkin Skin\r
150                 {\r
151                         get; \r
152                         private set;\r
153                 }\r
154                 public static CSongs管理 Songs管理 \r
155                 {\r
156                         get;\r
157                         set;    // 2012.1.26 yyagi private解除 CStage起動でのdesirialize読み込みのため\r
158                 }\r
159                 public static CEnumSongs EnumSongs\r
160                 {\r
161                         get;\r
162                         private set;\r
163                 }\r
164                 public static CActEnumSongs actEnumSongs\r
165                 {\r
166                         get;\r
167                         private set;\r
168                 }\r
169                 public static CActFlushGPU actFlushGPU\r
170                 {\r
171                         get;\r
172                         private set;\r
173                 }\r
174 \r
175                 public static CSound管理 Sound管理\r
176                 {\r
177                         get;\r
178                         private set;\r
179                 }\r
180                 public static CStage起動 stage起動 \r
181                 {\r
182                         get; \r
183                         private set;\r
184                 }\r
185                 public static CStageタイトル stageタイトル\r
186                 {\r
187                         get;\r
188                         private set;\r
189                 }\r
190 //              public static CStageオプション stageオプション\r
191 //              { \r
192 //                      get;\r
193 //                      private set;\r
194 //              }\r
195                 public static CStageコンフィグ stageコンフィグ \r
196                 { \r
197                         get; \r
198                         private set;\r
199                 }\r
200                 public static CStage選曲 stage選曲\r
201                 {\r
202                         get;\r
203                         private set;\r
204                 }\r
205                 public static CStage曲読み込み stage曲読み込み\r
206                 {\r
207                         get;\r
208                         private set;\r
209                 }\r
210                 public static CStage演奏ギター画面 stage演奏ギター画面\r
211                 {\r
212                         get;\r
213                         private set;\r
214                 }\r
215                 public static CStage演奏ドラム画面 stage演奏ドラム画面\r
216                 {\r
217                         get;\r
218                         private set;\r
219                 }\r
220                 public static CStage結果 stage結果\r
221                 {\r
222                         get;\r
223                         private set;\r
224                 }\r
225                 public static CStageChangeSkin stageChangeSkin\r
226                 {\r
227                         get;\r
228                         private set;\r
229                 }\r
230                 public static CStage終了 stage終了\r
231                 {\r
232                         get;\r
233                         private set;\r
234                 }\r
235                 public static CStage r現在のステージ = null;\r
236                 public static CStage r直前のステージ = null;\r
237                 public static string strEXEのあるフォルダ \r
238                 {\r
239                         get;\r
240                         private set;\r
241                 }\r
242                 public static string strコンパクトモードファイル\r
243                 { \r
244                         get; \r
245                         private set;\r
246                 }\r
247                 public static CTimer Timer\r
248                 {\r
249                         get;\r
250                         private set;\r
251                 }\r
252                 public static Format TextureFormat = Format.A8R8G8B8;\r
253                 internal static IPluginActivity act現在入力を占有中のプラグイン = null;\r
254                 public bool bApplicationActive\r
255                 {\r
256                         get; \r
257                         private set;\r
258                 }\r
259                 public bool b次のタイミングで垂直帰線同期切り替えを行う\r
260                 {\r
261                         get; \r
262                         set;\r
263                 }\r
264                 public bool b次のタイミングで全画面・ウィンドウ切り替えを行う\r
265                 {\r
266                         get;\r
267                         set;\r
268                 }\r
269                 public Device Device\r
270                 {\r
271                         get { return base.GraphicsDeviceManager.Direct3D9.Device; }\r
272                 }\r
273                 public CPluginHost PluginHost\r
274                 {\r
275                         get;\r
276                         private set;\r
277                 }\r
278                 public List<STPlugin> listプラグイン = new List<STPlugin>();\r
279                 public struct STPlugin\r
280                 {\r
281                         public IPluginActivity plugin;\r
282                         public string strプラグインフォルダ;\r
283                         public string strアセンブリ簡易名;\r
284                         public Version Version;\r
285                 }\r
286                 private static Size currentClientSize           // #23510 2010.10.27 add yyagi to keep current window size\r
287                 {\r
288                         get;\r
289                         set;\r
290                 }\r
291                 //              public static CTimer ct;\r
292                 public IntPtr WindowHandle                                      // 2012.10.24 yyagi; to add ASIO support\r
293                 {\r
294                         get { return base.Window.Handle; }\r
295                 }\r
296                 #endregion\r
297 \r
298                 // コンストラクタ\r
299 \r
300                 public CDTXMania()\r
301                 {\r
302                         CDTXMania.app = this;\r
303                         this.t起動処理();\r
304                 }\r
305 \r
306 \r
307                 // メソッド\r
308 \r
309                 public void t全画面・ウィンドウモード切り替え()\r
310                 {\r
311 #if WindowedFullscreen\r
312                         if ( ConfigIni != null )\r
313 #else\r
314                         DeviceSettings settings = base.GraphicsDeviceManager.CurrentSettings.Clone();\r
315                         if ( ( ConfigIni != null ) && ( ConfigIni.bウィンドウモード != settings.Windowed ) )\r
316 #endif\r
317                         {\r
318 #if !WindowedFullscreen\r
319                                 settings.Windowed = ConfigIni.bウィンドウモード;\r
320 #endif\r
321                                 if ( ConfigIni.bウィンドウモード == false )     // #23510 2010.10.27 yyagi: backup current window size before going fullscreen mode\r
322                                 {\r
323                                         currentClientSize = this.Window.ClientSize;\r
324                                         ConfigIni.nウインドウwidth = this.Window.ClientSize.Width;\r
325                                         ConfigIni.nウインドウheight = this.Window.ClientSize.Height;\r
326 //                                      FDK.CTaskBar.ShowTaskBar( false );\r
327                                 }\r
328 #if !WindowedFullscreen\r
329                                 base.GraphicsDeviceManager.ChangeDevice( settings );\r
330 #endif\r
331                                 if ( ConfigIni.bウィンドウモード == true )      // #23510 2010.10.27 yyagi: to resume window size from backuped value\r
332                                 {\r
333 #if WindowedFullscreen\r
334                                                                                                                         // #30666 2013.2.2 yyagi Don't use Fullscreen mode becasue NVIDIA GeForce is\r
335                                                                                                                         // tend to delay drawing on Fullscreen mode. So DTXMania uses Maximized window\r
336                                                                                                                         // in spite of using fullscreen mode.\r
337                                         app.Window.WindowState = FormWindowState.Normal;\r
338                                         app.Window.FormBorderStyle = FormBorderStyle.Sizable;\r
339                                         app.Window.WindowState = FormWindowState.Normal;\r
340 #endif\r
341                                         base.Window.ClientSize =\r
342                                                 new Size( currentClientSize.Width, currentClientSize.Height );\r
343 //                                      FDK.CTaskBar.ShowTaskBar( true );\r
344                                 }\r
345 #if WindowedFullscreen\r
346                                 else \r
347                                 {\r
348                                         app.Window.WindowState = FormWindowState.Normal;\r
349                                         app.Window.FormBorderStyle = FormBorderStyle.None;\r
350                                         app.Window.WindowState = FormWindowState.Maximized;\r
351                                 }\r
352                                 if ( ConfigIni.bウィンドウモード )\r
353                                 {\r
354                                     if ( !this.bマウスカーソル表示中 )\r
355                                     {\r
356                                         Cursor.Show();\r
357                                         this.bマウスカーソル表示中 = true;\r
358                                     }\r
359                                 }\r
360                                 else if ( this.bマウスカーソル表示中 )\r
361                                 {\r
362                                     Cursor.Hide();\r
363                                     this.bマウスカーソル表示中 = false;\r
364                                 }\r
365 #endif\r
366                         }\r
367                 }\r
368 \r
369                 #region [ #24609 リザルト画像をpngで保存する ]              // #24609 2011.3.14 yyagi; to save result screen in case BestRank or HiSkill.\r
370                 /// <summary>\r
371                 /// リザルト画像のキャプチャと保存。\r
372                 /// </summary>\r
373                 /// <param name="strFilename">保存するファイル名(フルパス)</param>\r
374                 public bool SaveResultScreen( string strFullPath )\r
375                 {\r
376                         string strSavePath = Path.GetDirectoryName( strFullPath );\r
377                         if ( !Directory.Exists( strSavePath ) )\r
378                         {\r
379                                 try\r
380                                 {\r
381                                         Directory.CreateDirectory( strSavePath );\r
382                                 }\r
383                                 catch\r
384                                 {\r
385                                         return false;\r
386                                 }\r
387                         }\r
388 \r
389                         // http://www.gamedev.net/topic/594369-dx9slimdxati-incorrect-saving-surface-to-file/\r
390                         using ( Surface pSurface = CDTXMania.app.Device.GetRenderTarget( 0 ) )\r
391                         {\r
392                                 Surface.ToFile( pSurface, strFullPath, ImageFileFormat.Png );\r
393                         }\r
394                         return true;\r
395                 }\r
396                 #endregion\r
397 \r
398                 // Game 実装\r
399 \r
400                 protected override void Initialize()\r
401                 {\r
402 //                      new GCBeep();\r
403                         if( this.listトップレベルActivities != null )\r
404                         {\r
405                                 foreach( CActivity activity in this.listトップレベルActivities )\r
406                                         activity.OnManagedリソースの作成();\r
407                         }\r
408 \r
409                         foreach( STPlugin st in this.listプラグイン )\r
410                         {\r
411                                 Directory.SetCurrentDirectory( st.strプラグインフォルダ );\r
412                                 st.plugin.OnManagedリソースの作成();\r
413                                 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
414                         }\r
415 #if GPUFlushAfterPresent\r
416                         FrameEnd += dtxmania_FrameEnd;\r
417 #endif\r
418                 }\r
419 #if GPUFlushAfterPresent\r
420                 void dtxmania_FrameEnd( object sender, EventArgs e )    // GraphicsDeviceManager.game_FrameEnd()後に実行される\r
421                 {                                                                                                               // → Present()直後にGPUをFlushする\r
422                                                                                                                                 // → 画面のカクツキが頻発したため、ここでのFlushは行わない\r
423                         actFlushGPU.On進行描画();           // Flush GPU\r
424                 }\r
425 #endif\r
426                 protected override void LoadContent()\r
427                 {\r
428                         if ( ConfigIni.bウィンドウモード )\r
429                         {\r
430                                 if( !this.bマウスカーソル表示中 )\r
431                                 {\r
432                                         Cursor.Show();\r
433                                         this.bマウスカーソル表示中 = true;\r
434                                 }\r
435                         }\r
436                         else if( this.bマウスカーソル表示中 )\r
437                         {\r
438                                 Cursor.Hide();\r
439                                 this.bマウスカーソル表示中 = false;\r
440                         }\r
441                         this.Device.SetTransform(TransformState.View, Matrix.LookAtLH(new Vector3(0f, 0f, (float)(-SampleFramework.GameWindowSize.Height / 2 * Math.Sqrt(3.0))), new Vector3(0f, 0f, 0f), new Vector3(0f, 1f, 0f)));\r
442                         this.Device.SetTransform(TransformState.Projection, Matrix.PerspectiveFovLH(C変換.DegreeToRadian((float)60f), ((float)this.Device.Viewport.Width) / ((float)this.Device.Viewport.Height), -100f, 100f));\r
443                         this.Device.SetRenderState(RenderState.Lighting, false);\r
444                         this.Device.SetRenderState( RenderState.ZEnable, false );\r
445                         this.Device.SetRenderState( RenderState.AntialiasedLineEnable, false );\r
446                         this.Device.SetRenderState( RenderState.AlphaTestEnable, true );\r
447                         this.Device.SetRenderState( RenderState.AlphaRef, 10 );\r
448 \r
449                         this.Device.SetRenderState( RenderState.MultisampleAntialias, true );\r
450                         this.Device.SetSamplerState( 0, SamplerState.MinFilter, TextureFilter.Linear );\r
451                         this.Device.SetSamplerState( 0, SamplerState.MagFilter, TextureFilter.Linear );\r
452 \r
453                         this.Device.SetRenderState<Compare>( RenderState.AlphaFunc, Compare.Greater );\r
454                         this.Device.SetRenderState( RenderState.AlphaBlendEnable, true );\r
455                         this.Device.SetRenderState<Blend>( RenderState.SourceBlend, Blend.SourceAlpha );\r
456                         this.Device.SetRenderState<Blend>( RenderState.DestinationBlend, Blend.InverseSourceAlpha );\r
457                         this.Device.SetTextureStageState( 0, TextureStage.AlphaOperation, TextureOperation.Modulate );\r
458                         this.Device.SetTextureStageState( 0, TextureStage.AlphaArg1, 2 );\r
459                         this.Device.SetTextureStageState( 0, TextureStage.AlphaArg2, 1 );\r
460 \r
461                         if( this.listトップレベルActivities != null )\r
462                         {\r
463                                 foreach( CActivity activity in this.listトップレベルActivities )\r
464                                         activity.OnUnmanagedリソースの作成();\r
465                         }\r
466 \r
467                         foreach( STPlugin st in this.listプラグイン )\r
468                         {\r
469                                 Directory.SetCurrentDirectory( st.strプラグインフォルダ );\r
470                                 st.plugin.OnUnmanagedリソースの作成();\r
471                                 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
472                         }\r
473                 }\r
474                 protected override void UnloadContent()\r
475                 {\r
476                         if( this.listトップレベルActivities != null )\r
477                         {\r
478                                 foreach( CActivity activity in this.listトップレベルActivities )\r
479                                         activity.OnUnmanagedリソースの解放();\r
480                         }\r
481 \r
482                         foreach( STPlugin st in this.listプラグイン )\r
483                         {\r
484                                 Directory.SetCurrentDirectory( st.strプラグインフォルダ );\r
485                                 st.plugin.OnUnmanagedリソースの解放();\r
486                                 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
487                         }\r
488                 }\r
489                 protected override void OnExiting( EventArgs e )\r
490                 {\r
491                         CPowerManagement.tEnableMonitorSuspend();               // スリープ抑止状態を解除\r
492                         this.t終了処理();\r
493                         base.OnExiting( e );\r
494                 }\r
495                 protected override void Update( GameTime gameTime )\r
496                 {\r
497                 }\r
498                 protected override void Draw( GameTime gameTime )\r
499                 {\r
500                         Sound管理.t再生中の処理をする();\r
501 \r
502                         if( Timer != null )\r
503                                 Timer.t更新();\r
504             if (CSound管理.rc演奏用タイマ != null)\r
505                 CSound管理.rc演奏用タイマ.t更新();\r
506 \r
507                         if( Input管理 != null )\r
508                                 Input管理.tポーリング( this.bApplicationActive, CDTXMania.ConfigIni.bバッファ入力を行う );\r
509 \r
510                         if( FPS != null )\r
511                                 FPS.tカウンタ更新();\r
512 \r
513                         //if( Pad != null )                                     ポーリング時にクリアしたらダメ!曲の開始時に1回だけクリアする。(2010.9.11)\r
514                         //      Pad.st検知したデバイス.Clear();\r
515 \r
516                         if( this.Device == null )\r
517                                 return;\r
518 \r
519                         if ( this.bApplicationActive )  // DTXMania本体起動中の本体/モニタの省電力モード移行を抑止\r
520                                 CPowerManagement.tDisableMonitorSuspend();\r
521 \r
522                         // #xxxxx 2013.4.8 yyagi; sleepの挿入位置を、EndScnene~Present間から、BeginScene前に移動。描画遅延を小さくするため。\r
523                         #region [ スリープ ]\r
524                         if ( ConfigIni.nフレーム毎スリープms >= 0 )                    // #xxxxx 2011.11.27 yyagi\r
525                         {\r
526                                 Thread.Sleep( ConfigIni.nフレーム毎スリープms );\r
527                         }\r
528                         #endregion\r
529 \r
530                         this.Device.BeginScene();\r
531                         this.Device.Clear( ClearFlags.ZBuffer | ClearFlags.Target, Color.Black, 1f, 0 );\r
532 \r
533                         if( r現在のステージ != null )\r
534                         {\r
535                                 this.n進行描画の戻り値 = ( r現在のステージ != null ) ? r現在のステージ.On進行描画() : 0;\r
536 \r
537                                 #region [ プラグインの進行描画 ]\r
538                                 //---------------------\r
539                                 foreach( STPlugin sp in this.listプラグイン )\r
540                                 {\r
541                                         Directory.SetCurrentDirectory( sp.strプラグインフォルダ );\r
542 \r
543                                         if( CDTXMania.act現在入力を占有中のプラグイン == null || CDTXMania.act現在入力を占有中のプラグイン == sp.plugin )\r
544                                                 sp.plugin.On進行描画( CDTXMania.Pad, CDTXMania.Input管理.Keyboard );\r
545                                         else\r
546                                                 sp.plugin.On進行描画( null, null );\r
547 \r
548                                         Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
549                                 }\r
550                                 //---------------------\r
551                                 #endregion\r
552 \r
553 \r
554                                 CScoreIni scoreIni = null;\r
555 \r
556                                 if ( Control.IsKeyLocked( Keys.CapsLock ) )                             // #30925 2013.3.11 yyagi; capslock=ON時は、EnumSongsしないようにして、起動負荷とASIOの音切れの関係を確認する\r
557                                 {                                                                                                               // → songs.db等の書き込み時だと音切れするっぽい\r
558                                         actEnumSongs.On非活性化();\r
559                                         EnumSongs.SongListEnumCompletelyDone();\r
560                                         CDTXMania.stage選曲.bIsEnumeratingSongs = false;\r
561                                 }\r
562                                 #region [ 曲検索スレッドの起動/終了 ]                                       // ここに"Enumerating Songs..."表示を集約\r
563                                 if ( !CDTXMania.bコンパクトモード )\r
564                                 {\r
565                                         actEnumSongs.On進行描画();                                                  // "Enumerating Songs..."アイコンの描画\r
566                                 }\r
567                                 switch ( r現在のステージ.eステージID )\r
568                                 {\r
569                                         case CStage.Eステージ.タイトル:\r
570                                         case CStage.Eステージ.コンフィグ:\r
571                                         case CStage.Eステージ.選曲:\r
572                                         case CStage.Eステージ.曲読み込み:\r
573                                                 if ( EnumSongs != null )\r
574                                                 {\r
575                                                         #region [ (特定条件時) 曲検索スレッドの起動・開始 ]\r
576                                                         if ( r現在のステージ.eステージID == CStage.Eステージ.タイトル &&\r
577                                                                  r直前のステージ.eステージID == CStage.Eステージ.起動 &&\r
578                                                                  this.n進行描画の戻り値 == (int) CStageタイトル.E戻り値.継続 &&\r
579                                                                  !EnumSongs.IsSongListEnumStarted )\r
580                                                         {\r
581                                                                 actEnumSongs.On活性化();\r
582                                                                 CDTXMania.stage選曲.bIsEnumeratingSongs = true;\r
583                                                                 EnumSongs.Init( CDTXMania.Songs管理.listSongsDB, CDTXMania.Songs管理.nSongsDBから取得できたスコア数 );   // songs.db情報と、取得した曲数を、新インスタンスにも与える\r
584                                                                 EnumSongs.StartEnumFromDisk();          // 曲検索スレッドの起動・開始\r
585                                                                 if ( CDTXMania.Songs管理.nSongsDBから取得できたスコア数 == 0 )     // もし初回起動なら、検索スレッドのプライオリティをLowestでなくNormalにする\r
586                                                                 {\r
587                                                                         EnumSongs.ChangeEnumeratePriority( ThreadPriority.Normal );\r
588                                                                 }\r
589                                                         }\r
590                                                         #endregion\r
591                                                         \r
592                                                         #region [ 曲検索の中断と再開 ]\r
593                                                         if ( r現在のステージ.eステージID == CStage.Eステージ.選曲 && !EnumSongs.IsSongListEnumCompletelyDone )\r
594                                                         {\r
595                                                                 switch ( this.n進行描画の戻り値 )\r
596                                                                 {\r
597                                                                         case 0:         // 何もない\r
598                                                                                 //if ( CDTXMania.stage選曲.bIsEnumeratingSongs )\r
599                                                                                 if ( !CDTXMania.stage選曲.bIsPlayingPremovie )\r
600                                                                                 {\r
601                                                                                         EnumSongs.Resume();                                             // #27060 2012.2.6 yyagi 中止していたバックグランド曲検索を再開\r
602                                                                                         EnumSongs.IsSlowdown = false;\r
603                                                                                 }\r
604                                                                                 else\r
605                                                                                 {\r
606                                                                                         // EnumSongs.Suspend();                                 // #27060 2012.3.2 yyagi #PREMOVIE再生中は曲検索を低速化\r
607                                                                                         EnumSongs.IsSlowdown = true;\r
608                                                                                 }\r
609                                                                                 actEnumSongs.On活性化();\r
610                                                                                 break;\r
611 \r
612                                                                         case 2:         // 曲決定\r
613                                                                                 EnumSongs.Suspend();                                            // #27060 バックグラウンドの曲検索を一時停止\r
614                                                                                 actEnumSongs.On非活性化();\r
615                                                                                 break;\r
616                                                                 }\r
617                                                         }\r
618                                                         #endregion\r
619 \r
620                                                         #region [ 曲探索中断待ち待機 ]\r
621                                                         if ( r現在のステージ.eステージID == CStage.Eステージ.曲読み込み && !EnumSongs.IsSongListEnumCompletelyDone &&\r
622                                                                 EnumSongs.thDTXFileEnumerate != null )                                                  // #28700 2012.6.12 yyagi; at Compact mode, enumerating thread does not exist.\r
623                                                         {\r
624                                                                 EnumSongs.WaitUntilSuspended();                                                                 // 念のため、曲検索が一時中断されるまで待機\r
625                                                         }\r
626                                                         #endregion\r
627 \r
628                                                         #region [ 曲検索が完了したら、実際の曲リストに反映する ]\r
629                                                         // CStage選曲.On活性化() に回した方がいいかな?\r
630                                                         if ( EnumSongs.IsSongListEnumerated )\r
631                                                         {\r
632                                                                 actEnumSongs.On非活性化();\r
633                                                                 CDTXMania.stage選曲.bIsEnumeratingSongs = false;\r
634 \r
635                                                                 bool bRemakeSongTitleBar = ( r現在のステージ.eステージID == CStage.Eステージ.選曲 ) ? true : false;\r
636                                                                 CDTXMania.stage選曲.Refresh( EnumSongs.Songs管理, bRemakeSongTitleBar );\r
637                                                                 EnumSongs.SongListEnumCompletelyDone();\r
638                                                         }\r
639                                                         #endregion\r
640                                                 }\r
641                                                 break;\r
642                                 }\r
643                                 #endregion\r
644 \r
645                                 switch ( r現在のステージ.eステージID )\r
646                                 {\r
647                                         case CStage.Eステージ.何もしない:\r
648                                                 break;\r
649 \r
650                                         case CStage.Eステージ.起動:\r
651                                                 #region [ *** ]\r
652                                                 //-----------------------------\r
653                                                 if( this.n進行描画の戻り値 != 0 )\r
654                                                 {\r
655                                                         if( !bコンパクトモード )\r
656                                                         {\r
657                                                                 r現在のステージ.On非活性化();\r
658                                                                 Trace.TraceInformation( "----------------------" );\r
659                                                                 Trace.TraceInformation( "■ タイトル" );\r
660                                                                 stageタイトル.On活性化();\r
661                                                                 r直前のステージ = r現在のステージ;\r
662                                                                 r現在のステージ = stageタイトル;\r
663                                                         }\r
664                                                         else\r
665                                                         {\r
666                                                                 r現在のステージ.On非活性化();\r
667                                                                 Trace.TraceInformation( "----------------------" );\r
668                                                                 Trace.TraceInformation( "■ 曲読み込み" );\r
669                                                                 stage曲読み込み.On活性化();\r
670                                                                 r直前のステージ = r現在のステージ;\r
671                                                                 r現在のステージ = stage曲読み込み;\r
672 \r
673                                                         }\r
674                                                         foreach( STPlugin pg in this.listプラグイン )\r
675                                                         {\r
676                                                                 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );\r
677                                                                 pg.plugin.Onステージ変更();\r
678                                                                 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
679                                                         }\r
680 \r
681                                                         this.tガベージコレクションを実行する();\r
682                                                 }\r
683                                                 //-----------------------------\r
684                                                 #endregion\r
685                                                 break;\r
686 \r
687                                         case CStage.Eステージ.タイトル:\r
688                                                 #region [ *** ]\r
689                                                 //-----------------------------\r
690                                                 switch( this.n進行描画の戻り値 )\r
691                                                 {\r
692                                                         case (int)CStageタイトル.E戻り値.GAMESTART:\r
693                                                                 #region [ 選曲処理へ ]\r
694                                                                 //-----------------------------\r
695                                                                 r現在のステージ.On非活性化();\r
696                                                                 Trace.TraceInformation( "----------------------" );\r
697                                                                 Trace.TraceInformation( "■ 選曲" );\r
698                                                                 stage選曲.On活性化();\r
699                                                                 r直前のステージ = r現在のステージ;\r
700                                                                 r現在のステージ = stage選曲;\r
701                                                                 //-----------------------------\r
702                                                                 #endregion\r
703                                                                 break;\r
704 \r
705                                                         #region [ OPTION: 廃止済 ]\r
706 //                                                      case 2:                                                                 // #24525 OPTIONとCONFIGの統合に伴い、OPTIONは廃止\r
707 //                                                              #region [ *** ]\r
708 //                                                              //-----------------------------\r
709 //                                                              r現在のステージ.On非活性化();\r
710 //                                                              Trace.TraceInformation( "----------------------" );\r
711 //                                                              Trace.TraceInformation( "■ オプション" );\r
712 //                                                              stageオプション.On活性化();\r
713 //                                                              r直前のステージ = r現在のステージ;\r
714 //                                                              r現在のステージ = stageオプション;\r
715 //                                                              //-----------------------------\r
716 //                                                              #endregion\r
717                                                         //                                                              break;\r
718                                                         #endregion\r
719 \r
720                                                         case (int)CStageタイトル.E戻り値.CONFIG:\r
721                                                                 #region [ *** ]\r
722                                                                 //-----------------------------\r
723                                                                 r現在のステージ.On非活性化();\r
724                                                                 Trace.TraceInformation( "----------------------" );\r
725                                                                 Trace.TraceInformation( "■ コンフィグ" );\r
726                                                                 stageコンフィグ.On活性化();\r
727                                                                 r直前のステージ = r現在のステージ;\r
728                                                                 r現在のステージ = stageコンフィグ;\r
729                                                                 //-----------------------------\r
730                                                                 #endregion\r
731                                                                 break;\r
732 \r
733                                                         case (int)CStageタイトル.E戻り値.EXIT:\r
734                                                                 #region [ *** ]\r
735                                                                 //-----------------------------\r
736                                                                 r現在のステージ.On非活性化();\r
737                                                                 Trace.TraceInformation( "----------------------" );\r
738                                                                 Trace.TraceInformation( "■ 終了" );\r
739                                                                 stage終了.On活性化();\r
740                                                                 r直前のステージ = r現在のステージ;\r
741                                                                 r現在のステージ = stage終了;\r
742                                                                 //-----------------------------\r
743                                                                 #endregion\r
744                                                                 break;\r
745                                                 }\r
746 \r
747                                                 foreach( STPlugin pg in this.listプラグイン )\r
748                                                 {\r
749                                                         Directory.SetCurrentDirectory( pg.strプラグインフォルダ );\r
750                                                         pg.plugin.Onステージ変更();\r
751                                                         Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
752                                                 }\r
753 \r
754                                                 //this.tガベージコレクションを実行する();                // #31980 2013.9.3 yyagi タイトル画面でだけ、毎フレームGCを実行して重くなっていた問題の修正\r
755                                                 //-----------------------------\r
756                                                 #endregion\r
757                                                 break;\r
758 \r
759 //                                      case CStage.Eステージ.オプション:\r
760                                                 #region [ *** ]\r
761 //                                              //-----------------------------\r
762 //                                              if( this.n進行描画の戻り値 != 0 )\r
763 //                                              {\r
764 //                                                      switch( r直前のステージ.eステージID )\r
765 //                                                      {\r
766 //                                                              case CStage.Eステージ.タイトル:\r
767 //                                                                      #region [ *** ]\r
768 //                                                                      //-----------------------------\r
769 //                                                                      r現在のステージ.On非活性化();\r
770 //                                                                      Trace.TraceInformation( "----------------------" );\r
771 //                                                                      Trace.TraceInformation( "■ タイトル" );\r
772 //                                                                      stageタイトル.On活性化();\r
773 //                                                                      r直前のステージ = r現在のステージ;\r
774 //                                                                      r現在のステージ = stageタイトル;\r
775 //                                              \r
776 //                                                                      foreach( STPlugin pg in this.listプラグイン )\r
777 //                                                                      {\r
778 //                                                                              Directory.SetCurrentDirectory( pg.strプラグインフォルダ );\r
779 //                                                                              pg.plugin.Onステージ変更();\r
780 //                                                                              Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
781 //                                                                      }\r
782 //                                              \r
783 //                                                                      this.tガベージコレクションを実行する();\r
784 //                                                                      break;\r
785 //                                                              //-----------------------------\r
786 //                                                                      #endregion\r
787 //\r
788 //                                                              case CStage.Eステージ.選曲:\r
789 //                                                                      #region [ *** ]\r
790 //                                                                      //-----------------------------\r
791 //                                                                      r現在のステージ.On非活性化();\r
792 //                                                                      Trace.TraceInformation( "----------------------" );\r
793 //                                                                      Trace.TraceInformation( "■ 選曲" );\r
794 //                                                                      stage選曲.On活性化();\r
795 //                                                                      r直前のステージ = r現在のステージ;\r
796 //                                                                      r現在のステージ = stage選曲;\r
797 //\r
798 //                                                                      foreach( STPlugin pg in this.listプラグイン )\r
799 //                                                                      {\r
800 //                                                                              Directory.SetCurrentDirectory( pg.strプラグインフォルダ );\r
801 //                                                                              pg.plugin.Onステージ変更();\r
802 //                                                                              Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
803 //                                                                      }\r
804 //\r
805 //                                                                      this.tガベージコレクションを実行する();\r
806 //                                                                      break;\r
807 //                                                              //-----------------------------\r
808 //                                                                      #endregion\r
809 //                                                      }\r
810 //                                              }\r
811 //                                              //-----------------------------\r
812                                                 #endregion\r
813 //                                              break;\r
814 \r
815                                         case CStage.Eステージ.コンフィグ:\r
816                                                 #region [ *** ]\r
817                                                 //-----------------------------\r
818                                                 if( this.n進行描画の戻り値 != 0 )\r
819                                                 {\r
820                                                         switch( r直前のステージ.eステージID )\r
821                                                         {\r
822                                                                 case CStage.Eステージ.タイトル:\r
823                                                                         #region [ *** ]\r
824                                                                         //-----------------------------\r
825                                                                         r現在のステージ.On非活性化();\r
826                                                                         Trace.TraceInformation( "----------------------" );\r
827                                                                         Trace.TraceInformation( "■ タイトル" );\r
828                                                                         stageタイトル.On活性化();\r
829                                                                         r直前のステージ = r現在のステージ;\r
830                                                                         r現在のステージ = stageタイトル;\r
831 \r
832                                                                         foreach( STPlugin pg in this.listプラグイン )\r
833                                                                         {\r
834                                                                                 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );\r
835                                                                                 pg.plugin.Onステージ変更();\r
836                                                                                 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
837                                                                         }\r
838 \r
839                                                                         this.tガベージコレクションを実行する();\r
840                                                                         break;\r
841                                                                 //-----------------------------\r
842                                                                         #endregion\r
843 \r
844                                                                 case CStage.Eステージ.選曲:\r
845                                                                         #region [ *** ]\r
846                                                                         //-----------------------------\r
847                                                                         r現在のステージ.On非活性化();\r
848                                                                         Trace.TraceInformation( "----------------------" );\r
849                                                                         Trace.TraceInformation( "■ 選曲" );\r
850                                                                         stage選曲.On活性化();\r
851                                                                         r直前のステージ = r現在のステージ;\r
852                                                                         r現在のステージ = stage選曲;\r
853 \r
854                                                                         foreach( STPlugin pg in this.listプラグイン )\r
855                                                                         {\r
856                                                                                 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );\r
857                                                                                 pg.plugin.Onステージ変更();\r
858                                                                                 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
859                                                                         }\r
860 \r
861                                                                         this.tガベージコレクションを実行する();\r
862                                                                         break;\r
863                                                                 //-----------------------------\r
864                                                                         #endregion\r
865                                                         }\r
866                                                 }\r
867                                                 //-----------------------------\r
868                                                 #endregion\r
869                                                 break;\r
870 \r
871                                         case CStage.Eステージ.選曲:\r
872                                                 #region [ *** ]\r
873                                                 //-----------------------------\r
874                                                 switch( this.n進行描画の戻り値 )\r
875                                                 {\r
876                                                         case (int) CStage選曲.E戻り値.タイトルに戻る:\r
877                                                                 #region [ *** ]\r
878                                                                 //-----------------------------\r
879                                                                 r現在のステージ.On非活性化();\r
880                                                                 Trace.TraceInformation( "----------------------" );\r
881                                                                 Trace.TraceInformation( "■ タイトル" );\r
882                                                                 stageタイトル.On活性化();\r
883                                                                 r直前のステージ = r現在のステージ;\r
884                                                                 r現在のステージ = stageタイトル;\r
885 \r
886                                                                 foreach( STPlugin pg in this.listプラグイン )\r
887                                                                 {\r
888                                                                         Directory.SetCurrentDirectory( pg.strプラグインフォルダ );\r
889                                                                         pg.plugin.Onステージ変更();\r
890                                                                         Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
891                                                                 }\r
892 \r
893                                                                 this.tガベージコレクションを実行する();\r
894                                                                 break;\r
895                                                         //-----------------------------\r
896                                                                 #endregion\r
897 \r
898                                                         case (int) CStage選曲.E戻り値.選曲した:\r
899                                                                 #region [ *** ]\r
900                                                                 //-----------------------------\r
901                                                                 r現在のステージ.On非活性化();\r
902                                                                 Trace.TraceInformation( "----------------------" );\r
903                                                                 Trace.TraceInformation( "■ 曲読み込み" );\r
904                                                                 stage曲読み込み.On活性化();\r
905                                                                 r直前のステージ = r現在のステージ;\r
906                                                                 r現在のステージ = stage曲読み込み;\r
907 \r
908                                                                 foreach( STPlugin pg in this.listプラグイン )\r
909                                                                 {\r
910                                                                         Directory.SetCurrentDirectory( pg.strプラグインフォルダ );\r
911                                                                         pg.plugin.Onステージ変更();\r
912                                                                         Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
913                                                                 }\r
914 \r
915                                                                 this.tガベージコレクションを実行する();\r
916                                                                 break;\r
917                                                         //-----------------------------\r
918                                                                 #endregion\r
919 \r
920 //                                                      case (int) CStage選曲.E戻り値.オプション呼び出し:\r
921                                                                 #region [ *** ]\r
922 //                                                              //-----------------------------\r
923 //                                                              r現在のステージ.On非活性化();\r
924 //                                                              Trace.TraceInformation( "----------------------" );\r
925 //                                                              Trace.TraceInformation( "■ オプション" );\r
926 //                                                              stageオプション.On活性化();\r
927 //                                                              r直前のステージ = r現在のステージ;\r
928 //                                                              r現在のステージ = stageオプション;\r
929 //\r
930 //                                                              foreach( STPlugin pg in this.listプラグイン )\r
931 //                                                              {\r
932 //                                                                      Directory.SetCurrentDirectory( pg.strプラグインフォルダ );\r
933 //                                                                      pg.plugin.Onステージ変更();\r
934 //                                                                      Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
935 //                                                              }\r
936 //\r
937 //                                                              this.tガベージコレクションを実行する();\r
938 //                                                              break;\r
939 //                                                      //-----------------------------\r
940                                                                 #endregion\r
941 \r
942                                                         case (int) CStage選曲.E戻り値.コンフィグ呼び出し:\r
943                                                                 #region [ *** ]\r
944                                                                 //-----------------------------\r
945                                                                 r現在のステージ.On非活性化();\r
946                                                                 Trace.TraceInformation( "----------------------" );\r
947                                                                 Trace.TraceInformation( "■ コンフィグ" );\r
948                                                                 stageコンフィグ.On活性化();\r
949                                                                 r直前のステージ = r現在のステージ;\r
950                                                                 r現在のステージ = stageコンフィグ;\r
951 \r
952                                                                 foreach( STPlugin pg in this.listプラグイン )\r
953                                                                 {\r
954                                                                         Directory.SetCurrentDirectory( pg.strプラグインフォルダ );\r
955                                                                         pg.plugin.Onステージ変更();\r
956                                                                         Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
957                                                                 }\r
958 \r
959                                                                 this.tガベージコレクションを実行する();\r
960                                                                 break;\r
961                                                         //-----------------------------\r
962                                                                 #endregion\r
963 \r
964                                                         case (int) CStage選曲.E戻り値.スキン変更:\r
965 \r
966                                                                 #region [ *** ]\r
967                                                                 //-----------------------------\r
968                                                                 r現在のステージ.On非活性化();\r
969                                                                 Trace.TraceInformation( "----------------------" );\r
970                                                                 Trace.TraceInformation( "■ スキン切り替え" );\r
971                                                                 stageChangeSkin.On活性化();\r
972                                                                 r直前のステージ = r現在のステージ;\r
973                                                                 r現在のステージ = stageChangeSkin;\r
974                                                                 break;\r
975                                                         //-----------------------------\r
976                                                                 #endregion\r
977                                                 }\r
978                                                 //-----------------------------\r
979                                                 #endregion\r
980                                                 break;\r
981 \r
982                                         case CStage.Eステージ.曲読み込み:\r
983                                                 #region [ *** ]\r
984                                                 //-----------------------------\r
985                                                 if( this.n進行描画の戻り値 != 0 )\r
986                                                 {\r
987                                                         CDTXMania.Pad.st検知したデバイス.Clear();       // 入力デバイスフラグクリア(2010.9.11)\r
988 \r
989                                                         r現在のステージ.On非活性化();\r
990 \r
991                                                         #region [ ESC押下時は、曲の読み込みを中止して選曲画面に戻る ]\r
992                                                         if ( this.n進行描画の戻り値 == (int) E曲読込画面の戻り値.読込中止 )\r
993                                                         {\r
994                                                                 //DTX.t全チップの再生停止();\r
995                                                                 DTX.On非活性化();\r
996                                                                 Trace.TraceInformation( "曲の読み込みを中止しました。" );\r
997                                                                 this.tガベージコレクションを実行する();\r
998                                                                 Trace.TraceInformation( "----------------------" );\r
999                                                                 Trace.TraceInformation( "■ 選曲" );\r
1000                                                                 stage選曲.On活性化();\r
1001                                                                 r直前のステージ = r現在のステージ;\r
1002                                                                 r現在のステージ = stage選曲;\r
1003                                                                 foreach ( STPlugin pg in this.listプラグイン )\r
1004                                                                 {\r
1005                                                                         Directory.SetCurrentDirectory( pg.strプラグインフォルダ );\r
1006                                                                         pg.plugin.Onステージ変更();\r
1007                                                                         Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
1008                                                                 }\r
1009                                                                 break;\r
1010                                                         }\r
1011                                                         #endregion\r
1012 \r
1013                                                         if( !ConfigIni.bギタレボモード )\r
1014                                                         {\r
1015                                                                 Trace.TraceInformation( "----------------------" );\r
1016                                                                 Trace.TraceInformation( "■ 演奏(ドラム画面)" );\r
1017 #if false               // #23625 2011.1.11 Config.iniからダメージ/回復値の定数変更を行う場合はここを有効にする 087リリースに合わせ機能無効化\r
1018 for (int i = 0; i < 5; i++)\r
1019 {\r
1020         for (int j = 0; j < 2; j++)\r
1021         {\r
1022                 stage演奏ドラム画面.fDamageGaugeDelta[i, j] = ConfigIni.fGaugeFactor[i, j];\r
1023         }\r
1024 }\r
1025 for (int i = 0; i < 3; i++) {\r
1026         stage演奏ドラム画面.fDamageLevelFactor[i] = ConfigIni.fDamageLevelFactor[i];\r
1027 }               \r
1028 #endif\r
1029                                                                 r直前のステージ = r現在のステージ;\r
1030                                                                 r現在のステージ = stage演奏ドラム画面;\r
1031                                                         }\r
1032                                                         else\r
1033                                                         {\r
1034                                                                 Trace.TraceInformation( "----------------------" );\r
1035                                                                 Trace.TraceInformation( "■ 演奏(ギター画面)" );\r
1036 #if false               // #23625 2011.1.11 Config.iniからダメージ/回復値の定数変更を行う場合はここを有効にする 087リリースに合わせ機能無効化\r
1037 for (int i = 0; i < 5; i++)\r
1038 {\r
1039         for (int j = 0; j < 2; j++)\r
1040         {\r
1041                 stage演奏ギター画面.fDamageGaugeDelta[i, j] = ConfigIni.fGaugeFactor[i, j];\r
1042         }\r
1043 }\r
1044 for (int i = 0; i < 3; i++) {\r
1045         stage演奏ギター画面.fDamageLevelFactor[i] = ConfigIni.fDamageLevelFactor[i];\r
1046 }               \r
1047 #endif\r
1048                                                                 r直前のステージ = r現在のステージ;\r
1049                                                                 r現在のステージ = stage演奏ギター画面;\r
1050                                                         }\r
1051 \r
1052                                                         foreach( STPlugin pg in this.listプラグイン )\r
1053                                                         {\r
1054                                                                 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );\r
1055                                                                 pg.plugin.Onステージ変更();\r
1056                                                                 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
1057                                                         }\r
1058 \r
1059                                                         this.tガベージコレクションを実行する();\r
1060                                                 }\r
1061                                                 //-----------------------------\r
1062                                                 #endregion\r
1063                                                 break;\r
1064 \r
1065                                         case CStage.Eステージ.演奏:\r
1066                                                 #region [ *** ]\r
1067                                                 //-----------------------------\r
1068                                                 switch( this.n進行描画の戻り値 )\r
1069                                                 {\r
1070                                                         case (int) E演奏画面の戻り値.継続:\r
1071                                                                 break;\r
1072 \r
1073                                                         case (int) E演奏画面の戻り値.演奏中断:\r
1074                                                                 #region [ 演奏キャンセル ]\r
1075                                                                 //-----------------------------\r
1076                                                                 scoreIni = this.tScoreIniへBGMAdjustとHistoryとPlayCountを更新( "Play canceled" );\r
1077 \r
1078                                                                 #region [ プラグイン On演奏キャンセル() の呼び出し ]\r
1079                                                                 //---------------------\r
1080                                                                 foreach( STPlugin pg in this.listプラグイン )\r
1081                                                                 {\r
1082                                                                         Directory.SetCurrentDirectory( pg.strプラグインフォルダ );\r
1083                                                                         pg.plugin.On演奏キャンセル( scoreIni );\r
1084                                                                         Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
1085                                                                 }\r
1086                                                                 //---------------------\r
1087                                                                 #endregion\r
1088 \r
1089                                                                 DTX.t全チップの再生停止();\r
1090                                                                 DTX.On非活性化();\r
1091                                                                 r現在のステージ.On非活性化();\r
1092                                                                 if( bコンパクトモード )\r
1093                                                                 {\r
1094                                                                         base.Window.Close();\r
1095                                                                 }\r
1096                                                                 else\r
1097                                                                 {\r
1098                                                                         Trace.TraceInformation( "----------------------" );\r
1099                                                                         Trace.TraceInformation( "■ 選曲" );\r
1100                                                                         stage選曲.On活性化();\r
1101                                                                         r直前のステージ = r現在のステージ;\r
1102                                                                         r現在のステージ = stage選曲;\r
1103 \r
1104                                                                         #region [ プラグイン Onステージ変更() の呼び出し ]\r
1105                                                                         //---------------------\r
1106                                                                         foreach( STPlugin pg in this.listプラグイン )\r
1107                                                                         {\r
1108                                                                                 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );\r
1109                                                                                 pg.plugin.Onステージ変更();\r
1110                                                                                 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
1111                                                                         }\r
1112                                                                         //---------------------\r
1113                                                                         #endregion\r
1114 \r
1115                                                                         this.tガベージコレクションを実行する();\r
1116                                                                 }\r
1117                                                                 break;\r
1118                                                                 //-----------------------------\r
1119                                                                 #endregion\r
1120 \r
1121                                                         case (int) E演奏画面の戻り値.ステージ失敗:\r
1122                                                                 #region [ 演奏失敗(StageFailed) ]\r
1123                                                                 //-----------------------------\r
1124                                                                 scoreIni = this.tScoreIniへBGMAdjustとHistoryとPlayCountを更新( "Stage failed" );\r
1125 \r
1126                                                                 #region [ プラグイン On演奏失敗() の呼び出し ]\r
1127                                                                 //---------------------\r
1128                                                                 foreach( STPlugin pg in this.listプラグイン )\r
1129                                                                 {\r
1130                                                                         Directory.SetCurrentDirectory( pg.strプラグインフォルダ );\r
1131                                                                         pg.plugin.On演奏失敗( scoreIni );\r
1132                                                                         Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
1133                                                                 }\r
1134                                                                 //---------------------\r
1135                                                                 #endregion\r
1136 \r
1137                                                                 DTX.t全チップの再生停止();\r
1138                                                                 DTX.On非活性化();\r
1139                                                                 r現在のステージ.On非活性化();\r
1140                                                                 if( bコンパクトモード )\r
1141                                                                 {\r
1142                                                                         base.Window.Close();\r
1143                                                                 }\r
1144                                                                 else\r
1145                                                                 {\r
1146                                                                         Trace.TraceInformation( "----------------------" );\r
1147                                                                         Trace.TraceInformation( "■ 選曲" );\r
1148                                                                         stage選曲.On活性化();\r
1149                                                                         r直前のステージ = r現在のステージ;\r
1150                                                                         r現在のステージ = stage選曲;\r
1151 \r
1152                                                                         #region [ プラグイン Onステージ変更() の呼び出し ]\r
1153                                                                         //---------------------\r
1154                                                                         foreach( STPlugin pg in this.listプラグイン )\r
1155                                                                         {\r
1156                                                                                 Directory.SetCurrentDirectory( pg.strプラグインフォルダ );\r
1157                                                                                 pg.plugin.Onステージ変更();\r
1158                                                                                 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
1159                                                                         }\r
1160                                                                         //---------------------\r
1161                                                                         #endregion\r
1162 \r
1163                                                                         this.tガベージコレクションを実行する();\r
1164                                                                 }\r
1165                                                                 break;\r
1166                                                                 //-----------------------------\r
1167                                                                 #endregion\r
1168 \r
1169                                                         case (int) E演奏画面の戻り値.ステージクリア:\r
1170                                                                 #region [ 演奏クリア ]\r
1171                                                                 //-----------------------------\r
1172                                                                 CScoreIni.C演奏記録 c演奏記録_Drums, c演奏記録_Guitar, c演奏記録_Bass;\r
1173                                                                 CDTX.CChip[] chipArray = new CDTX.CChip[ 10 ];\r
1174                                                                 if( ConfigIni.bギタレボモード )\r
1175                                                                 {\r
1176                                                                         stage演奏ギター画面.t演奏結果を格納する( out c演奏記録_Drums, out c演奏記録_Guitar, out c演奏記録_Bass );\r
1177                                                                 }\r
1178                                                                 else\r
1179                                                                 {\r
1180                                                                         stage演奏ドラム画面.t演奏結果を格納する( out c演奏記録_Drums, out c演奏記録_Guitar, out c演奏記録_Bass, out chipArray );\r
1181                                                                 }\r
1182 \r
1183                                                                 if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass )         // #24063 2011.1.24 yyagi Gt/Bsを入れ替えていたなら、演奏結果も入れ替える\r
1184                                                                 {\r
1185                                                                         CScoreIni.C演奏記録 t;\r
1186                                                                         t = c演奏記録_Guitar;\r
1187                                                                         c演奏記録_Guitar = c演奏記録_Bass;\r
1188                                                                         c演奏記録_Bass = t;\r
1189 \r
1190                                                                         CDTXMania.DTX.SwapGuitarBassInfos();                    // 譜面情報も元に戻す\r
1191                                                                         CDTXMania.ConfigIni.SwapGuitarBassInfos_AutoFlags();    // #24415 2011.2.27 yyagi\r
1192                                                                                                                                                                         // リザルト集計時のみ、Auto系のフラグも元に戻す。\r
1193                                                                                                                                                                         // これを戻すのは、リザルト集計後。\r
1194                                                                 }                                                                                                       // "case CStage.Eステージ.結果:"のところ。\r
1195 \r
1196                                                                 double ps = 0.0, gs = 0.0;\r
1197                                                                 if ( !c演奏記録_Drums.b全AUTOである && c演奏記録_Drums.n全チップ数 > 0) {\r
1198                                                                         ps = c演奏記録_Drums.db演奏型スキル値;\r
1199                                                                         gs = c演奏記録_Drums.dbゲーム型スキル値;\r
1200                                                                 }\r
1201                                                                 else if ( !c演奏記録_Guitar.b全AUTOである && c演奏記録_Guitar.n全チップ数 > 0) {\r
1202                                                                         ps = c演奏記録_Guitar.db演奏型スキル値;\r
1203                                                                         gs = c演奏記録_Guitar.dbゲーム型スキル値;\r
1204                                                                 }\r
1205                                                                 else\r
1206                                                                 {\r
1207                                                                         ps = c演奏記録_Bass.db演奏型スキル値;\r
1208                                                                         gs = c演奏記録_Bass.dbゲーム型スキル値;\r
1209                                                                 }\r
1210                                                                 string str = "Cleared";\r
1211                                                                 switch( CScoreIni.t総合ランク値を計算して返す( c演奏記録_Drums, c演奏記録_Guitar, c演奏記録_Bass ) )\r
1212                                                                 {\r
1213                                                                         case (int)CScoreIni.ERANK.SS:\r
1214                                                                                 str = string.Format( "Cleared (SS: {0:F2})", ps );\r
1215                                                                                 break;\r
1216 \r
1217                                                                         case (int) CScoreIni.ERANK.S:\r
1218                                                                                 str = string.Format( "Cleared (S: {0:F2})", ps );\r
1219                                                                                 break;\r
1220 \r
1221                                                                         case (int) CScoreIni.ERANK.A:\r
1222                                                                                 str = string.Format( "Cleared (A: {0:F2})", ps );\r
1223                                                                                 break;\r
1224 \r
1225                                                                         case (int) CScoreIni.ERANK.B:\r
1226                                                                                 str = string.Format( "Cleared (B: {0:F2})", ps );\r
1227                                                                                 break;\r
1228 \r
1229                                                                         case (int) CScoreIni.ERANK.C:\r
1230                                                                                 str = string.Format( "Cleared (C: {0:F2})", ps );\r
1231                                                                                 break;\r
1232 \r
1233                                                                         case (int) CScoreIni.ERANK.D:\r
1234                                                                                 str = string.Format( "Cleared (D: {0:F2})", ps );\r
1235                                                                                 break;\r
1236 \r
1237                                                                         case (int) CScoreIni.ERANK.E:\r
1238                                                                                 str = string.Format( "Cleared (E: {0:F2})", ps );\r
1239                                                                                 break;\r
1240 \r
1241                                                                         case (int)CScoreIni.ERANK.UNKNOWN:      // #23534 2010.10.28 yyagi add: 演奏チップが0個のとき\r
1242                                                                                 str = "Cleared (No chips)";\r
1243                                                                                 break;\r
1244                                                                 }\r
1245 \r
1246                                                                 scoreIni = this.tScoreIniへBGMAdjustとHistoryとPlayCountを更新( str );\r
1247 \r
1248                                                                 #region [ プラグイン On演奏クリア() の呼び出し ]\r
1249                                                                 //---------------------\r
1250                                                                 foreach( STPlugin pg in this.listプラグイン )\r
1251                                                                 {\r
1252                                                                         Directory.SetCurrentDirectory( pg.strプラグインフォルダ );\r
1253                                                                         pg.plugin.On演奏クリア( scoreIni );\r
1254                                                                         Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
1255                                                                 }\r
1256                                                                 //---------------------\r
1257                                                                 #endregion\r
1258 \r
1259                                                                 r現在のステージ.On非活性化();\r
1260                                                                 Trace.TraceInformation( "----------------------" );\r
1261                                                                 Trace.TraceInformation( "■ 結果" );\r
1262                                                                 stage結果.st演奏記録.Drums = c演奏記録_Drums;\r
1263                                                                 stage結果.st演奏記録.Guitar = c演奏記録_Guitar;\r
1264                                                                 stage結果.st演奏記録.Bass = c演奏記録_Bass;\r
1265                                                                 stage結果.r空うちドラムチップ = chipArray;\r
1266                                                                 stage結果.On活性化();\r
1267                                                                 r直前のステージ = r現在のステージ;\r
1268                                                                 r現在のステージ = stage結果;\r
1269 \r
1270                                                                 #region [ プラグイン Onステージ変更() の呼び出し ]\r
1271                                                                 //---------------------\r
1272                                                                 foreach( STPlugin pg in this.listプラグイン )\r
1273                                                                 {\r
1274                                                                         Directory.SetCurrentDirectory( pg.strプラグインフォルダ );\r
1275                                                                         pg.plugin.Onステージ変更();\r
1276                                                                         Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
1277                                                                 }\r
1278                                                                 //---------------------\r
1279                                                                 #endregion\r
1280 \r
1281                                                                 break;\r
1282                                                                 //-----------------------------\r
1283                                                                 #endregion\r
1284                                                 }\r
1285                                                 //-----------------------------\r
1286                                                 #endregion\r
1287                                                 break;\r
1288 \r
1289                                         case CStage.Eステージ.結果:\r
1290                                                 #region [ *** ]\r
1291                                                 //-----------------------------\r
1292                                                 if( this.n進行描画の戻り値 != 0 )\r
1293                                                 {\r
1294                                                         if ( CDTXMania.ConfigIni.bIsSwappedGuitarBass )         // #24415 2011.2.27 yyagi Gt/Bsを入れ替えていたなら、Auto状態をリザルト画面終了後に元に戻す\r
1295                                                         {\r
1296                                                                 CDTXMania.ConfigIni.SwapGuitarBassInfos_AutoFlags();    // Auto入れ替え\r
1297                                                         }\r
1298 \r
1299                                                         DTX.t全チップの再生一時停止();\r
1300                                                         DTX.On非活性化();\r
1301                                                         r現在のステージ.On非活性化();\r
1302                                                         if( !bコンパクトモード )\r
1303                                                         {\r
1304                                                                 Trace.TraceInformation( "----------------------" );\r
1305                                                                 Trace.TraceInformation( "■ 選曲" );\r
1306                                                                 stage選曲.On活性化();\r
1307                                                                 r直前のステージ = r現在のステージ;\r
1308                                                                 r現在のステージ = stage選曲;\r
1309 \r
1310                                                                 foreach( STPlugin pg in this.listプラグイン )\r
1311                                                                 {\r
1312                                                                         Directory.SetCurrentDirectory( pg.strプラグインフォルダ );\r
1313                                                                         pg.plugin.Onステージ変更();\r
1314                                                                         Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
1315                                                                 }\r
1316 \r
1317                                                                 this.tガベージコレクションを実行する();\r
1318                                                         }\r
1319                                                         else\r
1320                                                         {\r
1321                                                                 base.Window.Close();\r
1322                                                         }\r
1323                                                 }\r
1324                                                 //-----------------------------\r
1325                                                 #endregion\r
1326                                                 break;\r
1327 \r
1328                                         case CStage.Eステージ.ChangeSkin:\r
1329                                                 #region [ *** ]\r
1330                                                 //-----------------------------\r
1331                                                 if ( this.n進行描画の戻り値 != 0 )\r
1332                                                 {\r
1333                                                         r現在のステージ.On非活性化();\r
1334                                                         Trace.TraceInformation( "----------------------" );\r
1335                                                         Trace.TraceInformation( "■ 選曲" );\r
1336                                                         stage選曲.On活性化();\r
1337                                                         r直前のステージ = r現在のステージ;\r
1338                                                         r現在のステージ = stage選曲;\r
1339                                                         this.tガベージコレクションを実行する();\r
1340                                                 }\r
1341                                                 //-----------------------------\r
1342                                                 #endregion\r
1343                                                 break;\r
1344 \r
1345                                         case CStage.Eステージ.終了:\r
1346                                                 #region [ *** ]\r
1347                                                 //-----------------------------\r
1348                                                 if( this.n進行描画の戻り値 != 0 )\r
1349                                                 {\r
1350                                                         base.Exit();\r
1351                                                 }\r
1352                                                 //-----------------------------\r
1353                                                 #endregion\r
1354                                                 break;\r
1355                                 }\r
1356                         }\r
1357                         this.Device.EndScene();                 // Present()は game.csのOnFrameEnd()に登録された、GraphicsDeviceManager.game_FrameEnd() 内で実行されるので不要\r
1358                                                                                         // (つまり、Present()は、Draw()完了後に実行される)\r
1359 #if !GPUFlushAfterPresent\r
1360                         actFlushGPU.On進行描画();           // Flush GPU    // EndScene()~Present()間 (つまりVSync前) でFlush実行\r
1361 #endif\r
1362                         #region [ 全画面・ウインドウ切り替え ]\r
1363                         if ( this.b次のタイミングで全画面・ウィンドウ切り替えを行う )\r
1364                         {\r
1365                                 ConfigIni.b全画面モード = !ConfigIni.b全画面モード;\r
1366                                 app.t全画面・ウィンドウモード切り替え();\r
1367                                 this.b次のタイミングで全画面・ウィンドウ切り替えを行う = false;\r
1368                         }\r
1369                         #endregion\r
1370                         #region [ 垂直基線同期切り替え ]\r
1371                         if ( this.b次のタイミングで垂直帰線同期切り替えを行う )\r
1372                         {\r
1373                                 bool bIsMaximized = this.Window.IsMaximized;                                                                                    // #23510 2010.11.3 yyagi: to backup current window mode before changing VSyncWait\r
1374                                 currentClientSize = this.Window.ClientSize;                                                                                             // #23510 2010.11.3 yyagi: to backup current window size before changing VSyncWait\r
1375                                 DeviceSettings currentSettings = app.GraphicsDeviceManager.CurrentSettings;\r
1376                                 currentSettings.EnableVSync = ConfigIni.b垂直帰線待ちを行う;\r
1377                                 app.GraphicsDeviceManager.ChangeDevice( currentSettings );\r
1378                                 this.b次のタイミングで垂直帰線同期切り替えを行う = false;\r
1379                                 base.Window.ClientSize = new Size(currentClientSize.Width, currentClientSize.Height);   // #23510 2010.11.3 yyagi: to resume window size after changing VSyncWait\r
1380                                 if (bIsMaximized)\r
1381                                 {\r
1382                                         this.Window.WindowState = FormWindowState.Maximized;                                                            // #23510 2010.11.3 yyagi: to resume window mode after changing VSyncWait\r
1383                                 }\r
1384                         }\r
1385                         #endregion\r
1386                 }\r
1387 \r
1388                 // その他\r
1389 \r
1390                 #region [ 汎用ヘルパー ]\r
1391                 //-----------------\r
1392                 public static CTexture tテクスチャの生成( string fileName )\r
1393                 {\r
1394                         return tテクスチャの生成( fileName, false );\r
1395                 }\r
1396                 public static CTexture tテクスチャの生成( string fileName, bool b黒を透過する )\r
1397                 {\r
1398                         if ( app == null )\r
1399                         {\r
1400                                 return null;\r
1401                         }\r
1402                         try\r
1403                         {\r
1404                                 return new CTexture( app.Device, fileName, TextureFormat, b黒を透過する );\r
1405                         }\r
1406                         catch ( CTextureCreateFailedException )\r
1407                         {\r
1408                                 Trace.TraceError( "テクスチャの生成に失敗しました。({0})", fileName );\r
1409                                 return null;\r
1410                         }\r
1411                         catch ( FileNotFoundException )\r
1412                         {\r
1413                                 Trace.TraceError( "テクスチャファイルが見つかりませんでした。({0})", fileName );\r
1414                                 return null;\r
1415                         }\r
1416                 }\r
1417                 public static void tテクスチャの解放( ref CTexture tx )\r
1418                 {\r
1419                         CDTXMania.t安全にDisposeする( ref tx );\r
1420                 }\r
1421 \r
1422                 public static CTexture tテクスチャの生成( byte[] txData )\r
1423                 {\r
1424                         return tテクスチャの生成( txData, false );\r
1425                 }\r
1426                 public static CTexture tテクスチャの生成( byte[] txData, bool b黒を透過する )\r
1427                 {\r
1428                         if ( app == null )\r
1429                         {\r
1430                                 return null;\r
1431                         }\r
1432                         try\r
1433                         {\r
1434                                 return new CTexture( app.Device, txData, TextureFormat, b黒を透過する );\r
1435                         }\r
1436                         catch ( CTextureCreateFailedException )\r
1437                         {\r
1438                                 Trace.TraceError( "テクスチャの生成に失敗しました。(txData)" );\r
1439                                 return null;\r
1440                         }\r
1441                 }\r
1442 \r
1443                 public static CTexture tテクスチャの生成( Bitmap bitmap )\r
1444                 {\r
1445                         return tテクスチャの生成( bitmap, false );\r
1446                 }\r
1447                 public static CTexture tテクスチャの生成( Bitmap bitmap, bool b黒を透過する )\r
1448                 {\r
1449                         if ( app == null )\r
1450                         {\r
1451                                 return null;\r
1452                         }\r
1453                         try\r
1454                         {\r
1455                                 return new CTexture( app.Device, bitmap, TextureFormat, b黒を透過する );\r
1456                         }\r
1457                         catch ( CTextureCreateFailedException )\r
1458                         {\r
1459                                 Trace.TraceError( "テクスチャの生成に失敗しました。(txData)" );\r
1460                                 return null;\r
1461                         }\r
1462                 }\r
1463 \r
1464                 /// <summary>プロパティ、インデクサには ref は使用できないので注意。</summary>\r
1465                 public static void t安全にDisposeする<T>( ref T obj )\r
1466                 {\r
1467                         if ( obj == null )\r
1468                                 return;\r
1469 \r
1470                         var d = obj as IDisposable;\r
1471 \r
1472                         if ( d != null )\r
1473                                 d.Dispose();\r
1474 \r
1475                         obj = default( T );\r
1476                 }\r
1477                 //-----------------\r
1478                 #endregion\r
1479 \r
1480                 #region [ private ]\r
1481                 //-----------------\r
1482                 private bool bマウスカーソル表示中 = true;\r
1483                 private bool b終了処理完了済み;\r
1484                 private static CDTX dtx;\r
1485                 private List<CActivity> listトップレベルActivities;\r
1486                 private int n進行描画の戻り値;\r
1487                 private MouseButtons mb = System.Windows.Forms.MouseButtons.Left;\r
1488                 private string strWindowTitle = "";\r
1489 \r
1490                 private void t起動処理()\r
1491                 {\r
1492                         #region [ strEXEのあるフォルダを決定する ]\r
1493                         //-----------------\r
1494 // BEGIN #23629 2010.11.13 from: デバッグ時は Application.ExecutablePath が ($SolutionDir)/bin/x86/Debug/ などになり System/ の読み込みに失敗するので、カレントディレクトリを採用する。(プロジェクトのプロパティ→デバッグ→作業ディレクトリが有効になる)\r
1495 #if DEBUG\r
1496                         strEXEのあるフォルダ = Environment.CurrentDirectory + @"\";\r
1497 #else\r
1498                         strEXEのあるフォルダ = Path.GetDirectoryName( Application.ExecutablePath ) + @"\";       // #23629 2010.11.9 yyagi: set correct pathname where DTXManiaGR.exe is.\r
1499 #endif\r
1500 // END #23629 2010.11.13 from\r
1501                         //-----------------\r
1502                         #endregion\r
1503 \r
1504                         #region [ Config.ini の読込み ]\r
1505                         //---------------------\r
1506                         ConfigIni = new CConfigIni();\r
1507                         string path = strEXEのあるフォルダ + "Config.ini";\r
1508                         if( File.Exists( path ) )\r
1509                         {\r
1510                                 try\r
1511                                 {\r
1512                                         ConfigIni.tファイルから読み込み( path );\r
1513                                 }\r
1514                                 catch\r
1515                                 {\r
1516                                         //ConfigIni = new CConfigIni(); // 存在してなければ新規生成\r
1517                                 }\r
1518                         }\r
1519                         this.Window.EnableSystemMenu = CDTXMania.ConfigIni.bIsEnabledSystemMenu;        // #28200 2011.5.1 yyagi\r
1520                         // 2012.8.22 Config.iniが無いときに初期値が適用されるよう、この設定行をifブロック外に移動\r
1521 \r
1522                         //---------------------\r
1523                         #endregion\r
1524                         #region [ ログ出力開始 ]\r
1525                         //---------------------\r
1526                         Trace.AutoFlush = true;\r
1527                         if( ConfigIni.bログ出力 )\r
1528                         {\r
1529                                 try\r
1530                                 {\r
1531                                         Trace.Listeners.Add( new CTraceLogListener( new StreamWriter( "DTXManiaLog.txt", false, Encoding.GetEncoding( "Shift_JIS" ) ) ) );\r
1532                                 }\r
1533                                 catch ( System.UnauthorizedAccessException )                    // #24481 2011.2.20 yyagi\r
1534                                 {\r
1535                                         int c = (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja")? 0 : 1;\r
1536                                         string[] mes_writeErr = {\r
1537                                                 "DTXManiaLog.txtへの書き込みができませんでした。書き込みできるようにしてから、再度起動してください。",\r
1538                                                 "Failed to write DTXManiaLog.txt. Please set it writable and try again."\r
1539                                         };\r
1540                                         MessageBox.Show( mes_writeErr[c], "DTXMania boot error", MessageBoxButtons.OK, MessageBoxIcon.Error );\r
1541                                         Environment.Exit(1);\r
1542                                 }\r
1543                         }\r
1544                         Trace.WriteLine("");\r
1545                         Trace.WriteLine( "DTXMania powered by YAMAHA Silent Session Drums" );\r
1546                         Trace.WriteLine( string.Format( "Release: {0}", VERSION ) );\r
1547                         Trace.WriteLine( "" );\r
1548                         Trace.TraceInformation( "----------------------" );\r
1549                         Trace.TraceInformation( "■ アプリケーションの初期化" );\r
1550                         Trace.TraceInformation( "OS Version: " + Environment.OSVersion );\r
1551                         Trace.TraceInformation( "ProcessorCount: " + Environment.ProcessorCount.ToString() );\r
1552                         Trace.TraceInformation( "CLR Version: " + Environment.Version.ToString() );\r
1553                         //---------------------\r
1554                         #endregion\r
1555                         #region [ コンパクトモードスイッチの有無 ]\r
1556                         //---------------------\r
1557                         bコンパクトモード = false;\r
1558                         strコンパクトモードファイル = "";\r
1559                         string[] commandLineArgs = Environment.GetCommandLineArgs();\r
1560                         if( ( commandLineArgs != null ) && ( commandLineArgs.Length > 1 ) )\r
1561                         {\r
1562                                 bコンパクトモード = true;\r
1563                                 strコンパクトモードファイル = commandLineArgs[ 1 ];\r
1564                                 Trace.TraceInformation( "コンパクトモードで起動します。[{0}]", strコンパクトモードファイル );\r
1565                         }\r
1566                         //---------------------\r
1567                         #endregion\r
1568 \r
1569                         #region [ ウィンドウ初期化 ]\r
1570                         //---------------------\r
1571                         this.strWindowTitle = "DTXMania .NET style release " + VERSION;\r
1572 \r
1573                         base.Window.StartPosition = FormStartPosition.Manual;                                                       // #30675 2013.02.04 ikanick add\r
1574                         base.Window.Location = new Point( ConfigIni.n初期ウィンドウ開始位置X, ConfigIni.n初期ウィンドウ開始位置Y );   // #30675 2013.02.04 ikanick add\r
1575 \r
1576                         base.Window.Text = this.strWindowTitle;\r
1577 \r
1578                         base.Window.StartPosition = FormStartPosition.Manual;                                                       // #30675 2013.02.04 ikanick add\r
1579             base.Window.Location = new Point(ConfigIni.n初期ウィンドウ開始位置X, ConfigIni.n初期ウィンドウ開始位置Y);   // #30675 2013.02.04 ikanick add\r
1580 \r
1581                         base.Window.ClientSize = new Size(ConfigIni.nウインドウwidth, ConfigIni.nウインドウheight);   // #34510 yyagi 2010.10.31 to change window size got from Config.ini\r
1582 #if !WindowedFullscreen\r
1583                         if (!ConfigIni.bウィンドウモード)                                               // #23510 2010.11.02 yyagi: add; to recover window size in case bootup with fullscreen mode\r
1584                         {                                                                                                               // #30666 2013.02.02 yyagi: currentClientSize should be always made\r
1585 #endif\r
1586                                 currentClientSize = new Size( ConfigIni.nウインドウwidth, ConfigIni.nウインドウheight );\r
1587 #if !WindowedFullscreen\r
1588                         }\r
1589 #endif\r
1590                         base.Window.MaximizeBox = true;                                                 // #23510 2010.11.04 yyagi: to support maximizing window\r
1591                         base.Window.FormBorderStyle = FormBorderStyle.Sizable;  // #23510 2010.10.27 yyagi: changed from FixedDialog to Sizable, to support window resize\r
1592                                                                                                                                                 // #30666 2013.02.02 yyagi: moved the code to t全画面・ウインドウモード切り替え()\r
1593                         base.Window.ShowIcon = true;\r
1594                         base.Window.Icon = Properties.Resources.dtx;\r
1595                         base.Window.KeyDown += new KeyEventHandler( this.Window_KeyDown );\r
1596                         base.Window.MouseUp +=new MouseEventHandler( this.Window_MouseUp);\r
1597                         base.Window.MouseDoubleClick += new MouseEventHandler(this.Window_MouseDoubleClick);    // #23510 2010.11.13 yyagi: to go fullscreen mode\r
1598                         base.Window.ResizeEnd += new EventHandler(this.Window_ResizeEnd);                                               // #23510 2010.11.20 yyagi: to set resized window size in Config.ini\r
1599                         base.Window.ApplicationActivated += new EventHandler(this.Window_ApplicationActivated);\r
1600                         base.Window.ApplicationDeactivated += new EventHandler( this.Window_ApplicationDeactivated );\r
1601                         //---------------------\r
1602                         #endregion\r
1603                         #region [ Direct3D9Exを使うかどうか判定 ]\r
1604                         #endregion\r
1605                         #region [ Direct3D9 デバイスの生成 ]\r
1606                         //---------------------\r
1607                         DeviceSettings settings = new DeviceSettings();\r
1608 #if WindowedFullscreen\r
1609                         settings.Windowed = true;                                                               // #30666 2013.2.2 yyagi: Fullscreenmode is "Maximized window" mode\r
1610 #else\r
1611                         settings.Windowed = ConfigIni.bウィンドウモード;\r
1612 #endif\r
1613                         settings.BackBufferWidth = SampleFramework.GameWindowSize.Width;\r
1614                         settings.BackBufferHeight = SampleFramework.GameWindowSize.Height;\r
1615 //                      settings.BackBufferCount = 3;\r
1616                         settings.EnableVSync = ConfigIni.b垂直帰線待ちを行う;\r
1617 //                      settings.BackBufferFormat = Format.A8R8G8B8;\r
1618 //                      settings.MultisampleType = MultisampleType.FourSamples;\r
1619 //                      settings.MultisampleQuality = 4;\r
1620 //                      settings.MultisampleType = MultisampleType.None;\r
1621 //                      settings.MultisampleQuality = 0;\r
1622                         \r
1623                         try\r
1624                         {\r
1625                                 base.GraphicsDeviceManager.ChangeDevice(settings);\r
1626                         }\r
1627                         catch (DeviceCreationException e)\r
1628                         {\r
1629                                 Trace.TraceError(e.ToString());\r
1630                                 MessageBox.Show(e.Message + e.ToString(), "DTXMania failed to boot: DirectX9 Initialize Error", MessageBoxButtons.OK, MessageBoxIcon.Error);\r
1631                                 Environment.Exit(-1);\r
1632                         }\r
1633                         \r
1634                         base.IsFixedTimeStep = false;\r
1635 //                      base.TargetElapsedTime = TimeSpan.FromTicks( 10000000 / 75 );\r
1636                         base.Window.ClientSize = new Size(ConfigIni.nウインドウwidth, ConfigIni.nウインドウheight);   // #23510 2010.10.31 yyagi: to recover window size. width and height are able to get from Config.ini.\r
1637                         base.InactiveSleepTime = TimeSpan.FromMilliseconds((float)(ConfigIni.n非フォーカス時スリープms));    // #23568 2010.11.3 yyagi: to support valiable sleep value when !IsActive\r
1638                                                                                                                                                                                                                                 // #23568 2010.11.4 ikanick changed ( 1 -> ConfigIni )\r
1639 #if WindowedFullscreen\r
1640                         this.t全画面・ウィンドウモード切り替え();                               // #30666 2013.2.2 yyagi: finalize settings for "Maximized window mode"\r
1641 #endif\r
1642                         actFlushGPU = new CActFlushGPU();\r
1643                         //---------------------\r
1644                         #endregion\r
1645 \r
1646                         DTX = null;\r
1647 \r
1648                         #region [ Skin の初期化 ]\r
1649                         //---------------------\r
1650                         Trace.TraceInformation( "スキンの初期化を行います。" );\r
1651                         Trace.Indent();\r
1652                         try\r
1653                         {\r
1654                                 Skin = new CSkin( CDTXMania.ConfigIni.strSystemSkinSubfolderFullName, CDTXMania.ConfigIni.bUseBoxDefSkin );\r
1655                                 CDTXMania.ConfigIni.strSystemSkinSubfolderFullName = CDTXMania.Skin.GetCurrentSkinSubfolderFullName( true );    // 旧指定のSkinフォルダが消滅していた場合に備える\r
1656                                 Trace.TraceInformation( "スキンの初期化を完了しました。" );\r
1657                         }\r
1658                         catch\r
1659                         {\r
1660                                 Trace.TraceInformation( "スキンの初期化に失敗しました。" );\r
1661                                 throw;\r
1662                         }\r
1663                         finally\r
1664                         {\r
1665                                 Trace.Unindent();\r
1666                         }\r
1667                         //---------------------\r
1668                         #endregion\r
1669                         //-----------\r
1670                         #region [ Timer の初期化 ]\r
1671                         //---------------------\r
1672                         Trace.TraceInformation( "タイマの初期化を行います。" );\r
1673                         Trace.Indent();\r
1674                         try\r
1675                         {\r
1676                                 Timer = new CTimer( CTimer.E種別.MultiMedia );\r
1677                                 Trace.TraceInformation( "タイマの初期化を完了しました。" );\r
1678                         }\r
1679                         finally\r
1680                         {\r
1681                                 Trace.Unindent();\r
1682                         }\r
1683                         //---------------------\r
1684                         #endregion\r
1685                         #region [ FPS カウンタの初期化 ]\r
1686                         //---------------------\r
1687                         Trace.TraceInformation( "FPSカウンタの初期化を行います。" );\r
1688                         Trace.Indent();\r
1689                         try\r
1690                         {\r
1691                                 FPS = new CFPS();\r
1692                                 Trace.TraceInformation( "FPSカウンタを生成しました。" );\r
1693                         }\r
1694                         finally\r
1695                         {\r
1696                                 Trace.Unindent();\r
1697                         }\r
1698                         //---------------------\r
1699                         #endregion\r
1700                         #region [ act文字コンソールの初期化 ]\r
1701                         //---------------------\r
1702                         Trace.TraceInformation( "文字コンソールの初期化を行います。" );\r
1703                         Trace.Indent();\r
1704                         try\r
1705                         {\r
1706                                 act文字コンソール = new C文字コンソール();\r
1707                                 Trace.TraceInformation( "文字コンソールを生成しました。" );\r
1708                                 act文字コンソール.On活性化();\r
1709                                 Trace.TraceInformation( "文字コンソールを活性化しました。" );\r
1710                                 Trace.TraceInformation( "文字コンソールの初期化を完了しました。" );\r
1711                         }\r
1712                         catch( Exception exception )\r
1713                         {\r
1714                                 Trace.TraceError( exception.Message );\r
1715                                 Trace.TraceError( "文字コンソールの初期化に失敗しました。" );\r
1716                         }\r
1717                         finally\r
1718                         {\r
1719                                 Trace.Unindent();\r
1720                         }\r
1721                         //---------------------\r
1722                         #endregion\r
1723                         #region [ Input管理 の初期化 ]\r
1724                         //---------------------\r
1725                         Trace.TraceInformation( "DirectInput, MIDI入力の初期化を行います。" );\r
1726                         Trace.Indent();\r
1727                         try\r
1728                         {\r
1729                                 Input管理 = new CInput管理( base.Window.Handle );\r
1730                                 foreach( IInputDevice device in Input管理.list入力デバイス )\r
1731                                 {\r
1732                                         if( ( device.e入力デバイス種別 == E入力デバイス種別.Joystick ) && !ConfigIni.dicJoystick.ContainsValue( device.GUID ) )\r
1733                                         {\r
1734                                                 int key = 0;\r
1735                                                 while( ConfigIni.dicJoystick.ContainsKey( key ) )\r
1736                                                 {\r
1737                                                         key++;\r
1738                                                 }\r
1739                                                 ConfigIni.dicJoystick.Add( key, device.GUID );\r
1740                                         }\r
1741                                 }\r
1742                                 foreach( IInputDevice device2 in Input管理.list入力デバイス )\r
1743                                 {\r
1744                                         if( device2.e入力デバイス種別 == E入力デバイス種別.Joystick )\r
1745                                         {\r
1746                                                 foreach( KeyValuePair<int, string> pair in ConfigIni.dicJoystick )\r
1747                                                 {\r
1748                                                         if( device2.GUID.Equals( pair.Value ) )\r
1749                                                         {\r
1750                                                                 ( (CInputJoystick) device2 ).SetID( pair.Key );\r
1751                                                                 break;\r
1752                                                         }\r
1753                                                 }\r
1754                                                 continue;\r
1755                                         }\r
1756                                 }\r
1757                                 Trace.TraceInformation( "DirectInput の初期化を完了しました。" );\r
1758                         }\r
1759                         catch( Exception exception2 )\r
1760                         {\r
1761                                 Trace.TraceError( exception2.Message );\r
1762                                 Trace.TraceError( "DirectInput, MIDI入力の初期化に失敗しました。" );\r
1763                                 throw;\r
1764                         }\r
1765                         finally\r
1766                         {\r
1767                                 Trace.Unindent();\r
1768                         }\r
1769                         //---------------------\r
1770                         #endregion\r
1771                         #region [ Pad の初期化 ]\r
1772                         //---------------------\r
1773                         Trace.TraceInformation( "パッドの初期化を行います。" );\r
1774                         Trace.Indent();\r
1775                         try\r
1776                         {\r
1777                                 Pad = new CPad( ConfigIni, Input管理 );\r
1778                                 Trace.TraceInformation( "パッドの初期化を完了しました。" );\r
1779                         }\r
1780                         catch( Exception exception3 )\r
1781                         {\r
1782                                 Trace.TraceError( exception3.Message );\r
1783                                 Trace.TraceError( "パッドの初期化に失敗しました。" );\r
1784                         }\r
1785                         finally\r
1786                         {\r
1787                                 Trace.Unindent();\r
1788                         }\r
1789                         //---------------------\r
1790                         #endregion\r
1791                         #region [ Sound管理 の初期化 ]\r
1792                         //---------------------\r
1793                         Trace.TraceInformation( "サウンドデバイスの初期化を行います。" );\r
1794                         Trace.Indent();\r
1795                         try\r
1796                         {                               \r
1797                                 ESoundDeviceType soundDeviceType;\r
1798                                 switch ( CDTXMania.ConfigIni.nSoundDeviceType )\r
1799                                 {\r
1800                                         case 0:\r
1801                                                 soundDeviceType = ESoundDeviceType.DirectSound;\r
1802                                                 break;\r
1803                                         case 1:\r
1804                                                 soundDeviceType = ESoundDeviceType.ASIO;\r
1805                                                 break;\r
1806                                         case 2:\r
1807                                                 soundDeviceType = ESoundDeviceType.ExclusiveWASAPI;\r
1808                                                 break;\r
1809                                         default:\r
1810                                                 soundDeviceType = ESoundDeviceType.Unknown;\r
1811                                                 break;\r
1812                                 }\r
1813                                 Sound管理 = new CSound管理( base.Window.Handle,\r
1814                                                                                         soundDeviceType,\r
1815                                                                                         // CDTXMania.ConfigIni.nWASAPIBufferSizeMs,\r
1816                                                                                         0,\r
1817                                                                                         // CDTXMania.ConfigIni.nASIOBufferSizeMs,\r
1818                                                                                         0,\r
1819                                                                                         CDTXMania.ConfigIni.nASIODevice\r
1820                                 );\r
1821                                 AddSoundTypeToWindowTitle();\r
1822                                 FDK.CSound管理.bIsTimeStretch = CDTXMania.ConfigIni.bTimeStretch;\r
1823                                 Trace.TraceInformation( "サウンドデバイスの初期化を完了しました。" );\r
1824                         }\r
1825                         catch (Exception e)\r
1826                         {\r
1827                                 Trace.TraceError( e.Message );\r
1828                                 throw;\r
1829                         }\r
1830                         finally\r
1831                         {\r
1832                                 Trace.Unindent();\r
1833                         }\r
1834                         //---------------------\r
1835                         #endregion\r
1836                         #region [ Songs管理 の初期化 ]\r
1837                         //---------------------\r
1838                         Trace.TraceInformation( "曲リストの初期化を行います。" );\r
1839                         Trace.Indent();\r
1840                         try\r
1841                         {\r
1842                                 Songs管理 = new CSongs管理();\r
1843 //                              Songs管理_裏読 = new CSongs管理();\r
1844                                 EnumSongs = new CEnumSongs();\r
1845                                 actEnumSongs = new CActEnumSongs();\r
1846                                 Trace.TraceInformation( "曲リストの初期化を完了しました。" );\r
1847                         }\r
1848                         catch( Exception e )\r
1849                         {\r
1850                                 Trace.TraceError( e.Message );\r
1851                                 Trace.TraceError( "曲リストの初期化に失敗しました。" );\r
1852                         }\r
1853                         finally\r
1854                         {\r
1855                                 Trace.Unindent();\r
1856                         }\r
1857                         //---------------------\r
1858                         #endregion\r
1859                         #region [ CAvi の初期化 ]\r
1860                         //---------------------\r
1861                         CAvi.t初期化();\r
1862                         //---------------------\r
1863                         #endregion\r
1864                         #region [ Random の初期化 ]\r
1865                         //---------------------\r
1866                         Random = new Random( (int) Timer.nシステム時刻 );\r
1867                         //---------------------\r
1868                         #endregion\r
1869                         #region [ ステージの初期化 ]\r
1870                         //---------------------\r
1871                         r現在のステージ = null;\r
1872                         r直前のステージ = null;\r
1873                         stage起動 = new CStage起動();\r
1874                         stageタイトル = new CStageタイトル();\r
1875 //                      stageオプション = new CStageオプション();\r
1876                         stageコンフィグ = new CStageコンフィグ();\r
1877                         stage選曲 = new CStage選曲();\r
1878                         stage曲読み込み = new CStage曲読み込み();\r
1879                         stage演奏ドラム画面 = new CStage演奏ドラム画面();\r
1880                         stage演奏ギター画面 = new CStage演奏ギター画面();\r
1881                         stage結果 = new CStage結果();\r
1882                         stageChangeSkin = new CStageChangeSkin();\r
1883                         stage終了 = new CStage終了();\r
1884                         this.listトップレベルActivities = new List<CActivity>();\r
1885                         this.listトップレベルActivities.Add( actEnumSongs );\r
1886                         this.listトップレベルActivities.Add( act文字コンソール );\r
1887                         this.listトップレベルActivities.Add( stage起動 );\r
1888                         this.listトップレベルActivities.Add( stageタイトル );\r
1889 //                      this.listトップレベルActivities.Add( stageオプション );\r
1890                         this.listトップレベルActivities.Add( stageコンフィグ );\r
1891                         this.listトップレベルActivities.Add( stage選曲 );\r
1892                         this.listトップレベルActivities.Add( stage曲読み込み );\r
1893                         this.listトップレベルActivities.Add( stage演奏ドラム画面 );\r
1894                         this.listトップレベルActivities.Add( stage演奏ギター画面 );\r
1895                         this.listトップレベルActivities.Add( stage結果 );\r
1896                         this.listトップレベルActivities.Add( stageChangeSkin );\r
1897                         this.listトップレベルActivities.Add( stage終了 );\r
1898                         this.listトップレベルActivities.Add( actFlushGPU );\r
1899                         //---------------------\r
1900                         #endregion\r
1901                         #region [ プラグインの検索と生成 ]\r
1902                         //---------------------\r
1903                         PluginHost = new CPluginHost();\r
1904 \r
1905                         Trace.TraceInformation( "プラグインの検索と生成を行います。" );\r
1906                         Trace.Indent();\r
1907                         try\r
1908                         {\r
1909                                 this.tプラグイン検索と生成();\r
1910                                 Trace.TraceInformation( "プラグインの検索と生成を完了しました。" );\r
1911                         }\r
1912                         finally\r
1913                         {\r
1914                                 Trace.Unindent();\r
1915                         }\r
1916                         //---------------------\r
1917                         #endregion\r
1918                         #region [ プラグインの初期化 ]\r
1919                         //---------------------\r
1920                         if( this.listプラグイン != null && this.listプラグイン.Count > 0 )\r
1921                         {\r
1922                                 Trace.TraceInformation( "プラグインの初期化を行います。" );\r
1923                                 Trace.Indent();\r
1924                                 try\r
1925                                 {\r
1926                                         foreach( STPlugin st in this.listプラグイン )\r
1927                                         {\r
1928                                                 Directory.SetCurrentDirectory( st.strプラグインフォルダ );\r
1929                                                 st.plugin.On初期化( this.PluginHost );\r
1930                                                 st.plugin.OnManagedリソースの作成();\r
1931                                                 st.plugin.OnUnmanagedリソースの作成();\r
1932                                                 Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
1933                                         }\r
1934                                         Trace.TraceInformation( "すべてのプラグインの初期化を完了しました。" );\r
1935                                 }\r
1936                                 catch\r
1937                                 {\r
1938                                         Trace.TraceError( "プラグインのどれかの初期化に失敗しました。" );\r
1939                                         throw;\r
1940                                 }\r
1941                                 finally\r
1942                                 {\r
1943                                         Trace.Unindent();\r
1944                                 }\r
1945                         }\r
1946 \r
1947                         //---------------------\r
1948                         #endregion\r
1949 \r
1950                         Trace.TraceInformation( "アプリケーションの初期化を完了しました。" );\r
1951                         \r
1952                         #region [ 最初のステージの起動 ]\r
1953                         //---------------------\r
1954                         Trace.TraceInformation( "----------------------" );\r
1955                         Trace.TraceInformation( "■ 起動" );\r
1956 \r
1957                         if ( CDTXMania.bコンパクトモード )\r
1958                         {\r
1959                                 r現在のステージ = stage曲読み込み;\r
1960                         }\r
1961                         else\r
1962                         {\r
1963                                 r現在のステージ = stage起動;\r
1964                         }\r
1965                         r現在のステージ.On活性化();\r
1966                         //---------------------\r
1967                         #endregion\r
1968                 }\r
1969 \r
1970                 public void AddSoundTypeToWindowTitle()\r
1971                 {\r
1972                         string delay = "";\r
1973                         if ( Sound管理.GetCurrentSoundDeviceType() != "DirectSound" )\r
1974                         {\r
1975                                 delay = "(" + Sound管理.GetSoundDelay() + "ms)";\r
1976                         }\r
1977                         base.Window.Text = strWindowTitle + " (" + Sound管理.GetCurrentSoundDeviceType() + delay + ")";\r
1978                 }\r
1979 \r
1980                 private void t終了処理()\r
1981                 {\r
1982                         if( !this.b終了処理完了済み )\r
1983                         {\r
1984                                 Trace.TraceInformation( "----------------------" );\r
1985                                 Trace.TraceInformation( "■ アプリケーションの終了" );\r
1986                                 #region [ 曲検索の終了処理 ]\r
1987                                 //---------------------\r
1988                                 if ( actEnumSongs != null )\r
1989                                 {\r
1990                                         Trace.TraceInformation( "曲検索actの終了処理を行います。" );\r
1991                                         Trace.Indent();\r
1992                                         try\r
1993                                         {\r
1994                                                 actEnumSongs.On非活性化();\r
1995                                                 actEnumSongs= null;\r
1996                                                 Trace.TraceInformation( "曲検索actの終了処理を完了しました。" );\r
1997                                         }\r
1998                                         catch ( Exception e )\r
1999                                         {\r
2000                                                 Trace.TraceError( e.Message );\r
2001                                                 Trace.TraceError( "曲検索actの終了処理に失敗しました。" );\r
2002                                         }\r
2003                                         finally\r
2004                                         {\r
2005                                                 Trace.Unindent();\r
2006                                         }\r
2007                                 }\r
2008                                 //---------------------\r
2009                                 #endregion\r
2010                                 #region [ 現在のステージの終了処理 ]\r
2011                                 //---------------------\r
2012                                 if( CDTXMania.r現在のステージ != null && CDTXMania.r現在のステージ.b活性化してる )          // #25398 2011.06.07 MODIFY FROM\r
2013                                 {\r
2014                                         Trace.TraceInformation( "現在のステージを終了します。" );\r
2015                                         Trace.Indent();\r
2016                                         try\r
2017                                         {\r
2018                                                 r現在のステージ.On非活性化();\r
2019                                                 Trace.TraceInformation( "現在のステージの終了処理を完了しました。" );\r
2020                                         }\r
2021                                         finally\r
2022                                         {\r
2023                                                 Trace.Unindent();\r
2024                                         }\r
2025                                 }\r
2026                                 //---------------------\r
2027                                 #endregion\r
2028                                 #region [ プラグインの終了処理 ]\r
2029                                 //---------------------\r
2030                                 if (this.listプラグイン != null && this.listプラグイン.Count > 0)\r
2031                                 {\r
2032                                         Trace.TraceInformation( "すべてのプラグインを終了します。" );\r
2033                                         Trace.Indent();\r
2034                                         try\r
2035                                         {\r
2036                                                 foreach( STPlugin st in this.listプラグイン )\r
2037                                                 {\r
2038                                                         Directory.SetCurrentDirectory( st.strプラグインフォルダ );\r
2039                                                         st.plugin.OnUnmanagedリソースの解放();\r
2040                                                         st.plugin.OnManagedリソースの解放();\r
2041                                                         st.plugin.On終了();\r
2042                                                         Directory.SetCurrentDirectory( CDTXMania.strEXEのあるフォルダ );\r
2043                                                 }\r
2044                                                 PluginHost = null;\r
2045                                                 Trace.TraceInformation( "すべてのプラグインの終了処理を完了しました。" );\r
2046                                         }\r
2047                                         finally\r
2048                                         {\r
2049                                                 Trace.Unindent();\r
2050                                         }\r
2051                                 }\r
2052                                 //---------------------\r
2053                                 #endregion\r
2054                                 #region [ 曲リストの終了処理 ]\r
2055                                 //---------------------\r
2056                                 if (Songs管理 != null)\r
2057                                 {\r
2058                                         Trace.TraceInformation( "曲リストの終了処理を行います。" );\r
2059                                         Trace.Indent();\r
2060                                         try\r
2061                                         {\r
2062                                                 Songs管理 = null;\r
2063                                                 Trace.TraceInformation( "曲リストの終了処理を完了しました。" );\r
2064                                         }\r
2065                                         catch( Exception exception )\r
2066                                         {\r
2067                                                 Trace.TraceError( exception.Message );\r
2068                                                 Trace.TraceError( "曲リストの終了処理に失敗しました。" );\r
2069                                         }\r
2070                                         finally\r
2071                                         {\r
2072                                                 Trace.Unindent();\r
2073                                         }\r
2074                                 }\r
2075                                 CAvi.t終了();\r
2076                                 //---------------------\r
2077                                 #endregion\r
2078                                 #region [ スキンの終了処理 ]\r
2079                                 //---------------------\r
2080                                 if (Skin != null)\r
2081                                 {\r
2082                                         Trace.TraceInformation( "スキンの終了処理を行います。" );\r
2083                                         Trace.Indent();\r
2084                                         try\r
2085                                         {\r
2086                                                 Skin.Dispose();\r
2087                                                 Skin = null;\r
2088                                                 Trace.TraceInformation( "スキンの終了処理を完了しました。" );\r
2089                                         }\r
2090                                         catch( Exception exception2 )\r
2091                                         {\r
2092                                                 Trace.TraceError( exception2.Message );\r
2093                                                 Trace.TraceError( "スキンの終了処理に失敗しました。" );\r
2094                                         }\r
2095                                         finally\r
2096                                         {\r
2097                                                 Trace.Unindent();\r
2098                                         }\r
2099                                 }\r
2100                                 //---------------------\r
2101                                 #endregion\r
2102                                 #region [ DirectSoundの終了処理 ]\r
2103                                 //---------------------\r
2104                                 if (Sound管理 != null)\r
2105                                 {\r
2106                                         Trace.TraceInformation( "DirectSound の終了処理を行います。" );\r
2107                                         Trace.Indent();\r
2108                                         try\r
2109                                         {\r
2110                                                 Sound管理.Dispose();\r
2111                                                 Sound管理 = null;\r
2112                                                 Trace.TraceInformation( "DirectSound の終了処理を完了しました。" );\r
2113                                         }\r
2114                                         catch( Exception exception3 )\r
2115                                         {\r
2116                                                 Trace.TraceError( exception3.Message );\r
2117                                                 Trace.TraceError( "DirectSound の終了処理に失敗しました。" );\r
2118                                         }\r
2119                                         finally\r
2120                                         {\r
2121                                                 Trace.Unindent();\r
2122                                         }\r
2123                                 }\r
2124                                 //---------------------\r
2125                                 #endregion\r
2126                                 #region [ パッドの終了処理 ]\r
2127                                 //---------------------\r
2128                                 if (Pad != null)\r
2129                                 {\r
2130                                         Trace.TraceInformation( "パッドの終了処理を行います。" );\r
2131                                         Trace.Indent();\r
2132                                         try\r
2133                                         {\r
2134                                                 Pad = null;\r
2135                                                 Trace.TraceInformation( "パッドの終了処理を完了しました。" );\r
2136                                         }\r
2137                                         catch( Exception exception4 )\r
2138                                         {\r
2139                                                 Trace.TraceError( exception4.Message );\r
2140                                                 Trace.TraceError( "パッドの終了処理に失敗しました。" );\r
2141                                         }\r
2142                                         finally\r
2143                                         {\r
2144                                                 Trace.Unindent();\r
2145                                         }\r
2146                                 }\r
2147                                 //---------------------\r
2148                                 #endregion\r
2149                                 #region [ DirectInput, MIDI入力の終了処理 ]\r
2150                                 //---------------------\r
2151                                 if (Input管理 != null)\r
2152                                 {\r
2153                                         Trace.TraceInformation( "DirectInput, MIDI入力の終了処理を行います。" );\r
2154                                         Trace.Indent();\r
2155                                         try\r
2156                                         {\r
2157                                                 Input管理.Dispose();\r
2158                                                 Input管理 = null;\r
2159                                                 Trace.TraceInformation( "DirectInput, MIDI入力の終了処理を完了しました。" );\r
2160                                         }\r
2161                                         catch( Exception exception5 )\r
2162                                         {\r
2163                                                 Trace.TraceError( exception5.Message );\r
2164                                                 Trace.TraceError( "DirectInput, MIDI入力の終了処理に失敗しました。" );\r
2165                                         }\r
2166                                         finally\r
2167                                         {\r
2168                                                 Trace.Unindent();\r
2169                                         }\r
2170                                 }\r
2171                                 //---------------------\r
2172                                 #endregion\r
2173                                 #region [ 文字コンソールの終了処理 ]\r
2174                                 //---------------------\r
2175                                 if (act文字コンソール != null)\r
2176                                 {\r
2177                                         Trace.TraceInformation( "文字コンソールの終了処理を行います。" );\r
2178                                         Trace.Indent();\r
2179                                         try\r
2180                                         {\r
2181                                                 act文字コンソール.On非活性化();\r
2182                                                 act文字コンソール = null;\r
2183                                                 Trace.TraceInformation( "文字コンソールの終了処理を完了しました。" );\r
2184                                         }\r
2185                                         catch( Exception exception6 )\r
2186                                         {\r
2187                                                 Trace.TraceError( exception6.Message );\r
2188                                                 Trace.TraceError( "文字コンソールの終了処理に失敗しました。" );\r
2189                                         }\r
2190                                         finally\r
2191                                         {\r
2192                                                 Trace.Unindent();\r
2193                                         }\r
2194                                 }\r
2195                                 //---------------------\r
2196                                 #endregion\r
2197                                 #region [ FPSカウンタの終了処理 ]\r
2198                                 //---------------------\r
2199                                 Trace.TraceInformation("FPSカウンタの終了処理を行います。");\r
2200                                 Trace.Indent();\r
2201                                 try\r
2202                                 {\r
2203                                         if( FPS != null )\r
2204                                         {\r
2205                                                 FPS = null;\r
2206                                         }\r
2207                                         Trace.TraceInformation( "FPSカウンタの終了処理を完了しました。" );\r
2208                                 }\r
2209                                 finally\r
2210                                 {\r
2211                                         Trace.Unindent();\r
2212                                 }\r
2213                                 //---------------------\r
2214                                 #endregion\r
2215 \r
2216                                 #region [ タイマの終了処理 ]\r
2217                                 //---------------------\r
2218                                 Trace.TraceInformation("タイマの終了処理を行います。");\r
2219                                 Trace.Indent();\r
2220                                 try\r
2221                                 {\r
2222                                         if( Timer != null )\r
2223                                         {\r
2224                                                 Timer.Dispose();\r
2225                                                 Timer = null;\r
2226                                                 Trace.TraceInformation( "タイマの終了処理を完了しました。" );\r
2227                                         }\r
2228                                         else\r
2229                                         {\r
2230                                                 Trace.TraceInformation( "タイマは使用されていません。" );\r
2231                                         }\r
2232                                 }\r
2233                                 finally\r
2234                                 {\r
2235                                         Trace.Unindent();\r
2236                                 }\r
2237                                 //---------------------\r
2238                                 #endregion\r
2239                                 #region [ Config.iniの出力 ]\r
2240                                 //---------------------\r
2241                                 Trace.TraceInformation("Config.ini を出力します。");\r
2242 //                              if ( ConfigIni.bIsSwappedGuitarBass )                   // #24063 2011.1.16 yyagi ギターベースがスワップしているときは元に戻す\r
2243                                 if ( ConfigIni.bIsSwappedGuitarBass_AutoFlagsAreSwapped )       // #24415 2011.2.21 yyagi FLIP中かつ演奏中にalt-f4で終了したときは、AUTOのフラグをswapして戻す\r
2244                                 {\r
2245                                     ConfigIni.SwapGuitarBassInfos_AutoFlags();\r
2246                                 }\r
2247                                 string str = strEXEのあるフォルダ + "Config.ini";\r
2248                                 Trace.Indent();\r
2249                                 try\r
2250                                 {\r
2251                                         ConfigIni.t書き出し( str );\r
2252                                         Trace.TraceInformation( "保存しました。({0})", new object[] { str } );\r
2253                                 }\r
2254                                 catch( Exception e )\r
2255                                 {\r
2256                                         Trace.TraceError( e.Message );\r
2257                                         Trace.TraceError( "Config.ini の出力に失敗しました。({0})", new object[] { str } );\r
2258                                 }\r
2259                                 finally\r
2260                                 {\r
2261                                         Trace.Unindent();\r
2262                                 }\r
2263                                 //---------------------\r
2264                                 #endregion\r
2265                                 Trace.TraceInformation("アプリケーションの終了処理を完了しました。");\r
2266 \r
2267 \r
2268                                 this.b終了処理完了済み = true;\r
2269                         }\r
2270                 }\r
2271                 private CScoreIni tScoreIniへBGMAdjustとHistoryとPlayCountを更新(string str新ヒストリ行)\r
2272                 {\r
2273                         bool bIsUpdatedDrums, bIsUpdatedGuitar, bIsUpdatedBass;\r
2274                         string strFilename = DTX.strファイル名の絶対パス + ".score.ini";\r
2275                         CScoreIni ini = new CScoreIni( strFilename );\r
2276                         if( !File.Exists( strFilename ) )\r
2277                         {\r
2278                                 ini.stファイル.Title = DTX.TITLE;\r
2279                                 ini.stファイル.Name = DTX.strファイル名;\r
2280                                 ini.stファイル.Hash = CScoreIni.tファイルのMD5を求めて返す( DTX.strファイル名の絶対パス );\r
2281                                 for( int i = 0; i < 6; i++ )\r
2282                                 {\r
2283                                         ini.stセクション[ i ].nPerfectになる範囲ms = nPerfect範囲ms;\r
2284                                         ini.stセクション[ i ].nGreatになる範囲ms = nGreat範囲ms;\r
2285                                         ini.stセクション[ i ].nGoodになる範囲ms = nGood範囲ms;\r
2286                                         ini.stセクション[ i ].nPoorになる範囲ms = nPoor範囲ms;\r
2287                                 }\r
2288                         }\r
2289                         ini.stファイル.BGMAdjust = DTX.nBGMAdjust;\r
2290                         CScoreIni.t更新条件を取得する( out bIsUpdatedDrums, out bIsUpdatedGuitar, out bIsUpdatedBass );\r
2291                         if( bIsUpdatedDrums || bIsUpdatedGuitar || bIsUpdatedBass )\r
2292                         {\r
2293                                 if( bIsUpdatedDrums )\r
2294                                 {\r
2295                                         ini.stファイル.PlayCountDrums++;\r
2296                                 }\r
2297                                 if( bIsUpdatedGuitar )\r
2298                                 {\r
2299                                         ini.stファイル.PlayCountGuitar++;\r
2300                                 }\r
2301                                 if( bIsUpdatedBass )\r
2302                                 {\r
2303                                         ini.stファイル.PlayCountBass++;\r
2304                                 }\r
2305                                 ini.tヒストリを追加する( str新ヒストリ行 );\r
2306                                 if( !bコンパクトモード )\r
2307                                 {\r
2308                                         stage選曲.r現在選択中のスコア.譜面情報.演奏回数.Drums = ini.stファイル.PlayCountDrums;\r
2309                                         stage選曲.r現在選択中のスコア.譜面情報.演奏回数.Guitar = ini.stファイル.PlayCountGuitar;\r
2310                                         stage選曲.r現在選択中のスコア.譜面情報.演奏回数.Bass = ini.stファイル.PlayCountBass;\r
2311                                         for( int j = 0; j < ini.stファイル.History.Length; j++ )\r
2312                                         {\r
2313                                                 stage選曲.r現在選択中のスコア.譜面情報.演奏履歴[ j ] = ini.stファイル.History[ j ];\r
2314                                         }\r
2315                                 }\r
2316                         }\r
2317                         if( ConfigIni.bScoreIniを出力する )\r
2318                         {\r
2319                                 ini.t書き出し( strFilename );\r
2320                         }\r
2321 \r
2322                         return ini;\r
2323                 }\r
2324                 private void tガベージコレクションを実行する()\r
2325                 {\r
2326                         GC.Collect();\r
2327                         GC.WaitForPendingFinalizers();\r
2328                         GC.Collect();\r
2329                         GC.WaitForPendingFinalizers();\r
2330                 }\r
2331                 private void tプラグイン検索と生成()\r
2332                 {\r
2333                         this.listプラグイン = new List<STPlugin>();\r
2334 \r
2335                         string strIPluginActivityの名前 = typeof( IPluginActivity ).FullName;\r
2336                         string strプラグインフォルダパス = strEXEのあるフォルダ + "Plugins\\";\r
2337 \r
2338                         this.t指定フォルダ内でのプラグイン検索と生成( strプラグインフォルダパス, strIPluginActivityの名前 );\r
2339 \r
2340                         if( this.listプラグイン.Count > 0 )\r
2341                                 Trace.TraceInformation( this.listプラグイン.Count + " 個のプラグインを読み込みました。" );\r
2342                 }\r
2343                 #region [ Windowイベント処理 ]\r
2344                 private void t指定フォルダ内でのプラグイン検索と生成( string strプラグインフォルダパス, string strプラグイン型名 )\r
2345                 {\r
2346                         // 指定されたパスが存在しないとエラー\r
2347                         if( !Directory.Exists( strプラグインフォルダパス ) )\r
2348                         {\r
2349                                 Trace.TraceWarning( "プラグインフォルダが存在しません。(" + strプラグインフォルダパス + ")" );\r
2350                                 return;\r
2351                         }\r
2352 \r
2353                         // (1) すべての *.dll について…\r
2354                         string[] strDLLs = System.IO.Directory.GetFiles( strプラグインフォルダパス, "*.dll" );\r
2355                         foreach( string dllName in strDLLs )\r
2356                         {\r
2357                                 try\r
2358                                 {\r
2359                                         // (1-1) dll をアセンブリとして読み込む。\r
2360                                         System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom( dllName );\r
2361 \r
2362                                         // (1-2) アセンブリ内のすべての型について、プラグインとして有効か調べる\r
2363                                         foreach( Type t in asm.GetTypes() )\r
2364                                         {\r
2365                                                 //  (1-3) ↓クラスであり↓Publicであり↓抽象クラスでなく↓IPlugin型のインスタンスが作れる 型を持っていれば有効\r
2366                                                 if( t.IsClass && t.IsPublic && !t.IsAbstract && t.GetInterface( strプラグイン型名 ) != null )\r
2367                                                 {\r
2368                                                         // (1-4) クラス名からインスタンスを作成する\r
2369                                                         var st = new STPlugin() {\r
2370                                                                 plugin = (IPluginActivity) asm.CreateInstance( t.FullName ),\r
2371                                                                 strプラグインフォルダ = Path.GetDirectoryName( dllName ),\r
2372                                                                 strアセンブリ簡易名 = asm.GetName().Name,\r
2373                                                                 Version = asm.GetName().Version,\r
2374                                                         };\r
2375 \r
2376                                                         // (1-5) プラグインリストへ登録\r
2377                                                         this.listプラグイン.Add( st );\r
2378                                                         Trace.TraceInformation( "プラグイン {0} ({1}, {2}, {3}) を読み込みました。", t.FullName, Path.GetFileName( dllName ), st.strアセンブリ簡易名, st.Version.ToString() );\r
2379                                                 }\r
2380                                         }\r
2381                                 }\r
2382                                 catch\r
2383                                 {\r
2384                                         Trace.TraceInformation( dllName + " からプラグインを生成することに失敗しました。スキップします。" );\r
2385                                 }\r
2386                         }\r
2387 \r
2388                         // (2) サブフォルダがあれば再帰する\r
2389                         string[] strDirs = Directory.GetDirectories( strプラグインフォルダパス, "*" );\r
2390                         foreach( string dir in strDirs )\r
2391                                 this.t指定フォルダ内でのプラグイン検索と生成( dir + "\\", strプラグイン型名 );\r
2392                 }\r
2393                 //-----------------\r
2394                 private void Window_ApplicationActivated( object sender, EventArgs e )\r
2395                 {\r
2396                         this.bApplicationActive = true;\r
2397                 }\r
2398                 private void Window_ApplicationDeactivated( object sender, EventArgs e )\r
2399                 {\r
2400                         this.bApplicationActive = false;\r
2401                 }\r
2402                 private void Window_KeyDown( object sender, KeyEventArgs e )\r
2403                 {\r
2404                         if ( e.KeyCode == Keys.Menu )\r
2405                         {\r
2406                                 e.Handled = true;\r
2407                                 e.SuppressKeyPress = true;\r
2408                         }\r
2409                         else if ( ( e.KeyCode == Keys.Return ) && e.Alt )\r
2410                         {\r
2411                                 if ( ConfigIni != null )\r
2412                                 {\r
2413                                         ConfigIni.bウィンドウモード = !ConfigIni.bウィンドウモード;\r
2414                                         this.t全画面・ウィンドウモード切り替え();\r
2415                                 }\r
2416                                 e.Handled = true;\r
2417                                 e.SuppressKeyPress = true;\r
2418                         }\r
2419                         else\r
2420                         {\r
2421                                 for ( int i = 0; i < 0x10; i++ )\r
2422                                 {\r
2423                                         if ( ConfigIni.KeyAssign.System.Capture[ i ].コード > 0 &&\r
2424                                                  e.KeyCode == DeviceConstantConverter.KeyToKeyCode( (SlimDX.DirectInput.Key) ConfigIni.KeyAssign.System.Capture[ i ].コード ) )\r
2425                                         {\r
2426                                                 // Debug.WriteLine( "capture: " + string.Format( "{0:2x}", (int) e.KeyCode ) + " " + (int) e.KeyCode );\r
2427                                                 string strFullPath =\r
2428                                                    Path.Combine( CDTXMania.strEXEのあるフォルダ, "Capture_img" );\r
2429                                                 strFullPath = Path.Combine( strFullPath, DateTime.Now.ToString( "yyyyMMddHHmmss" ) + ".png" );\r
2430                                                 SaveResultScreen( strFullPath );\r
2431                                         }\r
2432                                 }\r
2433                         }\r
2434                 }\r
2435                 private void Window_MouseUp( object sender, MouseEventArgs e )\r
2436                 {\r
2437                         mb = e.Button;\r
2438                 }\r
2439 \r
2440                 private void Window_MouseDoubleClick( object sender, MouseEventArgs e)  // #23510 2010.11.13 yyagi: to go full screen mode\r
2441                 {\r
2442                         if ( mb.Equals(MouseButtons.Left) && ConfigIni.bIsAllowedDoubleClickFullscreen )        // #26752 2011.11.27 yyagi\r
2443                         {\r
2444                                 ConfigIni.bウィンドウモード = false;\r
2445                                 this.t全画面・ウィンドウモード切り替え();\r
2446                         }\r
2447                 }\r
2448                 private void Window_ResizeEnd(object sender, EventArgs e)                               // #23510 2010.11.20 yyagi: to get resized window size\r
2449                 {\r
2450                         if ( ConfigIni.bウィンドウモード )\r
2451                         {\r
2452                                 ConfigIni.n初期ウィンドウ開始位置X = base.Window.Location.X; // #30675 2013.02.04 ikanick add\r
2453                                 ConfigIni.n初期ウィンドウ開始位置Y = base.Window.Location.Y; //\r
2454                         }\r
2455 \r
2456                         ConfigIni.nウインドウwidth = (ConfigIni.bウィンドウモード) ? base.Window.ClientSize.Width : currentClientSize.Width;       // #23510 2010.10.31 yyagi add\r
2457                         ConfigIni.nウインドウheight = (ConfigIni.bウィンドウモード) ? base.Window.ClientSize.Height : currentClientSize.Height;\r
2458                 }\r
2459                 #endregion\r
2460 \r
2461                 //internal sealed class GCBeep  // GC発生の度にbeep\r
2462                 //{\r
2463                 //    ~GCBeep()\r
2464                 //    {\r
2465                 //        Console.Beep();\r
2466                 //        if ( !AppDomain.CurrentDomain.IsFinalizingForUnload()\r
2467                 //            && !Environment.HasShutdownStarted )\r
2468                 //        {\r
2469                 //            new GCBeep();\r
2470                 //        }\r
2471                 //    }\r
2472                 //}\r
2473         \r
2474                 //-----------------\r
2475                 #endregion\r
2476         }\r
2477 }\r