2 using System.Collections.Generic;
\r
4 using System.Diagnostics;
\r
5 using System.Drawing;
\r
8 using System.Drawing.Text;
\r
13 internal class CStage曲読み込み : CStage
\r
16 public CStage曲読み込み()
\r
18 base.eステージID = CStage.Eステージ.曲読み込み;
\r
19 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
20 base.b活性化してない = true;
\r
21 // base.list子Activities.Add( this.actFI = new CActFIFOBlack() ); // #27787 2012.3.10 yyagi 曲読み込み画面のフェードインの省略
\r
22 base.list子Activities.Add(this.actFO = new CActFIFOBlack());
\r
28 public override void On活性化()
\r
30 Trace.TraceInformation("曲読み込みステージを活性化します。");
\r
35 this.strSTAGEFILE = "";
\r
36 this.b音符を表示する = false;
\r
37 this.n音符の表示位置X = 0x308;
\r
38 this.ftタイトル表示用フォント = new Font("MS PGothic", fFontSizeTitle * Scale.Y, GraphicsUnit.Pixel);
\r
39 this.nBGM再生開始時刻 = -1;
\r
40 this.nBGMの総再生時間ms = 0;
\r
41 if (this.sd読み込み音 != null)
\r
43 CDTXMania.app.Sound管理.tサウンドを破棄する(this.sd読み込み音);
\r
44 this.sd読み込み音 = null;
\r
47 string strDTXファイルパス = (CDTXMania.app.bコンパクトモード) ?
\r
48 CDTXMania.app.strコンパクトモードファイル : CDTXMania.app.stage選曲.r確定されたスコア.ファイル情報.ファイルの絶対パス;
\r
50 CDTX cdtx = new CDTX(strDTXファイルパス, true);
\r
51 this.str曲タイトル = cdtx.TITLE;
\r
52 if (((cdtx.STAGEFILE != null) && (cdtx.STAGEFILE.Length > 0)) && (File.Exists(cdtx.strフォルダ名 + cdtx.STAGEFILE) && !CDTXMania.app.ConfigIni.bストイックモード))
\r
54 this.strSTAGEFILE = cdtx.strフォルダ名 + cdtx.STAGEFILE;
\r
55 this.b音符を表示する = false;
\r
59 this.strSTAGEFILE = CSkin.Path(@"Graphics\\ScreenNowLoading background.jpg");
\r
60 this.b音符を表示する = true;
\r
62 if (((cdtx.SOUND_NOWLOADING != null) && (cdtx.SOUND_NOWLOADING.Length > 0)) && File.Exists(cdtx.strフォルダ名 + cdtx.SOUND_NOWLOADING))
\r
64 string strNowLoadingサウンドファイルパス = cdtx.strフォルダ名 + cdtx.SOUND_NOWLOADING;
\r
67 this.sd読み込み音 = CDTXMania.app.Sound管理.tサウンドを生成する(strNowLoadingサウンドファイルパス);
\r
71 Trace.TraceError("#SOUND_NOWLOADING に指定されたサウンドファイルの読み込みに失敗しました。({0})", strNowLoadingサウンドファイルパス);
\r
79 Trace.TraceInformation("曲読み込みステージの活性化を完了しました。");
\r
84 private void ReadGhost(string filename, List<int> list) // #35411 2015.08.19 chnmr0 add
\r
86 if (File.Exists(filename))
\r
88 using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
\r
90 using (BinaryReader br = new BinaryReader(fs))
\r
94 int cnt = br.ReadInt32();
\r
95 for (int i = 0; i < cnt; ++i)
\r
97 short lag = br.ReadInt16();
\r
101 catch (EndOfStreamException)
\r
103 Trace.TraceInformation("ゴーストデータは正しく読み込まれませんでした。");
\r
111 public override void On非活性化()
\r
113 Trace.TraceInformation("曲読み込みステージを非活性化します。");
\r
117 if (this.ftタイトル表示用フォント != null)
\r
119 this.ftタイトル表示用フォント.Dispose();
\r
120 this.ftタイトル表示用フォント = null;
\r
126 Trace.TraceInformation("曲読み込みステージの非活性化を完了しました。");
\r
130 public override void OnManagedリソースの作成()
\r
132 if (!base.b活性化してない)
\r
134 this.tx音符 = TextureFactory.tテクスチャの生成(CSkin.Path(@"Graphics\\ScreenNowLoading onpu.png"), false);
\r
135 this.tx背景 = TextureFactory.tテクスチャの生成(this.strSTAGEFILE, false);
\r
137 if (!this.b音符を表示する && this.tx背景 != null)
\r
139 this.tx背景.vc拡大縮小倍率 = new Vector3(Scale.X, Scale.Y, 1f); // とりあえずFullHD化
\r
145 if ((this.str曲タイトル != null) && (this.str曲タイトル.Length > 0))
\r
147 Bitmap image = new Bitmap(1, 1);
\r
148 Graphics graphics = Graphics.FromImage(image);
\r
149 SizeF ef = graphics.MeasureString(this.str曲タイトル, this.ftタイトル表示用フォント);
\r
150 Size size = new Size((int)Math.Ceiling((double)ef.Width), (int)Math.Ceiling((double)ef.Height));
\r
151 graphics.Dispose();
\r
153 image = new Bitmap(size.Width, size.Height);
\r
154 graphics = Graphics.FromImage(image);
\r
155 graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
\r
156 graphics.DrawString(this.str曲タイトル, this.ftタイトル表示用フォント, Brushes.White, (float)0f, (float)0f);
\r
157 graphics.Dispose();
\r
158 this.txタイトル = new CTexture(CDTXMania.app.Device, image, CDTXMania.app.TextureFormat);
\r
159 this.txタイトル.vc拡大縮小倍率 = new Vector3(0.5f, 0.5f, 1f);
\r
161 this.n音符の表示位置X = ((SampleFramework.GameWindowSize.Width - ((int)(size.Width * this.txタイトル.vc拡大縮小倍率.X))) - ((this.tx音符 != null) ? this.tx音符.sz画像サイズ.Width : 0)) - 2;
\r
165 this.txタイトル = null;
\r
166 this.n音符の表示位置X = (SampleFramework.GameWindowSize.Width - ((this.tx音符 != null) ? this.tx音符.sz画像サイズ.Width : 0)) - 2;
\r
169 catch (CTextureCreateFailedException)
\r
171 Trace.TraceError("テクスチャの生成に失敗しました。({0})", new object[] { this.strSTAGEFILE });
\r
172 this.txタイトル = null;
\r
178 this.txタイトル = null;
\r
180 base.OnManagedリソースの作成();
\r
183 public override void OnManagedリソースの解放()
\r
185 if (!base.b活性化してない)
\r
187 TextureFactory.tテクスチャの解放(ref this.tx背景);
\r
188 TextureFactory.tテクスチャの解放(ref this.tx音符);
\r
189 TextureFactory.tテクスチャの解放(ref this.txタイトル);
\r
190 base.OnManagedリソースの解放();
\r
193 public override int On進行描画()
\r
200 #region [ 初めての進行描画 ]
\r
201 //-----------------------------
\r
202 if (base.b初めての進行描画)
\r
204 Cスコア cスコア1 = CDTXMania.app.stage選曲.r確定されたスコア;
\r
205 if (this.sd読み込み音 != null)
\r
207 if (CDTXMania.app.Skin.sound曲読込開始音.b排他 && (CSkin.Cシステムサウンド.r最後に再生した排他システムサウンド != null))
\r
209 CSkin.Cシステムサウンド.r最後に再生した排他システムサウンド.t停止する();
\r
211 this.sd読み込み音.t再生を開始する();
\r
212 this.nBGM再生開始時刻 = CSound管理.rc演奏用タイマ.n現在時刻;
\r
213 this.nBGMの総再生時間ms = this.sd読み込み音.n総演奏時間ms;
\r
217 CDTXMania.app.Skin.sound曲読込開始音.t再生する();
\r
218 this.nBGM再生開始時刻 = CSound管理.rc演奏用タイマ.n現在時刻;
\r
219 this.nBGMの総再生時間ms = CDTXMania.app.Skin.sound曲読込開始音.n長さ_現在のサウンド;
\r
221 // this.actFI.tフェードイン開始(); // #27787 2012.3.10 yyagi 曲読み込み画面のフェードインの省略
\r
222 base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;
\r
223 base.b初めての進行描画 = false;
\r
226 bitmapFilename = new Bitmap(SampleFramework.GameWindowSize.Width, (int)(fFontSizeFilename * Scale.X));
\r
227 graphicsFilename = Graphics.FromImage(bitmapFilename);
\r
228 graphicsFilename.TextRenderingHint = TextRenderingHint.AntiAlias;
\r
229 ftFilename = new Font("MS PGothic", fFontSizeFilename * Scale.X, FontStyle.Bold, GraphicsUnit.Pixel);
\r
231 //-----------------------------
\r
234 #region [ ESC押下時は選曲画面に戻る ]
\r
237 if (this.sd読み込み音 != null)
\r
239 this.sd読み込み音.tサウンドを停止する();
\r
240 this.sd読み込み音.t解放する();
\r
242 return (int)E曲読込画面の戻り値.読込中止;
\r
246 #region [ 背景、音符+タイトル表示 ]
\r
247 //-----------------------------
\r
248 if (this.tx背景 != null)
\r
249 this.tx背景.t2D描画(CDTXMania.app.Device, 0, 0);
\r
253 int y = SampleFramework.GameWindowSize.Height - (int)(fFontSizeTitle * Scale.Y) + (int)(3 * Scale.X); // 480 - 45;
\r
254 if (this.tx音符 != null)
\r
257 CDTXMania.app.Device,
\r
262 if (this.txタイトル != null)
\r
265 CDTXMania.app.Device,
\r
266 (int)(SampleFramework.GameWindowSize.Width - (this.txタイトル.sz画像サイズ.Width * this.txタイトル.vc拡大縮小倍率.X)),
\r
271 //-----------------------------
\r
274 switch (base.eフェーズID)
\r
276 case CStage.Eフェーズ.共通_フェードイン:
\r
277 // if( this.actFI.On進行描画() != 0 ) // #27787 2012.3.10 yyagi 曲読み込み画面のフェードインの省略
\r
278 // 必ず一度「CStaeg.Eフェーズ.共通_フェードイン」フェーズを経由させること。
\r
279 // さもないと、曲読み込みが完了するまで、曲読み込み画面が描画されない。
\r
280 base.eフェーズID = CStage.Eフェーズ.NOWLOADING_DTXファイルを読み込む;
\r
281 return (int)E曲読込画面の戻り値.継続;
\r
283 case CStage.Eフェーズ.NOWLOADING_DTXファイルを読み込む:
\r
285 timeBeginLoad = DateTime.Now;
\r
288 if (!CDTXMania.app.bコンパクトモード)
\r
289 str = CDTXMania.app.stage選曲.r確定されたスコア.ファイル情報.ファイルの絶対パス;
\r
291 str = CDTXMania.app.strコンパクトモードファイル;
\r
293 CScoreIni ini = new CScoreIni(str + ".score.ini");
\r
294 ini.t全演奏記録セクションの整合性をチェックし不整合があればリセットする();
\r
296 if ((CDTXMania.app.DTX != null) && CDTXMania.app.DTX.b活性化してる)
\r
297 CDTXMania.app.DTX.On非活性化();
\r
299 CDTXMania.app.DTX = new CDTX(str, false, ((double)CDTXMania.app.ConfigIni.n演奏速度) / 20.0, ini.stファイル.BGMAdjust);
\r
300 Trace.TraceInformation("----曲情報-----------------");
\r
301 Trace.TraceInformation("TITLE: {0}", CDTXMania.app.DTX.TITLE);
\r
302 Trace.TraceInformation("FILE: {0}", CDTXMania.app.DTX.strファイル名の絶対パス);
\r
303 Trace.TraceInformation("---------------------------");
\r
305 string [] inst = new string [3] {"dr", "gt", "bs"};
\r
306 for (int instIndex = 0; instIndex < 3; ++instIndex)
\r
308 bool readAutoGhostCond = false;
\r
309 readAutoGhostCond |= instIndex == 0 ? CDTXMania.app.ConfigIni.bドラムが全部オートプレイである : false;
\r
310 readAutoGhostCond |= instIndex == 1 ? CDTXMania.app.ConfigIni.bギターが全部オートプレイである : false;
\r
311 readAutoGhostCond |= instIndex == 2 ? CDTXMania.app.ConfigIni.bベースが全部オートプレイである : false;
\r
313 CDTXMania.app.DTX.listTargetGhsotLag[instIndex] = null;
\r
314 CDTXMania.app.DTX.listAutoGhostLag[instIndex] = null;
\r
316 if (readAutoGhostCond)
\r
318 string[] prefix = { "perfect", "lastplay", "hiskill", "hiscore", "online" };
\r
319 int indPrefix = (int)CDTXMania.app.ConfigIni.eAutoGhost[instIndex];
\r
320 string filename = CDTXMania.app.DTX.strフォルダ名 + "\\" + CDTXMania.app.DTX.strファイル名 + "." + prefix[indPrefix] + "." + inst[instIndex] + ".ghost";
\r
321 if (File.Exists(filename))
\r
323 CDTXMania.app.DTX.listAutoGhostLag[instIndex] = new List<int>();
\r
324 ReadGhost(filename, CDTXMania.app.DTX.listAutoGhostLag[instIndex]);
\r
328 if (CDTXMania.app.ConfigIni.eTargetGhost[instIndex] != ETargetGhostData.NONE)
\r
330 string[] prefix = { "none", "perfect", "lastplay", "hiskill", "hiscore", "online" };
\r
331 int indPrefix = (int)CDTXMania.app.ConfigIni.eTargetGhost[instIndex];
\r
332 string filename = CDTXMania.app.DTX.strフォルダ名 + "\\" + CDTXMania.app.DTX.strファイル名 + "." + prefix[indPrefix] + "." + inst[instIndex] + ".ghost";
\r
333 if (File.Exists(filename))
\r
335 CDTXMania.app.DTX.listTargetGhsotLag[instIndex] = new List<int>();
\r
336 ReadGhost(filename, CDTXMania.app.DTX.listTargetGhsotLag[instIndex]);
\r
338 else if (CDTXMania.app.ConfigIni.eTargetGhost[instIndex] == ETargetGhostData.PERFECT)
\r
341 CDTXMania.app.DTX.listTargetGhsotLag[instIndex] = new List<int>();
\r
346 // #35411 2015.08.19 chnmr0 add ゴースト機能のためList chip 読み込み後楽器パート出現順インデックスを割り振る
\r
347 int[] curCount = new int[(int)E楽器パート.UNKNOWN];
\r
348 for (int i = 0; i < curCount.Length; ++i)
\r
352 foreach (CChip chip in CDTXMania.app.DTX.listChip)
\r
354 if (chip.e楽器パート != E楽器パート.UNKNOWN)
\r
356 chip.n楽器パートでの出現順 = curCount[(int)chip.e楽器パート]++;
\r
360 span = (TimeSpan)(DateTime.Now - timeBeginLoad);
\r
361 Trace.TraceInformation("DTX読込所要時間: {0}", span.ToString());
\r
363 if (CDTXMania.app.bコンパクトモード)
\r
364 CDTXMania.app.DTX.MIDIレベル = 1;
\r
366 CDTXMania.app.DTX.MIDIレベル = (CDTXMania.app.stage選曲.r確定された曲.eノード種別 == C曲リストノード.Eノード種別.SCORE_MIDI) ? CDTXMania.app.stage選曲.n現在選択中の曲の難易度 : 0;
\r
368 base.eフェーズID = CStage.Eフェーズ.NOWLOADING_WAVファイルを読み込む;
\r
369 timeBeginLoadWAV = DateTime.Now;
\r
370 return (int)E曲読込画面の戻り値.継続;
\r
373 case CStage.Eフェーズ.NOWLOADING_WAVファイルを読み込む:
\r
375 if (nWAVcount == 1 && CDTXMania.app.DTX.listWAV.Count > 0) // #28934 2012.7.7 yyagi (added checking Count)
\r
377 ShowProgressByFilename(CDTXMania.app.DTX.listWAV[nWAVcount].strファイル名);
\r
379 int looptime = (CDTXMania.app.ConfigIni.b垂直帰線待ちを行う) ? 3 : 1;
\r
380 if (CDTXMania.app.ConfigIni.b曲読み込みを高速化する) looptime = CDTXMania.app.DTX.listWAV.Count / 20 + 1; // #xxxxx ikanick 2016.2.21 ロード高速化 垂直同期の有無に関わらず、1フレームに5%ぐらいずつロードする
\r
381 for (int i = 0; i < looptime && nWAVcount <= CDTXMania.app.DTX.listWAV.Count; i++)
\r
383 if (CDTXMania.app.DTX.listWAV[nWAVcount].listこのWAVを使用するチャンネル番号の集合.Count > 0) // #28674 2012.5.8 yyagi
\r
385 CDTXMania.app.DTX.tWAVの読み込み(CDTXMania.app.DTX.listWAV[nWAVcount]);
\r
389 if (nWAVcount <= CDTXMania.app.DTX.listWAV.Count)
\r
391 double f進捗率 = nWAVcount * 100.0f / CDTXMania.app.DTX.listWAV.Count;
\r
392 ShowProgressByFilename("" + f進捗率.ToString("0.0") + "% " + nWAVcount + "/" + CDTXMania.app.DTX.listWAV.Count + " " + CDTXMania.app.DTX.listWAV[nWAVcount].strファイル名);
\r
394 if (nWAVcount > CDTXMania.app.DTX.listWAV.Count)
\r
396 TimeSpan span = (TimeSpan)(DateTime.Now - timeBeginLoadWAV);
\r
397 Trace.TraceInformation("WAV読込所要時間({0,4}): {1}", CDTXMania.app.DTX.listWAV.Count, span.ToString());
\r
398 timeBeginLoadWAV = DateTime.Now;
\r
400 if (CDTXMania.app.ConfigIni.bDynamicBassMixerManagement)
\r
402 CDTXMania.app.DTX.PlanToAddMixerChannel();
\r
404 CDTXMania.app.DTX.tギターとベースのランダム化(E楽器パート.GUITAR, CDTXMania.app.ConfigIni.eRandom.Guitar);
\r
405 CDTXMania.app.DTX.tギターとベースのランダム化(E楽器パート.BASS, CDTXMania.app.ConfigIni.eRandom.Bass);
\r
407 if (CDTXMania.app.ConfigIni.bギタレボモード)
\r
408 CDTXMania.app.stage演奏ギター画面.On活性化();
\r
410 CDTXMania.app.stage演奏ドラム画面.On活性化();
\r
412 span = (TimeSpan)(DateTime.Now - timeBeginLoadWAV);
\r
413 Trace.TraceInformation("WAV/譜面後処理時間({0,4}): {1}", (CDTXMania.app.DTX.listBMP.Count + CDTXMania.app.DTX.listBMPTEX.Count + CDTXMania.app.DTX.listAVI.Count), span.ToString());
\r
415 base.eフェーズID = CStage.Eフェーズ.NOWLOADING_BMPファイルを読み込む;
\r
417 return (int)E曲読込画面の戻り値.継続;
\r
420 case CStage.Eフェーズ.NOWLOADING_BMPファイルを読み込む:
\r
423 DateTime timeBeginLoadBMPAVI = DateTime.Now;
\r
424 if (CDTXMania.app.ConfigIni.bBGA有効)
\r
425 CDTXMania.app.DTX.tBMP_BMPTEXの読み込み();
\r
427 if (CDTXMania.app.ConfigIni.bAVI有効)
\r
428 CDTXMania.app.DTX.tAVIの読み込み();
\r
429 span = (TimeSpan)(DateTime.Now - timeBeginLoadBMPAVI);
\r
430 Trace.TraceInformation("BMP/AVI読込所要時間({0,4}): {1}", (CDTXMania.app.DTX.listBMP.Count + CDTXMania.app.DTX.listBMPTEX.Count + CDTXMania.app.DTX.listAVI.Count), span.ToString());
\r
432 span = (TimeSpan)(DateTime.Now - timeBeginLoad);
\r
433 Trace.TraceInformation("総読込時間: {0}", span.ToString());
\r
435 if (bitmapFilename != null)
\r
437 bitmapFilename.Dispose();
\r
438 bitmapFilename = null;
\r
440 if (graphicsFilename != null)
\r
442 graphicsFilename.Dispose();
\r
443 graphicsFilename = null;
\r
445 if (ftFilename != null)
\r
447 ftFilename.Dispose();
\r
450 CDTXMania.app.Timer.t更新();
\r
451 base.eフェーズID = CStage.Eフェーズ.NOWLOADING_システムサウンドBGMの完了を待つ;
\r
452 return (int)E曲読込画面の戻り値.継続;
\r
455 case CStage.Eフェーズ.NOWLOADING_システムサウンドBGMの完了を待つ:
\r
457 long nCurrentTime = CDTXMania.app.Timer.n現在時刻;
\r
458 if (nCurrentTime < this.nBGM再生開始時刻)
\r
459 this.nBGM再生開始時刻 = nCurrentTime;
\r
461 // if ( ( nCurrentTime - this.nBGM再生開始時刻 ) > ( this.nBGMの総再生時間ms - 1000 ) )
\r
462 if ((nCurrentTime - this.nBGM再生開始時刻) >= (this.nBGMの総再生時間ms)) // #27787 2012.3.10 yyagi 1000ms == フェードイン分の時間
\r
464 if (!CDTXMania.app.DTXVmode.Enabled)
\r
466 this.actFO.tフェードアウト開始();
\r
468 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\r
470 return (int)E曲読込画面の戻り値.継続;
\r
473 case CStage.Eフェーズ.共通_フェードアウト:
\r
474 if (this.actFO.On進行描画() == 0 && !CDTXMania.app.DTXVmode.Enabled) // DTXVモード時は、フェードアウト省略
\r
477 if (txFilename != null)
\r
479 txFilename.Dispose();
\r
481 if (this.sd読み込み音 != null)
\r
483 this.sd読み込み音.t解放する();
\r
485 return (int)E曲読込画面の戻り値.読込完了;
\r
487 return (int)E曲読込画面の戻り値.継続;
\r
493 /// <returns></returns>
\r
494 protected bool tキー入力()
\r
496 IInputDevice keyboard = CDTXMania.app.Input管理.Keyboard;
\r
497 if (keyboard.bキーが押された((int)SlimDX.DirectInput.Key.Escape)) // escape (exit)
\r
505 private void ShowProgressByFilename(string strファイル名と進捗)
\r
507 if (graphicsFilename != null && ftFilename != null)
\r
509 graphicsFilename.Clear(Color.Transparent);
\r
510 graphicsFilename.DrawString(strファイル名と進捗, ftFilename, Brushes.White, new RectangleF(0, 0, SampleFramework.GameWindowSize.Width, fFontSizeFilename * Scale.X));
\r
511 if (txFilename != null)
\r
513 txFilename.Dispose();
\r
515 txFilename = new CTexture(CDTXMania.app.Device, bitmapFilename, CDTXMania.app.TextureFormat);
\r
516 txFilename.vc拡大縮小倍率 = new Vector3(0.5f, 0.5f, 1f);
\r
518 CDTXMania.app.Device,
\r
520 (SampleFramework.GameWindowSize.Height - (int)(txFilename.szテクスチャサイズ.Height * 0.5))
\r
527 #region [ private ]
\r
528 //-----------------
\r
529 // private CActFIFOBlack actFI;
\r
530 private CActFIFOBlack actFO;
\r
531 private bool b音符を表示する;
\r
532 private Font ftタイトル表示用フォント;
\r
533 private long nBGMの総再生時間ms;
\r
534 private long nBGM再生開始時刻;
\r
535 private int n音符の表示位置X;
\r
536 private CSound sd読み込み音;
\r
537 private string strSTAGEFILE;
\r
538 private string str曲タイトル;
\r
539 private CTexture txタイトル;
\r
540 private CTexture tx音符;
\r
541 private CTexture tx背景;
\r
542 private DateTime timeBeginLoad;
\r
543 private DateTime timeBeginLoadWAV;
\r
544 private int nWAVcount;
\r
545 private CTexture txFilename;
\r
546 private Bitmap bitmapFilename;
\r
547 private Graphics graphicsFilename;
\r
548 private Font ftFilename;
\r
549 private const float fFontSizeFilename = 12.0f;
\r
550 private const float fFontSizeTitle = 48;
\r
551 //-----------------
\r