/// <summary> /// /// </summary> /// <param name="entry"></param> public void SetEntry(int entryIndex, SEMEntry entry) { scriptArrayEditor.ItemIndexOffset = 10000 * entryIndex; _entry = entry; RefreshEntry(); }
/// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void importSPKG_Click(object sender, EventArgs e) { var f = FileIO.OpenFile("SEM Package (*.spk)|*.spk"); if (f != null) { SEMEntry entry = new SEMEntry(); entry.LoadFromPackage(f); entryList.AddItem(entry); } }
/// <summary> /// /// </summary> /// <param name="path"></param> private void OpenSEMFile(string path) { using (BinaryReaderExt r = new BinaryReaderExt(new FileStream(path, FileMode.Open))) { r.BigEndian = true; r.Seek(8); var entryCount = r.ReadInt32(); var offsetTableStart = r.Position + (entryCount + 1) * 4; for (uint i = 0; i < entryCount; i++) { SEMEntry e = new SEMEntry(); e.Index = (int)i; Entries.Add(e); r.Seek(0x0C + i * 4); var startIndex = r.ReadInt32(); var endIndex = r.ReadInt32(); HashSet <int> UniqueEntries = new HashSet <int>(); int largestEntry = 0; for (uint j = 0; j < endIndex - startIndex; j++) { SEMSound s = new SEMSound(); s.Index = (int)j; r.Seek((uint)(offsetTableStart + startIndex * 4 + j * 4)); var dataOffsetStart = r.ReadUInt32(); var dataOffsetEnd = r.ReadUInt32(); if (dataOffsetEnd == 0) { dataOffsetEnd = (uint)r.Length; } r.Seek(dataOffsetStart); s.CommandData = r.ReadBytes((int)(dataOffsetEnd - dataOffsetStart)); e.Sounds.Add(s); var entryId = ((s.CommandData[1] & 0xFF) << 16) | ((s.CommandData[2] & 0xFF) << 8) | ((s.CommandData[3] & 0xFF)); if (!UniqueEntries.Contains(entryId)) { UniqueEntries.Add(entryId); } } e.UniqueCount = UniqueEntries.Count; //e.UniqueCount = largestEntry; } } }
/// <summary> /// /// </summary> /// <param name="pack"></param> /// <param name="fighter"></param> /// <param name="editor"></param> /// <returns>Dictionary to maps old sound id values to new values</returns> private void ImportSoundData(ZipFile pack, MEXFighterEntry fighter, string semFile) { Console.WriteLine($"Importing Sound Data..."); var root = Path.GetDirectoryName(MainForm.Instance.FilePath); // Load SEM File SemEntries = SEM.ReadSEMFile(semFile, true, editor._data); // narrator call----------------------------------------------- var narratorScript = @".SFXID : (id) .REVERB : 48 .PRIORITY : 15 .UNKNOWN06 : 229 .END : 0"; var narr = pack["Sound/narrator.dsp"]; var nameBank = SemEntries.Find(e => e.SoundBank?.Name == "nr_name.ssm"); if (narr != null && nameBank != null) { var narsound = new DSP(); narsound.FromFormat(GetBytes(narr), "dsp"); var index = nameBank.SoundBank.Sounds.Length; nameBank.SoundBank.AddSound(narsound); var script = new SEMScript(); SEM.CompileSEMScript(narratorScript.Replace("(id)", index.ToString()), out script.CommandData); var scriptIndex = nameBank.Scripts.Length; nameBank.AddScript(script); fighter.AnnouncerCall = scriptIndex + SemEntries.IndexOf(nameBank) * 10000; Console.WriteLine("Imported Announcer Call"); } // Create and import SSM----------------------------------------------- var semYAML = pack["Sound/sem.yaml"]; var ssmFile = pack["Sound/sound.ssm"]; if (semYAML != null) { using (MemoryStream zos = new MemoryStream()) { semYAML.Extract(zos); zos.Position = 0; using (StreamReader r = new StreamReader(zos)) { var semEntry = SEMEntry.Deserialize(r.ReadToEnd()); if (ssmFile != null) { var ssmName = fighter.NameText.ToLower() + ".ssm"; semEntry.SoundBank = new SSM(); using (MemoryStream ssmStream = new MemoryStream()) { ssmFile.Extract(ssmStream); ssmStream.Position = 0; semEntry.SoundBank.Open(ssmName, ssmStream); } var ssmFilePath = Path.Combine(root, "audio\\us\\" + ssmName); File.WriteAllBytes(ssmFilePath, GetBytes(ssmFile)); } fighter.SSMIndex = SemEntries.Count; SemEntries.Add(semEntry); } } } // Import Victory Theme var victory = pack["Sound/victory.hps"]; if (victory != null) { var ffname = $"ff_{fighter.NameText.ToLower()}.hps"; fighter.VictoryThemeID = editor.MusicControl.AddMusic(new HSD_String() { Value = ffname }); var fffilePath = Path.Combine(root, "audio\\" + ffname); File.WriteAllBytes(fffilePath, GetBytes(victory)); } }
/// <summary> /// /// </summary> /// <param name="entry"></param> public void SetEntry(SEMEntry entry) { _entry = entry; soundArrayEditor.SetArrayFromProperty(entry.SoundBank, "Sounds"); }