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); }
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); } }
public void InvokeFrameSyncFixedUpdate(FrameSyncInput input, FrameSyncUpdateType frameSyncUpdateType) { foreach (IFrameSyncUpdate frameSyncUpdate in _frameSyncUpdates) { frameSyncUpdate.FrameSyncUpdate(input, frameSyncUpdateType); } }
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); } }
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; }
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; } }
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); }
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(); }
public virtual void Update(FrameSyncGame game, FrameSyncInput input, FrameSyncUpdateType updateType) { }