예제 #1
0
        public static SongsDTA Create(Stream stream)
        {
            SongsDTA dta = new SongsDTA();

            StreamReader reader = new StreamReader(stream, Encoding.GetEncoding(28591));

            while (!reader.EndOfStream)
            {
                string line = reader.ReadLine();
                line = line.Trim();
                if (line.StartsWith("(name \""))
                {
                    dta.Name = Regex.Match(line, Regex.Escape("(name \"") + "(?'name'.*?)\"").Groups["name"].Value;
                }
                else if (line.StartsWith("(artist"))
                {
                    dta.Artist = Regex.Match(line, Regex.Escape("(artist \"") + "(?'artist'.*?)\"").Groups["artist"].Value;
                }
                else if (line.StartsWith("(master"))
                {
                    dta.Master = Regex.Match(line, @"\(master (?'master'.*?)\)").Groups["master"].Value == "TRUE";
                }
                else if (line.StartsWith("(genre"))
                {
                    dta.Genre = Regex.Match(line, @"\(genre (?'genre'.*?)\)").Groups["genre"].Value;
                }
                else if (line.StartsWith("(vocal_gender"))
                {
                    dta.Vocalist = Regex.Match(line, @"\(vocal_gender (?'gender'.*?)\)").Groups["gender"].Value;
                }
                else if (line.StartsWith("(year_released"))
                {
                    dta.Year = ushort.Parse(Regex.Match(line, @"\(year_released (?'year'.*?)\)").Groups["year"].Value);
                }
                else if (line.StartsWith("(album_name"))
                {
                    dta.Album = Regex.Match(line, Regex.Escape("(album_name \"") + "(?'album'.*?)\"").Groups["album"].Value;
                }
                else if (line.StartsWith("(album_track_number"))
                {
                    dta.Track = ushort.Parse(Regex.Match(line, @"\(album_track_number (?'track'.*?)\)").Groups["track"].Value);
                }
                else if (line.StartsWith("(pack_name"))
                {
                    dta.Pack = Regex.Match(line, Regex.Escape("(pack_name \"") + "(?'pack'.*?)\"").Groups["pack"].Value;
                }
            }

            return(dta);
        }
