Exemplo n.º 1
0
        public SpinnerTaiko(HitObjectManager hom, int startTime, int endTime, HitObjectSoundType soundType)
            : base(hom, startTime, endTime, soundType)
        {
            rotationRequirement      = (int)Math.Max(1, (rotationRequirement * 1.65f));
            totalRotationRequirement = rotationRequirement;

            if (ModManager.CheckActive(hitObjectManager.ActiveMods, Mods.DoubleTime))
            {
                rotationRequirement = Math.Max(1, (int)(rotationRequirement * 0.75f));
            }
            if (ModManager.CheckActive(hitObjectManager.ActiveMods, Mods.HalfTime))
            {
                rotationRequirement = Math.Max(1, (int)(rotationRequirement * 1.5f));
            }

            if (hitObjectManager.spriteManager != null)
            {
                SpriteBonusCounter.Transformations = new List <Transformation>(SpriteCircleTop.Transformations);
                SpriteBonusCounter.Text            = (rotationRequirement + 1).ToString();

                WarningIcon =
                    new pSprite(TextureManager.Load("spinner-warning"), Fields.GamefieldWide, Origins.Centre,
                                Clocks.Audio, Position, SpriteManager.drawOrderBwd(StartTime + 1), false, Color.White);
                SpriteCollection.Add(WarningIcon);
                WarningIcon.TagNumeric = -5;
                DimCollection.Add(WarningIcon);

                WarningIcon.Transformations.Add(
                    new Transformation(TransformationType.Fade, 0, 1, startTime - hitObjectManager.PreEmpt,
                                       startTime - (int)(hitObjectManager.PreEmpt * 0.6)));
            }


            Kiai = false;
        }
Exemplo n.º 2
0
        public HitCircleFruits(HitObjectManager hom, Vector2 startPosition, int startTime, bool newCombo, HitObjectSoundType soundType, string fruit)
            : base(hom)
        {
            Position     = new Vector2(OsuMathHelper.Clamp(startPosition.X, 0, GameField.DEFAULT_WIDTH), 340);
            BasePosition = Position;
            StartTime    = startTime;
            EndTime      = startTime;
            SoundType    = soundType;

            NewCombo = newCombo;

            if (hom.spriteManager != null)
            {
                SpriteHitCircle1 =
                    new pSprite(TextureManager.Load(@"fruit-" + fruit), Fields.Gamefield, Origins.Centre,
                                Clocks.Audio, Position, SpriteManager.drawOrderBwd(StartTime), false, Color.White);
                SpriteCollection.Add(SpriteHitCircle1);
                DimCollection.Add(SpriteHitCircle1);
                SpriteHitCircle1.TagNumeric = 1;

                SpriteHitCircle2 =
                    new pSprite(TextureManager.Load(@"fruit-" + fruit + "-overlay"), Fields.Gamefield,
                                Origins.Centre, Clocks.Audio, Position,
                                SpriteManager.drawOrderBwd(StartTime - 1), false, Color.White);
                SpriteCollection.Add(SpriteHitCircle2);
                DimCollection.Add(SpriteHitCircle2);

                SpriteHyperDash =
                    new pSprite(TextureManager.Load(@"fruit-" + fruit), Fields.Gamefield,
                                Origins.Centre, Clocks.Audio, Position,
                                SpriteManager.drawOrderBwd(StartTime + 1), false, Color.TransparentBlack);
                SpriteHyperDash.Additive = true;
                SpriteCollection.Add(SpriteHyperDash);
                DimCollection.Add(SpriteHyperDash);

                Transformation fall1 = new Transformation(new Vector2(Position.X, -100), new Vector2(Position.X, 340), StartTime - hitObjectManager.PreEmpt, StartTime);

                fall1.EndVector.Y += (fall1.EndVector.Y - fall1.StartVector.Y) * 0.2f;
                fall1.Time2       += (int)(fall1.Duration * 0.2f);

                float rotation = RNG.NextSingle(-0.2f, 0.2f);

                SpriteCollection.ForEach(s =>
                {
                    s.Transformations.Add(fall1);
                    s.Rotation = rotation;
                });

                if (ModManager.CheckActive(hitObjectManager.ActiveMods, Mods.Hidden))
                {
                    Transformation t = new Transformation(TransformationType.Fade, 1, 0, startTime - (int)(hitObjectManager.PreEmpt * 0.6),
                                                          startTime - (int)(hitObjectManager.PreEmpt * 0.44));
                    SpriteCollection.ForEach(s => s.Transformations.Add(t));
                }
            }
        }
