diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModTransform.cs b/osu.Game.Rulesets.Osu/Mods/OsuModTransform.cs new file mode 100644 index 000000000000..30837d7db969 --- /dev/null +++ b/osu.Game.Rulesets.Osu/Mods/OsuModTransform.cs @@ -0,0 +1,51 @@ +// Copyright (c) 2007-2018 ppy Pty Ltd . +// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE + +using System; +using System.Collections.Generic; +using osu.Framework.Graphics; +using osu.Game.Graphics; +using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Objects.Drawables; +using osu.Game.Rulesets.Osu.Objects; +using OpenTK; + +namespace osu.Game.Rulesets.Osu.Mods +{ + internal class OsuModTransform : Mod, IApplicableToDrawableHitObjects + { + public override string Name => "Transform"; + public override string ShortenedName => "TR"; + public override FontAwesome Icon => FontAwesome.fa_arrows; + public override ModType Type => ModType.Fun; + public override string Description => "Everything rotates. EVERYTHING."; + public override double ScoreMultiplier => 1; + private float theta; + + public void ApplyToDrawableHitObjects(IEnumerable drawables) + { + foreach (var drawable in drawables) + { + var hitObject = (OsuHitObject) drawable.HitObject; + + float appearDistance = (float)(hitObject.TimePreempt - hitObject.TimeFadeIn) / 2; + + Vector2 originalPosition = drawable.Position; + Vector2 appearOffset = new Vector2((float)Math.Cos(theta), (float)Math.Sin(theta)) * appearDistance; + + //the - 1 and + 1 prevents the hit objects to appear in the wrong position. + double appearTime = hitObject.StartTime - hitObject.TimePreempt - 1; + double moveDuration = hitObject.TimePreempt + 1; + + using (drawable.BeginAbsoluteSequence(appearTime, true)) + { + drawable + .MoveToOffset(appearOffset) + .MoveTo(originalPosition, moveDuration, Easing.InOutSine); + } + + theta += (float) hitObject.TimeFadeIn / 1000; + } + } + } +} diff --git a/osu.Game.Rulesets.Osu/OsuRuleset.cs b/osu.Game.Rulesets.Osu/OsuRuleset.cs index a16f6494e7f1..6736d10dab0c 100644 --- a/osu.Game.Rulesets.Osu/OsuRuleset.cs +++ b/osu.Game.Rulesets.Osu/OsuRuleset.cs @@ -118,8 +118,8 @@ public override IEnumerable GetModsFor(ModType type) new OsuModAutopilot(), }; case ModType.Fun: - return new Mod[] - { + return new Mod[] { + new OsuModTransform(), new OsuModWiggle(), }; default: