예제 #1
0
        public static Replay Parse(string filePath)
        {
            var parsedReplay = new Replay();

            using (var fs = new FileStream(filePath, FileMode.Open))
                using (var br = new BinaryReader(fs))
                {
                    parsedReplay.ReplayVersion = br.ReadString();
                    parsedReplay.MapMd5        = br.ReadString();
                    br.ReadString();
                    parsedReplay.PlayerName = br.ReadString();
                    br.ReadString();
                    br.ReadInt64();

                    parsedReplay.Mode = (GameMode)br.ReadInt32();

                    if (parsedReplay.ReplayVersion == "0.0.1" || parsedReplay.ReplayVersion == "None")
                    {
                        parsedReplay.Mods = (Mods)br.ReadInt32();
                    }
                    else
                    {
                        parsedReplay.Mods = (Mods)br.ReadInt64();
                    }

                    br.ReadBytes(40);

                    if (parsedReplay.ReplayVersion != "None")
                    {
                        var replayVersion = new Version(parsedReplay.ReplayVersion);

                        if (replayVersion >= new Version("0.0.1"))
                        {
                            parsedReplay.RandomizeModifierSeed = br.ReadInt32();
                        }
                    }

                    parsedReplay.Frames = new List <ReplayFrame>();

                    var frames = new List <string>();

                    frames = Encoding.ASCII.GetString(LZMAHelper.Decompress(br.BaseStream).ToArray()).Split(',').ToList();

                    foreach (var frame in frames)
                    {
                        try
                        {
                            var frameSplit = frame.Split('|');

                            parsedReplay.Frames.Add(new ReplayFrame(int.Parse(frameSplit[0]), (ReplayKeyPressState)Enum.Parse(typeof(ReplayKeyPressState), frameSplit[1])));
                        }
                        catch
                        {
                            continue;
                        }
                    }
                }

            return(parsedReplay);
        }
예제 #2
0
    public static void ReadByte(string scode, com_pixelEdit edit)
    {
        try
        {
            var    src       = edit.edit;
            var    p         = edit.palette;
            string strbase64 = System.Uri.UnescapeDataString(scode);
            byte[] bb        = System.Convert.FromBase64String(strbase64);
            var    s         = LZMAHelper.DeCompress(new System.IO.MemoryStream(bb), (uint)bb.Length);
            bb = new byte[s.Length];
            s.Read(bb, 0, bb.Length);

            int seek  = 0;
            int width = bb[seek]; seek++;
            if (width == 0)
            {
                width = 256;
            }
            int height = bb[seek]; seek++;
            if (height == 0)
            {
                height = 256;
            }
            Debug.Log("w=" + width + ",h=" + height);
            edit.Resize(width, height);
            Color32[] pp = src.GetPixels32(0);
            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    byte ind = bb[seek]; seek++;
                    pp[y * width + x].a = ind;
                }
            }
            src.SetPixels32(pp, 0);
            src.Apply();
            Color32[] ppp = p.GetPixels32(0);
            int       c   = bb[seek]; seek++;
            for (int i = 0; i < c; i++)
            {
                byte inde = bb[seek]; seek++;
                byte r    = bb[seek]; seek++;
                byte g    = bb[seek]; seek++;
                byte b    = bb[seek]; seek++;
                ppp[inde].r = r;
                ppp[inde].g = g;
                ppp[inde].b = b;
            }
            p.SetPixels32(ppp);
            p.Apply();
        }
        catch
        {
        }
    }
