2 using System.Collections.Generic;
\r
4 using System.Diagnostics;
\r
9 internal class CStage結果 : CStage
\r
13 public STDGBVALUE<bool> b新記録スキル;
\r
14 public STDGBVALUE<bool> b新記録スコア;
\r
15 public STDGBVALUE<bool> b新記録ランク;
\r
16 public STDGBVALUE<float> fPerfect率;
\r
17 public STDGBVALUE<float> fGreat率;
\r
18 public STDGBVALUE<float> fGood率;
\r
19 public STDGBVALUE<float> fPoor率;
\r
20 public STDGBVALUE<float> fMiss率;
\r
21 public STDGBVALUE<bool> bオート; // #23596 10.11.16 add ikanick
\r
22 // 10.11.17 change (int to bool) ikanick
\r
23 public STDGBVALUE<int> nランク値;
\r
24 public STDGBVALUE<int> n演奏回数;
\r
26 public CDTX.CChip[] r空うちドラムチップ;
\r
27 public STDGBVALUE<CScoreIni.C演奏記録> st演奏記録;
\r
34 // STDGBVALUE<CScoreIni.C演奏記録> stdgbvalue = new STDGBVALUE<CScoreIni.C演奏記録>();
\r
35 this.st演奏記録.Drums = new CScoreIni.C演奏記録();
\r
36 this.st演奏記録.Guitar = new CScoreIni.C演奏記録();
\r
37 this.st演奏記録.Bass = new CScoreIni.C演奏記録();
\r
38 // this.st演奏記録 = stdgbvalue;
\r
39 this.r空うちドラムチップ = new CDTX.CChip[ 10 ];
\r
41 this.nチャンネル0Atoレーン07 = new int[] { 1, 2, 3, 4, 5, 7, 6, 1, 7, 0 };
\r
42 base.eステージID = CStage.Eステージ.結果;
\r
43 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
44 base.b活性化してない = true;
\r
45 base.list子Activities.Add( this.actResultImage = new CActResultImage() );
\r
46 base.list子Activities.Add( this.actParameterPanel = new CActResultParameterPanel() );
\r
47 base.list子Activities.Add( this.actRank = new CActResultRank() );
\r
48 base.list子Activities.Add( this.actSongBar = new CActResultSongBar() );
\r
49 base.list子Activities.Add( this.actOption = new CActオプションパネル() );
\r
50 base.list子Activities.Add( this.actFI = new CActFIFOWhite() );
\r
51 base.list子Activities.Add( this.actFO = new CActFIFOBlack() );
\r
57 public override void On活性化()
\r
59 Trace.TraceInformation( "結果ステージを活性化します。" );
\r
64 //---------------------
\r
65 this.eフェードアウト完了時の戻り値 = E戻り値.継続;
\r
66 this.bアニメが完了 = false;
\r
67 this.n最後に再生したHHのWAV番号 = -1;
\r
68 this.n最後に再生したHHのチャンネル番号 = 0;
\r
69 for( int i = 0; i < 3; i++ )
\r
71 this.b新記録スキル[ i ] = false;
\r
72 this.b新記録スコア[ i ] = false;
\r
73 this.b新記録ランク[ i ] = false;
\r
75 //---------------------
\r
79 //---------------------
\r
80 for( int i = 0; i < 3; i++ )
\r
82 this.nランク値[ i ] = -1;
\r
83 if ( ( ( ( i != 0 ) || ( CDTXMania.DTX.bチップがある.Drums && !CDTXMania.ConfigIni.bギタレボモード ) ) && ( ( i != 1 ) || CDTXMania.DTX.bチップがある.Guitar ) ) && ( ( i != 2 ) || CDTXMania.DTX.bチップがある.Bass ) )
\r
85 CScoreIni.C演奏記録 part = this.st演奏記録[ i ];
\r
86 bool bIsAutoPlay = true;
\r
90 bIsAutoPlay = CDTXMania.ConfigIni.bドラムが全部オートプレイである;
\r
94 bIsAutoPlay = CDTXMania.ConfigIni.bAutoPlay.Guitar;
\r
98 bIsAutoPlay = CDTXMania.ConfigIni.bAutoPlay.Bass;
\r
101 this.fPerfect率[ i ] = bIsAutoPlay ? 0f : ( ( 100f * part.nPerfect数 ) / ( (float) part.n全チップ数 ) );
\r
102 this.fGreat率[ i ] = bIsAutoPlay ? 0f : ( ( 100f * part.nGreat数 ) / ( (float) part.n全チップ数 ) );
\r
103 this.fGood率[ i ] = bIsAutoPlay ? 0f : ( ( 100f * part.nGood数 ) / ( (float) part.n全チップ数 ) );
\r
104 this.fPoor率[ i ] = bIsAutoPlay ? 0f : ( ( 100f * part.nPoor数 ) / ( (float) part.n全チップ数 ) );
\r
105 this.fMiss率[ i ] = bIsAutoPlay ? 0f : ( ( 100f * part.nMiss数 ) / ( (float) part.n全チップ数 ) );
\r
106 this.bオート[ i ] = bIsAutoPlay; // #23596 10.11.16 add ikanick そのパートがオートなら1
\r
107 // 10.11.17 change (int to bool) ikanick
\r
108 this.nランク値[ i ] = CScoreIni.tランク値を計算して返す( part );
\r
109 //Debug.WriteLine( "rank[" + i + "]=" + this.nランク値[ i ] );
\r
110 //if ( this.nランク値[ i ] != -1 )
\r
112 // this.n総合ランク値 = Math.Min( this.n総合ランク値, this.nランク値[ i ] );
\r
116 this.n総合ランク値 = CScoreIni.t総合ランク値を計算して返す( this.st演奏記録.Drums, this.st演奏記録.Guitar, this.st演奏記録.Bass );
\r
117 //---------------------
\r
120 #region [ .score.ini の作成と出力 ]
\r
121 //---------------------
\r
122 string str = CDTXMania.DTX.strファイル名の絶対パス + ".score.ini";
\r
123 CScoreIni ini = new CScoreIni( str );
\r
125 bool[] b今までにフルコンボしたことがある = new bool[] { false, false, false };
\r
127 for( int i = 0; i < 3; i++ )
\r
129 // フルコンボチェックならびに新記録ランクチェックは、ini.Record[] が、スコアチェックや演奏型スキルチェックの IF 内で書き直されてしまうよりも前に行う。(2010.9.10)
\r
131 b今までにフルコンボしたことがある[ i ] = ini.stセクション[ i * 2 ].bフルコンボである | ini.stセクション[ i * 2 + 1 ].bフルコンボである;
\r
133 // if( this.nランク値[ i ] <= CScoreIni.tランク値を計算して返す( ini.stセクション[ ( i * 2 ) + 1 ] ) )
\r
135 // this.b新記録ランク[ i ] = true;
\r
137 // 上記の条件だと[HiSkill.***]でのランクしかチェックしていないので、BestRankと比較するよう変更
\r
138 if ( this.nランク値[ i ] >= 0 && ini.stファイル.BestRank[ i ] > this.nランク値[ i ] ) // #24459 2011.3.1 yyagi update BestRank
\r
140 this.b新記録ランク[ i ] = true;
\r
141 ini.stファイル.BestRank[ i ] = this.nランク値[ i ];
\r
145 if( this.st演奏記録[ i ].nスコア > ini.stセクション[ i * 2 ].nスコア )
\r
147 this.b新記録スコア[ i ] = true;
\r
148 ini.stセクション[ i * 2 ] = this.st演奏記録[ i ];
\r
152 if (this.st演奏記録[i].db演奏型スキル値 > ini.stセクション[(i * 2) + 1].db演奏型スキル値)
\r
154 this.b新記録スキル[ i ] = true;
\r
155 ini.stセクション[(i * 2) + 1] = this.st演奏記録[ i ];
\r
157 // ラストプレイ #23595 2011.1.9 ikanick
\r
158 // オートじゃなければプレイ結果を書き込む
\r
159 if (this.bオート[ i ] == false) {
\r
160 ini.stセクション[i + 6] = this.st演奏記録[ i ];
\r
163 // #23596 10.11.16 add ikanick オートじゃないならクリア回数を1増やす
\r
164 // 11.02.05 bオート to t更新条件を取得する use ikanick
\r
165 bool[] b更新が必要か否か = new bool[ 3 ];
\r
166 CScoreIni.t更新条件を取得する( out b更新が必要か否か[ 0 ], out b更新が必要か否か[ 1 ], out b更新が必要か否か[ 2 ] );
\r
168 if (b更新が必要か否か[ i ])
\r
173 ini.stファイル.ClearCountDrums++;
\r
176 ini.stファイル.ClearCountGuitar++;
\r
179 ini.stファイル.ClearCountBass++;
\r
182 throw new Exception("クリア回数増加のk(0-2)が範囲外です。");
\r
185 //---------------------------------------------------------------------/
\r
188 //---------------------
\r
191 #region [ リザルト画面への演奏回数の更新 #24281 2011.1.30 yyagi]
\r
192 this.n演奏回数.Drums = ini.stファイル.PlayCountDrums;
\r
193 this.n演奏回数.Guitar = ini.stファイル.PlayCountGuitar;
\r
194 this.n演奏回数.Bass = ini.stファイル.PlayCountBass;
\r
196 #region [ 選曲画面の譜面情報の更新 ]
\r
197 //---------------------
\r
198 if( !CDTXMania.bコンパクトモード )
\r
200 Cスコア cスコア = CDTXMania.stage選曲.r確定されたスコア;
\r
201 bool[] b更新が必要か否か = new bool[ 3 ];
\r
202 CScoreIni.t更新条件を取得する( out b更新が必要か否か[ 0 ], out b更新が必要か否か[ 1 ], out b更新が必要か否か[ 2 ] );
\r
203 for( int m = 0; m < 3; m++ )
\r
205 if( b更新が必要か否か[ m ] )
\r
207 // FullCombo した記録を FullCombo なしで超えた場合、FullCombo マークが消えてしまう。
\r
208 // → FullCombo は、最新記録と関係なく、一度達成したらずっとつくようにする。(2010.9.11)
\r
209 cスコア.譜面情報.フルコンボ[ m ] = this.st演奏記録[ m ].bフルコンボである | b今までにフルコンボしたことがある[ m ];
\r
211 if( this.b新記録スキル[ m ] )
\r
213 cスコア.譜面情報.最大スキル[ m ] = this.st演奏記録[ m ].db演奏型スキル値;
\r
216 if (this.b新記録ランク[ m ])
\r
218 cスコア.譜面情報.最大ランク[ m ] = this.nランク値[ m ];
\r
223 //---------------------
\r
226 #region [ #RESULTSOUND_xx の再生(あれば)]
\r
227 //---------------------
\r
228 int rank = CScoreIni.t総合ランク値を計算して返す( this.st演奏記録.Drums, this.st演奏記録.Guitar, this.st演奏記録.Bass );
\r
230 if (rank == 99) // #23534 2010.10.28 yyagi: 演奏チップが0個のときは、rankEと見なす
\r
235 if( string.IsNullOrEmpty( CDTXMania.DTX.RESULTSOUND[ rank ] ) )
\r
237 CDTXMania.Skin.soundステージクリア音.t再生する();
\r
238 this.rResultSound = null;
\r
242 string str2 = CDTXMania.DTX.strフォルダ名 + CDTXMania.DTX.RESULTSOUND[ rank ];
\r
245 this.rResultSound = CDTXMania.Sound管理.tサウンドを生成する( str2 );
\r
249 Trace.TraceError( "サウンドの生成に失敗しました。({0})", new object[] { str2 } );
\r
250 this.rResultSound = null;
\r
253 //---------------------
\r
260 Trace.TraceInformation( "結果ステージの活性化を完了しました。" );
\r
264 public override void On非活性化()
\r
266 if( this.rResultSound != null )
\r
268 CDTXMania.Sound管理.tサウンドを破棄する( this.rResultSound );
\r
269 this.rResultSound = null;
\r
273 public override void OnManagedリソースの作成()
\r
275 if( !base.b活性化してない )
\r
277 this.tx背景 = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenResult background.jpg" ) );
\r
278 this.tx上部パネル = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenResult header panel.png" ), true );
\r
279 this.tx下部パネル = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\ScreenResult footer panel.png" ), true );
\r
280 this.txオプションパネル = CDTXMania.tテクスチャの生成( CSkin.Path( @"Graphics\Screen option panels.png" ) );
\r
281 base.OnManagedリソースの作成();
\r
284 public override void OnManagedリソースの解放()
\r
286 if( !base.b活性化してない )
\r
288 if( this.ct登場用 != null )
\r
292 CDTXMania.tテクスチャの解放( ref this.tx背景 );
\r
293 CDTXMania.tテクスチャの解放( ref this.tx上部パネル );
\r
294 CDTXMania.tテクスチャの解放( ref this.tx下部パネル );
\r
295 CDTXMania.tテクスチャの解放( ref this.txオプションパネル );
\r
296 base.OnManagedリソースの解放();
\r
299 public override int On進行描画()
\r
301 if( !base.b活性化してない )
\r
304 if( base.b初めての進行描画 )
\r
306 this.ct登場用 = new CCounter( 0, 100, 5, CDTXMania.Timer );
\r
307 this.actFI.tフェードイン開始();
\r
308 base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;
\r
309 if( this.rResultSound != null )
\r
311 this.rResultSound.t再生を開始する();
\r
313 base.b初めての進行描画 = false;
\r
315 this.bアニメが完了 = true;
\r
316 if( this.ct登場用.b進行中 )
\r
319 if( this.ct登場用.b終了値に達した )
\r
325 this.bアニメが完了 = false;
\r
331 if( this.tx背景 != null )
\r
333 this.tx背景.t2D描画( CDTXMania.app.Device, 0, 0 );
\r
335 if( this.ct登場用.b進行中 && ( this.tx上部パネル != null ) )
\r
337 double num2 = ( (double) this.ct登場用.n現在の値 ) / 100.0;
\r
338 double num3 = Math.Sin( 1.5707963267948966 * num2 );
\r
339 num = ( (int) ( this.tx上部パネル.sz画像サイズ.Height * num3 ) ) - this.tx上部パネル.sz画像サイズ.Height;
\r
345 if( this.tx上部パネル != null )
\r
347 this.tx上部パネル.t2D描画( CDTXMania.app.Device, 0, num );
\r
349 if( this.tx下部パネル != null )
\r
351 this.tx下部パネル.t2D描画( CDTXMania.app.Device, 0, 480 - this.tx下部パネル.sz画像サイズ.Height );
\r
353 this.actOption.On進行描画();
\r
354 if( this.actResultImage.On進行描画() == 0 )
\r
356 this.bアニメが完了 = false;
\r
358 if( this.actParameterPanel.On進行描画() == 0 )
\r
360 this.bアニメが完了 = false;
\r
362 if( this.actRank.On進行描画() == 0 )
\r
364 this.bアニメが完了 = false;
\r
366 if( this.actSongBar.On進行描画() == 0 )
\r
368 this.bアニメが完了 = false;
\r
370 if( base.eフェーズID == CStage.Eフェーズ.共通_フェードイン )
\r
372 if( this.actFI.On進行描画() != 0 )
\r
374 base.eフェーズID = CStage.Eフェーズ.共通_通常状態;
\r
377 else if( ( base.eフェーズID == CStage.Eフェーズ.共通_フェードアウト ) && ( this.actFO.On進行描画() != 0 ) )
\r
379 return (int) this.eフェードアウト完了時の戻り値;
\r
384 if( CDTXMania.act現在入力を占有中のプラグイン == null )
\r
386 if( CDTXMania.ConfigIni.bドラム打音を発声する && CDTXMania.ConfigIni.bDrums有効 )
\r
388 for( int i = 0; i < 10; i++ )
\r
390 List<STInputEvent> events = CDTXMania.Pad.GetEvents( E楽器パート.DRUMS, (Eパッド) i );
\r
391 if( ( events != null ) && ( events.Count > 0 ) )
\r
393 foreach( STInputEvent event2 in events )
\r
395 if( !event2.b押された )
\r
399 CDTX.CChip rChip = this.r空うちドラムチップ[ i ];
\r
400 if( rChip == null )
\r
402 switch( ( (Eパッド) i ) )
\r
405 rChip = this.r空うちドラムチップ[ 7 ];
\r
406 if( rChip == null )
\r
408 rChip = this.r空うちドラムチップ[ 9 ];
\r
413 rChip = this.r空うちドラムチップ[ 4 ];
\r
417 rChip = this.r空うちドラムチップ[ 8 ];
\r
421 rChip = this.r空うちドラムチップ[ 0 ];
\r
422 if( rChip == null )
\r
424 rChip = this.r空うちドラムチップ[ 9 ];
\r
429 rChip = this.r空うちドラムチップ[ 6 ];
\r
433 rChip = this.r空うちドラムチップ[ 0 ];
\r
434 if( rChip == null )
\r
436 rChip = this.r空うちドラムチップ[ 7 ];
\r
441 if( ( ( rChip != null ) && ( rChip.nチャンネル番号 >= 0x11 ) ) && ( rChip.nチャンネル番号 <= 0x1a ) )
\r
443 int nLane = this.nチャンネル0Atoレーン07[ rChip.nチャンネル番号 - 0x11 ];
\r
444 if( ( nLane == 1 ) && ( ( rChip.nチャンネル番号 == 0x11 ) || ( ( rChip.nチャンネル番号 == 0x18 ) && ( this.n最後に再生したHHのチャンネル番号 != 0x18 ) ) ) )
\r
446 CDTXMania.DTX.tWavの再生停止( this.n最後に再生したHHのWAV番号 );
\r
447 this.n最後に再生したHHのWAV番号 = rChip.n整数値・内部番号;
\r
448 this.n最後に再生したHHのチャンネル番号 = rChip.nチャンネル番号;
\r
450 CDTXMania.DTX.tチップの再生( rChip, CDTXMania.Timer.nシステム時刻, nLane, CDTXMania.ConfigIni.n手動再生音量, CDTXMania.ConfigIni.b演奏音を強調する.Drums );
\r
456 if( ( ( CDTXMania.Pad.b押されたDGB( Eパッド.CY ) || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.RD ) ) || ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LC ) || CDTXMania.Input管理.Keyboard.bキーが押された( (int)SlimDX.DirectInput.Key.Return ) ) ) && !this.bアニメが完了 )
\r
458 this.actResultImage.tアニメを完了させる();
\r
459 this.actParameterPanel.tアニメを完了させる();
\r
460 this.actRank.tアニメを完了させる();
\r
461 this.actSongBar.tアニメを完了させる();
\r
464 if( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 )
\r
466 if ( CDTXMania.Input管理.Keyboard.bキーが押された( (int)SlimDX.DirectInput.Key.Escape ) )
\r
468 CDTXMania.Skin.sound取消音.t再生する();
\r
469 this.actFO.tフェードアウト開始();
\r
470 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\r
471 this.eフェードアウト完了時の戻り値 = E戻り値.完了;
\r
473 if ( ( ( CDTXMania.Pad.b押されたDGB( Eパッド.CY ) || CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.RD ) ) || ( CDTXMania.Pad.b押された( E楽器パート.DRUMS, Eパッド.LC ) || CDTXMania.Input管理.Keyboard.bキーが押された( (int) SlimDX.DirectInput.Key.Return ) ) ) && this.bアニメが完了 )
\r
475 CDTXMania.Skin.sound取消音.t再生する();
\r
476 this.actFO.tフェードアウト開始();
\r
477 base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;
\r
478 this.eフェードアウト完了時の戻り値 = E戻り値.完了;
\r
485 public enum E戻り値 : int
\r
494 #region [ private ]
\r
495 //-----------------
\r
496 private CCounter ct登場用;
\r
497 private E戻り値 eフェードアウト完了時の戻り値;
\r
498 private CActFIFOWhite actFI;
\r
499 private CActFIFOBlack actFO;
\r
500 private CActオプションパネル actOption;
\r
501 private CActResultParameterPanel actParameterPanel;
\r
502 private CActResultRank actRank;
\r
503 private CActResultImage actResultImage;
\r
504 private CActResultSongBar actSongBar;
\r
505 private bool bアニメが完了;
\r
506 private readonly int[] nチャンネル0Atoレーン07;
\r
507 private int n最後に再生したHHのWAV番号;
\r
508 private int n最後に再生したHHのチャンネル番号;
\r
509 private CSound rResultSound;
\r
510 private CTexture txオプションパネル;
\r
511 private CTexture tx下部パネル;
\r
512 private CTexture tx上部パネル;
\r
513 private CTexture tx背景;
\r
514 //-----------------
\r