Exemplo n.º 3
0
        internal override void SetColour(Color color)
        {
            if (SpriteHitCircleText.Texture != null && SpriteHitCircleText.Texture.Source == SkinSource.Osu && color.R + color.G + color.B > 600)
            {
                SpriteHitCircleText.InitialColour = Color.Black;
                DimCollection.Remove(SpriteHitCircleText);
            }

            base.SetColour(color);
        }
Exemplo n.º 4
0
        internal HitCircleSliderEnd(Vector2 pos, int startTime, int sliderStart, bool reverse, bool addWhistle,
                                    bool addFinish, float angle, Slider parent)
            : base(pos, startTime, false, addWhistle, addFinish)
        {
            SpriteCollection.Remove(SpriteSelectionCircle);
            SpriteCollection.Remove(SpriteApproachCircle);
            SpriteCollection.Remove(SpriteHitCircleText);

            appear =
                new Transformation(TransformationType.Fade, 0, 1, sliderStart,
                                   sliderStart + 150);
            appearfake =
                new Transformation(TransformationType.Fade, 0, 0, sliderStart - HitObjectManager.PreEmptSliderComplete,
                                   sliderStart - HitObjectManager.PreEmptSliderComplete + HitObjectManager.FadeIn);

            disappear1 =
                new Transformation(TransformationType.Fade, 1, 0, startTime, startTime);
            disappear21 =
                new Transformation(TransformationType.Fade, 1, 0, startTime, startTime + HitObjectManager.FadeOut);

            disappear22 =
                new Transformation(TransformationType.Scale, 1F, 1.9F, startTime,
                                   (int)(startTime + (HitObjectManager.FadeOut * 0.7)));
            disappear22.Easing = EasingTypes.In;

            disappear23 =
                new Transformation(TransformationType.Scale, 1.9F, 2F, (int)(startTime + (HitObjectManager.FadeOut * 0.7)),
                                   (startTime + HitObjectManager.FadeOut));

            if (reverse)
            {
                SpriteHitCircleText =
                    new pSprite(SkinManager.Load("reversearrow"), FieldTypes.Gamefield,
                                OriginTypes.Centre, ClockTypes.Audio, Position,
                                SpriteManager.drawOrderBwd(startTime - 2), false, Color.White);
                //SpriteHitCircleText.CurrentRotation = angle;
                SpriteHitCircleText.Transformations.Add(appear);
                SpriteCollection.Add(SpriteHitCircleText);
                DimCollection.Add(SpriteHitCircleText);
            }

            SpriteHitCircle1.Transformations.Clear();
            SpriteHitCircle1.Transformations.Add(appearfake);
            SpriteHitCircle2.Transformations.Clear();
            SpriteHitCircle2.Transformations.Add(appearfake);

            Disarm();

            if (reverse)
            {
                for (int i = sliderStart; i < startTime; i += 300)
                {
                    int length = Math.Min(300, startTime - i);
                    SpriteHitCircleText.Transformations.Add(
                        new Transformation(TransformationType.Scale, 1.3F, 1, i, i + length));
                    SpriteHitCircleText.Transformations.Add(
                        new Transformation(TransformationType.Rotation, angle + MathHelper.Pi / 32,
                                           angle - MathHelper.Pi / 32, i, i + length));
                }
            }
        }
