public ObjectDefTile(ByteArrayInputStream inp, NSMBTileset t) { this.t = t; if (inp.available < 1) //This should never happen. But sometimes, it does. { controlByte = 0xFF; //Simulate object end. return; } controlByte = inp.readByte(); if (!controlTile) { byte a, b; a = inp.readByte(); b = inp.readByte(); tileID = a + ((b - t.ObjectDefTileOffset) << 8); if ((controlByte & 64) != 0) //OVERRIDES { tileID += 768; } if (a == 0 && b == 0) { tileID = -1; } } }
public static NSMBView read(ByteArrayInputStream inp, ByteArrayInputStream cam) { NSMBView v = new NSMBView(); v.X = inp.readUShort(); v.Y = inp.readUShort(); v.Width = inp.readUShort(); v.Height = inp.readUShort(); v.Number = inp.readByte(); int camID = inp.readByte(); v.Music = inp.readByte(); v.Unknown1 = inp.readByte(); v.Unknown2 = inp.readByte(); v.Unknown3 = inp.readByte(); v.Lighting = inp.readByte(); v.FlagpoleID = inp.readByte(); cam.seek(0); int camCount = (int)cam.available / 24; // Console.Out.WriteLine("CamCount: " + camCount); int goodCam = -1; for (int i = 0; i < camCount; i++) { cam.seek(i * 24 + 16); int thisCam = cam.readUShort(); // Console.Out.WriteLine("Cam ID: " + thisCam); if (thisCam == camID) { goodCam = i; break; } } if (goodCam == -1) { Console.Out.WriteLine("Warning: Could not find camera ID " + camID); } else { cam.seek(goodCam * 24); v.CameraTop = cam.readInt(); v.CameraBottom = cam.readInt(); v.CameraTopSpin = cam.readInt(); v.CameraBottomSpin = cam.readInt(); cam.skip(2); v.CameraBottomStick = cam.readUShort(); } return(v); }
public void loadObjects() { ByteArrayInputStream eObjIndexFile = new ByteArrayInputStream(ObjIndexFile.getContents()); ByteArrayInputStream eObjFile = new ByteArrayInputStream(ObjFile.getContents()); Objects = new ObjectDef[objectCount]; //read object index int obj = 0; while (eObjIndexFile.lengthAvailable(4) && obj < Objects.Length) { Objects[obj] = new ObjectDef(this); int offset = eObjIndexFile.readUShort(); Objects[obj].width = eObjIndexFile.readByte(); Objects[obj].height = eObjIndexFile.readByte(); eObjFile.seek(offset); Objects[obj].load(eObjFile); obj++; } }
public static NSMBView readZone(ByteArrayInputStream inp) { NSMBView v = new NSMBView(); v.X = inp.readUShort(); v.Y = inp.readUShort(); v.Width = inp.readUShort(); v.Height = inp.readUShort(); v.Number = inp.readByte(); v.isZone = true; inp.skip(3); return(v); }
public override Bitmap render(Palette p) { int w = getWidth(); int h = getHeight(); Bitmap b = new Bitmap(w, h); ByteArrayInputStream f5data = new ByteArrayInputStream(f5.getContents()); ByteArrayInputStream data = new ByteArrayInputStream(f.getContents()); for (uint y = 0; y < h/4; y++) for (uint x = 0; x < w/4; x++) { ushort palDat = f5data.readUShort(); ushort palOffs = (ushort)((palDat & 0x3FFF) * 2); ushort mode = (ushort)((palDat >> 14) & 3); for (uint yy = 0; yy < 4; yy++) { byte row = data.readByte(); for (uint xx = 0; xx < 4; xx++) { byte color = (byte)(row >> (byte)(xx * 2)); color &= 3; Color col; col = p.getColorSafe(palOffs + color); switch (mode) { case 0: if (color == 3) col = Color.Transparent; break; case 1: if (color == 2) col = ImageTiler.colorMean(p.getColorSafe(palOffs), p.getColorSafe(palOffs + 1), 1, 1); if (color == 3) col = Color.Transparent; break; case 3: if (color == 2) col = ImageTiler.colorMean(p.getColorSafe(palOffs), p.getColorSafe(palOffs + 1), 5, 3); if (color == 3) col = ImageTiler.colorMean(p.getColorSafe(palOffs), p.getColorSafe(palOffs + 1), 3, 5); break; } b.SetPixel((int)x * 4 + (int)xx, (int)y * 4 + (int)yy, col); } } } return b; }
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)); } }
public ObjectDefTile(ByteArrayInputStream inp, NSMBTileset t) { this.t = t; if (inp.available < 1) //This should never happen. But sometimes, it does. { controlByte = 0xFF; //Simulate object end. return; } controlByte = inp.readByte(); if (!controlTile) { byte a, b; a = inp.readByte(); b = inp.readByte(); tileID = a + ((b - t.ObjectDefTileOffset) << 8); if ((controlByte & 64) != 0) //OVERRIDES tileID += 768; if (a == 0 && b == 0) tileID = -1; } }
public void loadObjects() { ByteArrayInputStream eObjIndexFile = new ByteArrayInputStream(ObjIndexFile.getContents()); ByteArrayInputStream eObjFile = new ByteArrayInputStream(ObjFile.getContents()); Objects = new ObjectDef[objectCount]; //read object index int obj = 0; while (eObjIndexFile.lengthAvailable(4) && obj < Objects.Length) { Objects[obj] = new ObjectDef(this); int offset = eObjIndexFile.readUShort(); Objects[obj].width = eObjIndexFile.readByte(); Objects[obj].height = eObjIndexFile.readByte(); eObjFile.seek(offset); Objects[obj].load(eObjFile); obj++; } }
public override Bitmap render(Palette p) { int w = getWidth(); int h = getHeight(); Bitmap b = new Bitmap(w, h); ByteArrayInputStream f5data = new ByteArrayInputStream(f5.getContents()); ByteArrayInputStream data = new ByteArrayInputStream(f.getContents()); for (uint y = 0; y < h / 4; y++) { for (uint x = 0; x < w / 4; x++) { ushort palDat = f5data.readUShort(); ushort palOffs = (ushort)((palDat & 0x3FFF) * 2); ushort mode = (ushort)((palDat >> 14) & 3); for (uint yy = 0; yy < 4; yy++) { byte row = data.readByte(); for (uint xx = 0; xx < 4; xx++) { byte color = (byte)(row >> (byte)(xx * 2)); color &= 3; Color col; col = p.getColorSafe(palOffs + color); switch (mode) { case 0: if (color == 3) { col = Color.Transparent; } break; case 1: if (color == 2) { col = ImageTiler.colorMean(p.getColorSafe(palOffs), p.getColorSafe(palOffs + 1), 1, 1); } if (color == 3) { col = Color.Transparent; } break; case 3: if (color == 2) { col = ImageTiler.colorMean(p.getColorSafe(palOffs), p.getColorSafe(palOffs + 1), 5, 3); } if (color == 3) { col = ImageTiler.colorMean(p.getColorSafe(palOffs), p.getColorSafe(palOffs + 1), 3, 5); } break; } b.SetPixel((int)x * 4 + (int)xx, (int)y * 4 + (int)yy, col); } } } } return(b); }
public static NSMBView readZone(ByteArrayInputStream inp) { NSMBView v = new NSMBView(); v.X = inp.readUShort(); v.Y = inp.readUShort(); v.Width = inp.readUShort(); v.Height = inp.readUShort(); v.Number = inp.readByte(); v.isZone = true; inp.skip(3); return v; }
public static NSMBView read(ByteArrayInputStream inp, ByteArrayInputStream cam) { NSMBView v = new NSMBView(); v.X = inp.readUShort(); v.Y = inp.readUShort(); v.Width = inp.readUShort(); v.Height = inp.readUShort(); v.Number = inp.readByte(); int camID = inp.readByte(); v.Music = inp.readByte(); v.Unknown1 = inp.readByte(); v.Unknown2 = inp.readByte(); v.Unknown3 = inp.readByte(); v.Lighting = inp.readByte(); v.FlagpoleID = inp.readByte(); cam.seek(0); int camCount = (int)cam.available / 24; // Console.Out.WriteLine("CamCount: " + camCount); int goodCam = -1; for (int i = 0; i < camCount; i++) { cam.seek(i * 24 + 16); int thisCam = cam.readUShort(); // Console.Out.WriteLine("Cam ID: " + thisCam); if (thisCam == camID) { goodCam = i; break; } } if (goodCam == -1) Console.Out.WriteLine("Warning: Could not find camera ID " + camID); else { cam.seek(goodCam * 24); v.CameraTop = cam.readInt(); v.CameraBottom = cam.readInt(); v.CameraTopSpin = cam.readInt(); v.CameraBottomSpin = cam.readInt(); cam.skip(2); v.CameraBottomStick = cam.readUShort(); } return v; }
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)); } }