Пример #1
0
        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++;
                }
            }
        }
Пример #2
0
        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);
                }
            }
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
        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);
            }
        }