using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Ichni.RhythmGame
{
///
/// 单次演奏的运行时判定记录。
/// 本类随 GameScene 重建,只负责本局结算;长期最佳成绩由 SongSaveModule 写入 ES3,
/// 因此不要把此对象直接当作存档模型使用。
///
public class PlayingRecorder
{
public int perfectCount;
public int goodCount;
public int badCount;
public int missCount;
public int totalCount;
public float accuracy;
public int currentCombo;
public int maxCombo;
/// 本局判定偏差图数据,仅供当前 Summary 使用,不写入存档。
public List resultData = new List();
public bool isFullCombo;
public bool isAllPerfect;
///
/// 在进入一局新演奏时重置全部瞬时状态。
/// 初始化为 100% / FC / AP 是为了让首个非 Perfect 判定能正确打破对应状态;
/// 无有效判定的空局不会被 SongSaveModule 写入成绩。
///
public void Initialize()
{
if (resultData == null)
{
resultData = new List();
}
else
{
resultData.Clear();
}
perfectCount = 0;
goodCount = 0;
badCount = 0;
missCount = 0;
totalCount = 0;
accuracy = 100f;
currentCombo = 0;
maxCombo = 0;
isFullCombo = true;
isAllPerfect = true;
}
private void UpdateAccuracy()
{
float baseValue = perfectCount + goodCount * 0.7f + badCount * 0.3f;
if (totalCount > 0)
{
accuracy = baseValue / totalCount * 100f;
}
else
{
accuracy = 100f; // 如果没有任何击打,准确率为100%
}
}
private void AddCombo()
{
currentCombo++;
maxCombo = Mathf.Max(maxCombo, currentCombo);
}
private void ResetCombo()
{
currentCombo = 0;
}
public void AddPerfect()
{
perfectCount++;
totalCount++;
AddCombo();
UpdateAccuracy();
GameManager.Instance.gameUICanvas.UpdateAccuracy(accuracy);
GameManager.Instance.gameUICanvas.UpdateCombo(currentCombo);
}
public void AddGood()
{
goodCount++;
totalCount++;
AddCombo();
UpdateAccuracy();
isAllPerfect = false;
GameManager.Instance.gameUICanvas.UpdateAccuracy(accuracy);
GameManager.Instance.gameUICanvas.UpdateCombo(currentCombo);
}
public void AddBad()
{
badCount++;
totalCount++;
ResetCombo();
UpdateAccuracy();
isFullCombo = false;
isAllPerfect = false;
GameManager.Instance.gameUICanvas.UpdateAccuracy(accuracy);
GameManager.Instance.gameUICanvas.UpdateCombo(currentCombo);
}
public void AddMiss()
{
missCount++;
totalCount++;
ResetCombo();
UpdateAccuracy();
isFullCombo = false;
isAllPerfect = false;
GameManager.Instance.gameUICanvas.UpdateAccuracy(accuracy);
GameManager.Instance.gameUICanvas.UpdateCombo(currentCombo);
}
}
}