Skip to content

Commit

Permalink
Merge pull request #74 from LumpBloom7/Slides
Browse files Browse the repository at this point in the history
Implement Slide notes
  • Loading branch information
LumpBloom7 authored Jul 26, 2020
2 parents 7835e50 + bb3dd5c commit c9d9a13
Show file tree
Hide file tree
Showing 34 changed files with 1,110 additions and 25 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using System.Collections.Generic;
using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Sentakki.Objects;
using osu.Framework.Graphics;

namespace osu.Game.Rulesets.Sentakki.Tests.Objects.Slides
{
public class TestSceneCircleSlide : TestSceneSlide
{
private bool clockwise = false;
public TestSceneCircleSlide()
{
AddToggleStep("Clockwise", b =>
{
clockwise = b;
RefreshSlide();
});
}
protected override SentakkiSlidePath CreatePattern() => SlidePaths.GenerateCirclePattern(EndPath, clockwise ? RotationDirection.Clockwise : RotationDirection.CounterClockwise);
}
}
11 changes: 11 additions & 0 deletions osu.Game.Rulesets.Sentakki.Tests/Objects/Slides/TestSceneLSlide.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using System.Collections.Generic;
using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Sentakki.Objects;

namespace osu.Game.Rulesets.Sentakki.Tests.Objects.Slides
{
public class TestSceneLSlide : TestSceneSlide
{
protected override SentakkiSlidePath CreatePattern() => SlidePaths.GenerateLPattern(EndPath);
}
}
51 changes: 51 additions & 0 deletions osu.Game.Rulesets.Sentakki.Tests/Objects/Slides/TestSceneSlide.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
using System.Collections.Generic;
using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Sentakki.UI.Components;
using osu.Game.Tests.Visual;
using NUnit.Framework;
using osu.Game.Rulesets.Sentakki.Objects.Drawables.Pieces;
using osu.Game.Rulesets.Sentakki.Objects;

