// 表示開始 public void 表示を開始する(表示レーン種別 lane, 判定種別 judge) { var status = this._レーンtoステータス[lane]; status.判定種別 = judge; status.現在の状態 = 表示レーンステータス.状態.表示開始; // 描画スレッドへ通知。 }
// 表示開始 public void 表示を開始する(表示レーン種別 lane, 判定種別 judge, double fastSlowSec) { var status = this._レーンtoステータス[lane]; status.判定種別 = judge; status.FastSlow値sec = fastSlowSec; status.現在の状態 = 表示レーンステータス.状態.表示開始; }
private void _チップのヒット処理を行う(チップ chip, 判定種別 judge, bool 再生, bool 判定, bool 非表示, double ヒット判定バーと発声との時間sec) { this._チップの演奏状態[chip].ヒット済みである = true; if (再生 && (judge != 判定種別.MISS)) { #region " チップの発声がまだなら行う。" //---------------- // チップの発声時刻は、描画時刻と同じかそれより過去に位置するので、ここに来た時点で未発声なら発声していい。 // というか発声時刻が過去なのに未発声というならここが最後のチャンスなので、必ず発声しないといけない。 if (!(this._チップの演奏状態[chip].発声済みである)) { this._チップの発声を行う(chip, ヒット判定バーと発声との時間sec); this._チップの演奏状態[chip].発声済みである = true; } //---------------- #endregion } if (判定) { #region " チップの判定処理を行う。" //---------------- var 対応表 = App.ユーザ管理.ログオン中のユーザ.ドラムチッププロパティ管理[chip.チップ種別]; if (judge != 判定種別.MISS) { // MISS以外(PERFECT~OK) this._チップ光.表示を開始する(対応表.表示レーン種別); this._ドラムパッド.ヒットする(対応表.表示レーン種別); this._レーンフラッシュ.開始する(対応表.表示レーン種別); } this._判定文字列.表示を開始する(対応表.表示レーン種別, judge); this.成績.ヒット数を加算する(judge); //---------------- #endregion } if (非表示) { #region " チップを非表示にする。" //---------------- if (judge == 判定種別.MISS) { // MISSチップは最後まで表示し続ける。 } else { // PERFECT~POOR チップは非表示。 this._チップの演奏状態[chip].可視 = false; } //---------------- #endregion } }
public void パラメータを一行描画する(DeviceContext dc, float x, float y, 判定種別 judge, int ヒット数, int ヒット割合, float 透明度 = 1.0f) { var 矩形 = (RectangleF)this._判定種別文字の矩形リスト[judge.ToString()]; this._判定種別文字.描画する(dc, x, y - 4f, 透明度, 転送元矩形: 矩形); x += 矩形.Width + 16f; this.数値を描画する(dc, x, y, ヒット数, 4, 透明度); this.数値を描画する(dc, x + _dr, y, ヒット割合, 3, 透明度); this._パラメータ文字.透明度 = 透明度; this._パラメータ文字.描画する(dc, x + _dp, y, "%"); }
public void パラメータを一行描画する(DeviceContext dc, float x, float y, Size2F 拡大率, 判定種別 judge, int ヒット数, int ヒット割合, float 透明度 = 1.0f) { var 矩形 = this._判定種別文字の矩形リスト[judge.ToString()]; this._判定種別文字.描画する(dc, x, y - 4f, 透明度, 転送元矩形: 矩形, X方向拡大率: 拡大率.Width, Y方向拡大率: 拡大率.Height); x += 矩形.Width + 16f; this.数値を描画する(dc, x, y, 拡大率, ヒット数, 4, 透明度); this.数値を描画する(dc, x + _dr * 拡大率.Width, y, 拡大率, ヒット割合, 3, 透明度); this._パラメータ文字.透明度 = 透明度; this._パラメータ文字.描画する(dc, x + _dp * 拡大率.Width, y, "%", 拡大率); }
private void _チップのヒット処理を行う(チップ chip, 判定種別 judge, ドラムとチップと入力の対応表.Column.Columnヒット処理 ヒット処理表, double ヒット判定バーと発声との時間sec) { this._チップの演奏状態[chip].ヒット済みである = true; if (ヒット処理表.再生 && (judge != 判定種別.MISS)) { #region " チップの発声がまだなら行う。" //---------------- // チップの発声時刻は、描画時刻と同じかそれより過去に位置するので、ここに来た時点で未発声なら発声していい。 // というか発声時刻が過去なのに未発声というならここが最後のチャンスなので、必ず発声しないといけない。 if (0 < ヒット判定バーと発声との時間sec) // 発声時刻が未来であるなら、まだ再生してはならない。(ないと思うが念のため。) { this._チップの発声がまだなら発声を行う(chip, ヒット判定バーと発声との時間sec); } //---------------- #endregion } if (ヒット処理表.判定) { #region " チップの判定処理を行う。" //---------------- var 対応表 = App.ユーザ管理.ログオン中のユーザ.ドラムとチップと入力の対応表[chip.チップ種別]; if (judge != 判定種別.MISS) { // PERFECT~OK this._チップ光.表示を開始する(対応表.表示レーン種別); this._ドラムパッド.ヒットする(対応表.表示レーン種別); this._レーンフラッシュ.開始する(対応表.表示レーン種別); } this._判定文字列.表示を開始する(対応表.表示レーン種別, judge); this.成績.ヒット数を加算する(judge); //---------------- #endregion } if (ヒット処理表.非表示) { #region " チップを非表示にする。" //---------------- if (judge != 判定種別.MISS) { this._チップの演奏状態[chip].可視 = false; // PERFECT~POOR チップは非表示。 } else { // MISSチップは最後まで表示し続ける。 } //---------------- #endregion } }
/// <summary> /// 判定に応じてエキサイトゲージを加減する。 /// </summary> public void エキサイトゲージを加算する(判定種別 judge) { switch (judge) { case 判定種別.PERFECT: this.エキサイトゲージ量 += 0.025f; break; case 判定種別.GREAT: this.エキサイトゲージ量 += 0.01f; break; case 判定種別.GOOD: this.エキサイトゲージ量 += 0.005f; break; case 判定種別.OK: this.エキサイトゲージ量 += 0f; break; case 判定種別.MISS: this.エキサイトゲージ量 -= 0.08f; break; } this.エキサイトゲージ量 = Math.Max(Math.Min(this.エキサイトゲージ量, 1.0f), 0.0f); }
/// <summary> /// ヒット数を加算し、各プロパティを更新する。 /// </summary> public void ヒット数を加算する(判定種別 judge, int 加算値 = 1) { // (1) ヒット数を加算する。 this._判定toヒット数[judge] += 加算値; // (2) コンボを加算する。 { bool コンボ切れ = (judge == 判定種別.OK || judge == 判定種別.MISS); if (コンボ切れ) { this.Combo = 0; } else { this.Combo++; this.MaxCombo = Math.Max(this.Combo, this.MaxCombo); } } // (3) スコアを加算する。 { double 基礎点 = 1000000.0 / (1275.0 + 50.0 * (this.総ノーツ数 - 50)); int コンボ数 = Math.Min(this.Combo, 50); this.Score += (int)Math.Floor(基礎点 * コンボ数 * this._判定値表[judge]); } // (4) 達成率を更新する。 { double 判定値 = Math.Floor(100.0 * ((this._判定toヒット数[判定種別.PERFECT] * 85.0 + this._判定toヒット数[判定種別.GREAT] * 35.0) / this.総ノーツ数)) / 100.0; // 小数第3位以下切り捨て double フレーズコンボ成功率 = 0.0; // 未対応 double COMBO値 = Math.Floor(100.0 * ((this.MaxCombo * 5.0 / this.総ノーツ数) + (フレーズコンボ成功率 * 10.0))) / 100.0; // 小数第3位以下切り捨て this.Achievement = (float)(Math.Floor(100.0 * ((判定値 + COMBO値) * this._オプション補正)) / 100.0); // 小数第3位以下切り捨て } // (5) SKILL値を更新する。 this.Skill = (float)(Math.Floor(100.0 * ((this.Achievement * this._譜面レベル * 20.0) / 100.0)) / 100.0); // 小数第3位以下切り捨て // (6) エキサイトゲージ → ここからは呼び出さない。(AutoPlayと区別がつかないため) }
/// <summary> /// ヒット数を加算し、各プロパティを更新する。 /// </summary> public void ヒット数を加算する(判定種別 judge, bool auto, int 加算値 = 1) { // (1) ヒット数を加算する。 { this._判定toヒット数[judge] += 加算値; if (!auto) { this._判定toヒット数Auto含まない[judge] += 加算値; } } // (2) コンボを加算する。 { bool コンボ切れ = (judge == 判定種別.OK || judge == 判定種別.MISS); if (コンボ切れ) { this.Combo = 0; } else { this.Combo++; this.MaxCombo = Math.Max(this.Combo, this.MaxCombo); } } // (3) スコアを加算する。 { double 基礎点 = 1000000.0 / (1275.0 + 50.0 * (this.総ノーツ数 - 50)); int コンボ数 = Math.Min(this.Combo, 50); this.Score += (int)Math.Floor(基礎点 * コンボ数 * this._判定値表[judge]); } // (4) 達成率を更新する。 { double 判定値 = Math.Floor(100.0 * ((this._判定toヒット数[判定種別.PERFECT] * 85.0 + this._判定toヒット数[判定種別.GREAT] * 35.0) / this.総ノーツ数)) / 100.0; // 小数第3位以下切り捨て double フレーズコンボ成功率 = 0.0; // 未対応 double COMBO値 = Math.Floor(100.0 * ((this.MaxCombo * 5.0 / this.総ノーツ数) + (フレーズコンボ成功率 * 10.0))) / 100.0; // 小数第3位以下切り捨て this.Achievement = (float)(Math.Floor(100.0 * ((判定値 + COMBO値) * this._オプション補正)) / 100.0); // 小数第3位以下切り捨て } // (5) SKILL値を更新する。 this.Skill = (float)(Math.Floor(100.0 * ((this.Achievement * this._譜面レベル * 20.0) / 100.0)) / 100.0); // 小数第3位以下切り捨て // (6) エキサイトゲージ → ここからは呼び出さない。(AutoPlayと区別がつかないため) // (7) ランクを更新する。 { int Perfect = this._判定toヒット数Auto含まない[判定種別.PERFECT]; int Great = this._判定toヒット数Auto含まない[判定種別.GREAT]; int Good = this._判定toヒット数Auto含まない[判定種別.GOOD]; int Ok = this._判定toヒット数Auto含まない[判定種別.OK]; int Miss = this._判定toヒット数Auto含まない[判定種別.MISS]; int Total = Perfect + Great + Good + Ok + Miss; if (0 == Total) { this.ランク = ランク種別.SS; // 全AUTOならSS } else { var rate = ((double)(Perfect + Great)) / ((double)Total); this.ランク = (1.00 == rate) ? ランク種別.SS : (0.95 <= rate) ? ランク種別.S : (0.90 <= rate) ? ランク種別.A : (0.85 <= rate) ? ランク種別.B : (0.80 <= rate) ? ランク種別.C : (0.70 <= rate) ? ランク種別.D : ランク種別.E; } } }