Пример #1
0
        private void Multiline(int count)
        {
            SimulationCell redlines = GetMultiLines(false);

            using (var trk = game.Track.CreateTrackWriter())
            {
                var owner = (StandardLine)_ownerline;
                LineChanging();
                // owner line doesn't count, but our min bounds is 1
                var diff = (count - 1) - redlines.Count;
                if (diff < 0)
                {
                    for (int i = 0; i > diff; i--)
                    {
                        trk.RemoveLine(redlines.First());
                        redlines.RemoveLine(redlines.First().ID);
                    }
                }
                else if (diff > 0)
                {
                    for (int i = 0; i < diff; i++)
                    {
                        var red = new RedLine(owner.Position, owner.Position2, owner.inv)
                        {
                            Multiplier = ((RedLine)owner).Multiplier
                        };
                        red.CalculateConstants();
                        trk.AddLine(red);
                        redlines.AddLine(red);
                    }
                }
            }
            game.Track.NotifyTrackChanged();
        }
Пример #2
0
        public static GenericVertex[] GetAccelDecor(RedLine line)
        {
            var linecolor  = Constants.RedLineColor;
            var multiplier = ((RedLine)line).Multiplier;

            GenericVertex[] ret    = new GenericVertex[3 * multiplier];
            var             angle  = Angle.FromLine(line.End, line.Start);
            var             angle2 = Angle.FromRadians(angle.Radians - 1.5708f);
            var             start  = line.Position2;

            for (int idx = 0; idx < multiplier; idx++)
            {
                var a = start;
                var b = angle.MovePoint(start, line.inv ? -8 : 8);
                var c = angle2.MovePoint(b, 8);
                ret[idx * 3 + 0] = new GenericVertex((Vector2)a, linecolor);
                ret[idx * 3 + 1] = new GenericVertex((Vector2)b, linecolor);
                ret[idx * 3 + 2] = new GenericVertex((Vector2)c, linecolor);
                if (idx + 1 < multiplier)
                {
                    start = angle.MovePoint(start, line.inv ? -2 : 2);
                }
            }
            return(ret);
        }
Пример #3
0
        public void RemoveLine(RedLine line)
        {
            var accel = _lookup[line.ID];

            for (int ix = 0; ix < accel.shapes; ix++)
            {
                int offset = accel.start + (ix * ShapeSize);
                if (IsNulled(offset))
                {
                    continue;
                }
                _freeverts.Enqueue(_indices.unsafe_array[offset]);
                for (int i = 0; i < ShapeSize; i++)
                {
                    var index = accel.start + (ix * ShapeSize) + i;
                    _indices.unsafe_array[index] = nullindex;
                }
            }
            _accelibo.Bind();
            _accelibo.SetData(
                _indices.unsafe_array,
                accel.start,
                accel.start,
                accel.shapes * ShapeSize);
            _accelibo.Unbind();
        }
Пример #4
0
        private void ChangeMultiplier(int mul)
        {
            var lines = GetMultiLines(false);

            using (var trk = _editor.CreateTrackWriter())
            {
                RedLine      redCpy       = null;
                StandardLine blueCpy      = null;
                LineType     origLineType = _ownerline.Type;

                // If adding acceleration to a blue line
                if (origLineType == LineType.Blue && mul != 0)
                {
                    redCpy = RedLine.CloneFromBlue((StandardLine)_ownerline);
                    _editor._renderer.RedrawLine(_ownerline);
                    _editor._renderer.AddLine(redCpy);
                }
                // If setting acceleration to 0 of a red line
                else if (origLineType == LineType.Red && mul == 0)
                {
                    _editor._renderer.RemoveLine(_ownerline);
                    blueCpy = StandardLine.CloneFromRed((RedLine)_ownerline);
                    _editor._renderer.AddLine(blueCpy);
                }
                else
                {
                    redCpy = (RedLine)_ownerline.Clone();
                }

                if (redCpy != null)
                {
                    redCpy.Multiplier = mul;
                }
                StandardLine cpy = redCpy != null ? redCpy : blueCpy;
                UpdateOwnerLine(trk, cpy);
                foreach (var line in lines)
                {
                    StandardLine copy;
                    // Going from red lines to blue
                    if (origLineType == LineType.Red && _ownerline.Type == LineType.Blue)
                    {
                        copy = StandardLine.CloneFromRed(line);
                    }
                    // Going from blue lines to red
                    else if (origLineType == LineType.Blue && _ownerline.Type == LineType.Red)
                    {
                        copy = RedLine.CloneFromBlue(line);
                    }
                    else
                    {
                        copy = (StandardLine)line.Clone();
                    }
                    if (copy is RedLine redCopy)
                    {
                        redCopy.Multiplier = mul;
                    }
                    UpdateLine(trk, line, copy);
                }
            }
        }