namespace osu.Game.Rulesets.Sentakki.Tests.Objects.Slides
{
[TestFixture]
public abstract class TestSceneSlide : OsuTestScene
{
protected override Ruleset CreateRuleset() => new SentakkiRuleset();

protected int StartPath = 0;
protected int EndPath;

private readonly SlideBody slide;

public TestSceneSlide()
{
Add(new SentakkiRing());

Add(slide = new SlideBody()
{
Path = CreatePattern().Path
});

AddSliderStep("Path offset", 0, 7, 0, p =>
{
slide.Rotation = 45 * p;
});
AddSliderStep("End Path", 0, 7, 4, p =>
{
EndPath = p;
RefreshSlide();
});
AddSliderStep("Progress", 0.0f, 1.0f, 0.0f, p =>
{
slide.Progress = p;
});
}
protected abstract SentakkiSlidePath CreatePattern();

protected void RefreshSlide()
{
slide.Path = CreatePattern().Path;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using System.Collections.Generic;
using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Sentakki.Objects;

namespace osu.Game.Rulesets.Sentakki.Tests.Objects.Slides
{
public class TestSceneStraightSlide : TestSceneSlide
{
protected override SentakkiSlidePath CreatePattern() => SlidePaths.GenerateStraightPattern(EndPath);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using System.Collections.Generic;
using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Sentakki.Objects;

namespace osu.Game.Rulesets.Sentakki.Tests.Objects.Slides
{
public class TestSceneThunderSlide : TestSceneSlide
{
protected override SentakkiSlidePath CreatePattern() => SlidePaths.GenerateThunderPattern();
}
}
11 changes: 11 additions & 0 deletions osu.Game.Rulesets.Sentakki.Tests/Objects/Slides/TestSceneUSlide.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using System.Collections.Generic;
using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Sentakki.Objects;

namespace osu.Game.Rulesets.Sentakki.Tests.Objects.Slides
{
public class TestSceneUSlide : TestSceneSlide
{
protected override SentakkiSlidePath CreatePattern() => SlidePaths.GenerateUPattern(EndPath);
}
}
11 changes: 11 additions & 0 deletions osu.Game.Rulesets.Sentakki.Tests/Objects/Slides/TestSceneVSlide.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using System.Collections.Generic;
using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Sentakki.Objects;

namespace osu.Game.Rulesets.Sentakki.Tests.Objects.Slides
{
public class TestSceneVSlide : TestSceneSlide
{
protected override SentakkiSlidePath CreatePattern() => SlidePaths.GenerateVPattern(EndPath);
}
}
55 changes: 55 additions & 0 deletions osu.Game.Rulesets.Sentakki.Tests/Objects/TestSceneSlideNote.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
using NUnit.Framework;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.ControlPoints;
using osu.Game.Rulesets.Sentakki.Objects;
using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Sentakki.Objects.Drawables;
using osu.Game.Tests.Visual;
using osuTK;
using osuTK.Graphics;
using System.Linq;

namespace osu.Game.Rulesets.Sentakki.Tests.Objects
{
[TestFixture]
public class TestSceneSlideNote : OsuTestScene
{
private readonly Container content;
protected override Container<Drawable> Content => content;

protected override Ruleset CreateRuleset() => new SentakkiRuleset();

private int depthIndex;

public TestSceneSlideNote()
{
base.Content.Add(content = new SentakkiInputManager(new RulesetInfo { ID = 0 }));

AddStep("Miss Single", () => testSingle(2000));
AddStep("Hit Single", () => testSingle(2000, true));
AddUntilStep("Wait for object despawn", () => !Children.Any(h => (h is DrawableSentakkiHitObject) && (h as DrawableSentakkiHitObject).AllJudged == false));
}

private void testSingle(double duration, bool auto = false)
{
var slide = new Slide
{
SlidePath = SlidePaths.GenerateUPattern(5),
StartTime = Time.Current + 1000,
EndTime = Time.Current + 1000 + duration,
};

slide.ApplyDefaults(new ControlPointInfo(), new BeatmapDifficulty { });

Add(new DrawableSlide(slide)
{
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
Depth = depthIndex++,
Auto = auto
});
}
}
}
7 changes: 7 additions & 0 deletions osu.Game.Rulesets.Sentakki/Beatmaps/SentakkiBeatmap.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public override IEnumerable<BeatmapStatistic> GetStatistics()
int holds = HitObjects.Count(h => h is Hold);
int centreHolds = HitObjects.Count(h => h is TouchHold);
int touchs = HitObjects.Count(h => h is Touch);
int slides = HitObjects.Count(h => h is Slide);

return new[]
{
Expand Down Expand Up @@ -41,6 +42,12 @@ public override IEnumerable<BeatmapStatistic> GetStatistics()
Content = touchs.ToString(),
Icon = FontAwesome.Solid.Circle
},
new BeatmapStatistic
{
Name = "Slide Count",
Content = slides.ToString(),
Icon = FontAwesome.Solid.Circle
},
};
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ public enum ConversionExperiments
none = 0,
twins = 1,
touch = 2,
patternv2 = 4
patternv2 = 4,
slide = 8
}

public class SentakkiBeatmapConverter : BeatmapConverter<SentakkiHitObject>
Expand Down
39 changes: 30 additions & 9 deletions osu.Game.Rulesets.Sentakki/Beatmaps/SentakkiPatternGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,19 +71,26 @@ public IEnumerable<SentakkiHitObject> GenerateNewNote(HitObject original)
{
case IHasPathWithRepeats hold:
breakNote = hold.NodeSamples.Any(samples => samples.Any(s => s.Name == HitSampleInfo.HIT_FINISH));
if (Experiments.Value.HasFlag(ConversionExperiments.twins))
if (Experiments.Value.HasFlag(ConversionExperiments.slide) && hold.NodeSamples.Any(samples => samples.Any(s => s.Name == HitSampleInfo.HIT_WHISTLE)) && hold.Duration > 400)
{
if (hold.NodeSamples.Any(samples => samples.Any(s => s.Name == HitSampleInfo.HIT_CLAP)))
notes.Add(createSlideNote(original, isBreak: breakNote));
}
else
{
if (Experiments.Value.HasFlag(ConversionExperiments.twins))
{
isTwin = true;
notes.Add(createHoldNote(original, true, breakNote));
if (hold.NodeSamples.Any(samples => samples.Any(s => s.Name == HitSampleInfo.HIT_CLAP)))
{
isTwin = true;
notes.Add(createHoldNote(original, true, breakNote));
}
else
foreach (var note in createTapsFromTicks(original).ToList())
yield return note;
}
else
foreach (var note in createTapsFromTicks(original).ToList())
yield return note;
}

notes.Add(createHoldNote(original, isBreak: breakNote));
notes.Add(createHoldNote(original, isBreak: breakNote));
}
break;

case IHasDuration _:
Expand Down Expand Up @@ -118,6 +125,20 @@ public IEnumerable<SentakkiHitObject> GenerateNewNote(HitObject original)
}

// Individual note generation code, because it's cleaner
private SentakkiHitObject createSlideNote(HitObject original, bool twin = false, bool isBreak = false)
{
int noteLane = getNewLane(twin);
return new Slide
{
SlidePath = SlidePaths.ValidPaths[rng.Next(0, SlidePaths.ValidPaths.Length)],
Lane = noteLane,
StartTime = original.StartTime,
EndTime = original.GetEndTime(),
Samples = original.Samples,
IsBreak = isBreak
};
}

private SentakkiHitObject createHoldNote(HitObject original, bool twin = false, bool isBreak = false)
{
int noteLane = getNewLane(twin);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ protected override void InitialiseDefaults()
Set(SentakkiRulesetSettings.RingColor, ColorOption.Default);
Set(SentakkiRulesetSettings.RingOpacity, 1f, 0f, 1f, 0.01f);
Set(SentakkiRulesetSettings.BreakSounds, true);
Set(SentakkiRulesetSettings.SlideSounds, true);
}
}

Expand All @@ -43,5 +44,6 @@ public enum SentakkiRulesetSettings
RingColor,
BreakSounds,
TouchAnimationDuration,
SlideSounds,
}
}
2 changes: 2 additions & 0 deletions osu.Game.Rulesets.Sentakki/Mods/SentakkiModAutoplay.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ public void ApplyToDrawableHitObjects(IEnumerable<DrawableHitObject> drawables)
foreach (var d in drawables.OfType<DrawableSentakkiHitObject>())
{
d.Auto = true;
foreach (DrawableSentakkiHitObject nested in d.NestedHitObjects)
nested.Auto = true;
}
}
}
Expand Down
10 changes: 10 additions & 0 deletions osu.Game.Rulesets.Sentakki/Mods/SentakkiModExperimental.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,13 @@ public class SentakkiModExperimental : Mod, IApplicableToBeatmapConverter
Value = true
};

