diff --git a/osu.Game.Rulesets.Sentakki/Mods/SentakkiModHidden.cs b/osu.Game.Rulesets.Sentakki/Mods/SentakkiModHidden.cs index 6715deab6..0cc0ab31b 100644 --- a/osu.Game.Rulesets.Sentakki/Mods/SentakkiModHidden.cs +++ b/osu.Game.Rulesets.Sentakki/Mods/SentakkiModHidden.cs @@ -14,6 +14,7 @@ using osu.Game.Rulesets.Sentakki.Localisation.Mods; using osu.Game.Rulesets.Sentakki.Objects; using osu.Game.Rulesets.Sentakki.Objects.Drawables; +using osu.Game.Rulesets.Sentakki.Skinning.Default.TouchHolds; using osu.Game.Rulesets.Sentakki.UI; using osu.Game.Rulesets.UI; using osuTK; @@ -59,7 +60,7 @@ protected override void ApplyNormalVisibilityState(DrawableHitObject hitObject, break; case DrawableTouchHold th: - th.TouchHoldBody.ProgressPiece.Hide(); + ((TouchHoldBody)th.TouchHoldBody.Drawable).ProgressPiece.Hide(); break; case DrawableSlideBody sb: diff --git a/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableHold.cs b/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableHold.cs index 377eec25d..5ccbbb5d8 100644 --- a/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableHold.cs +++ b/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableHold.cs @@ -8,8 +8,10 @@ using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Objects.Types; using osu.Game.Rulesets.Scoring; +using osu.Game.Rulesets.Sentakki.Skinning; using osu.Game.Rulesets.Sentakki.Skinning.Default; using osu.Game.Rulesets.Sentakki.UI; +using osu.Game.Skinning; using osuTK; using osuTK.Graphics; @@ -21,7 +23,7 @@ public class DrawableHold : DrawableSentakkiLanedHitObject, IKeyBindingHandler headContainer; - public HoldBody NoteBody; + public SkinnableDrawable NoteBody; public override double LifetimeStart { @@ -53,7 +55,14 @@ private void load() Anchor = Anchor.Centre; Origin = Anchor.Centre; AddRangeInternal(new Drawable[]{ - NoteBody = new HoldBody(), + NoteBody = new ProxyableSkinnableDrawable(new SentakkiSkinComponent(SentakkiSkinComponents.Hold), _=> new HoldBody()) + { + Scale = Vector2.Zero, + Position = new Vector2(0, -SentakkiPlayfield.NOTESTARTDISTANCE), + Anchor = Anchor.Centre, + Origin = Anchor.BottomCentre, + RelativeSizeAxes = Axes.None, + }, headContainer = new Container { RelativeSizeAxes = Axes.Both }, }); } @@ -71,7 +80,7 @@ protected override void UpdateInitialTransforms() double animTime = AdjustedAnimationDuration / 2; NoteBody.FadeInFromZero(animTime).ScaleTo(1, animTime); - NoteBody.FadeColour(AccentColour.Value); + ((HoldBody)NoteBody.Drawable).FadeColour(AccentColour.Value); using (BeginDelayedSequence(animTime, true)) { @@ -89,7 +98,7 @@ protected override void UpdateInitialTransforms() .ResizeHeightTo(0, stretchTime); if (HoldStartTime == null && !Auto) - NoteBody.Delay(animTime).FadeColour(Color4.Gray, 100); + ((HoldBody)NoteBody.Drawable).Delay(animTime).FadeColour(Color4.Gray, 100); } } @@ -132,7 +141,7 @@ protected override void UpdateHitStateTransforms(ArmedState state) break; case ArmedState.Miss: - NoteBody.ScaleTo(0.5f, time_fade_miss, Easing.InCubic) + ((HoldBody)NoteBody.Drawable).ScaleTo(0.5f, time_fade_miss, Easing.InCubic) .FadeColour(Color4.Red, time_fade_miss, Easing.OutQuint) .MoveToOffset(new Vector2(0, -100), time_fade_miss, Easing.OutCubic) .FadeOut(time_fade_miss); diff --git a/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableSlideBody.cs b/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableSlideBody.cs index ef607e6c0..d5ef4e44d 100644 --- a/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableSlideBody.cs +++ b/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableSlideBody.cs @@ -9,7 +9,9 @@ using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Objects.Types; using osu.Game.Rulesets.Scoring; +using osu.Game.Rulesets.Sentakki.Skinning; using osu.Game.Rulesets.Sentakki.Skinning.Default.Slides; +using osu.Game.Skinning; using osuTK; using osuTK.Graphics; @@ -26,7 +28,7 @@ public class DrawableSlideBody : DrawableSentakkiLanedHitObject public Container SlideCheckpoints { get; private set; } public ISlideVisual Slidepath; - public Container SlideStars; + public Container SlideStars; protected float StarProg; public virtual float StarProgress @@ -51,7 +53,7 @@ public DrawableSlideBody(SlideBody hitObject) protected virtual void CreateSlideStars() { - SlideStars.Add(new StarPiece + SlideStars.Add(new ProxyableSkinnableDrawable(new SentakkiSkinComponent(SentakkiSkinComponents.SlideStar), _ => new StarPiece()) { Alpha = 0, Scale = Vector2.Zero, @@ -78,7 +80,7 @@ private void load() AddRangeInternal(new Drawable[] { (Drawable)Slidepath, - SlideStars = new Container{ + SlideStars = new Container{ Anchor = Anchor.Centre, Origin = Anchor.Centre, }, @@ -212,7 +214,7 @@ protected override void UpdateHitStateTransforms(ArmedState state) foreach (var star in SlideStars) star.FadeOut(200); - this.FadeOut(200).Expire(); + this.Delay(200).Expire(); } break; diff --git a/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableSlideFan.cs b/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableSlideFan.cs index 4dce962ef..9c88d58a4 100644 --- a/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableSlideFan.cs +++ b/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableSlideFan.cs @@ -1,5 +1,7 @@ +using osu.Game.Rulesets.Sentakki.Skinning; using osu.Game.Rulesets.Sentakki.Skinning.Default.Slides; using osu.Game.Rulesets.Sentakki.UI; +using osu.Game.Skinning; using osuTK; namespace osu.Game.Rulesets.Sentakki.Objects.Drawables @@ -36,7 +38,7 @@ public DrawableSlideFan(SlideFan hitObject) protected override void CreateSlideStars() { for (int i = 0; i < 3; ++i) - SlideStars.Add(new StarPiece + SlideStars.Add(new SkinnableDrawable(new SentakkiSkinComponent(SentakkiSkinComponents.SlideStar), _ => new StarPiece()) { Y = -SentakkiPlayfield.INTERSECTDISTANCE, Alpha = 0, diff --git a/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableSlideTap.cs b/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableSlideTap.cs index d0b2f1af3..1269d7666 100644 --- a/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableSlideTap.cs +++ b/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableSlideTap.cs @@ -1,12 +1,15 @@ -using System.Linq; +using System; +using System.Linq; using osu.Framework.Graphics; +using osu.Game.Rulesets.Sentakki.Skinning; using osu.Game.Rulesets.Sentakki.Skinning.Default.Slides; namespace osu.Game.Rulesets.Sentakki.Objects.Drawables { public class DrawableSlideTap : DrawableTap { - protected override Drawable CreateTapRepresentation() => new SlideTapPiece(); + protected override SentakkiSkinComponents TapPieceComponent => SentakkiSkinComponents.SlideStar; + protected override Type fallbackPieceType => typeof(SlideTapPiece); public DrawableSlideTap() : this(null) { } public DrawableSlideTap(SlideTap hitObject) @@ -16,7 +19,7 @@ protected override void UpdateInitialTransforms() { base.UpdateInitialTransforms(); - var note = TapVisual as SlideTapPiece; + var note = TapVisual.Drawable as SlideTapPiece; double spinDuration = 0; diff --git a/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableTap.cs b/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableTap.cs index f0e2ef0af..16e5a2db0 100644 --- a/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableTap.cs +++ b/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableTap.cs @@ -1,3 +1,4 @@ +using System; using System.Diagnostics; using osu.Framework.Allocation; using osu.Framework.Graphics; @@ -5,8 +6,10 @@ using osu.Framework.Input.Events; using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Scoring; +using osu.Game.Rulesets.Sentakki.Skinning; using osu.Game.Rulesets.Sentakki.Skinning.Default; using osu.Game.Rulesets.Sentakki.UI; +using osu.Game.Skinning; using osuTK; using osuTK.Graphics; @@ -14,7 +17,8 @@ namespace osu.Game.Rulesets.Sentakki.Objects.Drawables { public class DrawableTap : DrawableSentakkiLanedHitObject, IKeyBindingHandler { - protected virtual Drawable CreateTapRepresentation() => new TapPiece(); + protected virtual SentakkiSkinComponents TapPieceComponent => SentakkiSkinComponents.Tap; + protected virtual Type fallbackPieceType => typeof(TapPiece); public override double LifetimeStart { @@ -35,7 +39,7 @@ public override double LifetimeEnd } } - public Drawable TapVisual; + public SkinnableDrawable TapVisual; public DrawableTap() : this(null) { } @@ -48,7 +52,13 @@ private void load() Origin = Anchor.Centre; Anchor = Anchor.Centre; AddRangeInternal(new Drawable[] { - TapVisual = CreateTapRepresentation(), + TapVisual = new ProxyableSkinnableDrawable(new SentakkiSkinComponent(TapPieceComponent), _ => (Drawable)Activator.CreateInstance(fallbackPieceType)) + { + Scale = new Vector2(0f), + Position = new Vector2(0, -SentakkiPlayfield.NOTESTARTDISTANCE), + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + } }); } diff --git a/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableTouch.cs b/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableTouch.cs index 9963fa540..a9fd6acbf 100644 --- a/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableTouch.cs +++ b/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableTouch.cs @@ -5,7 +5,9 @@ using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.Sentakki.Configuration; +using osu.Game.Rulesets.Sentakki.Skinning; using osu.Game.Rulesets.Sentakki.Skinning.Default.Touches; +using osu.Game.Skinning; using osuTK; using osuTK.Graphics; @@ -24,7 +26,7 @@ public class DrawableTouch : DrawableSentakkiHitObject // Similar to IsHovered for mouse, this tracks whether a pointer (touch or mouse) is interacting with this drawable // Interaction == (IsHovered && ActionPressed) || (OnTouch && TouchPointerInBounds) public bool[] PointInteractionState = new bool[11]; - public TouchBody TouchBody; + public SkinnableDrawable TouchBody; private SentakkiInputManager sentakkiActionInputManager; internal SentakkiInputManager SentakkiActionInputManager => sentakkiActionInputManager ??= GetContainingInputManager() as SentakkiInputManager; @@ -42,7 +44,14 @@ private void load(SentakkiRulesetConfigManager sentakkiConfigs) Origin = Anchor.Centre; Anchor = Anchor.Centre; AddRangeInternal(new Drawable[]{ - TouchBody = new TouchBody(), + TouchBody = new SkinnableDrawable(new SentakkiSkinComponent(SentakkiSkinComponents.Touch), _ => new TouchBody()) + { + Size = new Vector2(130), + Alpha = 0, + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + RelativeSizeAxes = Axes.None, + }, }); trackedKeys.BindValueChanged(x => @@ -80,7 +89,7 @@ protected override void UpdateInitialTransforms() using (BeginDelayedSequence(AdjustedAnimationDuration, true)) { TouchBody.ResizeTo(90, moveTo, Easing.InCirc); - TouchBody.BorderContainer.Delay(moveTo).FadeIn(); + ((TouchBody)TouchBody.Drawable).BorderContainer.Delay(moveTo).FadeIn(); } } @@ -124,9 +133,11 @@ protected override void UpdateHitStateTransforms(ArmedState state) break; case ArmedState.Miss: - this.ScaleTo(0.5f, time_fade_miss, Easing.InCubic) + TouchBody.ScaleTo(0.5f, time_fade_miss, Easing.InCubic) .FadeColour(Color4.Red, time_fade_miss, Easing.OutQuint) .FadeOut(time_fade_miss); + + this.Delay(time_fade_miss).Expire(); break; } } diff --git a/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableTouchHold.cs b/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableTouchHold.cs index 18255ebcd..e2d262cd6 100644 --- a/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableTouchHold.cs +++ b/osu.Game.Rulesets.Sentakki/Objects/Drawables/DrawableTouchHold.cs @@ -12,6 +12,7 @@ using osu.Game.Rulesets.Objects.Types; using osu.Game.Rulesets.Scoring; using osu.Game.Rulesets.Sentakki.Configuration; +using osu.Game.Rulesets.Sentakki.Skinning; using osu.Game.Rulesets.Sentakki.Skinning.Default.TouchHolds; using osu.Game.Skinning; using osuTK; @@ -28,7 +29,7 @@ public class DrawableTouchHold : DrawableSentakkiHitObject public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => TouchHoldBody.ReceivePositionalInputAt(screenSpacePos); - public TouchHoldBody TouchHoldBody; + public SkinnableDrawable TouchHoldBody; private PausableSkinnableSound holdSample; @@ -44,10 +45,14 @@ private void load(SentakkiRulesetConfigManager sentakkiConfigs) Colour = Color4.SlateGray; Anchor = Anchor.Centre; Origin = Anchor.Centre; - Scale = new Vector2(0f); - Alpha = 0; + AddRangeInternal(new Drawable[] { - TouchHoldBody = new TouchHoldBody(), + TouchHoldBody = new SkinnableDrawable(new SentakkiSkinComponent(SentakkiSkinComponents.TouchHold), _=> new TouchHoldBody()) + { + Size = new Vector2(110), + Scale = new Vector2(0f), + Alpha = 0, + }, holdSample = new PausableSkinnableSound { Volume = { Value = 0 }, @@ -100,10 +105,10 @@ protected override void UpdateInitialTransforms() { base.UpdateInitialTransforms(); double fadeIn = AdjustedAnimationDuration; - this.FadeInFromZero(fadeIn).ScaleTo(1, fadeIn); + TouchHoldBody.FadeInFromZero(fadeIn).ScaleTo(1, fadeIn); using (BeginDelayedSequence(fadeIn, true)) { - TouchHoldBody.ProgressPiece.TransformBindableTo(TouchHoldBody.ProgressPiece.ProgressBindable, 1, ((IHasDuration)HitObject).Duration); + ((TouchHoldBody)TouchHoldBody.Drawable).ProgressPiece.TransformBindableTo(((TouchHoldBody)TouchHoldBody.Drawable).ProgressPiece.ProgressBindable, 1, ((IHasDuration)HitObject).Duration); } } @@ -170,16 +175,17 @@ protected override void CheckForResult(bool userTriggered, double timeOffset) protected override void UpdateHitStateTransforms(ArmedState state) { base.UpdateHitStateTransforms(state); - const double time_fade_hit = 100, time_fade_miss = 400; + const double time_fade_miss = 400; switch (state) { case ArmedState.Hit: - this.Delay(time_fade_hit).Expire(); + Expire(); break; case ArmedState.Miss: - this.ScaleTo(.0f, time_fade_miss).FadeOut(time_fade_miss).Expire(); + TouchHoldBody.ScaleTo(.0f, time_fade_miss).FadeOut(time_fade_miss).Expire(); + this.Delay(time_fade_miss).Expire(); break; } } diff --git a/osu.Game.Rulesets.Sentakki/SentakkiRuleset.cs b/osu.Game.Rulesets.Sentakki/SentakkiRuleset.cs index f6b774ea9..6390f192d 100644 --- a/osu.Game.Rulesets.Sentakki/SentakkiRuleset.cs +++ b/osu.Game.Rulesets.Sentakki/SentakkiRuleset.cs @@ -48,7 +48,10 @@ private static readonly Lazy is_development_build public override string Description => IsDevelopmentBuild ? "sentakki (Dev build)" : "sentakki"; public override string PlayingVerb => "Washing laundry"; - public override string ShortName => "Sentakki"; + + public const string SHORT_NAME = "Sentakki"; + + public override string ShortName => SHORT_NAME; public override ScoreProcessor CreateScoreProcessor() => new SentakkiScoreProcessor(this); diff --git a/osu.Game.Rulesets.Sentakki/Skinning/Default/HoldBody.cs b/osu.Game.Rulesets.Sentakki/Skinning/Default/HoldBody.cs index 8d6e7a03a..fa7812028 100644 --- a/osu.Game.Rulesets.Sentakki/Skinning/Default/HoldBody.cs +++ b/osu.Game.Rulesets.Sentakki/Skinning/Default/HoldBody.cs @@ -3,23 +3,17 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Game.Rulesets.Objects.Drawables; -using osu.Game.Rulesets.Sentakki.UI; -using osuTK; using osuTK.Graphics; namespace osu.Game.Rulesets.Sentakki.Skinning.Default { public class HoldBody : CompositeDrawable { - // This will be proxied, so a must. - public override bool RemoveWhenNotAlive => false; - public HoldBody() { - Scale = Vector2.Zero; - Position = new Vector2(0, -SentakkiPlayfield.NOTESTARTDISTANCE); Anchor = Anchor.Centre; Origin = Anchor.BottomCentre; + RelativeSizeAxes = Axes.Both; InternalChildren = new Drawable[] { new NoteRingPiece(), diff --git a/osu.Game.Rulesets.Sentakki/Skinning/Default/Slides/SlideFanChevrons.cs b/osu.Game.Rulesets.Sentakki/Skinning/Default/Slides/SlideFanChevrons.cs index 2ccfa051e..62fb3fae7 100644 --- a/osu.Game.Rulesets.Sentakki/Skinning/Default/Slides/SlideFanChevrons.cs +++ b/osu.Game.Rulesets.Sentakki/Skinning/Default/Slides/SlideFanChevrons.cs @@ -4,6 +4,7 @@ using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.Sprites; using osu.Framework.Layout; +using osu.Game.Skinning; using osuTK; using osuTK.Graphics; @@ -72,89 +73,92 @@ public ChevronBackingTexture(float lengthScale, float HeightScale) : base(cached float chevHeight = 16 + (10 * HeightScale); float chevWidth = 6 + (210 * lengthScale); - AddInternal(new Container - { - Anchor = Anchor.BottomCentre, - Origin = Anchor.BottomCentre, - AutoSizeAxes = Axes.Both, - Children = new Drawable[]{ - // Outlines - new Container - { - X = 2.5f, - Masking = true, - CornerRadius = chevHeight/4, - CornerExponent = 2.5f, - Anchor = Anchor.BottomCentre, - Origin = Anchor.BottomRight, - Rotation = 22.5f, - Width = chevWidth, - Height = chevHeight, - Child = new Box{ - RelativeSizeAxes = Axes.Both, - Colour = Color4.Gray - }, - }, - new Container - { - X = -2.5f, - Masking = true, - CornerRadius = chevHeight/4, - CornerExponent = 2.5f, - Anchor = Anchor.BottomCentre, - Origin = Anchor.BottomLeft, - Rotation = -22.5f, - Width = chevWidth, - Height = chevHeight, - Child = new Box{ - RelativeSizeAxes = Axes.Both, - Colour = Color4.Gray - }, - }, - // Inners - new Container - { - X = 2.5f, - Anchor = Anchor.BottomCentre, - Origin = Anchor.BottomRight, - Size = new Vector2(chevWidth, chevHeight), - Rotation = 22.5f, - Padding = new MarginPadding(2), - Child = new Container{ - RelativeSizeAxes = Axes.Both, + AddInternal(new SkinnableDrawable( + new SentakkiSkinComponent(SentakkiSkinComponents.SlideFanChevron), + _ => new Container + { + Anchor = Anchor.BottomCentre, + Origin = Anchor.BottomCentre, + AutoSizeAxes = Axes.Both, + Children = new Drawable[]{ + // Outlines + new Container + { + X = 2.5f, Masking = true, - - CornerRadius = (chevHeight-4)/4, + CornerRadius = chevHeight/4, CornerExponent = 2.5f, - Colour = Color4.White, + Anchor = Anchor.BottomCentre, + Origin = Anchor.BottomRight, + Rotation = 22.5f, + Width = chevWidth, + Height = chevHeight, Child = new Box{ RelativeSizeAxes = Axes.Both, - Colour = Color4.White - } + Colour = Color4.Gray + }, }, - }, - new Container - { - X = -2.5f, - Anchor = Anchor.BottomCentre, - Origin = Anchor.BottomLeft, - Size = new Vector2(chevWidth, chevHeight), - Rotation = -22.5f, - Padding = new MarginPadding(2), - Child = new Container + new Container { - RelativeSizeAxes = Axes.Both, + X = -2.5f, Masking = true, - CornerRadius = (chevHeight-4)/4, + CornerRadius = chevHeight/4, CornerExponent = 2.5f, + Anchor = Anchor.BottomCentre, + Origin = Anchor.BottomLeft, + Rotation = -22.5f, + Width = chevWidth, + Height = chevHeight, Child = new Box{ RelativeSizeAxes = Axes.Both, - Colour = Color4.White - } + Colour = Color4.Gray + }, + }, + // Inners + new Container + { + X = 2.5f, + Anchor = Anchor.BottomCentre, + Origin = Anchor.BottomRight, + Size = new Vector2(chevWidth, chevHeight), + Rotation = 22.5f, + Padding = new MarginPadding(2), + Child = new Container{ + RelativeSizeAxes = Axes.Both, + Masking = true, + + CornerRadius = (chevHeight-4)/4, + CornerExponent = 2.5f, + Colour = Color4.White, + Child = new Box{ + RelativeSizeAxes = Axes.Both, + Colour = Color4.White + } + }, + }, + new Container + { + X = -2.5f, + Anchor = Anchor.BottomCentre, + Origin = Anchor.BottomLeft, + Size = new Vector2(chevWidth, chevHeight), + Rotation = -22.5f, + Padding = new MarginPadding(2), + Child = new Container + { + RelativeSizeAxes = Axes.Both, + Masking = true, + CornerRadius = (chevHeight-4)/4, + CornerExponent = 2.5f, + Child = new Box{ + RelativeSizeAxes = Axes.Both, + Colour = Color4.White + } + }, }, - }, - } - }); + } + }) + ); } } } diff --git a/osu.Game.Rulesets.Sentakki/Skinning/Default/Slides/SlideTapPiece.cs b/osu.Game.Rulesets.Sentakki/Skinning/Default/Slides/SlideTapPiece.cs index 179fb29f3..b103a982d 100644 --- a/osu.Game.Rulesets.Sentakki/Skinning/Default/Slides/SlideTapPiece.cs +++ b/osu.Game.Rulesets.Sentakki/Skinning/Default/Slides/SlideTapPiece.cs @@ -3,7 +3,7 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Game.Rulesets.Objects.Drawables; -using osu.Game.Rulesets.Sentakki.UI; +using osu.Game.Skinning; using osuTK; using osuTK.Graphics; @@ -11,11 +11,8 @@ namespace osu.Game.Rulesets.Sentakki.Skinning.Default.Slides { public class SlideTapPiece : CompositeDrawable { - // This will be proxied, so a must. - public override bool RemoveWhenNotAlive => false; - public readonly Container Stars; - public readonly StarPiece SecondStar; + public readonly SkinnableDrawable SecondStar; public SlideTapPiece() { @@ -23,8 +20,6 @@ public SlideTapPiece() Anchor = Anchor.Centre; Origin = Anchor.Centre; - Scale = new Vector2(0f); - Position = new Vector2(0, -SentakkiPlayfield.NOTESTARTDISTANCE); InternalChildren = new Drawable[] { @@ -33,8 +28,19 @@ public SlideTapPiece() Anchor = Anchor.Centre, Origin = Anchor.Centre, Children = new Drawable[]{ - new StarPiece(), - SecondStar = new StarPiece { Rotation = 36 } + new SkinnableDrawable(new SentakkiSkinComponent(SentakkiSkinComponents.SlideStar), _ => new StarPiece()) + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + RelativeSizeAxes = Axes.None, + }, + SecondStar = new SkinnableDrawable(new SentakkiSkinComponent(SentakkiSkinComponents.SlideStar), _ => new StarPiece()) + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + RelativeSizeAxes = Axes.None, + Rotation = 36 + } } }, }; diff --git a/osu.Game.Rulesets.Sentakki/Skinning/Default/Slides/SlideVisual.cs b/osu.Game.Rulesets.Sentakki/Skinning/Default/Slides/SlideVisual.cs index b0556ace0..797cfd8f1 100644 --- a/osu.Game.Rulesets.Sentakki/Skinning/Default/Slides/SlideVisual.cs +++ b/osu.Game.Rulesets.Sentakki/Skinning/Default/Slides/SlideVisual.cs @@ -6,6 +6,7 @@ using osu.Framework.Graphics.Textures; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Sentakki.Objects; +using osu.Game.Skinning; namespace osu.Game.Rulesets.Sentakki.Skinning.Default.Slides { @@ -88,12 +89,12 @@ public SlideChevron() [BackgroundDependencyLoader] private void load(TextureStore textures) { - AddInternal(new Sprite + AddInternal(new SkinnableDrawable(new SentakkiSkinComponent(SentakkiSkinComponents.SlideChevron), _ => new Sprite { Anchor = Anchor.Centre, Origin = Anchor.Centre, Texture = textures.Get("slide"), - }); + })); } protected override void FreeAfterUse() diff --git a/osu.Game.Rulesets.Sentakki/Skinning/Default/Slides/SlideVisualBase.cs b/osu.Game.Rulesets.Sentakki/Skinning/Default/Slides/SlideVisualBase.cs index c8e242dba..bed03c99c 100644 --- a/osu.Game.Rulesets.Sentakki/Skinning/Default/Slides/SlideVisualBase.cs +++ b/osu.Game.Rulesets.Sentakki/Skinning/Default/Slides/SlideVisualBase.cs @@ -9,9 +9,6 @@ namespace osu.Game.Rulesets.Sentakki.Skinning.Default.Slides { public abstract class SlideVisualBase : CompositeDrawable, ISlideVisual where T : Drawable, ISlideChevron { - // This will be proxied, so a must. - public override bool RemoveWhenNotAlive => false; - private double progress; public double Progress { diff --git a/osu.Game.Rulesets.Sentakki/Skinning/Default/TapPiece.cs b/osu.Game.Rulesets.Sentakki/Skinning/Default/TapPiece.cs index ceb76333a..b7de9bbf6 100644 --- a/osu.Game.Rulesets.Sentakki/Skinning/Default/TapPiece.cs +++ b/osu.Game.Rulesets.Sentakki/Skinning/Default/TapPiece.cs @@ -3,23 +3,17 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Game.Rulesets.Objects.Drawables; -using osu.Game.Rulesets.Sentakki.UI; -using osuTK; using osuTK.Graphics; namespace osu.Game.Rulesets.Sentakki.Skinning.Default { public class TapPiece : CompositeDrawable { - // This will be proxied, so a must. - public override bool RemoveWhenNotAlive => false; - public TapPiece() { Anchor = Anchor.Centre; Origin = Anchor.Centre; - Scale = new Vector2(0f); - Position = new Vector2(0, -SentakkiPlayfield.NOTESTARTDISTANCE); + RelativeSizeAxes = Axes.Both; InternalChildren = new Drawable[] { new NoteRingPiece(), diff --git a/osu.Game.Rulesets.Sentakki/Skinning/Default/TouchHolds/TouchHoldBody.cs b/osu.Game.Rulesets.Sentakki/Skinning/Default/TouchHolds/TouchHoldBody.cs index e000dd22e..8008aa29e 100644 --- a/osu.Game.Rulesets.Sentakki/Skinning/Default/TouchHolds/TouchHoldBody.cs +++ b/osu.Game.Rulesets.Sentakki/Skinning/Default/TouchHolds/TouchHoldBody.cs @@ -17,7 +17,6 @@ public class TouchHoldBody : CircularContainer public TouchHoldBody() { - Size = new Vector2(110); Anchor = Anchor.Centre; Origin = Anchor.Centre; InternalChildren = new Drawable[]{ diff --git a/osu.Game.Rulesets.Sentakki/Skinning/Default/Touches/TouchBody.cs b/osu.Game.Rulesets.Sentakki/Skinning/Default/Touches/TouchBody.cs index fdcf3b845..e05be9912 100644 --- a/osu.Game.Rulesets.Sentakki/Skinning/Default/Touches/TouchBody.cs +++ b/osu.Game.Rulesets.Sentakki/Skinning/Default/Touches/TouchBody.cs @@ -15,10 +15,9 @@ public class TouchBody : Container public Container PieceContainer; public TouchBody() { - Size = new Vector2(130); Anchor = Anchor.Centre; Origin = Anchor.Centre; - Alpha = 0; + RelativeSizeAxes = Axes.Both; InternalChildren = new Drawable[]{ BorderContainer = new Container{ diff --git a/osu.Game.Rulesets.Sentakki/Skinning/ProxyableSkinnableDrawable.cs b/osu.Game.Rulesets.Sentakki/Skinning/ProxyableSkinnableDrawable.cs new file mode 100644 index 000000000..6b96dbf35 --- /dev/null +++ b/osu.Game.Rulesets.Sentakki/Skinning/ProxyableSkinnableDrawable.cs @@ -0,0 +1,16 @@ +using System; +using osu.Framework.Graphics; +using osu.Game.Skinning; + +namespace osu.Game.Rulesets.Sentakki.Skinning +{ + public class ProxyableSkinnableDrawable : SkinnableDrawable + { + public override bool RemoveWhenNotAlive => false; + + public ProxyableSkinnableDrawable(ISkinComponent component, Func defaultImplementation = null, ConfineMode confineMode = ConfineMode.NoScaling) + : base(component, defaultImplementation, confineMode) + { + } + } +} diff --git a/osu.Game.Rulesets.Sentakki/Skinning/SentakkiSkinComponent.cs b/osu.Game.Rulesets.Sentakki/Skinning/SentakkiSkinComponent.cs new file mode 100644 index 000000000..6257869f7 --- /dev/null +++ b/osu.Game.Rulesets.Sentakki/Skinning/SentakkiSkinComponent.cs @@ -0,0 +1,16 @@ +using osu.Game.Skinning; + +namespace osu.Game.Rulesets.Sentakki.Skinning +{ + public class SentakkiSkinComponent : GameplaySkinComponent + { + public SentakkiSkinComponent(SentakkiSkinComponents component) + : base(component) + { + } + + protected override string RulesetPrefix => SentakkiRuleset.SHORT_NAME; + + protected override string ComponentName => Component.ToString().ToLowerInvariant(); + } +} diff --git a/osu.Game.Rulesets.Sentakki/Skinning/SentakkiSkinComponents.cs b/osu.Game.Rulesets.Sentakki/Skinning/SentakkiSkinComponents.cs new file mode 100644 index 000000000..8f3d16f49 --- /dev/null +++ b/osu.Game.Rulesets.Sentakki/Skinning/SentakkiSkinComponents.cs @@ -0,0 +1,13 @@ +namespace osu.Game.Rulesets.Sentakki.Skinning +{ + public enum SentakkiSkinComponents + { + Tap, + Hold, + Touch, + TouchHold, + SlideChevron, + SlideFanChevron, + SlideStar, + } +}