Пример #1
0
        public static TileSheet GetMugshot(int num, int form, Enums.Coloration shiny, Enums.Gender gender)
        {
            string formString = "r";

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

            TileSheet sheet = mugshotCache.Get(num + formString);

            if (sheet != null)
            {
                return(sheet);
            }

            try
            {
                // If we are still here, that means the sprite wasn't in the cache
                if (File.Exists(Paths.CachedGFXPath + "Portrait\\Portrait" + num + ".portrait"))
                {
                    sheet = new TileSheet();
                    string changedFormString = formString;

                    using (FileStream fileStream = File.OpenRead(Paths.CachedGFXPath + "Portrait\\Portrait" + num + ".portrait"))
                    {
                        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 (mugshotCache.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 = mugshotCache.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);

                                    try
                                    {
                                        int    frameCount = reader.ReadInt32();
                                        int    size       = reader.ReadInt32();
                                        byte[] imgData    = reader.ReadBytes(size);
                                        using (MemoryStream stream = new MemoryStream(imgData))
                                        {
                                            sheet.LoadPixelsFromBytes(stream);
                                            sheet.LoadTextureFromPixels32();
                                        }

                                        sheet.GenerateDataBuffer(sheet.ImageWidth / frameCount, sheet.ImageHeight);
                                    }
                                    catch (Exception ex)
                                    {
                                        sheet.Dispose();
                                        throw new Exception("Error reading image data.\n", ex);
                                    }

                                    mugshotCache.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
                        mugshotCache.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('-'));
                    }

                    return(sheet);
                }
            }
            catch (Exception ex)
            {
                Logs.Logger.LogError(new Exception("Error retrieving portrait " + num + " " + formString + "\n", ex));
            }

            //add error sheet
            mugshotCache.Add(num + formString, ErrorTexture);
            return(ErrorTexture);
        }
Пример #2
0
        public void LoadFromData(BinaryReader reader, int totalByteSize)
        {
            foreach (FrameType frameType in Enum.GetValues(typeof(FrameType)))
            {
                if (IsFrameTypeDirectionless(frameType) == false)
                {
                    for (int i = 0; i < 8; i++)
                    {
                        Maps.Direction8 dir        = (Maps.Direction8)i;
                        int             frameCount = reader.ReadInt32();
                        frameData.SetFrameCount(frameType, dir, frameCount);
                        int size = reader.ReadInt32();
                        if (size > 0)
                        {
                            byte[]    imgData      = reader.ReadBytes(size);
                            TileSheet sheetSurface = new TileSheet();
                            using (MemoryStream stream = new MemoryStream(imgData))
                            {
                                try
                                {
                                    sheetSurface.LoadPixelsFromBytes(stream);

                                    sheetSurface.LoadTextureFromPixels32();
                                    sheetSurface.GenerateDataBuffer(sheetSurface.ImageWidth / frameCount, sheetSurface.ImageHeight);
                                }
                                catch (Exception ex)
                                {
                                    sheetSurface.Dispose();
                                    throw new Exception("Error reading image data for " + frameType.ToString() + " " + dir.ToString() + "\n", ex);
                                }
                            }
                            AddSheet(frameType, dir, sheetSurface);

                            frameData.SetFrameSize(sheetSurface.ImageWidth, sheetSurface.ImageHeight, frameCount);
                        }
                    }
                }
                else
                {
                    int frameCount = reader.ReadInt32();
                    frameData.SetFrameCount(frameType, PMDToolkit.Maps.Direction8.Down, frameCount);
                    int size = reader.ReadInt32();
                    if (size > 0)
                    {
                        byte[]    imgData      = reader.ReadBytes(size);
                        TileSheet sheetSurface = new TileSheet();
                        using (MemoryStream stream = new MemoryStream(imgData))
                        {
                            try
                            {
                                sheetSurface.LoadPixelsFromBytes(stream);
                                sheetSurface.LoadTextureFromPixels32();
                            }
                            catch (Exception ex)
                            {
                                sheetSurface.Dispose();
                                throw new Exception("Error reading image data for " + frameType.ToString() + "\n", ex);
                            }
                        }
                        sheetSurface.GenerateDataBuffer(sheetSurface.ImageWidth / frameCount, sheetSurface.ImageHeight);
                        AddSheet(frameType, PMDToolkit.Maps.Direction8.Down, sheetSurface);

                        frameData.SetFrameSize(sheetSurface.ImageWidth, sheetSurface.ImageHeight, frameCount);
                    }
                }
            }


            this.sizeInBytes = totalByteSize;
        }
