Esempio n. 1
0
        internal EventAnimation(pSprite sprite, string filename, int start, int end)
        {
            Sprite    = sprite;
            Animation = sprite as pAnimation;
            startTime = 0;
            startTime = start;
            Type      = EventTypes.Animation;
            endTime   = end;

            Filename = filename.Replace(BeatmapManager.Current.ContainingFolderAbsolute + Path.DirectorySeparatorChar, string.Empty);
        }
Esempio n. 2
0
        internal HpBar(SpriteManager spriteManager)
        {
            this.spriteManager = spriteManager;

            pTexture[] fillTextures = loadSpritesFromSource(@"scorebar-colour");
            pTexture[] markerSprite = loadSpritesFromSource(@"scorebar-marker");
            newDefault = (fillTextures[0].Source == SkinSource.Osu || markerSprite[0].Source == SkinSource.Skin);

            if (newDefault)
            {
                if (fillTextures[0].AssetName == @"scorebar-colour-0" && fillTextures[0].Source == SkinSource.Osu)
                {
                    fillTextures = new pTexture[] { loadSpriteFromSource(@"scorebar-colour") }; // replace the old ugly bar if osu! tries to load it
                }
                t_kiNormal        = markerSprite[0];
                t_kiDanger        = markerSprite[0];
                t_kiDanger2       = markerSprite[0];
                s_barFill         = new pAnimation(fillTextures, Fields.TopLeft, Origins.TopLeft, Clocks.Game, new Vector2(7.5f, 7.8f), 0.965F, true, Color.White, null);
                s_kiIcon          = new pSprite(t_kiNormal, Fields.NativeStandardScale, Origins.Centre, Clocks.Game, new Vector2(CurrentXPosition, (8.125f + 2.5f) * GameBase.WindowManager.Ratio), 0.97F, true, Color.White, null);
                s_kiIcon.Additive = true;
            }
            else
            {
                t_kiNormal  = loadSpriteFromSource(@"scorebar-ki");
                t_kiDanger  = loadSpriteFromSource(@"scorebar-kidanger");
                t_kiDanger2 = loadSpriteFromSource(@"scorebar-kidanger2");
                s_barFill   = new pAnimation(fillTextures, Fields.TopLeft, Origins.TopLeft, Clocks.Game, new Vector2(3, 10), 0.965F, true, Color.White, null);
                s_kiIcon    = new pSprite(t_kiNormal, Fields.NativeStandardScale, Origins.Centre, Clocks.Game, new Vector2(0, 10 * GameBase.WindowManager.Ratio), 0.97F, true, Color.White, null);
            }

            s_barFill.DrawWidth = 0;
            s_barFill.SetFramerateFromSkin();
            s_barFill.DrawDimensionsManualOverride = true;



            s_barBg = new pSprite(loadSpriteFromSource(@"scorebar-bg"), Fields.TopLeft, Origins.TopLeft, Clocks.Game, Vector2.Zero, 0.96F, true, Color.White, null);

            SpriteCollection.Add(s_barBg);
            SpriteCollection.Add(s_barFill);
            SpriteCollection.Add(s_kiIcon);

            if (Player.Relaxing || Player.Relaxing2)
            {
                Visible = false;
            }
            else if (spriteManager != null)
            {
                spriteManager.Add(SpriteCollection);
            }

            Update();
        }
Esempio n. 3
0
        internal override Event Clone()
        {
            pAnimation     animationClone = (pAnimation)Animation.Clone();
            EventAnimation clone          = new EventAnimation(animationClone, Filename, StartTime, EndTime);

            clone.Filenames        = Filenames;
            clone.FrameDelay       = FrameDelay;
            clone.FrameCount       = FrameCount;
            clone.WriteToOsu       = WriteToOsu;
            clone.Layer            = Layer;
            clone.StoryboardIgnore = StoryboardIgnore;
            return(clone);
        }
Esempio n. 4
0
        internal void AddHitLight()
        {
            pAnimation hitLight = new pAnimation(hitLightFrames, Fields.TopLeft, Origins.Centre, Clocks.AudioOnce, new Vector2(Width / 2f, Host.HitPosition), 0.98f, false, Color.White);

            hitLight.Scale    = Host.Skin.GetLightingNScale(column) * widthScale;
            hitLight.Additive = true;
            hitLight.LoopType = LoopTypes.LoopOnce;
            if (hitLightFrames != null)
            {
                hitLight.FrameDelay = Math.Max(170f / hitLightFrames.Length, GameBase.SIXTY_FRAME_TIME);
            }
            hitLight.FadeInFromZero(80);
            hitLight.Transformations.Add(new Transformation(TransformationType.Fade, 1f, 0f, AudioEngine.Time + 80, AudioEngine.Time + 200));
            add(hitLight, Host.SpriteManagerAbove);
        }
Esempio n. 5
0
        public BackButton(EventHandler action, bool showIntroAnimation)
            : base(TextureManager.Load(OsuTexture.backbutton), FieldTypes.StandardSnapBottomLeft,
                   OriginTypes.BottomLeft, ClockTypes.Mode, fullyVisiblePosition, 0.99f, true, Color4.White)
        {
            AlwaysDraw  = true;
            Alpha       = 1;
            Action      = action;
            HandleInput = true;

            HandleClickOnUp = false;

            if (showIntroAnimation)
            {
                Transform(new TransformationV(positionAtDistance(50), fullyVisiblePosition, Clock.ModeTime, Clock.ModeTime + 150, EasingTypes.In));
                Transform(new TransformationV(fullyVisiblePosition, hiddenPosition, Clock.ModeTime + 150, Clock.ModeTime + 400, EasingTypes.Out));
            }
            else
            {
                Position = hiddenPosition;
            }

            OnClick += OnBackgroundOnClick;
            OnHover += delegate
            {
                MoveTo(visiblePosition, 200, EasingTypes.InOut);
                FadeColour(Color4.Gray, 200);
                dist = 0;
            };

            OnHoverLost += delegate
            {
                if (tp == null)
                {
                    MoveTo(hiddenPosition, 200, EasingTypes.InDouble);
                    FadeColour(Color4.White, 200);
                }
            };
            arrow            = new pAnimation(TextureManager.LoadAnimation(OsuTexture.backbutton_arrows1, 2), FieldTypes.StandardSnapBottomLeft, OriginTypes.Custom, ClockTypes.Mode, new Vector2(offset + 15, offset + 18), 1, true, Color4.White);
            arrow.FrameDelay = 500;
            arrow.Offset     = new Vector2(-330, 190);
            sm.Add(arrow);

            Rotation = -MathHelper.Pi / 4;
        }
Esempio n. 6
0
        internal EventAnimation(string filename, Vector2 startPosition, Origins origin, StoryLayer layer, int frameCount, double frameDelay,
                                bool useSkinSprites, LoopTypes loopType)
        {
            this.startPosition  = startPosition;
            this.origin         = origin;
            this.FrameCount     = frameCount;
            this.useSkinSprites = useSkinSprites;

            FrameDelay = Math.Max(1, frameDelay);

            Layer = layer;

            depth = EventManager.GetIncreasingDrawDepth(Layer);

            Animation =
                new pAnimation(null, Fields.Storyboard, origin, Clocks.Audio, startPosition,
                               depth, false, Color.White, null);
            Animation.LoopType = loopType;
            if (BeatmapManager.Current != null && BeatmapManager.Current.BeatmapVersion < 6)
            {
                Animation.FrameDelay = Math.Round(0.015 * frameDelay) * 1.186 * GameBase.SIXTY_FRAME_TIME; //backwards compatibility for older storyboards.
            }
            else
            {
                Animation.FrameDelay = frameDelay;
            }

            Sprite = Animation;
            Type   = EventTypes.Animation;

            Filename = GeneralHelper.PathSanitise(filename).Replace(BeatmapManager.Current.ContainingFolderAbsolute + Path.DirectorySeparatorChar, string.Empty);

            Filenames = new string[FrameCount];
            for (int i = 0; i < FrameCount; i++)
            {
                string f = Filename.Replace(".", i + ".");
                TextureManager.Reference(f);
                Filenames[i] = f;
            }

            Animation.OnDisposable += Unload;
        }
Esempio n. 7
0
        internal override void InitializeSprites()
        {
            catcherIdle = TextureManager.LoadAll("fruit-catcher-idle");
            if (catcherIdle != null && SkinManager.Current.Version >= 2.3)
            {
                catcherFail = TextureManager.LoadAll("fruit-catcher-fail");
                catcherKiai = TextureManager.LoadAll("fruit-catcher-kiai");
            }
            else
            {
                catcherIdle = catcherFail = catcherKiai = TextureManager.LoadAll(@"fruit-ryuuta");
            }

            catcher1 = new pAnimation(catcherIdle, Fields.Gamefield, Origins.Custom,
                                      Clocks.Game, new Vector2(256, 340), 0.81f, true, Color.White);
            catcher1.SetFramerateFromSkin();
            catcher1.OriginPosition = new Vector2(catcher1.DrawWidth / 2, 16);
            catcher1.Scale          = 0.7f;

            checkPosition = catcher1.Position.X;

            hitObjectManager.spriteManager.Add(catcher1);

            catcherWidth     = 305 / GameBase.GameField.Ratio * hitObjectManager.SpriteRatio * 0.7f;
            catcherWidthHalf = catcherWidth / 2;
            catchMargin      = catcherWidth * 0.1f;

            if (ConfigManager.sComboBurst)
            {
                if (SkinManager.Current.Version >= 2.3)
                {
                    comboBurstSprites = TextureManager.LoadAll(@"comboburst-fruits");
                }

                if (comboBurstSprites == null)
                {
                    comboBurstSprites = TextureManager.LoadAll(@"comboburst");
                }
            }

            base.InitializeSprites();
        }
