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(); } }