Example #1
0
        private void btnEdit_Click(object sender, EventArgs e)
        {
            RSARFileNode file = lstFiles.SelectedItem as RSARFileNode;

            if (file is RSARExtFileNode)
            {
                RSARExtFileNode m = file as RSARExtFileNode;
                if (File.Exists(m.FullExtPath))
                {
                    Process.Start(m.FullExtPath);
                }
                else
                {
                    using (SoundPathChanger dlg = new SoundPathChanger())
                    {
                        RSARNode rsar = m.RSARNode;
                        dlg.FilePath             = m.FullExtPath;
                        dlg.dlg.InitialDirectory = rsar._origPath.Substring(0, rsar._origPath.LastIndexOf('\\'));
                        if (dlg.ShowDialog() == DialogResult.OK)
                        {
                            m.FullExtPath = dlg.FilePath;
                        }
                    }
                }
            }
            else
            {
                new EditRSARFileDialog().ShowDialog(this, file);
            }
        }
Example #2
0
        private void makeAllInternalToolStripMenuItem_Click(object sender, EventArgs e)
        {
            foreach (SoundPackItem i in lstSets.Items)
            {
                if (!(i._node is RSARExtFileNode))
                {
                    continue;
                }
                RSARExtFileNode w    = i._node as RSARExtFileNode;
                string          path = w.FullExtPath;
                if (!File.Exists(path))
                {
                    continue;
                }
                RSARFileNode ext = NodeFactory.FromFile(null, path) as RSARFileNode;
                if (ext == null)
                {
                    continue;
                }

                ListViewItem v    = i as ListViewItem;
                string       type = v.SubItems[1].ToString();

                i._node.Remove();
                _targetNode.Files.RemoveAt(i.Index);

                ext._parent    = _targetNode;
                ext._fileIndex = i.Index;
                i._node        = ext;
                _targetNode.Files.Insert(i.Index, ext);
            }
        }
        private void externalReferenceToolStripMenuItem_Click(object sender, EventArgs e)
        {
            RSARExtFileNode node = new RSARExtFileNode()
            {
                _name      = String.Format("[{0}] External", _targetNode.Files.Count),
                _fileIndex = _targetNode.Files.Count
            };

            node._parent = _targetNode;
            _targetNode.Files.Add(node);
            Update(lstSets);
        }
Example #4
0
 private void mnuPath_Click(object sender, EventArgs e)
 {
     using (SoundPathChanger dlg = new SoundPathChanger())
     {
         RSARExtFileNode ext = _selectedItem._node as RSARExtFileNode;
         dlg.FilePath             = ext.FullExtPath;
         dlg.dlg.InitialDirectory = TargetNode._origPath.Substring(0, TargetNode._origPath.LastIndexOf('\\'));
         if (dlg.ShowDialog() == DialogResult.OK)
         {
             ext.FullExtPath = dlg.FilePath;
             _selectedItem.SubItems[2].Text = ext._extPath;
         }
     }
 }
Example #5
0
 private void lstSets_DoubleClick(object sender, EventArgs e)
 {
     if (_selectedItem._node is RSARExtFileNode)
     {
         RSARExtFileNode ext = _selectedItem._node as RSARExtFileNode;
         if (File.Exists(ext.FullExtPath))
         {
             Process.Start(ext.FullExtPath);
         }
         else
         {
             mnuPath_Click(this, null);
         }
     }
     else if (!(_selectedItem._node is RSTMNode))
     {
         new EditRSARFileDialog().ShowDialog(this, _selectedItem._node);
     }
 }
        public void ViewFile()
        {
            RSARFileNode n;

            if ((n = (_resource as RSARSoundNode).SoundFileNode) == null)
            {
                return;
            }
            if (n is RSARExtFileNode)
            {
                RSARExtFileNode ext = n as RSARExtFileNode;
                if (File.Exists(ext.FullExtPath))
                {
                    Process.Start(ext.FullExtPath);
                }
            }
            else
            {
                new EditRSARFileDialog().ShowDialog(MainForm.Instance, n);
            }
        }
