private static void ReadLinesArray(Track track, object[][] parser)
 {
     //['type', 'id', 'x1', 'y1', 'x2', 'y2', 'extended', 'flipped', 'leftLine', 'rightLine', 'multiplier']
     //ignore leftLine, rightLine
     foreach (var lineobj in parser)
     {
         line_json line = new line_json();
         int       idx  = 0;
         line.type = Convert.ToInt32(lineobj[idx++]);
         line.id   = Convert.ToInt32(lineobj[idx++]);
         line.x1   = Convert.ToDouble(lineobj[idx++]);
         line.y1   = Convert.ToDouble(lineobj[idx++]);
         line.x2   = Convert.ToDouble(lineobj[idx++]);
         line.y2   = Convert.ToDouble(lineobj[idx++]);
         var sz = lineobj.Length;
         if (line.type != 2 && idx < sz)//non scenery
         {
             line.extended = Convert.ToInt32(lineobj[idx++]);
             if (idx < sz)
             {
                 line.flipped = Convert.ToBoolean(lineobj[idx++]);
                 idx         += 2;//skip leftline, rightline
                 if (line.type == 1 && idx < sz)
                 {
                     line.multiplier = Convert.ToInt32(lineobj[idx++]);
                 }
             }
         }
         AddLine(track, line);
     }
 }
        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");
            }
        }
Example #3
0
        private static object[] line_to_linearrayline(line_json line)
        {
            //['type', 'id', 'x1', 'y1', 'x2', 'y2', 'extended', 'flipped', 'leftLine', 'rightLine', 'multiplier']
            List <object> ret = new List <object>(11)
            {
                line.type, line.id, line.x1, line.y1, line.x2, line.y2
            };

            if (line.type != 2)
            {
                ret.Add(line.extended);
                ret.Add(line.flipped);
                if (line.multiplier > 1)
                {
                    ret.Add(-1);
                    ret.Add(-1);
                    ret.Add(line.multiplier);
                }
            }
            return(ret.ToArray());
        }
Example #4
0
        public static string SaveTrack(Track trk, string savename)
        {
            var        sw       = Stopwatch.StartNew();
            track_json trackobj = new track_json();

            trackobj.label         = trk.Name;
            trackobj.startPosition = new track_json.point_json()
            {
                x = trk.StartOffset.X,
                y = trk.StartOffset.Y
            };
            trackobj.startZoom = trk.StartZoom;
            trackobj.zeroStart = trk.ZeroStart;
            int ver = trk.GetVersion();

            switch (ver)
            {
            case 61:
                trackobj.version = "6.1";
                break;

            case 62:
                trackobj.version = "6.2";
                break;
            }
            var sort = trk.GetSortedLines();

            trackobj.linesArray = new object[sort.Length][];
            trackobj.triggers   = new List <track_json.zoomtrigger_json>();
            int idx = 0;

            foreach (var line in sort)
            {
                line_json jline = new line_json();
                switch (line.Type)
                {
                case LineType.Blue:
                    jline.type = 0;
                    break;

                case LineType.Red:
                    jline.type = 1;
                    break;

                case LineType.Scenery:
                    jline.type = 2;
                    break;
                }
                jline.id = line.ID;
                jline.x1 = line.Position.X;
                jline.y1 = line.Position.Y;
                jline.x2 = line.Position2.X;
                jline.y2 = line.Position2.Y;
                if (line is StandardLine stl)
                {
                    if (stl.Extension.HasFlag(StandardLine.Ext.Left))
                    {
                        jline.leftExtended = true;
                    }
                    if (stl.Extension.HasFlag(StandardLine.Ext.Right))
                    {
                        jline.rightExtended = true;
                    }
                    jline.extended = (int)stl.Extension;
                    jline.flipped  = stl.inv;
                    if (line is RedLine red)
                    {
                        jline.multiplier = red.Multiplier;
                    }
                    if (stl.Trigger != null && stl.Trigger.ZoomTrigger)
                    {
                        trackobj.triggers.Add(new track_json.zoomtrigger_json()
                        {
                            zoom   = true,
                            ID     = jline.id,
                            target = stl.Trigger.ZoomTarget,
                            frames = stl.Trigger.ZoomFrames
                        });
                    }
                }
                trackobj.linesArray[idx++] = line_to_linearrayline(jline);
            }
            var dir = TrackIO.GetTrackDirectory(trk);

            if (!Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }
            var filename = dir + savename + ".track.json";

            using (var file = File.Create(filename))
            {
                var bytes = JsonSerializer.Serialize <track_json>(trackobj);
                file.Write(bytes, 0, bytes.Length);
            }
            return(filename);
        }
