diff --git a/osu.Game.Rulesets.Catch/CatchRuleset.cs b/osu.Game.Rulesets.Catch/CatchRuleset.cs index a69070e93e..62892a1bdf 100644 --- a/osu.Game.Rulesets.Catch/CatchRuleset.cs +++ b/osu.Game.Rulesets.Catch/CatchRuleset.cs @@ -99,6 +99,11 @@ public override IEnumerable GetModsFor(ModType type) new MultiMod(new CatchModAutoplay(), new ModCinema()), new CatchModRelax(), }; + case ModType.Fun: + return new Mod[] + { + new MultiMod(new CatchModWindUp(), new CatchModWindDown()) + }; default: return new Mod[] { }; } diff --git a/osu.Game.Rulesets.Catch/Mods/CatchModWindDown.cs b/osu.Game.Rulesets.Catch/Mods/CatchModWindDown.cs new file mode 100644 index 0000000000..b442358bc3 --- /dev/null +++ b/osu.Game.Rulesets.Catch/Mods/CatchModWindDown.cs @@ -0,0 +1,11 @@ +using System; +using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Catch.Objects; + +namespace osu.Game.Rulesets.Catch.Mods +{ + public class CatchModWindDown : ModWindDown + { + + } +} \ No newline at end of file diff --git a/osu.Game.Rulesets.Catch/Mods/CatchModWindUp.cs b/osu.Game.Rulesets.Catch/Mods/CatchModWindUp.cs new file mode 100644 index 0000000000..351ca56175 --- /dev/null +++ b/osu.Game.Rulesets.Catch/Mods/CatchModWindUp.cs @@ -0,0 +1,11 @@ +using System; +using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Catch.Objects; + +namespace osu.Game.Rulesets.Catch.Mods +{ + public class CatchModWindUp : ModWindUp + { + + } +} \ No newline at end of file diff --git a/osu.Game.Rulesets.Mania/ManiaRuleset.cs b/osu.Game.Rulesets.Mania/ManiaRuleset.cs index 57728dd134..24228dc57e 100644 --- a/osu.Game.Rulesets.Mania/ManiaRuleset.cs +++ b/osu.Game.Rulesets.Mania/ManiaRuleset.cs @@ -145,6 +145,11 @@ public override IEnumerable GetModsFor(ModType type) { new MultiMod(new ManiaModAutoplay(), new ModCinema()), }; + case ModType.Fun: + return new Mod[] + { + new MultiMod(new ManiaModWindUp(), new ManiaModWindDown()) + }; default: return new Mod[] { }; } diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModWindDown.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModWindDown.cs new file mode 100644 index 0000000000..05272d8620 --- /dev/null +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModWindDown.cs @@ -0,0 +1,11 @@ +using System; +using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Mania.Objects; + +namespace osu.Game.Rulesets.Mania.Mods +{ + public class ManiaModWindDown : ModWindDown + { + + } +} \ No newline at end of file diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModWindUp.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModWindUp.cs new file mode 100644 index 0000000000..d9e663c977 --- /dev/null +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModWindUp.cs @@ -0,0 +1,11 @@ +using System; +using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Mania.Objects; + +namespace osu.Game.Rulesets.Mania.Mods +{ + public class ManiaModWindUp : ModWindUp + { + + } +} \ No newline at end of file diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModWindDown.cs b/osu.Game.Rulesets.Osu/Mods/OsuModWindDown.cs new file mode 100644 index 0000000000..71035ad8e4 --- /dev/null +++ b/osu.Game.Rulesets.Osu/Mods/OsuModWindDown.cs @@ -0,0 +1,11 @@ +using System; +using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Osu.Objects; + +namespace osu.Game.Rulesets.Osu.Mods +{ + public class OsuModWindDown : ModWindDown + { + + } +} \ No newline at end of file diff --git a/osu.Game.Rulesets.Osu/Mods/OsuModWindUp.cs b/osu.Game.Rulesets.Osu/Mods/OsuModWindUp.cs new file mode 100644 index 0000000000..6eb4bdf703 --- /dev/null +++ b/osu.Game.Rulesets.Osu/Mods/OsuModWindUp.cs @@ -0,0 +1,11 @@ +using System; +using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Osu.Objects; + +namespace osu.Game.Rulesets.Osu.Mods +{ + public class OsuModWindUp : ModWindUp + { + + } +} \ No newline at end of file diff --git a/osu.Game.Rulesets.Osu/OsuRuleset.cs b/osu.Game.Rulesets.Osu/OsuRuleset.cs index 9415adc411..74e33426a4 100644 --- a/osu.Game.Rulesets.Osu/OsuRuleset.cs +++ b/osu.Game.Rulesets.Osu/OsuRuleset.cs @@ -121,6 +121,7 @@ public override IEnumerable GetModsFor(ModType type) return new Mod[] { new OsuModTransform(), new OsuModWiggle(), + new MultiMod(new OsuModWindUp(), new OsuModWindDown()) }; default: return new Mod[] { }; diff --git a/osu.Game.Rulesets.Taiko/Mods/TaikoModWindDown.cs b/osu.Game.Rulesets.Taiko/Mods/TaikoModWindDown.cs new file mode 100644 index 0000000000..2a59c994b0 --- /dev/null +++ b/osu.Game.Rulesets.Taiko/Mods/TaikoModWindDown.cs @@ -0,0 +1,11 @@ +using System; +using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Taiko.Objects; + +namespace osu.Game.Rulesets.Taiko.Mods +{ + public class TaikoModWindDown : ModWindDown + { + + } +} \ No newline at end of file diff --git a/osu.Game.Rulesets.Taiko/Mods/TaikoModWindUp.cs b/osu.Game.Rulesets.Taiko/Mods/TaikoModWindUp.cs new file mode 100644 index 0000000000..7aee771ce9 --- /dev/null +++ b/osu.Game.Rulesets.Taiko/Mods/TaikoModWindUp.cs @@ -0,0 +1,11 @@ +using System; +using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Taiko.Objects; + +namespace osu.Game.Rulesets.Taiko.Mods +{ + public class TaikoModWindUp : ModWindUp + { + + } +} \ No newline at end of file diff --git a/osu.Game.Rulesets.Taiko/TaikoRuleset.cs b/osu.Game.Rulesets.Taiko/TaikoRuleset.cs index 7851a2f919..d9c7703ebf 100644 --- a/osu.Game.Rulesets.Taiko/TaikoRuleset.cs +++ b/osu.Game.Rulesets.Taiko/TaikoRuleset.cs @@ -99,6 +99,11 @@ public override IEnumerable GetModsFor(ModType type) new MultiMod(new TaikoModAutoplay(), new ModCinema()), new TaikoModRelax(), }; + case ModType.Fun: + return new Mod[] + { + new MultiMod(new TaikoModWindUp(), new TaikoModWindDown()) + }; default: return new Mod[] { }; } diff --git a/osu.Game/Rulesets/Mods/ModDoubleTime.cs b/osu.Game/Rulesets/Mods/ModDoubleTime.cs index b69019cd91..d87fb5de23 100644 --- a/osu.Game/Rulesets/Mods/ModDoubleTime.cs +++ b/osu.Game/Rulesets/Mods/ModDoubleTime.cs @@ -15,7 +15,7 @@ public abstract class ModDoubleTime : Mod, IApplicableToClock public override ModType Type => ModType.DifficultyIncrease; public override string Description => "Zoooooooooom..."; public override bool Ranked => true; - public override Type[] IncompatibleMods => new[] { typeof(ModHalfTime) }; + public override Type[] IncompatibleMods => new[] { typeof(ModHalfTime), typeof(ModWindUp) }; public virtual void ApplyToClock(IAdjustableClock clock) { diff --git a/osu.Game/Rulesets/Mods/ModHalfTime.cs b/osu.Game/Rulesets/Mods/ModHalfTime.cs index 1cffa37b04..0b421431d3 100644 --- a/osu.Game/Rulesets/Mods/ModHalfTime.cs +++ b/osu.Game/Rulesets/Mods/ModHalfTime.cs @@ -15,7 +15,7 @@ public abstract class ModHalfTime : Mod, IApplicableToClock public override ModType Type => ModType.DifficultyReduction; public override string Description => "Less zoom..."; public override bool Ranked => true; - public override Type[] IncompatibleMods => new[] { typeof(ModDoubleTime) }; + public override Type[] IncompatibleMods => new[] { typeof(ModDoubleTime), typeof(ModWindUp) }; public virtual void ApplyToClock(IAdjustableClock clock) { diff --git a/osu.Game/Rulesets/Mods/ModWindDown.cs b/osu.Game/Rulesets/Mods/ModWindDown.cs new file mode 100644 index 0000000000..9fc65839fd --- /dev/null +++ b/osu.Game/Rulesets/Mods/ModWindDown.cs @@ -0,0 +1,16 @@ +using osu.Game.Graphics; +using osu.Game.Rulesets.Objects; + +namespace osu.Game.Rulesets.Mods +{ + public class ModWindDown : ModWindUp + where T : HitObject + { + public override string Name => "Wind Down"; + public override string Acronym => "WD"; + public override string Description => "Slow down."; + public override FontAwesome Icon => FontAwesome.fa_chevron_circle_down; + public override double AppendRate => -0.25; + } + +} \ No newline at end of file diff --git a/osu.Game/Rulesets/Mods/ModWindUp.cs b/osu.Game/Rulesets/Mods/ModWindUp.cs new file mode 100644 index 0000000000..5deeff842b --- /dev/null +++ b/osu.Game/Rulesets/Mods/ModWindUp.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using osu.Framework.Audio; +using osu.Framework.Audio.Track; +using osu.Framework.Configuration; +using osu.Framework.Timing; +using osu.Framework.Graphics; +using osu.Game.Beatmaps; +using osu.Game.Graphics; +using osu.Game.Rulesets.UI; +using osu.Game.Rulesets.Objects; + +namespace osu.Game.Rulesets.Mods +{ + public abstract class ModWindUp : Mod + { + public override string Name => "Wind Up"; + public override string Acronym => "WU"; + public override ModType Type => ModType.Fun; + public override FontAwesome Icon => FontAwesome.fa_chevron_circle_up; + public override string Description => "Crank it up!"; + public override double ScoreMultiplier => 1; + public override Type[] IncompatibleMods => new[] { typeof(ModDoubleTime), typeof(ModHalfTime) }; + public abstract double AppendRate { get; } + } + + public class ModWindUp : ModWindUp, IUpdatableByPlayfield, IApplicableToClock, IApplicableToRulesetContainer + where T : HitObject + { + private Track Track; + private IAdjustableClock Clock; + private IHasPitchAdjust ClockAdjust; + public override double AppendRate => 0.5; + + public virtual void ApplyToClock(IAdjustableClock clock) + { + Clock = clock; + ClockAdjust = clock as IHasPitchAdjust; + } + + public virtual void ApplyToRulesetContainer(RulesetContainer ruleset) + { + Track = ruleset.WorkingBeatmap.Track; + } + + public virtual void Update(Playfield playfield) + { + double newRate = 1 + (AppendRate * (Track.CurrentTime / Track.Length)); + Clock.Rate = newRate; + ClockAdjust.PitchAdjust = newRate; + } + } +} \ No newline at end of file diff --git a/osu.Game/Rulesets/UI/RulesetContainer.cs b/osu.Game/Rulesets/UI/RulesetContainer.cs index 0d020238aa..dfcd2f7602 100644 --- a/osu.Game/Rulesets/UI/RulesetContainer.cs +++ b/osu.Game/Rulesets/UI/RulesetContainer.cs @@ -215,7 +215,7 @@ public abstract class RulesetContainer : RulesetContainer /// /// The this was created with. /// - protected readonly WorkingBeatmap WorkingBeatmap; + public readonly WorkingBeatmap WorkingBeatmap; public override ScoreProcessor CreateScoreProcessor() => new ScoreProcessor(this);