Esempio n. 8
0
        internal override void Initialize()
        {
            spriteManager.WidescreenAutoOffset = false;

            mascot = new pAnimation(null, Fields.TopLeft, Origins.BottomLeft, Clocks.Audio, Vector2.Zero, 1, true, Color.White);
            mascot.AnimationFinished += mascot_AnimationFinished;
            mascot.Scale              = 0.6f;

            spriteManager.Add(mascot);

            animations.Add(TaikoMascotStates.Clear, new MascotAnimationSequence(TextureManager.LoadAll(@"pippidonclear", SkinSource.All, false),
                                                                                new[] { 0, 1, 2, 3, 4, 5, 6, 5, 6, 5, 4, 3, 2, 1, 0 }, 1000 / 10F));
            animations.Add(TaikoMascotStates.Fail, new MascotAnimationSequence(TextureManager.LoadAll(@"pippidonfail", SkinSource.All, false), null, 0));
            animations.Add(TaikoMascotStates.Kiai, new MascotAnimationSequence(TextureManager.LoadAll(@"pippidonkiai", SkinSource.All, false), null, 0));
            animations.Add(TaikoMascotStates.Idle, new MascotAnimationSequence(TextureManager.LoadAll(@"pippidonidle", SkinSource.All, false), null, 0));

            SetState(TaikoMascotStates.Idle, false);

            base.Initialize();
        }
Esempio n. 9
0
        internal EventAnimation(string filename, Vector2 startPosition, OriginTypes origin, StoryLayer layer, int frameCount, int frameDelay)
        {
            Texture2D[] textures = new Texture2D[frameCount];

            for (int i = 0; i < frameCount; i++)
            {
                textures[i] = SpriteCache.GetTexture(BeatmapManager.Current.ContainingFolder + "\\" + filename.Replace(".", i + "."));
            }

            Animation =
                new
                pAnimation(textures, FieldTypes.GamefieldRatio, origin, ClockTypes.Audio, startPosition,
                           EventManager.GetIncreasingDrawDepth(layer), false, Color.White, null);
            Sprite              = Animation;
            FrameDelay          = Math.Max(1, frameDelay);
            Animation.frameSkip = (int)Math.Round(0.06 * frameDelay);

            Layer    = layer;
            Origin   = origin;
            Type     = EventTypes.Animation;
            Filename = filename;
        }
Esempio n. 10
0
        public HitCircleManiaLong(HitObjectManager hom, int column, int startTime, int endTime, HitObjectSoundType soundType)
            : base(hom, column, startTime, soundType)
        {
            //Physical column index
            column = Column;

            SoundType      = soundType;
            SoundTypeStart = soundType;
            SoundTypeEnd   = soundType;
            ManiaType      = ManiaNoteType.Long;
            EndTime        = endTime;
            Length         = EndTime - StartTime;
            SoundAtEnd     = true;

            if (!hom.ManiaStage.Minimal)
            {
                //head note -- the origin one
                s_note.TextureArray = LoadCustomImages(string.Format("NoteImage{0}H", column), Column.NoteString + @"H");
                s_note.FlipVertical = hom.ManiaStage.Skin.GetNoteFlipVertical(column, "H", s_note.FlipVertical);
                ScaleAdjust(s_note);

                //rear note
                s_rear              = new pAnimation(LoadCustomImages(string.Format("NoteImage{0}T", column), Column.NoteString + @"T") ?? s_note.TextureArray, Fields.TopLeft, s_note.Origin, Clocks.Audio, Position, 0.7975f, false, Color.White);
                s_rear.Alpha        = s_note.Alpha;
                s_rear.FlipVertical = !hom.ManiaStage.Skin.GetNoteFlipVertical(column, "T");
                ScaleAdjust(s_rear);
                SpriteCollection.Add(s_rear);

                //body note
                s_body              = new pAnimation(LoadCustomImages(string.Format("NoteImage{0}L", column), Column.NoteString + @"L"), Fields.TopLeft, s_note.Origin, Clocks.Audio, Position, 0.795F, false, Color.White);
                s_body.Alpha        = s_note.Alpha;
                s_body.FrameDelay   = 30;
                s_body.RunAnimation = false;  //run when press
                s_body.FlipVertical = hom.ManiaStage.Skin.GetNoteFlipVertical(column, "L");
                ScaleAdjust(s_body);
                SpriteCollection.Add(s_body);
            }
        }
Esempio n. 11
0
        public HitCircleMania(HitObjectManager hom, int column, int startTime, HitObjectSoundType soundType)
            : base(hom)
        {
            LogicalColumn = column;
            column        = ((HitObjectManagerMania)hom).GetPhysicalColumn(column);
            Column        = hom.ManiaStage.Columns[column];

            Position     = new Vector2(Column.Left - Column.Host.Left + Column.Width / 2, -100);
            BasePosition = Position;
            StartTime    = startTime;
            EndTime      = startTime;
            SoundType    = soundType;

            if (!hom.ManiaStage.Minimal)
            {
                s_note =
                    new pAnimation(LoadCustomImages(@"NoteImage" + column.ToString(), Column.NoteString), Fields.TopLeft, hom.ManiaStage.FlipOrigin(Origins.BottomCentre), Clocks.Audio, Position, 0.8f, false, Color.White);
                s_note.Alpha        = 1;
                s_note.FlipVertical = hom.ManiaStage.Skin.GetNoteFlipVertical(column);
                ScaleAdjust(s_note);
                SpriteCollection.Add(s_note);
            }
        }
Esempio n. 12
0
        public override void Update()
        {
            if (loadingSprites && GameBase.Time - lastLoad > 40)
            {
                if (files.Count > 0)
                {
                    x = 80 + 100 * (count % 6);
                    y = 50 + (count / 6) * 100;

                    count++;
                    string filename = files[0].Replace(Folder + Path.DirectorySeparatorChar, string.Empty);

                    pSprite p          = null;
                    int     frameDelay = 0;

                    if (files.Count > 1 && filename[filename.Length - 5] == '0')
                    {
                        List <pTexture> textures = new List <pTexture>();

                        int j = 0;
                        while (true)
                        {
                            string   testFilename = filename.Replace("0.", j++ + ".");
                            pTexture test         = TextureManager.Load(testFilename, SkinSource.Beatmap);
                            if (test == null)
                            {
                                break;
                            }
                            files.Remove(testFilename);
                            textures.Add(test);
                        }

                        if (textures.Count > 1)
                        {
                            pAnimation a =
                                new
                                pAnimation(textures.ToArray(), Fields.StandardGamefieldScale, Origins.Centre,
                                           Clocks.Game, new Vector2(x, y),
                                           0.98f, true, Color.White, null);

                            a.Scale = 98f / Math.Max(a.Width, a.Height);
                            spriteList.ContentSpriteManager.Add(a);

                            p = a;

                            filename = filename.Replace("0.", ".");

                            frameDelay   = (int)(AudioEngine.ActiveControlPoint != null ? (AudioEngine.ActiveControlPoint.BeatLength * 2) / textures.Count : 500);
                            a.FrameDelay = frameDelay;
                        }
                    }

                    if (p == null)
                    {
                        p = new pSprite(TextureManager.Load(filename, SkinSource.Beatmap), Fields.StandardGamefieldScale,
                                        Origins.Centre, Clocks.Game,
                                        new Vector2(x, y), 0.98f, true, Color.White);
                        p.Scale = 98f / Math.Max(p.Width, p.Height);
                        spriteList.ContentSpriteManager.Add(p);
                    }

                    pSprite p2 = new pSprite(GameBase.WhitePixel, Fields.StandardGamefieldScale, Origins.TopLeft,
                                             Clocks.Game,
                                             new Vector2(x - 39, y - 39), 0.9f, true, new Color(15, 15, 15, 255));
                    p2.HoverEffect = new Transformation(p2.InitialColour, new Color(50, 50, 50, 255), 0, 100);
                    p2.Tag         = p;
                    p2.OnClick    += delegate
                    {
                        IsAnimation      = p is pAnimation;
                        SelectedFilename = filename;

                        if (IsAnimation)
                        {
                            SelectedFrameDelay  = frameDelay;
                            AnimationFrameCount = ((pAnimation)p).TextureCount;
                        }
                        Close();
                    };

                    p2.HandleInput = true;
                    p2.VectorScale = new Vector2(100, 100);
                    spriteList.ContentSpriteManager.Add(p2);

                    pText pt = new pText(filename, 8, new Vector2(x - 39, y - 50), new Vector2(100, 100), 1, true, Color.White, true);
                    pt.TextRenderSpecific = false;
                    pt.TextAa             = false;
                    pt.TextShadow         = true;
                    spriteList.ContentSpriteManager.Add(pt);

                    files.RemoveAt(0);
                }

                spriteList.SetContentDimensions(new Vector2(x + 100, y + 100));

                lastLoad = GameBase.Time;

                if (files.Count == 0)
                {
                    loadingSprites = false;
                }
            }

            spriteList.Update();

            base.Update();
        }
