OSDN Git Service

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