Exemplo n.º 5
0
        internal HitCircleSliderEnd(HitObjectManager hom, Vector2 pos, int startTime, int appearTime, bool firstRun, bool reverse, float angle, SliderOsu parent)
            : base(hom, pos, startTime, false, false, false, false, 0)
        {
            SpriteCollection.Remove(SpriteApproachCircle);
            SpriteCollection.Remove(SpriteHitCircleText);

            this.firstRun = firstRun;

            if (reverse)
            {
                int sortTime = firstRun ? parent.StartTime - 1 :
                               startTime - (int)(1000 * parent.SpatialLength / parent.Velocity) - 1;

                SpriteHitCircleText =
                    new pSprite(TextureManager.Load(@"reversearrow"), Fields.Gamefield,
                                Origins.Centre, Clocks.Audio, Position,
                                SpriteManager.drawOrderBwd(sortTime), false, Color.White);
                SpriteHitCircleText.Transformations.Add(new Transformation(TransformationType.Fade, 0, 1, appearTime, appearTime + 150));
                SpriteCollection.Add(SpriteHitCircleText);
                DimCollection.Add(SpriteHitCircleText);
            }

            bool hidden             = ModManager.CheckActive(hitObjectManager.ActiveMods, Mods.Hidden);
            int  hiddenFadedInTime  = parent.StartTime - (int)(hitObjectManager.PreEmpt * 0.6);
            int  hiddenFadedOutTime = parent.StartTime - (int)(hitObjectManager.PreEmpt * 0.3);

            var tr = SpriteHitCircle1.Transformations.Find(t => t.Type == TransformationType.Fade && t.StartFloat == 0);

            if (tr != null)
            {
                tr.Time1 = appearTime;
                tr.Time2 = hidden ? hiddenFadedInTime : Math.Min(startTime, appearTime + HitObjectManager.FadeIn);
            }

            tr = SpriteHitCircle2.Transformations.Find(t => t.Type == TransformationType.Fade && t.StartFloat == 0);
            if (tr != null)
            {
                tr.Time1 = appearTime;
                tr.Time2 = hidden ? hiddenFadedInTime : Math.Min(startTime, appearTime + HitObjectManager.FadeIn);
            }

            if (hidden)
            {
                if (firstRun)
                {
                    SpriteHitCircle1.Transformations.Add(new Transformation(TransformationType.Fade, 1, 0, hiddenFadedInTime, hiddenFadedOutTime));
                    SpriteHitCircle2.Transformations.Add(new Transformation(TransformationType.Fade, 1, 0, hiddenFadedInTime, hiddenFadedOutTime));
                }
                else
                {
                    SpriteCollection.Remove(SpriteHitCircle1);
                    SpriteCollection.Remove(SpriteHitCircle2);
                }
            }

            Disarm();

            if (reverse)
            {
                if (SkinManager.UseNewLayout)
                {
                    SpriteHitCircleText.Rotation = angle;
                    for (int i = appearTime; i < startTime; i += 300)
                    {
                        int length = Math.Min(300, startTime - i);
                        SpriteHitCircleText.Transformations.Add(new Transformation(TransformationType.Scale, 1.3f, 1, i, i + length, EasingTypes.Out));
                    }
                }
                else
                {
                    for (int i = appearTime; i < startTime; i += 300)
                    {
                        int length = Math.Min(300, startTime - i);
                        SpriteHitCircleText.Transformations.Add(new Transformation(TransformationType.Scale, 1.3F, 1, i, i + length));
                        SpriteHitCircleText.Transformations.Add(new Transformation(TransformationType.Rotation, angle + OsuMathHelper.Pi / 32, angle - OsuMathHelper.Pi / 32, i, i + length));
                    }
                }
            }
        }
Exemplo n.º 6
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();
            }
        }
