public void CreateEntry() { ReplayPlayerInfo leftInfo = GenerateInfo(gameInstance.leftPlayer); ReplayPlayerInfo rightInfo = GenerateInfo(gameInstance.rightPlayer); ReplayEntry replayEntry = new ReplayEntry() { leftPlayerData = leftInfo, rightPlayerData = rightInfo, time = timer, leftScore = gameInstance.leftScore, rightScore = gameInstance.rightScore }; currentReplay.entries.Enqueue(replayEntry); }
public Replay(Reader reader) { Reader creader = reader.getCompressedStreamRaw(); reader.Close(); // Signature if (creader.ReadUInt32() != signature) { creader.Close(); throw new Exception("Invalid Replay v5 signature"); } gameVer = creader.ReadInt32(); isPacked = creader.readBool32(); bool isNotEmpty = creader.readBool32(); int frameCount = creader.ReadInt32(); startingFrame = creader.ReadInt32(); zoneID = creader.ReadInt32(); act = creader.ReadInt32(); characterID = creader.ReadInt32(); isPlusLayout = creader.readBool32(); oscillation = creader.ReadInt32(); int bufferSize = creader.ReadInt32(); float avgSize = creader.ReadSingle(); unknown = creader.ReadInt32(); frames.Clear(); for (int f = 0; f < frameCount; ++f) { ReplayEntry frame = new ReplayEntry(); frame.unpack(creader, isPacked); frames.Add(frame); } creader.Close(); }
// Update is called once per frame override protected void Update() { base.Update(); if (replay != null && replay.entries.Count > 1) { var entry = replay.entries.Peek(); while (replay.entries.Count > 1 && timer > entry.time) { //Debug.Log("Trying"); replay.entries.Dequeue(); //Update Score Vector3 val = leftScoreSprite.transform.localScale; val.x = 0.25f * Mathf.Clamp(entry.leftScore - replay.leftStartScore, 0, 20); leftScoreSprite.transform.localScale = val; val = rightScoreSprite.transform.localScale; val.x = 0.5f * Mathf.Clamp(entry.rightScore - replay.rightStartScore, 0, 20); rightScoreSprite.transform.localScale = val; interesting = entry.leftScore - replay.leftStartScore > entry.rightScore - replay.rightStartScore; previousEntry = entry; entry = replay.entries.Peek(); } float t = timer - previousEntry.time / (entry.time - previousEntry.time); if (float.IsNaN(t) || float.IsInfinity(t)) { t = 0; } SetPlayer(leftPlayer, previousEntry.leftPlayerData, entry.leftPlayerData, t); SetPlayer(rightPlayer, previousEntry.rightPlayerData, entry.rightPlayerData, t); } timer += Time.deltaTime; }
public Replay(Reader reader) { Reader creader = reader.GetCompressedStreamRaw(); //creader.BaseStream.Position = 0x84; int[] data = new int[creader.BaseStream.Length / 4]; creader.BaseStream.Position = 0; for (int i = 0; i < creader.BaseStream.Length / 4; i++) { data[i] = creader.ReadInt32(); } creader.Seek(0, SeekOrigin.Begin); for (int i = 0; i < 14; i++) { Header[i] = creader.ReadInt32(); } for (int i = 0; i < Header[4]; i++) { ReplayEntry entry = new ReplayEntry(); entry.Data[0] = creader.ReadInt32(); //Inputs entry.Data[1] = creader.ReadInt32(); //Flags entry.Data[2] = creader.ReadInt32(); //Fuckery entry.Data[3] = creader.ReadInt32(); } //"CurrentEntity->ObjectID" is actually "Scene.Mode" //data[0]: Header //data[1]: ??? //data[2]: Packed Flag //data[3]: ActiveBuffer //data[4]: EntryCount //data[5]: FrameCount //data[6]: ZoneID (MenuParam[92]) //data[7]: ActID (MenuParam[93]) //data[8]: PlayerID (MenuParam[91]) //data[9]: PlusLayout //data[10]: Oscillation //data[11]: ??? //data[12]: ??? //data[13]: ??? //Entries Start: 14/0xE //Entry Size: 28 (bytes) (7 ints) //Entry[2]: Inputs //Input & 0x01 = ??? (Up) //Input & 0x02 = ??? (Down) //Input & 0x04 = ??? (Left) //Input & 0x08 = ??? (Right) //Input & 0x10 = ??? (JumpPress) //Input & 0x20 = ??? (JumpHold) creader.Close(); //Writer writer = new Writer("Replay.bin"); //writer.Write(data); //writer.Close(); }
static ReplayStat AnalyseReplay(Replay replay, bool printData = true) { ReplayStat replayStat = new ReplayStat(); bool first = true; bool scoreJustChanged = false; ReplayEntry previousEntry = new ReplayEntry(); foreach (var entry in replay.entries) { replayStat.length = entry.time; if (first) { previousEntry = entry; first = false; continue; } Vector3 distanceChange = entry.leftPlayerData.position - previousEntry.leftPlayerData.position; if (distanceChange.sqrMagnitude > 0.1 && scoreJustChanged) { //Debug.Log("ScoreResetHappened"); previousEntry = entry; scoreJustChanged = false; continue; } scoreJustChanged |= previousEntry.leftScore != entry.leftScore || previousEntry.rightScore != entry.rightScore; if (distanceChange.y > 0) { replayStat.distanceMovedUp += distanceChange.y; } float directionToOpponent = Mathf.Sign(entry.rightPlayerData.position.x - entry.leftPlayerData.position.x); if (Mathf.Sign(distanceChange.x) == directionToOpponent) { replayStat.distanceMovedTowardsOpponent += Mathf.Abs(distanceChange.x); } else { replayStat.distanceMovedAwayOpponent += Mathf.Abs(distanceChange.x); } if (entry.leftPlayerData.dropping && !previousEntry.leftPlayerData.dropping) { replayStat.diveCount++; } if (!entry.leftPlayerData.onFloor && previousEntry.leftPlayerData.onFloor) { if (Mathf.Abs(distanceChange.x) > 0) { replayStat.hopCount++; } else { replayStat.jumpCount++; } } previousEntry = entry; } replayStat.leftScore = (previousEntry.leftScore - replay.leftStartScore); replayStat.rightScore = (previousEntry.rightScore - replay.rightStartScore); if (printData) { Debug.Log("Final Score: " + replayStat.leftScore + "::" + replayStat.rightScore); Debug.Log("HopCount: " + replayStat.hopCount + ". JumpCount: " + replayStat.jumpCount + ". DiveCount: " + replayStat.diveCount); Debug.Log("MoveToward: " + replayStat.distanceMovedTowardsOpponent + ". MoveAway: " + replayStat.distanceMovedAwayOpponent + ". Move up: " + replayStat.distanceMovedUp); } return(replayStat); }