Пример #3
0
        public static TileSheet GetMugshot(int num, int form, Enums.Coloration shiny, Enums.Gender gender)
        {
            string formString = "r";

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

            TileSheet sheet = mugshotCache.Get(num + formString);

            if (sheet != null)
                return sheet;

            try
            {
                // If we are still here, that means the sprite wasn't in the cache
                if (System.IO.File.Exists(Paths.CachedGFXPath + "Portrait\\Portrait" + num + ".portrait"))
                {

                    sheet = new TileSheet();
                    string changedFormString = formString;

                    using (FileStream fileStream = File.OpenRead(Paths.CachedGFXPath + "Portrait\\Portrait" + num + ".portrait"))
                    {
                        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 (mugshotCache.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 = mugshotCache.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);

                                    try
                                    {
                                        int frameCount = reader.ReadInt32();
                                        int size = reader.ReadInt32();
                                        byte[] imgData = reader.ReadBytes(size);
                                        using (MemoryStream stream = new MemoryStream(imgData))
                                        {
                                            sheet.LoadPixelsFromBytes(stream);
                                            sheet.LoadTextureFromPixels32();
                                        }

                                        sheet.GenerateDataBuffer(sheet.ImageWidth / frameCount, sheet.ImageHeight);
                                    }
                                    catch (Exception ex)
                                    {
                                        sheet.Dispose();
                                        throw new Exception("Error reading image data.\n", ex);
                                    }

                                    mugshotCache.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
                        mugshotCache.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('-'));
                    }

                    return sheet;
                }
            }
            catch (Exception ex)
            {
                Logs.Logger.LogError(new Exception("Error retrieving portrait " + num + " " + formString + "\n", ex));
            }

            //add error sheet
            mugshotCache.Add(num + formString, ErrorTexture);
            return ErrorTexture;
        }
Пример #4
0
        public void LoadFromData(BinaryReader reader, int totalByteSize)
        {
            foreach (FrameType frameType in Enum.GetValues(typeof(FrameType)))
            {
                if (IsFrameTypeDirectionless(frameType) == false)
                {
                    for (int i = 0; i < 8; i++)
                    {
                        Maps.Direction8 dir = (Maps.Direction8)i;
                        int frameCount = reader.ReadInt32();
                        frameData.SetFrameCount(frameType, dir, frameCount);
                        int size = reader.ReadInt32();
                        if (size > 0)
                        {
                            byte[] imgData = reader.ReadBytes(size);
                            TileSheet sheetSurface = new TileSheet();
                            using (MemoryStream stream = new MemoryStream(imgData))
                            {
                                try
                                {
                                    sheetSurface.LoadPixelsFromBytes(stream);

                                    sheetSurface.LoadTextureFromPixels32();
                                    sheetSurface.GenerateDataBuffer(sheetSurface.ImageWidth / frameCount, sheetSurface.ImageHeight);
                                }
                                catch (Exception ex)
                                {
                                    sheetSurface.Dispose();
                                    throw new Exception("Error reading image data for " + frameType.ToString() + " " + dir.ToString() + "\n", ex);
                                }
                            }
                            AddSheet(frameType, dir, sheetSurface);

                            frameData.SetFrameSize(sheetSurface.ImageWidth, sheetSurface.ImageHeight, frameCount);
                        }
                    }
                }
                else
                {
                    int frameCount = reader.ReadInt32();
                    frameData.SetFrameCount(frameType, PMDToolkit.Maps.Direction8.Down, frameCount);
                    int size = reader.ReadInt32();
                    if (size > 0)
                    {
                        byte[] imgData = reader.ReadBytes(size);
                        TileSheet sheetSurface = new TileSheet();
                        using (MemoryStream stream = new MemoryStream(imgData))
                        {
                            try
                            {
                                sheetSurface.LoadPixelsFromBytes(stream);
                                sheetSurface.LoadTextureFromPixels32();
                            }
                            catch (Exception ex)
                            {
                                sheetSurface.Dispose();
                                throw new Exception("Error reading image data for " + frameType.ToString() + "\n", ex);
                            }
                        }
                        sheetSurface.GenerateDataBuffer(sheetSurface.ImageWidth / frameCount, sheetSurface.ImageHeight);
                        AddSheet(frameType, PMDToolkit.Maps.Direction8.Down, sheetSurface);

                        frameData.SetFrameSize(sheetSurface.ImageWidth, sheetSurface.ImageHeight, frameCount);
                    }
                }
            }

            this.sizeInBytes = totalByteSize;
        }