OSDN Git Service

525d7cb7fcf8b9539c3d629403177a040f564ccf
[dtxmaniaxg-verk/dtxmaniaxg-verk-git.git] / DTXManiaプロジェクト / コード / ステージ / 06.曲読み込み / CStage曲読み込み.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Diagnostics;
5 using System.Drawing;
6 using System.IO;
7 using SlimDX;
8 using System.Drawing.Text;
9 using System.Runtime.InteropServices;
10 using FDK;
11
12 namespace DTXMania
13 {
14         internal class CStage曲読み込み : CStage
15         {
16                 // コンストラクタ
17
18                 public CStage曲読み込み()
19                 {
20                         base.eステージID = CStage.Eステージ.曲読み込み;
21                         base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
22                         base.b活性化してない = true;
23                         base.list子Activities.Add( this.actFI = new CActFIFOBlack() ); // #27787 2012.3.10 yyagi 曲読み込み画面のフェードインの省略
24                         base.list子Activities.Add( this.actFO = new CActFIFOBlack() );
25                 }
26
27
28                 // CStage 実装
29
30                 public override void On活性化()
31                 {
32                         Trace.TraceInformation( "曲読み込みステージを活性化します。" );
33                         Trace.Indent();
34                         try
35                         {
36                                 this.str曲タイトル = "";
37                                 this.strSTAGEFILE = "";
38                                 this.b音符を表示する = false;
39                                 this.n音符の表示位置X = 0x308;
40                                 this.ftタイトル表示用フォント = new Font( "MS PGothic", fFontSizeTitle * Scale.Y, GraphicsUnit.Pixel );
41                                 this.nBGM再生開始時刻 = -1;
42                                 this.nBGMの総再生時間ms = 0;
43                                 if( this.sd読み込み音 != null )
44                                 {
45                                         CDTXMania.Sound管理.tサウンドを破棄する( this.sd読み込み音 );
46                                         this.sd読み込み音 = null;
47                                 }
48
49                                 string strDTXファイルパス = ( CDTXMania.bコンパクトモード ) ?
50                                         CDTXMania.strコンパクトモードファイル : CDTXMania.stage選曲.r確定されたスコア.ファイル情報.ファイルの絶対パス;
51                                 
52                                 CDTX cdtx = new CDTX( strDTXファイルパス, true );
53                                 this.str曲タイトル = cdtx.TITLE;
54                                 if( ( ( cdtx.STAGEFILE != null ) && ( cdtx.STAGEFILE.Length > 0 ) ) && ( File.Exists( cdtx.strフォルダ名 + cdtx.STAGEFILE ) && !CDTXMania.ConfigIni.bストイックモード ) )
55                                 {
56                                         this.strSTAGEFILE = cdtx.strフォルダ名 + cdtx.PATH + cdtx.STAGEFILE;
57                                         this.b音符を表示する = false;
58                                 }
59                                 else
60                                 {
61                                         this.strSTAGEFILE = CSkin.Path( @"Graphics\\6_background.png" );
62                                         this.b音符を表示する = true;
63                                 }
64                                 if( ( ( cdtx.SOUND_NOWLOADING != null ) && ( cdtx.SOUND_NOWLOADING.Length > 0 ) ) && File.Exists( cdtx.strフォルダ名 + cdtx.SOUND_NOWLOADING ) )
65                                 {
66                                         string strNowLoadingサウンドファイルパス = cdtx.strフォルダ名 + cdtx.PATH + cdtx.SOUND_NOWLOADING;
67                                         try
68                                         {
69                                                 this.sd読み込み音 = CDTXMania.Sound管理.tサウンドを生成する( strNowLoadingサウンドファイルパス );
70                                         }
71                                         catch
72                                         {
73                                                 Trace.TraceError( "#SOUND_NOWLOADING に指定されたサウンドファイルの読み込みに失敗しました。({0})", strNowLoadingサウンドファイルパス );
74                                         }
75                                 }
76
77                 // #35411 2015.08.19 chnmr0 add
78                 // Read ghost data by config
79                 // It does not exist a ghost file for 'perfect' actually
80                 string [] inst = {"dr", "gt", "bs"};
81                                 if( CDTXMania.ConfigIni.bIsSwappedGuitarBass )
82                                 {
83                                         inst[1] = "bs";
84                                         inst[2] = "gt";
85                                 }
86                 
87                 for(int instIndex = 0; instIndex < inst.Length; ++instIndex)
88                 {
89                     bool readAutoGhostCond = false;
90                     readAutoGhostCond |= instIndex == 0 ? CDTXMania.ConfigIni.bドラムが全部オートプレイである : false;
91                     readAutoGhostCond |= instIndex == 1 ? CDTXMania.ConfigIni.bギターが全部オートプレイである : false;
92                     readAutoGhostCond |= instIndex == 2 ? CDTXMania.ConfigIni.bベースが全部オートプレイである : false;
93
94                     CDTXMania.listTargetGhsotLag[instIndex] = null;
95                     CDTXMania.listAutoGhostLag[instIndex] = null;
96                     CDTXMania.listTargetGhostScoreData[instIndex] = null;
97                     this.nCurrentInst = instIndex;
98
99                     if ( readAutoGhostCond )
100                     {
101                         string[] prefix = { "perfect", "lastplay", "hiskill", "hiscore", "online" };
102                         int indPrefix = (int)CDTXMania.ConfigIni.eAutoGhost[instIndex];
103                         string filename = cdtx.strフォルダ名 + "\\" + cdtx.strファイル名 + "." + prefix[indPrefix] + "." + inst[instIndex] + ".ghost";
104                         if ( File.Exists(filename) )
105                         {
106                             CDTXMania.listAutoGhostLag[instIndex] = new List<int>();
107                             CDTXMania.listTargetGhostScoreData[ instIndex ] = new CScoreIni.C演奏記録();
108                             ReadGhost(filename, CDTXMania.listAutoGhostLag[instIndex]);
109                         }
110                     }
111
112                     if( CDTXMania.ConfigIni.eTargetGhost[instIndex] != ETargetGhostData.NONE )
113                     {
114                         string[] prefix = { "none", "perfect", "lastplay", "hiskill", "hiscore", "online" };
115                         int indPrefix = (int)CDTXMania.ConfigIni.eTargetGhost[instIndex];
116                         string filename = cdtx.strフォルダ名 + "\\" + cdtx.strファイル名 + "." + prefix[indPrefix] + "." + inst[instIndex] + ".ghost";
117                         if (File.Exists(filename))
118                         {
119                             CDTXMania.listTargetGhsotLag[instIndex] = new List<int>();
120                             CDTXMania.listTargetGhostScoreData[ instIndex ] = new CScoreIni.C演奏記録();
121                             this.stGhostLag[instIndex] = new List<STGhostLag>();
122                             ReadGhost(filename, CDTXMania.listTargetGhsotLag[instIndex]);
123                         }
124                         else if( CDTXMania.ConfigIni.eTargetGhost[instIndex] == ETargetGhostData.PERFECT )
125                         {
126                             // All perfect
127                             CDTXMania.listTargetGhsotLag[instIndex] = new List<int>();
128                         }
129                     }
130                 }
131
132                                 cdtx.On非活性化();
133                                 base.On活性化();
134                         }
135                         finally
136                         {
137                                 Trace.TraceInformation( "曲読み込みステージの活性化を完了しました。" );
138                                 Trace.Unindent();
139                         }
140                 }
141
142         private void ReadGhost(string filename, List<int> list) // #35411 2015.08.19 chnmr0 add
143         {
144             if (File.Exists(filename))
145             {
146                 using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
147                 {
148                     using (BinaryReader br = new BinaryReader(fs))
149                     {
150                         try
151                         {
152                             int cnt = br.ReadInt32();
153                             for (int i = 0; i < cnt; ++i)
154                             {
155                                 short lag = br.ReadInt16();
156                                 list.Add(lag);
157                             }
158                         }
159                         catch( EndOfStreamException )
160                         {
161                             Trace.TraceInformation("ゴーストデータは正しく読み込まれませんでした。");
162                             list.Clear();
163                         }
164                     }
165                 }
166             }
167
168             //if( File.Exists( filename + ".score" ) )
169             //{
170             //    using( FileStream fs = new FileStream( filename + ".score", FileMode.Open, FileAccess.Read ) )
171             //    {
172             //        using( StreamReader sr = new StreamReader( fs ) )
173             //        {
174             //            try
175             //            {
176             //                string strScoreDataFile = sr.ReadToEnd();
177
178             //                strScoreDataFile = strScoreDataFile.Replace( Environment.NewLine, "\n" );
179             //                string[] delimiter = { "\n" };
180             //                string[] strSingleLine = strScoreDataFile.Split( delimiter, StringSplitOptions.RemoveEmptyEntries );
181
182             //                for( int i = 0; i < strSingleLine.Length; i++ )
183             //                {
184             //                    string[] strA = strSingleLine[ i ].Split( '=' );
185             //                    if (strA.Length != 2)
186             //                        continue;
187
188             //                    switch( strA[ 0 ] )
189             //                    {
190             //                        case "Score":
191             //                            CDTXMania.listTargetGhostScoreData[ (int)this.nCurrentInst ].nスコア = Convert.ToInt32( strA[ 1 ] );
192             //                            continue;
193             //                        case "PlaySkill":
194             //                            CDTXMania.listTargetGhostScoreData[ (int)this.nCurrentInst ].db演奏型スキル値 = Convert.ToDouble( strA[ 1 ] );
195             //                            continue;
196             //                        case "Skill":
197             //                            CDTXMania.listTargetGhostScoreData[ (int)this.nCurrentInst ].dbゲーム型スキル値 = Convert.ToDouble( strA[ 1 ] );
198             //                            continue;
199             //                        case "Perfect":
200             //                            CDTXMania.listTargetGhostScoreData[ (int)this.nCurrentInst ].nPerfect数_Auto含まない = Convert.ToInt32( strA[ 1 ] );
201             //                            continue;
202             //                        case "Great":
203             //                            CDTXMania.listTargetGhostScoreData[ (int)this.nCurrentInst ].nGreat数_Auto含まない = Convert.ToInt32( strA[ 1 ] );
204             //                            continue;
205             //                        case "Good":
206             //                            CDTXMania.listTargetGhostScoreData[ (int)this.nCurrentInst ].nGood数_Auto含まない = Convert.ToInt32( strA[ 1 ] );
207             //                            continue;
208             //                        case "Poor":
209             //                            CDTXMania.listTargetGhostScoreData[ (int)this.nCurrentInst ].nPoor数_Auto含まない = Convert.ToInt32( strA[ 1 ] );
210             //                            continue;
211             //                        case "Miss":
212             //                            CDTXMania.listTargetGhostScoreData[ (int)this.nCurrentInst ].nMiss数_Auto含まない = Convert.ToInt32( strA[ 1 ] );
213             //                            continue;
214             //                        case "MaxCombo":
215             //                            CDTXMania.listTargetGhostScoreData[ (int)this.nCurrentInst ].n最大コンボ数 = Convert.ToInt32( strA[ 1 ] );
216             //                            continue;
217             //                        default:
218             //                            continue;
219             //                    }
220             //                }
221             //            }
222             //            catch( NullReferenceException )
223             //            {
224             //                Trace.TraceInformation("ゴーストデータの記録が正しく読み込まれませんでした。");
225             //            }
226             //            catch( EndOfStreamException )
227             //            {
228             //                Trace.TraceInformation("ゴーストデータの記録が正しく読み込まれませんでした。");
229             //            }
230             //        }
231             //    }
232             //}
233             //else
234             //{
235             //    CDTXMania.listTargetGhostScoreData[ (int)this.nCurrentInst ] = null;
236             //}
237         }
238
239                 public override void On非活性化()
240                 {
241                         Trace.TraceInformation( "曲読み込みステージを非活性化します。" );
242                         Trace.Indent();
243                         try
244                         {
245                                 if( this.ftタイトル表示用フォント != null )
246                                 {
247                                         this.ftタイトル表示用フォント.Dispose();
248                                         this.ftタイトル表示用フォント = null;
249                                 }
250                                 base.On非活性化();
251                         }
252                         finally
253                         {
254                                 Trace.TraceInformation( "曲読み込みステージの非活性化を完了しました。" );
255                                 Trace.Unindent();
256                         }
257                 }
258                 public override void OnManagedリソースの作成()
259                 {
260                         if( !base.b活性化してない )
261                         {
262                                 this.tx背景 = CDTXMania.tテクスチャの生成( this.strSTAGEFILE, false );
263
264                                 if ( !this.b音符を表示する && this.tx背景 != null )
265                                 {
266                                         this.tx背景.vc拡大縮小倍率 = new Vector3( Scale.X, Scale.Y, 1f );       // とりあえずFullHD化
267                                 }
268                                 base.OnManagedリソースの作成();
269                         }
270                 }
271                 public override void OnManagedリソースの解放()
272                 {
273                         if( !base.b活性化してない )
274                         {
275                                 CDTXMania.tテクスチャの解放( ref this.tx背景 );
276                                 base.OnManagedリソースの解放();
277                         }
278                 }
279                 public override int On進行描画()
280                 {
281                         string str;
282
283                         if( base.b活性化してない )
284                                 return 0;
285
286                         #region [ 初めての進行描画 ]
287                         //-----------------------------
288                         if( base.b初めての進行描画 )
289                         {
290                                 Cスコア cスコア1 = CDTXMania.stage選曲.r確定されたスコア;
291                                 if( this.sd読み込み音 != null )
292                                 {
293                                         if( CDTXMania.Skin.sound曲読込開始音.b排他 && ( CSkin.Cシステムサウンド.r最後に再生した排他システムサウンド != null ) )
294                                         {
295                                                 CSkin.Cシステムサウンド.r最後に再生した排他システムサウンド.t停止する();
296                                         }
297                                         this.sd読み込み音.t再生を開始する();
298                                         this.nBGM再生開始時刻 = CSound管理.rc演奏用タイマ.n現在時刻;
299                                         this.nBGMの総再生時間ms = this.sd読み込み音.n総演奏時間ms;
300                                 }
301                                 else
302                                 {
303                                         CDTXMania.Skin.sound曲読込開始音.t再生する();
304                                         this.nBGM再生開始時刻 = CSound管理.rc演奏用タイマ.n現在時刻;
305                                         this.nBGMの総再生時間ms = CDTXMania.Skin.sound曲読込開始音.n長さ_現在のサウンド;
306                                 }
307 //                              this.actFI.tフェードイン開始();                                                 // #27787 2012.3.10 yyagi 曲読み込み画面のフェードインの省略
308                                 base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;
309                                 base.b初めての進行描画 = false;
310
311                                 nWAVcount = 1;
312                                 bitmapFilename = new Bitmap( SampleFramework.GameWindowSize.Width, (int)(fFontSizeFilename * Scale.X) );
313                                 graphicsFilename = Graphics.FromImage( bitmapFilename );
314                                 graphicsFilename.TextRenderingHint = TextRenderingHint.AntiAlias;
315                                 ftFilename = new Font( "MS PGothic", fFontSizeFilename * Scale.X, FontStyle.Bold, GraphicsUnit.Pixel );
316                         }
317                         //-----------------------------
318                         #endregion
319
320                         #region [ ESC押下時は選曲画面に戻る ]
321                         if ( tキー入力() )
322                         {
323                                 if ( this.sd読み込み音 != null )
324                                 {
325                                         this.sd読み込み音.tサウンドを停止する();
326                                         this.sd読み込み音.t解放する();
327                                 }
328                                 return (int) E曲読込画面の戻り値.読込中止;
329                         }
330                         #endregion
331
332                         #region [ 背景表示 ]
333                         //-----------------------------
334                         if( this.tx背景 != null )
335                                 this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );
336                         //-----------------------------
337                         #endregion
338
339                         switch( base.eフェーズID )
340                         {
341                                 case CStage.Eフェーズ.共通_フェードイン:
342 //                                      if( this.actFI.On進行描画() != 0 )                                  // #27787 2012.3.10 yyagi 曲読み込み画面のフェードインの省略
343                                                                                                                                                 // 必ず一度「CStaeg.Eフェーズ.共通_フェードイン」フェーズを経由させること。
344                                                                                                                                                 // さもないと、曲読み込みが完了するまで、曲読み込み画面が描画されない。
345                                                 base.eフェーズID = CStage.Eフェーズ.NOWLOADING_DTXファイルを読み込む;
346                                         return (int) E曲読込画面の戻り値.継続;
347
348                                 case CStage.Eフェーズ.NOWLOADING_DTXファイルを読み込む:
349                                         {
350                                                 timeBeginLoad = DateTime.Now;
351                                                 TimeSpan span;
352                                                 str = null;
353                                                 if( !CDTXMania.bコンパクトモード )
354                                                         str = CDTXMania.stage選曲.r確定されたスコア.ファイル情報.ファイルの絶対パス;
355                                                 else
356                                                         str = CDTXMania.strコンパクトモードファイル;
357
358                                                 CScoreIni ini = new CScoreIni( str + ".score.ini" );
359                                                 ini.t全演奏記録セクションの整合性をチェックし不整合があればリセットする();
360
361                                                 if( ( CDTXMania.DTX != null ) && CDTXMania.DTX.b活性化してる )
362                                                         CDTXMania.DTX.On非活性化();
363
364                                                 CDTXMania.DTX = new CDTX( str, false, ( (double) CDTXMania.ConfigIni.n演奏速度 ) / 20.0, ini.stファイル.BGMAdjust );
365                                                 Trace.TraceInformation( "----曲情報-----------------" );
366                                                 Trace.TraceInformation( "TITLE: {0}", CDTXMania.DTX.TITLE );
367                                                 Trace.TraceInformation( "FILE: {0}",  CDTXMania.DTX.strファイル名の絶対パス );
368                                                 Trace.TraceInformation( "---------------------------" );
369
370                         if( !CDTXMania.bコンパクトモード )
371                         {
372                             if( CDTXMania.ConfigIni.bSkillModeを自動切替えする && CDTXMania.ConfigIni.bDrums有効 )
373                                 this.tSkillModeを譜面に応じて切り替える( CDTXMania.DTX );
374                         }
375
376                         // #35411 2015.08.19 chnmr0 add ゴースト機能のためList chip 読み込み後楽器パート出現順インデックスを割り振る
377                         int[] curCount = new int[(int)E楽器パート.UNKNOWN];
378                         for (int i = 0; i < curCount.Length; ++i)
379                         {
380                             curCount[i] = 0;
381                         }
382                         foreach (CDTX.CChip chip in CDTXMania.DTX.listChip)
383                         {
384                             if (chip.e楽器パート != E楽器パート.UNKNOWN)
385                             {
386                                 chip.n楽器パートでの出現順 = curCount[(int)chip.e楽器パート]++;
387                                 if( CDTXMania.listTargetGhsotLag[ (int)chip.e楽器パート ] != null )
388                                 {
389                                     var lag = new STGhostLag();
390                                     lag.index = chip.n楽器パートでの出現順;
391                                     lag.nJudgeTime = chip.n発声時刻ms + CDTXMania.listTargetGhsotLag[ (int)chip.e楽器パート ][ chip.n楽器パートでの出現順 ];
392                                     lag.nLagTime = CDTXMania.listTargetGhsotLag[ (int)chip.e楽器パート ][ chip.n楽器パートでの出現順 ];
393
394                                     this.stGhostLag[ (int)chip.e楽器パート ].Add( lag );
395                                 }
396                             }
397                         }
398                         
399                         //演奏記録をゴーストから逆生成
400                         for( int i = 0; i < 3; i++ )
401                         {
402                             int nNowCombo = 0;
403                             int nMaxCombo = 0;
404                             CDTXMania.listTargetGhostScoreData[ i ] = new CScoreIni.C演奏記録();
405                             if( this.stGhostLag[ i ] == null )
406                                 continue;
407                             for( int j = 0; j < this.stGhostLag[ i ].Count; j++ )
408                             {
409                                 int ghostLag = 128;
410                                 ghostLag = this.stGhostLag[ i ][ j ].nLagTime;
411                                 // 上位8ビットが1ならコンボが途切れている(ギターBAD空打ちでコンボ数を再現するための措置)
412                                 if (ghostLag > 255)
413                                 {
414                                     nNowCombo = 0;
415                                 }
416                                 ghostLag = (ghostLag & 255) - 128;
417
418                                 if( ghostLag <= 127 )
419                                 {
420                                     E判定 eJudge = this.e指定時刻からChipのJUDGEを返す(ghostLag, 0);
421
422                                     switch( eJudge )
423                                     {
424                                         case E判定.Perfect:
425                                         case E判定.XPerfect:
426                                             CDTXMania.listTargetGhostScoreData[ i ].nPerfect数++;
427                                             break;
428                                         case E判定.Great:
429                                             CDTXMania.listTargetGhostScoreData[ i ].nGreat数++;
430                                             break;
431                                         case E判定.Good:
432                                             CDTXMania.listTargetGhostScoreData[ i ].nGood数++;
433                                             break;
434                                         case E判定.Poor:
435                                             CDTXMania.listTargetGhostScoreData[ i ].nPoor数++;
436                                             break;
437                                         case E判定.Miss:
438                                         case E判定.Bad:
439                                             CDTXMania.listTargetGhostScoreData[ i ].nMiss数++;
440                                             break;
441                                     }
442                                     switch( eJudge )
443                                     {
444                                         case E判定.Perfect:
445                                         case E判定.Great:
446                                         case E判定.Good:
447                                         case E判定.XPerfect:
448                                             nNowCombo++;
449                                             CDTXMania.listTargetGhostScoreData[ i ].n最大コンボ数 = Math.Max( nNowCombo, CDTXMania.listTargetGhostScoreData[ i ].n最大コンボ数 );
450                                             break;
451                                         case E判定.Poor:
452                                         case E判定.Miss:
453                                         case E判定.Bad:
454                                             CDTXMania.listTargetGhostScoreData[ i ].n最大コンボ数 = Math.Max( nNowCombo, CDTXMania.listTargetGhostScoreData[ i ].n最大コンボ数 );
455                                             nNowCombo = 0;
456                                             break;
457                                     }
458                                     //Trace.WriteLine( eJudge.ToString() + " " + nNowCombo.ToString() + "Combo Max:" + nMaxCombo.ToString() + "Combo" );
459                                 }
460                             }
461                             //CDTXMania.listTargetGhostScoreData[ i ].n最大コンボ数 = nMaxCombo;
462                             int nTotal = CDTXMania.DTX.n可視チップ数.Drums;
463                             if( i == 1 ) nTotal = CDTXMania.DTX.n可視チップ数.Guitar;
464                             else if( i == 2 ) nTotal = CDTXMania.DTX.n可視チップ数.Bass;
465                             if( CDTXMania.ConfigIni.eSkillMode == ESkillType.DTXMania )
466                             {
467                                 CDTXMania.listTargetGhostScoreData[ i ].db演奏型スキル値 = CScoreIni.t演奏型スキルを計算して返す( nTotal, CDTXMania.listTargetGhostScoreData[ i ].nPerfect数, CDTXMania.listTargetGhostScoreData[ i ].nGreat数, CDTXMania.listTargetGhostScoreData[ i ].nGood数, CDTXMania.listTargetGhostScoreData[ i ].nPoor数, CDTXMania.listTargetGhostScoreData[ i ].nMiss数, (E楽器パート)i, CDTXMania.listTargetGhostScoreData[ i ].bAutoPlay );
468                             }
469                             else
470                             {
471                                 CDTXMania.listTargetGhostScoreData[ i ].db演奏型スキル値 = CScoreIni.tXG演奏型スキルを計算して返す( nTotal, CDTXMania.listTargetGhostScoreData[ i ].nPerfect数, CDTXMania.listTargetGhostScoreData[ i ].nGreat数, CDTXMania.listTargetGhostScoreData[ i ].nGood数, CDTXMania.listTargetGhostScoreData[ i ].nPoor数, CDTXMania.listTargetGhostScoreData[ i ].nMiss数, CDTXMania.listTargetGhostScoreData[ i ].n最大コンボ数, (E楽器パート)i, CDTXMania.listTargetGhostScoreData[ i ].bAutoPlay );
472                             }
473                         }
474
475                                                 span = (TimeSpan) ( DateTime.Now - timeBeginLoad );
476                                                 Trace.TraceInformation( "DTX読込所要時間:           {0}", span.ToString() );
477
478                                                 if ( CDTXMania.bコンパクトモード )
479                                                         CDTXMania.DTX.MIDIレベル = 1;
480                                                 else
481                                                         CDTXMania.DTX.MIDIレベル = ( CDTXMania.stage選曲.r確定された曲.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI ) ? CDTXMania.stage選曲.n現在選択中の曲の難易度 : 0;
482
483                                                 base.eフェーズID = CStage.Eフェーズ.NOWLOADING_WAVファイルを読み込む;
484                                                 timeBeginLoadWAV = DateTime.Now;
485                                                 return (int) E曲読込画面の戻り値.継続;
486                                         }
487
488                                 case CStage.Eフェーズ.NOWLOADING_WAVファイルを読み込む:
489                                         {
490                                                 if ( nWAVcount == 1 && CDTXMania.DTX.listWAV.Count > 0 )                        // #28934 2012.7.7 yyagi (added checking Count)
491                                                 {
492                                                         ShowProgressByFilename( CDTXMania.DTX.listWAV[ nWAVcount ].strファイル名 );
493                                                 }
494                                                 int looptime = (CDTXMania.ConfigIni.b垂直帰線待ちを行う)? 3 : 1;       // VSyncWait=ON時は1frame(1/60s)あたり3つ読むようにする
495                                                 for ( int i = 0; i < looptime && nWAVcount <= CDTXMania.DTX.listWAV.Count; i++ )
496                                                 {
497                                                         if ( CDTXMania.DTX.listWAV[ nWAVcount ].listこのWAVを使用するチャンネル番号の集合.Count > 0 )  // #28674 2012.5.8 yyagi
498                                                         {
499                                                                 CDTXMania.DTX.tWAVの読み込み( CDTXMania.DTX.listWAV[ nWAVcount ] );
500                                                         }
501                                                         nWAVcount++;
502                                                 }
503                                                 if ( nWAVcount <= CDTXMania.DTX.listWAV.Count )
504                                                 {
505                                                         ShowProgressByFilename( CDTXMania.DTX.listWAV[ nWAVcount ].strファイル名 );
506                                                 }
507                                                 if ( nWAVcount > CDTXMania.DTX.listWAV.Count )
508                                                 {
509                                                         TimeSpan span = ( TimeSpan ) ( DateTime.Now - timeBeginLoadWAV );
510                                                         Trace.TraceInformation( "WAV読込所要時間({0,4}):     {1}", CDTXMania.DTX.listWAV.Count, span.ToString() );
511                                                         timeBeginLoadWAV = DateTime.Now;
512
513                                                         if ( CDTXMania.ConfigIni.bDynamicBassMixerManagement )
514                                                         {
515                                                                 CDTXMania.DTX.PlanToAddMixerChannel();
516                                                         }
517                                                         CDTXMania.DTX.tギターとベースのランダム化( E楽器パート.GUITAR, CDTXMania.ConfigIni.eRandom.Guitar );
518                                                         CDTXMania.DTX.tギターとベースのランダム化( E楽器パート.BASS, CDTXMania.ConfigIni.eRandom.Bass );
519                             //CDTXMania.DTX.tドコドコ仕様変更( E楽器パート.DRUMS, Eタイプ.A );
520                             CDTXMania.DTX.t旧仕様のドコドコチップを振り分ける( E楽器パート.DRUMS, true );
521
522                             #region[ 譜面に応じてSkillMode変更 ]
523                             if( CDTXMania.ConfigIni.bSkillModeを自動切替えする )
524                             {
525                                 if( CDTXMania.ConfigIni.bDrums有効 ? CDTXMania.DTX.bCLASSIC譜面である[ 0 ] : CDTXMania.DTX.bCLASSIC譜面である[ 1 ] | CDTXMania.DTX.bCLASSIC譜面である[ 2 ] )
526                                 {
527                                     CDTXMania.ConfigIni.eSkillMode = ESkillType.DTXMania;
528                                 }
529                                 else
530                                 {
531                                     CDTXMania.ConfigIni.eSkillMode = ESkillType.XG;
532                                 }
533                             }
534                             #endregion
535
536                             if ( CDTXMania.ConfigIni.bギタレボモード )
537                                                                 CDTXMania.stage演奏ギター画面.On活性化();
538                                                         else
539                                                                 CDTXMania.stage演奏ドラム画面.On活性化();
540
541                                                         span = (TimeSpan) ( DateTime.Now - timeBeginLoadWAV );
542                                                         Trace.TraceInformation( "WAV/譜面後処理時間({0,4}):  {1}", ( CDTXMania.DTX.listBMP.Count + CDTXMania.DTX.listBMPTEX.Count + CDTXMania.DTX.listAVI.Count ), span.ToString() );
543
544                                                         base.eフェーズID = CStage.Eフェーズ.NOWLOADING_BMPファイルを読み込む;
545                                                 }
546                                                 return (int) E曲読込画面の戻り値.継続;
547                                         }
548
549                                 case CStage.Eフェーズ.NOWLOADING_BMPファイルを読み込む:
550                                         {
551                                                 TimeSpan span;
552                                                 DateTime timeBeginLoadBMPAVI = DateTime.Now;
553                                                 if ( CDTXMania.ConfigIni.bBGA有効 )
554                                                         CDTXMania.DTX.tBMP_BMPTEXの読み込み();
555
556                                                 if ( CDTXMania.ConfigIni.bAVI有効 )
557                                                         CDTXMania.DTX.tAVIの読み込み();
558                                                 span = ( TimeSpan ) ( DateTime.Now - timeBeginLoadBMPAVI );
559                                                 Trace.TraceInformation( "BMP/AVI読込所要時間({0,4}): {1}", ( CDTXMania.DTX.listBMP.Count + CDTXMania.DTX.listBMPTEX.Count + CDTXMania.DTX.listAVI.Count ), span.ToString() );
560
561                                                 span = ( TimeSpan ) ( DateTime.Now - timeBeginLoad );
562                                                 Trace.TraceInformation( "総読込時間:                {0}", span.ToString() );
563
564                                                 if ( bitmapFilename != null )
565                                                 {
566                                                         bitmapFilename.Dispose();
567                                                         bitmapFilename = null;
568                                                 }
569                                                 if ( graphicsFilename != null )
570                                                 {
571                                                         graphicsFilename.Dispose();
572                                                         graphicsFilename = null;
573                                                 }
574                                                 if ( ftFilename != null )
575                                                 {
576                                                         ftFilename.Dispose();
577                                                         ftFilename = null;
578                                                 }
579                                                 CDTXMania.Timer.t更新();
580                                                 base.eフェーズID = CStage.Eフェーズ.NOWLOADING_システムサウンドBGMの完了を待つ;
581                                                 return (int) E曲読込画面の戻り値.継続;
582                                         }
583
584                                 case CStage.Eフェーズ.NOWLOADING_システムサウンドBGMの完了を待つ:
585                                         {
586                                                 long nCurrentTime = CDTXMania.Timer.n現在時刻;
587                                                 if( nCurrentTime < this.nBGM再生開始時刻 )
588                                                         this.nBGM再生開始時刻 = nCurrentTime;
589
590 //                                              if ( ( nCurrentTime - this.nBGM再生開始時刻 ) > ( this.nBGMの総再生時間ms - 1000 ) )
591                                                 if ( ( nCurrentTime - this.nBGM再生開始時刻 ) >= ( this.nBGMの総再生時間ms ) )      // #27787 2012.3.10 yyagi 1000ms == フェードイン分の時間
592                                                 {
593                                                         if ( !CDTXMania.DTXVmode.Enabled )
594                                                         {
595                                                                 this.actFO.tフェードアウト開始();
596                                                         }
597                                                         base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
598                                                 }
599                                                 return (int) E曲読込画面の戻り値.継続;
600                                         }
601
602                                 case CStage.Eフェーズ.共通_フェードアウト:
603                                         if ( this.actFO.On進行描画() == 0 && !CDTXMania.DTXVmode.Enabled )          // DTXVモード時は、フェードアウト省略
604                                                 return 0;
605
606                                         if ( txFilename != null )
607                                         {
608                                                 txFilename.Dispose();
609                                         }
610                                         if ( this.sd読み込み音 != null )
611                                         {
612                                                 this.sd読み込み音.t解放する();
613                                         }
614                                         return (int) E曲読込画面の戻り値.読込完了;
615                         }
616                         return (int) E曲読込画面の戻り値.継続;
617                 }
618
619                 /// <summary>
620                 /// ESC押下時、trueを返す
621                 /// </summary>
622                 /// <returns></returns>
623                 protected bool tキー入力()
624                 {
625                         IInputDevice keyboard = CDTXMania.Input管理.Keyboard;
626                         if      ( keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Escape ) )              // escape (exit)
627                         {
628                                 return true;
629                         }
630                         return false;
631                 }
632
633
634                 private void ShowProgressByFilename(string strファイル名 )
635                 {
636                         if ( graphicsFilename != null && ftFilename != null )
637                         {
638                                 graphicsFilename.Clear( Color.Transparent );
639                                 graphicsFilename.DrawString( strファイル名, ftFilename, Brushes.White, new RectangleF( 0, 0, SampleFramework.GameWindowSize.Width, fFontSizeFilename * Scale.X ) );
640                                 if ( txFilename != null )
641                                 {
642                                         txFilename.Dispose();
643                                 }
644                                 txFilename = new CTexture( CDTXMania.app.Device, bitmapFilename, CDTXMania.TextureFormat );
645                                 txFilename.vc拡大縮小倍率 = new Vector3( 0.5f, 0.5f, 1f );
646                                 txFilename.t2D描画(
647                                         CDTXMania.app.Device,
648                                         0,
649                                         ( SampleFramework.GameWindowSize.Height - (int) ( txFilename.szテクスチャサイズ.Height * 0.5 ) )
650                                 );
651                         }
652                 }
653
654         private void tSkillModeを譜面に応じて切り替える( CDTX cdtx )
655         {
656             if( CDTXMania.ConfigIni.bDrums有効 ? ( CDTXMania.stage選曲.r確定されたスコア.譜面情報.b完全にCLASSIC譜面である.Drums ) :
657                                                  ( CDTXMania.stage選曲.r確定されたスコア.譜面情報.b完全にCLASSIC譜面である.Guitar | CDTXMania.stage選曲.r確定されたスコア.譜面情報.b完全にCLASSIC譜面である.Bass ) &&
658               !cdtx.b強制的にXG譜面にする )
659                 CDTXMania.ConfigIni.eSkillMode = ESkillType.DTXMania;
660             else
661                 CDTXMania.ConfigIni.eSkillMode = ESkillType.XG;
662         }
663
664                 // その他
665
666                 #region [ private ]
667                 //-----------------
668                 private CActFIFOBlack actFI;
669                 private CActFIFOBlack actFO;
670                 private bool b音符を表示する;
671                 private Font ftタイトル表示用フォント;
672                 private long nBGMの総再生時間ms;
673                 private long nBGM再生開始時刻;
674         private int nCurrentInst;
675                 private int n音符の表示位置X;
676                 private CSound sd読み込み音;
677                 private string strSTAGEFILE;
678                 private string str曲タイトル;
679                 private CTexture tx背景;
680                 private DateTime timeBeginLoad;
681                 private DateTime timeBeginLoadWAV;
682                 private int nWAVcount;
683                 private CTexture txFilename;
684                 private Bitmap bitmapFilename;
685                 private Graphics graphicsFilename;
686                 private Font ftFilename;
687                 private const float fFontSizeFilename = 12.0f;
688                 private const float fFontSizeTitle = 48;
689
690         private STDGBVALUE<List<STGhostLag>> stGhostLag;
691
692         [StructLayout(LayoutKind.Sequential)]
693         private struct STGhostLag
694         {
695             public int index;
696             public int nJudgeTime;
697             public int nLagTime;
698             public STGhostLag( int index, int nJudgeTime, int nLagTime )
699             {
700                 this.index = index;
701                 this.nJudgeTime = nJudgeTime;
702                 this.nLagTime = nLagTime;
703             }
704         }
705         protected E判定 e指定時刻からChipのJUDGEを返す( long nTime, int nInputAdjustTime )
706                 {
707                         //if ( pChip != null )
708                         {
709                                 int nDeltaTime = Math.Abs( (int)nTime );
710                                 //Debug.WriteLine("nAbsTime=" + (nTime - pChip.n発声時刻ms) + ", nDeltaTime=" + (nTime + nInputAdjustTime - pChip.n発声時刻ms));
711                 if( ( nDeltaTime <= CDTXMania.nPerfect範囲ms / 2 ) && CDTXMania.ConfigIni.bXPerfect判定を有効にする )
712                 {
713                     return E判定.XPerfect;
714                 }
715                                 if ( nDeltaTime <= CDTXMania.nPerfect範囲ms )
716                                 {
717                                         return E判定.Perfect;
718                                 }
719                                 if ( nDeltaTime <= CDTXMania.nGreat範囲ms )
720                                 {
721                                         return E判定.Great;
722                                 }
723                                 if ( nDeltaTime <= CDTXMania.nGood範囲ms )
724                                 {
725                                         return E判定.Good;
726                                 }
727                                 if ( nDeltaTime <= CDTXMania.nPoor範囲ms )
728                                 {
729                                         return E判定.Poor;
730                                 }
731                         }
732                         return E判定.Miss;
733                 }
734                 //-----------------
735                 #endregion
736         }
737 }