Beispiel #1
0
        public ScreenCollection(Level level)
        {
            this.Level            = level;
            InvalidScreenIndecies = _invalidScreenIndecies.AsReadOnly();

            PointerBank = level.Format.RoomPtableBank;
            DataBank    = level.Format.RoomDataBank;

            var ppPTable = level.Format.pPointerToRoomPTable;
            var pPTable  = level.Bank.GetPtr(ppPTable);
            var oPTable  = level.Bank.ToOffset(pPTable);

            pointers = new PointerTable(level.Rom, oPTable, 0, level.Format.Uses24bitScreenPointers);

            this.IsReadOnly = false;
            LoadScreens();
            this.IsReadOnly = true;
        }
Beispiel #2
0
        public void load(BinaryReader reader)
        {
            Header newHeader = new Header();

            newHeader.magicByte   = reader.ReadUInt32();
            newHeader.fileVersion = (FileVersion)reader.ReadUInt16();

            newHeader.unk1 = reader.ReadUInt32();
            newHeader.unk2 = reader.ReadUInt32();
            newHeader.lengthOfAnimationData = reader.ReadUInt32();

            if (newHeader.magicByte != 0x00534435)
            {
                Debug.LogError("Unable to parse 5DS File wrong header!");
                return;
            }

            var beginingOfData = reader.BaseStream.Position;

            Description newDescription = new Description();

            newDescription.numberOfAnimatedObjects = reader.ReadUInt16();
            newDescription.mOverallCountOfFrames   = reader.ReadUInt16();


            totalFrameCount = newDescription.mOverallCountOfFrames;

            PointerTable newPointerTable = new PointerTable();

            for (var i = 0; i < newDescription.numberOfAnimatedObjects; i++)
            {
                newPointerTable.pointerToString = reader.ReadUInt32();
                newPointerTable.pointerToData   = reader.ReadUInt32();

                var nextBlock     = reader.BaseStream.Position;
                var pointerToName = (uint)beginingOfData + newPointerTable.pointerToString;
                var pointerToData = (uint)beginingOfData + newPointerTable.pointerToData;

                parseAnimationSequence(ref reader, pointerToData, pointerToName);
                reader.BaseStream.Seek(nextBlock, SeekOrigin.Begin);
            }
        }
 public void ConvertTPTEntry()
 {
     Assert.AreEqual(0x06F187, PointerTable.BytesToOffset(0x87, 0xF1, 0x06));
 }
        public void CalculatePointer_ForDialogTextBank()
        {
            var pointer = PointerTable.CalculatePointer(0x06F187);

            Assert.AreEqual(new byte[] { 0x87, 0xF1, 0x00 }, pointer);
        }
Beispiel #5
0
        private void CopyRoomItemData(Level level, int bank)
        {
            int bankBase = 0x10 + 0x4000 * bank; // Brinstar data will go in bank 8
            int offset   = 0;

            // Item data offsets are calculated now because I'm afraid the calculation will get screwed up after data starts getting moved.
            // The data is moved later, because first we need to move the data that is where we want to put the item data.
            int srcItemData = level.ItemTable_DEPRECATED.GetFirstRowOffset();
            int lenItemData = level.ItemTable_DEPRECATED.GetTotalBytes();
            // Item data will be moved to beginning of "expando store", which starts with either combo data or struct ptable
            int destItemData = Math.Min(level.Combos.Offset, (int)level.Format.StructPtableOffset);
            // This is how much we need to add to the existing pointers to repoint them to new location.
            int diffItemDataLocation = destItemData - srcItemData;


            // Copy combo table (assume 100 combos)
            {
                var comboOffset = level.Combos.Offset;
                var comboLen    = 0x100 * 0x4;
                Array.Copy(romData, comboOffset, enhancedRomData, bankBase + offset, comboLen);
                offset += comboLen;
            }

            // Copy structures, and pointer table
            {
                int structCount = level.StructCount;

                // Pointer table will be followed by struct data
                int oDestStructTable = offset;
                int oDestStructData  = offset + structCount * 2;

                for (int i = 0; i < level.StructCount; i++)
                {
                    // Write pointer to the new data in the new ptr table
                    PointerTable.WriteTwoBytePointer(enhancedRomData, bankBase + oDestStructTable, i, new pCpu(0x8000 | oDestStructData));

                    // Copy the struct data, and update oDestStructData to point where next struct will go
                    var oSrcStruct = level.Structures[i].Offset;
                    var structSize = level.Structures[i].Size;
                    Array.Copy(romData, oSrcStruct, enhancedRomData, bankBase + oDestStructData, structSize);
                    oDestStructData += structSize;
                }

                // Update offset to point past struct data (room data will follow)
                offset = oDestStructData;
            }

            // Copy rooms, and update pointer talbe
            {
                int oRoomPtable = (int)level.Pointers_depracated.RoomTableOffset;

                for (int i = 0; i < level.Screens.Count; i++)
                {
                    // Update room ptr table
                    PointerTable.WriteTwoBytePointer(enhancedRomData, oRoomPtable, i, new pCpu(0x8000 | offset));

                    // Copy room data
                    int oRoom    = level.Screens[i].Offset;
                    int roomSize = level.Screens[i].Size;
                    Array.Copy(romData, oRoom, enhancedRomData, bankBase + offset, roomSize);
                    offset += roomSize;
                }

                // Terminate room ptr table with 0xFFFF
                PointerTable.WriteTwoBytePointer(enhancedRomData, oRoomPtable, level.Screens.Count, new pCpu(0xFFFF));
            }

            // Copy item data
            {
                Array.Copy(romData, srcItemData, enhancedRomData, destItemData, lenItemData);

                // We need to update the linked-list pointers
                // We don't have the benifit of MetroidRom, Bank, etc. objects because all we have right now is a byte array.
                int       bankOffset    = level.Bank.Offset;
                var       ppNextEntry   = level.Format.pPointerToItemList;
                const int tooManyRows   = 33; // If we hit this many rows, we know there's a problem with the data (otherwise we optimistically assume we got it right)
                int       processedRows = 0;

                var pNextEntry = enhanced_GetPtr(bankOffset, ppNextEntry);
                while (pNextEntry.Value != 0xFFFF)
                {
                    processedRows++;
                    if (processedRows >= tooManyRows)
                    {
                        throw new EnhancerException("An error occurred while relocating item data.");
                    }

                    // Correct pointer
                    pNextEntry += diffItemDataLocation;
                    // Write corrected pointer
                    enhanced_SetPtr(bankOffset, ppNextEntry, pNextEntry);
                    // Derference corrected pointer
                    ppNextEntry = pNextEntry + 1; // linked-list pointer is located at byte 1 in next record
                    pNextEntry  = enhanced_GetPtr(bankOffset, ppNextEntry);
                }
            }
        }