Exemplo n.º 7
0
        internal void UpdateCalculations(bool force, double multiplier)
        {
            if (force || taikoMiddle == null)
            {
                //slider endpoint is not hittable when the next hitobject has
                //a starttime before the slider's endtime.
                List <HitObject> hitobjects = hitObjectManager.hitObjects;
                int ind = hitobjects.IndexOf(this);
                if (ind < hitobjects.Count - 1 &&
                    hitobjects[ind + 1].HittableStartTime - (EndTime + (int)MinHitDelay) <= (int)MinHitDelay)
                {
                    endpointHittable = false;
                }

                float scalefactor = !SoundType.IsType(HitObjectSoundType.Finish) ? 0.65f : 1;

                SpatialLength *= SegmentCount;
                double v = hitObjectManager.SliderScoringPointDistance * hitObjectManager.Beatmap.DifficultySliderTickRate;
                double b = hitObjectManager.Beatmap.BeatLengthAt(StartTime);
                EndTime = StartTime + (int)(SpatialLength / v * b);

                SpatialLength *= multiplier;

                taikoMiddle = new pSprite(TextureManager.Load(@"taiko-roll-middle"), Fields.GamefieldWide,
                                          Origins.TopLeft, Clocks.Audio,
                                          new Vector2(Position.X,
                                                      Position.Y - hitObjectManager.HitObjectRadius * scalefactor),
                                          SpriteManager.drawOrderBwd(EndTime + 10),
                                          false, new Color(252, 184, 6));
                taikoMiddle.VectorScale =
                    new Vector2((float)SpatialLength * GameBase.WindowManager.Ratio / hitObjectManager.SpriteRatio * (1 / scalefactor), 1);
                taikoMiddle.Transformations.Add(new Transformation(TransformationType.Fade, 0, 1,
                                                                   StartTime - hitObjectManager.PreEmpt, StartTime));
                taikoMiddle.Transformations.Add(new Transformation(TransformationType.Fade, 1, 0, EndTime,
                                                                   EndTime + hitObjectManager.PreEmptSliderComplete));
                spriteManager.Add(taikoMiddle);
                SpriteCollection.Add(taikoMiddle);
                DimCollection.Add(taikoMiddle);

                taikoEnd = new pSprite(TextureManager.Load(@"taiko-roll-end"), Fields.GamefieldWide, Origins.TopLeft,
                                       Clocks.Audio,
                                       new Vector2(Position.X, Position.Y - hitObjectManager.HitObjectRadius * scalefactor),
                                       SpriteManager.drawOrderBwd(EndTime + 8),
                                       false, new Color(252, 184, 6));
                taikoEnd.OriginPosition =
                    new Vector2(
                        (float)-SpatialLength * GameBase.WindowManager.Ratio / hitObjectManager.SpriteRatio * (1 / scalefactor), 0);
                taikoEnd.Transformations.Add(new Transformation(TransformationType.Fade, 0, 1,
                                                                StartTime - hitObjectManager.PreEmpt, StartTime));
                taikoEnd.Transformations.Add(new Transformation(TransformationType.Fade, 1, 0, EndTime,
                                                                EndTime + hitObjectManager.PreEmptSliderComplete));

                spriteManager.Add(taikoEnd);
                SpriteCollection.Add(taikoEnd);
                DimCollection.Add(taikoEnd);

                sliderBall.Transformations.Add(new Transformation(sliderStartCircle.Position,
                                                                  sliderStartCircle.Position, StartTime - 500, EndTime));
                sliderFollower.Transformations.Add(new Transformation(sliderStartCircle.Position,
                                                                      sliderStartCircle.Position, StartTime, EndTime));

                counter =
                    new pSpriteText("", SkinManager.Current.FontScore, SkinManager.Current.FontScoreOverlap,
                                    Fields.GamefieldWide, Origins.Centre, Clocks.Audio,
                                    HitObjectManagerTaiko.HIT_LOCATION, 0.9f, false, Color.White);
                counter.Scale = 0.8f;
                counter.Transformations.Add(new Transformation(TransformationType.Fade, 0, 1, StartTime, StartTime));
                counter.Transformations.Add(new Transformation(TransformationType.Fade, 0.6f, 0, EndTime, EndTime + 300));
                spriteManager.Add(counter);

                int index = 0;

                for (double i = StartTime; i < HittableEndTime; i += MinHitDelay)
                {
                    if (i == StartTime)
                    {
                        hittablePoints.Add(new HitPoint((int)i, null));
                        index++;
                        continue;
                    }

                    bool major = ((hitObjectManager.Beatmap.DifficultySliderTickRate == 3) ||
                                  (hitObjectManager.Beatmap.DifficultySliderTickRate == 6) ||
                                  (hitObjectManager.Beatmap.DifficultySliderTickRate == 1.5d)) ? (index % 3) == 0 : (index % 4) == 0;

                    pSprite scoringDot = new pSprite(TextureManager.Load(@"sliderscorepoint"),
                                                     Fields.GamefieldWide, Origins.Centre, Clocks.Audio, new Vector2(Position.X,
                                                                                                                     Position.Y),
                                                     SpriteManager.drawOrderBwd(StartTime + 1), false, major ? Color.Yellow : Color.White, this);

                    if (!major)
                    {
                        scoringDot.Scale *= 0.8f;
                    }


                    scoringDot.OriginPosition.X -= (float)(SpatialLength * (float)(i - StartTime) / Length) * GameBase.WindowManager.Ratio / hitObjectManager.SpriteRatio / scoringDot.Scale * (1 / scalefactor);

                    scoringDot.Transformations.Add(new Transformation(TransformationType.Fade, 0, 1,
                                                                      StartTime - hitObjectManager.PreEmpt, StartTime));
                    scoringDot.Transformations.Add(new Transformation(TransformationType.Fade, 1, 0, EndTime,
                                                                      EndTime + hitObjectManager.PreEmptSliderComplete));

                    hittablePoints.Add(new HitPoint((int)i, scoringDot));

                    spriteManager.Add(scoringDot);
                    SpriteCollection.Add(scoringDot);
                    DimCollection.Add(scoringDot);

                    index++;
                }

                if (scalefactor != 1)
                {
                    foreach (pSprite p in SpriteCollection)
                    {
                        p.Scale *= scalefactor;
                    }
                }

                for (int i = 0; i < sliderStartCircle.SpriteCollection.Count; i++)
                {
                    pSprite s = sliderStartCircle.SpriteCollection[i];
                    foreach (Transformation t in s.Transformations)
                    {
                        if (t.Type ==
                            TransformationType.Fade &&
                            t.StartFloat == 1)
                        {
                            t.Time1 = EndTime;
                            t.Time2 = EndTime;
                        }
                    }
                    SpriteCollection.Add(s);
                    DimCollection.Add(s);
                    spriteManager.Add(s);
                }
            }
        }