OSDN Git Service

DTXMania089リリースに際してのtag付け。
[dtxmania/dtxmania.git] / 110401(DTXMania089) / DTXManiaプロジェクト / コード / ステージ / 01.起動 / CStage起動.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 using System.Diagnostics;\r
5 using System.Threading;\r
6 using System.IO;\r
7 using FDK;\r
8 \r
9 namespace DTXMania\r
10 {\r
11         internal class CStage起動 : CStage\r
12         {\r
13                 // コンストラクタ\r
14 \r
15                 public CStage起動()\r
16                 {\r
17                         base.eステージID = CStage.Eステージ.起動;\r
18                         base.b活性化してない = true;\r
19                 }\r
20 \r
21 \r
22                 // CStage 実装\r
23 \r
24                 public override void On活性化()\r
25                 {\r
26                         Trace.TraceInformation( "起動ステージを活性化します。" );\r
27                         Trace.Indent();\r
28                         try\r
29                         {\r
30                                 this.list進行文字列 = new List<string>();\r
31                                 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
32                                 base.On活性化();\r
33                                 Trace.TraceInformation( "起動ステージの活性化を完了しました。" );\r
34                         }\r
35                         finally\r
36                         {\r
37                                 Trace.Unindent();\r
38                         }\r
39                 }\r
40                 public override void On非活性化()\r
41                 {\r
42                         Trace.TraceInformation( "起動ステージを非活性化します。" );\r
43                         Trace.Indent();\r
44                         try\r
45                         {\r
46                                 this.list進行文字列 = null;\r
47                                 if( ( this.thリスト構築 != null ) && this.thリスト構築.IsAlive )\r
48                                 {\r
49                                         Trace.TraceWarning( "リスト構築スレッドを強制停止します。" );\r
50                                         this.thリスト構築.Abort();\r
51                                         this.thリスト構築.Join();\r
52                                 }\r
53                                 base.On非活性化();\r
54                                 Trace.TraceInformation( "起動ステージの非活性化を完了しました。" );\r
55                         }\r
56                         finally\r
57                         {\r
58                                 Trace.Unindent();\r
59                         }\r
60                 }\r
61                 public override void OnManagedリソースの作成()\r
62                 {\r
63                         if( !base.b活性化してない )\r
64                         {\r
65                                 this.tx背景 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenSetup background.jpg" ), false );\r
66                                 base.OnManagedリソースの作成();\r
67                         }\r
68                 }\r
69                 public override void OnManagedリソースの解放()\r
70                 {\r
71                         if( !base.b活性化してない )\r
72                         {\r
73                                 CDTXMania.tテクスチャの解放( ref this.tx背景 );\r
74                                 base.OnManagedリソースの解放();\r
75                         }\r
76                 }\r
77                 public override int On進行描画()\r
78                 {\r
79                         if( !base.b活性化してない )\r
80                         {\r
81                                 if( base.b初めての進行描画 )\r
82                                 {\r
83                                         this.list進行文字列.Add( "DTXMania powered by YAMAHA Silent Session Drums\n" );\r
84                                         this.list進行文字列.Add( "Release: " + CDTXMania.VERSION + " [" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString() + "]" );\r
85                                         this.thリスト構築 = new Thread( new ThreadStart( this.t曲リストの構築 ) );\r
86                                         this.thリスト構築.Name = "曲リストの構築";\r
87                                         this.thリスト構築.IsBackground = true;\r
88                                         this.thリスト構築.Start();\r
89                                         base.b初めての進行描画 = false;\r
90                                         return 0;\r
91                                 }\r
92 \r
93                                 CSongs管理 s管理 = CDTXMania.Songs管理;\r
94 \r
95                                 if( this.tx背景 != null )\r
96                                         this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );\r
97 \r
98                                 #region [ this.str現在進行中 の決定 ]\r
99                                 //-----------------\r
100                                 switch( base.eフェーズID )\r
101                                 {\r
102                                         case CStage.Eフェーズ.起動0_システムサウンドを構築:\r
103                                                 this.str現在進行中 = "Loading system sounds ... ";\r
104                                                 break;\r
105 \r
106                                         case CStage.Eフェーズ.起動1_SongsDBからスコアキャッシュを構築:\r
107                                                 this.str現在進行中 = "Loading songs.db ... ";\r
108                                                 break;\r
109 \r
110                                         case CStage.Eフェーズ.起動2_曲を検索してリストを作成する:\r
111                                                 this.str現在進行中 = string.Format( "{0} ... {1}", "Enumerating songs", s管理.n検索されたスコア数 );\r
112                                                 break;\r
113 \r
114                                         case CStage.Eフェーズ.起動3_スコアキャッシュをリストに反映する:\r
115                                                 this.str現在進行中 = string.Format( "{0} ... {1}/{2}", "Loading score properties from songs.db", CDTXMania.Songs管理.nスコアキャッシュから反映できたスコア数, s管理.n検索されたスコア数 );\r
116                                                 break;\r
117 \r
118                                         case CStage.Eフェーズ.起動4_スコアキャッシュになかった曲をファイルから読み込んで反映する:\r
119                                                 this.str現在進行中 = string.Format( "{0} ... {1}/{2}", "Loading score properties from files", CDTXMania.Songs管理.nファイルから反映できたスコア数, CDTXMania.Songs管理.n検索されたスコア数 - s管理.nスコアキャッシュから反映できたスコア数 );\r
120                                                 break;\r
121 \r
122                                         case CStage.Eフェーズ.起動5_曲リストへ後処理を適用する:\r
123                                                 this.str現在進行中 = string.Format( "{0} ... ", "Building songlists" );\r
124                                                 break;\r
125 \r
126                                         case CStage.Eフェーズ.起動6_スコアキャッシュをSongsDBに出力する:\r
127                                                 this.str現在進行中 = string.Format( "{0} ... ", "Saving songs.db" );\r
128                                                 break;\r
129 \r
130                                         case CStage.Eフェーズ.起動7_完了:\r
131                                                 this.str現在進行中 = "Setup done.";\r
132                                                 break;\r
133                                 }\r
134                                 //-----------------\r
135                                 #endregion\r
136                                 #region [ this.list進行文字列+this.現在進行中 の表示 ]\r
137                                 //-----------------\r
138                                 lock( this.list進行文字列 )\r
139                                 {\r
140                                         int x = 0;\r
141                                         int y = 0;\r
142                                         foreach( string str in this.list進行文字列 )\r
143                                         {\r
144                                                 CDTXMania.act文字コンソール.tPrint( x, y, C文字コンソール.Eフォント種別.灰細, str );\r
145                                                 y += 14;\r
146                                         }\r
147                                         CDTXMania.act文字コンソール.tPrint( x, y, C文字コンソール.Eフォント種別.灰細, this.str現在進行中 );\r
148                                 }\r
149                                 //-----------------\r
150                                 #endregion\r
151 \r
152                                 if( !this.thリスト構築.IsAlive )\r
153                                 {\r
154                                         return 1;\r
155                                 }\r
156                         }\r
157                         return 0;\r
158                 }\r
159 \r
160 \r
161                 // その他\r
162 \r
163                 #region [ private ]\r
164                 //-----------------\r
165                 private List<string> list進行文字列;\r
166                 private const string MSG進行0 = "Loading system sounds";\r
167                 private const string MSG進行1 = "Loading songs.db";\r
168                 private const string MSG進行2 = "Enumerating songs";\r
169                 private const string MSG進行3 = "Loading score properties from songs.db";\r
170                 private const string MSG進行4 = "Loading score properties from files";\r
171                 private const string MSG進行5 = "Loading score properties from socre.ini";\r
172                 private const string MSG進行6 = "Building songlists";\r
173                 private const string MSG進行7 = "Saving songs.db";\r
174                 private string str現在進行中 = "";\r
175                 private Thread thリスト構築;\r
176                 private CTexture tx背景;\r
177 \r
178                 private void t曲リストの構築()\r
179                 {\r
180                         // !注意!\r
181                         // 本メソッドは別スレッドで動作するが、プラグイン側でカレントディレクトリを変更しても大丈夫なように、\r
182                         // すべてのファイルアクセスは「絶対パス」で行うこと。(2010.9.16)\r
183 \r
184                         DateTime now = DateTime.Now;\r
185                         string str = CDTXMania.strEXEのあるフォルダ + "songs.db";\r
186 \r
187                         try\r
188                         {\r
189                                 #region [ 0) システムサウンドの構築  ]\r
190                                 //-----------------------------\r
191                                 base.eフェーズID = CStage.Eフェーズ.起動0_システムサウンドを構築;\r
192 \r
193                                 Trace.TraceInformation( "0) システムサウンドを構築します。" );\r
194                                 Trace.Indent();\r
195 \r
196                                 try\r
197                                 {\r
198                                         for( int i = 0; i < CDTXMania.Skin.nシステムサウンド数; i++ )\r
199                                         {\r
200                                                 CSkin.Cシステムサウンド cシステムサウンド = CDTXMania.Skin[ i ];\r
201                                                 if( !CDTXMania.bコンパクトモード || cシステムサウンド.bCompact対象 )\r
202                                                 {\r
203                                                         try\r
204                                                         {\r
205                                                                 cシステムサウンド.t読み込み();\r
206                                                                 Trace.TraceInformation( "システムサウンドを読み込みました。({0})", new object[] { cシステムサウンド.strファイル名 } );\r
207                                                                 if( ( cシステムサウンド == CDTXMania.Skin.bgm起動画面 ) && cシステムサウンド.b読み込み成功 )\r
208                                                                 {\r
209                                                                         cシステムサウンド.t再生する();\r
210                                                                 }\r
211                                                         }\r
212                                                         catch( FileNotFoundException )\r
213                                                         {\r
214                                                                 Trace.TraceWarning( "システムサウンドが存在しません。({0})", new object[] { cシステムサウンド.strファイル名 } );\r
215                                                         }\r
216                                                         catch( Exception exception )\r
217                                                         {\r
218                                                                 Trace.TraceError( exception.Message );\r
219                                                                 Trace.TraceWarning( "システムサウンドの読み込みに失敗しました。({0})", new object[] { cシステムサウンド.strファイル名 } );\r
220                                                         }\r
221                                                 }\r
222                                         }\r
223                                         lock( this.list進行文字列 )\r
224                                         {\r
225                                                 this.list進行文字列.Add( "Loading system sounds ... OK " );\r
226                                         }\r
227                                 }\r
228                                 finally\r
229                                 {\r
230                                         Trace.Unindent();\r
231                                 }\r
232                                 //-----------------------------\r
233                                 #endregion\r
234 \r
235                                 if( CDTXMania.bコンパクトモード )\r
236                                 {\r
237                                         Trace.TraceInformation( "コンパクトモードなので残りの起動処理は省略します。" );\r
238                                         return;\r
239                                 }\r
240 \r
241                                 #region [ 1) songs.db の読み込み ]\r
242                                 //-----------------------------\r
243                                 base.eフェーズID = CStage.Eフェーズ.起動1_SongsDBからスコアキャッシュを構築;\r
244 \r
245                                 Trace.TraceInformation( "1) songs.db を読み込みます。" );\r
246                                 Trace.Indent();\r
247 \r
248                                 try\r
249                                 {\r
250                                         if( !CDTXMania.ConfigIni.bConfigIniがないかDTXManiaのバージョンが異なる )\r
251                                         {\r
252                                                 try\r
253                                                 {\r
254                                                         CDTXMania.Songs管理.tSongsDBを読み込む( str );\r
255                                                 }\r
256                                                 catch\r
257                                                 {\r
258                                                         Trace.TraceError( "songs.db の読み込みに失敗しました。" );\r
259                                                 }\r
260                                                 Trace.TraceInformation( "songs.db の読み込みを完了しました。[{0}スコア]", new object[] { CDTXMania.Songs管理.nSongsDBから取得できたスコア数 } );\r
261                                                 lock( this.list進行文字列 )\r
262                                                 {\r
263                                                         this.list進行文字列.Add( "Loading songs.db ... OK" );\r
264                                                 }\r
265                                         }\r
266                                         else\r
267                                         {\r
268                                                 Trace.TraceInformation( "初回の起動であるかまたはDTXManiaのバージョンが上がったため、songs.db の読み込みをスキップします。" );\r
269                                                 lock( this.list進行文字列 )\r
270                                                 {\r
271                                                         this.list進行文字列.Add( "Loading songs.db ... Skip" );\r
272                                                 }\r
273                                         }\r
274                                 }\r
275                                 finally\r
276                                 {\r
277                                         Trace.Unindent();\r
278                                 }\r
279                                 //-----------------------------\r
280                                 #endregion\r
281                                 #region [ 2) 曲データの検索 ]\r
282                                 //-----------------------------\r
283                                 base.eフェーズID = CStage.Eフェーズ.起動2_曲を検索してリストを作成する;\r
284 \r
285                                 Trace.TraceInformation( "2) 曲データを検索します。" );\r
286                                 Trace.Indent();\r
287 \r
288                                 try\r
289                                 {\r
290                                         if( !string.IsNullOrEmpty( CDTXMania.ConfigIni.str曲データ検索パス ) )\r
291                                         {\r
292                                                 string[] strArray = CDTXMania.ConfigIni.str曲データ検索パス.Split( new char[] { ';' } );\r
293                                                 if( strArray.Length > 0 )\r
294                                                 {\r
295                                                         // 全パスについて…\r
296                                                         foreach( string str2 in strArray )\r
297                                                         {\r
298                                                                 string path = str2;\r
299                                                                 if( !Path.IsPathRooted( path ) )\r
300                                                                 {\r
301                                                                         path = CDTXMania.strEXEのあるフォルダ + str2;    // 相対パスの場合、絶対パスに直す(2010.9.16)\r
302                                                                 }\r
303 \r
304                                                                 if( !string.IsNullOrEmpty( path ) )\r
305                                                                 {\r
306                                                                         Trace.TraceInformation( "検索パス: " + path );\r
307                                                                         Trace.Indent();\r
308 \r
309                                                                         try\r
310                                                                         {\r
311                                                                                 CDTXMania.Songs管理.t曲を検索してリストを作成する( path, true );\r
312                                                                         }\r
313                                                                         catch( Exception exception2 )\r
314                                                                         {\r
315                                                                                 Trace.TraceError( exception2.Message );\r
316                                                                                 Trace.TraceError( exception2.StackTrace );\r
317                                                                                 Trace.TraceError( "例外が発生しましたが処理を継続します。" );\r
318                                                                         }\r
319                                                                         finally\r
320                                                                         {\r
321                                                                                 Trace.Unindent();\r
322                                                                         }\r
323                                                                 }\r
324                                                         }\r
325                                                 }\r
326                                         }\r
327                                         else\r
328                                         {\r
329                                                 Trace.TraceWarning( "曲データの検索パス(DTXPath)の指定がありません。" );\r
330                                         }\r
331                                 }\r
332                                 finally\r
333                                 {\r
334                                         Trace.TraceInformation( "曲データの検索を完了しました。[{0}曲{1}スコア]", new object[] { CDTXMania.Songs管理.n検索された曲ノード数, CDTXMania.Songs管理.n検索されたスコア数 } );\r
335                                         Trace.Unindent();\r
336                                 }\r
337                                 lock( this.list進行文字列 )\r
338                                 {\r
339                                         this.list進行文字列.Add( string.Format( "{0} ... {1} scores ({2} songs)", "Enumerating songs", CDTXMania.Songs管理.n検索されたスコア数, CDTXMania.Songs管理.n検索された曲ノード数 ) );\r
340                                 }\r
341                                 //-----------------------------\r
342                                 #endregion\r
343                                 #region [ 3) songs.db 情報の曲リストへの反映 ]\r
344                                 //-----------------------------\r
345                                 base.eフェーズID = CStage.Eフェーズ.起動3_スコアキャッシュをリストに反映する;\r
346 \r
347                                 Trace.TraceInformation( "3) songs.db の情報を曲リストへ反映します。" );\r
348                                 Trace.Indent();\r
349 \r
350                                 try\r
351                                 {\r
352                                         CDTXMania.Songs管理.tスコアキャッシュを曲リストに反映する();\r
353                                 }\r
354                                 catch( Exception exception3 )\r
355                                 {\r
356                                         Trace.TraceError( exception3.Message );\r
357                                         Trace.TraceError( exception3.StackTrace );\r
358                                         Trace.TraceError( "例外が発生しましたが処理を継続します。" );\r
359                                 }\r
360                                 finally\r
361                                 {\r
362                                         Trace.TraceInformation( "曲リストへの反映を完了しました。[{0}/{1}スコア]", new object[] { CDTXMania.Songs管理.nスコアキャッシュから反映できたスコア数, CDTXMania.Songs管理.n検索されたスコア数 } );\r
363                                         Trace.Unindent();\r
364                                 }\r
365                                 lock( this.list進行文字列 )\r
366                                 {\r
367                                         this.list進行文字列.Add( string.Format( "{0} ... {1}/{2}", "Loading score properties from songs.db", CDTXMania.Songs管理.nスコアキャッシュから反映できたスコア数, CDTXMania.Songs管理.n検索されたスコア数 ) );\r
368                                 }\r
369                                 //-----------------------------\r
370                                 #endregion\r
371                                 #region [ 4) songs.db になかった曲データをファイルから読み込んで反映 ]\r
372                                 //-----------------------------\r
373                                 base.eフェーズID = CStage.Eフェーズ.起動4_スコアキャッシュになかった曲をファイルから読み込んで反映する;\r
374 \r
375                                 int num2 = CDTXMania.Songs管理.n検索されたスコア数 - CDTXMania.Songs管理.nスコアキャッシュから反映できたスコア数;\r
376 \r
377                                 Trace.TraceInformation( "4) songs.db になかった曲データ[{0}スコア]の情報をファイルから読み込んで反映します。", new object[] { num2 } );\r
378                                 Trace.Indent();\r
379 \r
380                                 try\r
381                                 {\r
382                                         CDTXMania.Songs管理.tSongsDBになかった曲をファイルから読み込んで反映する();\r
383                                 }\r
384                                 catch( Exception exception4 )\r
385                                 {\r
386                                         Trace.TraceError( exception4.Message );\r
387                                         Trace.TraceError( exception4.StackTrace );\r
388                                         Trace.TraceError( "例外が発生しましたが処理を継続します。" );\r
389                                 }\r
390                                 finally\r
391                                 {\r
392                                         Trace.TraceInformation( "曲データへの反映を完了しました。[{0}/{1}スコア]", new object[] { CDTXMania.Songs管理.nファイルから反映できたスコア数, num2 } );\r
393                                         Trace.Unindent();\r
394                                 }\r
395                                 lock( this.list進行文字列 )\r
396                                 {\r
397                                         this.list進行文字列.Add( string.Format( "{0} ... {1}/{2}", "Loading score properties from files", CDTXMania.Songs管理.nファイルから反映できたスコア数, CDTXMania.Songs管理.n検索されたスコア数 - CDTXMania.Songs管理.nスコアキャッシュから反映できたスコア数 ) );\r
398                                 }\r
399                                 //-----------------------------\r
400                                 #endregion\r
401                                 #region [ 5) 曲リストへの後処理の適用 ]\r
402                                 //-----------------------------\r
403                                 base.eフェーズID = CStage.Eフェーズ.起動5_曲リストへ後処理を適用する;\r
404 \r
405                                 Trace.TraceInformation( "5) 曲リストへの後処理を適用します。" );\r
406                                 Trace.Indent();\r
407 \r
408                                 try\r
409                                 {\r
410                                         CDTXMania.Songs管理.t曲リストへ後処理を適用する();\r
411                                 }\r
412                                 catch( Exception exception5 )\r
413                                 {\r
414                                         Trace.TraceError( exception5.Message );\r
415                                         Trace.TraceError( exception5.StackTrace );\r
416                                         Trace.TraceError( "例外が発生しましたが処理を継続します。" );\r
417                                 }\r
418                                 finally\r
419                                 {\r
420                                         Trace.TraceInformation( "曲リストへの後処理を完了しました。" );\r
421                                         Trace.Unindent();\r
422                                 }\r
423                                 lock( this.list進行文字列 )\r
424                                 {\r
425                                         this.list進行文字列.Add( string.Format( "{0} ... OK", "Building songlists" ) );\r
426                                 }\r
427                                 //-----------------------------\r
428                                 #endregion\r
429                                 #region [ 6) songs.db への保存 ]\r
430                                 //-----------------------------\r
431                                 base.eフェーズID = CStage.Eフェーズ.起動6_スコアキャッシュをSongsDBに出力する;\r
432 \r
433                                 Trace.TraceInformation( "6) 曲データの情報を songs.db へ出力します。" );\r
434                                 Trace.Indent();\r
435 \r
436                                 try\r
437                                 {\r
438                                         CDTXMania.Songs管理.tスコアキャッシュをSongsDBに出力する( str );\r
439                                 }\r
440                                 catch( Exception exception6 )\r
441                                 {\r
442                                         Trace.TraceError( exception6.Message );\r
443                                         Trace.TraceError( exception6.StackTrace );\r
444                                         Trace.TraceError( "例外が発生しましたが処理を継続します。" );\r
445                                 }\r
446                                 finally\r
447                                 {\r
448                                         Trace.TraceInformation( "songs.db への出力を完了しました。[{0}スコア]", new object[] { CDTXMania.Songs管理.nSongsDBへ出力できたスコア数 } );\r
449                                         Trace.Unindent();\r
450                                 }\r
451                                 lock( this.list進行文字列 )\r
452                                 {\r
453                                         this.list進行文字列.Add( string.Format( "{0} ... OK", "Saving songs.db" ) );\r
454                                 }\r
455                                 //-----------------------------\r
456                                 #endregion\r
457                         }\r
458                         finally\r
459                         {\r
460                                 base.eフェーズID = CStage.Eフェーズ.起動7_完了;\r
461                                 TimeSpan span = (TimeSpan) ( DateTime.Now - now );\r
462                                 Trace.TraceInformation( "起動所要時間: {0}", new object[] { span.ToString() } );\r
463                         }\r
464                 }\r
465                 //-----------------\r
466                 #endregion\r
467         }\r
468 }\r