Exemplo n.º 1
0
        public void Load(SpriteSheet sheet, FrameData frameData, string overrideForm)
        {
            string formDirectory = "Forms/" + overrideForm + "/";

            frameData.SetFrameSize(FrameWidth, FrameHeight);
            using (ZipFile zipFile = ZipFile.Read(path))
            {

                foreach (FrameType frameType in Enum.GetValues(typeof(FrameType)))
                {
                    if (FrameTypeHelper.IsFrameTypeDirectionless(frameType) == false)
                    {
                        for (int i = 0; i < 8; i++)
                        {
                            Enums.Direction dir = GraphicsManager.GetAnimIntDir(i);

                            using (MemoryStream ms = new MemoryStream())
                            {
                                string fullImageString = formDirectory + GetFrameTypeString(frameType) + "-" + GetDirectionString(dir) + ".png";

                                if (zipFile.ContainsEntry(fullImageString))
                                {
                                    zipFile[fullImageString].Extract(ms);

                                    ms.Seek(0, SeekOrigin.Begin);
                                    Bitmap bitmap = (Bitmap)Image.FromStream(ms);
                                    Surface sheetSurface = new Surface(bitmap);
                                    sheetSurface.Transparent = true;

                                    sheet.AddSheet(frameType, dir, sheetSurface);

                                    frameData.SetFrameCount(frameType, dir, bitmap.Width / frameData.FrameWidth);
                                }
                                else
                                {
                                    frameData.SetFrameCount(frameType, dir, 0);
                                }
                            }
                        }
                    }
                    else
                    {
                        using (MemoryStream ms = new MemoryStream())
                        {
                            string fullImageString = formDirectory + GetFrameTypeString(frameType) + "-" + GetDirectionString(Enums.Direction.Down) + ".png";

                            if (zipFile.ContainsEntry(fullImageString))
                            {
                                zipFile[fullImageString].Extract(ms);

                                ms.Seek(0, SeekOrigin.Begin);
                                Bitmap bitmap = (Bitmap)Image.FromStream(ms);
                                Surface sheetSurface = new Surface(bitmap);
                                sheetSurface.Transparent = true;

                                sheet.AddSheet(frameType, Enums.Direction.Down, sheetSurface);

                                frameData.SetFrameCount(frameType, Enums.Direction.Down, bitmap.Width / frameData.FrameWidth);
                            }
                            else
                            {
                                frameData.SetFrameCount(frameType, Enums.Direction.Down, 0);
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 2
0
        public static SpriteSheet GetSpriteSheet(int num, int form, int shiny, int gender)
        {
            //System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
            //watch.Start();
            //System.Diagnostics.Debug.WriteLine("PkMn #"+num+"("+form+"/"+shiny+"/"+gender+") requested");
            string formString = SpriteXLoader.GetSpriteFormString(form, shiny, gender);

            SpriteSheet sheet = null;
            lock (spriteCache)
            {
                sheet = spriteCache.Get(num + formString);
            }
            if (sheet != null)
            {
                //watch.Stop();
                //System.Diagnostics.Debug.WriteLine("PkMn #"+num+"("+form+"/"+shiny+"/"+gender+") retrieved in cache in "+watch.ElapsedMilliseconds);
                return sheet;
            }
            // If we are still here, that means the sprite wasn't in the cache
            if (System.IO.File.Exists(IO.Paths.GfxPath + "Sprites/Sprite" + num + ".zip"))
            {

                sheet = new SpriteSheet(num, formString);
                string changedFormString = formString;

                SpriteXLoader spriteXLoader = new SpriteXLoader(IO.Paths.GfxPath + "Sprites/Sprite" + num + ".zip", true);

                List<string> forms = spriteXLoader.LoadForms();

                while (true)
                {
                    if (spriteCache.ContainsKey(num + changedFormString))
                    {//this point will be hit if the first fallback data to be found is already in the cache
                        //the cache needs to be updated for aliases, but that's it.  No need to load any new data.

                        sheet = spriteCache.Get(num + changedFormString);
                        break;
                    }
                    else if (forms.Contains(changedFormString) || changedFormString == "r")
                    {//we've found a spritesheet in the file, so load it.
                        sheet.LoadSpriteX(spriteXLoader, changedFormString);

                        spriteCache.Add(num + changedFormString, sheet);

                        break;
                    }

                    // If the form specified wasn't found, continually revert to the backup until only "r" is reached
                    changedFormString = changedFormString.Substring(0, changedFormString.LastIndexOf('-'));
                }

                //continually add aliases
                string aliasString = formString;
                while (aliasString != changedFormString)
                {
                    //add aliases here
                    spriteCache.AddAlias(num + aliasString, num + changedFormString);
                    // If the form specified wasn't found, continually revert to the backup until only "r" is reached
                    aliasString = aliasString.Substring(0, aliasString.LastIndexOf('-'));
                }

                //string rootForm = spriteCache.GetOriginalKeyFromAlias(num + formString);
                //if (rootForm != num + formString)
                //{
                //    Logs.Logger.LogDebug("Could not load " + num + formString + ", loaded " + num + rootForm +" instead.");
                //}

                return sheet;
            }
            else
            {
                //watch.Stop();
                //System.Diagnostics.Debug.WriteLine("PkMn #"+num+"("+form+"/"+shiny+"/"+gender+") failed retrieval in "+watch.ElapsedMilliseconds);
                return null;
            }
        }
Exemplo n.º 3
0
        public static SpriteSheet GetSpriteSheet(int num, int form, int shiny, int gender)
        {
            //System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
            //watch.Start();
            //System.Diagnostics.Debug.WriteLine("PkMn #"+num+"("+form+"/"+shiny+"/"+gender+") requested");
            string formString = "r";

            if (form >= 0) {
                formString += "-" + form;
                if (shiny >= 0) {
                    formString += "-" + shiny;
                    if (gender >= 0) {
                        formString += "-" + gender;
                    }
                }
            }

            SpriteSheet sheet = null;
            lock (spriteCache) {
                sheet = spriteCache.Get(num + formString);
            }
            if (sheet != null) {
                //watch.Stop();
                //System.Diagnostics.Debug.WriteLine("PkMn #"+num+"("+form+"/"+shiny+"/"+gender+") retrieved in cache in "+watch.ElapsedMilliseconds);
                return sheet;
            }
            // If we are still here, that means the sprite wasn't in the cache
            if (System.IO.File.Exists(IO.Paths.GfxPath + "Sprites/Sprite" + num + ".sprite"))
            {

                sheet = new SpriteSheet(num, formString);
                string changedFormString = formString;

                using (FileStream fileStream = File.OpenRead(IO.Paths.GfxPath + "Sprites/Sprite" + num + ".sprite"))
                {
                    using (BinaryReader reader = new BinaryReader(fileStream))
                    {
                        int formCount = reader.ReadInt32();
                        Dictionary<string, int[]> formData = new Dictionary<string, int[]>();

                        for (int i = 0; i < formCount; i++)
                        {
                            // Read the form name
                            string formName = reader.ReadString();

                            int[] formIntData = new int[2];

                            // Load form position
                            formIntData[0] = reader.ReadInt32();
                            // Load form size
                            formIntData[1] = reader.ReadInt32();

                            // Add form data to collection
                            formData.Add(formName, formIntData);
                        }

                        while (true)
                        {
                            if (spriteCache.ContainsKey(num + changedFormString))
                            {//this point will be hit if the first fallback data to be found is already in the cache
                                //the cache needs to be updated for aliases, but that's it.  No need to load any new data.

                                sheet = spriteCache.Get(num + changedFormString);
                                break;
                            }
                            else if (formData.ContainsKey(changedFormString) || changedFormString == "r")
                            {//we've found a spritesheet in the file, so load it.
                                int[] formInt = formData[changedFormString];

                                // Jump to the correct position
                                fileStream.Seek(formInt[0], SeekOrigin.Current);

                                sheet.LoadFromData(reader, formInt[1]);

                                spriteCache.Add(num + changedFormString, sheet);

                                break;
                            }

                            // If the form specified wasn't found, continually revert to the backup until only "r" is reached
                            changedFormString = changedFormString.Substring(0, changedFormString.LastIndexOf('-'));
                        }
                    }
                }

                //continually add aliases
                string aliasString = formString;
                while (aliasString != changedFormString)
                {
                    //add aliases here
                    spriteCache.AddAlias(num + aliasString, num + changedFormString);
                    // If the form specified wasn't found, continually revert to the backup until only "r" is reached
                    aliasString = aliasString.Substring(0, aliasString.LastIndexOf('-'));
                }

                //string rootForm = spriteCache.GetOriginalKeyFromAlias(num + formString);
                //if (rootForm != num + formString)
                //{
                //    Logs.Logger.LogDebug("Could not load " + num + formString + ", loaded " + num + rootForm +" instead.");
                //}

                return sheet;
            }
            else
            {
                //watch.Stop();
                //System.Diagnostics.Debug.WriteLine("PkMn #"+num+"("+form+"/"+shiny+"/"+gender+") failed retrieval in "+watch.ElapsedMilliseconds);
                return null;
            }
        }
Exemplo n.º 4
0
        public void Load(SpriteSheet sheet, FrameData frameData, string overrideForm)
        {
            string formDirectory = "Forms/" + overrideForm + "/";

            frameData.SetFrameSize(FrameWidth, FrameHeight);
            using (var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                using (var zipFile = new ZipArchive(fileStream))
                {
                    foreach (FrameType frameType in Enum.GetValues(typeof(FrameType)))
                    {
                        if (FrameTypeHelper.IsFrameTypeDirectionless(frameType) == false)
                        {
                            for (int i = 0; i < 8; i++)
                            {
                                Enums.Direction dir = GraphicsManager.GetAnimIntDir(i);

                                using (MemoryStream ms = new MemoryStream())
                                {
                                    string fullImageString = formDirectory + GetFrameTypeString(frameType) + "-" + GetDirectionString(dir) + ".png";

                                    var entry = zipFile.GetEntry(fullImageString);
                                    if (entry != null)
                                    {
                                        using (var entryStream = entry.Open())
                                        {
                                            entryStream.CopyTo(ms);
                                        }

                                        ms.Seek(0, SeekOrigin.Begin);
                                        Bitmap  bitmap       = (Bitmap)Image.FromStream(ms);
                                        Surface sheetSurface = new Surface(bitmap);
                                        sheetSurface.Transparent = true;

                                        sheet.AddSheet(frameType, dir, sheetSurface);

                                        frameData.SetFrameCount(frameType, dir, bitmap.Width / frameData.FrameWidth);
                                    }
                                    else
                                    {
                                        frameData.SetFrameCount(frameType, dir, 0);
                                    }
                                }
                            }
                        }
                        else
                        {
                            using (MemoryStream ms = new MemoryStream())
                            {
                                string fullImageString = formDirectory + GetFrameTypeString(frameType) + "-" + GetDirectionString(Enums.Direction.Down) + ".png";

                                var entry = zipFile.GetEntry(fullImageString);
                                if (entry != null)
                                {
                                    using (var entryStream = entry.Open())
                                    {
                                        entryStream.CopyTo(ms);
                                    }

                                    ms.Seek(0, SeekOrigin.Begin);
                                    Bitmap  bitmap       = (Bitmap)Image.FromStream(ms);
                                    Surface sheetSurface = new Surface(bitmap);
                                    sheetSurface.Transparent = true;

                                    sheet.AddSheet(frameType, Enums.Direction.Down, sheetSurface);

                                    frameData.SetFrameCount(frameType, Enums.Direction.Down, bitmap.Width / frameData.FrameWidth);
                                }
                                else
                                {
                                    frameData.SetFrameCount(frameType, Enums.Direction.Down, 0);
                                }
                            }
                        }
                    }
                }
            }
        }