Example #1
0
        public static void gotSection(File f, int offs, int size)
        {
            uint magic = f.getUintAt(offs);

            if (magic == 0x504C5454) //PLTT
            {
                new PaletteViewer(new InlineFile(f, offs + 0x18, size - 0x18, f.name)).Show();
            }
            else if (magic == 0x43484152) //CHAR
            {
                LevelChooser.showImgMgr();
                int tileWidth = f.getUshortAt(offs + 0xA);
                if (tileWidth == 0xFFFF)
                {
                    tileWidth = 8;
                }
                LevelChooser.imgMgr.m.addImage(new Image2D(new InlineFile(f, offs + 0x20, size - 0x20, f.name), 8 * tileWidth, true, false));
            }
            else if (magic == 0x5343524E) //SCRN
            {
                if (LevelChooser.imgMgr == null)
                {
                    return;
                }
                Image2D   img  = LevelChooser.imgMgr.m.getSelectedImage();
                Palette[] pals = LevelChooser.imgMgr.m.getPalettes();
                if (img == null)
                {
                    return;
                }
                if (pals == null)
                {
                    return;
                }
                if (pals.Length == 0)
                {
                    return;
                }
                InlineFile ff = new InlineFile(f, offs + 0x14, size - 0x14, f.name);
                Tilemap    t  = new Tilemap(ff, 32, img, pals, 0, 0);
                new TilemapEditorWindow(t).Show();
            }
            else
            {
                Console.WriteLine(String.Format("Unknown magic: {0:X8}", magic));
            }
        }
        private void addPalette(int i)
        {
            int palSize = 256;

            if (is4bpp.Checked)
            {
                palSize = 16;
            }

            int palOffs = i * palSize;
            int palLen  = palSize;

            if (palOffs + palLen > pal.Length)
            {
                palLen = pal.Length - palOffs;
            }
            File ifl = new InlineFile(f, palOffs * 2, palLen * 2, f.name + " - " + i);

            LevelChooser.showImgMgr();
            LevelChooser.imgMgr.m.addPalette(new FilePalette(ifl));
        }
Example #3
0
        ushort unk;         //Let's save it just in case.

        public Bncd(File f)
        {
            ByteArrayInputStream inp = new ByteArrayInputStream(f.getContents());

            inp.readInt();     //Magic;
            unk = inp.readUShort();
            ushort entryCount       = inp.readUShort();
            uint   entriesOffset    = inp.readUInt();
            uint   subEntriesOffset = inp.readUInt();
            uint   dataOffset       = inp.readUInt();
            uint   dataSize         = inp.readUInt();

            inp.seek(entriesOffset);

            //Stores tilenum, tilecount to imageid
            Dictionary <uint, int> imagesDict = new Dictionary <uint, int> ();

            for (uint entryId = 0; entryId < entryCount; entryId++)
            {
                BncdEntry e = new BncdEntry();
                e.width  = inp.readByte();
                e.height = inp.readByte();

                uint subEntryIdx = inp.readUShort();
                uint subEntryCt  = inp.readUShort();

                inp.savePos();
                inp.seek(subEntriesOffset + subEntryIdx * 12);
                for (int i = 0; i < subEntryCt; i++)
                {
                    BncdSubEntry se = new BncdSubEntry();
                    e.subEntries.Add(se);

                    se.oamAttr0   = inp.readUShort();
                    se.oamAttr1   = inp.readUShort();
                    se.unk        = inp.readUInt();
                    se.tileNumber = inp.readUShort();
                    se.tileCount  = inp.readUShort();

                    uint imageCode = (uint)((se.tileNumber << 16) | se.tileCount);
                    int  imageId   = imagesDict.Count;
                    if (imagesDict.ContainsKey(imageCode))
                    {
                        imageId = imagesDict[imageCode];
                    }
                    else
                    {
                        imagesDict[imageCode] = imageId;
                        BncdImage img = new BncdImage();
                        images.Add(img);
                        img.tileNumber = se.tileNumber;
                        img.tileCount  = se.tileCount;

                        int oamShape = se.oamAttr0 >> 14;
                        int oamSize  = se.oamAttr1 >> 14;

                        img.tileWidth = widths[oamSize, oamShape];
                    }

                    se.imageId = imageId;
                }
                inp.loadPos();
            }

            LevelChooser.showImgMgr();
            int tileLen = 8 * 8 / 2;

            foreach (BncdImage img in images)
            {
                File imgFile = new InlineFile(f, (int)dataOffset + img.tileNumber * tileLen, img.tileCount * tileLen, f.name);
                LevelChooser.imgMgr.m.addImage(new Image2D(imgFile, 8 * img.tileWidth, true, false));
            }
        }