Exemple #1
0
        public void OnClear(GameNote note, NoteGrade grade, float timeUntilEnd, double greatGradeWeight)
        {
            if (grade == NoteGrade.Undetermined)
            {
                return;
            }
            if (NoteRankings[note.Note.id] != NoteGrade.Undetermined)
            {
                return;
            }

            if (!IsRanked)
            {
                if (grade != NoteGrade.Perfect && grade != NoteGrade.Great)
                {
                    isMillionMasterPossible = false;
                }
            }
            else
            {
                if (grade != NoteGrade.Perfect)
                {
                    isMillionMasterPossible = false;
                }
            }

            NoteCleared++;
            NoteRankings[note.Note.id] = grade;

            if (grade != NoteGrade.Perfect && grade != NoteGrade.Miss)
            {
                if (timeUntilEnd > 0)
                {
                    Early++;
                }
                else
                {
                    Late++;
                }
            }

            timeOffs.Add(timeUntilEnd);

            // Combo
            if (grade == NoteGrade.Bad || grade == NoteGrade.Miss)
            {
                Combo = 0;
            }
            else
            {
                Combo++;
                if (MaxCombo < Combo)
                {
                    MaxCombo = Combo;
                }
            }

            if (IsRanked)
            {
                switch (grade)
                {
                case NoteGrade.Perfect:
                    ComboMultiplier += 0.002D * magicNumber;
                    break;

                case NoteGrade.Great:
                    ComboMultiplier += 0.0005D * magicNumber;
                    break;

                case NoteGrade.Good:
                    ComboMultiplier -= -0.005D * magicNumber;
                    break;

                case NoteGrade.Bad:
                    ComboMultiplier -= 0.025D * magicNumber;
                    break;

                case NoteGrade.Miss:
                    ComboMultiplier -= 0.05D * magicNumber;
                    break;
                }

                if (ComboMultiplier > 1)
                {
                    ComboMultiplier = 1;
                }
                if (ComboMultiplier < 0)
                {
                    ComboMultiplier = 0;
                }
            }

            // Score
            if (!IsRanked)
            {
                Score += 900000f / NoteCount * grade.ScoreWeight(ranked: false) +
                         100000f / (NoteCount * (double)(NoteCount + 1) / 2f) * Combo;
            }
            else
            {
                var maxNoteScore = 1000000.0 / NoteCount;

                double noteScore;

                if (grade == NoteGrade.Great)
                {
                    noteScore = maxNoteScore * (NoteGrade.Great.ScoreWeight(ranked: true) +
                                                (NoteGrade.Perfect.ScoreWeight(ranked: true) -
                                                 NoteGrade.Great.ScoreWeight(ranked: true)) *
                                                greatGradeWeight);
                }
                else
                {
                    noteScore = maxNoteScore * grade.ScoreWeight(ranked: true);
                }

                noteScore *= ComboMultiplier;

                Score += noteScore;
            }

            if (Score > 999500)
            {
                if (NoteCleared == NoteCount && isMillionMasterPossible)
                {
                    Score = 1000000;
                }
            }

            if (Score > 1000000)
            {
                Score = 1000000;
            }

            // TP
            if (!IsRanked || grade != NoteGrade.Great)
            {
                currentTp += 100f * grade.TpWeight();
            }
            else
            {
                currentTp += 100f * (NoteGrade.Great.TpWeight() +
                                     (NoteGrade.Perfect.TpWeight() - NoteGrade.Great.TpWeight()) * greatGradeWeight);
            }
            Tp = currentTp / NoteCleared;

            // HP
            if (Mods.Contains(Mod.Hard) || Mods.Contains(Mod.ExHard))
            {
                var mods = Mods.Contains(Mod.ExHard) ? ExHardHpMods : HardHpMods;

                var mod = mods.Select[note.Note.type]
                          .Select[IsRanked ? RankedGradingIndices[grade] : UnrankedGradingIndices[grade]];

                switch (mod.Type)
                {
                case HpModType.Absolute:
                    Hp += mod.Value;
                    break;

                case HpModType.Percentage:
                    Hp += mod.Value / 100f * MaxHp;
                    break;

                case HpModType.DivideByNoteCount:
                    Hp += (mod.Value / NoteCount) / 100f * MaxHp;
                    break;
                }

                if (Hp > MaxHp)
                {
                    Hp = MaxHp;
                }
                if (Hp < 0)
                {
                    Game.Instance.Fail();
                }
            }

            if (
                (Mods.Contains(Mod.AP) && grade != NoteGrade.Perfect)
                ||
                (Mods.Contains(Mod.FC) && (grade == NoteGrade.Bad || grade == NoteGrade.Miss))
                )
            {
                Game.Instance.Fail();
            }
        }