예제 #3
0
        public override void Load()
        {
            base.Load();
            string path = m_Path;

            m_NeedUnpack = ConstantData.enableUnpack && path.Contains(ConstantData.assetBundleAbsolutePath);

            if (m_Async)
            {
                if (m_NeedUnpack)
                {
                    m_StageCount = 2;

                    byte[] bytes = FileHelper.ReadByteFromFile(path);
                    m_DecompressRequest = LZMACompressRequest.CreateDecompress(bytes);
                }
                else
                {
                    m_abRequest = AssetBundle.LoadFromFileAsync(path);
                }
            }
            else
            {
                AssetBundle ab = null;
                try
                {
                    if (m_NeedUnpack)
                    {
                        byte[] bytes  = FileHelper.ReadByteFromFile(path);
                        byte[] result = new byte[1];
                        int    size   = LZMAHelper.Uncompress(bytes, ref result);
                        if (size == 0)
                        {
                            UnityEngine.Debug.Log("Uncompress Failed");
                        }
                        else
                        {
                            ab = AssetBundle.LoadFromMemory(result);
                        }
                    }
                    else
                    {
                        ab = AssetBundle.LoadFromFile(path);
                    }
                }
                catch (System.Exception e)
                {
                    UnityEngine.Debug.Log(e.Message);
                }
                finally
                {
                    OnLoaded(ab);
                }
            }
        }
예제 #4
0
 void TestDeCompress()
 {
     try
     {
         LZMAHelper.DeCompress(ApplicationdataPath + "/Package_unitypackage.7z", ApplicationdataPath + "/Package_decompress.upk", m_CodeProgress);
     }
     catch (Exception ex)
     {
         Debug.Log(ex);
     }
 }
        /// <summary>
        /// 压缩
        /// </summary>
        public void Compress()
        {
            this.slider.value = 0;
            new Thread(() =>
            {
                LZMAHelper.Compress(path + "/PackFolder/xml.upk", path + "/PackFolder/xml.zupk", cp, (str) =>
                {
                    print(str);
                });
            }).Start();


            //this.StartCoroutine(WaitCompress());
        }
        /// <summary>
        /// 解压
        /// </summary>
        public void Decompress()
        {
            this.progress = 0;
            new Thread(() =>
            {
                LZMAHelper.DeCompress(path + "/Enemy/Enemy.zupk", path + "/Enemy/EnemyDe.upk", cp, (str) => {
                    print(str);
                    Release();
                    //释放完成之后就将isReleaseOver设置为true;
                    isReleaseOver = true;
                });
            }).Start();

            //this.StartCoroutine(this.WaitDecompress());
        }
예제 #7
0
 void ExtractUPK(UpdateVersion zipInfo)
 {
     try
     {
         string localPak = ResMng.GetUpdateTmpPath() + "/" + Guid.NewGuid().ToString() + ".pak";
         if (File.Exists(localPak))
         {
             File.Delete(localPak);
         }
         LZMAHelper.DeCompressFile(zipInfo.File.strLocalPath, localPak);
         UPKExtra.ExtraUPK(localPak, ResMng.GetResPath());
         AppInfo.SetAppVersion(zipInfo.VersionMax);
         UpdateHelper.CleanVersion();
         GameStart();
     }
     catch (Exception exp)
     {
         Log.WriteError(exp.Message + "|" + exp.StackTrace);
     }
 }
예제 #8
0
        private static unsafe string LZMATest()
        {
            //var opts = new LZMAOptionLZMA(9);
            Console.WriteLine("opt-size {0}", sizeof(LZMAOptionLZMA));
            Console.WriteLine("stream-size {0}", sizeof(LZMAStreamNative));
            Console.WriteLine("filter-size {0}", sizeof(LZMAFilter));
            var z = new LZMAStream(new FileStream("test.xz", FileMode.Create), CompressionMode.Compress, 3)
            {
                CloseUnderlyingStream = true
            };
            var b = Encoding.ASCII.GetBytes("Just some test string to compress with lzma");

            z.Write(b, 0, b.Length);
            z.Close();
            Console.WriteLine("{0} bytes read, {1} bytes written", z.TotalBytesIn, z.TotalBytesOut);

            var t = new LZMAStream(new FileStream("test.xz", FileMode.Open), CompressionMode.Decompress)
            {
                CloseUnderlyingStream = true
            };

            t.Read(b, 0, b.Length);
            var s = Encoding.ASCII.GetString(b);

            Console.WriteLine("{0} bytes read, {1} bytes written", t.TotalBytesIn, t.TotalBytesOut);

            Console.ReadLine();

            var bc = new byte[1000];
            int ip;
            int op;
            var compRet = LZMAHelper.CompressBuffer(b, bc, out op, 9);

            Console.WriteLine("{0} bytes read, {1} bytes written, {2}", b.Length, op, compRet);
            op = 0;
            var decRet = LZMAHelper.DecompressBuffer(bc, out ip, b, out op);

            Console.WriteLine("{0} bytes read, {1} bytes written, {2}", ip, op, decRet);
            File.Delete("test.xz");
            return(s);
        }
