Exemplo n.º 1
0
        int Simulate(int frameNumber)
        {
            SWConsole.Crit($"Engine: Simulate frameNumber={frameNumber}");

            InputFrame lastInputFrame = inputFrames[frameNumber - 1];

            InputFrameDelta lastInputFrameDelta = inputFrameDeltas[frameNumber - 1];

            int playerFrameNumber = lastInputFrameDelta.playerFrameNumber;

            InputFrame inputFrame = inputFrames[frameNumber];

            if (inputFrame == null)
            {
                inputFrame = new InputFrame(frameNumber);
                inputFrames[frameNumber] = inputFrame;
            }

            inputFrame.FrameNumber = frameNumber;
            inputFrame.ResetBytes();

            if (lastInputFrame == null || _input == null || inputFrame == null || lastInputFrameDelta == null)
            {
                SWConsole.Error($"Engine: Simulate input data is nil {lastInputFrame} {_input} {inputFrame} {lastInputFrameDelta}");
            }

            lastInputFrameDelta.Apply(_input, lastInputFrame, inputFrame);

            FrameSyncUpdateType updateType = FrameSyncUpdateType.Normal;

            DoSimulate(updateType, inputFrame, frameNumber);

            return(playerFrameNumber);
        }
Exemplo n.º 2
0
        void DoSimulate(FrameSyncUpdateType updateType, InputFrame inputFrame, int frameNumber)
        {
            //Input manager facing frame data
            _currentInputFrame = inputFrame;
            //user facing frame number
            _game.frameNumber = frameNumber;

            //hook for other external systems
            //For example, physics engine
            if (OnEngineWillSimulateEvent != null)
            {
                OnEngineWillSimulateEvent();
            }

            //seed the random number generator
            FrameSyncRandom._internal_seed((UInt32)frameNumber);

            foreach (SWFrameSyncSystem system in _systems)
            {
                system.WillUpdate();
            }

            foreach (SWFrameSyncSystem system in _systems)
            {
                system.Update(_game, _input, updateType);
            }
        }
Exemplo n.º 3
0
 public void InvokeFrameSyncFixedUpdate(FrameSyncInput input, FrameSyncUpdateType frameSyncUpdateType)
 {
     foreach (IFrameSyncUpdate frameSyncUpdate in _frameSyncUpdates)
     {
         frameSyncUpdate.FrameSyncUpdate(input, frameSyncUpdateType);
     }
 }
Exemplo n.º 4
0
 public override void Update(FrameSyncGame game, FrameSyncInput input, FrameSyncUpdateType updateType)
 {
     foreach (var pair in _behaviours)
     {
         StaticFrameSyncBehaviour behaviour = pair.Value;
         if (!behaviour._isInitialized)
         {
             behaviour.InvokeFrameSyncDataInitialize(game);
         }
         behaviour.InvokeFrameSyncFixedUpdate(input, updateType);
     }
 }
Exemplo n.º 5
0
        public void DebugStep(SWBytes bytes, int frameNumber)
        {
            _debugInputFrame = bytes;

            FrameSyncUpdateType updateType = FrameSyncUpdateType.Normal;

            foreach (SWFrameSyncSystem system in _systems)
            {
                system.WillUpdate();
            }

            foreach (SWFrameSyncSystem system in _systems)
            {
                system.Update(_game, _input, updateType);
            }

            _debugInputFrame = null;
        }
Exemplo n.º 6
0
        void WaitingForInitialSystemData()
        {
            if (HasNewInitialInputFrameDeltas())
            {
                //play all initial input frame
                SWConsole.Crit($"WaitingForInitialSystemData has initial input deltas startFrameNumber={_startFrameNumber}");
                InputFrame inputFrame1 = new InputFrame();
                InputFrame inputFrame2 = new InputFrame();

                int frameNumber = _startFrameNumber + 1; //if start number is 1 delta, we need to simulate 2 because 2 = 1 input + 1 delta
                foreach (InputFrameDelta delta in _initialInputFrameDeltas)
                {
                    inputFrame2.ResetBytes();
                    delta.Apply(_input, inputFrame1, inputFrame2);

                    FrameSyncUpdateType updateType = FrameSyncUpdateType.Restore;
                    SWConsole.Crit($"WaitingForInitialSystemData simulate {frameNumber}");

                    DoSimulate(updateType, inputFrame2, frameNumber);

                    InputFrame temp = inputFrame1;
                    inputFrame1 = inputFrame2;
                    inputFrame2 = temp;
                    frameNumber++;
                }

                //start from the last restored frame;
                frameNumber--;
                _currentInputFrameNumber = frameNumber;
                ExportSimulationResult();
                //create an empty input frame to start with
                inputFrames[frameNumber] = inputFrame1;
                //export system data
                ExportSimulationResult();
                SWConsole.Warn($"WaitingForInitialSystemData _initialInputFramesData={_initialInputFramesData.DataLength}");
                _saveHandler(_initialInputFramesData, _startFrameNumber, _endFrameNumber);
                _game.gameState = FrameSyncGameState.Running;

                SetSaveHandler(_endFrameNumber - 1); //end frame was excluded from initial frames, so we want to save it
                SWConsole.Crit($"WaitingForInitialSystemData game is running now _currentInputFrameNumber={_currentInputFrameNumber}");
                ResetTimeStamp();
                return;
            }
        }
Exemplo n.º 7
0
        bool Predict(int localFrameDeltaNumber, int frameNumber)
        {
            SWConsole.Crit($"Engine: Predict localFrameDeltaNumber={localFrameDeltaNumber} frameNumber={frameNumber}");

            InputFrameDelta inputFrameDelta = localInputFrameDeltas[localFrameDeltaNumber];

            _inputFrameForPrediction.FrameNumber = frameNumber;
            _inputFrameForPrediction.ResetBytes();

            inputFrameDelta.Apply(_input, _lastInputFrameForPrediction, _inputFrameForPrediction);

            _input.ApplyPredictionModifier(_inputFrameForPrediction.bytes);

            FrameSyncUpdateType updateType = FrameSyncUpdateType.Prediction;

            DoSimulate(updateType, _inputFrameForPrediction, frameNumber);

            return(true);
        }
Exemplo n.º 8
0
        public override void Update(FrameSyncGame game, FrameSyncInput input, FrameSyncUpdateType updateType)
        {
            foreach (var pair in _behaviours)
            {
                DynamicFrameSyncBehaviour behaviour = pair.Value;

                if (behaviour.hasBufferedToRemove)
                {
                    continue;
                }

                if (!behaviour._isInitialized)
                {
                    behaviour.InvokeFrameSyncDataInitialize(game);
                }

                behaviour.InvokeFrameSyncFixedUpdate(input, updateType);
            }

            foreach (DynamicFrameSyncBehaviour behaviour in _bufferedNewBehaviours)
            {
                if (!behaviour._isInitialized)
                {
                    behaviour.InvokeFrameSyncDataInitialize(game);
                }
                behaviour.InvokeFrameSyncFixedUpdate(input, updateType);

                _behaviours.Add(behaviour.FrameSyncBehaviourID, behaviour);
            }

            foreach (DynamicFrameSyncBehaviour behaviour in _bufferedRemovedBehaviours)
            {
                Remove(behaviour);
            }

            _bufferedNewBehaviours.Clear();
            _bufferedRemovedBehaviours.Clear();
        }
Exemplo n.º 9
0
 public virtual void Update(FrameSyncGame game, FrameSyncInput input, FrameSyncUpdateType updateType)
 {
 }