Esempio n. 13
0
        internal HitCircleOsu(HitObjectManager hom, Vector2 pos, int startTime, bool newCombo, bool addWhistle, bool addFinish, bool addClap, int comboOffset)
            : base(hom)
        {
            Position     = pos;
            BasePosition = pos;
            StartTime    = startTime;
            EndTime      = startTime;

            Type               = HitObjectType.Normal;
            SoundType          = HitObjectSoundType.None;
            SampleSet          = Audio.SampleSet.None;
            SampleSetAdditions = Audio.SampleSet.None;

            int p = LocalPreEmpt;

            if (newCombo)
            {
                Type       |= HitObjectType.NewCombo;
                ComboOffset = comboOffset;
            }
            if (addWhistle)
            {
                SoundType |= HitObjectSoundType.Whistle;
            }
            if (addFinish)
            {
                SoundType |= HitObjectSoundType.Finish;
            }
            if (addClap)
            {
                SoundType |= HitObjectSoundType.Clap;
            }


            if (hom.spriteManager == null)
            {
                return;
            }

            bool hidden            = ModManager.CheckActive(hitObjectManager.ActiveMods, Mods.Hidden);
            bool hasApproachCircle = ShowApproachCircle && (!hidden || (hom.hitObjects.Count == 0 && ConfigManager.sHiddenShowFirstApproach));

            Color white = Color.White;

            pTexture t_approachCircle = TextureManager.Load(@"approachcircle");
            pTexture t_hit1           = TextureManager.LoadFirstAvailable(new[] { SpriteNameHitCircle, default_sprite_hitcircle });

            pTexture[] t_hit2 = TextureManager.LoadAll((t_hit1 != null ? t_hit1.AssetName : default_sprite_hitcircle) + @"overlay");

            SpriteApproachCircle = new pSprite(t_approachCircle, Fields.Gamefield, Origins.Centre, Clocks.Audio, Position, SpriteManager.drawOrderFwdPrio(StartTime - p), false, white);
            if (hasApproachCircle)
            {
                SpriteCollection.Add(SpriteApproachCircle);
            }
            SpriteApproachCircle.Transformations.Add(new Transformation(TransformationType.Fade, 0, 0.9F, startTime - p, Math.Min(startTime, startTime - p + HitObjectManager.FadeIn * 2)));
            SpriteApproachCircle.Transformations.Add(new Transformation(TransformationType.Scale, 4, 1, startTime - p, startTime));

            SpriteHitCircle1 = new pSprite(t_hit1, Fields.Gamefield, Origins.Centre, Clocks.Audio, Position, SpriteManager.drawOrderBwd(StartTime), false, white)
            {
                TagNumeric = 1
            };
            SpriteCollection.Add(SpriteHitCircle1);
            DimCollection.Add(SpriteHitCircle1);


            SpriteHitCircle2 = new pAnimation(t_hit2, Fields.Gamefield, Origins.Centre, Clocks.Audio, Position,
                                              SpriteManager.drawOrderBwd(StartTime - (hitObjectManager.ShowOverlayAboveNumber ? 2 : 1)), false, Color.White);
            SpriteHitCircle2.FrameDelay = 1000 / 2F;
            SpriteCollection.Add(SpriteHitCircle2);
            DimCollection.Add(SpriteHitCircle2);

            SpriteHitCircleText = new pSpriteText(null, SkinManager.Current.FontHitCircle, SkinManager.Current.FontHitCircleOverlap, Fields.Gamefield, Origins.Centre,
                                                  Clocks.Audio, Position, SpriteManager.drawOrderBwd(StartTime - (hitObjectManager.ShowOverlayAboveNumber ? 1 : 2)), false, Color.White);
            SpriteHitCircleText.Scale = TEXT_SIZE;

            if (ShowCircleText)
            {
                SpriteCollection.Add(SpriteHitCircleText);
            }

            Transformation t;

            //fade in
            if (hidden)
            {
                t = new Transformation(TransformationType.Fade, 0, 1, startTime - p, startTime - (int)(p * 0.6));
            }
            else
            {
                t = new Transformation(TransformationType.Fade, 0, 1, startTime - p, startTime - p + HitObjectManager.FadeIn);
            }

            SpriteHitCircle1.Transformations.Add(t.Clone());
            SpriteHitCircle2.Transformations.Add(t.Clone());
            SpriteHitCircleText.Transformations.Add(t.Clone());

            //fade out
            if (GameBase.Mode == OsuModes.Edit)
            {
                SpriteSelectionCircle =
                    new pSprite(TextureManager.Load(@"hitcircleselect"), Fields.Gamefield,
                                Origins.Centre, Clocks.Game, Position,
                                SpriteManager.drawOrderBwd(StartTime - 3), true, Color.TransparentWhite);
                SpriteCollection.Add(SpriteSelectionCircle);

                if (ConfigManager.sEditorHitAnimations)
                {
                    Arm(true);
                }
                else
                {
                    t = new Transformation(TransformationType.Fade, 1, 0, startTime, startTime + hitObjectManager.ForceFadeOut);
                    SpriteHitCircle1.Transformations.Add(t.Clone());
                    SpriteHitCircle2.Transformations.Add(t.Clone());
                    SpriteHitCircleText.Transformations.Add(t.Clone());
                    SpriteApproachCircle.Transformations.Add(t.Clone());
                }

                SpriteApproachCircle.Transformations.Add(new Transformation(TransformationType.Scale, 1, 1.1F, startTime, startTime + 100));
            }
            else
            {
                Disarm();
            }
        }
