2019-09-03 08:57:34 +00:00
|
|
|
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
2019-01-24 08:43:03 +00:00
|
|
|
|
// See the LICENCE file in the repository root for full licence text.
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2019-09-05 14:24:13 +00:00
|
|
|
|
using System.Collections.Generic;
|
2021-05-11 05:12:28 +00:00
|
|
|
|
using System.Linq;
|
2021-05-12 20:18:15 +00:00
|
|
|
|
using JetBrains.Annotations;
|
2018-02-23 03:35:25 +00:00
|
|
|
|
using osu.Framework.Audio.Sample;
|
2019-09-03 08:57:34 +00:00
|
|
|
|
using osu.Framework.Bindables;
|
2018-02-22 08:16:48 +00:00
|
|
|
|
using osu.Framework.Graphics;
|
2018-03-20 07:28:39 +00:00
|
|
|
|
using osu.Framework.Graphics.Textures;
|
2019-08-23 11:32:43 +00:00
|
|
|
|
using osu.Game.Audio;
|
2021-05-05 04:11:45 +00:00
|
|
|
|
using osu.Game.Beatmaps.Formats;
|
2021-05-11 05:12:28 +00:00
|
|
|
|
using osu.Game.Extensions;
|
2021-05-11 08:00:24 +00:00
|
|
|
|
using osu.Game.IO;
|
2021-05-11 05:12:28 +00:00
|
|
|
|
using osu.Game.Screens.Play.HUD;
|
2021-05-18 06:50:40 +00:00
|
|
|
|
using osu.Game.Screens.Play.HUD.HitErrorMeters;
|
2021-05-11 05:12:28 +00:00
|
|
|
|
using osuTK;
|
2019-09-05 14:24:13 +00:00
|
|
|
|
using osuTK.Graphics;
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2018-02-22 08:16:48 +00:00
|
|
|
|
namespace osu.Game.Skinning
|
|
|
|
|
{
|
2022-09-17 15:14:49 +00:00
|
|
|
|
public class TrianglesSkin : Skin
|
2018-02-22 08:16:48 +00:00
|
|
|
|
{
|
2021-11-29 08:15:26 +00:00
|
|
|
|
public static SkinInfo CreateInfo() => new SkinInfo
|
|
|
|
|
{
|
2022-09-17 15:14:49 +00:00
|
|
|
|
ID = osu.Game.Skinning.SkinInfo.TRIANGLES_SKIN,
|
2022-09-15 06:49:15 +00:00
|
|
|
|
Name = "osu! \"triangles\" (2017)",
|
2021-11-29 08:15:26 +00:00
|
|
|
|
Creator = "team osu!",
|
|
|
|
|
Protected = true,
|
2022-09-17 15:14:49 +00:00
|
|
|
|
InstantiationInfo = typeof(TrianglesSkin).GetInvariantInstantiationInfo()
|
2021-11-29 08:15:26 +00:00
|
|
|
|
};
|
|
|
|
|
|
2021-05-27 02:48:48 +00:00
|
|
|
|
private readonly IStorageResourceProvider resources;
|
|
|
|
|
|
2022-09-17 15:14:49 +00:00
|
|
|
|
public TrianglesSkin(IStorageResourceProvider resources)
|
2021-11-29 08:15:26 +00:00
|
|
|
|
: this(CreateInfo(), resources)
|
2018-02-22 08:16:48 +00:00
|
|
|
|
{
|
|
|
|
|
}
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2021-05-12 20:18:15 +00:00
|
|
|
|
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedWithFixedConstructorSignature)]
|
2022-09-17 15:14:49 +00:00
|
|
|
|
public TrianglesSkin(SkinInfo skin, IStorageResourceProvider resources)
|
2021-05-11 08:00:24 +00:00
|
|
|
|
: base(skin, resources)
|
2018-02-22 08:16:48 +00:00
|
|
|
|
{
|
2021-05-27 02:48:48 +00:00
|
|
|
|
this.resources = resources;
|
2018-02-22 08:16:48 +00:00
|
|
|
|
}
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2022-11-09 04:44:59 +00:00
|
|
|
|
public override Texture? GetTexture(string componentName, WrapMode wrapModeS, WrapMode wrapModeT) => Textures?.Get(componentName, wrapModeS, wrapModeT);
|
2018-04-13 09:19:50 +00:00
|
|
|
|
|
2022-11-09 04:44:59 +00:00
|
|
|
|
public override ISample? GetSample(ISampleInfo sampleInfo)
|
2021-05-27 02:48:48 +00:00
|
|
|
|
{
|
2021-10-27 04:04:41 +00:00
|
|
|
|
foreach (string lookup in sampleInfo.LookupNames)
|
2021-05-27 02:48:48 +00:00
|
|
|
|
{
|
2022-08-08 04:31:57 +00:00
|
|
|
|
var sample = Samples?.Get(lookup) ?? resources.AudioManager?.Samples.Get(lookup);
|
2021-05-27 02:48:48 +00:00
|
|
|
|
if (sample != null)
|
|
|
|
|
return sample;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
2019-09-03 08:57:34 +00:00
|
|
|
|
|
2022-11-09 07:04:56 +00:00
|
|
|
|
public override Drawable? GetDrawableComponent(ISkinComponentLookup lookup)
|
2021-05-11 05:12:28 +00:00
|
|
|
|
{
|
2022-11-13 03:46:20 +00:00
|
|
|
|
// Temporary until default skin has a valid hit lighting.
|
|
|
|
|
if ((lookup as SkinnableSprite.SpriteComponentLookup)?.LookupName == @"lighting") return Drawable.Empty();
|
|
|
|
|
|
2022-11-09 05:11:41 +00:00
|
|
|
|
if (base.GetDrawableComponent(lookup) is Drawable c)
|
2021-05-11 09:55:45 +00:00
|
|
|
|
return c;
|
|
|
|
|
|
2022-11-09 05:11:41 +00:00
|
|
|
|
switch (lookup)
|
2021-05-11 05:12:28 +00:00
|
|
|
|
{
|
2023-02-16 06:33:56 +00:00
|
|
|
|
case SkinComponentsContainerLookup containerLookup:
|
2023-02-17 09:22:10 +00:00
|
|
|
|
// Only handle global level defaults for now.
|
|
|
|
|
if (containerLookup.Ruleset != null)
|
|
|
|
|
return null;
|
|
|
|
|
|
2023-02-16 06:33:56 +00:00
|
|
|
|
switch (containerLookup.Target)
|
2021-05-11 05:12:28 +00:00
|
|
|
|
{
|
2023-02-15 09:31:55 +00:00
|
|
|
|
case SkinComponentsContainerLookup.TargetArea.SongSelect:
|
2023-02-15 08:24:34 +00:00
|
|
|
|
var songSelectComponents = new DefaultSkinComponentsContainer(_ =>
|
2022-03-07 14:26:27 +00:00
|
|
|
|
{
|
|
|
|
|
// do stuff when we need to.
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return songSelectComponents;
|
|
|
|
|
|
2023-02-15 09:31:55 +00:00
|
|
|
|
case SkinComponentsContainerLookup.TargetArea.MainHUDComponents:
|
2023-02-15 08:24:34 +00:00
|
|
|
|
var skinnableTargetWrapper = new DefaultSkinComponentsContainer(container =>
|
2021-05-11 05:12:28 +00:00
|
|
|
|
{
|
|
|
|
|
var score = container.OfType<DefaultScoreCounter>().FirstOrDefault();
|
|
|
|
|
var accuracy = container.OfType<DefaultAccuracyCounter>().FirstOrDefault();
|
|
|
|
|
var combo = container.OfType<DefaultComboCounter>().FirstOrDefault();
|
2021-10-04 11:34:08 +00:00
|
|
|
|
var ppCounter = container.OfType<PerformancePointsCounter>().FirstOrDefault();
|
2023-06-14 19:15:12 +00:00
|
|
|
|
var songProgress = container.OfType<DefaultSongProgress>().FirstOrDefault();
|
|
|
|
|
var keyCounter = container.OfType<DefaultKeyCounterDisplay>().FirstOrDefault();
|
2021-05-11 05:12:28 +00:00
|
|
|
|
|
|
|
|
|
if (score != null)
|
|
|
|
|
{
|
|
|
|
|
score.Anchor = Anchor.TopCentre;
|
|
|
|
|
score.Origin = Anchor.TopCentre;
|
|
|
|
|
|
|
|
|
|
// elements default to beneath the health bar
|
|
|
|
|
const float vertical_offset = 30;
|
|
|
|
|
|
|
|
|
|
const float horizontal_padding = 20;
|
|
|
|
|
|
|
|
|
|
score.Position = new Vector2(0, vertical_offset);
|
|
|
|
|
|
2021-09-30 08:55:00 +00:00
|
|
|
|
if (ppCounter != null)
|
|
|
|
|
{
|
2021-10-05 06:23:34 +00:00
|
|
|
|
ppCounter.Y = score.Position.Y + ppCounter.ScreenSpaceDeltaToParentSpace(score.ScreenSpaceDrawQuad.Size).Y - 4;
|
2021-09-30 08:55:00 +00:00
|
|
|
|
ppCounter.Origin = Anchor.TopCentre;
|
|
|
|
|
ppCounter.Anchor = Anchor.TopCentre;
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-11 05:12:28 +00:00
|
|
|
|
if (accuracy != null)
|
|
|
|
|
{
|
|
|
|
|
accuracy.Position = new Vector2(-accuracy.ScreenSpaceDeltaToParentSpace(score.ScreenSpaceDrawQuad.Size).X / 2 - horizontal_padding, vertical_offset + 5);
|
|
|
|
|
accuracy.Origin = Anchor.TopRight;
|
|
|
|
|
accuracy.Anchor = Anchor.TopCentre;
|
|
|
|
|
|
2022-07-02 03:50:28 +00:00
|
|
|
|
if (combo != null)
|
|
|
|
|
{
|
|
|
|
|
combo.Position = new Vector2(accuracy.ScreenSpaceDeltaToParentSpace(score.ScreenSpaceDrawQuad.Size).X / 2 + horizontal_padding, vertical_offset + 5);
|
|
|
|
|
combo.Anchor = Anchor.TopCentre;
|
|
|
|
|
}
|
2021-05-11 05:12:28 +00:00
|
|
|
|
}
|
2021-05-18 06:50:40 +00:00
|
|
|
|
|
|
|
|
|
var hitError = container.OfType<HitErrorMeter>().FirstOrDefault();
|
|
|
|
|
|
|
|
|
|
if (hitError != null)
|
|
|
|
|
{
|
|
|
|
|
hitError.Anchor = Anchor.CentreLeft;
|
|
|
|
|
hitError.Origin = Anchor.CentreLeft;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var hitError2 = container.OfType<HitErrorMeter>().LastOrDefault();
|
|
|
|
|
|
|
|
|
|
if (hitError2 != null)
|
|
|
|
|
{
|
|
|
|
|
hitError2.Anchor = Anchor.CentreRight;
|
|
|
|
|
hitError2.Scale = new Vector2(-1, 1);
|
2021-05-19 16:59:30 +00:00
|
|
|
|
// origin flipped to match scale above.
|
|
|
|
|
hitError2.Origin = Anchor.CentreLeft;
|
2021-05-18 06:50:40 +00:00
|
|
|
|
}
|
2021-05-11 05:12:28 +00:00
|
|
|
|
}
|
2023-06-14 19:15:12 +00:00
|
|
|
|
|
|
|
|
|
if (songProgress != null && keyCounter != null)
|
|
|
|
|
{
|
2023-06-26 07:04:16 +00:00
|
|
|
|
const float padding = 10;
|
|
|
|
|
|
2023-06-26 07:20:51 +00:00
|
|
|
|
// Hard to find this at runtime, so taken from the most expanded state during replay.
|
|
|
|
|
const float song_progress_offset_height = 73;
|
|
|
|
|
|
2023-06-14 19:15:12 +00:00
|
|
|
|
keyCounter.Anchor = Anchor.BottomRight;
|
|
|
|
|
keyCounter.Origin = Anchor.BottomRight;
|
2023-06-26 07:20:51 +00:00
|
|
|
|
keyCounter.Position = new Vector2(-padding, -(song_progress_offset_height + padding));
|
2023-06-14 19:15:12 +00:00
|
|
|
|
}
|
2021-05-11 05:12:28 +00:00
|
|
|
|
})
|
|
|
|
|
{
|
2021-05-18 09:37:23 +00:00
|
|
|
|
Children = new Drawable[]
|
2021-05-11 05:12:28 +00:00
|
|
|
|
{
|
2021-05-18 09:37:23 +00:00
|
|
|
|
new DefaultComboCounter(),
|
|
|
|
|
new DefaultScoreCounter(),
|
|
|
|
|
new DefaultAccuracyCounter(),
|
|
|
|
|
new DefaultHealthDisplay(),
|
2022-07-27 07:19:21 +00:00
|
|
|
|
new DefaultSongProgress(),
|
2023-06-14 19:15:12 +00:00
|
|
|
|
new DefaultKeyCounterDisplay(),
|
2021-05-31 06:23:04 +00:00
|
|
|
|
new BarHitErrorMeter(),
|
|
|
|
|
new BarHitErrorMeter(),
|
2021-10-04 11:34:08 +00:00
|
|
|
|
new PerformancePointsCounter()
|
2021-05-11 05:12:28 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return skinnableTargetWrapper;
|
|
|
|
|
}
|
|
|
|
|
|
2022-04-22 22:08:53 +00:00
|
|
|
|
return null;
|
2021-05-11 05:12:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-05-13 04:02:55 +00:00
|
|
|
|
return null;
|
2021-05-11 05:12:28 +00:00
|
|
|
|
}
|
2019-09-03 08:57:34 +00:00
|
|
|
|
|
2022-11-09 04:44:59 +00:00
|
|
|
|
public override IBindable<TValue>? GetConfig<TLookup, TValue>(TLookup lookup)
|
2019-09-05 14:24:13 +00:00
|
|
|
|
{
|
2021-05-05 04:11:45 +00:00
|
|
|
|
// todo: this code is pulled from LegacySkin and should not exist.
|
|
|
|
|
// will likely change based on how databased storage of skin configuration goes.
|
2019-09-05 14:24:13 +00:00
|
|
|
|
switch (lookup)
|
|
|
|
|
{
|
2020-02-07 05:58:07 +00:00
|
|
|
|
case GlobalSkinColours global:
|
2019-09-05 14:24:13 +00:00
|
|
|
|
switch (global)
|
|
|
|
|
{
|
2020-02-07 05:58:07 +00:00
|
|
|
|
case GlobalSkinColours.ComboColours:
|
2023-09-06 08:37:17 +00:00
|
|
|
|
{
|
|
|
|
|
LogLookupDebug(this, lookup, LookupDebugType.Hit);
|
2022-11-09 04:44:59 +00:00
|
|
|
|
return SkinUtils.As<TValue>(new Bindable<IReadOnlyList<Color4>?>(Configuration.ComboColours));
|
2023-09-06 08:37:17 +00:00
|
|
|
|
}
|
2019-09-05 14:24:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
2021-05-05 04:11:45 +00:00
|
|
|
|
|
|
|
|
|
case SkinComboColourLookup comboColour:
|
2023-09-06 08:37:17 +00:00
|
|
|
|
LogLookupDebug(this, lookup, LookupDebugType.Hit);
|
2021-05-05 04:11:45 +00:00
|
|
|
|
return SkinUtils.As<TValue>(new Bindable<Color4>(getComboColour(Configuration, comboColour.ColourIndex)));
|
2019-09-05 14:24:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-09-06 08:37:17 +00:00
|
|
|
|
LogLookupDebug(this, lookup, LookupDebugType.Miss);
|
2019-09-05 14:24:13 +00:00
|
|
|
|
return null;
|
|
|
|
|
}
|
2021-05-05 04:11:45 +00:00
|
|
|
|
|
|
|
|
|
private static Color4 getComboColour(IHasComboColours source, int colourIndex)
|
2023-08-16 10:34:37 +00:00
|
|
|
|
=> source.ComboColours![colourIndex % source.ComboColours.Count];
|
2018-02-22 08:16:48 +00:00
|
|
|
|
}
|
|
|
|
|
}
|