private static void AddLine(Track track, line_json line) { switch (line.type) { case 0: { var add = new StandardLine( new Vector2d(line.x1, line.y1), new Vector2d(line.x2, line.y2), Convert.ToBoolean(line.flipped)); add.ID = line.id; add.Extension = (StandardLine.Ext)line.extended; if (Convert.ToBoolean(line.leftExtended)) { add.Extension |= StandardLine.Ext.Left; } if (Convert.ToBoolean(line.rightExtended)) { add.Extension |= StandardLine.Ext.Right; } track.AddLine(add); break; } case 1: { var add = new RedLine( new Vector2d(line.x1, line.y1), new Vector2d(line.x2, line.y2), Convert.ToBoolean(line.flipped)); add.ID = line.id; add.Extension = (StandardLine.Ext)line.extended; if (Convert.ToBoolean(line.leftExtended)) { add.Extension |= StandardLine.Ext.Left; } if (Convert.ToBoolean(line.rightExtended)) { add.Extension |= StandardLine.Ext.Right; } track.AddLine(add); break; } case 2: { var add = new SceneryLine( new Vector2d(line.x1, line.y1), new Vector2d(line.x2, line.y2)); add.ID = line.id; track.AddLine(add); break; } default: throw new TrackIO.TrackLoadException( "Unknown line type"); } }
public static Track LoadTrack(string trackfile, string trackname) { var ret = new Track(); ret.Filename = trackfile; ret.Name = trackname; ret.Remount = false; var addedlines = new Dictionary <int, StandardLine>(); var location = trackfile; var bytes = File.ReadAllBytes(location); using (var file = new MemoryStream(bytes)) { var br = new BinaryReader(file); int magic = br.ReadInt32(); if (magic != ('T' | 'R' << 8 | 'K' << 16 | 0xF2 << 24)) { throw new TrackIO.TrackLoadException("File was read as .trk but it is not valid"); } byte version = br.ReadByte(); string[] features = ReadString(br).Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); if (version != 1) { throw new TrackIO.TrackLoadException("Unsupported version"); } bool redmultipier = false; bool scenerywidth = false; bool supports61 = false; bool songinfo = false; bool ignorabletrigger = false; for (int i = 0; i < features.Length; i++) { switch (features[i]) { case TrackFeatures.redmultiplier: redmultipier = true; break; case TrackFeatures.scenerywidth: scenerywidth = true; break; case TrackFeatures.six_one: supports61 = true; break; case TrackFeatures.songinfo: songinfo = true; break; case TrackFeatures.ignorable_trigger: ignorabletrigger = true; break; case TrackFeatures.zerostart: ret.ZeroStart = true; break; case TrackFeatures.remount: ret.Remount = true; break; case TrackFeatures.frictionless: ret.frictionless = true; break; default: throw new TrackIO.TrackLoadException("Unsupported feature"); } } if (supports61) { ret.SetVersion(61); } else { ret.SetVersion(62); } if (songinfo) { var song = br.ReadString(); try { var strings = song.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); var fn = Program.UserDirectory + "Songs" + Path.DirectorySeparatorChar + strings[0]; if (File.Exists(fn)) { if (AudioService.LoadFile(ref fn)) { ret.Song = new Song(Path.GetFileName(fn), float.Parse(strings[1], Program.Culture)); } else { Program.NonFatalError("An unknown error occured trying to load the song file"); } } } catch { // ignored } } ret.StartOffset = new Vector2d(br.ReadDouble(), br.ReadDouble()); var lines = br.ReadInt32(); List <LineTrigger> linetriggers = new List <LineTrigger>(); for (var i = 0; i < lines; i++) { GameLine l; byte ltype = br.ReadByte(); var lt = (LineType)(ltype & 0x1F);//we get 5 bits var inv = (ltype >> 7) != 0; var lim = (ltype >> 5) & 0x3; var ID = -1; var prvID = -1; var nxtID = -1; var multiplier = 1; var linewidth = 1f; LineTrigger tr = null; if (redmultipier) { if (lt == LineType.Red) { multiplier = br.ReadByte(); } } if (lt == LineType.Blue || lt == LineType.Red) { if (ignorabletrigger) { tr = new LineTrigger(); bool zoomtrigger = br.ReadBoolean(); if (zoomtrigger) { tr.ZoomTrigger = true; var target = br.ReadSingle(); var frames = br.ReadInt16(); tr.ZoomFrames = frames; tr.ZoomTarget = target; } else { tr = null; } } ID = br.ReadInt32(); if (lim != 0) { prvID = br.ReadInt32(); //ignored nxtID = br.ReadInt32(); //ignored } } if (lt == LineType.Scenery) { if (scenerywidth) { float b = br.ReadByte(); linewidth = b / 10f; } } var x1 = br.ReadDouble(); var y1 = br.ReadDouble(); var x2 = br.ReadDouble(); var y2 = br.ReadDouble(); if (tr != null) { tr.LineID = ID; linetriggers.Add(tr); } switch (lt) { case LineType.Blue: var bl = new StandardLine(new Vector2d(x1, y1), new Vector2d(x2, y2), inv); bl.ID = ID; bl.Extension = (StandardLine.Ext)lim; l = bl; break; case LineType.Red: var rl = new RedLine(new Vector2d(x1, y1), new Vector2d(x2, y2), inv); rl.ID = ID; rl.Extension = (StandardLine.Ext)lim; if (redmultipier) { rl.Multiplier = multiplier; } l = rl; break; case LineType.Scenery: l = new SceneryLine(new Vector2d(x1, y1), new Vector2d(x2, y2)) { Width = linewidth }; break; default: throw new TrackIO.TrackLoadException("Invalid line type at ID " + ID); } if (l is StandardLine) { if (!addedlines.ContainsKey(l.ID)) { addedlines[ID] = (StandardLine)l; ret.AddLine(l); } } else { ret.AddLine(l); } } ret.Triggers = TriggerConverter.ConvertTriggers(linetriggers, ret); if (br.BaseStream.Position != br.BaseStream.Length) { var meta = br.ReadInt32(); if (meta == ('M' | 'E' << 8 | 'T' << 16 | 'A' << 24)) { ParseMetadata(ret, br); } else { throw new TrackIO.TrackLoadException("Expected metadata tag but got " + meta.ToString("X8")); } } } return(ret); }
public static Track LoadTrack(string trackfile, string trackname) { var ret = new Track(); ret.Filename = trackfile; ret.Name = trackname; var addedlines = new Dictionary <int, StandardLine>(); var location = trackfile; var bytes = File.ReadAllBytes(location); using (var file = new MemoryStream(bytes)) { var br = new BinaryReader(file); int magic = br.ReadInt32(); if (magic == ('T' | 'R' << 8 | 'K' << 16 | 0xF2 << 24)) { byte version = br.ReadByte(); string[] features = Encoding.ASCII.GetString(br.ReadBytes(br.ReadInt16())).Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); if (version != 1) { throw new TrackIO.TrackLoadException("Unsupported version"); } bool redmultipier = false; bool scenerywidth = false; bool supports61 = false; bool songinfo = false; bool ignorabletrigger = false; for (int i = 0; i < features.Length; i++) { switch (features[i]) { case "REDMULTIPLIER": redmultipier = true; break; case "SCENERYWIDTH": scenerywidth = true; break; case "6.1": supports61 = true; break; case "SONGINFO": songinfo = true; break; case "IGNORABLE_TRIGGER": ignorabletrigger = true; break; case "ZEROSTART": ret.ZeroStart = true; break; default: throw new TrackIO.TrackLoadException("Unsupported feature"); } } if (supports61) { ret.SetVersion(61); } else { ret.SetVersion(62); } if (songinfo) { var song = br.ReadString(); try { var strings = song.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); var fn = Program.UserDirectory + "Songs" + Path.DirectorySeparatorChar + strings[0]; if (File.Exists(fn)) { if (AudioService.LoadFile(ref fn)) { Settings.Local.CurrentSong = new Song(Path.GetFileName(fn), float.Parse(strings[1])); Settings.Local.EnableSong = true; } else { Program.NonFatalError("An unknown error occured trying to load the song file"); } } } catch { // ignored } } ret.StartOffset = new Vector2d(br.ReadDouble(), br.ReadDouble()); var lines = br.ReadInt32(); for (var i = 0; i < lines; i++) { GameLine l; byte ltype = br.ReadByte(); var lt = (LineType)(ltype & 0x1F);//we get 5 bits var inv = (ltype >> 7) != 0; var lim = (ltype >> 5) & 0x3; var ID = -1; var prvID = -1; var nxtID = -1; var multiplier = 1; var linewidth = 1f; LineTrigger tr = ignorabletrigger ? new LineTrigger() : null; if (redmultipier) { if (lt == LineType.Red) { multiplier = br.ReadByte(); } } if (lt == LineType.Blue || lt == LineType.Red) { if (ignorabletrigger) { bool zoomtrigger = br.ReadBoolean(); if (zoomtrigger) { tr.Zoomtrigger = true; var target = br.ReadSingle(); var frames = br.ReadInt16(); tr.ZoomFrames = frames; tr.ZoomTarget = target; } else { tr = null; } } ID = br.ReadInt32(); if (lim != 0) { prvID = br.ReadInt32(); //ignored nxtID = br.ReadInt32(); //ignored } } if (lt == LineType.Scenery) { if (scenerywidth) { float b = br.ReadByte(); linewidth = b / 10f; } } var x1 = br.ReadDouble(); var y1 = br.ReadDouble(); var x2 = br.ReadDouble(); var y2 = br.ReadDouble(); switch (lt) { case LineType.Blue: var bl = new StandardLine(new Vector2d(x1, y1), new Vector2d(x2, y2), inv); bl.ID = ID; bl.Extension = (StandardLine.Ext)lim; l = bl; bl.Trigger = tr; break; case LineType.Red: var rl = new RedLine(new Vector2d(x1, y1), new Vector2d(x2, y2), inv); rl.ID = ID; rl.Extension = (StandardLine.Ext)lim; if (redmultipier) { rl.Multiplier = multiplier; } l = rl; rl.Trigger = tr; break; case LineType.Scenery: l = new SceneryLine(new Vector2d(x1, y1), new Vector2d(x2, y2)) { Width = linewidth }; break; default: throw new TrackIO.TrackLoadException("Invalid line type at ID " + ID); } if (l is StandardLine) { if (!addedlines.ContainsKey(l.ID)) { addedlines[ID] = (StandardLine)l; ret.AddLine(l); } } else { ret.AddLine(l); } } } } return(ret); }
public static Track LoadTrack(sol_track trackdata) { var ret = new Track { Name = trackdata.name, Filename = trackdata.filename }; var buffer = (List <Amf0Object>)trackdata.get_property("data"); List <GameLine> lineslist = new List <GameLine>(buffer.Count); var addedlines = new Dictionary <int, StandardLine>(buffer.Count); var version = trackdata.data.First(x => x.name == "version").data as string; if (version == "6.1") { ret.SetVersion(61); } else { ret.SetVersion(62); } try { var options = (List <Amf0Object>)trackdata.get_property("trackData"); if (options.Count >= 2) { try { ret.ZeroStart = (bool)options.Find(x => x.name == "2").get_property("5"); } catch { //ignored } } } catch { //ignored } for (var i = buffer.Count - 1; i >= 0; --i) { var line = (List <Amf0Object>)buffer[i].data; var type = Convert.ToInt32(line[9].data, CultureInfo.InvariantCulture); switch (type) { case 0: { var l = new StandardLine( new Vector2d(Convert.ToDouble(line[0].data, CultureInfo.InvariantCulture), Convert.ToDouble(line[1].data, CultureInfo.InvariantCulture)), new Vector2d(Convert.ToDouble(line[2].data, CultureInfo.InvariantCulture), Convert.ToDouble(line[3].data, CultureInfo.InvariantCulture)), Convert.ToBoolean(line[5].data, CultureInfo.InvariantCulture)) { ID = Convert.ToInt32(line[8].data, CultureInfo.InvariantCulture) }; l.Extension = (StandardLine.Ext)( Convert.ToInt32( line[4].data, CultureInfo.InvariantCulture)); if (line[6].data != null) { var prev = Convert.ToInt32(line[6].data, CultureInfo.InvariantCulture); } if (line[7].data != null) { var next = Convert.ToInt32(line[7].data, CultureInfo.InvariantCulture); } if (!addedlines.ContainsKey(l.ID)) { lineslist.Add(l); addedlines[l.ID] = l; } } break; case 1: { var l = new RedLine( new Vector2d(Convert.ToDouble(line[0].data, CultureInfo.InvariantCulture), Convert.ToDouble(line[1].data, CultureInfo.InvariantCulture)), new Vector2d(Convert.ToDouble(line[2].data, CultureInfo.InvariantCulture), Convert.ToDouble(line[3].data, CultureInfo.InvariantCulture)), Convert.ToBoolean(line[5].data, CultureInfo.InvariantCulture)) { ID = Convert.ToInt32(line[8].data, CultureInfo.InvariantCulture) }; l.Extension = (StandardLine.Ext)( Convert.ToInt32( line[4].data, CultureInfo.InvariantCulture)); if (line[6].data != null) { var prev = Convert.ToInt32(line[6].data, CultureInfo.InvariantCulture); } if (line[7].data != null) { var next = Convert.ToInt32(line[7].data, CultureInfo.InvariantCulture); } if (!addedlines.ContainsKey(l.ID)) { lineslist.Add(l); addedlines[l.ID] = l; } } break; case 2: lineslist.Add( new SceneryLine( new Vector2d(Convert.ToDouble(line[0].data, CultureInfo.InvariantCulture), Convert.ToDouble(line[1].data, CultureInfo.InvariantCulture)), new Vector2d(Convert.ToDouble(line[2].data, CultureInfo.InvariantCulture), Convert.ToDouble(line[3].data, CultureInfo.InvariantCulture)))); break; default: throw new TrackIO.TrackLoadException("Unknown line type"); } } var startlineprop = trackdata.get_property("startLine"); var startline = startlineprop as List <Amf0Object>; if (startline == null && startlineprop is double) { var conv = Convert.ToInt32(startlineprop, CultureInfo.InvariantCulture); if (conv >= ret.Lines.Count || conv < 0) { startline = new List <Amf0Object>(); startline.Add(new Amf0Object { data = 100 }); startline.Add(new Amf0Object { data = 100 }); } } else if (startlineprop is double) { var conv = Convert.ToInt32(startlineprop, CultureInfo.InvariantCulture); startline = new List <Amf0Object>(); startline.Add(new Amf0Object { data = lineslist[conv].Position.X }); startline.Add(new Amf0Object { data = lineslist[conv].Position.Y - 50 * 0.5 }); } ret.StartOffset = new Vector2d( Convert.ToDouble(startline[0].data, CultureInfo.InvariantCulture), Convert.ToDouble(startline[1].data, CultureInfo.InvariantCulture)); foreach (var line in lineslist) { ret.AddLine(line); } return(ret); }