예제 #9
0
        /// <summary>
        /// Parses .osr file.
        /// </summary>
        /// <param name="stream">Stream containing replay data.</param>
        /// <returns>A usable <see cref="Replay"/>.</returns>
        public static Replay Decode(Stream stream)
        {
            Replay replay = new Replay();

            using (var r = new SerializationReader(stream))
            {
                replay.Ruleset        = (Ruleset)r.ReadByte();
                replay.OsuVersion     = r.ReadInt32();
                replay.BeatmapMD5Hash = r.ReadString();
                replay.PlayerName     = r.ReadString();
                replay.ReplayMD5Hash  = r.ReadString();
                replay.Count300       = r.ReadUInt16();
                replay.Count100       = r.ReadUInt16();
                replay.Count50        = r.ReadUInt16();
                replay.CountGeki      = r.ReadUInt16();
                replay.CountKatu      = r.ReadUInt16();
                replay.CountMiss      = r.ReadUInt16();
                replay.ReplayScore    = r.ReadInt32();
                replay.Combo          = r.ReadUInt16();
                replay.PerfectCombo   = r.ReadBoolean();
                replay.Mods           = (Mods)r.ReadInt32();

                string lifeData = r.ReadString();
                if (!string.IsNullOrEmpty(lifeData))
                {
                    foreach (string lifeBlock in lifeData.Split(','))
                    {
                        string[] split = lifeBlock.Split('|');
                        if (split.Length < 2)
                        {
                            continue;
                        }

                        replay.LifeFrames.Add(new LifeFrame()
                        {
                            Time       = Convert.ToInt32(split[0]),
                            Percentage = ParseHelper.ToFloat(split[1])
                        });
                    }
                }

                replay.ReplayTimestamp = r.ReadDateTime();
                replay.ReplayLength    = r.ReadInt32();

                if (replay.ReplayLength > 0)
                {
                    byte[] replayDataBytes    = r.ReadBytes(replay.ReplayLength);
                    byte[] decompressedBytes  = LZMAHelper.Decompress(replayDataBytes);
                    string decompressedString = Encoding.ASCII.GetString(decompressedBytes);
                    int    lastTime           = 0;

                    foreach (string frame in decompressedString.Split(','))
                    {
                        if (string.IsNullOrEmpty(frame))
                        {
                            continue;
                        }

                        string[] split = frame.Split('|');

                        if (split.Length < 4)
                        {
                            continue;
                        }

                        if (split[0] == "-12345")
                        {
                            replay.Seed = Convert.ToInt32(split[3]);
                            continue;
                        }

                        ReplayFrame replayFrame = new ReplayFrame();
                        replayFrame.TimeDiff = Convert.ToInt32(split[0]);
                        replayFrame.Time     = Convert.ToInt32(split[0]) + lastTime;
                        replayFrame.X        = ParseHelper.ToFloat(split[1]);
                        replayFrame.Y        = ParseHelper.ToFloat(split[2]);
                        switch (replay.Ruleset)
                        {
                        case Ruleset.Standard:
                            replayFrame.StandardKeys = (StandardKeys)Convert.ToInt32(split[3]);
                            break;

                        case Ruleset.Taiko:
                            replayFrame.TaikoKeys = (TaikoKeys)Convert.ToInt32(split[3]);
                            break;

                        case Ruleset.Fruits:
                            replayFrame.CatchKeys = (CatchKeys)Convert.ToInt32(split[3]);
                            break;

                        case Ruleset.Mania:
                            replayFrame.ManiaKeys = (ManiaKeys)replayFrame.X;
                            break;
                        }

                        replay.ReplayFrames.Add(replayFrame);

                        lastTime = replay.ReplayFrames.Last().Time;
                    }
                }

                if (r.BaseStream.Length - r.BaseStream.Position > 0)
                {
                    if (r.BaseStream.Length - r.BaseStream.Position == 4)
                    {
                        replay.OnlineId = r.ReadInt32();
                    }
                    else
                    {
                        replay.OnlineId = r.ReadInt64();
                    }
                }
            }

            return(replay);
        }
