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; } }
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; } }