public void StartReversalLoop(SlotInput slotInput) { lock (RunReversalThreadLock) { _runReversalThread = true; } Thread reversalThread = new Thread(() => { LogManager.Instance.WriteLine("Reversal Thread start"); var currentDummy = GetDummy(); bool localRunReversalThread = true; this._stroke = this.GetReplayKeyStroke(); while (localRunReversalThread && !this._process.HasExited) { try { int wakeupTiming = GetWakeupTiming(currentDummy); if (wakeupTiming != 0) { WaitAndReversal(slotInput, wakeupTiming); } } catch (Exception ex) { LogManager.Instance.WriteException(ex); StopReversalLoop(); ReversalLoopErrorOccured?.Invoke(ex); return; } lock (RunReversalThreadLock) { localRunReversalThread = _runReversalThread; } Thread.Sleep(1); } LogManager.Instance.WriteLine("Reversal Thread ended"); }) { Name = "reversalThread" }; reversalThread.Start(); this.BringWindowToFront(); }
public void StartWakeupReversalLoop(SlotInput slotInput, int wakeupReversalPercentage) { lock (RunReversalThreadLock) { _runReversalThread = true; } Thread reversalThread = new Thread(() => { LogManager.Instance.WriteLine("Reversal Thread start"); var currentDummy = GetDummy(); bool localRunReversalThread = true; Random rnd = new Random(); bool willReversal = rnd.Next(0, 101) <= wakeupReversalPercentage; this._stroke = this.GetReplayKeyStroke(); while (localRunReversalThread && !this._process.HasExited) { try { int wakeupTiming = GetWakeupTiming(currentDummy); if (wakeupTiming != 0) { int fc = FrameCount(); var frames = wakeupTiming - slotInput.ReversalFrameIndex - 1; while (FrameCount() < fc + frames) { } if (willReversal) { PlayReversal(); } willReversal = rnd.Next(0, 101) <= wakeupReversalPercentage; Thread.Sleep(16); // ~1 frame //Thread.Sleep(320); //20 frames, approximately, it's actually 333.333333333 ms. Nobody should be able to be knocked down and get up in this time, causing the code to execute again. } } catch (Exception ex) { LogManager.Instance.WriteException(ex); StopReversalLoop(); ReversalLoopErrorOccured?.Invoke(ex); return; } lock (RunReversalThreadLock) { localRunReversalThread = _runReversalThread; } Thread.Sleep(1); } LogManager.Instance.WriteLine("Reversal Thread ended"); }) { Name = "reversalThread" }; reversalThread.Start(); this.BringWindowToFront(); }