예제 #10
0
        public static void Write(Replay replay, string path)
        {
            using (SerializationWriter writer = new SerializationWriter(new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read)))
            {
                writer.Write((byte)replay.Ruleset);
                writer.Write(replay.OsuVersion);
                writer.Write(replay.BeatmapMD5Hash);
                writer.Write(replay.PlayerName);
                writer.Write(replay.ReplayMD5Hash);
                writer.Write(replay.Count300);
                writer.Write(replay.Count100);
                writer.Write(replay.Count50);
                writer.Write(replay.CountGeki);
                writer.Write(replay.CountKatu);
                writer.Write(replay.CountMiss);
                writer.Write(replay.ReplayScore);
                writer.Write(replay.Combo);
                writer.Write(replay.PerfectCombo);
                writer.Write((int)replay.Mods);

                string lifeFrames = null;
                foreach (LifeFrame frame in replay.LifeFrames)
                {
                    lifeFrames += $"{frame.Time.Format()}|{frame.Percentage.Format()},";
                }
                writer.Write(lifeFrames);

                writer.Write(replay.ReplayTimestamp.ToUniversalTime().Ticks);

                if (replay.ReplayFrames.Count == 0)
                {
                    writer.Write(0);
                }
                else
                {
                    string replayFrames = string.Empty;
                    foreach (ReplayFrame frame in replay.ReplayFrames)
                    {
                        int keys = 0;
                        switch (replay.Ruleset)
                        {
                        case Ruleset.Standard:
                            keys = (int)frame.StandardKeys;
                            break;

                        case Ruleset.Taiko:
                            keys = (int)frame.TaikoKeys;
                            break;

                        case Ruleset.Fruits:
                            keys = (int)frame.CatchKeys;
                            break;

                        case Ruleset.Mania:
                            keys = (int)frame.ManiaKeys;
                            break;
                        }

                        replayFrames += $"{frame.TimeDiff}|{frame.X.Format()}|{frame.Y.Format()}|{keys},";
                    }

                    byte[] rawBytes = Encoding.ASCII.GetBytes(replayFrames);
                    using (MemoryStream ms = new MemoryStream())
                    {
                        ms.Write(rawBytes, 0, rawBytes.Length);

                        MemoryStream codedStream        = LZMAHelper.Compress(ms);
                        byte[]       rawBytesCompressed = new byte[codedStream.Length];
                        codedStream.Read(rawBytesCompressed, 0, rawBytesCompressed.Length);

                        writer.Write(rawBytesCompressed.Length);
                        writer.Write(rawBytesCompressed);
                    }
                }

                writer.Write(replay.OnlineId);
            }
        }
        IEnumerator WaitDecompress()
        {
            yield return(new WaitForSeconds(1));

            LZMAHelper.DeCompress(Application.dataPath + "/PackFolder/xml.zupk", Application.dataPath + "/PackFolder/xmlDe.upk", cp);
        }