2 using System.Collections.Generic;
\r
4 using System.Diagnostics;
\r
5 using System.Threading;
\r
11 internal class CStage起動 : CStage
\r
17 base.eステージID = CStage.Eステージ.起動;
\r
18 base.b活性化してない = true;
\r
24 public override void On活性化()
\r
26 Trace.TraceInformation( "起動ステージを活性化します。" );
\r
30 this.list進行文字列 = new List<string>();
\r
31 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
33 Trace.TraceInformation( "起動ステージの活性化を完了しました。" );
\r
40 public override void On非活性化()
\r
42 Trace.TraceInformation( "起動ステージを非活性化します。" );
\r
46 this.list進行文字列 = null;
\r
47 if( ( this.thリスト構築 != null ) && this.thリスト構築.IsAlive )
\r
49 Trace.TraceWarning( "リスト構築スレッドを強制停止します。" );
\r
50 this.thリスト構築.Abort();
\r
51 this.thリスト構築.Join();
\r
54 Trace.TraceInformation( "起動ステージの非活性化を完了しました。" );
\r
61 public override void OnManagedリソースの作成()
\r
63 if( !base.b活性化してない )
\r
65 this.tx背景 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenSetup background.jpg" ), false );
\r
66 base.OnManagedリソースの作成();
\r
69 public override void OnManagedリソースの解放()
\r
71 if( !base.b活性化してない )
\r
73 CDTXMania.tテクスチャの解放( ref this.tx背景 );
\r
74 base.OnManagedリソースの解放();
\r
77 public override int On進行描画()
\r
79 if( !base.b活性化してない )
\r
81 if( base.b初めての進行描画 )
\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
93 CSongs管理 s管理 = CDTXMania.Songs管理;
\r
95 if( this.tx背景 != null )
\r
96 this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );
\r
98 #region [ this.str現在進行中 の決定 ]
\r
100 switch( base.eフェーズID )
\r
102 case CStage.Eフェーズ.起動0_システムサウンドを構築:
\r
103 this.str現在進行中 = "Loading system sounds ... ";
\r
106 case CStage.Eフェーズ.起動1_SongsDBからスコアキャッシュを構築:
\r
107 this.str現在進行中 = "Loading songs.db ... ";
\r
110 case CStage.Eフェーズ.起動2_曲を検索してリストを作成する:
\r
111 this.str現在進行中 = string.Format( "{0} ... {1}", "Enumerating songs", s管理.n検索されたスコア数 );
\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
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
122 case CStage.Eフェーズ.起動5_曲リストへ後処理を適用する:
\r
123 this.str現在進行中 = string.Format( "{0} ... ", "Building songlists" );
\r
126 case CStage.Eフェーズ.起動6_スコアキャッシュをSongsDBに出力する:
\r
127 this.str現在進行中 = string.Format( "{0} ... ", "Saving songs.db" );
\r
130 case CStage.Eフェーズ.起動7_完了:
\r
131 this.str現在進行中 = "Setup done.";
\r
134 //-----------------
\r
136 #region [ this.list進行文字列+this.現在進行中 の表示 ]
\r
137 //-----------------
\r
138 lock( this.list進行文字列 )
\r
142 foreach( string str in this.list進行文字列 )
\r
144 CDTXMania.act文字コンソール.tPrint( x, y, C文字コンソール.Eフォント種別.灰細, str );
\r
147 CDTXMania.act文字コンソール.tPrint( x, y, C文字コンソール.Eフォント種別.灰細, this.str現在進行中 );
\r
149 //-----------------
\r
152 if( !this.thリスト構築.IsAlive )
\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
178 private void t曲リストの構築()
\r
181 // 本メソッドは別スレッドで動作するが、プラグイン側でカレントディレクトリを変更しても大丈夫なように、
\r
182 // すべてのファイルアクセスは「絶対パス」で行うこと。(2010.9.16)
\r
184 DateTime now = DateTime.Now;
\r
185 string str = CDTXMania.strEXEのあるフォルダ + "songs.db";
\r
189 #region [ 0) システムサウンドの構築 ]
\r
190 //-----------------------------
\r
191 base.eフェーズID = CStage.Eフェーズ.起動0_システムサウンドを構築;
\r
193 Trace.TraceInformation( "0) システムサウンドを構築します。" );
\r
198 for( int i = 0; i < CDTXMania.Skin.nシステムサウンド数; i++ )
\r
200 CSkin.Cシステムサウンド cシステムサウンド = CDTXMania.Skin[ i ];
\r
201 if( !CDTXMania.bコンパクトモード || cシステムサウンド.bCompact対象 )
\r
206 Trace.TraceInformation( "システムサウンドを読み込みました。({0})", new object[] { cシステムサウンド.strファイル名 } );
\r
207 if( ( cシステムサウンド == CDTXMania.Skin.bgm起動画面 ) && cシステムサウンド.b読み込み成功 )
\r
212 catch( FileNotFoundException )
\r
214 Trace.TraceWarning( "システムサウンドが存在しません。({0})", new object[] { cシステムサウンド.strファイル名 } );
\r
216 catch( Exception exception )
\r
218 Trace.TraceError( exception.Message );
\r
219 Trace.TraceWarning( "システムサウンドの読み込みに失敗しました。({0})", new object[] { cシステムサウンド.strファイル名 } );
\r
223 lock( this.list進行文字列 )
\r
225 this.list進行文字列.Add( "Loading system sounds ... OK " );
\r
232 //-----------------------------
\r
235 if( CDTXMania.bコンパクトモード )
\r
237 Trace.TraceInformation( "コンパクトモードなので残りの起動処理は省略します。" );
\r
241 #region [ 1) songs.db の読み込み ]
\r
242 //-----------------------------
\r
243 base.eフェーズID = CStage.Eフェーズ.起動1_SongsDBからスコアキャッシュを構築;
\r
245 Trace.TraceInformation( "1) songs.db を読み込みます。" );
\r
250 if( !CDTXMania.ConfigIni.bConfigIniがないかDTXManiaのバージョンが異なる )
\r
254 CDTXMania.Songs管理.tSongsDBを読み込む( str );
\r
258 Trace.TraceError( "songs.db の読み込みに失敗しました。" );
\r
260 Trace.TraceInformation( "songs.db の読み込みを完了しました。[{0}スコア]", new object[] { CDTXMania.Songs管理.nSongsDBから取得できたスコア数 } );
\r
261 lock( this.list進行文字列 )
\r
263 this.list進行文字列.Add( "Loading songs.db ... OK" );
\r
268 Trace.TraceInformation( "初回の起動であるかまたはDTXManiaのバージョンが上がったため、songs.db の読み込みをスキップします。" );
\r
269 lock( this.list進行文字列 )
\r
271 this.list進行文字列.Add( "Loading songs.db ... Skip" );
\r
279 //-----------------------------
\r
281 #region [ 2) 曲データの検索 ]
\r
282 //-----------------------------
\r
283 base.eフェーズID = CStage.Eフェーズ.起動2_曲を検索してリストを作成する;
\r
285 Trace.TraceInformation( "2) 曲データを検索します。" );
\r
290 if( !string.IsNullOrEmpty( CDTXMania.ConfigIni.str曲データ検索パス ) )
\r
292 string[] strArray = CDTXMania.ConfigIni.str曲データ検索パス.Split( new char[] { ';' } );
\r
293 if( strArray.Length > 0 )
\r
296 foreach( string str2 in strArray )
\r
298 string path = str2;
\r
299 if( !Path.IsPathRooted( path ) )
\r
301 path = CDTXMania.strEXEのあるフォルダ + str2; // 相対パスの場合、絶対パスに直す(2010.9.16)
\r
304 if( !string.IsNullOrEmpty( path ) )
\r
306 Trace.TraceInformation( "検索パス: " + path );
\r
311 CDTXMania.Songs管理.t曲を検索してリストを作成する( path, true );
\r
313 catch( Exception exception2 )
\r
315 Trace.TraceError( exception2.Message );
\r
316 Trace.TraceError( exception2.StackTrace );
\r
317 Trace.TraceError( "例外が発生しましたが処理を継続します。" );
\r
329 Trace.TraceWarning( "曲データの検索パス(DTXPath)の指定がありません。" );
\r
334 Trace.TraceInformation( "曲データの検索を完了しました。[{0}曲{1}スコア]", new object[] { CDTXMania.Songs管理.n検索された曲ノード数, CDTXMania.Songs管理.n検索されたスコア数 } );
\r
337 lock( this.list進行文字列 )
\r
339 this.list進行文字列.Add( string.Format( "{0} ... {1} scores ({2} songs)", "Enumerating songs", CDTXMania.Songs管理.n検索されたスコア数, CDTXMania.Songs管理.n検索された曲ノード数 ) );
\r
341 //-----------------------------
\r
343 #region [ 3) songs.db 情報の曲リストへの反映 ]
\r
344 //-----------------------------
\r
345 base.eフェーズID = CStage.Eフェーズ.起動3_スコアキャッシュをリストに反映する;
\r
347 Trace.TraceInformation( "3) songs.db の情報を曲リストへ反映します。" );
\r
352 CDTXMania.Songs管理.tスコアキャッシュを曲リストに反映する();
\r
354 catch( Exception exception3 )
\r
356 Trace.TraceError( exception3.Message );
\r
357 Trace.TraceError( exception3.StackTrace );
\r
358 Trace.TraceError( "例外が発生しましたが処理を継続します。" );
\r
362 Trace.TraceInformation( "曲リストへの反映を完了しました。[{0}/{1}スコア]", new object[] { CDTXMania.Songs管理.nスコアキャッシュから反映できたスコア数, CDTXMania.Songs管理.n検索されたスコア数 } );
\r
365 lock( this.list進行文字列 )
\r
367 this.list進行文字列.Add( string.Format( "{0} ... {1}/{2}", "Loading score properties from songs.db", CDTXMania.Songs管理.nスコアキャッシュから反映できたスコア数, CDTXMania.Songs管理.n検索されたスコア数 ) );
\r
369 //-----------------------------
\r
371 #region [ 4) songs.db になかった曲データをファイルから読み込んで反映 ]
\r
372 //-----------------------------
\r
373 base.eフェーズID = CStage.Eフェーズ.起動4_スコアキャッシュになかった曲をファイルから読み込んで反映する;
\r
375 int num2 = CDTXMania.Songs管理.n検索されたスコア数 - CDTXMania.Songs管理.nスコアキャッシュから反映できたスコア数;
\r
377 Trace.TraceInformation( "4) songs.db になかった曲データ[{0}スコア]の情報をファイルから読み込んで反映します。", new object[] { num2 } );
\r
382 CDTXMania.Songs管理.tSongsDBになかった曲をファイルから読み込んで反映する();
\r
384 catch( Exception exception4 )
\r
386 Trace.TraceError( exception4.Message );
\r
387 Trace.TraceError( exception4.StackTrace );
\r
388 Trace.TraceError( "例外が発生しましたが処理を継続します。" );
\r
392 Trace.TraceInformation( "曲データへの反映を完了しました。[{0}/{1}スコア]", new object[] { CDTXMania.Songs管理.nファイルから反映できたスコア数, num2 } );
\r
395 lock( this.list進行文字列 )
\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
399 //-----------------------------
\r
401 #region [ 5) 曲リストへの後処理の適用 ]
\r
402 //-----------------------------
\r
403 base.eフェーズID = CStage.Eフェーズ.起動5_曲リストへ後処理を適用する;
\r
405 Trace.TraceInformation( "5) 曲リストへの後処理を適用します。" );
\r
410 CDTXMania.Songs管理.t曲リストへ後処理を適用する();
\r
412 catch( Exception exception5 )
\r
414 Trace.TraceError( exception5.Message );
\r
415 Trace.TraceError( exception5.StackTrace );
\r
416 Trace.TraceError( "例外が発生しましたが処理を継続します。" );
\r
420 Trace.TraceInformation( "曲リストへの後処理を完了しました。" );
\r
423 lock( this.list進行文字列 )
\r
425 this.list進行文字列.Add( string.Format( "{0} ... OK", "Building songlists" ) );
\r
427 //-----------------------------
\r
429 #region [ 6) songs.db への保存 ]
\r
430 //-----------------------------
\r
431 base.eフェーズID = CStage.Eフェーズ.起動6_スコアキャッシュをSongsDBに出力する;
\r
433 Trace.TraceInformation( "6) 曲データの情報を songs.db へ出力します。" );
\r
438 CDTXMania.Songs管理.tスコアキャッシュをSongsDBに出力する( str );
\r
440 catch( Exception exception6 )
\r
442 Trace.TraceError( exception6.Message );
\r
443 Trace.TraceError( exception6.StackTrace );
\r
444 Trace.TraceError( "例外が発生しましたが処理を継続します。" );
\r
448 Trace.TraceInformation( "songs.db への出力を完了しました。[{0}スコア]", new object[] { CDTXMania.Songs管理.nSongsDBへ出力できたスコア数 } );
\r
451 lock( this.list進行文字列 )
\r
453 this.list進行文字列.Add( string.Format( "{0} ... OK", "Saving songs.db" ) );
\r
455 //-----------------------------
\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
465 //-----------------
\r