// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using System; using System.Linq; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Extensions.IEnumerableExtensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; using osu.Framework.Screens; using osu.Game.Graphics; using osu.Game.Graphics.Containers; using osu.Game.Online.API; using osuTK; using osuTK.Graphics; using osu.Game.Overlays; using osu.Game.Users; namespace osu.Game.Screens.Menu { public class Disclaimer : OsuScreen { private Intro intro; private SpriteIcon icon; private Color4 iconColour; private LinkFlowContainer textFlow; private LinkFlowContainer supportFlow; public override bool HideOverlaysOnEnter => true; public override OverlayActivation InitialOverlayActivationMode => OverlayActivation.Disabled; public override bool CursorVisible => false; private Drawable heart; private const float icon_y = -85; private const float icon_size = 30; private readonly Bindable currentUser = new Bindable(); public Disclaimer() { ValidForResume = false; } [BackgroundDependencyLoader] private void load(OsuColour colours, IAPIProvider api) { InternalChildren = new Drawable[] { icon = new SpriteIcon { Anchor = Anchor.Centre, Origin = Anchor.Centre, Icon = FontAwesome.fa_warning, Size = new Vector2(icon_size), Y = icon_y, }, new FillFlowContainer { RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, Direction = FillDirection.Vertical, Y = icon_y + icon_size, Anchor = Anchor.Centre, Origin = Anchor.TopCentre, Children = new Drawable[] { textFlow = new LinkFlowContainer { RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, TextAnchor = Anchor.TopCentre, Anchor = Anchor.TopCentre, Origin = Anchor.TopCentre, Spacing = new Vector2(0, 2), }, supportFlow = new LinkFlowContainer { RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, TextAnchor = Anchor.TopCentre, Anchor = Anchor.TopCentre, Origin = Anchor.TopCentre, Alpha = 0, Spacing = new Vector2(0, 2), }, } } }; textFlow.AddText("This is an ", t => t.Font = t.Font.With(Typeface.Exo, 30, FontWeight.Light)); textFlow.AddText("early development build", t => t.Font = t.Font.With(Typeface.Exo, 30, FontWeight.SemiBold)); textFlow.AddParagraph("Things may not work as expected", t => t.Font = t.Font.With(size: 20)); textFlow.NewParagraph(); Action format = t => t.Font = OsuFont.GetFont(size: 15, weight: FontWeight.SemiBold); textFlow.AddParagraph("Detailed bug reports are welcomed via github issues.", format); textFlow.NewParagraph(); textFlow.AddText("Visit ", format); textFlow.AddLink("discord.gg/ppy", "https://discord.gg/ppy", creationParameters: format); textFlow.AddText(" to help out or follow progress!", format); textFlow.NewParagraph(); textFlow.NewParagraph(); textFlow.NewParagraph(); iconColour = colours.Yellow; currentUser.BindTo(api.LocalUser); currentUser.BindValueChanged(e => { supportFlow.Children.ForEach(d => d.FadeOut().Expire()); if (e.NewValue.IsSupporter) { supportFlow.AddText("Thank you for supporting osu!", format); } else { supportFlow.AddText("Consider becoming an ", format); supportFlow.AddLink("osu!supporter", "https://osu.ppy.sh/home/support", creationParameters: format); supportFlow.AddText(" to help support the game", format); } heart = supportFlow.AddIcon(FontAwesome.fa_heart, t => { t.Padding = new MarginPadding { Left = 5 }; t.Font = t.Font.With(size: 12); t.Origin = Anchor.Centre; t.Colour = colours.Pink; }).First(); if (IsLoaded) animateHeart(); if (supportFlow.IsPresent) supportFlow.FadeInFromZero(500); }, true); } private void animateHeart() { heart.FlashColour(Color4.White, 750, Easing.OutQuint).Loop(); } protected override void LoadComplete() { base.LoadComplete(); LoadComponentAsync(intro = new Intro()); } public override void OnEntering(IScreen last) { base.OnEntering(last); icon.Delay(1000).FadeColour(iconColour, 200, Easing.OutQuint); icon.Delay(1000) .MoveToY(icon_y * 1.1f, 160, Easing.OutCirc) .RotateTo(-10, 160, Easing.OutCirc) .Then() .MoveToY(icon_y, 160, Easing.InCirc) .RotateTo(0, 160, Easing.InCirc); supportFlow.FadeOut().Delay(2000).FadeIn(500); animateHeart(); this .FadeInFromZero(500) .Then(5500) .FadeOut(250) .ScaleTo(0.9f, 250, Easing.InQuint) .Finally(d => this.Push(intro)); } } }