示例#1
0
        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);
        }
示例#2
0
 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));
     }
 }
示例#3
0
        // 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();
            }
        }
示例#4
0
 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);
            }
        }
示例#7
0
 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);
         }
     }
 }
示例#8
0
    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;
 }
示例#10
0
        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));
 }
示例#13
0
        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);
 }
示例#15
0
        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));
 }
示例#17
0
        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();
            }
        }