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; }
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)); } } }
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); }
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)); } } }
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)); } } } }
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(); } }
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); } } }