Example #7
0
        internal int EncodeINFOBlock(INFOHeader *header, RSAREntryList entries, RSARNode node)
        {
            int len = 0;

            VoidPtr    baseAddr = header->_collection.Address;
            ruint *    values   = (ruint *)baseAddr;
            VoidPtr    dataAddr = baseAddr + 0x30;
            RuintList *entryList;
            int        index = 0;

            //Set up sound ruint list
            values[0] = (uint)dataAddr - (uint)baseAddr;
            entryList = (RuintList *)dataAddr;
            entryList->_numEntries = entries._sounds.Count;
            dataAddr += entries._sounds.Count * 8 + 4;

            //Write sound entries
            foreach (RSAREntryNode r in entries._sounds)
            {
                r._rebuildBase = baseAddr;
                entryList->Entries[index++] = (uint)dataAddr - (uint)baseAddr;
                r.Rebuild(dataAddr, r._calcSize, true);
                dataAddr += r._calcSize;
            }

            index = 0;
            //Set up bank ruint list
            values[1] = (uint)dataAddr - (uint)baseAddr;
            entryList = (RuintList *)dataAddr;
            entryList->_numEntries = entries._banks.Count;
            dataAddr += entries._banks.Count * 8 + 4;

            //Write bank entries
            foreach (RSAREntryNode r in entries._banks)
            {
                r._rebuildBase = baseAddr;
                entryList->Entries[index++] = (uint)dataAddr - (uint)baseAddr;
                r.Rebuild(dataAddr, r._calcSize, true);
                dataAddr += r._calcSize;
            }

            index = 0;
            //Set up playerInfo ruint list
            values[2] = (uint)dataAddr - (uint)baseAddr;
            entryList = (RuintList *)dataAddr;
            entryList->_numEntries = entries._playerInfo.Count;
            dataAddr += entries._playerInfo.Count * 8 + 4;

            //Write playerInfo entries
            foreach (RSAREntryNode r in entries._playerInfo)
            {
                r._rebuildBase = baseAddr;
                entryList->Entries[index++] = (uint)dataAddr - (uint)baseAddr;
                r.Rebuild(dataAddr, r._calcSize, true);
                dataAddr += r._calcSize;
            }

            index = 0;
            //Set up file ruint list
            values[3] = (uint)dataAddr - (uint)baseAddr;
            entryList = (RuintList *)dataAddr;
            entryList->_numEntries = entries._files.Count;
            dataAddr += entries._files.Count * 8 + 4;

            //Write file entries
            foreach (RSARFileNode file in entries._files)
            {
                //if (file._groupRefs.Count == 0 && !(file is RSARExtFileNode))
                //    continue;

                entryList->Entries[index++] = (uint)dataAddr - (uint)baseAddr;
                INFOFileHeader *fileHdr = (INFOFileHeader *)dataAddr;
                dataAddr += INFOFileHeader.Size;
                RuintList *list = (RuintList *)dataAddr;
                fileHdr->_entryNumber = -1;
                if (file is RSARExtFileNode)
                {
                    uint extFileSize = 0;

                    RSARExtFileNode ext = file as RSARExtFileNode;

                    //Make an attempt to get current file size
                    if (ext.ExternalFileInfo.Exists)
                    {
                        extFileSize = (uint)ext.ExternalFileInfo.Length;
                    }

                    if (ext._extFileSize != extFileSize && extFileSize != 0)
                    {
                        ext._extFileSize = extFileSize;
                    }

                    //Shouldn't matter if 0
                    fileHdr->_headerLen = ext._extFileSize;

                    fileHdr->_dataLen      = 0;
                    fileHdr->_stringOffset = (uint)(list - baseAddr);

                    sbyte *dPtr = (sbyte *)list;
                    ext._extPath.Write(ref dPtr);
                    dataAddr += (dPtr - dataAddr).Align(4);

                    fileHdr->_listOffset = (uint)(dataAddr - baseAddr);
                    dataAddr            += 4; //Empty list
                }
                else
                {
                    fileHdr->_headerLen = (uint)file._headerLen;
                    fileHdr->_dataLen   = (uint)file._audioLen;
                    //fileHdr->_stringOffset = 0;
                    fileHdr->_listOffset = (uint)(list - baseAddr);
                    list->_numEntries    = file._groupRefs.Count;
                    INFOFileEntry *fileEntries = (INFOFileEntry *)((VoidPtr)list + 4 + file._groupRefs.Count * 8);
                    int            z           = 0;
                    List <int>     used        = new List <int>();
                    foreach (RSARGroupNode g in file._groupRefs)
                    {
                        list->Entries[z]        = (uint)(&fileEntries[z] - baseAddr);
                        fileEntries[z]._groupId = g._rebuildIndex;
                        int[] all  = g._files.FindAllOccurences(file);
                        bool  done = false;
                        foreach (int i in all)
                        {
                            if (!used.Contains(i))
                            {
                                fileEntries[z]._index = i;
                                used.Add(i);
                                done = true;
                                break;
                            }
                        }

                        if (!done)
                        {
                            fileEntries[z]._index = g._files.IndexOf(file);
                        }

                        z++;
                    }

                    dataAddr = (VoidPtr)fileEntries + file._groupRefs.Count * INFOFileEntry.Size;
                }
            }

            index = 0;
            //Set up group ruint list
            values[4] = (uint)dataAddr - (uint)baseAddr;
            entryList = (RuintList *)dataAddr;
            entryList->_numEntries = entries._groups.Count;
            dataAddr += entries._groups.Count * 8 + 4;

            //Write group entries
            foreach (RSAREntryNode r in entries._groups)
            {
                r._rebuildBase = baseAddr;
                entryList->Entries[index++] = (uint)dataAddr - (uint)baseAddr;
                r.Rebuild(dataAddr, r._calcSize, true);
                dataAddr += r._calcSize;
            }

            //Write footer
            values[5] = (uint)dataAddr - (uint)baseAddr;
            *(INFOFooter *)dataAddr = node._ftr;

            //Set header
            header->_header._tag    = INFOHeader.Tag;
            header->_header._length = len = (dataAddr + INFOFooter.Size - (baseAddr - 8)).Align(0x20);

            return(len);
        }