Esempio n. 14
0
        /// <summary>
        /// Creates a new stage with start position and columns defined by the skin.
        /// </summary>
        /// <param name="skin">The skin to use.</param>
        /// <param name="posY">The vertical position of the stage.</param>
        /// <param name="height">The height of the stage.</param>
        /// <param name="minimal">Should we draw sprites?</param>
        /// <param name="columnOffset">The skin column offset for this stage (used for coop)</param>
        internal StageMania(SkinMania skin, bool minimal = false, float posY = 0f, float height = 480f, float posX = float.NaN, float widthScale = 1f, int stageIndex = 0, int columnOffset = 0)
        {
            Minimal           = minimal;
            Height            = height;
            Skin              = skin;
            this.stageIndex   = stageIndex;
            this.ColumnOffset = columnOffset;

            if (!minimal)
            {
                SpriteManager      = new SpriteManager(true);
                SpriteManagerBelow = new SpriteManager(true);
                SpriteManagerAbove = new SpriteManager(true);
                SpriteManagerNotes = new SpriteManager(true);

                stageHint              = new pSprite(Skin.Load(@"StageHint", @"mania-stage-hint", SkinSource), Fields.TopLeft, Origins.CentreLeft, Clocks.Audio, new Vector2(0, HitPosition), 0.62f, true, Color.White);
                stageHint.Alpha        = 0.9f;
                stageHint.VectorScale  = new Vector2(0, 0.9f);
                stageHint.Scale        = 1.6026f;
                stageHint.FlipVertical = UpsideDown;
                SpriteManager.Add(stageHint);

                pSprite p = new pSprite(Skin.Load(@"StageLeft", @"mania-stage-left", SkinSource), Fields.TopLeft, Origins.TopRight, Clocks.Audio, new Vector2(0.05f, Top), 0.8f, true, Color.White);
                p.VectorScale = new Vector2(HeightRatio, Height / (float)p.Height * 1.6f);
                SpriteManagerBelow.Add(p);

                stageRight             = new pSprite(Skin.Load(@"StageRight", @"mania-stage-right", SkinSource), Fields.TopLeft, Origins.TopLeft, Clocks.Audio, new Vector2(0.05f, Top), 0.8f, true, Color.White);
                stageRight.VectorScale = new Vector2(HeightRatio, Height / (float)stageRight.Height * 1.6f);
                SpriteManagerBelow.Add(stageRight);

                pTexture[] pt = Skin.LoadAll(@"StageBottom", @"mania-stage-bottom", SkinSource);
                if (pt != null && pt.Length > 0)
                {
                    stageBottom            = new pAnimation(pt, Fields.TopLeft, FlipOrigin(Origins.BottomCentre), Clocks.Audio, new Vector2(0, ActualBottom), 0.94f, true, Color.White);
                    stageBottom.FrameDelay = 1000 / 60f;
                    stageBottom.Scale      = 1.6f;
                    SpriteManagerAbove.Add(stageBottom);
                }

                if (Skin.JudgementLine)
                {
                    judgementLine             = new pSprite(GameBase.WhitePixel, Fields.TopLeft, FlipOrigin(Origins.TopLeft), Clocks.Audio, new Vector2(0, HitPosition), 0.62f, true, Skin.GetColour(@"JudgementLine"));
                    judgementLine.Alpha       = 0.9f;
                    judgementLine.VectorScale = new Vector2(0, 0.7f);
                    judgementLine.Scale       = 1.6026f;
                    SpriteManager.Add(judgementLine);
                }

                p             = new pSprite(TextureManager.Load("mania-stage-light", SkinSource.Osu), Fields.TopLeft, Origins.BottomRight, Clocks.Audio, new Vector2(0, Top), 0.5f, true, Color.TransparentWhite);
                p.Rotation    = -(float)(Math.PI / 2);
                p.VectorScale = new Vector2(Height / (float)p.Width, 0.27f) * 1.6f;
                SpriteManagerBelow.Add(p);

                waveRight             = new pSprite(TextureManager.Load("mania-stage-light", SkinSource.Osu), Fields.TopLeft, Origins.BottomLeft, Clocks.Audio, new Vector2(0, Top), 0.5f, true, Color.TransparentWhite);
                waveRight.Rotation    = (float)(Math.PI / 2);
                waveRight.VectorScale = new Vector2(Height / (float)waveRight.Width, 0.27f) * 1.6f;
                SpriteManagerBelow.Add(waveRight);

                hitScore            = new pAnimation(null, Fields.TopLeft, Origins.Centre, Clocks.Audio, new Vector2(0, ScaleFlipPosition(Skin.ScorePosition)), 0.998f, true, Color.White);
                hitScore.FrameDelay = 1000 / 20f;
                SpriteManagerAbove.Add(hitScore);

                foreach (string hitType in new[] { @"0", @"50", @"100", @"200", @"300", @"300g" })
                {
                    hitTextures.Add(hitType, Skin.LoadAll($@"Hit{hitType}", $@"mania-hit{hitType}", SkinSource));
                }

                if (hasHiddenSprites)
                {
                    bool fromKeyLayer = ModManager.CheckActive(Player.currentScore.EnabledMods, Mods.Hidden);

                    pTexture hiddenSprite = TextureManager.Load(@"mania-stage-hidden", SkinSource.Osu);

                    if (hiddenSprite == null)
                    {
                        GameBase.ChangeMode(OsuModes.Menu);
                    }

                    if (UpsideDown)
                    {
                        hiddenMask = new pSprite(GameBase.WhitePixel, Fields.TopLeft, fromKeyLayer ? Origins.TopLeft : Origins.BottomLeft, Clocks.Audio,
                                                 new Vector2(0, fromKeyLayer ? HitPosition : 480), 0.81f, true, Color.Black);
                        hiddenFade = new pSprite(hiddenSprite, Fields.TopLeft, fromKeyLayer ? Origins.TopLeft : Origins.BottomLeft, Clocks.Audio,
                                                 new Vector2(0, fromKeyLayer ? (HitPosition + 160 / 1.6f) : (320 / 1.6f)), 0.81f, true, Color.TransparentWhite);
                    }
                    else
                    {
                        hiddenMask = new pSprite(GameBase.WhitePixel, Fields.TopLeft, fromKeyLayer ? Origins.BottomLeft : Origins.TopLeft, Clocks.Audio,
                                                 new Vector2(0, fromKeyLayer ? HitPosition : 0), 0.81f, true, Color.Black);
                        hiddenFade = new pSprite(hiddenSprite, Fields.TopLeft, fromKeyLayer ? Origins.BottomLeft : Origins.TopLeft, Clocks.Audio,
                                                 new Vector2(0, fromKeyLayer ? (HitPosition - 160 / 1.6f) : (160 / 1.6f)), 0.81f, true, Color.TransparentWhite);
                    }

                    SpriteManagerAbove.Add(hiddenMask);
                    SpriteManagerAbove.Add(hiddenFade);
                }
            }

            //We must set these later as they position the spritemanagers
            Left = float.IsNaN(posX) ? Skin.ColumnStart : posX;
            Top  = posY;

            //Scale the width of columns, column spacing, and stage separation to fit everything on the screen
            //NOTE: This logic assumes there are a maximim of two stages
            if (!minimal && columnOffset == 0)
            {
                //Flip left and right offsets if they overlap
                float left  = Math.Min(Left, GameBase.WindowManager.WidthScaled - Skin.ColumnRight);
                float right = Math.Min(Skin.ColumnRight, GameBase.WindowManager.WidthScaled - Left);
                Left = left;

                //resizeWidth is the width of everything we're scaling that is to the right of "Left"
                float resizeWidth = 0;
                for (int i = 0; i < Skin.Columns; i++)
                {
                    resizeWidth += Skin.ColumnWidth[i] + (i > 0 ? Skin.ColumnSpacing[i - 1] : 0);
                }
                resizeWidth += Skin.SplitStages && SecondaryStageColumns != -1 ? Skin.StageSeparation : 0;

                float totalWidth     = Left + resizeWidth + right;
                float screenOverflow = Math.Max(0, totalWidth - GameBase.WindowManager.WidthScaled);

                widthScale = (resizeWidth - screenOverflow) / resizeWidth;
            }
            this.widthScale = widthScale;

            for (int i = columnOffset; i < columnOffset + PrimaryStageColumns; i++)
            {
                Columns.Add(new ColumnMania(this, i, widthScale));
            }

            if (!minimal)
            {
                //Set the visible area of the notes now that we know the width of the columns
                SpriteManagerNotes.SetVisibleArea(new RectangleF(Left, Top, Width, Height));
                SpriteManagerNotes.ForwardPlayOptimisations = true;
            }

            if (!minimal)
            {
                stageHint.VectorScale.X = Width / stageHint.Width;
                stageRight.Position.X  += Width;
                if (stageBottom != null)
                {
                    stageBottom.Position.X += Width / 2f;
                }
                if (judgementLine != null)
                {
                    judgementLine.VectorScale.X = Width;
                }
                waveRight.Position.X += Width;
                hitScore.Position.X  += Width / 2f;

                //Scale is used for sprite transformations, so we use vectorscale instead
                if (SkinManager.Current.Version >= 2.4 || HeightRatio < 1f)
                {
                    hitScore.VectorScale = Vector2.One * MinimumRatio;
                }

                //Hidden masks
                if (hasHiddenSprites)
                {
                    bool fromKeyLayer = ModManager.CheckActive(Player.currentScore.EnabledMods, Mods.Hidden);
                    hiddenMask.VectorScale = new Vector2(Width * 1.6f, 160);
                    hiddenMask.Alpha       = 0;
                    hiddenFade.VectorScale = new Vector2(Width * 1.6f, 180 / 250f);
                    if ((!fromKeyLayer && !UpsideDown) || (fromKeyLayer && UpsideDown))
                    {
                        hiddenFade.FlipVertical = true;
                    }
                    hiddenFade.Alpha = 0;
                }

                if (SecondaryStageColumns == -1)
                {
                    HPBar = new HpBarMania(this);
                }
            }

            if (SecondaryStageColumns != -1)
            {
                posX           = Left + Width + Skin.StageSeparation * widthScale;
                SecondaryStage = new StageMania(Skin, minimal, posY, height, posX, widthScale, stageIndex + 1, columnOffset + PrimaryStageColumns);
                Columns.AddRange(SecondaryStage.Columns);
                HPBar = SecondaryStage.HPBar;
            }

            bindColumnKeys();
        }
Esempio n. 15
0
        private void Reload(bool loadNewSkin)
        {
            spriteManager.Clear();



            if (loadNewSkin)
            {
                SkinManager.LoadSkin(true);
                AudioEngine.CurrentSampleSet = SampleSet.None;
                if (BeatmapManager.Current != null)
                {
                    HitObjectManager.LoadFile();
                }
            }

            pAnimation back = new pAnimation(SkinManager.LoadAll("menu-back"), FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(0, 480), 0.8F, true, new Color(255, 255, 255, (byte)(255 * 0.6)));

            back.SetFramerateFromSkin();
            back.OriginPosition = new Vector2(0, 146);
            back.OnClick       += back_OnClick;
            back.IsClickable    = true;
            back.HoverEffect    = new Transformation(TransformationType.Fade, 0.6F, 1, 0, 300);
            spriteManager.Add(back);

            pButton pbutton = new pButton("Get more skins", new Vector2(440, 400), new Vector2(200, 30), 1, Color.White, delegate { GameBase.ChangeMode(Modes.UpdateSkin); });

            pbutton.Text.StartColour = Color.Black;
            spriteManager.AddRange(pbutton.SpriteCollection);

            pbutton = new pButton("Random Beatmap", new Vector2(440, 440), new Vector2(200, 30), 1, Color.White, newSong);
            pbutton.Text.StartColour = Color.Black;
            spriteManager.AddRange(pbutton.SpriteCollection);

            int verticalSpacing = 0;

            pText   pt;
            pSprite pb;

            spriteManager.Add(new pText("Available Skins:", 20, new Vector2(460, 20), Vector2.Zero, 1, true, Color.White, true));

            for (int i = page * skinsPerPage; i < (page + 1) * skinsPerPage; i++)
            {
                if (i < Skins.Count)
                {
                    Skin skin = Skins[i];
                    if (skin.RawName == ConfigManager.sSkin)
                    {
                        pt =
                            new pText(SkinManager.Current.SkinName, 15, new Vector2(444, 50 + verticalSpacing),
                                      new Vector2(200, 0), 0.9f,
                                      true, Color.White, false);
                        pt.Tag              = skin.RawName;
                        pt.TextAlignment    = Alignment.LeftFixed;
                        pt.BackgroundColour = Color.Black;
                        pt.BorderWidth      = 2;
                        pt.BorderColour     = Color.LimeGreen;
                        pt.OnClick         += pt_OnClick;
                        spriteManager.Add(pt);
                    }
                    else
                    {
                        pt =
                            new pText(skin.SkinName, 15, new Vector2(480, 50 + verticalSpacing), new Vector2(200, 0),
                                      0.9f,
                                      true, Color.White, false);
                        pt.Tag              = skin.RawName;
                        pt.IsClickable      = true;
                        pt.TextAlignment    = Alignment.LeftFixed;
                        pt.BackgroundColour = Color.Black;
                        pt.BorderWidth      = 2;
                        pt.BorderColour     = Color.OrangeRed;
                        pt.HoverEffect      =
                            new Transformation(pt.StartPosition, pt.StartPosition - new Vector2(36, 0), 0, 200);
                        pt.HoverEffect.Easing = EasingTypes.In;
                        pt.OnClick           += pt_OnClick;

                        spriteManager.Add(pt);
                    }
                }
                verticalSpacing += 20;
            }

            if (page > 0)
            {
                pt =
                    new pText("<< Previous Page", 15, new Vector2(480, 50 + verticalSpacing), new Vector2(200, 0), 0.9f,
                              true, Color.White, false);
                pt.IsClickable        = true;
                pt.TextAlignment      = Alignment.LeftFixed;
                pt.BackgroundColour   = Color.Black;
                pt.BorderWidth        = 2;
                pt.BorderColour       = Color.Orange;
                pt.HoverEffect        = new Transformation(pt.StartPosition, pt.StartPosition - new Vector2(36, 0), 0, 200);
                pt.HoverEffect.Easing = EasingTypes.In;
                pt.OnClick           += prevPage;
                spriteManager.Add(pt);
            }


            verticalSpacing += 20;

            if (Skins.Count > (page + 1) * skinsPerPage)
            {
                pt =
                    new pText(">> Next Page", 15, new Vector2(480, 50 + verticalSpacing), new Vector2(200, 0), 0.9f,
                              true, Color.White, false);
                pt.IsClickable        = true;
                pt.TextAlignment      = Alignment.LeftFixed;
                pt.BackgroundColour   = Color.Black;
                pt.BorderWidth        = 2;
                pt.BorderColour       = Color.Orange;
                pt.HoverEffect        = new Transformation(pt.StartPosition, pt.StartPosition - new Vector2(36, 0), 0, 200);
                pt.HoverEffect.Easing = EasingTypes.In;
                pt.OnClick           += nextPage;
                verticalSpacing      += 20;
                spriteManager.Add(pt);
            }
            verticalSpacing += 60;

            pCheckbox skinSamples = new pCheckbox("Use skin's sound samples", new Vector2(445, verticalSpacing), 0.9f, ConfigManager.sSkinSamples);

            skinSamples.Tooltip         = "If this is selected, the default osu!sounds will be used for hit samples";
            skinSamples.OnCheckChanged += skinSamples_OnCheckChanged;
            spriteManager.AddRange(skinSamples.SpriteCollection);

            verticalSpacing += 20;

            pCheckbox useTaikoSkin = new pCheckbox("Use Taiko skin for Taiko Mod", new Vector2(445, verticalSpacing), 0.9f, ConfigManager.sUseTaikoSkin);

            useTaikoSkin.Tooltip         = "If this is selected and the Taiko skin is present,\nit will automatically be used when playing Taiko Mod.";
            useTaikoSkin.OnCheckChanged += useTaikoSkin_OnCheckChanged;
            spriteManager.AddRange(useTaikoSkin.SpriteCollection);

            pAnimation pa =
                new pAnimation(SkinManager.LoadAll("scorebar-colour"), FieldTypes.Window, OriginTypes.TopLeft, ClockTypes.Game, new Vector2(3, 10), 0.95F, true, Color.White, null);

            pa.frameSkip = 60 / pa.TextureCount;
            pa.DrawWidth = 460;
            spriteManager.Add(pa);
            pb =
                new pSprite(SkinManager.Load("scorebar-ki"), OriginTypes.Centre, new Vector2(287, 16), 0.97F, true, Color.White);
            spriteManager.Add(pb);
            pb =
                new pSprite(SkinManager.Load("scorebar-kidanger"), OriginTypes.Centre,
                            new Vector2(160, 16), 0.98F, true, Color.White);
            spriteManager.Add(pb);
            pb =
                new pSprite(SkinManager.Load("scorebar-kidanger2"), OriginTypes.Centre, new Vector2(100, 16), 0.99F, true, Color.White);
            spriteManager.Add(pb);

            pb = new pSprite(SkinManager.Load("scorebar-bg"), Vector2.Zero, 0.9F, true, Color.White);
            spriteManager.Add(pb);


            pSprite detailsBack = new pSprite(GameBase.WhitePixel, new Vector2(440, 0), 0.2F, true, new Color(0, 0, 0, 160));

            detailsBack.VectorScale    = new Vector2(320, 768);
            detailsBack.UseVectorScale = true;
            spriteManager.Add(detailsBack);

            currentSkin =
                new pText(SkinManager.Current.SkinName + " by " + SkinManager.Current.SkinAuthor, 24, new Vector2(0, 30), Vector2.Zero,
                          1, true, Color.White, true);
            currentSkin.TextBold = true;
            currentSkin.FadeInFromZero(1500);
            spriteManager.Add(currentSkin);
        }
