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