using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using wf; public class Score_Mgr : PartsMgrBase { public bool IsExistMiss { get { return this.m_IsExistMiss; } } public static Score_Mgr Instance { get { return Score_Mgr.m_Instance; } } protected override void Start() { Score_Mgr.m_Instance = this; base.Start(); if (!base.IsActive) { base.gameObject.SetActive(false); return; } this.m_FlashCombo.gameObject.SetActive(false); this.m_FlashCombo_Child.gameObject.SetActive(false); this.m_CharaScoreList.Clear(); this.m_EnemyScoreUI.SetActive(false); this.m_CharaScoreList.Add(DanceBattle_Mgr.CharaType.Player, new Score_Mgr.CharaScoreData()); this.SetTextandIcon(this.m_CharaScoreList[DanceBattle_Mgr.CharaType.Player], this.m_PlayerScoreUI); if (RhythmAction_Mgr.NowDance == RhythmAction_Mgr.DanceType.VS || RhythmAction_Mgr.NowDance == RhythmAction_Mgr.DanceType.BenchMark) { this.m_EnemyScoreUI.SetActive(true); this.m_CharaScoreList.Add(DanceBattle_Mgr.CharaType.Enemy, new Score_Mgr.CharaScoreData()); this.SetTextandIcon(this.m_CharaScoreList[DanceBattle_Mgr.CharaType.Enemy], this.m_EnemyScoreUI); } else if (RhythmAction_Mgr.NowDance == RhythmAction_Mgr.DanceType.Challenge) { this.CSVRead(); } } private void CSVRead() { string text = RhythmAction_Mgr.Instance.MusicCSV_Path + "reward_data.nei"; if (!GameUty.FileSystem.IsExistentFile(text)) { NDebug.Assert("表がありません。" + text, false); } using (AFileBase afileBase = GameUty.FileSystem.FileOpen(text)) { using (CsvParser csvParser = new CsvParser()) { bool condition = csvParser.Open(afileBase); NDebug.Assert(condition, text + "\nopen failed."); for (int i = 1; i < csvParser.max_cell_y; i++) { if (csvParser.IsCellToExistData(0, i)) { Score_Mgr.RewardData rewardData = new Score_Mgr.RewardData(); for (int j = 0; j < csvParser.max_cell_x; j++) { this.SetRewardData(csvParser, j, i, rewardData); } this.m_AllRewardData.Add(rewardData); } } } } } private void SetRewardData(CsvParser csv, int cell_X, int cell_Y, Score_Mgr.RewardData data) { switch (cell_X) { case 0: data.Rank = csv.GetCellAsString(cell_X, cell_Y); break; case 1: data.Condition = csv.GetCellAsString(cell_X, cell_Y); break; case 2: data.TargetScore = csv.GetCellAsInteger(cell_X, cell_Y); break; case 3: data.Reward = csv.GetCellAsInteger(cell_X, cell_Y); break; } } private void SetTextandIcon(Score_Mgr.CharaScoreData data, GameObject score_ui) { Transform transform = score_ui.transform.Find("Text/ScoreText"); Transform transform2 = score_ui.transform.Find("IconMask/Icon"); if (transform) { data.ScoreText = transform.GetComponent(); } if (transform2) { data.MaidIcon = transform2.GetComponent(); } } private void SetNameUI(DanceBattle_Mgr.CharaType chara_type, GameObject score_ui) { if (chara_type == DanceBattle_Mgr.CharaType.Player) { this.m_CharaScoreList[chara_type].CharaName = RhythmAction_Mgr.Instance.UserMaid.status.fullNameJpStyle; } else { this.m_CharaScoreList[chara_type].CharaName = DanceBattle_Mgr.EnemyData.Name; } if (score_ui.transform.Find("Text/NameText")) { score_ui.transform.Find("Text/NameText").GetComponent().text = this.m_CharaScoreList[chara_type].CharaName; } } private void Update() { foreach (KeyValuePair keyValuePair in this.m_CharaScoreList) { keyValuePair.Value.ScoreText.text = keyValuePair.Value.nScore.ToString(); if (keyValuePair.Key == DanceBattle_Mgr.CharaType.Player) { this.m_ComboText.gameObject.SetActive(keyValuePair.Value.nCombo != 0); this.m_ComboText.text = keyValuePair.Value.nCombo.ToString(); this.m_FlashCombo.text = this.m_ComboText.text; this.m_ComboText.color = this.GetTextColor(keyValuePair.Value.nCombo); this.m_ComboText_Child.color = this.GetTextColor(keyValuePair.Value.nCombo); } } } private IEnumerator TextScaling() { float timer = 0f; for (;;) { if (!RhythmAction_Mgr.Instance.IsPause) { timer += RhythmAction_Mgr.Instance.DanceDeltaTime; } if (!this.m_FlashCombo.gameObject.activeSelf) { this.m_FlashCombo.gameObject.SetActive(true); this.m_FlashCombo_Child.gameObject.SetActive(true); } Color flash_col = this.m_FlashCombo.color; float rate = Mathf.Sin(Mathf.Clamp01(timer / this.m_ScalingTime) * 180f * 0.0174532924f); flash_col.a = rate; this.m_FlashCombo.color = flash_col; this.m_FlashCombo_Child.color = flash_col; this.m_ComboText.transform.localScale = Vector3.Lerp(Vector3.one, Vector3.one * this.m_ScalingValue, rate); if (timer > this.m_ScalingTime) { break; } yield return null; } this.m_FlashCombo.gameObject.SetActive(false); this.m_FlashCombo_Child.gameObject.SetActive(false); yield break; yield break; } private void ScoreScaling(float time) { float t = Mathf.Sin(Mathf.Clamp01(time / this.m_ScoreScalingTime) * 180f * 0.0174532924f); this.m_CharaScoreList[DanceBattle_Mgr.CharaType.Player].ScoreText.transform.localScale = Vector3.Lerp(Vector3.one, Vector3.one * this.m_ScoreScaling, t); } private int BaceScore(Dance_Note.Evaluation evalue) { if (this.m_EvalueSetList.Any((Score_Mgr.EvalueSetting e) => e.Evalue == evalue)) { return this.m_EvalueSetList.SingleOrDefault((Score_Mgr.EvalueSetting e) => e.Evalue == evalue).BaceScore; } return 0; } private int JudgeNumber(Dance_Note.Evaluation evalue) { if (this.m_EvalueSetList.Any((Score_Mgr.EvalueSetting e) => e.Evalue == evalue)) { return this.m_EvalueSetList.SingleOrDefault((Score_Mgr.EvalueSetting e) => e.Evalue == evalue).JudgeNo; } return 0; } private int Combo_Correct(int combo) { int result = 0; if (combo >= 50) { result = Mathf.Min(combo / 50 * 50 + 50, this.m_Max_Correct); } else if (combo >= 10) { result = 50; } return result; } private Color GetTextColor(int combo) { Color result = Color.white; foreach (Score_Mgr.ComboTextColor comboTextColor2 in this.m_ComboTextColor) { if (combo < comboTextColor2.Combo) { break; } result = comboTextColor2.TextColor; } return result; } private float Score_Rate() { int num = this.m_EvalueCombo[Dance_Note.Evaluation.PERFECT] + this.m_EvalueCombo[Dance_Note.Evaluation.GREAT]; if (num > 0) { return (float)num / (float)this.m_NoteCount * 100f; } return 0f; } private bool GoalToTarget(Score_Mgr.RewardData data) { bool result = false; if (data.Condition == ">") { result = (this.m_CharaScoreList[DanceBattle_Mgr.CharaType.Player].nScore > (long)data.TargetScore); } else if (data.Condition == ">=") { result = (this.m_CharaScoreList[DanceBattle_Mgr.CharaType.Player].nScore >= (long)data.TargetScore); } else if (data.Condition == "<") { result = (this.m_CharaScoreList[DanceBattle_Mgr.CharaType.Player].nScore < (long)data.TargetScore); } else if (data.Condition == "<=") { result = (this.m_CharaScoreList[DanceBattle_Mgr.CharaType.Player].nScore <= (long)data.TargetScore); } return result; } private int GetVoltageCorrect(int voltage, Dance_Note.Evaluation evalue) { if (this.m_VoltageCorrect.Any((Score_Mgr.VoltageCorrect e) => e.Voltage == voltage) && evalue != Dance_Note.Evaluation.MISS) { return this.m_VoltageCorrect.SingleOrDefault((Score_Mgr.VoltageCorrect e) => e.Voltage == voltage).Correct; } return 0; } private void DecideReward() { long num = 0L; long num2 = 0L; foreach (Score_Mgr.RewardData rewardData in this.m_AllRewardData) { num2 = num - this.m_CharaScoreList[DanceBattle_Mgr.CharaType.Player].nScore; Result_Display.SetResultData("Rank", rewardData.Rank, Result_Display.ResultType.Image); Result_Display.SetResultData("Money", Utility.ConvertMoneyText(rewardData.Reward), Result_Display.ResultType.String); if ((long)rewardData.TargetScore <= this.m_CharaScoreList[DanceBattle_Mgr.CharaType.Player].nScore) { RhythmAction_Mgr.Instance.SetDanceReward(rewardData.Reward); GameMain.Instance.CharacterMgr.status.money += (long)rewardData.Reward; break; } num = (long)rewardData.TargetScore; } if (num2 <= 0L) { Result_Display.SetResultData("NextRank", "RankMax", Result_Display.ResultType.Image); } else { Result_Display.SetResultData("NextRank", Utility.ConvertMoneyText(num2), Result_Display.ResultType.String); } } private int GetAppealMultiple(DanceBattle_Mgr.CharaType chara_type) { if (!Appeal_Mgr.Instance.IsActive || !Appeal_Mgr.Instance.GetAppealData(chara_type).IsAppealNow) { return 1; } Appeal_Mgr.Instance.AddAppealCombo(chara_type); if (RhythmAction_Mgr.IsVSDance) { return this.m_AppealMagnification; } return 1; } public long GetScore(DanceBattle_Mgr.CharaType type) { if (this.m_CharaScoreList.ContainsKey(type)) { return this.m_CharaScoreList[type].nScore; } return 0L; } public int GetCombo(DanceBattle_Mgr.CharaType type) { if (this.m_CharaScoreList.ContainsKey(type)) { return this.m_CharaScoreList[type].nCombo; } return 0; } public void AddScore(Dance_Note.Evaluation evalue, DanceBattle_Mgr.CharaType chara_type, bool is_special) { if (this.m_CharaScoreList.ContainsKey(chara_type)) { if (evalue != Dance_Note.Evaluation.PERFECT && evalue != Dance_Note.Evaluation.GREAT) { this.m_CharaScoreList[chara_type].nCombo = 0; if (chara_type == DanceBattle_Mgr.CharaType.Player) { this.m_IsExistMiss = true; } } else { this.m_CharaScoreList[chara_type].nCombo++; if (chara_type == DanceBattle_Mgr.CharaType.Player) { base.StartCoroutine(this.TextScaling()); } } if (this.m_CharaScoreList[chara_type].nCombo > 99999) { this.m_CharaScoreList[chara_type].nCombo = 99999; } int voltage = (chara_type != DanceBattle_Mgr.CharaType.Player) ? DanceBattle_Mgr.EnemyData.UseVoltage : Voltage_Mgr.Instance.VoltageStage; if (is_special) { for (int i = 0; i < Note_Mgr.Instance.GetSpecial; i++) { int num = this.BaceScore(evalue) + this.JudgeNumber(evalue) * this.Combo_Correct(this.m_CharaScoreList[chara_type].nCombo + i) + this.GetVoltageCorrect(voltage, evalue); num *= this.GetAppealMultiple(chara_type); this.m_CharaScoreList[chara_type].nScore += (long)num; } if (chara_type == DanceBattle_Mgr.CharaType.Player) { base.StartCoroutine(RhythmAction_Mgr.Instance.DanceTimeCoroutine(this.m_ScoreScalingTime, new Action(this.ScoreScaling), null)); } } else { int num2 = this.BaceScore(evalue) + this.JudgeNumber(evalue) * this.Combo_Correct(this.m_CharaScoreList[chara_type].nCombo) + this.GetVoltageCorrect(voltage, evalue); if (MotionAction_Mgr.IsCaptureOK && chara_type == DanceBattle_Mgr.CharaType.Player) { num2 += this.m_McSuccesBonus; } num2 *= this.GetAppealMultiple(chara_type); this.m_CharaScoreList[chara_type].nScore += (long)num2; } if (this.m_CharaScoreList[chara_type].nScore > 9999999999L) { this.m_CharaScoreList[chara_type].nScore = 9999999999L; } if (chara_type == DanceBattle_Mgr.CharaType.Player) { this.m_ComboCount = Mathf.Max(this.m_ComboCount, this.m_CharaScoreList[chara_type].nCombo); Dictionary evalueCombo; (evalueCombo = this.m_EvalueCombo)[evalue] = evalueCombo[evalue] + 1; this.m_NoteCount++; } if (this.m_CharaScoreList[chara_type].nCombo > 1 && this.m_CharaScoreList[chara_type].nCombo % Note_Mgr.Instance.SpecialCombo == 0) { Note_Mgr.Instance.SetSpecialFlag(chara_type, true); } } } public void NotMissClear() { if (!this.m_CharaScoreList.ContainsKey(DanceBattle_Mgr.CharaType.Enemy)) { return; } this.m_CharaScoreList[DanceBattle_Mgr.CharaType.Player].nScore += this.m_CharaScoreList[DanceBattle_Mgr.CharaType.Enemy].nScore; } public override void StartAction() { Sprite sprite = null; if (RhythmAction_Mgr.NowDance == RhythmAction_Mgr.DanceType.BenchMark) { sprite = Resources.Load("SceneDance/Rhythm_Action/Sprite/TrialIcon"); } else { Texture2D texture2D = (!RhythmAction_Mgr.Instance.UserMaid) ? null : RhythmAction_Mgr.Instance.UserMaid.GetThumIcon(); if (texture2D) { sprite = Sprite.Create(texture2D, new Rect(0f, 0f, (float)texture2D.width, (float)texture2D.height), Vector2.one * 0.5f); } } if (sprite) { this.m_CharaScoreList[DanceBattle_Mgr.CharaType.Player].MaidIcon.sprite2D = sprite; this.m_CharaScoreList[DanceBattle_Mgr.CharaType.Player].MaidIcon.width = this.m_IconWidth; this.m_CharaScoreList[DanceBattle_Mgr.CharaType.Player].MaidIcon.height = this.m_IconHeight; } this.SetNameUI(DanceBattle_Mgr.CharaType.Player, this.m_PlayerScoreUI); if (this.m_CharaScoreList.ContainsKey(DanceBattle_Mgr.CharaType.Enemy)) { this.SetNameUI(DanceBattle_Mgr.CharaType.Enemy, this.m_EnemyScoreUI); this.m_CharaScoreList[DanceBattle_Mgr.CharaType.Enemy].MaidIcon.sprite2D = DanceBattle_Mgr.EnemyData.Icon; } } public override void EndAction() { Result_Display.SetResultData("Score", Utility.ConvertMoneyText(this.m_CharaScoreList[DanceBattle_Mgr.CharaType.Player].nScore), Result_Display.ResultType.String); switch (RhythmAction_Mgr.NowDance) { case RhythmAction_Mgr.DanceType.Free: case RhythmAction_Mgr.DanceType.Challenge: Result_Display.SetResultData("Perfect", this.m_EvalueCombo[Dance_Note.Evaluation.PERFECT].ToString(), Result_Display.ResultType.String); Result_Display.SetResultData("Great", this.m_EvalueCombo[Dance_Note.Evaluation.GREAT].ToString(), Result_Display.ResultType.String); Result_Display.SetResultData("Good", this.m_EvalueCombo[Dance_Note.Evaluation.GOOD].ToString(), Result_Display.ResultType.String); Result_Display.SetResultData("Bad", this.m_EvalueCombo[Dance_Note.Evaluation.BAD].ToString(), Result_Display.ResultType.String); Result_Display.SetResultData("Miss", this.m_EvalueCombo[Dance_Note.Evaluation.MISS].ToString(), Result_Display.ResultType.String); Result_Display.SetResultData("Rate", Mathf.Floor(this.Score_Rate()).ToString(), Result_Display.ResultType.String); Result_Display.SetResultData("Combo", this.m_ComboCount.ToString(), Result_Display.ResultType.String); if (RhythmAction_Mgr.NowDance == RhythmAction_Mgr.DanceType.Challenge) { this.DecideReward(); } break; case RhythmAction_Mgr.DanceType.VS: { RhythmAction_Mgr.DanceState nowState = RhythmAction_Mgr.NowState; if (nowState != RhythmAction_Mgr.DanceState.Dance_First) { if (nowState == RhythmAction_Mgr.DanceState.Dance_Second) { Result_Display.SetResultData("2ndScore", Utility.ConvertMoneyText(this.m_CharaScoreList[DanceBattle_Mgr.CharaType.Player].nScore), Result_Display.ResultType.String); } } else { Result_Display.SetResultData("1stScore", Utility.ConvertMoneyText(this.m_CharaScoreList[DanceBattle_Mgr.CharaType.Player].nScore), Result_Display.ResultType.String); Result_Display.SetResultData("2ndScore", "NotSecond", Result_Display.ResultType.Image); } break; } } } [SerializeField] private int m_Max_Correct = 100; private const long m_Max_Score = 9999999999L; private const int m_Max_Combo = 99999; [SerializeField] private GameObject m_PlayerScoreUI; [SerializeField] private GameObject m_EnemyScoreUI; private Dictionary m_CharaScoreList = new Dictionary(); [SerializeField] [Header("コンボ数に応じた文字の色")] private Score_Mgr.ComboTextColor[] m_ComboTextColor = new Score_Mgr.ComboTextColor[] { new Score_Mgr.ComboTextColor(0, Color.white), new Score_Mgr.ComboTextColor(101, Color.white), new Score_Mgr.ComboTextColor(201, Color.white), new Score_Mgr.ComboTextColor(301, Color.white), new Score_Mgr.ComboTextColor(500, Color.white) }; private Dictionary m_EvalueCombo = new Dictionary { { Dance_Note.Evaluation.MISS, 0 }, { Dance_Note.Evaluation.BAD, 0 }, { Dance_Note.Evaluation.GOOD, 0 }, { Dance_Note.Evaluation.GREAT, 0 }, { Dance_Note.Evaluation.PERFECT, 0 } }; private List m_AllRewardData = new List(); [SerializeField] [Header("各評価ごとに設定する項目")] private List m_EvalueSetList = new List { new Score_Mgr.EvalueSetting(Dance_Note.Evaluation.MISS, 0, 0), new Score_Mgr.EvalueSetting(Dance_Note.Evaluation.BAD, 0, 50), new Score_Mgr.EvalueSetting(Dance_Note.Evaluation.GOOD, 2, 100), new Score_Mgr.EvalueSetting(Dance_Note.Evaluation.GREAT, 3, 200), new Score_Mgr.EvalueSetting(Dance_Note.Evaluation.PERFECT, 4, 300) }; private int m_NoteCount; [SerializeField] private UILabel m_ComboText; [SerializeField] private UISprite m_ComboText_Child; [SerializeField] private UILabel m_FlashCombo; [SerializeField] private UISprite m_FlashCombo_Child; [SerializeField] [Header("コンボ時の文字拡縮設定")] private float m_ScalingTime = 0.5f; [SerializeField] private float m_ScalingValue = 1.5f; private bool m_ScalingNow; [SerializeField] [Header("アイコンのサイズ")] private int m_IconWidth = 60; [SerializeField] private int m_IconHeight = 60; [SerializeField] [Header("各ボルテージごとの補正スコア")] private Score_Mgr.VoltageCorrect[] m_VoltageCorrect = new Score_Mgr.VoltageCorrect[] { new Score_Mgr.VoltageCorrect(1), new Score_Mgr.VoltageCorrect(2), new Score_Mgr.VoltageCorrect(3), new Score_Mgr.VoltageCorrect(4), new Score_Mgr.VoltageCorrect(5), new Score_Mgr.VoltageCorrect(6) }; private int m_ComboCount; [SerializeField] [Header("アピール中のスコア倍率")] private int m_AppealMagnification = 3; [SerializeField] [Header("MC成功時のボーナスポイント")] private int m_McSuccesBonus = 100; [SerializeField] [Header("スコア文字拡縮")] private float m_ScoreScaling = 1.5f; [SerializeField] private float m_ScoreScalingTime = 1f; private bool m_IsExistMiss; private static Score_Mgr m_Instance; private class CharaScoreData { public long nScore; public int nCombo; public UILabel ScoreText; public UI2DSprite MaidIcon; public string CharaName; } [Serializable] private class ComboTextColor { public ComboTextColor(int combo, Color color) { this.Combo = combo; this.TextColor = color; } [Header("コンボ数")] public int Combo; [Header("文字色")] public Color TextColor; } private class RewardData { public string Rank; public string Condition; public int TargetScore; public int Reward; } [Serializable] private class EvalueSetting { public EvalueSetting(Dance_Note.Evaluation evalue, int judge, int score) { this.Evalue = evalue; this.JudgeNo = judge; this.BaceScore = score; } public Dance_Note.Evaluation Evalue; [Header("判定番号")] public int JudgeNo; [Header("基本スコア")] public int BaceScore; } [Serializable] private class VoltageCorrect { public VoltageCorrect(int voltage) { this.Voltage = voltage; } public int Voltage; public int Correct; } }