public void LockstepTurnShouldNotAdvanceIfWaitingForActions() { // var gameLogic = NSubstitute.Substitute.For<DeterministicGameLogic> (); var gameLogic = new TestGameStep.GameStepEngineMock(); var lockstepLogic = NSubstitute.Substitute.For <LockstepLogic> (); LockstepFixedUpdate lockstepGameLogic = new LockstepFixedUpdate(lockstepLogic); lockstepGameLogic.FixedStepTime = 0.1f; lockstepGameLogic.GameFramesPerLockstep = 1; lockstepGameLogic.SetGameLogic(gameLogic); lockstepLogic.IsReady(0).ReturnsForAnyArgs(false); // LockstepGameLogic lockstepGameLogic = new LockstepGameLogic (gameLogic, pendingCommands); lockstepGameLogic.GameFramesPerLockstep = 1; lockstepGameLogic.Update(0.1f); lockstepGameLogic.Update(0.1f); lockstepGameLogic.Update(0.1f); Assert.That(gameLogic.lastFrame, Is.EqualTo(0)); lockstepLogic.IsReady(0).ReturnsForAnyArgs(true); lockstepGameLogic.Update(0.1f); Assert.That(gameLogic.lastFrame, Is.EqualTo(1)); }
public void LockstepLogicShouldNotProcessAgainIfNoFixedGameStep() { var gameLogic = new TestGameStep.GameStepEngineMock(); var lockstepLogic = NSubstitute.Substitute.For <LockstepLogic> (); LockstepFixedUpdate lockstepGameLogic = new LockstepFixedUpdate(lockstepLogic); lockstepGameLogic.FixedStepTime = 0.1f; lockstepGameLogic.GameFramesPerLockstep = 2; lockstepGameLogic.SetGameLogic(gameLogic); lockstepLogic.IsReady(0).ReturnsForAnyArgs(false); lockstepGameLogic.Update(0.1f); lockstepGameLogic.Update(0.1f); // didnt process lockstep turn yet // lockstepLogic.DidNotReceive ().IsReady (Arg.Any<int> ()); lockstepLogic.DidNotReceive().Process(Arg.Any <int> ()); Assert.That(lockstepGameLogic.IsLockstepTurn(), Is.True); lockstepLogic.ClearReceivedCalls(); // if update too low, then even if it is lockstep turn, it didnt process it lockstepGameLogic.Update(0.002f); lockstepLogic.DidNotReceive().IsReady(Arg.Any <int> ()); lockstepLogic.DidNotReceive().Process(Arg.Any <int> ()); }
public void TestProcessLockstepInProperFrame() { var lockstepLogic = NSubstitute.Substitute.For <LockstepLogic> (); LockstepFixedUpdate lockstepGameLogic = new LockstepFixedUpdate(lockstepLogic); lockstepGameLogic.FixedStepTime = 0.1f; lockstepGameLogic.MaxAllowedFrameTime = 100.0f; lockstepGameLogic.GameFramesPerLockstep = 5; lockstepLogic.IsReady(Arg.Any <int> ()).Returns(true); lockstepGameLogic.Update(0.5f); Assert.That(lockstepGameLogic.CurrentGameFrame, Is.EqualTo(5)); Assert.That(lockstepGameLogic.CurrentLockstepFrame, Is.EqualTo(1)); lockstepGameLogic.Update(0.5f); Assert.That(lockstepGameLogic.CurrentGameFrame, Is.EqualTo(10)); Assert.That(lockstepGameLogic.CurrentLockstepFrame, Is.EqualTo(2)); }
public void TestProcessCallsWhenBigUpdateTime() { var lockstepLogic = NSubstitute.Substitute.For <LockstepLogic> (); LockstepFixedUpdate lockstepGameLogic = new LockstepFixedUpdate(lockstepLogic); lockstepGameLogic.FixedStepTime = 0.1f; lockstepGameLogic.MaxAllowedFrameTime = 100.0f; lockstepGameLogic.GameFramesPerLockstep = 5; lockstepLogic.IsReady(Arg.Any <int> ()).Returns(true); lockstepGameLogic.Update(1.2f); lockstepLogic.Received(2).Process(Arg.Any <int>()); // lockstepLogic.Recei }
public void TestIsReadyShouldCheckForProperGameFrame() { var lockstepLogic = NSubstitute.Substitute.For <LockstepLogic> (); LockstepFixedUpdate lockstepGameLogic = new LockstepFixedUpdate(lockstepLogic); lockstepGameLogic.FixedStepTime = 0.1f; lockstepGameLogic.MaxAllowedFrameTime = 100.0f; lockstepGameLogic.GameFramesPerLockstep = 5; lockstepLogic.IsReady(Arg.Any <int> ()).ReturnsForAnyArgs(true); lockstepGameLogic.Update(0.5f); // changed to 4 now that frame is zero indexed lockstepLogic.Received(1).IsReady(Arg.Is <int>(4)); lockstepLogic.Received(1).Process(Arg.Is <int>(4)); }
public void TestLastUpdatedFrameShouldBePreviousToLockstep() { var gameLogic = new TestGameStep.GameStepEngineMock(); var lockstepLogic = NSubstitute.Substitute.For <LockstepLogic> (); LockstepFixedUpdate lockstepGameLogic = new LockstepFixedUpdate(lockstepLogic); lockstepGameLogic.SetGameLogic(gameLogic); lockstepGameLogic.FixedStepTime = 0.1f; lockstepGameLogic.MaxAllowedFrameTime = 1.0f; lockstepGameLogic.GameFramesPerLockstep = 4; lockstepLogic.IsReady(Arg.Any <int> ()).ReturnsForAnyArgs(false); lockstepGameLogic.Update(0.8f); Assert.That(gameLogic.lastFrame, Is.EqualTo(lockstepGameLogic.GetFirstLockstepFrame() - 1)); }
// Update is called once per frame void Update() { gameFixedUpdate.GameFramesPerLockstep = gameFramesPerLockstep; gameFixedUpdate.FixedStepTime = fixedTimestepMilliseconds / 1000.0f; if (Input.GetKeyUp(KeyCode.S)) { var gameState = GetGameState(); SaveState(gameState); Debug.Log((gameState as MyCustomGameState).GetStateString()); } if (Input.GetKeyUp(KeyCode.P)) { StartPlayback(); return; } if (Input.GetKeyUp(KeyCode.R)) { // resets game fixed update state... StartRecording(); return; } if (_replayController.IsRecording) { gameFixedUpdate.Update(Time.deltaTime); if (Input.GetMouseButtonUp(1)) { Vector2 position = camera.ScreenToWorldPoint(Input.mousePosition); _commandSender.EnqueueCommand(ConfigureCommand(new MoveCommand(position))); feedbackClick.ShowFeedback(position); } if (Input.touchCount > 0) { if (Input.GetTouch(0).phase == TouchPhase.Ended) { Vector2 position = camera.ScreenToWorldPoint(Input.GetTouch(0).position); _commandSender.EnqueueCommand(ConfigureCommand(new MoveCommand(position))); feedbackClick.ShowFeedback(position); } } } else { // playback... // if already at last frame, then dont update anymore... if (_replayController.IsFinished()) { return; } gameFixedUpdate.Update(Time.deltaTime * replayPlaybackSpeedMultiplier); // _replay.ReplayCommands (); } }