Exemplo n.º 1
0
        public void Write(BinaryWriter writer, System.Action <string> messageCallback = null, System.Action <float> progressCallback = null)
        {
            FixEmptyValues();
            // Get Chunks
            var chunks = new List <Chunk>();

            // Info
            progressCallback?.Invoke(0.01f);
            try {
                chunks.Add(new Chunk((byte)ChunkType.Info, new Dictionary <string, object>()
                {
                    { "ProjectName", ProjectName },
                    { "Description", Description },
                    { "DataVersion", CODE_VERSION },
                    { "BeatmapAuthor", BeatmapAuthor },
                    { "MusicAuthor", MusicAuthor },
                    { "BackgroundAuthor", BackgroundAuthor },
                    { "OpeningBeatmap", OpeningBeatmap },
                    { "LastSaveTime", LastEditTime },
                }));
            } catch (System.Exception ex) {
                messageCallback?.Invoke("Error on get info.\n" + ex.Message);
            }
            // Cover
            try {
                chunks.Add(new Chunk((byte)ChunkType.Cover, new Dictionary <string, object>()
                {
                    { "CoverWidth", FrontCover.Width },
                    { "CoverHeight", FrontCover.Height },
                    { "FrontCover", FrontCover.Data },
                }));
            } catch (System.Exception ex) {
                messageCallback?.Invoke("Error on get cover.\n" + ex.Message);
            }
            // Music
            progressCallback?.Invoke(0.1f);
            try {
                if (MusicData != null && MusicData.Data != null && MusicData.Data.Length > 0)
                {
                    chunks.Add(new Chunk((byte)ChunkType.Music, new Dictionary <string, object>()
                    {
                        { "Format", MusicData.Format },
                        { "Data", MusicData.Data },
                    }));
                }
            } catch (System.Exception ex) {
                messageCallback?.Invoke("Error on get music.\n" + ex.Message);
            }

            // Background
            progressCallback?.Invoke(0.2f);
            try {
                if (BackgroundData != null && BackgroundData.Data != null && BackgroundData.Data.Length > 0)
                {
                    chunks.Add(new Chunk((byte)ChunkType.Background, new Dictionary <string, object>()
                    {
                        { "Format", BackgroundData.Format },
                        { "Data", BackgroundData.Data },
                    }));
                }
            } catch (System.Exception ex) {
                messageCallback?.Invoke("Error on get image.\n" + ex.Message);
            }

            // Beatmap
            progressCallback?.Invoke(0.3f);
            foreach (var pair in BeatmapMap)
            {
                try {
                    if (pair.Value == null)
                    {
                        continue;
                    }
                    chunks.Add(new Chunk((byte)ChunkType.Beatmap, new Dictionary <string, object>()
                    {
                        { "Key", pair.Key },
                        { "Data", JsonUtility.ToJson(pair.Value) },
                    }));
                } catch (System.Exception ex) {
                    messageCallback?.Invoke("Error on get beatmap.\n" + ex.Message);
                }
            }

            // Palette
            progressCallback?.Invoke(0.4f);
            try {
                var palBytes = new List <byte>();
                foreach (var color in Palette)
                {
                    palBytes.Add(color.r);
                    palBytes.Add(color.g);
                    palBytes.Add(color.b);
                    palBytes.Add(color.a);
                }
                chunks.Add(new Chunk((byte)ChunkType.Palette, new Dictionary <string, object>()
                {
                    { "Data", palBytes.ToArray() },
                }));
            } catch (System.Exception ex) {
                messageCallback?.Invoke("Error on get Palette.\n" + ex.Message);
            }

            // Tween
            try {
                chunks.Add(new Chunk((byte)ChunkType.Tween, new Dictionary <string, object>()
                {
                    { "Data", JsonUtility.ToJson(new TweenArray(Tweens), false) },
                }));
            } catch (System.Exception ex) {
                messageCallback?.Invoke("Error on get Tween.\n" + ex.Message);
            }

            // Click Sound
            try {
                chunks.Add(new Chunk((byte)ChunkType.ClickSound, new Dictionary <string, object>()
                {
                    { "Data", Util.ObjectToBytes(new FileDataArray()
                        {
                            Array = ClickSounds.ToArray()
                        }) },
                }));
            } catch (System.Exception ex) {
                messageCallback?.Invoke("Error on get click sound.\n" + ex.Message);
            }

            // Gene
            try {
                chunks.Add(new Chunk((byte)ChunkType.Gene, new Dictionary <string, object>()
                {
                    { "Gene", JsonUtility.ToJson(Gene, false) }
                }));
            } catch (System.Exception ex) {
                messageCallback?.Invoke("Error on get gene.\n" + ex.Message);
            }

            // Write Chunks
            progressCallback?.Invoke(0.5f);
            try {
                writer.Write(Encoding.ASCII.GetBytes(MAGIC_ID));
                writer.Write(chunks.Count);
            } catch (System.Exception ex) {
                messageCallback?.Invoke("Error on write magicID or chunk count.\n" + ex.Message);
            }
            float chunkIndex = 0f;

            foreach (var chunk in chunks)
            {
                try {
                    chunk.Write(writer);
                    progressCallback?.Invoke(0.5f + 0.5f * chunkIndex / chunks.Count);
                } catch (System.Exception ex) {
                    messageCallback?.Invoke("Error on write chunk.\nType = " + (chunk != null ? ((ChunkType)chunk.Type).ToString() : "(null)") + "\n" + ex.Message);
                }
                chunkIndex++;
            }
        }
