private static Overlay[] loadOvTable(File table) { Overlay[] ovs = new Overlay[table.fileSize / 32]; ByteArrayInputStream tbl = new ByteArrayInputStream(table.getContents()); int i = 0; while (tbl.lengthAvailable(32)) { uint ovId = tbl.readUInt(); uint ramAddr = tbl.readUInt(); uint ramSize = tbl.readUInt(); uint bssSize = tbl.readUInt(); uint staticInitStart = tbl.readUInt(); uint staticInitEnd = tbl.readUInt(); ushort fileID = tbl.readUShort(); tbl.skip(6); //unused 0's ovs[ovId] = new Overlay(FS.getFileById(fileID), table, (uint)i * 32); i++; } return(ovs); }
private void loadTileBehaviors() { byte[] x = null; if (TilesetNumber == 0) { x = ROM.GetInlineFile(ROM.Data.File_Jyotyu_CHK); } else if (TilesetNumber == 1 || TilesetNumber == 2) { x = TileBehaviorFile.getContents(); } ByteArrayInputStream inp = new ByteArrayInputStream(x); int len = inp.available / 4; TileBehaviors = new uint[len]; for (int i = 0; i < len; i++) { TileBehaviors[i] = inp.readUInt(); } }
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)); } }
private void loadTileBehaviors() { byte[] x = null; if (TilesetNumber == 0) x = ROM.GetInlineFile(ROM.Data.File_Jyotyu_CHK); else if (TilesetNumber == 1 || TilesetNumber == 2) x = TileBehaviorFile.getContents(); ByteArrayInputStream inp = new ByteArrayInputStream(x); int len = inp.available / 4; TileBehaviors = new uint[len]; for (int i = 0; i < len; i++) TileBehaviors[i] = inp.readUInt(); }
private static Overlay[] loadOvTable(File table) { Overlay[] ovs = new Overlay[table.fileSize/32]; ByteArrayInputStream tbl = new ByteArrayInputStream(table.getContents()); int i = 0; while (tbl.lengthAvailable(32)) { uint ovId = tbl.readUInt(); uint ramAddr = tbl.readUInt(); uint ramSize = tbl.readUInt(); uint bssSize = tbl.readUInt(); uint staticInitStart = tbl.readUInt(); uint staticInitEnd = tbl.readUInt(); ushort fileID = tbl.readUShort(); tbl.skip(6); //unused 0's ovs[ovId] = new Overlay(FS.getFileById(fileID), table, (uint)i*32); i++; } return ovs; }
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)); } }