private void UpdateCounting() { if (ballReachedPins) { stillnessTimer += Time.deltaTime; if (stillnessTimer > STILLNESS_TIMEOUT || // Max time elapsed (stillnessTimer > STILLNESS_MIN && pinMaster.AllPinsStill())) // Min time elapsed and all pins are still { scoreMaster.AddScore(pinMaster.GetFallenPins().Count); int[] scores = scoreMaster.GetScores(); LogScore(scores); if (bowlCounter == 20) { GameOver(); } else if (bowlCounter >= 18 && scores[bowlCounter] == 10) // Handle last-frame special cases { NextLaunch(true); } else if (bowlCounter == 19) { if (scores[18] == 10 && scores[19] == 0) { NextLaunch(false); } else if (scores[18] + scores[19] == 10) { NextLaunch(true); } else if (scores[18] + scores[19] >= 10) // Roll 21 awarded { NextLaunch(false); } else { GameOver(); } } else if (bowlCounter % 2 == 0) // First bowl of frame { if (scores[bowlCounter] == 10) { bowlCounter++; scoreMaster.AddScore(0); // Virtual 0 after strike NextLaunch(true); } else { NextLaunch(false); } } else // Second bowl of frame { NextLaunch(true); } } } }