예제 #2
0
        public static SongsDTA Create(DTB.NodeTree tree)
        {
            SongsDTA dta = new SongsDTA();

            dta.BaseName = (tree.Nodes[0] as DTB.NodeString).Text;

            dta.Preview.Clear();
            //dta.Song.Tracks.Clear();
            dta.Song.DrumSolo.Clear();
            dta.Song.DrumFreestyle.Clear();
            dta.Song.Pans.Clear();
            dta.Song.Vols.Clear();
            dta.Song.Cores.Clear();
            dta.Song.TracksCount.Clear();

            List <DTB.Node> subtrees = tree.Nodes.FindAll(n => n is DTB.NodeTree);

            foreach (DTB.NodeTree subtree in subtrees)
            {
                switch ((subtree.Nodes[0] as DTB.NodeString).Text)
                {
                case "name":
                    dta.Name = (subtree.Nodes[1] as DTB.NodeString).Text;
                    break;

                case "artist":
                    dta.Artist = (subtree.Nodes[1] as DTB.NodeString).Text;
                    break;

                case "master":
                    if (subtree.Nodes[1] is DTB.NodeString)
                    {
                        dta.Master = (subtree.Nodes[1] as DTB.NodeString).Text == "TRUE";
                    }
                    else
                    {
                        dta.Master = (subtree.Nodes[1] as DTB.NodeInt32).Number == 1;
                    }
                    break;

                case "context":
                    dta.Context = (subtree.Nodes[1] as DTB.NodeInt32).Number;
                    break;

                case "song":
                case "song_coop":
                    SongsDTA.SongInfo song = (subtree.Nodes[0] as DTB.NodeString).Text == "song" ? dta.Song : (dta.SongCoop = new SongInfo());
                    foreach (DTB.NodeTree n in subtree.Nodes.FindAll(n => n is DTB.NodeTree))
                    {
                        switch ((n.Nodes[0] as DTB.NodeString).Text)
                        {
                        case "name":
                            song.Name = (n.Nodes[1] as DTB.NodeString).Text;
                            break;

                        case "tracks_count":
                            foreach (DTB.NodeInt32 i in (n.Nodes[1] as DTB.NodeTree).Nodes)
                            {
                                song.TracksCount.Add(i.Number);
                            }
                            break;

                        case "tracks":
                            if (n.Nodes[1] is DTB.NodeTree)
                            {
                                foreach (DTB.NodeTree t in (n.Nodes[1] as DTB.NodeTree).Nodes)
                                {
                                    string name = (t.Nodes[0] as DTB.NodeString).Text;
                                    if (name == "rhythm")                                                     // GH2 hack
                                    {
                                        name = "bass";
                                    }
                                    if (t.Nodes[1] is DTB.NodeInt32)
                                    {
                                        song.Tracks.Find(t2 => t2.Name == name).Tracks = new List <int>()
                                        {
                                            (t.Nodes[1] as DTB.NodeInt32).Number
                                        }
                                    }
                                    ;
                                    //dta.Song.Tracks.Add(new SongsDTA.SongTracks() { Name = name, Tracks = new List<int>() { (t.Nodes[1] as DTB.NodeInt32).Number } });
                                    else
                                    {
                                        SongsDTA.SongTracks songtrack = song.Tracks.Find(t2 => t2.Name == name);
                                        //SongsDTA.SongTracks songtrack = new SongsDTA.SongTracks() { Name = name, Tracks = new List<int>() };
                                        (t.Nodes[1] as DTB.NodeTree).Nodes.ForEach(l => {
                                            songtrack.Tracks.Add((l as DTB.NodeInt32).Number);
                                        });
                                        //dta.Song.Tracks.Add(songtrack);
                                    }
                                }
                            }
                            break;

                        case "pans":
                            foreach (DTB.Node nd in (n.Nodes[1] as DTB.NodeTree).Nodes)
                            {
                                if (nd is DTB.NodeFloat32)
                                {
                                    song.Pans.Add((nd as DTB.NodeFloat32).Number);
                                }
                                else
                                {
                                    song.Pans.Add((nd as DTB.NodeInt32).Number);
                                }
                            }
                            break;

                        case "vols":
                            foreach (DTB.NodeFloat32 f in (n.Nodes[1] as DTB.NodeTree).Nodes)
                            {
                                song.Vols.Add(f.Number);
                            }
                            break;

                        case "cores":
                            foreach (DTB.NodeInt32 i in (n.Nodes[1] as DTB.NodeTree).Nodes)
                            {
                                song.Cores.Add(i.Number);
                            }
                            break;

                        case "drum_solo":
                            foreach (DTB.NodeString s in ((n.Nodes[1] as DTB.NodeTree).Nodes[1] as DTB.NodeTree).Nodes)
                            {
                                song.DrumSolo.Add(s.Text);
                            }
                            break;

                        case "drum_freestyle":
                            foreach (DTB.NodeString s in ((n.Nodes[1] as DTB.NodeTree).Nodes[1] as DTB.NodeTree).Nodes)
                            {
                                song.DrumFreestyle.Add(s.Text);
                            }
                            break;

                        case "midi_file":
                            song.MidiFile = ((n as DTB.NodeTree).Nodes[1] as DTB.NodeString).Text;
                            break;

                        case "hopo_threshold":
                            song.HopoThreshold = ((n as DTB.NodeTree).Nodes[1] as DTB.NodeInt32).Number;
                            break;
                        }
                    }
                    ;
                    break;

                case "tuning_offset":
                    dta.TuningOffset = (subtree.Nodes[1] as DTB.NodeInt32).Number;
                    break;

                case "tuning_offset_cents":
                    if (subtree.Nodes[1] is DTB.NodeInt32)
                    {
                        dta.TuningOffsetCents = (float)(subtree.Nodes[1] as DTB.NodeInt32).Number;
                    }
                    else
                    {
                        dta.TuningOffsetCents = (subtree.Nodes[1] as DTB.NodeFloat32).Number;
                    }
                    break;

                case "song_scroll_speed":
                    dta.SongScrollSpeed = (subtree.Nodes[1] as DTB.NodeInt32).Number;
                    break;

                case "bank":
                    dta.Bank = (subtree.Nodes[1] as DTB.NodeString).Text;
                    break;

                case "anim_tempo":
                    if (subtree.Nodes[1] is DTB.NodeString)
                    {
                        //dta.AnimTempo = (subtree.Nodes[1] as DTB.NodeString).Text;
                        dta.AnimTempo = 0x20;
                    }
                    else
                    {
                        dta.AnimTempo = (subtree.Nodes[1] as DTB.NodeInt32).Number;
                    }
                    break;

                case "preview":
                    dta.Preview.Add((subtree.Nodes[1] as DTB.NodeInt32).Number);
                    dta.Preview.Add((subtree.Nodes[2] as DTB.NodeInt32).Number);
                    break;

                case "preview_clip":
                    //dta.PreviewClip = (subtree.Nodes[1] as DTB.NodeString).Text;
                    break;

                case "rank":
                    subtree.Nodes.FindAll(n => n is DTB.NodeTree).ForEach(n => {
                        dta.Rank.Find(r => r.Name == ((n as DTB.NodeTree).Nodes[0] as DTB.NodeString).Text).Rank = ((n as DTB.NodeTree).Nodes[1] as DTB.NodeInt32).Number;
                        //dta.Rank.Add(new SongsDTA.Rankings() {
                        //	Name = ((n as DTB.NodeTree).Nodes[0] as DTB.NodeString).Text,
                        //	Rank = ((n as DTB.NodeTree).Nodes[1] as DTB.NodeInt32).Number
                        //});
                    });
                    break;

                case "genre":
                    dta.Genre = (subtree.Nodes[1] as DTB.NodeString).Text;
                    break;

                case "decade":
                    dta.Decade = (subtree.Nodes[1] as DTB.NodeString).Text;
                    break;

                case "vocal_gender":
                    dta.Vocalist = (subtree.Nodes[1] as DTB.NodeString).Text;
                    break;

                case "video_venues":
                    (subtree.Nodes[1] as DTB.NodeTree).Nodes.ForEach(n => {
                        dta.VideoVenues.Add((n as DTB.NodeString).Text);
                    });
                    break;

                case "song_practice_1":
                    break;

                case "version":
                    dta.Version = (subtree.Nodes[1] as DTB.NodeInt32).Number;
                    break;

                case "format":
                    dta.Format = (subtree.Nodes[1] as DTB.NodeInt32).Number;
                    break;

                case "album_art":
                    if (subtree.Nodes[1] is DTB.NodeInt32)
                    {
                        dta.AlbumArt = (subtree.Nodes[1] as DTB.NodeInt32).Number == 1;
                    }
                    else
                    {
                        dta.AlbumArt = (subtree.Nodes[1] as DTB.NodeString).Text == "TRUE";
                    }
                    break;

                case "downloaded":
                    if (subtree.Nodes[1] is DTB.NodeInt32)
                    {
                        dta.Downloaded = (subtree.Nodes[1] as DTB.NodeInt32).Number == 1;
                    }
                    else
                    {
                        dta.Downloaded = (subtree.Nodes[1] as DTB.NodeString).Text == "TRUE";
                    }
                    break;

                case "exported":
                    if (subtree.Nodes[1] is DTB.NodeInt32)
                    {
                        dta.Exported = (subtree.Nodes[1] as DTB.NodeInt32).Number == 1;
                    }
                    else
                    {
                        dta.Exported = (subtree.Nodes[1] as DTB.NodeString).Text == "TRUE";
                    }
                    break;

                case "year_released":
                    dta.Year = (subtree.Nodes[1] as DTB.NodeInt32).Number;
                    break;

                case "album_name":
                    dta.Album = (subtree.Nodes[1] as DTB.NodeString).Text;
                    break;

                case "album_track_number":
                    dta.Track = (subtree.Nodes[1] as DTB.NodeInt32).Number;
                    break;

                case "pack_name":
                    dta.Pack = (subtree.Nodes[1] as DTB.NodeString).Text;
                    break;

                case "base_points":
                    dta.BasePoints = (subtree.Nodes[1] as DTB.NodeInt32).Number;
                    break;

                case "rating":
                    dta.Rating = (subtree.Nodes[1] as DTB.NodeInt32).Number;
                    break;

                case "sub_genre":
                    dta.SubGenre = (subtree.Nodes[1] as DTB.NodeString).Text;
                    break;

                case "song_id":
                    dta.SongID = (subtree.Nodes[1] as DTB.NodeInt32).Number;
                    break;

                case "game_origin":
                    dta.Origin = (subtree.Nodes[1] as DTB.NodeString).Text;
                    break;

                case "ugc":
                    dta.Ugc = (subtree.Nodes[1] as DTB.NodeInt32).Number;
                    break;

                case "song_length":
                    dta.SongLength = (subtree.Nodes[1] as DTB.NodeInt32).Number;
                    break;
                }
            }

            if (dta.SongScrollSpeed == 0)
            {
                dta.SongScrollSpeed = 2300;
            }
            if (dta.Song.HopoThreshold.HasValue && dta.Song.HopoThreshold == 0)
            {
                dta.Song.HopoThreshold = null;
            }

            return(dta);
        }