public static Ark GetHarmonixArk(this PlatformData data, string path) { DirectoryNode dir = null; try { dir = data.GetDirectoryStructure(path); } catch { if (File.Exists(path)) { path = Path.GetDirectoryName(path); } if (!Directory.Exists(path)) { throw new FormatException(); } dir = DirectoryNode.FromPath(path, data.Cache); } try { Ark ark = GetHarmonixArk(dir); data.Session["ark"] = ark; return(ark); } catch (Exception exception) { Exceptions.Error(exception, "Unable to open the ark file at " + path); } return(null); }
static void PlatformDetection_DetectHarmonixArk(string path, Ark ark, List <Pair <Engine, Game> > platforms) { if (ark.Version <= 2) { platforms.Add(new Pair <Engine, Game>(Instance, Game.Unknown)); } }
// Params // Amplitude Mounted ISO: Z:\home\mnt\gen\main.ark Z:\amplitude // FreQuency: // - Z:\freq\loading.fix.ark Z:\frequency\loading // - Z:\freq\arenas.fix.ark Z:\frequency\arenas // - Z:\freq\levels.fix.ark Z:\frequency\levels // - Z:\freq\root.fix.ark Z:\frequency\root static void Main(string[] args) { if (args.Length < 2) { Console.WriteLine("Usage: ArkExtractor hdrfile [arkfiles] extract_path"); return; } FileStream hdr = new FileStream(args[0], FileMode.Open, FileAccess.Read); List <FileStream> arks = new List <FileStream>(); for (int i = 1; i < args.Length - 1; i++) { arks.Add(new FileStream(args[i], FileMode.Open, FileAccess.Read)); } Ark ark = new Ark(new EndianReader(hdr, Endianness.LittleEndian), arks.ToArray()); ark.Root.Extract(args[args.Length - 1]); hdr.Close(); foreach (FileStream file in arks) { file.Close(); } }
private static void RELAX(Ark ark, ref List <int?> _parent, ref List <double> _dist) { if (_dist[ark.finalNode] > _dist[ark.initialNode] + ark.value) { _dist[ark.finalNode] = _dist[ark.initialNode] + ark.value; _parent[ark.finalNode] = ark.initialNode; } }
void ArkRcon_ServerConnectionFailed(object sender, Ark.ServerConnectionEventArgs e) { ((Server)e.ConnectionInfo).IsConnected = false; WriteToApplicationLog(e.Message, e.Timestamp); if (AttemptReconnectOnServerConnectionFail && App.ModelManager.Get<UserSettings>().GeneralSettings.IsAutoReconnectEnabled) InitiateReconnect(e.ConnectionInfo as Server); }
void ArkRcon_ServerConnectionSucceeded(object sender, Ark.ServerConnectionEventArgs e) { WriteToApplicationLog(e.Message, e.Timestamp); if (App.ModelManager.Get<UserSettings>().GeneralSettings.DoReconnectEveryFiveMinutes) { WriteToApplicationLog("Auto Reconnect Every Five minutes is Enabled", e.Timestamp); ForceReconnect(e.ConnectionInfo as Server); } }
static void PlatformDetection_DetectDirectoryNode(string path, DirectoryNode dir, PlatformList platforms) { if (DetectHarmonixArk != null) { try { Ark ark = HarmonixMetadata.GetHarmonixArk(dir); DetectHarmonixArk(path, ark, platforms); } catch (FormatException) { } catch (Exception exception) { Exceptions.Warning(exception, "Trying to open as Ark: " + path); } } }
public void Recycle(Ark ark) { IsRecycling = true; InteractionCollider.enabled = false; gameObject.layer = LayerMask.NameToLayer("InvisibleTree"); InteractionCollider.gameObject.layer = LayerMask.NameToLayer("InvisibleTree"); Drop(); if (RecycleAction != null) { RecycleAction(this); } StartCoroutine(Co_Recycling()); }
public Player(Ark.Models.Player player) { Name = player.Name; SteamID = player.SteamID; }
static void Main(string[] args) { string arkpath = args[0]; string songname = args[1]; FileStream arkfile = new FileStream(arkpath, FileMode.Open, FileAccess.Read); Ark ark = new Ark(new EndianReader(arkfile, Endianness.LittleEndian)); DirectoryNode songdir = ark.Root.Find("songs") as DirectoryNode; songdir = songdir.Find(songname) as DirectoryNode; Midi midi = Midi.Create(Mid.Create((songdir.Find(songname + "_g.mid") as FileNode).Data)); Dictionary <InstrumentBank, Stream> banks = new Dictionary <InstrumentBank, Stream>(); foreach (FileNode node in songdir.Files) { if (node.Name.EndsWith(".bnk")) { InstrumentBank bank = InstrumentBank.Create(new EndianReader(node.Data, Endianness.LittleEndian)); FileNode nse = songdir.Find(Path.GetFileNameWithoutExtension(node.Name) + ".nse") as FileNode; banks.Add(bank, nse.Data); } } int tracknum = 0; FileStream outfile = new FileStream(@"Z:\" + songname + "_" + midi.Tracks.Count.ToString() + ".raw", FileMode.Create, FileAccess.ReadWrite); //EndianReader writer = new EndianReader(outfile, Endianness.BigEndian); EndianReader writer = new EndianReader(new TemporaryStream(), Endianness.BigEndian); foreach (Midi.Track track in midi.Tracks) { List <Midi.Event> events = new List <Midi.Event>(); events.AddRange(track.Banks.Cast <Midi.Event>()); events.AddRange(track.Instruments.Cast <Midi.Event>()); events.AddRange(track.Notes.Cast <Midi.Event>()); InstrumentBank[] bankids = new InstrumentBank[0x10]; InstrumentBank.Bank[] subbankids = new InstrumentBank.Bank[0x10]; InstrumentBank.Instrument[] instrumentids = new InstrumentBank.Instrument[0x10]; InstrumentBank.Sound[][] soundids = new InstrumentBank.Sound[0x10][]; events.Sort(new SpecialEventComparer()); foreach (Midi.ChannelEvent e in events.Cast <Midi.ChannelEvent>()) { Midi.BankEvent banke = e as Midi.BankEvent; Midi.InstrumentEvent instrumente = e as Midi.InstrumentEvent; Midi.NoteEvent notee = e as Midi.NoteEvent; if (banke != null) { bankids[banke.Channel] = banks.Select(b => b.Key).SingleOrDefault(b => b.Banks.SingleOrDefault(b2 => b2.ID == banke.Bank) != null); subbankids[banke.Channel] = bankids[banke.Channel].Banks.SingleOrDefault(b => b.ID == banke.Bank); } else if (instrumente != null) { instrumentids[instrumente.Channel] = bankids[instrumente.Channel].Instruments.SingleOrDefault(i => i.ID == instrumente.Instrument); int soundoffset = 0; foreach (var instrument in bankids[instrumente.Channel].Instruments) { if (instrument == instrumentids[instrumente.Channel]) { break; } soundoffset += instrument.Sounds; } soundids[instrumente.Channel] = bankids[instrumente.Channel].Sounds.Skip(soundoffset).Take(instrumentids[instrumente.Channel].Sounds).ToArray(); } else { var bank = bankids[notee.Channel]; if (bank == null) { continue; } var instrument = instrumentids[notee.Channel]; if (instrument == null) { continue; // Chart note, not audio-playable } var sound = soundids[notee.Channel].FirstOrDefault(s => s.ID0 == notee.Note); // Should be SingleOrDefault, but some duplicates use Sound.Unknown if (sound == null) { continue; } ulong notetime = midi.GetTime(notee.Time); long sample = (long)(notetime / 1000 * (uint)bank.Samples[sound.Sample].SampleRate / 1000); long duration = (long)((midi.GetTime(notee.Time + notee.Duration) - notetime) / 1000 * (uint)bank.Samples[sound.Sample].SampleRate / 1000); short[] samples = bank.Decode(banks[bank], bank.Samples[sound.Sample]); int volume = sound.Volume * notee.Velocity * instrument.Volume * subbankids[notee.Channel].Volume / 0x7F / 0x7F / 0x7F; //int balance = ((int)sound.Balance - 0x40) * ((int)instrument.Balance - 0x40) / 0x40; int balance = (int)sound.Balance - 0x40; int lvolume = balance <= 0x00 ? 0x7F : 0x7F - balance * 2; int rvolume = balance >= 0x00 ? 0x7F : 0x7F + balance * 2; lvolume = lvolume * volume / 0x7F; rvolume = rvolume * volume / 0x7F; writer.Position = (sample * 2) * midi.Tracks.Count * 2 + tracknum * 2 * 2; //writer.Position = (sample * 2) * midi.Tracks.Count + tracknum * 2; duration = Math.Min(duration, samples.Length); for (int i = 0; i < duration; i++) { //writer.Write(samples[i]); if (lvolume > 1) { writer.Write((short)((int)samples[i] * lvolume / 0x7F)); } else { writer.Position += 2; } if (rvolume > 1) { writer.Write((short)((int)samples[i] * rvolume / 0x7F)); } else { writer.Position += 2; } writer.Position += 2 * (midi.Tracks.Count - 1) * 2; //writer.Position += 2 * (midi.Tracks.Count - 1); } } } tracknum++; Console.WriteLine("Track: " + tracknum.ToString()); } writer.Position = 0; Util.StreamCopy(outfile, writer.Base); outfile.Close(); writer.Base.Close(); arkfile.Close(); }
void ArkRcon_ServerConnectionStarting(object sender, Ark.ServerConnectionEventArgs e) { listBox1.Items.Add(string.Format("{0} - {1}", e.Timestamp, e.Message)); }
void ArkRcon_ServerAuthSucceeded(object sender, Ark.ServerAuthEventArgs e) { listBox1.Items.Add(string.Format("{0} - {1}", e.Timestamp, e.Message)); }
public override PlatformData Create(string path, Game game, ProgressIndicator progress) { PlatformData data = new PlatformData(this, game); Ark ark = data.GetHarmonixArk(path); data.Game = Platform.DetermineGame(data); if (data.Game == Game.RockBand2 || data.Game == Game.RockBandBeatles) { Exceptions.Error("Unable to parse song list from Rock Band Wii disc."); } data.Session["songdir"] = ark.Root; string[] songdirs = new string[] { "songs", "songs_regional/na", "songs_regional/eu" }; progress.NewTask(songdirs.Length); foreach (string songdirname in songdirs) { DirectoryNode songdir = ark.Root.Navigate(songdirname) as DirectoryNode; if (songdir == null) { continue; } FileNode songsdtbfile = songdir.Navigate("gen/songs.dtb") as FileNode; if (songsdtbfile == null) { continue; } try { List <SongsDTA> dtas = new List <SongsDTA>(); DTB.NodeTree dtb = DTB.Create(new EndianReader(new CryptedDtbStream(new EndianReader(songsdtbfile.Data, Endianness.LittleEndian)), Endianness.LittleEndian)); progress.NewTask(dtb.Nodes.Count); foreach (DTB.Node node in dtb.Nodes) { DTB.NodeTree tree = node as DTB.NodeTree; if (tree == null || tree.Nodes[0].Type != 0x00000005 || songdir.Find((tree.Nodes[0] as DTB.NodeString).Text) == null) { progress.Progress(); continue; } SongsDTA dta = SongsDTA.Create(tree); if (dtas.Find(d => d.BaseName == dta.BaseName) != null) { progress.Progress(); continue; // Don't import songs twice } dtas.Add(dta); try { SongData song = HarmonixMetadata.GetSongData(data, tree); AddSong(data, song, progress); } catch (Exception exception) { Exceptions.Warning(exception, "Could not import " + dta.Name + " from the Rock Band Wii disc."); } progress.Progress(); } } catch (Exception exception) { Exceptions.Warning(exception, "Unable to parse song list from Rock Band Wii disc: " + songdirname); } progress.EndTask(); progress.Progress(); } progress.EndTask(); return(data); }
void ArkRcon_ServerConnectionStarting(object sender, Ark.ServerConnectionEventArgs e) { ((Server)e.ConnectionInfo).IsConnected = true; WriteToApplicationLog(e.Message, e.Timestamp); }
public override PlatformData Create(string path, Game game, ProgressIndicator progress) { if (File.Exists(path)) { if (String.Compare(Path.GetExtension(path), ".ark", true) == 0 || String.Compare(Path.GetExtension(path), ".hdr", true) == 0) { path = Path.GetDirectoryName(path); } } PlatformData data = new PlatformData(this, game); data.Game = Platform.DetermineGame(data); Ark ark = data.GetHarmonixArk(path); DirectoryNode songdir = ark.Root.Find("songs", true) as DirectoryNode; if (songdir == null) { Exceptions.Error("This is not a Guitar Hero PS2 disc; the songs dir is missing from the ark."); } FileNode songsdtbfile = ark.Root.Navigate("config/gen/songs.dtb", false, true) as FileNode; if (songsdtbfile == null) { Exceptions.Error("Couldn't find songs.dtb; this is not a Guitar Hero PS2 disc."); } data.Session["songdir"] = songdir; try { List <SongsDTA> dtas = new List <SongsDTA>(); Stream dtbstream = new MemoryStream((int)songsdtbfile.Size); CryptedDtbStream.DecryptOld(dtbstream, new EndianReader(songsdtbfile.Data, Endianness.LittleEndian), (int)songsdtbfile.Size); dtbstream.Position = 0; DTB.NodeTree dtb = DTB.Create(new EndianReader(dtbstream, Endianness.LittleEndian)); progress.NewTask(dtb.Nodes.Count); foreach (DTB.Node node in dtb.Nodes) { DTB.NodeTree tree = node as DTB.NodeTree; if (tree == null || tree.Nodes[0].Type != 0x00000005 || songdir.Find((tree.Nodes[0] as DTB.NodeString).Text) == null) { progress.Progress(); continue; } SongsDTA dta = SongsDTA.Create(tree); if (dtas.FirstOrDefault(d => d.BaseName == dta.BaseName) != null) { progress.Progress(); continue; // Don't import songs twice } dtas.Add(dta); SongData song = HarmonixMetadata.GetSongData(data, tree); try { AddSong(data, song, progress); } catch (Exception exception) { Exceptions.Warning(exception, "Unable to properly parse " + song.Name); } progress.Progress(); } progress.EndTask(); } catch (Exception exception) { Exceptions.Error(exception, "An error occurred while parsing the Guitar Hero PS2 disc."); } return(data); }
void ArkRcon_ConsoleLogUpdated(object sender, Ark.ConsoleLogEventArgs e) { listBox1.Items.Add(string.Format("{0} - {1}", e.Timestamp, e.Message)); }
static void Main(string[] args) { string dir = string.Empty; if (args.Length == 2) { dir = args[1]; } else if (args.Length == 1) { dir = args[0] + ".ext"; } else { Console.WriteLine("Usage: wiidiscextractor /path/to/disc.iso /extract/path"); return; } Directory.CreateDirectory(dir); try { if (!Directory.Exists(args[0])) { throw new FormatException(); } DelayedStreamCache cache = new DelayedStreamCache(); DirectoryNode dirn = DirectoryNode.FromPath(args[0], cache, FileAccess.Read, FileShare.Read); DirectoryNode gen = dirn.Navigate("gen", false, true) as DirectoryNode; if (gen == null) // Just in case we're given the "wrong" directory that directly contains the ark { gen = dirn; } List <Pair <int, Stream> > arkfiles = new List <Pair <int, Stream> >(); Stream hdrfile = null; foreach (FileNode file in gen.Files) { if (file.Name.ToLower().EndsWith(".hdr")) { hdrfile = file.Data; } else if (file.Name.ToLower().EndsWith(".ark")) { Match match = Regex.Match(file.Name.ToLower(), @"_(\d+).ark"); if (match.Success) { arkfiles.Add(new Pair <int, Stream>(int.Parse(match.Groups[1].Value), file.Data)); } else { arkfiles.Add(new Pair <int, Stream>(0, file.Data)); } } } // FreQuency/Amplitude where the header is the ark if (hdrfile == null) { if (arkfiles.Count == 1) { hdrfile = arkfiles[0].Value; arkfiles.Clear(); } else { throw new FormatException(); } } Ark ark = new Ark(new EndianReader(hdrfile, Endianness.LittleEndian), arkfiles.OrderBy(f => f.Key).Select(f => f.Value).ToArray()); ark.Root.Extract(dir); cache.Dispose(); } catch (FormatException) { Stream stream = new FileStream(args[0], FileMode.Open, FileAccess.Read); try { Iso9660 iso = new Iso9660(stream); iso.Root.Extract(dir); } catch (Exception) { try { stream.Position = 0; Disc disc = new Disc(stream); File.WriteAllText(Path.Combine(dir, "title"), disc.Title); foreach (var partition in disc.Partitions) { string path = Path.Combine(dir, "partition" + disc.Partitions.IndexOf(partition).ToString()); Directory.CreateDirectory(path); partition.Root.Root.Extract(Path.Combine(path, "data")); FileStream file = new FileStream(Path.Combine(path, "partition.tik"), FileMode.Create, FileAccess.Write); partition.Ticket.Save(file); file.Close(); file = new FileStream(Path.Combine(path, "partition.tmd"), FileMode.Create, FileAccess.Write); partition.TMD.Save(file); file.Close(); file = new FileStream(Path.Combine(path, "partition.certs"), FileMode.Create, FileAccess.Write); file.Write(partition.CertificateChain); file.Close(); } } catch { try { stream.Position = 0; DlcBin bin = new DlcBin(stream); U8 u8 = new U8(bin.Data); u8.Root.Extract(dir); } catch { try { stream.Position = 0; U8 u8 = new U8(stream); u8.Root.Extract(dir); } catch { stream.Position = 0; Rarc rarc = new Rarc(stream); rarc.Root.Extract(dir); } } } } stream.Close(); } }