Example #5
0
        public static string SaveTrack(Track trk, string savename)
        {
            var        sw       = Stopwatch.StartNew();
            track_json trackobj = new track_json();

            trackobj.label         = trk.Name;
            trackobj.startPosition = new track_json.point_json()
            {
                x = trk.StartOffset.X,
                y = trk.StartOffset.Y
            };
            trackobj.startZoom       = trk.StartZoom;
            trackobj.zeroStart       = trk.ZeroStart;
            trackobj.yGravity        = trk.YGravity;
            trackobj.xGravity        = trk.XGravity;
            trackobj.gravityWellSize = trk.GravityWellSize;
            trackobj.bgR             = trk.BGColorR;
            trackobj.bgG             = trk.BGColorG;
            trackobj.bgB             = trk.BGColorB;
            trackobj.lineR           = trk.LineColorR;
            trackobj.lineG           = trk.LineColorG;
            trackobj.lineB           = trk.LineColorB;

            int ver = trk.GetVersion();

            switch (ver)
            {
            case 61:
                trackobj.version = "6.1";
                break;

            case 62:
                trackobj.version = "6.2";
                break;
            }
            var sort = trk.GetSortedLines();

            trackobj.linesArray   = new object[sort.Length][];
            trackobj.gameTriggers = new List <track_json.gametrigger_json>();
            int idx = 0;

            foreach (var line in sort)
            {
                line_json jline = new line_json();
                switch (line.Type)
                {
                case LineType.Blue:
                    jline.type = 0;
                    break;

                case LineType.Red:
                    jline.type = 1;
                    break;

                case LineType.Scenery:
                    jline.type = 2;
                    break;
                }
                jline.id = line.ID;
                jline.x1 = line.Position.X;
                jline.y1 = line.Position.Y;
                jline.x2 = line.Position2.X;
                jline.y2 = line.Position2.Y;
                if (line is StandardLine stl)
                {
                    if (stl.Extension.HasFlag(StandardLine.Ext.Left))
                    {
                        jline.leftExtended = true;
                    }
                    if (stl.Extension.HasFlag(StandardLine.Ext.Right))
                    {
                        jline.rightExtended = true;
                    }
                    jline.extended = (int)stl.Extension;
                    jline.flipped  = stl.inv;
                    if (line is RedLine red)
                    {
                        jline.multiplier = red.Multiplier;
                    }
                }
                trackobj.linesArray[idx++] = line_to_linearrayline(jline);
            }
            foreach (var trigger in trk.Triggers)
            {
                switch (trigger.TriggerType)
                {
                case TriggerType.Zoom:
                    trackobj.gameTriggers.Add(new track_json.gametrigger_json()
                    {
                        triggerType = (int)trigger.TriggerType,
                        zoomTarget  = trigger.ZoomTarget,
                        start       = trigger.Start,
                        end         = trigger.End
                    });
                    break;

                case TriggerType.BGChange:
                    trackobj.gameTriggers.Add(new track_json.gametrigger_json()
                    {
                        triggerType     = (int)trigger.TriggerType,
                        backgroundred   = trigger.backgroundRed,
                        backgroundgreen = trigger.backgroundGreen,
                        backgroundblue  = trigger.backgroundBlue,
                        start           = trigger.Start,
                        end             = trigger.End
                    });
                    break;

                case TriggerType.LineColor:
                    trackobj.gameTriggers.Add(new track_json.gametrigger_json()
                    {
                        triggerType = (int)trigger.TriggerType,
                        lineRed     = trigger.lineRed,
                        lineGreen   = trigger.lineGreen,
                        lineBlue    = trigger.lineBlue,
                        start       = trigger.Start,
                        end         = trigger.End
                    });
                    break;
                }
            }
            var dir = TrackIO.GetTrackDirectory(trk);

            if (trk.Name.Equals("<untitled>"))
            {
                dir = Utils.Constants.TracksDirectory + "Unnamed Track" + Path.DirectorySeparatorChar;
            }
            if (!Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }
            var filename = dir + savename + ".track.json";

            using (var file = File.Create(filename))
            {
                var bytes = JsonSerializer.Serialize <track_json>(trackobj);
                file.Write(bytes, 0, bytes.Length);
            }
            return(filename);
        }