Пример #5
0
        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");
            }
        }
Пример #6
0
 public void test()
 {
     Generate.Click();
     RedLine.Click();
     Thread.Sleep(800);
     Assert.IsTrue(Completed.Text.Contains("Good job"), "Not Completed");
     ClosePopUp.Click();
 }
Пример #7
0
        public static GenericVertex[] GetAccelDecor(RedLine line)
        {
            var linecolor  = Constants.RedLineColor;
            var multiplier = ((RedLine)line).Multiplier;
            var shapecount = Math.Min(multiplier, 3);

            if (multiplier > 3)
            {
                shapecount += 4;
            }
            GenericVertex[] ret    = new GenericVertex[3 * shapecount];
            var             angle  = Angle.FromLine(line.End, line.Start);
            var             angle2 = Angle.FromRadians(angle.Radians - 1.5708f);
            var             start  = line.Position2;

            for (int idx = 0; idx < Math.Min(multiplier, 3); idx++)
            {
                var a = start;
                var b = angle.MovePoint(start, line.inv ? -8 : 8);
                var c = angle2.MovePoint(b, 8);
                ret[idx * 3 + 0] = new GenericVertex((Vector2)a, linecolor);
                ret[idx * 3 + 1] = new GenericVertex((Vector2)b, linecolor);
                ret[idx * 3 + 2] = new GenericVertex((Vector2)c, linecolor);
                if (idx + 1 < multiplier)
                {
                    start = angle.MovePoint(start, line.inv ? -2 : 2);
                }
            }

            if (multiplier > 3)
            {
                // Draw White plus
                var a = angle.MovePoint(start, line.inv ? -2 : 2);
                var b = angle2.MovePoint(a, 2);
                var c = angle2.MovePoint(b, 3);

                Vector2[] tall = Utility.GetThickLine(
                    (Vector2)b, (Vector2)c, Angle.FromVector(c - b), 0.5f);
                Vector2[] tess = Utility.TesselateThickLine(tall);
                for (int i = 0; i < tess.Length; i++)
                {
                    ret[3 * 3 + i] = new GenericVertex(tess[i], Color.White);
                }

                a = angle2.MovePoint(b, 1.5);
                b = angle.MovePoint(a, -1.5);
                c = angle.MovePoint(a, 1.5);

                tall = Utility.GetThickLine(
                    (Vector2)b, (Vector2)c, Angle.FromVector(c - b), 0.5f);
                tess = Utility.TesselateThickLine(tall);
                for (int i = 0; i < tess.Length; i++)
                {
                    ret[5 * 3 + i] = new GenericVertex(tess[i], Color.White);
                }
            }
            return(ret);
        }
Пример #8
0
 public void EnterClearly()
 {
     Anim.Play("Creator_ShowWorkspace");
     LeftCreatingPanel.SetActive(true);
     LeftMainPanel.SetActive(false);
     RightPanel.SetActive(true);
     RedLine.SetActive(true);
     Table.CleanBeforeInit();
     Table.Initialize();
 }
Пример #9
0
        public void BackToLobby()
        {
            Anim.Play("Creator_HideWorkspace");
            LeftCreatingPanel.SetActive(false);
            LeftMainPanel.SetActive(true);
            RightPanel.SetActive(false);
            RedLine.SetActive(false);

            Table.IsActive       = false;
            LoadBtn.interactable = false;
            LoadList();
        }
