Пример #1
0
        static void Main(string[] args)
        {
            string output_folder = args[0];

            if (output_folder[output_folder.Length - 1] != '\\')
            {
                output_folder += '\\';
            }
            Directory.CreateDirectory(output_folder + "Sprites");

            if (File.Exists(output_folder + "SPRT.txt"))
            {
                Bitmap cropped = null;
                //Prepare textures
                string[] texturespath = Directory.GetFiles(output_folder + "TXTR\\");
                Bitmap[] textures     = new Bitmap[texturespath.Length];
                for (int i = 0; i < textures.Length; i++)
                {
                    textures[i] = new Bitmap(Image.FromFile(output_folder + "TXTR\\" + i + ".png"));
                }

                string[] patchLines = File.ReadAllLines(output_folder + "SPRT.txt", System.Text.Encoding.UTF8);
                for (int l = 0; l < patchLines.Length; l++)
                {
                    Console.WriteLine("Sprite " + l + " of " + patchLines.Length);
                    Console.SetCursorPosition(0, Console.CursorTop - 1);

                    if (patchLines[l].IndexOf("//") == 0)
                    {
                        continue;
                    }
                    string[]   par     = patchLines[l].Split(';');
                    spriteInfo newFont = new spriteInfo();
                    newFont.spriteName = par[0];
                    newFont.x          = Convert.ToInt32(par[1]);
                    newFont.y          = Convert.ToInt32(par[2]);
                    newFont.w          = Convert.ToInt32(par[3]);
                    newFont.h          = Convert.ToInt32(par[4]);
                    newFont.i          = Convert.ToInt32(par[5]);
                    //try
                    //{
                    cropped = textures[newFont.i].Clone(new Rectangle((int)newFont.x, (int)newFont.y, (int)newFont.w, (int)newFont.h), textures[newFont.i].PixelFormat);
                    cropped.Save(output_folder + "Sprites\\" + newFont.spriteName + ".png");
                    cropped.Dispose();
                    //} finally {

                    //    if(cropped != null) cropped.Dispose();
                    //}
                    //textures[newFont.i - 1].Dispose();
                }
            }
        }
Пример #2
0
        static spriteInfo getSpriteInfo(uint sprite_offset)
        {
            spriteInfo result = new spriteInfo();
            long       bacup  = bread.BaseStream.Position;

            bread.BaseStream.Position = sprite_offset;
            result.x = bread.ReadUInt16();
            result.y = bread.ReadUInt16();
            result.w = bread.ReadUInt16();
            result.h = bread.ReadUInt16();
            bread.BaseStream.Position += 12;
            result.i = bread.ReadUInt16();
            bread.BaseStream.Position = bacup;
            return(result);
        }
Пример #3
0
        static void collectFontImages()
        {
            long bacup = bread.BaseStream.Position;

            bread.BaseStream.Position = FONT_offset;
            List <uint> fonts = collect_entries(false);

            for (int f = 0; f < fonts.Count - 1; f++)
            {
                bread.BaseStream.Position = fonts[f] + 28;
                spriteInfo sprt    = getSpriteInfo(bread.ReadUInt32());
                Bitmap     texture = new Bitmap(Image.FromFile(input_folder + "TXTR\\" + sprt.i + ".png"));
                Bitmap     cropped = texture.Clone(new Rectangle((int)sprt.x, (int)sprt.y, (int)sprt.w, (int)sprt.h), texture.PixelFormat);
                cropped.Save(input_folder + "FONT\\" + f + ".png");
            }

            bread.BaseStream.Position = bacup;
        }
Пример #4
0
        static spriteInfo getSpriteInfo(uint sprite_offset)
        {
            spriteInfo result = new spriteInfo();
            long       bacup  = bread.BaseStream.Position;

            bread.BaseStream.Position = sprite_offset;
            result.x = bread.ReadUInt16();
            result.y = bread.ReadUInt16();
            result.w = bread.ReadUInt16();
            result.h = bread.ReadUInt16();
            bread.BaseStream.Position += 12;
            result.i = bread.ReadUInt16();
            if (undertaleVer >= 105)
            {
                result.i++;//Undertale 1.05. WTF?
            }
            if (result.i > 16)
            {
                result.i--;                //What?
            }
            bread.BaseStream.Position = bacup;
            return(result);
        }
Пример #5
0
 public CSprite(spriteInfo SpriteInfo)
 {
     m_SpriteInfo = SpriteInfo;
 }
Пример #6
0
        static List <endFiles> collectFonts(string input_folder)
        {
            bread.BaseStream.Position = FONT_offset;
            List <uint>     entries       = collect_entries(true);
            List <endFiles> filesToCreate = new List <endFiles>();

            StreamWriter fontsIndex = new StreamWriter(input_folder + "FONT\\" + "fonts.txt", false, System.Text.Encoding.UTF8);

            fontNames = new string[entries.Count];

            for (int i = 0; i < entries.Count - 1; i++)
            {
                XDocument xmldoc = new XDocument();
                XElement  xfont  = new XElement("font");

                uint offset = entries[i];
                bread.BaseStream.Position = offset;
                string font_name = getSTRGEntry(bread.ReadUInt32());

                fontNames[i] = font_name;

                xfont.Add(new XElement("name", getSTRGEntry(bread.ReadUInt32())));
                xfont.Add(new XElement("size", bread.ReadUInt32()));
                xfont.Add(new XElement("bold", bread.ReadUInt32()));
                xfont.Add(new XElement("italic", bread.ReadUInt32()));

                XElement xrange = new XElement("ranges");
                ushort   lrange = bread.ReadUInt16();
                bread.ReadUInt16();
                ushort urange = bread.ReadUInt16();
                bread.ReadUInt16();
                xrange.Add(new XElement("range0", "" + lrange + "," + urange));
                xfont.Add(xrange);

                spriteInfo fontSprite = getSpriteInfo(bread.ReadUInt32());
                fontsIndex.WriteLine(i.ToString() + ";" + font_name + ".font.gmx;" + fontSprite.i + ";" + fontSprite.x + ";" + fontSprite.y);
                bread.BaseStream.Position += 8;
                uint glyphCount = bread.ReadUInt32();
                xrange = new XElement("glyphs");
                for (uint g = 0; g < glyphCount; g++)
                {
                    uint glyphOffset = bread.ReadUInt32();
                    long bacp        = bread.BaseStream.Position;
                    bread.BaseStream.Position = glyphOffset;

                    XElement xglyph = new XElement("glyph");
                    xglyph.SetAttributeValue("character", bread.ReadUInt16());
                    xglyph.SetAttributeValue("x", bread.ReadUInt16());
                    xglyph.SetAttributeValue("y", bread.ReadUInt16());
                    xglyph.SetAttributeValue("w", bread.ReadUInt16());
                    xglyph.SetAttributeValue("h", bread.ReadUInt16());
                    xglyph.SetAttributeValue("shift", bread.ReadUInt16());
                    xglyph.SetAttributeValue("offset", bread.ReadInt16());//sic!
                    xrange.Add(xglyph);

                    bread.BaseStream.Position = bacp;
                }
                xfont.Add(xrange);

                xfont.Add(new XElement("image", "" + font_name + ".png"));

                xmldoc.Add(xfont);
                StreamWriter tpag = new StreamWriter(input_folder + "FONT\\" + font_name + ".font.gmx", false, System.Text.Encoding.UTF8);
                tpag.Write(xmldoc.ToString());
                tpag.Close();
            }
            fontsIndex.Close();
            return(filesToCreate);
        }