예제 #1
0
    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);
    }
예제 #2
0
        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();
        }
예제 #3
0
    // 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;
    }
예제 #4
0
        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();
        }
예제 #5
0
    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);
    }