OSDN Git Service

#36057 コンフィグまわりのリファクタ(リソース不完全なので注意)
[dtxmania/dtxmania.git] / 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 using System.Runtime.Serialization.Formatters.Binary;\r
9 \r
10 \r
11 namespace DTXMania\r
12 {\r
13         internal class CStage起動 : CStage\r
14         {\r
15                 // コンストラクタ\r
16 \r
17                 public CStage起動()\r
18                 {\r
19                         base.eステージID = CStage.Eステージ.起動;\r
20                         base.b活性化してない = true;\r
21                 }\r
22 \r
23                 public List<string> list進行文字列;\r
24 \r
25                 // CStage 実装\r
26 \r
27                 public override void On活性化()\r
28                 {\r
29                         Trace.TraceInformation("起動ステージを活性化します。");\r
30                         Trace.Indent();\r
31                         try\r
32                         {\r
33                                 this.list進行文字列 = new List<string>();\r
34                                 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;\r
35                                 base.On活性化();\r
36                                 Trace.TraceInformation("起動ステージの活性化を完了しました。");\r
37                         }\r
38                         finally\r
39                         {\r
40                                 Trace.Unindent();\r
41                         }\r
42                 }\r
43                 public override void On非活性化()\r
44                 {\r
45                         Trace.TraceInformation("起動ステージを非活性化します。");\r
46                         Trace.Indent();\r
47                         try\r
48                         {\r
49                                 this.list進行文字列 = null;\r
50                                 if (es != null)\r
51                                 {\r
52                                         if ((es.thDTXFileEnumerate != null) && es.thDTXFileEnumerate.IsAlive)\r
53                                         {\r
54                                                 Trace.TraceWarning("リスト構築スレッドを強制停止します。");\r
55                                                 es.thDTXFileEnumerate.Abort();\r
56                                                 es.thDTXFileEnumerate.Join();\r
57                                         }\r
58                                 }\r
59                                 base.On非活性化();\r
60                                 Trace.TraceInformation("起動ステージの非活性化を完了しました。");\r
61                         }\r
62                         finally\r
63                         {\r
64                                 Trace.Unindent();\r
65                         }\r
66                 }\r
67                 public override void OnManagedリソースの作成()\r
68                 {\r
69                         if (!base.b活性化してない)\r
70                         {\r
71                                 this.tx背景 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\ScreenSetup background.jpg"), false);\r
72                                 base.OnManagedリソースの作成();\r
73                         }\r
74                 }\r
75                 public override void OnManagedリソースの解放()\r
76                 {\r
77                         if (!base.b活性化してない)\r
78                         {\r
79                                 TextureFactory.tテクスチャの解放(ref this.tx背景);\r
80                                 base.OnManagedリソースの解放();\r
81                         }\r
82                 }\r
83                 public override int On進行描画()\r
84                 {\r
85                         if (!base.b活性化してない)\r
86                         {\r
87                                 if (base.b初めての進行描画)\r
88                                 {\r
89                                         this.list進行文字列.Add("DTXMania powered by YAMAHA Silent Session Drums\n");\r
90                                         this.list進行文字列.Add("Release: " + CDTXMania.VERSION + " [" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString() + "]");\r
91 \r
92                                         es = new CEnumSongs();\r
93                                         es.StartEnumFromCache();                    // 曲リスト取得(別スレッドで実行される)\r
94                                         base.b初めての進行描画 = false;\r
95                                         return 0;\r
96                                 }\r
97 \r
98                                 // CSongs管理 s管理 = CDTXMania.Instance.Songs管理;\r
99 \r
100                                 if (this.tx背景 != null)\r
101                                         this.tx背景.t2D描画(CDTXMania.Instance.Device, 0, 0);\r
102 \r
103                                 #region [ this.str現在進行中 の決定 ]\r
104                                 //-----------------\r
105                                 switch (base.eフェーズID)\r
106                                 {\r
107                                         case CStage.Eフェーズ.起動0_システムサウンドを構築:\r
108                                                 this.str現在進行中 = "Loading system sounds ... ";\r
109                                                 break;\r
110 \r
111                                         case CStage.Eフェーズ.起動00_songlistから曲リストを作成する:\r
112                                                 this.str現在進行中 = "Loading songlist.db ... ";\r
113                                                 break;\r
114 \r
115                                         case CStage.Eフェーズ.起動1_SongsDBからスコアキャッシュを構築:\r
116                                                 this.str現在進行中 = "Loading songs.db ... ";\r
117                                                 break;\r
118 \r
119                                         case CStage.Eフェーズ.起動2_曲を検索してリストを作成する:\r
120                                                 this.str現在進行中 = string.Format("{0} ... {1}", "Enumerating songs", es.Songs管理.n検索されたスコア数);\r
121                                                 break;\r
122 \r
123                                         case CStage.Eフェーズ.起動3_スコアキャッシュをリストに反映する:\r
124                                                 this.str現在進行中 = string.Format("{0} ... {1}/{2}", "Loading score properties from songs.db", es.Songs管理.nスコアキャッシュから反映できたスコア数, es.Songs管理.n検索されたスコア数);\r
125                                                 break;\r
126 \r
127                                         case CStage.Eフェーズ.起動4_スコアキャッシュになかった曲をファイルから読み込んで反映する:\r
128                                                 this.str現在進行中 = string.Format("{0} ... {1}/{2}", "Loading score properties from files", es.Songs管理.nファイルから反映できたスコア数, es.Songs管理.n検索されたスコア数 - es.Songs管理.nスコアキャッシュから反映できたスコア数);\r
129                                                 break;\r
130 \r
131                                         case CStage.Eフェーズ.起動5_曲リストへ後処理を適用する:\r
132                                                 this.str現在進行中 = string.Format("{0} ... ", "Building songlists");\r
133                                                 break;\r
134 \r
135                                         case CStage.Eフェーズ.起動6_スコアキャッシュをSongsDBに出力する:\r
136                                                 this.str現在進行中 = string.Format("{0} ... ", "Saving songs.db");\r
137                                                 break;\r
138 \r
139                                         case CStage.Eフェーズ.起動7_完了:\r
140                                                 this.str現在進行中 = "Setup done.";\r
141                                                 break;\r
142                                 }\r
143                                 //-----------------\r
144                                 #endregion\r
145                                 #region [ this.list進行文字列+this.現在進行中 の表示 ]\r
146                                 //-----------------\r
147                                 lock (this.list進行文字列)\r
148                                 {\r
149                                         int x = 0;\r
150                                         int y = 0;\r
151                                         foreach (string str in this.list進行文字列)\r
152                                         {\r
153                                                 CDTXMania.Instance.act文字コンソール.tPrint(x, y, C文字コンソール.Eフォント種別.灰細, str);\r
154                                                 y += 14 * 2;\r
155                                         }\r
156                                         CDTXMania.Instance.act文字コンソール.tPrint(x, y, C文字コンソール.Eフォント種別.灰細, this.str現在進行中);\r
157                                 }\r
158                                 //-----------------\r
159                                 #endregion\r
160 \r
161                                 if (es != null && es.IsSongListEnumCompletelyDone)              // 曲リスト作成が終わったら\r
162                                 {\r
163                                         CDTXMania.Instance.Songs管理 = (es != null) ? es.Songs管理 : null;    // 最後に、曲リストを拾い上げる\r
164                                         return 1;\r
165                                 }\r
166                         }\r
167                         return 0;\r
168                 }\r
169 \r
170 \r
171                 // その他\r
172 \r
173                 #region [ private ]\r
174                 //-----------------\r
175                 private string str現在進行中 = "";\r
176                 private CTexture tx背景;\r
177                 private CEnumSongs es;\r
178 \r
179 #if false\r
180                 private void t曲リストの構築()\r
181                 {\r
182                         // !注意!\r
183                         // 本メソッドは別スレッドで動作するが、プラグイン側でカレントディレクトリを変更しても大丈夫なように、\r
184                         // すべてのファイルアクセスは「絶対パス」で行うこと。(2010.9.16)\r
185 \r
186                         DateTime now = DateTime.Now;\r
187                         string strPathSongsDB = CDTXMania.Instance.strEXEのあるフォルダ + "songs.db";\r
188                         string strPathSongList = CDTXMania.Instance.strEXEのあるフォルダ + "songlist.db";\r
189 \r
190                         try\r
191                         {\r
192                 #region [ 0) システムサウンドの構築  ]\r
193                                 //-----------------------------\r
194                                 base.eフェーズID = CStage.Eフェーズ.起動0_システムサウンドを構築;\r
195 \r
196                                 Trace.TraceInformation( "0) システムサウンドを構築します。" );\r
197                                 Trace.Indent();\r
198 \r
199                                 try\r
200                                 {\r
201                                         for( int i = 0; i < CDTXMania.Instance.Skin.nシステムサウンド数; i++ )\r
202                                         {\r
203                                                 CSkin.Cシステムサウンド cシステムサウンド = CDTXMania.Instance.Skin[ i ];\r
204                                                 if( !CDTXMania.Instance.bコンパクトモード || cシステムサウンド.bCompact対象 )\r
205                                                 {\r
206                                                         try\r
207                                                         {\r
208                                                                 cシステムサウンド.t読み込み();\r
209                                                                 Trace.TraceInformation( "システムサウンドを読み込みました。({0})", new object[] { cシステムサウンド.strファイル名 } );\r
210                                                                 if( ( cシステムサウンド == CDTXMania.Instance.Skin.bgm起動画面 ) && cシステムサウンド.b読み込み成功 )\r
211                                                                 {\r
212                                                                         cシステムサウンド.t再生する();\r
213                                                                 }\r
214                                                         }\r
215                                                         catch( FileNotFoundException )\r
216                                                         {\r
217                                                                 Trace.TraceWarning( "システムサウンドが存在しません。({0})", new object[] { cシステムサウンド.strファイル名 } );\r
218                                                         }\r
219                                                         catch( Exception exception )\r
220                                                         {\r
221                                                                 Trace.TraceError( exception.Message );\r
222                                                                 Trace.TraceWarning( "システムサウンドの読み込みに失敗しました。({0})", new object[] { cシステムサウンド.strファイル名 } );\r
223                                                         }\r
224                                                 }\r
225                                         }\r
226                                         lock( this.list進行文字列 )\r
227                                         {\r
228                                                 this.list進行文字列.Add( "Loading system sounds ... OK " );\r
229                                         }\r
230                                 }\r
231                                 finally\r
232                                 {\r
233                                         Trace.Unindent();\r
234                                 }\r
235                                 //-----------------------------\r
236                 #endregion\r
237 \r
238                                 if( CDTXMania.Instance.bコンパクトモード )\r
239                                 {\r
240                                         Trace.TraceInformation( "コンパクトモードなので残りの起動処理は省略します。" );\r
241                                         return;\r
242                                 }\r
243 \r
244                 #region [ 00) songlist.dbの読み込みによる曲リストの構築  ]\r
245                                 //-----------------------------\r
246                                 base.eフェーズID = CStage.Eフェーズ.起動00_songlistから曲リストを作成する;\r
247 \r
248                                 Trace.TraceInformation( "1) songlist.dbを読み込みます。" );\r
249                                 Trace.Indent();\r
250 \r
251                                 try\r
252                                 {\r
253                                         if ( !CDTXMania.Instance.ConfigIni.bConfigIniがないかDTXManiaのバージョンが異なる )\r
254                                         {\r
255                                                 try\r
256                                                 {\r
257                                                         CDTXMania.Instance.Songs管理.tSongListDBを読み込む( strPathSongList );\r
258                                                 }\r
259                                                 catch\r
260                                                 {\r
261                                                         Trace.TraceError( "songlist.db の読み込みに失敗しました。" );\r
262                                                 }\r
263 \r
264                                                 int scores = ( CDTXMania.Instance.Songs管理 == null ) ? 0 : CDTXMania.Instance.Songs管理.n検索されたスコア数;              // 読み込み途中でアプリ終了した場合など、CDTXMania.Instance.Songs管理 がnullの場合があるので注意\r
265                                                 Trace.TraceInformation( "songlist.db の読み込みを完了しました。[{0}スコア]", scores );\r
266                                                 lock ( this.list進行文字列 )\r
267                                                 {\r
268                                                         this.list進行文字列.Add( "Loading songlist.db ... OK" );\r
269                                                 }\r
270                                         }\r
271                                         else\r
272                                         {\r
273                                                 Trace.TraceInformation( "初回の起動であるかまたはDTXManiaのバージョンが上がったため、songlist.db の読み込みをスキップします。" );\r
274                                                 lock ( this.list進行文字列 )\r
275                                                 {\r
276                                                         this.list進行文字列.Add( "Loading songlist.db ... Skip" );\r
277                                                 }\r
278                                         }\r
279                                 }\r
280                                 finally\r
281                                 {\r
282                                         Trace.Unindent();\r
283                                 }\r
284 \r
285                 #endregion\r
286 \r
287                 #region [ 1) songs.db の読み込み ]\r
288                                 //-----------------------------\r
289                                 base.eフェーズID = CStage.Eフェーズ.起動1_SongsDBからスコアキャッシュを構築;\r
290 \r
291                                 Trace.TraceInformation( "2) songs.db を読み込みます。" );\r
292                                 Trace.Indent();\r
293 \r
294                                 try\r
295                                 {\r
296                                         if ( !CDTXMania.Instance.ConfigIni.bConfigIniがないかDTXManiaのバージョンが異なる )\r
297                                         {\r
298                                                 try\r
299                                                 {\r
300                                                         CDTXMania.Instance.Songs管理.tSongsDBを読み込む( strPathSongsDB );\r
301                                                 }\r
302                                                 catch\r
303                                                 {\r
304                                                         Trace.TraceError( "songs.db の読み込みに失敗しました。" );\r
305                                                 }\r
306 \r
307                                                 int scores = ( CDTXMania.Instance.Songs管理 == null ) ? 0 : CDTXMania.Instance.Songs管理.nSongsDBから取得できたスコア数; // 読み込み途中でアプリ終了した場合など、CDTXMania.Instance.Songs管理 がnullの場合があるので注意\r
308                                                 Trace.TraceInformation( "songs.db の読み込みを完了しました。[{0}スコア]", scores );\r
309                                                 lock ( this.list進行文字列 )\r
310                                                 {\r
311                                                         this.list進行文字列.Add( "Loading songs.db ... OK" );\r
312                                                 }\r
313                                         }\r
314                                         else\r
315                                         {\r
316                                                 Trace.TraceInformation( "初回の起動であるかまたはDTXManiaのバージョンが上がったため、songs.db の読み込みをスキップします。" );\r
317                                                 lock ( this.list進行文字列 )\r
318                                                 {\r
319                                                         this.list進行文字列.Add( "Loading songs.db ... Skip" );\r
320                                                 }\r
321                                         }\r
322                                 }\r
323                                 finally\r
324                                 {\r
325                                         Trace.Unindent();\r
326                                 }\r
327                                 //-----------------------------\r
328                 #endregion\r
329 \r
330                         }\r
331                         finally\r
332                         {\r
333                                 base.eフェーズID = CStage.Eフェーズ.起動7_完了;\r
334                                 TimeSpan span = (TimeSpan) ( DateTime.Now - now );\r
335                                 Trace.TraceInformation( "起動所要時間: {0}", new object[] { span.ToString() } );\r
336                         }\r
337                 }\r
338 #endif\r
339                 #endregion\r
340         }\r
341 }\r