OSDN Git Service

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