Пример #10
0
        protected GameLine CreateLine(
            TrackWriter trk,
            Vector2d start,
            Vector2d end,
            bool inv,
            bool snapstart,
            bool snapend)
        {
            GameLine added = null;

            switch (Swatch.Selected)
            {
            case LineType.Blue:
                added = new StandardLine(start, end, inv);
                break;

            case LineType.Red:
                var red = new RedLine(start, end, inv)
                {
                    Multiplier = Swatch.RedMultiplier
                };
                red.CalculateConstants();    //multiplier needs to be recalculated
                added = red;
                break;

            case LineType.Scenery:
                added = new SceneryLine(start, end)
                {
                    Width = Swatch.GreenMultiplier
                };
                break;

            default:     //In case no swatch is chosen select blue and make a blue line
                added           = new StandardLine(start, end, inv);
                Swatch.Selected = LineType.Blue;
                break;
            }
            trk.AddLine(added);
            if (Swatch.Selected != LineType.Scenery)
            {
                if (snapstart)
                {
                    SnapLineEnd(trk, added, added.Position);
                }
                if (snapend)
                {
                    SnapLineEnd(trk, added, added.Position2);
                }
            }
            game.Track.Invalidate();
            return(added);
        }
Пример #11
0
 public void AddLine(RedLine line)
 {
     if (_lookup.ContainsKey(line.ID))
     {
         LineChanged(line, false);
         return;
     }
     _lookup.Add(
         line.ID,
         new accelentry()
     {
         start  = _indices.Count,
         shapes = 0
     });
     DrawAccel(line, false);
 }
Пример #12
0
        protected GameLine CreateLine(
            TrackWriter trk,
            Vector2d start,
            Vector2d end,
            bool inv,
            bool snapstart,
            bool snapend)
        {
            GameLine added = null;

            switch (game.Canvas.ColorControls.Selected)
            {
            case LineType.Blue:
                added = new StandardLine(start, end, inv);
                break;

            case LineType.Red:
                var red = new RedLine(start, end, inv)
                {
                    Multiplier = game.Canvas.ColorControls.RedMultiplier
                };
                red.CalculateConstants();    //multiplier needs to be recalculated
                added = red;
                break;

            case LineType.Scenery:
                added = new SceneryLine(start, end)
                {
                    Width = game.Canvas.ColorControls.GreenMultiplier
                };
                break;
            }
            trk.AddLine(added);
            if (game.Canvas.ColorControls.Selected != LineType.Scenery)
            {
                if (snapstart)
                {
                    SnapLineEnd(trk, added, added.Position);
                }
                if (snapend)
                {
                    SnapLineEnd(trk, added, added.Position2);
                }
            }
            game.Track.Invalidate();
            return(added);
        }
Пример #13
0
        private void Multiline(int count)
        {
            SimulationCell multilines = GetMultiLines(false);

            using (var trk = _editor.CreateTrackWriter())
            {
                var owner = (StandardLine)_ownerline;
                MakingChange();
                // owner line doesn't count, but our min bounds is 1
                var diff = (count - 1) - multilines.Count;
                if (diff < 0)
                {
                    for (int i = 0; i > diff; i--)
                    {
                        trk.RemoveLine(multilines.First());
                        multilines.RemoveLine(multilines.First().ID);
                    }
                }
                else if (diff > 0)
                {
                    if (_ownerline is RedLine redline)
                    {
                        for (int i = 0; i < diff; i++)
                        {
                            var red = new RedLine(owner.Position, owner.Position2, owner.inv)
                            {
                                Multiplier = ((RedLine)owner).Multiplier
                            };
                            red.CalculateConstants();
                            trk.AddLine(red);
                        }
                    }
                    else if (_ownerline is StandardLine blueline)
                    {
                        for (int i = 0; i < diff; i++)
                        {
                            var blue = new StandardLine(owner.Position, owner.Position2, owner.inv);
                            blue.CalculateConstants();
                            trk.AddLine(blue);
                        }
                    }
                }
            }
            _editor.NotifyTrackChanged();
        }
Пример #14
0
        public void EnterWithFile()
        {
            string fileName = FileButtons[CurrentListIndex].gameObject.GetComponentInChildren <Text>().text;

            if (Table.ReadFromTWx(CurrentFilePath, fileName.Substring(0, fileName.Length - 4)))
            {
                Anim.Play("Creator_ShowWorkspace");
                LeftCreatingPanel.SetActive(true);
                LeftMainPanel.SetActive(false);
                RightPanel.SetActive(true);
                RedLine.SetActive(true);
                Table.Initialize();
            }
            else
            {
                MessageBox.Show(LocaleManager.instance.GetLocaleText("error_occured"), LocaleManager.instance.GetLocaleText("creator_cannotload"), MessageBoxButton.OK);
            }
        }
