Ejemplo n.º 1
0
    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));
    }
Ejemplo n.º 2
0
    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> ());
    }
Ejemplo n.º 3
0
    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));
    }
Ejemplo n.º 4
0
    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
    }
Ejemplo n.º 5
0
    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));
    }
Ejemplo n.º 6
0
    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));
    }
Ejemplo n.º 7
0
    // 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 ();
        }
    }