Esempio n. 16
0
        public override void Initialize()
        {
            StreamingManager.StopSpectating(false);

            content = new ResourceContentManager(GameBase.Instance.Services, ResourcesStore.ResourceManager);

            spriteManager = new SpriteManager();

            BanchoClient.OnConnect      += BanchoClient_OnConnect;
            KeyboardHandler.OnKeyRepeat += KeyboardHandler_OnKeyRepeat;

            pText headerText =
                new pText("Multiplayer Lobby", 30, new Vector2(0, 0), 0.955F, true, new Color(255, 255, 255, 255));

            spriteManager.Add(headerText);

            pText headerText2 = new pText("Let's play together!", 16, new Vector2(4, 26), 0.955F, true,
                                          new Color(255, 255, 255, 255));

            spriteManager.Add(headerText2);

            pSprite bgf =
                new pSprite(content.Load <Texture2D>("lobby-background"), FieldTypes.Window, OriginTypes.TopLeft,
                            ClockTypes.Game, Vector2.Zero, 0, true, Color.White);

            spriteManager.Add(bgf);

            pAnimation back =
                new pAnimation(SkinManager.LoadAll("menu-back"), FieldTypes.Window,
                               OriginTypes.TopLeft,
                               ClockTypes.Game,
                               new Vector2(0, 480), 0.8F, true, new Color(255, 255, 255, (byte)(255 * 0.6)));

            back.SetFramerateFromSkin();
            back.OriginPosition = new Vector2(0, 146);
            back.OnClick       += back_OnClick;
            back.IsClickable    = true;
            back.HoverEffect    = new Transformation(TransformationType.Fade, 0.6F, 1, 0, 300);
            spriteManager.Add(back);

            pButton pbut = new pButton("New Game", new Vector2(270, 285), new Vector2(350, 30), 0.92f, new Color(99, 139, 228), OnCreateGame);

            spriteManager.Add(pbut.SpriteCollection);

            //pbut = new pButton("Join Game", new Vector2(270, 285), new Vector2(140, 30), 0.92f, new Color(99, 139, 228), OnCreateGame);
            //spriteManager.Add(pbut.SpriteCollection);

            pbut = new pButton("Back to Menu", new Vector2(10, 285), new Vector2(250, 30), 0.92f, new Color(235, 160, 62), back_OnClick);
            spriteManager.Add(pbut.SpriteCollection);

            lobbyUserList =
                new pText("", 12, new Vector2(560, 65), 1, true, Color.White);
            lobbyUserList.TextBold = true;
            spriteManager.Add(lobbyUserList);

            noMatches               = new pText("There are no matches available.\nClick 'New Game' to start a new game!", 20, new Vector2(280, 115), new Vector2(400, 0), 1, true, Color.White, false);
            noMatches.TextBold      = true;
            noMatches.CurrentColour = Color.TransparentWhite;
            noMatches.TextAlignment = Alignment.Centre;
            noMatches.OriginType    = OriginTypes.Centre;
            gameList.spriteManager.Add(noMatches);

            base.Initialize();

            JoinLobby();

            LobbyUpdatePending = true;

            GameBase.LoadComplete();

            if (!ChatEngine.IsVisible)
            {
                if (ChatEngine.IsFullVisible)
                {
                    ChatEngine.ToggleFull();
                }
                ChatEngine.Toggle();
            }
        }
Esempio n. 17
0
        public BackButton(EventHandler action, bool skinnable = true, bool dialog = false)
        {
            Action = action;

            pTexture[] textures = null;

            if (skinnable)
            {
                textures = TextureManager.LoadAll(@"menu-back", SkinSource.Osu | SkinSource.Skin, true);
            }

            if (textures != null && textures.Length > 0)
            {
                //old back button behaviour
                backSprite1 = new pAnimation(textures, Fields.TopLeft, Origins.BottomLeft, Clocks.Game, new Vector2(0, 480), 0.9F, true, Color.White);
                backSprite1.SetFramerateFromSkin();
                backSprite1.ViewOffsetImmune = true;
                SpriteCollection.Add(backSprite1);

                backSprite2 = new pAnimation(textures, Fields.TopLeft, Origins.BottomLeft, Clocks.Game, new Vector2(0, 480), 0.91F, true, Color.White);
                if (dialog)
                {
                    //Force an initial alpha
                    backSprite2.FadeTo(0, 0);
                }
                backSprite2.Alpha = 0.01f;
                backSprite2.SetFramerateFromSkin();

                backSprite2.OnClick         += back_OnClick;
                backSprite2.OnHover         += back_OnHover;
                backSprite2.HandleInput      = true;
                backSprite2.ViewOffsetImmune = true;
                backSprite2.Additive         = true;
                backSprite2.HoverEffect      = new Transformation(TransformationType.Fade, 1 / 255f, 0.4f, 0, 250);
                SpriteCollection.Add(backSprite2);
            }
            else
            {
                SpriteCollection.Add(text = new pText(LocalisationManager.GetString(OsuString.General_Back).ToLower(), 15, new Vector2(0, vertical_offset), 0.91F, true, Color.White)
                {
                    Field            = Fields.BottomLeft,
                    Origin           = Origins.Centre,
                    ViewOffsetImmune = true
                });

                float backTextWidth = text.MeasureText().X;
                if (backTextWidth > layer_right_idle - layer_left_idle)
                {
                    layerRightTextAllowance = backTextWidth - (layer_right_idle - layer_left_idle);
                }

                SpriteCollection.Add(layerLeft = new pSprite(TextureManager.Load(@"back-button-layer", SkinSource.Osu), Fields.BottomLeft, Origins.BottomRight, Clocks.Game, new Vector2(0, 0), 0.91F, true, colour_idle)
                {
                    ViewOffsetImmune = true
                });

                SpriteCollection.Add(icon = new pTextAwesome(FontAwesome.chevron_circle_left, 18, new Vector2(0, vertical_offset))
                {
                    Depth = 0.92f,
                    Field = Fields.BottomLeft,
                });

                icon.OnUpdate += delegate
                {
                    if (AudioEngine.SyncNewBeat)
                    {
                        icon.Scale = expanded ? 1.5f : 0.9f;
                        Transformation tr = icon.ScaleTo(1, (int)AudioEngine.BeatLength * 3, EasingTypes.OutElastic);
                        if (tr != null)
                        {
                            tr.Time1 -= (int)AudioEngine.BeatLength / 4;
                            tr.Time2 -= (int)AudioEngine.BeatLength / 4;
                        }
                    }
                };

                SpriteCollection.Add(layerRight = new pSprite(TextureManager.Load(@"back-button-layer", SkinSource.Osu), Fields.BottomLeft, Origins.BottomRight, Clocks.Game, new Vector2(0, 0), 0.9F, true, colour_idle)
                {
                    HandleInput      = true,
                    ViewOffsetImmune = true
                });

                layerRight.OnClick     += delegate { back_OnClick(this, null); contract(EasingTypes.InOutBack, 400); };
                layerRight.OnHover     += delegate { expand(EasingTypes.OutElastic); };
                layerRight.OnHover     += back_OnHover;
                layerRight.OnHoverLost += delegate { contract(EasingTypes.OutElastic); };

                contract(EasingTypes.OutElastic, 0);
            }
        }
