예제 #1
0
        public override void OnPopulate()
        {
            RBNK_DATAHeader *header = Header;
            VoidPtr          offset = &header->_list;
            int count = header->_list._numEntries;

            LabelItem[] list = ((RBNKNode)_parent)._labels;  //Get labels from parent
            ((RBNKNode)_parent)._labels = null;              //Clear labels, no more use for them!

            for (int i = 0; i < count; i++)
            {
                ruint         entry = header->_list.Entries[i];
                RBNKEntryNode e     = null;
                switch (entry._dataType) //RegionTableType
                {
                default:
                    e = new RBNKNullNode();
                    if (list != null)
                    {
                        (e as RBNKNullNode)._key = (byte)list[i].Tag;
                    }

                    (e as RBNKNullNode)._invalid = true;
                    break;

                case 1:     //InstParam
                    e = new RBNKDataInstParamNode();
                    if (list != null)
                    {
                        (e as RBNKDataInstParamNode)._key = (byte)list[i].Tag;
                    }

                    break;

                case 2:     //RangeTable
                    e = new RBNKDataRangeTableNode();
                    break;

                case 3:     //IndexTable
                    e = new RBNKDataIndexTableNode();
                    break;

                case 4:
                    e = new RBNKNullNode();
                    (e as RBNKNullNode)._key = (byte)list[i].Tag;
                    break;
                }

                if (e != null)
                {
                    e._offset = offset;
                    if (list != null)
                    {
                        e._name = list[i].String;
                    }

                    e.Initialize(this, header->_list.Get(offset, i), 0);
                }
            }
        }
예제 #2
0
        protected override void OnPopulate()
        {
            int count;

            if (_index == 0)
            {
                RBNK_DATAHeader *header = Header;
                VoidPtr          offset = &header->_list;
                count = header->_list._numEntries;

                LabelItem[] list = ((RBNKNode)_parent)._labels; //Get labels from parent
                ((RBNKNode)_parent)._labels = null;             //Clear labels, no more use for them!

                for (int i = 0; i < count; i++)
                {
                    RBNKDataNode node = new RBNKDataNode();
                    node._offset = offset;
                    if (list != null)
                    {
                        node._soundIndex = list[i].Tag;
                        node._name       = list[i].String;
                    }
                    node.Initialize(this, header->_list.Get(offset, i), 0);
                }
            }
            else
            {
                //Uses same format as RWSD
                //RWSD_WAVEHeader* header = (RWSD_WAVEHeader*)Header;
                //count = header->_entries;
                //for (int i = 0; i < count; i++)
                //    new RWSDSoundNode().Initialize(this, header->GetEntry(i), 0);
            }
        }
예제 #3
0
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            RBNK_DATAHeader *header = (RBNK_DATAHeader *)address;

            header->_tag              = RBNK_DATAHeader.Tag;
            header->_length           = length;
            header->_list._numEntries = Children.Count;

            VoidPtr addr = address + 12 + 8 * Children.Count;

            foreach (RBNKEntryNode g in Children)
            {
                g._rebuildBase = header->_list.Address;

                if (g is RBNKDataInstParamNode)
                {
                    header->_list.Entries[g.Index]           = addr - header->_list.Address;
                    header->_list.Entries[g.Index]._dataType = 1;
                }
                else if (g is RBNKDataRangeTableNode)
                {
                    header->_list.Entries[g.Index]           = addr - header->_list.Address;
                    header->_list.Entries[g.Index]._dataType = 2;
                }
                else if (g is RBNKDataIndexTableNode)
                {
                    header->_list.Entries[g.Index]           = addr - header->_list.Address;
                    header->_list.Entries[g.Index]._dataType = 3;
                }
                else if (g is RBNKNullNode && !(g as RBNKNullNode)._invalid)
                {
                    header->_list.Entries[g.Index]           = 0;
                    header->_list.Entries[g.Index]._dataType = 4;
                }
                else
                {
                    header->_list.Entries[g.Index]           = 0;
                    header->_list.Entries[g.Index]._dataType = 0;
                    header->_list.Entries[g.Index]._refType  = 0;
                }

                g.Rebuild(addr, g._calcSize, false);
                addr += g._calcSize;
            }
        }
예제 #4
0
        protected override void OnPopulate()
        {
            RSARNode    rsar     = RSARNode;
            SYMBHeader *symb     = null;
            RuintList * bankList = null;
            //INFOBankEntry** soundIndices = null;
            VoidPtr soundOffset = null;
            //INFOBankEntry* sEntry;
            RBNKGroupNode    g;
            RBNKHeader *     rwsd = Header;
            RBNK_DATAHeader *data = rwsd->Data;
            //RWSD_WAVEHeader* wave = rwsd->Wave;
            RuintList *list = &data->_list;
            //RuintList* waveList = &wave->_list;
            int count = list->_numEntries;

            //Get sound info from RSAR (mainly for names)
            if (rsar != null)
            {
                symb        = rsar.Header->SYMBBlock;
                soundOffset = &rsar.Header->INFOBlock->_collection;
                bankList    = rsar.Header->INFOBlock->Banks;
                //soundIndices = (INFOBankEntry**)Marshal.AllocHGlobal(count * 4);

                //int sIndex = 0;
                //int soundCount = soundList->_numEntries;
                //for (int i = 0; i < soundCount; i++)
                //    if ((sEntry = (INFOBankEntry*)soundList->Get(soundOffset, i))->_fileId == _fileIndex)
                //        soundIndices[((INFOSoundPart2*)sEntry->GetPart2(soundOffset))->_soundIndex] = sEntry;
            }
            (g = new RBNKGroupNode()).Initialize(this, Header->Data, Header->_dataLength);
            for (int i = 0; i < count; i++)
            {
                RBNK_DATAEntry *entry = (RBNK_DATAEntry *)list->Get(list, i);
                RBNKDataNode    node  = new RBNKDataNode();
                node._offset = list;
                node.Initialize(g, entry, 0);

                //Attach from INFO block
                //if (soundIndices != null)
                //{
                //    sEntry = soundIndices[i];
                //    node._name = symb->GetStringEntry(sEntry->_stringId);
                //}
            }

            //if (soundIndices != null)
            //    Marshal.FreeHGlobal((IntPtr)soundIndices);

            //Get labels
            RSARNode parent;
            int      count2 = Header->Data->_list._numEntries;

            if ((_labels == null) && ((parent = RSARNode) != null))
            {
                _labels = new LabelItem[count2];// new string[count];

                //Get them from RSAR
                SYMBHeader *symb2 = parent.Header->SYMBBlock;
                INFOHeader *info  = parent.Header->INFOBlock;

                VoidPtr    offset    = &info->_collection;
                RuintList *bankList2 = info->Banks;
                count2 = bankList2->_numEntries;

                //INFOBankEntry* entry;
                //for (int i = 0; i < count2; i++)
                //    if ((entry = (INFOBankEntry*)soundList2->Get(offset, i))->_fileId == _fileIndex)
                //        _labels[((INFOSoundPart2*)entry->GetPart2(offset))->_soundIndex] = new LabelItem() { Tag = i, String = symb2->GetStringEntry(entry->_stringId) };
            }

            new RBNKGroupNode().Initialize(this, Header->Wave, Header->_waveLength);
        }