using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Linq; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using Console = Game.Console; namespace Game; #if false public class PlayerInputDemo : PlayerInput { protected List buffer = new List(); protected IEnumerator bufferEnumerable; public bool IsPlaying { get { return bufferEnumerable != null; } } public PlayerInputDemo(string demoPath) { if (!File.Exists(demoPath)) return; int expectedPlayerInputStateSize = Unsafe.SizeOf(); Stopwatch sw = Stopwatch.StartNew(); using FileStream fileStream = File.OpenRead(demoPath); using GZipStream stream = new GZipStream(fileStream, CompressionMode.Decompress); int ver = stream.ReadByte(); int inputStateSize = stream.ReadByte(); if (ver != DemoVer || inputStateSize != expectedPlayerInputStateSize) { Console.Print("demover mismatch: version " + ver + " != " + DemoVer + ", inputStateSize " + inputStateSize + " != " + Unsafe.SizeOf()); stream.Close(); return; } Span b = stackalloc byte[expectedPlayerInputStateSize]; while (true) { int bytesLeftInBuffer = expectedPlayerInputStateSize; do { int readBytes = stream.Read(b.Slice(expectedPlayerInputStateSize - bytesLeftInBuffer, bytesLeftInBuffer)); if (readBytes == 0) break; bytesLeftInBuffer -= readBytes; } while (bytesLeftInBuffer > 0); if (bytesLeftInBuffer > 0) break; // EOF; buffer.Add(MemoryMarshal.Read(b)); } sw.Stop(); bufferEnumerable = buffer.GetEnumerator(); Console.Print($"Demo parse time {sw.Elapsed.TotalMilliseconds}ms, frames: {buffer.Count} "); OnEndFrame(); // advances to first frame } public override void OnEndFrame() { // TODO: check if the current state frame matches the current frame number before advancing /*asdf++; if (asdf < 8) return;*/ if (bufferEnumerable == null || !bufferEnumerable.MoveNext()) { if (buffer.Any()) { bufferEnumerable.Dispose(); bufferEnumerable = null; buffer.Clear(); Console.Print("Demo ended"); } return; } //var actorState = currentState.actor; currentState.input = bufferEnumerable.Current; //frame++; //currentState.actor = actorState; } } #endif