Пример #15
0
        public override void Render()
        {
            base.Render();
            if (Active)
            {
                var   diff = _end - _start;
                var   x    = diff.X;
                var   y    = diff.Y;
                Color c    = Color.FromArgb(200, 150, 150, 150);
                if (Math.Abs(x) + Math.Abs(y) < MINIMUM_LINE)
                {
                    c = Color.Red;
                    var sz = 2f;
                    if (Swatch.Selected == LineType.Scenery)
                    {
                        sz *= Swatch.GreenMultiplier;
                    }
                    GameRenderer.RenderRoundedLine(_start, _end, c, sz);
                }
                else
                {
                    switch (Swatch.Selected)
                    {
                    case LineType.Blue:
                        StandardLine sl = new StandardLine(_start, _end, _addflip);
                        sl.CalculateConstants();
                        GameRenderer.DrawTrackLine(sl, c, Settings.Editor.RenderGravityWells, true);
                        break;

                    case LineType.Red:
                        RedLine rl = new RedLine(_start, _end, _addflip);
                        rl.Multiplier = Swatch.RedMultiplier;
                        rl.CalculateConstants();
                        GameRenderer.DrawTrackLine(rl, c, Settings.Editor.RenderGravityWells, true);
                        break;

                    case LineType.Scenery:
                        GameRenderer.RenderRoundedLine(_start, _end, c, 2 * Swatch.GreenMultiplier);
                        break;
                    }
                }
            }
        }
Пример #16
0
        protected GameLine CreateLine( //Creates a line from a pair of vectors (modified from Tool.cs)
            TrackWriter trk,
            Vector2d start,
            Vector2d end,
            LineType type,
            bool inv,
            int multiplier = 1,    //Only applies to red lines (smh)
            float width    = 1.0f) //Width only applicable to green lines
        {
            GameLine added = null;

            switch (type)
            {
            case LineType.Blue:
                added = new StandardLine(start, end, inv);
                break;

            case LineType.Red:
                var red = new RedLine(start, end, inv)
                {
                    Multiplier = multiplier
                };
                red.CalculateConstants();    //multiplier needs to be recalculated
                added = red;
                break;

            case LineType.Scenery:
                added = new SceneryLine(start, end)
                {
                    Width = width
                };
                break;
            }
            trk.AddLine(added);
            game.Track.Invalidate();
            return(added);
        }
Пример #17
0
        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);
        }
Пример #18
0
        /// <summary>
        /// Redraws the red line accel indicator.
        /// </summary>
        private void DrawAccel(RedLine line, bool hide)
        {
            var entry    = _lookup[line.ID];
            var newdecor = hide ? new GenericVertex[ShapeSize * line.Multiplier] : GetAccelDecor(line);
            int shapes   = newdecor.Length / ShapeSize;

            for (int ix = 0; ix < entry.shapes; ix++)
            {
                int offset = entry.start + (ix * ShapeSize);
                if (IsNulled(offset))
                {
                    continue;//nulled out
                }
                _freeverts.Enqueue(_indices.unsafe_array[offset]);
                for (int i = 0; i < ShapeSize; i++)
                {
                    _indices.unsafe_array[offset + i] = nullindex;
                }
            }
            bool growing = shapes > entry.shapes;

            _accelbuffer.Bind();
            for (int ix = 0; ix < shapes; ix++)
            {
                var vertexbase = GetVertexBase();
                _accelbuffer.SetData(
                    newdecor,
                    ShapeSize * ix,
                    vertexbase,
                    ShapeSize);
                for (int i = 0; i < ShapeSize; i++)
                {
                    if (growing)
                    {
                        _indices.Add(vertexbase + i);
                    }
                    else
                    {
                        int offset = entry.start + (ix * ShapeSize) + i;
                        _indices.unsafe_array[offset] = vertexbase + i;
                    }
                }
            }
            _accelbuffer.Unbind();

            _accelibo.Bind();
            _accelibo.SetData(
                _indices.unsafe_array,
                entry.start,
                entry.start,
                entry.shapes * ShapeSize);
            if (growing)
            {
                int startindex = _indices.Count - (shapes * ShapeSize);
                EnsureIBOSize(_indices.Count);
                _accelibo.SetData(
                    _indices.unsafe_array,
                    startindex,
                    startindex,
                    shapes * ShapeSize);
                _lookup[line.ID] = new accelentry()
                {
                    shapes = shapes,
                    start  = startindex
                };
            }
            _accelibo.Unbind();
        }
