OSDN Git Service

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