public void ExtractAllExceptMap(string path, HashSet<uint> stuff, ref Lexicon<uint, VideoBag.SpriteSheetInfo> ssilist) { uint i = 0; Section.SectionEntry entry = null; Section sct = null; foreach (Section s in sections) { foreach (Section.SectionEntry e in s.Entries) { entry = e; sct = s; if (!stuff.Contains(i)) { BinaryReader rdr = new BinaryReader(bag); rdr.BaseStream.Seek(sct.Offset, SeekOrigin.Begin); byte[] nxzData = rdr.ReadBytes((int)sct.SizeCompressed); byte[] mapData = new byte[sct.SizeUncompressed]; if (!NoxShared.CryptApi.NxzDecrypt(nxzData, mapData)) { Debug.WriteLine("ExtractOne: Couldn't NxzDecrypt"); } MemoryStream nxzStream = new MemoryStream(mapData); nxzStream.Seek(entry.Offset, SeekOrigin.Begin); VideoBag.SpriteSheetInfo ssi = new VideoBag.SpriteSheetInfo(); ssi.imageID = i; ssi.file = path + "/" + i.ToString() + ".png"; var bitmap = entry.GetBitmap(nxzStream, header.bits8, i, ref ssi.offsetX, ref ssi.offsetY); ssi.X = 0; ssi.Y = 0; ssi.width = bitmap.Width; ssi.height = bitmap.Height; bitmap.Save(ssi.file); ssilist.Add(ssi.imageID, ssi); } i++; } } }
static void ExportSequences() { string last = ""; foreach (KeyValuePair<string, ThingDb.Thing> kvpair in thingdb.Things) { ThingDb.Thing thing = kvpair.Value; if (thing.Name == last) continue; last = thing.Name; if (thing.SpriteStates.Count < 1) continue; if (thing.SpriteStates[0].Animation.Sequences.Count < 1) continue; Dictionary<string, HashSet<uint>> spritedict = new Dictionary<string, HashSet<uint>>(); foreach (ThingDb.Image.State ss in thing.SpriteStates) { foreach (ThingDb.Image.Animation.Sequence seq in ss.Animation.Sequences) { foreach (int i in seq.Frames) { HashSet<uint> hs = null; spritedict.TryGetValue(seq.Name, out hs); if (hs == null) { hs = new HashSet<uint>(); hs.Add((uint)i); spritedict.Add(seq.Name, hs); } else { hs.Add((uint)i); } } } } string basePath = ""; if (spritedict.Count > 0) { basePath = "Sprites/sequences/" + thing.Name; Directory.CreateDirectory(basePath); } foreach (KeyValuePair<string, HashSet<uint>> kv in spritedict) { uint[] index = new uint[kv.Value.Count]; kv.Value.CopyTo(index); string assetPath = basePath + "/" + kv.Key + ".png"; int instance = 1; do { List<System.Drawing.Bitmap> bitmaps = new List<System.Drawing.Bitmap>(); List<KeyValuePair<string, System.Drawing.Bitmap>> mapperInput = new List<KeyValuePair<string, System.Drawing.Bitmap>>(); List<VideoBag.SpriteSheetInfo> retlist = new List<VideoBag.SpriteSheetInfo>(); int offset = 0; for (int j = 0; j < index.Length; j++) { VideoBag.SpriteSheetInfo ssi = new VideoBag.SpriteSheetInfo(); ssi.imageID = index[j]; ssi.file = assetPath; var subimg = bag.ExtractOne(index[j], ref ssi.offsetX, ref ssi.offsetY); retlist.Add(ssi); if (subimg != null) { bitmaps.Add(subimg); mapperInput.Add(new KeyValuePair<string, System.Drawing.Bitmap>(index[j].ToString(), subimg)); //imageinfos.Add (new ImageInfo(bitmaps[offset].Width, bitmaps[offset].Height, offset)); offset++; } } if (bitmaps.Count == 0) { //Console.WriteLine("Failed to export: " + thing.Name); break; } // pack the image, generating a map only if desired ImagePacker imagePacker = new ImagePacker(); Bitmap outputImage; Lexicon<string, Rectangle> outputMap; List<uint> failedPlacements; FailCode returnState = (FailCode)imagePacker.PackImage(mapperInput, true, true, 2048, 2048, 1, true, out outputImage, out outputMap, out failedPlacements); if (returnState != 0) { Console.WriteLine("Failed to export: " + thing.Name + ":" + kv.Value); break; } foreach (KeyValuePair<string, Rectangle> mii in outputMap) { uint imgid = uint.Parse(mii.Key); var ssi = retlist.Find(x => x.imageID == imgid); ssi.X = mii.Value.X; ssi.Y = mii.Value.Y; ssi.width = mii.Value.Width; ssi.height = mii.Value.Height; ssilist.Add(ssi.imageID, ssi); } outputImage.Save(assetPath); if (failedPlacements.Count == 0) break; else { index = failedPlacements.ToArray(); //assetPath = "Sprites/objects/" + thing.Name + "-" + instance + ".png"; assetPath = basePath + "/" + kv.Key + "-" + instance + ".png"; instance++; } } while (true); } } }
static void ExportWalls() { string last = ""; for (int i = 0; i < thingdb.Walls.Count; i++) { ThingDb.Wall wall = thingdb.Walls[i]; if (wall.Name == last) continue; last = wall.Name; string assetPath = "Sprites/walls/" + wall.Name + ".png"; /*if (AssetImporter.GetAtPath(assetPath) != null) continue;*/ //VideoBag.SpriteSheetInfo[] inf = bag.ExtractSpriteSheet(ttile.Variations.ToArray(), assetPath); HashSet<uint> indexl = new HashSet<uint>(); foreach (ThingDb.Wall.WallRenderInfo[] wriarray in wall.RenderBreakable) { foreach (ThingDb.Wall.WallRenderInfo wri in wriarray) { indexl.Add((uint)wri.SpriteIndex); } } foreach (ThingDb.Wall.WallRenderInfo[] wriarray in wall.RenderNormal) { foreach (ThingDb.Wall.WallRenderInfo wri in wriarray) { indexl.Add((uint)wri.SpriteIndex); } } uint[] index = new uint[indexl.Count]; indexl.CopyTo(index); int instance = 1; do { List<System.Drawing.Bitmap> bitmaps = new List<System.Drawing.Bitmap>(); List<KeyValuePair<string, System.Drawing.Bitmap>> mapperInput = new List<KeyValuePair<string, System.Drawing.Bitmap>>(); List<VideoBag.SpriteSheetInfo> retlist = new List<VideoBag.SpriteSheetInfo>(); int offset = 0; for (int j = 0; j < index.Length; j++) { VideoBag.SpriteSheetInfo ssi = new VideoBag.SpriteSheetInfo(); ssi.imageID = index[j]; ssi.file = assetPath; var subimg = bag.ExtractOne(index[j], ref ssi.offsetX, ref ssi.offsetY); retlist.Add(ssi); if (subimg != null) { bitmaps.Add(subimg); mapperInput.Add(new KeyValuePair<string, System.Drawing.Bitmap>(index[j].ToString(), subimg)); //imageinfos.Add (new ImageInfo(bitmaps[offset].Width, bitmaps[offset].Height, offset)); offset++; } } if (bitmaps.Count == 0) break; // pack the image, generating a map only if desired ImagePacker imagePacker = new ImagePacker(); Bitmap outputImage; Lexicon<string, Rectangle> outputMap; List<uint> failedPlacements; FailCode returnState = (FailCode)imagePacker.PackImage(mapperInput, true, true, 2048, 2048, 1, true, out outputImage, out outputMap, out failedPlacements); foreach (KeyValuePair<string, Rectangle> mii in outputMap) { uint imgid = uint.Parse(mii.Key); var ssi = retlist.Find(x => x.imageID == imgid); ssi.X = mii.Value.X; ssi.Y = mii.Value.Y; ssi.width = mii.Value.Width; ssi.height = mii.Value.Height; ssilist.Add(ssi.imageID, ssi); } outputImage.Save(assetPath); if (failedPlacements.Count == 0) break; else { index = failedPlacements.ToArray(); assetPath = "Sprites/walls/" + wall.Name + "-" + instance + ".png"; instance++; } } while (true); } }
static void ExportObjects() { string last = ""; foreach (KeyValuePair<string, ThingDb.Thing> kvpair in thingdb.Things) { ThingDb.Thing thing = kvpair.Value; if (thing.Name == last) continue; last = thing.Name; string assetPath = "Sprites/objects/" + thing.Name + ".png"; if (File.Exists(assetPath)) continue; /*if (AssetImporter.GetAtPath(assetPath) != null) continue;*/ //VideoBag.SpriteSheetInfo[] inf = bag.ExtractSpriteSheet(ttile.Variations.ToArray(), assetPath); HashSet<uint> sprites = new HashSet<uint>(); foreach (int j in thing.SpriteAnimFrames) { sprites.Add((uint)j); } foreach (ThingDb.Image.State ss in thing.SpriteStates) { foreach (int j in ss.Animation.Frames) { sprites.Add((uint)j); } } foreach (ThingDb.Image.Animation a in thing.ConditionalAnimations) { foreach (int j in a.Frames) { sprites.Add((uint)j); } } if (sprites.Count < 1) continue; uint[] index = new uint[sprites.Count]; sprites.CopyTo(index); int instance = 1; do { List<System.Drawing.Bitmap> bitmaps = new List<System.Drawing.Bitmap>(); List<KeyValuePair<string, System.Drawing.Bitmap>> mapperInput = new List<KeyValuePair<string, System.Drawing.Bitmap>>(); List<VideoBag.SpriteSheetInfo> retlist = new List<VideoBag.SpriteSheetInfo>(); int offset = 0; for (int j = 0; j < index.Length; j++) { VideoBag.SpriteSheetInfo ssi = new VideoBag.SpriteSheetInfo(); ssi.imageID = index[j]; ssi.file = assetPath; var subimg = bag.ExtractOne(index[j], ref ssi.offsetX, ref ssi.offsetY); retlist.Add(ssi); if (subimg != null) { bitmaps.Add(subimg); mapperInput.Add(new KeyValuePair<string, System.Drawing.Bitmap>(index[j].ToString(), subimg)); //imageinfos.Add (new ImageInfo(bitmaps[offset].Width, bitmaps[offset].Height, offset)); offset++; } } if (bitmaps.Count == 0) { Console.WriteLine("Failed to export: " + thing.Name); break; } // pack the image, generating a map only if desired ImagePacker imagePacker = new ImagePacker(); Bitmap outputImage; Lexicon<string, Rectangle> outputMap; List<uint> failedPlacements; FailCode returnState = (FailCode)imagePacker.PackImage(mapperInput, false, false, 2048, 2048, 1, true, out outputImage, out outputMap, out failedPlacements); if (returnState != 0) { Console.WriteLine("Failed to export: " + thing.Name); break; } foreach (KeyValuePair<string, Rectangle> mii in outputMap) { uint imgid = uint.Parse(mii.Key); var ssi = retlist.Find(x => x.imageID == imgid); ssi.X = mii.Value.X; ssi.Y = mii.Value.Y; ssi.width = mii.Value.Width; ssi.height = mii.Value.Height; ssilist.Add(ssi.imageID, ssi); } outputImage.Save(assetPath); if (failedPlacements.Count == 0) break; else { index = failedPlacements.ToArray(); assetPath = "Sprites/objects/" + thing.Name + "-" + instance + ".png"; instance++; } } while (true); } }