Esempio n. 18
0
        internal ColumnMania(StageMania stage, int column, float widthScale)
        {
            this.Host       = stage;
            this.column     = column;
            this.widthScale = widthScale;

            float spacing = column > 0 ? stage.Skin.ColumnSpacing[column - 1] * widthScale : 0;

            Left         = stage.Left + stage.Width + spacing;
            Width        = stage.Skin.ColumnWidth[column] * widthScale;
            stage.Width += Width + spacing;

            if (!stage.Minimal)
            {
                float lineHeight = Host.Height - Math.Abs(Host.ActualBottom - Host.HitPosition);

                //Left column line
                if (stage.Skin.ColumnLineWidth[column] > 0)
                {
                    add(new pSprite(GameBase.WhitePixel, Fields.TopLeft, stage.FlipOrigin(Origins.BottomLeft), Clocks.Audio, new Vector2(0, stage.HitPosition), 0.61f, true, stage.Skin.GetColour(@"ColumnLine"))
                    {
                        VectorScale = new Vector2(0.740f * stage.Skin.ColumnLineWidth[column], lineHeight * 1.6f)
                    }, stage.SpriteManager);
                }

                //Column background
                add(new pSprite(GameBase.WhitePixel, Fields.TopLeft, Origins.TopLeft, Clocks.Audio, new Vector2(0, stage.Top), 0.6f, true, stage.Skin.GetColour($@"{column + 1}"))
                {
                    VectorScale = new Vector2(Width, stage.Height),
                    Scale       = 1.6f
                }, stage.SpriteManager);

                //Right column line
                if ((stage.Skin.ColumnLineWidth[column + 1] > 0 && SkinManager.Current.Version >= 2.4) || column == stage.Skin.Columns - 1)
                {
                    add(new pSprite(GameBase.WhitePixel, Fields.TopLeft, stage.FlipOrigin(Origins.BottomLeft), Clocks.Audio,
                                    new Vector2(Width - (column == stage.Skin.Columns - 1 ? 0.10f : 0), stage.HitPosition), 0.61f, true, stage.Skin.GetColour(@"ColumnLine"))
                    {
                        VectorScale = new Vector2(0.740f * stage.Skin.ColumnLineWidth[column + 1], lineHeight * 1.6f)
                    }, stage.SpriteManager);
                }

                //Key sprites
                SpriteManager keySpriteManager = stage.Skin.KeysUnderNotes ? stage.SpriteManager : stage.SpriteManagerAbove;

                pTexture p = stage.Skin.Load($@"KeyImage{column}", KeyString, stage.SkinSource);
                keyImageUp = new pSprite(p, Fields.TopLeft, stage.FlipOrigin(Origins.BottomCentre), Clocks.Audio, new Vector2(Width / 2f, stage.ActualBottom), 0.92f, true, Color.White)
                {
                    VectorScale  = new Vector2(Width * 1.6f / p.DisplayWidth, stage.HeightRatio),
                    FlipVertical = stage.Skin.GetFlipVertical("Key", column)
                };
                add(keyImageUp, keySpriteManager);

                p            = stage.Skin.Load($@"KeyImage{column}D", KeyString + 'D', stage.SkinSource);
                keyImageDown = new pSprite(p, Fields.TopLeft, stage.FlipOrigin(Origins.BottomCentre), Clocks.Audio, new Vector2(Width / 2f, stage.ActualBottom), 0.925f, true, Color.White)
                {
                    VectorScale  = new Vector2(Width * 1.6f / p.DisplayWidth, stage.HeightRatio),
                    FlipVertical = keyImageUp.FlipVertical,
                    Alpha        = 0
                };
                add(keyImageDown, keySpriteManager);

                //Lights
                lightImage = new pAnimation(stage.Skin.LoadAll(@"StageLight", @"mania-stage-light", stage.SkinSource), Fields.TopLeft, stage.FlipOrigin(Origins.BottomLeft), Clocks.Audio,
                                            new Vector2(0, stage.ScaleFlipPosition(Host.Skin.LightPosition)), 0.72f, true, stage.Skin.GetColour($@"Light{column + 1}"));
                lightImage.Alpha        = 0;
                lightImage.FrameDelay   = 1000f / stage.Skin.LightFramePerSecond;
                lightImage.RunAnimation = false;
                lightImage.LoopType     = LoopTypes.LoopForever;
                lightImage.VectorScale  = new Vector2(Width * 1.6f / lightImage.Width, stage.HeightRatio);
                add(lightImage, stage.SpriteManager);

                //Key warning
                keyWarning = new pText("", Width / 2f, new Vector2(Width / 2f, stage.ScaleFlipPosition(480 - keyImageUp.DrawHeight / 1.6f / 2)), 0.93f, true, stage.Skin.GetColour(@"KeyWarning"))
                {
                    TextBold = true,
                    Origin   = Origins.Centre,
                    Scale    = stage.HeightRatio
                };
                add(keyWarning, stage.SpriteManagerAbove);

                //Hit lights
                hitLightFrames = stage.Skin.LoadAll(@"LightingN", @"lightingN", stage.SkinSource);
                pTexture[] lightLong = stage.Skin.LoadAll(@"LightingL", @"lightingL", stage.SkinSource);

                if (lightLong == null || lightLong.Length == 0)
                {
                    lightLong = new pTexture[hitLightFrames.Length];
                    hitLightFrames.CopyTo(lightLong, 0);
                }

                hitLightLong          = new pAnimation(lightLong, Fields.TopLeft, Origins.Centre, Clocks.Audio, new Vector2(Width / 2f, stage.HitPosition), 0.98f, true, Color.White);
                hitLightLong.Scale    = Host.Skin.GetLightingLScale(column) * widthScale;
                hitLightLong.Alpha    = 0;
                hitLightLong.Additive = true;
                if (lightLong != null)
                {
                    hitLightLong.FrameDelay = Math.Max(170f / lightLong.Length, GameBase.SIXTY_FRAME_TIME);
                }
                add(hitLightLong, stage.SpriteManagerAbove);
            }
        }
