public HitokoriDifficultyHitObject(HitObject hitObject, HitObject lastObject, double bpm, double clockRate) : base(hitObject, lastObject, clockRate)
        {
            HitokoriTileObject hitokoriObject     = (HitokoriTileObject)hitObject;
            HitokoriTileObject lastHitokoriObject = (HitokoriTileObject)lastObject;

            BPM = bpm;
            ChangedDirection = hitokoriObject.FirstPoint.ChangedDirection;
            HitAngle         = lastHitokoriObject.LastPoint.AngleOffset;
            if (hitokoriObject is HoldTile)
            {
                HoldAngle = ((HoldTile)hitokoriObject).FirstPoint.AngleOffset;
            }
        }
Exemplo n.º 2
0
        void ConnectHitObjects(IEnumerable <HitokoriTileObject> hitObjects)
        {
            TilePoint PopulatePoint(TilePoint point)
            {
                point.BPMS            = BPMSAt(point.HitTime);
                point.SpeedModifier   = Speed;
                point.TimeHitWindows  = Windows;
                point.AngleHitWindows = AngleWindows;

                return(point);
            }

            HitokoriTileObject previous  = hitObjects.First();
            TilePoint          lastPoint = previous.LastPoint;

            foreach (var next in hitObjects.Skip(1))
            {
                next.Previous = previous;
                previous.Next = next;
                switch (next)
                {
                case TapTile tile:
                    TilePoint point = lastPoint.Then(PopulatePoint(tile.PressPoint));
                    point.Parent = lastPoint;

                    lastPoint = point;
                    break;

                case HoldTile hold:
                    TilePoint startPoint = lastPoint.Then(PopulatePoint(hold.StartPoint));
                    startPoint.Parent = lastPoint;

                    TilePoint endPoint = PopulatePoint(hold.EndPoint);
                    endPoint.Parent = lastPoint;

                    lastPoint = endPoint;
                    break;

                case SpinTile spin:
                    lastPoint.Then(spin.TilePoints.First());

                    var  middle    = spin.TilePoints[spin.TilePoints.Count / 2];
                    bool clockwise = spin.LastPoint.IsClockwise;

                    foreach (var i in spin.TilePoints)
                    {
                        PopulatePoint(i);
                        i.IsClockwise = clockwise;
                        i.Parent      = lastPoint;

                        if (i == middle)
                        {
                            clockwise = !clockwise;
                            lastPoint = middle;                                     // swap orbitals in the middle
                        }
                    }
                    lastPoint = spin.LastPoint;
                    break;
                }
                previous = next;
            }
        }