[SettingSource("Enable Slide notes", "Allow SLIDEs to appear")]
public BindableBool EnableSlides { get; } = new BindableBool
{
Default = false,
Value = false
};

public void ApplyToBeatmapConverter(IBeatmapConverter beatmapConverter)
{
if (EnableTwins.Value)
Expand All @@ -56,6 +63,9 @@ public void ApplyToBeatmapConverter(IBeatmapConverter beatmapConverter)

if (EnablePatternGen.Value)
(beatmapConverter as SentakkiBeatmapConverter).EnabledExperiments.Value |= ConversionExperiments.patternv2;

if (EnableSlides.Value)
(beatmapConverter as SentakkiBeatmapConverter).EnabledExperiments.Value |= ConversionExperiments.slide;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ protected override DrawableHitObject CreateNestedHitObject(HitObject hitObject)
private void load(SentakkiRulesetConfigManager settings)
{
settings?.BindWith(SentakkiRulesetSettings.AnimationDuration, AnimationDuration);
HitObjectLine.Colour = HitObject.NoteColor;
AccentColour.BindValueChanged(c => HitObjectLine.Colour = c.NewValue, true);
}

protected override void UpdateInitialTransforms()
Expand Down
Loading

0 comments on commit c9d9a13

Please sign in to comment.