public static IEnumerator ExecuteOnPassword(string password, string rawGuess, Action <bool> callback) { var guessArray = rawGuess.Split(';'); var guess = string.Concat(guessArray); TerminalUtil.BlockPlayerInput("[BLOCKED WHILE RUNNING CRACKER]"); var percentage = GetEqualPercentage(password, guessArray); var msg = "Generating passowords based on given hints... This might take a few seconds."; msg = TextUtil.Warning(msg); TerminalUtil.ShowText(msg); float time = Mathf.Log10(guess.Length); time = Mathf.LerpUnclamped(0, 3, time); yield return(new WaitForSecondsRealtime(time)); var random = new System.Random(guess.Length / guessArray.Length); var minCount = (guessArray.Length * guessArray.Length); var passwordsCount = random.Next(minCount, Mathf.CeilToInt((float)(minCount * Math.PI))); msg = string.Format("{0} passwords generated.", passwordsCount); TerminalUtil.ShowText(msg); msg = string.Format("Trying password {0}/{1}", 1, passwordsCount); TerminalUtil.ShowText(msg); for (int i = 1; i < passwordsCount; i++) { msg = string.Format("Trying password {0}/{1}", i + 1, passwordsCount); TerminalUtil.ChangeLastText(msg); yield return(new WaitForSecondsRealtime(.01f)); } TerminalUtil.UnblockPlayerInput(); yield return(null); var success = percentage >= PercentualThresholdToSuccess; callback(success); }