Пример #1
0
        /// <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;
            }
        }
Пример #2
0
 public void DaggerSelected()
 {
     winInfo.OnSelectionLocked();
     worldMapDaggerSelected.Invoke(currentStage.ToString());
 }
Пример #3
0
        /// <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;
        }
Пример #4
0
        /// <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);
                }
            }
        }