Exemplo n.º 2
0
        public bool Read(BinaryReader reader, System.Action <string> messageCallback = null)
        {
            // Magic ID
            var magic = Encoding.ASCII.GetString(reader.ReadBytes(MAGIC_ID.Length));

            if (magic != MAGIC_ID)
            {
                messageCallback?.Invoke(string.Format("Wrong magic id. Expecting \"{0}\", get \"{1}\".", MAGIC_ID, magic));
                return(false);
            }
            // Clear Old Data
            ProjectName      = "";
            Description      = "";
            MusicAuthor      = "";
            BeatmapAuthor    = "";
            BackgroundAuthor = "";
            OpeningBeatmap   = "";
            LastEditTime     = 0;
            MusicData        = null;
            BackgroundData   = null;
            BeatmapMap.Clear();
            Gene = null;
            // Get New Data
            short dataVersion = -1;
            int   count       = reader.ReadInt32();

            for (int i = 0; i < count && i < 1024; i++)
            {
                try {
                    var chunk = new Chunk(reader);
                    if (!TargetData[chunk.Type])
                    {
                        continue;
                    }
                    switch ((ChunkType)chunk.Type)
                    {
                    default:
                        break;

                    case ChunkType.Info: {
                        ProjectName      = chunk.GetString("ProjectName");
                        Description      = chunk.GetString("Description");
                        MusicAuthor      = chunk.GetString("MusicAuthor");
                        BeatmapAuthor    = chunk.GetString("BeatmapAuthor");
                        BackgroundAuthor = chunk.GetString("BackgroundAuthor");
                        OpeningBeatmap   = chunk.GetString("OpeningBeatmap");
                        LastEditTime     = chunk.GetLong("LastSaveTime");
                        dataVersion      = chunk.GetShort("DataVersion");
                        break;
                    }

                    case ChunkType.Cover: {
                        FrontCover = new ImageData()
                        {
                            Width  = chunk.GetInt("CoverWidth"),
                            Height = chunk.GetInt("CoverHeight"),
                            Data   = chunk.GetBytes("FrontCover"),
                            Alpha  = false,
                        };
                        break;
                    }

                    case ChunkType.Music: {
                        var clipData = new FileData()
                        {
                            Format = chunk.GetString("Format"),
                            Data   = chunk.GetBytes("Data"),
                        };
                        if (clipData.Data == null || clipData.Data.Length == 0)
                        {
                            break;
                        }
                        MusicData = clipData;
                        break;
                    }

                    case ChunkType.Background: {
                        var texture = new FileData()
                        {
                            Format = chunk.GetString("Format"),
                            Data   = chunk.GetBytes("Data"),
                        };
                        if (texture.Data == null || texture.Data.Length == 0)
                        {
                            break;
                        }
                        BackgroundData = texture;
                        break;
                    }

                    case ChunkType.Beatmap: {
                        var key = chunk.GetString("Key");
                        if (BeatmapMap.ContainsKey(key))
                        {
                            break;
                        }
                        var map = JsonUtility.FromJson <Beatmap>(chunk.GetString("Data"));
                        if (map != null)
                        {
                            map.FixEmpty();
                            BeatmapMap.Add(key, map);
                        }
                        break;
                    }

                    case ChunkType.Palette: {
                        Palette.Clear();
                        var data = chunk.GetBytes("Data");
                        for (int j = 0; j < data.Length; j += 4)
                        {
                            Palette.Add(new Color32(data[j + 0], data[j + 1], data[j + 2], data[j + 3]));
                        }
                        break;
                    }

                    case ChunkType.Tween: {
                        Tweens.Clear();
                        Tweens.AddRange(JsonUtility.FromJson <TweenArray>(chunk.GetString("Data")).GetAnimationTweens());
                        break;
                    }

                    case ChunkType.ClickSound: {
                        ClickSounds.Clear();
                        ClickSounds.AddRange(((FileDataArray)Util.BytesToObject(chunk.GetBytes("Data"))).Array);
                        break;
                    }

                    case ChunkType.Gene: {
                        Gene = JsonUtility.FromJson <GeneData>(chunk.GetString("Gene"));
                        break;
                    }
                    }
                } catch (System.Exception ex) {
                    messageCallback?.Invoke("Error on read chunk.\n" + ex.Message);
                }
            }
            FixEmptyValues();
            return(true);
        }