public override TreeNode GetTreeNode() { TreeNode node = new TreeNode(); node.Text = string.Format("DMA {0} - Level File ({1})", Index, StarFoxRomInfo.LevelNamesByIndex[StarFoxRomInfo.DMATableToLevelIndex(Index)]); node.Tag = this; TreeNode LevelObjectTable = new TreeNode(); LevelObjectTable.Text = "Level Objects Table"; LevelObjectTable.Tag = LevelObjects; int objCount = 0; foreach (SFLevelObject obj in LevelObjects) { TreeNode newN = new TreeNode(); newN.Tag = obj; newN.Text = "Entry " + objCount; objCount++; LevelObjectTable.Nodes.Add(newN); } node.Nodes.Add(LevelObjectTable); //foreach (DMAFile dma in DMATable) //{ // node.Nodes.Add(dma.GetTreeNode()); //} return(node); }
private void CheckValidity() { if (!IsROMLoaded) return; IsValidRom = StarFoxRomInfo.IsValidVersion(_headerDMA.GameID, _headerDMA.Version); HasGoodChecksum = CheckCRC(); }
public override bool LoadFromBytes(byte[] bytes) { base.LoadFromBytes(bytes); Title = System.Text.Encoding.UTF8.GetString(bytes, 32, 20); GameID = System.Text.Encoding.UTF8.GetString(bytes, 59, 4); Version = bytes[63]; RomEndianness = StarFoxRomInfo.GetEndianness(ByteHelper.ReadUInt(bytes, 0)); CRC1 = ByteHelper.ReadUInt(bytes, 16); CRC2 = ByteHelper.ReadUInt(bytes, 20); return(true); }
public override byte[] GetAsBytes() { byte[] bytes = base.GetAsBytes(); Array.Copy(System.Text.Encoding.UTF8.GetBytes(Title), 0, bytes, 32, 20); //32, 20); Array.Copy(System.Text.Encoding.UTF8.GetBytes(GameID), 0, bytes, 59, 4); //59, 4); bytes[63] = Version; ByteHelper.WriteUInt(StarFoxRomInfo.GetEndianness(RomEndianness), bytes, 0); ByteHelper.WriteUInt(CRC1, bytes, 16); ByteHelper.WriteUInt(CRC2, bytes, 20); return(bytes); }
private bool DecompressDMA() { if(!IsROMLoaded) { return false; } for (int i = 0; i < DMATable.Count; i++) { DMAFile dma = DMATable[i]; if(dma.DMAInfo.CFlag == 0x1) { //compressed //Decompress here byte[] newDMAData; if(StarFoxRomInfo.DecompressMIO0(dma.GetAsBytes(), out newDMAData)) { dma.LoadFromBytes(newDMAData); dma.DMAInfo.PEnd = dma.DMAInfo.VStart + (uint)newDMAData.Length; dma.DMAInfo.PStart = dma.DMAInfo.VStart; dma.DMAInfo.CFlag = 0x0; _dmaTableDMA.DMATableEntries[i].CFlag = dma.DMAInfo.CFlag; } else { //Catastrophic failure, just quit out return false; } } else { //uncompressed dma.DMAInfo.PEnd = dma.DMAInfo.VStart + (dma.DMAInfo.PEnd - dma.DMAInfo.PStart); dma.DMAInfo.PStart = dma.DMAInfo.VStart; } } Size = DMATable.Last().DMAInfo.PEnd; FixDMATable(); return true; }
public bool LoadFromBytes(byte[] data) { if (DMATable == null) DMATable = new List<DMAFile>(); if (_levelDMAs == null) _levelDMAs = new List<LevelDMAFile>(); string gameID = System.Text.Encoding.UTF8.GetString(data, 59, 4); byte version = data[63]; DMATableOffset = StarFoxRomInfo.GetDMATableOffset(gameID, version); Endianness endianness = StarFoxRomInfo.GetEndianness(ByteHelper.ReadUInt(data, 0)); IsROMLoaded = BytesToDMATable(data, endianness); CheckValidity(); return true; }
private bool BytesToDMATable(byte[] data, Endianness RomEndianness) { //Using the DMA Table offset, break up the file into its constituent DMA blocks. if (DMATableOffset == 0x0) { return false; } IsCompressed = false; DMATable.Clear(); _levelDMAs.Clear(); _headerDMA = null; _dmaTableDMA = null; _referenceDMA = null; int CurrentPos = (int)DMATableOffset; try { while (CurrentPos < data.Length - 16) { uint VStart = ByteHelper.ReadUInt(data, CurrentPos, RomEndianness); uint PStart = ByteHelper.ReadUInt(data, CurrentPos + 4, RomEndianness); uint PEnd = ByteHelper.ReadUInt(data, CurrentPos + 8, RomEndianness); uint CompFlag = ByteHelper.ReadUInt(data, CurrentPos + 12, RomEndianness); //End of the DMA Header if ((PStart == 0x00) && (PEnd == 0x00)) break; //Create the actual data byte[] dmaBytes = new byte[PEnd - PStart]; Array.Copy(data, PStart, dmaBytes, 0, dmaBytes.Length); DMAFile entry; switch(DMATable.Count) //Should act as an index for the current dma file { case 0: //Header DMA entry = new HeaderDMAFile(dmaBytes, DMATable.Count); _headerDMA = (HeaderDMAFile)entry; break; case 1: //Reference DMA entry = new ReferenceDMAFile(dmaBytes, DMATable.Count); _referenceDMA = (ReferenceDMAFile)entry; break; case 2: //DMA Table DMA entry = new DMATableDMAFile(dmaBytes, DMATable.Count); _dmaTableDMA = (DMATableDMAFile)entry; break; case 54: //Dialogue DMA entry = new DialogueDMAFile(dmaBytes, DMATable.Count); _dialogueDMA = (DialogueDMAFile)entry; break; //case 12: Appears broken right now, the Game Object table is set up differently than the other files. Possibly a prototype setup? case 18: case 19: case 20: case 26: case 27: case 28: case 29: case 30: case 31: case 33: case 34: case 35: case 36: case 37: case 38: case 39: case 47: case 53: entry = new LevelDMAFile(dmaBytes, DMATable.Count, (int)_referenceDMA.LevelHeaderOffsets[StarFoxRomInfo.DMATableToLevelIndex(DMATable.Count)], (int)_referenceDMA.LevelInfoOffsets[StarFoxRomInfo.DMATableToLevelIndex(DMATable.Count)]); _levelDMAs.Add(entry as LevelDMAFile); break; default: //Others entry = new DMAFile(dmaBytes, DMATable.Count); break; } DMATable.Add(entry); CurrentPos += 16; } //Now set the DMA Headers if (_dmaTableDMA != null) { for (int i = 0; i < DMATable.Count; i++) { DMATable[i].DMAInfo = _dmaTableDMA.DMATableEntries[i]; if (DMATable[i].DMAInfo.CFlag == 1) IsCompressed = true; } } if (_referenceDMA != null && _levelDMAs.Count > 0) { //Parse out the F3DEX info //LoadROMResources(); } } catch { //Error log entry? return false; } return true; ////Automatically decompress on loading? //if (IsCompressed) //{ // if (DecompressDMA()) // { // FixCRC(); // } //} }