/// <summary> /// Executes the stage runner passed as an argument. /// </summary> /// <param name="stage">The stage currently being run.</param> /// <param name="state">The stage runner state, containing the runner, to execute.</param> /// <param name="token">Cancellation token used to cancel the operation.</param> /// <returns>A task used to await the operation.</returns> private async Task ExecuteStageRunner(Stages stage, StageRunnerState state, CancellationToken token) { try { // Set state and timestamp state.State = State.Running; state.IsCurrent = true; RaiseEvent(OnBeforeStageRunner); // Should it be skipped? if (!state.StageRunner.Skip) { _logger.LogInformation(InformationMessages.RunningStageRunner, state.StageRunner.Name ?? state.StageRunner.GetType().FullName, stage.ToString("G")); token.ThrowIfCancellationRequested(); await state.StageRunner.RunAsync(_runState, token).ConfigureAwait(false); // Set state and timestamp state.State = State.Completed; state.Completed = DateTimeOffset.Now; RaiseEvent(OnAfterStageRunner); state.IsCurrent = false; } else { _logger.LogInformation(InformationMessages.SkippingStageRunner, state.StageRunner.Name ?? state.StageRunner.GetType().FullName, stage.ToString("G")); // Set skipped state state.State = State.Skipped; state.Completed = DateTimeOffset.Now; RaiseEvent(OnAfterStageRunner); state.IsCurrent = false; } } catch (OperationCanceledException) { state.State = State.Cancelled; state.Completed = DateTimeOffset.Now; RaiseEvent(OnAfterStageRunner); state.IsCurrent = false; throw; } catch (Exception e) { // Set stage runner failure state.State = State.Failed; state.Error = e; state.Completed = DateTimeOffset.Now; RaiseEvent(OnAfterStageRunner); state.IsCurrent = false; throw; } }
public void DaggerSelected() { winInfo.OnSelectionLocked(); worldMapDaggerSelected.Invoke(currentStage.ToString()); }
/// <summary> /// Executes the specific stage passed as an argument. /// </summary> /// <param name="stage">The stage to execute.</param> /// <param name="token">Cancellation token used to cancel the operation.</param> /// <returns>A task used to await the operation.</returns> private async Task ExecuteStage(Stages stage, CancellationToken token) { // Set state and timestamp _runState.ExecutionState[stage.ToString("G")].State = State.Running; _runState.ExecutionState[stage.ToString("G")].IsCurrent = true; RaiseEvent(OnBeforeStage); // Filter and sort list of stage runners for stage and in priority order var stageRunners = from runner in _runState.Configuration.StageRunners where (runner.Stages & stage) == stage orderby runner.Priority ascending select runner; if (_logger.IsEnabled(LogLevel.Debug)) { _logger.LogDebug(TraceMessages.FilteredStageRunners, stageRunners.Count(), stage); var groupedRunners = from r in stageRunners group r by r.Priority; foreach (var priority in groupedRunners) { _logger.LogDebug(TraceMessages.PriorityOrderForStageRunners, priority.Key, priority.Select(r => r.Name).ToArray()); } } // Add stage runner state to stage state var states = stageRunners.Select(r => new StageRunnerState() { State = State.Ready, Started = DateTimeOffset.Now, StageRunner = r }); foreach (var state in states) { _runState.ExecutionState[stage.ToString("G")].ExecutionState.Add(state); } // Execute each runner in turn, sorted by priority Exception stageFailure = null; foreach (var stageRunnerState in _runState.ExecutionState[stage.ToString("G")].ExecutionState) { try { await ExecuteStageRunner(stage, stageRunnerState, token).ConfigureAwait(false); } catch (OperationCanceledException) { _runState.ExecutionState[stage.ToString("G")].State = State.Cancelled; _runState.ExecutionState[stage.ToString("G")].Completed = DateTimeOffset.Now; RaiseEvent(OnAfterStage); _runState.ExecutionState[stage.ToString("G")].IsCurrent = false; throw; } catch (Exception e) { // Is runner set to abort on any stage runner exception (FailFast)? if (_runState.Configuration.FailFast) { _logger.LogError(ErrorMessages.StageRunnerFailedAbortingRunner); // Yes, re-throw _runState.ExecutionState[stage.ToString("G")].State = State.Failed; _runState.ExecutionState[stage.ToString("G")].Completed = DateTimeOffset.Now; RaiseEvent(OnAfterStage); _runState.ExecutionState[stage.ToString("G")].IsCurrent = false; throw new RunnerException(ErrorMessages.StageRunnerFailedAbortingRunner, e); } // Capture most recent stage runner execution, so stage can be aborted if needed stageFailure = e; } } // Got to the end of the stage, do we need to abort (FailStages)? if (stageFailure != null && (_runState.Configuration.FailStages & stage) == stage) { _logger.LogError(ErrorMessages.StageFailedAbortingRunner, stage); _runState.ExecutionState[stage.ToString("G")].State = State.Failed; _runState.ExecutionState[stage.ToString("G")].Completed = DateTimeOffset.Now; RaiseEvent(OnAfterStage); _runState.ExecutionState[stage.ToString("G")].IsCurrent = false; throw new RunnerException(string.Format(CultureInfo.CurrentCulture, ErrorMessages.StageFailedErrorMessage, stage), stageFailure); } // Set state and timestamp _runState.ExecutionState[stage.ToString("G")].State = State.Completed; _runState.ExecutionState[stage.ToString("G")].Completed = DateTimeOffset.Now; RaiseEvent(OnAfterStage); _runState.ExecutionState[stage.ToString("G")].IsCurrent = false; }
/// <summary> /// Main Run Cycle /// </summary> private void RunCycle() { int CommonDelay = StepDelay; // Set TM window active User32.SetForegroundWindow(wm.GetTMWindow()); Thread.Sleep(CommonDelay); enumResolution resolution = enumResolution.Default_1280x800; if (cb1280x720.Checked) { resolution = enumResolution.Res_1280x720; } TMScreens tmScreens = new TMScreens(resolution); TMPart part = null; int rumbles = 0; Stages stage = Stages.RunRumble; Stages prevStage = Stages.RunRumble; int claimWait = 0; DateTime start = DateTime.Now; AddLog("--- TMClicker started"); while (true) { switch (stage) { case Stages.RunRumble: // Check stage = Stages.RunRumble it means we don't run rumble yet part = tmScreens.GetPart("RumbleStart"); claimWait++; if (wm.VerifyPart(tmScreens, part) || claimWait > 10) { claimWait = 0; AddLog("RumbleStarted - clicked to run it!"); wm.LeftMouseClick(part.Position.Left, part.Position.Top); stage = Stages.StartAuto; AddLog(string.Format("*** Finished {0} Rumble(s)", rumbles)); AddLog(string.Format("*** Time from start: {0:hh\\:mm\\:ss}", (DateTime.Now - start))); rumbles++; } break; case Stages.StartAuto: // Check if we already started Rumble part = tmScreens.GetPart("RumbleAuto"); if (wm.VerifyPart(tmScreens, part)) { AddLog("RumbleAuto - clicked to turn Auto ON!"); wm.LeftMouseClick(part.Position.Left, part.Position.Top); stage = Stages.CheckAuto; claimWait = 0; } break; case Stages.CheckAuto: // Confirm we started Auto battle part = tmScreens.GetPart("RumbleAutoOn"); if (wm.VerifyPart(tmScreens, part) || claimWait > 5) { AddLog("RumbleAuto - Auto is ON confirmed!"); stage = Stages.CheckWinLose; claimWait = 0; } else { claimWait++; } break; case Stages.CheckWinLose: // Check if we already Won/Defeated part = tmScreens.GetPart("RumbleWon"); if (wm.VerifyPart(tmScreens, part)) { AddLog("Rumble has Won or Defeated!"); wm.LeftMouseClick(part.Position.Left, part.Position.Top); stage = Stages.CheckClaims; } break; case Stages.CheckClaims: // Check if need claim part = tmScreens.GetPart("RumbleClaim"); claimWait++; if (wm.VerifyPart(tmScreens, part)) { AddLog("Rumble Cards Prize has Claimed!"); wm.LeftMouseClick(part.Position.Left, part.Position.Top); claimWait = 0; } // Check if it's Arena change part = tmScreens.GetPart("RumbleArena"); if (wm.VerifyPart(tmScreens, part)) { AddLog("Rumble Arena has been changed!"); wm.LeftMouseClick(part.Position.Left, part.Position.Top); claimWait = 0; } // As after change Arena can be Claim prize, just wait 5 times before move with next Rumble if (claimWait > 3) { AddLog("Claim and Arena checked!"); stage = UseGetGoldSteps ? Stages.CheckGoldChest : Stages.RunRumble; claimWait = 0; } break; case Stages.CheckGoldChest: // Check if it's gold prize part = tmScreens.GetPart("RumbleGold"); claimWait++; if (wm.VerifyPart(tmScreens, part)) { AddLog("Rumble Gold prize - clicked on it!"); wm.LeftMouseClick(part.Position.Left, part.Position.Top); stage = Stages.ClaimGoldChest; } if (claimWait > 3) { AddLog("No Gold Prize - checked."); stage = Stages.ClaimGoldChest; claimWait = 0; } break; case Stages.ClaimGoldChest: // Check to claim gold prize part = tmScreens.GetPart("RumbleGoldClaim"); claimWait++; if (wm.VerifyPart(tmScreens, part)) { AddLog("Rumble Gold Prize has Claimed!"); wm.LeftMouseClick(part.Position.Left, part.Position.Top); stage = Stages.RunRumble; } if (claimWait > 3) { stage = Stages.RunRumble; claimWait = 0; } break; } if (prevStage != stage) { AddLog("Wait on stage = " + stage.ToString()); prevStage = stage; } Thread.Sleep(CommonDelay); if (MainTaskExist) { break; } while (MainTaskPause) { Thread.Sleep(1000); } } }