private static async Task <bool> SelectChainFate() { if (!OracleFateManager.WaitingForChainFate()) { return(false); } var chainId = OracleFateManager.FateDatabase.GetFateFromId(OracleFateManager.PreviousFateId).ChainId; var chainOracleFateInfo = OracleFateManager.FateDatabase.GetFateFromId(chainId); if (chainFateTimer == null || !chainFateTimer.IsRunning) { chainFateTimer = Stopwatch.StartNew(); } else if (chainFateTimer.Elapsed > TimeSpan.FromSeconds(FateSettings.Instance.ChainWaitTimeout)) { Logger.SendLog("Timed out waiting for the next FATE in the chain to appear."); OracleFateManager.PreviousFateId = 0; chainFateTimer.Reset(); } Logger.SendLog("Waiting for the follow up FATE: " + chainOracleFateInfo.Name + "."); var chainFateData = FateManager.ActiveFates.FirstOrDefault(result => result.Id == chainId); if (chainFateData == null) { return(false); } // Fix for FATEs that spawn instantly after the previous ends. if (chainFateData.Name.Equals(string.Empty)) { Logger.SendLog("Selected FATE: " + chainOracleFateInfo.Name + "."); } else { Logger.SendLog("Selected FATE: " + chainFateData.Name + "."); } OracleFateManager.CurrentFateId = chainFateData.Id; Poi.Current = new Poi(chainFateData, PoiType.Fate); chainFateTimer.Reset(); return(true); }