using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TJAPlayer3 { /// /// 段位認定を管理するクラス。 /// public class Dan_C { public Dan_C() { } public Dan_C(Dan_C dan_C) : this(dan_C.GetExamType(), new int[] { dan_C.GetValue(false), dan_C.GetValue(true) }, dan_C.GetExamRange()) { } /// /// 段位認定の条件を初期化し、生成します。 /// /// 条件の種別。 /// 条件の合格量。 /// 条件の合格の範囲。 public Dan_C(Exam.Type examType, int[] value, Exam.Range examRange) { IsEnable = true; NotReached = false; SetExamType(examType); SetValue(value[0], value[1]); SetExamRange(examRange); } /// /// 条件と現在の値を評価して、クリアしたかどうかを判断します。 /// /// その条件の現在の値。 public bool Update(int nowValue) { var isChangedAmount = false; if (nowValue < 0) return isChangedAmount; if (!GetEnable()) return isChangedAmount; if (GetAmount() < nowValue) isChangedAmount = true; if (GetExamRange() == Exam.Range.Less && nowValue > GetValue(false)) isChangedAmount = false; // n未満でその数を超えたらfalseを返す。 SetAmount(nowValue); switch (GetExamType()) { case Exam.Type.Gauge: SetCleared(); break; case Exam.Type.JudgePerfect: SetCleared(); break; case Exam.Type.JudgeGood: SetCleared(); break; case Exam.Type.JudgeBad: SetCleared(); break; case Exam.Type.Score: SetCleared(); break; case Exam.Type.Roll: SetCleared(); break; case Exam.Type.Hit: SetCleared(); break; case Exam.Type.Combo: SetCleared(); break; case Exam.Type.Accuracy: SetCleared(); break; default: break; } return isChangedAmount; } /// /// 段位認定の条件が有効であるかどうかを返します。 /// /// 段位認定の条件が有効であるかどうか。 public bool GetEnable() { return this.IsEnable; } /// /// 各合格条件のボーダーを設定します。 /// /// 赤合格条件 /// 金合格条件 public void SetValue(int redValue, int goldValue) { if (redValue != -1) this.Value[0] = redValue; if (goldValue != -1) this.Value[1] = goldValue; } /// /// 各合格条件のボーダーを返します。 /// /// trueを指定すると、金合格条件を返します。 /// 合格条件の値。 public int GetValue(bool isGoldValue) { return isGoldValue == true ? this.Value[1] : this.Value[0]; } /// /// 現在の値を設定します。 /// /// 現在の値。 public void SetAmount(int amount) { this.Amount = amount; } /// /// 現在の値を返します。 /// /// 現在の値。 public int GetAmount() { return this.Amount; } /// /// 条件の種別を返します。 /// /// 条件の種別 public Exam.Type GetExamType() { return this.Type; } /// /// 条件の種別を設定します。 /// /// 条件の種別。 private void SetExamType(Exam.Type type) { this.Type = type; } /// /// 条件の範囲を返します。 /// /// 条件の範囲 public Exam.Range GetExamRange() { return this.Range; } /// /// 条件の範囲を設定します。 /// /// private void SetExamRange(Exam.Range range) { this.Range = range; } /// /// 条件にクリアしているかどうか返します。 /// /// 条件にクリアしているかどうか。 public bool[] GetCleared() { return IsCleared; } /// /// 条件と現在の値をチェックして、合格もしくは金合格をしてるか否かを更新する。 /// private void SetCleared() { if (GetExamRange() == Exam.Range.More) { if (GetAmount() >= GetValue(false)) { IsCleared[0] = true; if (GetAmount() >= GetValue(true)) IsCleared[1] = true; else IsCleared[1] = false; } else { IsCleared[0] = false; IsCleared[1] = false; } } else { if (GetAmount() < GetValue(true)) { IsCleared[1] = true; } else { IsCleared[1] = false; } if (GetAmount() < GetValue(false)) { IsCleared[0] = true; } else { IsCleared[0] = false; } } } /// /// ゲージの描画のための百分率を返す。 /// /// Amountの百分率。 public int GetAmountToPercent() { var percent = 0.0D; if(GetValue(false) == 0) { return 0; } if(GetExamRange() == Exam.Range.More) { switch (GetExamType()) { case Exam.Type.Gauge: case Exam.Type.JudgePerfect: case Exam.Type.JudgeGood: case Exam.Type.JudgeBad: case Exam.Type.Score: case Exam.Type.Roll: case Exam.Type.Hit: case Exam.Type.Combo: case Exam.Type.Accuracy: percent = 1.0 * GetAmount() / GetValue(false); break; default: break; } } else { switch (GetExamType()) { case Exam.Type.Gauge: case Exam.Type.JudgePerfect: case Exam.Type.JudgeGood: case Exam.Type.JudgeBad: case Exam.Type.Score: case Exam.Type.Roll: case Exam.Type.Hit: case Exam.Type.Combo: case Exam.Type.Accuracy: percent = (1.0 * (GetValue(false) - GetAmount())) / GetValue(false); break; default: break; } } percent = percent * 100.0; if (percent < 0.0) percent = 0.0D; if (percent > 100.0) percent = 100.0D; return (int)percent; } /// /// 条件に達成できる見込みがあるかどうか値を代入します。 /// /// 未達成かどうか。 public void SetReached(bool notReached) { NotReached = notReached; } /// /// 条件に達成できる見込みがあるかどうかを返します。 /// /// 条件に達成できる見込みがあるかどうか。 public bool GetReached() { return NotReached; } // オーバーライドメソッド /// /// ToString()のオーバーライドメソッド。段位認定モードの各条件の現在状況をString型で返します。 /// /// 段位認定モードの各条件の現在状況。 public override string ToString() { return String.Format("Type: {0} / Value: {1}/{2} / Range: {3} / Amount: {4} / Clear: {5}/{6} / Percent: {7} / NotReached: {8}", GetExamType(), GetValue(false), GetValue(true), GetExamRange(), GetAmount(), GetCleared()[0], GetCleared()[1], GetAmountToPercent(), GetReached()); } // フィールド /// /// その条件が有効であるかどうか。 /// private bool IsEnable; /// /// 条件の種別。 /// private Exam.Type Type; /// /// 条件の範囲。 /// private Exam.Range Range; /// /// 条件の値。 /// public int[] Value = new int[] { 0, 0 }; /// /// 量。 /// public int Amount; /// /// 条件をクリアしているか否か。 /// public readonly bool[] IsCleared = new[] { false, false }; /// /// 曲ごとの条件を格納する /// // public Dan_C[] SongExam = new Dan_C[3]; /// /// 条件の達成見込みがなくなったら、真になる。 /// この変数が一度trueになれば、基本的にfalseに戻ることはない。 /// (スコア加算については、この限りではない。) /// private bool NotReached = false; } public static class Exam { /// /// 段位認定の条件の種別。 /// public enum Type { Gauge, JudgePerfect, JudgeGood, JudgeBad, Score, Roll, Hit, Combo, Accuracy } /// /// 段位認定の合格範囲。 /// public enum Range { /// /// 以上 /// More, /// /// 未満 /// Less } /// /// ステータス。 /// public enum Status { /// /// 不合格 /// Failure, /// /// 合格 /// Success, /// /// より良い合格 /// Better_Success } } }