Exemple #1
0
        private void load(OsuColour colours, IAPIProvider api)
        {
            InternalChildren = new Drawable[]
            {
                icon = new SpriteIcon
                {
                    Anchor = Anchor.Centre,
                    Origin = Anchor.Centre,
                    Icon   = FontAwesome.Solid.Flask,
                    Size   = new Vector2(icon_size),
                    Y      = icon_y,
                },
                fill = new FillFlowContainer
                {
                    RelativeSizeAxes = Axes.X,
                    AutoSizeAxes     = Axes.Y,
                    Direction        = FillDirection.Vertical,
                    Y        = icon_y,
                    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),
                            LayoutDuration   = 2000,
                            LayoutEasing     = Easing.OutQuint
                        },
                        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 project is an ongoing ", t => t.Font = t.Font.With(Typeface.Torus, 30, FontWeight.Light));
            textFlow.AddText("work in progress", t => t.Font            = t.Font.With(Typeface.Torus, 30, FontWeight.SemiBold));

            textFlow.NewParagraph();
Exemple #2
0
        private void load(OsuColour colours, IAPIProvider api)
        {
            InternalChildren = new Drawable[]
            {
                icon = new SpriteIcon
                {
                    Anchor = Anchor.Centre,
                    Origin = Anchor.Centre,
                    Icon   = FontAwesome.Solid.ExclamationTriangle,
                    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();
        public MultiplayerConsent()
        {
            LinkFlowContainer textFlow;

            InternalChildren = new Drawable[]
            {
                new FillFlowContainer
                {
                    RelativeSizeAxes = Axes.X,
                    AutoSizeAxes     = Axes.Y,
                    Direction        = FillDirection.Vertical,
                    Anchor           = Anchor.Centre,
                    Origin           = Anchor.Centre,
                    Spacing          = new Vector2(0, 20),
                    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)
                        },
                        new TriangleButton {
                            Text   = "I Understand",
                            Width  = 200,
                            Anchor = Anchor.TopCentre,
                            Origin = Anchor.TopCentre,
                            Action = () =>
                            {
                                config.Set(OsuSetting.MultiplayerConsentAcknowledged, true);
                                this.Exit();
                            }
                        }
                    }
                }
            };

            textFlow.AddText("Before you start...", t => t.Font = t.Font.With(Typeface.Torus, 30, FontWeight.Bold));
            textFlow.NewParagraph();

            textFlow.AddText(
                "Please do not use this mod while accessing public game servers with unsuspecting players.\n" +
                "This is meant for single player and/or matched play with consenting participants. Thank you!",
                t => t.Font = t.Font.With(Typeface.Torus, 24, FontWeight.SemiBold)
                );
        }
Exemple #4
0
        private void loadUser()
        {
            LoadComponentAsync(new UserCoverBackground(user)
            {
                RelativeSizeAxes = Axes.Both,
                Anchor           = Anchor.Centre,
                Origin           = Anchor.Centre,
                FillMode         = FillMode.Fill,
                OnLoadComplete   = d => d.FadeInFromZero(200),
                Depth            = float.MaxValue,
            }, coverContainer.Add);

            if (user.IsSupporter)
            {
                SupporterTag.Show();
            }

            if (!string.IsNullOrEmpty(user.Colour))
            {
                colourBar.Colour = OsuColour.FromHex(user.Colour);
                colourBar.Show();
            }

            void boldItalic(SpriteText t) => t.Font = @"Exo2.0-BoldItalic";
            void lightText(SpriteText t) => t.Alpha = 0.8f;

            OsuSpriteText createScoreText(string text) => new OsuSpriteText
            {
                TextSize = 14,
                Text     = text
            };

            OsuSpriteText createScoreNumberText(string text) => new OsuSpriteText
            {
                TextSize = 14,
                Font     = @"Exo2.0-Bold",
                Anchor   = Anchor.TopRight,
                Origin   = Anchor.TopRight,
                Text     = text
            };

            if (user.Country != null)
            {
                infoTextLeft.AddText("From ", lightText);
                infoTextLeft.AddText(user.Country.FullName, boldItalic);
                countryFlag.Country = user.Country;
            }

            infoTextLeft.NewParagraph();

            if (user.JoinDate.ToUniversalTime().Year < 2008)
            {
                infoTextLeft.AddText(new DrawableJoinDate(user.JoinDate), lightText);
            }
            else
            {
                infoTextLeft.AddText("Joined ", lightText);
                infoTextLeft.AddText(new DrawableJoinDate(user.JoinDate), boldItalic);
            }

            infoTextLeft.NewLine();
            infoTextLeft.AddText("Last seen ", lightText);
            infoTextLeft.AddText(new DrawableDate(user.LastVisit), boldItalic);
            infoTextLeft.NewParagraph();

            if (user.PlayStyle?.Length > 0)
            {
                infoTextLeft.AddText("Plays with ", lightText);
                infoTextLeft.AddText(string.Join(", ", user.PlayStyle), boldItalic);
            }

            infoTextLeft.NewLine();
            infoTextLeft.AddText("Contributed ", lightText);
            infoTextLeft.AddLink($@"{user.PostCount} forum posts", url: $"https://osu.ppy.sh/users/{user.Id}/posts", creationParameters: boldItalic);

            string websiteWithoutProtcol = user.Website;

            if (!string.IsNullOrEmpty(websiteWithoutProtcol))
            {
                int protocolIndex = websiteWithoutProtcol.IndexOf("//", StringComparison.Ordinal);
                if (protocolIndex >= 0)
                {
                    websiteWithoutProtcol = websiteWithoutProtcol.Substring(protocolIndex + 2);
                }
            }

            tryAddInfoRightLine(FontAwesome.fa_map_marker, user.Location);
            tryAddInfoRightLine(FontAwesome.fa_heart_o, user.Interests);
            tryAddInfoRightLine(FontAwesome.fa_suitcase, user.Occupation);
            infoTextRight.NewParagraph();
            if (!string.IsNullOrEmpty(user.Twitter))
            {
                tryAddInfoRightLine(FontAwesome.fa_twitter, "@" + user.Twitter, $@"https://twitter.com/{user.Twitter}");
            }
            tryAddInfoRightLine(FontAwesome.fa_gamepad, user.Discord);
            tryAddInfoRightLine(FontAwesome.fa_skype, user.Skype, @"skype:" + user.Skype + @"?chat");
            tryAddInfoRightLine(FontAwesome.fa_lastfm, user.Lastfm, $@"https://last.fm/users/{user.Lastfm}");
            tryAddInfoRightLine(FontAwesome.fa_globe, websiteWithoutProtcol, user.Website);

            if (user.Statistics != null)
            {
                levelBadge.Show();
                levelText.Text = user.Statistics.Level.Current.ToString();

                scoreText.Add(createScoreText("Ranked Score"));
                scoreNumberText.Add(createScoreNumberText(user.Statistics.RankedScore.ToString(@"#,0")));
                scoreText.Add(createScoreText("Accuracy"));
                scoreNumberText.Add(createScoreNumberText($"{user.Statistics.Accuracy:0.##}%"));
                scoreText.Add(createScoreText("Play Count"));
                scoreNumberText.Add(createScoreNumberText(user.Statistics.PlayCount.ToString(@"#,0")));
                scoreText.Add(createScoreText("Total Score"));
                scoreNumberText.Add(createScoreNumberText(user.Statistics.TotalScore.ToString(@"#,0")));
                scoreText.Add(createScoreText("Total Hits"));
                scoreNumberText.Add(createScoreNumberText(user.Statistics.TotalHits.ToString(@"#,0")));
                scoreText.Add(createScoreText("Max Combo"));
                scoreNumberText.Add(createScoreNumberText(user.Statistics.MaxCombo.ToString(@"#,0")));
                scoreText.Add(createScoreText("Replays Watched by Others"));
                scoreNumberText.Add(createScoreNumberText(user.Statistics.ReplaysWatched.ToString(@"#,0")));

                gradeSSPlus.DisplayCount = user.Statistics.GradesCount.SSPlus;
                gradeSSPlus.Show();
                gradeSS.DisplayCount = user.Statistics.GradesCount.SS;
                gradeSS.Show();
                gradeSPlus.DisplayCount = user.Statistics.GradesCount.SPlus;
                gradeSPlus.Show();
                gradeS.DisplayCount = user.Statistics.GradesCount.S;
                gradeS.Show();
                gradeA.DisplayCount = user.Statistics.GradesCount.A;
                gradeA.Show();

                rankGraph.User.Value = user;
            }

            badgeContainer.ShowBadges(user.Badges);
        }
Exemple #5
0
        private void load(OsuColour colours, APIAccess api)
        {
            InternalChildren = new Drawable[]
            {
                icon = new SpriteIcon
                {
                    Anchor = Anchor.Centre,
                    Origin = Anchor.Centre,
                    Icon   = FontAwesome.fa_warning,
                    Size   = new Vector2(30),
                    Y      = icon_y,
                },
                textFlow = new LinkFlowContainer
                {
                    RelativeSizeAxes = Axes.X,
                    AutoSizeAxes     = Axes.Y,
                    Padding          = new MarginPadding(50),
                    TextAnchor       = Anchor.TopCentre,
                    Y       = -110,
                    Anchor  = Anchor.Centre,
                    Origin  = Anchor.TopCentre,
                    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 <SpriteText> 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();

            supporterDrawables.AddRange(textFlow.AddText("Consider becoming an ", format));
            supporterDrawables.AddRange(textFlow.AddLink("osu!supporter", "https://osu.ppy.sh/home/support", creationParameters: format));
            supporterDrawables.AddRange(textFlow.AddText(" to help support the game", format));

            supporterDrawables.Add(heart = textFlow.AddIcon(FontAwesome.fa_heart, t =>
            {
                t.Padding = new MarginPadding {
                    Left = 5
                };
                t.Font   = t.Font.With(size: 12);
                t.Colour = colours.Pink;
                t.Origin = Anchor.Centre;
            }).First());

            iconColour = colours.Yellow;

            currentUser.BindTo(api.LocalUser);
            currentUser.BindValueChanged(e =>
            {
                if (e.NewValue.IsSupporter)
                {
                    supporterDrawables.ForEach(d => d.FadeOut(500, Easing.OutQuint).Expire());
                }
            }, true);
        }
Exemple #6
0
        private void load(OsuColour colours, IAPIProvider api)
        {
            InternalChildren = new Drawable[]
            {
                icon = new SpriteIcon
                {
                    Anchor = Anchor.Centre,
                    Origin = Anchor.Centre,
                    Icon   = FontAwesome.Solid.ExclamationTriangle,
                    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 <SpriteText> 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.Solid.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);
        }
Exemple #7
0
        private void load(OsuColour colours, IAPIProvider api)
        {
            InternalChildren = new Drawable[]
            {
                icon = new SpriteIcon
                {
                    Anchor = Anchor.Centre,
                    Origin = Anchor.Centre,
                    Icon   = FontAwesome.Solid.ExclamationTriangle,
                    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("这是一个 ", t => t.Font     = t.Font.With(Typeface.Exo, 30, FontWeight.Light));
            textFlow.AddText("非常早期的构建版本", t => t.Font = t.Font.With(Typeface.Exo, 30, FontWeight.SemiBold));

            textFlow.AddParagraph("一些事情可能不会按预期工作", t => t.Font = t.Font.With(size: 20));
            textFlow.NewParagraph();

            Action <SpriteText> format = t => t.Font = OsuFont.GetFont(size: 15, weight: FontWeight.SemiBold);

            textFlow.AddParagraph("欢迎来到github的issues页进行反馈", format);
            textFlow.NewParagraph();

            textFlow.AddText("访问 ", format);
            textFlow.AddLink("discord.gg/ppy", "https://discord.gg/ppy", creationParameters: format);
            textFlow.AddText("来一起帮助开发或获取最新进度!", 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("感谢支持osu!", format);
                }
                else
                {
                    supportFlow.AddText("考虑成为一名 ", format);
                    supportFlow.AddLink("osu!supporter", "https://osu.ppy.sh/home/support", creationParameters: format);
                    supportFlow.AddText("来帮助我们维护这个游戏", format);
                }

                heart = supportFlow.AddIcon(FontAwesome.Solid.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);
        }
Exemple #8
0
        private void load(OsuColour colours)
        {
            Children = new Drawable[]
            {
                icon = new SpriteIcon
                {
                    Anchor = Anchor.Centre,
                    Origin = Anchor.Centre,
                    Icon   = FontAwesome.fa_warning,
                    Size   = new Vector2(30),
                    Y      = icon_y,
                },
                textFlow = new LinkFlowContainer
                {
                    RelativeSizeAxes = Axes.X,
                    AutoSizeAxes     = Axes.Y,
                    Padding          = new MarginPadding(50),
                    TextAnchor       = Anchor.TopCentre,
                    Y       = -110,
                    Anchor  = Anchor.Centre,
                    Origin  = Anchor.TopCentre,
                    Spacing = new Vector2(0, 2),
                }
            };

            textFlow.AddText("This is an ", t =>
            {
                t.TextSize = 30;
                t.Font     = @"Exo2.0-Light";
            });
            textFlow.AddText("early development build", t =>
            {
                t.TextSize = 30;
                t.Font     = @"Exo2.0-SemiBold";
            });

            textFlow.AddParagraph("Things may not work as expected", t => t.TextSize = 20);
            textFlow.NewParagraph();

            Action <SpriteText> format = t =>
            {
                t.TextSize = 15;
                t.Font     = @"Exo2.0-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();

            supporterDrawables.AddRange(textFlow.AddText("Consider becoming an ", format));
            supporterDrawables.AddRange(textFlow.AddLink("osu!supporter", "https://osu.ppy.sh/home/support", creationParameters: format));
            supporterDrawables.AddRange(textFlow.AddText(" to help support the game", format));

            supporterDrawables.Add(heart = textFlow.AddIcon(FontAwesome.fa_heart, t =>
            {
                t.Padding = new MarginPadding {
                    Left = 5
                };
                t.TextSize = 12;
                t.Colour   = colours.Pink;
                t.Origin   = Anchor.Centre;
            }).First());

            iconColour = colours.Yellow;
        }
Exemple #9
0
        private void load(OsuColour colours, IAPIProvider api)
        {
            InternalChildren = new Drawable[]
            {
                icon = new SpriteIcon
                {
                    Anchor = Anchor.Centre,
                    Origin = Anchor.Centre,
                    Icon   = FontAwesome.Solid.ExclamationTriangle,
                    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 ", t => t.Font = t.Font.With(Typeface.Exo, 30, FontWeight.Light));
            textFlow.AddText("Powerlated's OSU CHEAT", 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 <SpriteText> format = t => t.Font = OsuFont.GetFont(size: 15, weight: FontWeight.SemiBold);

            textFlow.AddParagraph("Don't ask.", format);
            textFlow.NewParagraph();

            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 sucking on ", format);
                    supportFlow.AddLink("my!c**k", "https://pornhub.com", creationParameters: format);
                    supportFlow.AddText(" to make me nut", format);
                }

                heart = supportFlow.AddIcon(FontAwesome.Solid.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);
        }