Example #8
0
        private void makeAllExternalToolStripMenuItem_Click(object sender, EventArgs e)
        {
            foreach (SoundPackItem i in lstSets.Items)
            {
                if (i._node is RSARExtFileNode)
                {
                    continue;
                }

                ListViewItem v        = i as ListViewItem;
                string       type     = v.SubItems[1].Text;
                string       dir      = "\\" + type + "\\";
                string       fileName = i._node.Name.Replace('/', '_').Replace('<', '(').Replace('>', ')') + ".b" + type.ToLower();

                string newPath = _targetNode._origPath.Substring(0, _targetNode._origPath.LastIndexOf('\\')) + dir;
                if (!Directory.Exists(newPath))
                {
                    Directory.CreateDirectory(newPath);
                }
                i._node.Export(newPath + fileName);

                RSARGroupNode[] groups = i._node.GroupRefNodes;

                //Contains lists of all instances of this file in each group
                List <int>[] refs = new List <int> [groups.Length];

                //Remove all references to this file
                for (int n = 0; n < groups.Length; ++n)
                {
                    refs[n] = new List <int>();
                    RSARGroupNode g = groups[n];
                    for (int m = 0; m < g._files.Count; ++m)
                    {
                        if (g._files[m] == i._node)
                        {
                            refs[n].Add(m);
                            g._files.RemoveAt(m--);
                        }
                    }
                }
                //if (i._node is RWSDNode)
                //{
                //    if (i._node.Children.Count > 0)
                //        foreach (RWSDDataNode d in i._node.Children[0].Children)
                //        {
                //            foreach (RSARSoundNode r in d._refs)
                //            {

                //            }
                //        }
                //}
                //else if (i._node is RSEQNode)
                //{
                //    foreach (RSEQLabelNode d in i._node.Children)
                //    {

                //    }
                //}
                //else
                List <RSARBankNode> rbnkRefs = null;
                if (i._node is RBNKNode)
                {
                    RBNKNode rbnk = i._node as RBNKNode;
                    rbnkRefs = rbnk._rsarBankEntries;
                    for (int j = 0; j < rbnk._rsarBankEntries.Count; ++j)
                    {
                        RSARBankNode b = rbnk._rsarBankEntries[j];
                        b.BankNode = null;
                    }
                    //if (i._node.Children.Count > 0)
                    //    foreach (RBNKDataEntryNode d in i._node.Children[0].Children)
                    //    {

                    //    }
                }

                _targetNode.Files.RemoveAt(i.Index);

                RSARExtFileNode ext = new RSARExtFileNode();
                ext._fileIndex = i.Index;
                ext._parent    = _targetNode;
                _targetNode.Files.Insert(i.Index, ext);

                ext.ExtPath = (dir + fileName).Replace('\\', '/');
                ext.Name    = String.Format("[{0}] {1}", i.Index, ext.ExtPath);

                if ((i._node is RBNKNode || i._node is RSARExtFileNode) && rbnkRefs != null)
                {
                    RBNKNode rbnk = i._node as RBNKNode;
                    foreach (RSARBankNode b in rbnkRefs)
                    {
                        b.BankNode = ext;
                    }
                }

                //Remake references
                for (int groupID = 0; groupID < refs.Length; ++groupID)
                {
                    int           r     = 0;
                    RSARGroupNode group = groups[groupID];
                    foreach (int occurrence in refs[groupID])
                    {
                        group._files.Insert(occurrence + r++, ext);
                    }

                    ext._groupRefs.Add(group);
                }

                i._node = ext;
            }
            _targetNode.IsDirty = true;
            Update(lstSets);
        }