Esempio n. 19
0
        internal Options(Game game) : base(game)
        {
            KeyboardHandler.OnKeyPressed += GameBase_OnKeyPressed;

            spriteManager         = new SpriteManager();
            spriteManagerAudio    = new SpriteManager();
            spriteManagerGraphics = new SpriteManager();
            spriteManagerInput    = new SpriteManager();
            spriteManagerOnline   = new SpriteManager();

            int vertSpacing = 30;

            startOffset = ConfigManager.sOffset;

            int t = ConfigManager.sComboFireHeight;

            ConfigManager.sComboFireHeight = 10;
            fireRender = new FireRenderer();
            ConfigManager.sComboFireHeight = t;

            SkinManager.LoadSkin();

            pSprite detailsBack =
                new pSprite(GameBase.WhitePixel, FieldTypes.Window,
                            OriginTypes.TopLeft,
                            ClockTypes.Game,
                            new Vector2(0, 0), 0.7F, true, Color.Black);

            detailsBack.VectorScale    = new Vector2(1024, 83);
            detailsBack.UseVectorScale = true;
            spriteManager.Add(detailsBack);

            pText version = new pText("osu! " + General.BUILD_NAME, 10, new Vector2(640, 0), 0.99f, true, Color.White);

            version.OriginType         = OriginTypes.TopRight;
            version.TextRenderSpecific = false;
            version.TextAa             = false;
            spriteManager.Add(version);

            pTabCollection ptab = new pTabCollection(spriteManager, 10, new Vector2(230, 52), 0.9f, true);

            ptab.TabColour = Color.Tomato;
            ptab.Add("Graphics", spriteManagerGraphics);
            ptab.Add("Audio", spriteManagerAudio);
            ptab.Add("Input", spriteManagerInput);
            ptab.Add("Online", spriteManagerOnline);

            ptab.OnTabChanged += pt_OnTabChanged;

            ptab.SetSelected(spriteManagerGraphics);

            pAnimation back =
                new pAnimation(SkinManager.LoadAll("menu-back"), FieldTypes.Window,
                               OriginTypes.TopLeft,
                               ClockTypes.Game,
                               new Vector2(0, 480), 0.8F, true, new Color(255, 255, 255, (byte)(255 * 0.6)));

            back.SetFramerateFromSkin();
            back.OriginPosition = new Vector2(0, 146);
            back.OnClick       += back_OnClick;
            back.IsClickable    = true;
            back.HoverEffect    = new Transformation(TransformationType.Fade, 0.6F, 1, 0, 300);
            spriteManager.Add(back);

            pText headerText =
                new pText("Options", 30, new Vector2(0, 0), 0.955F, true, new Color(255, 255, 255, 255));

            spriteManager.Add(headerText);

            pText headerText2 = new pText("Change the way osu! behaves", 16, new Vector2(4, 26), 0.955F, true,
                                          new Color(255, 255, 255, 255));

            spriteManager.Add(headerText2);

            pSprite bg =
                new pSprite(SkinManager.Load("playfield"), FieldTypes.Window, OriginTypes.TopLeft,
                            ClockTypes.Game, Vector2.Zero, 0, true, new Color(44, 82, 108));

            spriteManager.Add(bg);

            //Graphics-related

            int vertCurrent = topHeight;

            pText pt =
                new pText("Resolution", 24, new Vector2(160, vertCurrent), Vector2.Zero, 1, true, Color.White, true);

            pt.OriginType = OriginTypes.Centre;
            spriteManagerGraphics.Add(pt);

            vertCurrent += vertSpacing;

            pc640 = new pCheckbox(spriteManagerGraphics, "640x480", new Vector2(10, vertCurrent), 0.8F, false);
            pc640.OnCheckChanged += delegate
            {
                GameBase.SetScreenSize(640, 480);
                UpdateResolutionCheckboxes();
            };

            pc1024 = new pCheckbox(spriteManagerGraphics, "1024x768", new Vector2(160, vertCurrent), 0.8F, false);
            pc1024.OnCheckChanged += delegate
            {
                GameBase.SetScreenSize(1024, 768);
                UpdateResolutionCheckboxes();
            };

            vertCurrent += vertSpacing;


            pc800 = new pCheckbox(spriteManagerGraphics, "800x600", new Vector2(10, vertCurrent), 0.8F, false);
            pc800.OnCheckChanged += delegate
            {
                GameBase.SetScreenSize(800, 600);
                UpdateResolutionCheckboxes();
            };

            pCheckbox pc = new pCheckbox(spriteManagerGraphics, "Fullscreen Mode", new Vector2(160, vertCurrent), 0.8F,
                                         ConfigManager.sFullscreen);

            pc.OnCheckChanged += fullscreen_OnCheckChanged;

            UpdateResolutionCheckboxes();


            vertCurrent += vertSpacing + 40;

            pt =
                new pText("Detail Settings", 24, new Vector2(320, vertCurrent), Vector2.Zero, 1, true, Color.White,
                          true);
            pt.OriginType = OriginTypes.Centre;
            spriteManagerGraphics.Add(pt);

            vertCurrent += vertSpacing;

            pc = new pCheckbox(spriteManagerGraphics, "Limit Framerate", new Vector2(10, vertCurrent), 0.8F,
                               ConfigManager.sFrameSync);
            pc.Tooltip =
                "Limits all internal calculations to 60fps.\nThis will help fix lag problems - try toggling it if you experience lag!";
            pc.OnCheckChanged += frameSync_OnClick;

            pc = new pCheckbox(spriteManagerGraphics, "Snaking Sliders", new Vector2(160, vertCurrent), 0.8F,
                               ConfigManager.sSnakingSliders);
            pc.Tooltip =
                "Sliders gradually snake out from their starting point.\nThis should run fine unless you have an ancient machine.";
            pc.OnCheckChanged += snakingSliders_OnClick;

            vertCurrent += vertSpacing;

            pc = new pCheckbox(spriteManagerGraphics, "Background Video", new Vector2(10, vertCurrent), 0.8F,
                               ConfigManager.sVideo);
            pc.Tooltip =
                "Enable full-window video playback.\nThis requires ffdshow (available from the osu! site).\nNote that if your ffdshow doesn't have a red system-tray icon, it is outdated and will not work correctly";
            pc.OnCheckChanged += video_OnClick;

            pc = new pCheckbox(spriteManagerGraphics, "Shader Effects", new Vector2(160, vertCurrent), 0.8F,
                               ConfigManager.sBloom);
            pc.Tooltip =
                "Enables application of a softening and other shader special effects in gameplay.\nThis requires Pixel Shader 2.0 support, and a relatively powerful PC.\nIf your card is unsupported, this will be automatically disabled.";
            pc.OnCheckChanged += bloom_OnClick;

            vertCurrent += vertSpacing;

            pc = new pCheckbox(spriteManagerGraphics, "Show Combo Fire", new Vector2(10, vertCurrent), 0.8F,
                               ConfigManager.sComboFire);
            pc.Tooltip =
                "When you achieve a combo of 30 or greater, fire will burn from the bottom of the screen.\nThis requires Pixel Shader 2.0 support.\nIf your card is unsupported, this will be automatically disabled.";
            pc.OnCheckChanged += comboFire_OnClick;

            comboFireHeight = new pSliderBar(spriteManagerGraphics, 0, 10, ConfigManager.sComboFireHeight,
                                             new Vector2(150, vertCurrent + 10), 120);
            comboFireHeight.SpriteCollection[1].ToolTip = "Adjust the maximum height of combo fire.";
            comboFireHeight.Visible = ConfigManager.sComboFire;

            vertCurrent = topHeight;

            vertSpacing = 35;

            vertCurrent += vertSpacing;

            pSprite pb =
                new pText("Skin", 24, new Vector2(480, vertCurrent - 16), Vector2.Zero, 1, true, Color.White, true);

            pb.OriginType = OriginTypes.Centre;
            spriteManagerGraphics.Add(pb);

            pb =
                new pSprite(SkinManager.Load("hit300g"), FieldTypes.Window,
                            OriginTypes.Centre,
                            ClockTypes.Game,
                            new Vector2(400, vertCurrent - 16), 0.3F, true, Color.White);
            pb.CurrentScale = 0.8F;
            spriteManagerGraphics.Add(pb);

            pb =
                new pSprite(SkinManager.Load("hit100k"), FieldTypes.Window,
                            OriginTypes.Centre,
                            ClockTypes.Game,
                            new Vector2(560, vertCurrent - 16), 0.3F, true, Color.White);
            pb.CurrentScale = 0.8F;
            spriteManagerGraphics.Add(pb);

            vertCurrent += vertSpacing;

            skinText =
                new pText(SkinManager.Current.SkinName + " by " + SkinManager.Current.SkinAuthor, 20,
                          new Vector2(480, vertCurrent), Vector2.Zero, 1, true, Color.Black, false);
            skinText.OriginType = OriginTypes.Centre;
            spriteManagerGraphics.Add(skinText);

            pb =
                new pSprite(SkinManager.Load("menu-button-background"), FieldTypes.Window,
                            OriginTypes.Centre,
                            ClockTypes.Game,
                            new Vector2(480, vertCurrent), 0.8F, true, Color.White);
            pb.OnClick      += changeSkin_OnClick;
            pb.CurrentScale  = 0.7F;
            pb.CurrentColour = new Color(0, 0, 0, 178);
            pb.IsClickable   = true;
            pb.HoverEffect   = new Transformation(TransformationType.Fade, 0.7F, 1, 0, 200);
            spriteManagerGraphics.Add(pb);

            //Audio
            vertCurrent = topHeight;

            pb =
                new pText("Volume", 24, new Vector2(320, vertCurrent), Vector2.Zero, 1, true, Color.White, true);
            pb.OriginType = OriginTypes.Centre;
            spriteManagerAudio.Add(pb);

            vertCurrent += vertSpacing - 8;

            vertSpacing = 25;

            pb =
                new pText("Master", 20, new Vector2(230, vertCurrent), Vector2.Zero, 1, true, Color.White, true);
            pb.OriginType = OriginTypes.Centre;
            spriteManagerAudio.Add(pb);

            masterVolume =
                new pSliderBar(spriteManagerAudio, 0, 100, AudioEngine.VolumeUniversal, new Vector2(280, vertCurrent), 180);

            vertCurrent += vertSpacing;

            pb =
                new pText("Music", 20, new Vector2(230, vertCurrent), Vector2.Zero, 1, true, Color.White, true);
            pb.OriginType = OriginTypes.Centre;
            spriteManagerAudio.Add(pb);

            musicVolume =
                new pSliderBar(spriteManagerAudio, 0, 100, AudioEngine.VolumeMusic, new Vector2(280, vertCurrent), 180);

            vertCurrent += vertSpacing;

            pb            = new pText("Effect", 20, new Vector2(230, vertCurrent), Vector2.Zero, 1, true, Color.White, true);
            pb.OriginType = OriginTypes.Centre;
            spriteManagerAudio.Add(pb);
            vertSpacing = 35;

            effectVolume =
                new pSliderBar(spriteManagerAudio, 0, 100, AudioEngine.VolumeEffect, new Vector2(280, vertCurrent), 180);

            vertCurrent += vertSpacing * 3;

            pb =
                new pText("Universal Audio Offset", 20, new Vector2(320, vertCurrent), Vector2.Zero, 1, true,
                          Color.White, true);
            pb.OriginType = OriginTypes.Centre;
            spriteManagerAudio.Add(pb);

            vertCurrent += 25;

            pb =
                new pText(
                    "Use left/right arrows to adjust until you can no longer hear the two\nseparate sounds.  This is not perfect, but will be improved soon.",
                    12, new Vector2(320, vertCurrent), Vector2.Zero, 1, true, Color.White, true);
            pb.OriginType = OriginTypes.Centre;
            spriteManagerAudio.Add(pb);

            vertCurrent += vertSpacing;

            audioOffset =
                new pSliderBar(spriteManagerAudio, -300, 300, ConfigManager.sOffset, new Vector2(180, vertCurrent), 200);

            audioOffsetText =
                new pText("", 20, new Vector2(440, vertCurrent), Vector2.Zero, 1, true, Color.White, true);
            audioOffsetText.OriginType = OriginTypes.Centre;
            spriteManagerAudio.Add(audioOffsetText);

            //Input
            vertCurrent = topHeight;

            pb =
                new pText("Mouse Sensitivity", 24, new Vector2(480, vertCurrent), Vector2.Zero, 1, true, Color.White,
                          true);
            pb.OriginType = OriginTypes.Centre;
            spriteManagerInput.Add(pb);

            vertCurrent += vertSpacing;

            pb = new pText("The default rate is the same as your desktop mouse speed.", 14,
                           new Vector2(480, vertCurrent), Vector2.Zero, 1, true, Color.White, true);
            pb.OriginType = OriginTypes.Centre;
            spriteManagerInput.Add(pb);

            vertCurrent += vertSpacing;

            mouseSpeed =
                new pSliderBar(spriteManagerInput, 0.5, 4, ConfigManager.sMouseSpeed, new Vector2(370, vertCurrent), 200);

            mouseSpeedText =
                new pText("", 20, new Vector2(600, vertCurrent), Vector2.Zero, 1, true, Color.White, true);
            mouseSpeedText.OriginType = OriginTypes.Centre;
            spriteManagerInput.Add(mouseSpeedText);

            vertCurrent = topHeight;

            pt =
                new pText("Toggles", 24, new Vector2(160, vertCurrent), Vector2.Zero, 1, true, Color.White, true);
            pt.OriginType = OriginTypes.Centre;
            spriteManagerInput.Add(pt);
            vertCurrent += vertSpacing;

            pc = new pCheckbox(spriteManagerInput, "Disable mouse wheel in play mode", new Vector2(10, vertCurrent), 0.8F,
                               ConfigManager.sMouseDisableWheel);
            pc.Tooltip =
                "During play, you can use the mouse wheel to adjust the volume and pause the game.\nThis will disable that functionality";
            pc.OnCheckChanged += disableMouseWheel_OnClick;

            vertCurrent += vertSpacing;

            pc = new pCheckbox(spriteManagerInput, "Disable mouse buttons in play mode", new Vector2(10, vertCurrent), 0.8F,
                               ConfigManager.sMouseDisableButtons);
            pc.Tooltip =
                "This option will disable all mouse buttons.\nSpecifically for people who use Z/X/Ctrl/Space to click.";
            pc.OnCheckChanged += disableMouseButtons_OnClick;

            vertCurrent += vertSpacing;

            pc = new pCheckbox(spriteManagerInput, "Force TabletPC support", new Vector2(10, vertCurrent), 0.8F,
                               ConfigManager.sTablet);
            pc.Tooltip =
                "osu! attempts to auto-detect if you are running on a tablet PC.\nThis sometimes fails depending on the operating sytem.\nEnable this if you are running a TabletPC or using a tablet and your clicks aren't handled correctly.";
            pc.OnCheckChanged += tablet_OnClick;

            vertCurrent += vertSpacing;

            pt =
                new pText("Key Bindings", 24, new Vector2(320, vertCurrent), Vector2.Zero, 1, true, Color.White, true);
            pt.OriginType = OriginTypes.Centre;
            spriteManagerInput.Add(pt);
            vertCurrent += vertSpacing - 10;

            pt1 = new pText(ConfigManager.sKeyboardBind1.ToString(), 24, new Vector2(330, vertCurrent), Vector2.Zero, 1, true, Color.White, true);
            pButton pbutton = new pButton("Main 1 (Taiko Inner-Left)", new Vector2(20, vertCurrent), new Vector2(260, 30), 0.9f, Color.DarkOrange, delegate { GameBase.ShowDialog(new OptionsBindKey(delegate(object sender, EventArgs e) { ConfigManager.sKeyboardBind1 = (Keys)sender; InputManager.CheckBindings(); UpdateBindings(); }, "Binding: Main 1 (Taiko Centre-Left)")); });

            spriteManagerInput.AddRange(pbutton.SpriteCollection);
            spriteManagerInput.Add(pt1);
            vertCurrent += vertSpacing;

            pt2     = new pText(ConfigManager.sKeyboardBind3.ToString(), 24, new Vector2(330, vertCurrent), Vector2.Zero, 1, true, Color.White, true);
            pbutton = new pButton("Main 2 (Taiko Inner-Right)", new Vector2(20, vertCurrent), new Vector2(260, 30), 0.9f, Color.DarkOrange, delegate { GameBase.ShowDialog(new OptionsBindKey(delegate(object sender, EventArgs e) { ConfigManager.sKeyboardBind3 = (Keys)sender; InputManager.CheckBindings(); UpdateBindings(); }, "Binding: Main 2 (Taiko Inner-Right)")); });
            spriteManagerInput.AddRange(pbutton.SpriteCollection);
            spriteManagerInput.Add(pt2);
            vertCurrent += vertSpacing;

            pt3     = new pText(ConfigManager.sKeyboardBind2.ToString(), 24, new Vector2(330, vertCurrent), Vector2.Zero, 1, true, Color.White, true);
            pbutton = new pButton("Alt 1 (Taiko Outer-Left)", new Vector2(20, vertCurrent), new Vector2(260, 30), 0.9f, Color.DarkOrange, delegate { GameBase.ShowDialog(new OptionsBindKey(delegate(object sender, EventArgs e) { ConfigManager.sKeyboardBind2 = (Keys)sender; InputManager.CheckBindings(); UpdateBindings(); }, "Binding: Alt 1 (Taiko Outer-Left)")); });
            spriteManagerInput.AddRange(pbutton.SpriteCollection);
            spriteManagerInput.Add(pt3);
            vertCurrent += vertSpacing;

            pt4     = new pText(ConfigManager.sKeyboardBind4.ToString(), 24, new Vector2(330, vertCurrent), Vector2.Zero, 1, true, Color.White, true);
            pbutton = new pButton("Alt 2 (Taiko Outer-Right)", new Vector2(20, vertCurrent), new Vector2(260, 30), 0.9f, Color.DarkOrange, delegate { GameBase.ShowDialog(new OptionsBindKey(delegate(object sender, EventArgs e) { ConfigManager.sKeyboardBind4 = (Keys)sender; InputManager.CheckBindings(); UpdateBindings(); }, "Binding: Alt 2 (Taiko Outer-Right)")); });
            spriteManagerInput.AddRange(pbutton.SpriteCollection);
            spriteManagerInput.Add(pt4);



            //Online
            vertCurrent = topHeight;

            pb =
                new pText("Toggles", 24, new Vector2(160, vertCurrent), Vector2.Zero, 1, true, Color.White, true);
            pb.OriginType = OriginTypes.Centre;
            spriteManagerOnline.Add(pb);

            vertCurrent += vertSpacing;

            pCheckbox pc1 = new pCheckbox(spriteManagerOnline, "Show chat ticker", new Vector2(10, vertCurrent), 0.8F,
                                          ConfigManager.sTicker);

            pc1.Tooltip         = "Popup new chat messages in a one-line display at the bottom of the screen\nwhen the chat console is not visible";
            pc1.OnCheckChanged += delegate { ChatEngine.ticker_OnClick(null, null); pc1.SetStatusQuietly(ConfigManager.sTicker); };

            vertCurrent += vertSpacing;

            pCheckbox pc2 = new pCheckbox(spriteManagerOnline, "Automatically hide chat", new Vector2(10, vertCurrent), 0.8F,
                                          ConfigManager.sAutoChatHide);

            pc2.Tooltip         = "When enabled, chat will automatically hide itself during gameplay.\nIt will be visible during breaks and intro/outro time.";
            pc2.OnCheckChanged += delegate { ChatEngine.hideMode_OnClick(null, null); pc2.SetStatusQuietly(ConfigManager.sAutoChatHide); };

            vertCurrent += vertSpacing;

            pCheckbox pc3 = new pCheckbox(spriteManagerOnline, "Popup notification when someone says your name", new Vector2(10, vertCurrent), 0.8F,
                                          ConfigManager.sChatHighlightName);

            pc3.Tooltip         = "A message will flash at the bottom of your screen (even during gameplay)\nwhen someone mentions yourname in chat.";
            pc3.OnCheckChanged += delegate { ConfigManager.sChatHighlightName = !ConfigManager.sChatHighlightName; pc3.SetStatusQuietly(ConfigManager.sChatHighlightName); };

            vertCurrent += vertSpacing;

            pCheckbox pc4 = new pCheckbox(spriteManagerOnline, "Share your city location with others", new Vector2(10, vertCurrent), 0.8F,
                                          ConfigManager.sDisplayCityLocation);

            pc4.Tooltip         = "By default, other users will only be able to see your country.  Enabling this adds your city to the\npublicly visible location.  This is usually quite accurate.";
            pc4.OnCheckChanged += delegate { ConfigManager.sDisplayCityLocation = !ConfigManager.sDisplayCityLocation; pc4.SetStatusQuietly(ConfigManager.sDisplayCityLocation); };

            vertCurrent = topHeight;

            pb =
                new pText("Active User", 24, new Vector2(480, vertCurrent), Vector2.Zero, 1, true, Color.White, true);
            pb.OriginType = OriginTypes.Centre;
            spriteManagerOnline.Add(pb);

            vertCurrent += vertSpacing;

            pb =
                new pSprite(SkinManager.Load("menu-button-background"), FieldTypes.Window,
                            OriginTypes.Centre,
                            ClockTypes.Game,
                            new Vector2(480, vertCurrent), 0.8F, true, Color.White);
            pb.OnClick      += provideLogin_OnClick;
            pb.CurrentScale  = 0.7F;
            pb.CurrentColour = new Color(0, 0, 0, 178);
            pb.IsClickable   = true;
            pb.HoverEffect   = new Transformation(TransformationType.Fade, 0.7F, 1, 0, 200);
            spriteManagerOnline.Add(pb);

            account =
                new pText("Click to login!", 20, new Vector2(480, vertCurrent), Vector2.Zero, 1, true, Color.Black,
                          false);
            account.OriginType = OriginTypes.Centre;
            spriteManagerOnline.Add(account);

            updateAccount();


            GameBase.LoadComplete();
        }