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(); } } }
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); }
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; }
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); }
public CSprite(spriteInfo SpriteInfo) { m_SpriteInfo = SpriteInfo; }
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); }