2019-08-30 11:59:58 +08:00
|
|
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
|
|
|
// See the LICENCE file in the repository root for full licence text.
|
|
|
|
|
|
|
|
using System;
|
2019-09-03 16:57:34 +08:00
|
|
|
using osu.Framework.Bindables;
|
2019-08-30 11:59:58 +08:00
|
|
|
using osu.Framework.Graphics;
|
|
|
|
using osu.Game.Skinning;
|
|
|
|
using osuTK;
|
|
|
|
|
2020-12-07 11:27:12 +08:00
|
|
|
namespace osu.Game.Rulesets.Osu.Skinning.Legacy
|
2019-08-30 11:59:58 +08:00
|
|
|
{
|
2020-06-22 04:04:10 +08:00
|
|
|
public class OsuLegacySkinTransformer : LegacySkinTransformer
|
2019-08-30 11:59:58 +08:00
|
|
|
{
|
2021-06-09 18:34:42 +08:00
|
|
|
private readonly Lazy<bool> hasHitCircle;
|
2019-08-30 11:59:58 +08:00
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// On osu-stable, hitcircles have 5 pixels of transparent padding on each side to allow for shadows etc.
|
|
|
|
/// Their hittable area is 128px, but the actual circle portion is 118px.
|
|
|
|
/// We must account for some gameplay elements such as slider bodies, where this padding is not present.
|
|
|
|
/// </summary>
|
2019-12-18 14:39:36 +08:00
|
|
|
public const float LEGACY_CIRCLE_RADIUS = 64 - 5;
|
2019-08-30 11:59:58 +08:00
|
|
|
|
2021-06-09 18:34:42 +08:00
|
|
|
public OsuLegacySkinTransformer(ISkin skin)
|
|
|
|
: base(skin)
|
2019-08-30 11:59:58 +08:00
|
|
|
{
|
2021-06-11 17:44:44 +08:00
|
|
|
hasHitCircle = new Lazy<bool>(() => GetTexture("hitcircle") != null);
|
2019-08-30 11:59:58 +08:00
|
|
|
}
|
|
|
|
|
2020-06-22 04:04:10 +08:00
|
|
|
public override Drawable GetDrawableComponent(ISkinComponent component)
|
2019-08-30 11:59:58 +08:00
|
|
|
{
|
2021-05-30 18:15:59 +08:00
|
|
|
if (component is OsuSkinComponent osuComponent)
|
2019-08-30 11:59:58 +08:00
|
|
|
{
|
2021-05-30 18:15:59 +08:00
|
|
|
switch (osuComponent.Component)
|
|
|
|
{
|
|
|
|
case OsuSkinComponents.FollowPoint:
|
2022-03-21 17:29:13 +08:00
|
|
|
return this.GetAnimation(component.LookupName, true, true, true, startAtCurrentTime: false);
|
2019-08-30 13:40:36 +08:00
|
|
|
|
2022-04-23 06:08:53 +08:00
|
|
|
case OsuSkinComponents.SliderScorePoint:
|
|
|
|
return this.GetAnimation(component.LookupName, false, false);
|
|
|
|
|
2021-05-30 18:15:59 +08:00
|
|
|
case OsuSkinComponents.SliderFollowCircle:
|
|
|
|
var followCircle = this.GetAnimation("sliderfollowcircle", true, true, true);
|
|
|
|
if (followCircle != null)
|
|
|
|
// follow circles are 2x the hitcircle resolution in legacy skins (since they are scaled down from >1x
|
|
|
|
followCircle.Scale *= 0.5f;
|
|
|
|
return followCircle;
|
2020-02-07 13:58:29 +08:00
|
|
|
|
2021-05-30 18:15:59 +08:00
|
|
|
case OsuSkinComponents.SliderBall:
|
2021-06-09 18:34:42 +08:00
|
|
|
var sliderBallContent = this.GetAnimation("sliderb", true, true, animationSeparator: "");
|
2019-08-30 11:59:58 +08:00
|
|
|
|
2021-05-30 18:15:59 +08:00
|
|
|
// todo: slider ball has a custom frame delay based on velocity
|
|
|
|
// Math.Max((150 / Velocity) * GameBase.SIXTY_FRAME_TIME, GameBase.SIXTY_FRAME_TIME);
|
2019-08-30 11:59:58 +08:00
|
|
|
|
2021-05-30 18:15:59 +08:00
|
|
|
if (sliderBallContent != null)
|
2021-06-09 18:34:42 +08:00
|
|
|
return new LegacySliderBall(sliderBallContent, this);
|
2019-08-30 11:59:58 +08:00
|
|
|
|
2021-05-30 18:15:59 +08:00
|
|
|
return null;
|
2019-12-17 17:16:25 +08:00
|
|
|
|
2021-05-30 18:15:59 +08:00
|
|
|
case OsuSkinComponents.SliderBody:
|
|
|
|
if (hasHitCircle.Value)
|
|
|
|
return new LegacySliderBody();
|
2019-12-17 17:16:25 +08:00
|
|
|
|
2021-05-30 18:15:59 +08:00
|
|
|
return null;
|
2020-10-02 12:41:22 +08:00
|
|
|
|
2021-05-30 18:15:59 +08:00
|
|
|
case OsuSkinComponents.SliderTailHitCircle:
|
|
|
|
if (hasHitCircle.Value)
|
|
|
|
return new LegacyMainCirclePiece("sliderendcircle", false);
|
2020-10-02 12:41:22 +08:00
|
|
|
|
2021-05-30 18:15:59 +08:00
|
|
|
return null;
|
2020-03-28 12:39:08 +08:00
|
|
|
|
2021-05-30 18:15:59 +08:00
|
|
|
case OsuSkinComponents.SliderHeadHitCircle:
|
|
|
|
if (hasHitCircle.Value)
|
2021-09-01 18:34:57 +08:00
|
|
|
return new LegacySliderHeadHitCircle();
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
case OsuSkinComponents.ReverseArrow:
|
|
|
|
if (hasHitCircle.Value)
|
2021-09-28 03:45:26 +08:00
|
|
|
return new LegacyReverseArrow();
|
2020-03-28 12:39:08 +08:00
|
|
|
|
2021-05-30 18:15:59 +08:00
|
|
|
return null;
|
2019-08-30 11:59:58 +08:00
|
|
|
|
2021-05-30 18:15:59 +08:00
|
|
|
case OsuSkinComponents.HitCircle:
|
|
|
|
if (hasHitCircle.Value)
|
|
|
|
return new LegacyMainCirclePiece();
|
2019-08-30 12:42:29 +08:00
|
|
|
|
2021-05-30 18:15:59 +08:00
|
|
|
return null;
|
2019-08-30 12:42:29 +08:00
|
|
|
|
2021-05-30 18:15:59 +08:00
|
|
|
case OsuSkinComponents.Cursor:
|
2021-06-09 18:34:42 +08:00
|
|
|
if (GetTexture("cursor") != null)
|
|
|
|
return new LegacyCursor(this);
|
2019-08-30 12:42:29 +08:00
|
|
|
|
2021-05-30 18:15:59 +08:00
|
|
|
return null;
|
2019-09-09 16:53:51 +08:00
|
|
|
|
2021-05-30 18:15:59 +08:00
|
|
|
case OsuSkinComponents.CursorTrail:
|
2021-06-09 18:34:42 +08:00
|
|
|
if (GetTexture("cursortrail") != null)
|
|
|
|
return new LegacyCursorTrail(this);
|
2019-09-09 16:53:51 +08:00
|
|
|
|
2021-03-07 07:18:31 +08:00
|
|
|
return null;
|
|
|
|
|
2021-09-10 06:29:05 +08:00
|
|
|
case OsuSkinComponents.CursorParticles:
|
2021-09-13 05:45:50 +08:00
|
|
|
if (GetTexture("star2") != null)
|
|
|
|
return new LegacyCursorParticles();
|
|
|
|
|
|
|
|
return null;
|
2021-09-10 06:29:05 +08:00
|
|
|
|
2021-05-30 18:15:59 +08:00
|
|
|
case OsuSkinComponents.HitCircleText:
|
|
|
|
if (!this.HasFont(LegacyFont.HitCircle))
|
|
|
|
return null;
|
2020-07-29 15:25:10 +08:00
|
|
|
|
2021-05-30 18:15:59 +08:00
|
|
|
return new LegacySpriteText(LegacyFont.HitCircle)
|
|
|
|
{
|
|
|
|
// stable applies a blanket 0.8x scale to hitcircle fonts
|
|
|
|
Scale = new Vector2(0.8f),
|
|
|
|
};
|
2020-07-31 23:05:04 +08:00
|
|
|
|
2021-05-30 18:15:59 +08:00
|
|
|
case OsuSkinComponents.SpinnerBody:
|
2021-06-09 18:34:42 +08:00
|
|
|
bool hasBackground = GetTexture("spinner-background") != null;
|
2020-07-29 15:55:42 +08:00
|
|
|
|
2021-06-09 18:34:42 +08:00
|
|
|
if (GetTexture("spinner-top") != null && !hasBackground)
|
2021-05-30 18:15:59 +08:00
|
|
|
return new LegacyNewStyleSpinner();
|
|
|
|
else if (hasBackground)
|
|
|
|
return new LegacyOldStyleSpinner();
|
2019-08-30 11:59:58 +08:00
|
|
|
|
2021-05-30 18:15:59 +08:00
|
|
|
return null;
|
2021-09-16 18:35:15 +08:00
|
|
|
|
|
|
|
case OsuSkinComponents.ApproachCircle:
|
|
|
|
return new LegacyApproachCircle();
|
2022-04-23 06:08:53 +08:00
|
|
|
|
|
|
|
default:
|
|
|
|
throw new UnsupportedSkinComponentException(component);
|
2021-05-30 18:15:59 +08:00
|
|
|
}
|
2021-05-27 10:15:29 +08:00
|
|
|
}
|
2021-05-30 18:15:59 +08:00
|
|
|
|
2021-06-11 17:44:44 +08:00
|
|
|
return base.GetDrawableComponent(component);
|
2019-08-30 11:59:58 +08:00
|
|
|
}
|
|
|
|
|
2020-06-22 04:04:10 +08:00
|
|
|
public override IBindable<TValue> GetConfig<TLookup, TValue>(TLookup lookup)
|
2019-09-02 11:36:08 +08:00
|
|
|
{
|
2019-09-03 16:57:34 +08:00
|
|
|
switch (lookup)
|
|
|
|
{
|
|
|
|
case OsuSkinColour colour:
|
2021-06-11 17:44:44 +08:00
|
|
|
return base.GetConfig<SkinCustomColourLookup, TValue>(new SkinCustomColourLookup(colour));
|
2019-09-03 16:57:34 +08:00
|
|
|
|
|
|
|
case OsuSkinConfiguration osuLookup:
|
|
|
|
switch (osuLookup)
|
|
|
|
{
|
|
|
|
case OsuSkinConfiguration.SliderPathRadius:
|
|
|
|
if (hasHitCircle.Value)
|
2019-12-18 14:39:36 +08:00
|
|
|
return SkinUtils.As<TValue>(new BindableFloat(LEGACY_CIRCLE_RADIUS));
|
2019-09-03 16:57:34 +08:00
|
|
|
|
|
|
|
break;
|
2020-04-04 16:13:25 +08:00
|
|
|
|
|
|
|
case OsuSkinConfiguration.HitCircleOverlayAboveNumber:
|
2020-04-05 13:13:06 +08:00
|
|
|
// See https://osu.ppy.sh/help/wiki/Skinning/skin.ini#%5Bgeneral%5D
|
|
|
|
// HitCircleOverlayAboveNumer (with typo) should still be supported for now.
|
2021-06-11 17:44:44 +08:00
|
|
|
return base.GetConfig<OsuSkinConfiguration, TValue>(OsuSkinConfiguration.HitCircleOverlayAboveNumber) ??
|
|
|
|
base.GetConfig<OsuSkinConfiguration, TValue>(OsuSkinConfiguration.HitCircleOverlayAboveNumer);
|
2019-09-03 16:57:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
2019-09-02 11:36:08 +08:00
|
|
|
|
2021-06-11 17:44:44 +08:00
|
|
|
return base.GetConfig<TLookup, TValue>(lookup);
|
2019-09-02 11:36:08 +08:00
|
|
|
}
|
2019-08-30 11:59:58 +08:00
|
|
|
}
|
|
|
|
}
|