Пример #19
0
 public void LineChanged(RedLine line, bool hit)
 {
     DrawAccel(line, hit);
 }
        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);
        }
Пример #21
0
        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);
        }
Пример #22
0
        private static void MoveFrameRelative(List <LineSelection> selectedLines, int direction, bool isCompleteAction)
        {
            RiderFrame flag         = window.Track.GetFlag();
            int        currentFrame = window.Track.Offset;

            if (flag == null || currentFrame <= flag.FrameID)
            {
                // Behavior only defined if flag is set and current frame is ahead of it
                return;
            }

            Rider flagFrameRider     = flag.State;
            Rider flagNextFrameRider = window.Track.Timeline.ExtractFrame(flag.FrameID + 1).State;

            // Where the Rider was at the flag frame, and the frame after that
            // This establishes the initial frame of reference
            //
            // flagNextFrameRider is considered to be the frame with 0 relative velocity to the reference frame
            // All frames after will look as if the rider has started falling within the reference frame, because gravity.
            //
            // This is all if the user-configured relative speeds are (0, 0). If the user changes these speeds,
            // the lines will be drawn accordingly.
            Vector2d flagFramePos     = Game.Rider.GetBounds(flagFrameRider).Vector;
            Vector2d flagNextFramePos = Game.Rider.GetBounds(flagNextFrameRider).Vector;

            // The difference between where the rider was on frames 0 and 1 establishes a reference speed to apply
            Vector2d firstFrameDiff = Vector2d.Subtract(flagNextFramePos, flagFramePos);

            // Add the user-configurable speed offsets
            firstFrameDiff = Vector2d.Add(firstFrameDiff, new Vector2d(Settings.animationRelativeVelX, Settings.animationRelativeVelY));

            int framesElapsed = currentFrame - flag.FrameID;

            // Apply the speed vector to the number of elapsed frames, and add it to the initial reference frame
            // to get an expected position for the current frame
            Vector2d currentFrameExpectedPos = Vector2d.Add(Vector2d.Multiply(firstFrameDiff, framesElapsed), flagFramePos);
            // Same for the next frame
            Vector2d nextFrameExpectedPos = Vector2d.Add(Vector2d.Multiply(firstFrameDiff, framesElapsed + direction), flagFramePos);

            if (isCompleteAction)
            {
                window.Invalidate();
                window.Track.UndoManager.BeginAction();
            }
            TrackWriter     trackWriter = window.Track.CreateTrackWriter();
            List <GameLine> newLines    = new List <GameLine>();

            foreach (LineSelection selection in selectedLines)
            {
                GameLine selectedLine = selection.line;
                Vector2d p1           = selectedLine.Position;
                Vector2d p2           = selectedLine.Position2;

                Vector2d diff1 = Vector2d.Subtract(p1, currentFrameExpectedPos);
                Vector2d diff2 = Vector2d.Subtract(p2, currentFrameExpectedPos);

                Vector2d nextP1 = Vector2d.Add(nextFrameExpectedPos, diff1);
                Vector2d nextP2 = Vector2d.Add(nextFrameExpectedPos, diff2);

                // Add a new line in the same position, then move the existing line to maintain the selection
                GameLine newLine;
                if (!Settings.forwardLinesAsScenery && (direction > 0 || !Settings.recededLinesAsScenery))
                {
                    switch (selection.line.Type)
                    {
                    case LineType.Red:
                        newLine = new RedLine(nextP1, nextP2, ((RedLine)selectedLine).inv);
                        break;

                    case LineType.Blue:
                        newLine = new StandardLine(nextP1, nextP2, ((StandardLine)selectedLine).inv);
                        break;

                    case LineType.Scenery:
                        newLine = new SceneryLine(nextP1, nextP2);
                        break;

                    default:
                        newLine = new SceneryLine(nextP1, nextP2);
                        break;
                    }
                }
                else
                {
                    newLine = new SceneryLine(nextP1, nextP2);
                }
                newLines.Add(newLine);
            }

            var selectTool = CurrentTools.SelectTool;

            foreach (GameLine newLine in newLines)
            {
                trackWriter.AddLine(newLine);
            }
            selectTool.SelectLines(newLines);



            if (isCompleteAction)
            {
                window.Track.UndoManager.EndAction();
                window.Track.NotifyTrackChanged();
            }
        }