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); } }
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); }
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; } } }
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); } }
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); }
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); }