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
}
}
}